@reliability-design/web 1.4.2 → 1.4.3

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/components/rel-accordion/rel-accordion.ts","../src/components/rel-alert/rel-alert.ts","../src/components/rel-autocomplete/rel-autocomplete.ts","../src/components/rel-textfield/rel-textfield.ts","../src/components/rel-avatar/rel-avatar.ts","../src/components/rel-badge/rel-badge.ts","../src/components/rel-breadcrumb/rel-breadcrumb.ts","../src/components/rel-button/rel-button.ts","../src/components/rel-calendar/rel-calendar.ts","../src/components/rel-card/rel-card.ts","../src/components/rel-carousel/rel-carousel.ts","../src/components/rel-cardmedia/rel-cardmedia.ts","../src/components/rel-checkbox/rel-checkbox.ts","../src/components/rel-date-picker/rel-date-picker.ts","../src/components/rel-date-picker/date-format.ts","../src/components/rel-range-picker/rel-range-picker.ts","../src/components/rel-chip/rel-chip.ts","../src/components/rel-container/rel-container.ts","../src/components/rel-divider/rel-divider.ts","../src/components/rel-drawer/rel-drawer.ts","../src/components/rel-drawer/rel-drawer-footer.ts","../src/components/rel-kbd/rel-kbd.ts","../src/components/rel-layout/rel-layout.ts","../src/components/rel-menu/rel-menu.ts","../src/components/rel-radio/rel-radio.ts","../src/components/rel-menubar/rel-menubar.ts","../src/components/rel-menubar/rel-menubar-menu.ts","../src/components/rel-navbar/rel-navbar.ts","../src/components/rel-topbar/rel-topbar.ts","../src/components/rel-topbar/rel-topbar-brand.ts","../src/components/rel-topbar/rel-topbar-actions.ts","../src/components/rel-topbar/rel-topbar-utilities.ts","../src/components/rel-topbar/rel-topbar-mobile-panel.ts","../src/components/rel-topbar/rel-topbar-dropdown.ts","../src/components/rel-topbar/rel-topbar-dropdown-item.ts","../src/components/rel-topbar/rel-topbar-item.ts","../src/components/rel-topbar/rel-topbar-profile.ts","../src/components/rel-otp/rel-otp.ts","../src/components/rel-pagination/rel-pagination.ts","../src/components/rel-popover/rel-popover.ts","../src/components/rel-popover/rel-popover-content.ts","../src/components/rel-progress/rel-progress.ts","../src/components/rel-resizable/rel-resizable-group.ts","../src/components/rel-resizable/rel-resizable-panel.ts","../src/components/rel-resizable/rel-resizable-handle.ts","../src/components/rel-segmented-button/rel-segmented-button.ts","../src/components/rel-select/rel-select.ts","../src/components/rel-skeleton/rel-skeleton.ts","../src/components/rel-sheet/rel-sheet.ts","../src/components/rel-slider/rel-slider.ts","../src/components/rel-snackbar/rel-snackbar.ts","../src/components/rel-stepper/rel-stepper.ts","../src/components/rel-switch/rel-switch.ts","../src/components/rel-tab/rel-tab.ts","../src/components/rel-toast/rel-toast.ts","../src/components/rel-tooltip/rel-tooltip.ts"],"sourcesContent":["// MUST be first\r\nimport \"./styles/vars.css\";\r\n\r\n/* Web components */\r\nexport * from \"./components/rel-accordion/rel-accordion\";\r\nexport * from \"./components/rel-alert/rel-alert\";\r\nexport * from \"./components/rel-autocomplete/rel-autocomplete\";\r\nexport * from \"./components/rel-avatar/rel-avatar\";\r\nexport * from \"./components/rel-badge/rel-badge\";\r\nexport * from \"./components/rel-breadcrumb/rel-breadcrumb\";\r\nexport * from \"./components/rel-button/rel-button\";\r\nexport * from \"./components/rel-calendar/rel-calendar\";\r\nexport * from \"./components/rel-card/rel-card\";\r\nexport * from \"./components/rel-carousel/rel-carousel\";\r\nexport * from \"./components/rel-cardmedia/rel-cardmedia\";\r\nexport * from \"./components/rel-checkbox/rel-checkbox\";\r\nexport * from \"./components/rel-date-picker/rel-date-picker\";\r\nexport * from \"./components/rel-range-picker/rel-range-picker\";\r\nexport * from \"./components/rel-chip/rel-chip\";\r\nexport * from \"./components/rel-container/rel-container\";\r\nexport * from \"./components/rel-divider/rel-divider\";\r\nexport * from \"./components/rel-drawer/rel-drawer\";\r\nexport * from \"./components/rel-drawer/rel-drawer-footer\";\r\nexport * from \"./components/rel-kbd/rel-kbd\";\r\nexport * from \"./components/rel-layout/rel-layout\";\r\nexport * from \"./components/rel-menu/rel-menu\";\r\nexport * from \"./components/rel-menubar/rel-menubar\";\r\nexport * from \"./components/rel-menubar/rel-menubar-menu\";\r\nexport * from \"./components/rel-navbar/rel-navbar\";\r\nexport * from \"./components/rel-topbar/rel-topbar\";\r\nexport * from \"./components/rel-topbar/rel-topbar-brand\";\r\nexport * from \"./components/rel-topbar/rel-topbar-actions\";\r\nexport * from \"./components/rel-topbar/rel-topbar-utilities\";\r\nexport * from \"./components/rel-topbar/rel-topbar-mobile-panel\";\r\nexport * from \"./components/rel-topbar/rel-topbar-item\";\r\nexport * from \"./components/rel-topbar/rel-topbar-dropdown\";\r\nexport * from \"./components/rel-topbar/rel-topbar-dropdown-item\";\r\nexport * from \"./components/rel-topbar/rel-topbar-profile\";\r\nexport * from \"./components/rel-otp/rel-otp\";\r\nexport * from \"./components/rel-pagination/rel-pagination\";\r\nexport * from \"./components/rel-popover/rel-popover\";\r\nexport * from \"./components/rel-popover/rel-popover-content\";\r\nexport * from \"./components/rel-progress/rel-progress\";\r\nexport * from \"./components/rel-radio/rel-radio\";\r\nexport * from \"./components/rel-resizable\";\r\nexport * from \"./components/rel-segmented-button/rel-segmented-button\";\r\nexport * from \"./components/rel-select/rel-select\";\r\nexport * from \"./components/rel-skeleton/rel-skeleton\";\r\nexport * from \"./components/rel-sheet/rel-sheet\";\r\nexport * from \"./components/rel-slider/rel-slider\";\r\nexport * from \"./components/rel-snackbar/rel-snackbar\";\r\nexport * from \"./components/rel-stepper/rel-stepper\";\r\nexport * from \"./components/rel-switch/rel-switch\";\r\nexport * from \"./components/rel-tab/rel-tab\";\r\nexport * from \"./components/rel-textfield/rel-textfield\";\r\nexport * from \"./components/rel-toast/rel-toast\";\r\nexport * from \"./components/rel-tooltip/rel-tooltip\";\r\n// rel-upload is PENDING — moved out of this package to /pending/rel-upload at\r\n// the repo root while Figma design ambiguities are resolved.\r\n// See pending/rel-upload/SESSION-NOTES.md.\r\nexport * from \"@reliability-design/icons\";\r\n","import \"@reliability-design/icons/rel-icon\";\nimport { LitElement, html, css } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\n\n@customElement(\"rel-accordion\")\nexport class RelAccordion extends LitElement {\n @property({ type: String }) title = \"Accordion\";\n @property({ type: Boolean, reflect: true }) open = false;\n @property({ type: String, reflect: true }) size: \"md\" | \"sm\" = \"md\";\n @property({ type: String, reflect: true }) type: \"default\" | \"action\" = \"default\";\n\n /** Figma \"Style\" axis — named appearance because `style` collides with the HTML style attribute. */\n @property({ type: String, reflect: true }) appearance: \"shadow\" | \"plain\" = \"shadow\";\n\n static styles = css`\n :host {\n color: var(--rel-text-default);\n display: block;\n width: 100%;\n font-family: var(--rel-fonts-font-family, sans-serif);\n }\n\n .accordion {\n background: var(--rel-bg-neutral);\n border-radius: var(--rel-border-radius-sm);\n border: 1px solid var(--rel-border-subtle);\n overflow: hidden;\n box-shadow: var(--rel-shadows-shadow-100);\n }\n\n /* Figma Style=Shadow: elevation only, no visible border */\n :host([appearance=\"shadow\"]) .accordion {\n border-color: transparent;\n box-shadow: var(--rel-shadows-shadow-100);\n }\n\n /* Figma Style=Plain: flat — border, no elevation */\n :host([appearance=\"plain\"]) .accordion {\n border-color: var(--rel-border-subtle);\n box-shadow: none;\n }\n\n /* ── Header ───────────────────────────────────────────────── */\n\n .header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: pointer;\n user-select: none;\n box-sizing: border-box;\n /* matches .accordion's radius so the focus-visible outline isn't clipped square at the corners by the parent's overflow:hidden */\n border-radius: 8px;\n }\n\n :host([size=\"md\"]) .header {\n padding: var(--rel-spacing-xs) var(--rel-spacing-xs) var(--rel-spacing-xs) var(--rel-spacing-md);\n min-height: 56px;\n }\n\n :host([size=\"sm\"]) .header {\n padding: var(--rel-spacing-xs) var(--rel-spacing-xs) var(--rel-spacing-xs) var(--rel-spacing-sm);\n min-height: 48px;\n }\n\n .header:hover {\n background: var(--rel-bg-surface-elevated);\n }\n\n .header:focus-visible {\n outline: 2px solid var(--rel-border-focus);\n outline-offset: -2px;\n }\n\n /* ── Title row ────────────────────────────────────────────── */\n\n .title-row {\n display: flex;\n align-items: center;\n gap: var(--rel-spacing-xs);\n flex: 1;\n }\n\n .title {\n font-weight: var(--rel-headings-md-font-weight);\n color: var(--rel-text-default);\n }\n\n :host([size=\"md\"]) .title {\n\n font-family: var(--rel-headings-md-font-family);\n\n font-weight: var(--rel-headings-md-font-weight);\n\n font-size: var(--rel-headings-md-font-size);\n\n line-height: var(--rel-headings-md-line-height);\n\n letter-spacing: var(--rel-headings-md-letter-spacing);\n\n }\n\n :host([size=\"sm\"]) .title {\n\n font-family: var(--rel-headings-sm-font-family);\n\n font-weight: var(--rel-headings-sm-font-weight);\n\n font-size: var(--rel-headings-sm-font-size);\n\n line-height: var(--rel-headings-sm-line-height);\n\n letter-spacing: var(--rel-headings-sm-letter-spacing);\n\n }\n\n /* ── Leading icon (action type) ───────────────────────────── */\n\n .leading-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: var(--rel-text-default);\n }\n\n .leading-icon ::slotted(svg) {\n width: 24px;\n height: 24px;\n }\n\n .leading-icon rel-icon,\n .leading-icon ::slotted(rel-icon) {\n --rel-icon-size: 24px;\n }\n\n :host([size=\"sm\"]) .leading-icon ::slotted(svg) {\n width: 20px;\n height: 20px;\n }\n\n :host([size=\"sm\"]) .leading-icon rel-icon,\n :host([size=\"sm\"]) .leading-icon ::slotted(rel-icon) {\n --rel-icon-size: 20px;\n }\n\n /* ── Chevron ──────────────────────────────────────────────── */\n\n .chevron {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n\n :host([size=\"md\"]) .chevron {\n width: 40px;\n height: 40px;\n }\n\n :host([size=\"sm\"]) .chevron {\n width: 32px;\n height: 32px;\n }\n\n .chevron ::slotted(svg) {\n width: 24px;\n height: 24px;\n }\n\n .chevron rel-icon,\n .chevron ::slotted(rel-icon) {\n --rel-icon-size: 24px;\n color: var(--rel-action-neutral-label-icons-ghost);\n }\n\n :host([size=\"sm\"]) .chevron ::slotted(svg) {\n width: 20px;\n height: 20px;\n }\n\n :host([size=\"sm\"]) .chevron rel-icon,\n :host([size=\"sm\"]) .chevron ::slotted(rel-icon) {\n --rel-icon-size: 20px;\n }\n\n /* ── Icon rotation ────────────────────────────────────────── */\n /* Only the shadow-DOM fallback wrappers rotate on open.\n Slotted (light-DOM) icons are never targeted, so they stay static. */\n\n .icon-rotate-on-open,\n .chevron-rotate {\n display: inline-flex;\n align-items: center;\n transition: transform 0.25s ease;\n }\n\n /* Leading fallback chevron: 90° (points right when open) */\n :host([open]) .icon-rotate-on-open {\n transform: rotate(90deg);\n }\n\n /* Trailing fallback chevron (type=\"default\" only): 180° flip */\n :host([open]) .chevron-rotate {\n transform: rotate(180deg);\n }\n\n /* ── Body ─────────────────────────────────────────────────── */\n\n .body {\n overflow: hidden;\n max-height: 0;\n padding: 0 var(--rel-spacing-md);\n color: var(--rel-text-body);\n transition:\n max-height 0.25s ease,\n padding 0.2s ease;\n font-family: var(--rel-body-md-regular-font-family);\n font-weight: var(--rel-body-md-regular-font-weight);\n font-size: var(--rel-body-md-regular-font-size);\n line-height: var(--rel-body-md-regular-line-height);\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\n }\n\n :host([size=\"sm\"]) .body {\n\n font-family: var(--rel-body-sm-regular-font-family);\n\n font-weight: var(--rel-body-sm-regular-font-weight);\n\n font-size: var(--rel-body-sm-regular-font-size);\n\n line-height: var(--rel-body-sm-regular-line-height);\n\n letter-spacing: var(--rel-body-sm-regular-letter-spacing);\n\n }\n\n .body.open {\n max-height: 1000px;\n scroll-margin-top: var(--rel-spacing-xl);\n padding: var(--rel-spacing-2xs) var(--rel-spacing-md) var(--rel-spacing-lg);\n }\n\n /* ── Dark mode ────────────────────────────────────────────── */\n\n :host-context([data-theme=\"dark\"]) .title,\n [data-theme=\"dark\"] .title {\n color: var(--rel-text-default);\n }\n\n :host-context([data-theme=\"dark\"]) .chevron rel-icon,\n [data-theme=\"dark\"] .chevron rel-icon,\n :host-context([data-theme=\"dark\"]) .chevron ::slotted(rel-icon),\n [data-theme=\"dark\"] .chevron ::slotted(rel-icon) {\n color: var(--rel-text-default);\n }\n\n :host-context([data-theme=\"dark\"]) .leading-icon,\n [data-theme=\"dark\"] .leading-icon {\n color: var(--rel-text-default);\n }\n\n @media (prefers-reduced-motion: reduce) {\n .icon-rotate-on-open,\n .chevron-rotate,\n .body {\n transition: none;\n }\n }\n `;\n\n private toggle() {\n this.open = !this.open;\n this.dispatchEvent(\n new CustomEvent<boolean>(\"open-change\", {\n detail: this.open,\n bubbles: true,\n composed: true,\n })\n );\n }\n\n render() {\n return html`\n <div part=\"base\" class=\"accordion\">\n <div\n part=\"trigger\" class=\"header\"\n role=\"button\"\n tabindex=\"0\"\n aria-expanded=\"${this.open}\"\n @click=${this.toggle}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n this.toggle();\n }\n }}\n >\n <div part=\"label\" class=\"title-row\">\n ${this.type === \"action\"\n ? html`<span class=\"leading-icon\">\n <slot name=\"icon\">\n <span class=\"icon-rotate-on-open\"><rel-icon name=\"chevron-right\"></rel-icon></span>\n </slot>\n </span>`\n : \"\"}\n <span class=\"title\">${this.title}</span>\n </div>\n <div part=\"icon\" class=\"chevron\">\n <slot name=\"trailing-icon\">\n ${this.type === \"default\"\n ? html`<span class=\"chevron-rotate\"><rel-icon name=\"chevron-down\"></rel-icon></span>`\n : html`<rel-icon name=\"arrow-expansion\"></rel-icon>`}\n </slot>\n </div>\n </div>\n <div part=\"content\" class=\"body ${this.open ? \"open\" : \"closed\"}\">\n <slot></slot>\n </div>\n </div>\n `;\n }\n}\n","import { LitElement, html, css } from \"lit\";\r\nimport \"@reliability-design/icons/rel-icon\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\r\n@customElement(\"rel-alert\")\r\nexport class RelAlert extends LitElement {\r\n @property({ type: String })\r\n type: \"info\" | \"success\" | \"warning\" | \"error\" | \"neutral\" = \"neutral\";\r\n\r\n /** Visual treatment (Figma \"Style\"): solid | subtle | outline. \"filled\" is a deprecated alias of solid. */\r\n @property({ type: String, reflect: true })\r\n appearance: \"solid\" | \"subtle\" | \"outline\" | \"filled\" = \"subtle\";\r\n\r\n @property({ type: String }) message1 = \"\";\r\n @property({ type: String }) message2?: string;\r\n\r\n // Explicit attribute names: Lit would otherwise lowercase these to `urltext`\r\n // / `urlhref`, while the docs, the docs-app previews and consumers all use\r\n // `url-text` / `url-href` — which silently did nothing.\r\n @property({ type: String, attribute: \"url-text\" }) urlText?: string;\r\n @property({ type: String, attribute: \"url-href\" }) urlHref?: string;\r\n\r\n @property({ type: Boolean }) dismissible = true;\r\n @property({ type: Boolean, reflect: true }) dismissed = false;\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n display: block;\r\n font-family: var(--rel-fonts-font-family);\r\n }\r\n\r\n :host([dismissed]) {\r\n display: none;\r\n }\r\n\r\n .rel-alert {\r\n display: flex;\r\n align-items: flex-start;\r\n gap: var(--rel-spacing-xs);\r\n padding: var(--rel-spacing-sm) var(--rel-spacing-lg);\r\n border-radius: var(--rel-border-radius-sm);\r\n min-width: 360px;\r\n box-sizing: border-box;\r\n }\r\n\r\n .rel-content {\r\n padding-right: var(--rel-spacing-md);\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--rel-spacing-3xs);\r\n }\r\n\r\n .rel-message1 {\r\n /* Figma: body-lg-medium weight on body-lg-regular metrics */\r\n font-weight: var(--rel-body-lg-medium-font-weight);\r\n color: var(--rel-text-label);\r\n margin: 0;\r\n font-family: var(--rel-body-lg-regular-font-family);\r\n font-size: var(--rel-body-lg-regular-font-size);\r\n line-height: var(--rel-body-lg-regular-line-height);\r\n letter-spacing: var(--rel-body-lg-regular-letter-spacing);\r\n }\r\n\r\n .rel-message2 {\r\n color: var(--rel-text-body);\r\n margin: 0;\r\n opacity: 0.9;\r\n font-family: var(--rel-body-md-regular-font-family);\r\n font-weight: var(--rel-body-md-regular-font-weight);\r\n font-size: var(--rel-body-md-regular-font-size);\r\n line-height: var(--rel-body-md-regular-line-height);\r\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\r\n }\r\n\r\n .rel-icon {\r\n margin-top: 2px;\r\n flex-shrink: 0;\r\n }\r\n\r\n .rel-icon svg {\r\n width: 16px;\r\n height: 16px;\r\n display: block;\r\n }\r\n\r\n .rel-link {\r\n text-decoration: underline;\r\n color: var(--rel-action-neutral-label-icons-link);\r\n margin-top: 2px;\r\n\r\n font-family: var(--rel-action-md-font-family);\r\n\r\n font-weight: var(--rel-action-md-font-weight);\r\n\r\n font-size: var(--rel-action-md-font-size);\r\n\r\n line-height: var(--rel-action-md-line-height);\r\n\r\n letter-spacing: var(--rel-action-md-letter-spacing);\r\n\r\n }\r\n\r\n .rel-close {\r\n margin-left: auto;\r\n align-self: flex-start;\r\n background: none;\r\n border: none;\r\n cursor: pointer;\r\n opacity: 0.6;\r\n color: inherit;\r\n font-size: 16px;\r\n padding: var(--rel-spacing-2xs);\r\n line-height: 1;\r\n border-radius: var(--rel-border-radius-xs, 4px);\r\n }\r\n\r\n .rel-close:hover {\r\n opacity: 1;\r\n }\r\n\r\n .rel-close:focus-visible {\r\n outline: 2px solid currentColor;\r\n outline-offset: 2px;\r\n opacity: 1;\r\n }\r\n\r\n /* COLORS — semantic status tokens carry both light and dark modes.\r\n Base classes are the SUBTLE style (Figma Style=Subtle): tone light fill,\r\n no border, tone-colored title. */\r\n .rel-alert {\r\n border: 1px solid transparent;\r\n }\r\n\r\n .alert-neutral {\r\n background: var(--rel-bg-neutral);\r\n color: var(--rel-text-default);\r\n }\r\n\r\n .alert-info {\r\n background: var(--rel-bg-info-light);\r\n color: var(--rel-text-default);\r\n }\r\n\r\n .alert-info .rel-message1 {\r\n color: var(--rel-text-info);\r\n }\r\n\r\n .alert-success {\r\n background: var(--rel-bg-success-light);\r\n color: var(--rel-text-default);\r\n }\r\n\r\n .alert-success .rel-message1 {\r\n color: var(--rel-text-success);\r\n }\r\n\r\n .alert-warning {\r\n background: var(--rel-bg-warning-light);\r\n color: var(--rel-text-default);\r\n }\r\n\r\n .alert-warning .rel-message1 {\r\n color: var(--rel-text-warning);\r\n }\r\n\r\n .alert-error {\r\n background: var(--rel-bg-danger-light);\r\n color: var(--rel-text-default);\r\n }\r\n\r\n .alert-error .rel-message1 {\r\n color: var(--rel-text-danger);\r\n }\r\n\r\n /* Solid style (Figma Style=Solid; \"filled\" is the deprecated alias) */\r\n :host([appearance=\"filled\"]) .alert-neutral,\r\n :host([appearance=\"solid\"]) .alert-neutral {\r\n background: var(--rel-bg-neutral-inverse-2);\r\n color: var(--rel-text-inverse);\r\n }\r\n\r\n :host([appearance=\"filled\"]) .alert-error,\r\n :host([appearance=\"solid\"]) .alert-error {\r\n background: var(--rel-bg-danger);\r\n color: var(--rel-text-static-light);\r\n }\r\n\r\n :host([appearance=\"filled\"]) .alert-success,\r\n :host([appearance=\"solid\"]) .alert-success {\r\n background: var(--rel-bg-success);\r\n color: var(--rel-text-static-light);\r\n }\r\n\r\n :host([appearance=\"filled\"]) .alert-warning,\r\n :host([appearance=\"solid\"]) .alert-warning {\r\n background: var(--rel-bg-warning);\r\n color: var(--rel-text-static-dark);\r\n }\r\n\r\n :host([appearance=\"filled\"]) .alert-info,\r\n :host([appearance=\"solid\"]) .alert-info {\r\n background: var(--rel-bg-info);\r\n color: var(--rel-text-static-light);\r\n }\r\n\r\n :host([appearance=\"filled\"]) .rel-message1,\r\n :host([appearance=\"filled\"]) .rel-message2,\r\n :host([appearance=\"filled\"]) .rel-link,\r\n :host([appearance=\"solid\"]) .rel-message1,\r\n :host([appearance=\"solid\"]) .rel-message2,\r\n :host([appearance=\"solid\"]) .rel-link {\r\n color: inherit;\r\n }\r\n\r\n :host([appearance=\"filled\"]) .rel-icon rel-icon,\r\n :host([appearance=\"solid\"]) .rel-icon rel-icon {\r\n --rel-icon-color: currentColor;\r\n }\r\n\r\n /* Outline style (Figma Style=Outline): no fill, tone border, tone title */\r\n :host([appearance=\"outline\"]) .rel-alert {\r\n background: transparent;\r\n }\r\n\r\n :host([appearance=\"outline\"]) .alert-neutral {\r\n border-color: var(--rel-border-default);\r\n }\r\n\r\n :host([appearance=\"outline\"]) .alert-info {\r\n border-color: var(--rel-border-info);\r\n }\r\n\r\n :host([appearance=\"outline\"]) .alert-success {\r\n border-color: var(--rel-border-success);\r\n }\r\n\r\n :host([appearance=\"outline\"]) .alert-warning {\r\n border-color: var(--rel-border-warning);\r\n }\r\n\r\n :host([appearance=\"outline\"]) .alert-error {\r\n border-color: var(--rel-border-danger);\r\n }\r\n\r\n .alert-error .rel-close {\r\n color: var(--rel-text-default);\r\n }\r\n `;\r\n\r\n private dismissAlert() {\r\n this.dismissed = true;\r\n\r\n this.dispatchEvent(\r\n new CustomEvent(\"dismiss\", {\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n /* Task 2: status icons standardised on <rel-icon> (size tier L = 20px icon\r\n alongside body-lg text). Colour comes from the semantic tone. */\r\n private get iconTemplate() {\r\n const name =\r\n this.type === \"success\" ? \"check-circle\"\r\n : this.type === \"warning\" ? \"alert-circle\"\r\n : this.type === \"error\" ? \"error\"\r\n : \"info\";\r\n const tone =\r\n this.type === \"success\" ? \"success\"\r\n : this.type === \"warning\" ? \"warning\"\r\n : this.type === \"error\" ? \"danger\"\r\n : this.type === \"info\" ? \"info\"\r\n : \"default\";\r\n return html`<rel-icon name=\"${name}\" size=\"md\" tone=\"${tone}\"></rel-icon>`;\r\n }\r\n\r\n render() {\r\n return html`\r\n <div part=\"base\" class=\"rel-alert alert-${this.type}\" role=\"alert\">\r\n <div part=\"icon\" class=\"rel-icon\">${this.iconTemplate}</div>\r\n\r\n <div part=\"content\" class=\"rel-content\">\r\n <p part=\"label\" class=\"rel-message1\">${this.message1}</p>\r\n\r\n ${this.message2\r\n ? html`<p part=\"helper\" class=\"rel-message2\">${this.message2}</p>`\r\n : null}\r\n ${this.urlText && this.urlHref\r\n ? html`<a part=\"action\" class=\"rel-link\" href=${this.urlHref}>\r\n ${this.urlText}\r\n </a>`\r\n : null}\r\n </div>\r\n\r\n ${this.dismissible\r\n ? html`<button part=\"close-button\" class=\"rel-close\" @click=${this.dismissAlert} aria-label=\"Dismiss\">\r\n ✕\r\n </button>`\r\n : null}\r\n </div>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css, nothing, PropertyValues, TemplateResult } from \"lit\";\nimport { customElement, property, state, query } from \"lit/decorators.js\";\nimport { repeat } from \"lit/directives/repeat.js\";\nimport \"@reliability-design/icons/rel-icon\";\nimport \"../rel-textfield/rel-textfield.js\";\nimport type { RelTextfield, TextFieldSize, TextFieldVariant } from \"../rel-textfield/rel-textfield.js\";\n\n/** An item is a plain string or any object read through displayField/valueField. */\nexport type AutocompleteItem = string | Record<string, unknown>;\nexport type AutocompleteFilter = \"contains\" | \"starts-with\" | \"none\";\nexport type AutocompleteSearchFn = (query: string) => Promise<AutocompleteItem[]>;\n\ninterface NormalizedItem {\n value: string;\n label: string;\n icon: string;\n item: AutocompleteItem;\n}\n\n/**\n * `<rel-autocomplete>` — searchable single-select type-ahead field.\n *\n * Composes `<rel-textfield>` for all field chrome (label, sizes, variants,\n * states, icons) and adds a suggestion panel on top. Two data modes:\n * - local: set `items`; typing filters them (`filter` mode)\n * - remote: set `searchFn`; input is debounced (`debounceMs`), queries are\n * latest-wins (stale responses discarded), and `items` is ignored\n *\n * The committed `value` is always the selected item's value string (its\n * `valueField`) — typing alone emits `rel-change` with the raw text but does\n * not change `value` until an item is picked (or the text exactly matches an\n * item's label/value on Enter/blur).\n */\n@customElement(\"rel-autocomplete\")\nexport class RelAutocomplete extends LitElement {\n /** Local (or fallback initial) suggestion list. Ignored while searchFn drives results. */\n @property({ type: Array }) items: AutocompleteItem[] = [];\n\n /** Committed value — the selected item's valueField string (\"\" = none). */\n @property({ type: String }) value: string = \"\";\n\n /** Object key read for the row label when items are objects. */\n @property({ type: String, attribute: \"display-field\" }) displayField: string = \"label\";\n\n /** Object key read for the committed value when items are objects. */\n @property({ type: String, attribute: \"value-field\" }) valueField: string = \"value\";\n\n /** Local filtering mode. Ignored when searchFn is set (results arrive pre-filtered). */\n @property({ type: String }) filter: AutocompleteFilter = \"contains\";\n\n /** Async data source. When set, local filtering is bypassed entirely. */\n @property({ attribute: false }) searchFn?: AutocompleteSearchFn;\n\n /** Debounce for searchFn calls, in ms. */\n @property({ type: Number, attribute: \"debounce-ms\" }) debounceMs: number = 300;\n\n /** Minimum typed characters before the panel opens / searchFn fires. 0 = open on focus. */\n @property({ type: Number, attribute: \"min-search-length\" }) minSearchLength: number = 1;\n\n /** Optional cap on rendered suggestions (panel scrolls regardless). */\n @property({ type: Number, attribute: \"max-suggestions\" }) maxSuggestions: number = Infinity;\n\n /** Shows a trailing ✕ that clears the text and the committed value. */\n @property({ type: Boolean }) clearable: boolean = false;\n\n /** Externally-controlled loading state (internal searchFn loading is automatic). */\n @property({ type: Boolean }) loading: boolean = false;\n\n /** Row shown when a query yields nothing. */\n @property({ type: String, attribute: \"no-results-text\" }) noResultsText: string = \"No results found\";\n\n @property({ type: String, attribute: \"loading-text\" }) loadingText: string = \"Loading…\";\n\n // ── Field chrome passthroughs (forwarded to the inner rel-textfield) ──\n @property({ type: String }) label?: string;\n @property({ type: String }) placeholder: string = \"\";\n @property({ type: String }) size: TextFieldSize = \"medium\";\n @property({ type: String }) variant: TextFieldVariant = \"default\";\n @property({ type: Boolean, attribute: \"floating-label\" }) floatingLabel = false;\n @property({ type: String, attribute: \"prefix-icon\" }) prefixIcon?: string;\n @property({ type: Boolean }) disabled = false;\n @property({ type: Boolean }) readonly = false;\n @property({ type: Boolean }) required = false;\n @property({ type: Boolean }) error = false;\n @property({ type: String, attribute: \"error-message\" }) errorMessage?: string;\n @property({ type: String, attribute: \"helper-text\" }) helperText?: string;\n @property({ type: String }) name?: string;\n @property({ type: Boolean, attribute: \"full-width\" }) fullWidth = true;\n\n @state() private open = false;\n @state() private inputText = \"\";\n @state() private highlightedIndex = -1;\n @state() private panelStyle = \"\";\n @state() private searching = false;\n /** searchFn results; null = idle/local mode (use items). */\n @state() private remoteItems: AutocompleteItem[] | null = null;\n\n @query(\"rel-textfield\") private fieldEl!: RelTextfield;\n @query(\".ac-panel\") private panelEl!: HTMLDivElement;\n\n private uniqueId = `autocomplete-${Math.random().toString(36).slice(2)}`;\n private debounceTimer?: ReturnType<typeof setTimeout>;\n private searchSeq = 0;\n /** Set while a selection/clear updates `value` internally, so willUpdate\n * doesn't overwrite the input text the way it does for external writes. */\n private internalValueWrite = false;\n\n static styles = css`\n :host {\n color: var(--rel-text-default);\n display: block;\n font-family: var(--rel-fonts-font-family);\n width: 100%;\n }\n\n :host(:not([full-width])) {\n display: inline-block;\n width: auto;\n }\n\n /* ── Suggestion panel — mirrors rel-select's listbox so the two read as\n one family (same tokens, radius, shadow, row styling). ── */\n .ac-panel {\n position: fixed;\n z-index: 1001;\n display: none;\n box-sizing: border-box;\n background: var(--rel-autocomplete-bg, var(--rel-bg-neutral));\n border: 1px solid var(--rel-autocomplete-menu-border, var(--rel-border-default));\n border-radius: var(--rel-autocomplete-menu-radius, var(--rel-border-radius-sm));\n box-shadow: var(--rel-autocomplete-menu-shadow, var(--rel-shadows-shadow-300));\n max-height: 360px;\n overflow-y: auto;\n }\n\n .ac-panel[data-open] {\n display: block;\n }\n\n .ac-options {\n padding: 4px 0;\n }\n\n .ac-option {\n display: flex;\n align-items: center;\n gap: var(--rel-spacing-xs);\n padding: var(--rel-spacing-xs) 12px;\n color: var(--rel-autocomplete-value-color, var(--rel-text-default));\n cursor: pointer;\n font-family: var(--rel-body-md-regular-font-family);\n font-weight: var(--rel-body-md-regular-font-weight);\n font-size: var(--rel-body-md-regular-font-size);\n line-height: var(--rel-body-md-regular-line-height);\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\n }\n\n .ac-option:hover,\n .ac-option.highlighted {\n background: var(--rel-autocomplete-option-hover, var(--rel-bg-neutral-elevated-1));\n }\n\n .ac-option-icon {\n flex-shrink: 0;\n color: var(--rel-autocomplete-icon-color, var(--rel-text-default));\n }\n\n .ac-option-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .ac-option-label b {\n font-weight: var(--rel-body-md-medium-font-weight);\n }\n\n /* Status rows (loading / no results) — informational, not selectable */\n .ac-status {\n display: flex;\n align-items: center;\n gap: var(--rel-spacing-xs);\n padding: var(--rel-spacing-xs) 12px;\n color: var(--rel-autocomplete-status-color, var(--rel-text-body));\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 .ac-spinner {\n animation: ac-spin 0.9s linear infinite;\n }\n\n @keyframes ac-spin {\n to {\n transform: rotate(360deg);\n }\n }\n `;\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.removeGlobalListeners();\n clearTimeout(this.debounceTimer);\n }\n\n protected willUpdate(changed: PropertyValues<this>) {\n // External value writes (attribute, Angular writeValue) sync the visible\n // text to the matching item's label — or the raw value when unknown\n // (e.g. remote item not currently in the list).\n if (changed.has(\"value\") && !this.internalValueWrite) {\n const match = this.allItems.find((i) => i.value === this.value);\n this.inputText = match ? match.label : this.value ?? \"\";\n }\n this.internalValueWrite = false;\n }\n\n /** Full normalized source list (remote results while searchFn drives, else items). */\n private get allItems(): NormalizedItem[] {\n const source = this.searchFn && this.remoteItems !== null ? this.remoteItems : this.items;\n return source.map((item) => this.normalizeItem(item));\n }\n\n private normalizeItem(item: AutocompleteItem): NormalizedItem {\n if (typeof item === \"string\") return { value: item, label: item, icon: \"\", item };\n const rec = item;\n const rawLabel = rec[this.displayField] ?? rec[this.valueField];\n const label = rawLabel == null ? \"\" : String(rawLabel);\n const rawValue = rec[this.valueField];\n const value = rawValue == null ? label : String(rawValue);\n const icon = typeof rec[\"icon\"] === \"string\" ? (rec[\"icon\"] as string) : \"\";\n return { value, label, icon, item };\n }\n\n /** Suggestions for the current query — local filter only applies without searchFn. */\n private get filteredItems(): NormalizedItem[] {\n let list = this.allItems;\n if (!this.searchFn && this.filter !== \"none\" && this.inputText) {\n const q = this.inputText.toLowerCase();\n list = list.filter((i) =>\n this.filter === \"starts-with\"\n ? i.label.toLowerCase().startsWith(q)\n : i.label.toLowerCase().includes(q)\n );\n }\n return Number.isFinite(this.maxSuggestions) ? list.slice(0, this.maxSuggestions) : list;\n }\n\n private get isLoading(): boolean {\n return this.loading || this.searching;\n }\n\n private get queryLongEnough(): boolean {\n return this.inputText.length >= this.minSearchLength;\n }\n\n // ── Panel open/close + positioning (same proven mechanics as rel-select:\n // fixed panel, flip above when short on space, close on outside\n // pointerdown and on any outside scroll instead of re-anchoring) ──\n\n private addGlobalListeners() {\n document.addEventListener(\"pointerdown\", this.onOutsidePointerDown);\n window.addEventListener(\"resize\", this.updatePosition);\n window.addEventListener(\"scroll\", this.onPageScroll, true);\n }\n\n private removeGlobalListeners() {\n document.removeEventListener(\"pointerdown\", this.onOutsidePointerDown);\n window.removeEventListener(\"resize\", this.updatePosition);\n window.removeEventListener(\"scroll\", this.onPageScroll, true);\n }\n\n private onOutsidePointerDown = (e: PointerEvent) => {\n if (!this.open) return;\n if (e.composedPath().includes(this)) return;\n this.commitExactMatch();\n this.closePanel();\n };\n\n private onPageScroll = (e: Event) => {\n if (!this.open) return;\n if (e.composedPath()[0] === this.panelEl) return;\n this.closePanel();\n };\n\n private openPanel() {\n if (this.disabled || this.readonly || this.open) return;\n this.open = true;\n this.highlightedIndex = -1;\n this.addGlobalListeners();\n requestAnimationFrame(() => this.updatePosition());\n }\n\n private closePanel() {\n if (!this.open) return;\n this.open = false;\n this.highlightedIndex = -1;\n this.removeGlobalListeners();\n }\n\n private updatePosition = () => {\n if (!this.fieldEl || !this.panelEl) return;\n\n this.panelEl.setAttribute(\"data-open\", \"\");\n\n const t = this.fieldEl.getBoundingClientRect();\n const c = this.panelEl.getBoundingClientRect();\n\n let top = t.bottom + 4;\n if (top + c.height > window.innerHeight - 8) {\n top = Math.max(8, t.top - c.height - 4);\n }\n\n let left = t.left;\n if (left + t.width > window.innerWidth - 8) {\n left = Math.max(8, window.innerWidth - t.width - 8);\n }\n\n this.panelStyle = `top:${top}px;left:${left}px;width:${t.width}px;`;\n };\n\n /** Re-evaluates whether the panel should be showing for the current state. */\n private syncPanel() {\n const shouldShow =\n this.queryLongEnough && (this.isLoading || this.filteredItems.length > 0 || !!this.inputText || this.minSearchLength === 0);\n if (shouldShow) {\n if (!this.open) this.openPanel();\n else requestAnimationFrame(() => this.updatePosition());\n } else {\n this.closePanel();\n }\n }\n\n // ── Data flow ──\n\n private onFieldInput(e: CustomEvent<string>) {\n e.stopPropagation();\n this.inputText = e.detail;\n this.highlightedIndex = -1;\n\n // Re-emit as our own rel-change so consumers listen on <rel-autocomplete>\n // (the inner textfield's event is stopped above).\n this.dispatchEvent(\n new CustomEvent<string>(\"rel-change\", { detail: this.inputText, bubbles: true, composed: true })\n );\n\n if (this.searchFn) {\n clearTimeout(this.debounceTimer);\n if (!this.queryLongEnough) {\n this.searchSeq++; // invalidate any in-flight query\n this.searching = false;\n this.remoteItems = null;\n this.closePanel();\n return;\n }\n this.searching = true;\n this.syncPanel();\n this.debounceTimer = setTimeout(() => this.runSearch(this.inputText), this.debounceMs);\n } else {\n this.syncPanel();\n }\n }\n\n private async runSearch(query: string) {\n const seq = ++this.searchSeq;\n try {\n const results = await this.searchFn!(query);\n if (seq !== this.searchSeq) return; // stale — a newer query superseded this one\n this.remoteItems = results ?? [];\n } catch (err) {\n if (seq !== this.searchSeq) return;\n this.remoteItems = [];\n this.dispatchEvent(\n new CustomEvent(\"rel-search-error\", { detail: { query, error: err }, bubbles: true, composed: true })\n );\n } finally {\n if (seq === this.searchSeq) {\n this.searching = false;\n this.syncPanel();\n }\n }\n }\n\n private selectItem(item: NormalizedItem) {\n this.internalValueWrite = true;\n this.value = item.value;\n this.inputText = item.label;\n this.closePanel();\n this.emitChanged(item);\n }\n\n /** Silent commit when typed text exactly matches an item (label or value, case-insensitive). */\n private commitExactMatch() {\n if (!this.inputText) return;\n const q = this.inputText.toLowerCase();\n const match = this.allItems.find(\n (i) => i.label.toLowerCase() === q || i.value.toLowerCase() === q\n );\n if (match && match.value !== this.value) {\n this.internalValueWrite = true;\n this.value = match.value;\n this.inputText = match.label;\n this.emitChanged(match);\n }\n }\n\n private emitChanged(item: NormalizedItem | null) {\n this.dispatchEvent(\n new CustomEvent(\"changed\", {\n detail: { value: this.value, item: item ? item.item : null },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private clear() {\n if (this.disabled || this.readonly) return;\n const hadValue = !!this.value || !!this.inputText;\n this.internalValueWrite = true;\n this.value = \"\";\n this.inputText = \"\";\n this.searchSeq++;\n this.searching = false;\n this.remoteItems = null;\n this.closePanel();\n if (hadValue) {\n this.dispatchEvent(new CustomEvent(\"rel-clear\", { bubbles: true, composed: true }));\n this.emitChanged(null);\n this.dispatchEvent(\n new CustomEvent<string>(\"rel-change\", { detail: \"\", bubbles: true, composed: true })\n );\n }\n this.fieldEl?.focus();\n }\n\n // ── Keyboard / focus ──\n\n private onKeyDown(e: KeyboardEvent) {\n if (this.disabled || this.readonly) return;\n const filtered = this.filteredItems;\n\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n if (!this.open) {\n if (this.queryLongEnough) this.openPanel();\n return;\n }\n this.highlightedIndex = Math.min(filtered.length - 1, this.highlightedIndex + 1);\n break;\n case \"ArrowUp\":\n e.preventDefault();\n if (!this.open) return;\n this.highlightedIndex = Math.max(0, this.highlightedIndex - 1);\n break;\n case \"Enter\":\n if (this.open && this.highlightedIndex >= 0 && filtered[this.highlightedIndex]) {\n e.preventDefault();\n this.selectItem(filtered[this.highlightedIndex]);\n } else {\n // Free text stays free text — but an exact match commits.\n this.commitExactMatch();\n this.closePanel();\n }\n break;\n case \"Escape\":\n if (this.open) {\n e.preventDefault();\n this.closePanel();\n }\n break;\n case \"Tab\":\n this.commitExactMatch();\n this.closePanel();\n break;\n }\n }\n\n private onFocusIn() {\n if (this.disabled || this.readonly) return;\n if (this.queryLongEnough && (this.filteredItems.length > 0 || this.minSearchLength === 0)) {\n this.openPanel();\n }\n }\n\n private onFocusOut(e: FocusEvent) {\n const next = e.relatedTarget as Node | null;\n if (next && (this.contains(next) || this.renderRoot.contains(next))) return;\n // Focus genuinely left the component (outside pointerdown handles the\n // click-away case before blur; this covers programmatic focus moves).\n this.commitExactMatch();\n this.closePanel();\n }\n\n /** Delegates focus to the inner textfield. */\n focus() {\n this.fieldEl?.focus();\n }\n\n /** Bolds the first occurrence of the query inside a suggestion label. */\n private renderLabel(label: string): TemplateResult | string {\n const q = this.inputText;\n if (!q) return label;\n const idx = label.toLowerCase().indexOf(q.toLowerCase());\n if (idx < 0) return label;\n return html`${label.slice(0, idx)}<b>${label.slice(idx, idx + q.length)}</b>${label.slice(idx + q.length)}`;\n }\n\n render() {\n const filtered = this.filteredItems;\n const panelId = `${this.uniqueId}-panel`;\n const activeOptionId =\n this.open && this.highlightedIndex >= 0 ? `${this.uniqueId}-option-${this.highlightedIndex}` : \"\";\n const showClear = this.clearable && !!this.inputText && !this.disabled && !this.readonly;\n const showNoResults = !this.isLoading && filtered.length === 0 && this.queryLongEnough && !!this.inputText;\n\n // ARIA note: the real <input> lives in rel-textfield's shadow root, which\n // aria-activedescendant can't reach across. The combobox role therefore\n // sits on this wrapper (containing the field) in the same tree as the\n // panel — the pragmatic pattern for nested shadow roots.\n return html`\n <div\n class=\"ac-field\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-expanded=\"${this.open}\"\n aria-controls=\"${panelId}\"\n aria-activedescendant=\"${activeOptionId}\"\n @keydown=\"${this.onKeyDown}\"\n @focusin=\"${this.onFocusIn}\"\n @focusout=\"${this.onFocusOut}\"\n >\n <rel-textfield\n exportparts=\"label, control, input, helper, right-icon\"\n .label=\"${this.label}\"\n .placeholder=\"${this.placeholder}\"\n .value=\"${this.inputText}\"\n .size=\"${this.size}\"\n .variant=\"${this.variant}\"\n .floatingLabel=\"${this.floatingLabel}\"\n .prefixIcon=\"${this.prefixIcon}\"\n .disabled=\"${this.disabled}\"\n .readonly=\"${this.readonly}\"\n .required=\"${this.required}\"\n .error=\"${this.error}\"\n .errorMessage=\"${this.errorMessage}\"\n .helperText=\"${this.helperText}\"\n .name=\"${this.name}\"\n .rightIcon=\"${showClear ? \"close\" : undefined}\"\n .clickableRightIcon=\"${showClear}\"\n right-icon-aria-label=\"Clear\"\n @rel-change=\"${this.onFieldInput}\"\n @rel-right-icon-click=\"${this.clear}\"\n ></rel-textfield>\n </div>\n\n <div\n id=\"${panelId}\"\n part=\"panel list\"\n class=\"ac-panel\"\n role=\"listbox\"\n aria-label=\"${this.label || \"Suggestions\"}\"\n style=\"${this.panelStyle}\"\n ?data-open=\"${this.open}\"\n >\n ${this.isLoading\n ? html`<div class=\"ac-status\" role=\"status\">\n <rel-icon name=\"status-loading\" size=\"sm\" class=\"ac-spinner\"></rel-icon>\n <span>${this.loadingText}</span>\n </div>`\n : nothing}\n ${showNoResults\n ? html`<div class=\"ac-status\">${this.noResultsText}</div>`\n : nothing}\n ${filtered.length > 0\n ? html`<div class=\"ac-options\">\n ${repeat(\n filtered,\n (item) => item.value,\n (item, index) => html`\n <div\n id=\"${this.uniqueId}-option-${index}\"\n part=\"option\"\n class=\"ac-option ${index === this.highlightedIndex ? \"highlighted\" : \"\"}\"\n role=\"option\"\n aria-selected=\"${item.value === this.value}\"\n @mousedown=\"${(e: Event) => e.preventDefault()}\"\n @click=\"${() => this.selectItem(item)}\"\n @pointerenter=\"${() => (this.highlightedIndex = index)}\"\n >\n ${item.icon\n ? html`<rel-icon name=\"${item.icon}\" size=\"sm\" class=\"ac-option-icon\"></rel-icon>`\n : nothing}\n <span class=\"ac-option-label\">${this.renderLabel(item.label)}</span>\n </div>\n `\n )}\n </div>`\n : nothing}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"rel-autocomplete\": RelAutocomplete;\n }\n}\n","import { LitElement, html, css, nothing } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport \"@reliability-design/icons/rel-icon\";\n\nexport type TextFieldState = \"default\" | \"error\" | \"disabled\";\nexport type TextFieldSize = \"small\" | \"medium\" | \"large\";\nexport type TextFieldVariant = \"default\" | \"underline\" | \"legend\";\n\n@customElement(\"rel-textfield\")\nexport class RelTextfield extends LitElement {\n @property({ type: String }) label?: string;\n @property({ type: String }) placeholder: string = \"\";\n @property({ type: String }) type: string = \"text\";\n @property({ type: String }) value: string = \"\";\n @property({ type: String }) leftIcon?: string;\n @property({ type: String }) rightIcon?: string;\n /** Makes the trailing icon interactive (pointer + focusable) and emits\n * `rel-right-icon-click` — e.g. a password show/hide toggle or clear button. */\n @property({ type: Boolean, attribute: \"clickable-right-icon\" }) clickableRightIcon = false;\n /** Accessible label for the trailing icon when it is clickable. */\n @property({ type: String, attribute: \"right-icon-aria-label\" }) rightIconAriaLabel?: string;\n @property({ type: String }) supportingText?: string;\n @property({ type: String }) state: TextFieldState = \"default\";\n @property({ type: String }) size: TextFieldSize = \"medium\";\n @property({ type: Boolean, reflect: true }) floatingLabel = false;\n @property({ type: String, reflect: true }) variant: TextFieldVariant = \"default\";\n @property({ type: Boolean }) disabled = false;\n @property({ type: Boolean }) required = false;\n @property({ type: Boolean, reflect: true }) multiline = false;\n @property({ type: Number }) rows = 3;\n\n // ── Standardized input API (senior-team spec) ──────────────────────────────\n // Prefer these over the deprecated aliases: prefixIcon (was leftIcon),\n // helperText (was supportingText), error (was state=\"error\").\n @property({ type: String }) prefixIcon?: string;\n @property({ type: String }) prefixIconAriaLabel?: string;\n @property({ type: Boolean }) error = false;\n @property({ type: String }) errorMessage?: string;\n @property({ type: String }) helperText?: string;\n @property({ type: Boolean }) readonly = false;\n @property({ type: Number }) maxLength?: number;\n @property({ type: String }) name?: string;\n @property({ type: Boolean, reflect: true }) fullWidth = true;\n\n @state() private internalState: \"default\" | \"focused\" = \"default\";\n private _wasError = false;\n\n private uniqueId = `textfield-${Math.random().toString(36).slice(2)}`;\n\n private get isDisabled() {\n return this.disabled || this.state === \"disabled\";\n }\n\n private get isError() {\n return this.error || this.state === \"error\";\n }\n\n // prefixIcon supersedes the deprecated leftIcon\n private get leadingIcon() {\n return this.prefixIcon ?? this.leftIcon;\n }\n\n // helperText supersedes the deprecated supportingText\n private get helper() {\n return this.helperText ?? this.supportingText;\n }\n\n static styles = css`\n :host {\n color: var(--rel-text-default);\n display: block;\n font-family: var(--rel-fonts-font-family);\n }\n\n /* Wrapper */\n .textfield-wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--rel-spacing-2xs);\n width: 100%;\n }\n\n /* Label */\n .textfield-label {\n color: var(--rel-text-label);\n\n font-family: var(--rel-body-sm-medium-font-family);\n\n font-weight: var(--rel-body-sm-medium-font-weight);\n\n font-size: var(--rel-body-sm-medium-font-size);\n\n line-height: var(--rel-body-sm-medium-line-height);\n\n letter-spacing: var(--rel-body-sm-medium-letter-spacing);\n\n }\n\n .required-mark {\n color: var(--rel-text-danger);\n margin-left: 2px;\n }\n\n /* Floating label variant */\n :host([floatinglabel]) .textfield-wrapper {\n gap: 0;\n }\n\n :host([floatinglabel]) .textfield-container {\n overflow: visible;\n position: relative;\n padding-top: 0;\n }\n\n :host([floatinglabel]) .textfield-label {\n position: absolute;\n left: var(--rel-spacing-sm);\n top: 50%;\n transform: translateY(-50%);\n color: var(--rel-text-placeholder);\n pointer-events: none;\n transition: top 0.15s ease, font-size 0.15s ease, color 0.15s ease, transform 0.15s ease;\n background: var(--rel-bg-neutral);\n padding: 0 2px;\n z-index: 1;\n white-space: nowrap;\n font-family: var(--rel-body-md-regular-font-family);\n font-weight: var(--rel-body-md-regular-font-weight);\n font-size: var(--rel-body-md-regular-font-size);\n line-height: var(--rel-body-md-regular-line-height);\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\n }\n\n /* Floating label in multiline mode anchors to top instead of vertical center */\n :host([floatinglabel][multiline]) .textfield-label {\n top: var(--rel-spacing-sm);\n transform: none;\n }\n\n :host([floatinglabel]) .textfield-wrapper.focused .textfield-label,\n :host([floatinglabel]) .textfield-wrapper.has-value .textfield-label {\n top: 0;\n transform: translateY(-50%);\n color: var(--rel-text-default);\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 :host([floatinglabel]) .textfield-wrapper.error .textfield-label {\n color: var(--rel-text-danger);\n }\n\n :host([floatinglabel]) .textfield-wrapper.focused:not(.error) .textfield-label {\n color: var(--rel-text-default);\n }\n\n :host([floatinglabel]) .textfield-wrapper.focused.error .textfield-label,\n :host([floatinglabel]) .textfield-wrapper.has-value.error .textfield-label {\n top: 0;\n transform: translateY(-50%);\n color: var(--rel-text-danger);\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 :host([floatinglabel]) .textfield-input {\n padding-top: var(--rel-spacing-sm);\n padding-bottom: var(--rel-spacing-sm);\n }\n\n :host([floatinglabel]) .textfield-input.has-left-icon {\n padding-left: var(--rel-spacing-2xl);\n }\n\n :host([floatinglabel]) .textfield-label.has-left-icon {\n left: var(--rel-spacing-2xl);\n }\n\n :host([floatinglabel]) .textfield-wrapper.focused .textfield-label.has-left-icon,\n :host([floatinglabel]) .textfield-wrapper.has-value .textfield-label.has-left-icon {\n left: var(--rel-spacing-sm);\n }\n\n :host([floatinglabel]) .textfield-wrapper.disabled .textfield-label {\n background: var(--rel-bg-neutral-elevated-1);\n }\n\n /* Container */\n .textfield-container {\n display: flex;\n align-items: center;\n position: relative;\n border: 1px solid var(--rel-border-default);\n border-radius: var(--rel-border-radius-xs);\n background: var(--rel-bg-neutral);\n overflow: hidden;\n transition: border 0.2s;\n }\n\n .textfield-container.disabled {\n background: var(--rel-bg-neutral-elevated-1);\n cursor: not-allowed;\n }\n\n .textfield-container.multiline {\n overflow: visible;\n align-items: flex-start;\n }\n\n /* Input */\n .textfield-input {\n flex: 1;\n border: none;\n outline: none;\n padding: var(--rel-spacing-xs) var(--rel-spacing-sm);\n background: transparent;\n color: var(--rel-text-body);\n font-family: var(--rel-body-md-regular-font-family);\n font-weight: var(--rel-body-md-regular-font-weight);\n font-size: var(--rel-body-md-regular-font-size);\n line-height: var(--rel-body-md-regular-line-height);\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\n }\n\n .textfield-input:disabled {\n cursor: not-allowed;\n color: var(--rel-text-disabled);\n }\n\n /* Textarea */\n textarea.textfield-input {\n resize: vertical;\n min-height: 80px;\n width: 100%;\n box-sizing: border-box;\n }\n\n textarea.textfield-input::-webkit-scrollbar {\n width: 4px;\n }\n textarea.textfield-input::-webkit-scrollbar-track {\n background: transparent;\n }\n textarea.textfield-input::-webkit-scrollbar-thumb {\n background: var(--rel-text-placeholder);\n border-radius: 2px;\n }\n\n .icon {\n position: absolute;\n display: flex;\n pointer-events: none;\n color: var(--rel-text-placeholder);\n }\n\n .icon.left {\n left: 8px;\n }\n\n .icon.right {\n right: 8px;\n }\n\n /* Interactive trailing icon (e.g. password show/hide) */\n .icon.right.clickable {\n pointer-events: auto;\n cursor: pointer;\n border-radius: var(--rel-border-radius-xs, 4px);\n }\n .icon.right.clickable:hover {\n color: var(--rel-text-body);\n }\n .icon.right.clickable:focus-visible {\n outline: 2px solid var(--rel-border-focus);\n outline-offset: 2px;\n }\n\n .textfield-wrapper.small .textfield-support {\n font-weight: var(--rel-body-xs-medium-font-weight);\n }\n\n .textfield-wrapper.small .textfield-input {\n padding: var(--rel-spacing-xs) var(--rel-spacing-sm);\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 .textfield-wrapper.medium .textfield-input {\n padding: var(--rel-spacing-sm) var(--rel-spacing-md);\n font-family: var(--rel-body-md-regular-font-family);\n font-weight: var(--rel-body-md-regular-font-weight);\n font-size: var(--rel-body-md-regular-font-size);\n line-height: var(--rel-body-md-regular-line-height);\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\n }\n\n .textfield-wrapper.large .textfield-input {\n padding: var(--rel-spacing-md) var(--rel-spacing-md);\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 /* Adjust padding when icons are present */\n .textfield-wrapper .textfield-input.has-left-icon {\n padding-left: var(--rel-spacing-2xl);\n }\n\n .textfield-wrapper .textfield-input.has-right-icon {\n padding-right: var(--rel-spacing-2xl);\n }\n\n /* States */\n /* Hover (Figma State=Hover): border-strong at 1px — no focus ring */\n .textfield-wrapper:not(.focused):not(.error):not(.disabled) .textfield-container:hover {\n border-color: var(--rel-border-strong);\n }\n\n .textfield-wrapper.focused .textfield-container {\n border-color: var(--rel-text-default);\n }\n\n .textfield-input:focus-visible {\n outline: none;\n }\n\n .textfield-wrapper.focused .textfield-container,\n .textfield-container:focus-within {\n border-color: var(--rel-border-strong);\n box-shadow: 0 0 0 1px var(--rel-border-strong);\n }\n\n .textfield-wrapper.error .textfield-container,\n .textfield-wrapper.error .textfield-container:focus-within {\n border-color: var(--rel-border-danger);\n box-shadow: none;\n }\n\n .textfield-wrapper.disabled .textfield-container {\n border-color: var(--rel-border-default);\n }\n\n .textfield-wrapper.disabled .textfield-label {\n color: var(--rel-text-disabled);\n }\n\n /* Supporting text */\n .textfield-support {\n color: var(--rel-text-caption);\n\n font-family: var(--rel-body-xs-regular-font-family);\n\n font-weight: var(--rel-body-xs-regular-font-weight);\n\n font-size: var(--rel-body-xs-regular-font-size);\n\n line-height: var(--rel-body-xs-regular-line-height);\n\n letter-spacing: var(--rel-body-xs-regular-letter-spacing);\n\n }\n\n .textfield-support.error {\n color: var(--rel-text-danger);\n }\n\n /* Placeholder */\n .textfield-input::placeholder {\n color: var(--rel-text-placeholder);\n }\n\n :host([floatinglabel]) .textfield-input::placeholder {\n opacity: 0;\n }\n\n :host([floatinglabel]) .textfield-wrapper.focused .textfield-input::placeholder {\n opacity: 1;\n }\n\n /* Suppress Chrome autofill blue background */\n .textfield-input:-webkit-autofill,\n .textfield-input:-webkit-autofill:hover,\n .textfield-input:-webkit-autofill:focus {\n -webkit-box-shadow: 0 0 0px 1000px var(--rel-bg-surface) inset;\n -webkit-text-fill-color: var(--rel-text-default);\n }\n\n /* ── Underline variant ── */\n :host([variant=\"underline\"]) .textfield-container {\n border: none;\n border-bottom: 2px solid var(--rel-border-default);\n border-radius: 0;\n background: var(--rel-bg-neutral-elevated-1);\n box-shadow: none;\n overflow: visible;\n }\n\n :host([variant=\"underline\"]) .textfield-wrapper:not(.focused):not(.error):not(.disabled) .textfield-container:hover {\n border-bottom-color: var(--rel-border-strong);\n }\n\n :host([variant=\"underline\"]) .textfield-wrapper.focused .textfield-container,\n :host([variant=\"underline\"]) .textfield-container:focus-within {\n border-bottom: 2px solid var(--rel-text-default);\n box-shadow: none;\n }\n\n :host([variant=\"underline\"]) .textfield-wrapper.error .textfield-container {\n border-bottom: 2px solid var(--rel-border-danger);\n box-shadow: none;\n }\n\n :host([variant=\"underline\"]) .textfield-wrapper.disabled .textfield-container {\n border-bottom: 2px solid var(--rel-border-default);\n background: var(--rel-bg-neutral-elevated-1);\n }\n\n /* Remove border radius on input for underline variant */\n :host([variant=\"underline\"]) .textfield-input {\n background: transparent;\n }\n\n /* Dark mode — underline variant uses same border colors as default */\n :host-context([data-theme=\"dark\"]) :host([variant=\"underline\"]) .textfield-container,\n :host-context(.dark) :host([variant=\"underline\"]) .textfield-container {\n background: var(--rel-bg-neutral-elevated-1);\n border-bottom-color: var(--rel-border-default);\n }\n\n /* ── Full-width control (fullWidth defaults true → block, fills parent) ── */\n :host(:not([fullwidth])) {\n display: inline-block;\n width: auto;\n }\n :host(:not([fullwidth])) .textfield-wrapper {\n width: auto;\n }\n\n /* ── Legend (notched-outline) variant ──\n Native <fieldset>/<legend>: the legend notches the top border and stays\n fixed in place across all states (no float/animation). */\n :host([variant=\"legend\"]) .field-fieldset {\n position: relative;\n margin: 0;\n min-inline-size: 0;\n padding: 0;\n border: 1px solid var(--rel-border-default);\n border-radius: var(--rel-border-radius-xs);\n background: var(--rel-bg-neutral);\n transition: border-color 0.2s;\n }\n\n :host([variant=\"legend\"]) .field-legend {\n margin-left: var(--rel-spacing-sm);\n padding: 0 var(--rel-spacing-2xs);\n color: var(--rel-text-label);\n font-family: var(--rel-body-sm-medium-font-family);\n font-weight: var(--rel-body-sm-medium-font-weight);\n font-size: var(--rel-body-sm-medium-font-size);\n line-height: var(--rel-body-sm-medium-line-height);\n letter-spacing: var(--rel-body-sm-medium-letter-spacing);\n }\n\n :host([variant=\"legend\"]) .textfield-input {\n width: 100%;\n box-sizing: border-box;\n }\n\n /* Prefix icon (legend): vertically centered; input inset via has-left-icon */\n :host([variant=\"legend\"]) .icon.left {\n top: 50%;\n left: var(--rel-spacing-sm);\n transform: translateY(-50%);\n }\n :host([variant=\"legend\"]) .field-fieldset.multiline .icon.left {\n top: var(--rel-spacing-sm);\n transform: none;\n }\n\n /* Hover */\n :host([variant=\"legend\"]) .field-fieldset:hover {\n border-color: var(--rel-border-accent);\n border-color: var(--rel-text-placeholder);\n }\n\n /* Focus — border-color only. A box-shadow/outline ring hugs the full\n rectangular border-box and would draw across the notch, appearing to\n strike through the legend. The legend also recolors on focus (below). */\n :host([variant=\"legend\"]) .textfield-wrapper.focused .field-fieldset,\n :host([variant=\"legend\"]) .field-fieldset:focus-within {\n border-color: var(--rel-border-focus);\n box-shadow: none;\n }\n :host([variant=\"legend\"]) .textfield-wrapper.focused .field-legend,\n :host([variant=\"legend\"]) .field-fieldset:focus-within .field-legend {\n color: var(--rel-border-focus);\n }\n\n /* Error */\n :host([variant=\"legend\"]) .textfield-wrapper.error .field-fieldset {\n border-color: var(--rel-border-danger);\n box-shadow: none;\n }\n :host([variant=\"legend\"]) .textfield-wrapper.error .field-legend {\n color: var(--rel-text-danger);\n }\n\n /* Disabled */\n :host([variant=\"legend\"]) .textfield-wrapper.disabled .field-fieldset {\n background: var(--rel-bg-neutral-elevated-1);\n border-color: var(--rel-border-default);\n cursor: not-allowed;\n }\n :host([variant=\"legend\"]) .textfield-wrapper.disabled .field-legend {\n color: var(--rel-text-disabled);\n }\n\n /* Readonly */\n :host([variant=\"legend\"]) .textfield-wrapper.readonly .field-fieldset {\n cursor: default;\n }\n\n /* Legend font tracks size */\n :host([variant=\"legend\"]) .textfield-wrapper.small .field-legend {\n\n font-family: var(--rel-body-xs-regular-font-family);\n\n font-weight: var(--rel-body-xs-regular-font-weight);\n\n font-size: var(--rel-body-xs-regular-font-size);\n\n line-height: var(--rel-body-xs-regular-line-height);\n\n letter-spacing: var(--rel-body-xs-regular-letter-spacing);\n\n }\n :host([variant=\"legend\"]) .textfield-wrapper.large .field-legend {\n\n font-family: var(--rel-body-md-regular-font-family);\n\n font-weight: var(--rel-body-md-regular-font-weight);\n\n font-size: var(--rel-body-md-regular-font-size);\n\n line-height: var(--rel-body-md-regular-line-height);\n\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\n\n }\n `;\n\n connectedCallback() {\n super.connectedCallback();\n const leftIcon = this.getAttribute('lefticon') || this.getAttribute('leftIcon');\n if (leftIcon) this.leftIcon = leftIcon;\n const rightIcon = this.getAttribute('righticon') || this.getAttribute('rightIcon');\n if (rightIcon) this.rightIcon = rightIcon;\n }\n\n /** Focuses the inner input/textarea (the host itself is not focusable). */\n focus(options?: FocusOptions) {\n (this.renderRoot.querySelector(\"input, textarea\") as HTMLElement | null)?.focus(options);\n }\n\n private handleFocus() {\n if (!this.isDisabled) {\n this.internalState = \"focused\";\n }\n }\n\n private handleBlur() {\n if (this.internalState === \"focused\") {\n this.internalState = \"default\";\n }\n }\n\n private handleRightIconClick(e: Event) {\n if (!this.clickableRightIcon) return;\n e.stopPropagation();\n this.dispatchEvent(\n new CustomEvent(\"rel-right-icon-click\", { bubbles: true, composed: true })\n );\n }\n\n private handleRightIconKeydown(e: KeyboardEvent) {\n if (!this.clickableRightIcon) return;\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n this.handleRightIconClick(e);\n }\n }\n\n private handleInput(e: Event) {\n const input = e.target as HTMLInputElement;\n this.value = input.value;\n if (this.state === \"error\" && this.value) {\n this._wasError = true;\n this.state = \"default\";\n } else if (this._wasError && !this.value) {\n this._wasError = false;\n this.state = \"error\";\n }\n this.dispatchEvent(\n new CustomEvent<string>(\"rel-change\", {\n detail: this.value,\n bubbles: true,\n composed: true,\n })\n );\n }\n\n render() {\n const isError = this.isError;\n const stateClass = this.isDisabled ? \"disabled\" : isError ? \"error\" : \"default\";\n const leadingIcon = this.leadingIcon;\n const inputId = this.id || this.uniqueId;\n const legendId = `${inputId}-legend`;\n\n // errorMessage replaces the helper only when in error AND explicitly set;\n // otherwise the (deprecated) supportingText/helperText shows as before.\n const belowText = isError && this.errorMessage ? this.errorMessage : this.helper;\n const describedById = belowText ? `${inputId}-desc` : undefined;\n\n const wrapperClasses = [\n \"textfield-wrapper\",\n this.size,\n stateClass,\n this.readonly ? \"readonly\" : \"\",\n this.internalState === \"focused\" ? \"focused\" : \"\",\n this.value ? \"has-value\" : \"\",\n ].filter(Boolean).join(\" \");\n\n const inputClasses = [\n \"textfield-input\",\n !this.multiline && leadingIcon ? \"has-left-icon\" : \"\",\n !this.multiline && this.rightIcon && this.variant !== \"legend\" ? \"has-right-icon\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const labelTemplate = (extraClass = \"\") => {\n if (!this.label) return \"\";\n return html`<label\n part=\"label\"\n class=\"textfield-label${extraClass}\"\n for=\"${inputId}\"\n >${this.label}${this.required ? html`<span class=\"required-mark\" aria-hidden=\"true\">*</span>` : \"\"}</label>`;\n };\n\n const ariaLabelledby = this.variant === \"legend\" && this.label ? legendId : undefined;\n\n const inputTemplate = this.multiline\n ? html`<textarea part=\"input\"\n id=\"${inputId}\"\n class=\"${inputClasses}\"\n placeholder=\"${this.placeholder}\"\n .value=\"${this.value}\"\n rows=\"${this.rows}\"\n name=\"${this.name ?? nothing}\"\n maxlength=\"${this.maxLength ?? nothing}\"\n ?disabled=\"${this.isDisabled}\"\n ?readonly=\"${this.readonly}\"\n ?required=\"${this.required}\"\n aria-invalid=\"${isError}\"\n aria-required=\"${this.required}\"\n aria-labelledby=\"${ariaLabelledby ?? nothing}\"\n aria-describedby=\"${describedById ?? nothing}\"\n @focus=\"${this.handleFocus}\"\n @blur=\"${this.handleBlur}\"\n @input=\"${this.handleInput}\"\n ></textarea>`\n : html`<input part=\"input\"\n type=\"${this.type}\"\n id=\"${inputId}\"\n class=\"${inputClasses}\"\n placeholder=\"${this.placeholder}\"\n .value=\"${this.value}\"\n name=\"${this.name ?? nothing}\"\n maxlength=\"${this.maxLength ?? nothing}\"\n ?disabled=\"${this.isDisabled}\"\n ?readonly=\"${this.readonly}\"\n ?required=\"${this.required}\"\n aria-invalid=\"${isError}\"\n aria-required=\"${this.required}\"\n aria-labelledby=\"${ariaLabelledby ?? nothing}\"\n aria-describedby=\"${describedById ?? nothing}\"\n @focus=\"${this.handleFocus}\"\n @blur=\"${this.handleBlur}\"\n @input=\"${this.handleInput}\"\n />`;\n\n const leadingIconTemplate = leadingIcon\n ? html`<rel-icon\n name=\"${leadingIcon}\"\n size=\"sm\"\n class=\"icon left\"\n role=\"${this.prefixIconAriaLabel ? \"img\" : nothing}\"\n aria-label=\"${this.prefixIconAriaLabel ?? nothing}\"\n aria-hidden=\"${this.prefixIconAriaLabel ? nothing : \"true\"}\"\n ></rel-icon>`\n : \"\";\n\n const belowTemplate = belowText\n ? html`<div part=\"helper\" class=\"textfield-support ${isError ? \"error\" : \"\"}\" id=\"${describedById}\">\n ${belowText}\n </div>`\n : \"\";\n\n if (this.variant === \"legend\") {\n const fieldsetClass = [\"field-fieldset\", this.multiline ? \"multiline\" : \"\"].filter(Boolean).join(\" \");\n // The <legend> MUST be the fieldset's first child with no preceding\n // whitespace/text or binding-comment, otherwise the browser won't cut the\n // notch in the top border. So it's rendered flush against the tag open and\n // is always present (only its content is dynamic).\n return html`\n <div class=\"${wrapperClasses}\">\n <fieldset part=\"control\" class=\"${fieldsetClass}\"><legend class=\"field-legend\" id=\"${legendId}\">${this.label ?? \"\"}${this.required ? html`<span class=\"required-mark\" aria-hidden=\"true\">*</span>` : \"\"}</legend>\n ${!this.multiline ? leadingIconTemplate : \"\"}\n ${inputTemplate}\n </fieldset>\n ${belowTemplate}\n </div>\n `;\n }\n\n return html`\n <div class=\"${wrapperClasses}\">\n ${!this.floatingLabel ? labelTemplate() : \"\"}\n\n <div part=\"control\" class=\"${[\"textfield-container\", this.isDisabled ? \"disabled\" : \"\", this.multiline ? \"multiline\" : \"\"].filter(Boolean).join(\" \")}\">\n ${this.floatingLabel\n ? labelTemplate(leadingIcon && !this.multiline ? \" has-left-icon\" : \"\")\n : \"\"}\n ${!this.multiline ? leadingIconTemplate : \"\"}\n\n ${inputTemplate}\n\n ${!this.multiline && this.rightIcon\n ? html`<rel-icon\n part=\"right-icon\"\n name=\"${this.rightIcon}\"\n size=\"${this.clickableRightIcon ? \"md\" : \"sm\"}\"\n class=\"icon right ${this.clickableRightIcon ? \"clickable\" : \"\"}\"\n role=\"${this.clickableRightIcon ? \"button\" : nothing}\"\n tabindex=\"${this.clickableRightIcon ? \"0\" : nothing}\"\n aria-label=\"${this.clickableRightIcon ? (this.rightIconAriaLabel ?? nothing) : nothing}\"\n @click=\"${(e: Event) => this.handleRightIconClick(e)}\"\n @keydown=\"${(e: KeyboardEvent) => this.handleRightIconKeydown(e)}\"\n ></rel-icon>`\n : \"\"}\n </div>\n\n ${belowTemplate}\n </div>\n `;\n }\n}\n","import { LitElement, html, css } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\n\n@customElement(\"rel-avatar\")\nexport class RelAvatar extends LitElement {\n @property({ type: String, reflect: true })\n size: \"lg\" | \"md\" | \"sm\" | \"xs\" = \"md\";\n\n @property({ type: String, reflect: true })\n type: \"image\" | \"text\" | \"icon\" = \"image\";\n\n @property({ type: String, reflect: true })\n variant: \"fill\" | \"subtle\" | \"outline\" = \"fill\";\n\n @property({ type: String }) src = \"\";\n @property({ type: String }) text = \"\";\n @property({ type: String }) alt = \"Avatar\";\n @property({ type: String }) bg: string = \"\";\n @property({ type: String }) color: string = \"\";\n\n static styles = css`\n :host {\n color: var(--rel-text-default);\n display: inline-flex;\n font-family: var(--rel-fonts-font-family);\n }\n\n .avatar {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n overflow: hidden;\n box-sizing: border-box;\n border: var(--rel-stroke-sm, 1px) solid transparent;\n /* every avatar size role is a *-semibold role, so the base weight binds\n one of them rather than the underlying primitive (per conventions §1) */\n font-weight: var(--rel-body-sm-semibold-font-weight);\n user-select: none;\n text-transform: uppercase;\n }\n\n /* ── Variants ─────────────────────────────────────────────── */\n\n :host([variant=\"fill\"]) .avatar {\n background-color: var(--rel-avatar-bg-fill, var(--rel-bg-neutral-inverse-2));\n color: var(--rel-avatar-color-fill, var(--rel-text-inverse));\n }\n\n :host([variant=\"subtle\"]) .avatar {\n background-color: var(--rel-avatar-bg-subtle, var(--rel-bg-neutral-elevated-1));\n color: var(--rel-avatar-color-subtle, var(--rel-text-default));\n }\n\n :host([variant=\"outline\"]) .avatar {\n background-color: transparent;\n border-color: var(--rel-avatar-border-outline, var(--rel-border-default));\n color: var(--rel-avatar-color-outline, var(--rel-text-default));\n }\n\n /* ── Sizes ────────────────────────────────────────────────── */\n\n .avatar-lg {\n width: 40px;\n height: 40px; /* 20px */\n font-family: var(--rel-body-xl-semibold-font-family);\n font-weight: var(--rel-body-xl-semibold-font-weight);\n font-size: var(--rel-body-xl-semibold-font-size);\n line-height: var(--rel-body-xl-semibold-line-height);\n letter-spacing: var(--rel-body-xl-semibold-letter-spacing);\n }\n\n .avatar-md {\n /* Figma: body-lg-semibold family+weight on body-lg-regular metrics */\n font-weight: var(--rel-body-lg-semibold-font-weight);\n width: 32px;\n height: 32px; /* 16px */\n font-family: var(--rel-body-lg-semibold-font-family);\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 .avatar-sm {\n width: 24px;\n height: 24px; /* 12px */\n font-family: var(--rel-body-sm-regular-font-family);\n font-weight: var(--rel-body-sm-semibold-font-weight);\n font-size: var(--rel-body-sm-semibold-font-size);\n line-height: var(--rel-body-sm-semibold-line-height);\n letter-spacing: var(--rel-body-sm-semibold-letter-spacing);\n }\n\n .avatar-xs {\n width: 20px;\n height: 20px; /* 10px */\n font-family: var(--rel-body-xs-regular-font-family);\n font-weight: var(--rel-body-xs-semibold-font-weight);\n font-size: var(--rel-body-xs-semibold-font-size);\n line-height: var(--rel-body-xs-semibold-line-height);\n letter-spacing: var(--rel-body-xs-semibold-letter-spacing);\n }\n\n /* ── Image ────────────────────────────────────────────────── */\n\n img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n background: var(--rel-bg-neutral);\n }\n\n /* ── Icon slot ────────────────────────────────────────────── */\n\n .icon-slot {\n width: 100%;\n height: 100%;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: inherit;\n }\n\n .icon-slot ::slotted(svg) {\n width: 50%;\n height: 50%;\n }\n\n `;\n\n render() {\n return html`\n <div part=\"base\" class=\"avatar avatar-${this.size}\" style=${[this.bg ? `background-color:${this.bg}` : \"\", this.color ? `color:${this.color}` : \"\"].filter(Boolean).join(\";\")}>\n ${this.type === \"image\" && this.src\n ? html`<img part=\"icon\" src=${this.src} alt=${this.alt} />`\n : this.type === \"text\"\n ? html`<span part=\"label\">${this.text}</span>`\n : html`<span part=\"icon\" class=\"icon-slot\"><slot></slot></span>`}\n </div>\n `;\n }\n}\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\r\n@customElement(\"rel-badge\")\r\nexport class RelBadge extends LitElement {\r\n @property({ type: String }) number = \"\";\r\n\r\n @property({ type: String }) ariaLabel: string = \"\";\r\n\r\n @property({ type: String }) suffix: string = \"notifications\";\r\n\r\n @property({ type: String, reflect: true })\r\n size: \"sm\" | \"md\" | \"lg\" | \"xl\" = \"md\";\r\n\r\n @property({ type: String, reflect: true })\r\n variant: \"dot\" | \"number\" = \"number\";\r\n\r\n /**\r\n * Direct CSS color override for the badge background. Accepts any valid\r\n * CSS color value: hex, rgb(...), hsl(...), named color, or var(--token).\r\n *\r\n * Clear it (set to `''`) to fall back to the default token.\r\n */\r\n @property({ type: String, reflect: true })\r\n color = \"\";\r\n\r\n /**\r\n * Direct CSS color override for the badge text/icon color. Accepts any\r\n * valid CSS color value: hex, rgb(...), hsl(...), named color, or var(--token).\r\n *\r\n * Clear it (set to `''`) to fall back to the default (white).\r\n */\r\n @property({ type: String, reflect: true, attribute: \"text-color\" })\r\n textColor = \"\";\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n display: inline-flex;\r\n }\r\n\r\n .badge {\r\n font-weight: var(--rel-body-sm-semibold-font-weight);\r\n font-size: var(--rel-body-sm-semibold-font-size);\r\n line-height: var(--rel-body-sm-semibold-line-height);\r\n letter-spacing: var(--rel-body-sm-semibold-letter-spacing);\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n box-sizing: border-box;\r\n font-family: var(--rel-fonts-font-family, sans-serif);\r\n background-color: var(--rel-badge-bg, var(--rel-bg-danger));\r\n color: var(--rel-badge-color, var(--rel-text-static-light));\r\n /* Large fixed radius (not 50%) — stays a perfect circle for 1-2 digits,\r\n but becomes a pill instead of clipping when content like \"999+\"\r\n is wider than the minimum circle. */\r\n border-radius: 999px;\r\n white-space: nowrap;\r\n }\r\n\r\n /* NUMBER BADGES — min-width (not width) lets multi-character content\r\n like \"999+\" grow the badge into a pill instead of overflowing a fixed circle. */\r\n .badge-sm {\r\n min-width: 20px;\r\n height: 20px;\r\n padding: 0 4px;\r\n font-family: var(--rel-body-xs-regular-font-family);\r\n font-weight: var(--rel-body-xs-semibold-font-weight);\r\n font-size: var(--rel-body-xs-semibold-font-size);\r\n line-height: var(--rel-body-xs-semibold-line-height);\r\n letter-spacing: var(--rel-body-xs-semibold-letter-spacing);\r\n }\r\n\r\n /* Size tiers follow Figma Badge S/M/L/XL (20/24/28/40px).\r\n Figma binds a *-regular family with *-semibold metrics on S/M/L. */\r\n .badge-md {\r\n min-width: 24px;\r\n height: 24px;\r\n padding: 0 6px;\r\n font-family: var(--rel-body-sm-regular-font-family);\r\n font-weight: var(--rel-body-sm-semibold-font-weight);\r\n font-size: var(--rel-body-sm-semibold-font-size);\r\n line-height: var(--rel-body-sm-semibold-line-height);\r\n letter-spacing: var(--rel-body-sm-semibold-letter-spacing);\r\n }\r\n\r\n .badge-lg {\r\n min-width: 28px;\r\n height: 28px;\r\n padding: 0 6px;\r\n font-family: var(--rel-body-md-regular-font-family);\r\n font-weight: var(--rel-body-md-semibold-font-weight);\r\n font-size: var(--rel-body-md-regular-font-size);\r\n line-height: var(--rel-body-md-regular-line-height);\r\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\r\n }\r\n\r\n .badge-xl {\r\n min-width: 40px;\r\n height: 40px;\r\n padding: 0 8px;\r\n font-family: var(--rel-body-xl-semibold-font-family);\r\n font-weight: var(--rel-body-xl-semibold-font-weight);\r\n font-size: var(--rel-body-xl-semibold-font-size);\r\n line-height: var(--rel-body-xl-semibold-line-height);\r\n letter-spacing: var(--rel-body-xl-semibold-letter-spacing);\r\n }\r\n\r\n /* DOT BADGES — explicitly reset min-width/padding inherited from the\r\n number-badge size rules above; otherwise min-width wins over this\r\n smaller width and the dot gets stretched into a squashed pill. */\r\n .badge-dot.badge-sm {\r\n width: 8px;\r\n height: 8px;\r\n min-width: 0;\r\n padding: 0;\r\n }\r\n\r\n .badge-dot.badge-md {\r\n width: 10px;\r\n height: 10px;\r\n min-width: 0;\r\n padding: 0;\r\n }\r\n\r\n .badge-dot.badge-lg {\r\n width: 12px;\r\n height: 12px;\r\n min-width: 0;\r\n padding: 0;\r\n }\r\n\r\n .badge-dot.badge-xl {\r\n width: 12px;\r\n height: 12px;\r\n min-width: 0;\r\n padding: 0;\r\n }\r\n `;\r\n\r\n private get classes() {\r\n return [\"badge\", `badge-${this.size}`, `badge-${this.variant}`].join(\" \");\r\n }\r\n\r\n override updated(changedProperties: Map<PropertyKey, unknown>): void {\r\n if (changedProperties.has(\"color\")) {\r\n if (this.color) {\r\n this.style.setProperty(\"--rel-badge-bg\", this.color);\r\n } else {\r\n this.style.removeProperty(\"--rel-badge-bg\");\r\n }\r\n }\r\n\r\n if (changedProperties.has(\"textColor\")) {\r\n if (this.textColor) {\r\n this.style.setProperty(\"--rel-badge-color\", this.textColor);\r\n } else {\r\n this.style.removeProperty(\"--rel-badge-color\");\r\n }\r\n }\r\n }\r\n\r\n render() {\r\n return html`\r\n <span part=\"base\" class=\"${this.classes}\" aria-label=${this.ariaLabel || `${this.number} ${this.suffix}`}>\r\n ${this.variant === \"number\" ? this.number : null}\r\n </span>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\r\nexport interface BreadcrumbItem {\r\n label: string;\r\n url?: string;\r\n}\r\n\r\n@customElement(\"rel-breadcrumbs\")\r\nexport class RelBreadcrumbs extends LitElement {\r\n @property({ type: Array })\r\n items: BreadcrumbItem[] = [];\r\n\r\n static styles = css`\r\n :host {\r\n display: block;\r\r\r\n color: var(--rel-text-default);\n font-family: var(--rel-body-md-regular-font-family);\n font-weight: var(--rel-body-md-regular-font-weight);\n font-size: var(--rel-body-md-regular-font-size);\n line-height: var(--rel-body-md-regular-line-height);\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\n }\r\n\r\n nav {\r\n width: 100%;\r\n }\r\n\r\n ol {\r\n display: flex;\r\n flex-wrap: wrap;\r\n padding: 0;\r\n margin: 0;\r\n list-style: none;\r\n }\r\n\r\n li {\r\n gap: var(--rel-spacing-xs);\r\n display: flex;\r\n align-items: center;\r\n }\r\n\r\n a {\r\n text-decoration: none;\r\n font-weight: var(--rel-body-md-regular-font-weight);\r\n color: var(--rel-text-body);\r\n }\r\n\r\n a:hover {\r\n text-decoration: underline;\r\n color: var(--rel-text-default);\r\n }\r\n\r\n a:focus-visible {\r\n outline: 2px solid var(--rel-border-focus);\r\n outline-offset: 2px;\r\n border-radius: 2px;\r\n }\r\n\r\n .current {\r\n font-weight: var(--rel-body-md-semibold-font-weight);\r\n color: var(--rel-text-default);\r\n cursor: default;\r\n }\r\n\r\n svg {\r\n stroke: currentColor;\r\n width: 16px;\r\n height: 16px;\r\n margin: 0 10px;\r\n }\r\n `;\r\n\r\n render() {\r\n return html`\r\n <nav part=\"base\" aria-label=\"Breadcrumb\">\r\n <ol>\r\n ${this.items.map((item, index) => {\r\n const isLast = index === this.items.length - 1;\r\n\r\n return html`\r\n <li>\r\n ${item.url && !isLast\r\n ? html`<a href=${item.url}>${item.label}</a>`\r\n : html`<span part=\"label\" class=\"current\" aria-current=\"page\">${item.label}</span>`}\r\n ${!isLast\r\n ? html`\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\r\n <polyline\r\n points=\"9 18 15 12 9 6\"\r\n fill=\"none\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n `\r\n : null}\r\n </li>\r\n `;\r\n })}\r\n </ol>\r\n </nav>\r\n `;\r\n }\r\n}\r\n","import \"../rel-badge/rel-badge\";\r\nimport { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\nimport { ifDefined } from \"lit/directives/if-defined.js\";\r\n\r\n/**\r\n * Style axis. Canonical values are the historical ones; \"outline\"/\"ghost\" are\r\n * accepted Figma-vocabulary aliases for \"secondary\"/\"text\". \"static\" is the\r\n * Figma Style=Static treatment (transparent, static-light label — for use on\r\n * colored/dark surfaces). Legacy \"icon\" is the pre-2.0 collapsed icon-button\r\n * variant and keeps its exact behavior; prefer icon-only + a style instead.\r\n */\r\nexport type ButtonVariant =\r\n | \"default\" | \"primary\" | \"secondary\" | \"text\" | \"link\" | \"icon\" | \"static\"\r\n | \"outline\" | \"ghost\";\r\n\r\n/** Tone axis. \"neutral\"/\"brand\"/\"danger\" are Figma-vocabulary aliases. */\r\nexport type ButtonTone =\r\n | \"default\" | \"primary\" | \"secondary\" | \"critical\" | \"success\"\r\n | \"neutral\" | \"brand\" | \"danger\";\r\n\r\n@customElement(\"rel-button\")\r\nexport class RelButton extends LitElement {\r\n @property({ type: String })\r\n variant: ButtonVariant = \"default\";\r\n\r\n @property({ type: String })\r\n tone: ButtonTone = \"default\";\r\n\r\n /**\r\n * Figma \"Type=Icon Only\" as an independent axis: a square button of the\r\n * current style/tone. Unlike legacy variant=\"icon\", this composes with\r\n * every style (outline/ghost/link included).\r\n */\r\n @property({ type: Boolean, reflect: true, attribute: \"icon-only\" })\r\n iconOnly = false;\r\n\r\n /** Figma \"State=Loading\": shows a spinner, blocks interaction. */\r\n @property({ type: Boolean, reflect: true }) loading = false;\r\n\r\n @property({ type: String })\r\n size: \"small\" | \"medium\" | \"large\" = \"medium\";\r\n\r\n @property({ type: String })\r\n border: \"corner-radius\" | \"small-corner-radius\" | \"no-corner-radius\" =\r\n \"corner-radius\";\r\n\r\n @property({ type: Boolean, reflect: true }) disabled = false;\r\n\r\n @property({ type: String, attribute: \"aria-label\" }) ariaLabel: string | null = null;\r\n\r\n /** Numeric/overflow text shown in a corner badge (e.g. \"3\", \"999+\"). Ignored when badgeDot is set. */\r\n @property({ type: String }) badge = \"\";\r\n\r\n /** Shows a small corner dot instead of a numbered badge — takes precedence over `badge`. */\r\n @property({ type: Boolean, attribute: \"badge-dot\" }) badgeDot = false;\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n display: inline-flex;\r\n position: relative;\r\n }\r\n\r\n .btn-badge {\r\n position: absolute;\r\n top: -6px;\r\n right: -6px;\r\n pointer-events: none;\r\n }\r\n\r\n /* Icon buttons are a 40px circle (radius 20). An 8px dot's center needs to\r\n land ON that circle's edge at the 45° corner point — which works out to\r\n roughly 2px inward from each edge (R - R/√2 - dot-radius ≈ 1.9px), not\r\n outside it like the numbered badge. Negative offsets here would float\r\n the dot in the empty bounding-box corner outside the visible circle. */\r\n .btn-badge[variant=\"dot\"] {\r\n top: 2px;\r\n right: 2px;\r\n }\r\n\r\n button {\r\n font-family: var(--rel-action-md-font-family);\r\n font-weight: var(--rel-action-md-font-weight);\r\n cursor: pointer;\r\n border: none;\r\n transition: all 0.15s ease;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: var(--rel-spacing-2xs);\r\n outline: none;\r\n position: relative;\r\n }\r\n\r\n /* Content wrapper mirrors the button's flex so slotted icon+label keep\r\n their gap; it exists so loading can hide the label without collapsing\r\n the button's width. */\r\n .content {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: inherit;\r\n }\r\n\r\n /* Loading (Figma State=Loading): spinner replaces the label in place */\r\n :host([loading]) {\r\n pointer-events: none;\r\n }\r\n\r\n :host([loading]) .content {\r\n visibility: hidden;\r\n }\r\n\r\n .spinner {\r\n position: absolute;\r\n left: 50%;\r\n top: 50%;\r\n width: 16px;\r\n height: 16px;\r\n margin: -8px 0 0 -8px;\r\n border-radius: 50%;\r\n border: 2px solid currentColor;\r\n border-top-color: transparent;\r\n animation: rel-btn-spin 0.8s linear infinite;\r\n }\r\n\r\n @keyframes rel-btn-spin {\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n }\r\n\r\n @media (prefers-reduced-motion: reduce) {\r\n .spinner {\r\n animation-duration: 2s;\r\n }\r\n }\r\n\r\n /* Sizes */\r\n .size-small {\r\n height: 32px;\r\n padding: 0 var(--rel-spacing-sm);\r\n font-family: var(--rel-action-md-font-family);\r\n font-weight: var(--rel-action-md-font-weight);\r\n font-size: var(--rel-action-md-font-size);\r\n line-height: var(--rel-action-md-line-height);\r\n letter-spacing: var(--rel-action-md-letter-spacing);\r\n }\r\n\r\n .size-medium {\r\n height: 40px;\r\n gap: var(--rel-spacing-xs);\r\n padding: 0 var(--rel-spacing-md);\r\n font-family: var(--rel-action-lg-font-family);\r\n font-weight: var(--rel-action-lg-font-weight);\r\n font-size: var(--rel-action-lg-font-size);\r\n line-height: var(--rel-action-lg-line-height);\r\n letter-spacing: var(--rel-action-lg-letter-spacing);\r\n }\r\n\r\n .size-large {\r\n height: 48px;\r\n padding: 0 var(--rel-spacing-lg);\r\n font-family: var(--rel-action-xl-font-family);\r\n font-weight: var(--rel-action-xl-font-weight);\r\n font-size: var(--rel-action-xl-font-size);\r\n line-height: var(--rel-action-xl-line-height);\r\n letter-spacing: var(--rel-action-xl-letter-spacing);\r\n }\r\n\r\n /* Borders */\r\n .border-corner-radius {\r\n border-radius: var(--rel-border-radius-full-rounded);\r\n }\r\n\r\n .border-small-corner-radius {\r\n border-radius: var(--rel-border-radius-sm);\r\n }\r\n\r\n .border-no-corner-radius {\r\n border-radius: var(--rel-border-radius-square);\r\n }\r\n\r\n /* Disabled */\r\n :host([disabled]) {\r\n /* not-allowed must stay VISIBLE: the host keeps pointer-events so the\r\n cursor renders. Clicks are neutralised two ways — the inner button's\r\n pointer-events:none (below) and the capture-phase handleHostClick\r\n guard (which also stops programmatic .click()). Putting\r\n pointer-events:none on the HOST would make it transparent to the\r\n pointer and suppress the cursor entirely. */\r\n cursor: not-allowed;\r\n /* The disabled tokens are full-contrast pairs (light: #0B0B0B on\r\n #C2C2C2, dark: #FFF on #404040), so on their own they render a\r\n crisp button that reads as enabled. Dulling happens here instead —\r\n same opacity mechanism the rest of the library uses. */\r\n opacity: 0.5;\r\n }\r\n\r\n /* Only styles that actually carry a fill flatten to the neutral disabled\r\n fill. Ghost/link/outline/static stay transparent so a disabled one\r\n keeps its own shape rather than becoming a solid pill — which is what\r\n made them look like ordinary enabled buttons. */\r\n :host([disabled]) button.btn-primary,\r\n :host([disabled]) button.btn-default,\r\n :host([disabled]) button.btn-icon {\r\n background-color: var(--rel-action-brand-fill-disabled) !important;\r\n color: var(--rel-action-brand-label-icons-primary-disabled) !important;\r\n border: none !important;\r\n }\r\n\r\n :host([disabled]) button {\r\n cursor: not-allowed;\r\n pointer-events: none;\r\n filter: none !important;\r\n }\r\n\r\n /* Variants & tones — V2 action tokens (auto light/dark) */\r\n .btn-default.tone-default {\r\n background: var(--rel-action-neutral-fill);\r\n color: var(--rel-action-neutral-label-icons-fill-inverse);\r\n }\r\n .btn-default.tone-critical {\r\n background: var(--rel-action-danger-fill);\r\n color: var(--rel-action-danger-label-icons-fill);\r\n }\r\n .btn-default.tone-success {\r\n background: var(--rel-action-success-fill);\r\n color: var(--rel-text-static-light);\r\n }\r\n\r\n .btn-primary.tone-default {\r\n background: var(--rel-action-brand-fill);\r\n color: var(--rel-action-brand-label-icons-primary);\r\n }\r\n .btn-primary.tone-critical {\r\n background: var(--rel-action-danger-fill);\r\n color: var(--rel-action-danger-label-icons-fill);\r\n }\r\n .btn-primary.tone-success {\r\n background: var(--rel-action-success-fill);\r\n color: var(--rel-action-success-label-icons-fill);\r\n }\r\n\r\n .btn-secondary {\r\n background: var(--rel-bg-surface);\r\n border: 1px solid var(--rel-action-neutral-border-outline);\r\n color: var(--rel-action-neutral-label-icons-outline);\r\n }\r\n\r\n /* Secondary critical / success tones. The danger outline border is\r\n deliberately the SUBTLE red at rest (red-100) and only goes solid\r\n (red-600) on hover/pressed — verified against the Figma design nodes,\r\n not just the variable names. Do not \"fix\" it to a solid red. */\r\n .btn-secondary.tone-critical {\r\n border-color: var(--rel-action-danger-border-outline);\r\n color: var(--rel-action-danger-label-icons-outline);\r\n }\r\n .btn-secondary.tone-success {\r\n border-color: var(--rel-border-success);\r\n color: var(--rel-text-success);\r\n }\r\n\r\n .btn-text {\r\n background: transparent;\r\n color: var(--rel-action-neutral-label-icons-ghost);\r\n }\r\n\r\n .btn-text.tone-critical {\r\n color: var(--rel-action-danger-label-icons-ghost);\r\n }\r\n\r\n .btn-link {\r\n background: transparent;\r\n color: var(--rel-action-neutral-label-icons-link);\r\n text-decoration: underline;\r\n }\r\n\r\n button.btn-link:hover:not(:disabled) {\r\n color: var(--rel-action-neutral-label-icons-link-hover);\r\n }\r\n\r\n .btn-link.tone-critical {\r\n color: var(--rel-action-danger-label-icons-link);\r\n }\r\n\r\n button.btn-link.tone-critical:hover:not(:disabled) {\r\n color: var(--rel-action-danger-label-icons-link-hover);\r\n }\r\n\r\n /* Static style (Figma Style=Static, Tone=Neutral only): transparent with a\r\n static-light label, for placement on colored or dark surfaces */\r\n .btn-static {\r\n background: transparent;\r\n color: var(--rel-text-static-light);\r\n }\r\n\r\n button.btn-static:hover:not(:disabled) {\r\n background: var(--rel-action-neutral-static-hover);\r\n }\r\n\r\n /* Icon Only as an independent axis: square button of the current style */\r\n .btn-icon-only {\r\n padding: 0;\r\n }\r\n\r\n .btn-icon-only.size-small {\r\n width: 32px;\r\n }\r\n\r\n .btn-icon-only.size-medium {\r\n width: 40px;\r\n }\r\n\r\n .btn-icon-only.size-large {\r\n width: 48px;\r\n }\r\n\r\n .btn-icon {\r\n width: 40px;\r\n height: 40px;\r\n padding: 0;\r\n border-radius: 50%;\r\n }\r\n .btn-icon.tone-default {\r\n background: var(--rel-action-neutral-subtle);\r\n color: var(--rel-action-neutral-label-icons-ghost);\r\n border: none;\r\n }\r\n .btn-icon.tone-primary {\r\n background: var(--rel-action-brand-fill);\r\n color: var(--rel-action-brand-label-icons-primary);\r\n border: none;\r\n }\r\n .btn-icon.tone-secondary {\r\n background: var(--rel-bg-surface);\r\n color: var(--rel-action-neutral-label-icons-outline);\r\n border: 1px solid var(--rel-action-neutral-border-outline);\r\n }\r\n .btn-icon.tone-success {\r\n background: var(--rel-action-success-fill);\r\n color: var(--rel-action-success-label-icons-fill);\r\n border: none;\r\n }\r\n .btn-icon.tone-critical {\r\n background: var(--rel-action-danger-fill);\r\n color: var(--rel-action-danger-label-icons-fill);\r\n border: none;\r\n }\r\n\r\n button.btn-primary.tone-default:hover:not(:disabled) {\r\n background: var(--rel-action-brand-fill-hover);\r\n }\r\n\r\n button.btn-primary.tone-critical:hover:not(:disabled) {\r\n background: var(--rel-action-danger-fill-hover);\r\n }\r\n\r\n button.btn-primary.tone-success:hover:not(:disabled) {\r\n background: var(--rel-action-success-fill-hover);\r\n }\r\n\r\n /* Generic hover — excludes styles handled per-style. Now also excludes\r\n .btn-text: ghost gets tone-accent hovers below (this generic grey overlay\r\n has higher specificity than the per-tone ghost rules and was overriding\r\n them, which is why every ghost hover looked grey). */\r\n button:hover:not(:disabled):not(.btn-primary):not(.btn-default):not(.btn-icon):not(.btn-secondary):not(.btn-static):not(.btn-text) {\r\n background: var(--rel-action-overlay-hover);\r\n }\r\n\r\n /* Outline (secondary): fill stays on the surface (white) on hover AND\r\n pressed — only the border reacts. Matches Figma (transparent outline fill). */\r\n button.btn-secondary:hover:not(:disabled),\r\n button.btn-secondary:active:not(:disabled) {\r\n background: var(--rel-bg-surface);\r\n border-color: var(--rel-action-neutral-border-outline-hover);\r\n }\r\n button.btn-secondary.tone-critical:hover:not(:disabled),\r\n button.btn-secondary.tone-critical:active:not(:disabled) {\r\n background: var(--rel-bg-surface);\r\n border-color: var(--rel-action-danger-border-outline-hover);\r\n }\r\n button.btn-secondary.tone-success:hover:not(:disabled),\r\n button.btn-secondary.tone-success:active:not(:disabled) {\r\n background: var(--rel-bg-surface);\r\n border-color: var(--rel-border-success-strong);\r\n }\r\n\r\n /* Ghost (text): tone-accent fill on hover AND pressed — the same tint the\r\n outline used to carry (neutral = subtle overlay, danger = red-50,\r\n success = green-50). Matches Figma. */\r\n button.btn-text:hover:not(:disabled),\r\n button.btn-text:active:not(:disabled) {\r\n background: var(--rel-action-neutral-ghost-hover);\r\n }\r\n button.btn-text.tone-critical:hover:not(:disabled),\r\n button.btn-text.tone-critical:active:not(:disabled) {\r\n background: var(--rel-action-danger-ghost-hover);\r\n }\r\n button.btn-text.tone-success:hover:not(:disabled),\r\n button.btn-text.tone-success:active:not(:disabled) {\r\n background: var(--rel-action-success-ghost-hover);\r\n }\r\n\r\n button.btn-default.tone-default:hover:not(:disabled) {\r\n background: var(--rel-action-neutral-fill-hover);\r\n }\r\n button.btn-default.tone-critical:hover:not(:disabled) {\r\n background: var(--rel-action-danger-fill-hover);\r\n }\r\n button.btn-default.tone-success:hover:not(:disabled) {\r\n background: var(--rel-action-success-fill-hover);\r\n }\r\n\r\n /* Icon hover — each tone matches its corresponding button variant */\r\n button.btn-icon.tone-default:hover:not(:disabled) {\r\n background: var(--rel-action-neutral-subtle-hover);\r\n }\r\n button.btn-icon.tone-primary:hover:not(:disabled) {\r\n background: var(--rel-action-brand-fill-hover);\r\n }\r\n button.btn-icon.tone-secondary:hover:not(:disabled) {\r\n background: var(--rel-action-neutral-ghost-hover);\r\n border-color: var(--rel-action-neutral-border-outline-hover);\r\n }\r\n button.btn-icon.tone-success:hover:not(:disabled) {\r\n background: var(--rel-action-success-fill-hover);\r\n }\r\n button.btn-icon.tone-critical:hover:not(:disabled) {\r\n background: var(--rel-action-danger-fill-hover);\r\n }\r\n\r\n button.btn-default.tone-default:active:not(:disabled) {\r\n background-image: linear-gradient(\r\n var(--rel-action-neutral-static-hover),\r\n var(--rel-action-neutral-static-hover)\r\n );\r\n }\r\n\r\n button:active:not(:disabled) {\r\n transform: scale(0.97);\r\n }\r\n\r\n button:focus-visible {\r\n outline: 2px solid var(--rel-border-focus);\r\n outline-offset: 2px;\r\n box-shadow:\r\n 0 0 0 2px var(--rel-border-focus-inner),\r\n 0 0 0 8px var(--rel-border-focus-subtle);\r\n }\r\n `;\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n // Capture-phase, on the host itself: blocks programmatic el.click() calls\r\n // and any other path that bypasses the inner button's pointer-events:none\r\n // (e.g. CSS pointer-events doesn't stop .click(), which targets the host\r\n // directly regardless of hit-testing).\r\n this.addEventListener(\"click\", this.handleHostClick, { capture: true });\r\n }\r\n\r\n disconnectedCallback() {\r\n this.removeEventListener(\"click\", this.handleHostClick, { capture: true });\r\n super.disconnectedCallback();\r\n }\r\n\r\n private handleHostClick = (e: MouseEvent) => {\r\n if (this.disabled || this.loading) {\r\n e.preventDefault();\r\n e.stopImmediatePropagation();\r\n }\r\n };\r\n\r\n /** Style axis with Figma-vocabulary aliases folded onto canonical values. */\r\n private get styleVariant(): string {\r\n if (this.variant === \"outline\") return \"secondary\";\r\n if (this.variant === \"ghost\") return \"text\";\r\n return this.variant;\r\n }\r\n\r\n /** Tone axis with Figma-vocabulary aliases folded onto canonical values. */\r\n private get effectiveTone(): string {\r\n if (this.tone === \"neutral\") return \"default\";\r\n if (this.tone === \"brand\") return \"primary\";\r\n if (this.tone === \"danger\") return \"critical\";\r\n return this.tone;\r\n }\r\n\r\n private get classes() {\r\n const style = this.styleVariant;\r\n return [\r\n `btn-${style}`,\r\n this.iconOnly && style !== \"icon\" ? \"btn-icon-only\" : \"\",\r\n `tone-${this.effectiveTone}`,\r\n `size-${this.size}`,\r\n `border-${this.border}`,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n }\r\n\r\n private handleClick(e: MouseEvent) {\r\n if (this.disabled || this.loading) {\r\n e.preventDefault();\r\n e.stopImmediatePropagation();\r\n return;\r\n }\r\n\r\n // Native click events are already composed: true, so this bubbles\r\n // through the shadow boundary to the host on its own — no re-dispatch\r\n // needed. (A manual re-dispatch here previously caused every @click\r\n // listener on <rel-button> to fire twice per real click.)\r\n }\r\n\r\n render() {\r\n const showBadge = this.badgeDot || !!this.badge;\r\n\r\n return html`\r\n <button\r\n part=\"base\"\r\n class=\"${this.classes}\"\r\n ?disabled=${this.disabled}\r\n @click=${this.handleClick}\r\n aria-disabled=${this.disabled}\r\n aria-busy=${this.loading}\r\n aria-label=${ifDefined(this.ariaLabel ?? undefined)}\r\n >\r\n ${this.loading\r\n ? html`<span part=\"indicator\" class=\"spinner\" aria-hidden=\"true\"></span>`\r\n : null}\r\n <span class=\"content\"><slot></slot></span>\r\n </button>\r\n ${showBadge\r\n ? html`<rel-badge\r\n class=\"btn-badge\"\r\n variant=${this.badgeDot ? \"dot\" : \"number\"}\r\n number=${this.badge}\r\n size=\"sm\"\r\n ></rel-badge>`\r\n : null}\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css, nothing } from \"lit\";\r\nimport { customElement, property, state } from \"lit/decorators.js\";\r\n\r\ninterface CalendarDay {\r\n date: Date;\r\n day: number;\r\n isCurrentMonth: boolean;\r\n isToday: boolean;\r\n isSelected: boolean;\r\n isDisabled: boolean;\r\n isWeekend: boolean;\r\n}\r\n\r\n@customElement(\"rel-calendar\")\r\nexport class RelCalendar extends LitElement {\r\n @property({ type: String, reflect: true }) value: string | null = null;\r\n @property({ type: String }) min: string | null = null;\r\n @property({ type: String }) max: string | null = null;\r\n @property({ type: Boolean, reflect: true }) disabled = false;\r\n @property({ type: String, attribute: \"week-start\" }) weekStart: \"sun\" | \"mon\" = \"sun\";\r\n @property({ type: String }) locale = \"en-US\";\r\n\r\n // Custom disabled predicate (not settable via attribute)\r\n public isDateDisabled?: (date: Date) => boolean;\r\n\r\n @state() private viewYear: number = new Date().getFullYear();\r\n @state() private viewMonth: number = new Date().getMonth();\r\n @state() private focusedDate: Date | null = null;\r\n\r\n static styles = css`\r\n :host {\r\n display: block;\r\n font-family: var(--rel-fonts-font-family, sans-serif);\r\n background: var(--rel-bg-neutral);\r\n border: 1px solid var(--rel-border-default);\r\n border-radius: var(--rel-border-radius-sm, 8px);\r\n padding: var(--rel-spacing-md, 16px);\r\n max-width: 320px;\r\n color: var(--rel-text-default);\r\n }\r\n\r\n :host([disabled]) {\r\n opacity: 0.6;\r\n cursor: not-allowed;\r\n }\r\n\r\n /* Block interaction on the inner controls (JS also guards clicks), but keep\r\n pointer-events on the host so its not-allowed cursor shows through. */\r\n :host([disabled]) .day-button,\r\n :host([disabled]) .nav-button {\r\n pointer-events: none;\r\n }\r\n\r\n .header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n margin-bottom: var(--rel-spacing-sm);\r\n }\r\n\r\n .header-center {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-xs);\r\n color: var(--rel-text-label);\r\n font-family: var(--rel-body-lg-semibold-font-family);\r\n font-weight: var(--rel-body-lg-semibold-font-weight);\r\n font-size: var(--rel-body-lg-regular-font-size);\r\n line-height: var(--rel-body-lg-regular-line-height);\r\n letter-spacing: var(--rel-body-lg-regular-letter-spacing);\r\n }\r\n\r\n .nav-button {\r\n background: transparent;\r\n border: none;\r\n width: 32px;\r\n height: 32px;\r\n border-radius: var(--rel-border-radius-sm);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n cursor: pointer;\r\n color: var(--rel-action-neutral-label-icons-ghost);\r\n transition: background-color 0.15s ease;\r\n }\r\n\r\n .nav-button:hover {\r\n background: var(--rel-bg-neutral-elevated-2);\r\n }\r\n\r\n .nav-button:focus-visible {\r\n outline: 2px solid var(--rel-border-focus);\r\n outline-offset: 2px;\r\n }\r\n\r\n .calendar-grid {\r\n display: grid;\r\n grid-template-columns: repeat(7, 1fr);\r\n gap: var(--rel-spacing-2xs);\r\n }\r\n\r\n .weekday {\r\n text-align: center;\r\n color: var(--rel-text-placeholder);\r\n padding: var(--rel-spacing-xs);\r\n text-transform: uppercase;\r\n font-family: var(--rel-body-sm-regular-font-family);\r\n font-weight: var(--rel-body-xs-medium-font-weight);\r\n font-size: var(--rel-body-sm-medium-font-size);\r\n line-height: var(--rel-body-sm-medium-line-height);\r\n letter-spacing: var(--rel-body-sm-medium-letter-spacing);\r\n }\r\n\r\n .day-button {\r\n aspect-ratio: 1;\r\n border: none;\r\n background: transparent;\r\n border-radius: var(--rel-border-radius-sm);\r\n color: var(--rel-text-default);\r\n cursor: pointer;\r\n position: relative;\r\n transition: all 0.15s ease;\r\n font-family: var(--rel-body-md-regular-font-family);\r\n font-weight: var(--rel-body-md-regular-font-weight);\r\n font-size: var(--rel-body-md-regular-font-size);\r\n line-height: var(--rel-body-md-regular-line-height);\r\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\r\n }\r\n\r\n .day-button:hover:not(:disabled):not(.selected) {\r\n background: var(--rel-bg-neutral-elevated-1);\r\n }\r\n\r\n /* Weekend (Figma Day of a week=Weekend): same color at 70% — full opacity when selected */\r\n .day-button.weekend:not(.selected) {\r\n opacity: 0.7;\r\n }\r\n\r\n .day-button:focus-visible {\r\n outline: 2px solid var(--rel-border-focus);\r\n outline-offset: -2px;\r\n z-index: 1;\r\n }\r\n\r\n .day-button.today:not(.selected) {\r\n border: 2px solid var(--rel-border-brand);\r\n }\r\n\r\n .day-button.selected {\r\n background: var(--rel-bg-neutral-inverse-2);\r\n color: var(--rel-text-inverse);\r\n font-weight: var(--rel-body-md-semibold-font-weight);\r\n }\r\n\r\n .day-button.other-month {\r\n color: var(--rel-text-placeholder);\r\n opacity: 0.5;\r\n }\r\n\r\n .day-button:disabled {\r\n color: var(--rel-text-disabled);\r\n cursor: not-allowed;\r\n opacity: 0.5;\r\n }\r\n\r\n .day-button:disabled:hover {\r\n background: transparent;\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) :host,\r\n :host-context(.dark) :host {\r\n background: var(--rel-bg-neutral);\r\n border-color: var(--rel-border-default);\r\n }\r\n `;\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n if (this.value) {\r\n const date = this.parseISODate(this.value);\r\n if (date) {\r\n this.viewYear = date.getFullYear();\r\n this.viewMonth = date.getMonth();\r\n }\r\n }\r\n }\r\n\r\n updated(changedProperties: Map<string, any>) {\r\n if (changedProperties.has(\"value\") && this.value) {\r\n const date = this.parseISODate(this.value);\r\n if (date) {\r\n this.viewYear = date.getFullYear();\r\n this.viewMonth = date.getMonth();\r\n }\r\n }\r\n }\r\n\r\n private parseISODate(iso: string): Date | null {\r\n const match = iso.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\r\n if (!match) return null;\r\n const [, year, month, day] = match;\r\n return new Date(parseInt(year), parseInt(month) - 1, parseInt(day));\r\n }\r\n\r\n private formatISODate(date: Date): string {\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\r\n const day = String(date.getDate()).padStart(2, \"0\");\r\n return `${year}-${month}-${day}`;\r\n }\r\n\r\n private isSameDay(date1: Date, date2: Date): boolean {\r\n return (\r\n date1.getFullYear() === date2.getFullYear() &&\r\n date1.getMonth() === date2.getMonth() &&\r\n date1.getDate() === date2.getDate()\r\n );\r\n }\r\n\r\n private isDateDisabledInternal(date: Date): boolean {\r\n if (this.disabled) return true;\r\n\r\n if (this.min) {\r\n const minDate = this.parseISODate(this.min);\r\n if (minDate && date < minDate) return true;\r\n }\r\n\r\n if (this.max) {\r\n const maxDate = this.parseISODate(this.max);\r\n if (maxDate && date > maxDate) return true;\r\n }\r\n\r\n if (this.isDateDisabled && this.isDateDisabled(date)) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private getCalendarDays(): CalendarDay[] {\r\n const days: CalendarDay[] = [];\r\n const firstDayOfMonth = new Date(this.viewYear, this.viewMonth, 1);\r\n const lastDayOfMonth = new Date(this.viewYear, this.viewMonth + 1, 0);\r\n const today = new Date();\r\n const selectedDate = this.value ? this.parseISODate(this.value) : null;\r\n\r\n let startDay = firstDayOfMonth.getDay();\r\n if (this.weekStart === \"mon\") {\r\n startDay = startDay === 0 ? 6 : startDay - 1;\r\n }\r\n\r\n // Leading days from previous month\r\n for (let i = startDay - 1; i >= 0; i--) {\r\n const date = new Date(this.viewYear, this.viewMonth, -i);\r\n days.push({\r\n date,\r\n day: date.getDate(),\r\n isCurrentMonth: false,\r\n isToday: this.isSameDay(date, today),\r\n isSelected: selectedDate ? this.isSameDay(date, selectedDate) : false,\r\n isDisabled: this.isDateDisabledInternal(date),\r\n isWeekend: date.getDay() === 0 || date.getDay() === 6,\r\n });\r\n }\r\n\r\n // Current month days\r\n for (let day = 1; day <= lastDayOfMonth.getDate(); day++) {\r\n const date = new Date(this.viewYear, this.viewMonth, day);\r\n days.push({\r\n date,\r\n day,\r\n isCurrentMonth: true,\r\n isToday: this.isSameDay(date, today),\r\n isSelected: selectedDate ? this.isSameDay(date, selectedDate) : false,\r\n isDisabled: this.isDateDisabledInternal(date),\r\n isWeekend: date.getDay() === 0 || date.getDay() === 6,\r\n });\r\n }\r\n\r\n // Trailing days from next month\r\n const remainingCells = 42 - days.length; // 6 weeks max\r\n for (let i = 1; i <= remainingCells; i++) {\r\n const date = new Date(this.viewYear, this.viewMonth + 1, i);\r\n days.push({\r\n date,\r\n day: date.getDate(),\r\n isCurrentMonth: false,\r\n isToday: this.isSameDay(date, today),\r\n isSelected: selectedDate ? this.isSameDay(date, selectedDate) : false,\r\n isDisabled: this.isDateDisabledInternal(date),\r\n isWeekend: date.getDay() === 0 || date.getDay() === 6,\r\n });\r\n }\r\n\r\n return days;\r\n }\r\n\r\n private getWeekdayLabels(): string[] {\r\n const formatter = new Intl.DateTimeFormat(this.locale, { weekday: \"short\" });\r\n const days = [];\r\n const baseDate = new Date(2024, 0, 7); // Sunday, Jan 7, 2024\r\n\r\n for (let i = 0; i < 7; i++) {\r\n const offset = this.weekStart === \"mon\" ? i + 1 : i;\r\n const date = new Date(baseDate);\r\n date.setDate(baseDate.getDate() + offset);\r\n days.push(formatter.format(date).substring(0, 2));\r\n }\r\n\r\n return days;\r\n }\r\n\r\n private getMonthName(): string {\r\n const formatter = new Intl.DateTimeFormat(this.locale, { month: \"long\" });\r\n return formatter.format(new Date(this.viewYear, this.viewMonth, 1));\r\n }\r\n\r\n private previousMonth() {\r\n if (this.viewMonth === 0) {\r\n this.viewMonth = 11;\r\n this.viewYear--;\r\n } else {\r\n this.viewMonth--;\r\n }\r\n }\r\n\r\n private nextMonth() {\r\n if (this.viewMonth === 11) {\r\n this.viewMonth = 0;\r\n this.viewYear++;\r\n } else {\r\n this.viewMonth++;\r\n }\r\n }\r\n\r\n private selectDay(day: CalendarDay) {\r\n if (day.isDisabled || this.disabled) return;\r\n\r\n const newValue = this.formatISODate(day.date);\r\n this.value = newValue;\r\n this.focusedDate = day.date;\r\n\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-change\", {\r\n detail: {\r\n value: newValue,\r\n date: new Date(day.date),\r\n },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private handleKeyDown(e: KeyboardEvent, day: CalendarDay, index: number) {\r\n const days = this.getCalendarDays();\r\n let targetIndex = index;\r\n\r\n switch (e.key) {\r\n case \"ArrowLeft\":\r\n e.preventDefault();\r\n targetIndex = index - 1;\r\n break;\r\n case \"ArrowRight\":\r\n e.preventDefault();\r\n targetIndex = index + 1;\r\n break;\r\n case \"ArrowUp\":\r\n e.preventDefault();\r\n targetIndex = index - 7;\r\n break;\r\n case \"ArrowDown\":\r\n e.preventDefault();\r\n targetIndex = index + 7;\r\n break;\r\n case \"Home\":\r\n e.preventDefault();\r\n targetIndex = index - (index % 7);\r\n break;\r\n case \"End\":\r\n e.preventDefault();\r\n targetIndex = index - (index % 7) + 6;\r\n break;\r\n case \"PageUp\":\r\n e.preventDefault();\r\n if (e.shiftKey) {\r\n this.viewYear--;\r\n } else {\r\n this.previousMonth();\r\n }\r\n return;\r\n case \"PageDown\":\r\n e.preventDefault();\r\n if (e.shiftKey) {\r\n this.viewYear++;\r\n } else {\r\n this.nextMonth();\r\n }\r\n return;\r\n case \"Enter\":\r\n case \" \":\r\n e.preventDefault();\r\n this.selectDay(day);\r\n return;\r\n default:\r\n return;\r\n }\r\n\r\n if (targetIndex >= 0 && targetIndex < days.length) {\r\n const targetDay = days[targetIndex];\r\n if (!targetDay.isCurrentMonth) {\r\n if (targetIndex < index) {\r\n this.previousMonth();\r\n } else {\r\n this.nextMonth();\r\n }\r\n }\r\n this.focusedDate = targetDay.date;\r\n this.requestUpdate();\r\n this.updateComplete.then(() => {\r\n const buttons = this.shadowRoot?.querySelectorAll(\".day-button\");\r\n if (buttons && buttons[targetIndex]) {\r\n (buttons[targetIndex] as HTMLButtonElement).focus();\r\n }\r\n });\r\n }\r\n }\r\n\r\n render() {\r\n const days = this.getCalendarDays();\r\n const weekdayLabels = this.getWeekdayLabels();\r\n\r\n return html`\r\n <div role=\"grid\" aria-label=\"Calendar\">\r\n <div part=\"header\" class=\"header\">\r\n <button\r\n part=\"action\" class=\"nav-button\"\r\n @click=${this.previousMonth}\r\n aria-label=\"Previous month\"\r\n ?disabled=${this.disabled}\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M10 12L6 8L10 4\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </button>\r\n\r\n <div part=\"label\" class=\"header-center\">\r\n <span>${this.getMonthName()}</span>\r\n <span>${this.viewYear}</span>\r\n </div>\r\n\r\n <button\r\n part=\"action\" class=\"nav-button\"\r\n @click=${this.nextMonth}\r\n aria-label=\"Next month\"\r\n ?disabled=${this.disabled}\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M6 4L10 8L6 12\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <div part=\"list\" class=\"calendar-grid\" role=\"row\">\r\n ${weekdayLabels.map(\r\n (label) => html`\r\n <div part=\"label\" class=\"weekday\" role=\"columnheader\" aria-label=\"${label}\">\r\n ${label}\r\n </div>\r\n `\r\n )}\r\n </div>\r\n\r\n <div part=\"list\" class=\"calendar-grid\">\r\n ${days.map(\r\n (day, index) => html`\r\n <button\r\n part=\"item\" class=\"day-button ${day.isSelected ? \"selected\" : \"\"} ${day.isToday\r\n ? \"today\"\r\n : \"\"} ${!day.isCurrentMonth ? \"other-month\" : \"\"} ${day.isWeekend ? \"weekend\" : \"\"}\"\r\n role=\"gridcell\"\r\n aria-label=\"${this.formatISODate(day.date)}\"\r\n aria-selected=\"${day.isSelected}\"\r\n ?disabled=${day.isDisabled}\r\n @click=${() => this.selectDay(day)}\r\n @keydown=${(e: KeyboardEvent) => this.handleKeyDown(e, day, index)}\r\n tabindex=\"${day.isSelected || (index === 0 && !this.focusedDate) ? 0 : -1}\"\r\n >\r\n ${day.day}\r\n </button>\r\n `\r\n )}\r\n </div>\r\n </div>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css, nothing } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\n\n@customElement(\"rel-card\")\nexport class RelCard extends LitElement {\n /**\n * Figma \"Type\" axis: custom (default) renders slotted content with card\n * padding; media adds a flush media region (slot name=\"media\") above the\n * content — pair it with <rel-card-media>.\n */\n @property({ type: String, reflect: true })\n type: \"custom\" | \"media\" = \"custom\";\n\n static styles = css`\n :host {\n color: var(--rel-text-default);\n display: block;\n font-family: var(--rel-body-lg-regular-font-family);\n }\n\n /* Default typography for slotted card content (Figma card roles) */\n ::slotted(h1), ::slotted(h2), ::slotted(h3), ::slotted(h4) {\n font-family: var(--rel-headings-md-font-family);\n font-weight: var(--rel-headings-md-font-weight);\n font-size: var(--rel-headings-md-font-size);\n line-height: var(--rel-headings-md-line-height);\n letter-spacing: var(--rel-headings-md-letter-spacing);\n color: var(--rel-text-default);\n margin: 0 0 var(--rel-spacing-2xs) 0;\n }\n\n ::slotted(p) {\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 color: var(--rel-text-body);\n margin: 0 0 var(--rel-spacing-xs) 0;\n }\n\n .card {\n background-color: var(--rel-bg-surface);\n color: var(--rel-text-default);\n border-radius: var(--rel-border-radius-sm);\n border: 1px solid var(--rel-border-default);\n padding: var(--rel-spacing-lg) var(--rel-spacing-md);\n }\n\n /* Media type: media sits flush against the card edges, content keeps padding */\n :host([type=\"media\"]) .card {\n padding: 0;\n overflow: hidden;\n }\n\n .media {\n display: block;\n }\n\n .media ::slotted(*) {\n display: block;\n width: 100%;\n }\n\n :host([type=\"media\"]) .content {\n padding: var(--rel-spacing-lg) var(--rel-spacing-md);\n }\n\n :host-context([data-theme=\"dark\"]) .card,\n :host-context(.dark) .card {\n background-color: var(--rel-bg-surface);\n border-color: var(--rel-border-default);\n }\n `;\n\n render() {\n return html`\n <div part=\"base\" class=\"card\">\n ${this.type === \"media\"\n ? html`<div part=\"header\" class=\"media\"><slot name=\"media\"></slot></div>`\n : nothing}\n <div part=\"content\" class=\"content\">\n <slot></slot>\n </div>\n </div>\n `;\n }\n}\n","import { LitElement, html, css, nothing } from \"lit\";\nimport { customElement, property, state, query } from \"lit/decorators.js\";\n\n@customElement(\"rel-carousel\")\nexport class RelCarousel extends LitElement {\n @property({ type: Number, reflect: true }) value = 0;\n @property({ type: Boolean }) loop = false;\n @property({ type: Boolean }) autoplay = false;\n @property({ type: Number }) interval = 5000;\n @property({ type: Boolean, attribute: \"pause-on-hover\" }) pauseOnHover = true;\n @property({ type: Boolean, attribute: \"show-buttons\" }) showButtons = false;\n @property({ type: Boolean, attribute: \"show-dots\" }) showDots = false;\n\n /**\n * Figma \"Type\" axis. When set it drives which controls render:\n * default = content only · only-indicators = dots · side-arrows = overlaid\n * arrows + dots · bottom-arrows = dots flanked by arrows below the slide.\n * When unset, the legacy show-buttons/show-dots booleans apply unchanged.\n */\n @property({ type: String, reflect: true })\n type?: \"default\" | \"only-indicators\" | \"side-arrows\" | \"bottom-arrows\";\n\n @property({ type: String, reflect: true }) orientation: \"horizontal\" | \"vertical\" = \"horizontal\";\n @property({ type: String }) label: string = \"Carousel\";\n @property({ type: Number }) gap?: number;\n @property({ type: Boolean, reflect: true }) disabled = false;\n\n @state() private slideCount = 0;\n @state() private isDragging = false;\n @state() private dragStartX = 0;\n @state() private currentTranslate = 0;\n @state() private prevTranslate = 0;\n\n @query(\".viewport\") private viewport?: HTMLElement;\n @query(\".track\") private track?: HTMLElement;\n @query(\"slot\") private slotElement?: HTMLSlotElement;\n\n private autoplayTimer?: number;\n private animationId?: number;\n private prefersReducedMotion = false;\n // Number of clone slides prepended before the real slides\n private clonesBefore = 0;\n private _silentJumping = false;\n private _ro?: ResizeObserver;\n\n static styles = css`\n :host {\n color: var(--rel-text-default);\n display: block;\n font-family: var(--rel-fonts-font-family);\n position: relative;\n user-select: none;\n }\n\n :host([disabled]) {\n opacity: 0.6;\n pointer-events: none;\n cursor: not-allowed;\n }\n\n .viewport {\n overflow: hidden;\n position: relative;\n width: 100%;\n display: block;\n }\n\n .track {\n display: flex;\n width: 100%;\n transition: transform 0.3s ease-out;\n will-change: transform;\n }\n\n /* Vertical orientation: column track inside a fixed-height viewport */\n :host([orientation=\"vertical\"]) .viewport {\n height: var(--rel-carousel-height, 320px);\n }\n\n :host([orientation=\"vertical\"]) .track {\n flex-direction: column;\n height: 100%;\n }\n\n :host([orientation=\"vertical\"]) ::slotted(*) {\n width: 100% !important;\n height: var(--rel-carousel-slide-height, 100%) !important;\n }\n\n .track.dragging {\n transition: none;\n }\n\n .track.no-transition {\n transition: none;\n }\n\n ::slotted(*) {\n flex-shrink: 0 !important;\n width: var(--rel-carousel-slide-width, 100%) !important;\n min-width: 0 !important;\n box-sizing: border-box !important;\n }\n\n /* Clone slides injected for seamless loop */\n .carousel-clone {\n flex: 0 0 100%;\n min-width: 0;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--rel-bg-neutral-elevated-1);\n }\n\n /* Default typography for slotted slide captions (Figma roles) */\n ::slotted(h1), ::slotted(h2), ::slotted(h3), ::slotted(h4) {\n font-family: var(--rel-headings-sm-font-family);\n font-weight: var(--rel-headings-sm-font-weight);\n font-size: var(--rel-headings-xs-font-size);\n line-height: var(--rel-headings-xs-line-height);\n letter-spacing: var(--rel-headings-xs-letter-spacing);\n margin: 0 0 var(--rel-spacing-2xs) 0;\n }\n\n ::slotted(p) {\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-body);\n margin: 0 0 var(--rel-spacing-lg) 0;\n }\n\n \n /* Navigation buttons */\n .nav-button {\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n z-index: 10;\n width: var(--rel-carousel-nav-size, 40px);\n height: var(--rel-carousel-nav-size, 40px);\n border-radius: 50%;\n border: 1px solid var(--rel-border-default);\n background: var(--rel-bg-neutral);\n color: var(--rel-action-neutral-label-icons-ghost);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.15s ease;\n box-shadow: var(--rel-shadows-shadow-100);\n }\n\n .nav-button:hover:not(:disabled) {\n background: var(--rel-bg-surface-elevated);\n }\n\n .nav-button:focus-visible {\n outline: 2px solid var(--rel-border-focus);\n outline-offset: 2px;\n }\n\n .nav-button:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n\n .nav-button.prev {\n left: var(--rel-spacing-sm);\n }\n\n .nav-button.next {\n right: var(--rel-spacing-sm);\n }\n\n /* Bottom arrows (Figma Type=Bottom Arrows): inline with the dots row */\n .dots .nav-button {\n position: static;\n transform: none;\n width: 32px;\n height: 32px;\n box-shadow: none;\n }\n\n .nav-button svg {\n width: 20px;\n height: 20px;\n }\n\n /* Dots indicator */\n .dots {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--rel-spacing-xs);\n margin-top: var(--rel-spacing-md);\n }\n\n .dot {\n width: var(--rel-carousel-dot-size, 8px);\n height: var(--rel-carousel-dot-size, 8px);\n border-radius: 50%;\n border: none;\n background: var(--rel-bg-neutral-elevated-2);\n cursor: pointer;\n padding: 0;\n transition: all 0.15s ease;\n }\n\n .dot:hover {\n background: var(--rel-bg-neutral-elevated-2);\n }\n\n .dot.active {\n background: var(--rel-bg-surface-brand);\n width: var(--rel-carousel-dot-size-active, 24px);\n border-radius: var(--rel-border-radius-xs);\n }\n\n .dot:focus-visible {\n outline: 2px solid var(--rel-border-focus);\n outline-offset: 2px;\n }\n\n /* Reduced motion support */\n @media (prefers-reduced-motion: reduce) {\n .track {\n transition: none;\n }\n }\n\n :host-context([data-theme=\"dark\"]) .nav-button,\n :host-context(.dark) .nav-button {\n background: var(--rel-bg-surface-elevated);\n border-color: var(--rel-border-default);\n color: var(--rel-text-default);\n }\n\n :host-context([data-theme=\"dark\"]) .nav-button:hover,\n :host-context(.dark) .nav-button:hover {\n background: var(--rel-bg-neutral-elevated-1);\n }\n `;\n\n connectedCallback() {\n super.connectedCallback();\n this.prefersReducedMotion = window.matchMedia(\n \"(prefers-reduced-motion: reduce)\"\n ).matches;\n\n if (this.autoplay) {\n this.startAutoplay();\n }\n }\n\n firstUpdated() {\n const ro = new ResizeObserver(() => {\n const w = this.viewport?.offsetWidth ?? 0;\n const h = this.viewport?.offsetHeight ?? 0;\n if (w === 0 && h === 0) return;\n this.style.setProperty('--rel-carousel-slide-width', `${w}px`);\n this.style.setProperty('--rel-carousel-slide-height', `${h}px`);\n this.renderRoot.querySelectorAll('.carousel-clone').forEach(el => {\n if (this.vertical) (el as HTMLElement).style.height = `${h}px`;\n else (el as HTMLElement).style.width = `${w}px`;\n });\n this.updateTransform();\n });\n if (this.viewport) ro.observe(this.viewport);\n this._ro = ro;\n\n requestAnimationFrame(() => {\n const w = this.viewport?.offsetWidth ?? 0;\n const h = this.viewport?.offsetHeight ?? 0;\n if (w > 0 || h > 0) {\n this.style.setProperty('--rel-carousel-slide-width', `${w}px`);\n this.style.setProperty('--rel-carousel-slide-height', `${h}px`);\n this.updateTransform();\n }\n });\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this._ro?.disconnect();\n this.stopAutoplay();\n if (this.animationId) {\n cancelAnimationFrame(this.animationId);\n }\n }\n\n private handleSlotChange() {\n const slot = this.slotElement;\n const track = this.track;\n if (!slot || !track) return;\n\n const elements = slot.assignedElements();\n this.slideCount = elements.length;\n\n // Clamp value to valid real-slide range\n if (this.value >= this.slideCount) this.value = Math.max(0, this.slideCount - 1);\n if (this.value < 0) this.value = 0;\n\n // Remove any existing shadow-DOM clones\n track.querySelectorAll(\".carousel-clone\").forEach((el) => el.remove());\n\n const useClones = (this.loop || this.autoplay) && this.slideCount > 1;\n\n if (useClones) {\n this.clonesBefore = 1;\n\n const sizeClone = (clone: HTMLElement) => {\n if (this.vertical) clone.style.height = `${this.viewport?.offsetHeight ?? 0}px`;\n else clone.style.width = `${this.viewport?.offsetWidth ?? 0}px`;\n clone.style.boxSizing = 'border-box';\n };\n\n // Clone last slide → prepend before <slot>\n const lastEl = elements[this.slideCount - 1] as HTMLElement;\n const lastClone = lastEl.cloneNode(true) as HTMLElement;\n lastClone.classList.add(\"carousel-clone\");\n lastClone.setAttribute(\"aria-hidden\", \"true\");\n sizeClone(lastClone);\n track.insertBefore(lastClone, slot);\n\n // Clone first slide → append after <slot>\n const firstEl = elements[0] as HTMLElement;\n const firstClone = firstEl.cloneNode(true) as HTMLElement;\n firstClone.classList.add(\"carousel-clone\");\n firstClone.setAttribute(\"aria-hidden\", \"true\");\n sizeClone(firstClone);\n track.appendChild(firstClone);\n } else {\n this.clonesBefore = 0;\n }\n\n requestAnimationFrame(() => this.updateTransform());\n\n // If loop/autoplay clones were inserted but viewport has no width yet,\n // retry once after paint when dimensions are available\n if (useClones && this.unit() === 0) {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n this.handleSlotChange();\n });\n });\n }\n }\n\n private get vertical(): boolean {\n return this.orientation === \"vertical\";\n }\n\n /** Translate along the orientation axis. */\n private axisTransform(px: number): string {\n return this.vertical ? `translateY(${px}px)` : `translateX(${px}px)`;\n }\n\n private unit(): number {\n const slideSize = (this.vertical ? this.viewport?.offsetHeight : this.viewport?.offsetWidth) ?? 0;\n const gapValue = this.gap && this.gap > 0 ? this.gap : 0;\n return slideSize + gapValue;\n }\n\n private updateTransform() {\n if (!this.track || !this.viewport) return;\n\n const u = this.unit();\n const translate = -((this.value + this.clonesBefore) * u);\n\n this.currentTranslate = translate;\n this.prevTranslate = translate;\n this.track.style.transform = this.axisTransform(translate);\n this.track.style.gap = this.gap && this.gap > 0 ? `${this.gap}px` : \"\";\n }\n\n private goToPrevious() {\n if (this.disabled) return;\n\n if (this.value > 0) {\n this.value--;\n this.updateTransform();\n this.emitChange();\n } else if (this.clonesBefore > 0) {\n // Animate to the lastClone (position 0 in the track)\n const translate = 0;\n this.currentTranslate = translate;\n this.prevTranslate = translate;\n this.track!.style.transform = this.axisTransform(translate);\n this.track!.addEventListener(\n \"transitionend\",\n () => this.silentJump(this.slideCount - 1),\n { once: true }\n );\n }\n }\n\n private goToNext() {\n if (this.disabled) return;\n\n if (this.value < this.slideCount - 1) {\n this.value++;\n this.updateTransform();\n this.emitChange();\n } else if (this.clonesBefore > 0) {\n // Animate to the firstClone (one position past the last real slide)\n const cloneFirstPos = this.slideCount + this.clonesBefore;\n const translate = -(cloneFirstPos * this.unit());\n this.currentTranslate = translate;\n this.prevTranslate = translate;\n this.track!.style.transform = this.axisTransform(translate);\n this.track!.addEventListener(\n \"transitionend\",\n () => this.silentJump(0),\n { once: true }\n );\n }\n }\n\n // Silently reposition to newValue with no visible transition, then re-enable animation.\n private silentJump(newValue: number) {\n if (!this.track) return;\n this.track.classList.add(\"no-transition\");\n this._silentJumping = true;\n this.value = newValue;\n this.updateTransform();\n this._silentJumping = false;\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n this.track!.classList.remove(\"no-transition\");\n });\n });\n this.emitChange();\n }\n\n private goToSlide(index: number) {\n if (this.disabled || index < 0 || index >= this.slideCount) return;\n\n this.value = index;\n this.updateTransform();\n this.emitChange();\n }\n\n private emitChange() {\n this.dispatchEvent(\n new CustomEvent(\"rel-change\", {\n detail: { value: this.value },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private startAutoplay() {\n if (!this.autoplay || this.disabled) return;\n\n this.stopAutoplay();\n this.autoplayTimer = window.setInterval(() => {\n this.goToNext();\n }, this.interval);\n }\n\n private stopAutoplay() {\n if (this.autoplayTimer) {\n clearInterval(this.autoplayTimer);\n this.autoplayTimer = undefined;\n }\n }\n\n private handlePointerDown(e: PointerEvent) {\n if (this.disabled || !this.track) return;\n\n this.isDragging = true;\n this.dragStartX = this.vertical ? e.clientY : e.clientX;\n this.prevTranslate = this.currentTranslate;\n\n this.track.classList.add(\"dragging\");\n\n if (this.autoplay && this.pauseOnHover) {\n this.stopAutoplay();\n }\n\n e.preventDefault();\n }\n\n private handlePointerMove(e: PointerEvent) {\n if (!this.isDragging || !this.track) return;\n\n const current = this.vertical ? e.clientY : e.clientX;\n const delta = current - this.dragStartX;\n this.currentTranslate = this.prevTranslate + delta;\n\n if (!this.prefersReducedMotion && this.animationId) {\n cancelAnimationFrame(this.animationId);\n }\n\n this.animationId = requestAnimationFrame(() => {\n if (this.track) {\n this.track.style.transform = this.axisTransform(this.currentTranslate);\n }\n });\n }\n\n private handlePointerUp(e: PointerEvent) {\n if (!this.isDragging || !this.track || !this.viewport) return;\n\n this.isDragging = false;\n this.track.classList.remove(\"dragging\");\n\n const delta = (this.vertical ? e.clientY : e.clientX) - this.dragStartX;\n const slideSize = this.vertical ? this.viewport.offsetHeight : this.viewport.offsetWidth;\n const threshold = slideSize * 0.2; // 20% threshold\n\n if (Math.abs(delta) > threshold) {\n if (delta > 0 && (this.value > 0 || this.clonesBefore > 0)) {\n this.goToPrevious();\n } else if (delta < 0 && (this.value < this.slideCount - 1 || this.clonesBefore > 0)) {\n this.goToNext();\n } else {\n this.updateTransform();\n }\n } else {\n this.updateTransform();\n }\n\n if (this.autoplay) {\n this.startAutoplay();\n }\n }\n\n private handleKeyDown(e: KeyboardEvent) {\n if (this.disabled) return;\n\n switch (e.key) {\n case \"ArrowLeft\":\n case \"ArrowUp\":\n e.preventDefault();\n this.goToPrevious();\n break;\n case \"ArrowRight\":\n case \"ArrowDown\":\n e.preventDefault();\n this.goToNext();\n break;\n case \"Home\":\n e.preventDefault();\n this.goToSlide(0);\n break;\n case \"End\":\n e.preventDefault();\n this.goToSlide(this.slideCount - 1);\n break;\n }\n }\n\n private handleMouseEnter() {\n if (this.autoplay && this.pauseOnHover) {\n this.stopAutoplay();\n }\n }\n\n private handleMouseLeave() {\n if (this.autoplay && this.pauseOnHover) {\n this.startAutoplay();\n }\n }\n\n updated(changedProperties: Map<string, any>) {\n if (changedProperties.has(\"autoplay\") || changedProperties.has(\"interval\")) {\n if (this.autoplay) {\n this.startAutoplay();\n } else {\n this.stopAutoplay();\n }\n }\n\n // Only call updateTransform via Lit lifecycle for in-range values;\n // out-of-range transitions (clone positions) are managed directly.\n // Skip when _silentJumping — silentJump() calls updateTransform() itself.\n if (changedProperties.has(\"value\") && !this._silentJumping && this.value >= 0 && this.value < this.slideCount) {\n this.updateTransform();\n }\n }\n\n /** Where nav arrows render, honouring the Figma type when set. */\n private get buttonPlacement(): \"side\" | \"bottom\" | \"none\" {\n if (this.type === \"side-arrows\") return \"side\";\n if (this.type === \"bottom-arrows\") return \"bottom\";\n if (this.type === \"only-indicators\" || this.type === \"default\") return \"none\";\n return this.showButtons ? \"side\" : \"none\";\n }\n\n private get dotsVisible(): boolean {\n if (this.type === \"default\") return false;\n if (this.type) return true;\n return this.showDots;\n }\n\n private renderNavButton(direction: \"prev\" | \"next\", enabled: boolean) {\n const path = direction === \"prev\" ? \"M10 12L6 8L10 4\" : \"M6 4L10 8L6 12\";\n return html`\n <button\n class=\"nav-button ${direction}\"\n part=\"${direction}-button\"\n aria-label=\"${direction === \"prev\" ? \"Previous\" : \"Next\"} slide\"\n ?disabled=${!enabled || this.disabled}\n @click=${direction === \"prev\" ? this.goToPrevious : this.goToNext}\n >\n <svg viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"${path}\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n `;\n }\n\n render() {\n const canGoPrev = this.clonesBefore > 0 || this.value > 0;\n const canGoNext = this.clonesBefore > 0 || this.value < this.slideCount - 1;\n\n return html`\n <div\n class=\"viewport\"\n part=\"viewport\"\n role=\"region\"\n aria-roledescription=\"carousel\"\n aria-label=${this.label}\n @keydown=${this.handleKeyDown}\n @mouseenter=${this.handleMouseEnter}\n @mouseleave=${this.handleMouseLeave}\n tabindex=\"0\"\n >\n <div\n class=\"track\"\n part=\"track\"\n @pointerdown=${this.handlePointerDown}\n @pointermove=${this.handlePointerMove}\n @pointerup=${this.handlePointerUp}\n @pointercancel=${this.handlePointerUp}\n >\n <slot @slotchange=${this.handleSlotChange}></slot>\n </div>\n\n ${this.buttonPlacement === \"side\"\n ? html`\n ${this.renderNavButton(\"prev\", canGoPrev)}\n ${this.renderNavButton(\"next\", canGoNext)}\n `\n : nothing}\n </div>\n\n ${(this.dotsVisible || this.buttonPlacement === \"bottom\") && this.slideCount > 1\n ? html`\n <div class=\"dots\" part=\"dots\">\n ${this.buttonPlacement === \"bottom\" ? this.renderNavButton(\"prev\", canGoPrev) : nothing}\n ${this.dotsVisible\n ? Array.from({ length: this.slideCount }, (_, i) => html`\n <button\n class=\"dot ${i === this.value ? \"active\" : \"\"}\"\n part=\"dot\"\n aria-label=\"Go to slide ${i + 1}\"\n @click=${() => this.goToSlide(i)}\n ></button>\n `)\n : nothing}\n ${this.buttonPlacement === \"bottom\" ? this.renderNavButton(\"next\", canGoNext) : nothing}\n </div>\n `\n : nothing}\n `;\n }\n}\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\r\n@customElement(\"rel-card-media\")\r\nexport class RelCardMedia extends LitElement {\r\n @property({ type: String, attribute: \"image-src\" }) imageSrc = \"\";\r\n @property({ type: String, attribute: \"image-alt\" }) imageAlt = \"Card image\";\r\n @property({ type: String }) title = \"\";\r\n @property({ type: String }) subtitle = \"\";\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n display: block;\r\n font-family: var(--rel-fonts-font-family, sans-serif);\r\n }\r\n\r\n .card-media {\r\n background-color: var(--rel-bg-surface);\r\n color: var(--rel-text-default);\r\n border-radius: var(--rel-border-radius-sm);\r\n border: 1px solid var(--rel-border-default);\r\n overflow: hidden;\r\n }\r\n\r\n .card-image img {\r\n display: block;\r\n width: 100%;\r\n height: auto;\r\n object-fit: cover;\r\n }\r\n\r\n .card-content {\r\n padding: var(--rel-spacing-md);\r\n }\r\n\r\n .card-content h3 {\r\n margin: 0 0 4px 0;\r\r\r\n color: var(--rel-text-label);\n font-family: var(--rel-body-md-semibold-font-family);\n font-weight: var(--rel-body-md-semibold-font-weight);\n font-size: var(--rel-body-md-semibold-font-size);\n line-height: var(--rel-body-md-semibold-line-height);\n letter-spacing: var(--rel-body-md-semibold-letter-spacing);\n }\r\n\r\n .card-content p {\r\n margin: 0 0 8px 0;\r\r\n color: var(--rel-text-default);\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 }\r\n\r\n :host-context([data-theme=\"dark\"]) .card-media,\r\n :host-context(.dark) .card-media {\r\n background-color: var(--rel-bg-surface);\r\n border-color: var(--rel-border-default);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .card-content h3,\r\n :host-context(.dark) .card-content h3 {\r\n color: var(--rel-text-label);\r\n }\r\n `;\r\n\r\n render() {\r\n return html`\r\n <div part=\"base\" class=\"card-media\">\r\n ${this.imageSrc\r\n ? html`\r\n <div part=\"icon\" class=\"card-image\">\r\n <img src=${this.imageSrc} alt=${this.imageAlt} />\r\n </div>\r\n `\r\n : null}\r\n\r\n <div part=\"content\" class=\"card-content\">\r\n ${this.title ? html`<h3>${this.title}</h3>` : null}\r\n ${this.subtitle ? html`<p>${this.subtitle}</p>` : null}\r\n <slot></slot>\r\n </div>\r\n </div>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\nimport \"@reliability-design/icons/rel-icon\";\r\n\r\ntype CheckboxState = \"default\" | \"error\" | \"disabled\";\r\ntype CheckboxStatus = \"unchecked\" | \"checked\" | \"indeterminate\";\r\n\r\n@customElement(\"rel-checkbox\")\r\nexport class RelCheckbox extends LitElement {\r\n @property({ type: String }) label = \"Label\";\r\n /** rel-icon name rendered between the checkbox and the label (label prefix icon). */\r\n @property({ type: String }) icon = \"\";\r\n @property({ type: String }) supportingtext = \"\";\r\n @property({ type: String }) state: CheckboxState = \"default\";\r\n @property({ type: String }) status: CheckboxStatus = \"unchecked\";\r\n @property({ type: String }) value = \"\";\r\n\r\n get checked(): boolean {\r\n return this.status === \"checked\";\r\n }\r\n set checked(val: boolean) {\r\n this.status = val ? \"checked\" : \"unchecked\";\r\n }\r\n\r\n private _onChange: (value: boolean) => void = () => {};\r\n private _onTouched: () => void = () => {};\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n display: block;\r\n font-family: var(--rel-fonts-font-family);\r\n }\r\n\r\n .wrapper {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--rel-spacing-3xs);\r\n }\r\n\r\n .row {\r\n /* Containing block for the hidden input below — without this the\r\n absolutely-positioned input resolves against the document (or any\r\n positioned ancestor in the consumer page), where it neither moves\r\n with intermediate scroll containers nor stays aligned with the\r\n visible box. Tabbing to it then makes the browser scroll the WRONG\r\n scroller (often the window past a 100vh overflow-hidden shell),\r\n shoving the whole page up and leaving it in a broken state. */\r\n position: relative;\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-xs);\r\n cursor: pointer;\r\n }\r\n\r\n input {\r\n position: absolute;\r\n inset: 0;\r\n width: 100%;\r\n height: 100%;\r\n margin: 0;\r\n opacity: 0;\r\n pointer-events: none;\r\n }\r\n\r\n /* Unchecked — transparent fill, gray border */\r\n .box {\r\n width: 18px;\r\n height: 18px;\r\n border-radius: 4px;\r\n border: 2px solid var(--rel-text-default);\r\n background: transparent;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n transition: all 0.2s;\r\n flex-shrink: 0;\r\n }\r\n\r\n input:focus-visible + .box {\r\n outline: 2px solid var(--rel-border-focus);\r\n outline-offset: 2px;\r\n }\r\n\r\n svg {\r\n width: 12px;\r\n height: 12px;\r\n display: none;\r\n }\r\n\r\n /* Checked — filled box, transparent checkmark (bg shows through) */\r\n .checked .box {\r\n background: var(--rel-bg-neutral-inverse-2);\r\n border-color: var(--rel-bg-neutral-inverse-2);\r\n }\r\n\r\n .checked .check-icon {\r\n display: block;\r\n fill: var(--rel-text-inverse);\r\n }\r\n\r\n /* Indeterminate — transparent fill, dash inherits border color */\r\n .indeterminate .indeterminate-icon {\r\n display: block;\r\n fill: var(--rel-bg-neutral-inverse-2);\r\n }\r\n\r\n /* Error unchecked — transparent fill, error border */\r\n .error .box {\r\n border-color: var(--rel-border-danger);\r\n }\r\n\r\n /* Error checked — error fill, transparent checkmark */\r\n .error.checked .box {\r\n background: var(--rel-action-danger-fill);\r\n border-color: var(--rel-action-danger-fill);\r\n }\r\n\r\n .error.checked .check-icon {\r\n fill: var(--rel-action-danger-label-icons-fill);\r\n }\r\n\r\n /* Error indeterminate — transparent fill, dash is error color */\r\n .error.indeterminate .indeterminate-icon {\r\n fill: var(--rel-text-danger);\r\n }\r\n\r\n /* Hover (Figma State=Hover): box outline/fill and label shift text-default -> text-body.\r\n Scoped to .default so error keeps its danger colors and disabled never hovers. */\r\n .default .row:hover .box {\r\n border-color: var(--rel-text-body);\r\n }\r\n\r\n .default .row:hover .label {\r\n color: var(--rel-text-body);\r\n }\r\n\r\n .default.checked .row:hover .box {\r\n background: var(--rel-text-body);\r\n border-color: var(--rel-text-body);\r\n }\r\n\r\n .default.indeterminate .row:hover .indeterminate-icon {\r\n fill: var(--rel-text-body);\r\n }\r\n\r\n .disabled {\r\n opacity: 0.55;\r\n cursor: not-allowed;\r\n }\r\n\r\n :host([state=\"disabled\"]) {\r\n cursor: not-allowed;\r\n }\r\n\r\n :host([state=\"disabled\"]) * {\r\n pointer-events: none;\r\n }\r\n\r\n .disabled .label,\r\n .disabled .text {\r\n color: var(--rel-text-disabled);\r\n }\r\n\r\n /* Optional label prefix icon — tracks the label's color in every state\r\n (rel-icon inherits currentColor). */\r\n .icon-prefix {\r\n flex-shrink: 0;\r\n color: var(--rel-text-default);\r\n }\r\n\r\n .default .row:hover .icon-prefix {\r\n color: var(--rel-text-body);\r\n }\r\n\r\n .disabled .icon-prefix {\r\n color: var(--rel-text-disabled);\r\n }\r\n\r\n .label {\r\n /* Figma: label rests on text-default; text-body is the hover color */\r\n color: var(--rel-text-default);\r\n\r\n font-family: var(--rel-body-lg-regular-font-family);\r\n\r\n font-weight: var(--rel-body-lg-regular-font-weight);\r\n\r\n font-size: var(--rel-body-lg-regular-font-size);\r\n\r\n line-height: var(--rel-body-lg-regular-line-height);\r\n\r\n letter-spacing: var(--rel-body-lg-regular-letter-spacing);\r\n\r\n }\r\n\r\n .text {\r\n color: var(--rel-text-caption);\r\n padding-left: 28px;\r\n\r\n font-family: var(--rel-body-sm-regular-font-family);\r\n\r\n font-weight: var(--rel-body-sm-regular-font-weight);\r\n\r\n font-size: var(--rel-body-sm-regular-font-size);\r\n\r\n line-height: var(--rel-body-sm-regular-line-height);\r\n\r\n letter-spacing: var(--rel-body-sm-regular-letter-spacing);\r\n\r\n }\r\n `;\r\n\r\n private toggle() {\r\n if (this.state === \"disabled\") return;\r\n\r\n // Binary toggle — indeterminate is programmatic-only and resolves to checked on user toggle.\r\n this.status = this.status === \"checked\" ? \"unchecked\" : \"checked\";\r\n\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-change\", {\r\n detail: {\r\n checked: this.status === \"checked\",\r\n value: this.value,\r\n },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n this._onChange(this.checked);\r\n }\r\n\r\n registerOnChange(fn: (value: boolean) => void): void { this._onChange = fn; }\r\n registerOnTouched(fn: () => void): void { this._onTouched = fn; }\r\n writeValue(checked: boolean): void { this.checked = checked; }\r\n\r\n render() {\r\n return html`\r\n <div part=\"base\" class=\"wrapper ${this.state} ${this.status}\">\r\n <label class=\"row\">\r\n <input\r\n type=\"checkbox\"\r\n @click=${this.toggle}\r\n @blur=${() => this._onTouched()}\r\n ?disabled=${this.state === \"disabled\"}\r\n />\r\n\r\n <span class=\"box\">\r\n <svg class=\"check-icon\" viewBox=\"0 0 18 14\" fill=\"var(--rel-text-inverse)\">\r\n <path\r\n d=\"M6.44 14L0.5 7.36l1.49-1.66L6.44 10.68 16.01 0 17.5 1.66z\"\r\n />\r\n </svg>\r\n\r\n <svg class=\"indeterminate-icon\" viewBox=\"0 0 16 2\" fill=\"var(--rel-text-inverse)\">\r\n <rect width=\"16\" height=\"2\" />\r\n </svg>\r\n </span>\r\n\r\n ${this.icon\r\n ? html`<rel-icon name=\"${this.icon}\" size=\"md\" class=\"icon-prefix\"></rel-icon>`\r\n : null}\r\n\r\n <span part=\"label\" class=\"label\">${this.label}</span>\r\n </label>\r\n\r\n ${this.supportingtext\r\n ? html`<span part=\"helper\" class=\"text\">${this.supportingtext}</span>`\r\n : null}\r\n </div>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css, nothing } from \"lit\";\r\nimport { customElement, property, state, query } from \"lit/decorators.js\";\r\nimport { formatDatePattern } from \"./date-format\";\r\n\r\ninterface CalendarDay {\r\n date: Date;\r\n day: number;\r\n isCurrentMonth: boolean;\r\n isToday: boolean;\r\n isSelected: boolean;\r\n isDisabled: boolean;\r\n}\r\n \r\n@customElement(\"rel-date-picker\")\r\nexport class RelDatePicker extends LitElement {\r\n @property({ type: String, reflect: true }) value: string | null = null;\r\n @property({ type: String }) placeholder = \"Select date\";\r\n @property({ type: String }) label: string | null = null;\r\n @property({ type: Boolean, reflect: true }) disabled = false;\r\n @property({ type: Boolean }) required = false;\r\n @property({ type: Boolean, reflect: true }) readonly = false;\r\n\r\n // Date bounds. minDate/maxDate are the standard names; min/max are kept as\r\n // deprecated aliases (minDate/maxDate win when both are set).\r\n @property({ type: String, attribute: \"min-date\" }) minDate: string | null = null;\r\n @property({ type: String, attribute: \"max-date\" }) maxDate: string | null = null;\r\n /** @deprecated use minDate */\r\n @property({ type: String }) min: string | null = null;\r\n /** @deprecated use maxDate */\r\n @property({ type: String }) max: string | null = null;\r\n\r\n @property({ type: String, attribute: \"week-start\" }) weekStart: \"sun\" | \"mon\" = \"sun\";\r\n @property({ type: String }) locale = \"en-US\";\r\n\r\n // ── Display formatting of the SELECTED value ──\r\n // `displayFormat` is a token pattern (YYYY-MM-DD, MM/DD/YYYY, DD/MM/YYYY, …);\r\n // see date-format.ts for the token table. `formatDate` is a full callback and\r\n // takes precedence. When neither is set the locale long date is used, so\r\n // existing consumers are unaffected. Neither affects parsing, the popup\r\n // calendar, or accessibility — only the visible trigger text.\r\n @property({ type: String, attribute: \"display-format\" }) displayFormat: string | null = null;\r\n /**\r\n * Full control over the selected-value display; wins over `displayFormat`.\r\n * Reactive (attribute:false) so assigning it after render re-renders the\r\n * trigger — frameworks set callbacks as properties post-creation.\r\n */\r\n @property({ attribute: false }) formatDate?: (date: Date) => string;\r\n @property({ type: Boolean, reflect: true }) open = false;\r\n @property({ type: Boolean, attribute: \"close-on-select\" }) closeOnSelect = true;\r\n @property({ type: Boolean }) clearable = false;\r\n\r\n // ── Standardized input API (mirrors rel-textfield) ──\r\n @property({ type: Boolean }) error = false;\r\n @property({ type: String, attribute: \"error-message\" }) errorMessage?: string;\r\n @property({ type: String, attribute: \"helper-text\" }) helperText?: string;\r\n @property({ type: String }) name?: string;\r\n @property({ type: String }) size: \"small\" | \"medium\" | \"large\" = \"medium\";\r\n @property({ type: String, reflect: true }) variant: \"outlined\" = \"outlined\";\r\n @property({ type: Boolean, reflect: true }) fullWidth = false;\r\n\r\n // Custom disabled predicate (not settable via attribute)\r\n public isDateDisabled?: (date: Date) => boolean;\r\n\r\n // minDate/maxDate supersede the deprecated min/max aliases\r\n private get minBound(): string | null {\r\n return this.minDate ?? this.min;\r\n }\r\n private get maxBound(): string | null {\r\n return this.maxDate ?? this.max;\r\n }\r\n\r\n @state() private viewYear: number = new Date().getFullYear();\r\n @state() private viewMonth: number = new Date().getMonth();\r\n @state() private focusedDate: Date | null = null;\r\n @state() private yearDropdownOpen = false;\r\n @state() private monthDropdownOpen = false;\r\n\r\n @query(\".trigger-button\") private triggerButton?: HTMLButtonElement;\r\n @query(\".popover\") private popoverElement?: HTMLElement;\r\n @query(\".calendar-grid\") private calendarGrid?: HTMLElement;\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n display: block;\r\n font-family: var(--rel-fonts-font-family);\r\n position: relative;\r\n }\r\n\r\n /* Intrinsic width by default; set fullWidth to fill the parent. */\r\n :host(:not([fullwidth])) {\r\n display: inline-block;\r\n width: auto;\r\n }\r\n\r\n :host([disabled]) {\r\n opacity: 0.6;\r\n cursor: not-allowed;\r\n }\r\n\r\n :host([disabled]) * {\r\n pointer-events: none;\r\n }\r\n\r\n :host([readonly]) .trigger-button {\r\n cursor: default;\r\n }\r\n\r\n .date-picker-wrapper {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--rel-spacing-xs);\r\n }\r\n\r\n .label {\r\n color: var(--rel-text-label);\r\n\r\n font-family: var(--rel-body-sm-medium-font-family);\r\n\r\n font-weight: var(--rel-body-sm-medium-font-weight);\r\n\r\n font-size: var(--rel-body-sm-medium-font-size);\r\n\r\n line-height: var(--rel-body-sm-medium-line-height);\r\n\r\n letter-spacing: var(--rel-body-sm-medium-letter-spacing);\r\n\r\n }\r\n\r\n .required-mark {\r\n color: var(--rel-text-danger);\r\n margin-left: 2px;\r\n }\r\n\r\n /* Support text (helperText / errorMessage) */\r\n .date-picker-support {\r\n color: var(--rel-text-placeholder);\r\n\r\n font-family: var(--rel-body-xs-regular-font-family);\r\n\r\n font-weight: var(--rel-body-xs-regular-font-weight);\r\n\r\n font-size: var(--rel-body-xs-regular-font-size);\r\n\r\n line-height: var(--rel-body-xs-regular-line-height);\r\n\r\n letter-spacing: var(--rel-body-xs-regular-letter-spacing);\r\n\r\n }\r\n\r\n .date-picker-support.error {\r\n color: var(--rel-text-danger);\r\n }\r\n\r\n .trigger-button {\r\n width: 100%;\r\n min-width: 200px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: var(--rel-spacing-xs);\r\n padding: var(--rel-spacing-sm) var(--rel-spacing-md);\r\n background: var(--rel-bg-surface);\r\n border: 1px solid var(--rel-border-default);\r\n border-radius: var(--rel-border-radius-sm);\r\n color: var(--rel-text-default);\r\n cursor: pointer;\r\n transition: all 0.15s ease;\r\n text-align: left;\r\n font-family: var(--rel-body-md-regular-font-family);\r\n font-weight: var(--rel-body-md-regular-font-weight);\r\n font-size: var(--rel-body-md-regular-font-size);\r\n line-height: var(--rel-body-md-regular-line-height);\r\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\r\n }\r\n\r\n .trigger-button:hover:not(:disabled) {\r\n border-color: var(--rel-border-strong);\r\n }\r\n\r\n .trigger-button:focus-visible {\r\n outline: 2px solid var(--rel-border-focus);\r\n outline-offset: 2px;\r\n border-color: var(--rel-border-focus);\r\n }\r\n\r\n .trigger-button:disabled {\r\n cursor: not-allowed;\r\n background: var(--rel-bg-surface-elevated);\r\n }\r\n\r\n /* Error state */\r\n .trigger-button.error,\r\n .trigger-button.error:hover:not(:disabled) {\r\n border-color: var(--rel-border-danger);\r\n }\r\n\r\n .trigger-button.error:focus-visible {\r\n outline-color: var(--rel-border-danger);\r\n border-color: var(--rel-border-danger);\r\n }\r\n\r\n /* Size variants (medium is the base .trigger-button style) */\r\n .date-picker-wrapper.small .trigger-button {\r\n padding: var(--rel-spacing-xs) var(--rel-spacing-sm);\r\n font-family: var(--rel-body-sm-regular-font-family);\r\n font-weight: var(--rel-body-sm-regular-font-weight);\r\n font-size: var(--rel-body-sm-regular-font-size);\r\n line-height: var(--rel-body-sm-regular-line-height);\r\n letter-spacing: var(--rel-body-sm-regular-letter-spacing);\r\n }\r\n\r\n .date-picker-wrapper.large .trigger-button {\r\n padding: var(--rel-spacing-md) var(--rel-spacing-md);\r\n font-family: var(--rel-body-lg-regular-font-family);\r\n font-weight: var(--rel-body-lg-regular-font-weight);\r\n font-size: var(--rel-body-lg-regular-font-size);\r\n line-height: var(--rel-body-lg-regular-line-height);\r\n letter-spacing: var(--rel-body-lg-regular-letter-spacing);\r\n }\r\n\r\n .trigger-content {\r\n flex: 1;\r\n color: var(--rel-text-default);\r\n }\r\n\r\n .trigger-content.placeholder {\r\n color: var(--rel-text-placeholder);\r\n }\r\n\r\n .trigger-icons {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-2xs);\r\n }\r\n\r\n .icon-button {\r\n background: none;\r\n border: none;\r\n padding: var(--rel-spacing-3xs);\r\n cursor: pointer;\r\n color: var(--rel-text-placeholder);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: var(--rel-border-radius-xs);\r\n transition: all 0.15s ease;\r\n }\r\n\r\n .icon-button:hover {\r\n background: var(--rel-bg-surface-elevated);\r\n color: var(--rel-text-default);\r\n }\r\n\r\n .icon-button svg {\r\n width: 16px;\r\n height: 16px;\r\n }\r\n\r\n .popover {\r\n position: absolute;\r\n top: calc(100% + 4px);\r\n left: 0;\r\n z-index: 1000;\r\n background: var(--rel-bg-surface);\r\n border: 1px solid var(--rel-border-default);\r\n border-radius: var(--rel-border-radius-sm);\r\n box-shadow: var(--rel-shadows-shadow-300);\r\n padding: var(--rel-spacing-md);\r\n min-width: 280px;\r\n display: none;\r\n }\r\n\r\n .popover.open {\r\n display: block;\r\n }\r\n\r\n .calendar-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n margin-bottom: var(--rel-spacing-md);\r\n gap: var(--rel-spacing-xs);\r\n }\r\n\r\n .nav-button {\r\n background: transparent;\r\n border: none;\r\n width: 32px;\r\n height: 32px;\r\n border-radius: var(--rel-border-radius-sm);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n cursor: pointer;\r\n color: var(--rel-text-default);\r\n transition: background-color 0.15s ease;\r\n }\r\n\r\n .nav-button:hover {\r\n background: var(--rel-bg-surface-elevated);\r\n }\r\n\r\n .nav-button:focus-visible {\r\n outline: 2px solid var(--rel-border-focus);\r\n outline-offset: 2px;\r\n }\r\n\r\n .dropdown-container {\r\n position: relative;\r\n flex: 1;\r\n }\r\n\r\n .dropdown-trigger {\r\n width: 100%;\r\n padding: var(--rel-spacing-xs) var(--rel-spacing-sm);\r\n background: var(--rel-bg-surface);\r\n border: 1px solid var(--rel-border-default);\r\n border-radius: var(--rel-border-radius-sm);\r\n color: var(--rel-text-label);\r\n cursor: pointer;\r\n text-align: center;\r\n transition: all 0.15s ease;\r\n font-family: var(--rel-body-sm-medium-font-family);\r\n font-weight: var(--rel-body-sm-medium-font-weight);\r\n font-size: var(--rel-body-sm-medium-font-size);\r\n line-height: var(--rel-body-sm-medium-line-height);\r\n letter-spacing: var(--rel-body-sm-medium-letter-spacing);\r\n }\r\n\r\n .dropdown-trigger:hover {\r\n background: var(--rel-bg-surface-elevated);\r\n }\r\n\r\n .dropdown-trigger:focus-visible {\r\n outline: 2px solid var(--rel-border-focus);\r\n outline-offset: 2px;\r\n }\r\n\r\n .dropdown-menu {\r\n position: absolute;\r\n top: calc(100% + 4px);\r\n left: 0;\r\n right: 0;\r\n z-index: 10;\r\n background: var(--rel-bg-surface);\r\n border: 1px solid var(--rel-border-default);\r\n border-radius: var(--rel-border-radius-sm);\r\n box-shadow: var(--rel-shadows-shadow-200);\r\n max-height: 200px;\r\n overflow-y: auto;\r\n display: none;\r\n }\r\n\r\n .dropdown-menu.open {\r\n display: block;\r\n }\r\n\r\n .dropdown-item {\r\n padding: var(--rel-spacing-xs) var(--rel-spacing-sm);\r\n cursor: pointer;\r\n color: var(--rel-text-default);\r\n transition: background-color 0.15s ease;\r\n font-family: var(--rel-body-sm-regular-font-family);\r\n font-weight: var(--rel-body-sm-regular-font-weight);\r\n font-size: var(--rel-body-sm-regular-font-size);\r\n line-height: var(--rel-body-sm-regular-line-height);\r\n letter-spacing: var(--rel-body-sm-regular-letter-spacing);\r\n }\r\n\r\n .dropdown-item:hover {\r\n background: var(--rel-bg-surface-elevated);\r\n }\r\n\r\n .dropdown-item.selected {\r\n background: var(--rel-bg-info-light);\r\n color: var(--rel-text-info);\r\n font-weight: var(--rel-body-md-semibold-font-weight);\r\n }\r\n\r\n .weekdays {\r\n display: grid;\r\n grid-template-columns: repeat(7, 1fr);\r\n gap: var(--rel-spacing-3xs);\r\n margin-bottom: var(--rel-spacing-xs);\r\n }\r\n\r\n .weekday {\r\n text-align: center;\r\n color: var(--rel-text-placeholder);\r\n padding: var(--rel-spacing-xs);\r\n text-transform: uppercase;\r\n font-family: var(--rel-body-xs-semibold-font-family);\r\n font-weight: var(--rel-body-xs-semibold-font-weight);\r\n font-size: var(--rel-body-xs-semibold-font-size);\r\n line-height: var(--rel-body-xs-semibold-line-height);\r\n letter-spacing: var(--rel-body-xs-semibold-letter-spacing);\r\n }\r\n\r\n .calendar-grid {\r\n display: grid;\r\n grid-template-columns: repeat(7, 1fr);\r\n gap: var(--rel-spacing-3xs);\r\n }\r\n\r\n .day-button {\r\n aspect-ratio: 1;\r\n border: none;\r\n background: transparent;\r\n border-radius: var(--rel-border-radius-sm);\r\n color: var(--rel-text-default);\r\n cursor: pointer;\r\n position: relative;\r\n transition: all 0.15s ease;\r\n font-family: var(--rel-body-sm-medium-font-family);\r\n font-weight: var(--rel-body-sm-medium-font-weight);\r\n font-size: var(--rel-body-sm-medium-font-size);\r\n line-height: var(--rel-body-sm-medium-line-height);\r\n letter-spacing: var(--rel-body-sm-medium-letter-spacing);\r\n }\r\n\r\n .day-button:hover:not(:disabled):not(.selected) {\r\n background: var(--rel-bg-surface-elevated);\r\n }\r\n\r\n .day-button:focus-visible {\r\n outline: 2px solid var(--rel-border-focus);\r\n outline-offset: -2px;\r\n z-index: 1;\r\n }\r\n\r\n .day-button.today:not(.selected) {\r\n border: 2px solid var(--rel-border-brand);\r\n }\r\n\r\n .day-button.selected {\r\n background: var(--rel-action-brand-fill);\r\n color: var(--rel-action-brand-label-icons-primary);\r\n font-weight: var(--rel-body-md-semibold-font-weight);\r\n }\r\n\r\n .day-button.other-month {\r\n color: var(--rel-text-placeholder);\r\n opacity: 0.5;\r\n }\r\n\r\n .day-button:disabled {\r\n color: var(--rel-text-disabled);\r\n cursor: not-allowed;\r\n opacity: 0.5;\r\n }\r\n\r\n .day-button:disabled:hover {\r\n background: transparent;\r\n }\r\n\r\n @media (prefers-reduced-motion: reduce) {\r\n .trigger-button,\r\n .icon-button,\r\n .nav-button,\r\n .dropdown-trigger,\r\n .dropdown-item,\r\n .day-button {\r\n transition: none;\r\n }\r\n }\r\n `;\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n if (this.value) {\r\n const date = this.parseISODate(this.value);\r\n if (date) {\r\n this.viewYear = date.getFullYear();\r\n this.viewMonth = date.getMonth();\r\n }\r\n }\r\n\r\n // Click outside handler\r\n document.addEventListener(\"click\", this.handleClickOutside);\r\n document.addEventListener(\"keydown\", this.handleEscapeKey);\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback();\r\n document.removeEventListener(\"click\", this.handleClickOutside);\r\n document.removeEventListener(\"keydown\", this.handleEscapeKey);\r\n }\r\n\r\n private handleClickOutside = (e: MouseEvent) => {\r\n if (!this.open) return;\r\n\r\n const path = e.composedPath();\r\n if (!path.includes(this)) {\r\n this.closeCalendarPopover();\r\n }\r\n };\r\n\r\n private handleEscapeKey = (e: KeyboardEvent) => {\r\n if (e.key === \"Escape\" && this.open) {\r\n this.closeCalendarPopover();\r\n }\r\n };\r\n\r\n updated(changedProperties: Map<string, any>) {\r\n if (changedProperties.has(\"value\") && this.value) {\r\n const date = this.parseISODate(this.value);\r\n if (date) {\r\n this.viewYear = date.getFullYear();\r\n this.viewMonth = date.getMonth();\r\n }\r\n }\r\n\r\n if (changedProperties.has(\"open\") && this.open) {\r\n // Focus first day when opening\r\n setTimeout(() => {\r\n const firstDay = this.calendarGrid?.querySelector<HTMLButtonElement>(\r\n \".day-button:not(:disabled)\"\r\n );\r\n firstDay?.focus();\r\n }, 100);\r\n }\r\n }\r\n\r\n private parseISODate(iso: string): Date | null {\r\n const match = iso.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\r\n if (!match) return null;\r\n const [, year, month, day] = match;\r\n return new Date(parseInt(year), parseInt(month) - 1, parseInt(day));\r\n }\r\n\r\n private formatISODate(date: Date): string {\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\r\n const day = String(date.getDate()).padStart(2, \"0\");\r\n return `${year}-${month}-${day}`;\r\n }\r\n\r\n private formatDisplayDate(iso: string): string {\r\n const date = this.parseISODate(iso);\r\n if (!date) return iso;\r\n\r\n // 1) explicit callback wins (fall back on error so a bad callback can't\r\n // blank the field)\r\n if (typeof this.formatDate === \"function\") {\r\n try {\r\n const out = this.formatDate(date);\r\n if (typeof out === \"string\") return out;\r\n } catch {\r\n /* fall through to the default */\r\n }\r\n }\r\n // 2) token pattern (e.g. \"YYYY-MM-DD\")\r\n if (this.displayFormat) {\r\n return formatDatePattern(date, this.displayFormat, this.locale);\r\n }\r\n // 3) backward-compatible locale long date\r\n return new Intl.DateTimeFormat(this.locale, {\r\n year: \"numeric\",\r\n month: \"long\",\r\n day: \"numeric\",\r\n }).format(date);\r\n }\r\n\r\n private isSameDay(date1: Date, date2: Date): boolean {\r\n return (\r\n date1.getFullYear() === date2.getFullYear() &&\r\n date1.getMonth() === date2.getMonth() &&\r\n date1.getDate() === date2.getDate()\r\n );\r\n }\r\n\r\n private isDateDisabledInternal(date: Date): boolean {\r\n if (this.disabled) return true;\r\n\r\n if (this.minBound) {\r\n const minDate = this.parseISODate(this.minBound);\r\n if (minDate && date < minDate) return true;\r\n }\r\n\r\n if (this.maxBound) {\r\n const maxDate = this.parseISODate(this.maxBound);\r\n if (maxDate && date > maxDate) return true;\r\n }\r\n\r\n if (this.isDateDisabled && this.isDateDisabled(date)) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private getCalendarDays(): CalendarDay[] {\r\n const days: CalendarDay[] = [];\r\n const firstDayOfMonth = new Date(this.viewYear, this.viewMonth, 1);\r\n const lastDayOfMonth = new Date(this.viewYear, this.viewMonth + 1, 0);\r\n const today = new Date();\r\n const selectedDate = this.value ? this.parseISODate(this.value) : null;\r\n\r\n let startDay = firstDayOfMonth.getDay();\r\n if (this.weekStart === \"mon\") {\r\n startDay = startDay === 0 ? 6 : startDay - 1;\r\n }\r\n\r\n // Leading days from previous month\r\n for (let i = startDay - 1; i >= 0; i--) {\r\n const date = new Date(this.viewYear, this.viewMonth, -i);\r\n days.push({\r\n date,\r\n day: date.getDate(),\r\n isCurrentMonth: false,\r\n isToday: this.isSameDay(date, today),\r\n isSelected: selectedDate ? this.isSameDay(date, selectedDate) : false,\r\n isDisabled: true, // Leading days not selectable\r\n });\r\n }\r\n\r\n // Current month days\r\n for (let day = 1; day <= lastDayOfMonth.getDate(); day++) {\r\n const date = new Date(this.viewYear, this.viewMonth, day);\r\n days.push({\r\n date,\r\n day,\r\n isCurrentMonth: true,\r\n isToday: this.isSameDay(date, today),\r\n isSelected: selectedDate ? this.isSameDay(date, selectedDate) : false,\r\n isDisabled: this.isDateDisabledInternal(date),\r\n });\r\n }\r\n\r\n // Trailing days from next month\r\n const remainingCells = 42 - days.length; // 6 weeks max\r\n for (let i = 1; i <= remainingCells; i++) {\r\n const date = new Date(this.viewYear, this.viewMonth + 1, i);\r\n days.push({\r\n date,\r\n day: date.getDate(),\r\n isCurrentMonth: false,\r\n isToday: this.isSameDay(date, today),\r\n isSelected: selectedDate ? this.isSameDay(date, selectedDate) : false,\r\n isDisabled: true, // Trailing days not selectable\r\n });\r\n }\r\n\r\n return days;\r\n }\r\n\r\n private getWeekdayLabels(): string[] {\r\n const formatter = new Intl.DateTimeFormat(this.locale, { weekday: \"short\" });\r\n const days = [];\r\n const baseDate = new Date(2024, 0, 7); // Sunday, Jan 7, 2024\r\n\r\n for (let i = 0; i < 7; i++) {\r\n const offset = this.weekStart === \"mon\" ? i + 1 : i;\r\n const date = new Date(baseDate);\r\n date.setDate(baseDate.getDate() + offset);\r\n days.push(formatter.format(date).substring(0, 2));\r\n }\r\n\r\n return days;\r\n }\r\n\r\n private getMonthName(): string {\r\n const formatter = new Intl.DateTimeFormat(this.locale, { month: \"long\" });\r\n return formatter.format(new Date(this.viewYear, this.viewMonth, 1));\r\n }\r\n\r\n private getMonthsList(): { value: number; label: string }[] {\r\n const months = [];\r\n for (let i = 0; i < 12; i++) {\r\n const formatter = new Intl.DateTimeFormat(this.locale, { month: \"long\" });\r\n const label = formatter.format(new Date(2024, i, 1));\r\n months.push({ value: i, label });\r\n }\r\n return months;\r\n }\r\n\r\n private getYearsList(): number[] {\r\n const currentYear = new Date().getFullYear();\r\n let startYear = currentYear - 100;\r\n let endYear = currentYear + 10;\r\n\r\n if (this.minBound) {\r\n const minDate = this.parseISODate(this.minBound);\r\n if (minDate) startYear = Math.max(startYear, minDate.getFullYear() - 5);\r\n }\r\n\r\n if (this.maxBound) {\r\n const maxDate = this.parseISODate(this.maxBound);\r\n if (maxDate) endYear = Math.min(endYear, maxDate.getFullYear() + 5);\r\n }\r\n\r\n const years = [];\r\n for (let y = startYear; y <= endYear; y++) {\r\n years.push(y);\r\n }\r\n return years.reverse(); // Most recent first\r\n }\r\n\r\n private toggleCalendarPopover() {\r\n if (this.disabled || this.readonly) return;\r\n this.open = !this.open;\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-open-change\", {\r\n detail: { open: this.open },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private closeCalendarPopover() {\r\n this.open = false;\r\n this.monthDropdownOpen = false;\r\n this.yearDropdownOpen = false;\r\n this.triggerButton?.focus();\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-open-change\", {\r\n detail: { open: false },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private previousMonth() {\r\n if (this.viewMonth === 0) {\r\n this.viewMonth = 11;\r\n this.viewYear--;\r\n } else {\r\n this.viewMonth--;\r\n }\r\n }\r\n\r\n private nextMonth() {\r\n if (this.viewMonth === 11) {\r\n this.viewMonth = 0;\r\n this.viewYear++;\r\n } else {\r\n this.viewMonth++;\r\n }\r\n }\r\n\r\n private selectDay(day: CalendarDay) {\r\n if (day.isDisabled || this.disabled || this.readonly) return;\r\n\r\n const newValue = this.formatISODate(day.date);\r\n this.value = newValue;\r\n\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-change\", {\r\n detail: {\r\n value: newValue,\r\n date: new Date(day.date),\r\n },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n\r\n if (this.closeOnSelect) {\r\n this.closeCalendarPopover();\r\n }\r\n }\r\n\r\n private clearValue(e: Event) {\r\n e.stopPropagation();\r\n this.value = null;\r\n\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-change\", {\r\n detail: {\r\n value: null,\r\n date: null,\r\n },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private handleTriggerKeydown(e: KeyboardEvent) {\r\n if (e.key === \"Enter\" || e.key === \" \" || e.key === \"ArrowDown\") {\r\n e.preventDefault();\r\n if (!this.open) {\r\n this.toggleCalendarPopover();\r\n }\r\n }\r\n }\r\n\r\n private handleDayKeydown(e: KeyboardEvent, day: CalendarDay, index: number) {\r\n const days = this.getCalendarDays();\r\n let targetIndex = index;\r\n\r\n switch (e.key) {\r\n case \"ArrowLeft\":\r\n e.preventDefault();\r\n targetIndex = index - 1;\r\n break;\r\n case \"ArrowRight\":\r\n e.preventDefault();\r\n targetIndex = index + 1;\r\n break;\r\n case \"ArrowUp\":\r\n e.preventDefault();\r\n targetIndex = index - 7;\r\n break;\r\n case \"ArrowDown\":\r\n e.preventDefault();\r\n targetIndex = index + 7;\r\n break;\r\n case \"Home\":\r\n e.preventDefault();\r\n targetIndex = index - (index % 7);\r\n break;\r\n case \"End\":\r\n e.preventDefault();\r\n targetIndex = index - (index % 7) + 6;\r\n break;\r\n case \"PageUp\":\r\n e.preventDefault();\r\n if (e.shiftKey) {\r\n this.viewYear--;\r\n } else {\r\n this.previousMonth();\r\n }\r\n return;\r\n case \"PageDown\":\r\n e.preventDefault();\r\n if (e.shiftKey) {\r\n this.viewYear++;\r\n } else {\r\n this.nextMonth();\r\n }\r\n return;\r\n case \"Enter\":\r\n case \" \":\r\n e.preventDefault();\r\n this.selectDay(day);\r\n return;\r\n default:\r\n return;\r\n }\r\n\r\n if (targetIndex >= 0 && targetIndex < days.length) {\r\n const targetDay = days[targetIndex];\r\n if (!targetDay.isCurrentMonth) {\r\n if (targetIndex < index) {\r\n this.previousMonth();\r\n } else {\r\n this.nextMonth();\r\n }\r\n }\r\n this.requestUpdate();\r\n this.updateComplete.then(() => {\r\n const buttons = this.calendarGrid?.querySelectorAll<HTMLButtonElement>(\".day-button\");\r\n if (buttons && buttons[targetIndex]) {\r\n buttons[targetIndex].focus();\r\n }\r\n });\r\n }\r\n }\r\n\r\n private toggleMonthDropdown(e: Event) {\r\n e.stopPropagation();\r\n this.monthDropdownOpen = !this.monthDropdownOpen;\r\n this.yearDropdownOpen = false;\r\n }\r\n\r\n private toggleYearDropdown(e: Event) {\r\n e.stopPropagation();\r\n this.yearDropdownOpen = !this.yearDropdownOpen;\r\n this.monthDropdownOpen = false;\r\n }\r\n\r\n private selectMonth(month: number, e: Event) {\r\n e.stopPropagation();\r\n this.viewMonth = month;\r\n this.monthDropdownOpen = false;\r\n }\r\n\r\n private selectYear(year: number, e: Event) {\r\n e.stopPropagation();\r\n this.viewYear = year;\r\n this.yearDropdownOpen = false;\r\n }\r\n\r\n render() {\r\n const days = this.getCalendarDays();\r\n const weekdayLabels = this.getWeekdayLabels();\r\n const months = this.getMonthsList();\r\n const years = this.getYearsList();\r\n\r\n const isError = this.error;\r\n const belowText = isError && this.errorMessage ? this.errorMessage : this.helperText;\r\n const describedById = belowText ? \"date-picker-desc\" : undefined;\r\n const wrapperClasses = [\r\n \"date-picker-wrapper\",\r\n this.size,\r\n isError ? \"error\" : \"\",\r\n this.readonly ? \"readonly\" : \"\",\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return html`\r\n <div part=\"base\" class=\"${wrapperClasses}\">\r\n ${this.label\r\n ? html`<label part=\"label\" class=\"label\" id=\"date-picker-label\"\r\n >${this.label}${this.required\r\n ? html`<span class=\"required-mark\" aria-hidden=\"true\">*</span>`\r\n : nothing}</label\r\n >`\r\n : nothing}\r\n\r\n ${this.name\r\n ? html`<input type=\"hidden\" name=${this.name} .value=${this.value ?? \"\"} />`\r\n : nothing}\r\n\r\n <button\r\n class=\"trigger-button ${isError ? \"error\" : \"\"}\"\r\n type=\"button\"\r\n ?disabled=${this.disabled}\r\n @click=${this.toggleCalendarPopover}\r\n @keydown=${this.handleTriggerKeydown}\r\n aria-label=${this.label || \"Select date\"}\r\n aria-haspopup=\"dialog\"\r\n aria-expanded=${this.open}\r\n aria-required=${this.required}\r\n aria-invalid=${isError}\r\n aria-readonly=${this.readonly}\r\n aria-describedby=${describedById ?? nothing}\r\n aria-labelledby=${this.label ? \"date-picker-label\" : nothing}\r\n >\r\n <span class=\"trigger-content ${this.value ? \"\" : \"placeholder\"}\">\r\n ${this.value ? this.formatDisplayDate(this.value) : this.placeholder}\r\n </span>\r\n <span class=\"trigger-icons\">\r\n ${this.clearable && this.value\r\n ? html`\r\n <button\r\n class=\"icon-button\"\r\n type=\"button\"\r\n aria-label=\"Clear date\"\r\n @click=${this.clearValue}\r\n >\r\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path\r\n d=\"M4 4l8 8M12 4l-8 8\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n `\r\n : nothing}\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path\r\n d=\"M4 2h1V1h2v1h2V1h2v1h1a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zm8 3H4v7h8V5z\"\r\n />\r\n </svg>\r\n </span>\r\n </button>\r\n\r\n <div class=\"popover ${this.open ? \"open\" : \"\"}\" role=\"dialog\" aria-label=\"Choose date\">\r\n <div class=\"calendar-header\">\r\n <button\r\n class=\"nav-button\"\r\n @click=${this.previousMonth}\r\n aria-label=\"Previous month\"\r\n type=\"button\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path\r\n d=\"M10 12L6 8L10 4\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n fill=\"none\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n\r\n <div class=\"dropdown-container\">\r\n <button\r\n class=\"dropdown-trigger\"\r\n type=\"button\"\r\n @click=${this.toggleMonthDropdown}\r\n aria-label=\"Select month\"\r\n aria-expanded=${this.monthDropdownOpen}\r\n >\r\n ${this.getMonthName()}\r\n </button>\r\n <div class=\"dropdown-menu ${this.monthDropdownOpen ? \"open\" : \"\"}\">\r\n ${months.map(\r\n (m) => html`\r\n <div\r\n class=\"dropdown-item ${m.value === this.viewMonth ? \"selected\" : \"\"}\"\r\n @click=${(e: Event) => this.selectMonth(m.value, e)}\r\n role=\"option\"\r\n aria-selected=${m.value === this.viewMonth}\r\n >\r\n ${m.label}\r\n </div>\r\n `\r\n )}\r\n </div>\r\n </div>\r\n\r\n <div class=\"dropdown-container\">\r\n <button\r\n class=\"dropdown-trigger\"\r\n type=\"button\"\r\n @click=${this.toggleYearDropdown}\r\n aria-label=\"Select year\"\r\n aria-expanded=${this.yearDropdownOpen}\r\n >\r\n ${this.viewYear}\r\n </button>\r\n <div class=\"dropdown-menu ${this.yearDropdownOpen ? \"open\" : \"\"}\">\r\n ${years.map(\r\n (y) => html`\r\n <div\r\n class=\"dropdown-item ${y === this.viewYear ? \"selected\" : \"\"}\"\r\n @click=${(e: Event) => this.selectYear(y, e)}\r\n role=\"option\"\r\n aria-selected=${y === this.viewYear}\r\n >\r\n ${y}\r\n </div>\r\n `\r\n )}\r\n </div>\r\n </div>\r\n\r\n <button\r\n class=\"nav-button\"\r\n @click=${this.nextMonth}\r\n aria-label=\"Next month\"\r\n type=\"button\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path\r\n d=\"M6 4L10 8L6 12\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n fill=\"none\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"weekdays\">\r\n ${weekdayLabels.map(\r\n (label) => html` <div class=\"weekday\" aria-label=\"${label}\">${label}</div> `\r\n )}\r\n </div>\r\n\r\n <div class=\"calendar-grid\" role=\"grid\">\r\n ${days.map(\r\n (day, index) => html`\r\n <button\r\n class=\"day-button ${day.isSelected ? \"selected\" : \"\"} ${day.isToday\r\n ? \"today\"\r\n : \"\"} ${!day.isCurrentMonth ? \"other-month\" : \"\"}\"\r\n role=\"gridcell\"\r\n type=\"button\"\r\n aria-label=\"${this.formatISODate(day.date)}\"\r\n aria-selected=\"${day.isSelected}\"\r\n ?disabled=${day.isDisabled}\r\n @click=${() => this.selectDay(day)}\r\n @keydown=${(e: KeyboardEvent) => this.handleDayKeydown(e, day, index)}\r\n tabindex=\"${day.isSelected || (index === 0 && !this.value) ? 0 : -1}\"\r\n >\r\n ${day.day}\r\n </button>\r\n `\r\n )}\r\n </div>\r\n </div>\r\n\r\n ${belowText\r\n ? html`<div class=\"date-picker-support ${isError ? \"error\" : \"\"}\" id=${describedById}>\r\n ${belowText}\r\n </div>`\r\n : nothing}\r\n </div>\r\n `;\r\n }\r\n}\r\n","/**\n * Token-based date formatting for rel-date-picker's selected-value display.\n *\n * Pure (Date + Intl only, no DOM) so it is unit-testable in Node. Tokens are\n * matched longest-first; anything else (separators like `-` `/` `.` and spaces)\n * passes through literally. Wrap literal text that contains token letters in\n * square brackets, e.g. `[Week of] YYYY-MM-DD`.\n *\n * | Token | Meaning | Example (2026-07-21) |\n * |-------|------------------------|----------------------|\n * | YYYY | 4-digit year | 2026 |\n * | YY | 2-digit year | 26 |\n * | MMMM | full month (locale) | July |\n * | MMM | short month (locale) | Jul |\n * | MM | 2-digit month | 07 |\n * | M | month number | 7 |\n * | DD | 2-digit day | 21 |\n * | D | day number | 21 |\n */\nexport function formatDatePattern(\n date: Date,\n pattern: string,\n locale = \"en-US\"\n): string {\n const pad = (n: number) => String(n).padStart(2, \"0\");\n const year = date.getFullYear();\n const month = date.getMonth() + 1;\n const day = date.getDate();\n\n const tokens: Record<string, string> = {\n YYYY: String(year),\n YY: String(year).slice(-2),\n MMMM: new Intl.DateTimeFormat(locale, { month: \"long\" }).format(date),\n MMM: new Intl.DateTimeFormat(locale, { month: \"short\" }).format(date),\n MM: pad(month),\n M: String(month),\n DD: pad(day),\n D: String(day),\n };\n\n // `\\[([^\\]]*)\\]` captures a bracketed literal (emitted without the brackets);\n // otherwise the matched token is substituted from the map.\n return pattern.replace(\n /\\[([^\\]]*)\\]|YYYY|YY|MMMM|MMM|MM|M|DD|D/g,\n (match, literal) => (literal !== undefined ? literal : tokens[match])\n );\n}\n","import { LitElement, html, css, nothing } from \"lit\";\r\nimport { customElement, property, state, query } from \"lit/decorators.js\";\r\nimport \"@reliability-design/icons/rel-icon\";\r\nimport \"../rel-button/rel-button\";\r\n\r\ninterface RangeDay {\r\n date: Date;\r\n day: number;\r\n isCurrentMonth: boolean;\r\n isToday: boolean;\r\n isDraftFrom: boolean;\r\n isDraftTo: boolean;\r\n isInRange: boolean;\r\n isDisabled: boolean;\r\n isWeekend: boolean;\r\n}\r\n\r\ninterface QuickSelect {\r\n label: string;\r\n key: string;\r\n from: string;\r\n to: string;\r\n fullWidth?: boolean;\r\n}\r\n\r\n@customElement(\"rel-range-picker\")\r\nexport class RelRangePicker extends LitElement {\r\n @property({ type: String }) from: string = \"\";\r\n @property({ type: String }) to: string = \"\";\r\n @property({ type: String }) locale: string = \"en-US\";\r\n @property({ type: String, attribute: \"week-start\" }) weekStart: \"mon\" | \"sun\" = \"sun\";\r\n @property({ type: String, attribute: \"min-date\" }) minDate: string = \"\";\r\n @property({ type: String, attribute: \"max-date\" }) maxDate: string = \"\";\r\n @property({ type: Boolean, reflect: true }) disabled = false;\r\n @property({ type: Boolean, reflect: true }) open = false;\r\n @property({ type: String }) mode: \"popover\" | \"popup\" = \"popover\";\r\n @property({ type: String }) width: string = \"\";\r\n @property({ type: String, attribute: \"min-width\" }) minWidth: string = \"\";\r\n @property({ type: String, attribute: \"max-width\" }) maxWidth: string = \"\";\r\n @property({ type: String }) height: string = \"\";\r\n @property({ type: String, attribute: \"min-height\" }) minHeight: string = \"\";\r\n @property({ type: String, attribute: \"max-height\" }) maxHeight: string = \"\";\r\n @property({ type: String }) placeholder: string = \"Select date range\";\r\n @property({ type: String, attribute: \"trigger-variant\" }) triggerVariant: \"default\" | \"icon\" = \"default\";\r\n\r\n @state() private draftFrom: string = \"\";\r\n @state() private draftTo: string = \"\";\r\n @state() private draftActivePreset: string | null = null;\r\n @state() private viewYear: number = new Date().getFullYear();\r\n @state() private viewMonth: number = new Date().getMonth();\r\n @state() private isSelectingRange: boolean = false;\r\n @state() private hoverDate: string | null = null;\r\n\r\n @query(\".trigger-button\") private triggerButton?: HTMLButtonElement;\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n display: inline-block;\r\n font-family: var(--rel-body-md-regular-font-family);\r\n position: relative;\r\n }\r\n\r\n :host([disabled]) {\r\n opacity: 0.6;\r\n cursor: not-allowed;\r\n }\r\n\r\n :host([disabled]) .trigger-button,\r\n :host([disabled]) rel-button {\r\n pointer-events: none;\r\n }\r\n\r\n /* ── Trigger ── */\r\n .trigger-button {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: var(--rel-spacing-xs, 8px);\r\n padding: var(--rel-spacing-sm, 12px) var(--rel-spacing-md, 16px);\r\n background: var(--rel-bg-surface);\r\n border: 1px solid var(--rel-border-default);\r\n border-radius: var(--rel-border-radius-sm, 8px);\r\n color: var(--rel-text-default);\r\n cursor: pointer;\r\n width: 100%;\r\n text-align: left;\r\n transition: border-color 0.15s ease;\r\n font-family: var(--rel-body-md-regular-font-family);\r\n font-weight: var(--rel-body-md-regular-font-weight);\r\n font-size: var(--rel-body-md-regular-font-size);\r\n line-height: var(--rel-body-md-regular-line-height);\r\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\r\n }\r\n\r\n .trigger-button:hover:not(:disabled) {\r\n border-color: var(--rel-border-accent);\r\n }\r\n\r\n .trigger-button:focus-visible {\r\n outline: 2px solid var(--rel-border-focus);\r\n outline-offset: 2px;\r\n }\r\n\r\n .trigger-content {\r\n flex: 1;\r\n color: var(--rel-text-default);\r\n }\r\n\r\n .trigger-content.placeholder {\r\n color: var(--rel-text-placeholder);\r\n }\r\n\r\n /* ── Popover shell ── */\r\n .popover {\r\n position: absolute;\r\n top: calc(100% + 4px);\r\n left: 0;\r\n z-index: 2147483647;\r\n border: 1px solid var(--rel-border-default);\r\n border-radius: var(--rel-border-radius-sm, 8px);\r\n background: var(--rel-bg-neutral);\r\n box-shadow: var(--rel-shadows-shadow-200);\r\n overflow: visible;\r\n display: none;\r\n }\r\n\r\n .popover.open { display: block; }\r\n\r\n .popover.popup {\r\n position: fixed;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(-50%, -50%);\r\n }\r\n\r\n .backdrop {\r\n position: fixed;\r\n inset: 0;\r\n z-index: 2147483646;\r\n background: rgba(0,0,0,0.4);\r\n }\r\n\r\n /* ── Two-panel wrapper ── */\r\n .picker-wrapper {\r\n font-family: var(--rel-body-lg-regular-font-family);\r\n font-weight: var(--rel-body-lg-regular-font-weight);\r\n display: flex;\r\n flex-direction: row;\r\n align-items: stretch;\r\n }\r\n\r\n /* ── Left panel: presets ── */\r\n .presets {\r\n width: 280px;\r\n flex-shrink: 0;\r\n flex-grow: 0;\r\n border-right: 1px solid var(--rel-border-default);\r\n padding: var(--rel-spacing-sm);\r\n background: var(--rel-bg-surface-elevated);\r\n display: flex;\r\n flex-direction: column;\r\n gap: 0;\r\n }\r\n\r\n .presets-grid {\r\n display: grid;\r\n grid-template-columns: 1fr 1fr;\r\n gap: 6px;\r\n }\r\n\r\n .preset-item {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 10px var(--rel-spacing-sm);\r\n cursor: pointer;\r\n font-family: var(--rel-body-sm-medium-font-family);\r\n font-weight: var(--rel-body-sm-medium-font-weight);\r\n font-size: var(--rel-body-sm-medium-font-size);\r\n line-height: var(--rel-body-sm-medium-line-height);\r\n letter-spacing: var(--rel-body-sm-medium-letter-spacing);\r\n color: var(--rel-action-neutral-label-icons-link);\r\n background: var(--rel-bg-neutral-elevated-1);\r\n border: none;\r\n border-radius: var(--rel-border-radius-sm, 8px);\r\n width: 100%;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n transition: background 0.15s ease;\r\n }\r\n\r\n .preset-item:hover:not(.active) {\r\n background: var(--rel-action-overlay-hover);\r\n }\r\n\r\n .preset-item.active {\r\n background: var(--rel-bg-neutral-inverse-2);\r\n color: var(--rel-text-inverse);\r\n font-weight: var(--rel-body-sm-semibold-font-weight);\r\n }\r\n\r\n .preset-item.full-width {\r\n grid-column: 1 / -1;\r\n }\r\n\r\n /* ── FROM/TO inputs ── */\r\n .date-inputs {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 14px 8px 4px;\r\n border-top: 1px solid var(--rel-border-default);\r\n margin-top: auto;\r\n }\r\n\r\n .date-input-group {\r\n flex: 1;\r\n min-width: 0;\r\n position: relative;\r\n }\r\n\r\n .date-input-label {\r\n position: absolute;\r\n top: -8px;\r\n left: 10px;\r\n /* Figma: the FROM/TO tag is the nested TextField's floating label (body-sm-regular) */\r\n font-family: var(--rel-body-sm-regular-font-family);\r\n font-weight: var(--rel-body-sm-regular-font-weight);\r\n font-size: var(--rel-body-sm-regular-font-size);\r\n line-height: var(--rel-body-sm-regular-line-height);\r\n letter-spacing: var(--rel-body-sm-regular-letter-spacing);\r\n color: var(--rel-text-body);\r\n background: var(--rel-bg-surface);\r\n padding: 0 3px;\r\n }\r\n\r\n .date-input-value {\r\n display: block;\r\n border: 1px solid var(--rel-border-default);\r\n border-radius: var(--rel-border-radius-sm, 8px);\r\n padding: 6px 8px;\r\n color: var(--rel-text-default);\r\n background: var(--rel-bg-surface);\r\n width: 100%;\r\n box-sizing: border-box;\r\n font-family: var(--rel-body-md-semibold-font-family);\r\n font-weight: var(--rel-body-md-semibold-font-weight);\r\n font-size: var(--rel-body-md-semibold-font-size);\r\n line-height: var(--rel-body-md-semibold-line-height);\r\n letter-spacing: var(--rel-body-md-semibold-letter-spacing);\r\n }\r\n\r\n .date-input-value.empty {\r\n color: var(--rel-text-placeholder);\r\n font-weight: var(--rel-body-md-regular-font-weight);\r\n }\r\n\r\n /* ── Right panel: calendar ── */\r\n .calendar-panel {\r\n width: 300px;\r\n flex-shrink: 0;\r\n flex-grow: 0;\r\n padding: 12px;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 6px;\r\n }\r\n\r\n .calendar-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 0 2px;\r\n }\r\n\r\n .month-label {\r\n font-family: var(--rel-body-lg-semibold-font-family);\r\n font-weight: var(--rel-body-lg-semibold-font-weight);\r\n font-size: var(--rel-body-lg-regular-font-size);\r\n line-height: var(--rel-body-lg-regular-line-height);\r\n letter-spacing: var(--rel-body-lg-regular-letter-spacing);\r\n color: var(--rel-text-label);\r\n }\r\n\r\n .nav-btn {\r\n background: none;\r\n border: none;\r\n cursor: pointer;\r\n color: var(--rel-action-neutral-label-icons-ghost);\r\n padding: var(--rel-spacing-2xs);\r\n border-radius: var(--rel-border-radius-sm, 8px);\r\n display: flex;\r\n align-items: center;\r\n transition: background 0.15s ease;\r\n }\r\n\r\n .nav-btn:hover { background: var(--rel-action-overlay-hover); }\r\n\r\n /* ── Weekday header ── */\r\n .week-header {\r\n display: grid;\r\n grid-template-columns: repeat(7, 1fr);\r\n text-align: center;\r\n }\r\n\r\n .week-day {\r\n color: var(--rel-text-body);\r\n padding: 2px 0;\r\n /* Figma: sm-regular family + xs-medium weight on sm-medium metrics */\r\n font-family: var(--rel-body-sm-regular-font-family);\r\n font-weight: var(--rel-body-xs-medium-font-weight);\r\n font-size: var(--rel-body-sm-medium-font-size);\r\n line-height: var(--rel-body-sm-medium-line-height);\r\n letter-spacing: var(--rel-body-sm-medium-letter-spacing);\r\n text-align: center;\r\n }\r\n\r\n /* ── Calendar grid ── */\r\n .calendar-grid {\r\n display: grid;\r\n grid-template-columns: repeat(7, 1fr);\r\n }\r\n\r\n .day-cell {\r\n height: 36px;\r\n position: relative;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n cursor: pointer;\r\n }\r\n\r\n .day-cell.other-month {\r\n opacity: 0.35;\r\n pointer-events: none;\r\n }\r\n\r\n .day-cell.disabled {\r\n opacity: 0.4;\r\n pointer-events: none;\r\n }\r\n\r\n .day-cell.in-range {\r\n background: var(--rel-bg-neutral-elevated-2);\r\n }\r\n\r\n .day-cell.range-start:not(.range-end) {\r\n background: linear-gradient(to right, transparent 50%, var(--rel-bg-neutral-elevated-2) 50%);\r\n }\r\n\r\n .day-cell.range-end:not(.range-start) {\r\n background: linear-gradient(to left, transparent 50%, var(--rel-bg-neutral-elevated-2) 50%);\r\n }\r\n\r\n .day-cell.range-start.range-end {\r\n background: transparent;\r\n }\r\n\r\n /* ── Day inner circle ── */\r\n .day-inner {\r\n width: 32px;\r\n height: 32px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: 50%;\r\n font-family: var(--rel-body-sm-medium-font-family);\r\n font-weight: var(--rel-body-sm-medium-font-weight);\r\n font-size: var(--rel-body-sm-medium-font-size);\r\n line-height: var(--rel-body-sm-medium-line-height);\r\n letter-spacing: var(--rel-body-sm-medium-letter-spacing);\r\n color: var(--rel-text-default);\r\n position: relative;\r\n z-index: 1;\r\n transition: background 0.15s ease;\r\n }\r\n\r\n .day-cell:not(.disabled):not(.other-month):not(.range-start):not(.range-end):hover .day-inner {\r\n background: var(--rel-action-overlay-hover);\r\n }\r\n\r\n /* Pressed (Figma State=Active): elevated-2 fill on the day circle */\r\n .day-cell:not(.disabled):not(.other-month):not(.range-start):not(.range-end):active .day-inner {\r\n background: var(--rel-bg-neutral-elevated-2);\r\n }\r\n\r\n /* Weekend (Figma Day of a week=Weekend): 70% text opacity unless a range endpoint */\r\n .day-cell.weekend:not(.range-start):not(.range-end) .day-inner {\r\n opacity: 0.7;\r\n }\r\n\r\n /* Today: green outline */\r\n .day-cell.today:not(.range-start):not(.range-end) .day-inner {\r\n font-weight: var(--rel-body-md-medium-font-weight);\r\n border: 2px solid var(--rel-border-brand);\r\n }\r\n\r\n /* Range endpoints: dark fill */\r\n .day-cell.range-start .day-inner,\r\n .day-cell.range-end .day-inner {\r\n background: var(--rel-action-brand-fill);\r\n color: var(--rel-action-brand-label-icons-primary);\r\n font-weight: var(--rel-body-sm-semibold-font-weight);\r\n }\r\n\r\n /* Today AND endpoint: green ring + dark fill */\r\n .day-cell.today.range-start .day-inner,\r\n .day-cell.today.range-end .day-inner {\r\n background: var(--rel-action-brand-fill);\r\n color: var(--rel-action-brand-label-icons-primary);\r\n border: 2px solid var(--rel-border-brand);\r\n }\r\n\r\n /* ── Footer ── */\r\n .calendar-footer {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding-top: 12px;\r\n border-top: 1px solid var(--rel-border-default);\r\n margin-top: auto;\r\n gap: 8px;\r\n }\r\n\r\n .footer-right {\r\n display: flex;\r\n gap: 8px;\r\n }\r\n\r\n @media (prefers-reduced-motion: reduce) {\r\n .preset-item, .nav-btn, .day-inner {\r\n transition: none;\r\n }\r\n }\r\n `;\r\n\r\n // ── Lifecycle ──\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n document.addEventListener(\"click\", this.handleClickOutside);\r\n document.addEventListener(\"keydown\", this.handleGlobalKeydown);\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback();\r\n document.removeEventListener(\"click\", this.handleClickOutside);\r\n document.removeEventListener(\"keydown\", this.handleGlobalKeydown);\r\n }\r\n\r\n updated() {\r\n this.style.width = this.width;\r\n this.style.minWidth = this.minWidth;\r\n this.style.maxWidth = this.maxWidth;\r\n this.style.height = this.height;\r\n this.style.minHeight = this.minHeight;\r\n this.style.maxHeight = this.maxHeight;\r\n }\r\n\r\n // ── Open / close ──\r\n\r\n private handleClickOutside = (e: MouseEvent) => {\r\n if (!this.open) return;\r\n const path = e.composedPath();\r\n if (!path.includes(this)) {\r\n this.cancelPopover();\r\n }\r\n };\r\n\r\n private handleGlobalKeydown = (e: KeyboardEvent) => {\r\n if (!this.open) return;\r\n\r\n if (e.key === \"Escape\") {\r\n this.cancelPopover();\r\n this.triggerButton?.focus();\r\n return;\r\n }\r\n\r\n if ((e.target as HTMLElement)?.tagName === \"INPUT\") return;\r\n\r\n const key = e.key.toUpperCase();\r\n const keyMap: Record<string, string> = {\r\n T: \"Today\",\r\n M: \"Tomorrow\",\r\n B: \"Before Today\",\r\n W: \"This Week\",\r\n N: \"Next Week\",\r\n \"7\": \"Next 7 Days\",\r\n \"3\": \"Next 30 Days\",\r\n };\r\n\r\n const label = keyMap[key];\r\n if (!label) return;\r\n\r\n const qs = this.getQuickSelects().find((q) => q.label === label);\r\n if (qs) this.selectQuickSelect(qs);\r\n };\r\n\r\n private toggleOpen() {\r\n if (this.disabled) return;\r\n if (this.open) {\r\n this.cancelPopover();\r\n } else {\r\n this.openPopover();\r\n }\r\n }\r\n\r\n private openPopover() {\r\n this.draftFrom = this.from;\r\n this.draftTo = this.to;\r\n this.draftActivePreset = null;\r\n this.isSelectingRange = false;\r\n this.hoverDate = null;\r\n\r\n if (this.draftFrom) {\r\n const date = this.parseISODate(this.draftFrom);\r\n if (date) {\r\n this.viewYear = date.getFullYear();\r\n this.viewMonth = date.getMonth();\r\n }\r\n } else {\r\n const now = new Date();\r\n this.viewYear = now.getFullYear();\r\n this.viewMonth = now.getMonth();\r\n }\r\n\r\n this.open = true;\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-open-change\", {\r\n detail: { open: true },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private cancelPopover() {\r\n if (!this.open) return;\r\n this.open = false;\r\n this.draftFrom = \"\";\r\n this.draftTo = \"\";\r\n this.draftActivePreset = null;\r\n this.isSelectingRange = false;\r\n this.hoverDate = null;\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-open-change\", {\r\n detail: { open: false },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private applySelection() {\r\n if (this.draftFrom || this.draftTo) {\r\n this.from = this.draftFrom;\r\n this.to = this.draftTo;\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-change\", {\r\n detail: { from: this.from, to: this.to, label: this.displayLabel },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n this.open = false;\r\n this.isSelectingRange = false;\r\n this.hoverDate = null;\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-open-change\", {\r\n detail: { open: false },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n }\r\n\r\n private resetDraft() {\r\n if (this.draftFrom || this.draftTo) {\r\n this.draftFrom = \"\";\r\n this.draftTo = \"\";\r\n this.draftActivePreset = null;\r\n this.isSelectingRange = false;\r\n this.hoverDate = null;\r\n }\r\n }\r\n\r\n private getTriggerLabel(): string {\r\n const from = this.from ? this.formatDisplayDate(this.from) : null;\r\n const to = this.to ? this.formatDisplayDate(this.to) : null;\r\n if (from && to) return `${from} → ${to}`;\r\n if (from) return from;\r\n return \"\";\r\n }\r\n\r\n /** Formatted \"MM/DD/YYYY → MM/DD/YYYY\" (or single date / \"\") for the current committed `from`/`to`. */\r\n get displayLabel(): string {\r\n return this.getTriggerLabel();\r\n }\r\n\r\n // ── Date utilities ──\r\n\r\n private parseISODate(iso: string): Date | null {\r\n const m = iso.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\r\n if (!m) return null;\r\n return new Date(parseInt(m[1]), parseInt(m[2]) - 1, parseInt(m[3]));\r\n }\r\n\r\n private formatISODate(date: Date): string {\r\n const y = date.getFullYear();\r\n const mo = String(date.getMonth() + 1).padStart(2, \"0\");\r\n const d = String(date.getDate()).padStart(2, \"0\");\r\n return `${y}-${mo}-${d}`;\r\n }\r\n\r\n private formatDisplayDate(iso: string): string {\r\n const date = this.parseISODate(iso);\r\n if (!date) return \"\";\r\n return new Intl.DateTimeFormat(\"en-US\", {\r\n month: \"2-digit\",\r\n day: \"2-digit\",\r\n year: \"numeric\",\r\n }).format(date);\r\n }\r\n\r\n private isSameDay(a: Date, b: Date): boolean {\r\n return (\r\n a.getFullYear() === b.getFullYear() &&\r\n a.getMonth() === b.getMonth() &&\r\n a.getDate() === b.getDate()\r\n );\r\n }\r\n\r\n private isDateDisabled(date: Date): boolean {\r\n if (this.minDate) {\r\n const min = this.parseISODate(this.minDate);\r\n if (min && date < min) return true;\r\n }\r\n if (this.maxDate) {\r\n const max = this.parseISODate(this.maxDate);\r\n if (max && date > max) return true;\r\n }\r\n return false;\r\n }\r\n\r\n // ── Quick selects ──\r\n\r\n private getQuickSelects(): QuickSelect[] {\r\n const today = new Date();\r\n today.setHours(0, 0, 0, 0);\r\n\r\n const yesterday = new Date(today);\r\n yesterday.setDate(today.getDate() - 1);\r\n\r\n const tomorrow = new Date(today);\r\n tomorrow.setDate(today.getDate() + 1);\r\n\r\n const dow = today.getDay(); // 0 = Sun\r\n const thisSunday = new Date(today);\r\n thisSunday.setDate(today.getDate() - dow);\r\n const thisSaturday = new Date(thisSunday);\r\n thisSaturday.setDate(thisSunday.getDate() + 6);\r\n\r\n const nextSunday = new Date(thisSunday);\r\n nextSunday.setDate(thisSunday.getDate() + 7);\r\n const nextSaturday = new Date(nextSunday);\r\n nextSaturday.setDate(nextSunday.getDate() + 6);\r\n\r\n const next7To = new Date(today);\r\n next7To.setDate(today.getDate() + 6);\r\n\r\n const next30To = new Date(today);\r\n next30To.setDate(today.getDate() + 29);\r\n\r\n return [\r\n { label: \"Today\", key: \"T\", from: this.formatISODate(today), to: this.formatISODate(today) },\r\n { label: \"Tomorrow\", key: \"M\", from: this.formatISODate(tomorrow), to: this.formatISODate(tomorrow) },\r\n { label: \"Before Today\", key: \"B\", from: \"1970-01-01\", to: this.formatISODate(yesterday) },\r\n { label: \"This Week\", key: \"W\", from: this.formatISODate(thisSunday), to: this.formatISODate(thisSaturday) },\r\n { label: \"Next Week\", key: \"N\", from: this.formatISODate(nextSunday), to: this.formatISODate(nextSaturday) },\r\n { label: \"Next 7 Days\", key: \"7\", from: this.formatISODate(today), to: this.formatISODate(next7To) },\r\n { label: \"Next 30 Days\", key: \"3\", from: this.formatISODate(today), to: this.formatISODate(next30To), fullWidth: true },\r\n ];\r\n }\r\n\r\n private selectQuickSelect(qs: QuickSelect) {\r\n if (this.disabled) return;\r\n this.draftFrom = qs.from;\r\n this.draftTo = qs.to;\r\n this.draftActivePreset = qs.label;\r\n this.isSelectingRange = false;\r\n this.hoverDate = null;\r\n\r\n const date = this.parseISODate(qs.from);\r\n if (date) {\r\n this.viewYear = date.getFullYear();\r\n this.viewMonth = date.getMonth();\r\n }\r\n }\r\n\r\n // ── Calendar navigation ──\r\n\r\n private previousMonth() {\r\n if (this.viewMonth === 0) {\r\n this.viewMonth = 11;\r\n this.viewYear--;\r\n } else {\r\n this.viewMonth--;\r\n }\r\n }\r\n\r\n private nextMonth() {\r\n if (this.viewMonth === 11) {\r\n this.viewMonth = 0;\r\n this.viewYear++;\r\n } else {\r\n this.viewMonth++;\r\n }\r\n }\r\n\r\n private getMonthName(): string {\r\n return new Intl.DateTimeFormat(\"en-US\", { month: \"long\" }).format(\r\n new Date(this.viewYear, this.viewMonth, 1)\r\n );\r\n }\r\n\r\n private getWeekdayLabels(): string[] {\r\n const formatter = new Intl.DateTimeFormat(\"en-US\", { weekday: \"short\" });\r\n const base = new Date(2024, 0, 7); // Sunday Jan 7 2024\r\n return Array.from({ length: 7 }, (_, i) => {\r\n const offset = this.weekStart === \"mon\" ? i + 1 : i;\r\n const d = new Date(base);\r\n d.setDate(base.getDate() + offset);\r\n return formatter.format(d).substring(0, 2);\r\n });\r\n }\r\n\r\n // ── Calendar day computation ──\r\n\r\n private getCalendarDays(): RangeDay[] {\r\n const today = new Date();\r\n today.setHours(0, 0, 0, 0);\r\n\r\n const firstDay = new Date(this.viewYear, this.viewMonth, 1);\r\n const lastDay = new Date(this.viewYear, this.viewMonth + 1, 0);\r\n\r\n const draftFromDate = this.draftFrom ? this.parseISODate(this.draftFrom) : null;\r\n const draftToDate = this.draftTo ? this.parseISODate(this.draftTo) : null;\r\n\r\n let effectiveFrom: Date | null = draftFromDate;\r\n let effectiveTo: Date | null = draftToDate;\r\n\r\n if (this.isSelectingRange && this.hoverDate && draftFromDate) {\r\n const hDate = this.parseISODate(this.hoverDate);\r\n if (hDate) {\r\n if (hDate.getTime() >= draftFromDate.getTime()) {\r\n effectiveFrom = draftFromDate;\r\n effectiveTo = hDate;\r\n } else {\r\n effectiveFrom = hDate;\r\n effectiveTo = draftFromDate;\r\n }\r\n }\r\n }\r\n\r\n const days: RangeDay[] = [];\r\n\r\n let startDay = firstDay.getDay();\r\n if (this.weekStart === \"mon\") {\r\n startDay = startDay === 0 ? 6 : startDay - 1;\r\n }\r\n for (let i = startDay - 1; i >= 0; i--) {\r\n const date = new Date(this.viewYear, this.viewMonth, -i);\r\n days.push({\r\n date,\r\n day: date.getDate(),\r\n isCurrentMonth: false,\r\n isToday: false,\r\n isDraftFrom: false,\r\n isDraftTo: false,\r\n isInRange: false,\r\n isDisabled: true,\r\n isWeekend: date.getDay() === 0 || date.getDay() === 6,\r\n });\r\n }\r\n\r\n for (let d = 1; d <= lastDay.getDate(); d++) {\r\n const date = new Date(this.viewYear, this.viewMonth, d);\r\n const t = date.getTime();\r\n\r\n const isDraftFrom = !!effectiveFrom && this.isSameDay(date, effectiveFrom);\r\n const isDraftTo = !!effectiveTo && this.isSameDay(date, effectiveTo);\r\n const isInRange =\r\n !!effectiveFrom &&\r\n !!effectiveTo &&\r\n t > effectiveFrom.getTime() &&\r\n t < effectiveTo.getTime();\r\n\r\n days.push({\r\n date,\r\n day: d,\r\n isCurrentMonth: true,\r\n isToday: this.isSameDay(date, today),\r\n isDraftFrom,\r\n isDraftTo,\r\n isInRange,\r\n isDisabled: this.isDateDisabled(date),\r\n isWeekend: date.getDay() === 0 || date.getDay() === 6,\r\n });\r\n }\r\n\r\n const remaining = 42 - days.length;\r\n for (let i = 1; i <= remaining; i++) {\r\n const date = new Date(this.viewYear, this.viewMonth + 1, i);\r\n days.push({\r\n date,\r\n day: date.getDate(),\r\n isCurrentMonth: false,\r\n isToday: false,\r\n isDraftFrom: false,\r\n isDraftTo: false,\r\n isInRange: false,\r\n isDisabled: true,\r\n isWeekend: date.getDay() === 0 || date.getDay() === 6,\r\n });\r\n }\r\n\r\n return days;\r\n }\r\n\r\n // ── Day click / hover ──\r\n\r\n private handleDayClick(day: RangeDay) {\r\n if (day.isDisabled || this.disabled) return;\r\n const iso = this.formatISODate(day.date);\r\n\r\n if (!this.isSelectingRange) {\r\n this.draftFrom = iso;\r\n this.draftTo = \"\";\r\n this.draftActivePreset = null;\r\n this.isSelectingRange = true;\r\n this.hoverDate = null;\r\n } else {\r\n const fromDate = this.parseISODate(this.draftFrom);\r\n if (!fromDate) {\r\n this.draftFrom = iso;\r\n this.draftTo = \"\";\r\n return;\r\n }\r\n\r\n if (day.date.getTime() >= fromDate.getTime()) {\r\n this.draftTo = iso;\r\n } else {\r\n this.draftTo = this.draftFrom;\r\n this.draftFrom = iso;\r\n }\r\n\r\n this.isSelectingRange = false;\r\n this.hoverDate = null;\r\n this.draftActivePreset = null;\r\n }\r\n }\r\n\r\n private handleDayHover(day: RangeDay) {\r\n if (!this.isSelectingRange || day.isDisabled) return;\r\n this.hoverDate = this.formatISODate(day.date);\r\n }\r\n\r\n // ── Render ──\r\n\r\n render() {\r\n const quickSelects = this.getQuickSelects();\r\n const days = this.getCalendarDays();\r\n const weekdayLabels = this.getWeekdayLabels();\r\n\r\n const draftFromDisplay = this.draftFrom ? this.formatDisplayDate(this.draftFrom) : \"\";\r\n const draftToDisplay = this.draftTo ? this.formatDisplayDate(this.draftTo) : \"\";\r\n const triggerLabel = this.getTriggerLabel();\r\n const isDraftEmpty = !this.draftFrom && !this.draftTo;\r\n const isPopup = this.mode === \"popup\";\r\n\r\n return html`\r\n ${this.triggerVariant === \"icon\"\r\n ? html`\r\n <rel-button\r\n variant=\"icon\"\r\n tone=\"secondary\"\r\n ?disabled=${this.disabled}\r\n aria-haspopup=\"dialog\"\r\n aria-expanded=${this.open}\r\n aria-label=${triggerLabel || this.placeholder}\r\n @click=${() => this.toggleOpen()}\r\n >\r\n <rel-icon name=\"calendar-range\"></rel-icon>\r\n </rel-button>\r\n `\r\n : html`\r\n <button\r\n part=\"trigger\" class=\"trigger-button\"\r\n type=\"button\"\r\n ?disabled=${this.disabled}\r\n aria-haspopup=\"dialog\"\r\n aria-expanded=${this.open}\r\n aria-label=${triggerLabel || this.placeholder}\r\n @click=${this.toggleOpen}\r\n >\r\n <span class=\"trigger-content ${triggerLabel ? \"\" : \"placeholder\"}\">\r\n ${triggerLabel || this.placeholder}\r\n </span>\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\r\n <path d=\"M4 2h1V1h2v1h2V1h2v1h1a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zm8 3H4v7h8V5z\"/>\r\n </svg>\r\n </button>\r\n `}\r\n\r\n ${isPopup && this.open\r\n ? html`<div part=\"overlay\" class=\"backdrop\" @click=${this.cancelPopover}></div>`\r\n : nothing}\r\n\r\n <div\r\n part=\"panel\" class=\"popover ${this.open ? \"open\" : \"\"} ${isPopup ? \"popup\" : \"\"}\"\r\n role=\"dialog\"\r\n aria-label=\"Select date range\"\r\n >\r\n <div class=\"picker-wrapper\">\r\n\r\n <!-- ── Left: Quick select ── -->\r\n <div part=\"list\" class=\"presets\">\r\n <div class=\"presets-grid\" role=\"list\" aria-label=\"Quick date selections\">\r\n ${quickSelects.map(\r\n (qs) => html`\r\n <button\r\n part=\"option\" class=\"preset-item ${qs.fullWidth ? \"full-width\" : \"\"} ${this.draftActivePreset === qs.label ? \"active\" : \"\"}\"\r\n type=\"button\"\r\n role=\"listitem\"\r\n ?disabled=${this.disabled}\r\n aria-pressed=${this.draftActivePreset === qs.label}\r\n @click=${() => this.selectQuickSelect(qs)}\r\n >\r\n <span>${qs.label}</span>\r\n ${this.draftActivePreset === qs.label\r\n ? html`<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n <circle cx=\"12\" cy=\"12\" r=\"12\" fill=\"var(--rel-bg-brand)\"/>\r\n <path d=\"M7 12.5l3.5 3.5 6.5-7\" stroke=\"var(--rel-text-static-dark)\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>`\r\n : nothing}\r\n </button>\r\n `\r\n )}\r\n </div>\r\n\r\n <div class=\"date-inputs\">\r\n <div class=\"date-input-group\" aria-label=\"From date\">\r\n <span class=\"date-input-label\">FROM</span>\r\n <div class=\"date-input-value ${draftFromDisplay ? \"\" : \"empty\"}\">\r\n ${draftFromDisplay || \"MM/DD/YYYY\"}\r\n </div>\r\n </div>\r\n <div class=\"date-input-group\" aria-label=\"To date\">\r\n <span class=\"date-input-label\">TO</span>\r\n <div class=\"date-input-value ${draftToDisplay ? \"\" : \"empty\"}\">\r\n ${draftToDisplay || \"MM/DD/YYYY\"}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- ── Right: Calendar panel ── -->\r\n <div class=\"calendar-panel\">\r\n\r\n <div class=\"calendar-header\">\r\n <button\r\n part=\"action\" class=\"nav-btn\"\r\n type=\"button\"\r\n aria-label=\"Previous month\"\r\n @click=${this.previousMonth}\r\n >\r\n <rel-icon name=\"chevron-left\" size=\"sm\"></rel-icon>\r\n </button>\r\n <span class=\"month-label\">${this.getMonthName()} ${this.viewYear}</span>\r\n <button\r\n part=\"action\" class=\"nav-btn\"\r\n type=\"button\"\r\n aria-label=\"Next month\"\r\n @click=${this.nextMonth}\r\n >\r\n <rel-icon name=\"chevron-right\" size=\"sm\"></rel-icon>\r\n </button>\r\n </div>\r\n\r\n <div class=\"week-header\" role=\"row\">\r\n ${weekdayLabels.map(\r\n (label) => html`\r\n <div class=\"week-day\" role=\"columnheader\" aria-label=\"${label}\">\r\n ${label}\r\n </div>\r\n `\r\n )}\r\n </div>\r\n\r\n <div\r\n part=\"list\" class=\"calendar-grid\"\r\n role=\"grid\"\r\n aria-label=\"Select date range\"\r\n @mouseleave=${() => { this.hoverDate = null; }}\r\n >\r\n ${days.map((day) => {\r\n const cellClasses = [\r\n \"day-cell\",\r\n day.isInRange ? \"in-range\" : \"\",\r\n day.isDraftFrom ? \"range-start\" : \"\",\r\n day.isDraftTo ? \"range-end\" : \"\",\r\n day.isToday ? \"today\" : \"\",\r\n day.isDisabled ? \"disabled\" : \"\",\r\n !day.isCurrentMonth ? \"other-month\" : \"\",\r\n day.isWeekend ? \"weekend\" : \"\",\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return html`\r\n <div\r\n class=\"${cellClasses}\"\r\n role=\"gridcell\"\r\n aria-label=\"${this.formatISODate(day.date)}\"\r\n aria-selected=\"${day.isDraftFrom || day.isDraftTo || day.isInRange}\"\r\n @click=${() => this.handleDayClick(day)}\r\n @mouseenter=${() => this.handleDayHover(day)}\r\n >\r\n <span class=\"day-inner\">${day.day}</span>\r\n </div>\r\n `;\r\n })}\r\n </div>\r\n\r\n <div part=\"footer\" class=\"calendar-footer\">\r\n <rel-button\r\n variant=\"secondary\"\r\n size=\"small\"\r\n border=\"corner-radius\"\r\n ?disabled=${isDraftEmpty}\r\n @click=${() => this.resetDraft()}\r\n >\r\n Reset\r\n </rel-button>\r\n <div class=\"footer-right\">\r\n <rel-button\r\n variant=\"secondary\"\r\n size=\"small\"\r\n border=\"corner-radius\"\r\n @click=${() => this.cancelPopover()}\r\n >\r\n Cancel\r\n </rel-button>\r\n <rel-button\r\n variant=\"primary\"\r\n tone=\"default\"\r\n size=\"small\"\r\n border=\"corner-radius\"\r\n ?disabled=${isDraftEmpty}\r\n @click=${() => this.applySelection()}\r\n >\r\n Apply\r\n </rel-button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n `;\r\n\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"rel-range-picker\": RelRangePicker;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport \"../rel-avatar/rel-avatar.js\";\nimport \"@reliability-design/icons/rel-icon\";\n\nexport type ChipTone = \"neutral\" | \"danger\" | \"warning\" | \"success\" | \"info\";\nexport type ChipVariant = \"fill\" | \"subtle\";\nexport type ChipSize = \"sm\" | \"md\" | \"lg\";\nexport type ChipBorder = \"default\" | \"rounded\";\n\n@customElement(\"rel-chip\")\nexport class RelChip extends LitElement {\n // The actually-focusable element is the inner <span tabindex=\"0\">, not the\n // host. Without delegatesFocus, calling host.focus() (e.g. from a parent\n // component, or a \"focus this\" demo button) is a no-op since the host\n // itself carries no tabindex — only real Tab-key traversal would still\n // reach the inner span, because that walks the flattened DOM regardless.\n static override shadowRootOptions: ShadowRootInit = {\n ...LitElement.shadowRootOptions,\n delegatesFocus: true,\n };\n\n @property({ type: String }) label = \"Label\";\n\n @property({ type: String, reflect: true }) tone: ChipTone = \"neutral\";\n\n @property({ type: String, reflect: true }) variant: ChipVariant = \"fill\";\n\n @property({ type: String, reflect: true }) size: ChipSize = \"md\";\n\n @property({ type: String, reflect: true }) border: ChipBorder = \"default\";\n\n /** Icon name from the generated icon dictionary (e.g. \"settings\") — rendered via <rel-icon>. */\n @property({ type: String, attribute: \"leading-icon\" }) leadingIcon?: string;\n @property({ type: String, attribute: \"trailing-icon\" }) trailingIcon?: string;\n /** Initials text for the avatar (e.g. \"JD\"). Mutually exclusive with leadingIcon. */\n @property({ type: String }) avatar?: string;\n\n @property({ type: Boolean }) removable = false;\n\n /** IMPORTANT: reflected so CSS + Angular can see it */\n @property({ type: Boolean, reflect: true }) removed = false;\n\n /** Opt-in native drag-and-drop — reflects the Figma \"Dragged\" state automatically during a real drag gesture. */\n // Explicit attribute mapping — Lit's default attribute name for a camelCase\n // property is the name fully lowercased (no hyphens), so without this it'd\n // only respond to draggablechip=\"\", not draggable-chip.\n @property({ type: Boolean, attribute: \"draggable-chip\" }) draggableChip = false;\n\n /** Reflected so CSS can target the Figma \"Dragged\" visual state. Driven automatically by dragstart/dragend when draggableChip is set. */\n @state() private dragging = false;\n\n static styles = css`\n :host {\n color: var(--rel-text-default);\n display: inline-flex;\n width: auto;\n flex: 0 0 auto;\n }\n\n :host([removed]) {\n display: none;\n }\n\n .chip {\n display: inline-flex;\n align-items: center;\n box-sizing: border-box;\n border: 1px solid transparent;\n gap: var(--rel-spacing-xs);\n cursor: pointer;\n user-select: none;\n white-space: nowrap;\n outline: none;\n background: transparent;\n transition: background-color 0.15s ease;\n }\n\n /* ── Size ── */\n :host([size=\"lg\"]) .chip {\n height: 32px;\n padding: var(--rel-spacing-2xs) var(--rel-spacing-xs);\n font-family: var(--rel-body-lg-regular-font-family);\n font-weight: var(--rel-body-lg-medium-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 :host([size=\"md\"]) .chip {\n height: 28px;\n padding: var(--rel-spacing-2xs) var(--rel-spacing-xs);\n font-family: var(--rel-body-md-regular-font-family);\n font-weight: var(--rel-body-md-medium-font-weight);\n font-size: var(--rel-body-md-regular-font-size);\n line-height: var(--rel-body-md-regular-line-height);\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\n }\n\n :host([size=\"sm\"]) .chip {\n height: 24px;\n padding: var(--rel-spacing-2xs) var(--rel-spacing-xs);\n font-family: var(--rel-body-sm-regular-font-family);\n font-weight: var(--rel-body-xs-medium-font-weight);\n font-size: var(--rel-body-sm-medium-font-size);\n line-height: var(--rel-body-sm-medium-line-height);\n letter-spacing: var(--rel-body-sm-medium-letter-spacing);\n }\n\n /* ── Border / shape — \"Rounded\" also widens horizontal padding to 12px,\n consistent across all three sizes per the Figma spec. ── */\n :host([border=\"default\"]) .chip {\n border-radius: var(--rel-border-radius-xs);\n }\n\n :host([border=\"rounded\"]) .chip {\n border-radius: var(--rel-border-radius-full-rounded);\n padding-left: var(--rel-spacing-sm);\n padding-right: var(--rel-spacing-sm);\n }\n\n /* ── Tone x Variant — V2 action tokens (auto light/dark) ── */\n :host([tone=\"neutral\"][variant=\"fill\"]) .chip {\n background: var(--rel-action-neutral-fill);\n color: var(--rel-text-inverse);\n }\n :host([tone=\"neutral\"][variant=\"subtle\"]) .chip {\n background: var(--rel-action-neutral-subtle);\n color: var(--rel-action-neutral-label-icons-subtle);\n }\n :host([tone=\"danger\"][variant=\"fill\"]) .chip {\n background: var(--rel-action-danger-fill);\n color: var(--rel-text-static-light);\n }\n :host([tone=\"danger\"][variant=\"subtle\"]) .chip {\n background: var(--rel-action-danger-subtle);\n color: var(--rel-action-danger-label-icons-subtle);\n }\n :host([tone=\"warning\"][variant=\"fill\"]) .chip {\n background: var(--rel-action-warning-fill);\n color: var(--rel-action-warning-label-icons-fill);\n }\n :host([tone=\"warning\"][variant=\"subtle\"]) .chip {\n background: var(--rel-action-warning-subtle);\n color: var(--rel-action-warning-label-icons-subtle);\n }\n :host([tone=\"success\"][variant=\"fill\"]) .chip {\n background: var(--rel-action-success-fill);\n color: var(--rel-action-success-label-icons-fill);\n }\n :host([tone=\"success\"][variant=\"subtle\"]) .chip {\n background: var(--rel-action-success-subtle);\n color: var(--rel-action-success-label-icons-subtle);\n }\n :host([tone=\"info\"][variant=\"fill\"]) .chip {\n background: var(--rel-action-info-fill);\n color: var(--rel-action-info-label-icons-fill);\n }\n :host([tone=\"info\"][variant=\"subtle\"]) .chip {\n background: var(--rel-action-info-subtle);\n color: var(--rel-action-info-label-icons-subtle);\n }\n\n /* ── Hover / Dragged — per-tone V2 action state tokens ── */\n :host([tone=\"neutral\"][variant=\"fill\"]) .chip:hover {\n background: var(--rel-action-neutral-fill-hover);\n }\n :host([tone=\"neutral\"][variant=\"fill\"]) .chip:active,\n :host([tone=\"neutral\"][variant=\"fill\"][dragging]) .chip {\n background: var(--rel-action-neutral-fill-dragged);\n }\n :host([tone=\"neutral\"][variant=\"subtle\"]) .chip:hover {\n border-color: var(--rel-action-neutral-border-subtle-hover);\n background: var(--rel-action-neutral-subtle-hover);\n }\n :host([tone=\"neutral\"][variant=\"subtle\"]) .chip:active,\n :host([tone=\"neutral\"][variant=\"subtle\"][dragging]) .chip {\n border-color: var(--rel-action-neutral-border-subtle-dragged);\n background: var(--rel-action-neutral-subtle-dragged);\n }\n :host([tone=\"danger\"][variant=\"fill\"]) .chip:hover {\n background: var(--rel-action-danger-fill-hover);\n }\n :host([tone=\"danger\"][variant=\"fill\"]) .chip:active,\n :host([tone=\"danger\"][variant=\"fill\"][dragging]) .chip {\n background: var(--rel-action-danger-fill-dragged);\n }\n :host([tone=\"danger\"][variant=\"subtle\"]) .chip:hover {\n border-color: var(--rel-action-danger-border-subtle-hover);\n background: var(--rel-action-danger-subtle-hover);\n color: var(--rel-action-danger-label-icons-subtle-hover);\n }\n :host([tone=\"danger\"][variant=\"subtle\"]) .chip:active,\n :host([tone=\"danger\"][variant=\"subtle\"][dragging]) .chip {\n border-color: var(--rel-action-danger-border-subtle-dragged);\n background: var(--rel-action-danger-subtle-dragged);\n color: var(--rel-action-danger-label-icons-subtle-dragged);\n }\n :host([tone=\"warning\"][variant=\"fill\"]) .chip:hover {\n background: var(--rel-action-warning-fill-hover);\n }\n :host([tone=\"warning\"][variant=\"fill\"]) .chip:active,\n :host([tone=\"warning\"][variant=\"fill\"][dragging]) .chip {\n background: var(--rel-action-warning-fill-dragged);\n }\n :host([tone=\"warning\"][variant=\"subtle\"]) .chip:hover {\n border-color: var(--rel-action-warning-border-subtle-hover);\n background: var(--rel-action-warning-subtle-hover);\n color: var(--rel-action-warning-label-icons-subtle-hover);\n }\n :host([tone=\"warning\"][variant=\"subtle\"]) .chip:active,\n :host([tone=\"warning\"][variant=\"subtle\"][dragging]) .chip {\n border-color: var(--rel-action-warning-border-subtle-dragged);\n background: var(--rel-action-warning-subtle-dragged);\n color: var(--rel-action-warning-label-icons-subtle-dragged);\n }\n :host([tone=\"success\"][variant=\"fill\"]) .chip:hover {\n background: var(--rel-action-success-fill-hover);\n }\n :host([tone=\"success\"][variant=\"fill\"]) .chip:active,\n :host([tone=\"success\"][variant=\"fill\"][dragging]) .chip {\n background: var(--rel-action-success-fill-dragged);\n }\n :host([tone=\"success\"][variant=\"subtle\"]) .chip:hover {\n border-color: var(--rel-action-success-border-subtle-hover);\n background: var(--rel-action-success-subtle-hover);\n color: var(--rel-action-success-label-icons-subtle-hover);\n }\n :host([tone=\"success\"][variant=\"subtle\"]) .chip:active,\n :host([tone=\"success\"][variant=\"subtle\"][dragging]) .chip {\n border-color: var(--rel-action-success-border-subtle-dragged);\n background: var(--rel-action-success-subtle-dragged);\n color: var(--rel-action-success-label-icons-subtle-dragged);\n }\n :host([tone=\"info\"][variant=\"fill\"]) .chip:hover {\n background: var(--rel-action-info-fill-hover);\n }\n :host([tone=\"info\"][variant=\"fill\"]) .chip:active,\n :host([tone=\"info\"][variant=\"fill\"][dragging]) .chip {\n background: var(--rel-action-info-fill-dragged);\n }\n :host([tone=\"info\"][variant=\"subtle\"]) .chip:hover {\n border-color: var(--rel-action-info-border-subtle-hover);\n background: var(--rel-action-info-subtle-hover);\n color: var(--rel-action-info-label-icons-subtle-hover);\n }\n :host([tone=\"info\"][variant=\"subtle\"]) .chip:active,\n :host([tone=\"info\"][variant=\"subtle\"][dragging]) .chip {\n border-color: var(--rel-action-info-border-subtle-dragged);\n background: var(--rel-action-info-subtle-dragged);\n color: var(--rel-action-info-label-icons-subtle-dragged);\n }\n\n :host([dragging]) .chip {\n cursor: grabbing;\n }\n\n /* ── Focused — 1.5px outline, drawn outside (matches Figma's\n strokeAlign:OUTSIDE) so it never affects layout. Same color\n regardless of tone, per spec. OUTSIDE alignment means the stroke\n sits flush against the shape's edge with zero gap, extending\n outward by strokeWeight — outline-offset must be 0, not a positive\n gap (a positive offset was the bug: it drew a visible gap that\n doesn't exist in Figma). ── */\n .chip:focus-visible {\n outline: 1.5px solid var(--rel-chip-focus-ring, var(--rel-border-focus));\n outline-offset: 1.5px;\n box-shadow: 0 0 0 1.5px var(--rel-border-focus-inner);\n }\n\n /* ── Icons ── */\n /* rel-icon renders its SVG inside its own shadow root, so sizing has to\n go through --rel-icon-size (a custom property — pierces shadow\n boundaries) rather than a \".chip-icon svg\" selector, which can never\n reach across shadow DOM. */\n .chip-icon {\n flex-shrink: 0;\n }\n\n :host([size=\"lg\"]) .chip-icon {\n --rel-icon-size: 20px;\n }\n\n :host([size=\"md\"]) .chip-icon {\n --rel-icon-size: 18px;\n }\n\n :host([size=\"sm\"]) .chip-icon {\n --rel-icon-size: 16px;\n }\n\n /* ── Avatar — not shown in the Figma sample. rel-avatar sizes its inner\n .avatar div directly from its own \"size\" prop (fixed presets only —\n no --rel-avatar-size custom property escape hatch like rel-icon has),\n so a host-level width/height override here would only resize the\n empty outer wrapper, not the actual painted circle. \"xs\" (20px) is\n rel-avatar's smallest preset; used uniformly across all three chip\n sizes since there's nothing smaller to ask for. ── */\n .chip rel-avatar {\n display: inline-flex;\n flex-shrink: 0;\n }\n\n :host([variant=\"fill\"]) .chip rel-avatar {\n --rel-avatar-bg-fill: var(--rel-action-overlay-hover-inverse);\n --rel-avatar-color-fill: var(--rel-action-neutral-label-icons-fill-inverse);\n }\n\n :host([variant=\"subtle\"]) .chip rel-avatar {\n --rel-avatar-bg-fill: var(--rel-action-overlay-hover-strong);\n --rel-avatar-color-fill: currentColor;\n }\n\n /* ── Remove (close) button ── */\n .chip-remove {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n cursor: pointer;\n opacity: 0.7;\n background: none;\n border: none;\n color: inherit;\n font: inherit;\n padding: 0;\n line-height: 1;\n }\n\n .chip-remove:hover {\n opacity: 1;\n }\n\n .chip-remove:focus-visible {\n outline: 1.5px solid currentColor;\n outline-offset: 1px;\n border-radius: var(--rel-border-radius-xs);\n }\n\n :host([size=\"lg\"]) .chip-remove {\n --rel-icon-size: 20px;\n }\n :host([size=\"md\"]) .chip-remove {\n --rel-icon-size: 18px;\n }\n :host([size=\"sm\"]) .chip-remove {\n --rel-icon-size: 16px;\n }\n\n `;\n\n private get classes() {\n return \"chip\";\n }\n\n private handleRemove(event: Event) {\n event.stopPropagation();\n this.removed = true;\n\n this.dispatchEvent(\n new CustomEvent(\"removed\", {\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private onDragStart = (e: DragEvent) => {\n if (!this.draggableChip) return;\n this.dragging = true;\n e.dataTransfer?.setData(\"text/plain\", this.label);\n };\n\n private onDragEnd = () => {\n this.dragging = false;\n };\n\n protected updated(changed: Map<string, unknown>) {\n if (changed.has(\"draggableChip\")) {\n if (this.draggableChip) {\n this.setAttribute(\"draggable\", \"true\");\n this.addEventListener(\"dragstart\", this.onDragStart);\n this.addEventListener(\"dragend\", this.onDragEnd);\n } else {\n this.removeAttribute(\"draggable\");\n this.removeEventListener(\"dragstart\", this.onDragStart);\n this.removeEventListener(\"dragend\", this.onDragEnd);\n this.dragging = false;\n }\n }\n if (changed.has(\"dragging\")) {\n this.toggleAttribute(\"dragging\", this.dragging);\n }\n }\n\n render() {\n const showAvatar = !!this.avatar;\n const showLeadingIcon = !showAvatar && !!this.leadingIcon;\n\n if (this.avatar && this.leadingIcon) {\n console.warn(\n \"[rel-chip] leadingIcon and avatar are mutually exclusive. avatar takes precedence.\"\n );\n }\n\n return html`\n <span\n part=\"base\" class=\"${this.classes}\"\n role=\"button\"\n tabindex=\"0\"\n aria-label=\"${this.label}\"\n >\n ${showAvatar\n ? html`<rel-avatar type=\"text\" text=${this.avatar} size=\"xs\"></rel-avatar>`\n : null}\n ${showLeadingIcon\n ? html`<rel-icon part=\"icon\" class=\"chip-icon\" name=\"${this.leadingIcon}\"></rel-icon>`\n : null}\n\n <span part=\"label\" class=\"chip-label\">${this.label}</span>\n\n ${this.trailingIcon\n ? html`<rel-icon class=\"chip-icon\" name=\"${this.trailingIcon}\"></rel-icon>`\n : null}\n ${this.removable\n ? html`<button\n class=\"chip-remove\"\n aria-label=\"Remove ${this.label}\"\n @click=${this.handleRemove}\n >\n <rel-icon name=\"close\"></rel-icon>\n </button>`\n : null}\n </span>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"rel-chip\": RelChip;\n }\n}\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\r\n@customElement(\"rel-container\")\r\nexport class RelContainer extends LitElement {\r\n @property({ type: String, reflect: true }) padding: \"sm\" | \"md\" | \"lg\" | \"xl\" = \"md\";\r\n @property({ type: Boolean }) shadow = false;\r\n @property({ type: String, reflect: true }) background: \"light\" | \"white\" | \"none\" = \"white\";\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n display: block;\r\n width: 100%;\r\n box-sizing: border-box;\r\n }\r\n\r\n .reliability-container {\r\n border-radius: var(--rel-border-radius-sm);\r\n display: block;\r\n width: 100%;\r\n box-sizing: border-box;\r\n }\r\n\r\n .bg-white {\r\n background-color: var(--rel-bg-surface);\r\n }\r\n\r\n .bg-light {\r\n background-color: var(--rel-bg-surface-elevated);\r\n }\r\n\r\n .bg-none {\r\n background: transparent;\r\n }\r\n\r\n /* Default typography for slotted container content (Figma roles) */\r\n ::slotted(h1), ::slotted(h2), ::slotted(h3), ::slotted(h4) {\r\n font-family: var(--rel-headings-sm-font-family);\r\n font-weight: var(--rel-headings-sm-font-weight);\r\n font-size: var(--rel-headings-sm-font-size);\r\n line-height: var(--rel-headings-sm-line-height);\r\n letter-spacing: var(--rel-headings-sm-letter-spacing);\r\n color: var(--rel-text-default);\r\n margin: 0 0 var(--rel-spacing-lg) 0;\r\n }\r\n\r\n ::slotted(p) {\r\n font-family: var(--rel-body-md-regular-font-family);\r\n font-weight: var(--rel-body-md-regular-font-weight);\r\n font-size: var(--rel-body-md-regular-font-size);\r\n line-height: var(--rel-body-md-regular-line-height);\r\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\r\n color: var(--rel-text-body);\r\n margin: 0;\r\n }\r\n\r\n .padding-sm {\r\n padding: var(--rel-spacing-xs);\r\n }\r\n\r\n .padding-md {\r\n padding: var(--rel-spacing-md);\r\n }\r\n\r\n .padding-lg {\r\n padding: var(--rel-spacing-xl);\r\n }\r\n\r\n .padding-xl {\r\n padding: var(--rel-spacing-2xl);\r\n }\r\n\r\n .shadow {\r\n box-shadow: var(--rel-shadows-shadow-300);\r\n }\r\n `;\r\n\r\n private get classes() {\r\n return [\r\n \"reliability-container\",\r\n `bg-${this.background}`,\r\n `padding-${this.padding}`,\r\n this.shadow ? \"shadow\" : \"\",\r\n ].join(\" \");\r\n }\r\n\r\n render() {\r\n return html`\r\n <div part=\"base container\" class=\"${this.classes}\">\r\n <slot></slot>\r\n </div>\r\n `;\r\n }\r\n}\r\n"," import { LitElement, html, css } from \"lit\";\r\n import { customElement, property } from \"lit/decorators.js\";\r\n\r\n @customElement(\"rel-divider\")\r\n export class RelDivider extends LitElement {\r\n @property({ type: String }) orientation: \"horizontal\" | \"vertical\" = \"horizontal\";\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n display: block;\r\n }\r\n\r\n .rel-divider {\r\n position: relative;\r\n display: flex;\r\n background: transparent;\r\n font-family: var(--rel-fonts-font-family);\r\n color: var(--rel-text-default);\r\n }\r\n\r\n /* Horizontal */\r\n .rel-divider.horizontal {\r\n width: 100%;\r\n height: var(--rel-stroke-sm);\r\n background-color: var(--rel-bg-neutral-elevated-2);\r\n margin: var(--rel-spacing-md) 0;\r\n }\r\n\r\n /* Vertical */\r\n .rel-divider.vertical {\r\n width: var(--rel-stroke-sm);\r\n background-color: var(--rel-bg-neutral-elevated-2);\r\n margin: 0 var(--rel-spacing-md);\r\n align-self: stretch;\r\n height: 100%;\r\n }\r\n `;\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n this.setAttribute(\"role\", \"separator\");\r\n }\r\n\r\n updated() {\r\n this.setAttribute(\"aria-orientation\", this.orientation ?? \"horizontal\");\r\n }\r\n\r\n render() {\r\n return html`\r\n <div part=\"base\" class=\"rel-divider ${this.orientation}\" role=\"separator\"></div>\r\n `;\r\n }\r\n }\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property, state, query } from \"lit/decorators.js\";\r\nimport \"@reliability-design/icons/rel-icon\";\r\nimport \"./rel-drawer-footer\";\r\n\r\nexport type DrawerSide = \"bottom\" | \"left\" | \"right\";\r\nexport type DrawerCloseReason = \"backdrop\" | \"escape\" | \"drag\" | \"programmatic\";\r\n\r\n@customElement(\"rel-drawer\")\r\nexport class RelDrawer extends LitElement {\r\n @property({ type: Boolean, reflect: true }) open = false;\r\n @property({ type: String }) side: DrawerSide = \"bottom\";\r\n @property({ type: Boolean }) dismissible = true;\r\n @property({ type: Boolean }) modal = true;\r\n @property({ type: Boolean, attribute: \"close-on-backdrop\" }) closeOnBackdrop = true;\r\n @property({ type: Boolean, attribute: \"close-on-escape\" }) closeOnEscape = true;\r\n @property({ type: Boolean, attribute: \"show-handle\" }) showHandle = true;\r\n @property({ type: Boolean }) draggable = true;\r\n @property({ type: Number, attribute: \"snap-threshold\" }) snapThreshold = 0.25;\r\n @property({ type: String, attribute: \"max-height\" }) maxHeight = \"80vh\";\r\n @property({ type: String }) width = \"\";\r\n @property({ type: String }) title: string = \"\";\r\n @property({ type: String }) description: string = \"\";\r\n\r\n @state() private isDragging = false;\r\n @state() private dragOffset = 0;\r\n // Once a left/right drawer finishes sliding in, we drop its transform so that\r\n // `position: fixed` descendants (select dropdowns, popovers, tooltips) are no\r\n // longer trapped by the transformed panel's containing block.\r\n @state() private settled = false;\r\n\r\n @query(\".panel\") private panelElement!: HTMLElement;\r\n @query(\".overlay\") private overlayElement!: HTMLElement;\r\n\r\n private previousFocus: HTMLElement | null = null;\r\n private startY = 0;\r\n private currentY = 0;\r\n private originalBodyOverflow = \"\";\r\n private originalBodyPaddingRight = \"\";\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n --drawer-transition-duration: 0.3s;\r\n --drawer-transition-timing: cubic-bezier(0.32, 0.72, 0, 1);\r\n }\r\n\r\n .drawer-container {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n z-index: 1000;\r\n pointer-events: none;\r\n /* pointer-events:none only blocks the mouse — the closed drawer's\r\n close button and slotted content would otherwise stay in the Tab\r\n order and swallow keyboard focus into invisible off-screen UI.\r\n visibility also removes them from the tab order; the transition\r\n delays the flip to hidden until the close animation has played. */\r\n visibility: hidden;\r\n transition: visibility 0s linear var(--drawer-transition-duration);\r\n }\r\n\r\n .drawer-container.open {\r\n pointer-events: auto;\r\n visibility: visible;\r\n transition-delay: 0s;\r\n }\r\n\r\n /* Overlay */\r\n .overlay {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n background: var(--rel-overlay-scrim);\r\n opacity: 0;\r\n transition: opacity var(--drawer-transition-duration) var(--drawer-transition-timing);\r\n }\r\n\r\n .drawer-container.open .overlay {\r\n opacity: var(--rel-drawer-scrim-opacity, 1);\r\n }\r\n\r\n /* Panel base */\r\n .panel {\r\n position: absolute;\r\n background: var(--rel-bg-surface);\r\n box-shadow: var(--rel-shadows-shadow-500);\r\n display: flex;\r\n flex-direction: column;\r\n overflow: hidden;\r\n outline: none;\r\n font-family: var(--rel-fonts-font-family);\r\n transition: transform var(--drawer-transition-duration) var(--drawer-transition-timing);\r\n }\r\n\r\n /* Bottom drawer */\r\n .panel[data-side=\"bottom\"] {\r\n bottom: 0;\r\n left: 50%;\r\n right: auto;\r\n width: var(--drawer-width, clamp(640px, 66vw, 952px));\r\n height: var(--drawer-height, clamp(360px, 49vh, 600px));\r\n border-radius: var(--rel-border-radius-sm)\r\n var(--rel-border-radius-sm)\r\n 0\r\n 0;\r\n transform: translateX(-50%) translateY(100%);\r\n }\r\n\r\n .drawer-container.open .panel[data-side=\"bottom\"] {\r\n transform: translateX(-50%) translateY(0);\r\n }\r\n\r\n /* Left drawer */\r\n .panel[data-side=\"left\"] {\r\n top: 0;\r\n left: 0;\r\n bottom: 0;\r\n width: var(--drawer-width, clamp(280px, 24vw, 420px));\r\n border-radius: 0;\r\n transform: translateX(-100%);\r\n }\r\n\r\n .drawer-container.open .panel[data-side=\"left\"] {\r\n transform: translateX(0);\r\n }\r\n\r\n /* Right drawer */\r\n .panel[data-side=\"right\"] {\r\n top: 0;\r\n right: 0;\r\n bottom: 0;\r\n width: var(--drawer-width, clamp(280px, 24vw, 420px));\r\n border-radius: 0;\r\n transform: translateX(100%);\r\n }\r\n\r\n .drawer-container.open .panel[data-side=\"right\"] {\r\n transform: translateX(0);\r\n }\r\n\r\n /* Once settled open, drop the (now identity) transform on left/right panels\r\n so their fixed-position descendants (select dropdowns, popovers, tooltips)\r\n escape the transformed containing block instead of being clipped by the\r\n panel. Bottom keeps its transform (used for centering). */\r\n .drawer-container.open .panel[data-side=\"left\"].settled,\r\n .drawer-container.open .panel[data-side=\"right\"].settled {\r\n transform: none;\r\n }\r\n\r\n /* Dragging state */\r\n .panel.dragging {\r\n transition: none;\r\n }\r\n\r\n .overlay.dragging {\r\n transition: none;\r\n }\r\n\r\n .overlay.no-modal {\r\n display: none !important;\r\n }\r\n\r\n /* Handle */\r\n .handle {\r\n width: 48px;\r\n height: 4px;\r\n background: var(--rel-bg-neutral-elevated-2);\r\n border-radius: var(--rel-border-radius-full-rounded);\r\n margin: var(--rel-spacing-xs) auto var(--rel-spacing-2xs);\r\n cursor: grab;\r\n touch-action: none;\r\n }\r\n\r\n .handle:active {\r\n cursor: grabbing;\r\n background: var(--rel-border-accent);\r\n }\r\n\r\n .handle.hidden {\r\n display: none;\r\n }\r\n\r\n /* Header */\r\n .header {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--rel-spacing-2xs);\r\n padding: var(--rel-spacing-md) var(--rel-spacing-lg);\r\n border-bottom: var(--rel-stroke-sm) solid var(--rel-border-default);\r\n }\r\n\r\n .header.empty {\r\n display: none;\r\n }\r\n\r\n .header-top {\r\n display: flex;\r\n align-items: flex-start;\r\n justify-content: space-between;\r\n gap: var(--rel-spacing-sm);\r\n }\r\n\r\n .title {\r\n color: var(--rel-text-label);\r\n margin: 0;\r\n\r\n font-family: var(--rel-headings-lg-font-family);\r\n\r\n font-weight: var(--rel-headings-lg-font-weight);\r\n\r\n font-size: var(--rel-headings-lg-font-size);\r\n\r\n line-height: var(--rel-headings-lg-line-height);\r\n\r\n letter-spacing: var(--rel-headings-lg-letter-spacing);\r\n\r\n }\r\n\r\n .description {\r\n color: var(--rel-text-body);\r\n margin: 0;\r\n opacity: 0.8;\r\n\r\n font-family: var(--rel-body-lg-regular-font-family);\r\n\r\n font-weight: var(--rel-body-lg-regular-font-weight);\r\n\r\n font-size: var(--rel-body-lg-regular-font-size);\r\n\r\n line-height: var(--rel-body-lg-regular-line-height);\r\n\r\n letter-spacing: var(--rel-body-lg-regular-letter-spacing);\r\n\r\n }\r\n\r\n /* Emphasised inline text in slotted content (Figma body-lg-medium) */\r\n .content ::slotted(strong),\r\n .content ::slotted(b) {\r\n font-weight: var(--rel-body-lg-medium-font-weight);\r\n }\r\n\r\n .close-button {\r\n background: transparent;\r\n border: none;\r\n cursor: pointer;\r\n padding: var(--rel-spacing-2xs);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n align-self: flex-start;\r\n flex-shrink: 0;\r\n border-radius: var(--rel-border-radius-xs);\r\n color: var(--rel-text-default);\r\n transition: background 0.15s ease;\r\n }\r\n\r\n .close-button:hover {\r\n background: var(--rel-bg-surface-elevated);\r\n }\r\n\r\n .close-button:active {\r\n background: var(--rel-border-default);\r\n }\r\n\r\n .close-button:focus-visible {\r\n outline: 2px solid var(--rel-border-focus);\r\n outline-offset: 2px;\r\n }\r\n\r\n /* Content */\r\n .content {\r\n flex: 1;\r\n overflow-y: auto;\r\n padding: var(--rel-spacing-xl);\r\n }\r\n\r\n /* Footer */\r\n .footer {\r\n flex-shrink: 0;\r\n padding: var(--rel-spacing-md) var(--rel-spacing-lg);\r\n border-top: var(--rel-stroke-sm) solid var(--rel-border-default);\r\n }\r\n\r\n /* Reduced motion */\r\n @media (prefers-reduced-motion: reduce) {\r\n .overlay,\r\n .panel {\r\n transition: none;\r\n }\r\n\r\n .drawer-container .panel {\r\n transform: none;\r\n }\r\n\r\n .drawer-container:not(.open) .panel {\r\n display: none;\r\n }\r\n }\r\n `;\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n if (this.open) {\r\n this.lockScroll();\r\n }\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback();\r\n this.unlockScroll();\r\n document.removeEventListener(\"keydown\", this.handleKeydown);\r\n }\r\n\r\n updated(changed: Map<string, any>) {\r\n if (changed.has(\"open\")) {\r\n if (this.open) {\r\n this.handleOpen();\r\n } else {\r\n this.handleClose();\r\n }\r\n }\r\n }\r\n\r\n private handleOpen() {\r\n this.previousFocus = document.activeElement as HTMLElement;\r\n this.lockScroll();\r\n\r\n if (this.modal) {\r\n this.updateComplete.then(() => {\r\n const focusTarget =\r\n this.querySelector<HTMLElement>(\"[autofocus]\") ??\r\n this.querySelector<HTMLElement>(\".close-button\") ??\r\n this.querySelector<HTMLElement>(\".panel\");\r\n focusTarget?.focus();\r\n });\r\n }\r\n\r\n document.addEventListener(\"keydown\", this.handleKeydown);\r\n\r\n // After the slide-in transition completes, mark the panel settled so its\r\n // transform is dropped (frees fixed-position dropdowns/popovers). A timeout\r\n // backstops the case where transitionend doesn't fire.\r\n this.settled = false;\r\n this.updateComplete.then(() => {\r\n const panel = this.panelElement;\r\n if (!panel) return;\r\n let done = false;\r\n const settle = () => {\r\n if (done) return;\r\n done = true;\r\n this.settled = true;\r\n panel.removeEventListener(\"transitionend\", onEnd);\r\n };\r\n const onEnd = (e: TransitionEvent) => {\r\n if (e.propertyName === \"transform\") settle();\r\n };\r\n panel.addEventListener(\"transitionend\", onEnd);\r\n setTimeout(settle, 500);\r\n });\r\n\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-open-change\", {\r\n detail: { open: true },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private handleClose() {\r\n this.settled = false;\r\n this.unlockScroll();\r\n document.removeEventListener(\"keydown\", this.handleKeydown);\r\n\r\n if (this.previousFocus && this.previousFocus.focus) {\r\n this.updateComplete.then(() => {\r\n this.previousFocus?.focus();\r\n this.previousFocus = null;\r\n });\r\n }\r\n\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-open-change\", {\r\n detail: { open: false },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private lockScroll() {\r\n if (typeof document === \"undefined\") return;\r\n\r\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\r\n\r\n this.originalBodyOverflow = document.body.style.overflow;\r\n this.originalBodyPaddingRight = document.body.style.paddingRight;\r\n\r\n document.body.style.overflow = \"hidden\";\r\n if (scrollbarWidth > 0) {\r\n document.body.style.paddingRight = `${scrollbarWidth}px`;\r\n }\r\n }\r\n\r\n private unlockScroll() {\r\n if (typeof document === \"undefined\") return;\r\n\r\n document.body.style.overflow = this.originalBodyOverflow;\r\n document.body.style.paddingRight = this.originalBodyPaddingRight;\r\n }\r\n\r\n private getFocusableElements(): HTMLElement[] {\r\n if (!this.panelElement) return [];\r\n\r\n const selectors = [\r\n 'a[href]',\r\n 'button:not([disabled])',\r\n 'textarea:not([disabled])',\r\n 'input:not([disabled])',\r\n 'select:not([disabled])',\r\n '[tabindex]:not([tabindex=\"-1\"])',\r\n ].join(\",\");\r\n\r\n const elements = Array.from(\r\n this.panelElement.querySelectorAll(selectors)\r\n ) as HTMLElement[];\r\n\r\n // Also check slotted content\r\n const slots = this.panelElement.querySelectorAll(\"slot\");\r\n slots.forEach((slot) => {\r\n const assigned = slot.assignedElements({ flatten: true });\r\n assigned.forEach((el) => {\r\n const focusableInSlot = el.querySelectorAll(selectors);\r\n elements.push(...(Array.from(focusableInSlot) as HTMLElement[]));\r\n });\r\n });\r\n\r\n return elements;\r\n }\r\n\r\n private handleKeydown = (e: KeyboardEvent) => {\r\n if (!this.open) return;\r\n\r\n if (e.key === \"Escape\" && this.dismissible && this.closeOnEscape) {\r\n e.preventDefault();\r\n this.close(\"escape\");\r\n return;\r\n }\r\n\r\n // Focus trap\r\n if (e.key === \"Tab\" && this.modal) {\r\n const focusable = this.getFocusableElements();\r\n if (focusable.length === 0) {\r\n e.preventDefault();\r\n return;\r\n }\r\n\r\n const firstFocusable = focusable[0];\r\n const lastFocusable = focusable[focusable.length - 1];\r\n const activeElement = document.activeElement;\r\n\r\n if (e.shiftKey) {\r\n if (activeElement === firstFocusable) {\r\n e.preventDefault();\r\n lastFocusable.focus();\r\n }\r\n } else {\r\n if (activeElement === lastFocusable) {\r\n e.preventDefault();\r\n firstFocusable.focus();\r\n }\r\n }\r\n }\r\n };\r\n\r\n private handleOverlayClick(e: MouseEvent) {\r\n if (!this.dismissible || !this.closeOnBackdrop) return;\r\n\r\n if (e.target === this.overlayElement) {\r\n this.close(\"backdrop\");\r\n }\r\n }\r\n\r\n private handleCloseButtonClick() {\r\n this.close(\"programmatic\");\r\n }\r\n\r\n private close(_reason: DrawerCloseReason) {\r\n this.open = false;\r\n }\r\n\r\n // Drag-to-close handlers\r\n private handlePointerDown = (e: PointerEvent) => {\r\n if (!this.draggable || this.side !== \"bottom\") return;\r\n\r\n this.isDragging = true;\r\n this.startY = e.clientY;\r\n this.currentY = e.clientY;\r\n this.dragOffset = 0;\r\n\r\n const target = e.target as HTMLElement;\r\n target.setPointerCapture(e.pointerId);\r\n\r\n document.addEventListener(\"pointermove\", this.handlePointerMove);\r\n document.addEventListener(\"pointerup\", this.handlePointerUp);\r\n };\r\n\r\n private handlePointerMove = (e: PointerEvent) => {\r\n if (!this.isDragging) return;\r\n\r\n this.currentY = e.clientY;\r\n const deltaY = this.currentY - this.startY;\r\n\r\n // Only allow dragging down for bottom drawer\r\n if (deltaY > 0) {\r\n this.dragOffset = deltaY;\r\n this.requestUpdate();\r\n }\r\n };\r\n\r\n private handlePointerUp = (_e: PointerEvent) => {\r\n if (!this.isDragging) return;\r\n\r\n this.isDragging = false;\r\n\r\n const panelHeight = this.panelElement?.offsetHeight || 0;\r\n const draggedPercent = this.dragOffset / panelHeight;\r\n\r\n if (draggedPercent >= this.snapThreshold) {\r\n this.close(\"drag\");\r\n }\r\n\r\n this.dragOffset = 0;\r\n this.requestUpdate();\r\n\r\n document.removeEventListener(\"pointermove\", this.handlePointerMove);\r\n document.removeEventListener(\"pointerup\", this.handlePointerUp);\r\n };\r\n\r\n private getPanelStyle() {\r\n if (!this.isDragging || this.dragOffset === 0) {\r\n return \"\";\r\n }\r\n\r\n return `transform: translateX(-50%) translateY(${this.dragOffset}px);`;\r\n }\r\n\r\n private getOverlayStyle() {\r\n if (!this.isDragging || this.dragOffset === 0) {\r\n return \"\";\r\n }\r\n\r\n const panelHeight = this.panelElement?.offsetHeight || 0;\r\n const draggedPercent = Math.min(this.dragOffset / panelHeight, 1);\r\n const opacity = 0.5 * (1 - draggedPercent);\r\n\r\n return `opacity: ${opacity};`;\r\n }\r\n\r\n render() {\r\n const hasTitle = !!this.title;\r\n const hasDescription = !!this.description;\r\n const showCloseButton = this.dismissible;\r\n const hasHeader = hasTitle || hasDescription || showCloseButton;\r\n\r\n const showHandleBar =\r\n this.showHandle && this.side === \"bottom\" && this.draggable;\r\n\r\n return html`\r\n <div class=\"drawer-container ${this.open ? \"open\" : \"\"}\">\r\n <div\r\n part=\"overlay\"\r\n class=\"overlay ${!this.modal ? 'no-modal' : ''} ${this.isDragging ? 'dragging' : ''}\"\r\n style=\"${this.getOverlayStyle()}\"\r\n @click=\"${this.handleOverlayClick}\"></div>\r\n\r\n <div\r\n part=\"panel\"\r\n class=\"panel ${this.isDragging ? \"dragging\" : \"\"} ${this.settled ? \"settled\" : \"\"}\"\r\n data-side=\"${this.side}\"\r\n style=\"${this.width ? `--drawer-width: ${this.width};` : ''}${this.maxHeight ? `--drawer-max-height: ${this.maxHeight};` : ''}${this.getPanelStyle()}\"\r\n role=\"${this.modal ? \"dialog\" : \"region\"}\"\r\n aria-modal=\"${this.modal}\"\r\n tabindex=\"-1\">\r\n ${showHandleBar\r\n ? html`<div\r\n part=\"handle\"\r\n class=\"handle\"\r\n @pointerdown=\"${this.handlePointerDown}\"></div>`\r\n : \"\"}\r\n\r\n <div part=\"header\" class=\"header ${!hasHeader ? \"empty\" : \"\"}\">\r\n ${hasTitle || hasDescription || showCloseButton\r\n ? html`\r\n <div class=\"header-top\">\r\n <div>\r\n ${hasTitle\r\n ? html`<h2 class=\"title\">${this.title}</h2>`\r\n : \"\"}\r\n ${hasDescription\r\n ? html`<p class=\"description\">${this.description}</p>`\r\n : \"\"}\r\n </div>\r\n ${showCloseButton\r\n ? html`<button\r\n part=\"close-button\"\r\n class=\"close-button\"\r\n @click=\"${this.handleCloseButtonClick}\"\r\n aria-label=\"Close\">\r\n <rel-icon name=\"close\" size=\"sm\"></rel-icon>\r\n </button>`\r\n : \"\"}\r\n </div>\r\n `\r\n : \"\"}\r\n </div>\r\n\r\n <div part=\"content\" class=\"content\">\r\n <slot></slot>\r\n </div>\r\n\r\n <div part=\"footer\" class=\"footer\">\r\n <rel-drawer-footer><slot name=\"footer\"></slot></rel-drawer-footer>\r\n </div>\r\n </div>\r\n </div>\r\n `;\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"rel-drawer\": RelDrawer;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\nimport { customElement } from \"lit/decorators.js\";\n\n@customElement(\"rel-drawer-footer\")\nexport class RelDrawerFooter extends LitElement {\n static styles = css`\n .drawer-footer {\n display: flex;\n justify-content: flex-end;\n gap: var(--rel-spacing-xs);\n }\n `;\n\n render() {\n return html`\n <div class=\"drawer-footer\">\n <slot></slot>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"rel-drawer-footer\": RelDrawerFooter;\n }\n}\n","import { LitElement, html, css, nothing } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\n\n@customElement(\"rel-kbd\")\nexport class RelKbd extends LitElement {\n @property({ type: String, reflect: true })\n size: \"sm\" | \"md\" | \"lg\" = \"md\";\n\n @property({ type: String, reflect: true })\n variant: \"default\" | \"muted\" = \"default\";\n\n @property({ type: Boolean, reflect: true })\n pill = false;\n\n @property({ type: Boolean, reflect: true })\n inset = false;\n\n static styles = css`\n :host {\n color: var(--rel-text-default);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-family: var(--rel-label-md-font-family);\n font-weight: var(--rel-label-md-font-weight);\n font-size: var(--rel-label-md-font-size);\n line-height: var(--rel-label-md-line-height);\n letter-spacing: var(--rel-label-md-letter-spacing);\n white-space: nowrap;\n user-select: none;\n transition: box-shadow 0.15s ease, background 0.15s ease, border-color 0.15s ease;\n vertical-align: middle;\n }\n\n /* Slotted hint text (Figma body-sm-regular) */\n ::slotted(span) {\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 \n :host([size=\"sm\"]) {\n padding: var(--rel-spacing-3xs) var(--rel-spacing-xs);\n min-width: 20px;\n height: 20px;\n border-radius: var(--rel-border-radius-xs);\n\n font-family: var(--rel-label-xs-font-family);\n\n font-weight: var(--rel-label-xs-font-weight);\n\n font-size: var(--rel-label-xs-font-size);\n\n line-height: var(--rel-label-xs-line-height);\n\n letter-spacing: var(--rel-label-xs-letter-spacing);\n\n }\n\n :host([size=\"md\"]) {\n padding: var(--rel-spacing-2xs) var(--rel-spacing-sm);\n min-width: 24px;\n height: 24px;\n border-radius: var(--rel-border-radius-xs);\n\n font-family: var(--rel-label-sm-font-family);\n\n font-weight: var(--rel-label-sm-font-weight);\n\n font-size: var(--rel-label-sm-font-size);\n\n line-height: var(--rel-label-sm-line-height);\n\n letter-spacing: var(--rel-label-sm-letter-spacing);\n\n }\n\n :host([size=\"lg\"]) {\n padding: var(--rel-spacing-xs) var(--rel-spacing-md);\n min-width: 32px;\n height: 32px;\n border-radius: var(--rel-border-radius-sm);\n\n font-family: var(--rel-label-lg-font-family);\n\n font-weight: var(--rel-label-lg-font-weight);\n\n font-size: var(--rel-label-lg-font-size);\n\n line-height: var(--rel-label-lg-line-height);\n\n letter-spacing: var(--rel-label-lg-letter-spacing);\n\n }\n\n :host([variant=\"default\"]) {\n background: var(--rel-bg-neutral-elevated-1);\n color: var(--rel-text-label);\n border: var(--rel-stroke-sm) solid var(--rel-border-default);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05), 0 1px 0 0 rgba(255, 255, 255, 0.5) inset;\n }\n\n :host([variant=\"muted\"]) {\n background: var(--rel-bg-neutral-elevated-2);\n color: var(--rel-text-placeholder);\n border: var(--rel-stroke-sm) solid var(--rel-border-default);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.03);\n }\n\n :host([pill]) {\n border-radius: var(--rel-border-radius-full-rounded);\n }\n\n :host([inset]) {\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1) inset, 0 1px 0 0 rgba(0, 0, 0, 0.05);\n transform: translateY(1px);\n }\n\n :host([inset][variant=\"default\"]) {\n background: var(--rel-bg-neutral-elevated-1);\n border-color: var(--rel-border-default);\n }\n\n :host([inset][variant=\"muted\"]) {\n background: var(--rel-border-default);\n border-color: var(--rel-border-default);\n }\n `;\n\n render() {\n return html`<slot></slot>`;\n }\n}\n\n/**\n * Multi-key shortcut (Figma Kbd Items=1/2/3/4): renders one <rel-kbd> per\n * entry in `items` with \"+\" separators between them. Slotted <rel-kbd>\n * children may be used instead of the items array.\n *\n * <rel-kbd-group .items=${[\"Ctrl\", \"Shift\", \"P\"]} size=\"md\"></rel-kbd-group>\n */\n@customElement(\"rel-kbd-group\")\nexport class RelKbdGroup extends LitElement {\n @property({ type: Array }) items: string[] = [];\n\n @property({ type: String, reflect: true })\n size: \"sm\" | \"md\" | \"lg\" = \"md\";\n\n @property({ type: String, reflect: true })\n variant: \"default\" | \"muted\" = \"default\";\n\n static styles = css`\n :host {\n display: inline-flex;\n align-items: center;\n gap: var(--rel-spacing-2xs);\n white-space: nowrap;\n }\n\n /* \"+\" between keys (Figma body-sm-regular, caption tone) */\n .separator {\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 user-select: none;\n }\n `;\n\n render() {\n return html`\n ${this.items.map(\n (key, i) => html`\n ${i > 0\n ? html`<span part=\"label\" class=\"separator\" aria-hidden=\"true\">+</span>`\n : nothing}\n <rel-kbd part=\"item\" size=${this.size} variant=${this.variant}>${key}</rel-kbd>\n `\n )}\n <slot></slot>\n `;\n }\n}\n","import { LitElement, html, css } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\n\n@customElement(\"rel-layout\")\nexport class RelLayout extends LitElement {\n @property({ type: String }) gap = \"1rem\";\n\n @property({ type: Number }) columns = 4;\n\n @property({ type: Boolean, reflect: true }) responsive = true;\n\n static styles = css`\n :host {\n color: var(--rel-text-default);\n display: grid;\n width: 100%;\n font-family: var(--rel-fonts-font-family);\n gap: var(--_gap, 1rem);\n grid-template-columns: repeat(var(--_columns, 4), 1fr);\n }\n\n @media (max-width: 1024px) {\n :host([responsive]) {\n grid-template-columns: repeat(3, 1fr);\n }\n }\n\n @media (max-width: 768px) {\n :host([responsive]) {\n grid-template-columns: repeat(2, 1fr);\n }\n }\n\n @media (max-width: 480px) {\n :host([responsive]) {\n grid-template-columns: 1fr;\n }\n }\n `;\n\n willUpdate() {\n this.style.setProperty('--_gap', this.gap);\n this.style.setProperty('--_columns', String(this.columns));\n }\n\n render() {\n return html`<slot></slot>`;\n }\n}\n","import { LitElement, html } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport \"@reliability-design/icons/rel-icon\";\nimport \"../rel-checkbox/rel-checkbox.js\";\nimport \"../rel-radio/rel-radio.js\";\n\nexport type MenuType = \"default\" | \"checkbox\" | \"arrow\" | \"select-option\" | \"fixed\" | \"fit\";\n\nexport interface MenuItem {\n label: string;\n active?: boolean;\n checked?: boolean;\n disabled?: boolean;\n submenu?: MenuItem[];\n open?: boolean;\n}\n\n@customElement(\"rel-menu-item\")\nexport class RelMenuItem extends LitElement {\n @property({ type: String }) label: string = \"\";\n @property({ type: String }) value: string = \"\";\n @property({ type: Boolean }) disabled: boolean = false;\n @property({ type: String }) icon: string = \"\";\n\n createRenderRoot() {\n return this;\n }\n\n render() {\n return html``;\n }\n}\n\n@customElement(\"rel-menu\")\nexport class RelMenu extends LitElement {\n @property({ type: String }) type: MenuType = \"default\";\n\n @property({ type: Array }) items: MenuItem[] = [];\n\n @state() private focusedIndex: number = 0;\n @state() private _items: MenuItem[] = [];\n\n public 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 — 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 — 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 — safe here (a submenu has no further nested\n flyout to clip) — 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 `;\n\n createRenderRoot() {\n return this;\n }\n\n connectedCallback() {\n super.connectedCallback();\n document.addEventListener(\"click\", this.handleDocumentClick);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n document.removeEventListener(\"click\", this.handleDocumentClick);\n }\n\n updated(changedProperties: Map<string, unknown>) {\n if (changedProperties.has('items')) {\n this._items = this.items.map(item => ({ ...item }));\n }\n }\n\n /** Index of a submenu locked open by a click (survives hover-out). -1 = none. */\n private lockedIndex = -1;\n\n private handleDocumentClick = (e: MouseEvent) => {\n // composedPath (NOT e.target): document-level e.target is retargeted to the\n // shadow host when this menu lives inside a shadow root, so this.contains()\n // wrongly reads an inside-click as outside and closes an open submenu on the\n // click that opened it. composedPath pierces shadow boundaries.\n if (!e.composedPath().includes(this)) {\n this.lockedIndex = -1;\n this._items = this._items.map(i => ({ ...i, open: false }));\n }\n };\n\n private onItemEnter(item: MenuItem, index: number) {\n if (item.disabled) return;\n if (this.type === \"arrow\" && item.submenu?.length) {\n // Hover opens this submenu; a click-locked one also stays open.\n this._items = this._items.map((i, idx) => ({ ...i, open: idx === index || idx === this.lockedIndex }));\n }\n }\n\n private onItemLeave(_item: MenuItem, index: number) {\n if (this.type !== \"arrow\") return;\n // Hover-out closes the submenu UNLESS it was locked open by a click. Moving\n // into the flyout doesn't fire this (the flyout is a DOM descendant of the\n // item and sits flush at left:100%, so there's no dead-zone gap).\n if (this.lockedIndex === index) return;\n this._items = this._items.map((i, idx) => ({ ...i, open: idx === this.lockedIndex }));\n }\n\n private onItemClick(item: MenuItem, index: number, ev?: Event) {\n ev?.stopPropagation();\n if (item.disabled) return;\n\n this.focusedIndex = index;\n\n if (this.type === \"checkbox\") {\n const updated = { ...item, checked: !item.checked };\n this._items = this._items.map((i, idx) => idx === index ? updated : i);\n this.dispatchEvent(\n new CustomEvent(\"rel-check\", {\n detail: { item: updated, checked: updated.checked },\n bubbles: true,\n composed: true,\n })\n );\n return;\n }\n\n if (this.type === \"arrow\" && item.submenu?.length) {\n // Click LOCKS the submenu open (click again to unlock/close).\n const lock = this.lockedIndex !== index;\n this.lockedIndex = lock ? index : -1;\n this._items = this._items.map((i, idx) => ({ ...i, open: idx === index ? lock : false }));\n return;\n }\n\n // Default: set active\n const updated = { ...item, active: true };\n this._items = this._items.map((i, idx) => idx === index ? updated : { ...i, active: false });\n this.dispatchEvent(\n new CustomEvent(\"rel-select\", {\n detail: { item: updated },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private onSubClick(parentIndex: number, subIndex: number, ev?: Event) {\n ev?.stopPropagation();\n this.lockedIndex = -1;\n this._items = this._items.map((i, idx) => ({\n ...i,\n active: false,\n open: false,\n submenu: i.submenu?.map((s, sIdx) => ({\n ...s,\n active: idx === parentIndex && sIdx === subIndex,\n })),\n }));\n this.dispatchEvent(\n new CustomEvent(\"rel-submenu-select\", {\n detail: {\n parent: this._items[parentIndex],\n sub: this._items[parentIndex]?.submenu?.[subIndex],\n },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private onKeydown(ev: KeyboardEvent) {\n const last = this._items.length - 1;\n\n if (ev.key === \"ArrowDown\") {\n this.focusedIndex = Math.min(last, this.focusedIndex + 1);\n ev.preventDefault();\n } else if (ev.key === \"ArrowUp\") {\n this.focusedIndex = Math.max(0, this.focusedIndex - 1);\n ev.preventDefault();\n } else if (ev.key === \"ArrowRight\") {\n const item = this._items[this.focusedIndex];\n if (this.type === \"arrow\" && item?.submenu?.length) {\n // keyboard-open locks (no hover-out to close it)\n this.lockedIndex = this.focusedIndex;\n this._items = this._items.map((i, idx) => ({\n ...i,\n open: idx === this.focusedIndex ? true : i.open,\n }));\n }\n } else if (ev.key === \"ArrowLeft\" || ev.key === \"Escape\") {\n this.lockedIndex = -1;\n this._items = this._items.map(i => ({ ...i, open: false }));\n } else if (ev.key === \"Enter\" || ev.key === \" \") {\n const item = this._items[this.focusedIndex];\n this.onItemClick(item, this.focusedIndex);\n ev.preventDefault();\n }\n }\n\n private renderMenuItem(item: MenuItem, index: number) {\n const isFocused = this.focusedIndex === index;\n const hasSubmenu = this.type === \"arrow\" && !!item.submenu?.length;\n\n // Checkbox / select-option rows delegate their control to the real\n // rel-checkbox / rel-radio components (pointer-events:none so the whole ROW\n // stays the click target — onItemClick is the single source of truth and\n // the control just reflects item state).\n const control =\n this.type === \"checkbox\"\n ? html`<rel-checkbox\n class=\"menu-control\"\n label=\"${item.label}\"\n status=\"${item.checked ? \"checked\" : \"unchecked\"}\"\n state=\"${item.disabled ? \"disabled\" : \"default\"}\"\n ></rel-checkbox>`\n : this.type === \"select-option\"\n ? html`<rel-radio\n class=\"menu-control\"\n .options=\"${[{ value: item.label, label: item.label, disabled: !!item.disabled }]}\"\n .selectedValue=\"${item.active ? item.label : null}\"\n ></rel-radio>`\n : html`\n <span class=\"menu-label\">${item.label}</span>\n ${hasSubmenu\n ? html`<span class=\"submenu-chevron\"\n ><rel-icon name=\"chevron-right\" size=\"sm\"></rel-icon\n ></span>`\n : \"\"}\n `;\n\n return html`\n <div\n class=\"rel-menu-item ${item.active ? \"active\" : \"\"} ${item.disabled ? \"disabled\" : \"\"}\"\n role=\"menuitem\"\n ?data-focused=\"${isFocused}\"\n @mouseenter=\"${() => this.onItemEnter(item, index)}\"\n @mouseleave=\"${() => this.onItemLeave(item, index)}\"\n @click=\"${(e: Event) => this.onItemClick(item, index, e)}\">\n ${control}\n ${hasSubmenu\n ? html`\n <div\n part=\"panel\" class=\"rel-submenu ${item.open ? \"visible\" : \"\"}\"\n @click=\"${(e: Event) => e.stopPropagation()}\">\n ${item.submenu!.map(\n (sub, subIndex) => html`\n <div\n class=\"rel-menu-item ${sub.active ? \"active\" : \"\"}\"\n role=\"menuitem\"\n @click=\"${(e: Event) => this.onSubClick(index, subIndex, e)}\">\n <span class=\"menu-label\">${sub.label}</span>\n </div>\n `\n )}\n </div>\n `\n : \"\"}\n </div>\n `;\n }\n\n render() {\n return html`\n <style>${RelMenu._css}</style>\n <div\n part=\"list\" class=\"rel-menu ${this.type === \"fixed\" || this.type === \"fit\" ? this.type : \"\"}\"\n role=\"menu\"\n tabindex=\"0\"\n @keydown=\"${this.onKeydown}\"\n @click=\"${(e: Event) => e.stopPropagation()}\">\n ${this._items.map((item, index) => this.renderMenuItem(item, index))}\n </div>\n `;\n }\n}\n","import { LitElement, html, css } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\n\nexport interface RadioOption {\n value: string;\n label: string;\n supportingText?: string;\n disabled?: boolean;\n}\n\n@customElement(\"rel-radio\")\nexport class RelRadio extends LitElement {\n @property({ type: Array }) options: RadioOption[] = [];\n\n @property({ type: String }) name = \"radio-group\";\n\n @property({ type: String, reflect: true })\n selectedValue: string | null = null;\n\n @property({ type: Boolean })\n disabled = false;\n\n @property({ type: Boolean }) error = false;\n\n @property({ type: String }) errorMessage = \"\";\n\n @property({ type: String }) value = \"\";\n\n checked = false;\n\n private _onChange: (value: string) => void = () => {};\n private _onTouched: () => void = () => {};\n\n static styles = css`\n :host {\n color: var(--rel-text-default);\n display: block;\n font-family: var(--rel-fonts-font-family);\n }\n\n .rel-radio-group {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: var(--rel-spacing-xs);\n }\n\n .rel-radio-option {\n display: inline-flex;\n flex-direction: column;\n gap: var(--rel-spacing-3xs);\n cursor: pointer;\n }\n\n .rel-radio-option.disabled {\n opacity: 0.6;\n color: var(--rel-text-disabled);\n cursor: not-allowed !important;\n }\n\n .rel-radio-option:not(.disabled):hover .radio-custom {\n border-color: var(--rel-text-body);\n }\n\n .rel-radio-option:not(.disabled):hover .radio-label {\n color: var(--rel-text-body);\n }\n\n .rel-radio-option:not(.disabled):hover .radio-supporting {\n color: var(--rel-text-caption);\n }\n\n .rel-radio-option:focus-within:has(input:focus-visible) {\n outline: 1.5px solid var(--rel-border-focus);\n outline-offset: 1px;\n }\n\n .radio-main {\n /* Containing block for the hidden input below — without this the\n absolutely-positioned input resolves against the document (or any\n positioned ancestor in the consumer page), where it neither moves\n with intermediate scroll containers nor stays aligned with the\n visible radio. Tabbing to it then makes the browser scroll the\n WRONG scroller, shoving the whole page up (same bug as\n rel-checkbox — keep the two fixes in sync). */\n position: relative;\n display: flex;\n align-items: center;\n gap: var(--rel-spacing-2xs);\n }\n\n input {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n margin: 0;\n opacity: 0;\n pointer-events: none;\n }\n\n .radio-custom {\n width: 20px;\n height: 20px;\n border: 2px solid var(--rel-text-label);\n border-radius: 50%;\n position: relative;\n flex-shrink: 0;\n }\n\n input:checked + .radio-custom::after {\n content: \"\";\n position: absolute;\n inset: 4px;\n background: var(--rel-text-label);\n border-radius: 50%;\n }\n\n .radio-label {\n color: var(--rel-text-default);\n\n font-family: var(--rel-body-lg-regular-font-family);\n\n font-weight: var(--rel-body-lg-regular-font-weight);\n\n font-size: var(--rel-body-lg-regular-font-size);\n\n line-height: var(--rel-body-lg-regular-line-height);\n\n letter-spacing: var(--rel-body-lg-regular-letter-spacing);\n\n }\n\n .radio-supporting {\n margin-left: 28px;\n color: var(--rel-text-caption);\n\n font-family: var(--rel-body-sm-regular-font-family);\n\n font-weight: var(--rel-body-sm-regular-font-weight);\n\n font-size: var(--rel-body-sm-regular-font-size);\n\n line-height: var(--rel-body-sm-regular-line-height);\n\n letter-spacing: var(--rel-body-sm-regular-letter-spacing);\n\n }\n\n /* Error state (Figma State=Error, both Is Checked values) */\n .rel-radio-option.error-unchecked .radio-custom,\n .rel-radio-option.error-checked .radio-custom {\n border-color: var(--rel-border-danger);\n }\n\n .rel-radio-option.error-checked input:checked + .radio-custom::after {\n background: var(--rel-text-danger);\n }\n\n .rel-radio-option.error-unchecked .radio-label,\n .rel-radio-option.error-checked .radio-label {\n color: var(--rel-text-danger);\n }\n\n .rel-radio-option.error-unchecked .radio-supporting,\n .rel-radio-option.error-checked .radio-supporting {\n color: var(--rel-text-danger);\n }\n\n /* Error message below group */\n .error-message {\n color: var(--rel-text-danger);\n margin-top: var(--rel-spacing-2xs, 4px);\n\n font-family: var(--rel-body-sm-regular-font-family);\n\n font-weight: var(--rel-body-sm-regular-font-weight);\n\n font-size: var(--rel-body-sm-regular-font-size);\n\n line-height: var(--rel-body-sm-regular-line-height);\n\n letter-spacing: var(--rel-body-sm-regular-letter-spacing);\n\n }\n `;\n\n private onChange(value: string) {\n if (this.disabled) return;\n\n this.selectedValue = value;\n this.dispatchEvent(\n new CustomEvent(\"rel-change\", {\n detail: { value, checked: true },\n bubbles: true,\n composed: true,\n })\n );\n this._onChange(this.value);\n }\n\n registerOnChange(fn: (value: string) => void): void { this._onChange = fn; }\n registerOnTouched(fn: () => void): void { this._onTouched = fn; }\n writeValue(value: string): void { this.checked = value === this.value; }\n\n private get hasSelection(): boolean {\n return this.selectedValue !== null && this.selectedValue !== \"\";\n }\n\n private renderOption(option: RadioOption) {\n const isChecked = this.selectedValue === option.value;\n const isDisabled = this.disabled || option.disabled;\n const classes = [\n \"rel-radio-option\",\n isDisabled ? \"disabled\" : \"\",\n this.error && !this.hasSelection ? \"error-unchecked\" : \"\",\n this.error && isChecked ? \"error-checked\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return html`\n <label class=\"${classes}\">\n <div class=\"radio-main\">\n <input\n type=\"radio\"\n name=\"${this.name}\"\n .checked=\"${isChecked}\"\n ?disabled=\"${isDisabled}\"\n @change=\"${() => this.onChange(option.value)}\"\n @blur=\"${() => this._onTouched()}\"\n />\n <span class=\"radio-custom\"></span>\n <span part=\"label\" class=\"radio-label\">${option.label}</span>\n </div>\n\n ${option.supportingText\n ? html`<div class=\"radio-supporting\">${option.supportingText}</div>`\n : \"\"}\n </label>\n `;\n }\n\n render() {\n return html`\n <div part=\"base\" class=\"rel-radio-group\">\n ${this.options.map((o) => this.renderOption(o))}\n </div>\n ${this.error && this.errorMessage\n ? html`<div class=\"error-message\">${this.errorMessage}</div>`\n : \"\"}\n `;\n }\n}\n","import { LitElement, html } from \"lit\";\nimport { customElement, state } from \"lit/decorators.js\";\nimport { RelMenubarMenu } from \"./rel-menubar-menu\";\nimport \"@reliability-design/icons/rel-icon\";\nimport \"../rel-checkbox/rel-checkbox.js\";\nimport \"../rel-radio/rel-radio.js\";\n\ninterface MenuState {\n menu: RelMenubarMenu;\n open: boolean;\n panelElement?: HTMLElement;\n}\n\n@customElement(\"rel-menubar\")\nexport class RelMenubar extends LitElement {\n @state() private menus: MenuState[] = [];\n @state() private openMenuIndex: number = -1;\n @state() private focusedTriggerIndex: number = 0;\n @state() private focusedItemIndex: number = -1;\n @state() private openSubmenuElement: HTMLElement | null = null;\n\n private hoverSwitchEnabled = false;\n private _onScroll?: () => void;\n\n public static readonly _css = `\n /* This component renders into LIGHT DOM (createRenderRoot returns this), so\n :host / <slot> don't work here — 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 `;\n\n createRenderRoot() {\n return this;\n }\n\n connectedCallback() {\n super.connectedCallback();\n this.discoverMenus();\n document.addEventListener(\"click\", this.handleOutsideClick);\n this._onScroll = () => {\n this._repositionOpenMenu();\n this._repositionOpenSubmenu();\n };\n window.addEventListener('scroll', this._onScroll, { passive: true, capture: true });\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n document.removeEventListener(\"click\", this.handleOutsideClick);\n if (this._onScroll) {\n window.removeEventListener('scroll', this._onScroll, { capture: true });\n }\n }\n\n private _repositionOpenSubmenu() {\n if (!this.openSubmenuElement) return;\n const submenuPanel = this.querySelector('.submenu-panel.open') as HTMLElement;\n if (!submenuPanel) return;\n const trigger = this.querySelector('.menu-submenu-trigger.focused, .menu-submenu-trigger:hover') as HTMLElement\n ?? submenuPanel.previousElementSibling as HTMLElement;\n if (!trigger) return;\n const rect = trigger.getBoundingClientRect();\n submenuPanel.style.top = `${rect.top}px`;\n submenuPanel.style.left = `${rect.right + 4}px`;\n }\n\n private _repositionOpenMenu() {\n if (this.openMenuIndex === -1) return;\n const triggers = this.querySelectorAll('.menubar-trigger');\n const trigger = triggers[this.openMenuIndex] as HTMLElement;\n const panel = this.querySelector(`.menubar-panel[data-menu-index=\"${this.openMenuIndex}\"]`) as HTMLElement;\n if (!trigger || !panel) return;\n const rect = trigger.getBoundingClientRect();\n panel.style.top = `${rect.bottom + 4}px`;\n panel.style.left = `${rect.left}px`;\n }\n\n private discoverMenus() {\n const menuElements = Array.from(\n this.querySelectorAll(\"rel-menubar-menu\")\n ) as RelMenubarMenu[];\n this.menus = menuElements.map((menu) => ({ menu, open: false }));\n }\n\n private handleOutsideClick = (e: MouseEvent) => {\n // composedPath (NOT e.target): a document-level listener sees e.target\n // retargeted to the shadow host when the menubar lives inside a shadow root\n // (e.g. any consumer component), so this.contains(e.target) is false for a\n // click that is actually INSIDE the menubar — closing the menu on the very\n // click that opened it. composedPath pierces shadow boundaries.\n if (!e.composedPath().includes(this)) {\n this.closeAllMenus();\n }\n };\n\n private closeAllMenus() {\n this.openMenuIndex = -1;\n this.openSubmenuElement = null;\n this.hoverSwitchEnabled = false;\n this.requestUpdate();\n }\n\n private openMenu(index: number, triggerElement: HTMLElement) {\n this.openMenuIndex = index;\n this.focusedItemIndex = -1;\n this.openSubmenuElement = null;\n this.requestUpdate();\n\n // Position the panel below the trigger\n this.updateComplete.then(() => {\n const panel = this.querySelector(\n `.menubar-panel[data-menu-index=\"${index}\"]`\n ) as HTMLElement;\n if (panel && triggerElement) {\n const rect = triggerElement.getBoundingClientRect();\n panel.style.top = `${rect.bottom + 4}px`;\n panel.style.left = `${rect.left}px`;\n }\n });\n }\n\n private handleTriggerClick(index: number, event: Event) {\n const target = event.currentTarget as HTMLElement;\n if (this.openMenuIndex === index) {\n this.closeAllMenus();\n } else {\n this.openMenu(index, target);\n this.hoverSwitchEnabled = true;\n }\n }\n\n private handleTriggerMouseEnter(index: number, event: Event) {\n if (this.openMenuIndex !== -1 && this.hoverSwitchEnabled) {\n const target = event.currentTarget as HTMLElement;\n this.openMenu(index, target);\n }\n }\n\n private handleTriggerKeyDown(event: KeyboardEvent) {\n const { key } = event;\n\n if (key === \"ArrowRight\") {\n event.preventDefault();\n this.focusedTriggerIndex = Math.min(\n this.menus.length - 1,\n this.focusedTriggerIndex + 1\n );\n this.focusTrigger(this.focusedTriggerIndex);\n } else if (key === \"ArrowLeft\") {\n event.preventDefault();\n this.focusedTriggerIndex = Math.max(0, this.focusedTriggerIndex - 1);\n this.focusTrigger(this.focusedTriggerIndex);\n } else if (key === \"Enter\" || key === \" \") {\n event.preventDefault();\n const trigger = this.querySelector(\n `.menubar-trigger[data-index=\"${this.focusedTriggerIndex}\"]`\n ) as HTMLElement;\n if (trigger) {\n this.openMenu(this.focusedTriggerIndex, trigger);\n this.updateComplete.then(() => {\n const focusTarget = this.querySelector<HTMLElement>(\n \"[autofocus], [role='menuitem']\"\n );\n if (focusTarget) {\n focusTarget.focus();\n } else {\n this.focusMenuItem(0);\n }\n });\n }\n } else if (key === \"ArrowDown\" && this.openMenuIndex !== -1) {\n event.preventDefault();\n this.focusMenuItem(0);\n }\n }\n\n private focusTrigger(index: number) {\n const trigger = this.querySelector(\n `.menubar-trigger[data-index=\"${index}\"]`\n ) as HTMLElement;\n trigger?.focus();\n }\n\n private handlePanelKeyDown(event: KeyboardEvent) {\n const { key } = event;\n const menuContent = this.menus[this.openMenuIndex]?.menu;\n if (!menuContent) return;\n\n const items = this.getFocusableItems(menuContent);\n\n if (key === \"ArrowDown\") {\n event.preventDefault();\n this.focusedItemIndex = Math.min(items.length - 1, this.focusedItemIndex + 1);\n this.requestUpdate();\n } else if (key === \"ArrowUp\") {\n event.preventDefault();\n this.focusedItemIndex = Math.max(0, this.focusedItemIndex - 1);\n this.requestUpdate();\n } else if (key === \"ArrowRight\") {\n event.preventDefault();\n const currentItem = items[this.focusedItemIndex];\n if (currentItem?.hasAttribute(\"data-submenu\")) {\n this.openSubmenu(currentItem as HTMLElement);\n }\n } else if (key === \"ArrowLeft\") {\n event.preventDefault();\n if (this.openSubmenuElement) {\n this.openSubmenuElement = null;\n this.requestUpdate();\n }\n } else if (key === \"Escape\") {\n event.preventDefault();\n this.closeAllMenus();\n this.focusTrigger(this.openMenuIndex);\n } else if (key === \"Enter\" || key === \" \") {\n event.preventDefault();\n const currentItem = items[this.focusedItemIndex];\n if (currentItem) {\n this.handleItemClick(currentItem as HTMLElement);\n }\n }\n }\n\n private getFocusableItems(menuContent: RelMenubarMenu): Element[] {\n return Array.from(menuContent.children).filter(\n (el) =>\n el.hasAttribute(\"data-item\") ||\n el.hasAttribute(\"data-checkbox\") ||\n el.hasAttribute(\"data-radio\") ||\n el.hasAttribute(\"data-submenu\")\n );\n }\n\n private focusMenuItem(index: number) {\n this.focusedItemIndex = index;\n const panel = this.querySelector(\n `.menubar-panel[data-menu-index=\"${this.openMenuIndex}\"]`\n ) as HTMLElement;\n panel?.focus();\n }\n\n private handleItemClick(item: HTMLElement) {\n if (item.hasAttribute(\"data-checkbox\")) {\n const checkbox = item.querySelector('input[type=\"checkbox\"]') as HTMLInputElement;\n const labelText = Array.from(item.childNodes)\n .filter(n => n.nodeType === Node.TEXT_NODE)\n .map(n => n.textContent?.trim())\n .filter(Boolean)\n .join(' ') || item.getAttribute('label') || '';\n if (checkbox) {\n checkbox.checked = !checkbox.checked;\n this.dispatchChangeEvent(\"checkbox\", labelText, checkbox.checked);\n this.requestUpdate();\n }\n } else if (item.hasAttribute(\"data-radio\")) {\n const radioGroup = item.closest(\"[data-radio-group]\") as HTMLElement;\n const value = item.getAttribute(\"data-radio\") || item.getAttribute(\"value\") || \"\";\n const name = radioGroup?.getAttribute(\"name\") || \"\";\n\n // Update visual state\n const allRadios = radioGroup?.querySelectorAll(\"[data-radio]\");\n allRadios?.forEach((radio) => radio.removeAttribute(\"data-checked\"));\n item.setAttribute(\"data-checked\", \"true\");\n\n // Update internal value\n if (radioGroup) {\n radioGroup.setAttribute(\"value\", value);\n }\n\n this.dispatchChangeEvent(\"radio\", name, value);\n this.requestUpdate();\n } else if (item.hasAttribute(\"data-submenu\")) {\n this.openSubmenu(item);\n } else {\n // Regular item click\n this.closeAllMenus();\n }\n }\n\n private openSubmenu(submenuTrigger: HTMLElement, renderedTrigger?: HTMLElement, submenuIndex?: number) {\n this.openSubmenuElement = submenuTrigger;\n this.requestUpdate();\n\n this.updateComplete.then(() => {\n const submenuId = `submenu-${submenuIndex ?? 0}`;\n const submenuPanel = this.querySelector(\n `.submenu-panel[data-submenu-id=\"${submenuId}\"]`\n ) as HTMLElement;\n if (submenuPanel) {\n const positionTarget = renderedTrigger ?? submenuTrigger;\n const rect = positionTarget.getBoundingClientRect();\n submenuPanel.style.top = `${rect.top}px`;\n submenuPanel.style.left = `${rect.right + 4}px`;\n }\n });\n }\n\n private handleSubmenuItemClick(_item: HTMLElement) {\n // Regular item - just close\n this.closeAllMenus();\n }\n\n private dispatchChangeEvent(type: \"checkbox\" | \"radio\", labelOrName: string, value: string | boolean) {\n const detail =\n type === \"checkbox\"\n ? { type, label: labelOrName, name: \"\", checked: value as boolean }\n : { type, label: \"\", name: labelOrName, value: value as string };\n this.dispatchEvent(\n new CustomEvent(\"rel-menubar-change\", {\n detail,\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private renderMenuItem(item: Element, index: number): any {\n const isFocused = index === this.focusedItemIndex;\n\n if (item.hasAttribute(\"data-item\")) {\n const button = item as HTMLButtonElement;\n const disabled = button.disabled;\n const shortcut = button.getAttribute(\"data-shortcut\") || \"\";\n\n return html`\n <div\n class=\"menu-item ${isFocused ? \"focused\" : \"\"}\"\n data-disabled=\"${disabled}\"\n @click=\"${() => !disabled && this.handleItemClick(item as HTMLElement)}\"\n >\n <span>${button.textContent}</span>\n ${shortcut ? html`<span class=\"menu-shortcut\">${shortcut}</span>` : \"\"}\n </div>\n `;\n }\n\n if (item.hasAttribute(\"data-separator\")) {\n return html`<div class=\"menu-separator\"></div>`;\n }\n\n if (item.hasAttribute(\"data-checkbox\")) {\n const label = item as HTMLLabelElement;\n const checkbox = label.querySelector('input[type=\"checkbox\"]') as HTMLInputElement;\n const labelText = Array.from(label.childNodes)\n .filter(n => n.nodeType === Node.TEXT_NODE)\n .map(n => n.textContent?.trim())\n .filter(Boolean)\n .join(' ') || label.getAttribute('label') || '';\n\n return html`\n <rel-checkbox\n label=${labelText}\n .status=${checkbox?.checked ? \"checked\" : \"unchecked\"}\n @rel-change=${(e: CustomEvent) => {\n if (checkbox) checkbox.checked = e.detail.checked;\n this.dispatchChangeEvent(\"checkbox\", labelText, e.detail.checked);\n }}\n ></rel-checkbox>\n `;\n }\n\n if (item.hasAttribute(\"data-submenu\")) {\n const label = item.getAttribute(\"label\") || item.textContent?.trim() || \"\";\n const submenuId = `submenu-${index}`;\n\n return html`\n <div\n class=\"menu-item menu-submenu-trigger ${isFocused ? \"focused\" : \"\"}\"\n @click=\"${(e: Event) => this.openSubmenu(item as HTMLElement, e.currentTarget as HTMLElement, index)}\"\n @mouseenter=\"${(e: Event) => this.openSubmenu(item as HTMLElement, e.currentTarget as HTMLElement, index)}\"\n >\n <span>${label}</span>\n <rel-icon name=\"chevron-right\"></rel-icon>\n </div>\n ${this.renderSubmenu(item as HTMLElement, submenuId)}\n `;\n }\n\n if (item.hasAttribute(\"data-radio-group\")) {\n const radioButtons = Array.from(item.querySelectorAll(\"[data-radio]\"));\n const currentValue = item.getAttribute(\"value\") || \"\";\n const groupName = item.getAttribute(\"name\") || \"\";\n\n const options = radioButtons.map(radio => ({\n label: radio.textContent?.trim() || \"\",\n value: radio.getAttribute(\"data-radio\") || radio.getAttribute(\"value\") || \"\",\n }));\n\n return html`\n <rel-radio\n .options=${options}\n .value=${currentValue}\n @rel-change=${(e: CustomEvent) => {\n const newValue = e.detail.value;\n item.setAttribute(\"value\", newValue);\n this.dispatchChangeEvent(\"radio\", groupName, newValue);\n }}\n ></rel-radio>\n `;\n }\n\n return null;\n }\n\n private renderSubmenu(submenuElement: HTMLElement, submenuId: string) {\n const isOpen = this.openSubmenuElement === submenuElement;\n const submenuItems = Array.from(submenuElement.children);\n\n return html`\n <div class=\"submenu-panel ${isOpen ? \"open\" : \"\"}\" data-submenu-id=\"${submenuId}\">\n ${submenuItems.map((subItem) => {\n if (subItem.hasAttribute(\"data-item\")) {\n const button = subItem as HTMLButtonElement;\n return html`\n <div\n class=\"menu-item\"\n @click=\"${() => this.handleSubmenuItemClick(subItem as HTMLElement)}\"\n >\n <span>${button.textContent}</span>\n </div>\n `;\n }\n return null;\n })}\n </div>\n `;\n }\n\n private renderMenuPanel(menuState: MenuState, index: number) {\n const isOpen = index === this.openMenuIndex;\n const items = Array.from(menuState.menu.children);\n\n return html`\n <div\n class=\"menubar-panel ${isOpen ? \"open\" : \"\"}\"\n data-menu-index=\"${index}\"\n tabindex=\"-1\"\n @keydown=\"${this.handlePanelKeyDown}\"\n >\n ${items.map((item, idx) => this.renderMenuItem(item, idx))}\n </div>\n `;\n }\n\n render() {\n return html`\n <style>${RelMenubar._css}</style>\n <div class=\"menubar-container\">\n ${this.menus.map(\n (menuState, index) => html`\n <button\n class=\"menubar-trigger ${index === this.openMenuIndex ? \"active\" : \"\"}\"\n data-index=\"${index}\"\n @click=\"${(e: Event) => this.handleTriggerClick(index, e)}\"\n @mouseenter=\"${(e: Event) => this.handleTriggerMouseEnter(index, e)}\"\n @keydown=\"${this.handleTriggerKeyDown}\"\n >\n ${menuState.menu.label}\n </button>\n `\n )}\n </div>\n ${this.menus.map((menuState, index) => this.renderMenuPanel(menuState, index))}\n `;\n }\n}\n","import { LitElement, html } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\nimport \"./rel-menubar-menu.css\";\r\n\r\n@customElement(\"rel-menubar-menu\")\r\nexport class RelMenubarMenu extends LitElement {\r\n @property({ type: String }) label = \"\";\r\n\r\n // Disable shadow DOM to allow parent to access children\r\n createRenderRoot() {\r\n return this;\r\n }\r\n\r\n render() {\r\n return html``;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\r\n/**\r\n * @deprecated rel-navbar is deprecated and will be removed in a future release.\r\n * Use rel-topbar and its sub-components instead:\r\n * rel-topbar, rel-topbar-brand, rel-topbar-actions, rel-topbar-utilities,\r\n * rel-topbar-item, rel-topbar-dropdown, rel-topbar-dropdown-item\r\n */\r\n@customElement(\"rel-navbar\")\r\nexport class RelNavbar extends LitElement {\r\n constructor() {\r\n super();\r\n console.warn(\r\n \"[rel-navbar] rel-navbar is deprecated. Use rel-topbar instead.\"\r\n );\r\n }\r\n\r\n @property({ type: Boolean, reflect: true })\r\n sticky = false;\r\n\r\n @property({ type: String })\r\n device: \"desktop\" | \"tablet\" | \"mobile\" = \"desktop\";\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n display: block;\r\n width: 100%;\r\n }\r\n\r\n :host([sticky]) .navbar {\r\n position: sticky;\r\n top: 0;\r\n z-index: 100;\r\n }\r\n\r\n .navbar {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n background: var(--rel-bg-surface);\r\n color: var(--rel-text-default);\r\n border-bottom: 1px solid var(--rel-border-default);\r\n height: 64px;\r\n padding: 0 var(--rel-spacing-lg);\r\n box-sizing: border-box;\r\n font-family: var(--rel-fonts-font-family, sans-serif);\r\n }\r\n\r\n .brand {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-md);\r\n flex-shrink: 0;\r\n }\r\n\r\n .content {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-sm);\r\n flex: 1;\r\n justify-content: flex-start;\r\n padding: 0 var(--rel-spacing-xl);\r\n }\r\n\r\n .actions {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-sm);\r\n flex-shrink: 0;\r\n }\r\n\r\n /* Mobile/Tablet variants */\r\n :host([device=\"tablet\"]) .navbar {\r\n height: 56px;\r\n padding: 0 var(--rel-spacing-md);\r\n }\r\n\r\n :host([device=\"mobile\"]) .navbar {\r\n height: 56px;\r\n padding: 0 var(--rel-spacing-sm);\r\n }\r\n\r\n :host([device=\"mobile\"]) .content {\r\n display: none;\r\n }\r\n `;\r\n\r\n render() {\r\n return html`\r\n <div class=\"navbar\" part=\"container\" role=\"navigation\">\r\n <div part=\"brand\" class=\"brand\">\r\n <slot name=\"brand\"></slot>\r\n </div>\r\n <div part=\"content\" class=\"content\">\r\n <slot></slot>\r\n </div>\r\n <div part=\"actions\" class=\"actions\">\r\n <slot name=\"actions\"></slot>\r\n </div>\r\n </div>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property, state } from \"lit/decorators.js\";\r\nimport \"@reliability-design/icons/rel-icon\";\r\nimport \"./rel-topbar-brand\";\r\nimport \"./rel-topbar-actions\";\r\nimport \"./rel-topbar-utilities\";\r\nimport \"./rel-topbar-mobile-panel\";\r\nimport \"./rel-topbar-dropdown\";\r\nimport \"./rel-topbar-dropdown-item\";\r\n\r\nexport type TopbarVariant = \"customer\" | \"carrier\";\r\nexport type TopbarForceLayout = \"auto\" | \"desktop\" | \"tablet\" | \"mobile\";\r\n\r\n/**\r\n * `rel-topbar` — Application-level top navigation / header shell.\r\n *\r\n * @deprecated This component's fixed slot structure, hardcoded breakpoint,\r\n * and built-in overflow logic are too rigid for most real layouts. Use the\r\n * \"App Topbar\" recipe at /docs/recipes/app-topbar instead, composed from\r\n * rel-menu/rel-popover, rel-drawer, and rel-button. Still supported, but\r\n * will be removed in a future major version.\r\n *\r\n * Slots:\r\n * brand — Logo / wordmark region (left)\r\n * (default) — Primary nav items (rel-topbar-item elements)\r\n * actions — CTA / action buttons (customer) or dark-pill area (carrier)\r\n * utilities — Utility icon buttons (notifications, search, etc.)\r\n * profile — rel-topbar-profile tile\r\n * mobile-panel — Collapsed nav panel shown when mobileOpen is true\r\n *\r\n * Events:\r\n * rel-menu-toggle — fired when hamburger is clicked { open: boolean }\r\n * rel-mobile-open-change — alias of rel-menu-toggle for convenience\r\n * rel-nav-select — bubbled from child rel-topbar-item { value, label }\r\n */\r\n@customElement(\"rel-topbar\")\r\nexport class RelTopbar extends LitElement {\r\n /** Visual variant — affects action/profile region styling */\r\n @property({ type: String, reflect: true }) variant: TopbarVariant = \"customer\";\r\n\r\n /** Whether the mobile nav panel is currently open */\r\n @property({ type: Boolean, reflect: true }) mobileOpen = false;\r\n\r\n /** Whether to render the hamburger / close toggle button */\r\n @property({ type: Boolean, reflect: true }) showMenuToggle = false;\r\n\r\n /** Reduce height to compact (48 px) mode */\r\n @property({ type: Boolean, reflect: true }) compact = false;\r\n\r\n /** Stick topbar to top of viewport while scrolling */\r\n @property({ type: Boolean, reflect: true }) sticky = false;\r\n\r\n /**\r\n * Override the responsive layout for demos / storybook.\r\n * 'auto' respects CSS media queries.\r\n */\r\n @property({ type: String }) forceLayout: TopbarForceLayout = \"auto\";\r\n\r\n private _overflowItems: Element[] = [];\r\n @state() private _overflowCount: number = 0;\r\n @state() private _overflowItemsData: Array<{ label: string; href: string; disabled: boolean }> = [];\r\n private _resizeObserver?: ResizeObserver;\r\n private _resizeTimer?: number;\r\n private _measuring = false;\r\n private _lastNavWidth = 0;\r\n\r\n static styles = css`\r\n /* ─── Component tokens ─────────────────────────────────────────── */\r\n :host {\r\n color: var(--rel-text-default);\r\n --rel-topbar-height: 64px;\r\n --rel-topbar-height-compact: 48px;\r\n --rel-topbar-bg: var(--rel-bg-surface);\r\n --rel-topbar-border-color: var(--rel-border-default);\r\n --rel-topbar-item-color: var(--rel-text-default);\r\n --rel-topbar-item-active-color: var(--rel-text-success);\r\n --rel-topbar-item-active-indicator: var(--rel-bg-brand);\r\n --rel-topbar-item-hover-bg: var(--rel-bg-surface-elevated);\r\n --rel-topbar-divider-color: var(--rel-border-default);\r\n --rel-topbar-carrier-action-bg: var(--rel-text-default);\r\n --rel-topbar-carrier-action-color: var(--rel-bg-surface);\r\n --rel-topbar-z: 100;\r\n\r\n display: block;\r\n width: 100%;\r\n font-family: var(--rel-fonts-font-family, Poppins, sans-serif);\r\n }\r\n\r\n /* ─── Sticky host ───────────────────────────────────────────────── */\r\n :host([sticky]) {\r\n position: sticky;\r\n top: 0;\r\n z-index: var(--rel-topbar-z);\r\n }\r\n\r\n /* ─── Bar shell ─────────────────────────────────────────────────── */\r\n .topbar {\r\n display: flex;\r\n align-items: center;\r\n height: var(--rel-topbar-height);\r\n background: var(--rel-topbar-bg);\r\n border-bottom: var(--rel-stroke-sm, 1px) solid var(--rel-topbar-border-color);\r\n padding: 0 var(--rel-spacing-xl, 24px);\r\n box-sizing: border-box;\r\n gap: var(--rel-spacing-md, 16px);\r\n }\r\n\r\n :host([compact]) .topbar {\r\n height: var(--rel-topbar-height-compact);\r\n }\r\n\r\n /* ─── Brand ─────────────────────────────────────────────────────── */\r\n .brand-region {\r\n display: flex;\r\n align-items: center;\r\n flex-shrink: 0;\r\n }\r\n\r\n /* ─── Nav (primary, desktop) ────────────────────────────────────── */\r\n .nav-region {\r\n display: flex;\r\n align-items: center;\r\n flex: 1 1 0;\r\n gap: var(--rel-spacing-2xs, 4px);\r\n min-width: 0;\r\n }\r\n\r\n /* ─── Right side cluster ────────────────────────────────────────── */\r\n .right-region {\r\n display: flex;\r\n align-items: center;\r\n flex-shrink: 0;\r\n margin-left: auto;\r\n gap: var(--rel-spacing-xs, 8px);\r\n }\r\n\r\n .actions-region,\r\n .utilities-region,\r\n .profile-region {\r\n display: contents;\r\n }\r\n\r\n /* Vertical divider between util/profile when both are populated */\r\n .divider {\r\n width: var(--rel-stroke-sm, 1px);\r\n height: 24px;\r\n background: var(--rel-topbar-divider-color);\r\n flex-shrink: 0;\r\n }\r\n\r\n /* ─── Carrier action pill wrapper ───────────────────────────────── */\r\n :host([variant=\"carrier\"]) .actions-region ::slotted(*) {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-xs, 8px);\r\n background: var(--rel-topbar-carrier-action-bg);\r\n color: var(--rel-topbar-carrier-action-color);\r\n padding: var(--rel-spacing-2xs, 4px) var(--rel-spacing-sm, 12px);\r\n border-radius: var(--rel-border-radius-full-rounded, 1000px);\r\n }\r\n\r\n /* ─── Mobile toggle button ──────────────────────────────────────── */\r\n .menu-toggle {\r\n display: none;\r\n align-items: center;\r\n justify-content: center;\r\n width: 40px;\r\n height: 40px;\r\n padding: 0;\r\n border: none;\r\n background: transparent;\r\n border-radius: var(--rel-border-radius-sm, 8px);\r\n cursor: pointer;\r\n color: var(--rel-topbar-item-color);\r\n flex-shrink: 0;\r\n }\r\n\r\n .menu-toggle:focus-visible {\r\n outline: 2px solid var(--rel-topbar-item-active-indicator);\r\n outline-offset: 2px;\r\n }\r\n\r\n .menu-toggle:hover {\r\n background: var(--rel-topbar-item-hover-bg);\r\n }\r\n\r\n .menu-toggle svg {\r\n display: block;\r\n }\r\n\r\n /* ─── Mobile panel ──────────────────────────────────────────────── */\r\n .mobile-panel {\r\n display: none;\r\n background: var(--rel-topbar-bg);\r\n border-bottom: var(--rel-stroke-sm, 1px) solid var(--rel-topbar-border-color);\r\n }\r\n\r\n .mobile-panel.open {\r\n display: block;\r\n }\r\n\r\n .mobile-overflow-nav {\r\n display: flex;\r\n flex-direction: column;\r\n padding: var(--rel-spacing-xs, 8px) 0;\r\n border-top: 1px solid var(--rel-topbar-border-color);\r\n }\r\n\r\n .mobile-overflow-item {\r\n display: block;\r\n padding: var(--rel-spacing-xs, 8px) var(--rel-spacing-xl, 24px);\r\n color: var(--rel-topbar-item-color);\r\r\r\r\n text-decoration: none;\n font-family: var(--rel-body-md-medium-font-family);\n font-weight: var(--rel-body-md-medium-font-weight);\n font-size: var(--rel-body-md-medium-font-size);\n line-height: var(--rel-body-md-medium-line-height);\n letter-spacing: var(--rel-body-md-medium-letter-spacing);\n }\r\n\r\n .mobile-overflow-item:hover {\r\n background: var(--rel-topbar-item-hover-bg);\r\n }\r\n\r\n .mobile-overflow-item.disabled {\r\n opacity: 0.45;\r\n pointer-events: none;\r\n }\r\n\r\n /* ─── Responsive: auto mode (CSS media queries) ─────────────────── */\r\n @media (max-width: 768px) {\r\n .topbar:not(.force-desktop) .nav-region {\r\n display: none;\r\n }\r\n\r\n .topbar:not(.force-desktop) .menu-toggle {\r\n display: flex;\r\n }\r\n }\r\n\r\n @media (min-width: 769px) {\r\n .topbar:not(.force-mobile):not(.force-tablet) .menu-toggle {\r\n display: none;\r\n }\r\n }\r\n\r\n /* ─── forceLayout overrides ─────────────────────────────────────── */\r\n .topbar.force-mobile .nav-region,\r\n .topbar.force-tablet .nav-region {\r\n display: none;\r\n }\r\n\r\n .topbar.force-mobile .menu-toggle,\r\n .topbar.force-tablet .menu-toggle {\r\n display: flex;\r\n }\r\n\r\n .topbar.force-desktop .nav-region {\r\n display: flex;\r\n }\r\n\r\n .topbar.force-desktop .menu-toggle {\r\n display: none;\r\n }\r\n `;\r\n\r\n override firstUpdated() {\r\n const navRegion = this.renderRoot.querySelector(\".nav-region\") as HTMLElement;\r\n if (navRegion) {\r\n this._resizeObserver = new ResizeObserver(() => {\r\n clearTimeout(this._resizeTimer);\r\n this._resizeTimer = window.setTimeout(() => this._measureNav(), 150);\r\n });\r\n this._resizeObserver.observe(navRegion);\r\n }\r\n requestAnimationFrame(() => this._measureNav());\r\n }\r\n\r\n override disconnectedCallback() {\r\n super.disconnectedCallback();\r\n this._resizeObserver?.disconnect();\r\n clearTimeout(this._resizeTimer);\r\n }\r\n\r\n private _measureNav() {\r\n if (this._measuring) return;\r\n this._measuring = true;\r\n const navRegion = this.renderRoot.querySelector(\".nav-region\") as HTMLElement;\r\n if (!navRegion) return;\r\n const navSlot = this.renderRoot.querySelector('slot[name=\"nav\"]') as HTMLSlotElement;\r\n if (!navSlot) return;\r\n const items = Array.from(navSlot.assignedElements()).filter(\r\n el => el.tagName.toLowerCase() !== \"rel-topbar-item\" || !el.hasAttribute(\"data-more\")\r\n );\r\n const navWidth = navRegion.getBoundingClientRect().width;\r\n if (Math.abs(navWidth - this._lastNavWidth) < 2) return;\r\n this._lastNavWidth = navWidth;\r\n const available = navWidth - 120;\r\n\r\n let accumulated = 0;\r\n let firstOverflowIndex = items.length;\r\n for (let i = 0; i < items.length; i++) {\r\n accumulated += items[i].getBoundingClientRect().width;\r\n if (accumulated > available) {\r\n firstOverflowIndex = i;\r\n break;\r\n }\r\n }\r\n\r\n const overflowingElements = Array.from(items).slice(firstOverflowIndex);\r\n this._overflowItems = overflowingElements;\r\n this._overflowCount = overflowingElements.length;\r\n this._overflowItemsData = overflowingElements.map(el => ({\r\n label: el.getAttribute(\"label\") ?? \"\",\r\n href: el.getAttribute(\"href\") ?? \"\",\r\n disabled: el.hasAttribute(\"disabled\"),\r\n }));\r\n\r\n for (const el of items) {\r\n if (overflowingElements.includes(el)) {\r\n el.setAttribute(\"hidden\", \"\");\r\n } else {\r\n el.removeAttribute(\"hidden\");\r\n }\r\n }\r\n\r\n this._measuring = false;\r\n }\r\n\r\n private onRouterSlotChange(e: Event) {\r\n const slot = e.target as HTMLSlotElement;\r\n for (const el of slot.assignedElements({ flatten: true })) {\r\n const tag = (el as HTMLElement).tagName.toLowerCase();\r\n const targetSlot =\r\n tag === \"rel-topbar-brand\" ? \"brand\" :\r\n tag === \"rel-topbar-actions\" ? \"actions\" :\r\n tag === \"rel-topbar-utilities\" ? \"utilities\" :\r\n tag === \"rel-topbar-profile\" ? \"profile\" :\r\n tag === \"rel-topbar-mobile-panel\" ? \"mobile-panel\" :\r\n \"nav\";\r\n if ((el as HTMLElement).slot !== targetSlot) {\r\n (el as HTMLElement).slot = targetSlot;\r\n }\r\n }\r\n }\r\n\r\n private get layoutClass(): string {\r\n if (this.forceLayout === \"auto\") return \"\";\r\n return `force-${this.forceLayout}`;\r\n }\r\n\r\n private handleMenuToggle() {\r\n this.mobileOpen = !this.mobileOpen;\r\n const detail = { open: this.mobileOpen };\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-menu-toggle\", { detail, bubbles: true, composed: true })\r\n );\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-mobile-open-change\", { detail, bubbles: true, composed: true })\r\n );\r\n }\r\n\r\n render() {\r\n const topbarClass = [\"topbar\", this.layoutClass].filter(Boolean).join(\" \");\r\n const menuLabel = this.mobileOpen ? \"Close menu\" : \"Open menu\";\r\n\r\n return html`\r\n <!-- router: auto-assigns slot names by tagName; stays empty after redistribution -->\r\n <slot style=\"display:none\" @slotchange=${this.onRouterSlotChange}></slot>\r\n\r\n <header>\r\n <div class=${topbarClass} role=\"banner\">\r\n <div class=\"brand-region\">\r\n <slot name=\"brand\"></slot>\r\n </div>\r\n\r\n <nav class=\"nav-region\" aria-label=\"Primary\">\r\n <slot name=\"nav\" @slotchange=${this._measureNav}></slot>\r\n ${this._overflowCount > 0 ? html`\r\n <rel-topbar-item label=\"More\" expandable data-more>\r\n <rel-topbar-dropdown slot=\"dropdown\">\r\n ${this._overflowItemsData.map(item => html`\r\n <rel-topbar-dropdown-item\r\n label=${item.label}\r\n href=${item.href}\r\n ?disabled=${item.disabled}\r\n ></rel-topbar-dropdown-item>\r\n `)}\r\n </rel-topbar-dropdown>\r\n </rel-topbar-item>\r\n ` : null}\r\n </nav>\r\n\r\n <div class=\"right-region\">\r\n <div class=\"actions-region\">\r\n <slot name=\"actions\"></slot>\r\n </div>\r\n <div class=\"utilities-region\">\r\n <slot name=\"utilities\"></slot>\r\n </div>\r\n <div class=\"profile-region\">\r\n <slot name=\"profile\"></slot>\r\n </div>\r\n\r\n ${this.showMenuToggle\r\n ? html`\r\n <button\r\n class=\"menu-toggle\"\r\n aria-label=${menuLabel}\r\n aria-expanded=${this.mobileOpen}\r\n aria-controls=\"mobile-panel\"\r\n @click=${this.handleMenuToggle}\r\n >\r\n ${this.mobileOpen\r\n ? html`<rel-icon name=\"close\" size=\"md\"></rel-icon>`\r\n : html`<rel-icon name=\"hamburger\" size=\"md\"></rel-icon>`}\r\n </button>\r\n `\r\n : null}\r\n </div>\r\n </div>\r\n </header>\r\n\r\n <div\r\n class=\"mobile-panel ${this.mobileOpen ? \"open\" : \"\"}\"\r\n id=\"mobile-panel\"\r\n role=\"region\"\r\n aria-label=\"Mobile navigation\"\r\n >\r\n <slot name=\"mobile-panel\"></slot>\r\n ${this._overflowItemsData.length > 0 ? html`\r\n <div class=\"mobile-overflow-nav\">\r\n ${this._overflowItemsData.map(item => html`\r\n <a\r\n class=\"mobile-overflow-item ${item.disabled ? \"disabled\" : \"\"}\"\r\n href=${item.href}\r\n ?aria-disabled=${item.disabled}\r\n >${item.label}</a>\r\n `)}\r\n </div>\r\n ` : null}\r\n </div>\r\n `;\r\n }\r\n}\r\n\r\n","import { LitElement, html, css } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\n\n/**\n * @deprecated Part of the deprecated rel-topbar family. Use a plain\n * `<a>`/logo markup inside the \"App Topbar\" recipe at /docs/recipes/app-topbar.\n */\n@customElement(\"rel-topbar-brand\")\nexport class RelTopbarBrand extends LitElement {\n @property({ type: String }) src: string = \"\";\n @property({ type: String }) href: string = \"/\";\n @property({ type: String }) label: string = \"\";\n\n static styles = css`\n :host {\n color: var(--rel-text-default);\n display: inline-flex;\n align-items: center;\n }\n\n a {\n display: inline-flex;\n align-items: center;\n gap: var(--rel-spacing-xs);\n text-decoration: none;\n color: var(--rel-text-default);\n font-family: var(--rel-body-md-semibold-font-family);\n font-weight: var(--rel-body-md-semibold-font-weight);\n font-size: var(--rel-body-md-semibold-font-size);\n line-height: var(--rel-body-md-semibold-line-height);\n letter-spacing: var(--rel-body-md-semibold-letter-spacing);\n }\n\n img {\n display: block;\n }\n `;\n\n render() {\n return html`\n <a href=\"${this.href}\" aria-label=\"${this.label || \"Home\"}\">\n ${this.src\n ? html`<img src=\"${this.src}\" alt=\"${this.label}\" />`\n : html`<slot>${this.label}</slot>`}\n </a>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"rel-topbar-brand\": RelTopbarBrand;\n }\n}\n","import { LitElement, html, css } from \"lit\";\nimport { customElement } from \"lit/decorators.js\";\n\n/**\n * @deprecated Part of the deprecated rel-topbar family. Use plain\n * `rel-button` elements inside the \"App Topbar\" recipe at /docs/recipes/app-topbar.\n */\n@customElement(\"rel-topbar-actions\")\nexport class RelTopbarActions extends LitElement {\n static styles = css`\n .actions {\n display: inline-flex;\n align-items: center;\n gap: var(--rel-spacing-xs, 8px);\n }\n `;\n\n render() {\n return html`<div class=\"actions\"><slot></slot></div>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"rel-topbar-actions\": RelTopbarActions;\n }\n}\n","import { LitElement, html, css } from \"lit\";\nimport { customElement } from \"lit/decorators.js\";\n\n/**\n * @deprecated Part of the deprecated rel-topbar family. Use plain\n * `rel-button` (icon variant) elements inside the \"App Topbar\" recipe at /docs/recipes/app-topbar.\n */\n@customElement(\"rel-topbar-utilities\")\nexport class RelTopbarUtilities extends LitElement {\n static styles = css`\n .utilities {\n display: inline-flex;\n align-items: center;\n gap: var(--rel-spacing-xs, 8px);\n }\n `;\n\n render() {\n return html`<div class=\"utilities\"><slot></slot></div>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"rel-topbar-utilities\": RelTopbarUtilities;\n }\n}\n","import { LitElement, html, css } from \"lit\";\nimport { customElement } from \"lit/decorators.js\";\n\n/**\n * @deprecated Part of the deprecated rel-topbar family. Use `rel-drawer`\n * for the mobile nav panel in the \"App Topbar\" recipe at /docs/recipes/app-topbar.\n */\n@customElement(\"rel-topbar-mobile-panel\")\nexport class RelTopbarMobilePanel extends LitElement {\n static styles = css`\n .mobile-panel {\n display: flex;\n flex-direction: column;\n width: 100%;\n }\n `;\n\n render() {\n return html`<div class=\"mobile-panel\"><slot></slot></div>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"rel-topbar-mobile-panel\": RelTopbarMobilePanel;\n }\n}\n","import { LitElement, html, css } from \"lit\";\nimport { customElement } from \"lit/decorators.js\";\n\n/**\n * @deprecated Part of the deprecated rel-topbar family. Use `rel-menu` or\n * `rel-popover` for nav dropdowns in the \"App Topbar\" recipe at /docs/recipes/app-topbar.\n */\n@customElement(\"rel-topbar-dropdown\")\nexport class RelTopbarDropdown extends LitElement {\n static styles = css`\n .dropdown {\n display: flex;\n flex-direction: column;\n min-width: 160px;\n background: var(--rel-bg-surface);\n border-radius: var(--rel-border-radius-sm);\n box-shadow: var(--rel-shadows-shadow-200);\n padding: var(--rel-spacing-2xs) 0;\n }\n `;\n\n render() {\n return html`<div class=\"dropdown\"><slot></slot></div>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"rel-topbar-dropdown\": RelTopbarDropdown;\n }\n}\n","import { LitElement, html, css } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\n\n/**\n * @deprecated Part of the deprecated rel-topbar family. Use `rel-menu`'s\n * item slots or `rel-popover` content in the \"App Topbar\" recipe at /docs/recipes/app-topbar.\n */\n@customElement(\"rel-topbar-dropdown-item\")\nexport class RelTopbarDropdownItem extends LitElement {\n @property({ type: String }) label: string = \"\";\n @property({ type: String }) href: string = \"#\";\n @property({ type: Boolean, reflect: true }) active = false;\n\n static styles = css`\n .dropdown-item {\n display: block;\n padding: var(--rel-spacing-xs, 8px) var(--rel-spacing-md, 16px);\n color: var(--rel-text-default);\n text-decoration: none;\n font-family: var(--rel-body-md-regular-font-family);\n font-weight: var(--rel-body-md-regular-font-weight);\n font-size: var(--rel-body-md-regular-font-size);\n line-height: var(--rel-body-md-regular-line-height);\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\n }\n\n .dropdown-item:hover {\n background: var(--rel-action-overlay-hover);\n border-radius: 0;\n }\n\n :host([active]) .dropdown-item {\n color: var(--rel-topbar-item-active-color, var(--rel-text-success));\n font-weight: var(--rel-fonts-weight-body-semibold, 600);\n }\n\n `;\n\n private _handleClick(e: MouseEvent) {\n if (this.hasAttribute(\"disabled\")) {\n e.preventDefault();\n return;\n }\n e.preventDefault();\n this.dispatchEvent(new CustomEvent(\"rel-select\", {\n detail: { value: this.href, label: this.label },\n bubbles: true,\n composed: true,\n }));\n this.dispatchEvent(new CustomEvent(\"rel-nav-select\", {\n detail: { value: this.href, label: this.label },\n bubbles: true,\n composed: true,\n }));\n this.active = true;\n const siblings = this.parentElement?.querySelectorAll(\"rel-topbar-dropdown-item\");\n siblings?.forEach(s => { if (s !== this) (s as any).active = false; });\n }\n\n render() {\n return html`<a href=\"${this.href}\" class=\"dropdown-item\" @click=${this._handleClick}>${this.label}</a>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"rel-topbar-dropdown-item\": RelTopbarDropdownItem;\n }\n}\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property, state } from \"lit/decorators.js\";\r\nimport \"./rel-topbar-dropdown\";\r\nimport \"./rel-topbar-dropdown-item\";\r\nimport \"@reliability-design/icons/rel-icon\";\r\n\r\n/**\r\n * `rel-topbar-item` — A navigation item within rel-topbar.\r\n *\r\n * @deprecated Part of the deprecated rel-topbar family. Use the \"App\r\n * Topbar\" recipe at /docs/recipes/app-topbar, which composes nav links and\r\n * `rel-menu`/`rel-popover` dropdowns directly instead of a dedicated item component.\r\n *\r\n * Renders as an `<a>` when `href` is supplied, otherwise a `<button>`.\r\n *\r\n * Slots:\r\n * (default) — Label text / icon (overrides `label` property)\r\n * prefix — Icon/content before the label\r\n * suffix — Icon/content after the label (e.g. badge)\r\n * dropdown — Expandable panel content shown below the item\r\n *\r\n * Events:\r\n * rel-select — fired when a non-disabled, non-expandable item is activated\r\n * rel-toggle — fired when an expandable item is opened/closed { open: boolean }\r\n */\r\n@customElement(\"rel-topbar-item\")\r\nexport class RelTopbarItem extends LitElement {\r\n /** Accessible label — also shown as text when no default slot content */\r\n @property({ type: String }) label?: string;\r\n\r\n /** Navigation href — renders an anchor element when set */\r\n @property({ type: String }) href?: string;\r\n\r\n /** Marks this item as the current/active page */\r\n @property({ type: Boolean, reflect: true }) active = false;\r\n\r\n /** Prevents interaction */\r\n @property({ type: Boolean, reflect: true }) disabled = false;\r\n\r\n /** Shows a chevron and enables dropdown panel */\r\n @property({ type: Boolean, reflect: true }) expandable = false;\r\n\r\n /** Controlled open state of the dropdown panel */\r\n @property({ type: Boolean, reflect: true }) open = false;\r\n\r\n /** Optional string value forwarded in rel-select / rel-toggle events */\r\n @property({ type: String }) value?: string;\r\n\r\n /** @internal tracks whether dropdown slot has content */\r\n @state() private _hasDropdown = false;\r\n\r\n static styles = css`\r\n /* ─── Component tokens ──────────────────────────────────────────── */\r\n :host {\r\n color: var(--rel-text-default);\r\n --_item-color: var(--rel-topbar-item-color, var(--rel-text-default));\r\n --_item-active-color: var(--rel-topbar-item-active-color, var(--rel-text-success));\r\n --_item-active-indicator: var(--rel-topbar-item-active-indicator, var(--rel-bg-brand));\r\n --_item-hover-bg: var(--rel-topbar-item-hover-bg, var(--rel-bg-surface-elevated));\r\n\r\n display: inline-block;\r\n position: relative;\r\n font-family: var(--rel-fonts-font-family, Poppins, sans-serif);\r\n }\r\n\r\n :host([hidden]) {\r\n display: none !important;\r\n }\r\n\r\n /* ─── Trigger (shared for <a> and <button>) ─────────────────────── */\r\n .trigger {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-2xs, 4px);\r\n padding: var(--rel-spacing-xs, 8px) var(--rel-spacing-sm, 12px);\r\n border: none;\r\n background: transparent;\r\n border-radius: var(--rel-border-radius-sm, 8px);\r\n cursor: pointer;\r\n color: var(--_item-color);\r\r\r\r\r\n text-decoration: none;\r\n white-space: nowrap;\r\n position: relative;\r\n transition: background 0.15s ease, color 0.15s ease;\r\n box-sizing: border-box;\n font-family: var(--rel-body-md-medium-font-family);\n font-weight: var(--rel-body-md-medium-font-weight);\n font-size: var(--rel-body-md-medium-font-size);\n line-height: var(--rel-body-md-medium-line-height);\n letter-spacing: var(--rel-body-md-medium-letter-spacing);\n }\r\n\r\n .trigger::after {\r\n content: \"\";\r\n position: absolute;\r\n bottom: -2px;\r\n left: var(--rel-spacing-sm, 12px);\r\n right: var(--rel-spacing-sm, 12px);\r\n height: 2px;\r\n border-radius: 1px;\r\n background: transparent;\r\n transition: background 0.15s ease;\r\n }\r\n\r\n /* Active state */\r\n :host([active]) .trigger {\r\n color: var(--_item-active-color);\r\n font-weight: var(--rel-fonts-weight-body-semibold, 600);\r\n }\r\n\r\n :host([active]) .trigger::after {\r\n background: var(--_item-active-indicator);\r\n }\r\n\r\n /* Hover */\r\n .trigger:hover:not(:disabled) {\r\n background: var(--_item-hover-bg);\r\n }\r\n\r\n /* Focus */\r\n .trigger:focus-visible {\r\n outline: 2px solid var(--_item-active-indicator);\r\n outline-offset: 2px;\r\n }\r\n\r\n /* Disabled */\r\n :host([disabled]) {\r\n cursor: not-allowed;\r\n }\r\n\r\n :host([disabled]) .trigger {\r\n opacity: 0.45;\r\n cursor: not-allowed;\r\n pointer-events: none;\r\n }\r\n\r\n /* Open state (expandable) */\r\n :host([open]) .trigger {\r\n background: var(--_item-hover-bg);\r\n }\r\n\r\n /* ─── Prefix / suffix slots ─────────────────────────────────────── */\r\n .prefix,\r\n .suffix {\r\n display: contents;\r\n }\r\n\r\n /* ─── Chevron icon ──────────────────────────────────────────────── */\r\n .chevron {\r\n display: inline-flex;\r\n align-items: center;\r\n flex-shrink: 0;\r\n transition: transform 0.2s ease;\r\n color: inherit;\r\n }\r\n\r\n :host([open]) .chevron {\r\n transform: rotate(180deg);\r\n }\r\n\r\n /* ─── Dropdown panel ────────────────────────────────────────────── */\r\n .dropdown {\r\n position: absolute;\r\n top: calc(100% + 6px);\r\n left: 0;\r\n min-width: 200px;\r\n background: var(--rel-bg-surface);\r\n border: var(--rel-stroke-sm, 1px) solid var(--rel-border-default);\r\n border-radius: var(--rel-border-radius-sm, 8px);\r\n box-shadow: var(--rel-shadows-shadow-300);\r\n padding: var(--rel-spacing-2xs, 4px);\r\n z-index: 200;\r\n display: none;\r\n }\r\n\r\n :host([open]) .dropdown {\r\n display: block;\r\n }\r\n `;\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n document.addEventListener(\"click\", this._handleOutsideClick);\r\n document.addEventListener(\"keydown\", this._handleDocKeydown);\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback();\r\n document.removeEventListener(\"click\", this._handleOutsideClick);\r\n document.removeEventListener(\"keydown\", this._handleDocKeydown);\r\n }\r\n\r\n private _handleOutsideClick = (e: MouseEvent) => {\r\n if (!this.open) return;\r\n const path = e.composedPath() as Node[];\r\n if (!path.includes(this)) {\r\n this._setOpen(false);\r\n }\r\n };\r\n\r\n private _handleDocKeydown = (e: KeyboardEvent) => {\r\n if (e.key === \"Escape\" && this.open) {\r\n this._setOpen(false);\r\n (this.shadowRoot?.querySelector(\".trigger\") as HTMLElement)?.focus();\r\n }\r\n };\r\n\r\n private _setOpen(value: boolean) {\r\n this.open = value;\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-toggle\", {\r\n detail: { open: this.open, value: this.value },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private _handleTriggerClick(e: MouseEvent) {\r\n if (this.disabled) {\r\n e.preventDefault();\r\n return;\r\n }\r\n\r\n if (this.expandable || this._hasDropdown) {\r\n e.preventDefault();\r\n this._setOpen(!this.open);\r\n return;\r\n }\r\n\r\n if (!this.href) {\r\n e.preventDefault();\r\n }\r\n\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-select\", {\r\n detail: { value: this.value, label: this.label },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n\r\n // Bubble up to topbar\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-nav-select\", {\r\n detail: { value: this.value, label: this.label },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private _routeSlots(e: Event) {\r\n const slot = e.target as HTMLSlotElement;\r\n for (const el of slot.assignedElements({ flatten: true })) {\r\n const targetSlot = (el as HTMLElement).tagName.toLowerCase() === \"rel-topbar-dropdown\" ? \"dropdown\" : \"\";\r\n if ((el as HTMLElement).slot !== targetSlot) {\r\n (el as HTMLElement).slot = targetSlot;\r\n }\r\n }\r\n }\r\n\r\n private _handleDropdownSlotChange(e: Event) {\r\n const slot = e.target as HTMLSlotElement;\r\n const nodes = slot.assignedElements();\r\n this._hasDropdown = nodes.length > 0;\r\n }\r\n\r\n render() {\r\n const isLink = !!this.href && !this.disabled;\r\n const showChevron = this.expandable || this._hasDropdown;\r\n const ariaCurrent = this.active ? \"page\" : undefined;\r\n const ariaExpanded = showChevron ? (this.open ? \"true\" : \"false\") : undefined;\r\n const ariaHasPopup = showChevron ? \"true\" : undefined;\r\n\r\n const triggerContent = html`\r\n <span class=\"prefix\"><slot name=\"prefix\"></slot></span>\r\n <slot>${this.label ?? \"\"}</slot>\r\n <span class=\"suffix\"><slot name=\"suffix\"></slot></span>\r\n ${showChevron\r\n ? html`<span class=\"chevron\" aria-hidden=\"true\">\r\n <rel-icon name=\"chevron-down\" size=\"sm\"></rel-icon>\r\n </span>`\r\n : null}\r\n `;\r\n\r\n const trigger = isLink\r\n ? html`\r\n <a\r\n class=\"trigger\"\r\n href=${this.href!}\r\n aria-current=${ariaCurrent as string}\r\n aria-expanded=${ariaExpanded as string}\r\n aria-haspopup=${ariaHasPopup as string}\r\n @click=${this._handleTriggerClick}\r\n >\r\n ${triggerContent}\r\n </a>\r\n `\r\n : html`\r\n <button\r\n class=\"trigger\"\r\n type=\"button\"\r\n ?disabled=${this.disabled}\r\n aria-current=${ariaCurrent as string}\r\n aria-expanded=${ariaExpanded as string}\r\n aria-haspopup=${ariaHasPopup as string}\r\n @click=${this._handleTriggerClick}\r\n >\r\n ${triggerContent}\r\n </button>\r\n `;\r\n\r\n return html`\r\n <!-- router: auto-assigns slot=\"dropdown\" for rel-topbar-dropdown children -->\r\n <slot style=\"display:none\" @slotchange=${this._routeSlots}></slot>\r\n\r\n ${trigger}\r\n <div class=\"dropdown\" role=\"region\">\r\n <slot name=\"dropdown\" @slotchange=${this._handleDropdownSlotChange}></slot>\r\n </div>\r\n `;\r\n }\r\n}\r\n\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\nimport \"../rel-avatar/rel-avatar.js\";\r\n\r\nexport type TopbarProfileType = \"avatar\" | \"carrier\";\r\nexport type TopbarRewardTier = \"gold\" | \"silver\" | \"platinum\" | \"bronze\" | \"regular\";\r\n\r\n/**\r\n * `rel-topbar-profile` — Profile / user tile for the topbar right region.\r\n *\r\n * @deprecated Part of the deprecated rel-topbar family. Compose `rel-avatar`\r\n * directly inside the \"App Topbar\" recipe at /docs/recipes/app-topbar.\r\n *\r\n * type=\"avatar\" Customer avatar with initials circle + optional name/subtitle.\r\n * type=\"carrier\" Carrier reward tile with reward-tier badge + name/subtitle.\r\n */\r\n@customElement(\"rel-topbar-profile\")\r\nexport class RelTopbarProfile extends LitElement {\r\n /** Visual mode */\r\n @property({ type: String, reflect: true }) type: TopbarProfileType = \"avatar\";\r\n\r\n /** One or two initials shown in the avatar circle */\r\n @property({ type: String }) initials?: string;\r\n\r\n /** Primary display name */\r\n @property({ type: String }) name?: string;\r\n\r\n /** Secondary line (role, plan, etc.) */\r\n @property({ type: String }) subtitle?: string;\r\n\r\n /** Reward tier — only meaningful when type=\"carrier\" */\r\n @property({ type: String, reflect: true }) reward: TopbarRewardTier = \"regular\";\r\n\r\n /** Compact mode — avatar only, no text */\r\n @property({ type: Boolean, reflect: true }) compact = false;\r\n\r\n static styles = css`\r\n /* ─── Component tokens (reward tier palette) ────────────────────── */\r\n :host {\r\n color: var(--rel-text-default);\r\n --_profile-radius: var(--rel-border-radius-full-rounded, 1000px);\r\n --_avatar-size: 36px;\r\n --_avatar-size-sm: 28px;\r\n --_avatar-bg: var(--rel-bg-brand);\r\n --_avatar-color: var(--rel-text-default);\r\n\r\n /* Reward tier colours (reference existing token palette) */\r\n --rel-topbar-reward-gold: var(--rel-bg-warning);\r\n --rel-topbar-reward-gold-bg: var(--rel-bg-warning-light);\r\n --rel-topbar-reward-silver: var(--rel-text-caption);\r\n --rel-topbar-reward-silver-bg: var(--rel-bg-neutral-elevated-1);\r\n --rel-topbar-reward-platinum: var(--rel-text-info);\r\n --rel-topbar-reward-platinum-bg: var(--rel-bg-info-light);\r\n --rel-topbar-reward-bronze: var(--rel-text-warning);\r\n --rel-topbar-reward-bronze-bg: var(--rel-bg-warning-light);\r\n --rel-topbar-reward-regular: var(--rel-border-default);\r\n --rel-topbar-reward-regular-bg: var(--rel-bg-surface-elevated);\r\n\r\n display: inline-flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-xs, 8px);\r\n font-family: var(--rel-fonts-font-family, Poppins, sans-serif);\r\n cursor: pointer;\r\n }\r\n\r\n /* ─── Name / subtitle stack ─────────────────────────────────────── */\r\n .text-stack {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 0;\r\n min-width: 0;\r\n }\r\n\r\n :host([compact]) .text-stack {\r\n display: none;\r\n }\r\n\r\n .name {\r\r\r\n color: var(--rel-text-default);\r\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\n\r\n font-family: var(--rel-body-md-medium-font-family);\n\r\n font-weight: var(--rel-body-md-medium-font-weight);\n\r\n font-size: var(--rel-body-md-medium-font-size);\n\r\n line-height: var(--rel-body-md-medium-line-height);\n\r\n letter-spacing: var(--rel-body-md-medium-letter-spacing);\n\r\n }\r\n\r\n .subtitle {\r\r\r\n color: var(--rel-text-placeholder);\r\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\n\r\n font-family: var(--rel-body-sm-regular-font-family);\n\r\n font-weight: var(--rel-body-sm-regular-font-weight);\n\r\n font-size: var(--rel-body-sm-regular-font-size);\n\r\n line-height: var(--rel-body-sm-regular-line-height);\n\r\n letter-spacing: var(--rel-body-sm-regular-letter-spacing);\n\r\n }\r\n\r\n /* ─── Carrier reward badge ──────────────────────────────────────── */\r\n .reward-badge {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-3xs, 2px);\r\n padding: 2px var(--rel-spacing-2xs, 4px);\r\n border-radius: var(--rel-border-radius-xs, 2px);\r\r\r\n text-transform: uppercase;\r\r\n flex-shrink: 0;\n font-family: var(--rel-body-xs-semibold-font-family);\n font-weight: var(--rel-body-xs-semibold-font-weight);\n font-size: var(--rel-body-xs-semibold-font-size);\n line-height: var(--rel-body-xs-semibold-line-height);\n letter-spacing: var(--rel-body-xs-semibold-letter-spacing);\n }\r\n\r\n /* Gold */\r\n :host([reward=\"gold\"]) .reward-badge {\r\n background: var(--rel-topbar-reward-gold-bg);\r\n color: var(--rel-topbar-reward-gold);\r\n }\r\n\r\n /* Silver */\r\n :host([reward=\"silver\"]) .reward-badge {\r\n background: var(--rel-topbar-reward-silver-bg);\r\n color: var(--rel-text-default);\r\n }\r\n\r\n /* Platinum */\r\n :host([reward=\"platinum\"]) .reward-badge {\r\n background: var(--rel-topbar-reward-platinum-bg);\r\n color: var(--rel-topbar-reward-platinum);\r\n }\r\n\r\n /* Bronze */\r\n :host([reward=\"bronze\"]) .reward-badge {\r\n background: var(--rel-topbar-reward-bronze-bg);\r\n color: var(--rel-topbar-reward-bronze);\r\n }\r\n\r\n /* Regular */\r\n :host([reward=\"regular\"]) .reward-badge {\r\n background: var(--rel-topbar-reward-regular-bg);\r\n color: var(--rel-text-default);\r\n }\r\n\r\n /* ─── Carrier tile shell ────────────────────────────────────────── */\r\n .carrier-tile {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-xs, 8px);\r\n padding: var(--rel-spacing-2xs, 4px) var(--rel-spacing-xs, 8px);\r\n border-radius: var(--rel-border-radius-sm, 8px);\r\n background: var(--rel-bg-surface-elevated);\r\n border: var(--rel-stroke-sm, 1px) solid var(--rel-border-default);\r\n }\r\n\r\n :host([compact]) .carrier-tile {\r\n padding: var(--rel-spacing-2xs, 4px);\r\n }\r\n\r\n .carrier-meta {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 1px;\r\n min-width: 0;\r\n }\r\n\r\n :host([compact]) .carrier-meta {\r\n display: none;\r\n }\r\n `;\r\n\r\n render() {\r\n if (this.type === \"carrier\") {\r\n return this._renderCarrier();\r\n }\r\n return this._renderAvatar();\r\n }\r\n\r\n private _renderAvatar() {\r\n return html`\r\n <rel-avatar\r\n type=\"text\"\r\n text=${this.initials ?? \"\"}\r\n size=${this.compact ? \"xs\" : \"sm\"}\r\n bg=${this._avatarBg()}\r\n ></rel-avatar>\r\n ${!this.compact && (this.name || this.subtitle)\r\n ? html`\r\n <div class=\"text-stack\">\r\n ${this.name ? html`<span class=\"name\">${this.name}</span>` : null}\r\n ${this.subtitle ? html`<span class=\"subtitle\">${this.subtitle}</span>` : null}\r\n </div>\r\n `\r\n : null}\r\n `;\r\n }\r\n\r\n private _avatarBg(): string {\r\n const map: Record<string, string> = {\r\n gold: \"var(--rel-bg-warning)\",\r\n platinum: \"var(--rel-text-info)\",\r\n silver: \"var(--rel-text-caption)\",\r\n bronze: \"var(--rel-text-warning)\",\r\n regular: \"var(--rel-bg-brand)\",\r\n };\r\n return map[this.reward] ?? \"var(--rel-bg-brand)\";\r\n }\r\n\r\n private _renderCarrier() {\r\n const rewardLabel = this.reward.charAt(0).toUpperCase() + this.reward.slice(1);\r\n\r\n return html`\r\n <div class=\"carrier-tile\" role=\"img\" aria-label=\"${this.name ?? \"Profile\"} – ${rewardLabel} member\">\r\n <rel-avatar\r\n type=\"text\"\r\n text=${this.initials ?? \"\"}\r\n size=\"sm\"\r\n bg=${this._avatarBg()}\r\n ></rel-avatar>\r\n <div class=\"carrier-meta\">\r\n ${this.name ? html`<span class=\"name\">${this.name}</span>` : null}\r\n <span class=\"reward-badge\">${rewardLabel}</span>\r\n ${this.subtitle ? html`<span class=\"subtitle\">${this.subtitle}</span>` : null}\r\n </div>\r\n </div>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property, state, query } from \"lit/decorators.js\";\r\n\r\nexport type OtpType = \"numeric\" | \"alphanumeric\";\r\n\r\n@customElement(\"rel-otp\")\r\nexport class RelOtp extends LitElement {\r\n @property({ type: String, reflect: true }) value = \"\";\r\n @property({ type: Number }) length = 6;\r\n @property({ type: Number, attribute: \"group-size\" }) groupSize = 3;\r\n @property({ type: String }) placeholder = \"\";\r\n @property({ type: String }) type: OtpType = \"numeric\";\r\n @property({ type: Boolean }) mask = false;\r\n @property({ type: Boolean, reflect: true }) disabled = false;\r\n @property({ type: Boolean, reflect: true }) readonly = false;\r\n @property({ type: Boolean }) required = false;\r\n @property({ type: String }) name: string | null = null;\r\n @property({ type: String }) autocomplete = \"one-time-code\";\r\n @property({ type: String }) inputmode: \"numeric\" | \"text\" | null = null;\r\n @property({ type: String }) pattern: string | null = null;\r\n @property({ type: String, attribute: \"aria-label\" }) ariaLabel: string | null = null;\r\n @property({ type: Boolean, reflect: true }) invalid = false;\r\n @property({ type: Boolean, attribute: \"show-separator\" }) showSeparator = true;\r\n // reflect: CSS targets :host([size=\"sm\"|\"lg\"]) — without reflection,\r\n // setting `el.size = \"lg\"` as a property silently applies no styles.\r\n @property({ type: String, reflect: true }) size: \"sm\" | \"md\" | \"lg\" = \"md\";\r\n\r\n @state() private cells: string[] = [];\r\n @query(\".hidden-input\") private hiddenInput?: HTMLInputElement;\r\n\r\n private isUpdatingFromValue = false;\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n display: inline-block;\r\n font-family: var(--rel-fonts-font-family);\r\n }\r\n\r\n :host([disabled]) {\r\n opacity: 0.6;\r\n cursor: not-allowed;\r\n }\r\n\r\n .otp-root {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-xs);\r\n position: relative;\r\n }\r\n\r\n .otp-group {\r\n display: flex;\r\n gap: var(--rel-spacing-2xs);\r\n }\r\n\r\n .otp-separator {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n color: var(--rel-border-default);\r\r\n user-select: none;\r\n padding: 0 var(--rel-spacing-3xs);\r\n font-family: var(--rel-action-xl-font-family);\r\n font-weight: var(--rel-action-xl-font-weight);\r\n font-size: var(--rel-action-xl-font-size);\r\n line-height: var(--rel-action-xl-line-height);\r\n letter-spacing: var(--rel-action-xl-letter-spacing);\r\n }\r\n\r\n .otp-separator.hidden {\r\n display: none;\r\n }\r\n\r\n .otp-cell {\r\n width: 40px;\r\n height: 48px;\r\n border: var(--rel-stroke-sm) solid var(--rel-border-default);\r\n border-radius: var(--rel-border-radius-sm);\r\n background: var(--rel-bg-neutral);\r\r\r\n text-align: center;\r\n color: var(--rel-text-default);\r\n outline: none;\r\n transition: border-color 0.15s ease, box-shadow 0.15s ease;\r\n caret-color: var(--rel-text-default);\r\n font-family: var(--rel-body-lg-regular-font-family);\r\n font-weight: var(--rel-body-lg-regular-font-weight);\r\n font-size: var(--rel-body-lg-regular-font-size);\r\n line-height: var(--rel-body-lg-regular-line-height);\r\n letter-spacing: var(--rel-body-lg-regular-letter-spacing);\r\n }\r\n\r\n /* Size variants */\r\n :host([size=\"sm\"]) .otp-cell {\r\n width: 36px;\r\n height: 40px;\r\n font-family: var(--rel-body-md-regular-font-family);\r\n font-weight: var(--rel-body-md-regular-font-weight);\r\n font-size: var(--rel-body-md-regular-font-size);\r\n line-height: var(--rel-body-md-regular-line-height);\r\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\r\n }\r\n\r\n :host([size=\"lg\"]) .otp-cell {\r\n width: 48px;\r\n height: 56px;\r\n font-family: var(--rel-body-xl-regular-font-family);\r\n font-weight: var(--rel-body-xl-regular-font-weight);\r\n font-size: var(--rel-body-xl-regular-font-size);\r\n line-height: var(--rel-body-xl-regular-line-height);\r\n letter-spacing: var(--rel-body-xl-regular-letter-spacing);\r\n }\r\n\r\n .otp-cell::placeholder {\r\n color: var(--rel-text-body);\r\n opacity: 0.6;\r\n }\r\n\r\n .otp-cell:hover:not(:disabled):not(:read-only) {\r\n border-color: var(--rel-border-strong);\r\n }\r\n\r\n .otp-cell:focus-visible {\r\n border-color: var(--rel-border-accent);\r\n box-shadow: 0 0 0 2px var(--rel-border-default);\r\n }\r\n\r\n .otp-cell:disabled {\r\n background: var(--rel-bg-surface-elevated);\r\n color: var(--rel-text-disabled);\r\n cursor: not-allowed;\r\n }\r\n\r\n :host([disabled]) .otp-cell {\r\n cursor: not-allowed;\r\n }\r\n\r\n .otp-cell:read-only {\r\n background: var(--rel-bg-neutral-elevated-1);\r\n cursor: default;\r\n }\r\n\r\n /* Invalid state */\r\n :host([invalid]) .otp-cell {\r\n border-color: var(--rel-border-danger);\r\n }\r\n\r\n :host([invalid]) .otp-cell:focus {\r\n border-color: var(--rel-border-danger);\r\n box-shadow: 0 0 0 2px var(--rel-bg-danger-light);\r\n }\r\n\r\n .hidden-input {\r\n position: absolute;\r\n opacity: 0;\r\n pointer-events: none;\r\n width: 1px;\r\n height: 1px;\r\n }\r\n\r\n /* Reduce motion */\r\n @media (prefers-reduced-motion: reduce) {\r\n .otp-cell {\r\n transition: none;\r\n }\r\n }\r\n\r\n `;\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n this.initializeCells();\r\n }\r\n\r\n updated(changedProperties: Map<string, any>) {\r\n super.updated(changedProperties);\r\n\r\n // Only sync from external value changes, not internal updates\r\n if (changedProperties.has(\"value\") && !this.isUpdatingFromValue) {\r\n this.syncCellsFromValue();\r\n }\r\n\r\n if (changedProperties.has(\"length\")) {\r\n this.initializeCells();\r\n }\r\n }\r\n\r\n private initializeCells() {\r\n this.cells = new Array(this.length).fill(\"\");\r\n this.syncCellsFromValue();\r\n }\r\n\r\n private syncCellsFromValue() {\r\n const chars = this.value.split(\"\").slice(0, this.length);\r\n this.cells = new Array(this.length).fill(\"\").map((_, i) => chars[i] || \"\");\r\n }\r\n\r\n private updateValue() {\r\n this.isUpdatingFromValue = true;\r\n const newValue = this.cells.join(\"\");\r\n this.value = newValue;\r\n\r\n // Update hidden input for forms\r\n if (this.hiddenInput) {\r\n this.hiddenInput.value = newValue;\r\n }\r\n\r\n this.requestUpdate();\r\n\r\n // Use setTimeout to ensure isUpdatingFromValue is reset after update cycle\r\n setTimeout(() => {\r\n this.isUpdatingFromValue = false;\r\n }, 0);\r\n\r\n const complete = newValue.length === this.length && this.isValidValue(newValue);\r\n\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-change\", {\r\n detail: { value: newValue, complete },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n\r\n if (complete) {\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-complete\", {\r\n detail: { value: newValue },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n }\r\n\r\n private isValidChar(char: string): boolean {\r\n if (this.type === \"numeric\") {\r\n return /^\\d$/.test(char);\r\n } else {\r\n return /^[0-9a-zA-Z]$/.test(char);\r\n }\r\n }\r\n\r\n private isValidValue(value: string): boolean {\r\n if (this.type === \"numeric\") {\r\n return /^\\d+$/.test(value);\r\n } else {\r\n return /^[0-9a-zA-Z]+$/.test(value);\r\n }\r\n }\r\n\r\n private getNextEditableIndex(): number {\r\n // Find first empty cell, or return last index if all filled\r\n const emptyIndex = this.cells.findIndex((c) => !c);\r\n return emptyIndex >= 0 ? emptyIndex : this.length - 1;\r\n }\r\n\r\n private handlePointerDown(e: PointerEvent) {\r\n if (this.disabled || this.readonly) return;\r\n\r\n const input = e.currentTarget as HTMLInputElement;\r\n const targetIndex = parseInt(input.dataset.index || \"0\", 10);\r\n const nextEditableIndex = this.getNextEditableIndex();\r\n\r\n // Prevent jumping ahead to empty cells\r\n if (targetIndex > nextEditableIndex) {\r\n e.preventDefault();\r\n this.focusCell(nextEditableIndex);\r\n }\r\n }\r\n\r\n private handleInput(e: Event) {\r\n if (this.disabled || this.readonly) return;\r\n\r\n const input = e.currentTarget as HTMLInputElement;\r\n const index = parseInt(input.dataset.index || \"0\", 10);\r\n let inputValue = input.value;\r\n\r\n // Handle autofill/paste on any cell (mobile OTP can inject full code)\r\n if (inputValue.length > 1) {\r\n this.handlePasteValue(inputValue, index);\r\n return;\r\n }\r\n\r\n // Get only the last character typed (handles replace-on-type)\r\n const char = inputValue.slice(-1);\r\n\r\n if (char && !this.isValidChar(char)) {\r\n // Invalid character, revert\r\n input.value = this.cells[index] || \"\";\r\n return;\r\n }\r\n\r\n // Update cell (replace existing value)\r\n this.cells[index] = char;\r\n input.value = char;\r\n\r\n this.updateValue();\r\n\r\n // Auto-advance to next cell\r\n if (char && index < this.length - 1) {\r\n this.focusCell(index + 1);\r\n }\r\n }\r\n\r\n private handleKeyDown(e: KeyboardEvent) {\r\n if (this.disabled || this.readonly) return;\r\n\r\n const input = e.currentTarget as HTMLInputElement;\r\n const index = parseInt(input.dataset.index || \"0\", 10);\r\n\r\n switch (e.key) {\r\n case \"Backspace\":\r\n e.preventDefault();\r\n if (this.cells[index]) {\r\n // Clear current cell, keep focus\r\n this.cells[index] = \"\";\r\n input.value = \"\";\r\n this.updateValue();\r\n } else if (index > 0) {\r\n // Move to previous cell and clear it\r\n this.cells[index - 1] = \"\";\r\n this.updateValue();\r\n this.focusCell(index - 1);\r\n }\r\n break;\r\n\r\n case \"Delete\":\r\n e.preventDefault();\r\n this.cells[index] = \"\";\r\n input.value = \"\";\r\n this.updateValue();\r\n break;\r\n\r\n case \"ArrowLeft\":\r\n e.preventDefault();\r\n if (index > 0) {\r\n this.focusCell(index - 1);\r\n }\r\n break;\r\n\r\n case \"ArrowRight\":\r\n e.preventDefault();\r\n if (index < this.length - 1) {\r\n this.focusCell(index + 1);\r\n }\r\n break;\r\n\r\n case \"Home\":\r\n e.preventDefault();\r\n this.focusCell(0);\r\n break;\r\n\r\n case \"End\":\r\n e.preventDefault();\r\n this.focusCell(this.length - 1);\r\n break;\r\n\r\n case \"ArrowUp\":\r\n case \"ArrowDown\":\r\n e.preventDefault();\r\n break;\r\n }\r\n }\r\n\r\n private handlePaste(e: ClipboardEvent) {\r\n if (this.disabled || this.readonly) return;\r\n\r\n e.preventDefault();\r\n\r\n const input = e.currentTarget as HTMLInputElement;\r\n const index = parseInt(input.dataset.index || \"0\", 10);\r\n const pastedText = e.clipboardData?.getData(\"text\") || \"\";\r\n\r\n this.handlePasteValue(pastedText, index);\r\n }\r\n\r\n private handlePasteValue(text: string, startIndex: number) {\r\n // Filter valid characters\r\n const validChars = text.split(\"\").filter((char) => this.isValidChar(char));\r\n\r\n // Distribute characters starting from startIndex\r\n let updateIndex = startIndex;\r\n validChars.forEach((char) => {\r\n if (updateIndex < this.length) {\r\n this.cells[updateIndex] = char;\r\n updateIndex++;\r\n }\r\n });\r\n\r\n this.updateValue();\r\n\r\n // Focus next empty cell or last cell\r\n const nextEmptyIndex = this.cells.findIndex((c, i) => i >= startIndex && !c);\r\n if (nextEmptyIndex >= 0) {\r\n this.focusCell(nextEmptyIndex);\r\n } else {\r\n this.focusCell(Math.min(updateIndex, this.length - 1));\r\n }\r\n }\r\n\r\n private handleFocus(e: FocusEvent) {\r\n const input = e.currentTarget as HTMLInputElement;\r\n input.select();\r\n }\r\n\r\n private handleBlur() {\r\n }\r\n\r\n private focusCell(index: number) {\r\n if (index < 0 || index >= this.length) return;\r\n\r\n const input = this.renderRoot.querySelector(\r\n `input[data-index=\"${index}\"]`\r\n ) as HTMLInputElement | null;\r\n\r\n if (input) {\r\n input.focus();\r\n input.select();\r\n }\r\n }\r\n\r\n private getInputMode(): string {\r\n if (this.inputmode) return this.inputmode;\r\n return this.type === \"numeric\" ? \"numeric\" : \"text\";\r\n }\r\n\r\n private getAriaLabel(index: number): string {\r\n const total = this.length;\r\n const position = index + 1;\r\n const label = this.type === \"numeric\" ? \"Digit\" : \"Character\";\r\n return `${label} ${position} of ${total}`;\r\n }\r\n\r\n private getGroups(): number[][] {\r\n const groups: number[][] = [];\r\n if (this.groupSize <= 0 || !this.showSeparator) {\r\n // Single group with all cells\r\n groups.push(Array.from({ length: this.length }, (_, i) => i));\r\n } else {\r\n // Multiple groups\r\n for (let i = 0; i < this.length; i += this.groupSize) {\r\n groups.push(\r\n Array.from(\r\n { length: Math.min(this.groupSize, this.length - i) },\r\n (_, j) => i + j\r\n )\r\n );\r\n }\r\n }\r\n return groups;\r\n }\r\n\r\n render() {\r\n const groups = this.getGroups();\r\n\r\n return html`\r\n <div\r\n part=\"base root\"\r\n class=\"otp-root\"\r\n role=\"group\"\r\n aria-label=\"${this.ariaLabel || \"One-time password input\"}\">\r\n ${groups.map(\r\n (group, groupIndex) => html`\r\n <div class=\"otp-group\">\r\n ${group.map(\r\n (index) => html`\r\n <input\r\n part=\"input cell\"\r\n class=\"otp-cell\"\r\n data-index=\"${index}\"\r\n type=\"${this.mask ? \"password\" : \"text\"}\"\r\n inputmode=\"${this.getInputMode()}\"\r\n autocomplete=\"new-password\"\r\n pattern=\"${this.pattern || \"\"}\"\r\n placeholder=\"${this.placeholder}\"\r\n maxlength=\"1\"\r\n .value=\"${this.cells[index] || \"\"}\"\r\n ?disabled=\"${this.disabled}\"\r\n ?readonly=\"${this.readonly}\"\r\n ?required=\"${this.required && index === 0}\"\r\n aria-label=\"${this.getAriaLabel(index)}\"\r\n @pointerdown=\"${this.handlePointerDown}\"\r\n @input=\"${this.handleInput}\"\r\n @keydown=\"${this.handleKeyDown}\"\r\n @paste=\"${this.handlePaste}\"\r\n @focus=\"${this.handleFocus}\"\r\n @blur=\"${this.handleBlur}\"\r\n />\r\n `\r\n )}\r\n </div>\r\n ${groupIndex < groups.length - 1\r\n ? html`<div part=\"separator\" class=\"otp-separator\">-</div>`\r\n : \"\"}\r\n `\r\n )}\r\n\r\n ${this.name\r\n ? html`<input\r\n part=\"hidden-input\"\r\n class=\"hidden-input\"\r\n type=\"hidden\"\r\n name=\"${this.name}\"\r\n .value=\"${this.value}\"\r\n />`\r\n : \"\"}\r\n </div>\r\n `;\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"rel-otp\": RelOtp;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\n\n@customElement(\"rel-pagination\")\nexport class RelPagination extends LitElement {\n /** Layout type from Figma: extended (numbered pages), compact (prev/next + page text), count-text (range + nav) */\n @property({ type: String, reflect: true })\n type: \"extended\" | \"compact\" | \"count-text\" = \"extended\";\n\n /** Controlled current page */\n @property({ type: Number }) page?: number;\n /** Uncontrolled starting page */\n @property({ type: Number }) defaultPage = 1;\n /** Total number of pages */\n @property({ type: Number }) totalPages = 0;\n /** Total items (used with perPage to auto-compute totalPages in count-text mode) */\n @property({ type: Number }) totalItems = 0;\n /** Items per page (count-text mode) */\n @property({ type: Number }) perPage = 10;\n /** Show \"Viewing page X of Y\" label below extended pagination */\n @property({ type: Boolean }) showLabel = false;\n @property({ type: Boolean, reflect: true }) disabled = false;\n @property({ type: String }) hrefTemplate = \"\";\n @property({ type: String }) ariaLabel = \"Pagination\";\n\n @state() private currentPage = 1;\n\n static styles = css`\n :host {\n /* container-type: inline-size applies INLINE-SIZE CONTAINMENT — the width\n must resolve without consulting the contents. Combined with a\n shrink-to-fit box (inline-block) that is contradictory and the host\n collapses to width:0, which made the whole component invisible.\n A size container must be block-level (or have a definite width). */\n container-type: inline-size;\n color: var(--rel-text-default);\n display: block;\n font-family: var(--rel-fonts-font-family, 'Poppins', sans-serif);\n }\n\n :host([type=\"count-text\"]) {\n display: block;\n width: 100%;\n }\n\n :host([disabled]) {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n :host([disabled]) button {\n pointer-events: none;\n }\n\n /* ── Root / Stack containers ──────────────────────────────── */\n\n .pag-root {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--rel-spacing-md);\n }\n\n .pag-stack {\n display: inline-flex;\n align-items: center;\n gap: var(--rel-spacing-sm);\n }\n\n .pag-count {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--rel-spacing-xl);\n width: 100%;\n }\n\n /* count-text right-side nav: no gap (40+24+40 = 104px, matches Figma) */\n .pag-count-nav {\n display: inline-flex;\n align-items: center;\n }\n\n /* ── Page number list (tighter 4px gap) ──────────────────── */\n\n .pag-numbers {\n display: inline-flex;\n align-items: center;\n gap: var(--rel-spacing-2xs);\n }\n\n /* ── Prev / Next — circular buttons ──────────────────────── */\n\n .pag-nav-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n padding: 0;\n border-radius: var(--rel-border-radius-full-rounded);\n border: 1px solid var(--rel-border-default);\n background: var(--rel-bg-neutral);\n cursor: pointer;\n color: var(--rel-action-neutral-label-icons-ghost);\n box-sizing: border-box;\n transition: background 0.15s ease;\n flex-shrink: 0;\n }\n\n .pag-nav-btn:hover:not(:disabled) {\n background: var(--rel-bg-neutral-elevated-1);\n }\n\n .pag-nav-btn:focus-visible {\n outline: 2px solid var(--rel-border-focus);\n outline-offset: 2px;\n }\n\n .pag-nav-btn:disabled {\n opacity: 0.35;\n cursor: not-allowed;\n }\n\n .pag-nav-btn svg {\n width: 20px;\n height: 20px;\n }\n\n /* ── Page number buttons — square with 8px radius ─────────── */\n\n .pag-page-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n padding: var(--rel-spacing-xs);\n border-radius: var(--rel-border-radius-sm);\n border: 1px solid var(--rel-border-default);\n background: var(--rel-bg-neutral);\n cursor: pointer;\n color: var(--rel-text-default);\n box-sizing: border-box;\n transition: background 0.15s ease, border-color 0.15s ease;\n font-family: var(--rel-body-md-medium-font-family);\n font-weight: var(--rel-body-md-medium-font-weight);\n font-size: var(--rel-body-md-medium-font-size);\n line-height: var(--rel-body-md-medium-line-height);\n letter-spacing: var(--rel-body-md-medium-letter-spacing);\n }\n\n .pag-page-btn:hover {\n background: var(--rel-bg-neutral-elevated-1);\n }\n\n .pag-page-btn:focus-visible {\n outline: 2px solid var(--rel-border-focus);\n outline-offset: 2px;\n }\n\n /* Figma: current page is an inverse chip */\n .pag-page-btn[aria-current=\"page\"] {\n background: var(--rel-bg-neutral-inverse-2);\n border-color: var(--rel-bg-neutral-inverse-2);\n color: var(--rel-text-inverse);\n }\n\n /* ── Ellipsis ─────────────────────────────────────────────── */\n\n .pag-ellipsis {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n color: var(--rel-text-default);\n user-select: none;\n font-family: var(--rel-body-md-medium-font-family);\n font-weight: var(--rel-body-md-medium-font-weight);\n font-size: var(--rel-body-md-medium-font-size);\n line-height: var(--rel-body-md-medium-line-height);\n letter-spacing: var(--rel-body-md-medium-letter-spacing);\n }\n\n /* ── Compact: \"Page X of Y\" ───────────────────────────────── */\n\n .pag-page-text {\n color: var(--rel-text-default);\n white-space: nowrap;\n\n font-family: var(--rel-body-md-medium-font-family);\n\n font-weight: var(--rel-body-md-medium-font-weight);\n\n font-size: var(--rel-body-md-medium-font-size);\n\n line-height: var(--rel-body-md-medium-line-height);\n\n letter-spacing: var(--rel-body-md-medium-letter-spacing);\n\n }\n\n /* ── Count-text: \"1-5 of 50\" ─────────────────────────────── */\n\n .pag-count-text {\n color: var(--rel-text-default);\n white-space: nowrap;\n\n font-family: var(--rel-body-md-medium-font-family);\n\n font-weight: var(--rel-body-md-medium-font-weight);\n\n font-size: var(--rel-body-md-medium-font-size);\n\n line-height: var(--rel-body-md-medium-line-height);\n\n letter-spacing: var(--rel-body-md-medium-letter-spacing);\n\n }\n\n /* ── Count-text: inline current page number ───────────────── */\n\n .pag-current-num {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 40px;\n color: var(--rel-text-default);\n font-family: var(--rel-body-md-medium-font-family);\n font-weight: var(--rel-body-md-medium-font-weight);\n font-size: var(--rel-body-md-medium-font-size);\n line-height: var(--rel-body-md-medium-line-height);\n letter-spacing: var(--rel-body-md-medium-letter-spacing);\n }\n\n /* ── Extended sub-label ───────────────────────────────────── */\n\n .pag-label {\n color: var(--rel-text-caption);\n text-align: center;\n\n font-family: var(--rel-body-md-regular-font-family);\n\n font-weight: var(--rel-body-md-regular-font-weight);\n\n font-size: var(--rel-body-md-regular-font-size);\n\n line-height: var(--rel-body-md-regular-line-height);\n\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\n\n }\n /* ── Task 4: responsive behaviour (conventions §4) ───────────────── */\n .auto-compact {\n display: none;\n }\n\n .pag-numbers {\n flex-wrap: wrap;\n justify-content: center;\n }\n\n @container (max-width: 768px) {\n .pag-page-btn {\n width: auto;\n min-width: 36px;\n }\n }\n\n /* 480–768px: shrink the number window to current ±1 plus first/last */\n @container (min-width: 480px) and (max-width: 768px) {\n .pag-page-btn:not(.near):not(.edge):not([aria-current=\"page\"]),\n .pag-ellipsis {\n display: none;\n }\n }\n\n /* <480px: swap to the compact layout automatically */\n @container (max-width: 479px) {\n .auto-extended {\n display: none;\n }\n\n .auto-compact {\n display: block;\n }\n }\n\n /* Fallback for browsers without container queries */\n @supports not (container-type: inline-size) {\n @media (max-width: 768px) {\n .pag-page-btn {\n width: auto;\n min-width: 36px;\n }\n }\n\n @media (min-width: 480px) and (max-width: 768px) {\n .pag-page-btn:not(.near):not(.edge):not([aria-current=\"page\"]),\n .pag-ellipsis {\n display: none;\n }\n }\n\n @media (max-width: 479px) {\n .auto-extended {\n display: none;\n }\n\n .auto-compact {\n display: block;\n }\n }\n }\n `;\n\n connectedCallback() {\n super.connectedCallback();\n const totalPagesAttr = this.getAttribute(\"total-pages\");\n if (totalPagesAttr) this.totalPages = Number(totalPagesAttr);\n const pageAttr = this.getAttribute(\"page\");\n if (pageAttr) this.page = Number(pageAttr);\n const defaultPageAttr = this.getAttribute(\"default-page\");\n if (defaultPageAttr) this.defaultPage = Number(defaultPageAttr);\n const totalItemsAttr = this.getAttribute(\"total-items\");\n if (totalItemsAttr) this.totalItems = Number(totalItemsAttr);\n const perPageAttr = this.getAttribute(\"per-page\");\n if (perPageAttr) this.perPage = Number(perPageAttr);\n this.currentPage = this.page ?? this.defaultPage;\n }\n\n updated(changedProperties: Map<string, unknown>) {\n if (changedProperties.has(\"page\") && this.page !== undefined) {\n this.currentPage = this.page;\n }\n }\n\n private get activePage(): number {\n return this.page ?? this.currentPage;\n }\n\n private get computedTotalPages(): number {\n if (this.totalPages > 0) return this.totalPages;\n if (this.totalItems > 0 && this.perPage > 0) {\n return Math.ceil(this.totalItems / this.perPage);\n }\n return 0;\n }\n\n private generatePageNumbers(): number[] {\n const pages: number[] = [];\n const current = this.activePage;\n const total = this.computedTotalPages;\n if (total <= 0) return pages;\n if (total <= 7) {\n for (let i = 1; i <= total; i++) pages.push(i);\n } else if (current <= 4) {\n for (let i = 1; i <= 5; i++) pages.push(i);\n pages.push(-1);\n pages.push(total);\n } else if (current >= total - 3) {\n pages.push(1);\n pages.push(-1);\n for (let i = total - 4; i <= total; i++) pages.push(i);\n } else {\n pages.push(1);\n pages.push(-1);\n pages.push(current - 1);\n pages.push(current);\n pages.push(current + 1);\n pages.push(-1);\n pages.push(total);\n }\n return pages;\n }\n\n private handlePageChange(newPage: number) {\n const total = this.computedTotalPages;\n if (this.disabled || newPage < 1 || newPage > total || newPage === this.activePage) return;\n if (this.page === undefined) this.currentPage = newPage;\n this.dispatchEvent(\n new CustomEvent(\"rel-change\", {\n detail: { page: newPage },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private renderChevronLeft() {\n return html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M15 18l-6-6 6-6\"/></svg>`;\n }\n\n private renderChevronRight() {\n return html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 18l6-6-6-6\"/></svg>`;\n }\n\n private renderNavBtn(dir: \"prev\" | \"next\") {\n const current = this.activePage;\n const total = this.computedTotalPages;\n const isPrev = dir === \"prev\";\n const isDisabled = isPrev ? current <= 1 : current >= total;\n const targetPage = isPrev ? current - 1 : current + 1;\n\n return html`\n <button\n type=\"button\"\n class=\"pag-nav-btn\"\n aria-label=\"${isPrev ? \"Previous page\" : \"Next page\"}\"\n ?disabled=\"${isDisabled}\"\n @click=\"${() => this.handlePageChange(targetPage)}\"\n >\n ${isPrev ? this.renderChevronLeft() : this.renderChevronRight()}\n </button>\n `;\n }\n\n private renderExtended() {\n const pages = this.generatePageNumbers();\n const current = this.activePage;\n const total = this.computedTotalPages;\n\n return html`\n <div part=\"base\" class=\"pag-root\" role=\"navigation\" aria-label=\"${this.ariaLabel}\">\n <div class=\"pag-stack\">\n ${this.renderNavBtn(\"prev\")}\n <div class=\"pag-numbers\">\n ${pages.map((p) =>\n p === -1\n ? html`<span class=\"pag-ellipsis\">...</span>`\n : html`<button\n type=\"button\"\n class=\"pag-page-btn ${Math.abs(p - current) <= 1 ? \"near\" : \"\"} ${p === 1 || p === total ? \"edge\" : \"\"}\"\n aria-label=\"Page ${p}\"\n aria-current=\"${p === current ? \"page\" : \"false\"}\"\n @click=\"${() => this.handlePageChange(p)}\"\n >${p}</button>`\n )}\n </div>\n ${this.renderNavBtn(\"next\")}\n </div>\n ${this.showLabel\n ? html`<span class=\"pag-label\">Viewing page ${current} of ${total}</span>`\n : null}\n </div>\n `;\n }\n\n private renderCompact() {\n const current = this.activePage;\n const total = this.computedTotalPages;\n\n return html`\n <div class=\"pag-stack\" role=\"navigation\" aria-label=\"${this.ariaLabel}\">\n ${this.renderNavBtn(\"prev\")}\n <span class=\"pag-page-text\">Page ${current} of ${total}</span>\n ${this.renderNavBtn(\"next\")}\n </div>\n `;\n }\n\n private renderCountText() {\n const current = this.activePage;\n const total = this.computedTotalPages;\n const effectiveTotalItems = this.totalItems > 0 ? this.totalItems : total * this.perPage;\n const start = (current - 1) * this.perPage + 1;\n const end = Math.min(current * this.perPage, effectiveTotalItems);\n\n return html`\n <div part=\"label\" class=\"pag-count\" role=\"navigation\" aria-label=\"${this.ariaLabel}\">\n <span class=\"pag-count-text\">${start}–${end} of ${effectiveTotalItems}</span>\n <div class=\"pag-count-nav\">\n ${this.renderNavBtn(\"prev\")}\n <span class=\"pag-current-num\">${current}</span>\n ${this.renderNavBtn(\"next\")}\n </div>\n </div>\n `;\n }\n\n render() {\n if (this.type === \"compact\") return this.renderCompact();\n if (this.type === \"count-text\") return this.renderCountText();\n /* Task 4: extended auto-switches to the compact layout under 480px\n (container query, media-query fallback) — same markup, CSS-toggled. */\n return html`\n <div class=\"auto-extended\">${this.renderExtended()}</div>\n <div class=\"auto-compact\">${this.renderCompact()}</div>\n `;\n }\n}\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property, state, query } from \"lit/decorators.js\";\r\n\r\ntype SideType = \"top\" | \"right\" | \"bottom\" | \"left\";\r\ntype AlignType = \"start\" | \"center\" | \"end\";\r\n\r\n@customElement(\"rel-popover\")\r\nexport class RelPopover extends LitElement {\r\n /* =======================\r\n * PUBLIC API\r\n * ======================= */\r\n\r\n @property({ type: Boolean, reflect: true }) open?: boolean;\r\n @property({ type: Boolean, attribute: \"defaultopen\" }) defaultOpen = false;\r\n @property({ type: Boolean, reflect: true }) disabled = false;\r\n\r\n @property({ type: String, reflect: true }) side: SideType = \"bottom\";\r\n @property({ type: String, reflect: true }) align: AlignType = \"center\";\r\n @property({ type: Number, attribute: \"sideoffset\" }) sideOffset = 8;\r\n @property({ type: Number, attribute: \"alignoffset\" }) alignOffset = 0;\r\n\r\n @property({ type: Boolean, attribute: \"trapfocus\" }) trapFocus = false;\r\n @property({ type: Boolean, attribute: \"closeonescape\" }) closeOnEscape = true;\r\n @property({ type: Boolean, attribute: \"closeonoutsideclick\" })\r\n closeOnOutsideClick = true;\r\n\r\n /* =======================\r\n * INTERNAL STATE\r\n * ======================= */\r\n\r\n @state() private internalOpen = false;\r\n @state() private contentStyle = \"\";\r\n\r\n @query(\".content-wrapper\") private contentWrapper!: HTMLDivElement;\r\n\r\n private triggerEl: HTMLElement | null = null;\r\n private returnFocusEl: HTMLElement | null = null;\r\n private uniqueId = `popover-${Math.random().toString(36).slice(2)}`;\r\n\r\n /* =======================\r\n * STYLES\r\n * ======================= */\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n display: inline-block;\r\n position: relative;\r\n }\r\n\r\n :host([disabled]) {\r\n opacity: 0.6;\r\n cursor: not-allowed;\r\n }\r\n\r\n :host([disabled]) * {\r\n pointer-events: none;\r\n }\r\n\r\n .content-wrapper {\r\n position: fixed;\r\n z-index: 1001;\r\n display: none;\r\n /* Reset native [popover] UA styles (the wrapper is promoted to the\r\n top layer so transformed ancestors — e.g. a centered rel-modal\r\n panel — can't hijack its containing block or clip it). */\r\n inset: auto;\r\n margin: 0;\r\n padding: 0;\r\n border: none;\r\n background: transparent;\r\n overflow: visible;\r\n color: inherit;\r\n }\r\n\r\n .content-wrapper[open] {\r\n display: block;\r\n }\r\n `;\r\n\r\n /* =======================\r\n * LIFECYCLE\r\n * ======================= */\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n this.internalOpen = this.isControlled() ? !!this.open : this.defaultOpen;\r\n\r\n // ONE interaction entry point — capture phase\r\n this.addEventListener(\"pointerdown\", this.onHostPointerDown, true);\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback();\r\n this.removeEventListener(\"pointerdown\", this.onHostPointerDown, true);\r\n this.removeGlobalListeners();\r\n this.hideNativePopover();\r\n }\r\n\r\n firstUpdated() {\r\n // triggerEl is resolved via onTriggerSlotChange; call aria in case slot\r\n // content was already assigned before firstUpdated\r\n this.applyTriggerAria();\r\n }\r\n\r\n updated(changed: Map<string, unknown>) {\r\n if (changed.has(\"open\") && this.isControlled()) {\r\n this.internalOpen = !!this.open;\r\n }\r\n\r\n if (changed.has(\"internalOpen\") || changed.has(\"open\")) {\r\n this.applyTriggerAria();\r\n this.activeOpen ? this.onOpen() : this.onClose();\r\n }\r\n }\r\n\r\n /* =======================\r\n * STATE HELPERS\r\n * ======================= */\r\n\r\n private isControlled() {\r\n return this.open !== undefined;\r\n }\r\n\r\n private get activeOpen() {\r\n return this.isControlled() ? !!this.open : this.internalOpen;\r\n }\r\n\r\n private setOpen(next: boolean) {\r\n if (!this.isControlled()) {\r\n this.internalOpen = next;\r\n }\r\n\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-open-change\", {\r\n detail: { open: next },\r\n bubbles: true,\r\n composed: true,\r\n }),\r\n );\r\n }\r\n\r\n /* =======================\r\n * POINTER HANDLING (THE FIX)\r\n * ======================= */\r\n\r\n private onHostPointerDown = (e: PointerEvent) => {\r\n if (this.disabled) return;\r\n\r\n const path = e.composedPath();\r\n\r\n // Toggle ONLY if pointerdown originated from the trigger element\r\n if (!this.triggerEl || !path.includes(this.triggerEl)) return;\r\n\r\n // Prevent this interaction from becoming an \"outside click\"\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n this.setOpen(!this.activeOpen);\r\n };\r\n\r\n /* =======================\r\n * OPEN / CLOSE\r\n * ======================= */\r\n\r\n private onOpen() {\r\n this.returnFocusEl =\r\n (document.activeElement as HTMLElement) ?? this.triggerEl;\r\n\r\n this.addGlobalListeners();\r\n this.showNativePopover();\r\n\r\n requestAnimationFrame(() => {\r\n this.updatePosition();\r\n this.focusFirst();\r\n });\r\n }\r\n\r\n private onClose() {\r\n this.removeGlobalListeners();\r\n this.hideNativePopover();\r\n this.restoreFocus();\r\n }\r\n\r\n /* =======================\r\n * TOP LAYER (native Popover API)\r\n *\r\n * A transformed ancestor (e.g. rel-modal's centered panel with\r\n * translate(-50%,-50%)) becomes the containing block for position:fixed\r\n * descendants, breaking viewport-based coordinates and letting the\r\n * panel's overflow:hidden clip the content. Promoting the wrapper to\r\n * the browser top layer sidesteps both. `manual` keeps light-dismiss\r\n * and Escape handling under this component's own control.\r\n * ======================= */\r\n\r\n private showNativePopover() {\r\n const w = this.contentWrapper;\r\n if (!w || typeof w.showPopover !== \"function\") return;\r\n try {\r\n if (!w.matches(\":popover-open\")) w.showPopover();\r\n } catch {\r\n /* older engines / detached element — fixed-position fallback applies */\r\n }\r\n }\r\n\r\n private hideNativePopover() {\r\n const w = this.contentWrapper;\r\n if (!w || typeof w.hidePopover !== \"function\") return;\r\n try {\r\n if (w.matches(\":popover-open\")) w.hidePopover();\r\n } catch {\r\n /* already hidden or unsupported — nothing to do */\r\n }\r\n }\r\n\r\n /* =======================\r\n * GLOBAL LISTENERS\r\n * ======================= */\r\n\r\n private addGlobalListeners() {\r\n if (this.closeOnOutsideClick) {\r\n document.addEventListener(\"pointerdown\", this.onOutsidePointerDown);\r\n }\r\n\r\n if (this.closeOnEscape || this.trapFocus) {\r\n document.addEventListener(\"keydown\", this.onKeyDown);\r\n }\r\n\r\n window.addEventListener(\"resize\", this.updatePosition);\r\n window.addEventListener(\"scroll\", this.updatePosition, true);\r\n }\r\n\r\n private removeGlobalListeners() {\r\n document.removeEventListener(\"pointerdown\", this.onOutsidePointerDown);\r\n document.removeEventListener(\"keydown\", this.onKeyDown);\r\n window.removeEventListener(\"resize\", this.updatePosition);\r\n window.removeEventListener(\"scroll\", this.updatePosition, true);\r\n }\r\n\r\n private onOutsidePointerDown = (e: PointerEvent) => {\r\n if (!this.activeOpen) return;\r\n\r\n const path = e.composedPath();\r\n\r\n if (\r\n path.includes(this) ||\r\n (this.triggerEl && path.includes(this.triggerEl)) ||\r\n (this.contentWrapper && path.includes(this.contentWrapper))\r\n ) {\r\n return;\r\n }\r\n\r\n this.setOpen(false);\r\n };\r\n\r\n private onKeyDown = (e: KeyboardEvent) => {\r\n if (!this.activeOpen) return;\r\n\r\n if (e.key === \"Escape\" && this.closeOnEscape) {\r\n e.preventDefault();\r\n this.setOpen(false);\r\n }\r\n\r\n if (this.trapFocus && e.key === \"Tab\") {\r\n this.trapFocusLoop(e);\r\n }\r\n };\r\n\r\n /* =======================\r\n * FOCUS\r\n * ======================= */\r\n\r\n private focusFirst() {\r\n if (!this.contentWrapper) return;\r\n\r\n const focusable = this.getFocusable(this.contentWrapper);\r\n if (focusable[0]) {\r\n focusable[0].focus();\r\n } else {\r\n this.contentWrapper.focus();\r\n }\r\n }\r\n\r\n private restoreFocus() {\r\n (this.returnFocusEl ?? this.triggerEl)?.focus();\r\n this.returnFocusEl = null;\r\n }\r\n\r\n private trapFocusLoop(e: KeyboardEvent) {\r\n const focusable = this.getFocusable(this.contentWrapper);\r\n if (focusable.length === 0) return;\r\n\r\n const first = focusable[0];\r\n const last = focusable[focusable.length - 1];\r\n\r\n if (e.shiftKey && document.activeElement === first) {\r\n e.preventDefault();\r\n last.focus();\r\n } else if (!e.shiftKey && document.activeElement === last) {\r\n e.preventDefault();\r\n first.focus();\r\n }\r\n }\r\n\r\n private getFocusable(root: HTMLElement): HTMLElement[] {\r\n return Array.from(\r\n root.querySelectorAll<HTMLElement>(\r\n 'a[href],button:not([disabled]),input:not([disabled]),[tabindex]:not([tabindex=\"-1\"])',\r\n ),\r\n ).filter((el) => el.offsetWidth || el.offsetHeight);\r\n }\r\n\r\n /* =======================\r\n * POSITIONING\r\n * ======================= */\r\n\r\n private updatePosition = () => {\r\n if (!this.triggerEl || !this.contentWrapper) return;\r\n\r\n this.contentWrapper.setAttribute(\"open\", \"\");\r\n\r\n const t = this.triggerEl.getBoundingClientRect();\r\n const c = this.contentWrapper.getBoundingClientRect();\r\n\r\n let top = 0;\r\n let left = 0;\r\n\r\n // Alignment along the cross axis. Previously every branch hardcoded the\r\n // centre calculation, so `align` and `alignOffset` were dead code —\r\n // \"center\" worked by accident and \"start\"/\"end\" did nothing.\r\n const alignAxis = (start: number, size: number, contentSize: number) => {\r\n switch (this.align) {\r\n case \"start\": return start;\r\n case \"end\": return start + size - contentSize;\r\n default: return start + size / 2 - contentSize / 2; // center\r\n }\r\n };\r\n\r\n if (this.side === \"top\") {\r\n top = t.top - c.height - this.sideOffset;\r\n left = alignAxis(t.left, t.width, c.width) + this.alignOffset;\r\n }\r\n if (this.side === \"bottom\") {\r\n top = t.bottom + this.sideOffset;\r\n left = alignAxis(t.left, t.width, c.width) + this.alignOffset;\r\n }\r\n if (this.side === \"left\") {\r\n top = alignAxis(t.top, t.height, c.height) + this.alignOffset;\r\n left = t.left - c.width - this.sideOffset;\r\n }\r\n if (this.side === \"right\") {\r\n top = alignAxis(t.top, t.height, c.height) + this.alignOffset;\r\n left = t.right + this.sideOffset;\r\n }\r\n\r\n top = Math.max(8, Math.min(top, window.innerHeight - c.height - 8));\r\n left = Math.max(8, Math.min(left, window.innerWidth - c.width - 8));\r\n\r\n // Without top-layer support a transformed ancestor may be the containing\r\n // block for position:fixed, shifting the wrapper away from the viewport\r\n // coordinates computed above. Apply, re-measure, and cancel the offset.\r\n this.contentWrapper.style.top = `${top}px`;\r\n this.contentWrapper.style.left = `${left}px`;\r\n const applied = this.contentWrapper.getBoundingClientRect();\r\n top -= applied.top - top;\r\n left -= applied.left - left;\r\n this.contentWrapper.style.top = `${top}px`;\r\n this.contentWrapper.style.left = `${left}px`;\r\n\r\n this.contentStyle = `top:${top}px;left:${left}px;`;\r\n };\r\n\r\n /* =======================\r\n * ARIA\r\n * ======================= */\r\n\r\n private onTriggerSlotChange(e: Event) {\r\n const slot = e.target as HTMLSlotElement;\r\n const first = slot.assignedElements({ flatten: true })[0] as HTMLElement | undefined;\r\n this.triggerEl = first ?? null;\r\n this.applyTriggerAria();\r\n }\r\n\r\n private applyTriggerAria() {\r\n if (!this.triggerEl) return;\r\n this.triggerEl.setAttribute(\"aria-haspopup\", \"dialog\");\r\n this.triggerEl.setAttribute(\"aria-expanded\", String(this.activeOpen));\r\n this.triggerEl.setAttribute(\"aria-controls\", this.uniqueId);\r\n }\r\n\r\n /* =======================\r\n * RENDER\r\n * ======================= */\r\n\r\n render() {\r\n return html`\r\n <slot @slotchange=${this.onTriggerSlotChange}></slot>\r\n\r\n <div\r\n id=\"${this.uniqueId}\"\r\n class=\"content-wrapper\"\r\n popover=\"manual\"\r\n style=\"${this.contentStyle}\"\r\n ?open=\"${this.activeOpen}\"\r\n >\r\n <slot name=\"content\"></slot>\r\n </div>\r\n `;\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"rel-popover\": RelPopover;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\r\n@customElement(\"rel-popover-content\")\r\nexport class RelPopoverContent extends LitElement {\r\n @property({ type: String, attribute: \"aria-label\" }) ariaLabel = \"\";\r\n\r\n /** Figma Size axis (S/M/L): panel padding 12/16/20px. */\r\n @property({ type: String, reflect: true }) size: \"sm\" | \"md\" | \"lg\" = \"md\";\r\n\r\n static styles = css`\r\n :host {\r\n gap: var(--rel-spacing-md);\r\n color: var(--rel-text-body);\r\n display: block;\r\n width: 100%;\r\n max-width: 400px;\r\n }\r\n\r\n .popover-content {\r\n background: var(--rel-bg-neutral);\r\n border: var(--rel-stroke-sm) solid var(--rel-border-default);\r\n border-radius: var(--rel-border-radius-sm);\r\n box-shadow: var(--rel-shadows-shadow-300);\r\n padding: var(--rel-spacing-lg);\r\n color: var(--rel-text-label);\r\n font-family: var(--rel-body-md-regular-font-family);\r\n font-weight: var(--rel-body-md-regular-font-weight);\r\n font-size: var(--rel-body-md-regular-font-size);\r\n line-height: var(--rel-body-md-regular-line-height);\r\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\r\n }\r\n\r\n /* Figma Size axis: S = 12px padding, M = 16px, L = 20px */\r\n :host([size=\"sm\"]) .popover-content {\r\n padding: var(--rel-spacing-sm);\r\n }\r\n\r\n :host([size=\"md\"]) .popover-content {\r\n padding: var(--rel-spacing-md);\r\n }\r\n\r\n :host([size=\"lg\"]) .popover-content {\r\n padding: var(--rel-spacing-lg);\r\n }\r\n\r\n .popover-content ::slotted(h1),\r\n .popover-content ::slotted(h2),\r\n .popover-content ::slotted(h3),\r\n .popover-content ::slotted(h4),\r\n .popover-content ::slotted(h5),\r\n .popover-content ::slotted(h6) {\r\n margin: 0 0 var(--rel-spacing-xs);\r\n font-family: var(--rel-headings-sm-font-family);\r\n font-weight: var(--rel-headings-sm-font-weight);\r\n font-size: var(--rel-headings-sm-font-size);\r\n line-height: var(--rel-headings-sm-line-height);\r\n letter-spacing: var(--rel-headings-sm-letter-spacing);\r\n color: var(--rel-text-label);\r\n margin-bottom: var(--rel-spacing-2xs);\r\n }\r\n\r\n .popover-content ::slotted(p) {\r\n margin: 0 0 var(--rel-spacing-sm);\r\n color: var(--rel-text-placeholder);\r\n line-height: var(--rel-body-md-regular-line-height);\r\n }\r\n\r\n .popover-content ::slotted(p:last-child) {\r\n margin-bottom: 0;\r\n }\r\n `;\r\n\r\n render() {\r\n return html`\r\n <div class=\"popover-content\" part=\"content\" role=\"dialog\" aria-label=\"${this.ariaLabel}\">\r\n <slot></slot>\r\n </div>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\r\nexport type ProgressMode =\r\n | \"linear-determinate\"\r\n | \"linear-indeterminate\"\r\n | \"circular-determinate\"\r\n | \"circular-indeterminate\";\r\n\r\n@customElement(\"rel-progress\")\r\nexport class RelProgress extends LitElement {\r\n @property({ type: String, reflect: true })\r\n mode: ProgressMode = \"linear-determinate\";\r\n\r\n @property({ type: Number })\r\n value = 0;\r\n\r\n private radius = 15.9155;\r\n private circumference = 2 * Math.PI * this.radius;\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n display: block;\r\n font-family: var(--rel-fonts-font-family);\r\n }\r\n\r\n :host([mode*=\"circular\"]) {\r\n display: inline-block;\r\n }\r\n\r\n /* Linear */\r\n .linear-track {\r\n background: var(--rel-bg-neutral-elevated-2);\r\n border-radius: var(--rel-border-radius-square);\r\n height: 6px;\r\n overflow: hidden;\r\n width: 100%;\r\n }\r\n\r\n .linear-bar {\r\n background: var(--rel-bg-neutral-inverse-1);\r\n height: 100%;\r\n }\r\n\r\n /* Width animates only when value-driven (Figma Type=Determinate) */\r\n .linear-bar.determinate {\r\n transition: width 0.3s ease;\r\n }\r\n\r\n .linear-bar.indeterminate {\r\n width: 30%;\r\n animation: linear-indeterminate 1.5s infinite;\r\n }\r\n\r\n @keyframes linear-indeterminate {\r\n 0% {\r\n margin-left: -30%;\r\n }\r\n 50% {\r\n margin-left: 50%;\r\n }\r\n 100% {\r\n margin-left: 100%;\r\n }\r\n }\r\n\r\n /* Circular */\r\n .circular {\r\n display: inline-block;\r\n width: 48px;\r\n height: 48px;\r\n }\r\n\r\n .circular-svg {\r\n transform: rotate(-90deg);\r\n width: 100%;\r\n height: 100%;\r\n }\r\n\r\n .circular-bg {\r\n fill: none;\r\n stroke: var(--rel-border-default);\r\n stroke-width: 3;\r\n }\r\n\r\n .circular-progress {\r\n fill: none;\r\n stroke: var(--rel-text-default);\r\n stroke-width: 3;\r\n stroke-linecap: butt;\r\n transition: stroke-dashoffset 0.35s;\r\n }\r\n\r\n /* Spinner */\r\n .spinner {\r\n animation: rotate 2s linear infinite;\r\n }\r\n\r\n .spinner-path {\r\n stroke: var(--rel-text-default);\r\n stroke-linecap: butt;\r\n animation: dash 1.5s ease-in-out infinite;\r\n }\r\n\r\n @keyframes rotate {\r\n 100% {\r\n transform: rotate(360deg);\r\n }\r\n }\r\n\r\n @keyframes dash {\r\n 0% {\r\n stroke-dasharray: 1, 150;\r\n stroke-dashoffset: 0;\r\n }\r\n 50% {\r\n stroke-dasharray: 90, 150;\r\n stroke-dashoffset: -35;\r\n }\r\n 100% {\r\n stroke-dasharray: 90, 150;\r\n stroke-dashoffset: -124;\r\n }\r\n }\r\n\r\n @media (prefers-reduced-motion: reduce) {\r\n .linear-bar {\r\n transition: none;\r\n }\r\n\r\n .linear-bar.indeterminate {\r\n animation: none;\r\n width: 100%;\r\n opacity: 0.5;\r\n }\r\n\r\n .spinner {\r\n animation: none;\r\n }\r\n\r\n .spinner-path {\r\n animation: none;\r\n stroke-dasharray: 90, 150;\r\n stroke-dashoffset: -35;\r\n }\r\n\r\n .circular-progress {\r\n transition: none;\r\n }\r\n }\r\n `;\r\n\r\n private get safeValue() {\r\n return Math.min(100, Math.max(0, this.value));\r\n }\r\n\r\n private renderLinearDeterminate() {\r\n return html`\r\n <div part=\"track\" class=\"linear-track\" role=\"progressbar\"\r\n aria-valuenow=\"${this.safeValue}\" aria-valuemin=\"0\" aria-valuemax=\"100\">\r\n <div part=\"indicator\" class=\"linear-bar determinate\" style=\"width: ${this.safeValue}%\"></div>\r\n </div>\r\n `;\r\n }\r\n\r\n private renderLinearIndeterminate() {\r\n return html`\r\n <div part=\"track\" class=\"linear-track\" role=\"progressbar\">\r\n <div part=\"indicator\" class=\"linear-bar indeterminate\"></div>\r\n </div>\r\n `;\r\n }\r\n\r\n private renderCircularDeterminate() {\r\n const offset =\r\n this.circumference - (this.safeValue / 100) * this.circumference;\r\n\r\n return html`\r\n <div class=\"circular\">\r\n <svg viewBox=\"0 0 36 36\" class=\"circular-svg\">\r\n <circle class=\"circular-bg\" cx=\"18\" cy=\"18\" r=\"${this.radius}\" />\r\n <circle\r\n class=\"circular-progress\"\r\n cx=\"18\"\r\n cy=\"18\"\r\n r=\"${this.radius}\"\r\n stroke-dasharray=\"${this.circumference}\"\r\n stroke-dashoffset=\"${offset}\"\r\n />\r\n </svg>\r\n </div>\r\n `;\r\n }\r\n\r\n private renderCircularIndeterminate() {\r\n return html`\r\n <div class=\"circular\">\r\n <svg viewBox=\"0 0 50 50\" class=\"spinner\">\r\n <circle\r\n class=\"spinner-path\"\r\n cx=\"25\"\r\n cy=\"25\"\r\n r=\"20\"\r\n fill=\"none\"\r\n stroke-width=\"4\"\r\n />\r\n </svg>\r\n </div>\r\n `;\r\n }\r\n\r\n render() {\r\n switch (this.mode) {\r\n case \"linear-indeterminate\":\r\n return this.renderLinearIndeterminate();\r\n case \"circular-determinate\":\r\n return this.renderCircularDeterminate();\r\n case \"circular-indeterminate\":\r\n return this.renderCircularIndeterminate();\r\n default:\r\n return this.renderLinearDeterminate();\r\n }\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\nimport type { RelResizablePanel } from \"./rel-resizable-panel\";\r\nimport type { RelResizableHandle } from \"./rel-resizable-handle\";\r\n\r\n@customElement(\"rel-resizable-group\")\r\nexport class RelResizableGroup extends LitElement {\r\n /* =======================\r\n * PUBLIC API\r\n * ======================= */\r\n\r\n // reflect: CSS targets :host([direction=\"…\"]) for flex-direction — without\r\n // reflection, setting the property in JS leaves the layout unchanged.\r\n @property({ type: String, reflect: true }) direction: \"horizontal\" | \"vertical\" = \"horizontal\";\r\n\r\n /* =======================\r\n * INTERNAL STATE\r\n * ======================= */\r\n\r\n private panels: RelResizablePanel[] = [];\r\n private handles: RelResizableHandle[] = [];\r\n private isDragging = false;\r\n private activeHandleIndex = -1;\r\n private startPointerPos = 0;\r\n private startSizes: number[] = [];\r\n\r\n /* =======================\r\n * STYLES\r\n * ======================= */\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n display: flex;\r\n width: 100%;\r\n height: 100%;\r\n position: relative;\r\n box-sizing: border-box;\r\n }\r\n\r\n :host([direction=\"horizontal\"]) {\r\n flex-direction: row;\r\n }\r\n\r\n :host([direction=\"vertical\"]) {\r\n flex-direction: column;\r\n }\r\n\r\n ::slotted(rel-resizable-panel) {\r\n flex-shrink: 0;\r\n }\r\n `;\r\n\r\n /* =======================\r\n * LIFECYCLE\r\n * ======================= */\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n this.addEventListener(\"pointerdown\", this.onPointerDown);\r\n this.addEventListener(\"keydown\", this.onKeyDown);\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback();\r\n this.removeEventListener(\"pointerdown\", this.onPointerDown);\r\n this.removeEventListener(\"keydown\", this.onKeyDown);\r\n this.removeGlobalListeners();\r\n }\r\n\r\n firstUpdated() {\r\n this.initializeLayout();\r\n }\r\n\r\n /* =======================\r\n * INITIALIZATION\r\n * ======================= */\r\n\r\n private initializeLayout() {\r\n // Query light DOM for panels and handles\r\n this.panels = Array.from(\r\n this.querySelectorAll(\":scope > rel-resizable-panel\")\r\n ) as RelResizablePanel[];\r\n this.handles = Array.from(\r\n this.querySelectorAll(\":scope > rel-resizable-handle\")\r\n ) as RelResizableHandle[];\r\n\r\n // Set handle indices and orientations\r\n this.handles.forEach((handle, idx) => {\r\n handle.handleIndex = idx;\r\n handle.orientation = this.direction;\r\n });\r\n\r\n // Calculate initial sizes\r\n const sizes = this.calculateInitialSizes();\r\n this.applySizes(sizes);\r\n }\r\n\r\n private calculateInitialSizes(): number[] {\r\n const sizes: number[] = [];\r\n let specifiedTotal = 0;\r\n let unspecifiedCount = 0;\r\n\r\n // First pass: collect specified sizes\r\n this.panels.forEach((panel) => {\r\n if (panel.defaultSize !== undefined) {\r\n sizes.push(panel.defaultSize);\r\n specifiedTotal += panel.defaultSize;\r\n } else {\r\n sizes.push(0);\r\n unspecifiedCount++;\r\n }\r\n });\r\n\r\n // Second pass: distribute remaining space to unspecified panels\r\n if (unspecifiedCount > 0) {\r\n const remaining = Math.max(0, 100 - specifiedTotal);\r\n const perPanel = remaining / unspecifiedCount;\r\n sizes.forEach((size, idx) => {\r\n if (size === 0) {\r\n sizes[idx] = perPanel;\r\n }\r\n });\r\n }\r\n\r\n // Normalize to 100%\r\n const total = sizes.reduce((sum, s) => sum + s, 0);\r\n if (total > 0) {\r\n return sizes.map((s) => (s / total) * 100);\r\n }\r\n\r\n // Fallback: equal distribution\r\n return this.panels.map(() => 100 / this.panels.length);\r\n }\r\n\r\n /* =======================\r\n * POINTER HANDLING\r\n * ======================= */\r\n\r\n private onPointerDown = (e: PointerEvent) => {\r\n // Find the handle anywhere in the composed path — a pointerdown on the\r\n // visible `.grabber` (which lives inside the handle's shadow DOM) makes\r\n // composedPath()[0] a <div>, not the handle, so indexing [0] would abort\r\n // the drag whenever the user grabs the obvious target.\r\n const handle = e\r\n .composedPath()\r\n .find(\r\n (el): el is RelResizableHandle =>\r\n el instanceof HTMLElement && el.tagName === \"REL-RESIZABLE-HANDLE\"\r\n );\r\n if (!handle) return;\r\n\r\n const handleIndex = this.handles.indexOf(handle);\r\n if (handleIndex === -1) return;\r\n\r\n e.preventDefault();\r\n this.startDrag(handleIndex, e);\r\n };\r\n\r\n private startDrag(handleIndex: number, e: PointerEvent) {\r\n this.isDragging = true;\r\n this.activeHandleIndex = handleIndex;\r\n this.startPointerPos = this.direction === \"horizontal\" ? e.clientX : e.clientY;\r\n this.startSizes = this.panels.map((p) => p.currentSize);\r\n\r\n const handle = this.handles[handleIndex];\r\n handle.setAttribute(\"data-dragging\", \"\");\r\n\r\n this.addGlobalListeners();\r\n\r\n // Capture pointer\r\n (e.target as HTMLElement).setPointerCapture(e.pointerId);\r\n }\r\n\r\n private onPointerMove = (e: PointerEvent) => {\r\n if (!this.isDragging || this.activeHandleIndex === -1) return;\r\n\r\n e.preventDefault();\r\n\r\n const currentPos = this.direction === \"horizontal\" ? e.clientX : e.clientY;\r\n const delta = currentPos - this.startPointerPos;\r\n\r\n this.applyDragResize(delta);\r\n };\r\n\r\n private onPointerUp = (e: PointerEvent) => {\r\n if (!this.isDragging) return;\r\n\r\n e.preventDefault();\r\n\r\n const handle = this.handles[this.activeHandleIndex];\r\n if (handle) {\r\n handle.removeAttribute(\"data-dragging\");\r\n }\r\n\r\n this.isDragging = false;\r\n this.activeHandleIndex = -1;\r\n\r\n this.removeGlobalListeners();\r\n\r\n // Dispatch resize-end event\r\n this.dispatchResizeEvent(\"rel-resize-end\");\r\n };\r\n\r\n private applyDragResize(deltaPixels: number) {\r\n const rect = this.getBoundingClientRect();\r\n const totalSize = this.direction === \"horizontal\" ? rect.width : rect.height;\r\n const deltaPercent = (deltaPixels / totalSize) * 100;\r\n\r\n const leftIdx = this.activeHandleIndex;\r\n const rightIdx = this.activeHandleIndex + 1;\r\n\r\n if (leftIdx < 0 || rightIdx >= this.panels.length) return;\r\n\r\n const leftPanel = this.panels[leftIdx];\r\n const rightPanel = this.panels[rightIdx];\r\n\r\n let newLeftSize = this.startSizes[leftIdx] + deltaPercent;\r\n let newRightSize = this.startSizes[rightIdx] - deltaPercent;\r\n\r\n // Clamp to min/max\r\n newLeftSize = Math.max(leftPanel.minSize, Math.min(leftPanel.maxSize, newLeftSize));\r\n newRightSize = Math.max(rightPanel.minSize, Math.min(rightPanel.maxSize, newRightSize));\r\n\r\n // Ensure total is preserved\r\n const pairTotal = this.startSizes[leftIdx] + this.startSizes[rightIdx];\r\n const adjustedTotal = newLeftSize + newRightSize;\r\n if (adjustedTotal !== pairTotal) {\r\n const ratio = pairTotal / adjustedTotal;\r\n newLeftSize *= ratio;\r\n newRightSize *= ratio;\r\n }\r\n\r\n // Update sizes\r\n const newSizes = [...this.startSizes];\r\n newSizes[leftIdx] = newLeftSize;\r\n newSizes[rightIdx] = newRightSize;\r\n\r\n this.applySizes(newSizes);\r\n\r\n // Update handle aria value\r\n const handle = this.handles[this.activeHandleIndex];\r\n if (handle) {\r\n const splitPercent = (newLeftSize / pairTotal) * 100;\r\n handle.updateAriaValue(splitPercent);\r\n }\r\n\r\n // Dispatch resize event\r\n this.dispatchResizeEvent(\"rel-resize\");\r\n }\r\n\r\n /* =======================\r\n * KEYBOARD HANDLING\r\n * ======================= */\r\n\r\n private onKeyDown = (e: KeyboardEvent) => {\r\n const target = e.composedPath()[0] as HTMLElement;\r\n if (target.tagName !== \"REL-RESIZABLE-HANDLE\") return;\r\n\r\n const handle = target as RelResizableHandle;\r\n const handleIndex = this.handles.indexOf(handle);\r\n if (handleIndex === -1) return;\r\n\r\n const isHorizontal = this.direction === \"horizontal\";\r\n const step = e.shiftKey ? 5 : 2;\r\n let applied = false;\r\n\r\n if (isHorizontal && (e.key === \"ArrowLeft\" || e.key === \"ArrowRight\")) {\r\n e.preventDefault();\r\n const delta = e.key === \"ArrowLeft\" ? -step : step;\r\n this.applyKeyboardResize(handleIndex, delta);\r\n applied = true;\r\n } else if (!isHorizontal && (e.key === \"ArrowUp\" || e.key === \"ArrowDown\")) {\r\n e.preventDefault();\r\n const delta = e.key === \"ArrowUp\" ? -step : step;\r\n this.applyKeyboardResize(handleIndex, delta);\r\n applied = true;\r\n }\r\n\r\n if (applied) {\r\n this.dispatchResizeEvent(\"rel-resize-end\");\r\n }\r\n };\r\n\r\n private applyKeyboardResize(handleIndex: number, deltaPercent: number) {\r\n const leftIdx = handleIndex;\r\n const rightIdx = handleIndex + 1;\r\n\r\n if (leftIdx < 0 || rightIdx >= this.panels.length) return;\r\n\r\n const leftPanel = this.panels[leftIdx];\r\n const rightPanel = this.panels[rightIdx];\r\n const currentSizes = this.panels.map((p) => p.currentSize);\r\n\r\n let newLeftSize = currentSizes[leftIdx] + deltaPercent;\r\n let newRightSize = currentSizes[rightIdx] - deltaPercent;\r\n\r\n // Clamp to min/max\r\n newLeftSize = Math.max(leftPanel.minSize, Math.min(leftPanel.maxSize, newLeftSize));\r\n newRightSize = Math.max(rightPanel.minSize, Math.min(rightPanel.maxSize, newRightSize));\r\n\r\n // Ensure total is preserved\r\n const pairTotal = currentSizes[leftIdx] + currentSizes[rightIdx];\r\n const adjustedTotal = newLeftSize + newRightSize;\r\n if (adjustedTotal !== pairTotal) {\r\n const ratio = pairTotal / adjustedTotal;\r\n newLeftSize *= ratio;\r\n newRightSize *= ratio;\r\n }\r\n\r\n // Update sizes\r\n const newSizes = [...currentSizes];\r\n newSizes[leftIdx] = newLeftSize;\r\n newSizes[rightIdx] = newRightSize;\r\n\r\n this.applySizes(newSizes);\r\n\r\n // Update handle aria value\r\n const handle = this.handles[handleIndex];\r\n if (handle) {\r\n const splitPercent = (newLeftSize / pairTotal) * 100;\r\n handle.updateAriaValue(splitPercent);\r\n }\r\n }\r\n\r\n /* =======================\r\n * SIZE APPLICATION\r\n * ======================= */\r\n\r\n private applySizes(sizes: number[]) {\r\n this.panels.forEach((panel, idx) => {\r\n const size = sizes[idx] || 0;\r\n panel.currentSize = size;\r\n panel.style.flexBasis = `${size}%`;\r\n panel.style.flexGrow = \"0\";\r\n panel.style.flexShrink = \"0\";\r\n });\r\n }\r\n\r\n /* =======================\r\n * EVENTS\r\n * ======================= */\r\n\r\n private dispatchResizeEvent(eventName: string) {\r\n const sizes = this.panels.map((p) => p.currentSize);\r\n this.dispatchEvent(\r\n new CustomEvent(eventName, {\r\n detail: {\r\n direction: this.direction,\r\n sizes,\r\n },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n /* =======================\r\n * GLOBAL LISTENERS\r\n * ======================= */\r\n\r\n private addGlobalListeners() {\r\n document.addEventListener(\"pointermove\", this.onPointerMove);\r\n document.addEventListener(\"pointerup\", this.onPointerUp);\r\n }\r\n\r\n private removeGlobalListeners() {\r\n document.removeEventListener(\"pointermove\", this.onPointerMove);\r\n document.removeEventListener(\"pointerup\", this.onPointerUp);\r\n }\r\n\r\n /* =======================\r\n * RENDER\r\n * ======================= */\r\n\r\n render() {\r\n return html`<slot></slot>`;\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"rel-resizable-group\": RelResizableGroup;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\r\n@customElement(\"rel-resizable-panel\")\r\nexport class RelResizablePanel extends LitElement {\r\n /* =======================\r\n * PUBLIC API\r\n * ======================= */\r\n\r\n @property({ type: Number, attribute: \"defaultsize\" }) defaultSize?: number;\r\n @property({ type: Number, attribute: \"minsize\" }) minSize = 10;\r\n @property({ type: Number, attribute: \"maxsize\" }) maxSize = 90;\r\n\r\n /* =======================\r\n * INTERNAL STATE\r\n * ======================= */\r\n\r\n /** Current computed size in percentage */\r\n public currentSize = 0;\r\n\r\n /* =======================\r\n * STYLES\r\n * ======================= */\r\n\r\n static styles = css`\r\n /* Default typography for slotted panel headings (Figma headings-md) */\r\n ::slotted(h1), ::slotted(h2), ::slotted(h3), ::slotted(h4) {\r\n font-family: var(--rel-headings-md-font-family);\r\n font-weight: var(--rel-headings-md-font-weight);\r\n font-size: var(--rel-headings-md-font-size);\r\n line-height: var(--rel-headings-md-line-height);\r\n letter-spacing: var(--rel-headings-md-letter-spacing);\r\n }\r\n\r\n :host {\r\n padding: var(--rel-spacing-md);\r\n color: var(--rel-text-default);\r\n display: flex;\r\n flex-direction: column;\r\n overflow: auto;\r\n box-sizing: border-box;\r\n }\r\n `;\r\n\r\n /* =======================\r\n * RENDER\r\n * ======================= */\r\n\r\n render() {\r\n return html`<slot></slot>`;\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"rel-resizable-panel\": RelResizablePanel;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\r\n@customElement(\"rel-resizable-handle\")\r\nexport class RelResizableHandle extends LitElement {\r\n /* =======================\r\n * PUBLIC API\r\n * ======================= */\r\n\r\n @property({ type: String, reflect: true }) orientation: \"horizontal\" | \"vertical\" = \"horizontal\";\r\n\r\n /* =======================\r\n * INTERNAL STATE\r\n * ======================= */\r\n\r\n /** Index of this handle in the parent group */\r\n public handleIndex = -1;\r\n \r\n /** Current split value (0-100) for aria-valuenow */\r\n public splitValue = 50;\r\n\r\n /* =======================\r\n * STYLES\r\n * ======================= */\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex-shrink: 0;\r\n position: relative;\r\n outline: none;\r\n background: var(--rel-border-default);\r\n transition: background 0.15s ease;\r\n }\r\n\r\n :host([orientation=\"horizontal\"]) {\r\n width: 8px;\r\n min-width: 8px;\r\n cursor: col-resize;\r\n }\r\n\r\n :host([orientation=\"vertical\"]) {\r\n height: 8px;\r\n min-height: 8px;\r\n cursor: row-resize;\r\n }\r\n\r\n :host(:hover),\r\n :host(:focus-visible) {\r\n background: var(--rel-bg-neutral-elevated-1);\r\n }\r\n\r\n :host([dragging]) {\r\n background: var(--rel-bg-neutral-elevated-3);\r\n }\r\n\r\n :host(:focus-visible) {\r\n outline: 2px solid var(--rel-border-focus);\r\n outline-offset: 2px;\r\n }\r\n\r\n .grabber {\r\n background: var(--rel-text-body);\r\n border-radius: var(--rel-border-radius-full-rounded);\r\n transition: background 0.15s ease;\r\n }\r\n\r\n :host([orientation=\"horizontal\"]) .grabber {\r\n width: 4px;\r\n height: 24px;\r\n }\r\n\r\n :host([orientation=\"vertical\"]) .grabber {\r\n width: 24px;\r\n height: 4px;\r\n }\r\n\r\n :host(:hover) .grabber,\r\n :host(:focus-visible) .grabber {\r\n background: var(--rel-bg-surface);\r\n }\r\n\r\n :host([data-dragging]) {\r\n background: var(--rel-bg-neutral-elevated-1);\r\n }\r\n\r\n :host([data-dragging]) .grabber {\r\n background: var(--rel-text-default);\r\n }\r\n\r\n @media (prefers-reduced-motion: reduce) {\r\n :host {\r\n transition: none;\r\n }\r\n\r\n .grabber {\r\n transition: none;\r\n }\r\n }\r\n `;\r\n\r\n /* =======================\r\n * LIFECYCLE\r\n * ======================= */\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n this.setAttribute(\"tabindex\", \"0\");\r\n this.setAttribute(\"role\", \"separator\");\r\n this.updateAriaOrientation();\r\n }\r\n\r\n updated(changed: Map<string, unknown>) {\r\n if (changed.has(\"orientation\")) {\r\n this.updateAriaOrientation();\r\n }\r\n }\r\n\r\n /* =======================\r\n * ARIA\r\n * ======================= */\r\n\r\n private updateAriaOrientation() {\r\n this.setAttribute(\"aria-orientation\", this.orientation);\r\n }\r\n\r\n public updateAriaValue(value: number) {\r\n this.splitValue = value;\r\n this.setAttribute(\"aria-valuenow\", String(Math.round(value)));\r\n this.setAttribute(\"aria-valuemin\", \"0\");\r\n this.setAttribute(\"aria-valuemax\", \"100\");\r\n }\r\n\r\n /* =======================\r\n * RENDER\r\n * ======================= */\r\n\r\n render() {\r\n return html`<div class=\"grabber\"></div>`;\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"rel-resizable-handle\": RelResizableHandle;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\r\nexport type SegmentSize = \"small\" | \"medium\";\r\nexport type SegmentAlign = \"left\" | \"middle\" | \"right\";\r\n\r\nexport interface SegmentOption {\r\n label: string;\r\n value: string;\r\n disabled?: boolean;\r\n}\r\n\r\n@customElement(\"rel-segmented-button\")\r\nexport class RelSegmentedButton extends LitElement {\r\n @property({ type: Array }) options: SegmentOption[] = [];\r\n\r\n @property({ type: String }) active: string = \"\";\r\n\r\n @property({ type: String }) size: SegmentSize = \"medium\";\r\n\r\n @property({ type: String }) align: SegmentAlign = \"left\";\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n display: inline-block;\r\n font-family: var(--rel-fonts-font-family);\r\n }\r\n\r\n .segmented-buttons {\r\n display: inline-flex;\r\n border: 1px solid var(--rel-border-default);\r\n border-radius: var(--rel-border-radius-xs);\r\n overflow: hidden;\r\n }\r\n\r\n /* Alignment */\r\n .align-left {\r\n justify-content: flex-start;\r\n }\r\n\r\n .align-middle {\r\n justify-content: center;\r\n }\r\n\r\n .align-right {\r\n justify-content: flex-end;\r\n }\r\n\r\n /* Base segment styling */\r\n .segment {\r\n padding: var(--rel-spacing-2xs) var(--rel-spacing-sm);\r\n background: var(--rel-bg-neutral);\r\n border: none;\r\n border-radius: 0;\r\n cursor: pointer;\r\n border-right: 1px solid var(--rel-border-default);\r\n transition: background 0.2s ease-in-out, color 0.2s ease-in-out, border-color 0.2s ease-in-out;\r\n color: var(--rel-action-neutral-label-icons-ghost);\r\n font-family: var(--rel-action-md-font-family);\r\n font-weight: var(--rel-action-md-font-weight);\r\n font-size: var(--rel-action-md-font-size);\r\n line-height: var(--rel-action-md-line-height);\r\n letter-spacing: var(--rel-action-md-letter-spacing);\r\n }\r\n\r\n .segment:first-child {\r\n border-radius: var(--rel-border-radius-xs) 0 0 var(--rel-border-radius-xs);\r\n }\r\n\r\n .segment:last-child {\r\n border-radius: 0 var(--rel-border-radius-xs) var(--rel-border-radius-xs) 0;\r\n border-right: none;\r\n }\r\n\r\n .segment:focus-visible {\r\n outline: 2px solid var(--rel-border-focus);\r\n outline-offset: -2px;\r\n z-index: 1;\r\n }\r\n\r\n /* Hover */\r\n .segment:hover:not(.disabled):not(.active) {\r\n background: var(--rel-action-overlay-hover);\r\n }\r\n\r\n /* Active — action-neutral tokens flip automatically in dark mode */\r\n .segment.active {\r\n background: var(--rel-action-neutral-fill);\r\n color: var(--rel-text-inverse);\r\n border-radius: var(--rel-border-radius-xs) !important;\r\n }\r\n\r\n .segment.active:hover:not(.disabled) {\r\n background: var(--rel-action-neutral-fill-hover);\r\n color: var(--rel-action-neutral-label-icons-fill-inverse);\r\n }\r\n\r\n /* Disabled */\r\n .segment.disabled,\r\n .segment:disabled {\r\n cursor: not-allowed;\r\n pointer-events: auto;\r\n opacity: 0.5;\r\n background: var(--rel-bg-neutral-elevated-1);\r\n color: var(--rel-text-disabled);\r\n }\r\n\r\n /* Sizes */\r\n .segmented-buttons.small .segment {\r\n padding: var(--rel-spacing-3xs) var(--rel-spacing-xs);\n font-family: var(--rel-body-xs-regular-font-family);\n font-weight: var(--rel-body-xs-semibold-font-weight);\r\n font-size: var(--rel-body-xs-semibold-font-size);\r\n line-height: var(--rel-body-xs-semibold-line-height);\r\n letter-spacing: var(--rel-body-xs-semibold-letter-spacing);\n }\r\n\r\n .segmented-buttons.medium .segment {\r\n padding: var(--rel-spacing-2xs) var(--rel-spacing-md);\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 }\r\n `;\r\n\r\n private setActive(option: SegmentOption) {\r\n if (!option.disabled) {\r\n this.active = option.value;\r\n this.dispatchEvent(\r\n new CustomEvent(\"changed\", {\r\n detail: { value: option.value },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n }\r\n\r\n private renderSegment(option: SegmentOption) {\r\n const isActive = this.active === option.value;\r\n const classes = [\r\n \"segment\",\r\n isActive ? \"active\" : \"\",\r\n option.disabled ? \"disabled\" : \"\",\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return html`\r\n <button\r\n part=\"option\" class=\"${classes}\"\r\n ?disabled=\"${option.disabled}\"\r\n @click=\"${() => this.setActive(option)}\">\r\n ${option.label}\r\n </button>\r\n `;\r\n }\r\n\r\n render() {\r\n const containerClasses = [\r\n \"segmented-buttons\",\r\n this.size,\r\n `align-${this.align}`,\r\n ].join(\" \");\r\n\r\n return html`\r\n <div part=\"base\" class=\"${containerClasses}\">\r\n ${this.options.map((option) => this.renderSegment(option))}\r\n </div>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css, nothing, PropertyValues } from \"lit\";\nimport { customElement, property, state, query } from \"lit/decorators.js\";\nimport { repeat } from \"lit/directives/repeat.js\";\nimport \"@reliability-design/icons/rel-icon\";\nimport \"../rel-chip/rel-chip.js\";\nimport \"../rel-checkbox/rel-checkbox.js\";\n\nexport type SelectState = \"default\" | \"error\" | \"disabled\";\nexport type SelectSize = \"small\" | \"medium\" | \"large\";\nexport type SelectBorder = \"rounded\" | \"sharp\";\nexport type SelectLabelStyle = \"default\" | \"floating\";\n\nexport interface SelectOptionObject {\n value: string;\n label?: string;\n supportingText?: string;\n /** rel-icon name rendered as a prefix (leading icon) on the menu item. */\n icon?: string;\n}\nexport type SelectOption = string | SelectOptionObject;\n\ninterface NormalizedOption {\n value: string;\n label: string;\n supportingText: string;\n icon: string;\n}\n\nfunction normalizeOption(o: SelectOption): NormalizedOption {\n if (typeof o === \"string\") return { value: o, label: o, supportingText: \"\", icon: \"\" };\n return {\n value: o.value,\n label: o.label ?? o.value,\n supportingText: o.supportingText ?? \"\",\n icon: o.icon ?? \"\",\n };\n}\n\n@customElement(\"rel-select\")\nexport class RelSelect extends LitElement {\n @property({ type: String }) label: string = \"\";\n\n // Lit's default attribute name is the property name fully lowercased (no\n // hyphens) — e.g. labelStyle would otherwise only respond to \"labelstyle\".\n // Every multi-word property below gets an explicit kebab-case `attribute`\n // so it works the way HTML usage actually looks.\n @property({ type: String, attribute: \"label-style\" }) labelStyle: SelectLabelStyle = \"default\";\n\n @property({ type: Array }) options: SelectOption[] = [];\n\n /** Enables multi-select: selected values render as removable chips and options as checkboxes. */\n @property({ type: Boolean }) multiple: boolean = false;\n\n /** Selected value — single-select mode only. */\n @property({ type: String }) selected: string = \"\";\n\n /** Selected values — multi-select mode only. */\n @property({ type: Array, attribute: \"selected-values\" }) selectedValues: string[] = [];\n\n @property({ type: String }) state: SelectState = \"default\";\n\n @property({ type: String, attribute: \"supporting-text\" }) supportingText: string = \"\";\n\n @property({ type: String, reflect: true }) size: SelectSize = \"medium\";\n\n @property({ type: String }) border: SelectBorder = \"rounded\";\n\n @property({ type: String, attribute: \"left-icon\" }) leftIcon: string = \"\";\n\n @property({ type: String, attribute: \"right-icon\" }) rightIcon: string = \"\";\n\n @property({ type: String }) placeholder: string = \"Select option\";\n\n @property({ type: String, attribute: \"search-placeholder\" }) searchPlaceholder: string = \"Search option\";\n\n @property({ type: String, attribute: \"select-all-label\" }) selectAllLabel: string = \"Select all\";\n\n /**\n * Optional hard cap on visible chips. By default (no cap) the visible\n * count adapts to the trigger's width: chips collapse into the \"+N\" badge\n * one by one instead of wrapping to a second line.\n */\n @property({ type: Number, attribute: \"max-visible-chips\" }) maxVisibleChips: number = Infinity;\n\n // Boolean props default true and toggled off via =\"false\" are a classic Lit\n // trap: for type:Boolean, attribute *presence* (not its string value)\n // decides truthiness, so searchable=\"false\" would still read as true. Named\n // negatively instead, so the natural HTML idiom — just adding the bare\n // attribute, no value — does what it looks like it does.\n /** Hides the in-panel search field. Figma's \"Single Option\" dropdown has no search bar at all — use this for short, non-searchable lists. */\n @property({ type: Boolean, attribute: \"no-search\" }) noSearch: boolean = false;\n\n @state() private open = false;\n @state() private highlightedIndex = -1;\n @state() private panelStyle = \"\";\n @state() private searchValue = \"\";\n @state() private internalState: \"default\" | \"focused\" = \"default\";\n\n /** How many chips currently fit in the trigger width (width-adaptive). */\n @state() private visibleChipCount = Infinity;\n\n @query(\".select-trigger\") private triggerEl!: HTMLButtonElement;\n @query(\".search-input\") private searchInputEl!: HTMLInputElement;\n @query(\".select-listbox\") private listboxEl!: HTMLDivElement;\n @query(\".select-value\") private valueEl!: HTMLElement;\n @query(\".select-chips-measure\") private chipsMeasureEl!: HTMLElement;\n\n /** Must match the `gap` of .select-chips / .select-chips-measure. */\n private static readonly CHIP_GAP = 6;\n\n private chipResizeObserver?: ResizeObserver;\n\n private uniqueId = `select-${Math.random().toString(36).slice(2)}`;\n\n static styles = css`\n :host {\n color: var(--rel-text-default);\n display: block;\n font-family: var(--rel-fonts-font-family);\n width: 100%;\n }\n\n .select-wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--rel-spacing-2xs);\n width: 100%;\n }\n\n /* Dims everything inside uniformly (label, trigger, icons, value text,\n supporting text) — matches rel-button's :host([disabled]) opacity\n approach instead of relying on one barely-different background tint. */\n .select-wrapper.disabled {\n opacity: 0.5;\n }\n\n .select-label {\n color: var(--rel-select-label-color, var(--rel-text-label));\n\n font-family: var(--rel-body-sm-regular-font-family);\n\n font-weight: var(--rel-body-sm-regular-font-weight);\n\n font-size: var(--rel-body-sm-regular-font-size);\n\n line-height: var(--rel-body-sm-regular-line-height);\n\n letter-spacing: var(--rel-body-sm-regular-letter-spacing);\n\n }\n\n /* Error only colors the border/focus ring and the supporting text below\n the field — label, floating label, placeholder, and icons stay normal. */\n\n /* Container */\n .select-container {\n position: relative;\n }\n\n /* Trigger button — visually a text field, semantically a combobox button */\n .select-trigger {\n display: flex;\n align-items: center;\n width: 100%;\n box-sizing: border-box;\n gap: 8px;\n background: var(--rel-select-bg, var(--rel-bg-neutral));\n border: 1px solid var(--rel-select-border-default, var(--rel-border-default));\n cursor: pointer;\n font-family: inherit;\n transition: border-color 0.15s ease;\n text-align: left;\n }\n\n .border-rounded .select-trigger {\n border-radius: var(--rel-select-radius, var(--rel-border-radius-xs));\n }\n\n .border-sharp .select-trigger {\n border-radius: 0;\n }\n\n .select-trigger:focus-visible,\n .select-wrapper.open .select-trigger {\n outline: none;\n border-color: var(--rel-select-border-focus, var(--rel-border-strong));\n }\n\n .select-wrapper.error .select-trigger {\n border-color: var(--rel-select-border-error, var(--rel-border-danger));\n }\n\n .select-wrapper.disabled .select-trigger {\n cursor: not-allowed;\n background: var(--rel-select-bg-disabled, var(--rel-bg-neutral-elevated-1));\n border-color: var(--rel-select-border-default, var(--rel-border-default));\n }\n\n /* Sizes */\n .select-wrapper.small .select-trigger {\n padding: var(--rel-spacing-xs) var(--rel-spacing-sm);\n min-height: 40px;\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 .select-wrapper.medium .select-trigger {\n padding: 12px;\n min-height: 48px;\n font-family: var(--rel-body-md-regular-font-family);\n font-weight: var(--rel-body-md-regular-font-weight);\n font-size: var(--rel-body-md-regular-font-size);\n line-height: var(--rel-body-md-regular-line-height);\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\n }\n\n .select-wrapper.large .select-trigger {\n padding: var(--rel-spacing-md);\n min-height: 56px;\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 /* Icons */\n .select-trigger .icon {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n color: var(--rel-select-icon-color, var(--rel-text-default));\n }\n\n .select-trigger .icon.chevron {\n transition: transform 0.15s ease;\n }\n\n .select-wrapper.open .icon.chevron {\n transform: rotate(180deg);\n }\n\n .select-wrapper.disabled .icon {\n color: var(--rel-text-disabled);\n }\n\n /* Value area */\n .select-value {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: nowrap;\n color: var(--rel-select-value-color, var(--rel-text-default));\n overflow: hidden;\n }\n\n .select-value.placeholder {\n color: var(--rel-select-placeholder-color, var(--rel-text-placeholder));\n }\n\n .select-wrapper.disabled .select-value.placeholder {\n color: var(--rel-select-placeholder-disabled-color, var(--rel-text-disabled));\n }\n\n .select-value-text {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n /* Chips never wrap — the number of rendered chips adapts to the\n available width instead (see computeVisibleChips), collapsing the\n remainder into a trailing \"+N\" chip. overflow:hidden guards the one\n frame between a resize and the recomputation catching up. */\n .select-chips {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: nowrap;\n min-width: 0;\n overflow: hidden;\n }\n\n /* Invisible copy of ALL selected chips (plus a worst-case \"+N\" chip),\n laid out unconstrained so computeVisibleChips can read each chip's\n natural width — including chips currently collapsed into \"+N\", whose\n widths are needed again when the field grows. */\n .select-chips-measure {\n position: absolute;\n top: 0;\n left: 0;\n display: flex;\n align-items: center;\n gap: 6px;\n width: max-content;\n visibility: hidden;\n pointer-events: none;\n }\n\n /* rel-chip's outer element is a tabindex=\"0\" span, not a native button —\n a disabled native <button> ancestor doesn't suppress clicks on that\n automatically the way it would for a nested native form control, so\n this has to be switched off explicitly. The cursor still correctly\n falls through to the disabled trigger underneath. */\n .select-wrapper.disabled .select-chips {\n pointer-events: none;\n }\n\n /* Floating label — single element that animates between resting (inside,\n at the value position) and floated (small, on the border line), same\n mechanism as rel-textfield's [floatinglabel]. */\n .floating-label {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n background: var(--rel-select-bg, var(--rel-bg-neutral));\n padding: 0 4px;\n color: var(--rel-select-placeholder-color, var(--rel-text-placeholder));\n pointer-events: none;\n z-index: 1;\n white-space: nowrap;\n transition: top 0.15s ease, left 0.15s ease, font-size 0.15s ease, color 0.15s ease;\n font-family: var(--rel-body-md-regular-font-family);\n font-weight: var(--rel-body-md-regular-font-weight);\n font-size: var(--rel-body-md-regular-font-size);\n line-height: var(--rel-body-md-regular-line-height);\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\n }\n\n .floating-label.has-left-icon {\n left: 40px;\n }\n\n .select-wrapper.focused .floating-label,\n .select-wrapper.has-value .floating-label,\n .select-wrapper.open .floating-label {\n top: 0;\n left: 12px;\n font-size: var(--rel-body-sm-medium-font-size);\n line-height: var(--rel-body-sm-medium-line-height);\n letter-spacing: var(--rel-body-sm-medium-letter-spacing);\n font-weight: var(--rel-body-xs-medium-font-weight);\n color: var(--rel-select-label-color, var(--rel-text-label));\n }\n\n /* The real placeholder hides while the float-label rests in its spot,\n and fades in once the label has moved up to the border. */\n .select-wrapper.floating .select-value.placeholder {\n opacity: 0;\n transition: opacity 0.1s ease;\n }\n\n .select-wrapper.floating.focused .select-value.placeholder,\n .select-wrapper.floating.open .select-value.placeholder {\n opacity: 1;\n }\n\n /* Supporting text */\n .select-support {\n margin-top: var(--rel-spacing-3xs);\n font-size: 13px;\n color: var(--rel-select-supporting-color, var(--rel-text-caption));\n }\n\n .select-support.error {\n color: var(--rel-text-danger);\n }\n\n /* ── Dropdown listbox ── */\n .select-listbox {\n position: fixed;\n z-index: 1001;\n display: none;\n box-sizing: border-box;\n background: var(--rel-select-bg, var(--rel-bg-neutral));\n border: 1px solid var(--rel-select-menu-border, var(--rel-border-default));\n border-radius: var(--rel-select-menu-radius, var(--rel-border-radius-sm));\n /* A border alone doesn't read clearly against a similarly-light page,\n and a shadow alone barely shows on a dark background — together\n they hold up in both themes. */\n box-shadow: var(--rel-select-menu-shadow, var(--rel-shadows-shadow-300));\n max-height: 360px;\n overflow-y: auto;\n }\n\n .select-listbox[data-open] {\n display: block;\n }\n\n .select-search {\n position: sticky;\n top: 0;\n background: var(--rel-select-bg, var(--rel-bg-neutral));\n padding: var(--rel-spacing-xs);\n border-bottom: 1px solid var(--rel-select-divider, var(--rel-border-subtle));\n }\n\n /* Base = \"small\" textfield sizing, shared by both small AND medium\n select — only \"large\" select bumps the search field up to \"medium\". */\n .search-input-wrap {\n display: flex;\n align-items: center;\n gap: 8px;\n border: 1px solid var(--rel-select-search-border, var(--rel-border-default));\n border-radius: 4px;\n padding: var(--rel-spacing-xs) var(--rel-spacing-sm);\n }\n\n .search-input-wrap .icon {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n color: var(--rel-select-icon-color, var(--rel-text-default));\n }\n\n .search-input {\n flex: 1;\n min-width: 0;\n border: none;\n outline: none;\n background: transparent;\n color: var(--rel-select-value-color, var(--rel-text-default));\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 .search-input::placeholder {\n color: var(--rel-select-placeholder-color, var(--rel-text-placeholder));\n }\n\n :host([size=\"large\"]) .search-input-wrap {\n padding: 12px;\n }\n\n :host([size=\"large\"]) .search-input {\n\n font-family: var(--rel-body-md-regular-font-family);\n\n font-weight: var(--rel-body-md-regular-font-weight);\n\n font-size: var(--rel-body-md-regular-font-size);\n\n line-height: var(--rel-body-md-regular-line-height);\n\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\n\n }\n\n .select-options {\n padding: 4px 0;\n }\n\n .select-option {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: var(--rel-spacing-xs) 12px;\n color: var(--rel-select-value-color, var(--rel-text-default));\n cursor: pointer;\n font-family: var(--rel-body-md-regular-font-family);\n font-weight: var(--rel-body-md-regular-font-weight);\n font-size: var(--rel-body-md-regular-font-size);\n line-height: var(--rel-body-md-regular-line-height);\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\n }\n\n /* Groups the optional prefix icon with the label so the trailing\n check indicator stays pinned to the right edge of the row. */\n .select-option-content {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: center;\n gap: var(--rel-spacing-xs);\n }\n\n .select-option-icon {\n flex-shrink: 0;\n color: var(--rel-select-icon-color, var(--rel-text-default));\n }\n\n .select-option-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .select-option-check {\n flex-shrink: 0;\n color: var(--rel-select-value-color, var(--rel-text-default));\n }\n\n .select-option:hover,\n .select-option.highlighted {\n background: var(--rel-select-option-hover, var(--rel-bg-neutral-elevated-1));\n }\n\n .select-option[aria-selected=\"true\"] {\n font-weight: var(--rel-body-md-medium-font-weight);\n }\n\n :host([size=\"large\"]) .select-option[aria-selected=\"true\"] {\n font-weight: var(--rel-body-lg-medium-font-weight);\n }\n\n .checkbox-option {\n padding: 12px;\n }\n\n .checkbox-option:hover,\n .checkbox-option.highlighted {\n background: var(--rel-select-option-hover, var(--rel-bg-neutral-elevated-1));\n }\n\n .select-all-row {\n border-bottom: 1px solid var(--rel-select-divider, var(--rel-border-subtle));\n padding: 12px;\n }\n\n .select-empty {\n padding: var(--rel-spacing-xs) 12px;\n color: var(--rel-select-placeholder-color, var(--rel-text-body));\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 `;\n\n connectedCallback() {\n super.connectedCallback();\n // firstUpdated only runs once — re-observe if the element is re-attached.\n if (this.chipResizeObserver && this.triggerEl) {\n this.chipResizeObserver.observe(this.triggerEl);\n }\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.removeGlobalListeners();\n this.chipResizeObserver?.disconnect();\n }\n\n protected firstUpdated() {\n this.chipResizeObserver = new ResizeObserver(() => this.computeVisibleChips());\n this.chipResizeObserver.observe(this.triggerEl);\n }\n\n protected willUpdate(changed: PropertyValues<this>) {\n if (changed.has(\"multiple\") && this.multiple === false) {\n this.selectedValues = [];\n }\n }\n\n protected updated(changed: PropertyValues<this>) {\n if (\n changed.has(\"selectedValues\") ||\n changed.has(\"options\") ||\n changed.has(\"multiple\") ||\n changed.has(\"size\")\n ) {\n // rAF: rel-chip renders in its own (microtask) update cycle, so its\n // width isn't measurable synchronously here — by the next frame it is.\n requestAnimationFrame(() => this.computeVisibleChips());\n }\n }\n\n /**\n * Width-adaptive chip collapsing: measures every selected chip in the\n * hidden .select-chips-measure row and works out how many fit in the value\n * area, always reserving room for the trailing \"+N\" chip when not all fit.\n * At least one chip stays visible no matter how narrow the field gets.\n */\n private computeVisibleChips() {\n if (!this.isConnected || !this.multiple || this.selectedValues.length === 0) return;\n const measure = this.chipsMeasureEl;\n const container = this.valueEl;\n if (!measure || !container) return;\n\n const available = container.clientWidth;\n if (available <= 0) return; // hidden (display:none) — RO will refire when visible\n\n const children = Array.from(measure.children) as HTMLElement[];\n if (children.length < 2) return;\n\n const gap = RelSelect.CHIP_GAP;\n // Last measure child is the worst-case \"+N\" chip (N = total selected,\n // i.e. the widest label the badge can ever need).\n const overflowWidth = children[children.length - 1].offsetWidth;\n const chipWidths = children.slice(0, -1).map((c) => c.offsetWidth);\n const total = chipWidths.reduce((sum, w) => sum + w, 0) + gap * (chipWidths.length - 1);\n\n let fit: number;\n if (total <= available) {\n fit = chipWidths.length;\n } else {\n fit = 0;\n let used = 0;\n for (let i = 0; i < chipWidths.length; i++) {\n const w = chipWidths[i] + (i > 0 ? gap : 0);\n if (used + w + gap + overflowWidth <= available) {\n used += w;\n fit = i + 1;\n } else {\n break;\n }\n }\n fit = Math.max(1, fit);\n }\n\n if (fit !== this.visibleChipCount) this.visibleChipCount = fit;\n }\n\n private get normalizedOptions(): NormalizedOption[] {\n return this.options.map(normalizeOption);\n }\n\n /** Options matching the current search text (substring match, case-insensitive). */\n private get filteredOptions(): NormalizedOption[] {\n const opts = this.normalizedOptions;\n if (!this.searchValue) return opts;\n const v = this.searchValue.toLowerCase();\n return opts.filter((o) => o.label.toLowerCase().includes(v));\n }\n\n private get hasValue(): boolean {\n return this.multiple ? this.selectedValues.length > 0 : !!this.selected;\n }\n\n /** Icon size scales with the select's own size, matching the trigger. */\n private get iconSize(): \"xs\" | \"sm\" | \"md\" {\n return this.size === \"small\" ? \"xs\" : this.size === \"large\" ? \"md\" : \"sm\";\n }\n\n /** The search field uses \"small\" sizing for both small and medium select — only \"large\" select bumps it to \"medium\". */\n private get searchIconSize(): \"sm\" | \"md\" {\n return this.size === \"large\" ? \"md\" : \"sm\";\n }\n\n private get selectAllStatus(): \"checked\" | \"unchecked\" | \"indeterminate\" {\n const filtered = this.filteredOptions;\n if (filtered.length === 0) return \"unchecked\";\n const selectedCount = filtered.filter((o) => this.selectedValues.includes(o.value)).length;\n if (selectedCount === 0) return \"unchecked\";\n if (selectedCount === filtered.length) return \"checked\";\n return \"indeterminate\";\n }\n\n private addGlobalListeners() {\n document.addEventListener(\"pointerdown\", this.onOutsidePointerDown);\n window.addEventListener(\"resize\", this.updatePosition);\n window.addEventListener(\"scroll\", this.onPageScroll, true);\n }\n\n private removeGlobalListeners() {\n document.removeEventListener(\"pointerdown\", this.onOutsidePointerDown);\n window.removeEventListener(\"resize\", this.updatePosition);\n window.removeEventListener(\"scroll\", this.onPageScroll, true);\n }\n\n private onOutsidePointerDown = (e: PointerEvent) => {\n if (!this.open) return;\n const path = e.composedPath();\n if (path.includes(this)) return;\n this.closeListbox();\n };\n\n // Continuously re-deriving a fixed-position panel's coordinates from\n // every page scroll event is fragile (it's what was causing the panel to\n // jump to the top of the viewport). Instead, close the panel on any\n // *outside* scroll, same as clicking outside — scrolling the option list\n // itself (target is the listbox) is the one case that should NOT close it.\n private onPageScroll = (e: Event) => {\n if (!this.open) return;\n if (e.composedPath()[0] === this.listboxEl) return;\n this.closeListbox();\n };\n\n private emitChange() {\n this.dispatchEvent(\n new CustomEvent(\"changed\", {\n detail: { value: this.multiple ? this.selectedValues : this.selected },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private openListbox() {\n if (this.state === \"disabled\" || this.open) return;\n this.open = true;\n this.searchValue = \"\";\n // No pre-highlight — the first item showing a hover-style highlight\n // before the user has touched anything reads as an unintended default.\n // Highlight only kicks in once they actually hover or press an arrow key.\n this.highlightedIndex = -1;\n this.addGlobalListeners();\n requestAnimationFrame(() => {\n this.updatePosition();\n // preventScroll: focusing the search field must not let the browser\n // scroll the page into view — that would move the trigger (normal\n // flow) out from under the panel (fixed position, already computed\n // above), breaking the anchor. When there's no search field, focus\n // simply stays on the trigger, which already has the nav keydown\n // handling wired up for this case.\n if (!this.noSearch) {\n this.searchInputEl?.focus({ preventScroll: true });\n }\n });\n }\n\n private closeListbox() {\n if (!this.open) return;\n this.open = false;\n this.removeGlobalListeners();\n this.triggerEl?.focus();\n }\n\n private updatePosition = () => {\n if (!this.triggerEl || !this.listboxEl) return;\n\n this.listboxEl.setAttribute(\"data-open\", \"\");\n\n const t = this.triggerEl.getBoundingClientRect();\n const c = this.listboxEl.getBoundingClientRect();\n\n let top = t.bottom + 4;\n if (top + c.height > window.innerHeight - 8) {\n top = Math.max(8, t.top - c.height - 4);\n }\n\n // Use t.width (the trigger's width, which is also what we set the panel's\n // own width to below) rather than c.width — c.width reflects the\n // *previous* render's panelStyle, so on the very next measurement it can\n // be a frame stale, nudging left by a few px even when there's no real\n // overflow. Checking against t.width directly removes that drift.\n let left = t.left;\n if (left + t.width > window.innerWidth - 8) {\n left = Math.max(8, window.innerWidth - t.width - 8);\n }\n\n this.panelStyle = `top:${top}px;left:${left}px;width:${t.width}px;`;\n };\n\n private selectSingleOption(option: NormalizedOption) {\n this.selected = option.value;\n if (this.state === \"error\") this.state = \"default\";\n this.closeListbox();\n this.emitChange();\n }\n\n private toggleMultiOption(option: NormalizedOption) {\n const idx = this.selectedValues.indexOf(option.value);\n this.selectedValues =\n idx >= 0\n ? this.selectedValues.filter((v) => v !== option.value)\n : [...this.selectedValues, option.value];\n if (this.state === \"error\") this.state = \"default\";\n this.emitChange();\n }\n\n private toggleSelectAll() {\n const filtered = this.filteredOptions;\n const status = this.selectAllStatus;\n if (status === \"checked\") {\n const filteredValues = new Set(filtered.map((o) => o.value));\n this.selectedValues = this.selectedValues.filter((v) => !filteredValues.has(v));\n } else {\n const toAdd = filtered.map((o) => o.value).filter((v) => !this.selectedValues.includes(v));\n this.selectedValues = [...this.selectedValues, ...toAdd];\n }\n if (this.state === \"error\") this.state = \"default\";\n this.emitChange();\n }\n\n private removeChip(value: string) {\n if (this.state === \"disabled\") return;\n this.selectedValues = this.selectedValues.filter((v) => v !== value);\n this.emitChange();\n }\n\n private onTriggerClick() {\n if (this.open) this.closeListbox();\n else this.openListbox();\n }\n\n private onTriggerKeyDown(e: KeyboardEvent) {\n if (this.state === \"disabled\") return;\n if (!this.open) {\n if ([\"ArrowDown\", \"ArrowUp\", \"Enter\", \" \"].includes(e.key)) {\n e.preventDefault();\n this.openListbox();\n }\n return;\n }\n // No search field to hold focus/keydown in this mode — the trigger\n // itself keeps focus while open, so it needs the same nav handling.\n if (this.noSearch) this.handleListNavigation(e);\n }\n\n private onSearchInput = (e: InputEvent) => {\n this.searchValue = (e.target as HTMLInputElement).value;\n this.highlightedIndex = this.filteredOptions.length > 0 ? 0 : -1;\n requestAnimationFrame(() => this.updatePosition());\n };\n\n private onSearchKeyDown(e: KeyboardEvent) {\n this.handleListNavigation(e);\n }\n\n private handleListNavigation(e: KeyboardEvent) {\n const filtered = this.filteredOptions;\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n this.highlightedIndex = Math.min(filtered.length - 1, this.highlightedIndex + 1);\n break;\n case \"ArrowUp\":\n e.preventDefault();\n this.highlightedIndex = Math.max(0, this.highlightedIndex - 1);\n break;\n case \"Enter\":\n e.preventDefault();\n if (this.highlightedIndex >= 0 && filtered[this.highlightedIndex]) {\n const opt = filtered[this.highlightedIndex];\n if (this.multiple) this.toggleMultiOption(opt);\n else this.selectSingleOption(opt);\n }\n break;\n case \"Escape\":\n e.preventDefault();\n this.closeListbox();\n break;\n case \"Tab\":\n this.closeListbox();\n break;\n }\n }\n\n private renderChips() {\n const values = this.selectedValues;\n const visible = values.slice(0, Math.min(this.visibleChipCount, this.maxVisibleChips));\n const overflow = values.length - visible.length;\n const opts = this.normalizedOptions;\n\n return html`\n <span class=\"select-chips\">\n ${repeat(\n visible,\n (v) => v,\n (v) => {\n const opt = opts.find((o) => o.value === v);\n // Keyed by value: rel-chip tracks its own \"removed\" flag\n // internally once its (x) is clicked, so reusing DOM nodes\n // positionally (plain .map()) could hand a freshly-shown value\n // a node that still remembers being removed as a *different*\n // value. Keying forces a fresh node per value instead.\n return html`\n <rel-chip\n label=\"${opt?.label ?? v}\"\n size=\"sm\"\n variant=\"subtle\"\n border=\"default\"\n ?removable=${this.state !== \"disabled\"}\n @click=${(e: Event) => e.stopPropagation()}\n @removed=${(e: Event) => {\n e.stopPropagation();\n this.removeChip(v);\n }}\n ></rel-chip>\n `;\n }\n )}\n ${overflow > 0\n ? html`<rel-chip label=\"+${overflow}\" size=\"sm\" variant=\"fill\" border=\"default\"></rel-chip>`\n : nothing}\n </span>\n `;\n }\n\n /**\n * Hidden, unconstrained copy of every selected chip used purely for width\n * measurement (see computeVisibleChips). Chips mirror the visible ones'\n * width-affecting props (removable adds the ✕ icon). The trailing chip is\n * the widest \"+N\" badge that could ever be needed.\n */\n private renderChipsMeasure() {\n const values = this.selectedValues;\n const opts = this.normalizedOptions;\n return html`\n <span class=\"select-chips-measure\" aria-hidden=\"true\">\n ${values.map((v) => {\n const opt = opts.find((o) => o.value === v);\n return html`\n <rel-chip\n label=\"${opt?.label ?? v}\"\n size=\"sm\"\n variant=\"subtle\"\n border=\"default\"\n ?removable=${this.state !== \"disabled\"}\n ></rel-chip>\n `;\n })}\n <rel-chip label=\"+${values.length}\" size=\"sm\" variant=\"fill\" border=\"default\"></rel-chip>\n </span>\n `;\n }\n\n render() {\n const opts = this.normalizedOptions;\n const filtered = this.filteredOptions;\n const isDisabled = this.state === \"disabled\";\n const showFloatingChrome = this.labelStyle === \"floating\" && !!this.label;\n\n const wrapperClasses = [\n \"select-wrapper\",\n this.size,\n this.state,\n `border-${this.border}`,\n showFloatingChrome ? \"floating\" : \"\",\n this.internalState === \"focused\" ? \"focused\" : \"\",\n this.hasValue ? \"has-value\" : \"\",\n this.open ? \"open\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const listboxId = `${this.uniqueId}-listbox`;\n const activeOptionId =\n this.open && this.highlightedIndex >= 0 ? `${this.uniqueId}-option-${this.highlightedIndex}` : \"\";\n\n const selectedSingle = opts.find((o) => o.value === this.selected);\n\n return html`\n <div class=\"${wrapperClasses}\">\n ${!showFloatingChrome && this.label\n ? html`<label part=\"label\" class=\"select-label\" for=\"${this.uniqueId}\">${this.label}</label>`\n : \"\"}\n\n <div class=\"select-container\">\n ${showFloatingChrome\n ? html`<span class=\"floating-label${this.leftIcon ? \" has-left-icon\" : \"\"}\"\n >${this.label}</span\n >`\n : \"\"}\n\n <button\n id=\"${this.uniqueId}\"\n type=\"button\"\n part=\"trigger\" class=\"select-trigger\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-expanded=\"${this.open}\"\n aria-controls=\"${listboxId}\"\n aria-activedescendant=\"${activeOptionId}\"\n aria-invalid=\"${this.state === \"error\"}\"\n aria-label=\"${this.label || this.placeholder}\"\n ?disabled=\"${isDisabled}\"\n @click=\"${this.onTriggerClick}\"\n @keydown=\"${this.onTriggerKeyDown}\"\n @focus=\"${() => (this.internalState = \"focused\")}\"\n @blur=\"${() => (this.internalState = \"default\")}\"\n >\n ${this.leftIcon\n ? html`<rel-icon name=\"${this.leftIcon}\" size=\"${this.iconSize}\" class=\"icon left\"></rel-icon>`\n : \"\"}\n\n ${this.multiple\n ? this.selectedValues.length > 0\n ? html`<span part=\"value\" class=\"select-value\">${this.renderChips()}</span>`\n : html`<span part=\"value\" class=\"select-value placeholder\">\n <span class=\"select-value-text\">${this.placeholder}</span>\n </span>`\n : html`<span part=\"value\" class=\"select-value ${selectedSingle ? \"\" : \"placeholder\"}\">\n <span class=\"select-value-text\"\n >${selectedSingle ? selectedSingle.label : this.placeholder}</span\n >\n </span>`}\n\n <rel-icon\n name=\"${this.rightIcon || \"chevron-down\"}\"\n size=\"${this.iconSize}\"\n class=\"icon ${this.rightIcon ? \"\" : \"chevron\"}\"\n ></rel-icon>\n </button>\n\n ${this.multiple && this.selectedValues.length > 0 ? this.renderChipsMeasure() : nothing}\n </div>\n\n ${this.supportingText\n ? html`<span part=\"helper\" class=\"select-support ${this.state === \"error\" ? \"error\" : \"\"}\">\n ${this.supportingText}\n </span>`\n : \"\"}\n </div>\n\n <div\n id=\"${listboxId}\"\n part=\"panel list\" class=\"select-listbox\"\n role=\"listbox\"\n aria-multiselectable=\"${this.multiple}\"\n aria-label=\"${this.label || \"Options\"}\"\n style=\"${this.panelStyle}\"\n ?data-open=\"${this.open}\"\n >\n ${!this.noSearch\n ? html`<div class=\"select-search\">\n <div class=\"search-input-wrap\">\n <rel-icon name=\"search\" size=\"${this.searchIconSize}\" class=\"icon\"></rel-icon>\n <input\n part=\"input\" class=\"search-input\"\n type=\"text\"\n placeholder=\"${this.searchPlaceholder}\"\n .value=\"${this.searchValue}\"\n @input=\"${this.onSearchInput}\"\n @keydown=\"${(e: KeyboardEvent) => this.onSearchKeyDown(e)}\"\n />\n </div>\n </div>`\n : \"\"}\n\n ${filtered.length === 0\n ? html`<div class=\"select-empty\">\n ${opts.length === 0 ? \"No options available\" : \"No matches found\"}\n </div>`\n : this.multiple\n ? html`\n <div class=\"select-all-row\">\n <rel-checkbox\n label=\"${this.selectAllLabel}\"\n status=\"${this.selectAllStatus}\"\n @rel-change=${(e: Event) => {\n e.stopPropagation();\n this.toggleSelectAll();\n }}\n ></rel-checkbox>\n </div>\n <div class=\"select-options\">\n ${repeat(\n filtered,\n (option) => option.value,\n (option, index) => html`\n <div\n id=\"${this.uniqueId}-option-${index}\"\n class=\"checkbox-option ${index === this.highlightedIndex ? \"highlighted\" : \"\"}\"\n role=\"option\"\n aria-selected=\"${this.selectedValues.includes(option.value)}\"\n @pointerenter=\"${() => (this.highlightedIndex = index)}\"\n >\n <rel-checkbox\n label=\"${option.label}\"\n icon=\"${option.icon}\"\n supportingtext=\"${option.supportingText}\"\n status=\"${this.selectedValues.includes(option.value) ? \"checked\" : \"unchecked\"}\"\n @rel-change=${(e: Event) => {\n e.stopPropagation();\n this.toggleMultiOption(option);\n }}\n ></rel-checkbox>\n </div>\n `\n )}\n </div>\n `\n : html`\n <div class=\"select-options\">\n ${repeat(\n filtered,\n (option) => option.value,\n (option, index) => html`\n <div\n id=\"${this.uniqueId}-option-${index}\"\n part=\"option\" class=\"select-option ${index === this.highlightedIndex ? \"highlighted\" : \"\"}\"\n role=\"option\"\n aria-selected=\"${option.value === this.selected}\"\n @mousedown=\"${(e: Event) => e.preventDefault()}\"\n @click=\"${() => this.selectSingleOption(option)}\"\n @pointerenter=\"${() => (this.highlightedIndex = index)}\"\n >\n <span class=\"select-option-content\">\n ${option.icon\n ? html`<rel-icon\n name=\"${option.icon}\"\n size=\"sm\"\n class=\"select-option-icon\"\n ></rel-icon>`\n : nothing}\n <span class=\"select-option-label\">${option.label}</span>\n </span>\n ${option.value === this.selected\n ? html`<rel-icon name=\"check\" size=\"sm\" class=\"select-option-check\"></rel-icon>`\n : \"\"}\n </div>\n `\n )}\n </div>\n `}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"rel-select\": RelSelect;\n }\n}\n","import { LitElement, html, css } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\n\nexport type SkeletonShape = \"line\" | \"circle\" | \"block\";\nexport type SkeletonAnimation = \"pulse\" | \"shimmer\" | \"none\";\n\n@customElement(\"rel-skeleton\")\nexport class RelSkeleton extends LitElement {\n @property({ type: String, reflect: true }) shape: SkeletonShape = \"block\";\n @property({ type: Number }) lines = 1;\n @property({ type: String }) width = \"\";\n @property({ type: String }) height = \"\";\n @property({ type: String, reflect: true }) animation: SkeletonAnimation = \"pulse\";\n @property({ type: Boolean, reflect: true }) loaded = false;\n\n protected override updated(changed: Map<string, unknown>) {\n if (changed.has(\"width\") && this.width) this.style.width = this.width;\n if (changed.has(\"height\") && this.height) this.style.height = this.height;\n }\n\n static styles = css`\n :host {\n color: var(--rel-text-default);\n display: block;\n }\n\n :host([loaded]) {\n display: none;\n }\n\n /* ── Circle: aspect-ratio keeps it square without requiring explicit height ── */\n :host([shape=\"circle\"]) {\n aspect-ratio: 1 / 1;\n }\n\n /* ── Base skeleton surface ── */\n .skeleton-shape,\n .skeleton-bar {\n background: var(--rel-skeleton-color, var(--rel-bg-neutral-elevated-3));\n border-radius: var(--rel-border-radius-xs);\n }\n\n /* ── Lines layout ── */\n .skeleton-lines {\n display: flex;\n flex-direction: column;\n gap: 8px;\n width: 100%;\n }\n\n .skeleton-bar {\n height: 14px;\n width: 100%;\n }\n\n /* Last line shortens to 65% — mimics real paragraph text that doesn't reach the edge */\n .skeleton-bar.is-last {\n width: 65%;\n }\n\n /* ── Shape (circle / block) ── */\n .skeleton-shape {\n width: 100%;\n height: 100%;\n min-height: 16px;\n }\n\n :host([shape=\"circle\"]) .skeleton-shape {\n border-radius: 50%;\n /* No min-height — circle is sized entirely by host width + aspect-ratio */\n min-height: unset;\n }\n\n /* ── Pulse animation ── */\n @keyframes rel-skeleton-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.4; }\n }\n\n :host([animation=\"pulse\"]) .skeleton-shape,\n :host([animation=\"pulse\"]) .skeleton-bar {\n animation: rel-skeleton-pulse 1.5s ease-in-out infinite;\n }\n\n /* ── Shimmer animation ── */\n @keyframes rel-skeleton-shimmer {\n 0% { background-position: 200% center; }\n 100% { background-position: -200% center; }\n }\n\n :host([animation=\"shimmer\"]) .skeleton-shape,\n :host([animation=\"shimmer\"]) .skeleton-bar {\n background: linear-gradient(\n 90deg,\n var(--rel-skeleton-color, var(--rel-bg-neutral-elevated-3)) 25%,\n var(--rel-skeleton-highlight, var(--rel-bg-neutral-elevated-2)) 50%,\n var(--rel-skeleton-color, var(--rel-bg-neutral-elevated-3)) 75%\n );\n background-size: 200% 100%;\n animation: rel-skeleton-shimmer 1.5s linear infinite;\n }\n\n /* ── Respect reduced-motion preference ── */\n @media (prefers-reduced-motion: reduce) {\n .skeleton-shape,\n .skeleton-bar {\n animation: none !important;\n }\n }\n `;\n\n render() {\n if (this.loaded) return html``;\n\n if (this.shape === \"line\") {\n const count = Math.max(1, this.lines);\n return html`\n <div class=\"skeleton-lines\">\n ${Array.from({ length: count }, (_, i) => html`\n <div part=\"base\" class=\"skeleton-bar ${i === count - 1 && count > 1 ? \"is-last\" : \"\"}\"></div>\n `)}\n </div>\n `;\n }\n\n return html`<div part=\"base\" class=\"skeleton-shape\"></div>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"rel-skeleton\": RelSkeleton;\n }\n}\n","import { LitElement, html, css } from \"lit\";\nimport { customElement, property, query } from \"lit/decorators.js\";\nimport \"@reliability-design/icons/rel-icon\";\n\nexport type ModalSide = \"top\" | \"bottom\" | \"center\";\n\n@customElement(\"rel-modal\")\nexport class RelModal extends LitElement {\n @property({ type: Boolean, reflect: true }) open = false;\n @property({ type: String }) side: ModalSide = \"bottom\";\n @property({ type: String }) title = \"\";\n @property({ type: String }) description = \"\";\n @property({ type: Boolean }) dismissible = true;\n @property({ type: Boolean }) modal = true;\n\n /**\n * Figma \"Breakpoint\" axis. responsive (default) collapses to a full-width\n * bottom sheet below 480px; web keeps the fixed desktop panel at every size.\n */\n @property({ type: String, reflect: true })\n breakpoint: \"responsive\" | \"web\" = \"responsive\";\n\n @query(\".overlay\") private overlayElement!: HTMLElement;\n\n private previousFocus: HTMLElement | null = null;\n private originalBodyOverflow = \"\";\n private originalBodyPaddingRight = \"\";\n\n static styles = css`\n :host {\n color: var(--rel-text-default);\n --modal-transition-duration: 0.3s;\n --modal-transition-timing: cubic-bezier(0.32, 0.72, 0, 1);\n }\n\n .modal-container {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 1000;\n pointer-events: none;\n /* pointer-events:none only blocks the mouse — the closed modal's\n close button and slotted content would otherwise stay in the Tab\n order and swallow keyboard focus into invisible UI. visibility\n also removes them from the tab order; the transition delays the\n flip to hidden until the close animation has played. */\n visibility: hidden;\n transition: visibility 0s linear var(--modal-transition-duration);\n }\n\n .modal-container.open {\n pointer-events: auto;\n visibility: visible;\n transition-delay: 0s;\n }\n\n .overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--rel-overlay-scrim);\n opacity: 0;\n transition: opacity var(--modal-transition-duration) var(--modal-transition-timing);\n }\n\n .modal-container.open .overlay {\n opacity: 1;\n }\n\n .overlay.no-modal {\n display: none !important;\n }\n\n .panel {\n position: absolute;\n background: var(--rel-bg-surface);\n box-shadow: var(--rel-shadows-shadow-500);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n outline: none;\n font-family: var(--rel-fonts-font-family);\n width: clamp(360px, 49vw, 708px);\n left: 50%;\n transition: transform var(--modal-transition-duration) var(--modal-transition-timing),\n opacity var(--modal-transition-duration) var(--modal-transition-timing);\n }\n\n .panel[data-side=\"bottom\"] {\n bottom: 48px;\n left: 50%;\n width: clamp(360px, 49vw, 708px);\n max-height: calc(100vh - 96px);\n border-radius: var(--rel-border-radius-sm);\n transform: translateX(-50%) translateY(calc(100% + 48px));\n }\n\n .modal-container.open .panel[data-side=\"bottom\"] {\n transform: translateX(-50%) translateY(0);\n }\n\n .panel[data-side=\"top\"] {\n top: 48px;\n left: 50%;\n width: clamp(360px, 49vw, 708px);\n max-height: calc(100vh - 96px);\n border-radius: var(--rel-border-radius-sm);\n transform: translateX(-50%) translateY(calc(-100% - 48px));\n }\n\n .modal-container.open .panel[data-side=\"top\"] {\n transform: translateX(-50%) translateY(0);\n }\n\n .panel[data-side=\"center\"] {\n top: 50%;\n left: 50%;\n width: clamp(360px, 49vw, 708px);\n max-height: calc(100vh - 96px);\n border-radius: var(--rel-border-radius-sm);\n transform: translate(-50%, -50%) scale(0.96);\n opacity: 0;\n }\n\n .modal-container.open .panel[data-side=\"center\"] {\n transform: translate(-50%, -50%) scale(1);\n opacity: 1;\n }\n\n /* Figma Breakpoint=Responsive: below 480px every side collapses to a\n full-width bottom sheet. Breakpoint=Web keeps the desktop panel. */\n @media (max-width: 480px) {\n :host([breakpoint=\"responsive\"]) .panel,\n :host([breakpoint=\"responsive\"]) .panel[data-side=\"top\"],\n :host([breakpoint=\"responsive\"]) .panel[data-side=\"center\"],\n :host([breakpoint=\"responsive\"]) .panel[data-side=\"bottom\"] {\n width: 100%;\n left: 0;\n right: 0;\n top: auto;\n bottom: 0;\n max-height: 90vh;\n border-radius: var(--rel-border-radius-md) var(--rel-border-radius-md) 0 0;\n opacity: 1;\n transform: translateY(100%);\n }\n\n :host([breakpoint=\"responsive\"]) .modal-container.open .panel,\n :host([breakpoint=\"responsive\"]) .modal-container.open .panel[data-side=\"top\"],\n :host([breakpoint=\"responsive\"]) .modal-container.open .panel[data-side=\"center\"],\n :host([breakpoint=\"responsive\"]) .modal-container.open .panel[data-side=\"bottom\"] {\n transform: translateY(0);\n }\n }\n\n .header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n padding: var(--rel-spacing-md) var(--rel-spacing-lg);\n border-bottom: var(--rel-stroke-sm) solid var(--rel-border-default);\n flex-shrink: 0;\n }\n\n .header.empty {\n display: none;\n }\n\n .header-text {\n gap: var(--rel-spacing-2xs);\n display: flex;\n flex-direction: column;\n gap: var(--rel-spacing-2xs);\n }\n\n .title {\n color: var(--rel-text-label);\n margin: 0;\n\n font-family: var(--rel-headings-lg-font-family);\n\n font-weight: var(--rel-headings-lg-font-weight);\n\n font-size: var(--rel-headings-lg-font-size);\n\n line-height: var(--rel-headings-lg-line-height);\n\n letter-spacing: var(--rel-headings-lg-letter-spacing);\n\n }\n\n .description {\n color: var(--rel-text-body);\n margin: 0;\n\n font-family: var(--rel-body-lg-regular-font-family);\n\n font-weight: var(--rel-body-lg-regular-font-weight);\n\n font-size: var(--rel-body-lg-regular-font-size);\n\n line-height: var(--rel-body-lg-regular-line-height);\n\n letter-spacing: var(--rel-body-lg-regular-letter-spacing);\n\n }\n\n /* Emphasised inline text in slotted content (Figma body-lg-medium) */\n .content ::slotted(strong),\n .content ::slotted(b) {\n font-weight: var(--rel-body-lg-medium-font-weight);\n }\n\n .close-button {\n background: transparent;\n border: none;\n cursor: pointer;\n padding: var(--rel-spacing-2xs);\n display: flex;\n align-items: center;\n justify-content: center;\n align-self: flex-start;\n flex-shrink: 0;\n border-radius: var(--rel-border-radius-xs);\n color: var(--rel-text-default);\n transition: background 0.15s ease;\n }\n\n .close-button:hover {\n background: var(--rel-bg-neutral-elevated-1);\n }\n\n .close-button:focus-visible {\n outline: 2px solid var(--rel-border-focus);\n outline-offset: 2px;\n }\n\n .content {\n flex: 1;\n overflow-y: auto;\n padding: var(--rel-spacing-xl);\n }\n\n .footer {\n display: none;\n }\n\n :host([has-footer]) .footer {\n display: flex;\n flex-shrink: 0;\n padding: var(--rel-spacing-md) var(--rel-spacing-lg);\n border-top: var(--rel-stroke-sm) solid var(--rel-border-default);\n justify-content: flex-end;\n gap: var(--rel-spacing-xs);\n }\n\n @media (prefers-reduced-motion: reduce) {\n .overlay,\n .panel {\n transition: none;\n }\n\n .modal-container .panel {\n transform: none;\n }\n\n .modal-container:not(.open) .panel {\n display: none;\n }\n }\n `;\n\n connectedCallback() {\n super.connectedCallback();\n if (this.open) {\n this.lockScroll();\n }\n this.updateComplete.then(() => {\n const footerSlot = this.shadowRoot?.querySelector(\n 'slot[name=\"footer\"]'\n ) as HTMLSlotElement | null;\n if (footerSlot) {\n const sync = () => {\n const hasContent = footerSlot.assignedElements({ flatten: true }).length > 0;\n this.toggleAttribute('has-footer', hasContent);\n };\n footerSlot.addEventListener('slotchange', sync);\n sync();\n }\n });\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.unlockScroll();\n document.removeEventListener(\"keydown\", this.handleKeydown);\n }\n\n protected willUpdate() {\n // `title` doubles as HTML's global tooltip attribute: leaving it on the\n // host shows a native tooltip anywhere over the modal, including the\n // full-viewport backdrop. Sync it into the property, then strip it.\n if (this.hasAttribute(\"title\")) {\n const value = this.getAttribute(\"title\") ?? \"\";\n this.removeAttribute(\"title\");\n this.title = value;\n }\n }\n\n updated(changed: Map<string, unknown>) {\n if (changed.has(\"open\")) {\n if (this.open) {\n this.handleOpen();\n } else {\n this.handleClose();\n }\n }\n }\n\n private handleOpen() {\n this.previousFocus = document.activeElement as HTMLElement;\n this.lockScroll();\n document.addEventListener(\"keydown\", this.handleKeydown);\n this.dispatchEvent(\n new CustomEvent(\"rel-open-change\", {\n detail: true,\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private handleClose() {\n this.unlockScroll();\n document.removeEventListener(\"keydown\", this.handleKeydown);\n if (this.previousFocus?.focus) {\n this.updateComplete.then(() => {\n this.previousFocus?.focus();\n this.previousFocus = null;\n });\n }\n this.dispatchEvent(\n new CustomEvent(\"rel-open-change\", {\n detail: false,\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private lockScroll() {\n if (typeof document === \"undefined\") return;\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\n this.originalBodyOverflow = document.body.style.overflow;\n this.originalBodyPaddingRight = document.body.style.paddingRight;\n document.body.style.overflow = \"hidden\";\n if (scrollbarWidth > 0) {\n document.body.style.paddingRight = `${scrollbarWidth}px`;\n }\n }\n\n private unlockScroll() {\n if (typeof document === \"undefined\") return;\n document.body.style.overflow = this.originalBodyOverflow;\n document.body.style.paddingRight = this.originalBodyPaddingRight;\n }\n\n private handleKeydown = (e: KeyboardEvent) => {\n if (!this.open) return;\n if (e.key === \"Escape\" && this.dismissible) {\n e.preventDefault();\n this.open = false;\n }\n };\n\n private handleOverlayClick = (e: MouseEvent) => {\n if (!this.dismissible) return;\n if (e.target === this.overlayElement) {\n this.open = false;\n }\n };\n\n private handleCloseButtonClick() {\n this.open = false;\n }\n\n render() {\n const hasTitle = !!this.title;\n const hasDescription = !!this.description;\n const showHeader = hasTitle || hasDescription || this.dismissible;\n\n return html`\n <div class=\"modal-container ${this.open ? \"open\" : \"\"}\">\n <div\n part=\"overlay\"\n class=\"overlay ${!this.modal ? 'no-modal' : ''}\"\n @click=\"${this.handleOverlayClick}\"></div>\n\n <div\n part=\"panel\"\n class=\"panel\"\n data-side=\"${this.side}\"\n role=\"${this.modal ? \"dialog\" : \"region\"}\"\n aria-modal=\"${this.modal}\"\n tabindex=\"-1\">\n\n <div part=\"header\" class=\"header ${!showHeader ? \"empty\" : \"\"}\">\n <div class=\"header-text\">\n ${hasTitle ? html`<h2 class=\"title\">${this.title}</h2>` : \"\"}\n ${hasDescription ? html`<p class=\"description\">${this.description}</p>` : \"\"}\n </div>\n ${this.dismissible\n ? html`<button\n part=\"close-button\"\n class=\"close-button\"\n @click=\"${this.handleCloseButtonClick}\"\n aria-label=\"Close\">\n <rel-icon name=\"close\" size=\"sm\"></rel-icon>\n </button>`\n : \"\"}\n </div>\n\n <div part=\"content\" class=\"content\">\n <slot></slot>\n </div>\n\n <div part=\"footer\" class=\"footer\">\n <slot name=\"footer\"></slot>\n </div>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"rel-modal\": RelModal;\n }\n}\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property, state } from \"lit/decorators.js\";\r\n\r\n/**\r\n * \"continuous\"/\"discrete\" are the legacy tick-mode values; Figma's Type axis\r\n * adds \"default\" (alias of continuous) and \"range\" (dual-thumb interval).\r\n */\r\nexport type SliderType = \"continuous\" | \"discrete\" | \"default\" | \"range\";\r\nexport type TrackStyle = \"solid\" | \"dotted\";\r\n\r\n@customElement(\"rel-slider\")\r\nexport class RelSlider extends LitElement {\r\n @property({ type: String, reflect: true }) type: SliderType = \"continuous\";\r\n\r\n /** Figma Size axis (S/M/L): scales track, thumb and ticks. */\r\n @property({ type: String, reflect: true }) size: \"sm\" | \"md\" | \"lg\" = \"md\";\r\n\r\n @property({ type: Number }) min: number = 0;\r\n\r\n @property({ type: Number }) max: number = 100;\r\n\r\n @property({ type: Number }) step: number = 1;\r\n\r\n @property({ type: Boolean }) disabled: boolean = false;\r\n\r\n @property({ type: String }) track: TrackStyle = \"solid\";\r\n\r\n @property({ type: Boolean }) showTickLabels: boolean = false;\r\n\r\n @property({ type: Boolean }) showBubble: boolean = true;\r\n\r\n @property({ type: Number }) value: number = 0;\r\n\r\n /** Upper value when type=\"range\" (attribute value-end). */\r\n @property({ type: Number, attribute: \"value-end\" }) valueEnd: number = 100;\r\n\r\n @state() private ticks: number[] = [];\r\n\r\n private _onChange: (value: number) => void = () => {};\r\n private _onTouched: () => void = () => {};\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n --track-height: 8px;\r\n --thumb-size: 20px;\r\n --thumb-stroke: 7px;\r\n --thumb-halo-color: var(--rel-border-default);\r\n --tick-size: 4px;\r\n --shadow: 0 2px 4px rgba(0, 0, 0, 0.25);\r\n --halo: 0 2px 0 var(--rel-bg-neutral-elevated-1), 0 6px 10px rgba(0, 0, 0, 0.07);\r\n --marker-width: 24px;\r\n --marker-height: 28px;\r\n\r\n display: block;\r\n font-family: var(--rel-label-md-font-family);\r\n font-weight: var(--rel-label-md-font-weight);\r\n font-size: var(--rel-label-md-font-size);\r\n line-height: var(--rel-label-md-line-height);\r\n letter-spacing: var(--rel-label-md-letter-spacing);\r\n }\r\n\r\n /* Figma Size axis: S = 6px track / 16px thumb · M = 8/20 · L = 10/24 */\r\n :host([size=\"sm\"]) {\r\n --track-height: 6px;\r\n --thumb-size: 16px;\r\n --tick-size: 4px;\r\n }\r\n\r\n :host([size=\"md\"]) {\r\n --track-height: 8px;\r\n --thumb-size: 20px;\r\n --tick-size: 5px;\r\n }\r\n\r\n :host([size=\"lg\"]) {\r\n --track-height: 10px;\r\n --thumb-size: 24px;\r\n --tick-size: 6px;\r\n }\r\n\r\n .rel-slider {\r\n position: relative;\r\n width: 100%;\r\n height: 60px;\r\n user-select: none;\r\n }\r\n\r\n /* Track */\r\n .track {\r\n position: absolute;\r\n top: 50%;\r\n left: 0;\r\n width: 100%;\r\n height: var(--track-height);\r\n background: var(--rel-bg-neutral-elevated-3);\r\n border-radius: 2px;\r\n transform: translateY(-50%);\r\n pointer-events: none;\r\n }\r\n\r\n .track-active {\r\n position: absolute;\r\n top: 50%;\r\n left: 0;\r\n height: var(--track-height);\r\n background: var(--rel-text-default);\r\n border-radius: 2px;\r\n transform: translateY(-50%);\r\n pointer-events: none;\r\n }\r\n\r\n .track-active.dotted {\r\n background: radial-gradient(\r\n circle,\r\n var(--rel-text-default) 0 2px,\r\n transparent 2px\r\n ) 0 50%/var(--rel-spacing-sm) 5px repeat-x;\r\n }\r\n\r\n /* Range mode: pointer interaction is handled by the container so each\r\n thumb can be grabbed; the native inputs stay for keyboard/AT. */\r\n .rel-slider.range .slider-input {\r\n pointer-events: none;\r\n }\r\n\r\n .rel-slider.range {\r\n touch-action: none;\r\n }\r\n\r\n /* Input */\r\n .slider-input {\r\n -webkit-appearance: none;\r\n appearance: none;\r\n position: absolute;\r\n top: 0;\r\n width: 100%;\r\n left: 0;\r\n height: 100%;\r\n background: transparent;\r\n outline: none;\r\n cursor: pointer;\r\n z-index: 2;\r\n margin: 0;\r\n padding: 0;\r\n }\r\n\r\n .slider-input::-webkit-slider-runnable-track {\r\n background: transparent;\r\n height: 100%;\r\n border: none;\r\n }\r\n\r\n .slider-input::-moz-range-track {\r\n background: transparent;\r\n height: 100%;\r\n border: none;\r\n }\r\n\r\n .slider-input::slider-track {\r\n background: transparent;\r\n height: 100%;\r\n border: none;\r\n }\r\n\r\n /* Hide native thumb */\r\n .slider-input::-webkit-slider-thumb {\r\n -webkit-appearance: none;\r\n appearance: none;\r\n width: 1px;\r\n height: 1px;\r\n background: transparent;\r\n border: none;\r\n cursor: pointer;\r\n }\r\n\r\n .slider-input::-moz-range-thumb {\r\n width: 1px;\r\n height: 1px;\r\n background: transparent;\r\n border: none;\r\n cursor: pointer;\r\n }\r\n\r\n .slider-input::slider-thumb {\r\n width: 1px;\r\n height: 1px;\r\n background: transparent;\r\n border: none;\r\n cursor: pointer;\r\n }\r\n\r\n .slider-input:focus-visible ~ .thumb-container .custom-thumb {\r\n box-shadow: 0 0 0 var(--thumb-stroke) var(--thumb-halo-color),\r\n var(--shadow), var(--halo);\r\n }\r\n\r\n @media (prefers-reduced-motion: reduce) {\r\n .custom-thumb,\r\n .tick {\r\n transition: none;\r\n }\r\n }\r\n\r\n /* Custom Thumb Container */\r\n .thumb-container {\r\n position: absolute;\r\n left: 0;\r\n top: 50%;\r\n transform: translate(-50%, calc(-100% + var(--thumb-size) / 2));\r\n pointer-events: none;\r\n z-index: 5;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n gap: 0;\r\n }\r\n\r\n /* Value Marker */\r\n .value-marker {\r\n width: var(--marker-width);\r\n height: var(--marker-height);\r\n margin-bottom: var(--rel-spacing-3xs);\r\n }\r\n\r\n .value-marker text {\r\n font-family: var(--rel-label-sm-font-family);\r\n font-weight: var(--rel-label-sm-font-weight);\r\n font-size: var(--rel-label-sm-font-size);\r\n line-height: var(--rel-label-sm-line-height);\r\n }\r\n\r\n .value-marker svg {\r\n width: 100%;\r\n height: 100%;\r\n display: block;\r\n }\r\n\r\n /* Custom Thumb */\r\n .custom-thumb {\r\n width: var(--thumb-size);\r\n height: var(--thumb-size);\r\n background: var(--rel-border-strong);\r\n border-radius: 50%;\r\n transition: box-shadow 0.15s ease;\r\n }\r\n\r\n .slider-input:hover:not(:disabled) ~ .thumb-container .custom-thumb {\r\n box-shadow: 0 0 0 var(--thumb-stroke) var(--rel-action-overlay-hover),\r\n var(--shadow), var(--halo);\r\n }\r\n\r\n .slider-input:active ~ .thumb-container .custom-thumb {\r\n box-shadow: 0 0 0 var(--thumb-stroke) var(--rel-action-overlay-pressed),\r\n var(--shadow), var(--halo);\r\n }\r\n\r\n /* Ticks */\r\n .ticks {\r\n position: absolute;\r\n top: 50%;\r\n left: 0;\r\n width: 100%;\r\n transform: translateY(-50%);\r\n pointer-events: none;\r\n }\r\n\r\n .tick {\r\n position: absolute;\r\n width: var(--tick-size);\r\n height: var(--tick-size);\r\n background: var(--rel-text-default);\r\n border-radius: 50%;\r\n transform: translate(-50%, -50%);\r\n transition: background 0.2s;\r\n z-index: 3;\r\n }\r\n\r\n .tick.active {\r\n background: var(--rel-bg-neutral);\r\n }\r\n\r\n /* Tick labels */\r\n .tick-labels {\r\n position: absolute;\r\n top: calc(50% + var(--tick-size) + var(--rel-spacing-2xs));\r\n left: 0;\r\n width: 100%;\r\n color: var(--rel-text-label);\r\n pointer-events: none;\r\n font-family: var(--rel-label-xs-font-family);\r\n font-weight: var(--rel-label-xs-font-weight);\r\n font-size: var(--rel-label-xs-font-size);\r\n line-height: var(--rel-label-xs-line-height);\r\n letter-spacing: var(--rel-label-xs-letter-spacing);\r\n }\r\n\r\n .tick-label {\r\n position: absolute;\r\n transform: translateX(-50%);\r\n }\r\n\r\n /* Disabled State */\r\n .rel-slider.disabled .track {\r\n background: var(--rel-border-default);\r\n }\r\n\r\n .rel-slider.disabled .track-active {\r\n background: var(--rel-text-placeholder);\r\n }\r\n\r\n .rel-slider.disabled .track-active.dotted {\r\n background: radial-gradient(\r\n circle,\r\n var(--rel-bg-neutral-elevated-1) 0 1px,\r\n transparent 1px\r\n )\r\n center/var(--rel-spacing-sm) 4px repeat-x,\r\n var(--rel-text-placeholder);\r\n }\r\n\r\n .rel-slider.disabled .tick {\r\n background: var(--rel-text-placeholder);\r\n }\r\n\r\n .rel-slider.disabled .tick-label {\r\n color: var(--rel-text-placeholder);\r\n }\r\n\r\n .rel-slider.disabled .slider-input {\r\n cursor: not-allowed;\r\n }\r\n\r\n .rel-slider.disabled .custom-thumb {\r\n background: var(--rel-text-placeholder);\r\n box-shadow: none;\r\n }\r\n\r\n .rel-slider.disabled .slider-input:active ~ .thumb-container .custom-thumb,\r\n .rel-slider.disabled .slider-input:focus-visible ~ .thumb-container .custom-thumb {\r\n box-shadow: none;\r\n }\r\n\r\n .rel-slider.disabled .value-marker svg path {\r\n fill: var(--rel-text-placeholder);\r\n }\r\n\r\n /* Dark mode overrides */\r\n :host-context([data-theme=\"dark\"]),\r\n :host-context(.dark) {\r\n --thumb-halo-color: var(--rel-border-default);\r\n --halo: 0 2px 0 var(--rel-bg-neutral-elevated-2),\r\n 0 6px 10px rgba(0, 0, 0, 0.3);\r\n }\r\n\r\n `;\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n this.setupTicks();\r\n }\r\n\r\n updated(changedProperties: Map<string, any>) {\r\n if (\r\n changedProperties.has(\"type\") ||\r\n changedProperties.has(\"min\") ||\r\n changedProperties.has(\"max\") ||\r\n changedProperties.has(\"step\")\r\n ) {\r\n this.setupTicks();\r\n }\r\n if (\r\n changedProperties.has(\"value\") ||\r\n changedProperties.has(\"valueEnd\") ||\r\n changedProperties.has(\"type\")\r\n ) {\r\n this.updateActiveWidth();\r\n }\r\n }\r\n\r\n private get isRange(): boolean {\r\n return this.type === \"range\";\r\n }\r\n\r\n private get percentage(): number {\r\n if (this.max === this.min) return 0;\r\n return ((this.value - this.min) / (this.max - this.min)) * 100;\r\n }\r\n\r\n private get percentageEnd(): number {\r\n if (this.max === this.min) return 0;\r\n return ((this.valueEnd - this.min) / (this.max - this.min)) * 100;\r\n }\r\n\r\n private dragThumb: \"start\" | \"end\" | null = null;\r\n\r\n private valueFromPointer(e: PointerEvent): number {\r\n const el = this.shadowRoot?.querySelector(\".rel-slider\") as HTMLElement;\r\n if (!el) return this.min;\r\n const rect = el.getBoundingClientRect();\r\n const pct = Math.min(1, Math.max(0, (e.clientX - rect.left) / rect.width));\r\n let v = this.min + pct * (this.max - this.min);\r\n v = Math.round(v / this.step) * this.step;\r\n return Math.min(this.max, Math.max(this.min, v));\r\n }\r\n\r\n private onRangePointerDown(e: PointerEvent) {\r\n if (!this.isRange || this.disabled) return;\r\n const v = this.valueFromPointer(e);\r\n this.dragThumb =\r\n Math.abs(v - this.value) <= Math.abs(v - this.valueEnd) ? \"start\" : \"end\";\r\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\r\n this.applyRangeValue(v);\r\n }\r\n\r\n private onRangePointerMove(e: PointerEvent) {\r\n if (!this.dragThumb) return;\r\n this.applyRangeValue(this.valueFromPointer(e));\r\n }\r\n\r\n private onRangePointerUp() {\r\n this.dragThumb = null;\r\n }\r\n\r\n private applyRangeValue(v: number) {\r\n if (this.dragThumb === \"start\") {\r\n this.value = Math.min(v, this.valueEnd);\r\n } else if (this.dragThumb === \"end\") {\r\n this.valueEnd = Math.max(v, this.value);\r\n }\r\n this.updateActiveWidth();\r\n this.emitRangeChange();\r\n }\r\n\r\n private emitRangeChange() {\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-change\", {\r\n detail: { value: this.value, valueEnd: this.valueEnd },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n this._onChange(this.value);\r\n }\r\n\r\n private onRangeInputStart(ev: Event) {\r\n const next = Number((ev.target as HTMLInputElement).value);\r\n this.value = Math.min(next, this.valueEnd);\r\n this.updateActiveWidth();\r\n this.emitRangeChange();\r\n }\r\n\r\n private onRangeInputEnd(ev: Event) {\r\n const next = Number((ev.target as HTMLInputElement).value);\r\n this.valueEnd = Math.max(next, this.value);\r\n this.updateActiveWidth();\r\n this.emitRangeChange();\r\n }\r\n\r\n private setupTicks() {\r\n if (this.type !== \"discrete\") {\r\n this.ticks = [];\r\n return;\r\n }\r\n\r\n const step = Math.max(1, this.step);\r\n const ticks: number[] = [];\r\n for (let v = this.min; v <= this.max; v += step) {\r\n ticks.push(v);\r\n }\r\n if (ticks[ticks.length - 1] !== this.max) {\r\n ticks.push(this.max);\r\n }\r\n this.ticks = ticks;\r\n }\r\n\r\n private getTickLeftPct(tick: number): number {\r\n const pct = ((tick - this.min) / (this.max - this.min)) * 100;\r\n return Math.round(pct * 1000) / 1000;\r\n }\r\n\r\n private isTickActive(tick: number): boolean {\r\n return tick <= this.value;\r\n }\r\n\r\n private onInput(ev: Event) {\r\n const el = ev.target as HTMLInputElement;\r\n let next = Number(el.value);\r\n\r\n if (this.type === \"discrete\") {\r\n const snapped =\r\n Math.round((next - this.min) / this.step) * this.step + this.min;\r\n next = Math.min(this.max, Math.max(this.min, snapped));\r\n el.value = String(next);\r\n }\r\n\r\n this.value = next;\r\n this.updateActiveWidth();\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-change\", {\r\n detail: { value: this.value },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n this._onChange(this.value);\r\n }\r\n\r\n registerOnChange(fn: (value: number) => void): void { this._onChange = fn; }\r\n registerOnTouched(fn: () => void): void { this._onTouched = fn; }\r\n writeValue(value: number): void { this.value = value; }\r\n\r\n private updateActiveWidth() {\r\n const activeEl = this.shadowRoot?.querySelector(\".track-active\") as HTMLDivElement;\r\n if (!activeEl) return;\r\n\r\n if (this.isRange) {\r\n activeEl.style.left = `${this.percentage}%`;\r\n activeEl.style.width = `${Math.max(0, this.percentageEnd - this.percentage)}%`;\r\n } else if (this.type === \"discrete\") {\r\n const stepPercent = (this.step / (this.max - this.min)) * 100;\r\n const snappedPct = Math.round(this.percentage / stepPercent) * stepPercent;\r\n activeEl.style.width = `${snappedPct}%`;\r\n } else {\r\n activeEl.style.width = `${this.percentage}%`;\r\n }\r\n }\r\n\r\n private renderThumbContainer(pct: number = this.percentage, val: number = this.value) {\r\n return html`\r\n <div class=\"thumb-container\" style=\"left: ${pct}%\">\r\n ${this.showBubble ? html`\r\n <div class=\"value-marker\">\r\n <svg viewBox=\"0 0 24 32\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M12 0C18.6274 0 24 5.37258 24 12C24 21 12 32 12 32C12 32 0 21 0 12C0 5.37258 5.37258 0 12 0Z\"\r\n fill=\"var(--rel-bg-neutral-inverse-2)\" />\r\n <text\r\n x=\"12\"\r\n y=\"16\"\r\n text-anchor=\"middle\"\r\n fill=\"var(--rel-text-inverse)\"\r\n font-size=\"12\"\r\n font-family=\"Poppins\"\r\n font-weight=\"600\">\r\n ${val}\r\n </text>\r\n </svg>\r\n </div>\r\n ` : \"\"}\r\n <div part=\"thumb\" class=\"custom-thumb\"></div>\r\n </div>\r\n `;\r\n }\r\n\r\n private renderTicks() {\r\n if (this.type !== \"discrete\") return \"\";\r\n\r\n return html`\r\n <div class=\"ticks\">\r\n ${this.ticks.map(\r\n (tick) => html`\r\n <div\r\n class=\"tick ${this.isTickActive(tick) ? \"active\" : \"\"}\"\r\n style=\"left: ${this.getTickLeftPct(tick)}%\"></div>\r\n `\r\n )}\r\n </div>\r\n `;\r\n }\r\n\r\n private renderTickLabels() {\r\n if (this.type !== \"discrete\" || !this.showTickLabels) return \"\";\r\n\r\n return html`\r\n <div class=\"tick-labels\">\r\n ${this.ticks.map(\r\n (tick) => html`\r\n <div\r\n class=\"tick-label\"\r\n style=\"left: ${this.getTickLeftPct(tick)}%\">\r\n ${tick}\r\n </div>\r\n `\r\n )}\r\n </div>\r\n `;\r\n }\r\n\r\n render() {\r\n const sliderClasses = [\r\n \"rel-slider\",\r\n this.disabled ? \"disabled\" : \"\",\r\n this.type === \"discrete\" ? \"has-ticks\" : \"\",\r\n this.isRange ? \"range\" : \"\",\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n const trackActiveClasses = [\r\n \"track-active\",\r\n this.track === \"dotted\" ? \"dotted\" : \"\",\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n if (this.isRange) {\r\n return html`\r\n <div\r\n class=\"${sliderClasses}\"\r\n @pointerdown=\"${this.onRangePointerDown}\"\r\n @pointermove=\"${this.onRangePointerMove}\"\r\n @pointerup=\"${this.onRangePointerUp}\"\r\n @pointercancel=\"${this.onRangePointerUp}\"\r\n >\r\n <div part=\"track\" class=\"track\"></div>\r\n <div class=\"${trackActiveClasses}\"></div>\r\n\r\n <input\r\n class=\"slider-input\"\r\n type=\"range\"\r\n aria-label=\"Range start\"\r\n .min=\"${String(this.min)}\"\r\n .max=\"${String(this.max)}\"\r\n .step=\"${String(this.step)}\"\r\n .value=\"${String(this.value)}\"\r\n ?disabled=\"${this.disabled}\"\r\n @input=\"${this.onRangeInputStart}\"\r\n @blur=\"${() => this._onTouched()}\" />\r\n <input\r\n class=\"slider-input\"\r\n type=\"range\"\r\n aria-label=\"Range end\"\r\n .min=\"${String(this.min)}\"\r\n .max=\"${String(this.max)}\"\r\n .step=\"${String(this.step)}\"\r\n .value=\"${String(this.valueEnd)}\"\r\n ?disabled=\"${this.disabled}\"\r\n @input=\"${this.onRangeInputEnd}\"\r\n @blur=\"${() => this._onTouched()}\" />\r\n\r\n ${this.renderThumbContainer(this.percentage, this.value)}\r\n ${this.renderThumbContainer(this.percentageEnd, this.valueEnd)}\r\n </div>\r\n `;\r\n }\r\n\r\n return html`\r\n <div class=\"${sliderClasses}\">\r\n <div part=\"track\" class=\"track\"></div>\r\n <div class=\"${trackActiveClasses}\"></div>\r\n\r\n <input\r\n class=\"slider-input\"\r\n type=\"range\"\r\n .min=\"${String(this.min)}\"\r\n .max=\"${String(this.max)}\"\r\n .step=\"${this.type === 'discrete' ? String(this.step) : '1'}\"\r\n .value=\"${String(this.value)}\"\r\n ?disabled=\"${this.disabled}\"\r\n @input=\"${this.onInput}\"\r\n @blur=\"${() => this._onTouched()}\" />\r\n\r\n ${this.renderThumbContainer()}\r\n ${this.renderTicks()}\r\n ${this.renderTickLabels()}\r\n </div>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property, state } from \"lit/decorators.js\";\r\nimport \"@reliability-design/icons/rel-icon\";\r\n\r\nexport type SnackbarLines = \"single\" | \"double\";\r\nexport type SnackbarType = \"default\" | \"success\" | \"error\" | \"warning\";\r\n\r\n@customElement(\"rel-snackbar\")\r\nexport class RelSnackbar extends LitElement {\r\n @property({ type: String }) message: string = \"This is a snackbar message\";\r\n\r\n @property({ type: String }) action?: string;\r\n\r\n @property({ type: Boolean }) longerAction: boolean = false;\r\n\r\n @property({ type: Boolean }) iconClose: boolean = true;\r\n\r\n @property({ type: String }) lines: SnackbarLines = \"single\";\r\n\r\n @property({ type: Number }) duration: number = 4000;\r\n\r\n @property({ type: String }) type: SnackbarType = \"default\";\r\n @property({ type: Boolean, reflect: true }) show = false;\r\n\r\n @state() private visible: boolean = false;\r\n\r\n private _dismissTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n display: block;\r\n font-family: var(--rel-fonts-font-family);\r\n }\r\n\r\n .snackbar {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n min-width: 280px;\r\n max-width: 500px;\r\n margin: 0;\r\n padding: var(--rel-spacing-sm) var(--rel-spacing-md) var(--rel-spacing-sm) var(--rel-spacing-xs);\r\n border-radius: var(--rel-border-radius-sm);\r\n background-color: var(--rel-bg-static-dark);\r\n color: var(--rel-text-static-light);\r\n font-family: var(--rel-fonts-font-family);\r\n box-shadow: var(--rel-shadows-shadow-300);\r\n animation: slide-up 0.3s ease-out;\r\n border-left: 4px solid transparent;\r\n }\r\n\r\n .snackbar.two-line {\r\n flex-direction: column;\r\n align-items: stretch;\r\n }\r\n\r\n .snackbar.hidden {\r\n display: none;\r\n }\r\n\r\n /* Type variants — border accent using semantic DS tokens */\r\n /* Status fills stay vivid on the always-dark snackbar surface */\r\n .snackbar.type-success {\r\n border-left-color: var(--rel-bg-success);\r\n }\r\n\r\n .snackbar.type-error {\r\n border-left-color: var(--rel-bg-danger);\r\n }\r\n\r\n .snackbar.type-warning {\r\n border-left-color: var(--rel-bg-warning);\r\n }\r\n\r\n /* Icon color matches type accent */\r\n .snackbar.type-success .snackbar-icon {\r\n color: var(--rel-bg-success);\r\n }\r\n\r\n .snackbar.type-error .snackbar-icon {\r\n color: var(--rel-bg-danger);\r\n }\r\n\r\n .snackbar.type-warning .snackbar-icon {\r\n color: var(--rel-bg-warning);\r\n }\r\n\r\n .snackbar-icon {\r\n display: flex;\r\n align-items: center;\r\n margin-right: 10px;\r\n flex-shrink: 0;\r\n }\r\n\r\n .snackbar-body {\r\n display: flex;\r\n align-items: center;\r\n flex: 1;\r\n min-width: 0;\r\n }\r\n\r\n .snackbar-message {\r\r\r\n margin-right: var(--rel-spacing-sm);\r\n flex: 1;\n\r\n font-family: var(--rel-body-md-regular-font-family);\n\r\n font-weight: var(--rel-body-md-regular-font-weight);\n\r\n font-size: var(--rel-body-md-regular-font-size);\n\r\n line-height: var(--rel-body-md-regular-line-height);\n\r\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\n\r\n }\r\n\r\n .snackbar.two-line .snackbar-message {\r\n margin-right: 0;\r\n margin-bottom: 8px;\r\n flex: none;\r\n }\r\n\r\n .snackbar-actions {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-2xs);\r\n flex-shrink: 0;\r\n align-self: center;\r\n }\r\n\r\n .snackbar.two-line .snackbar-actions {\r\n align-self: flex-end;\r\n }\r\n\r\n .snackbar-action {\r\n background: none;\r\n border: none;\r\n color: var(--rel-text-static-light);\r\r\r\r\n cursor: pointer;\r\n padding: 0;\r\n display: flex;\r\n align-items: center;\r\n transition: opacity 0.2s ease;\n font-family: var(--rel-action-md-font-family);\n font-weight: var(--rel-action-md-font-weight);\n font-size: var(--rel-action-md-font-size);\n line-height: var(--rel-action-md-line-height);\n letter-spacing: var(--rel-action-md-letter-spacing);\n }\r\n\r\n .snackbar-action:hover {\r\n opacity: 0.8;\r\n }\r\n\r\n .snackbar-action:active {\r\n opacity: 0.6;\r\n }\r\n\r\n .snackbar-action:focus-visible {\r\n outline: 2px solid var(--rel-text-static-light);\r\n outline-offset: 2px;\r\n border-radius: var(--rel-border-radius-xs);\r\n }\r\n\r\n .snackbar-close {\r\n background: none;\r\n border: none;\r\n color: var(--rel-action-neutral-label-icons-fill-inverse);\r\n cursor: pointer;\r\n padding: 0;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n transition: opacity 0.2s ease;\r\n }\r\n\r\n .snackbar-close:hover {\r\n opacity: 0.8;\r\n }\r\n\r\n .snackbar-close:active {\r\n opacity: 0.6;\r\n }\r\n\r\n .snackbar-close:focus-visible {\r\n outline: 2px solid var(--rel-text-static-light);\r\n outline-offset: 2px;\r\n border-radius: var(--rel-border-radius-xs);\r\n }\r\n\r\n /* Prevent any inherited transform from firing on button click */\r\n .snackbar button:active {\r\n transform: none;\r\n }\r\n\r\n @media (prefers-reduced-motion: reduce) {\r\n .snackbar {\r\n animation: none;\r\n }\r\n }\r\n\r\n @keyframes slide-up {\r\n from {\r\n transform: translateY(50px);\r\n opacity: 0;\r\n }\r\n to {\r\n transform: translateY(0);\r\n opacity: 1;\r\n }\r\n }\r\n `;\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n }\r\n\r\n willUpdate(changed: Map<string, unknown>) {\r\n if (!changed.has('show')) return;\r\n if (this.show) {\r\n this.visible = true;\r\n this.setAutoDismiss();\r\n } else {\r\n this.visible = false;\r\n this.clearDismissTimer();\r\n }\r\n }\r\n\r\n updated(changed: Map<string, unknown>) {\r\n if ((changed.has(\"duration\") || changed.has(\"longerAction\")) && this.show) {\r\n this.setAutoDismiss();\r\n }\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback();\r\n this.clearDismissTimer();\r\n }\r\n\r\n private setAutoDismiss() {\r\n if (this.duration > 0) {\r\n this.clearDismissTimer();\r\n const delay = this.longerAction ? this.duration * 2 : this.duration;\r\n this._dismissTimer = setTimeout(() => this.dismiss(), delay);\r\n }\r\n }\r\n\r\n private clearDismissTimer() {\r\n if (this._dismissTimer !== null) {\r\n clearTimeout(this._dismissTimer);\r\n this._dismissTimer = null;\r\n }\r\n }\r\n\r\n private onActionClick() {\r\n this.dispatchEvent(\r\n new CustomEvent(\"actionClick\", {\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n this.dismiss();\r\n }\r\n\r\n private dismiss() {\r\n this.show = false;\r\n this.visible = false;\r\n this.dispatchEvent(\r\n new CustomEvent(\"close\", {\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private renderIcon() {\r\n const iconMap: Record<string, string> = {\r\n success: \"check-circle\",\r\n error: \"error\",\r\n warning: \"warning\",\r\n };\r\n const name = iconMap[this.type];\r\n if (!name) return html``;\r\n return html`<rel-icon name=\"${name}\" size=\"lg\" class=\"snackbar-icon\"></rel-icon>`;\r\n }\r\n\r\n render() {\r\n const snackbarClasses = [\r\n \"snackbar\",\r\n this.lines === \"double\" ? \"two-line\" : \"\",\r\n !this.visible ? \"hidden\" : \"\",\r\n this.type !== \"default\" ? `type-${this.type}` : \"\",\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return html`\r\n <div class=\"${snackbarClasses}\">\r\n <div class=\"snackbar-body\">\r\n ${this.type !== \"default\" ? this.renderIcon() : \"\"}\r\n <div part=\"label\" class=\"snackbar-message\">${this.message}</div>\r\n </div>\r\n\r\n <div class=\"snackbar-actions\">\r\n ${this.action\r\n ? html`\r\n <button part=\"action\" class=\"snackbar-action\" @click=\"${this.onActionClick}\">\r\n ${this.action}\r\n </button>\r\n `\r\n : \"\"}\r\n ${this.iconClose\r\n ? html`\r\n <button part=\"close-button\" class=\"snackbar-close\" @click=\"${this.dismiss}\">\r\n <rel-icon name=\"close\" size=\"md\"></rel-icon>\r\n </button>\r\n `\r\n : \"\"}\r\n </div>\r\n </div>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\r\nexport type StepStatus = \"done\" | \"progress\" | \"disabled\";\r\nexport type TextAlign = \"right\" | \"below\";\r\nexport type Orientation = \"horizontal\" | \"vertical\";\r\nexport type StepperSize = \"small\" | \"large\";\r\n/** Figma \"Type\": indicator content — default (number, check when done), dot, number, icon. */\r\nexport type StepperType = \"default\" | \"dot\" | \"number\" | \"icon\";\r\n/** Figma \"Typel\": label placement relative to the indicator. */\r\nexport type LabelPlacement = \"top\" | \"centered\" | \"inverted\";\r\n\r\nexport interface Step {\r\n title: string;\r\n status: StepStatus;\r\n}\r\n\r\n@customElement(\"rel-stepper\")\r\nexport class RelStepper extends LitElement {\r\n @property({ type: Array }) steps: Step[] = [];\r\n\r\n @property({ type: String }) textAlign: TextAlign = \"below\";\r\n\r\n @property({ type: String }) orientation: Orientation = \"horizontal\";\r\n\r\n @property({ type: String }) size: StepperSize = \"large\";\r\n\r\n @property({ type: String, reflect: true }) type: StepperType = \"default\";\r\n\r\n /**\r\n * Figma Typel axis: top = label top-aligned beside the indicator,\r\n * centered = label vertically centered beside it, inverted = indicator above\r\n * the label. When unset, the legacy textAlign prop drives the layout\r\n * (below ≈ inverted, right ≈ centered). Note Figma marks Top+Horizontal\r\n * as an unsupported combination.\r\n */\r\n @property({ type: String, reflect: true, attribute: \"label-placement\" })\r\n labelPlacement?: LabelPlacement;\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n display: block;\r\n font-family: var(--rel-fonts-font-family);\r\n }\r\n\r\n /********************************************\r\n * Base Stepper Styles\r\n ********************************************/\r\n .rel-stepper {\r\n display: flex;\r\n font-family: var(--rel-fonts-font-family);\r\n width: 100%;\r\n position: relative;\r\n }\r\n\r\n /* Orientation */\r\n .rel-stepper.horizontal {\r\n flex-direction: row;\r\n align-items: flex-start;\r\n justify-content: center;\r\n }\r\n\r\n .rel-stepper.vertical.text-below {\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: start;\r\n }\r\n\r\n .rel-stepper.vertical.text-right {\r\n flex-direction: column;\r\n align-items: flex-start;\r\n justify-content: start;\r\n }\r\n\r\n /********************************************\r\n * Step Container\r\n ********************************************/\r\n .rel-step {\r\n display: flex;\r\n position: relative;\r\n }\r\n\r\n .rel-stepper.horizontal.text-below .rel-step {\r\n flex-direction: column;\r\n align-items: center;\r\n text-align: center;\r\n position: relative;\r\n flex: 0;\r\n }\r\n\r\n .rel-stepper.horizontal.text-right .rel-step {\r\n flex-direction: row;\r\n align-items: center;\r\n position: relative;\r\n flex: 0;\r\n gap: var(--rel-spacing-2xs);\r\n }\r\n\r\n /* Vertical layout variants */\r\n .rel-stepper.vertical.text-below .rel-step {\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: start;\r\n position: relative;\r\n }\r\n\r\n .rel-stepper.vertical.text-right .rel-step {\r\n flex-direction: row;\r\n align-items: flex-start;\r\n justify-content: center;\r\n position: relative;\r\n gap: var(--rel-spacing-2xs);\r\n }\r\n\r\n /* Wrapper for indicator and connector */\r\n .indicator-wrapper {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n position: relative;\r\n }\r\n\r\n /* Wrapper for indicator and label (text-below only) */\r\n .step-content {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-2xs);\r\n }\r\n\r\n .text-below-content {\r\n flex-direction: column;\r\n }\r\n\r\n .text-right-content {\r\n flex-direction: row;\r\n }\r\n\r\n /********************************************\r\n * Indicator\r\n ********************************************/\r\n .indicator {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: var(--rel-stepper-indicator-size, 22px);\r\n height: var(--rel-stepper-indicator-size, 22px);\r\n border: 2px solid var(--rel-bg-neutral-elevated-2);\r\n background: var(--rel-bg-neutral);\r\n border-radius: 50%;\r\n position: relative;\r\n z-index: 2;\r\n transition: background 0.2s ease, border-color 0.2s ease, color 0.2s ease;\r\n flex-shrink: 0;\r\n font-family: var(--rel-body-sm-semibold-font-family);\r\n font-weight: var(--rel-body-sm-semibold-font-weight);\r\n font-size: var(--rel-body-sm-semibold-font-size);\r\n line-height: var(--rel-body-sm-semibold-line-height);\r\n letter-spacing: var(--rel-body-sm-semibold-letter-spacing);\r\n }\r\n\r\n .indicator svg {\r\n width: 12px;\r\n height: auto;\r\n display: block;\r\n }\r\n\r\n /* Figma Type=Dot: bare dot indicator, no number/icon */\r\n :host([type=\"dot\"]) .indicator {\r\n width: 12px;\r\n height: 12px;\r\n }\r\n\r\n :host([type=\"dot\"]) .rel-step.done .indicator,\r\n :host([type=\"dot\"]) .rel-step.progress .indicator {\r\n background: var(--rel-bg-neutral-inverse-2);\r\n border-color: var(--rel-bg-neutral-inverse-2);\r\n }\r\n\r\n /* Figma Typel=Top: label top-aligned against the indicator */\r\n .rel-stepper.label-top .rel-step {\r\n align-items: flex-start;\r\n }\r\n\r\n /********************************************\r\n * Labels\r\n ********************************************/\r\n .step-label {\r\n white-space: nowrap;\r\n color: var(--rel-text-body);\r\n font-family: var(--rel-body-md-regular-font-family);\r\n font-weight: var(--rel-body-md-regular-font-weight);\r\n font-size: var(--rel-body-md-regular-font-size);\r\n line-height: var(--rel-body-md-regular-line-height);\r\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\r\n }\r\n\r\n /* Horizontal text-below specific */\r\n .rel-stepper.vertical .rel-step {\r\n column-gap: var(--rel-spacing-sm);\r\n }\r\n\r\n .rel-stepper.small .step-label {\r\n font-family: var(--rel-body-sm-regular-font-family);\r\n font-weight: var(--rel-body-sm-regular-font-weight);\r\n font-size: var(--rel-body-sm-regular-font-size);\r\n line-height: var(--rel-body-sm-regular-line-height);\r\n letter-spacing: var(--rel-body-sm-regular-letter-spacing);\r\n }\r\n\r\n .rel-step.disabled .indicator {\r\n color: var(--rel-text-caption);\r\n }\r\n\r\n .rel-stepper.horizontal.text-below .step-label {\r\n margin-top: var(--rel-spacing-2xs);\r\n text-align: center;\r\n }\r\n\r\n /* Horizontal text-right specific */\r\n .rel-stepper.horizontal.text-right .step-label {\r\n margin-top: 0;\r\n margin-left: 0;\r\n margin-right: var(--rel-spacing-xs);\r\n text-align: left;\r\n }\r\n\r\n /* Vertical text-right specific */\r\n .rel-stepper.vertical.text-right .step-label {\r\n margin-top: 0;\r\n margin-left: 0;\r\n text-align: left;\r\n }\r\n\r\n /* Vertical text-below specific */\r\n .rel-stepper.vertical.text-below .step-label {\r\n margin-top: 0;\r\n margin-left: 0;\r\n text-align: center;\r\n }\r\n\r\n /********************************************\r\n * Connector Lines\r\n ********************************************/\r\n .connector {\r\n position: absolute;\r\n background: var(--rel-border-default);\r\n z-index: 1;\r\n }\r\n\r\n /* Horizontal connector */\r\n .rel-stepper.horizontal .connector {\r\n top: 50%;\r\n left: 100%;\r\n transform: translateY(-50%);\r\n height: 2px;\r\n position: absolute;\r\n background: var(--rel-border-default);\r\n }\r\n\r\n .rel-stepper.horizontal .rel-step:last-child .connector {\r\n display: none;\r\n }\r\n\r\n /* Vertical connectors */\r\n .rel-stepper.vertical.text-below .connector {\r\n top: 100%;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n width: 2px;\r\n position: absolute;\r\n }\r\n\r\n .rel-stepper.vertical.text-right .connector {\r\n top: 100%;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n width: 2px;\r\n position: absolute;\r\n }\r\n\r\n .rel-stepper.vertical .rel-step:last-child .connector {\r\n display: none;\r\n }\r\n\r\n .rel-stepper.vertical.text-right\r\n .rel-step:last-child\r\n .indicator-wrapper\r\n .connector {\r\n display: none;\r\n }\r\n\r\n /********************************************\r\n * Step States\r\n ********************************************/\r\n .rel-step.done .indicator {\r\n background: var(--rel-bg-neutral-inverse-2);\r\n border-color: var(--rel-bg-neutral-inverse-2);\r\n color: var(--rel-text-inverse);\r\n }\r\n\r\n .rel-step.progress .indicator {\r\n border-color: var(--rel-border-strong);\r\n background: var(--rel-bg-neutral);\r\n color: var(--rel-text-label);\r\n }\r\n\r\n .rel-step.disabled .indicator {\r\n background: var(--rel-bg-surface-elevated);\r\n border-color: var(--rel-border-default);\r\n color: var(--rel-text-disabled);\r\n }\r\n\r\n .rel-step.done .connector {\r\n background: var(--rel-text-label);\r\n }\r\n\r\n .rel-step.progress .connector {\r\n background: var(--rel-text-label);\r\n }\r\n\r\n .rel-step.done .step-label {\r\n color: var(--rel-text-label);\r\n font-weight: var(--rel-body-md-medium-font-weight);\r\n }\r\n\r\n .rel-step.progress .step-label {\r\n color: var(--rel-text-label);\r\n font-weight: var(--rel-body-md-medium-font-weight);\r\n }\r\n\r\n .rel-step.disabled .step-label {\r\n color: var(--rel-text-disabled);\r\n }\r\n\r\n /* Dark mode: ensure progress/done indicator and labels stay readable */\r\n :host-context(:root[data-theme=\"dark\"]) .rel-step.progress .step-label,\r\n :host-context(.dark) .rel-step.progress .step-label {\r\n color: var(--rel-text-default);\r\n }\r\n\r\n :host-context(:root[data-theme=\"dark\"]) .rel-step.progress .indicator,\r\n :host-context(.dark) .rel-step.progress .indicator {\r\n color: var(--rel-text-default);\r\n }\r\n\r\n /********************************************\r\n * Size Property — controls connector length\r\n ********************************************/\r\n /* Horizontal */\r\n .rel-stepper.large.horizontal {\r\n gap: var(--rel-stepper-connector-length-lg, 86px);\r\n }\r\n\r\n .rel-stepper.small.horizontal {\r\n gap: var(--rel-stepper-connector-length-md, 60px);\r\n }\r\n\r\n .rel-stepper.large.horizontal .connector {\r\n width: var(--rel-stepper-connector-length-lg, 86px);\r\n }\r\n\r\n .rel-stepper.small.horizontal .connector {\r\n width: var(--rel-stepper-connector-length-md, 60px);\r\n }\r\n\r\n /* Vertical */\r\n .rel-stepper.large.vertical .connector {\r\n height: var(--rel-stepper-connector-length-lg, 86px);\r\n }\r\n\r\n .rel-stepper.large.vertical {\r\n gap: var(--rel-stepper-connector-length-lg, 86px);\r\n }\r\n\r\n .rel-stepper.small.vertical .connector {\r\n height: var(--rel-stepper-connector-length-sm, 42px);\r\n }\r\n\r\n .rel-stepper.small.vertical {\r\n gap: var(--rel-stepper-connector-length-sm, 42px);\r\n }\r\n `;\r\n\r\n private isDone(step: Step): boolean {\r\n return step.status === \"done\";\r\n }\r\n\r\n private isProgress(step: Step): boolean {\r\n return step.status === \"progress\";\r\n }\r\n\r\n private isDisabled(step: Step): boolean {\r\n return step.status === \"disabled\";\r\n }\r\n\r\n private getStepClasses(step: Step): string {\r\n const classes = [\"rel-step\"];\r\n if (this.isDone(step)) classes.push(\"done\");\r\n if (this.isProgress(step)) classes.push(\"progress\");\r\n if (this.isDisabled(step)) classes.push(\"disabled\");\r\n return classes.join(\" \");\r\n }\r\n\r\n private onStepClick(step: Step, index: number) {\r\n if (step.status === \"disabled\") return;\r\n\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-step-change\", {\r\n detail: {\r\n index,\r\n step,\r\n },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private renderIndicator(step: Step, index: number) {\r\n if (this.type === \"dot\") return html``;\r\n if (this.type === \"number\") return html`<span>${index + 1}</span>`;\r\n if (this.type === \"icon\" || step.status === \"done\") {\r\n return html`\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"14\"\r\n height=\"10\"\r\n viewBox=\"0 0 18 14\"\r\n fill=\"none\"\r\n class=\"check-icon\"\r\n >\r\n <path\r\n d=\"M6.44479 14L0.5 7.36383L1.9862 5.70478L6.44479 10.6819L16.0138 0L17.5 1.65904L6.44479 14Z\"\r\n fill=\"currentColor\"\r\n />\r\n </svg>\r\n `;\r\n }\r\n return html`<span>${index + 1}</span>`;\r\n }\r\n\r\n render() {\r\n // Figma Typel wins when set; otherwise the legacy textAlign drives layout\r\n // (below ≈ inverted, right ≈ centered).\r\n const placement: LabelPlacement =\r\n this.labelPlacement ?? (this.textAlign === \"below\" ? \"inverted\" : \"centered\");\r\n\r\n const stepperClasses = [\r\n \"rel-stepper\",\r\n this.orientation === \"vertical\" ? \"vertical\" : \"horizontal\",\r\n placement === \"inverted\" ? \"text-below\" : \"text-right\",\r\n placement === \"top\" ? \"label-top\" : \"\",\r\n this.size === \"small\" ? \"small\" : \"large\",\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n const isVertical = this.orientation === \"vertical\";\r\n const isTextRight = placement !== \"inverted\";\r\n\r\n return html`\r\n <div class=\"${stepperClasses}\">\r\n ${this.steps.map(\r\n (step, idx) => html`\r\n <div\r\n class=\"${this.getStepClasses(step)}\"\r\n @click=\"${() => this.onStepClick(step, idx)}\"\r\n >\r\n ${isVertical && isTextRight\r\n ? html`\r\n <!-- Indicator with connector below -->\r\n <div class=\"indicator-wrapper\">\r\n <div part=\"indicator\" class=\"indicator\">\r\n ${this.renderIndicator(step, idx)}\r\n </div>\r\n ${idx < this.steps.length - 1\r\n ? html`<div part=\"track\" class=\"connector\"></div>`\r\n : \"\"}\r\n </div>\r\n\r\n <!-- Step Label to the right -->\r\n <div part=\"label\" class=\"step-label\">${step.title}</div>\r\n `\r\n : isVertical\r\n ? html`\r\n <div class=\"step-content text-below-content\">\r\n <!-- Step Indicator -->\r\n <div part=\"indicator\" class=\"indicator\">\r\n ${this.renderIndicator(step, idx)}\r\n </div>\r\n\r\n <!-- Step Label -->\r\n <div part=\"label\" class=\"step-label\">${step.title}</div>\r\n </div>\r\n\r\n <!-- Connector -->\r\n ${idx < this.steps.length - 1\r\n ? html`<div part=\"track\" class=\"connector\"></div>`\r\n : \"\"}\r\n `\r\n : html`\r\n <!-- Step Indicator -->\r\n <div part=\"indicator\" class=\"indicator\">\r\n ${this.renderIndicator(step, idx)}\r\n </div>\r\n\r\n <!-- Step Label -->\r\n <div part=\"label\" class=\"step-label\">${step.title}</div>\r\n\r\n <!-- Connector (for horizontal only) -->\r\n ${!isVertical && idx < this.steps.length - 1\r\n ? html`<div part=\"track\" class=\"connector\"></div>`\r\n : \"\"}\r\n `}\r\n </div>\r\n `\r\n )}\r\n </div>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property, state } from \"lit/decorators.js\";\r\n\r\n@customElement(\"rel-switch\")\r\nexport class RelSwitch extends LitElement {\r\n @property({ type: Boolean }) checked = false;\r\n @property({ type: Boolean }) disabled = false;\r\n @property({ type: String }) value = \"\";\r\n\r\n private _onChange: (value: boolean) => void = () => {};\r\n private _onTouched: () => void = () => {};\r\n\r\n @state() private isFocused = false;\r\n @state() private isPressed = false;\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n --switch-track: var(--rel-bg-neutral-elevated-2);\r\n --switch-knob-on: var(--rel-bg-neutral-inverse-2);\r\n --switch-knob-off: var(--rel-text-static-light);\r\n --switch-halo: var(--rel-action-overlay-hover-strong);\r\n --switch-disabled: var(--rel-bg-neutral-elevated-1);\r\n display: inline-block;\r\n }\r\n\r\n /* Wrapper */\r\n .switch-wrapper {\r\n position: relative;\r\n display: inline-block;\r\n width: var(--rel-switch-track-width, 42px);\r\n height: var(--rel-switch-track-height, 22px);\r\n cursor: pointer;\r\n }\r\n\r\n .switch-wrapper.switch-disabled {\r\n cursor: not-allowed;\r\n opacity: 0.5;\r\n }\r\n\r\n /* Hide native checkbox */\r\n .switch-wrapper input {\r\n opacity: 0;\r\n width: 0;\r\n height: 0;\r\n }\r\n\r\n /* Track */\r\n .switch-slider {\r\n position: absolute;\r\n top: 50%;\r\n left: var(--rel-spacing-3xs);\r\n right: var(--rel-spacing-3xs);\r\n height: 12px;\r\n background-color: var(--switch-track);\r\n border-radius: 999px;\r\n transform: translateY(-50%);\r\n transition: background-color 0.25s ease;\r\n }\r\n\r\n /* Knob */\r\n .switch-slider::before {\r\n content: \"\";\r\n position: absolute;\r\n top: 50%;\r\n left: -2px;\r\n transform: translateY(-50%);\r\n height: var(--rel-switch-thumb-size, 18px);\r\n width: var(--rel-switch-thumb-size, 18px);\r\n background-color: var(--switch-knob-off);\r\n border-radius: 50%;\r\n transition: transform 0.25s ease, background-color 0.25s ease,\r\n box-shadow 0.2s ease;\r\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);\r\n }\r\n\r\n /* ON state */\r\n input:checked + .switch-slider::before {\r\n background-color: var(--switch-knob-on);\r\n transform: translateY(-50%) translateX(22px);\r\n }\r\n\r\n /* Hover */\r\n .switch-wrapper:hover:not(.switch-disabled) .switch-slider {\r\n background-color: var(--rel-bg-neutral);\r\n }\r\n\r\n /* Hover halo — inverse overlay when checked (dark knob), strong overlay otherwise */\r\n .switch-wrapper:hover:not(.switch-disabled) .switch-slider::before {\r\n box-shadow: 0 0 0 6px var(--rel-action-overlay-hover-strong);\r\n }\r\n\r\n .switch-wrapper:hover:not(.switch-disabled) input:checked + .switch-slider::before {\r\n box-shadow: 0 0 0 6px var(--rel-action-overlay-hover-inverse);\r\n }\r\n\r\n /* Focus halo */\r\n .switch-focused .switch-slider::before {\r\n box-shadow: 0 0 0 2px var(--rel-border-focus-inner), 0 0 0 4px var(--rel-border-focus);\r\n }\r\n\r\n /* Pressed */\r\n .switch-pressed .switch-slider::before {\r\n transform: scale(0.9) translateY(-50%);\r\n box-shadow: 0 0 0 6px var(--rel-action-overlay-pressed);\r\n }\r\n .switch-pressed input:checked + .switch-slider::before {\r\n transform: scale(0.9) translateY(-50%) translateX(22px);\r\n box-shadow: 0 0 0 6px var(--rel-action-overlay-dragged);\r\n }\r\n\r\n /* Disabled */\r\n .switch-disabled .switch-slider {\r\n background-color: var(--switch-disabled);\r\n }\r\n .switch-disabled .switch-slider::before {\r\n background-color: var(--switch-disabled);\r\n }\r\n\r\n @media (prefers-reduced-motion: reduce) {\r\n .switch-slider,\r\n .switch-slider::before {\r\n transition: none;\r\n }\r\n }\r\n `;\r\n\r\n private toggle(ev: Event) {\r\n if (this.disabled) return;\r\n\r\n const input = ev.target as HTMLInputElement;\r\n this.checked = input.checked;\r\n\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-change\", {\r\n detail: {\r\n checked: this.checked,\r\n value: this.value,\r\n },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n this._onChange(this.checked);\r\n }\r\n\r\n registerOnChange(fn: (value: boolean) => void): void { this._onChange = fn; }\r\n registerOnTouched(fn: () => void): void { this._onTouched = fn; }\r\n writeValue(checked: boolean): void { this.checked = checked; }\r\n\r\n private handleFocus() {\r\n this.isFocused = true;\r\n }\r\n\r\n private handleBlur() {\r\n this.isFocused = false;\r\n this.isPressed = false;\r\n this._onTouched();\r\n }\r\n\r\n private handleMouseDown() {\r\n if (!this.disabled) this.isPressed = true;\r\n }\r\n\r\n private handleMouseUp() {\r\n if (!this.disabled) this.isPressed = false;\r\n }\r\n\r\n render() {\r\n const wrapperClasses = [\r\n \"switch-wrapper\",\r\n this.disabled && \"switch-disabled\",\r\n this.isFocused && \"switch-focused\",\r\n this.isPressed && \"switch-pressed\",\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return html`\r\n <label part=\"base\" class=\"${wrapperClasses}\">\r\n <input\r\n type=\"checkbox\"\r\n role=\"switch\"\r\n aria-checked=\"${this.checked}\"\r\n ?disabled=${this.disabled}\r\n .checked=${this.checked}\r\n @change=${(e: Event) => this.toggle(e)}\r\n @focus=${this.handleFocus}\r\n @blur=${this.handleBlur}\r\n @mousedown=${this.handleMouseDown}\r\n @mouseup=${this.handleMouseUp}\r\n />\r\n <span part=\"track\" class=\"switch-slider\"></span>\r\n </label>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property, state } from \"lit/decorators.js\";\r\nimport \"../rel-badge/rel-badge\";\r\n\r\nexport interface TabItem {\r\n label: string;\r\n badge?: number;\r\n badgeDot?: boolean;\r\n disabled?: boolean;\r\n}\r\n\r\n@customElement(\"rel-tab-item\")\r\nexport class RelTabItem extends LitElement {\r\n @property({ type: String }) label: string = \"\";\r\n @property({ type: String }) value: string = \"\";\r\n @property({ type: Number }) badge: number = 0;\r\n /** Shows a small dot instead of a numbered badge — takes precedence over `badge`. */\r\n @property({ type: Boolean, attribute: \"badge-dot\" }) badgeDot: boolean = false;\r\n @property({ type: Boolean }) disabled: boolean = false;\r\n\r\n render() {\r\n return html``;\r\n }\r\n}\r\n\r\n@customElement(\"rel-tab\")\r\nexport class RelTab extends LitElement {\r\n @property({ type: Array }) tabs: TabItem[] = [];\r\n @property({ type: Number, reflect: true }) activeIndex = 0;\r\n\r\n /** Tab size — styled via :host([size]) rules. */\r\n @property({ type: String, reflect: true })\r\n size: \"sm\" | \"md\" | \"lg\" = \"md\";\r\n @state() private _tabItems: RelTabItem[] = [];\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n --tab-active-color: var(--rel-bg-brand);\r\n --tab-text-default: var(--rel-text-default);\r\n --tab-text-disabled: var(--rel-text-disabled);\r\n --tab-text-hover: var(--rel-text-label);\r\n --tab-underline-height: 3px;\r\n --tab-hover-color: var(--rel-bg-neutral-elevated-1);\r\n display: block;\r\n font-family: var(--rel-fonts-font-family);\r\n }\r\n\r\n .tabs-wrapper {\r\n display: flex;\r\n border-bottom: 1px solid var(--rel-border-accent);\r\n font-family: var(--rel-fonts-font-family);\r\n user-select: none;\r\n }\r\n\r\n .tab {\r\n position: relative;\r\n padding: var(--rel-spacing-sm) var(--rel-spacing-md);\r\n cursor: pointer;\r\n color: var(--rel-text-body);\r\r\n transition: color 0.2s ease;\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-xs);\r\n font-family: var(--rel-body-md-regular-font-family);\r\n font-weight: var(--rel-body-md-regular-font-weight);\r\n font-size: var(--rel-body-md-regular-font-size);\r\n line-height: var(--rel-body-md-regular-line-height);\r\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\r\n }\r\n\r\n .tab.active {\r\n color: var(--tab-text-default);\r\n font-weight: var(--rel-body-md-medium-font-weight);\r\n }\r\n\r\n /* Size variants (CSS-only, Figma tab sizes) */\r\n :host([size=\"lg\"]) .tab {\r\n font-family: var(--rel-body-lg-regular-font-family);\r\n font-weight: var(--rel-body-lg-regular-font-weight);\r\n font-size: var(--rel-body-lg-regular-font-size);\r\n line-height: var(--rel-body-lg-regular-line-height);\r\n letter-spacing: var(--rel-body-lg-regular-letter-spacing);\r\n }\r\n\r\n :host([size=\"lg\"]) .tab.active {\r\n font-weight: var(--rel-body-lg-medium-font-weight);\r\n }\r\n\r\n :host([size=\"sm\"]) .tab {\r\n font-family: var(--rel-body-sm-regular-font-family);\r\n font-weight: var(--rel-body-xs-medium-font-weight);\r\n font-size: var(--rel-body-sm-medium-font-size);\r\n line-height: var(--rel-body-sm-medium-line-height);\r\n letter-spacing: var(--rel-body-sm-medium-letter-spacing);\r\n }\r\n\r\n /* Badge tones — pass through rel-badge custom-prop API */\r\n .tab rel-badge {\r\n --rel-badge-bg: var(--rel-bg-danger);\r\n --rel-badge-color: var(--rel-text-static-light);\r\n }\r\n\r\n .tab.disabled rel-badge {\r\n --rel-badge-bg: var(--rel-bg-neutral-inverse-2);\r\n --rel-badge-color: var(--rel-text-inverse);\r\n }\r\n\r\n .tab:focus-visible {\r\n outline: 2px solid var(--rel-border-focus);\r\n outline-offset: -2px;\r\n border-radius: var(--rel-border-radius-xs);\r\n }\r\n\r\n .tab:hover:not(.disabled) .tab-label {\r\n color: var(--tab-text-hover);\r\n }\r\n\r\n .tab.disabled {\r\n color: var(--tab-text-disabled);\r\n cursor: not-allowed;\r\n }\r\n\r\n /* Underline */\r\n .tab-underline {\r\n position: absolute;\r\n left: 0;\r\n bottom: 0;\r\n height: var(--tab-underline-height);\r\n width: 100%;\r\n background-color: transparent;\r\n transition: background-color 0.2s ease, transform 0.2s ease;\r\n }\r\n\r\n .tab.active .tab-underline {\r\n background-color: var(--tab-active-color);\r\n }\r\n\r\n .tab:hover:not(.disabled):not(.active) {\r\n background-color: var(--tab-hover-color);\r\n }\r\n\r\n /* Tab content */\r\n .tab-content {\r\n padding: 1rem 0;\r\n }\r\n `;\r\n\r\n private _onSlotChange(e: Event) {\r\n const slot = e.target as HTMLSlotElement;\r\n this._tabItems = slot\r\n .assignedElements()\r\n .filter((el): el is RelTabItem => el instanceof RelTabItem);\r\n }\r\n\r\n private get _effectiveTabs(): Array<{ label: string; badge?: number; badgeDot?: boolean; disabled?: boolean }> {\r\n if (this._tabItems.length > 0) {\r\n return this._tabItems.map((item) => ({\r\n label: item.label,\r\n badge: item.badge || 0,\r\n badgeDot: item.badgeDot,\r\n disabled: item.disabled,\r\n }));\r\n }\r\n return this.tabs;\r\n }\r\n\r\n private selectTab(index: number) {\r\n if (this._effectiveTabs[index]?.disabled) return;\r\n this.activeIndex = index;\r\n this.dispatchEvent(\r\n new CustomEvent<number>(\"rel-tab-change\", {\r\n detail: index,\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private onKeyDown(event: KeyboardEvent, index: number) {\r\n if (event.key === \"Enter\" || event.key === \" \") {\r\n if (this._effectiveTabs[index]?.disabled) return;\r\n event.preventDefault();\r\n this.selectTab(index);\r\n return;\r\n }\r\n\r\n if (event.key === \"ArrowRight\" || event.key === \"ArrowLeft\") {\r\n event.preventDefault();\r\n const dir = event.key === \"ArrowRight\" ? 1 : -1;\r\n const tabs = this._effectiveTabs;\r\n let next = index;\r\n for (let i = 0; i < tabs.length; i++) {\r\n next = (next + dir + tabs.length) % tabs.length;\r\n if (!tabs[next]?.disabled) break;\r\n }\r\n this.selectTab(next);\r\n this.updateComplete.then(() => {\r\n const tabEls = this.shadowRoot?.querySelectorAll(\"[role=tab]\");\r\n (tabEls?.[next] as HTMLElement)?.focus();\r\n });\r\n }\r\n }\r\n\r\n render() {\r\n const tabs = this._effectiveTabs;\r\n return html`\r\n <slot name=\"items\" style=\"display:none;\" @slotchange=\"${this._onSlotChange}\"></slot>\r\n <div part=\"list\" class=\"tabs-wrapper\" role=\"tablist\">\r\n ${tabs.map(\r\n (tab, i) => html`\r\n <div\r\n part=\"item\" class=\"tab ${i === this.activeIndex\r\n ? \"active\"\r\n : \"\"} ${tab.disabled ? \"disabled\" : \"\"}\"\r\n role=\"tab\"\r\n aria-selected=\"${i === this.activeIndex}\"\r\n aria-disabled=\"${tab.disabled ?? false}\"\r\n tabindex=\"${tab.disabled ? -1 : i === this.activeIndex ? 0 : -1}\"\r\n @click=\"${() => this.selectTab(i)}\"\r\n @keydown=\"${(e: KeyboardEvent) => this.onKeyDown(e, i)}\"\r\n >\r\n <span part=\"label\" class=\"tab-label\">${tab.label}</span>\r\n ${tab.badgeDot\r\n ? html`<rel-badge variant=\"dot\" size=\"sm\"></rel-badge>`\r\n : tab.badge\r\n ? html`<rel-badge number=\"${tab.badge}\" variant=\"number\" size=\"sm\"></rel-badge>`\r\n : \"\"}\r\n <span class=\"tab-underline\"></span>\r\n </div>\r\n `\r\n )}\r\n </div>\r\n <div class=\"tab-content\">\r\n <slot></slot>\r\n </div>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property, state } from \"lit/decorators.js\";\r\n\r\nexport type ToastType = \"default\" | \"error\";\r\n\r\n@customElement(\"rel-toast\")\r\nexport class RelToast extends LitElement {\r\n @property({ type: String }) message: string = \"\";\r\n @property({ type: String }) type: ToastType = \"default\";\r\n @property({ type: String }) actionLabel?: string;\r\n @property({ type: Number }) duration: number = 4000;\r\n @property({ type: Boolean, reflect: true }) show = false;\r\n\r\n @state() private visible: boolean = false;\r\n private _dismissTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n position: fixed;\r\n bottom: 24px;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n display: flex;\r\n justify-content: center;\r\n width: 100%;\r\n pointer-events: none;\r\n z-index: var(--rel-z-toast, 9000);\r\n font-family: var(--rel-fonts-font-family);\r\n }\r\n\r\n /* Toast container */\r\n .toast {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-xs);\r\n background-color: var(--rel-bg-neutral-inverse-1);\r\n color: var(--rel-text-inverse);\r\r\n border-radius: var(--rel-border-radius-sm);\r\n padding: var(--rel-spacing-sm) var(--rel-spacing-md);\r\n box-shadow: var(--rel-shadows-shadow-300);\r\n pointer-events: all;\r\n animation: fadeInUp 0.25s ease;\r\n font-family: var(--rel-body-md-regular-font-family);\r\n font-weight: var(--rel-body-md-regular-font-weight);\r\n font-size: var(--rel-body-md-regular-font-size);\r\n line-height: var(--rel-body-md-regular-line-height);\r\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\r\n }\r\n\r\n .toast.error {\r\n background-color: var(--rel-bg-danger);\r\n color: var(--rel-text-static-light);\r\n }\r\n\r\n .toast.hidden {\r\n display: none;\r\n }\r\n\r\n /* Message */\r\n .toast-message {\r\n flex: 1;\r\n }\r\n\r\n /* Action button */\r\n .toast-action {\r\n background: transparent;\r\n border: none;\r\n color: var(--rel-action-neutral-label-icons-fill-inverse);\r\n font-family: var(--rel-action-md-font-family);\r\n font-weight: var(--rel-action-md-font-weight);\r\n font-size: var(--rel-action-md-font-size);\r\n line-height: var(--rel-action-md-line-height);\r\n letter-spacing: var(--rel-action-md-letter-spacing);\r\n cursor: pointer;\r\n transition: opacity 0.2s;\r\n }\r\n\r\n .toast-action:hover {\r\n background: var(--rel-bg-neutral);\r\n color: var(--rel-text-default);\r\n opacity: 0.75;\r\n }\r\n\r\n .toast-action:focus-visible {\r\n outline: 2px solid var(--rel-text-static-light);\r\n outline-offset: 2px;\r\n border-radius: var(--rel-border-radius-xs);\r\n }\r\n\r\n /* Close button */\r\n .toast-close {\r\n background: transparent;\r\n color: var(--rel-action-neutral-label-icons-ghost);\r\n border: none;\r\n color: inherit;\r\n font-size: 1rem;\r\n cursor: pointer;\r\n line-height: 1;\r\n padding: var(--rel-spacing-2xs);\r\n margin-left: var(--rel-spacing-2xs);\r\n }\r\n\r\n .toast-close:hover {\r\n opacity: 0.75;\r\n }\r\n\r\n .toast-close:focus-visible {\r\n outline: 2px solid var(--rel-text-static-light);\r\n outline-offset: 2px;\r\n border-radius: var(--rel-border-radius-xs);\r\n }\r\n\r\n\r\n @media (prefers-reduced-motion: reduce) {\r\n .toast {\r\n animation: none;\r\n }\r\n }\r\n\r\n /* Animations */\r\n @keyframes fadeInUp {\r\n from {\r\n opacity: 0;\r\n transform: translateY(20px);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: translateY(0);\r\n }\r\n }\r\n `;\r\n\r\n willUpdate(changed: Map<string, unknown>) {\r\n if (!changed.has('show')) return;\r\n if (this.show) {\r\n this.visible = true;\r\n if (this._dismissTimer) clearTimeout(this._dismissTimer);\r\n if (this.duration > 0) {\r\n this._dismissTimer = setTimeout(() => this.close(), this.duration);\r\n }\r\n } else {\r\n this.visible = false;\r\n if (this._dismissTimer) {\r\n clearTimeout(this._dismissTimer);\r\n this._dismissTimer = null;\r\n }\r\n }\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback();\r\n if (this._dismissTimer) clearTimeout(this._dismissTimer);\r\n }\r\n\r\n open() {\r\n this.show = true;\r\n }\r\n\r\n close() {\r\n this.show = false;\r\n this.visible = false;\r\n if (this._dismissTimer) {\r\n clearTimeout(this._dismissTimer);\r\n this._dismissTimer = null;\r\n }\r\n this.dispatchEvent(\r\n new CustomEvent(\"dismissed\", {\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private handleActionClick(event: Event) {\r\n event.stopPropagation();\r\n this.dispatchEvent(\r\n new CustomEvent(\"action\", {\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n this.close();\r\n }\r\n\r\n render() {\r\n return html`\r\n <div part=\"base\" class=\"toast ${this.type} ${this.visible ? \"\" : \"hidden\"}\" role=\"status\" aria-live=\"polite\">\r\n <span part=\"label\" class=\"toast-message\">${this.message}</span>\r\n\r\n ${this.actionLabel\r\n ? html`<button\r\n part=\"action\" class=\"toast-action\"\r\n @click=\"${this.handleActionClick}\"\r\n >\r\n ${this.actionLabel}\r\n </button>`\r\n : \"\"}\r\n\r\n <button part=\"close-button\" class=\"toast-close\" @click=\"${this.close}\" aria-label=\"Dismiss\">✕</button>\r\n </div>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\n\nexport type TooltipPosition = \"above\" | \"below\" | \"left\" | \"right\";\nexport type TooltipType = \"single-line\" | \"multi-line\";\n\n@customElement(\"rel-tooltip\")\nexport class RelTooltip extends LitElement {\n @property({ type: String }) text: string = \"\";\n @property({ type: String }) position: TooltipPosition = \"above\";\n @property({ type: Boolean, attribute: \"show-tail\" }) showTail: boolean =\n false;\n\n /** Figma \"Type\": single-line stays on one line; multi-line wraps at a max width. */\n @property({ type: String, reflect: true }) type: TooltipType = \"single-line\";\n\n // Stable id so aria-describedby can reference the bubble across renders.\n private uniqueId = Math.random().toString(36).slice(2);\n\n static styles = css`\n :host {\n color: var(--rel-text-default);\n display: inline-block;\n position: relative;\n }\n\n /* Tooltip container */\n .tooltip-bubble {\n font-family: var(--rel-body-md-regular-font-family);\n font-weight: var(--rel-body-md-medium-font-weight);\n font-size: var(--rel-body-md-regular-font-size);\n line-height: var(--rel-body-md-regular-line-height);\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\n position: absolute;\n background-color: var(--rel-bg-neutral-inverse-2);\n color: var(--rel-text-inverse);\n padding: var(--rel-spacing-xs, 8px)\n var(--rel-spacing-sm, 12px);\n border-radius: var(--rel-border-radius-sm, 8px);\n white-space: nowrap;\n z-index: 1000;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.2s ease;\n overflow: visible;\n }\n\n /* Figma Type=Multi Line: wrap inside a bounded bubble */\n :host([type=\"multi-line\"]) .tooltip-bubble {\n white-space: normal;\n max-width: 220px;\n width: max-content;\n }\n\n :host(:hover) .tooltip-bubble,\n :host(:focus-within) .tooltip-bubble {\n opacity: 1;\n }\n\n /* Positioning */\n .tooltip-bubble.above {\n bottom: calc(100% + 6px);\n left: 50%;\n transform: translateX(-50%);\n }\n\n .tooltip-bubble.below {\n top: calc(100% + 6px);\n left: 50%;\n transform: translateX(-50%);\n }\n\n .tooltip-bubble.left {\n right: calc(100% + 6px);\n top: 50%;\n transform: translateY(-50%);\n }\n\n .tooltip-bubble.right {\n left: calc(100% + 6px);\n top: 50%;\n transform: translateY(-50%);\n }\n\n /* Tail/Arrow */\n .tooltip-tail {\n position: absolute;\n width: 0;\n height: 0;\n display: block;\n }\n\n .tooltip-bubble.above .tooltip-tail,\n .tooltip-bubble.below .tooltip-tail {\n left: 50%;\n transform: translateX(-50%);\n border-left: 6px solid transparent;\n border-right: 6px solid transparent;\n }\n\n .tooltip-bubble.above .tooltip-tail {\n bottom: -6px;\n border-top: 6px solid var(--rel-bg-neutral-inverse-2);\n border-bottom: none;\n }\n\n .tooltip-bubble.below .tooltip-tail {\n top: -6px;\n border-bottom: 6px solid var(--rel-bg-neutral-inverse-2);\n border-top: none;\n }\n\n .tooltip-bubble.left .tooltip-tail,\n .tooltip-bubble.right .tooltip-tail {\n top: 50%;\n transform: translateY(-50%);\n border-top: 6px solid transparent;\n border-bottom: 6px solid transparent;\n }\n\n .tooltip-bubble.left .tooltip-tail {\n right: -6px;\n border-left: 6px solid var(--rel-bg-neutral-inverse-2);\n border-right: none;\n }\n\n .tooltip-bubble.right .tooltip-tail {\n left: -6px;\n border-right: 6px solid var(--rel-bg-neutral-inverse-2);\n border-left: none;\n }\n `;\n\n firstUpdated() {\n this.linkTrigger();\n }\n\n private linkTrigger() {\n const slot = this.shadowRoot?.querySelector(\"slot\");\n if (!slot) return;\n const trigger = slot.assignedElements()[0];\n if (trigger) {\n trigger.setAttribute(\"aria-describedby\", `tooltip-${this.uniqueId}`);\n }\n }\n\n render() {\n return html`\n <slot @slotchange=\"${this.linkTrigger}\"></slot>\n <div\n part=\"panel\" class=\"tooltip-bubble ${this.position}\"\n id=\"tooltip-${this.uniqueId}\"\n role=\"tooltip\"\n >\n ${this.text}\n ${this.showTail ? html`<span part=\"indicator\" class=\"tooltip-tail\"></span>` : \"\"}\n </div>\n `;\n }\n}\n"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA1EY;AAAA,EAA3BC,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GADf,UACiB;AAM0B;AAAA,EAArDA,WAAS,EAAE,MAAM,QAAQ,WAAW,cAAc,CAAC;AAAA,GAPzC,UAO2C;AAE3B;AAAA,EAA1BA,WAAS,EAAE,MAAM,MAAM,CAAC;AAAA,GATd,UASgB;AAGE;AAAA,EAA5BA,WAAS,EAAE,MAAM,QAAQ,CAAC;AAAA,GAZhB,UAYkB;AAGD;AAAA,EAA3BA,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAff,UAeiB;AAG6B;AAAA,EAAxDA,WAAS,EAAE,MAAM,OAAO,WAAW,kBAAkB,CAAC;AAAA,GAlB5C,UAkB8C;AAE7B;AAAA,EAA3BA,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GApBf,UAoBiB;AAE8B;AAAA,EAAzDA,WAAS,EAAE,MAAM,QAAQ,WAAW,kBAAkB,CAAC;AAAA,GAtB7C,UAsB+C;AAEf;AAAA,EAA1CA,WAAS,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,GAxB9B,UAwBgC;AAEf;AAAA,EAA3BA,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GA1Bf,UA0BiB;AAEwB;AAAA,EAAnDA,WAAS,EAAE,MAAM,QAAQ,WAAW,YAAY,CAAC;AAAA,GA5BvC,UA4ByC;AAEC;AAAA,EAApDA,WAAS,EAAE,MAAM,QAAQ,WAAW,aAAa,CAAC;AAAA,GA9BxC,UA8B0C;AAEzB;AAAA,EAA3BA,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAhCf,UAgCiB;AAEiC;AAAA,EAA5DA,WAAS,EAAE,MAAM,QAAQ,WAAW,qBAAqB,CAAC;AAAA,GAlChD,UAkCkD;AAEF;AAAA,EAA1DA,WAAS,EAAE,MAAM,QAAQ,WAAW,mBAAmB,CAAC;AAAA,GApC9C,UAoCgD;AAOC;AAAA,EAA3DA,WAAS,EAAE,MAAM,QAAQ,WAAW,oBAAoB,CAAC;AAAA,GA3C/C,UA2CiD;AAQP;AAAA,EAApDA,WAAS,EAAE,MAAM,SAAS,WAAW,YAAY,CAAC;AAAA,GAnDxC,UAmD0C;AAEpC;AAAA,EAAhBC,QAAM;AAAA,GArDI,UAqDM;AACA;AAAA,EAAhBA,QAAM;AAAA,GAtDI,UAsDM;AACA;AAAA,EAAhBA,QAAM;AAAA,GAvDI,UAuDM;AACA;AAAA,EAAhBA,QAAM;AAAA,GAxDI,UAwDM;AACA;AAAA,EAAhBA,QAAM;AAAA,GAzDI,UAyDM;AAGA;AAAA,EAAhBA,QAAM;AAAA,GA5DI,UA4DM;AAEiB;AAAA,EAAjCC,OAAM,iBAAiB;AAAA,GA9Db,UA8DuB;AACF;AAAA,EAA/BA,OAAM,eAAe;AAAA,GA/DX,UA+DqB;AACE;AAAA,EAAjCA,OAAM,iBAAiB;AAAA,GAhEb,UAgEuB;AACF;AAAA,EAA/BA,OAAM,eAAe;AAAA,GAjEX,UAiEqB;AACQ;AAAA,EAAvCA,OAAM,uBAAuB;AAAA,GAlEnB,UAkE6B;AAlE7B,YAAN;AAAA,EADNC,gBAAc,YAAY;AAAA,GACd;;;ACvCb,SAAS,cAAAC,cAAY,QAAAC,QAAM,OAAAC,aAAW;AACtC,SAAS,iBAAAC,iBAAe,YAAAC,kBAAgB;AAMjC,IAAM,cAAN,cAA0BC,aAAW;AAAA,EAArC;AAAA;AACsC,iBAAuB;AACtC,iBAAQ;AACR,iBAAQ;AACR,kBAAS;AACM,qBAA+B;AAC9B,kBAAS;AAAA;AAAA,EAElC,QAAQ,SAA+B;AACxD,QAAI,QAAQ,IAAI,OAAO,KAAK,KAAK,MAAO,MAAK,MAAM,QAAQ,KAAK;AAChE,QAAI,QAAQ,IAAI,QAAQ,KAAK,KAAK,OAAQ,MAAK,MAAM,SAAS,KAAK;AAAA,EACrE;AAAA,EA6FA,SAAS;AACP,QAAI,KAAK,OAAQ,QAAOC;AAExB,QAAI,KAAK,UAAU,QAAQ;AACzB,YAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,KAAK;AACpC,aAAOA;AAAA;AAAA,YAED,MAAM,KAAK,EAAE,QAAQ,MAAM,GAAG,CAAC,GAAG,MAAMA;AAAA,mDACD,MAAM,QAAQ,KAAK,QAAQ,IAAI,YAAY,EAAE;AAAA,WACrF,CAAC;AAAA;AAAA;AAAA,IAGR;AAEA,WAAOA;AAAA,EACT;AACF;AAxHa,YAaJ,SAASC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAZ2B;AAAA,EAA1CC,WAAS,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,GAD9B,YACgC;AACf;AAAA,EAA3BA,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAFf,YAEiB;AACA;AAAA,EAA3BA,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAHf,YAGiB;AACA;AAAA,EAA3BA,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAJf,YAIiB;AACe;AAAA,EAA1CA,WAAS,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,GAL9B,YAKgC;AACC;AAAA,EAA3CA,WAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAN/B,YAMiC;AANjC,cAAN;AAAA,EADNC,gBAAc,cAAc;AAAA,GAChB;;;ACPb,SAAS,cAAAC,cAAY,QAAAC,QAAM,OAAAC,aAAW;AACtC,SAAS,iBAAAC,iBAAe,YAAAC,YAAU,SAAAC,cAAa;AAC/C,OAAO;AAKA,IAAM,WAAN,cAAuBC,aAAW;AAAA,EAAlC;AAAA;AACuC,gBAAO;AACvB,gBAAkB;AAClB,iBAAQ;AACR,uBAAc;AACb,uBAAc;AACd,iBAAQ;AAOrC,sBAAmC;AAInC,SAAQ,gBAAoC;AAC5C,SAAQ,uBAAuB;AAC/B,SAAQ,2BAA2B;AAyVnC,SAAQ,gBAAgB,CAAC,MAAqB;AAC5C,UAAI,CAAC,KAAK,KAAM;AAChB,UAAI,EAAE,QAAQ,YAAY,KAAK,aAAa;AAC1C,UAAE,eAAe;AACjB,aAAK,OAAO;AAAA,MACd;AAAA,IACF;AAEA,SAAQ,qBAAqB,CAAC,MAAkB;AAC9C,UAAI,CAAC,KAAK,YAAa;AACvB,UAAI,EAAE,WAAW,KAAK,gBAAgB;AACpC,aAAK,OAAO;AAAA,MACd;AAAA,IACF;AAAA;AAAA,EA5GA,oBAAoB;AAClB,UAAM,kBAAkB;AACxB,QAAI,KAAK,MAAM;AACb,WAAK,WAAW;AAAA,IAClB;AACA,SAAK,eAAe,KAAK,MAAM;AAC7B,YAAM,aAAa,KAAK,YAAY;AAAA,QAClC;AAAA,MACF;AACA,UAAI,YAAY;AACd,cAAM,OAAO,MAAM;AACjB,gBAAM,aAAa,WAAW,iBAAiB,EAAE,SAAS,KAAK,CAAC,EAAE,SAAS;AAC3E,eAAK,gBAAgB,cAAc,UAAU;AAAA,QAC/C;AACA,mBAAW,iBAAiB,cAAc,IAAI;AAC9C,aAAK;AAAA,MACP;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,uBAAuB;AACrB,UAAM,qBAAqB;AAC3B,SAAK,aAAa;AAClB,aAAS,oBAAoB,WAAW,KAAK,aAAa;AAAA,EAC5D;AAAA,EAEU,aAAa;AAIrB,QAAI,KAAK,aAAa,OAAO,GAAG;AAC9B,YAAM,QAAQ,KAAK,aAAa,OAAO,KAAK;AAC5C,WAAK,gBAAgB,OAAO;AAC5B,WAAK,QAAQ;AAAA,IACf;AAAA,EACF;AAAA,EAEA,QAAQ,SAA+B;AACrC,QAAI,QAAQ,IAAI,MAAM,GAAG;AACvB,UAAI,KAAK,MAAM;AACb,aAAK,WAAW;AAAA,MAClB,OAAO;AACL,aAAK,YAAY;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,aAAa;AACnB,SAAK,gBAAgB,SAAS;AAC9B,SAAK,WAAW;AAChB,aAAS,iBAAiB,WAAW,KAAK,aAAa;AACvD,SAAK;AAAA,MACH,IAAI,YAAY,mBAAmB;AAAA,QACjC,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,cAAc;AACpB,SAAK,aAAa;AAClB,aAAS,oBAAoB,WAAW,KAAK,aAAa;AAC1D,QAAI,KAAK,eAAe,OAAO;AAC7B,WAAK,eAAe,KAAK,MAAM;AAC7B,aAAK,eAAe,MAAM;AAC1B,aAAK,gBAAgB;AAAA,MACvB,CAAC;AAAA,IACH;AACA,SAAK;AAAA,MACH,IAAI,YAAY,mBAAmB;AAAA,QACjC,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,aAAa;AACnB,QAAI,OAAO,aAAa,YAAa;AACrC,UAAM,iBAAiB,OAAO,aAAa,SAAS,gBAAgB;AACpE,SAAK,uBAAuB,SAAS,KAAK,MAAM;AAChD,SAAK,2BAA2B,SAAS,KAAK,MAAM;AACpD,aAAS,KAAK,MAAM,WAAW;AAC/B,QAAI,iBAAiB,GAAG;AACtB,eAAS,KAAK,MAAM,eAAe,GAAG,cAAc;AAAA,IACtD;AAAA,EACF;AAAA,EAEQ,eAAe;AACrB,QAAI,OAAO,aAAa,YAAa;AACrC,aAAS,KAAK,MAAM,WAAW,KAAK;AACpC,aAAS,KAAK,MAAM,eAAe,KAAK;AAAA,EAC1C;AAAA,EAiBQ,yBAAyB;AAC/B,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,SAAS;AACP,UAAM,WAAW,CAAC,CAAC,KAAK;AACxB,UAAM,iBAAiB,CAAC,CAAC,KAAK;AAC9B,UAAM,aAAa,YAAY,kBAAkB,KAAK;AAEtD,WAAOC;AAAA,oCACyB,KAAK,OAAO,SAAS,EAAE;AAAA;AAAA;AAAA,2BAGhC,CAAC,KAAK,QAAQ,aAAa,EAAE;AAAA,oBACpC,KAAK,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA,uBAKpB,KAAK,IAAI;AAAA,kBACd,KAAK,QAAQ,WAAW,QAAQ;AAAA,wBAC1B,KAAK,KAAK;AAAA;AAAA;AAAA,6CAGW,CAAC,aAAa,UAAU,EAAE;AAAA;AAAA,gBAEvD,WAAWA,2BAAyB,KAAK,KAAK,UAAU,EAAE;AAAA,gBAC1D,iBAAiBA,gCAA8B,KAAK,WAAW,SAAS,EAAE;AAAA;AAAA,cAE5E,KAAK,cACHA;AAAA;AAAA;AAAA,4BAGY,KAAK,sBAAsB;AAAA;AAAA;AAAA,6BAIvC,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAahB;AACF;AA9aa,SAqBJ,SAASC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AApB4B;AAAA,EAA3CC,WAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAD/B,SACiC;AAChB;AAAA,EAA3BA,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAFf,SAEiB;AACA;AAAA,EAA3BA,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAHf,SAGiB;AACA;AAAA,EAA3BA,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAJf,SAIiB;AACC;AAAA,EAA5BA,WAAS,EAAE,MAAM,QAAQ,CAAC;AAAA,GALhB,SAKkB;AACA;AAAA,EAA5BA,WAAS,EAAE,MAAM,QAAQ,CAAC;AAAA,GANhB,SAMkB;AAO7B;AAAA,EADCA,WAAS,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,GAZ9B,SAaX;AAE2B;AAAA,EAA1BC,OAAM,UAAU;AAAA,GAfN,SAegB;AAfhB,WAAN;AAAA,EADNC,gBAAc,WAAW;AAAA,GACb;;;ACPb,SAAS,cAAAC,cAAY,QAAAC,QAAM,OAAAC,aAAW;AACtC,SAAS,iBAAAC,iBAAe,YAAAC,YAAU,SAAAC,eAAa;AAUxC,IAAM,YAAN,cAAwBC,aAAW;AAAA,EAAnC;AAAA;AACsC,gBAAmB;AAGnB,gBAA2B;AAE1C,eAAc;AAEd,eAAc;AAEd,gBAAe;AAEd,oBAAoB;AAErB,iBAAoB;AAEnB,0BAA0B;AAE1B,sBAAsB;AAEvB,iBAAgB;AAGQ,oBAAmB;AAE9D,SAAQ,QAAkB,CAAC;AAEpC,SAAQ,YAAqC,MAAM;AAAA,IAAC;AACpD,SAAQ,aAAyB,MAAM;AAAA,IAAC;AAmWxC,SAAQ,YAAoC;AAAA;AAAA,EArC5C,oBAAoB;AAClB,UAAM,kBAAkB;AACxB,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,QAAQ,mBAAqC;AAC3C,QACE,kBAAkB,IAAI,MAAM,KAC5B,kBAAkB,IAAI,KAAK,KAC3B,kBAAkB,IAAI,KAAK,KAC3B,kBAAkB,IAAI,MAAM,GAC5B;AACA,WAAK,WAAW;AAAA,IAClB;AACA,QACE,kBAAkB,IAAI,OAAO,KAC7B,kBAAkB,IAAI,UAAU,KAChC,kBAAkB,IAAI,MAAM,GAC5B;AACA,WAAK,kBAAkB;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,IAAY,UAAmB;AAC7B,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,IAAY,aAAqB;AAC/B,QAAI,KAAK,QAAQ,KAAK,IAAK,QAAO;AAClC,YAAS,KAAK,QAAQ,KAAK,QAAQ,KAAK,MAAM,KAAK,OAAQ;AAAA,EAC7D;AAAA,EAEA,IAAY,gBAAwB;AAClC,QAAI,KAAK,QAAQ,KAAK,IAAK,QAAO;AAClC,YAAS,KAAK,WAAW,KAAK,QAAQ,KAAK,MAAM,KAAK,OAAQ;AAAA,EAChE;AAAA,EAIQ,iBAAiB,GAAyB;AAChD,UAAM,KAAK,KAAK,YAAY,cAAc,aAAa;AACvD,QAAI,CAAC,GAAI,QAAO,KAAK;AACrB,UAAM,OAAO,GAAG,sBAAsB;AACtC,UAAM,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,EAAE,UAAU,KAAK,QAAQ,KAAK,KAAK,CAAC;AACzE,QAAI,IAAI,KAAK,MAAM,OAAO,KAAK,MAAM,KAAK;AAC1C,QAAI,KAAK,MAAM,IAAI,KAAK,IAAI,IAAI,KAAK;AACrC,WAAO,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC,CAAC;AAAA,EACjD;AAAA,EAEQ,mBAAmB,GAAiB;AAC1C,QAAI,CAAC,KAAK,WAAW,KAAK,SAAU;AACpC,UAAM,IAAI,KAAK,iBAAiB,CAAC;AACjC,SAAK,YACH,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,IAAI,IAAI,KAAK,QAAQ,IAAI,UAAU;AACtE,IAAC,EAAE,cAA8B,kBAAkB,EAAE,SAAS;AAC9D,SAAK,gBAAgB,CAAC;AAAA,EACxB;AAAA,EAEQ,mBAAmB,GAAiB;AAC1C,QAAI,CAAC,KAAK,UAAW;AACrB,SAAK,gBAAgB,KAAK,iBAAiB,CAAC,CAAC;AAAA,EAC/C;AAAA,EAEQ,mBAAmB;AACzB,SAAK,YAAY;AAAA,EACnB;AAAA,EAEQ,gBAAgB,GAAW;AACjC,QAAI,KAAK,cAAc,SAAS;AAC9B,WAAK,QAAQ,KAAK,IAAI,GAAG,KAAK,QAAQ;AAAA,IACxC,WAAW,KAAK,cAAc,OAAO;AACnC,WAAK,WAAW,KAAK,IAAI,GAAG,KAAK,KAAK;AAAA,IACxC;AACA,SAAK,kBAAkB;AACvB,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEQ,kBAAkB;AACxB,SAAK;AAAA,MACH,IAAI,YAAY,cAAc;AAAA,QAC5B,QAAQ,EAAE,OAAO,KAAK,OAAO,UAAU,KAAK,SAAS;AAAA,QACrD,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AACA,SAAK,UAAU,KAAK,KAAK;AAAA,EAC3B;AAAA,EAEQ,kBAAkB,IAAW;AACnC,UAAM,OAAO,OAAQ,GAAG,OAA4B,KAAK;AACzD,SAAK,QAAQ,KAAK,IAAI,MAAM,KAAK,QAAQ;AACzC,SAAK,kBAAkB;AACvB,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEQ,gBAAgB,IAAW;AACjC,UAAM,OAAO,OAAQ,GAAG,OAA4B,KAAK;AACzD,SAAK,WAAW,KAAK,IAAI,MAAM,KAAK,KAAK;AACzC,SAAK,kBAAkB;AACvB,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEQ,aAAa;AACnB,QAAI,KAAK,SAAS,YAAY;AAC5B,WAAK,QAAQ,CAAC;AACd;AAAA,IACF;AAEA,UAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI;AAClC,UAAM,QAAkB,CAAC;AACzB,aAAS,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,MAAM;AAC/C,YAAM,KAAK,CAAC;AAAA,IACd;AACA,QAAI,MAAM,MAAM,SAAS,CAAC,MAAM,KAAK,KAAK;AACxC,YAAM,KAAK,KAAK,GAAG;AAAA,IACrB;AACA,SAAK,QAAQ;AAAA,EACf;AAAA,EAEQ,eAAe,MAAsB;AAC3C,UAAM,OAAQ,OAAO,KAAK,QAAQ,KAAK,MAAM,KAAK,OAAQ;AAC1D,WAAO,KAAK,MAAM,MAAM,GAAI,IAAI;AAAA,EAClC;AAAA,EAEQ,aAAa,MAAuB;AAC1C,WAAO,QAAQ,KAAK;AAAA,EACtB;AAAA,EAEQ,QAAQ,IAAW;AACzB,UAAM,KAAK,GAAG;AACd,QAAI,OAAO,OAAO,GAAG,KAAK;AAE1B,QAAI,KAAK,SAAS,YAAY;AAC5B,YAAM,UACJ,KAAK,OAAO,OAAO,KAAK,OAAO,KAAK,IAAI,IAAI,KAAK,OAAO,KAAK;AAC/D,aAAO,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,OAAO,CAAC;AACrD,SAAG,QAAQ,OAAO,IAAI;AAAA,IACxB;AAEA,SAAK,QAAQ;AACb,SAAK,kBAAkB;AACvB,SAAK;AAAA,MACH,IAAI,YAAY,cAAc;AAAA,QAC5B,QAAQ,EAAE,OAAO,KAAK,MAAM;AAAA,QAC5B,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AACA,SAAK,UAAU,KAAK,KAAK;AAAA,EAC3B;AAAA,EAEA,iBAAiB,IAAmC;AAAE,SAAK,YAAY;AAAA,EAAI;AAAA,EAC3E,kBAAkB,IAAsB;AAAE,SAAK,aAAa;AAAA,EAAI;AAAA,EAChE,WAAW,OAAqB;AAAE,SAAK,QAAQ;AAAA,EAAO;AAAA,EAE9C,oBAAoB;AAC1B,UAAM,WAAW,KAAK,YAAY,cAAc,eAAe;AAC/D,QAAI,CAAC,SAAU;AAEf,QAAI,KAAK,SAAS;AAChB,eAAS,MAAM,OAAO,GAAG,KAAK,UAAU;AACxC,eAAS,MAAM,QAAQ,GAAG,KAAK,IAAI,GAAG,KAAK,gBAAgB,KAAK,UAAU,CAAC;AAAA,IAC7E,WAAW,KAAK,SAAS,YAAY;AACnC,YAAM,cAAe,KAAK,QAAQ,KAAK,MAAM,KAAK,OAAQ;AAC1D,YAAM,aAAa,KAAK,MAAM,KAAK,aAAa,WAAW,IAAI;AAC/D,eAAS,MAAM,QAAQ,GAAG,UAAU;AAAA,IACtC,OAAO;AACL,eAAS,MAAM,QAAQ,GAAG,KAAK,UAAU;AAAA,IAC3C;AAAA,EACF;AAAA,EAEQ,qBAAqB,MAAc,KAAK,YAAY,MAAc,KAAK,OAAO;AACpF,WAAOC;AAAA,kDACuC,GAAG;AAAA,UAC3C,KAAK,aAAaA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAcV,GAAG;AAAA;AAAA;AAAA;AAAA,YAIT,EAAE;AAAA;AAAA;AAAA;AAAA,EAIZ;AAAA,EAEQ,cAAc;AACpB,QAAI,KAAK,SAAS,WAAY,QAAO;AAErC,WAAOA;AAAA;AAAA,UAED,KAAK,MAAM;AAAA,MACX,CAAC,SAASA;AAAA;AAAA,4BAEQ,KAAK,aAAa,IAAI,IAAI,WAAW,EAAE;AAAA,6BACtC,KAAK,eAAe,IAAI,CAAC;AAAA;AAAA,IAE9C,CAAC;AAAA;AAAA;AAAA,EAGP;AAAA,EAEQ,mBAAmB;AACzB,QAAI,KAAK,SAAS,cAAc,CAAC,KAAK,eAAgB,QAAO;AAE7D,WAAOA;AAAA;AAAA,UAED,KAAK,MAAM;AAAA,MACX,CAAC,SAASA;AAAA;AAAA;AAAA,6BAGS,KAAK,eAAe,IAAI,CAAC;AAAA,gBACtC,IAAI;AAAA;AAAA;AAAA,IAGZ,CAAC;AAAA;AAAA;AAAA,EAGP;AAAA,EAEA,SAAS;AACP,UAAM,gBAAgB;AAAA,MACpB;AAAA,MACA,KAAK,WAAW,aAAa;AAAA,MAC7B,KAAK,SAAS,aAAa,cAAc;AAAA,MACzC,KAAK,UAAU,UAAU;AAAA,IAC3B,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,UAAM,qBAAqB;AAAA,MACzB;AAAA,MACA,KAAK,UAAU,WAAW,WAAW;AAAA,IACvC,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,QAAI,KAAK,SAAS;AAChB,aAAOA;AAAA;AAAA,mBAEM,aAAa;AAAA,0BACN,KAAK,kBAAkB;AAAA,0BACvB,KAAK,kBAAkB;AAAA,wBACzB,KAAK,gBAAgB;AAAA,4BACjB,KAAK,gBAAgB;AAAA;AAAA;AAAA,wBAGzB,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAMtB,OAAO,KAAK,GAAG,CAAC;AAAA,oBAChB,OAAO,KAAK,GAAG,CAAC;AAAA,qBACf,OAAO,KAAK,IAAI,CAAC;AAAA,sBAChB,OAAO,KAAK,KAAK,CAAC;AAAA,yBACf,KAAK,QAAQ;AAAA,sBAChB,KAAK,iBAAiB;AAAA,qBACvB,MAAM,KAAK,WAAW,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,oBAKxB,OAAO,KAAK,GAAG,CAAC;AAAA,oBAChB,OAAO,KAAK,GAAG,CAAC;AAAA,qBACf,OAAO,KAAK,IAAI,CAAC;AAAA,sBAChB,OAAO,KAAK,QAAQ,CAAC;AAAA,yBAClB,KAAK,QAAQ;AAAA,sBAChB,KAAK,eAAe;AAAA,qBACrB,MAAM,KAAK,WAAW,CAAC;AAAA;AAAA,YAEhC,KAAK,qBAAqB,KAAK,YAAY,KAAK,KAAK,CAAC;AAAA,YACtD,KAAK,qBAAqB,KAAK,eAAe,KAAK,QAAQ,CAAC;AAAA;AAAA;AAAA,IAGpE;AAEA,WAAOA;AAAA,oBACS,aAAa;AAAA;AAAA,sBAEX,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA,kBAKtB,OAAO,KAAK,GAAG,CAAC;AAAA,kBAChB,OAAO,KAAK,GAAG,CAAC;AAAA,mBACf,KAAK,SAAS,aAAa,OAAO,KAAK,IAAI,IAAI,GAAG;AAAA,oBACjD,OAAO,KAAK,KAAK,CAAC;AAAA,uBACf,KAAK,QAAQ;AAAA,oBAChB,KAAK,OAAO;AAAA,mBACb,MAAM,KAAK,WAAW,CAAC;AAAA;AAAA,UAEhC,KAAK,qBAAqB,CAAC;AAAA,UAC3B,KAAK,YAAY,CAAC;AAAA,UAClB,KAAK,iBAAiB,CAAC;AAAA;AAAA;AAAA,EAG/B;AACF;AAlpBa,UA8BJ,SAASC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA7B2B;AAAA,EAA1CC,WAAS,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,GAD9B,UACgC;AAGA;AAAA,EAA1CA,WAAS,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,GAJ9B,UAIgC;AAEf;AAAA,EAA3BA,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GANf,UAMiB;AAEA;AAAA,EAA3BA,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GARf,UAQiB;AAEA;AAAA,EAA3BA,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAVf,UAUiB;AAEC;AAAA,EAA5BA,WAAS,EAAE,MAAM,QAAQ,CAAC;AAAA,GAZhB,UAYkB;AAED;AAAA,EAA3BA,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAdf,UAciB;AAEC;AAAA,EAA5BA,WAAS,EAAE,MAAM,QAAQ,CAAC;AAAA,GAhBhB,UAgBkB;AAEA;AAAA,EAA5BA,WAAS,EAAE,MAAM,QAAQ,CAAC;AAAA,GAlBhB,UAkBkB;AAED;AAAA,EAA3BA,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GApBf,UAoBiB;AAGwB;AAAA,EAAnDA,WAAS,EAAE,MAAM,QAAQ,WAAW,YAAY,CAAC;AAAA,GAvBvC,UAuByC;AAEnC;AAAA,EAAhBC,QAAM;AAAA,GAzBI,UAyBM;AAzBN,YAAN;AAAA,EADNC,gBAAc,YAAY;AAAA,GACd;;;ACXb,SAAS,cAAAC,cAAY,QAAAC,QAAM,OAAAC,aAAW;AACtC,SAAS,iBAAAC,iBAAe,YAAAC,YAAU,SAAAC,eAAa;AAC/C,OAAO;AAMA,IAAM,cAAN,cAA0BC,aAAW;AAAA,EAArC;AAAA;AACuB,mBAAkB;AAIjB,wBAAwB;AAExB,qBAAqB;AAEtB,iBAAuB;AAEvB,oBAAmB;AAEnB,gBAAqB;AACL,gBAAO;AAE1C,SAAQ,UAAmB;AAEpC,SAAQ,gBAAsD;AAAA;AAAA,EAkM9D,oBAAoB;AAClB,UAAM,kBAAkB;AAAA,EAC1B;AAAA,EAEA,WAAW,SAA+B;AACxC,QAAI,CAAC,QAAQ,IAAI,MAAM,EAAG;AAC1B,QAAI,KAAK,MAAM;AACb,WAAK,UAAU;AACf,WAAK,eAAe;AAAA,IACtB,OAAO;AACL,WAAK,UAAU;AACf,WAAK,kBAAkB;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,QAAQ,SAA+B;AACrC,SAAK,QAAQ,IAAI,UAAU,KAAK,QAAQ,IAAI,cAAc,MAAM,KAAK,MAAM;AACzE,WAAK,eAAe;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,uBAAuB;AACrB,UAAM,qBAAqB;AAC3B,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEQ,iBAAiB;AACvB,QAAI,KAAK,WAAW,GAAG;AACrB,WAAK,kBAAkB;AACvB,YAAM,QAAQ,KAAK,eAAe,KAAK,WAAW,IAAI,KAAK;AAC3D,WAAK,gBAAgB,WAAW,MAAM,KAAK,QAAQ,GAAG,KAAK;AAAA,IAC7D;AAAA,EACF;AAAA,EAEQ,oBAAoB;AAC1B,QAAI,KAAK,kBAAkB,MAAM;AAC/B,mBAAa,KAAK,aAAa;AAC/B,WAAK,gBAAgB;AAAA,IACvB;AAAA,EACF;AAAA,EAEQ,gBAAgB;AACtB,SAAK;AAAA,MACH,IAAI,YAAY,eAAe;AAAA,QAC7B,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AACA,SAAK,QAAQ;AAAA,EACf;AAAA,EAEQ,UAAU;AAChB,SAAK,OAAO;AACZ,SAAK,UAAU;AACf,SAAK;AAAA,MACH,IAAI,YAAY,SAAS;AAAA,QACvB,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,aAAa;AACnB,UAAM,UAAkC;AAAA,MACtC,SAAS;AAAA,MACT,OAAO;AAAA,MACP,SAAS;AAAA,IACX;AACA,UAAM,OAAO,QAAQ,KAAK,IAAI;AAC9B,QAAI,CAAC,KAAM,QAAOC;AAClB,WAAOA,yBAAuB,IAAI;AAAA,EACpC;AAAA,EAEA,SAAS;AACP,UAAM,kBAAkB;AAAA,MACtB;AAAA,MACA,KAAK,UAAU,WAAW,aAAa;AAAA,MACvC,CAAC,KAAK,UAAU,WAAW;AAAA,MAC3B,KAAK,SAAS,YAAY,QAAQ,KAAK,IAAI,KAAK;AAAA,IAClD,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,WAAOA;AAAA,oBACS,eAAe;AAAA;AAAA,YAEvB,KAAK,SAAS,YAAY,KAAK,WAAW,IAAI,EAAE;AAAA,uDACL,KAAK,OAAO;AAAA;AAAA;AAAA;AAAA,YAIvD,KAAK,SACHA;AAAA,wEAC0D,KAAK,aAAa;AAAA,oBACtE,KAAK,MAAM;AAAA;AAAA,kBAGjB,EAAE;AAAA,YACJ,KAAK,YACHA;AAAA,6EAC+D,KAAK,OAAO;AAAA;AAAA;AAAA,kBAI3E,EAAE;AAAA;AAAA;AAAA;AAAA,EAId;AACF;AAjUa,YAoBJ,SAASC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAnBY;AAAA,EAA3BC,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GADf,YACiB;AAEA;AAAA,EAA3BA,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAHf,YAGiB;AAEC;AAAA,EAA5BA,WAAS,EAAE,MAAM,QAAQ,CAAC;AAAA,GALhB,YAKkB;AAEA;AAAA,EAA5BA,WAAS,EAAE,MAAM,QAAQ,CAAC;AAAA,GAPhB,YAOkB;AAED;AAAA,EAA3BA,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GATf,YASiB;AAEA;AAAA,EAA3BA,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAXf,YAWiB;AAEA;AAAA,EAA3BA,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAbf,YAaiB;AACgB;AAAA,EAA3CA,WAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAd/B,YAciC;AAE3B;AAAA,EAAhBC,QAAM;AAAA,GAhBI,YAgBM;AAhBN,cAAN;AAAA,EADNC,gBAAc,cAAc;AAAA,GAChB;;;ACRb,SAAS,cAAAC,cAAY,QAAAC,QAAM,OAAAC,aAAW;AACtC,SAAS,iBAAAC,iBAAe,YAAAC,kBAAgB;AAiBjC,IAAM,aAAN,cAAyBC,aAAW;AAAA,EAApC;AAAA;AACsB,iBAAgB,CAAC;AAEhB,qBAAuB;AAEvB,uBAA2B;AAE3B,gBAAoB;AAEL,gBAAoB;AAAA;AAAA,EAqWvD,OAAO,MAAqB;AAClC,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA,EAEQ,WAAW,MAAqB;AACtC,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA,EAEQ,WAAW,MAAqB;AACtC,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA,EAEQ,eAAe,MAAoB;AACzC,UAAM,UAAU,CAAC,UAAU;AAC3B,QAAI,KAAK,OAAO,IAAI,EAAG,SAAQ,KAAK,MAAM;AAC1C,QAAI,KAAK,WAAW,IAAI,EAAG,SAAQ,KAAK,UAAU;AAClD,QAAI,KAAK,WAAW,IAAI,EAAG,SAAQ,KAAK,UAAU;AAClD,WAAO,QAAQ,KAAK,GAAG;AAAA,EACzB;AAAA,EAEQ,YAAY,MAAY,OAAe;AAC7C,QAAI,KAAK,WAAW,WAAY;AAEhC,SAAK;AAAA,MACH,IAAI,YAAY,mBAAmB;AAAA,QACjC,QAAQ;AAAA,UACN;AAAA,UACA;AAAA,QACF;AAAA,QACA,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,gBAAgB,MAAY,OAAe;AACjD,QAAI,KAAK,SAAS,MAAO,QAAOC;AAChC,QAAI,KAAK,SAAS,SAAU,QAAOA,eAAa,QAAQ,CAAC;AACzD,QAAI,KAAK,SAAS,UAAU,KAAK,WAAW,QAAQ;AAClD,aAAOA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAeT;AACA,WAAOA,eAAa,QAAQ,CAAC;AAAA,EAC/B;AAAA,EAEA,SAAS;AAGP,UAAM,YACJ,KAAK,mBAAmB,KAAK,cAAc,UAAU,aAAa;AAEpE,UAAM,iBAAiB;AAAA,MACrB;AAAA,MACA,KAAK,gBAAgB,aAAa,aAAa;AAAA,MAC/C,cAAc,aAAa,eAAe;AAAA,MAC1C,cAAc,QAAQ,cAAc;AAAA,MACpC,KAAK,SAAS,UAAU,UAAU;AAAA,IACpC,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,UAAM,aAAa,KAAK,gBAAgB;AACxC,UAAM,cAAc,cAAc;AAElC,WAAOA;AAAA,oBACS,cAAc;AAAA,UACxB,KAAK,MAAM;AAAA,MACX,CAAC,MAAM,QAAQA;AAAA;AAAA,uBAEF,KAAK,eAAe,IAAI,CAAC;AAAA,wBACxB,MAAM,KAAK,YAAY,MAAM,GAAG,CAAC;AAAA;AAAA,gBAEzC,cAAc,cACZA;AAAA;AAAA;AAAA;AAAA,0BAIQ,KAAK,gBAAgB,MAAM,GAAG,CAAC;AAAA;AAAA,wBAEjC,MAAM,KAAK,MAAM,SAAS,IACxBA,qDACA,EAAE;AAAA;AAAA;AAAA;AAAA,2DAI+B,KAAK,KAAK;AAAA,sBAEnD,aACAA;AAAA;AAAA;AAAA;AAAA,0BAIQ,KAAK,gBAAgB,MAAM,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA,6DAII,KAAK,KAAK;AAAA;AAAA;AAAA;AAAA,sBAIjD,MAAM,KAAK,MAAM,SAAS,IACxBA,qDACA,EAAE;AAAA,sBAERA;AAAA;AAAA;AAAA,wBAGM,KAAK,gBAAgB,MAAM,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA,2DAII,KAAK,KAAK;AAAA;AAAA;AAAA,sBAG/C,CAAC,cAAc,MAAM,KAAK,MAAM,SAAS,IACvCA,qDACA,EAAE;AAAA,mBACP;AAAA;AAAA;AAAA,IAGX,CAAC;AAAA;AAAA;AAAA,EAGP;AACF;AAvfa,WAqBJ,SAASC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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","names":["LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","nothing","customElement","property","state","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","query","html","nothing","css","property","state","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","state","LitElement","html","css","property","state","customElement","LitElement","html","css","nothing","customElement","property","LitElement","html","nothing","css","property","customElement","LitElement","html","css","nothing","customElement","property","state","query","LitElement","html","nothing","css","property","state","query","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","nothing","customElement","property","state","query","LitElement","html","nothing","css","property","state","query","customElement","LitElement","html","css","nothing","customElement","property","state","query","LitElement","html","nothing","css","property","state","query","customElement","LitElement","html","css","customElement","property","state","LitElement","html","css","property","state","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","state","query","LitElement","html","css","customElement","LitElement","html","css","customElement","LitElement","html","css","property","state","query","customElement","LitElement","html","css","nothing","customElement","property","LitElement","html","css","property","customElement","nothing","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","customElement","property","state","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","property","customElement","updated","state","LitElement","html","customElement","state","LitElement","html","state","customElement","LitElement","html","customElement","property","LitElement","html","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","state","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","LitElement","html","css","customElement","LitElement","html","css","customElement","LitElement","html","css","customElement","LitElement","html","css","customElement","LitElement","html","css","customElement","LitElement","html","css","customElement","LitElement","html","css","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","property","state","customElement","LitElement","html","css","customElement","property","state","LitElement","html","css","property","state","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","state","query","LitElement","html","css","property","state","query","customElement","LitElement","html","css","customElement","property","state","LitElement","html","css","property","state","customElement","LitElement","html","css","customElement","property","state","query","LitElement","html","css","property","state","query","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","nothing","customElement","property","state","query","repeat","LitElement","html","repeat","nothing","css","property","state","query","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","query","LitElement","html","css","property","query","customElement","LitElement","html","css","customElement","property","state","LitElement","html","css","property","state","customElement","LitElement","html","css","customElement","property","state","LitElement","html","css","property","state","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","state","LitElement","html","css","property","state","customElement","LitElement","html","css","customElement","property","state","LitElement","html","property","customElement","css","state","LitElement","html","css","customElement","property","state","LitElement","html","css","property","state","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/components/rel-accordion/rel-accordion.ts","../src/components/rel-alert/rel-alert.ts","../src/components/rel-autocomplete/rel-autocomplete.ts","../src/components/rel-textfield/rel-textfield.ts","../src/components/rel-avatar/rel-avatar.ts","../src/components/rel-badge/rel-badge.ts","../src/components/rel-breadcrumb/rel-breadcrumb.ts","../src/components/rel-button/rel-button.ts","../src/components/rel-calendar/rel-calendar.ts","../src/components/rel-card/rel-card.ts","../src/components/rel-carousel/rel-carousel.ts","../src/components/rel-cardmedia/rel-cardmedia.ts","../src/components/rel-checkbox/rel-checkbox.ts","../src/components/rel-date-picker/rel-date-picker.ts","../src/components/rel-date-picker/date-format.ts","../src/components/rel-range-picker/rel-range-picker.ts","../src/components/rel-chip/rel-chip.ts","../src/components/rel-container/rel-container.ts","../src/components/rel-divider/rel-divider.ts","../src/components/rel-drawer/rel-drawer.ts","../src/components/rel-drawer/rel-drawer-footer.ts","../src/components/rel-kbd/rel-kbd.ts","../src/components/rel-layout/rel-layout.ts","../src/components/rel-menu/rel-menu.ts","../src/components/rel-radio/rel-radio.ts","../src/components/rel-menubar/rel-menubar.ts","../src/components/rel-menubar/rel-menubar-menu.ts","../src/components/rel-navbar/rel-navbar.ts","../src/components/rel-topbar/rel-topbar.ts","../src/components/rel-topbar/rel-topbar-brand.ts","../src/components/rel-topbar/rel-topbar-actions.ts","../src/components/rel-topbar/rel-topbar-utilities.ts","../src/components/rel-topbar/rel-topbar-mobile-panel.ts","../src/components/rel-topbar/rel-topbar-dropdown.ts","../src/components/rel-topbar/rel-topbar-dropdown-item.ts","../src/components/rel-topbar/rel-topbar-item.ts","../src/components/rel-topbar/rel-topbar-profile.ts","../src/components/rel-otp/rel-otp.ts","../src/components/rel-pagination/rel-pagination.ts","../src/components/rel-popover/rel-popover.ts","../src/components/rel-popover/rel-popover-content.ts","../src/components/rel-progress/rel-progress.ts","../src/components/rel-resizable/rel-resizable-group.ts","../src/components/rel-resizable/rel-resizable-panel.ts","../src/components/rel-resizable/rel-resizable-handle.ts","../src/components/rel-segmented-button/rel-segmented-button.ts","../src/components/rel-select/rel-select.ts","../src/components/rel-skeleton/rel-skeleton.ts","../src/components/rel-sheet/rel-sheet.ts","../src/components/rel-slider/rel-slider.ts","../src/components/rel-snackbar/rel-snackbar.ts","../src/components/rel-stepper/rel-stepper.ts","../src/components/rel-switch/rel-switch.ts","../src/components/rel-tab/rel-tab.ts","../src/components/rel-time-picker/rel-time-picker.ts","../src/components/rel-toast/rel-toast.ts","../src/components/rel-tooltip/rel-tooltip.ts"],"sourcesContent":["// MUST be first\r\nimport \"./styles/vars.css\";\r\n\r\n/* Web components */\r\nexport * from \"./components/rel-accordion/rel-accordion\";\r\nexport * from \"./components/rel-alert/rel-alert\";\r\nexport * from \"./components/rel-autocomplete/rel-autocomplete\";\r\nexport * from \"./components/rel-avatar/rel-avatar\";\r\nexport * from \"./components/rel-badge/rel-badge\";\r\nexport * from \"./components/rel-breadcrumb/rel-breadcrumb\";\r\nexport * from \"./components/rel-button/rel-button\";\r\nexport * from \"./components/rel-calendar/rel-calendar\";\r\nexport * from \"./components/rel-card/rel-card\";\r\nexport * from \"./components/rel-carousel/rel-carousel\";\r\nexport * from \"./components/rel-cardmedia/rel-cardmedia\";\r\nexport * from \"./components/rel-checkbox/rel-checkbox\";\r\nexport * from \"./components/rel-date-picker/rel-date-picker\";\r\nexport * from \"./components/rel-range-picker/rel-range-picker\";\r\nexport * from \"./components/rel-chip/rel-chip\";\r\nexport * from \"./components/rel-container/rel-container\";\r\nexport * from \"./components/rel-divider/rel-divider\";\r\nexport * from \"./components/rel-drawer/rel-drawer\";\r\nexport * from \"./components/rel-drawer/rel-drawer-footer\";\r\nexport * from \"./components/rel-kbd/rel-kbd\";\r\nexport * from \"./components/rel-layout/rel-layout\";\r\nexport * from \"./components/rel-menu/rel-menu\";\r\nexport * from \"./components/rel-menubar/rel-menubar\";\r\nexport * from \"./components/rel-menubar/rel-menubar-menu\";\r\nexport * from \"./components/rel-navbar/rel-navbar\";\r\nexport * from \"./components/rel-topbar/rel-topbar\";\r\nexport * from \"./components/rel-topbar/rel-topbar-brand\";\r\nexport * from \"./components/rel-topbar/rel-topbar-actions\";\r\nexport * from \"./components/rel-topbar/rel-topbar-utilities\";\r\nexport * from \"./components/rel-topbar/rel-topbar-mobile-panel\";\r\nexport * from \"./components/rel-topbar/rel-topbar-item\";\r\nexport * from \"./components/rel-topbar/rel-topbar-dropdown\";\r\nexport * from \"./components/rel-topbar/rel-topbar-dropdown-item\";\r\nexport * from \"./components/rel-topbar/rel-topbar-profile\";\r\nexport * from \"./components/rel-otp/rel-otp\";\r\nexport * from \"./components/rel-pagination/rel-pagination\";\r\nexport * from \"./components/rel-popover/rel-popover\";\r\nexport * from \"./components/rel-popover/rel-popover-content\";\r\nexport * from \"./components/rel-progress/rel-progress\";\r\nexport * from \"./components/rel-radio/rel-radio\";\r\nexport * from \"./components/rel-resizable\";\r\nexport * from \"./components/rel-segmented-button/rel-segmented-button\";\r\nexport * from \"./components/rel-select/rel-select\";\r\nexport * from \"./components/rel-skeleton/rel-skeleton\";\r\nexport * from \"./components/rel-sheet/rel-sheet\";\r\nexport * from \"./components/rel-slider/rel-slider\";\r\nexport * from \"./components/rel-snackbar/rel-snackbar\";\r\nexport * from \"./components/rel-stepper/rel-stepper\";\r\nexport * from \"./components/rel-switch/rel-switch\";\r\nexport * from \"./components/rel-tab/rel-tab\";\r\nexport * from \"./components/rel-textfield/rel-textfield\";\r\nexport * from \"./components/rel-time-picker/rel-time-picker\";\r\nexport * from \"./components/rel-toast/rel-toast\";\r\nexport * from \"./components/rel-tooltip/rel-tooltip\";\r\n// rel-upload is PENDING — moved out of this package to /pending/rel-upload at\r\n// the repo root while Figma design ambiguities are resolved.\r\n// See pending/rel-upload/SESSION-NOTES.md.\r\nexport * from \"@reliability-design/icons\";\r\n","import \"@reliability-design/icons/rel-icon\";\nimport { LitElement, html, css } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\n\n@customElement(\"rel-accordion\")\nexport class RelAccordion extends LitElement {\n @property({ type: String }) title = \"Accordion\";\n @property({ type: Boolean, reflect: true }) open = false;\n @property({ type: String, reflect: true }) size: \"md\" | \"sm\" = \"md\";\n @property({ type: String, reflect: true }) type: \"default\" | \"action\" = \"default\";\n\n /** Figma \"Style\" axis — named appearance because `style` collides with the HTML style attribute. */\n @property({ type: String, reflect: true }) appearance: \"shadow\" | \"plain\" = \"shadow\";\n\n static styles = css`\n :host {\n color: var(--rel-text-default);\n display: block;\n width: 100%;\n font-family: var(--rel-fonts-font-family, sans-serif);\n }\n\n .accordion {\n background: var(--rel-bg-neutral);\n border-radius: var(--rel-border-radius-sm);\n border: 1px solid var(--rel-border-subtle);\n overflow: hidden;\n box-shadow: var(--rel-shadows-shadow-100);\n }\n\n /* Figma Style=Shadow: elevation only, no visible border */\n :host([appearance=\"shadow\"]) .accordion {\n border-color: transparent;\n box-shadow: var(--rel-shadows-shadow-100);\n }\n\n /* Figma Style=Plain: flat — border, no elevation */\n :host([appearance=\"plain\"]) .accordion {\n border-color: var(--rel-border-subtle);\n box-shadow: none;\n }\n\n /* ── Header ───────────────────────────────────────────────── */\n\n .header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: pointer;\n user-select: none;\n box-sizing: border-box;\n /* matches .accordion's radius so the focus-visible outline isn't clipped square at the corners by the parent's overflow:hidden */\n border-radius: 8px;\n }\n\n :host([size=\"md\"]) .header {\n padding: var(--rel-spacing-xs) var(--rel-spacing-xs) var(--rel-spacing-xs) var(--rel-spacing-md);\n min-height: 56px;\n }\n\n :host([size=\"sm\"]) .header {\n padding: var(--rel-spacing-xs) var(--rel-spacing-xs) var(--rel-spacing-xs) var(--rel-spacing-sm);\n min-height: 48px;\n }\n\n .header:hover {\n background: var(--rel-bg-surface-elevated);\n }\n\n .header:focus-visible {\n outline: 2px solid var(--rel-border-focus);\n outline-offset: -2px;\n }\n\n /* ── Title row ────────────────────────────────────────────── */\n\n .title-row {\n display: flex;\n align-items: center;\n gap: var(--rel-spacing-xs);\n flex: 1;\n }\n\n .title {\n font-weight: var(--rel-headings-md-font-weight);\n color: var(--rel-text-default);\n }\n\n :host([size=\"md\"]) .title {\n\n font-family: var(--rel-headings-md-font-family);\n\n font-weight: var(--rel-headings-md-font-weight);\n\n font-size: var(--rel-headings-md-font-size);\n\n line-height: var(--rel-headings-md-line-height);\n\n letter-spacing: var(--rel-headings-md-letter-spacing);\n\n }\n\n :host([size=\"sm\"]) .title {\n\n font-family: var(--rel-headings-sm-font-family);\n\n font-weight: var(--rel-headings-sm-font-weight);\n\n font-size: var(--rel-headings-sm-font-size);\n\n line-height: var(--rel-headings-sm-line-height);\n\n letter-spacing: var(--rel-headings-sm-letter-spacing);\n\n }\n\n /* ── Leading icon (action type) ───────────────────────────── */\n\n .leading-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: var(--rel-text-default);\n }\n\n .leading-icon ::slotted(svg) {\n width: 24px;\n height: 24px;\n }\n\n .leading-icon rel-icon,\n .leading-icon ::slotted(rel-icon) {\n --rel-icon-size: 24px;\n }\n\n :host([size=\"sm\"]) .leading-icon ::slotted(svg) {\n width: 20px;\n height: 20px;\n }\n\n :host([size=\"sm\"]) .leading-icon rel-icon,\n :host([size=\"sm\"]) .leading-icon ::slotted(rel-icon) {\n --rel-icon-size: 20px;\n }\n\n /* ── Chevron ──────────────────────────────────────────────── */\n\n .chevron {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n\n :host([size=\"md\"]) .chevron {\n width: 40px;\n height: 40px;\n }\n\n :host([size=\"sm\"]) .chevron {\n width: 32px;\n height: 32px;\n }\n\n .chevron ::slotted(svg) {\n width: 24px;\n height: 24px;\n }\n\n .chevron rel-icon,\n .chevron ::slotted(rel-icon) {\n --rel-icon-size: 24px;\n color: var(--rel-action-neutral-label-icons-ghost);\n }\n\n :host([size=\"sm\"]) .chevron ::slotted(svg) {\n width: 20px;\n height: 20px;\n }\n\n :host([size=\"sm\"]) .chevron rel-icon,\n :host([size=\"sm\"]) .chevron ::slotted(rel-icon) {\n --rel-icon-size: 20px;\n }\n\n /* ── Icon rotation ────────────────────────────────────────── */\n /* Only the shadow-DOM fallback wrappers rotate on open.\n Slotted (light-DOM) icons are never targeted, so they stay static. */\n\n .icon-rotate-on-open,\n .chevron-rotate {\n display: inline-flex;\n align-items: center;\n transition: transform 0.25s ease;\n }\n\n /* Leading fallback chevron: 90° (points right when open) */\n :host([open]) .icon-rotate-on-open {\n transform: rotate(90deg);\n }\n\n /* Trailing fallback chevron (type=\"default\" only): 180° flip */\n :host([open]) .chevron-rotate {\n transform: rotate(180deg);\n }\n\n /* ── Body ─────────────────────────────────────────────────── */\n\n .body {\n overflow: hidden;\n max-height: 0;\n padding: 0 var(--rel-spacing-md);\n color: var(--rel-text-body);\n transition:\n max-height 0.25s ease,\n padding 0.2s ease;\n font-family: var(--rel-body-md-regular-font-family);\n font-weight: var(--rel-body-md-regular-font-weight);\n font-size: var(--rel-body-md-regular-font-size);\n line-height: var(--rel-body-md-regular-line-height);\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\n }\n\n :host([size=\"sm\"]) .body {\n\n font-family: var(--rel-body-sm-regular-font-family);\n\n font-weight: var(--rel-body-sm-regular-font-weight);\n\n font-size: var(--rel-body-sm-regular-font-size);\n\n line-height: var(--rel-body-sm-regular-line-height);\n\n letter-spacing: var(--rel-body-sm-regular-letter-spacing);\n\n }\n\n .body.open {\n max-height: 1000px;\n scroll-margin-top: var(--rel-spacing-xl);\n padding: var(--rel-spacing-2xs) var(--rel-spacing-md) var(--rel-spacing-lg);\n }\n\n /* ── Dark mode ────────────────────────────────────────────── */\n\n :host-context([data-theme=\"dark\"]) .title,\n [data-theme=\"dark\"] .title {\n color: var(--rel-text-default);\n }\n\n :host-context([data-theme=\"dark\"]) .chevron rel-icon,\n [data-theme=\"dark\"] .chevron rel-icon,\n :host-context([data-theme=\"dark\"]) .chevron ::slotted(rel-icon),\n [data-theme=\"dark\"] .chevron ::slotted(rel-icon) {\n color: var(--rel-text-default);\n }\n\n :host-context([data-theme=\"dark\"]) .leading-icon,\n [data-theme=\"dark\"] .leading-icon {\n color: var(--rel-text-default);\n }\n\n @media (prefers-reduced-motion: reduce) {\n .icon-rotate-on-open,\n .chevron-rotate,\n .body {\n transition: none;\n }\n }\n `;\n\n private toggle() {\n this.open = !this.open;\n this.dispatchEvent(\n new CustomEvent<boolean>(\"open-change\", {\n detail: this.open,\n bubbles: true,\n composed: true,\n })\n );\n }\n\n render() {\n return html`\n <div part=\"base\" class=\"accordion\">\n <div\n part=\"trigger\" class=\"header\"\n role=\"button\"\n tabindex=\"0\"\n aria-expanded=\"${this.open}\"\n @click=${this.toggle}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n this.toggle();\n }\n }}\n >\n <div part=\"label\" class=\"title-row\">\n ${this.type === \"action\"\n ? html`<span class=\"leading-icon\">\n <slot name=\"icon\">\n <span class=\"icon-rotate-on-open\"><rel-icon name=\"chevron-right\"></rel-icon></span>\n </slot>\n </span>`\n : \"\"}\n <span class=\"title\">${this.title}</span>\n </div>\n <div part=\"icon\" class=\"chevron\">\n <slot name=\"trailing-icon\">\n ${this.type === \"default\"\n ? html`<span class=\"chevron-rotate\"><rel-icon name=\"chevron-down\"></rel-icon></span>`\n : html`<rel-icon name=\"arrow-expansion\"></rel-icon>`}\n </slot>\n </div>\n </div>\n <div part=\"content\" class=\"body ${this.open ? \"open\" : \"closed\"}\">\n <slot></slot>\n </div>\n </div>\n `;\n }\n}\n","import { LitElement, html, css } from \"lit\";\r\nimport \"@reliability-design/icons/rel-icon\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\r\n@customElement(\"rel-alert\")\r\nexport class RelAlert extends LitElement {\r\n @property({ type: String })\r\n type: \"info\" | \"success\" | \"warning\" | \"error\" | \"neutral\" = \"neutral\";\r\n\r\n /** Visual treatment (Figma \"Style\"): solid | subtle | outline. \"filled\" is a deprecated alias of solid. */\r\n @property({ type: String, reflect: true })\r\n appearance: \"solid\" | \"subtle\" | \"outline\" | \"filled\" = \"subtle\";\r\n\r\n @property({ type: String }) message1 = \"\";\r\n @property({ type: String }) message2?: string;\r\n\r\n // Explicit attribute names: Lit would otherwise lowercase these to `urltext`\r\n // / `urlhref`, while the docs, the docs-app previews and consumers all use\r\n // `url-text` / `url-href` — which silently did nothing.\r\n @property({ type: String, attribute: \"url-text\" }) urlText?: string;\r\n @property({ type: String, attribute: \"url-href\" }) urlHref?: string;\r\n\r\n @property({ type: Boolean }) dismissible = true;\r\n @property({ type: Boolean, reflect: true }) dismissed = false;\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n display: block;\r\n font-family: var(--rel-fonts-font-family);\r\n }\r\n\r\n :host([dismissed]) {\r\n display: none;\r\n }\r\n\r\n .rel-alert {\r\n display: flex;\r\n align-items: flex-start;\r\n gap: var(--rel-spacing-xs);\r\n padding: var(--rel-spacing-sm) var(--rel-spacing-lg);\r\n border-radius: var(--rel-border-radius-sm);\r\n min-width: 360px;\r\n box-sizing: border-box;\r\n }\r\n\r\n .rel-content {\r\n padding-right: var(--rel-spacing-md);\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--rel-spacing-3xs);\r\n }\r\n\r\n .rel-message1 {\r\n /* Figma: body-lg-medium weight on body-lg-regular metrics */\r\n font-weight: var(--rel-body-lg-medium-font-weight);\r\n color: var(--rel-text-label);\r\n margin: 0;\r\n font-family: var(--rel-body-lg-regular-font-family);\r\n font-size: var(--rel-body-lg-regular-font-size);\r\n line-height: var(--rel-body-lg-regular-line-height);\r\n letter-spacing: var(--rel-body-lg-regular-letter-spacing);\r\n }\r\n\r\n .rel-message2 {\r\n color: var(--rel-text-body);\r\n margin: 0;\r\n opacity: 0.9;\r\n font-family: var(--rel-body-md-regular-font-family);\r\n font-weight: var(--rel-body-md-regular-font-weight);\r\n font-size: var(--rel-body-md-regular-font-size);\r\n line-height: var(--rel-body-md-regular-line-height);\r\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\r\n }\r\n\r\n .rel-icon {\r\n margin-top: 2px;\r\n flex-shrink: 0;\r\n }\r\n\r\n .rel-icon svg {\r\n width: 16px;\r\n height: 16px;\r\n display: block;\r\n }\r\n\r\n .rel-link {\r\n text-decoration: underline;\r\n color: var(--rel-action-neutral-label-icons-link);\r\n margin-top: 2px;\r\n\r\n font-family: var(--rel-action-md-font-family);\r\n\r\n font-weight: var(--rel-action-md-font-weight);\r\n\r\n font-size: var(--rel-action-md-font-size);\r\n\r\n line-height: var(--rel-action-md-line-height);\r\n\r\n letter-spacing: var(--rel-action-md-letter-spacing);\r\n\r\n }\r\n\r\n .rel-close {\r\n margin-left: auto;\r\n align-self: flex-start;\r\n background: none;\r\n border: none;\r\n cursor: pointer;\r\n opacity: 0.6;\r\n color: inherit;\r\n font-size: 16px;\r\n padding: var(--rel-spacing-2xs);\r\n line-height: 1;\r\n border-radius: var(--rel-border-radius-xs, 4px);\r\n }\r\n\r\n .rel-close:hover {\r\n opacity: 1;\r\n }\r\n\r\n .rel-close:focus-visible {\r\n outline: 2px solid currentColor;\r\n outline-offset: 2px;\r\n opacity: 1;\r\n }\r\n\r\n /* COLORS — semantic status tokens carry both light and dark modes.\r\n Base classes are the SUBTLE style (Figma Style=Subtle): tone light fill,\r\n no border, tone-colored title. */\r\n .rel-alert {\r\n border: 1px solid transparent;\r\n }\r\n\r\n .alert-neutral {\r\n background: var(--rel-bg-neutral);\r\n color: var(--rel-text-default);\r\n }\r\n\r\n .alert-info {\r\n background: var(--rel-bg-info-light);\r\n color: var(--rel-text-default);\r\n }\r\n\r\n .alert-info .rel-message1 {\r\n color: var(--rel-text-info);\r\n }\r\n\r\n .alert-success {\r\n background: var(--rel-bg-success-light);\r\n color: var(--rel-text-default);\r\n }\r\n\r\n .alert-success .rel-message1 {\r\n color: var(--rel-text-success);\r\n }\r\n\r\n .alert-warning {\r\n background: var(--rel-bg-warning-light);\r\n color: var(--rel-text-default);\r\n }\r\n\r\n .alert-warning .rel-message1 {\r\n color: var(--rel-text-warning);\r\n }\r\n\r\n .alert-error {\r\n background: var(--rel-bg-danger-light);\r\n color: var(--rel-text-default);\r\n }\r\n\r\n .alert-error .rel-message1 {\r\n color: var(--rel-text-danger);\r\n }\r\n\r\n /* Solid style (Figma Style=Solid; \"filled\" is the deprecated alias) */\r\n :host([appearance=\"filled\"]) .alert-neutral,\r\n :host([appearance=\"solid\"]) .alert-neutral {\r\n background: var(--rel-bg-neutral-inverse-2);\r\n color: var(--rel-text-inverse);\r\n }\r\n\r\n :host([appearance=\"filled\"]) .alert-error,\r\n :host([appearance=\"solid\"]) .alert-error {\r\n background: var(--rel-bg-danger);\r\n color: var(--rel-text-static-light);\r\n }\r\n\r\n :host([appearance=\"filled\"]) .alert-success,\r\n :host([appearance=\"solid\"]) .alert-success {\r\n background: var(--rel-bg-success);\r\n color: var(--rel-text-static-light);\r\n }\r\n\r\n :host([appearance=\"filled\"]) .alert-warning,\r\n :host([appearance=\"solid\"]) .alert-warning {\r\n background: var(--rel-bg-warning);\r\n color: var(--rel-text-static-dark);\r\n }\r\n\r\n :host([appearance=\"filled\"]) .alert-info,\r\n :host([appearance=\"solid\"]) .alert-info {\r\n background: var(--rel-bg-info);\r\n color: var(--rel-text-static-light);\r\n }\r\n\r\n :host([appearance=\"filled\"]) .rel-message1,\r\n :host([appearance=\"filled\"]) .rel-message2,\r\n :host([appearance=\"filled\"]) .rel-link,\r\n :host([appearance=\"solid\"]) .rel-message1,\r\n :host([appearance=\"solid\"]) .rel-message2,\r\n :host([appearance=\"solid\"]) .rel-link {\r\n color: inherit;\r\n }\r\n\r\n :host([appearance=\"filled\"]) .rel-icon rel-icon,\r\n :host([appearance=\"solid\"]) .rel-icon rel-icon {\r\n --rel-icon-color: currentColor;\r\n }\r\n\r\n /* Outline style (Figma Style=Outline): no fill, tone border, tone title */\r\n :host([appearance=\"outline\"]) .rel-alert {\r\n background: transparent;\r\n }\r\n\r\n :host([appearance=\"outline\"]) .alert-neutral {\r\n border-color: var(--rel-border-default);\r\n }\r\n\r\n :host([appearance=\"outline\"]) .alert-info {\r\n border-color: var(--rel-border-info);\r\n }\r\n\r\n :host([appearance=\"outline\"]) .alert-success {\r\n border-color: var(--rel-border-success);\r\n }\r\n\r\n :host([appearance=\"outline\"]) .alert-warning {\r\n border-color: var(--rel-border-warning);\r\n }\r\n\r\n :host([appearance=\"outline\"]) .alert-error {\r\n border-color: var(--rel-border-danger);\r\n }\r\n\r\n .alert-error .rel-close {\r\n color: var(--rel-text-default);\r\n }\r\n `;\r\n\r\n private dismissAlert() {\r\n this.dismissed = true;\r\n\r\n this.dispatchEvent(\r\n new CustomEvent(\"dismiss\", {\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n /* Task 2: status icons standardised on <rel-icon> (size tier L = 20px icon\r\n alongside body-lg text). Colour comes from the semantic tone. */\r\n private get iconTemplate() {\r\n const name =\r\n this.type === \"success\" ? \"check-circle\"\r\n : this.type === \"warning\" ? \"alert-circle\"\r\n : this.type === \"error\" ? \"error\"\r\n : \"info\";\r\n const tone =\r\n this.type === \"success\" ? \"success\"\r\n : this.type === \"warning\" ? \"warning\"\r\n : this.type === \"error\" ? \"danger\"\r\n : this.type === \"info\" ? \"info\"\r\n : \"default\";\r\n return html`<rel-icon name=\"${name}\" size=\"md\" tone=\"${tone}\"></rel-icon>`;\r\n }\r\n\r\n render() {\r\n return html`\r\n <div part=\"base\" class=\"rel-alert alert-${this.type}\" role=\"alert\">\r\n <div part=\"icon\" class=\"rel-icon\">${this.iconTemplate}</div>\r\n\r\n <div part=\"content\" class=\"rel-content\">\r\n <p part=\"label\" class=\"rel-message1\">${this.message1}</p>\r\n\r\n ${this.message2\r\n ? html`<p part=\"helper\" class=\"rel-message2\">${this.message2}</p>`\r\n : null}\r\n ${this.urlText && this.urlHref\r\n ? html`<a part=\"action\" class=\"rel-link\" href=${this.urlHref}>\r\n ${this.urlText}\r\n </a>`\r\n : null}\r\n </div>\r\n\r\n ${this.dismissible\r\n ? html`<button part=\"close-button\" class=\"rel-close\" @click=${this.dismissAlert} aria-label=\"Dismiss\">\r\n ✕\r\n </button>`\r\n : null}\r\n </div>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css, nothing, PropertyValues, TemplateResult } from \"lit\";\nimport { customElement, property, state, query } from \"lit/decorators.js\";\nimport { repeat } from \"lit/directives/repeat.js\";\nimport \"@reliability-design/icons/rel-icon\";\nimport \"../rel-textfield/rel-textfield.js\";\nimport type {\n RelTextfield,\n TextFieldSize,\n TextFieldVariant,\n FieldLabelStyle,\n} from \"../rel-textfield/rel-textfield.js\";\n\n/** An item is a plain string or any object read through displayField/valueField. */\nexport type AutocompleteItem = string | Record<string, unknown>;\nexport type AutocompleteFilter = \"contains\" | \"starts-with\" | \"none\";\nexport type AutocompleteSearchFn = (query: string) => Promise<AutocompleteItem[]>;\n\ninterface NormalizedItem {\n value: string;\n label: string;\n icon: string;\n item: AutocompleteItem;\n}\n\n/**\n * `<rel-autocomplete>` — searchable single-select type-ahead field.\n *\n * Composes `<rel-textfield>` for all field chrome (label, sizes, variants,\n * states, icons) and adds a suggestion panel on top. Two data modes:\n * - local: set `items`; typing filters them (`filter` mode)\n * - remote: set `searchFn`; input is debounced (`debounceMs`), queries are\n * latest-wins (stale responses discarded), and `items` is ignored\n *\n * The committed `value` is always the selected item's value string (its\n * `valueField`) — typing alone emits `rel-change` with the raw text but does\n * not change `value` until an item is picked (or the text exactly matches an\n * item's label/value on Enter/blur).\n */\n@customElement(\"rel-autocomplete\")\nexport class RelAutocomplete extends LitElement {\n /** Local (or fallback initial) suggestion list. Ignored while searchFn drives results. */\n @property({ type: Array }) items: AutocompleteItem[] = [];\n\n /** Committed value — the selected item's valueField string (\"\" = none). */\n @property({ type: String }) value: string = \"\";\n\n /** Object key read for the row label when items are objects. */\n @property({ type: String, attribute: \"display-field\" }) displayField: string = \"label\";\n\n /** Object key read for the committed value when items are objects. */\n @property({ type: String, attribute: \"value-field\" }) valueField: string = \"value\";\n\n /** Local filtering mode. Ignored when searchFn is set (results arrive pre-filtered). */\n @property({ type: String }) filter: AutocompleteFilter = \"contains\";\n\n /** Async data source. When set, local filtering is bypassed entirely. */\n @property({ attribute: false }) searchFn?: AutocompleteSearchFn;\n\n /** Debounce for searchFn calls, in ms. */\n @property({ type: Number, attribute: \"debounce-ms\" }) debounceMs: number = 300;\n\n /** Minimum typed characters before the panel opens / searchFn fires. 0 = open on focus. */\n @property({ type: Number, attribute: \"min-search-length\" }) minSearchLength: number = 1;\n\n /** Optional cap on rendered suggestions (panel scrolls regardless). */\n @property({ type: Number, attribute: \"max-suggestions\" }) maxSuggestions: number = Infinity;\n\n /** Shows a trailing ✕ that clears the text and the committed value. */\n @property({ type: Boolean }) clearable: boolean = false;\n\n /** Externally-controlled loading state (internal searchFn loading is automatic). */\n @property({ type: Boolean }) loading: boolean = false;\n\n /** Row shown when a query yields nothing. */\n @property({ type: String, attribute: \"no-results-text\" }) noResultsText: string = \"No results found\";\n\n @property({ type: String, attribute: \"loading-text\" }) loadingText: string = \"Loading…\";\n\n // ── Field chrome passthroughs (forwarded to the inner rel-textfield) ──\n @property({ type: String }) label?: string;\n @property({ type: String }) placeholder: string = \"\";\n @property({ type: String }) size: TextFieldSize = \"medium\";\n @property({ type: String }) variant: TextFieldVariant = \"default\";\n /** See `FieldLabelStyle`. Left `undefined` the deprecated `floatingLabel` decides. */\n @property({ type: String, attribute: \"label-style\", reflect: true })\n labelStyle?: FieldLabelStyle;\n /** @deprecated Use `labelStyle=\"floating\"`. Kept permanently as an alias. */\n @property({ type: Boolean, attribute: \"floating-label\" }) floatingLabel = false;\n /** Accessible name for the input. Required when `labelStyle=\"none\"`. */\n @property({ type: String, attribute: \"field-aria-label\" }) fieldAriaLabel?: string;\n /** IDREF list of external element(s) naming the input. Wins over `fieldAriaLabel`. */\n @property({ type: String, attribute: \"field-aria-labelledby\" }) fieldAriaLabelledby?: string;\n @property({ type: String, attribute: \"prefix-icon\" }) prefixIcon?: string;\n @property({ type: Boolean }) disabled = false;\n @property({ type: Boolean }) readonly = false;\n @property({ type: Boolean }) required = false;\n @property({ type: Boolean }) error = false;\n @property({ type: String, attribute: \"error-message\" }) errorMessage?: string;\n @property({ type: String, attribute: \"helper-text\" }) helperText?: string;\n @property({ type: String }) name?: string;\n @property({ type: Boolean, attribute: \"full-width\" }) fullWidth = true;\n\n @state() private open = false;\n @state() private inputText = \"\";\n @state() private highlightedIndex = -1;\n @state() private panelStyle = \"\";\n @state() private searching = false;\n /** searchFn results; null = idle/local mode (use items). */\n @state() private remoteItems: AutocompleteItem[] | null = null;\n\n @query(\"rel-textfield\") private fieldEl!: RelTextfield;\n @query(\".ac-panel\") private panelEl!: HTMLDivElement;\n\n private uniqueId = `autocomplete-${Math.random().toString(36).slice(2)}`;\n private debounceTimer?: ReturnType<typeof setTimeout>;\n private searchSeq = 0;\n /** Set while a selection/clear updates `value` internally, so willUpdate\n * doesn't overwrite the input text the way it does for external writes. */\n private internalValueWrite = false;\n\n /** Name used for the suggestion panel — the visible label, or fieldAriaLabel\n * once labelStyle=\"none\" hides it. Mirrors rel-textfield's own resolution. */\n private get accessibleName() {\n return (this.labelStyle === \"none\" ? this.fieldAriaLabel : this.label) || \"\";\n }\n\n static styles = css`\n :host {\n color: var(--rel-text-default);\n display: block;\n font-family: var(--rel-fonts-font-family);\n width: 100%;\n }\n\n :host(:not([full-width])) {\n display: inline-block;\n width: auto;\n }\n\n /* ── Suggestion panel — mirrors rel-select's listbox so the two read as\n one family (same tokens, radius, shadow, row styling). ── */\n .ac-panel {\n position: fixed;\n z-index: 1001;\n display: none;\n box-sizing: border-box;\n background: var(--rel-autocomplete-bg, var(--rel-bg-neutral));\n border: 1px solid var(--rel-autocomplete-menu-border, var(--rel-border-default));\n border-radius: var(--rel-autocomplete-menu-radius, var(--rel-border-radius-sm));\n box-shadow: var(--rel-autocomplete-menu-shadow, var(--rel-shadows-shadow-300));\n max-height: 360px;\n overflow-y: auto;\n }\n\n .ac-panel[data-open] {\n display: block;\n }\n\n .ac-options {\n padding: 4px 0;\n }\n\n .ac-option {\n display: flex;\n align-items: center;\n gap: var(--rel-spacing-xs);\n padding: var(--rel-spacing-xs) 12px;\n color: var(--rel-autocomplete-value-color, var(--rel-text-default));\n cursor: pointer;\n font-family: var(--rel-body-md-regular-font-family);\n font-weight: var(--rel-body-md-regular-font-weight);\n font-size: var(--rel-body-md-regular-font-size);\n line-height: var(--rel-body-md-regular-line-height);\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\n }\n\n .ac-option:hover,\n .ac-option.highlighted {\n background: var(--rel-autocomplete-option-hover, var(--rel-bg-neutral-elevated-1));\n }\n\n .ac-option-icon {\n flex-shrink: 0;\n color: var(--rel-autocomplete-icon-color, var(--rel-text-default));\n }\n\n .ac-option-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .ac-option-label b {\n font-weight: var(--rel-body-md-medium-font-weight);\n }\n\n /* Status rows (loading / no results) — informational, not selectable */\n .ac-status {\n display: flex;\n align-items: center;\n gap: var(--rel-spacing-xs);\n padding: var(--rel-spacing-xs) 12px;\n color: var(--rel-autocomplete-status-color, var(--rel-text-body));\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 .ac-spinner {\n animation: ac-spin 0.9s linear infinite;\n }\n\n @keyframes ac-spin {\n to {\n transform: rotate(360deg);\n }\n }\n `;\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.removeGlobalListeners();\n clearTimeout(this.debounceTimer);\n }\n\n protected willUpdate(changed: PropertyValues<this>) {\n // External value writes (attribute, Angular writeValue) sync the visible\n // text to the matching item's label — or the raw value when unknown\n // (e.g. remote item not currently in the list).\n if (changed.has(\"value\") && !this.internalValueWrite) {\n const match = this.allItems.find((i) => i.value === this.value);\n this.inputText = match ? match.label : this.value ?? \"\";\n }\n this.internalValueWrite = false;\n }\n\n /** Full normalized source list (remote results while searchFn drives, else items). */\n private get allItems(): NormalizedItem[] {\n const source = this.searchFn && this.remoteItems !== null ? this.remoteItems : this.items;\n return source.map((item) => this.normalizeItem(item));\n }\n\n private normalizeItem(item: AutocompleteItem): NormalizedItem {\n if (typeof item === \"string\") return { value: item, label: item, icon: \"\", item };\n const rec = item;\n const rawLabel = rec[this.displayField] ?? rec[this.valueField];\n const label = rawLabel == null ? \"\" : String(rawLabel);\n const rawValue = rec[this.valueField];\n const value = rawValue == null ? label : String(rawValue);\n const icon = typeof rec[\"icon\"] === \"string\" ? (rec[\"icon\"] as string) : \"\";\n return { value, label, icon, item };\n }\n\n /** Suggestions for the current query — local filter only applies without searchFn. */\n private get filteredItems(): NormalizedItem[] {\n let list = this.allItems;\n if (!this.searchFn && this.filter !== \"none\" && this.inputText) {\n const q = this.inputText.toLowerCase();\n list = list.filter((i) =>\n this.filter === \"starts-with\"\n ? i.label.toLowerCase().startsWith(q)\n : i.label.toLowerCase().includes(q)\n );\n }\n return Number.isFinite(this.maxSuggestions) ? list.slice(0, this.maxSuggestions) : list;\n }\n\n private get isLoading(): boolean {\n return this.loading || this.searching;\n }\n\n private get queryLongEnough(): boolean {\n return this.inputText.length >= this.minSearchLength;\n }\n\n // ── Panel open/close + positioning (same proven mechanics as rel-select:\n // fixed panel, flip above when short on space, close on outside\n // pointerdown and on any outside scroll instead of re-anchoring) ──\n\n private addGlobalListeners() {\n document.addEventListener(\"pointerdown\", this.onOutsidePointerDown);\n window.addEventListener(\"resize\", this.updatePosition);\n window.addEventListener(\"scroll\", this.onPageScroll, true);\n }\n\n private removeGlobalListeners() {\n document.removeEventListener(\"pointerdown\", this.onOutsidePointerDown);\n window.removeEventListener(\"resize\", this.updatePosition);\n window.removeEventListener(\"scroll\", this.onPageScroll, true);\n }\n\n private onOutsidePointerDown = (e: PointerEvent) => {\n if (!this.open) return;\n if (e.composedPath().includes(this)) return;\n this.commitExactMatch();\n this.closePanel();\n };\n\n private onPageScroll = (e: Event) => {\n if (!this.open) return;\n if (e.composedPath()[0] === this.panelEl) return;\n this.closePanel();\n };\n\n private openPanel() {\n if (this.disabled || this.readonly || this.open) return;\n this.open = true;\n this.highlightedIndex = -1;\n this.addGlobalListeners();\n requestAnimationFrame(() => this.updatePosition());\n }\n\n private closePanel() {\n if (!this.open) return;\n this.open = false;\n this.highlightedIndex = -1;\n this.removeGlobalListeners();\n }\n\n private updatePosition = () => {\n if (!this.fieldEl || !this.panelEl) return;\n\n this.panelEl.setAttribute(\"data-open\", \"\");\n\n const t = this.fieldEl.getBoundingClientRect();\n const c = this.panelEl.getBoundingClientRect();\n\n let top = t.bottom + 4;\n if (top + c.height > window.innerHeight - 8) {\n top = Math.max(8, t.top - c.height - 4);\n }\n\n let left = t.left;\n if (left + t.width > window.innerWidth - 8) {\n left = Math.max(8, window.innerWidth - t.width - 8);\n }\n\n this.panelStyle = `top:${top}px;left:${left}px;width:${t.width}px;`;\n };\n\n /** Re-evaluates whether the panel should be showing for the current state. */\n private syncPanel() {\n const shouldShow =\n this.queryLongEnough && (this.isLoading || this.filteredItems.length > 0 || !!this.inputText || this.minSearchLength === 0);\n if (shouldShow) {\n if (!this.open) this.openPanel();\n else requestAnimationFrame(() => this.updatePosition());\n } else {\n this.closePanel();\n }\n }\n\n // ── Data flow ──\n\n private onFieldInput(e: CustomEvent<string>) {\n e.stopPropagation();\n this.inputText = e.detail;\n this.highlightedIndex = -1;\n\n // Re-emit as our own rel-change so consumers listen on <rel-autocomplete>\n // (the inner textfield's event is stopped above).\n this.dispatchEvent(\n new CustomEvent<string>(\"rel-change\", { detail: this.inputText, bubbles: true, composed: true })\n );\n\n if (this.searchFn) {\n clearTimeout(this.debounceTimer);\n if (!this.queryLongEnough) {\n this.searchSeq++; // invalidate any in-flight query\n this.searching = false;\n this.remoteItems = null;\n this.closePanel();\n return;\n }\n this.searching = true;\n this.syncPanel();\n this.debounceTimer = setTimeout(() => this.runSearch(this.inputText), this.debounceMs);\n } else {\n this.syncPanel();\n }\n }\n\n private async runSearch(query: string) {\n const seq = ++this.searchSeq;\n try {\n const results = await this.searchFn!(query);\n if (seq !== this.searchSeq) return; // stale — a newer query superseded this one\n this.remoteItems = results ?? [];\n } catch (err) {\n if (seq !== this.searchSeq) return;\n this.remoteItems = [];\n this.dispatchEvent(\n new CustomEvent(\"rel-search-error\", { detail: { query, error: err }, bubbles: true, composed: true })\n );\n } finally {\n if (seq === this.searchSeq) {\n this.searching = false;\n this.syncPanel();\n }\n }\n }\n\n private selectItem(item: NormalizedItem) {\n this.internalValueWrite = true;\n this.value = item.value;\n this.inputText = item.label;\n this.closePanel();\n this.emitChanged(item);\n }\n\n /** Silent commit when typed text exactly matches an item (label or value, case-insensitive). */\n private commitExactMatch() {\n if (!this.inputText) return;\n const q = this.inputText.toLowerCase();\n const match = this.allItems.find(\n (i) => i.label.toLowerCase() === q || i.value.toLowerCase() === q\n );\n if (match && match.value !== this.value) {\n this.internalValueWrite = true;\n this.value = match.value;\n this.inputText = match.label;\n this.emitChanged(match);\n }\n }\n\n private emitChanged(item: NormalizedItem | null) {\n this.dispatchEvent(\n new CustomEvent(\"changed\", {\n detail: { value: this.value, item: item ? item.item : null },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private clear() {\n if (this.disabled || this.readonly) return;\n const hadValue = !!this.value || !!this.inputText;\n this.internalValueWrite = true;\n this.value = \"\";\n this.inputText = \"\";\n this.searchSeq++;\n this.searching = false;\n this.remoteItems = null;\n this.closePanel();\n if (hadValue) {\n this.dispatchEvent(new CustomEvent(\"rel-clear\", { bubbles: true, composed: true }));\n this.emitChanged(null);\n this.dispatchEvent(\n new CustomEvent<string>(\"rel-change\", { detail: \"\", bubbles: true, composed: true })\n );\n }\n this.fieldEl?.focus();\n }\n\n // ── Keyboard / focus ──\n\n private onKeyDown(e: KeyboardEvent) {\n if (this.disabled || this.readonly) return;\n const filtered = this.filteredItems;\n\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n if (!this.open) {\n if (this.queryLongEnough) this.openPanel();\n return;\n }\n this.highlightedIndex = Math.min(filtered.length - 1, this.highlightedIndex + 1);\n break;\n case \"ArrowUp\":\n e.preventDefault();\n if (!this.open) return;\n this.highlightedIndex = Math.max(0, this.highlightedIndex - 1);\n break;\n case \"Enter\":\n if (this.open && this.highlightedIndex >= 0 && filtered[this.highlightedIndex]) {\n e.preventDefault();\n this.selectItem(filtered[this.highlightedIndex]);\n } else {\n // Free text stays free text — but an exact match commits.\n this.commitExactMatch();\n this.closePanel();\n }\n break;\n case \"Escape\":\n if (this.open) {\n e.preventDefault();\n this.closePanel();\n }\n break;\n case \"Tab\":\n this.commitExactMatch();\n this.closePanel();\n break;\n }\n }\n\n private onFocusIn() {\n if (this.disabled || this.readonly) return;\n if (this.queryLongEnough && (this.filteredItems.length > 0 || this.minSearchLength === 0)) {\n this.openPanel();\n }\n }\n\n private onFocusOut(e: FocusEvent) {\n const next = e.relatedTarget as Node | null;\n if (next && (this.contains(next) || this.renderRoot.contains(next))) return;\n // Focus genuinely left the component (outside pointerdown handles the\n // click-away case before blur; this covers programmatic focus moves).\n this.commitExactMatch();\n this.closePanel();\n }\n\n /** Delegates focus to the inner textfield. */\n focus() {\n this.fieldEl?.focus();\n }\n\n /** Bolds the first occurrence of the query inside a suggestion label. */\n private renderLabel(label: string): TemplateResult | string {\n const q = this.inputText;\n if (!q) return label;\n const idx = label.toLowerCase().indexOf(q.toLowerCase());\n if (idx < 0) return label;\n return html`${label.slice(0, idx)}<b>${label.slice(idx, idx + q.length)}</b>${label.slice(idx + q.length)}`;\n }\n\n render() {\n const filtered = this.filteredItems;\n const panelId = `${this.uniqueId}-panel`;\n const activeOptionId =\n this.open && this.highlightedIndex >= 0 ? `${this.uniqueId}-option-${this.highlightedIndex}` : \"\";\n const showClear = this.clearable && !!this.inputText && !this.disabled && !this.readonly;\n const showNoResults = !this.isLoading && filtered.length === 0 && this.queryLongEnough && !!this.inputText;\n\n // ARIA note: the real <input> lives in rel-textfield's shadow root, which\n // aria-activedescendant can't reach across. The combobox role therefore\n // sits on this wrapper (containing the field) in the same tree as the\n // panel — the pragmatic pattern for nested shadow roots.\n return html`\n <div\n class=\"ac-field\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-expanded=\"${this.open}\"\n aria-controls=\"${panelId}\"\n aria-activedescendant=\"${activeOptionId}\"\n @keydown=\"${this.onKeyDown}\"\n @focusin=\"${this.onFocusIn}\"\n @focusout=\"${this.onFocusOut}\"\n >\n <rel-textfield\n exportparts=\"label, control, input, helper, right-icon\"\n .label=\"${this.label}\"\n .placeholder=\"${this.placeholder}\"\n .value=\"${this.inputText}\"\n .size=\"${this.size}\"\n .variant=\"${this.variant}\"\n .labelStyle=\"${this.labelStyle}\"\n .floatingLabel=\"${this.floatingLabel}\"\n .fieldAriaLabel=\"${this.fieldAriaLabel}\"\n .fieldAriaLabelledby=\"${this.fieldAriaLabelledby}\"\n .prefixIcon=\"${this.prefixIcon}\"\n .disabled=\"${this.disabled}\"\n .readonly=\"${this.readonly}\"\n .required=\"${this.required}\"\n .error=\"${this.error}\"\n .errorMessage=\"${this.errorMessage}\"\n .helperText=\"${this.helperText}\"\n .name=\"${this.name}\"\n .rightIcon=\"${showClear ? \"close\" : undefined}\"\n .clickableRightIcon=\"${showClear}\"\n right-icon-aria-label=\"Clear\"\n @rel-change=\"${this.onFieldInput}\"\n @rel-right-icon-click=\"${this.clear}\"\n ></rel-textfield>\n </div>\n\n <div\n id=\"${panelId}\"\n part=\"panel list\"\n class=\"ac-panel\"\n role=\"listbox\"\n aria-label=\"${this.accessibleName || \"Suggestions\"}\"\n style=\"${this.panelStyle}\"\n ?data-open=\"${this.open}\"\n >\n ${this.isLoading\n ? html`<div class=\"ac-status\" role=\"status\">\n <rel-icon name=\"status-loading\" size=\"sm\" class=\"ac-spinner\"></rel-icon>\n <span>${this.loadingText}</span>\n </div>`\n : nothing}\n ${showNoResults\n ? html`<div class=\"ac-status\">${this.noResultsText}</div>`\n : nothing}\n ${filtered.length > 0\n ? html`<div class=\"ac-options\">\n ${repeat(\n filtered,\n (item) => item.value,\n (item, index) => html`\n <div\n id=\"${this.uniqueId}-option-${index}\"\n part=\"option\"\n class=\"ac-option ${index === this.highlightedIndex ? \"highlighted\" : \"\"}\"\n role=\"option\"\n aria-selected=\"${item.value === this.value}\"\n @mousedown=\"${(e: Event) => e.preventDefault()}\"\n @click=\"${() => this.selectItem(item)}\"\n @pointerenter=\"${() => (this.highlightedIndex = index)}\"\n >\n ${item.icon\n ? html`<rel-icon name=\"${item.icon}\" size=\"sm\" class=\"ac-option-icon\"></rel-icon>`\n : nothing}\n <span class=\"ac-option-label\">${this.renderLabel(item.label)}</span>\n </div>\n `\n )}\n </div>`\n : nothing}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"rel-autocomplete\": RelAutocomplete;\n }\n}\n","import { LitElement, html, css, nothing, PropertyValues } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport \"@reliability-design/icons/rel-icon\";\n\nexport type TextFieldState = \"default\" | \"error\" | \"disabled\";\nexport type TextFieldSize = \"small\" | \"medium\" | \"large\";\nexport type TextFieldVariant = \"default\" | \"underline\" | \"legend\";\n\n/**\n * How a field presents its label. Shared by `<rel-textfield>`, `<rel-select>`\n * and `<rel-autocomplete>` so the three stay in step.\n * - `\"default\"` — static label above the control\n * - `\"floating\"` — label rests over the placeholder, animates onto the border\n * - `\"none\"` — no label renders; supply `fieldAriaLabel` /\n * `fieldAriaLabelledby` to keep an accessible name\n */\nexport type FieldLabelStyle = \"default\" | \"floating\" | \"none\";\n\n@customElement(\"rel-textfield\")\nexport class RelTextfield extends LitElement {\n @property({ type: String }) label?: string;\n @property({ type: String }) placeholder: string = \"\";\n @property({ type: String }) type: string = \"text\";\n @property({ type: String }) value: string = \"\";\n @property({ type: String }) leftIcon?: string;\n @property({ type: String }) rightIcon?: string;\n /** Makes the trailing icon interactive (pointer + focusable) and emits\n * `rel-right-icon-click` — e.g. a password show/hide toggle or clear button. */\n @property({ type: Boolean, attribute: \"clickable-right-icon\" }) clickableRightIcon = false;\n /** Accessible label for the trailing icon when it is clickable. */\n @property({ type: String, attribute: \"right-icon-aria-label\" }) rightIconAriaLabel?: string;\n @property({ type: String }) supportingText?: string;\n @property({ type: String }) state: TextFieldState = \"default\";\n @property({ type: String }) size: TextFieldSize = \"medium\";\n /**\n * Label presentation. Left `undefined` the deprecated `floatingLabel` boolean\n * decides, so existing markup keeps working; set explicitly and it wins.\n * Declares `attribute` because Lit would otherwise only listen for the\n * all-lowercase `labelstyle`.\n */\n @property({ type: String, attribute: \"label-style\", reflect: true })\n labelStyle?: FieldLabelStyle;\n /** @deprecated Use `labelStyle=\"floating\"`. Kept permanently as an alias. */\n @property({ type: Boolean, reflect: true }) floatingLabel = false;\n /**\n * Accessible name for the input. Required when `labelStyle=\"none\"`, since no\n * `<label>` renders and a placeholder is not a valid naming mechanism.\n */\n @property({ type: String, attribute: \"field-aria-label\" }) fieldAriaLabel?: string;\n /** IDREF list of external element(s) naming the input. Wins over `fieldAriaLabel`. */\n @property({ type: String, attribute: \"field-aria-labelledby\" }) fieldAriaLabelledby?: string;\n @property({ type: String, reflect: true }) variant: TextFieldVariant = \"default\";\n @property({ type: Boolean }) disabled = false;\n @property({ type: Boolean }) required = false;\n @property({ type: Boolean, reflect: true }) multiline = false;\n @property({ type: Number }) rows = 3;\n\n // ── Standardized input API (senior-team spec) ──────────────────────────────\n // Prefer these over the deprecated aliases: prefixIcon (was leftIcon),\n // helperText (was supportingText), error (was state=\"error\").\n @property({ type: String }) prefixIcon?: string;\n @property({ type: String }) prefixIconAriaLabel?: string;\n @property({ type: Boolean }) error = false;\n @property({ type: String }) errorMessage?: string;\n @property({ type: String }) helperText?: string;\n @property({ type: Boolean }) readonly = false;\n @property({ type: Number }) maxLength?: number;\n @property({ type: String }) name?: string;\n @property({ type: Boolean, reflect: true }) fullWidth = true;\n\n @state() private internalState: \"default\" | \"focused\" = \"default\";\n private _wasError = false;\n\n private uniqueId = `textfield-${Math.random().toString(36).slice(2)}`;\n\n private get isDisabled() {\n return this.disabled || this.state === \"disabled\";\n }\n\n private get isError() {\n return this.error || this.state === \"error\";\n }\n\n // prefixIcon supersedes the deprecated leftIcon\n private get leadingIcon() {\n return this.prefixIcon ?? this.leftIcon;\n }\n\n // helperText supersedes the deprecated supportingText\n private get helper() {\n return this.helperText ?? this.supportingText;\n }\n\n /** labelStyle supersedes the deprecated floatingLabel boolean. */\n private get resolvedLabelStyle(): FieldLabelStyle {\n if (this.labelStyle) return this.labelStyle;\n return this.floatingLabel ? \"floating\" : \"default\";\n }\n\n /** True when no visible label renders and the input needs an ARIA name. */\n private get labelHidden() {\n return this.resolvedLabelStyle === \"none\";\n }\n\n static styles = css`\n :host {\n color: var(--rel-text-default);\n display: block;\n font-family: var(--rel-fonts-font-family);\n }\n\n /* Wrapper */\n .textfield-wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--rel-spacing-2xs);\n width: 100%;\n }\n\n /* Label */\n .textfield-label {\n color: var(--rel-text-label);\n\n font-family: var(--rel-body-sm-medium-font-family);\n\n font-weight: var(--rel-body-sm-medium-font-weight);\n\n font-size: var(--rel-body-sm-medium-font-size);\n\n line-height: var(--rel-body-sm-medium-line-height);\n\n letter-spacing: var(--rel-body-sm-medium-letter-spacing);\n\n }\n\n .required-mark {\n color: var(--rel-text-danger);\n margin-left: 2px;\n }\n\n /* ── labelStyle=\"none\" ──\n No label renders. An empty spacer holds the label row's full height so the\n input box still bottom-aligns with labelled siblings in a form row.\n The reserve covers label line-height + the wrapper gap, and the negative\n margin cancels the flex gap that would otherwise sit below it — so\n --rel-field-label-reserve: 0 collapses the row to genuinely zero\n (toolbars, table cells), not just to the leftover gap. */\n .label-reserve {\n flex: none;\n height: var(\n --rel-field-label-reserve,\n calc(var(--rel-body-sm-medium-line-height) + var(--rel-spacing-2xs))\n );\n margin-bottom: calc(-1 * var(--rel-spacing-2xs));\n }\n\n /* Floating label variant */\n :host([floatinglabel]) .textfield-wrapper {\n gap: 0;\n }\n\n :host([floatinglabel]) .textfield-container {\n overflow: visible;\n position: relative;\n padding-top: 0;\n }\n\n :host([floatinglabel]) .textfield-label {\n position: absolute;\n left: var(--rel-spacing-sm);\n top: 50%;\n transform: translateY(-50%);\n color: var(--rel-text-placeholder);\n pointer-events: none;\n transition: top 0.15s ease, font-size 0.15s ease, color 0.15s ease, transform 0.15s ease;\n background: var(--rel-bg-neutral);\n padding: 0 2px;\n z-index: 1;\n white-space: nowrap;\n font-family: var(--rel-body-md-regular-font-family);\n font-weight: var(--rel-body-md-regular-font-weight);\n font-size: var(--rel-body-md-regular-font-size);\n line-height: var(--rel-body-md-regular-line-height);\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\n }\n\n /* Floating label in multiline mode anchors to top instead of vertical center */\n :host([floatinglabel][multiline]) .textfield-label {\n top: var(--rel-spacing-sm);\n transform: none;\n }\n\n :host([floatinglabel]) .textfield-wrapper.focused .textfield-label,\n :host([floatinglabel]) .textfield-wrapper.has-value .textfield-label {\n top: 0;\n transform: translateY(-50%);\n color: var(--rel-text-default);\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 :host([floatinglabel]) .textfield-wrapper.error .textfield-label {\n color: var(--rel-text-danger);\n }\n\n :host([floatinglabel]) .textfield-wrapper.focused:not(.error) .textfield-label {\n color: var(--rel-text-default);\n }\n\n :host([floatinglabel]) .textfield-wrapper.focused.error .textfield-label,\n :host([floatinglabel]) .textfield-wrapper.has-value.error .textfield-label {\n top: 0;\n transform: translateY(-50%);\n color: var(--rel-text-danger);\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 :host([floatinglabel]) .textfield-input {\n padding-top: var(--rel-spacing-sm);\n padding-bottom: var(--rel-spacing-sm);\n }\n\n :host([floatinglabel]) .textfield-input.has-left-icon {\n padding-left: var(--rel-spacing-2xl);\n }\n\n :host([floatinglabel]) .textfield-label.has-left-icon {\n left: var(--rel-spacing-2xl);\n }\n\n :host([floatinglabel]) .textfield-wrapper.focused .textfield-label.has-left-icon,\n :host([floatinglabel]) .textfield-wrapper.has-value .textfield-label.has-left-icon {\n left: var(--rel-spacing-sm);\n }\n\n :host([floatinglabel]) .textfield-wrapper.disabled .textfield-label {\n background: var(--rel-bg-neutral-elevated-1);\n }\n\n /* Container */\n .textfield-container {\n display: flex;\n align-items: center;\n position: relative;\n border: 1px solid var(--rel-border-default);\n border-radius: var(--rel-border-radius-xs);\n background: var(--rel-bg-neutral);\n overflow: hidden;\n transition: border 0.2s;\n }\n\n .textfield-container.disabled {\n background: var(--rel-bg-neutral-elevated-1);\n cursor: not-allowed;\n }\n\n .textfield-container.multiline {\n overflow: visible;\n align-items: flex-start;\n }\n\n /* Input */\n .textfield-input {\n flex: 1;\n border: none;\n outline: none;\n padding: var(--rel-spacing-xs) var(--rel-spacing-sm);\n background: transparent;\n color: var(--rel-text-body);\n font-family: var(--rel-body-md-regular-font-family);\n font-weight: var(--rel-body-md-regular-font-weight);\n font-size: var(--rel-body-md-regular-font-size);\n line-height: var(--rel-body-md-regular-line-height);\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\n }\n\n .textfield-input:disabled {\n cursor: not-allowed;\n color: var(--rel-text-disabled);\n }\n\n /* Textarea */\n textarea.textfield-input {\n resize: vertical;\n min-height: 80px;\n width: 100%;\n box-sizing: border-box;\n }\n\n textarea.textfield-input::-webkit-scrollbar {\n width: 4px;\n }\n textarea.textfield-input::-webkit-scrollbar-track {\n background: transparent;\n }\n textarea.textfield-input::-webkit-scrollbar-thumb {\n background: var(--rel-text-placeholder);\n border-radius: 2px;\n }\n\n .icon {\n position: absolute;\n display: flex;\n pointer-events: none;\n color: var(--rel-text-placeholder);\n }\n\n .icon.left {\n left: 8px;\n }\n\n .icon.right {\n right: 8px;\n }\n\n /* Interactive trailing icon (e.g. password show/hide) */\n .icon.right.clickable {\n pointer-events: auto;\n cursor: pointer;\n border-radius: var(--rel-border-radius-xs, 4px);\n }\n .icon.right.clickable:hover {\n color: var(--rel-text-body);\n }\n .icon.right.clickable:focus-visible {\n outline: 2px solid var(--rel-border-focus);\n outline-offset: 2px;\n }\n\n .textfield-wrapper.small .textfield-support {\n font-weight: var(--rel-body-xs-medium-font-weight);\n }\n\n .textfield-wrapper.small .textfield-input {\n padding: var(--rel-spacing-xs) var(--rel-spacing-sm);\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 .textfield-wrapper.medium .textfield-input {\n padding: var(--rel-spacing-sm) var(--rel-spacing-md);\n font-family: var(--rel-body-md-regular-font-family);\n font-weight: var(--rel-body-md-regular-font-weight);\n font-size: var(--rel-body-md-regular-font-size);\n line-height: var(--rel-body-md-regular-line-height);\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\n }\n\n .textfield-wrapper.large .textfield-input {\n padding: var(--rel-spacing-md) var(--rel-spacing-md);\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 /* Adjust padding when icons are present */\n .textfield-wrapper .textfield-input.has-left-icon {\n padding-left: var(--rel-spacing-2xl);\n }\n\n .textfield-wrapper .textfield-input.has-right-icon {\n padding-right: var(--rel-spacing-2xl);\n }\n\n /* States */\n /* Hover (Figma State=Hover): border-strong at 1px — no focus ring */\n .textfield-wrapper:not(.focused):not(.error):not(.disabled) .textfield-container:hover {\n border-color: var(--rel-border-strong);\n }\n\n .textfield-wrapper.focused .textfield-container {\n border-color: var(--rel-text-default);\n }\n\n .textfield-input:focus-visible {\n outline: none;\n }\n\n .textfield-wrapper.focused .textfield-container,\n .textfield-container:focus-within {\n border-color: var(--rel-border-strong);\n box-shadow: 0 0 0 1px var(--rel-border-strong);\n }\n\n .textfield-wrapper.error .textfield-container,\n .textfield-wrapper.error .textfield-container:focus-within {\n border-color: var(--rel-border-danger);\n box-shadow: none;\n }\n\n .textfield-wrapper.disabled .textfield-container {\n border-color: var(--rel-border-default);\n }\n\n .textfield-wrapper.disabled .textfield-label {\n color: var(--rel-text-disabled);\n }\n\n /* Supporting text */\n .textfield-support {\n color: var(--rel-text-caption);\n\n font-family: var(--rel-body-xs-regular-font-family);\n\n font-weight: var(--rel-body-xs-regular-font-weight);\n\n font-size: var(--rel-body-xs-regular-font-size);\n\n line-height: var(--rel-body-xs-regular-line-height);\n\n letter-spacing: var(--rel-body-xs-regular-letter-spacing);\n\n }\n\n .textfield-support.error {\n color: var(--rel-text-danger);\n }\n\n /* Placeholder */\n .textfield-input::placeholder {\n color: var(--rel-text-placeholder);\n }\n\n :host([floatinglabel]) .textfield-input::placeholder {\n opacity: 0;\n }\n\n :host([floatinglabel]) .textfield-wrapper.focused .textfield-input::placeholder {\n opacity: 1;\n }\n\n /* Suppress Chrome autofill blue background */\n .textfield-input:-webkit-autofill,\n .textfield-input:-webkit-autofill:hover,\n .textfield-input:-webkit-autofill:focus {\n -webkit-box-shadow: 0 0 0px 1000px var(--rel-bg-surface) inset;\n -webkit-text-fill-color: var(--rel-text-default);\n }\n\n /* ── Underline variant ── */\n :host([variant=\"underline\"]) .textfield-container {\n border: none;\n border-bottom: 2px solid var(--rel-border-default);\n border-radius: 0;\n background: var(--rel-bg-neutral-elevated-1);\n box-shadow: none;\n overflow: visible;\n }\n\n :host([variant=\"underline\"]) .textfield-wrapper:not(.focused):not(.error):not(.disabled) .textfield-container:hover {\n border-bottom-color: var(--rel-border-strong);\n }\n\n :host([variant=\"underline\"]) .textfield-wrapper.focused .textfield-container,\n :host([variant=\"underline\"]) .textfield-container:focus-within {\n border-bottom: 2px solid var(--rel-text-default);\n box-shadow: none;\n }\n\n :host([variant=\"underline\"]) .textfield-wrapper.error .textfield-container {\n border-bottom: 2px solid var(--rel-border-danger);\n box-shadow: none;\n }\n\n :host([variant=\"underline\"]) .textfield-wrapper.disabled .textfield-container {\n border-bottom: 2px solid var(--rel-border-default);\n background: var(--rel-bg-neutral-elevated-1);\n }\n\n /* Remove border radius on input for underline variant */\n :host([variant=\"underline\"]) .textfield-input {\n background: transparent;\n }\n\n /* Dark mode — underline variant uses same border colors as default */\n :host-context([data-theme=\"dark\"]) :host([variant=\"underline\"]) .textfield-container,\n :host-context(.dark) :host([variant=\"underline\"]) .textfield-container {\n background: var(--rel-bg-neutral-elevated-1);\n border-bottom-color: var(--rel-border-default);\n }\n\n /* ── Full-width control (fullWidth defaults true → block, fills parent) ── */\n :host(:not([fullwidth])) {\n display: inline-block;\n width: auto;\n }\n :host(:not([fullwidth])) .textfield-wrapper {\n width: auto;\n }\n\n /* ── Legend (notched-outline) variant ──\n Native <fieldset>/<legend>: the legend notches the top border and stays\n fixed in place across all states (no float/animation). */\n :host([variant=\"legend\"]) .field-fieldset {\n position: relative;\n margin: 0;\n min-inline-size: 0;\n padding: 0;\n border: 1px solid var(--rel-border-default);\n border-radius: var(--rel-border-radius-xs);\n background: var(--rel-bg-neutral);\n transition: border-color 0.2s;\n }\n\n :host([variant=\"legend\"]) .field-legend {\n margin-left: var(--rel-spacing-sm);\n padding: 0 var(--rel-spacing-2xs);\n color: var(--rel-text-label);\n font-family: var(--rel-body-sm-medium-font-family);\n font-weight: var(--rel-body-sm-medium-font-weight);\n font-size: var(--rel-body-sm-medium-font-size);\n line-height: var(--rel-body-sm-medium-line-height);\n letter-spacing: var(--rel-body-sm-medium-letter-spacing);\n }\n\n :host([variant=\"legend\"]) .textfield-input {\n width: 100%;\n box-sizing: border-box;\n }\n\n /* labelStyle=\"none\" + legend: nothing to seat in the notch, so drop the\n legend entirely and let the top border run continuous. */\n :host([label-style=\"none\"][variant=\"legend\"]) .field-legend {\n display: none;\n }\n\n /* Prefix icon (legend): vertically centered; input inset via has-left-icon */\n :host([variant=\"legend\"]) .icon.left {\n top: 50%;\n left: var(--rel-spacing-sm);\n transform: translateY(-50%);\n }\n :host([variant=\"legend\"]) .field-fieldset.multiline .icon.left {\n top: var(--rel-spacing-sm);\n transform: none;\n }\n\n /* Hover */\n :host([variant=\"legend\"]) .field-fieldset:hover {\n border-color: var(--rel-border-accent);\n border-color: var(--rel-text-placeholder);\n }\n\n /* Focus — border-color only. A box-shadow/outline ring hugs the full\n rectangular border-box and would draw across the notch, appearing to\n strike through the legend. The legend also recolors on focus (below). */\n :host([variant=\"legend\"]) .textfield-wrapper.focused .field-fieldset,\n :host([variant=\"legend\"]) .field-fieldset:focus-within {\n border-color: var(--rel-border-focus);\n box-shadow: none;\n }\n :host([variant=\"legend\"]) .textfield-wrapper.focused .field-legend,\n :host([variant=\"legend\"]) .field-fieldset:focus-within .field-legend {\n color: var(--rel-border-focus);\n }\n\n /* Error */\n :host([variant=\"legend\"]) .textfield-wrapper.error .field-fieldset {\n border-color: var(--rel-border-danger);\n box-shadow: none;\n }\n :host([variant=\"legend\"]) .textfield-wrapper.error .field-legend {\n color: var(--rel-text-danger);\n }\n\n /* Disabled */\n :host([variant=\"legend\"]) .textfield-wrapper.disabled .field-fieldset {\n background: var(--rel-bg-neutral-elevated-1);\n border-color: var(--rel-border-default);\n cursor: not-allowed;\n }\n :host([variant=\"legend\"]) .textfield-wrapper.disabled .field-legend {\n color: var(--rel-text-disabled);\n }\n\n /* Readonly */\n :host([variant=\"legend\"]) .textfield-wrapper.readonly .field-fieldset {\n cursor: default;\n }\n\n /* Legend font tracks size */\n :host([variant=\"legend\"]) .textfield-wrapper.small .field-legend {\n\n font-family: var(--rel-body-xs-regular-font-family);\n\n font-weight: var(--rel-body-xs-regular-font-weight);\n\n font-size: var(--rel-body-xs-regular-font-size);\n\n line-height: var(--rel-body-xs-regular-line-height);\n\n letter-spacing: var(--rel-body-xs-regular-letter-spacing);\n\n }\n :host([variant=\"legend\"]) .textfield-wrapper.large .field-legend {\n\n font-family: var(--rel-body-md-regular-font-family);\n\n font-weight: var(--rel-body-md-regular-font-weight);\n\n font-size: var(--rel-body-md-regular-font-size);\n\n line-height: var(--rel-body-md-regular-line-height);\n\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\n\n }\n `;\n\n connectedCallback() {\n super.connectedCallback();\n const leftIcon = this.getAttribute('lefticon') || this.getAttribute('leftIcon');\n if (leftIcon) this.leftIcon = leftIcon;\n const rightIcon = this.getAttribute('righticon') || this.getAttribute('rightIcon');\n if (rightIcon) this.rightIcon = rightIcon;\n }\n\n willUpdate(changed: PropertyValues<this>) {\n // Keep the deprecated boolean an accurate mirror of labelStyle. This is what\n // lets every `:host([floatinglabel])` rule below stay untouched — the\n // reflected attribute is still the single styling hook for the floating form.\n if (changed.has(\"labelStyle\") && this.labelStyle) {\n this.floatingLabel = this.labelStyle === \"floating\";\n }\n }\n\n private _warnedNoName = false;\n\n updated() {\n if (this._warnedNoName || !this.labelHidden) return;\n if (this.fieldAriaLabel || this.fieldAriaLabelledby || this.getAttribute(\"aria-label\")) return;\n this._warnedNoName = true;\n console.warn(\n '<rel-textfield label-style=\"none\"> has no accessible name. Set ' +\n \"`field-aria-label` or `field-aria-labelledby` — a placeholder is not a \" +\n \"valid naming mechanism.\",\n this\n );\n }\n\n /** Focuses the inner input/textarea (the host itself is not focusable). */\n focus(options?: FocusOptions) {\n (this.renderRoot.querySelector(\"input, textarea\") as HTMLElement | null)?.focus(options);\n }\n\n private handleFocus() {\n if (!this.isDisabled) {\n this.internalState = \"focused\";\n }\n }\n\n private handleBlur() {\n if (this.internalState === \"focused\") {\n this.internalState = \"default\";\n }\n }\n\n private handleRightIconClick(e: Event) {\n if (!this.clickableRightIcon) return;\n e.stopPropagation();\n this.dispatchEvent(\n new CustomEvent(\"rel-right-icon-click\", { bubbles: true, composed: true })\n );\n }\n\n private handleRightIconKeydown(e: KeyboardEvent) {\n if (!this.clickableRightIcon) return;\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n this.handleRightIconClick(e);\n }\n }\n\n private handleInput(e: Event) {\n const input = e.target as HTMLInputElement;\n this.value = input.value;\n if (this.state === \"error\" && this.value) {\n this._wasError = true;\n this.state = \"default\";\n } else if (this._wasError && !this.value) {\n this._wasError = false;\n this.state = \"error\";\n }\n this.dispatchEvent(\n new CustomEvent<string>(\"rel-change\", {\n detail: this.value,\n bubbles: true,\n composed: true,\n })\n );\n }\n\n render() {\n const isError = this.isError;\n const stateClass = this.isDisabled ? \"disabled\" : isError ? \"error\" : \"default\";\n const leadingIcon = this.leadingIcon;\n const inputId = this.id || this.uniqueId;\n const legendId = `${inputId}-legend`;\n\n // errorMessage replaces the helper only when in error AND explicitly set;\n // otherwise the (deprecated) supportingText/helperText shows as before.\n const belowText = isError && this.errorMessage ? this.errorMessage : this.helper;\n const describedById = belowText ? `${inputId}-desc` : undefined;\n\n const wrapperClasses = [\n \"textfield-wrapper\",\n this.size,\n stateClass,\n this.readonly ? \"readonly\" : \"\",\n this.internalState === \"focused\" ? \"focused\" : \"\",\n this.value ? \"has-value\" : \"\",\n ].filter(Boolean).join(\" \");\n\n const inputClasses = [\n \"textfield-input\",\n !this.multiline && leadingIcon ? \"has-left-icon\" : \"\",\n !this.multiline && this.rightIcon && this.variant !== \"legend\" ? \"has-right-icon\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const labelStyle = this.resolvedLabelStyle;\n const labelHidden = labelStyle === \"none\";\n\n const labelTemplate = (extraClass = \"\") => {\n if (!this.label || labelHidden) return \"\";\n return html`<label\n part=\"label\"\n class=\"textfield-label${extraClass}\"\n for=\"${inputId}\"\n >${this.label}${this.required ? html`<span class=\"required-mark\" aria-hidden=\"true\">*</span>` : \"\"}</label>`;\n };\n\n // With no visible label the <label for> / <legend> naming path is gone, so\n // fieldAriaLabelledby → fieldAriaLabel take over. An explicit labelledby\n // always wins; aria-label only fills in when nothing else names the input.\n const legendLabelledby =\n this.variant === \"legend\" && this.label && !labelHidden ? legendId : undefined;\n const ariaLabelledby = this.fieldAriaLabelledby ?? legendLabelledby;\n const hasVisibleLabel = !labelHidden && !!this.label;\n const ariaLabel = !hasVisibleLabel && !ariaLabelledby ? this.fieldAriaLabel : undefined;\n\n const inputTemplate = this.multiline\n ? html`<textarea part=\"input\"\n id=\"${inputId}\"\n class=\"${inputClasses}\"\n placeholder=\"${this.placeholder}\"\n .value=\"${this.value}\"\n rows=\"${this.rows}\"\n name=\"${this.name ?? nothing}\"\n maxlength=\"${this.maxLength ?? nothing}\"\n ?disabled=\"${this.isDisabled}\"\n ?readonly=\"${this.readonly}\"\n ?required=\"${this.required}\"\n aria-invalid=\"${isError}\"\n aria-required=\"${this.required}\"\n aria-label=\"${ariaLabel ?? nothing}\"\n aria-labelledby=\"${ariaLabelledby ?? nothing}\"\n aria-describedby=\"${describedById ?? nothing}\"\n @focus=\"${this.handleFocus}\"\n @blur=\"${this.handleBlur}\"\n @input=\"${this.handleInput}\"\n ></textarea>`\n : html`<input part=\"input\"\n type=\"${this.type}\"\n id=\"${inputId}\"\n class=\"${inputClasses}\"\n placeholder=\"${this.placeholder}\"\n .value=\"${this.value}\"\n name=\"${this.name ?? nothing}\"\n maxlength=\"${this.maxLength ?? nothing}\"\n ?disabled=\"${this.isDisabled}\"\n ?readonly=\"${this.readonly}\"\n ?required=\"${this.required}\"\n aria-invalid=\"${isError}\"\n aria-required=\"${this.required}\"\n aria-label=\"${ariaLabel ?? nothing}\"\n aria-labelledby=\"${ariaLabelledby ?? nothing}\"\n aria-describedby=\"${describedById ?? nothing}\"\n @focus=\"${this.handleFocus}\"\n @blur=\"${this.handleBlur}\"\n @input=\"${this.handleInput}\"\n />`;\n\n const leadingIconTemplate = leadingIcon\n ? html`<rel-icon\n name=\"${leadingIcon}\"\n size=\"sm\"\n class=\"icon left\"\n role=\"${this.prefixIconAriaLabel ? \"img\" : nothing}\"\n aria-label=\"${this.prefixIconAriaLabel ?? nothing}\"\n aria-hidden=\"${this.prefixIconAriaLabel ? nothing : \"true\"}\"\n ></rel-icon>`\n : \"\";\n\n const belowTemplate = belowText\n ? html`<div part=\"helper\" class=\"textfield-support ${isError ? \"error\" : \"\"}\" id=\"${describedById}\">\n ${belowText}\n </div>`\n : \"\";\n\n if (this.variant === \"legend\") {\n const fieldsetClass = [\"field-fieldset\", this.multiline ? \"multiline\" : \"\"].filter(Boolean).join(\" \");\n // The <legend> MUST be the fieldset's first child with no preceding\n // whitespace/text or binding-comment, otherwise the browser won't cut the\n // notch in the top border. So it's rendered flush against the tag open and\n // is always present (only its content is dynamic).\n return html`\n <div class=\"${wrapperClasses}\">\n <fieldset part=\"control\" class=\"${fieldsetClass}\"><legend class=\"field-legend\" id=\"${legendId}\">${labelHidden ? \"\" : this.label ?? \"\"}${this.required && !labelHidden ? html`<span class=\"required-mark\" aria-hidden=\"true\">*</span>` : \"\"}</legend>\n ${!this.multiline ? leadingIconTemplate : \"\"}\n ${inputTemplate}\n </fieldset>\n ${belowTemplate}\n </div>\n `;\n }\n\n return html`\n <div class=\"${wrapperClasses}\">\n ${labelHidden\n ? html`<div class=\"label-reserve\" aria-hidden=\"true\"></div>`\n : labelStyle !== \"floating\"\n ? labelTemplate()\n : \"\"}\n\n <div part=\"control\" class=\"${[\"textfield-container\", this.isDisabled ? \"disabled\" : \"\", this.multiline ? \"multiline\" : \"\"].filter(Boolean).join(\" \")}\">\n ${labelStyle === \"floating\"\n ? labelTemplate(leadingIcon && !this.multiline ? \" has-left-icon\" : \"\")\n : \"\"}\n ${!this.multiline ? leadingIconTemplate : \"\"}\n\n ${inputTemplate}\n\n ${!this.multiline && this.rightIcon\n ? html`<rel-icon\n part=\"right-icon\"\n name=\"${this.rightIcon}\"\n size=\"${this.clickableRightIcon ? \"md\" : \"sm\"}\"\n class=\"icon right ${this.clickableRightIcon ? \"clickable\" : \"\"}\"\n role=\"${this.clickableRightIcon ? \"button\" : nothing}\"\n tabindex=\"${this.clickableRightIcon ? \"0\" : nothing}\"\n aria-label=\"${this.clickableRightIcon ? (this.rightIconAriaLabel ?? nothing) : nothing}\"\n @click=\"${(e: Event) => this.handleRightIconClick(e)}\"\n @keydown=\"${(e: KeyboardEvent) => this.handleRightIconKeydown(e)}\"\n ></rel-icon>`\n : \"\"}\n </div>\n\n ${belowTemplate}\n </div>\n `;\n }\n}\n","import { LitElement, html, css } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\n\n@customElement(\"rel-avatar\")\nexport class RelAvatar extends LitElement {\n @property({ type: String, reflect: true })\n size: \"lg\" | \"md\" | \"sm\" | \"xs\" = \"md\";\n\n @property({ type: String, reflect: true })\n type: \"image\" | \"text\" | \"icon\" = \"image\";\n\n @property({ type: String, reflect: true })\n variant: \"fill\" | \"subtle\" | \"outline\" = \"fill\";\n\n @property({ type: String }) src = \"\";\n @property({ type: String }) text = \"\";\n @property({ type: String }) alt = \"Avatar\";\n @property({ type: String }) bg: string = \"\";\n @property({ type: String }) color: string = \"\";\n\n static styles = css`\n :host {\n color: var(--rel-text-default);\n display: inline-flex;\n font-family: var(--rel-fonts-font-family);\n }\n\n .avatar {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n overflow: hidden;\n box-sizing: border-box;\n border: var(--rel-stroke-sm, 1px) solid transparent;\n /* every avatar size role is a *-semibold role, so the base weight binds\n one of them rather than the underlying primitive (per conventions §1) */\n font-weight: var(--rel-body-sm-semibold-font-weight);\n user-select: none;\n text-transform: uppercase;\n }\n\n /* ── Variants ─────────────────────────────────────────────── */\n\n :host([variant=\"fill\"]) .avatar {\n background-color: var(--rel-avatar-bg-fill, var(--rel-bg-neutral-inverse-2));\n color: var(--rel-avatar-color-fill, var(--rel-text-inverse));\n }\n\n :host([variant=\"subtle\"]) .avatar {\n background-color: var(--rel-avatar-bg-subtle, var(--rel-bg-neutral-elevated-1));\n color: var(--rel-avatar-color-subtle, var(--rel-text-default));\n }\n\n :host([variant=\"outline\"]) .avatar {\n background-color: transparent;\n border-color: var(--rel-avatar-border-outline, var(--rel-border-default));\n color: var(--rel-avatar-color-outline, var(--rel-text-default));\n }\n\n /* ── Sizes ────────────────────────────────────────────────── */\n\n .avatar-lg {\n width: 40px;\n height: 40px; /* 20px */\n font-family: var(--rel-body-xl-semibold-font-family);\n font-weight: var(--rel-body-xl-semibold-font-weight);\n font-size: var(--rel-body-xl-semibold-font-size);\n line-height: var(--rel-body-xl-semibold-line-height);\n letter-spacing: var(--rel-body-xl-semibold-letter-spacing);\n }\n\n .avatar-md {\n /* Figma: body-lg-semibold family+weight on body-lg-regular metrics */\n font-weight: var(--rel-body-lg-semibold-font-weight);\n width: 32px;\n height: 32px; /* 16px */\n font-family: var(--rel-body-lg-semibold-font-family);\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 .avatar-sm {\n width: 24px;\n height: 24px; /* 12px */\n font-family: var(--rel-body-sm-regular-font-family);\n font-weight: var(--rel-body-sm-semibold-font-weight);\n font-size: var(--rel-body-sm-semibold-font-size);\n line-height: var(--rel-body-sm-semibold-line-height);\n letter-spacing: var(--rel-body-sm-semibold-letter-spacing);\n }\n\n .avatar-xs {\n width: 20px;\n height: 20px; /* 10px */\n font-family: var(--rel-body-xs-regular-font-family);\n font-weight: var(--rel-body-xs-semibold-font-weight);\n font-size: var(--rel-body-xs-semibold-font-size);\n line-height: var(--rel-body-xs-semibold-line-height);\n letter-spacing: var(--rel-body-xs-semibold-letter-spacing);\n }\n\n /* ── Image ────────────────────────────────────────────────── */\n\n img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n background: var(--rel-bg-neutral);\n }\n\n /* ── Icon slot ────────────────────────────────────────────── */\n\n .icon-slot {\n width: 100%;\n height: 100%;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: inherit;\n }\n\n .icon-slot ::slotted(svg) {\n width: 50%;\n height: 50%;\n }\n\n `;\n\n render() {\n return html`\n <div part=\"base\" class=\"avatar avatar-${this.size}\" style=${[this.bg ? `background-color:${this.bg}` : \"\", this.color ? `color:${this.color}` : \"\"].filter(Boolean).join(\";\")}>\n ${this.type === \"image\" && this.src\n ? html`<img part=\"icon\" src=${this.src} alt=${this.alt} />`\n : this.type === \"text\"\n ? html`<span part=\"label\">${this.text}</span>`\n : html`<span part=\"icon\" class=\"icon-slot\"><slot></slot></span>`}\n </div>\n `;\n }\n}\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\r\n@customElement(\"rel-badge\")\r\nexport class RelBadge extends LitElement {\r\n @property({ type: String }) number = \"\";\r\n\r\n @property({ type: String }) ariaLabel: string = \"\";\r\n\r\n @property({ type: String }) suffix: string = \"notifications\";\r\n\r\n @property({ type: String, reflect: true })\r\n size: \"sm\" | \"md\" | \"lg\" | \"xl\" = \"md\";\r\n\r\n @property({ type: String, reflect: true })\r\n variant: \"dot\" | \"number\" = \"number\";\r\n\r\n /**\r\n * Direct CSS color override for the badge background. Accepts any valid\r\n * CSS color value: hex, rgb(...), hsl(...), named color, or var(--token).\r\n *\r\n * Clear it (set to `''`) to fall back to the default token.\r\n */\r\n @property({ type: String, reflect: true })\r\n color = \"\";\r\n\r\n /**\r\n * Direct CSS color override for the badge text/icon color. Accepts any\r\n * valid CSS color value: hex, rgb(...), hsl(...), named color, or var(--token).\r\n *\r\n * Clear it (set to `''`) to fall back to the default (white).\r\n */\r\n @property({ type: String, reflect: true, attribute: \"text-color\" })\r\n textColor = \"\";\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n display: inline-flex;\r\n }\r\n\r\n .badge {\r\n font-weight: var(--rel-body-sm-semibold-font-weight);\r\n font-size: var(--rel-body-sm-semibold-font-size);\r\n line-height: var(--rel-body-sm-semibold-line-height);\r\n letter-spacing: var(--rel-body-sm-semibold-letter-spacing);\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n box-sizing: border-box;\r\n font-family: var(--rel-fonts-font-family, sans-serif);\r\n background-color: var(--rel-badge-bg, var(--rel-bg-danger));\r\n color: var(--rel-badge-color, var(--rel-text-static-light));\r\n /* Large fixed radius (not 50%) — stays a perfect circle for 1-2 digits,\r\n but becomes a pill instead of clipping when content like \"999+\"\r\n is wider than the minimum circle. */\r\n border-radius: 999px;\r\n white-space: nowrap;\r\n }\r\n\r\n /* NUMBER BADGES — min-width (not width) lets multi-character content\r\n like \"999+\" grow the badge into a pill instead of overflowing a fixed circle. */\r\n .badge-sm {\r\n min-width: 20px;\r\n height: 20px;\r\n padding: 0 4px;\r\n font-family: var(--rel-body-xs-regular-font-family);\r\n font-weight: var(--rel-body-xs-semibold-font-weight);\r\n font-size: var(--rel-body-xs-semibold-font-size);\r\n line-height: var(--rel-body-xs-semibold-line-height);\r\n letter-spacing: var(--rel-body-xs-semibold-letter-spacing);\r\n }\r\n\r\n /* Size tiers follow Figma Badge S/M/L/XL (20/24/28/40px).\r\n Figma binds a *-regular family with *-semibold metrics on S/M/L. */\r\n .badge-md {\r\n min-width: 24px;\r\n height: 24px;\r\n padding: 0 6px;\r\n font-family: var(--rel-body-sm-regular-font-family);\r\n font-weight: var(--rel-body-sm-semibold-font-weight);\r\n font-size: var(--rel-body-sm-semibold-font-size);\r\n line-height: var(--rel-body-sm-semibold-line-height);\r\n letter-spacing: var(--rel-body-sm-semibold-letter-spacing);\r\n }\r\n\r\n .badge-lg {\r\n min-width: 28px;\r\n height: 28px;\r\n padding: 0 6px;\r\n font-family: var(--rel-body-md-regular-font-family);\r\n font-weight: var(--rel-body-md-semibold-font-weight);\r\n font-size: var(--rel-body-md-regular-font-size);\r\n line-height: var(--rel-body-md-regular-line-height);\r\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\r\n }\r\n\r\n .badge-xl {\r\n min-width: 40px;\r\n height: 40px;\r\n padding: 0 8px;\r\n font-family: var(--rel-body-xl-semibold-font-family);\r\n font-weight: var(--rel-body-xl-semibold-font-weight);\r\n font-size: var(--rel-body-xl-semibold-font-size);\r\n line-height: var(--rel-body-xl-semibold-line-height);\r\n letter-spacing: var(--rel-body-xl-semibold-letter-spacing);\r\n }\r\n\r\n /* DOT BADGES — explicitly reset min-width/padding inherited from the\r\n number-badge size rules above; otherwise min-width wins over this\r\n smaller width and the dot gets stretched into a squashed pill. */\r\n .badge-dot.badge-sm {\r\n width: 8px;\r\n height: 8px;\r\n min-width: 0;\r\n padding: 0;\r\n }\r\n\r\n .badge-dot.badge-md {\r\n width: 10px;\r\n height: 10px;\r\n min-width: 0;\r\n padding: 0;\r\n }\r\n\r\n .badge-dot.badge-lg {\r\n width: 12px;\r\n height: 12px;\r\n min-width: 0;\r\n padding: 0;\r\n }\r\n\r\n .badge-dot.badge-xl {\r\n width: 12px;\r\n height: 12px;\r\n min-width: 0;\r\n padding: 0;\r\n }\r\n `;\r\n\r\n private get classes() {\r\n return [\"badge\", `badge-${this.size}`, `badge-${this.variant}`].join(\" \");\r\n }\r\n\r\n override updated(changedProperties: Map<PropertyKey, unknown>): void {\r\n if (changedProperties.has(\"color\")) {\r\n if (this.color) {\r\n this.style.setProperty(\"--rel-badge-bg\", this.color);\r\n } else {\r\n this.style.removeProperty(\"--rel-badge-bg\");\r\n }\r\n }\r\n\r\n if (changedProperties.has(\"textColor\")) {\r\n if (this.textColor) {\r\n this.style.setProperty(\"--rel-badge-color\", this.textColor);\r\n } else {\r\n this.style.removeProperty(\"--rel-badge-color\");\r\n }\r\n }\r\n }\r\n\r\n render() {\r\n return html`\r\n <span part=\"base\" class=\"${this.classes}\" aria-label=${this.ariaLabel || `${this.number} ${this.suffix}`}>\r\n ${this.variant === \"number\" ? this.number : null}\r\n </span>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\r\nexport interface BreadcrumbItem {\r\n label: string;\r\n url?: string;\r\n}\r\n\r\n@customElement(\"rel-breadcrumbs\")\r\nexport class RelBreadcrumbs extends LitElement {\r\n @property({ type: Array })\r\n items: BreadcrumbItem[] = [];\r\n\r\n static styles = css`\r\n :host {\r\n display: block;\r\r\r\n color: var(--rel-text-default);\n font-family: var(--rel-body-md-regular-font-family);\n font-weight: var(--rel-body-md-regular-font-weight);\n font-size: var(--rel-body-md-regular-font-size);\n line-height: var(--rel-body-md-regular-line-height);\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\n }\r\n\r\n nav {\r\n width: 100%;\r\n }\r\n\r\n ol {\r\n display: flex;\r\n flex-wrap: wrap;\r\n padding: 0;\r\n margin: 0;\r\n list-style: none;\r\n }\r\n\r\n li {\r\n gap: var(--rel-spacing-xs);\r\n display: flex;\r\n align-items: center;\r\n }\r\n\r\n a {\r\n text-decoration: none;\r\n font-weight: var(--rel-body-md-regular-font-weight);\r\n color: var(--rel-text-body);\r\n }\r\n\r\n a:hover {\r\n text-decoration: underline;\r\n color: var(--rel-text-default);\r\n }\r\n\r\n a:focus-visible {\r\n outline: 2px solid var(--rel-border-focus);\r\n outline-offset: 2px;\r\n border-radius: 2px;\r\n }\r\n\r\n .current {\r\n font-weight: var(--rel-body-md-semibold-font-weight);\r\n color: var(--rel-text-default);\r\n cursor: default;\r\n }\r\n\r\n svg {\r\n stroke: currentColor;\r\n width: 16px;\r\n height: 16px;\r\n margin: 0 10px;\r\n }\r\n `;\r\n\r\n render() {\r\n return html`\r\n <nav part=\"base\" aria-label=\"Breadcrumb\">\r\n <ol>\r\n ${this.items.map((item, index) => {\r\n const isLast = index === this.items.length - 1;\r\n\r\n return html`\r\n <li>\r\n ${item.url && !isLast\r\n ? html`<a href=${item.url}>${item.label}</a>`\r\n : html`<span part=\"label\" class=\"current\" aria-current=\"page\">${item.label}</span>`}\r\n ${!isLast\r\n ? html`\r\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\r\n <polyline\r\n points=\"9 18 15 12 9 6\"\r\n fill=\"none\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n `\r\n : null}\r\n </li>\r\n `;\r\n })}\r\n </ol>\r\n </nav>\r\n `;\r\n }\r\n}\r\n","import \"../rel-badge/rel-badge\";\r\nimport { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\nimport { ifDefined } from \"lit/directives/if-defined.js\";\r\n\r\n/**\r\n * Style axis. Canonical values are the historical ones; \"outline\"/\"ghost\" are\r\n * accepted Figma-vocabulary aliases for \"secondary\"/\"text\". \"static\" is the\r\n * Figma Style=Static treatment (transparent, static-light label — for use on\r\n * colored/dark surfaces). Legacy \"icon\" is the pre-2.0 collapsed icon-button\r\n * variant and keeps its exact behavior; prefer icon-only + a style instead.\r\n */\r\nexport type ButtonVariant =\r\n | \"default\" | \"primary\" | \"secondary\" | \"text\" | \"link\" | \"icon\" | \"static\"\r\n | \"outline\" | \"ghost\";\r\n\r\n/** Tone axis. \"neutral\"/\"brand\"/\"danger\" are Figma-vocabulary aliases. */\r\nexport type ButtonTone =\r\n | \"default\" | \"primary\" | \"secondary\" | \"critical\" | \"success\"\r\n | \"neutral\" | \"brand\" | \"danger\";\r\n\r\n@customElement(\"rel-button\")\r\nexport class RelButton extends LitElement {\r\n @property({ type: String })\r\n variant: ButtonVariant = \"default\";\r\n\r\n @property({ type: String })\r\n tone: ButtonTone = \"default\";\r\n\r\n /**\r\n * Figma \"Type=Icon Only\" as an independent axis: a square button of the\r\n * current style/tone. Unlike legacy variant=\"icon\", this composes with\r\n * every style (outline/ghost/link included).\r\n */\r\n @property({ type: Boolean, reflect: true, attribute: \"icon-only\" })\r\n iconOnly = false;\r\n\r\n /** Figma \"State=Loading\": shows a spinner, blocks interaction. */\r\n @property({ type: Boolean, reflect: true }) loading = false;\r\n\r\n @property({ type: String })\r\n size: \"small\" | \"medium\" | \"large\" = \"medium\";\r\n\r\n @property({ type: String })\r\n border: \"corner-radius\" | \"small-corner-radius\" | \"no-corner-radius\" =\r\n \"corner-radius\";\r\n\r\n @property({ type: Boolean, reflect: true }) disabled = false;\r\n\r\n @property({ type: String, attribute: \"aria-label\" }) ariaLabel: string | null = null;\r\n\r\n /** Numeric/overflow text shown in a corner badge (e.g. \"3\", \"999+\"). Ignored when badgeDot is set. */\r\n @property({ type: String }) badge = \"\";\r\n\r\n /** Shows a small corner dot instead of a numbered badge — takes precedence over `badge`. */\r\n @property({ type: Boolean, attribute: \"badge-dot\" }) badgeDot = false;\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n display: inline-flex;\r\n position: relative;\r\n }\r\n\r\n .btn-badge {\r\n position: absolute;\r\n top: -6px;\r\n right: -6px;\r\n pointer-events: none;\r\n }\r\n\r\n /* Icon buttons are a 40px circle (radius 20). An 8px dot's center needs to\r\n land ON that circle's edge at the 45° corner point — which works out to\r\n roughly 2px inward from each edge (R - R/√2 - dot-radius ≈ 1.9px), not\r\n outside it like the numbered badge. Negative offsets here would float\r\n the dot in the empty bounding-box corner outside the visible circle. */\r\n .btn-badge[variant=\"dot\"] {\r\n top: 2px;\r\n right: 2px;\r\n }\r\n\r\n button {\r\n font-family: var(--rel-action-md-font-family);\r\n font-weight: var(--rel-action-md-font-weight);\r\n cursor: pointer;\r\n border: none;\r\n transition: all 0.15s ease;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: var(--rel-spacing-2xs);\r\n outline: none;\r\n position: relative;\r\n }\r\n\r\n /* Content wrapper mirrors the button's flex so slotted icon+label keep\r\n their gap; it exists so loading can hide the label without collapsing\r\n the button's width. */\r\n .content {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: inherit;\r\n }\r\n\r\n /* Loading (Figma State=Loading): spinner replaces the label in place */\r\n :host([loading]) {\r\n pointer-events: none;\r\n }\r\n\r\n :host([loading]) .content {\r\n visibility: hidden;\r\n }\r\n\r\n .spinner {\r\n position: absolute;\r\n left: 50%;\r\n top: 50%;\r\n width: 16px;\r\n height: 16px;\r\n margin: -8px 0 0 -8px;\r\n border-radius: 50%;\r\n border: 2px solid currentColor;\r\n border-top-color: transparent;\r\n animation: rel-btn-spin 0.8s linear infinite;\r\n }\r\n\r\n @keyframes rel-btn-spin {\r\n to {\r\n transform: rotate(360deg);\r\n }\r\n }\r\n\r\n @media (prefers-reduced-motion: reduce) {\r\n .spinner {\r\n animation-duration: 2s;\r\n }\r\n }\r\n\r\n /* Sizes */\r\n .size-small {\r\n height: 32px;\r\n padding: 0 var(--rel-spacing-sm);\r\n font-family: var(--rel-action-md-font-family);\r\n font-weight: var(--rel-action-md-font-weight);\r\n font-size: var(--rel-action-md-font-size);\r\n line-height: var(--rel-action-md-line-height);\r\n letter-spacing: var(--rel-action-md-letter-spacing);\r\n }\r\n\r\n .size-medium {\r\n height: 40px;\r\n gap: var(--rel-spacing-xs);\r\n padding: 0 var(--rel-spacing-md);\r\n font-family: var(--rel-action-lg-font-family);\r\n font-weight: var(--rel-action-lg-font-weight);\r\n font-size: var(--rel-action-lg-font-size);\r\n line-height: var(--rel-action-lg-line-height);\r\n letter-spacing: var(--rel-action-lg-letter-spacing);\r\n }\r\n\r\n .size-large {\r\n height: 48px;\r\n padding: 0 var(--rel-spacing-lg);\r\n font-family: var(--rel-action-xl-font-family);\r\n font-weight: var(--rel-action-xl-font-weight);\r\n font-size: var(--rel-action-xl-font-size);\r\n line-height: var(--rel-action-xl-line-height);\r\n letter-spacing: var(--rel-action-xl-letter-spacing);\r\n }\r\n\r\n /* Borders */\r\n .border-corner-radius {\r\n border-radius: var(--rel-border-radius-full-rounded);\r\n }\r\n\r\n .border-small-corner-radius {\r\n border-radius: var(--rel-border-radius-sm);\r\n }\r\n\r\n .border-no-corner-radius {\r\n border-radius: var(--rel-border-radius-square);\r\n }\r\n\r\n /* Disabled */\r\n :host([disabled]) {\r\n /* not-allowed must stay VISIBLE: the host keeps pointer-events so the\r\n cursor renders. Clicks are neutralised two ways — the inner button's\r\n pointer-events:none (below) and the capture-phase handleHostClick\r\n guard (which also stops programmatic .click()). Putting\r\n pointer-events:none on the HOST would make it transparent to the\r\n pointer and suppress the cursor entirely. */\r\n cursor: not-allowed;\r\n /* The disabled tokens are full-contrast pairs (light: near-black on\r\n gray-300, dark: white on gray-700), so on their own they render a\r\n crisp button that reads as enabled. Dulling happens here instead —\r\n same opacity mechanism the rest of the library uses. */\r\n opacity: 0.5;\r\n }\r\n\r\n /* Only styles that actually carry a fill flatten to the neutral disabled\r\n fill. Ghost/link/outline/static stay transparent so a disabled one\r\n keeps its own shape rather than becoming a solid pill — which is what\r\n made them look like ordinary enabled buttons. */\r\n :host([disabled]) button.btn-primary,\r\n :host([disabled]) button.btn-default,\r\n :host([disabled]) button.btn-icon {\r\n background-color: var(--rel-action-brand-fill-disabled) !important;\r\n color: var(--rel-action-brand-label-icons-primary-disabled) !important;\r\n border: none !important;\r\n }\r\n\r\n :host([disabled]) button {\r\n cursor: not-allowed;\r\n pointer-events: none;\r\n filter: none !important;\r\n }\r\n\r\n /* Variants & tones — V2 action tokens (auto light/dark) */\r\n .btn-default.tone-default {\r\n background: var(--rel-action-neutral-fill);\r\n color: var(--rel-action-neutral-label-icons-fill-inverse);\r\n }\r\n .btn-default.tone-critical {\r\n background: var(--rel-action-danger-fill);\r\n color: var(--rel-action-danger-label-icons-fill);\r\n }\r\n .btn-default.tone-success {\r\n background: var(--rel-action-success-fill);\r\n color: var(--rel-text-static-light);\r\n }\r\n\r\n .btn-primary.tone-default {\r\n background: var(--rel-action-brand-fill);\r\n color: var(--rel-action-brand-label-icons-primary);\r\n }\r\n .btn-primary.tone-critical {\r\n background: var(--rel-action-danger-fill);\r\n color: var(--rel-action-danger-label-icons-fill);\r\n }\r\n .btn-primary.tone-success {\r\n background: var(--rel-action-success-fill);\r\n color: var(--rel-action-success-label-icons-fill);\r\n }\r\n\r\n .btn-secondary {\r\n background: var(--rel-bg-surface);\r\n border: 1px solid var(--rel-action-neutral-border-outline);\r\n color: var(--rel-action-neutral-label-icons-outline);\r\n }\r\n\r\n /* Secondary critical / success tones. The danger outline border is\r\n deliberately the SUBTLE red at rest (red-100) and only goes solid\r\n (red-600) on hover/pressed — verified against the Figma design nodes,\r\n not just the variable names. Do not \"fix\" it to a solid red. */\r\n .btn-secondary.tone-critical {\r\n border-color: var(--rel-action-danger-border-outline);\r\n color: var(--rel-action-danger-label-icons-outline);\r\n }\r\n .btn-secondary.tone-success {\r\n border-color: var(--rel-border-success);\r\n color: var(--rel-text-success);\r\n }\r\n\r\n .btn-text {\r\n background: transparent;\r\n color: var(--rel-action-neutral-label-icons-ghost);\r\n }\r\n\r\n .btn-text.tone-critical {\r\n color: var(--rel-action-danger-label-icons-ghost);\r\n }\r\n\r\n .btn-link {\r\n background: transparent;\r\n color: var(--rel-action-neutral-label-icons-link);\r\n text-decoration: underline;\r\n }\r\n\r\n button.btn-link:hover:not(:disabled) {\r\n color: var(--rel-action-neutral-label-icons-link-hover);\r\n }\r\n\r\n .btn-link.tone-critical {\r\n color: var(--rel-action-danger-label-icons-link);\r\n }\r\n\r\n button.btn-link.tone-critical:hover:not(:disabled) {\r\n color: var(--rel-action-danger-label-icons-link-hover);\r\n }\r\n\r\n /* Static style (Figma Style=Static, Tone=Neutral only): transparent with a\r\n static-light label, for placement on colored or dark surfaces */\r\n .btn-static {\r\n background: transparent;\r\n color: var(--rel-text-static-light);\r\n }\r\n\r\n button.btn-static:hover:not(:disabled) {\r\n background: var(--rel-action-neutral-static-hover);\r\n }\r\n\r\n /* Icon Only as an independent axis: square button of the current style */\r\n .btn-icon-only {\r\n padding: 0;\r\n }\r\n\r\n .btn-icon-only.size-small {\r\n width: 32px;\r\n }\r\n\r\n .btn-icon-only.size-medium {\r\n width: 40px;\r\n }\r\n\r\n .btn-icon-only.size-large {\r\n width: 48px;\r\n }\r\n\r\n .btn-icon {\r\n width: 40px;\r\n height: 40px;\r\n padding: 0;\r\n border-radius: 50%;\r\n }\r\n .btn-icon.tone-default {\r\n background: var(--rel-action-neutral-subtle);\r\n color: var(--rel-action-neutral-label-icons-ghost);\r\n border: none;\r\n }\r\n .btn-icon.tone-primary {\r\n background: var(--rel-action-brand-fill);\r\n color: var(--rel-action-brand-label-icons-primary);\r\n border: none;\r\n }\r\n .btn-icon.tone-secondary {\r\n background: var(--rel-bg-surface);\r\n color: var(--rel-action-neutral-label-icons-outline);\r\n border: 1px solid var(--rel-action-neutral-border-outline);\r\n }\r\n .btn-icon.tone-success {\r\n background: var(--rel-action-success-fill);\r\n color: var(--rel-action-success-label-icons-fill);\r\n border: none;\r\n }\r\n .btn-icon.tone-critical {\r\n background: var(--rel-action-danger-fill);\r\n color: var(--rel-action-danger-label-icons-fill);\r\n border: none;\r\n }\r\n\r\n button.btn-primary.tone-default:hover:not(:disabled) {\r\n background: var(--rel-action-brand-fill-hover);\r\n }\r\n\r\n button.btn-primary.tone-critical:hover:not(:disabled) {\r\n background: var(--rel-action-danger-fill-hover);\r\n }\r\n\r\n button.btn-primary.tone-success:hover:not(:disabled) {\r\n background: var(--rel-action-success-fill-hover);\r\n }\r\n\r\n /* Generic hover — excludes styles handled per-style. Now also excludes\r\n .btn-text: ghost gets tone-accent hovers below (this generic grey overlay\r\n has higher specificity than the per-tone ghost rules and was overriding\r\n them, which is why every ghost hover looked grey). */\r\n button:hover:not(:disabled):not(.btn-primary):not(.btn-default):not(.btn-icon):not(.btn-secondary):not(.btn-static):not(.btn-text) {\r\n background: var(--rel-action-overlay-hover);\r\n }\r\n\r\n /* Outline (secondary): fill stays on the surface (white) on hover AND\r\n pressed — only the border reacts. Matches Figma (transparent outline fill). */\r\n button.btn-secondary:hover:not(:disabled),\r\n button.btn-secondary:active:not(:disabled) {\r\n background: var(--rel-bg-surface);\r\n border-color: var(--rel-action-neutral-border-outline-hover);\r\n }\r\n button.btn-secondary.tone-critical:hover:not(:disabled),\r\n button.btn-secondary.tone-critical:active:not(:disabled) {\r\n background: var(--rel-bg-surface);\r\n border-color: var(--rel-action-danger-border-outline-hover);\r\n }\r\n button.btn-secondary.tone-success:hover:not(:disabled),\r\n button.btn-secondary.tone-success:active:not(:disabled) {\r\n background: var(--rel-bg-surface);\r\n border-color: var(--rel-border-success-strong);\r\n }\r\n\r\n /* Ghost (text): tone-accent fill on hover AND pressed — the same tint the\r\n outline used to carry (neutral = subtle overlay, danger = red-50,\r\n success = green-50). Matches Figma. */\r\n button.btn-text:hover:not(:disabled),\r\n button.btn-text:active:not(:disabled) {\r\n background: var(--rel-action-neutral-ghost-hover);\r\n }\r\n button.btn-text.tone-critical:hover:not(:disabled),\r\n button.btn-text.tone-critical:active:not(:disabled) {\r\n background: var(--rel-action-danger-ghost-hover);\r\n }\r\n button.btn-text.tone-success:hover:not(:disabled),\r\n button.btn-text.tone-success:active:not(:disabled) {\r\n background: var(--rel-action-success-ghost-hover);\r\n }\r\n\r\n button.btn-default.tone-default:hover:not(:disabled) {\r\n background: var(--rel-action-neutral-fill-hover);\r\n }\r\n button.btn-default.tone-critical:hover:not(:disabled) {\r\n background: var(--rel-action-danger-fill-hover);\r\n }\r\n button.btn-default.tone-success:hover:not(:disabled) {\r\n background: var(--rel-action-success-fill-hover);\r\n }\r\n\r\n /* Icon hover — each tone matches its corresponding button variant */\r\n button.btn-icon.tone-default:hover:not(:disabled) {\r\n background: var(--rel-action-neutral-subtle-hover);\r\n }\r\n button.btn-icon.tone-primary:hover:not(:disabled) {\r\n background: var(--rel-action-brand-fill-hover);\r\n }\r\n button.btn-icon.tone-secondary:hover:not(:disabled) {\r\n background: var(--rel-action-neutral-ghost-hover);\r\n border-color: var(--rel-action-neutral-border-outline-hover);\r\n }\r\n button.btn-icon.tone-success:hover:not(:disabled) {\r\n background: var(--rel-action-success-fill-hover);\r\n }\r\n button.btn-icon.tone-critical:hover:not(:disabled) {\r\n background: var(--rel-action-danger-fill-hover);\r\n }\r\n\r\n button.btn-default.tone-default:active:not(:disabled) {\r\n background-image: linear-gradient(\r\n var(--rel-action-neutral-static-hover),\r\n var(--rel-action-neutral-static-hover)\r\n );\r\n }\r\n\r\n button:active:not(:disabled) {\r\n transform: scale(0.97);\r\n }\r\n\r\n button:focus-visible {\r\n outline: 2px solid var(--rel-border-focus);\r\n outline-offset: 2px;\r\n box-shadow:\r\n 0 0 0 2px var(--rel-border-focus-inner),\r\n 0 0 0 8px var(--rel-border-focus-subtle);\r\n }\r\n `;\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n // Capture-phase, on the host itself: blocks programmatic el.click() calls\r\n // and any other path that bypasses the inner button's pointer-events:none\r\n // (e.g. CSS pointer-events doesn't stop .click(), which targets the host\r\n // directly regardless of hit-testing).\r\n this.addEventListener(\"click\", this.handleHostClick, { capture: true });\r\n }\r\n\r\n disconnectedCallback() {\r\n this.removeEventListener(\"click\", this.handleHostClick, { capture: true });\r\n super.disconnectedCallback();\r\n }\r\n\r\n private handleHostClick = (e: MouseEvent) => {\r\n if (this.disabled || this.loading) {\r\n e.preventDefault();\r\n e.stopImmediatePropagation();\r\n }\r\n };\r\n\r\n /** Style axis with Figma-vocabulary aliases folded onto canonical values. */\r\n private get styleVariant(): string {\r\n if (this.variant === \"outline\") return \"secondary\";\r\n if (this.variant === \"ghost\") return \"text\";\r\n return this.variant;\r\n }\r\n\r\n /** Tone axis with Figma-vocabulary aliases folded onto canonical values. */\r\n private get effectiveTone(): string {\r\n if (this.tone === \"neutral\") return \"default\";\r\n if (this.tone === \"brand\") return \"primary\";\r\n if (this.tone === \"danger\") return \"critical\";\r\n return this.tone;\r\n }\r\n\r\n private get classes() {\r\n const style = this.styleVariant;\r\n return [\r\n `btn-${style}`,\r\n this.iconOnly && style !== \"icon\" ? \"btn-icon-only\" : \"\",\r\n `tone-${this.effectiveTone}`,\r\n `size-${this.size}`,\r\n `border-${this.border}`,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n }\r\n\r\n private handleClick(e: MouseEvent) {\r\n if (this.disabled || this.loading) {\r\n e.preventDefault();\r\n e.stopImmediatePropagation();\r\n return;\r\n }\r\n\r\n // Native click events are already composed: true, so this bubbles\r\n // through the shadow boundary to the host on its own — no re-dispatch\r\n // needed. (A manual re-dispatch here previously caused every @click\r\n // listener on <rel-button> to fire twice per real click.)\r\n }\r\n\r\n render() {\r\n const showBadge = this.badgeDot || !!this.badge;\r\n\r\n return html`\r\n <button\r\n part=\"base\"\r\n class=\"${this.classes}\"\r\n ?disabled=${this.disabled}\r\n @click=${this.handleClick}\r\n aria-disabled=${this.disabled}\r\n aria-busy=${this.loading}\r\n aria-label=${ifDefined(this.ariaLabel ?? undefined)}\r\n >\r\n ${this.loading\r\n ? html`<span part=\"indicator\" class=\"spinner\" aria-hidden=\"true\"></span>`\r\n : null}\r\n <span class=\"content\"><slot></slot></span>\r\n </button>\r\n ${showBadge\r\n ? html`<rel-badge\r\n class=\"btn-badge\"\r\n variant=${this.badgeDot ? \"dot\" : \"number\"}\r\n number=${this.badge}\r\n size=\"sm\"\r\n ></rel-badge>`\r\n : null}\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css, nothing } from \"lit\";\r\nimport { customElement, property, state } from \"lit/decorators.js\";\r\n\r\ninterface CalendarDay {\r\n date: Date;\r\n day: number;\r\n isCurrentMonth: boolean;\r\n isToday: boolean;\r\n isSelected: boolean;\r\n isDisabled: boolean;\r\n isWeekend: boolean;\r\n}\r\n\r\n@customElement(\"rel-calendar\")\r\nexport class RelCalendar extends LitElement {\r\n @property({ type: String, reflect: true }) value: string | null = null;\r\n @property({ type: String }) min: string | null = null;\r\n @property({ type: String }) max: string | null = null;\r\n @property({ type: Boolean, reflect: true }) disabled = false;\r\n @property({ type: String, attribute: \"week-start\" }) weekStart: \"sun\" | \"mon\" = \"sun\";\r\n @property({ type: String }) locale = \"en-US\";\r\n\r\n // Custom disabled predicate (not settable via attribute)\r\n public isDateDisabled?: (date: Date) => boolean;\r\n\r\n @state() private viewYear: number = new Date().getFullYear();\r\n @state() private viewMonth: number = new Date().getMonth();\r\n @state() private focusedDate: Date | null = null;\r\n\r\n static styles = css`\r\n :host {\r\n display: block;\r\n font-family: var(--rel-fonts-font-family, sans-serif);\r\n background: var(--rel-bg-neutral);\r\n border: 1px solid var(--rel-border-default);\r\n border-radius: var(--rel-border-radius-sm, 8px);\r\n padding: var(--rel-spacing-md, 16px);\r\n max-width: 320px;\r\n color: var(--rel-text-default);\r\n }\r\n\r\n :host([disabled]) {\r\n opacity: 0.6;\r\n cursor: not-allowed;\r\n }\r\n\r\n /* Block interaction on the inner controls (JS also guards clicks), but keep\r\n pointer-events on the host so its not-allowed cursor shows through. */\r\n :host([disabled]) .day-button,\r\n :host([disabled]) .nav-button {\r\n pointer-events: none;\r\n }\r\n\r\n .header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n margin-bottom: var(--rel-spacing-sm);\r\n }\r\n\r\n .header-center {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-xs);\r\n color: var(--rel-text-label);\r\n font-family: var(--rel-body-lg-semibold-font-family);\r\n font-weight: var(--rel-body-lg-semibold-font-weight);\r\n font-size: var(--rel-body-lg-regular-font-size);\r\n line-height: var(--rel-body-lg-regular-line-height);\r\n letter-spacing: var(--rel-body-lg-regular-letter-spacing);\r\n }\r\n\r\n .nav-button {\r\n background: transparent;\r\n border: none;\r\n width: 32px;\r\n height: 32px;\r\n border-radius: var(--rel-border-radius-sm);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n cursor: pointer;\r\n color: var(--rel-action-neutral-label-icons-ghost);\r\n transition: background-color 0.15s ease;\r\n }\r\n\r\n .nav-button:hover {\r\n background: var(--rel-bg-neutral-elevated-2);\r\n }\r\n\r\n .nav-button:focus-visible {\r\n outline: 2px solid var(--rel-border-focus);\r\n outline-offset: 2px;\r\n }\r\n\r\n .calendar-grid {\r\n display: grid;\r\n grid-template-columns: repeat(7, 1fr);\r\n gap: var(--rel-spacing-2xs);\r\n }\r\n\r\n .weekday {\r\n text-align: center;\r\n color: var(--rel-text-placeholder);\r\n padding: var(--rel-spacing-xs);\r\n text-transform: uppercase;\r\n font-family: var(--rel-body-sm-regular-font-family);\r\n font-weight: var(--rel-body-xs-medium-font-weight);\r\n font-size: var(--rel-body-sm-medium-font-size);\r\n line-height: var(--rel-body-sm-medium-line-height);\r\n letter-spacing: var(--rel-body-sm-medium-letter-spacing);\r\n }\r\n\r\n .day-button {\r\n aspect-ratio: 1;\r\n border: none;\r\n background: transparent;\r\n border-radius: var(--rel-border-radius-sm);\r\n color: var(--rel-text-default);\r\n cursor: pointer;\r\n position: relative;\r\n transition: all 0.15s ease;\r\n font-family: var(--rel-body-md-regular-font-family);\r\n font-weight: var(--rel-body-md-regular-font-weight);\r\n font-size: var(--rel-body-md-regular-font-size);\r\n line-height: var(--rel-body-md-regular-line-height);\r\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\r\n }\r\n\r\n .day-button:hover:not(:disabled):not(.selected) {\r\n background: var(--rel-bg-neutral-elevated-1);\r\n }\r\n\r\n /* Weekend (Figma Day of a week=Weekend): same color at 70% — full opacity when selected */\r\n .day-button.weekend:not(.selected) {\r\n opacity: 0.7;\r\n }\r\n\r\n .day-button:focus-visible {\r\n outline: 2px solid var(--rel-border-focus);\r\n outline-offset: -2px;\r\n z-index: 1;\r\n }\r\n\r\n .day-button.today:not(.selected) {\r\n border: 2px solid var(--rel-border-brand);\r\n }\r\n\r\n .day-button.selected {\r\n background: var(--rel-bg-neutral-inverse-2);\r\n color: var(--rel-text-inverse);\r\n font-weight: var(--rel-body-md-semibold-font-weight);\r\n }\r\n\r\n .day-button.other-month {\r\n color: var(--rel-text-placeholder);\r\n opacity: 0.5;\r\n }\r\n\r\n .day-button:disabled {\r\n color: var(--rel-text-disabled);\r\n cursor: not-allowed;\r\n opacity: 0.5;\r\n }\r\n\r\n .day-button:disabled:hover {\r\n background: transparent;\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) :host,\r\n :host-context(.dark) :host {\r\n background: var(--rel-bg-neutral);\r\n border-color: var(--rel-border-default);\r\n }\r\n `;\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n if (this.value) {\r\n const date = this.parseISODate(this.value);\r\n if (date) {\r\n this.viewYear = date.getFullYear();\r\n this.viewMonth = date.getMonth();\r\n }\r\n }\r\n }\r\n\r\n updated(changedProperties: Map<string, any>) {\r\n if (changedProperties.has(\"value\") && this.value) {\r\n const date = this.parseISODate(this.value);\r\n if (date) {\r\n this.viewYear = date.getFullYear();\r\n this.viewMonth = date.getMonth();\r\n }\r\n }\r\n }\r\n\r\n private parseISODate(iso: string): Date | null {\r\n const match = iso.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\r\n if (!match) return null;\r\n const [, year, month, day] = match;\r\n return new Date(parseInt(year), parseInt(month) - 1, parseInt(day));\r\n }\r\n\r\n private formatISODate(date: Date): string {\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\r\n const day = String(date.getDate()).padStart(2, \"0\");\r\n return `${year}-${month}-${day}`;\r\n }\r\n\r\n private isSameDay(date1: Date, date2: Date): boolean {\r\n return (\r\n date1.getFullYear() === date2.getFullYear() &&\r\n date1.getMonth() === date2.getMonth() &&\r\n date1.getDate() === date2.getDate()\r\n );\r\n }\r\n\r\n private isDateDisabledInternal(date: Date): boolean {\r\n if (this.disabled) return true;\r\n\r\n if (this.min) {\r\n const minDate = this.parseISODate(this.min);\r\n if (minDate && date < minDate) return true;\r\n }\r\n\r\n if (this.max) {\r\n const maxDate = this.parseISODate(this.max);\r\n if (maxDate && date > maxDate) return true;\r\n }\r\n\r\n if (this.isDateDisabled && this.isDateDisabled(date)) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private getCalendarDays(): CalendarDay[] {\r\n const days: CalendarDay[] = [];\r\n const firstDayOfMonth = new Date(this.viewYear, this.viewMonth, 1);\r\n const lastDayOfMonth = new Date(this.viewYear, this.viewMonth + 1, 0);\r\n const today = new Date();\r\n const selectedDate = this.value ? this.parseISODate(this.value) : null;\r\n\r\n let startDay = firstDayOfMonth.getDay();\r\n if (this.weekStart === \"mon\") {\r\n startDay = startDay === 0 ? 6 : startDay - 1;\r\n }\r\n\r\n // Leading days from previous month\r\n for (let i = startDay - 1; i >= 0; i--) {\r\n const date = new Date(this.viewYear, this.viewMonth, -i);\r\n days.push({\r\n date,\r\n day: date.getDate(),\r\n isCurrentMonth: false,\r\n isToday: this.isSameDay(date, today),\r\n isSelected: selectedDate ? this.isSameDay(date, selectedDate) : false,\r\n isDisabled: this.isDateDisabledInternal(date),\r\n isWeekend: date.getDay() === 0 || date.getDay() === 6,\r\n });\r\n }\r\n\r\n // Current month days\r\n for (let day = 1; day <= lastDayOfMonth.getDate(); day++) {\r\n const date = new Date(this.viewYear, this.viewMonth, day);\r\n days.push({\r\n date,\r\n day,\r\n isCurrentMonth: true,\r\n isToday: this.isSameDay(date, today),\r\n isSelected: selectedDate ? this.isSameDay(date, selectedDate) : false,\r\n isDisabled: this.isDateDisabledInternal(date),\r\n isWeekend: date.getDay() === 0 || date.getDay() === 6,\r\n });\r\n }\r\n\r\n // Trailing days from next month\r\n const remainingCells = 42 - days.length; // 6 weeks max\r\n for (let i = 1; i <= remainingCells; i++) {\r\n const date = new Date(this.viewYear, this.viewMonth + 1, i);\r\n days.push({\r\n date,\r\n day: date.getDate(),\r\n isCurrentMonth: false,\r\n isToday: this.isSameDay(date, today),\r\n isSelected: selectedDate ? this.isSameDay(date, selectedDate) : false,\r\n isDisabled: this.isDateDisabledInternal(date),\r\n isWeekend: date.getDay() === 0 || date.getDay() === 6,\r\n });\r\n }\r\n\r\n return days;\r\n }\r\n\r\n private getWeekdayLabels(): string[] {\r\n const formatter = new Intl.DateTimeFormat(this.locale, { weekday: \"short\" });\r\n const days = [];\r\n const baseDate = new Date(2024, 0, 7); // Sunday, Jan 7, 2024\r\n\r\n for (let i = 0; i < 7; i++) {\r\n const offset = this.weekStart === \"mon\" ? i + 1 : i;\r\n const date = new Date(baseDate);\r\n date.setDate(baseDate.getDate() + offset);\r\n days.push(formatter.format(date).substring(0, 2));\r\n }\r\n\r\n return days;\r\n }\r\n\r\n private getMonthName(): string {\r\n const formatter = new Intl.DateTimeFormat(this.locale, { month: \"long\" });\r\n return formatter.format(new Date(this.viewYear, this.viewMonth, 1));\r\n }\r\n\r\n private previousMonth() {\r\n if (this.viewMonth === 0) {\r\n this.viewMonth = 11;\r\n this.viewYear--;\r\n } else {\r\n this.viewMonth--;\r\n }\r\n }\r\n\r\n private nextMonth() {\r\n if (this.viewMonth === 11) {\r\n this.viewMonth = 0;\r\n this.viewYear++;\r\n } else {\r\n this.viewMonth++;\r\n }\r\n }\r\n\r\n private selectDay(day: CalendarDay) {\r\n if (day.isDisabled || this.disabled) return;\r\n\r\n const newValue = this.formatISODate(day.date);\r\n this.value = newValue;\r\n this.focusedDate = day.date;\r\n\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-change\", {\r\n detail: {\r\n value: newValue,\r\n date: new Date(day.date),\r\n },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private handleKeyDown(e: KeyboardEvent, day: CalendarDay, index: number) {\r\n const days = this.getCalendarDays();\r\n let targetIndex = index;\r\n\r\n switch (e.key) {\r\n case \"ArrowLeft\":\r\n e.preventDefault();\r\n targetIndex = index - 1;\r\n break;\r\n case \"ArrowRight\":\r\n e.preventDefault();\r\n targetIndex = index + 1;\r\n break;\r\n case \"ArrowUp\":\r\n e.preventDefault();\r\n targetIndex = index - 7;\r\n break;\r\n case \"ArrowDown\":\r\n e.preventDefault();\r\n targetIndex = index + 7;\r\n break;\r\n case \"Home\":\r\n e.preventDefault();\r\n targetIndex = index - (index % 7);\r\n break;\r\n case \"End\":\r\n e.preventDefault();\r\n targetIndex = index - (index % 7) + 6;\r\n break;\r\n case \"PageUp\":\r\n e.preventDefault();\r\n if (e.shiftKey) {\r\n this.viewYear--;\r\n } else {\r\n this.previousMonth();\r\n }\r\n return;\r\n case \"PageDown\":\r\n e.preventDefault();\r\n if (e.shiftKey) {\r\n this.viewYear++;\r\n } else {\r\n this.nextMonth();\r\n }\r\n return;\r\n case \"Enter\":\r\n case \" \":\r\n e.preventDefault();\r\n this.selectDay(day);\r\n return;\r\n default:\r\n return;\r\n }\r\n\r\n if (targetIndex >= 0 && targetIndex < days.length) {\r\n const targetDay = days[targetIndex];\r\n if (!targetDay.isCurrentMonth) {\r\n if (targetIndex < index) {\r\n this.previousMonth();\r\n } else {\r\n this.nextMonth();\r\n }\r\n }\r\n this.focusedDate = targetDay.date;\r\n this.requestUpdate();\r\n this.updateComplete.then(() => {\r\n const buttons = this.shadowRoot?.querySelectorAll(\".day-button\");\r\n if (buttons && buttons[targetIndex]) {\r\n (buttons[targetIndex] as HTMLButtonElement).focus();\r\n }\r\n });\r\n }\r\n }\r\n\r\n render() {\r\n const days = this.getCalendarDays();\r\n const weekdayLabels = this.getWeekdayLabels();\r\n\r\n return html`\r\n <div role=\"grid\" aria-label=\"Calendar\">\r\n <div part=\"header\" class=\"header\">\r\n <button\r\n part=\"action\" class=\"nav-button\"\r\n @click=${this.previousMonth}\r\n aria-label=\"Previous month\"\r\n ?disabled=${this.disabled}\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M10 12L6 8L10 4\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </button>\r\n\r\n <div part=\"label\" class=\"header-center\">\r\n <span>${this.getMonthName()}</span>\r\n <span>${this.viewYear}</span>\r\n </div>\r\n\r\n <button\r\n part=\"action\" class=\"nav-button\"\r\n @click=${this.nextMonth}\r\n aria-label=\"Next month\"\r\n ?disabled=${this.disabled}\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M6 4L10 8L6 12\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <div part=\"list\" class=\"calendar-grid\" role=\"row\">\r\n ${weekdayLabels.map(\r\n (label) => html`\r\n <div part=\"label\" class=\"weekday\" role=\"columnheader\" aria-label=\"${label}\">\r\n ${label}\r\n </div>\r\n `\r\n )}\r\n </div>\r\n\r\n <div part=\"list\" class=\"calendar-grid\">\r\n ${days.map(\r\n (day, index) => html`\r\n <button\r\n part=\"item\" class=\"day-button ${day.isSelected ? \"selected\" : \"\"} ${day.isToday\r\n ? \"today\"\r\n : \"\"} ${!day.isCurrentMonth ? \"other-month\" : \"\"} ${day.isWeekend ? \"weekend\" : \"\"}\"\r\n role=\"gridcell\"\r\n aria-label=\"${this.formatISODate(day.date)}\"\r\n aria-selected=\"${day.isSelected}\"\r\n ?disabled=${day.isDisabled}\r\n @click=${() => this.selectDay(day)}\r\n @keydown=${(e: KeyboardEvent) => this.handleKeyDown(e, day, index)}\r\n tabindex=\"${day.isSelected || (index === 0 && !this.focusedDate) ? 0 : -1}\"\r\n >\r\n ${day.day}\r\n </button>\r\n `\r\n )}\r\n </div>\r\n </div>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css, nothing } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\n\n@customElement(\"rel-card\")\nexport class RelCard extends LitElement {\n /**\n * Figma \"Type\" axis: custom (default) renders slotted content with card\n * padding; media adds a flush media region (slot name=\"media\") above the\n * content — pair it with <rel-card-media>.\n */\n @property({ type: String, reflect: true })\n type: \"custom\" | \"media\" = \"custom\";\n\n static styles = css`\n :host {\n color: var(--rel-text-default);\n display: block;\n font-family: var(--rel-body-lg-regular-font-family);\n }\n\n /* Default typography for slotted card content (Figma card roles) */\n ::slotted(h1), ::slotted(h2), ::slotted(h3), ::slotted(h4) {\n font-family: var(--rel-headings-md-font-family);\n font-weight: var(--rel-headings-md-font-weight);\n font-size: var(--rel-headings-md-font-size);\n line-height: var(--rel-headings-md-line-height);\n letter-spacing: var(--rel-headings-md-letter-spacing);\n color: var(--rel-text-default);\n margin: 0 0 var(--rel-spacing-2xs) 0;\n }\n\n ::slotted(p) {\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 color: var(--rel-text-body);\n margin: 0 0 var(--rel-spacing-xs) 0;\n }\n\n .card {\n background-color: var(--rel-bg-surface);\n color: var(--rel-text-default);\n border-radius: var(--rel-border-radius-sm);\n border: 1px solid var(--rel-border-default);\n padding: var(--rel-spacing-lg) var(--rel-spacing-md);\n }\n\n /* Media type: media sits flush against the card edges, content keeps padding */\n :host([type=\"media\"]) .card {\n padding: 0;\n overflow: hidden;\n }\n\n .media {\n display: block;\n }\n\n .media ::slotted(*) {\n display: block;\n width: 100%;\n }\n\n :host([type=\"media\"]) .content {\n padding: var(--rel-spacing-lg) var(--rel-spacing-md);\n }\n\n :host-context([data-theme=\"dark\"]) .card,\n :host-context(.dark) .card {\n background-color: var(--rel-bg-surface);\n border-color: var(--rel-border-default);\n }\n `;\n\n render() {\n return html`\n <div part=\"base\" class=\"card\">\n ${this.type === \"media\"\n ? html`<div part=\"header\" class=\"media\"><slot name=\"media\"></slot></div>`\n : nothing}\n <div part=\"content\" class=\"content\">\n <slot></slot>\n </div>\n </div>\n `;\n }\n}\n","import { LitElement, html, css, nothing } from \"lit\";\nimport { customElement, property, state, query } from \"lit/decorators.js\";\n\n@customElement(\"rel-carousel\")\nexport class RelCarousel extends LitElement {\n @property({ type: Number, reflect: true }) value = 0;\n @property({ type: Boolean }) loop = false;\n @property({ type: Boolean }) autoplay = false;\n @property({ type: Number }) interval = 5000;\n @property({ type: Boolean, attribute: \"pause-on-hover\" }) pauseOnHover = true;\n @property({ type: Boolean, attribute: \"show-buttons\" }) showButtons = false;\n @property({ type: Boolean, attribute: \"show-dots\" }) showDots = false;\n\n /**\n * Figma \"Type\" axis. When set it drives which controls render:\n * default = content only · only-indicators = dots · side-arrows = overlaid\n * arrows + dots · bottom-arrows = dots flanked by arrows below the slide.\n * When unset, the legacy show-buttons/show-dots booleans apply unchanged.\n */\n @property({ type: String, reflect: true })\n type?: \"default\" | \"only-indicators\" | \"side-arrows\" | \"bottom-arrows\";\n\n @property({ type: String, reflect: true }) orientation: \"horizontal\" | \"vertical\" = \"horizontal\";\n @property({ type: String }) label: string = \"Carousel\";\n @property({ type: Number }) gap?: number;\n @property({ type: Boolean, reflect: true }) disabled = false;\n\n @state() private slideCount = 0;\n @state() private isDragging = false;\n @state() private dragStartX = 0;\n @state() private currentTranslate = 0;\n @state() private prevTranslate = 0;\n\n @query(\".viewport\") private viewport?: HTMLElement;\n @query(\".track\") private track?: HTMLElement;\n @query(\"slot\") private slotElement?: HTMLSlotElement;\n\n private autoplayTimer?: number;\n private animationId?: number;\n private prefersReducedMotion = false;\n // Number of clone slides prepended before the real slides\n private clonesBefore = 0;\n private _silentJumping = false;\n private _ro?: ResizeObserver;\n\n static styles = css`\n :host {\n color: var(--rel-text-default);\n display: block;\n font-family: var(--rel-fonts-font-family);\n position: relative;\n user-select: none;\n }\n\n :host([disabled]) {\n opacity: 0.6;\n pointer-events: none;\n cursor: not-allowed;\n }\n\n .viewport {\n overflow: hidden;\n position: relative;\n width: 100%;\n display: block;\n }\n\n .track {\n display: flex;\n width: 100%;\n transition: transform 0.3s ease-out;\n will-change: transform;\n }\n\n /* Vertical orientation: column track inside a fixed-height viewport */\n :host([orientation=\"vertical\"]) .viewport {\n height: var(--rel-carousel-height, 320px);\n }\n\n :host([orientation=\"vertical\"]) .track {\n flex-direction: column;\n height: 100%;\n }\n\n :host([orientation=\"vertical\"]) ::slotted(*) {\n width: 100% !important;\n height: var(--rel-carousel-slide-height, 100%) !important;\n }\n\n .track.dragging {\n transition: none;\n }\n\n .track.no-transition {\n transition: none;\n }\n\n ::slotted(*) {\n flex-shrink: 0 !important;\n width: var(--rel-carousel-slide-width, 100%) !important;\n min-width: 0 !important;\n box-sizing: border-box !important;\n }\n\n /* Clone slides injected for seamless loop */\n .carousel-clone {\n flex: 0 0 100%;\n min-width: 0;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--rel-bg-neutral-elevated-1);\n }\n\n /* Default typography for slotted slide captions (Figma roles) */\n ::slotted(h1), ::slotted(h2), ::slotted(h3), ::slotted(h4) {\n font-family: var(--rel-headings-sm-font-family);\n font-weight: var(--rel-headings-sm-font-weight);\n font-size: var(--rel-headings-xs-font-size);\n line-height: var(--rel-headings-xs-line-height);\n letter-spacing: var(--rel-headings-xs-letter-spacing);\n margin: 0 0 var(--rel-spacing-2xs) 0;\n }\n\n ::slotted(p) {\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-body);\n margin: 0 0 var(--rel-spacing-lg) 0;\n }\n\n \n /* Navigation buttons */\n .nav-button {\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n z-index: 10;\n width: var(--rel-carousel-nav-size, 40px);\n height: var(--rel-carousel-nav-size, 40px);\n border-radius: 50%;\n border: 1px solid var(--rel-border-default);\n background: var(--rel-bg-neutral);\n color: var(--rel-action-neutral-label-icons-ghost);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.15s ease;\n box-shadow: var(--rel-shadows-shadow-100);\n }\n\n .nav-button:hover:not(:disabled) {\n background: var(--rel-bg-surface-elevated);\n }\n\n .nav-button:focus-visible {\n outline: 2px solid var(--rel-border-focus);\n outline-offset: 2px;\n }\n\n .nav-button:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n\n .nav-button.prev {\n left: var(--rel-spacing-sm);\n }\n\n .nav-button.next {\n right: var(--rel-spacing-sm);\n }\n\n /* Bottom arrows (Figma Type=Bottom Arrows): inline with the dots row */\n .dots .nav-button {\n position: static;\n transform: none;\n width: 32px;\n height: 32px;\n box-shadow: none;\n }\n\n .nav-button svg {\n width: 20px;\n height: 20px;\n }\n\n /* Dots indicator */\n .dots {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--rel-spacing-xs);\n margin-top: var(--rel-spacing-md);\n }\n\n .dot {\n width: var(--rel-carousel-dot-size, 8px);\n height: var(--rel-carousel-dot-size, 8px);\n border-radius: 50%;\n border: none;\n background: var(--rel-bg-neutral-elevated-2);\n cursor: pointer;\n padding: 0;\n transition: all 0.15s ease;\n }\n\n .dot:hover {\n background: var(--rel-bg-neutral-elevated-2);\n }\n\n .dot.active {\n background: var(--rel-bg-surface-brand);\n width: var(--rel-carousel-dot-size-active, 24px);\n border-radius: var(--rel-border-radius-xs);\n }\n\n .dot:focus-visible {\n outline: 2px solid var(--rel-border-focus);\n outline-offset: 2px;\n }\n\n /* Reduced motion support */\n @media (prefers-reduced-motion: reduce) {\n .track {\n transition: none;\n }\n }\n\n :host-context([data-theme=\"dark\"]) .nav-button,\n :host-context(.dark) .nav-button {\n background: var(--rel-bg-surface-elevated);\n border-color: var(--rel-border-default);\n color: var(--rel-text-default);\n }\n\n :host-context([data-theme=\"dark\"]) .nav-button:hover,\n :host-context(.dark) .nav-button:hover {\n background: var(--rel-bg-neutral-elevated-1);\n }\n `;\n\n connectedCallback() {\n super.connectedCallback();\n this.prefersReducedMotion = window.matchMedia(\n \"(prefers-reduced-motion: reduce)\"\n ).matches;\n\n if (this.autoplay) {\n this.startAutoplay();\n }\n }\n\n firstUpdated() {\n const ro = new ResizeObserver(() => {\n const w = this.viewport?.offsetWidth ?? 0;\n const h = this.viewport?.offsetHeight ?? 0;\n if (w === 0 && h === 0) return;\n this.style.setProperty('--rel-carousel-slide-width', `${w}px`);\n this.style.setProperty('--rel-carousel-slide-height', `${h}px`);\n this.renderRoot.querySelectorAll('.carousel-clone').forEach(el => {\n if (this.vertical) (el as HTMLElement).style.height = `${h}px`;\n else (el as HTMLElement).style.width = `${w}px`;\n });\n this.updateTransform();\n });\n if (this.viewport) ro.observe(this.viewport);\n this._ro = ro;\n\n requestAnimationFrame(() => {\n const w = this.viewport?.offsetWidth ?? 0;\n const h = this.viewport?.offsetHeight ?? 0;\n if (w > 0 || h > 0) {\n this.style.setProperty('--rel-carousel-slide-width', `${w}px`);\n this.style.setProperty('--rel-carousel-slide-height', `${h}px`);\n this.updateTransform();\n }\n });\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this._ro?.disconnect();\n this.stopAutoplay();\n if (this.animationId) {\n cancelAnimationFrame(this.animationId);\n }\n }\n\n private handleSlotChange() {\n const slot = this.slotElement;\n const track = this.track;\n if (!slot || !track) return;\n\n const elements = slot.assignedElements();\n this.slideCount = elements.length;\n\n // Clamp value to valid real-slide range\n if (this.value >= this.slideCount) this.value = Math.max(0, this.slideCount - 1);\n if (this.value < 0) this.value = 0;\n\n // Remove any existing shadow-DOM clones\n track.querySelectorAll(\".carousel-clone\").forEach((el) => el.remove());\n\n const useClones = (this.loop || this.autoplay) && this.slideCount > 1;\n\n if (useClones) {\n this.clonesBefore = 1;\n\n const sizeClone = (clone: HTMLElement) => {\n if (this.vertical) clone.style.height = `${this.viewport?.offsetHeight ?? 0}px`;\n else clone.style.width = `${this.viewport?.offsetWidth ?? 0}px`;\n clone.style.boxSizing = 'border-box';\n };\n\n // Clone last slide → prepend before <slot>\n const lastEl = elements[this.slideCount - 1] as HTMLElement;\n const lastClone = lastEl.cloneNode(true) as HTMLElement;\n lastClone.classList.add(\"carousel-clone\");\n lastClone.setAttribute(\"aria-hidden\", \"true\");\n sizeClone(lastClone);\n track.insertBefore(lastClone, slot);\n\n // Clone first slide → append after <slot>\n const firstEl = elements[0] as HTMLElement;\n const firstClone = firstEl.cloneNode(true) as HTMLElement;\n firstClone.classList.add(\"carousel-clone\");\n firstClone.setAttribute(\"aria-hidden\", \"true\");\n sizeClone(firstClone);\n track.appendChild(firstClone);\n } else {\n this.clonesBefore = 0;\n }\n\n requestAnimationFrame(() => this.updateTransform());\n\n // If loop/autoplay clones were inserted but viewport has no width yet,\n // retry once after paint when dimensions are available\n if (useClones && this.unit() === 0) {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n this.handleSlotChange();\n });\n });\n }\n }\n\n private get vertical(): boolean {\n return this.orientation === \"vertical\";\n }\n\n /** Translate along the orientation axis. */\n private axisTransform(px: number): string {\n return this.vertical ? `translateY(${px}px)` : `translateX(${px}px)`;\n }\n\n private unit(): number {\n const slideSize = (this.vertical ? this.viewport?.offsetHeight : this.viewport?.offsetWidth) ?? 0;\n const gapValue = this.gap && this.gap > 0 ? this.gap : 0;\n return slideSize + gapValue;\n }\n\n private updateTransform() {\n if (!this.track || !this.viewport) return;\n\n const u = this.unit();\n const translate = -((this.value + this.clonesBefore) * u);\n\n this.currentTranslate = translate;\n this.prevTranslate = translate;\n this.track.style.transform = this.axisTransform(translate);\n this.track.style.gap = this.gap && this.gap > 0 ? `${this.gap}px` : \"\";\n }\n\n private goToPrevious() {\n if (this.disabled) return;\n\n if (this.value > 0) {\n this.value--;\n this.updateTransform();\n this.emitChange();\n } else if (this.clonesBefore > 0) {\n // Animate to the lastClone (position 0 in the track)\n const translate = 0;\n this.currentTranslate = translate;\n this.prevTranslate = translate;\n this.track!.style.transform = this.axisTransform(translate);\n this.track!.addEventListener(\n \"transitionend\",\n () => this.silentJump(this.slideCount - 1),\n { once: true }\n );\n }\n }\n\n private goToNext() {\n if (this.disabled) return;\n\n if (this.value < this.slideCount - 1) {\n this.value++;\n this.updateTransform();\n this.emitChange();\n } else if (this.clonesBefore > 0) {\n // Animate to the firstClone (one position past the last real slide)\n const cloneFirstPos = this.slideCount + this.clonesBefore;\n const translate = -(cloneFirstPos * this.unit());\n this.currentTranslate = translate;\n this.prevTranslate = translate;\n this.track!.style.transform = this.axisTransform(translate);\n this.track!.addEventListener(\n \"transitionend\",\n () => this.silentJump(0),\n { once: true }\n );\n }\n }\n\n // Silently reposition to newValue with no visible transition, then re-enable animation.\n private silentJump(newValue: number) {\n if (!this.track) return;\n this.track.classList.add(\"no-transition\");\n this._silentJumping = true;\n this.value = newValue;\n this.updateTransform();\n this._silentJumping = false;\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n this.track!.classList.remove(\"no-transition\");\n });\n });\n this.emitChange();\n }\n\n private goToSlide(index: number) {\n if (this.disabled || index < 0 || index >= this.slideCount) return;\n\n this.value = index;\n this.updateTransform();\n this.emitChange();\n }\n\n private emitChange() {\n this.dispatchEvent(\n new CustomEvent(\"rel-change\", {\n detail: { value: this.value },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private startAutoplay() {\n if (!this.autoplay || this.disabled) return;\n\n this.stopAutoplay();\n this.autoplayTimer = window.setInterval(() => {\n this.goToNext();\n }, this.interval);\n }\n\n private stopAutoplay() {\n if (this.autoplayTimer) {\n clearInterval(this.autoplayTimer);\n this.autoplayTimer = undefined;\n }\n }\n\n private handlePointerDown(e: PointerEvent) {\n if (this.disabled || !this.track) return;\n\n this.isDragging = true;\n this.dragStartX = this.vertical ? e.clientY : e.clientX;\n this.prevTranslate = this.currentTranslate;\n\n this.track.classList.add(\"dragging\");\n\n if (this.autoplay && this.pauseOnHover) {\n this.stopAutoplay();\n }\n\n e.preventDefault();\n }\n\n private handlePointerMove(e: PointerEvent) {\n if (!this.isDragging || !this.track) return;\n\n const current = this.vertical ? e.clientY : e.clientX;\n const delta = current - this.dragStartX;\n this.currentTranslate = this.prevTranslate + delta;\n\n if (!this.prefersReducedMotion && this.animationId) {\n cancelAnimationFrame(this.animationId);\n }\n\n this.animationId = requestAnimationFrame(() => {\n if (this.track) {\n this.track.style.transform = this.axisTransform(this.currentTranslate);\n }\n });\n }\n\n private handlePointerUp(e: PointerEvent) {\n if (!this.isDragging || !this.track || !this.viewport) return;\n\n this.isDragging = false;\n this.track.classList.remove(\"dragging\");\n\n const delta = (this.vertical ? e.clientY : e.clientX) - this.dragStartX;\n const slideSize = this.vertical ? this.viewport.offsetHeight : this.viewport.offsetWidth;\n const threshold = slideSize * 0.2; // 20% threshold\n\n if (Math.abs(delta) > threshold) {\n if (delta > 0 && (this.value > 0 || this.clonesBefore > 0)) {\n this.goToPrevious();\n } else if (delta < 0 && (this.value < this.slideCount - 1 || this.clonesBefore > 0)) {\n this.goToNext();\n } else {\n this.updateTransform();\n }\n } else {\n this.updateTransform();\n }\n\n if (this.autoplay) {\n this.startAutoplay();\n }\n }\n\n private handleKeyDown(e: KeyboardEvent) {\n if (this.disabled) return;\n\n switch (e.key) {\n case \"ArrowLeft\":\n case \"ArrowUp\":\n e.preventDefault();\n this.goToPrevious();\n break;\n case \"ArrowRight\":\n case \"ArrowDown\":\n e.preventDefault();\n this.goToNext();\n break;\n case \"Home\":\n e.preventDefault();\n this.goToSlide(0);\n break;\n case \"End\":\n e.preventDefault();\n this.goToSlide(this.slideCount - 1);\n break;\n }\n }\n\n private handleMouseEnter() {\n if (this.autoplay && this.pauseOnHover) {\n this.stopAutoplay();\n }\n }\n\n private handleMouseLeave() {\n if (this.autoplay && this.pauseOnHover) {\n this.startAutoplay();\n }\n }\n\n updated(changedProperties: Map<string, any>) {\n if (changedProperties.has(\"autoplay\") || changedProperties.has(\"interval\")) {\n if (this.autoplay) {\n this.startAutoplay();\n } else {\n this.stopAutoplay();\n }\n }\n\n // Only call updateTransform via Lit lifecycle for in-range values;\n // out-of-range transitions (clone positions) are managed directly.\n // Skip when _silentJumping — silentJump() calls updateTransform() itself.\n if (changedProperties.has(\"value\") && !this._silentJumping && this.value >= 0 && this.value < this.slideCount) {\n this.updateTransform();\n }\n }\n\n /** Where nav arrows render, honouring the Figma type when set. */\n private get buttonPlacement(): \"side\" | \"bottom\" | \"none\" {\n if (this.type === \"side-arrows\") return \"side\";\n if (this.type === \"bottom-arrows\") return \"bottom\";\n if (this.type === \"only-indicators\" || this.type === \"default\") return \"none\";\n return this.showButtons ? \"side\" : \"none\";\n }\n\n private get dotsVisible(): boolean {\n if (this.type === \"default\") return false;\n if (this.type) return true;\n return this.showDots;\n }\n\n private renderNavButton(direction: \"prev\" | \"next\", enabled: boolean) {\n const path = direction === \"prev\" ? \"M10 12L6 8L10 4\" : \"M6 4L10 8L6 12\";\n return html`\n <button\n class=\"nav-button ${direction}\"\n part=\"${direction}-button\"\n aria-label=\"${direction === \"prev\" ? \"Previous\" : \"Next\"} slide\"\n ?disabled=${!enabled || this.disabled}\n @click=${direction === \"prev\" ? this.goToPrevious : this.goToNext}\n >\n <svg viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"${path}\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n `;\n }\n\n render() {\n const canGoPrev = this.clonesBefore > 0 || this.value > 0;\n const canGoNext = this.clonesBefore > 0 || this.value < this.slideCount - 1;\n\n return html`\n <div\n class=\"viewport\"\n part=\"viewport\"\n role=\"region\"\n aria-roledescription=\"carousel\"\n aria-label=${this.label}\n @keydown=${this.handleKeyDown}\n @mouseenter=${this.handleMouseEnter}\n @mouseleave=${this.handleMouseLeave}\n tabindex=\"0\"\n >\n <div\n class=\"track\"\n part=\"track\"\n @pointerdown=${this.handlePointerDown}\n @pointermove=${this.handlePointerMove}\n @pointerup=${this.handlePointerUp}\n @pointercancel=${this.handlePointerUp}\n >\n <slot @slotchange=${this.handleSlotChange}></slot>\n </div>\n\n ${this.buttonPlacement === \"side\"\n ? html`\n ${this.renderNavButton(\"prev\", canGoPrev)}\n ${this.renderNavButton(\"next\", canGoNext)}\n `\n : nothing}\n </div>\n\n ${(this.dotsVisible || this.buttonPlacement === \"bottom\") && this.slideCount > 1\n ? html`\n <div class=\"dots\" part=\"dots\">\n ${this.buttonPlacement === \"bottom\" ? this.renderNavButton(\"prev\", canGoPrev) : nothing}\n ${this.dotsVisible\n ? Array.from({ length: this.slideCount }, (_, i) => html`\n <button\n class=\"dot ${i === this.value ? \"active\" : \"\"}\"\n part=\"dot\"\n aria-label=\"Go to slide ${i + 1}\"\n @click=${() => this.goToSlide(i)}\n ></button>\n `)\n : nothing}\n ${this.buttonPlacement === \"bottom\" ? this.renderNavButton(\"next\", canGoNext) : nothing}\n </div>\n `\n : nothing}\n `;\n }\n}\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\r\n@customElement(\"rel-card-media\")\r\nexport class RelCardMedia extends LitElement {\r\n @property({ type: String, attribute: \"image-src\" }) imageSrc = \"\";\r\n @property({ type: String, attribute: \"image-alt\" }) imageAlt = \"Card image\";\r\n @property({ type: String }) title = \"\";\r\n @property({ type: String }) subtitle = \"\";\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n display: block;\r\n font-family: var(--rel-fonts-font-family, sans-serif);\r\n }\r\n\r\n .card-media {\r\n background-color: var(--rel-bg-surface);\r\n color: var(--rel-text-default);\r\n border-radius: var(--rel-border-radius-sm);\r\n border: 1px solid var(--rel-border-default);\r\n overflow: hidden;\r\n }\r\n\r\n .card-image img {\r\n display: block;\r\n width: 100%;\r\n height: auto;\r\n object-fit: cover;\r\n }\r\n\r\n .card-content {\r\n padding: var(--rel-spacing-md);\r\n }\r\n\r\n .card-content h3 {\r\n margin: 0 0 4px 0;\r\r\r\n color: var(--rel-text-label);\n font-family: var(--rel-body-md-semibold-font-family);\n font-weight: var(--rel-body-md-semibold-font-weight);\n font-size: var(--rel-body-md-semibold-font-size);\n line-height: var(--rel-body-md-semibold-line-height);\n letter-spacing: var(--rel-body-md-semibold-letter-spacing);\n }\r\n\r\n .card-content p {\r\n margin: 0 0 8px 0;\r\r\n color: var(--rel-text-default);\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 }\r\n\r\n :host-context([data-theme=\"dark\"]) .card-media,\r\n :host-context(.dark) .card-media {\r\n background-color: var(--rel-bg-surface);\r\n border-color: var(--rel-border-default);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .card-content h3,\r\n :host-context(.dark) .card-content h3 {\r\n color: var(--rel-text-label);\r\n }\r\n `;\r\n\r\n render() {\r\n return html`\r\n <div part=\"base\" class=\"card-media\">\r\n ${this.imageSrc\r\n ? html`\r\n <div part=\"icon\" class=\"card-image\">\r\n <img src=${this.imageSrc} alt=${this.imageAlt} />\r\n </div>\r\n `\r\n : null}\r\n\r\n <div part=\"content\" class=\"card-content\">\r\n ${this.title ? html`<h3>${this.title}</h3>` : null}\r\n ${this.subtitle ? html`<p>${this.subtitle}</p>` : null}\r\n <slot></slot>\r\n </div>\r\n </div>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\nimport \"@reliability-design/icons/rel-icon\";\r\n\r\ntype CheckboxState = \"default\" | \"error\" | \"disabled\";\r\ntype CheckboxStatus = \"unchecked\" | \"checked\" | \"indeterminate\";\r\n\r\n@customElement(\"rel-checkbox\")\r\nexport class RelCheckbox extends LitElement {\r\n @property({ type: String }) label = \"Label\";\r\n /** rel-icon name rendered between the checkbox and the label (label prefix icon). */\r\n @property({ type: String }) icon = \"\";\r\n @property({ type: String }) supportingtext = \"\";\r\n @property({ type: String }) state: CheckboxState = \"default\";\r\n @property({ type: String }) status: CheckboxStatus = \"unchecked\";\r\n @property({ type: String }) value = \"\";\r\n\r\n get checked(): boolean {\r\n return this.status === \"checked\";\r\n }\r\n set checked(val: boolean) {\r\n this.status = val ? \"checked\" : \"unchecked\";\r\n }\r\n\r\n private _onChange: (value: boolean) => void = () => {};\r\n private _onTouched: () => void = () => {};\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n display: block;\r\n font-family: var(--rel-fonts-font-family);\r\n }\r\n\r\n .wrapper {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--rel-spacing-3xs);\r\n }\r\n\r\n .row {\r\n /* Containing block for the hidden input below — without this the\r\n absolutely-positioned input resolves against the document (or any\r\n positioned ancestor in the consumer page), where it neither moves\r\n with intermediate scroll containers nor stays aligned with the\r\n visible box. Tabbing to it then makes the browser scroll the WRONG\r\n scroller (often the window past a 100vh overflow-hidden shell),\r\n shoving the whole page up and leaving it in a broken state. */\r\n position: relative;\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-xs);\r\n cursor: pointer;\r\n }\r\n\r\n input {\r\n position: absolute;\r\n inset: 0;\r\n width: 100%;\r\n height: 100%;\r\n margin: 0;\r\n opacity: 0;\r\n pointer-events: none;\r\n }\r\n\r\n /* Unchecked — transparent fill, gray border */\r\n .box {\r\n width: 18px;\r\n height: 18px;\r\n border-radius: 4px;\r\n border: 2px solid var(--rel-text-default);\r\n background: transparent;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n transition: all 0.2s;\r\n flex-shrink: 0;\r\n }\r\n\r\n input:focus-visible + .box {\r\n outline: 2px solid var(--rel-border-focus);\r\n outline-offset: 2px;\r\n }\r\n\r\n svg {\r\n width: 12px;\r\n height: 12px;\r\n display: none;\r\n }\r\n\r\n /* Checked — filled box, transparent checkmark (bg shows through) */\r\n .checked .box {\r\n background: var(--rel-bg-neutral-inverse-2);\r\n border-color: var(--rel-bg-neutral-inverse-2);\r\n }\r\n\r\n .checked .check-icon {\r\n display: block;\r\n fill: var(--rel-text-inverse);\r\n }\r\n\r\n /* Indeterminate — transparent fill, dash inherits border color */\r\n .indeterminate .indeterminate-icon {\r\n display: block;\r\n fill: var(--rel-bg-neutral-inverse-2);\r\n }\r\n\r\n /* Error unchecked — transparent fill, error border */\r\n .error .box {\r\n border-color: var(--rel-border-danger);\r\n }\r\n\r\n /* Error checked — error fill, transparent checkmark */\r\n .error.checked .box {\r\n background: var(--rel-action-danger-fill);\r\n border-color: var(--rel-action-danger-fill);\r\n }\r\n\r\n .error.checked .check-icon {\r\n fill: var(--rel-action-danger-label-icons-fill);\r\n }\r\n\r\n /* Error indeterminate — transparent fill, dash is error color */\r\n .error.indeterminate .indeterminate-icon {\r\n fill: var(--rel-text-danger);\r\n }\r\n\r\n /* Hover (Figma State=Hover): box outline/fill and label shift text-default -> text-body.\r\n Scoped to .default so error keeps its danger colors and disabled never hovers. */\r\n .default .row:hover .box {\r\n border-color: var(--rel-text-body);\r\n }\r\n\r\n .default .row:hover .label {\r\n color: var(--rel-text-body);\r\n }\r\n\r\n .default.checked .row:hover .box {\r\n background: var(--rel-text-body);\r\n border-color: var(--rel-text-body);\r\n }\r\n\r\n .default.indeterminate .row:hover .indeterminate-icon {\r\n fill: var(--rel-text-body);\r\n }\r\n\r\n .disabled {\r\n opacity: 0.55;\r\n cursor: not-allowed;\r\n }\r\n\r\n :host([state=\"disabled\"]) {\r\n cursor: not-allowed;\r\n }\r\n\r\n :host([state=\"disabled\"]) * {\r\n pointer-events: none;\r\n }\r\n\r\n .disabled .label,\r\n .disabled .text {\r\n color: var(--rel-text-disabled);\r\n }\r\n\r\n /* Optional label prefix icon — tracks the label's color in every state\r\n (rel-icon inherits currentColor). */\r\n .icon-prefix {\r\n flex-shrink: 0;\r\n color: var(--rel-text-default);\r\n }\r\n\r\n .default .row:hover .icon-prefix {\r\n color: var(--rel-text-body);\r\n }\r\n\r\n .disabled .icon-prefix {\r\n color: var(--rel-text-disabled);\r\n }\r\n\r\n .label {\r\n /* Figma: label rests on text-default; text-body is the hover color */\r\n color: var(--rel-text-default);\r\n\r\n font-family: var(--rel-body-lg-regular-font-family);\r\n\r\n font-weight: var(--rel-body-lg-regular-font-weight);\r\n\r\n font-size: var(--rel-body-lg-regular-font-size);\r\n\r\n line-height: var(--rel-body-lg-regular-line-height);\r\n\r\n letter-spacing: var(--rel-body-lg-regular-letter-spacing);\r\n\r\n }\r\n\r\n .text {\r\n color: var(--rel-text-caption);\r\n padding-left: 28px;\r\n\r\n font-family: var(--rel-body-sm-regular-font-family);\r\n\r\n font-weight: var(--rel-body-sm-regular-font-weight);\r\n\r\n font-size: var(--rel-body-sm-regular-font-size);\r\n\r\n line-height: var(--rel-body-sm-regular-line-height);\r\n\r\n letter-spacing: var(--rel-body-sm-regular-letter-spacing);\r\n\r\n }\r\n `;\r\n\r\n private toggle() {\r\n if (this.state === \"disabled\") return;\r\n\r\n // Binary toggle — indeterminate is programmatic-only and resolves to checked on user toggle.\r\n this.status = this.status === \"checked\" ? \"unchecked\" : \"checked\";\r\n\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-change\", {\r\n detail: {\r\n checked: this.status === \"checked\",\r\n value: this.value,\r\n },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n this._onChange(this.checked);\r\n }\r\n\r\n registerOnChange(fn: (value: boolean) => void): void { this._onChange = fn; }\r\n registerOnTouched(fn: () => void): void { this._onTouched = fn; }\r\n writeValue(checked: boolean): void { this.checked = checked; }\r\n\r\n render() {\r\n return html`\r\n <div part=\"base\" class=\"wrapper ${this.state} ${this.status}\">\r\n <label class=\"row\">\r\n <input\r\n type=\"checkbox\"\r\n @click=${this.toggle}\r\n @blur=${() => this._onTouched()}\r\n ?disabled=${this.state === \"disabled\"}\r\n />\r\n\r\n <span class=\"box\">\r\n <svg class=\"check-icon\" viewBox=\"0 0 18 14\" fill=\"var(--rel-text-inverse)\">\r\n <path\r\n d=\"M6.44 14L0.5 7.36l1.49-1.66L6.44 10.68 16.01 0 17.5 1.66z\"\r\n />\r\n </svg>\r\n\r\n <svg class=\"indeterminate-icon\" viewBox=\"0 0 16 2\" fill=\"var(--rel-text-inverse)\">\r\n <rect width=\"16\" height=\"2\" />\r\n </svg>\r\n </span>\r\n\r\n ${this.icon\r\n ? html`<rel-icon name=\"${this.icon}\" size=\"md\" class=\"icon-prefix\"></rel-icon>`\r\n : null}\r\n\r\n <span part=\"label\" class=\"label\">${this.label}</span>\r\n </label>\r\n\r\n ${this.supportingtext\r\n ? html`<span part=\"helper\" class=\"text\">${this.supportingtext}</span>`\r\n : null}\r\n </div>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css, nothing } from \"lit\";\r\nimport { customElement, property, state, query } from \"lit/decorators.js\";\r\nimport { formatDatePattern } from \"./date-format\";\r\n\r\ninterface CalendarDay {\r\n date: Date;\r\n day: number;\r\n isCurrentMonth: boolean;\r\n isToday: boolean;\r\n isSelected: boolean;\r\n isDisabled: boolean;\r\n}\r\n \r\n@customElement(\"rel-date-picker\")\r\nexport class RelDatePicker extends LitElement {\r\n @property({ type: String, reflect: true }) value: string | null = null;\r\n @property({ type: String }) placeholder = \"Select date\";\r\n @property({ type: String }) label: string | null = null;\r\n @property({ type: Boolean, reflect: true }) disabled = false;\r\n @property({ type: Boolean }) required = false;\r\n @property({ type: Boolean, reflect: true }) readonly = false;\r\n\r\n // Date bounds. minDate/maxDate are the standard names; min/max are kept as\r\n // deprecated aliases (minDate/maxDate win when both are set).\r\n @property({ type: String, attribute: \"min-date\" }) minDate: string | null = null;\r\n @property({ type: String, attribute: \"max-date\" }) maxDate: string | null = null;\r\n /** @deprecated use minDate */\r\n @property({ type: String }) min: string | null = null;\r\n /** @deprecated use maxDate */\r\n @property({ type: String }) max: string | null = null;\r\n\r\n @property({ type: String, attribute: \"week-start\" }) weekStart: \"sun\" | \"mon\" = \"sun\";\r\n @property({ type: String }) locale = \"en-US\";\r\n\r\n // ── Display formatting of the SELECTED value ──\r\n // `displayFormat` is a token pattern (YYYY-MM-DD, MM/DD/YYYY, DD/MM/YYYY, …);\r\n // see date-format.ts for the token table. `formatDate` is a full callback and\r\n // takes precedence. When neither is set the locale long date is used, so\r\n // existing consumers are unaffected. Neither affects parsing, the popup\r\n // calendar, or accessibility — only the visible trigger text.\r\n @property({ type: String, attribute: \"display-format\" }) displayFormat: string | null = null;\r\n /**\r\n * Full control over the selected-value display; wins over `displayFormat`.\r\n * Reactive (attribute:false) so assigning it after render re-renders the\r\n * trigger — frameworks set callbacks as properties post-creation.\r\n */\r\n @property({ attribute: false }) formatDate?: (date: Date) => string;\r\n @property({ type: Boolean, reflect: true }) open = false;\r\n @property({ type: Boolean, attribute: \"close-on-select\" }) closeOnSelect = true;\r\n @property({ type: Boolean }) clearable = false;\r\n\r\n // ── Standardized input API (mirrors rel-textfield) ──\r\n @property({ type: Boolean }) error = false;\r\n @property({ type: String, attribute: \"error-message\" }) errorMessage?: string;\r\n @property({ type: String, attribute: \"helper-text\" }) helperText?: string;\r\n @property({ type: String }) name?: string;\r\n @property({ type: String }) size: \"small\" | \"medium\" | \"large\" = \"medium\";\r\n @property({ type: String, reflect: true }) variant: \"outlined\" = \"outlined\";\r\n @property({ type: Boolean, reflect: true }) fullWidth = false;\r\n\r\n // Custom disabled predicate (not settable via attribute)\r\n public isDateDisabled?: (date: Date) => boolean;\r\n\r\n // minDate/maxDate supersede the deprecated min/max aliases\r\n private get minBound(): string | null {\r\n return this.minDate ?? this.min;\r\n }\r\n private get maxBound(): string | null {\r\n return this.maxDate ?? this.max;\r\n }\r\n\r\n @state() private viewYear: number = new Date().getFullYear();\r\n @state() private viewMonth: number = new Date().getMonth();\r\n @state() private focusedDate: Date | null = null;\r\n @state() private yearDropdownOpen = false;\r\n @state() private monthDropdownOpen = false;\r\n\r\n @query(\".trigger-button\") private triggerButton?: HTMLButtonElement;\r\n @query(\".popover\") private popoverElement?: HTMLElement;\r\n @query(\".calendar-grid\") private calendarGrid?: HTMLElement;\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n display: block;\r\n font-family: var(--rel-fonts-font-family);\r\n position: relative;\r\n }\r\n\r\n /* Intrinsic width by default; set fullWidth to fill the parent. */\r\n :host(:not([fullwidth])) {\r\n display: inline-block;\r\n width: auto;\r\n }\r\n\r\n :host([disabled]) {\r\n opacity: 0.6;\r\n cursor: not-allowed;\r\n }\r\n\r\n :host([disabled]) * {\r\n pointer-events: none;\r\n }\r\n\r\n :host([readonly]) .trigger-button {\r\n cursor: default;\r\n }\r\n\r\n .date-picker-wrapper {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--rel-spacing-xs);\r\n }\r\n\r\n .label {\r\n color: var(--rel-text-label);\r\n\r\n font-family: var(--rel-body-sm-medium-font-family);\r\n\r\n font-weight: var(--rel-body-sm-medium-font-weight);\r\n\r\n font-size: var(--rel-body-sm-medium-font-size);\r\n\r\n line-height: var(--rel-body-sm-medium-line-height);\r\n\r\n letter-spacing: var(--rel-body-sm-medium-letter-spacing);\r\n\r\n }\r\n\r\n .required-mark {\r\n color: var(--rel-text-danger);\r\n margin-left: 2px;\r\n }\r\n\r\n /* Support text (helperText / errorMessage) */\r\n .date-picker-support {\r\n color: var(--rel-text-placeholder);\r\n\r\n font-family: var(--rel-body-xs-regular-font-family);\r\n\r\n font-weight: var(--rel-body-xs-regular-font-weight);\r\n\r\n font-size: var(--rel-body-xs-regular-font-size);\r\n\r\n line-height: var(--rel-body-xs-regular-line-height);\r\n\r\n letter-spacing: var(--rel-body-xs-regular-letter-spacing);\r\n\r\n }\r\n\r\n .date-picker-support.error {\r\n color: var(--rel-text-danger);\r\n }\r\n\r\n .trigger-button {\r\n width: 100%;\r\n min-width: 200px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: var(--rel-spacing-xs);\r\n padding: var(--rel-spacing-sm) var(--rel-spacing-md);\r\n background: var(--rel-bg-surface);\r\n border: 1px solid var(--rel-border-default);\r\n border-radius: var(--rel-border-radius-sm);\r\n color: var(--rel-text-default);\r\n cursor: pointer;\r\n transition: all 0.15s ease;\r\n text-align: left;\r\n font-family: var(--rel-body-md-regular-font-family);\r\n font-weight: var(--rel-body-md-regular-font-weight);\r\n font-size: var(--rel-body-md-regular-font-size);\r\n line-height: var(--rel-body-md-regular-line-height);\r\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\r\n }\r\n\r\n .trigger-button:hover:not(:disabled) {\r\n border-color: var(--rel-border-strong);\r\n }\r\n\r\n .trigger-button:focus-visible {\r\n outline: 2px solid var(--rel-border-focus);\r\n outline-offset: 2px;\r\n border-color: var(--rel-border-focus);\r\n }\r\n\r\n .trigger-button:disabled {\r\n cursor: not-allowed;\r\n background: var(--rel-bg-surface-elevated);\r\n }\r\n\r\n /* Error state */\r\n .trigger-button.error,\r\n .trigger-button.error:hover:not(:disabled) {\r\n border-color: var(--rel-border-danger);\r\n }\r\n\r\n .trigger-button.error:focus-visible {\r\n outline-color: var(--rel-border-danger);\r\n border-color: var(--rel-border-danger);\r\n }\r\n\r\n /* Size variants (medium is the base .trigger-button style) */\r\n .date-picker-wrapper.small .trigger-button {\r\n padding: var(--rel-spacing-xs) var(--rel-spacing-sm);\r\n font-family: var(--rel-body-sm-regular-font-family);\r\n font-weight: var(--rel-body-sm-regular-font-weight);\r\n font-size: var(--rel-body-sm-regular-font-size);\r\n line-height: var(--rel-body-sm-regular-line-height);\r\n letter-spacing: var(--rel-body-sm-regular-letter-spacing);\r\n }\r\n\r\n .date-picker-wrapper.large .trigger-button {\r\n padding: var(--rel-spacing-md) var(--rel-spacing-md);\r\n font-family: var(--rel-body-lg-regular-font-family);\r\n font-weight: var(--rel-body-lg-regular-font-weight);\r\n font-size: var(--rel-body-lg-regular-font-size);\r\n line-height: var(--rel-body-lg-regular-line-height);\r\n letter-spacing: var(--rel-body-lg-regular-letter-spacing);\r\n }\r\n\r\n .trigger-content {\r\n flex: 1;\r\n color: var(--rel-text-default);\r\n }\r\n\r\n .trigger-content.placeholder {\r\n color: var(--rel-text-placeholder);\r\n }\r\n\r\n .trigger-icons {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-2xs);\r\n }\r\n\r\n .icon-button {\r\n background: none;\r\n border: none;\r\n padding: var(--rel-spacing-3xs);\r\n cursor: pointer;\r\n color: var(--rel-text-placeholder);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: var(--rel-border-radius-xs);\r\n transition: all 0.15s ease;\r\n }\r\n\r\n .icon-button:hover {\r\n background: var(--rel-bg-surface-elevated);\r\n color: var(--rel-text-default);\r\n }\r\n\r\n .icon-button svg {\r\n width: 16px;\r\n height: 16px;\r\n }\r\n\r\n .popover {\r\n position: absolute;\r\n top: calc(100% + 4px);\r\n left: 0;\r\n z-index: 1000;\r\n background: var(--rel-bg-surface);\r\n border: 1px solid var(--rel-border-default);\r\n border-radius: var(--rel-border-radius-sm);\r\n box-shadow: var(--rel-shadows-shadow-300);\r\n padding: var(--rel-spacing-md);\r\n min-width: 280px;\r\n display: none;\r\n }\r\n\r\n .popover.open {\r\n display: block;\r\n }\r\n\r\n .calendar-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n margin-bottom: var(--rel-spacing-md);\r\n gap: var(--rel-spacing-xs);\r\n }\r\n\r\n .nav-button {\r\n background: transparent;\r\n border: none;\r\n width: 32px;\r\n height: 32px;\r\n border-radius: var(--rel-border-radius-sm);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n cursor: pointer;\r\n color: var(--rel-text-default);\r\n transition: background-color 0.15s ease;\r\n }\r\n\r\n .nav-button:hover {\r\n background: var(--rel-bg-surface-elevated);\r\n }\r\n\r\n .nav-button:focus-visible {\r\n outline: 2px solid var(--rel-border-focus);\r\n outline-offset: 2px;\r\n }\r\n\r\n .dropdown-container {\r\n position: relative;\r\n flex: 1;\r\n }\r\n\r\n .dropdown-trigger {\r\n width: 100%;\r\n padding: var(--rel-spacing-xs) var(--rel-spacing-sm);\r\n background: var(--rel-bg-surface);\r\n border: 1px solid var(--rel-border-default);\r\n border-radius: var(--rel-border-radius-sm);\r\n color: var(--rel-text-label);\r\n cursor: pointer;\r\n text-align: center;\r\n transition: all 0.15s ease;\r\n font-family: var(--rel-body-sm-medium-font-family);\r\n font-weight: var(--rel-body-sm-medium-font-weight);\r\n font-size: var(--rel-body-sm-medium-font-size);\r\n line-height: var(--rel-body-sm-medium-line-height);\r\n letter-spacing: var(--rel-body-sm-medium-letter-spacing);\r\n }\r\n\r\n .dropdown-trigger:hover {\r\n background: var(--rel-bg-surface-elevated);\r\n }\r\n\r\n .dropdown-trigger:focus-visible {\r\n outline: 2px solid var(--rel-border-focus);\r\n outline-offset: 2px;\r\n }\r\n\r\n .dropdown-menu {\r\n position: absolute;\r\n top: calc(100% + 4px);\r\n left: 0;\r\n right: 0;\r\n z-index: 10;\r\n background: var(--rel-bg-surface);\r\n border: 1px solid var(--rel-border-default);\r\n border-radius: var(--rel-border-radius-sm);\r\n box-shadow: var(--rel-shadows-shadow-200);\r\n max-height: 200px;\r\n overflow-y: auto;\r\n display: none;\r\n }\r\n\r\n .dropdown-menu.open {\r\n display: block;\r\n }\r\n\r\n .dropdown-item {\r\n padding: var(--rel-spacing-xs) var(--rel-spacing-sm);\r\n cursor: pointer;\r\n color: var(--rel-text-default);\r\n transition: background-color 0.15s ease;\r\n font-family: var(--rel-body-sm-regular-font-family);\r\n font-weight: var(--rel-body-sm-regular-font-weight);\r\n font-size: var(--rel-body-sm-regular-font-size);\r\n line-height: var(--rel-body-sm-regular-line-height);\r\n letter-spacing: var(--rel-body-sm-regular-letter-spacing);\r\n }\r\n\r\n .dropdown-item:hover {\r\n background: var(--rel-bg-surface-elevated);\r\n }\r\n\r\n .dropdown-item.selected {\r\n background: var(--rel-bg-info-light);\r\n color: var(--rel-text-info);\r\n font-weight: var(--rel-body-md-semibold-font-weight);\r\n }\r\n\r\n .weekdays {\r\n display: grid;\r\n grid-template-columns: repeat(7, 1fr);\r\n gap: var(--rel-spacing-3xs);\r\n margin-bottom: var(--rel-spacing-xs);\r\n }\r\n\r\n .weekday {\r\n text-align: center;\r\n color: var(--rel-text-placeholder);\r\n padding: var(--rel-spacing-xs);\r\n text-transform: uppercase;\r\n font-family: var(--rel-body-xs-semibold-font-family);\r\n font-weight: var(--rel-body-xs-semibold-font-weight);\r\n font-size: var(--rel-body-xs-semibold-font-size);\r\n line-height: var(--rel-body-xs-semibold-line-height);\r\n letter-spacing: var(--rel-body-xs-semibold-letter-spacing);\r\n }\r\n\r\n .calendar-grid {\r\n display: grid;\r\n grid-template-columns: repeat(7, 1fr);\r\n gap: var(--rel-spacing-3xs);\r\n }\r\n\r\n .day-button {\r\n aspect-ratio: 1;\r\n border: none;\r\n background: transparent;\r\n border-radius: var(--rel-border-radius-sm);\r\n color: var(--rel-text-default);\r\n cursor: pointer;\r\n position: relative;\r\n transition: all 0.15s ease;\r\n font-family: var(--rel-body-sm-medium-font-family);\r\n font-weight: var(--rel-body-sm-medium-font-weight);\r\n font-size: var(--rel-body-sm-medium-font-size);\r\n line-height: var(--rel-body-sm-medium-line-height);\r\n letter-spacing: var(--rel-body-sm-medium-letter-spacing);\r\n }\r\n\r\n .day-button:hover:not(:disabled):not(.selected) {\r\n background: var(--rel-bg-surface-elevated);\r\n }\r\n\r\n .day-button:focus-visible {\r\n outline: 2px solid var(--rel-border-focus);\r\n outline-offset: -2px;\r\n z-index: 1;\r\n }\r\n\r\n .day-button.today:not(.selected) {\r\n border: 2px solid var(--rel-border-brand);\r\n }\r\n\r\n .day-button.selected {\r\n background: var(--rel-action-brand-fill);\r\n color: var(--rel-action-brand-label-icons-primary);\r\n font-weight: var(--rel-body-md-semibold-font-weight);\r\n }\r\n\r\n .day-button.other-month {\r\n color: var(--rel-text-placeholder);\r\n opacity: 0.5;\r\n }\r\n\r\n .day-button:disabled {\r\n color: var(--rel-text-disabled);\r\n cursor: not-allowed;\r\n opacity: 0.5;\r\n }\r\n\r\n .day-button:disabled:hover {\r\n background: transparent;\r\n }\r\n\r\n @media (prefers-reduced-motion: reduce) {\r\n .trigger-button,\r\n .icon-button,\r\n .nav-button,\r\n .dropdown-trigger,\r\n .dropdown-item,\r\n .day-button {\r\n transition: none;\r\n }\r\n }\r\n `;\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n if (this.value) {\r\n const date = this.parseISODate(this.value);\r\n if (date) {\r\n this.viewYear = date.getFullYear();\r\n this.viewMonth = date.getMonth();\r\n }\r\n }\r\n\r\n // Click outside handler\r\n document.addEventListener(\"click\", this.handleClickOutside);\r\n document.addEventListener(\"keydown\", this.handleEscapeKey);\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback();\r\n document.removeEventListener(\"click\", this.handleClickOutside);\r\n document.removeEventListener(\"keydown\", this.handleEscapeKey);\r\n }\r\n\r\n private handleClickOutside = (e: MouseEvent) => {\r\n if (!this.open) return;\r\n\r\n const path = e.composedPath();\r\n if (!path.includes(this)) {\r\n this.closeCalendarPopover();\r\n }\r\n };\r\n\r\n private handleEscapeKey = (e: KeyboardEvent) => {\r\n if (e.key === \"Escape\" && this.open) {\r\n this.closeCalendarPopover();\r\n }\r\n };\r\n\r\n updated(changedProperties: Map<string, any>) {\r\n if (changedProperties.has(\"value\") && this.value) {\r\n const date = this.parseISODate(this.value);\r\n if (date) {\r\n this.viewYear = date.getFullYear();\r\n this.viewMonth = date.getMonth();\r\n }\r\n }\r\n\r\n if (changedProperties.has(\"open\") && this.open) {\r\n // Focus first day when opening\r\n setTimeout(() => {\r\n const firstDay = this.calendarGrid?.querySelector<HTMLButtonElement>(\r\n \".day-button:not(:disabled)\"\r\n );\r\n firstDay?.focus();\r\n }, 100);\r\n }\r\n }\r\n\r\n private parseISODate(iso: string): Date | null {\r\n const match = iso.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\r\n if (!match) return null;\r\n const [, year, month, day] = match;\r\n return new Date(parseInt(year), parseInt(month) - 1, parseInt(day));\r\n }\r\n\r\n private formatISODate(date: Date): string {\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\r\n const day = String(date.getDate()).padStart(2, \"0\");\r\n return `${year}-${month}-${day}`;\r\n }\r\n\r\n private formatDisplayDate(iso: string): string {\r\n const date = this.parseISODate(iso);\r\n if (!date) return iso;\r\n\r\n // 1) explicit callback wins (fall back on error so a bad callback can't\r\n // blank the field)\r\n if (typeof this.formatDate === \"function\") {\r\n try {\r\n const out = this.formatDate(date);\r\n if (typeof out === \"string\") return out;\r\n } catch {\r\n /* fall through to the default */\r\n }\r\n }\r\n // 2) token pattern (e.g. \"YYYY-MM-DD\")\r\n if (this.displayFormat) {\r\n return formatDatePattern(date, this.displayFormat, this.locale);\r\n }\r\n // 3) backward-compatible locale long date\r\n return new Intl.DateTimeFormat(this.locale, {\r\n year: \"numeric\",\r\n month: \"long\",\r\n day: \"numeric\",\r\n }).format(date);\r\n }\r\n\r\n private isSameDay(date1: Date, date2: Date): boolean {\r\n return (\r\n date1.getFullYear() === date2.getFullYear() &&\r\n date1.getMonth() === date2.getMonth() &&\r\n date1.getDate() === date2.getDate()\r\n );\r\n }\r\n\r\n private isDateDisabledInternal(date: Date): boolean {\r\n if (this.disabled) return true;\r\n\r\n if (this.minBound) {\r\n const minDate = this.parseISODate(this.minBound);\r\n if (minDate && date < minDate) return true;\r\n }\r\n\r\n if (this.maxBound) {\r\n const maxDate = this.parseISODate(this.maxBound);\r\n if (maxDate && date > maxDate) return true;\r\n }\r\n\r\n if (this.isDateDisabled && this.isDateDisabled(date)) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private getCalendarDays(): CalendarDay[] {\r\n const days: CalendarDay[] = [];\r\n const firstDayOfMonth = new Date(this.viewYear, this.viewMonth, 1);\r\n const lastDayOfMonth = new Date(this.viewYear, this.viewMonth + 1, 0);\r\n const today = new Date();\r\n const selectedDate = this.value ? this.parseISODate(this.value) : null;\r\n\r\n let startDay = firstDayOfMonth.getDay();\r\n if (this.weekStart === \"mon\") {\r\n startDay = startDay === 0 ? 6 : startDay - 1;\r\n }\r\n\r\n // Leading days from previous month\r\n for (let i = startDay - 1; i >= 0; i--) {\r\n const date = new Date(this.viewYear, this.viewMonth, -i);\r\n days.push({\r\n date,\r\n day: date.getDate(),\r\n isCurrentMonth: false,\r\n isToday: this.isSameDay(date, today),\r\n isSelected: selectedDate ? this.isSameDay(date, selectedDate) : false,\r\n isDisabled: true, // Leading days not selectable\r\n });\r\n }\r\n\r\n // Current month days\r\n for (let day = 1; day <= lastDayOfMonth.getDate(); day++) {\r\n const date = new Date(this.viewYear, this.viewMonth, day);\r\n days.push({\r\n date,\r\n day,\r\n isCurrentMonth: true,\r\n isToday: this.isSameDay(date, today),\r\n isSelected: selectedDate ? this.isSameDay(date, selectedDate) : false,\r\n isDisabled: this.isDateDisabledInternal(date),\r\n });\r\n }\r\n\r\n // Trailing days from next month\r\n const remainingCells = 42 - days.length; // 6 weeks max\r\n for (let i = 1; i <= remainingCells; i++) {\r\n const date = new Date(this.viewYear, this.viewMonth + 1, i);\r\n days.push({\r\n date,\r\n day: date.getDate(),\r\n isCurrentMonth: false,\r\n isToday: this.isSameDay(date, today),\r\n isSelected: selectedDate ? this.isSameDay(date, selectedDate) : false,\r\n isDisabled: true, // Trailing days not selectable\r\n });\r\n }\r\n\r\n return days;\r\n }\r\n\r\n private getWeekdayLabels(): string[] {\r\n const formatter = new Intl.DateTimeFormat(this.locale, { weekday: \"short\" });\r\n const days = [];\r\n const baseDate = new Date(2024, 0, 7); // Sunday, Jan 7, 2024\r\n\r\n for (let i = 0; i < 7; i++) {\r\n const offset = this.weekStart === \"mon\" ? i + 1 : i;\r\n const date = new Date(baseDate);\r\n date.setDate(baseDate.getDate() + offset);\r\n days.push(formatter.format(date).substring(0, 2));\r\n }\r\n\r\n return days;\r\n }\r\n\r\n private getMonthName(): string {\r\n const formatter = new Intl.DateTimeFormat(this.locale, { month: \"long\" });\r\n return formatter.format(new Date(this.viewYear, this.viewMonth, 1));\r\n }\r\n\r\n private getMonthsList(): { value: number; label: string }[] {\r\n const months = [];\r\n for (let i = 0; i < 12; i++) {\r\n const formatter = new Intl.DateTimeFormat(this.locale, { month: \"long\" });\r\n const label = formatter.format(new Date(2024, i, 1));\r\n months.push({ value: i, label });\r\n }\r\n return months;\r\n }\r\n\r\n private getYearsList(): number[] {\r\n const currentYear = new Date().getFullYear();\r\n let startYear = currentYear - 100;\r\n let endYear = currentYear + 10;\r\n\r\n if (this.minBound) {\r\n const minDate = this.parseISODate(this.minBound);\r\n if (minDate) startYear = Math.max(startYear, minDate.getFullYear() - 5);\r\n }\r\n\r\n if (this.maxBound) {\r\n const maxDate = this.parseISODate(this.maxBound);\r\n if (maxDate) endYear = Math.min(endYear, maxDate.getFullYear() + 5);\r\n }\r\n\r\n const years = [];\r\n for (let y = startYear; y <= endYear; y++) {\r\n years.push(y);\r\n }\r\n return years.reverse(); // Most recent first\r\n }\r\n\r\n private toggleCalendarPopover() {\r\n if (this.disabled || this.readonly) return;\r\n this.open = !this.open;\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-open-change\", {\r\n detail: { open: this.open },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private closeCalendarPopover() {\r\n this.open = false;\r\n this.monthDropdownOpen = false;\r\n this.yearDropdownOpen = false;\r\n this.triggerButton?.focus();\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-open-change\", {\r\n detail: { open: false },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private previousMonth() {\r\n if (this.viewMonth === 0) {\r\n this.viewMonth = 11;\r\n this.viewYear--;\r\n } else {\r\n this.viewMonth--;\r\n }\r\n }\r\n\r\n private nextMonth() {\r\n if (this.viewMonth === 11) {\r\n this.viewMonth = 0;\r\n this.viewYear++;\r\n } else {\r\n this.viewMonth++;\r\n }\r\n }\r\n\r\n private selectDay(day: CalendarDay) {\r\n if (day.isDisabled || this.disabled || this.readonly) return;\r\n\r\n const newValue = this.formatISODate(day.date);\r\n this.value = newValue;\r\n\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-change\", {\r\n detail: {\r\n value: newValue,\r\n date: new Date(day.date),\r\n },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n\r\n if (this.closeOnSelect) {\r\n this.closeCalendarPopover();\r\n }\r\n }\r\n\r\n private clearValue(e: Event) {\r\n e.stopPropagation();\r\n this.value = null;\r\n\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-change\", {\r\n detail: {\r\n value: null,\r\n date: null,\r\n },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private handleTriggerKeydown(e: KeyboardEvent) {\r\n if (e.key === \"Enter\" || e.key === \" \" || e.key === \"ArrowDown\") {\r\n e.preventDefault();\r\n if (!this.open) {\r\n this.toggleCalendarPopover();\r\n }\r\n }\r\n }\r\n\r\n private handleDayKeydown(e: KeyboardEvent, day: CalendarDay, index: number) {\r\n const days = this.getCalendarDays();\r\n let targetIndex = index;\r\n\r\n switch (e.key) {\r\n case \"ArrowLeft\":\r\n e.preventDefault();\r\n targetIndex = index - 1;\r\n break;\r\n case \"ArrowRight\":\r\n e.preventDefault();\r\n targetIndex = index + 1;\r\n break;\r\n case \"ArrowUp\":\r\n e.preventDefault();\r\n targetIndex = index - 7;\r\n break;\r\n case \"ArrowDown\":\r\n e.preventDefault();\r\n targetIndex = index + 7;\r\n break;\r\n case \"Home\":\r\n e.preventDefault();\r\n targetIndex = index - (index % 7);\r\n break;\r\n case \"End\":\r\n e.preventDefault();\r\n targetIndex = index - (index % 7) + 6;\r\n break;\r\n case \"PageUp\":\r\n e.preventDefault();\r\n if (e.shiftKey) {\r\n this.viewYear--;\r\n } else {\r\n this.previousMonth();\r\n }\r\n return;\r\n case \"PageDown\":\r\n e.preventDefault();\r\n if (e.shiftKey) {\r\n this.viewYear++;\r\n } else {\r\n this.nextMonth();\r\n }\r\n return;\r\n case \"Enter\":\r\n case \" \":\r\n e.preventDefault();\r\n this.selectDay(day);\r\n return;\r\n default:\r\n return;\r\n }\r\n\r\n if (targetIndex >= 0 && targetIndex < days.length) {\r\n const targetDay = days[targetIndex];\r\n if (!targetDay.isCurrentMonth) {\r\n if (targetIndex < index) {\r\n this.previousMonth();\r\n } else {\r\n this.nextMonth();\r\n }\r\n }\r\n this.requestUpdate();\r\n this.updateComplete.then(() => {\r\n const buttons = this.calendarGrid?.querySelectorAll<HTMLButtonElement>(\".day-button\");\r\n if (buttons && buttons[targetIndex]) {\r\n buttons[targetIndex].focus();\r\n }\r\n });\r\n }\r\n }\r\n\r\n private toggleMonthDropdown(e: Event) {\r\n e.stopPropagation();\r\n this.monthDropdownOpen = !this.monthDropdownOpen;\r\n this.yearDropdownOpen = false;\r\n }\r\n\r\n private toggleYearDropdown(e: Event) {\r\n e.stopPropagation();\r\n this.yearDropdownOpen = !this.yearDropdownOpen;\r\n this.monthDropdownOpen = false;\r\n }\r\n\r\n private selectMonth(month: number, e: Event) {\r\n e.stopPropagation();\r\n this.viewMonth = month;\r\n this.monthDropdownOpen = false;\r\n }\r\n\r\n private selectYear(year: number, e: Event) {\r\n e.stopPropagation();\r\n this.viewYear = year;\r\n this.yearDropdownOpen = false;\r\n }\r\n\r\n render() {\r\n const days = this.getCalendarDays();\r\n const weekdayLabels = this.getWeekdayLabels();\r\n const months = this.getMonthsList();\r\n const years = this.getYearsList();\r\n\r\n const isError = this.error;\r\n const belowText = isError && this.errorMessage ? this.errorMessage : this.helperText;\r\n const describedById = belowText ? \"date-picker-desc\" : undefined;\r\n const wrapperClasses = [\r\n \"date-picker-wrapper\",\r\n this.size,\r\n isError ? \"error\" : \"\",\r\n this.readonly ? \"readonly\" : \"\",\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return html`\r\n <div part=\"base\" class=\"${wrapperClasses}\">\r\n ${this.label\r\n ? html`<label part=\"label\" class=\"label\" id=\"date-picker-label\"\r\n >${this.label}${this.required\r\n ? html`<span class=\"required-mark\" aria-hidden=\"true\">*</span>`\r\n : nothing}</label\r\n >`\r\n : nothing}\r\n\r\n ${this.name\r\n ? html`<input type=\"hidden\" name=${this.name} .value=${this.value ?? \"\"} />`\r\n : nothing}\r\n\r\n <button\r\n class=\"trigger-button ${isError ? \"error\" : \"\"}\"\r\n type=\"button\"\r\n ?disabled=${this.disabled}\r\n @click=${this.toggleCalendarPopover}\r\n @keydown=${this.handleTriggerKeydown}\r\n aria-label=${this.label || \"Select date\"}\r\n aria-haspopup=\"dialog\"\r\n aria-expanded=${this.open}\r\n aria-required=${this.required}\r\n aria-invalid=${isError}\r\n aria-readonly=${this.readonly}\r\n aria-describedby=${describedById ?? nothing}\r\n aria-labelledby=${this.label ? \"date-picker-label\" : nothing}\r\n >\r\n <span class=\"trigger-content ${this.value ? \"\" : \"placeholder\"}\">\r\n ${this.value ? this.formatDisplayDate(this.value) : this.placeholder}\r\n </span>\r\n <span class=\"trigger-icons\">\r\n ${this.clearable && this.value\r\n ? html`\r\n <button\r\n class=\"icon-button\"\r\n type=\"button\"\r\n aria-label=\"Clear date\"\r\n @click=${this.clearValue}\r\n >\r\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path\r\n d=\"M4 4l8 8M12 4l-8 8\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n `\r\n : nothing}\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path\r\n d=\"M4 2h1V1h2v1h2V1h2v1h1a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zm8 3H4v7h8V5z\"\r\n />\r\n </svg>\r\n </span>\r\n </button>\r\n\r\n <div class=\"popover ${this.open ? \"open\" : \"\"}\" role=\"dialog\" aria-label=\"Choose date\">\r\n <div class=\"calendar-header\">\r\n <button\r\n class=\"nav-button\"\r\n @click=${this.previousMonth}\r\n aria-label=\"Previous month\"\r\n type=\"button\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path\r\n d=\"M10 12L6 8L10 4\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n fill=\"none\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n\r\n <div class=\"dropdown-container\">\r\n <button\r\n class=\"dropdown-trigger\"\r\n type=\"button\"\r\n @click=${this.toggleMonthDropdown}\r\n aria-label=\"Select month\"\r\n aria-expanded=${this.monthDropdownOpen}\r\n >\r\n ${this.getMonthName()}\r\n </button>\r\n <div class=\"dropdown-menu ${this.monthDropdownOpen ? \"open\" : \"\"}\">\r\n ${months.map(\r\n (m) => html`\r\n <div\r\n class=\"dropdown-item ${m.value === this.viewMonth ? \"selected\" : \"\"}\"\r\n @click=${(e: Event) => this.selectMonth(m.value, e)}\r\n role=\"option\"\r\n aria-selected=${m.value === this.viewMonth}\r\n >\r\n ${m.label}\r\n </div>\r\n `\r\n )}\r\n </div>\r\n </div>\r\n\r\n <div class=\"dropdown-container\">\r\n <button\r\n class=\"dropdown-trigger\"\r\n type=\"button\"\r\n @click=${this.toggleYearDropdown}\r\n aria-label=\"Select year\"\r\n aria-expanded=${this.yearDropdownOpen}\r\n >\r\n ${this.viewYear}\r\n </button>\r\n <div class=\"dropdown-menu ${this.yearDropdownOpen ? \"open\" : \"\"}\">\r\n ${years.map(\r\n (y) => html`\r\n <div\r\n class=\"dropdown-item ${y === this.viewYear ? \"selected\" : \"\"}\"\r\n @click=${(e: Event) => this.selectYear(y, e)}\r\n role=\"option\"\r\n aria-selected=${y === this.viewYear}\r\n >\r\n ${y}\r\n </div>\r\n `\r\n )}\r\n </div>\r\n </div>\r\n\r\n <button\r\n class=\"nav-button\"\r\n @click=${this.nextMonth}\r\n aria-label=\"Next month\"\r\n type=\"button\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path\r\n d=\"M6 4L10 8L6 12\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n fill=\"none\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"weekdays\">\r\n ${weekdayLabels.map(\r\n (label) => html` <div class=\"weekday\" aria-label=\"${label}\">${label}</div> `\r\n )}\r\n </div>\r\n\r\n <div class=\"calendar-grid\" role=\"grid\">\r\n ${days.map(\r\n (day, index) => html`\r\n <button\r\n class=\"day-button ${day.isSelected ? \"selected\" : \"\"} ${day.isToday\r\n ? \"today\"\r\n : \"\"} ${!day.isCurrentMonth ? \"other-month\" : \"\"}\"\r\n role=\"gridcell\"\r\n type=\"button\"\r\n aria-label=\"${this.formatISODate(day.date)}\"\r\n aria-selected=\"${day.isSelected}\"\r\n ?disabled=${day.isDisabled}\r\n @click=${() => this.selectDay(day)}\r\n @keydown=${(e: KeyboardEvent) => this.handleDayKeydown(e, day, index)}\r\n tabindex=\"${day.isSelected || (index === 0 && !this.value) ? 0 : -1}\"\r\n >\r\n ${day.day}\r\n </button>\r\n `\r\n )}\r\n </div>\r\n </div>\r\n\r\n ${belowText\r\n ? html`<div class=\"date-picker-support ${isError ? \"error\" : \"\"}\" id=${describedById}>\r\n ${belowText}\r\n </div>`\r\n : nothing}\r\n </div>\r\n `;\r\n }\r\n}\r\n","/**\n * Token-based date formatting for rel-date-picker's selected-value display.\n *\n * Pure (Date + Intl only, no DOM) so it is unit-testable in Node. Tokens are\n * matched longest-first; anything else (separators like `-` `/` `.` and spaces)\n * passes through literally. Wrap literal text that contains token letters in\n * square brackets, e.g. `[Week of] YYYY-MM-DD`.\n *\n * | Token | Meaning | Example (2026-07-21) |\n * |-------|------------------------|----------------------|\n * | YYYY | 4-digit year | 2026 |\n * | YY | 2-digit year | 26 |\n * | MMMM | full month (locale) | July |\n * | MMM | short month (locale) | Jul |\n * | MM | 2-digit month | 07 |\n * | M | month number | 7 |\n * | DD | 2-digit day | 21 |\n * | D | day number | 21 |\n */\nexport function formatDatePattern(\n date: Date,\n pattern: string,\n locale = \"en-US\"\n): string {\n const pad = (n: number) => String(n).padStart(2, \"0\");\n const year = date.getFullYear();\n const month = date.getMonth() + 1;\n const day = date.getDate();\n\n const tokens: Record<string, string> = {\n YYYY: String(year),\n YY: String(year).slice(-2),\n MMMM: new Intl.DateTimeFormat(locale, { month: \"long\" }).format(date),\n MMM: new Intl.DateTimeFormat(locale, { month: \"short\" }).format(date),\n MM: pad(month),\n M: String(month),\n DD: pad(day),\n D: String(day),\n };\n\n // `\\[([^\\]]*)\\]` captures a bracketed literal (emitted without the brackets);\n // otherwise the matched token is substituted from the map.\n return pattern.replace(\n /\\[([^\\]]*)\\]|YYYY|YY|MMMM|MMM|MM|M|DD|D/g,\n (match, literal) => (literal !== undefined ? literal : tokens[match])\n );\n}\n","import { LitElement, html, css, nothing } from \"lit\";\r\nimport { customElement, property, state, query } from \"lit/decorators.js\";\r\nimport \"@reliability-design/icons/rel-icon\";\r\nimport \"../rel-button/rel-button\";\r\n\r\ninterface RangeDay {\r\n date: Date;\r\n day: number;\r\n isCurrentMonth: boolean;\r\n isToday: boolean;\r\n isDraftFrom: boolean;\r\n isDraftTo: boolean;\r\n isInRange: boolean;\r\n isDisabled: boolean;\r\n isWeekend: boolean;\r\n}\r\n\r\ninterface QuickSelect {\r\n label: string;\r\n key: string;\r\n from: string;\r\n to: string;\r\n fullWidth?: boolean;\r\n}\r\n\r\n@customElement(\"rel-range-picker\")\r\nexport class RelRangePicker extends LitElement {\r\n @property({ type: String }) from: string = \"\";\r\n @property({ type: String }) to: string = \"\";\r\n @property({ type: String }) locale: string = \"en-US\";\r\n @property({ type: String, attribute: \"week-start\" }) weekStart: \"mon\" | \"sun\" = \"sun\";\r\n @property({ type: String, attribute: \"min-date\" }) minDate: string = \"\";\r\n @property({ type: String, attribute: \"max-date\" }) maxDate: string = \"\";\r\n @property({ type: Boolean, reflect: true }) disabled = false;\r\n @property({ type: Boolean, reflect: true }) open = false;\r\n @property({ type: String }) mode: \"popover\" | \"popup\" = \"popover\";\r\n @property({ type: String }) width: string = \"\";\r\n @property({ type: String, attribute: \"min-width\" }) minWidth: string = \"\";\r\n @property({ type: String, attribute: \"max-width\" }) maxWidth: string = \"\";\r\n @property({ type: String }) height: string = \"\";\r\n @property({ type: String, attribute: \"min-height\" }) minHeight: string = \"\";\r\n @property({ type: String, attribute: \"max-height\" }) maxHeight: string = \"\";\r\n @property({ type: String }) placeholder: string = \"Select date range\";\r\n @property({ type: String, attribute: \"trigger-variant\" }) triggerVariant: \"default\" | \"icon\" = \"default\";\r\n\r\n @state() private draftFrom: string = \"\";\r\n @state() private draftTo: string = \"\";\r\n @state() private draftActivePreset: string | null = null;\r\n @state() private viewYear: number = new Date().getFullYear();\r\n @state() private viewMonth: number = new Date().getMonth();\r\n @state() private isSelectingRange: boolean = false;\r\n @state() private hoverDate: string | null = null;\r\n\r\n @query(\".trigger-button\") private triggerButton?: HTMLButtonElement;\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n display: inline-block;\r\n font-family: var(--rel-body-md-regular-font-family);\r\n position: relative;\r\n }\r\n\r\n :host([disabled]) {\r\n opacity: 0.6;\r\n cursor: not-allowed;\r\n }\r\n\r\n :host([disabled]) .trigger-button,\r\n :host([disabled]) rel-button {\r\n pointer-events: none;\r\n }\r\n\r\n /* ── Trigger ── */\r\n .trigger-button {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: var(--rel-spacing-xs, 8px);\r\n padding: var(--rel-spacing-sm, 12px) var(--rel-spacing-md, 16px);\r\n background: var(--rel-bg-surface);\r\n border: 1px solid var(--rel-border-default);\r\n border-radius: var(--rel-border-radius-sm, 8px);\r\n color: var(--rel-text-default);\r\n cursor: pointer;\r\n width: 100%;\r\n text-align: left;\r\n transition: border-color 0.15s ease;\r\n font-family: var(--rel-body-md-regular-font-family);\r\n font-weight: var(--rel-body-md-regular-font-weight);\r\n font-size: var(--rel-body-md-regular-font-size);\r\n line-height: var(--rel-body-md-regular-line-height);\r\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\r\n }\r\n\r\n .trigger-button:hover:not(:disabled) {\r\n border-color: var(--rel-border-accent);\r\n }\r\n\r\n .trigger-button:focus-visible {\r\n outline: 2px solid var(--rel-border-focus);\r\n outline-offset: 2px;\r\n }\r\n\r\n .trigger-content {\r\n flex: 1;\r\n color: var(--rel-text-default);\r\n }\r\n\r\n .trigger-content.placeholder {\r\n color: var(--rel-text-placeholder);\r\n }\r\n\r\n /* ── Popover shell ── */\r\n .popover {\r\n position: absolute;\r\n top: calc(100% + 4px);\r\n left: 0;\r\n z-index: 2147483647;\r\n border: 1px solid var(--rel-border-default);\r\n border-radius: var(--rel-border-radius-sm, 8px);\r\n background: var(--rel-bg-neutral);\r\n box-shadow: var(--rel-shadows-shadow-200);\r\n overflow: visible;\r\n display: none;\r\n }\r\n\r\n .popover.open { display: block; }\r\n\r\n .popover.popup {\r\n position: fixed;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(-50%, -50%);\r\n }\r\n\r\n .backdrop {\r\n position: fixed;\r\n inset: 0;\r\n z-index: 2147483646;\r\n background: rgba(0,0,0,0.4);\r\n }\r\n\r\n /* ── Two-panel wrapper ── */\r\n .picker-wrapper {\r\n font-family: var(--rel-body-lg-regular-font-family);\r\n font-weight: var(--rel-body-lg-regular-font-weight);\r\n display: flex;\r\n flex-direction: row;\r\n align-items: stretch;\r\n }\r\n\r\n /* ── Left panel: presets ── */\r\n .presets {\r\n width: 280px;\r\n flex-shrink: 0;\r\n flex-grow: 0;\r\n border-right: 1px solid var(--rel-border-default);\r\n padding: var(--rel-spacing-sm);\r\n background: var(--rel-bg-surface-elevated);\r\n display: flex;\r\n flex-direction: column;\r\n gap: 0;\r\n }\r\n\r\n .presets-grid {\r\n display: grid;\r\n grid-template-columns: 1fr 1fr;\r\n gap: 6px;\r\n }\r\n\r\n .preset-item {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 10px var(--rel-spacing-sm);\r\n cursor: pointer;\r\n font-family: var(--rel-body-sm-medium-font-family);\r\n font-weight: var(--rel-body-sm-medium-font-weight);\r\n font-size: var(--rel-body-sm-medium-font-size);\r\n line-height: var(--rel-body-sm-medium-line-height);\r\n letter-spacing: var(--rel-body-sm-medium-letter-spacing);\r\n color: var(--rel-action-neutral-label-icons-link);\r\n background: var(--rel-bg-neutral-elevated-1);\r\n border: none;\r\n border-radius: var(--rel-border-radius-sm, 8px);\r\n width: 100%;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n transition: background 0.15s ease;\r\n }\r\n\r\n .preset-item:hover:not(.active) {\r\n background: var(--rel-action-overlay-hover);\r\n }\r\n\r\n .preset-item.active {\r\n background: var(--rel-bg-neutral-inverse-2);\r\n color: var(--rel-text-inverse);\r\n font-weight: var(--rel-body-sm-semibold-font-weight);\r\n }\r\n\r\n .preset-item.full-width {\r\n grid-column: 1 / -1;\r\n }\r\n\r\n /* ── FROM/TO inputs ── */\r\n .date-inputs {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n padding: 14px 8px 4px;\r\n border-top: 1px solid var(--rel-border-default);\r\n margin-top: auto;\r\n }\r\n\r\n .date-input-group {\r\n flex: 1;\r\n min-width: 0;\r\n position: relative;\r\n }\r\n\r\n .date-input-label {\r\n position: absolute;\r\n top: -8px;\r\n left: 10px;\r\n /* Figma: the FROM/TO tag is the nested TextField's floating label (body-sm-regular) */\r\n font-family: var(--rel-body-sm-regular-font-family);\r\n font-weight: var(--rel-body-sm-regular-font-weight);\r\n font-size: var(--rel-body-sm-regular-font-size);\r\n line-height: var(--rel-body-sm-regular-line-height);\r\n letter-spacing: var(--rel-body-sm-regular-letter-spacing);\r\n color: var(--rel-text-body);\r\n background: var(--rel-bg-surface);\r\n padding: 0 3px;\r\n }\r\n\r\n .date-input-value {\r\n display: block;\r\n border: 1px solid var(--rel-border-default);\r\n border-radius: var(--rel-border-radius-sm, 8px);\r\n padding: 6px 8px;\r\n color: var(--rel-text-default);\r\n background: var(--rel-bg-surface);\r\n width: 100%;\r\n box-sizing: border-box;\r\n font-family: var(--rel-body-md-semibold-font-family);\r\n font-weight: var(--rel-body-md-semibold-font-weight);\r\n font-size: var(--rel-body-md-semibold-font-size);\r\n line-height: var(--rel-body-md-semibold-line-height);\r\n letter-spacing: var(--rel-body-md-semibold-letter-spacing);\r\n }\r\n\r\n .date-input-value.empty {\r\n color: var(--rel-text-placeholder);\r\n font-weight: var(--rel-body-md-regular-font-weight);\r\n }\r\n\r\n /* ── Right panel: calendar ── */\r\n .calendar-panel {\r\n width: 300px;\r\n flex-shrink: 0;\r\n flex-grow: 0;\r\n padding: 12px;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 6px;\r\n }\r\n\r\n .calendar-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 0 2px;\r\n }\r\n\r\n .month-label {\r\n font-family: var(--rel-body-lg-semibold-font-family);\r\n font-weight: var(--rel-body-lg-semibold-font-weight);\r\n font-size: var(--rel-body-lg-regular-font-size);\r\n line-height: var(--rel-body-lg-regular-line-height);\r\n letter-spacing: var(--rel-body-lg-regular-letter-spacing);\r\n color: var(--rel-text-label);\r\n }\r\n\r\n .nav-btn {\r\n background: none;\r\n border: none;\r\n cursor: pointer;\r\n color: var(--rel-action-neutral-label-icons-ghost);\r\n padding: var(--rel-spacing-2xs);\r\n border-radius: var(--rel-border-radius-sm, 8px);\r\n display: flex;\r\n align-items: center;\r\n transition: background 0.15s ease;\r\n }\r\n\r\n .nav-btn:hover { background: var(--rel-action-overlay-hover); }\r\n\r\n /* ── Weekday header ── */\r\n .week-header {\r\n display: grid;\r\n grid-template-columns: repeat(7, 1fr);\r\n text-align: center;\r\n }\r\n\r\n .week-day {\r\n color: var(--rel-text-body);\r\n padding: 2px 0;\r\n /* Figma: sm-regular family + xs-medium weight on sm-medium metrics */\r\n font-family: var(--rel-body-sm-regular-font-family);\r\n font-weight: var(--rel-body-xs-medium-font-weight);\r\n font-size: var(--rel-body-sm-medium-font-size);\r\n line-height: var(--rel-body-sm-medium-line-height);\r\n letter-spacing: var(--rel-body-sm-medium-letter-spacing);\r\n text-align: center;\r\n }\r\n\r\n /* ── Calendar grid ── */\r\n .calendar-grid {\r\n display: grid;\r\n grid-template-columns: repeat(7, 1fr);\r\n }\r\n\r\n .day-cell {\r\n height: 36px;\r\n position: relative;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n cursor: pointer;\r\n }\r\n\r\n .day-cell.other-month {\r\n opacity: 0.35;\r\n pointer-events: none;\r\n }\r\n\r\n .day-cell.disabled {\r\n opacity: 0.4;\r\n pointer-events: none;\r\n }\r\n\r\n .day-cell.in-range {\r\n background: var(--rel-bg-neutral-elevated-2);\r\n }\r\n\r\n .day-cell.range-start:not(.range-end) {\r\n background: linear-gradient(to right, transparent 50%, var(--rel-bg-neutral-elevated-2) 50%);\r\n }\r\n\r\n .day-cell.range-end:not(.range-start) {\r\n background: linear-gradient(to left, transparent 50%, var(--rel-bg-neutral-elevated-2) 50%);\r\n }\r\n\r\n .day-cell.range-start.range-end {\r\n background: transparent;\r\n }\r\n\r\n /* ── Day inner circle ── */\r\n .day-inner {\r\n width: 32px;\r\n height: 32px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: 50%;\r\n font-family: var(--rel-body-sm-medium-font-family);\r\n font-weight: var(--rel-body-sm-medium-font-weight);\r\n font-size: var(--rel-body-sm-medium-font-size);\r\n line-height: var(--rel-body-sm-medium-line-height);\r\n letter-spacing: var(--rel-body-sm-medium-letter-spacing);\r\n color: var(--rel-text-default);\r\n position: relative;\r\n z-index: 1;\r\n transition: background 0.15s ease;\r\n }\r\n\r\n .day-cell:not(.disabled):not(.other-month):not(.range-start):not(.range-end):hover .day-inner {\r\n background: var(--rel-action-overlay-hover);\r\n }\r\n\r\n /* Pressed (Figma State=Active): elevated-2 fill on the day circle */\r\n .day-cell:not(.disabled):not(.other-month):not(.range-start):not(.range-end):active .day-inner {\r\n background: var(--rel-bg-neutral-elevated-2);\r\n }\r\n\r\n /* Weekend (Figma Day of a week=Weekend): 70% text opacity unless a range endpoint */\r\n .day-cell.weekend:not(.range-start):not(.range-end) .day-inner {\r\n opacity: 0.7;\r\n }\r\n\r\n /* Today: green outline */\r\n .day-cell.today:not(.range-start):not(.range-end) .day-inner {\r\n font-weight: var(--rel-body-md-medium-font-weight);\r\n border: 2px solid var(--rel-border-brand);\r\n }\r\n\r\n /* Range endpoints: dark fill */\r\n .day-cell.range-start .day-inner,\r\n .day-cell.range-end .day-inner {\r\n background: var(--rel-action-brand-fill);\r\n color: var(--rel-action-brand-label-icons-primary);\r\n font-weight: var(--rel-body-sm-semibold-font-weight);\r\n }\r\n\r\n /* Today AND endpoint: green ring + dark fill */\r\n .day-cell.today.range-start .day-inner,\r\n .day-cell.today.range-end .day-inner {\r\n background: var(--rel-action-brand-fill);\r\n color: var(--rel-action-brand-label-icons-primary);\r\n border: 2px solid var(--rel-border-brand);\r\n }\r\n\r\n /* ── Footer ── */\r\n .calendar-footer {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding-top: 12px;\r\n border-top: 1px solid var(--rel-border-default);\r\n margin-top: auto;\r\n gap: 8px;\r\n }\r\n\r\n .footer-right {\r\n display: flex;\r\n gap: 8px;\r\n }\r\n\r\n @media (prefers-reduced-motion: reduce) {\r\n .preset-item, .nav-btn, .day-inner {\r\n transition: none;\r\n }\r\n }\r\n `;\r\n\r\n // ── Lifecycle ──\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n document.addEventListener(\"click\", this.handleClickOutside);\r\n document.addEventListener(\"keydown\", this.handleGlobalKeydown);\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback();\r\n document.removeEventListener(\"click\", this.handleClickOutside);\r\n document.removeEventListener(\"keydown\", this.handleGlobalKeydown);\r\n }\r\n\r\n updated() {\r\n this.style.width = this.width;\r\n this.style.minWidth = this.minWidth;\r\n this.style.maxWidth = this.maxWidth;\r\n this.style.height = this.height;\r\n this.style.minHeight = this.minHeight;\r\n this.style.maxHeight = this.maxHeight;\r\n }\r\n\r\n // ── Open / close ──\r\n\r\n private handleClickOutside = (e: MouseEvent) => {\r\n if (!this.open) return;\r\n const path = e.composedPath();\r\n if (!path.includes(this)) {\r\n this.cancelPopover();\r\n }\r\n };\r\n\r\n private handleGlobalKeydown = (e: KeyboardEvent) => {\r\n if (!this.open) return;\r\n\r\n if (e.key === \"Escape\") {\r\n this.cancelPopover();\r\n this.triggerButton?.focus();\r\n return;\r\n }\r\n\r\n if ((e.target as HTMLElement)?.tagName === \"INPUT\") return;\r\n\r\n const key = e.key.toUpperCase();\r\n const keyMap: Record<string, string> = {\r\n T: \"Today\",\r\n M: \"Tomorrow\",\r\n B: \"Before Today\",\r\n W: \"This Week\",\r\n N: \"Next Week\",\r\n \"7\": \"Next 7 Days\",\r\n \"3\": \"Next 30 Days\",\r\n };\r\n\r\n const label = keyMap[key];\r\n if (!label) return;\r\n\r\n const qs = this.getQuickSelects().find((q) => q.label === label);\r\n if (qs) this.selectQuickSelect(qs);\r\n };\r\n\r\n private toggleOpen() {\r\n if (this.disabled) return;\r\n if (this.open) {\r\n this.cancelPopover();\r\n } else {\r\n this.openPopover();\r\n }\r\n }\r\n\r\n private openPopover() {\r\n this.draftFrom = this.from;\r\n this.draftTo = this.to;\r\n this.draftActivePreset = null;\r\n this.isSelectingRange = false;\r\n this.hoverDate = null;\r\n\r\n if (this.draftFrom) {\r\n const date = this.parseISODate(this.draftFrom);\r\n if (date) {\r\n this.viewYear = date.getFullYear();\r\n this.viewMonth = date.getMonth();\r\n }\r\n } else {\r\n const now = new Date();\r\n this.viewYear = now.getFullYear();\r\n this.viewMonth = now.getMonth();\r\n }\r\n\r\n this.open = true;\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-open-change\", {\r\n detail: { open: true },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private cancelPopover() {\r\n if (!this.open) return;\r\n this.open = false;\r\n this.draftFrom = \"\";\r\n this.draftTo = \"\";\r\n this.draftActivePreset = null;\r\n this.isSelectingRange = false;\r\n this.hoverDate = null;\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-open-change\", {\r\n detail: { open: false },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private applySelection() {\r\n if (this.draftFrom || this.draftTo) {\r\n this.from = this.draftFrom;\r\n this.to = this.draftTo;\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-change\", {\r\n detail: { from: this.from, to: this.to, label: this.displayLabel },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n this.open = false;\r\n this.isSelectingRange = false;\r\n this.hoverDate = null;\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-open-change\", {\r\n detail: { open: false },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n }\r\n\r\n private resetDraft() {\r\n if (this.draftFrom || this.draftTo) {\r\n this.draftFrom = \"\";\r\n this.draftTo = \"\";\r\n this.draftActivePreset = null;\r\n this.isSelectingRange = false;\r\n this.hoverDate = null;\r\n }\r\n }\r\n\r\n private getTriggerLabel(): string {\r\n const from = this.from ? this.formatDisplayDate(this.from) : null;\r\n const to = this.to ? this.formatDisplayDate(this.to) : null;\r\n if (from && to) return `${from} → ${to}`;\r\n if (from) return from;\r\n return \"\";\r\n }\r\n\r\n /** Formatted \"MM/DD/YYYY → MM/DD/YYYY\" (or single date / \"\") for the current committed `from`/`to`. */\r\n get displayLabel(): string {\r\n return this.getTriggerLabel();\r\n }\r\n\r\n // ── Date utilities ──\r\n\r\n private parseISODate(iso: string): Date | null {\r\n const m = iso.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\r\n if (!m) return null;\r\n return new Date(parseInt(m[1]), parseInt(m[2]) - 1, parseInt(m[3]));\r\n }\r\n\r\n private formatISODate(date: Date): string {\r\n const y = date.getFullYear();\r\n const mo = String(date.getMonth() + 1).padStart(2, \"0\");\r\n const d = String(date.getDate()).padStart(2, \"0\");\r\n return `${y}-${mo}-${d}`;\r\n }\r\n\r\n private formatDisplayDate(iso: string): string {\r\n const date = this.parseISODate(iso);\r\n if (!date) return \"\";\r\n return new Intl.DateTimeFormat(\"en-US\", {\r\n month: \"2-digit\",\r\n day: \"2-digit\",\r\n year: \"numeric\",\r\n }).format(date);\r\n }\r\n\r\n private isSameDay(a: Date, b: Date): boolean {\r\n return (\r\n a.getFullYear() === b.getFullYear() &&\r\n a.getMonth() === b.getMonth() &&\r\n a.getDate() === b.getDate()\r\n );\r\n }\r\n\r\n private isDateDisabled(date: Date): boolean {\r\n if (this.minDate) {\r\n const min = this.parseISODate(this.minDate);\r\n if (min && date < min) return true;\r\n }\r\n if (this.maxDate) {\r\n const max = this.parseISODate(this.maxDate);\r\n if (max && date > max) return true;\r\n }\r\n return false;\r\n }\r\n\r\n // ── Quick selects ──\r\n\r\n private getQuickSelects(): QuickSelect[] {\r\n const today = new Date();\r\n today.setHours(0, 0, 0, 0);\r\n\r\n const yesterday = new Date(today);\r\n yesterday.setDate(today.getDate() - 1);\r\n\r\n const tomorrow = new Date(today);\r\n tomorrow.setDate(today.getDate() + 1);\r\n\r\n const dow = today.getDay(); // 0 = Sun\r\n const thisSunday = new Date(today);\r\n thisSunday.setDate(today.getDate() - dow);\r\n const thisSaturday = new Date(thisSunday);\r\n thisSaturday.setDate(thisSunday.getDate() + 6);\r\n\r\n const nextSunday = new Date(thisSunday);\r\n nextSunday.setDate(thisSunday.getDate() + 7);\r\n const nextSaturday = new Date(nextSunday);\r\n nextSaturday.setDate(nextSunday.getDate() + 6);\r\n\r\n const next7To = new Date(today);\r\n next7To.setDate(today.getDate() + 6);\r\n\r\n const next30To = new Date(today);\r\n next30To.setDate(today.getDate() + 29);\r\n\r\n return [\r\n { label: \"Today\", key: \"T\", from: this.formatISODate(today), to: this.formatISODate(today) },\r\n { label: \"Tomorrow\", key: \"M\", from: this.formatISODate(tomorrow), to: this.formatISODate(tomorrow) },\r\n { label: \"Before Today\", key: \"B\", from: \"1970-01-01\", to: this.formatISODate(yesterday) },\r\n { label: \"This Week\", key: \"W\", from: this.formatISODate(thisSunday), to: this.formatISODate(thisSaturday) },\r\n { label: \"Next Week\", key: \"N\", from: this.formatISODate(nextSunday), to: this.formatISODate(nextSaturday) },\r\n { label: \"Next 7 Days\", key: \"7\", from: this.formatISODate(today), to: this.formatISODate(next7To) },\r\n { label: \"Next 30 Days\", key: \"3\", from: this.formatISODate(today), to: this.formatISODate(next30To), fullWidth: true },\r\n ];\r\n }\r\n\r\n private selectQuickSelect(qs: QuickSelect) {\r\n if (this.disabled) return;\r\n this.draftFrom = qs.from;\r\n this.draftTo = qs.to;\r\n this.draftActivePreset = qs.label;\r\n this.isSelectingRange = false;\r\n this.hoverDate = null;\r\n\r\n const date = this.parseISODate(qs.from);\r\n if (date) {\r\n this.viewYear = date.getFullYear();\r\n this.viewMonth = date.getMonth();\r\n }\r\n }\r\n\r\n // ── Calendar navigation ──\r\n\r\n private previousMonth() {\r\n if (this.viewMonth === 0) {\r\n this.viewMonth = 11;\r\n this.viewYear--;\r\n } else {\r\n this.viewMonth--;\r\n }\r\n }\r\n\r\n private nextMonth() {\r\n if (this.viewMonth === 11) {\r\n this.viewMonth = 0;\r\n this.viewYear++;\r\n } else {\r\n this.viewMonth++;\r\n }\r\n }\r\n\r\n private getMonthName(): string {\r\n return new Intl.DateTimeFormat(\"en-US\", { month: \"long\" }).format(\r\n new Date(this.viewYear, this.viewMonth, 1)\r\n );\r\n }\r\n\r\n private getWeekdayLabels(): string[] {\r\n const formatter = new Intl.DateTimeFormat(\"en-US\", { weekday: \"short\" });\r\n const base = new Date(2024, 0, 7); // Sunday Jan 7 2024\r\n return Array.from({ length: 7 }, (_, i) => {\r\n const offset = this.weekStart === \"mon\" ? i + 1 : i;\r\n const d = new Date(base);\r\n d.setDate(base.getDate() + offset);\r\n return formatter.format(d).substring(0, 2);\r\n });\r\n }\r\n\r\n // ── Calendar day computation ──\r\n\r\n private getCalendarDays(): RangeDay[] {\r\n const today = new Date();\r\n today.setHours(0, 0, 0, 0);\r\n\r\n const firstDay = new Date(this.viewYear, this.viewMonth, 1);\r\n const lastDay = new Date(this.viewYear, this.viewMonth + 1, 0);\r\n\r\n const draftFromDate = this.draftFrom ? this.parseISODate(this.draftFrom) : null;\r\n const draftToDate = this.draftTo ? this.parseISODate(this.draftTo) : null;\r\n\r\n let effectiveFrom: Date | null = draftFromDate;\r\n let effectiveTo: Date | null = draftToDate;\r\n\r\n if (this.isSelectingRange && this.hoverDate && draftFromDate) {\r\n const hDate = this.parseISODate(this.hoverDate);\r\n if (hDate) {\r\n if (hDate.getTime() >= draftFromDate.getTime()) {\r\n effectiveFrom = draftFromDate;\r\n effectiveTo = hDate;\r\n } else {\r\n effectiveFrom = hDate;\r\n effectiveTo = draftFromDate;\r\n }\r\n }\r\n }\r\n\r\n const days: RangeDay[] = [];\r\n\r\n let startDay = firstDay.getDay();\r\n if (this.weekStart === \"mon\") {\r\n startDay = startDay === 0 ? 6 : startDay - 1;\r\n }\r\n for (let i = startDay - 1; i >= 0; i--) {\r\n const date = new Date(this.viewYear, this.viewMonth, -i);\r\n days.push({\r\n date,\r\n day: date.getDate(),\r\n isCurrentMonth: false,\r\n isToday: false,\r\n isDraftFrom: false,\r\n isDraftTo: false,\r\n isInRange: false,\r\n isDisabled: true,\r\n isWeekend: date.getDay() === 0 || date.getDay() === 6,\r\n });\r\n }\r\n\r\n for (let d = 1; d <= lastDay.getDate(); d++) {\r\n const date = new Date(this.viewYear, this.viewMonth, d);\r\n const t = date.getTime();\r\n\r\n const isDraftFrom = !!effectiveFrom && this.isSameDay(date, effectiveFrom);\r\n const isDraftTo = !!effectiveTo && this.isSameDay(date, effectiveTo);\r\n const isInRange =\r\n !!effectiveFrom &&\r\n !!effectiveTo &&\r\n t > effectiveFrom.getTime() &&\r\n t < effectiveTo.getTime();\r\n\r\n days.push({\r\n date,\r\n day: d,\r\n isCurrentMonth: true,\r\n isToday: this.isSameDay(date, today),\r\n isDraftFrom,\r\n isDraftTo,\r\n isInRange,\r\n isDisabled: this.isDateDisabled(date),\r\n isWeekend: date.getDay() === 0 || date.getDay() === 6,\r\n });\r\n }\r\n\r\n const remaining = 42 - days.length;\r\n for (let i = 1; i <= remaining; i++) {\r\n const date = new Date(this.viewYear, this.viewMonth + 1, i);\r\n days.push({\r\n date,\r\n day: date.getDate(),\r\n isCurrentMonth: false,\r\n isToday: false,\r\n isDraftFrom: false,\r\n isDraftTo: false,\r\n isInRange: false,\r\n isDisabled: true,\r\n isWeekend: date.getDay() === 0 || date.getDay() === 6,\r\n });\r\n }\r\n\r\n return days;\r\n }\r\n\r\n // ── Day click / hover ──\r\n\r\n private handleDayClick(day: RangeDay) {\r\n if (day.isDisabled || this.disabled) return;\r\n const iso = this.formatISODate(day.date);\r\n\r\n if (!this.isSelectingRange) {\r\n this.draftFrom = iso;\r\n this.draftTo = \"\";\r\n this.draftActivePreset = null;\r\n this.isSelectingRange = true;\r\n this.hoverDate = null;\r\n } else {\r\n const fromDate = this.parseISODate(this.draftFrom);\r\n if (!fromDate) {\r\n this.draftFrom = iso;\r\n this.draftTo = \"\";\r\n return;\r\n }\r\n\r\n if (day.date.getTime() >= fromDate.getTime()) {\r\n this.draftTo = iso;\r\n } else {\r\n this.draftTo = this.draftFrom;\r\n this.draftFrom = iso;\r\n }\r\n\r\n this.isSelectingRange = false;\r\n this.hoverDate = null;\r\n this.draftActivePreset = null;\r\n }\r\n }\r\n\r\n private handleDayHover(day: RangeDay) {\r\n if (!this.isSelectingRange || day.isDisabled) return;\r\n this.hoverDate = this.formatISODate(day.date);\r\n }\r\n\r\n // ── Render ──\r\n\r\n render() {\r\n const quickSelects = this.getQuickSelects();\r\n const days = this.getCalendarDays();\r\n const weekdayLabels = this.getWeekdayLabels();\r\n\r\n const draftFromDisplay = this.draftFrom ? this.formatDisplayDate(this.draftFrom) : \"\";\r\n const draftToDisplay = this.draftTo ? this.formatDisplayDate(this.draftTo) : \"\";\r\n const triggerLabel = this.getTriggerLabel();\r\n const isDraftEmpty = !this.draftFrom && !this.draftTo;\r\n const isPopup = this.mode === \"popup\";\r\n\r\n return html`\r\n ${this.triggerVariant === \"icon\"\r\n ? html`\r\n <rel-button\r\n variant=\"icon\"\r\n tone=\"secondary\"\r\n ?disabled=${this.disabled}\r\n aria-haspopup=\"dialog\"\r\n aria-expanded=${this.open}\r\n aria-label=${triggerLabel || this.placeholder}\r\n @click=${() => this.toggleOpen()}\r\n >\r\n <rel-icon name=\"calendar-range\"></rel-icon>\r\n </rel-button>\r\n `\r\n : html`\r\n <button\r\n part=\"trigger\" class=\"trigger-button\"\r\n type=\"button\"\r\n ?disabled=${this.disabled}\r\n aria-haspopup=\"dialog\"\r\n aria-expanded=${this.open}\r\n aria-label=${triggerLabel || this.placeholder}\r\n @click=${this.toggleOpen}\r\n >\r\n <span class=\"trigger-content ${triggerLabel ? \"\" : \"placeholder\"}\">\r\n ${triggerLabel || this.placeholder}\r\n </span>\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\r\n <path d=\"M4 2h1V1h2v1h2V1h2v1h1a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zm8 3H4v7h8V5z\"/>\r\n </svg>\r\n </button>\r\n `}\r\n\r\n ${isPopup && this.open\r\n ? html`<div part=\"overlay\" class=\"backdrop\" @click=${this.cancelPopover}></div>`\r\n : nothing}\r\n\r\n <div\r\n part=\"panel\" class=\"popover ${this.open ? \"open\" : \"\"} ${isPopup ? \"popup\" : \"\"}\"\r\n role=\"dialog\"\r\n aria-label=\"Select date range\"\r\n >\r\n <div class=\"picker-wrapper\">\r\n\r\n <!-- ── Left: Quick select ── -->\r\n <div part=\"list\" class=\"presets\">\r\n <div class=\"presets-grid\" role=\"list\" aria-label=\"Quick date selections\">\r\n ${quickSelects.map(\r\n (qs) => html`\r\n <button\r\n part=\"option\" class=\"preset-item ${qs.fullWidth ? \"full-width\" : \"\"} ${this.draftActivePreset === qs.label ? \"active\" : \"\"}\"\r\n type=\"button\"\r\n role=\"listitem\"\r\n ?disabled=${this.disabled}\r\n aria-pressed=${this.draftActivePreset === qs.label}\r\n @click=${() => this.selectQuickSelect(qs)}\r\n >\r\n <span>${qs.label}</span>\r\n ${this.draftActivePreset === qs.label\r\n ? html`<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n <circle cx=\"12\" cy=\"12\" r=\"12\" fill=\"var(--rel-bg-brand)\"/>\r\n <path d=\"M7 12.5l3.5 3.5 6.5-7\" stroke=\"var(--rel-text-static-dark)\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>`\r\n : nothing}\r\n </button>\r\n `\r\n )}\r\n </div>\r\n\r\n <div class=\"date-inputs\">\r\n <div class=\"date-input-group\" aria-label=\"From date\">\r\n <span class=\"date-input-label\">FROM</span>\r\n <div class=\"date-input-value ${draftFromDisplay ? \"\" : \"empty\"}\">\r\n ${draftFromDisplay || \"MM/DD/YYYY\"}\r\n </div>\r\n </div>\r\n <div class=\"date-input-group\" aria-label=\"To date\">\r\n <span class=\"date-input-label\">TO</span>\r\n <div class=\"date-input-value ${draftToDisplay ? \"\" : \"empty\"}\">\r\n ${draftToDisplay || \"MM/DD/YYYY\"}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- ── Right: Calendar panel ── -->\r\n <div class=\"calendar-panel\">\r\n\r\n <div class=\"calendar-header\">\r\n <button\r\n part=\"action\" class=\"nav-btn\"\r\n type=\"button\"\r\n aria-label=\"Previous month\"\r\n @click=${this.previousMonth}\r\n >\r\n <rel-icon name=\"chevron-left\" size=\"sm\"></rel-icon>\r\n </button>\r\n <span class=\"month-label\">${this.getMonthName()} ${this.viewYear}</span>\r\n <button\r\n part=\"action\" class=\"nav-btn\"\r\n type=\"button\"\r\n aria-label=\"Next month\"\r\n @click=${this.nextMonth}\r\n >\r\n <rel-icon name=\"chevron-right\" size=\"sm\"></rel-icon>\r\n </button>\r\n </div>\r\n\r\n <div class=\"week-header\" role=\"row\">\r\n ${weekdayLabels.map(\r\n (label) => html`\r\n <div class=\"week-day\" role=\"columnheader\" aria-label=\"${label}\">\r\n ${label}\r\n </div>\r\n `\r\n )}\r\n </div>\r\n\r\n <div\r\n part=\"list\" class=\"calendar-grid\"\r\n role=\"grid\"\r\n aria-label=\"Select date range\"\r\n @mouseleave=${() => { this.hoverDate = null; }}\r\n >\r\n ${days.map((day) => {\r\n const cellClasses = [\r\n \"day-cell\",\r\n day.isInRange ? \"in-range\" : \"\",\r\n day.isDraftFrom ? \"range-start\" : \"\",\r\n day.isDraftTo ? \"range-end\" : \"\",\r\n day.isToday ? \"today\" : \"\",\r\n day.isDisabled ? \"disabled\" : \"\",\r\n !day.isCurrentMonth ? \"other-month\" : \"\",\r\n day.isWeekend ? \"weekend\" : \"\",\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return html`\r\n <div\r\n class=\"${cellClasses}\"\r\n role=\"gridcell\"\r\n aria-label=\"${this.formatISODate(day.date)}\"\r\n aria-selected=\"${day.isDraftFrom || day.isDraftTo || day.isInRange}\"\r\n @click=${() => this.handleDayClick(day)}\r\n @mouseenter=${() => this.handleDayHover(day)}\r\n >\r\n <span class=\"day-inner\">${day.day}</span>\r\n </div>\r\n `;\r\n })}\r\n </div>\r\n\r\n <div part=\"footer\" class=\"calendar-footer\">\r\n <rel-button\r\n variant=\"secondary\"\r\n size=\"small\"\r\n border=\"corner-radius\"\r\n ?disabled=${isDraftEmpty}\r\n @click=${() => this.resetDraft()}\r\n >\r\n Reset\r\n </rel-button>\r\n <div class=\"footer-right\">\r\n <rel-button\r\n variant=\"secondary\"\r\n size=\"small\"\r\n border=\"corner-radius\"\r\n @click=${() => this.cancelPopover()}\r\n >\r\n Cancel\r\n </rel-button>\r\n <rel-button\r\n variant=\"primary\"\r\n tone=\"default\"\r\n size=\"small\"\r\n border=\"corner-radius\"\r\n ?disabled=${isDraftEmpty}\r\n @click=${() => this.applySelection()}\r\n >\r\n Apply\r\n </rel-button>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n `;\r\n\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"rel-range-picker\": RelRangePicker;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport \"../rel-avatar/rel-avatar.js\";\nimport \"@reliability-design/icons/rel-icon\";\n\nexport type ChipTone = \"neutral\" | \"danger\" | \"warning\" | \"success\" | \"info\";\nexport type ChipVariant = \"fill\" | \"subtle\";\nexport type ChipSize = \"sm\" | \"md\" | \"lg\";\nexport type ChipBorder = \"default\" | \"rounded\";\n\n@customElement(\"rel-chip\")\nexport class RelChip extends LitElement {\n // The actually-focusable element is the inner <span tabindex=\"0\">, not the\n // host. Without delegatesFocus, calling host.focus() (e.g. from a parent\n // component, or a \"focus this\" demo button) is a no-op since the host\n // itself carries no tabindex — only real Tab-key traversal would still\n // reach the inner span, because that walks the flattened DOM regardless.\n static override shadowRootOptions: ShadowRootInit = {\n ...LitElement.shadowRootOptions,\n delegatesFocus: true,\n };\n\n @property({ type: String }) label = \"Label\";\n\n @property({ type: String, reflect: true }) tone: ChipTone = \"neutral\";\n\n @property({ type: String, reflect: true }) variant: ChipVariant = \"fill\";\n\n @property({ type: String, reflect: true }) size: ChipSize = \"md\";\n\n @property({ type: String, reflect: true }) border: ChipBorder = \"default\";\n\n /** Icon name from the generated icon dictionary (e.g. \"settings\") — rendered via <rel-icon>. */\n @property({ type: String, attribute: \"leading-icon\" }) leadingIcon?: string;\n @property({ type: String, attribute: \"trailing-icon\" }) trailingIcon?: string;\n /** Initials text for the avatar (e.g. \"JD\"). Mutually exclusive with leadingIcon. */\n @property({ type: String }) avatar?: string;\n\n @property({ type: Boolean }) removable = false;\n\n /** IMPORTANT: reflected so CSS + Angular can see it */\n @property({ type: Boolean, reflect: true }) removed = false;\n\n /** Opt-in native drag-and-drop — reflects the Figma \"Dragged\" state automatically during a real drag gesture. */\n // Explicit attribute mapping — Lit's default attribute name for a camelCase\n // property is the name fully lowercased (no hyphens), so without this it'd\n // only respond to draggablechip=\"\", not draggable-chip.\n @property({ type: Boolean, attribute: \"draggable-chip\" }) draggableChip = false;\n\n /** Reflected so CSS can target the Figma \"Dragged\" visual state. Driven automatically by dragstart/dragend when draggableChip is set. */\n @state() private dragging = false;\n\n static styles = css`\n :host {\n color: var(--rel-text-default);\n display: inline-flex;\n width: auto;\n flex: 0 0 auto;\n }\n\n :host([removed]) {\n display: none;\n }\n\n .chip {\n display: inline-flex;\n align-items: center;\n box-sizing: border-box;\n border: 1px solid transparent;\n gap: var(--rel-spacing-xs);\n cursor: pointer;\n user-select: none;\n white-space: nowrap;\n outline: none;\n background: transparent;\n transition: background-color 0.15s ease;\n }\n\n /* ── Size ── */\n :host([size=\"lg\"]) .chip {\n height: 32px;\n padding: var(--rel-spacing-2xs) var(--rel-spacing-xs);\n font-family: var(--rel-body-lg-regular-font-family);\n font-weight: var(--rel-body-lg-medium-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 :host([size=\"md\"]) .chip {\n height: 28px;\n padding: var(--rel-spacing-2xs) var(--rel-spacing-xs);\n font-family: var(--rel-body-md-regular-font-family);\n font-weight: var(--rel-body-md-medium-font-weight);\n font-size: var(--rel-body-md-regular-font-size);\n line-height: var(--rel-body-md-regular-line-height);\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\n }\n\n :host([size=\"sm\"]) .chip {\n height: 24px;\n padding: var(--rel-spacing-2xs) var(--rel-spacing-xs);\n font-family: var(--rel-body-sm-regular-font-family);\n font-weight: var(--rel-body-xs-medium-font-weight);\n font-size: var(--rel-body-sm-medium-font-size);\n line-height: var(--rel-body-sm-medium-line-height);\n letter-spacing: var(--rel-body-sm-medium-letter-spacing);\n }\n\n /* ── Border / shape — \"Rounded\" also widens horizontal padding to 12px,\n consistent across all three sizes per the Figma spec. ── */\n :host([border=\"default\"]) .chip {\n border-radius: var(--rel-border-radius-xs);\n }\n\n :host([border=\"rounded\"]) .chip {\n border-radius: var(--rel-border-radius-full-rounded);\n padding-left: var(--rel-spacing-sm);\n padding-right: var(--rel-spacing-sm);\n }\n\n /* ── Tone x Variant — V2 action tokens (auto light/dark) ── */\n :host([tone=\"neutral\"][variant=\"fill\"]) .chip {\n background: var(--rel-action-neutral-fill);\n color: var(--rel-text-inverse);\n }\n :host([tone=\"neutral\"][variant=\"subtle\"]) .chip {\n background: var(--rel-action-neutral-subtle);\n color: var(--rel-action-neutral-label-icons-subtle);\n }\n :host([tone=\"danger\"][variant=\"fill\"]) .chip {\n background: var(--rel-action-danger-fill);\n color: var(--rel-text-static-light);\n }\n :host([tone=\"danger\"][variant=\"subtle\"]) .chip {\n background: var(--rel-action-danger-subtle);\n color: var(--rel-action-danger-label-icons-subtle);\n }\n :host([tone=\"warning\"][variant=\"fill\"]) .chip {\n background: var(--rel-action-warning-fill);\n color: var(--rel-action-warning-label-icons-fill);\n }\n :host([tone=\"warning\"][variant=\"subtle\"]) .chip {\n background: var(--rel-action-warning-subtle);\n color: var(--rel-action-warning-label-icons-subtle);\n }\n :host([tone=\"success\"][variant=\"fill\"]) .chip {\n background: var(--rel-action-success-fill);\n color: var(--rel-action-success-label-icons-fill);\n }\n :host([tone=\"success\"][variant=\"subtle\"]) .chip {\n background: var(--rel-action-success-subtle);\n color: var(--rel-action-success-label-icons-subtle);\n }\n :host([tone=\"info\"][variant=\"fill\"]) .chip {\n background: var(--rel-action-info-fill);\n color: var(--rel-action-info-label-icons-fill);\n }\n :host([tone=\"info\"][variant=\"subtle\"]) .chip {\n background: var(--rel-action-info-subtle);\n color: var(--rel-action-info-label-icons-subtle);\n }\n\n /* ── Hover / Dragged — per-tone V2 action state tokens ── */\n :host([tone=\"neutral\"][variant=\"fill\"]) .chip:hover {\n background: var(--rel-action-neutral-fill-hover);\n }\n :host([tone=\"neutral\"][variant=\"fill\"]) .chip:active,\n :host([tone=\"neutral\"][variant=\"fill\"][dragging]) .chip {\n background: var(--rel-action-neutral-fill-dragged);\n }\n :host([tone=\"neutral\"][variant=\"subtle\"]) .chip:hover {\n border-color: var(--rel-action-neutral-border-subtle-hover);\n background: var(--rel-action-neutral-subtle-hover);\n }\n :host([tone=\"neutral\"][variant=\"subtle\"]) .chip:active,\n :host([tone=\"neutral\"][variant=\"subtle\"][dragging]) .chip {\n border-color: var(--rel-action-neutral-border-subtle-dragged);\n background: var(--rel-action-neutral-subtle-dragged);\n }\n :host([tone=\"danger\"][variant=\"fill\"]) .chip:hover {\n background: var(--rel-action-danger-fill-hover);\n }\n :host([tone=\"danger\"][variant=\"fill\"]) .chip:active,\n :host([tone=\"danger\"][variant=\"fill\"][dragging]) .chip {\n background: var(--rel-action-danger-fill-dragged);\n }\n :host([tone=\"danger\"][variant=\"subtle\"]) .chip:hover {\n border-color: var(--rel-action-danger-border-subtle-hover);\n background: var(--rel-action-danger-subtle-hover);\n color: var(--rel-action-danger-label-icons-subtle-hover);\n }\n :host([tone=\"danger\"][variant=\"subtle\"]) .chip:active,\n :host([tone=\"danger\"][variant=\"subtle\"][dragging]) .chip {\n border-color: var(--rel-action-danger-border-subtle-dragged);\n background: var(--rel-action-danger-subtle-dragged);\n color: var(--rel-action-danger-label-icons-subtle-dragged);\n }\n :host([tone=\"warning\"][variant=\"fill\"]) .chip:hover {\n background: var(--rel-action-warning-fill-hover);\n }\n :host([tone=\"warning\"][variant=\"fill\"]) .chip:active,\n :host([tone=\"warning\"][variant=\"fill\"][dragging]) .chip {\n background: var(--rel-action-warning-fill-dragged);\n }\n :host([tone=\"warning\"][variant=\"subtle\"]) .chip:hover {\n border-color: var(--rel-action-warning-border-subtle-hover);\n background: var(--rel-action-warning-subtle-hover);\n color: var(--rel-action-warning-label-icons-subtle-hover);\n }\n :host([tone=\"warning\"][variant=\"subtle\"]) .chip:active,\n :host([tone=\"warning\"][variant=\"subtle\"][dragging]) .chip {\n border-color: var(--rel-action-warning-border-subtle-dragged);\n background: var(--rel-action-warning-subtle-dragged);\n color: var(--rel-action-warning-label-icons-subtle-dragged);\n }\n :host([tone=\"success\"][variant=\"fill\"]) .chip:hover {\n background: var(--rel-action-success-fill-hover);\n }\n :host([tone=\"success\"][variant=\"fill\"]) .chip:active,\n :host([tone=\"success\"][variant=\"fill\"][dragging]) .chip {\n background: var(--rel-action-success-fill-dragged);\n }\n :host([tone=\"success\"][variant=\"subtle\"]) .chip:hover {\n border-color: var(--rel-action-success-border-subtle-hover);\n background: var(--rel-action-success-subtle-hover);\n color: var(--rel-action-success-label-icons-subtle-hover);\n }\n :host([tone=\"success\"][variant=\"subtle\"]) .chip:active,\n :host([tone=\"success\"][variant=\"subtle\"][dragging]) .chip {\n border-color: var(--rel-action-success-border-subtle-dragged);\n background: var(--rel-action-success-subtle-dragged);\n color: var(--rel-action-success-label-icons-subtle-dragged);\n }\n :host([tone=\"info\"][variant=\"fill\"]) .chip:hover {\n background: var(--rel-action-info-fill-hover);\n }\n :host([tone=\"info\"][variant=\"fill\"]) .chip:active,\n :host([tone=\"info\"][variant=\"fill\"][dragging]) .chip {\n background: var(--rel-action-info-fill-dragged);\n }\n :host([tone=\"info\"][variant=\"subtle\"]) .chip:hover {\n border-color: var(--rel-action-info-border-subtle-hover);\n background: var(--rel-action-info-subtle-hover);\n color: var(--rel-action-info-label-icons-subtle-hover);\n }\n :host([tone=\"info\"][variant=\"subtle\"]) .chip:active,\n :host([tone=\"info\"][variant=\"subtle\"][dragging]) .chip {\n border-color: var(--rel-action-info-border-subtle-dragged);\n background: var(--rel-action-info-subtle-dragged);\n color: var(--rel-action-info-label-icons-subtle-dragged);\n }\n\n :host([dragging]) .chip {\n cursor: grabbing;\n }\n\n /* ── Focused — 1.5px outline, drawn outside (matches Figma's\n strokeAlign:OUTSIDE) so it never affects layout. Same color\n regardless of tone, per spec. OUTSIDE alignment means the stroke\n sits flush against the shape's edge with zero gap, extending\n outward by strokeWeight — outline-offset must be 0, not a positive\n gap (a positive offset was the bug: it drew a visible gap that\n doesn't exist in Figma). ── */\n .chip:focus-visible {\n outline: 1.5px solid var(--rel-chip-focus-ring, var(--rel-border-focus));\n outline-offset: 1.5px;\n box-shadow: 0 0 0 1.5px var(--rel-border-focus-inner);\n }\n\n /* ── Icons ── */\n /* rel-icon renders its SVG inside its own shadow root, so sizing has to\n go through --rel-icon-size (a custom property — pierces shadow\n boundaries) rather than a \".chip-icon svg\" selector, which can never\n reach across shadow DOM. */\n .chip-icon {\n flex-shrink: 0;\n }\n\n :host([size=\"lg\"]) .chip-icon {\n --rel-icon-size: 20px;\n }\n\n :host([size=\"md\"]) .chip-icon {\n --rel-icon-size: 18px;\n }\n\n :host([size=\"sm\"]) .chip-icon {\n --rel-icon-size: 16px;\n }\n\n /* ── Avatar — not shown in the Figma sample. rel-avatar sizes its inner\n .avatar div directly from its own \"size\" prop (fixed presets only —\n no --rel-avatar-size custom property escape hatch like rel-icon has),\n so a host-level width/height override here would only resize the\n empty outer wrapper, not the actual painted circle. \"xs\" (20px) is\n rel-avatar's smallest preset; used uniformly across all three chip\n sizes since there's nothing smaller to ask for. ── */\n .chip rel-avatar {\n display: inline-flex;\n flex-shrink: 0;\n }\n\n :host([variant=\"fill\"]) .chip rel-avatar {\n --rel-avatar-bg-fill: var(--rel-action-overlay-hover-inverse);\n --rel-avatar-color-fill: var(--rel-action-neutral-label-icons-fill-inverse);\n }\n\n :host([variant=\"subtle\"]) .chip rel-avatar {\n --rel-avatar-bg-fill: var(--rel-action-overlay-hover-strong);\n --rel-avatar-color-fill: currentColor;\n }\n\n /* ── Remove (close) button ── */\n .chip-remove {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n cursor: pointer;\n opacity: 0.7;\n background: none;\n border: none;\n color: inherit;\n font: inherit;\n padding: 0;\n line-height: 1;\n }\n\n .chip-remove:hover {\n opacity: 1;\n }\n\n .chip-remove:focus-visible {\n outline: 1.5px solid currentColor;\n outline-offset: 1px;\n border-radius: var(--rel-border-radius-xs);\n }\n\n :host([size=\"lg\"]) .chip-remove {\n --rel-icon-size: 20px;\n }\n :host([size=\"md\"]) .chip-remove {\n --rel-icon-size: 18px;\n }\n :host([size=\"sm\"]) .chip-remove {\n --rel-icon-size: 16px;\n }\n\n `;\n\n private get classes() {\n return \"chip\";\n }\n\n private handleRemove(event: Event) {\n event.stopPropagation();\n this.removed = true;\n\n this.dispatchEvent(\n new CustomEvent(\"removed\", {\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private onDragStart = (e: DragEvent) => {\n if (!this.draggableChip) return;\n this.dragging = true;\n e.dataTransfer?.setData(\"text/plain\", this.label);\n };\n\n private onDragEnd = () => {\n this.dragging = false;\n };\n\n protected updated(changed: Map<string, unknown>) {\n if (changed.has(\"draggableChip\")) {\n if (this.draggableChip) {\n this.setAttribute(\"draggable\", \"true\");\n this.addEventListener(\"dragstart\", this.onDragStart);\n this.addEventListener(\"dragend\", this.onDragEnd);\n } else {\n this.removeAttribute(\"draggable\");\n this.removeEventListener(\"dragstart\", this.onDragStart);\n this.removeEventListener(\"dragend\", this.onDragEnd);\n this.dragging = false;\n }\n }\n if (changed.has(\"dragging\")) {\n this.toggleAttribute(\"dragging\", this.dragging);\n }\n }\n\n render() {\n const showAvatar = !!this.avatar;\n const showLeadingIcon = !showAvatar && !!this.leadingIcon;\n\n if (this.avatar && this.leadingIcon) {\n console.warn(\n \"[rel-chip] leadingIcon and avatar are mutually exclusive. avatar takes precedence.\"\n );\n }\n\n return html`\n <span\n part=\"base\" class=\"${this.classes}\"\n role=\"button\"\n tabindex=\"0\"\n aria-label=\"${this.label}\"\n >\n ${showAvatar\n ? html`<rel-avatar type=\"text\" text=${this.avatar} size=\"xs\"></rel-avatar>`\n : null}\n ${showLeadingIcon\n ? html`<rel-icon part=\"icon\" class=\"chip-icon\" name=\"${this.leadingIcon}\"></rel-icon>`\n : null}\n\n <span part=\"label\" class=\"chip-label\">${this.label}</span>\n\n ${this.trailingIcon\n ? html`<rel-icon class=\"chip-icon\" name=\"${this.trailingIcon}\"></rel-icon>`\n : null}\n ${this.removable\n ? html`<button\n class=\"chip-remove\"\n aria-label=\"Remove ${this.label}\"\n @click=${this.handleRemove}\n >\n <rel-icon name=\"close\"></rel-icon>\n </button>`\n : null}\n </span>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"rel-chip\": RelChip;\n }\n}\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\r\n@customElement(\"rel-container\")\r\nexport class RelContainer extends LitElement {\r\n @property({ type: String, reflect: true }) padding: \"sm\" | \"md\" | \"lg\" | \"xl\" = \"md\";\r\n @property({ type: Boolean }) shadow = false;\r\n @property({ type: String, reflect: true }) background: \"light\" | \"white\" | \"none\" = \"white\";\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n display: block;\r\n width: 100%;\r\n box-sizing: border-box;\r\n }\r\n\r\n .reliability-container {\r\n border-radius: var(--rel-border-radius-sm);\r\n display: block;\r\n width: 100%;\r\n box-sizing: border-box;\r\n }\r\n\r\n .bg-white {\r\n background-color: var(--rel-bg-surface);\r\n }\r\n\r\n .bg-light {\r\n background-color: var(--rel-bg-surface-elevated);\r\n }\r\n\r\n .bg-none {\r\n background: transparent;\r\n }\r\n\r\n /* Default typography for slotted container content (Figma roles) */\r\n ::slotted(h1), ::slotted(h2), ::slotted(h3), ::slotted(h4) {\r\n font-family: var(--rel-headings-sm-font-family);\r\n font-weight: var(--rel-headings-sm-font-weight);\r\n font-size: var(--rel-headings-sm-font-size);\r\n line-height: var(--rel-headings-sm-line-height);\r\n letter-spacing: var(--rel-headings-sm-letter-spacing);\r\n color: var(--rel-text-default);\r\n margin: 0 0 var(--rel-spacing-lg) 0;\r\n }\r\n\r\n ::slotted(p) {\r\n font-family: var(--rel-body-md-regular-font-family);\r\n font-weight: var(--rel-body-md-regular-font-weight);\r\n font-size: var(--rel-body-md-regular-font-size);\r\n line-height: var(--rel-body-md-regular-line-height);\r\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\r\n color: var(--rel-text-body);\r\n margin: 0;\r\n }\r\n\r\n .padding-sm {\r\n padding: var(--rel-spacing-xs);\r\n }\r\n\r\n .padding-md {\r\n padding: var(--rel-spacing-md);\r\n }\r\n\r\n .padding-lg {\r\n padding: var(--rel-spacing-xl);\r\n }\r\n\r\n .padding-xl {\r\n padding: var(--rel-spacing-2xl);\r\n }\r\n\r\n .shadow {\r\n box-shadow: var(--rel-shadows-shadow-300);\r\n }\r\n `;\r\n\r\n private get classes() {\r\n return [\r\n \"reliability-container\",\r\n `bg-${this.background}`,\r\n `padding-${this.padding}`,\r\n this.shadow ? \"shadow\" : \"\",\r\n ].join(\" \");\r\n }\r\n\r\n render() {\r\n return html`\r\n <div part=\"base container\" class=\"${this.classes}\">\r\n <slot></slot>\r\n </div>\r\n `;\r\n }\r\n}\r\n"," import { LitElement, html, css } from \"lit\";\r\n import { customElement, property } from \"lit/decorators.js\";\r\n\r\n @customElement(\"rel-divider\")\r\n export class RelDivider extends LitElement {\r\n @property({ type: String }) orientation: \"horizontal\" | \"vertical\" = \"horizontal\";\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n display: block;\r\n }\r\n\r\n .rel-divider {\r\n position: relative;\r\n display: flex;\r\n background: transparent;\r\n font-family: var(--rel-fonts-font-family);\r\n color: var(--rel-text-default);\r\n }\r\n\r\n /* Horizontal */\r\n .rel-divider.horizontal {\r\n width: 100%;\r\n height: var(--rel-stroke-sm);\r\n background-color: var(--rel-bg-neutral-elevated-2);\r\n margin: var(--rel-spacing-md) 0;\r\n }\r\n\r\n /* Vertical */\r\n .rel-divider.vertical {\r\n width: var(--rel-stroke-sm);\r\n background-color: var(--rel-bg-neutral-elevated-2);\r\n margin: 0 var(--rel-spacing-md);\r\n align-self: stretch;\r\n height: 100%;\r\n }\r\n `;\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n this.setAttribute(\"role\", \"separator\");\r\n }\r\n\r\n updated() {\r\n this.setAttribute(\"aria-orientation\", this.orientation ?? \"horizontal\");\r\n }\r\n\r\n render() {\r\n return html`\r\n <div part=\"base\" class=\"rel-divider ${this.orientation}\" role=\"separator\"></div>\r\n `;\r\n }\r\n }\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property, state, query } from \"lit/decorators.js\";\r\nimport \"@reliability-design/icons/rel-icon\";\r\nimport \"./rel-drawer-footer\";\r\n\r\nexport type DrawerSide = \"bottom\" | \"left\" | \"right\";\r\nexport type DrawerCloseReason = \"backdrop\" | \"escape\" | \"drag\" | \"programmatic\";\r\n\r\n@customElement(\"rel-drawer\")\r\nexport class RelDrawer extends LitElement {\r\n @property({ type: Boolean, reflect: true }) open = false;\r\n @property({ type: String }) side: DrawerSide = \"bottom\";\r\n @property({ type: Boolean }) dismissible = true;\r\n @property({ type: Boolean }) modal = true;\r\n @property({ type: Boolean, attribute: \"close-on-backdrop\" }) closeOnBackdrop = true;\r\n @property({ type: Boolean, attribute: \"close-on-escape\" }) closeOnEscape = true;\r\n @property({ type: Boolean, attribute: \"show-handle\" }) showHandle = true;\r\n @property({ type: Boolean }) draggable = true;\r\n @property({ type: Number, attribute: \"snap-threshold\" }) snapThreshold = 0.25;\r\n @property({ type: String, attribute: \"max-height\" }) maxHeight = \"80vh\";\r\n @property({ type: String }) width = \"\";\r\n @property({ type: String }) title: string = \"\";\r\n @property({ type: String }) description: string = \"\";\r\n\r\n @state() private isDragging = false;\r\n @state() private dragOffset = 0;\r\n // Once a left/right drawer finishes sliding in, we drop its transform so that\r\n // `position: fixed` descendants (select dropdowns, popovers, tooltips) are no\r\n // longer trapped by the transformed panel's containing block.\r\n @state() private settled = false;\r\n\r\n @query(\".panel\") private panelElement!: HTMLElement;\r\n @query(\".overlay\") private overlayElement!: HTMLElement;\r\n\r\n private previousFocus: HTMLElement | null = null;\r\n private startY = 0;\r\n private currentY = 0;\r\n private originalBodyOverflow = \"\";\r\n private originalBodyPaddingRight = \"\";\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n --drawer-transition-duration: 0.3s;\r\n --drawer-transition-timing: cubic-bezier(0.32, 0.72, 0, 1);\r\n }\r\n\r\n .drawer-container {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n z-index: 1000;\r\n pointer-events: none;\r\n /* pointer-events:none only blocks the mouse — the closed drawer's\r\n close button and slotted content would otherwise stay in the Tab\r\n order and swallow keyboard focus into invisible off-screen UI.\r\n visibility also removes them from the tab order; the transition\r\n delays the flip to hidden until the close animation has played. */\r\n visibility: hidden;\r\n transition: visibility 0s linear var(--drawer-transition-duration);\r\n }\r\n\r\n .drawer-container.open {\r\n pointer-events: auto;\r\n visibility: visible;\r\n transition-delay: 0s;\r\n }\r\n\r\n /* Overlay */\r\n .overlay {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n background: var(--rel-overlay-scrim);\r\n opacity: 0;\r\n transition: opacity var(--drawer-transition-duration) var(--drawer-transition-timing);\r\n }\r\n\r\n .drawer-container.open .overlay {\r\n opacity: var(--rel-drawer-scrim-opacity, 1);\r\n }\r\n\r\n /* Panel base */\r\n .panel {\r\n position: absolute;\r\n background: var(--rel-bg-surface);\r\n box-shadow: var(--rel-shadows-shadow-500);\r\n display: flex;\r\n flex-direction: column;\r\n overflow: hidden;\r\n outline: none;\r\n font-family: var(--rel-fonts-font-family);\r\n transition: transform var(--drawer-transition-duration) var(--drawer-transition-timing);\r\n }\r\n\r\n /* Bottom drawer */\r\n .panel[data-side=\"bottom\"] {\r\n bottom: 0;\r\n left: 50%;\r\n right: auto;\r\n width: var(--drawer-width, clamp(640px, 66vw, 952px));\r\n height: var(--drawer-height, clamp(360px, 49vh, 600px));\r\n border-radius: var(--rel-border-radius-sm)\r\n var(--rel-border-radius-sm)\r\n 0\r\n 0;\r\n transform: translateX(-50%) translateY(100%);\r\n }\r\n\r\n .drawer-container.open .panel[data-side=\"bottom\"] {\r\n transform: translateX(-50%) translateY(0);\r\n }\r\n\r\n /* Left drawer */\r\n .panel[data-side=\"left\"] {\r\n top: 0;\r\n left: 0;\r\n bottom: 0;\r\n width: var(--drawer-width, clamp(280px, 24vw, 420px));\r\n border-radius: 0;\r\n transform: translateX(-100%);\r\n }\r\n\r\n .drawer-container.open .panel[data-side=\"left\"] {\r\n transform: translateX(0);\r\n }\r\n\r\n /* Right drawer */\r\n .panel[data-side=\"right\"] {\r\n top: 0;\r\n right: 0;\r\n bottom: 0;\r\n width: var(--drawer-width, clamp(280px, 24vw, 420px));\r\n border-radius: 0;\r\n transform: translateX(100%);\r\n }\r\n\r\n .drawer-container.open .panel[data-side=\"right\"] {\r\n transform: translateX(0);\r\n }\r\n\r\n /* Once settled open, drop the (now identity) transform on left/right panels\r\n so their fixed-position descendants (select dropdowns, popovers, tooltips)\r\n escape the transformed containing block instead of being clipped by the\r\n panel. Bottom keeps its transform (used for centering). */\r\n .drawer-container.open .panel[data-side=\"left\"].settled,\r\n .drawer-container.open .panel[data-side=\"right\"].settled {\r\n transform: none;\r\n }\r\n\r\n /* Dragging state */\r\n .panel.dragging {\r\n transition: none;\r\n }\r\n\r\n .overlay.dragging {\r\n transition: none;\r\n }\r\n\r\n .overlay.no-modal {\r\n display: none !important;\r\n }\r\n\r\n /* Handle */\r\n .handle {\r\n width: 48px;\r\n height: 4px;\r\n background: var(--rel-bg-neutral-elevated-2);\r\n border-radius: var(--rel-border-radius-full-rounded);\r\n margin: var(--rel-spacing-xs) auto var(--rel-spacing-2xs);\r\n cursor: grab;\r\n touch-action: none;\r\n }\r\n\r\n .handle:active {\r\n cursor: grabbing;\r\n background: var(--rel-border-accent);\r\n }\r\n\r\n .handle.hidden {\r\n display: none;\r\n }\r\n\r\n /* Header */\r\n .header {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--rel-spacing-2xs);\r\n padding: var(--rel-spacing-md) var(--rel-spacing-lg);\r\n border-bottom: var(--rel-stroke-sm) solid var(--rel-border-default);\r\n }\r\n\r\n .header.empty {\r\n display: none;\r\n }\r\n\r\n .header-top {\r\n display: flex;\r\n align-items: flex-start;\r\n justify-content: space-between;\r\n gap: var(--rel-spacing-sm);\r\n }\r\n\r\n .title {\r\n color: var(--rel-text-label);\r\n margin: 0;\r\n\r\n font-family: var(--rel-headings-lg-font-family);\r\n\r\n font-weight: var(--rel-headings-lg-font-weight);\r\n\r\n font-size: var(--rel-headings-lg-font-size);\r\n\r\n line-height: var(--rel-headings-lg-line-height);\r\n\r\n letter-spacing: var(--rel-headings-lg-letter-spacing);\r\n\r\n }\r\n\r\n .description {\r\n color: var(--rel-text-body);\r\n margin: 0;\r\n opacity: 0.8;\r\n\r\n font-family: var(--rel-body-lg-regular-font-family);\r\n\r\n font-weight: var(--rel-body-lg-regular-font-weight);\r\n\r\n font-size: var(--rel-body-lg-regular-font-size);\r\n\r\n line-height: var(--rel-body-lg-regular-line-height);\r\n\r\n letter-spacing: var(--rel-body-lg-regular-letter-spacing);\r\n\r\n }\r\n\r\n /* Emphasised inline text in slotted content (Figma body-lg-medium) */\r\n .content ::slotted(strong),\r\n .content ::slotted(b) {\r\n font-weight: var(--rel-body-lg-medium-font-weight);\r\n }\r\n\r\n .close-button {\r\n background: transparent;\r\n border: none;\r\n cursor: pointer;\r\n padding: var(--rel-spacing-2xs);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n align-self: flex-start;\r\n flex-shrink: 0;\r\n border-radius: var(--rel-border-radius-xs);\r\n color: var(--rel-text-default);\r\n transition: background 0.15s ease;\r\n }\r\n\r\n .close-button:hover {\r\n background: var(--rel-bg-surface-elevated);\r\n }\r\n\r\n .close-button:active {\r\n background: var(--rel-border-default);\r\n }\r\n\r\n .close-button:focus-visible {\r\n outline: 2px solid var(--rel-border-focus);\r\n outline-offset: 2px;\r\n }\r\n\r\n /* Content */\r\n .content {\r\n flex: 1;\r\n overflow-y: auto;\r\n padding: var(--rel-spacing-xl);\r\n }\r\n\r\n /* Footer */\r\n .footer {\r\n flex-shrink: 0;\r\n padding: var(--rel-spacing-md) var(--rel-spacing-lg);\r\n border-top: var(--rel-stroke-sm) solid var(--rel-border-default);\r\n }\r\n\r\n /* Reduced motion */\r\n @media (prefers-reduced-motion: reduce) {\r\n .overlay,\r\n .panel {\r\n transition: none;\r\n }\r\n\r\n .drawer-container .panel {\r\n transform: none;\r\n }\r\n\r\n .drawer-container:not(.open) .panel {\r\n display: none;\r\n }\r\n }\r\n `;\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n if (this.open) {\r\n this.lockScroll();\r\n }\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback();\r\n this.unlockScroll();\r\n document.removeEventListener(\"keydown\", this.handleKeydown);\r\n }\r\n\r\n updated(changed: Map<string, any>) {\r\n if (changed.has(\"open\")) {\r\n if (this.open) {\r\n this.handleOpen();\r\n } else {\r\n this.handleClose();\r\n }\r\n }\r\n }\r\n\r\n private handleOpen() {\r\n this.previousFocus = document.activeElement as HTMLElement;\r\n this.lockScroll();\r\n\r\n if (this.modal) {\r\n this.updateComplete.then(() => {\r\n const focusTarget =\r\n this.querySelector<HTMLElement>(\"[autofocus]\") ??\r\n this.querySelector<HTMLElement>(\".close-button\") ??\r\n this.querySelector<HTMLElement>(\".panel\");\r\n focusTarget?.focus();\r\n });\r\n }\r\n\r\n document.addEventListener(\"keydown\", this.handleKeydown);\r\n\r\n // After the slide-in transition completes, mark the panel settled so its\r\n // transform is dropped (frees fixed-position dropdowns/popovers). A timeout\r\n // backstops the case where transitionend doesn't fire.\r\n this.settled = false;\r\n this.updateComplete.then(() => {\r\n const panel = this.panelElement;\r\n if (!panel) return;\r\n let done = false;\r\n const settle = () => {\r\n if (done) return;\r\n done = true;\r\n this.settled = true;\r\n panel.removeEventListener(\"transitionend\", onEnd);\r\n };\r\n const onEnd = (e: TransitionEvent) => {\r\n if (e.propertyName === \"transform\") settle();\r\n };\r\n panel.addEventListener(\"transitionend\", onEnd);\r\n setTimeout(settle, 500);\r\n });\r\n\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-open-change\", {\r\n detail: { open: true },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private handleClose() {\r\n this.settled = false;\r\n this.unlockScroll();\r\n document.removeEventListener(\"keydown\", this.handleKeydown);\r\n\r\n if (this.previousFocus && this.previousFocus.focus) {\r\n this.updateComplete.then(() => {\r\n this.previousFocus?.focus();\r\n this.previousFocus = null;\r\n });\r\n }\r\n\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-open-change\", {\r\n detail: { open: false },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private lockScroll() {\r\n if (typeof document === \"undefined\") return;\r\n\r\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\r\n\r\n this.originalBodyOverflow = document.body.style.overflow;\r\n this.originalBodyPaddingRight = document.body.style.paddingRight;\r\n\r\n document.body.style.overflow = \"hidden\";\r\n if (scrollbarWidth > 0) {\r\n document.body.style.paddingRight = `${scrollbarWidth}px`;\r\n }\r\n }\r\n\r\n private unlockScroll() {\r\n if (typeof document === \"undefined\") return;\r\n\r\n document.body.style.overflow = this.originalBodyOverflow;\r\n document.body.style.paddingRight = this.originalBodyPaddingRight;\r\n }\r\n\r\n private getFocusableElements(): HTMLElement[] {\r\n if (!this.panelElement) return [];\r\n\r\n const selectors = [\r\n 'a[href]',\r\n 'button:not([disabled])',\r\n 'textarea:not([disabled])',\r\n 'input:not([disabled])',\r\n 'select:not([disabled])',\r\n '[tabindex]:not([tabindex=\"-1\"])',\r\n ].join(\",\");\r\n\r\n const elements = Array.from(\r\n this.panelElement.querySelectorAll(selectors)\r\n ) as HTMLElement[];\r\n\r\n // Also check slotted content\r\n const slots = this.panelElement.querySelectorAll(\"slot\");\r\n slots.forEach((slot) => {\r\n const assigned = slot.assignedElements({ flatten: true });\r\n assigned.forEach((el) => {\r\n const focusableInSlot = el.querySelectorAll(selectors);\r\n elements.push(...(Array.from(focusableInSlot) as HTMLElement[]));\r\n });\r\n });\r\n\r\n return elements;\r\n }\r\n\r\n private handleKeydown = (e: KeyboardEvent) => {\r\n if (!this.open) return;\r\n\r\n if (e.key === \"Escape\" && this.dismissible && this.closeOnEscape) {\r\n e.preventDefault();\r\n this.close(\"escape\");\r\n return;\r\n }\r\n\r\n // Focus trap\r\n if (e.key === \"Tab\" && this.modal) {\r\n const focusable = this.getFocusableElements();\r\n if (focusable.length === 0) {\r\n e.preventDefault();\r\n return;\r\n }\r\n\r\n const firstFocusable = focusable[0];\r\n const lastFocusable = focusable[focusable.length - 1];\r\n const activeElement = document.activeElement;\r\n\r\n if (e.shiftKey) {\r\n if (activeElement === firstFocusable) {\r\n e.preventDefault();\r\n lastFocusable.focus();\r\n }\r\n } else {\r\n if (activeElement === lastFocusable) {\r\n e.preventDefault();\r\n firstFocusable.focus();\r\n }\r\n }\r\n }\r\n };\r\n\r\n private handleOverlayClick(e: MouseEvent) {\r\n if (!this.dismissible || !this.closeOnBackdrop) return;\r\n\r\n if (e.target === this.overlayElement) {\r\n this.close(\"backdrop\");\r\n }\r\n }\r\n\r\n private handleCloseButtonClick() {\r\n this.close(\"programmatic\");\r\n }\r\n\r\n private close(_reason: DrawerCloseReason) {\r\n this.open = false;\r\n }\r\n\r\n // Drag-to-close handlers\r\n private handlePointerDown = (e: PointerEvent) => {\r\n if (!this.draggable || this.side !== \"bottom\") return;\r\n\r\n this.isDragging = true;\r\n this.startY = e.clientY;\r\n this.currentY = e.clientY;\r\n this.dragOffset = 0;\r\n\r\n const target = e.target as HTMLElement;\r\n target.setPointerCapture(e.pointerId);\r\n\r\n document.addEventListener(\"pointermove\", this.handlePointerMove);\r\n document.addEventListener(\"pointerup\", this.handlePointerUp);\r\n };\r\n\r\n private handlePointerMove = (e: PointerEvent) => {\r\n if (!this.isDragging) return;\r\n\r\n this.currentY = e.clientY;\r\n const deltaY = this.currentY - this.startY;\r\n\r\n // Only allow dragging down for bottom drawer\r\n if (deltaY > 0) {\r\n this.dragOffset = deltaY;\r\n this.requestUpdate();\r\n }\r\n };\r\n\r\n private handlePointerUp = (_e: PointerEvent) => {\r\n if (!this.isDragging) return;\r\n\r\n this.isDragging = false;\r\n\r\n const panelHeight = this.panelElement?.offsetHeight || 0;\r\n const draggedPercent = this.dragOffset / panelHeight;\r\n\r\n if (draggedPercent >= this.snapThreshold) {\r\n this.close(\"drag\");\r\n }\r\n\r\n this.dragOffset = 0;\r\n this.requestUpdate();\r\n\r\n document.removeEventListener(\"pointermove\", this.handlePointerMove);\r\n document.removeEventListener(\"pointerup\", this.handlePointerUp);\r\n };\r\n\r\n private getPanelStyle() {\r\n if (!this.isDragging || this.dragOffset === 0) {\r\n return \"\";\r\n }\r\n\r\n return `transform: translateX(-50%) translateY(${this.dragOffset}px);`;\r\n }\r\n\r\n private getOverlayStyle() {\r\n if (!this.isDragging || this.dragOffset === 0) {\r\n return \"\";\r\n }\r\n\r\n const panelHeight = this.panelElement?.offsetHeight || 0;\r\n const draggedPercent = Math.min(this.dragOffset / panelHeight, 1);\r\n const opacity = 0.5 * (1 - draggedPercent);\r\n\r\n return `opacity: ${opacity};`;\r\n }\r\n\r\n render() {\r\n const hasTitle = !!this.title;\r\n const hasDescription = !!this.description;\r\n const showCloseButton = this.dismissible;\r\n const hasHeader = hasTitle || hasDescription || showCloseButton;\r\n\r\n const showHandleBar =\r\n this.showHandle && this.side === \"bottom\" && this.draggable;\r\n\r\n return html`\r\n <div class=\"drawer-container ${this.open ? \"open\" : \"\"}\">\r\n <div\r\n part=\"overlay\"\r\n class=\"overlay ${!this.modal ? 'no-modal' : ''} ${this.isDragging ? 'dragging' : ''}\"\r\n style=\"${this.getOverlayStyle()}\"\r\n @click=\"${this.handleOverlayClick}\"></div>\r\n\r\n <div\r\n part=\"panel\"\r\n class=\"panel ${this.isDragging ? \"dragging\" : \"\"} ${this.settled ? \"settled\" : \"\"}\"\r\n data-side=\"${this.side}\"\r\n style=\"${this.width ? `--drawer-width: ${this.width};` : ''}${this.maxHeight ? `--drawer-max-height: ${this.maxHeight};` : ''}${this.getPanelStyle()}\"\r\n role=\"${this.modal ? \"dialog\" : \"region\"}\"\r\n aria-modal=\"${this.modal}\"\r\n tabindex=\"-1\">\r\n ${showHandleBar\r\n ? html`<div\r\n part=\"handle\"\r\n class=\"handle\"\r\n @pointerdown=\"${this.handlePointerDown}\"></div>`\r\n : \"\"}\r\n\r\n <div part=\"header\" class=\"header ${!hasHeader ? \"empty\" : \"\"}\">\r\n ${hasTitle || hasDescription || showCloseButton\r\n ? html`\r\n <div class=\"header-top\">\r\n <div>\r\n ${hasTitle\r\n ? html`<h2 class=\"title\">${this.title}</h2>`\r\n : \"\"}\r\n ${hasDescription\r\n ? html`<p class=\"description\">${this.description}</p>`\r\n : \"\"}\r\n </div>\r\n ${showCloseButton\r\n ? html`<button\r\n part=\"close-button\"\r\n class=\"close-button\"\r\n @click=\"${this.handleCloseButtonClick}\"\r\n aria-label=\"Close\">\r\n <rel-icon name=\"close\" size=\"sm\"></rel-icon>\r\n </button>`\r\n : \"\"}\r\n </div>\r\n `\r\n : \"\"}\r\n </div>\r\n\r\n <div part=\"content\" class=\"content\">\r\n <slot></slot>\r\n </div>\r\n\r\n <div part=\"footer\" class=\"footer\">\r\n <rel-drawer-footer><slot name=\"footer\"></slot></rel-drawer-footer>\r\n </div>\r\n </div>\r\n </div>\r\n `;\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"rel-drawer\": RelDrawer;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\nimport { customElement } from \"lit/decorators.js\";\n\n@customElement(\"rel-drawer-footer\")\nexport class RelDrawerFooter extends LitElement {\n static styles = css`\n .drawer-footer {\n display: flex;\n justify-content: flex-end;\n gap: var(--rel-spacing-xs);\n }\n `;\n\n render() {\n return html`\n <div class=\"drawer-footer\">\n <slot></slot>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"rel-drawer-footer\": RelDrawerFooter;\n }\n}\n","import { LitElement, html, css, nothing } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\n\n@customElement(\"rel-kbd\")\nexport class RelKbd extends LitElement {\n @property({ type: String, reflect: true })\n size: \"sm\" | \"md\" | \"lg\" = \"md\";\n\n @property({ type: String, reflect: true })\n variant: \"default\" | \"muted\" = \"default\";\n\n @property({ type: Boolean, reflect: true })\n pill = false;\n\n @property({ type: Boolean, reflect: true })\n inset = false;\n\n static styles = css`\n :host {\n color: var(--rel-text-default);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-family: var(--rel-label-md-font-family);\n font-weight: var(--rel-label-md-font-weight);\n font-size: var(--rel-label-md-font-size);\n line-height: var(--rel-label-md-line-height);\n letter-spacing: var(--rel-label-md-letter-spacing);\n white-space: nowrap;\n user-select: none;\n transition: box-shadow 0.15s ease, background 0.15s ease, border-color 0.15s ease;\n vertical-align: middle;\n }\n\n /* Slotted hint text (Figma body-sm-regular) */\n ::slotted(span) {\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 \n :host([size=\"sm\"]) {\n padding: var(--rel-spacing-3xs) var(--rel-spacing-xs);\n min-width: 20px;\n height: 20px;\n border-radius: var(--rel-border-radius-xs);\n\n font-family: var(--rel-label-xs-font-family);\n\n font-weight: var(--rel-label-xs-font-weight);\n\n font-size: var(--rel-label-xs-font-size);\n\n line-height: var(--rel-label-xs-line-height);\n\n letter-spacing: var(--rel-label-xs-letter-spacing);\n\n }\n\n :host([size=\"md\"]) {\n padding: var(--rel-spacing-2xs) var(--rel-spacing-sm);\n min-width: 24px;\n height: 24px;\n border-radius: var(--rel-border-radius-xs);\n\n font-family: var(--rel-label-sm-font-family);\n\n font-weight: var(--rel-label-sm-font-weight);\n\n font-size: var(--rel-label-sm-font-size);\n\n line-height: var(--rel-label-sm-line-height);\n\n letter-spacing: var(--rel-label-sm-letter-spacing);\n\n }\n\n :host([size=\"lg\"]) {\n padding: var(--rel-spacing-xs) var(--rel-spacing-md);\n min-width: 32px;\n height: 32px;\n border-radius: var(--rel-border-radius-sm);\n\n font-family: var(--rel-label-lg-font-family);\n\n font-weight: var(--rel-label-lg-font-weight);\n\n font-size: var(--rel-label-lg-font-size);\n\n line-height: var(--rel-label-lg-line-height);\n\n letter-spacing: var(--rel-label-lg-letter-spacing);\n\n }\n\n :host([variant=\"default\"]) {\n background: var(--rel-bg-neutral-elevated-1);\n color: var(--rel-text-label);\n border: var(--rel-stroke-sm) solid var(--rel-border-default);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05), 0 1px 0 0 rgba(255, 255, 255, 0.5) inset;\n }\n\n :host([variant=\"muted\"]) {\n background: var(--rel-bg-neutral-elevated-2);\n color: var(--rel-text-placeholder);\n border: var(--rel-stroke-sm) solid var(--rel-border-default);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.03);\n }\n\n :host([pill]) {\n border-radius: var(--rel-border-radius-full-rounded);\n }\n\n :host([inset]) {\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1) inset, 0 1px 0 0 rgba(0, 0, 0, 0.05);\n transform: translateY(1px);\n }\n\n :host([inset][variant=\"default\"]) {\n background: var(--rel-bg-neutral-elevated-1);\n border-color: var(--rel-border-default);\n }\n\n :host([inset][variant=\"muted\"]) {\n background: var(--rel-border-default);\n border-color: var(--rel-border-default);\n }\n `;\n\n render() {\n return html`<slot></slot>`;\n }\n}\n\n/**\n * Multi-key shortcut (Figma Kbd Items=1/2/3/4): renders one <rel-kbd> per\n * entry in `items` with \"+\" separators between them. Slotted <rel-kbd>\n * children may be used instead of the items array.\n *\n * <rel-kbd-group .items=${[\"Ctrl\", \"Shift\", \"P\"]} size=\"md\"></rel-kbd-group>\n */\n@customElement(\"rel-kbd-group\")\nexport class RelKbdGroup extends LitElement {\n @property({ type: Array }) items: string[] = [];\n\n @property({ type: String, reflect: true })\n size: \"sm\" | \"md\" | \"lg\" = \"md\";\n\n @property({ type: String, reflect: true })\n variant: \"default\" | \"muted\" = \"default\";\n\n static styles = css`\n :host {\n display: inline-flex;\n align-items: center;\n gap: var(--rel-spacing-2xs);\n white-space: nowrap;\n }\n\n /* \"+\" between keys (Figma body-sm-regular, caption tone) */\n .separator {\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 user-select: none;\n }\n `;\n\n render() {\n return html`\n ${this.items.map(\n (key, i) => html`\n ${i > 0\n ? html`<span part=\"label\" class=\"separator\" aria-hidden=\"true\">+</span>`\n : nothing}\n <rel-kbd part=\"item\" size=${this.size} variant=${this.variant}>${key}</rel-kbd>\n `\n )}\n <slot></slot>\n `;\n }\n}\n","import { LitElement, html, css } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\n\n@customElement(\"rel-layout\")\nexport class RelLayout extends LitElement {\n @property({ type: String }) gap = \"1rem\";\n\n @property({ type: Number }) columns = 4;\n\n @property({ type: Boolean, reflect: true }) responsive = true;\n\n static styles = css`\n :host {\n color: var(--rel-text-default);\n display: grid;\n width: 100%;\n font-family: var(--rel-fonts-font-family);\n gap: var(--_gap, 1rem);\n grid-template-columns: repeat(var(--_columns, 4), 1fr);\n }\n\n @media (max-width: 1024px) {\n :host([responsive]) {\n grid-template-columns: repeat(3, 1fr);\n }\n }\n\n @media (max-width: 768px) {\n :host([responsive]) {\n grid-template-columns: repeat(2, 1fr);\n }\n }\n\n @media (max-width: 480px) {\n :host([responsive]) {\n grid-template-columns: 1fr;\n }\n }\n `;\n\n willUpdate() {\n this.style.setProperty('--_gap', this.gap);\n this.style.setProperty('--_columns', String(this.columns));\n }\n\n render() {\n return html`<slot></slot>`;\n }\n}\n","import { LitElement, html } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport \"@reliability-design/icons/rel-icon\";\nimport \"../rel-checkbox/rel-checkbox.js\";\nimport \"../rel-radio/rel-radio.js\";\n\nexport type MenuType = \"default\" | \"checkbox\" | \"arrow\" | \"select-option\" | \"fixed\" | \"fit\";\n\nexport interface MenuItem {\n label: string;\n active?: boolean;\n checked?: boolean;\n disabled?: boolean;\n submenu?: MenuItem[];\n open?: boolean;\n}\n\n@customElement(\"rel-menu-item\")\nexport class RelMenuItem extends LitElement {\n @property({ type: String }) label: string = \"\";\n @property({ type: String }) value: string = \"\";\n @property({ type: Boolean }) disabled: boolean = false;\n @property({ type: String }) icon: string = \"\";\n\n createRenderRoot() {\n return this;\n }\n\n render() {\n return html``;\n }\n}\n\n@customElement(\"rel-menu\")\nexport class RelMenu extends LitElement {\n @property({ type: String }) type: MenuType = \"default\";\n\n @property({ type: Array }) items: MenuItem[] = [];\n\n @state() private focusedIndex: number = 0;\n @state() private _items: MenuItem[] = [];\n\n public 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 — 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 — 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 — safe here (a submenu has no further nested\n flyout to clip) — 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 `;\n\n createRenderRoot() {\n return this;\n }\n\n connectedCallback() {\n super.connectedCallback();\n document.addEventListener(\"click\", this.handleDocumentClick);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n document.removeEventListener(\"click\", this.handleDocumentClick);\n }\n\n updated(changedProperties: Map<string, unknown>) {\n if (changedProperties.has('items')) {\n this._items = this.items.map(item => ({ ...item }));\n }\n }\n\n /** Index of a submenu locked open by a click (survives hover-out). -1 = none. */\n private lockedIndex = -1;\n\n private handleDocumentClick = (e: MouseEvent) => {\n // composedPath (NOT e.target): document-level e.target is retargeted to the\n // shadow host when this menu lives inside a shadow root, so this.contains()\n // wrongly reads an inside-click as outside and closes an open submenu on the\n // click that opened it. composedPath pierces shadow boundaries.\n if (!e.composedPath().includes(this)) {\n this.lockedIndex = -1;\n this._items = this._items.map(i => ({ ...i, open: false }));\n }\n };\n\n private onItemEnter(item: MenuItem, index: number) {\n if (item.disabled) return;\n if (this.type === \"arrow\" && item.submenu?.length) {\n // Hover opens this submenu; a click-locked one also stays open.\n this._items = this._items.map((i, idx) => ({ ...i, open: idx === index || idx === this.lockedIndex }));\n }\n }\n\n private onItemLeave(_item: MenuItem, index: number) {\n if (this.type !== \"arrow\") return;\n // Hover-out closes the submenu UNLESS it was locked open by a click. Moving\n // into the flyout doesn't fire this (the flyout is a DOM descendant of the\n // item and sits flush at left:100%, so there's no dead-zone gap).\n if (this.lockedIndex === index) return;\n this._items = this._items.map((i, idx) => ({ ...i, open: idx === this.lockedIndex }));\n }\n\n private onItemClick(item: MenuItem, index: number, ev?: Event) {\n ev?.stopPropagation();\n if (item.disabled) return;\n\n this.focusedIndex = index;\n\n if (this.type === \"checkbox\") {\n const updated = { ...item, checked: !item.checked };\n this._items = this._items.map((i, idx) => idx === index ? updated : i);\n this.dispatchEvent(\n new CustomEvent(\"rel-check\", {\n detail: { item: updated, checked: updated.checked },\n bubbles: true,\n composed: true,\n })\n );\n return;\n }\n\n if (this.type === \"arrow\" && item.submenu?.length) {\n // Click LOCKS the submenu open (click again to unlock/close).\n const lock = this.lockedIndex !== index;\n this.lockedIndex = lock ? index : -1;\n this._items = this._items.map((i, idx) => ({ ...i, open: idx === index ? lock : false }));\n return;\n }\n\n // Default: set active\n const updated = { ...item, active: true };\n this._items = this._items.map((i, idx) => idx === index ? updated : { ...i, active: false });\n this.dispatchEvent(\n new CustomEvent(\"rel-select\", {\n detail: { item: updated },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private onSubClick(parentIndex: number, subIndex: number, ev?: Event) {\n ev?.stopPropagation();\n this.lockedIndex = -1;\n this._items = this._items.map((i, idx) => ({\n ...i,\n active: false,\n open: false,\n submenu: i.submenu?.map((s, sIdx) => ({\n ...s,\n active: idx === parentIndex && sIdx === subIndex,\n })),\n }));\n this.dispatchEvent(\n new CustomEvent(\"rel-submenu-select\", {\n detail: {\n parent: this._items[parentIndex],\n sub: this._items[parentIndex]?.submenu?.[subIndex],\n },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private onKeydown(ev: KeyboardEvent) {\n const last = this._items.length - 1;\n\n if (ev.key === \"ArrowDown\") {\n this.focusedIndex = Math.min(last, this.focusedIndex + 1);\n ev.preventDefault();\n } else if (ev.key === \"ArrowUp\") {\n this.focusedIndex = Math.max(0, this.focusedIndex - 1);\n ev.preventDefault();\n } else if (ev.key === \"ArrowRight\") {\n const item = this._items[this.focusedIndex];\n if (this.type === \"arrow\" && item?.submenu?.length) {\n // keyboard-open locks (no hover-out to close it)\n this.lockedIndex = this.focusedIndex;\n this._items = this._items.map((i, idx) => ({\n ...i,\n open: idx === this.focusedIndex ? true : i.open,\n }));\n }\n } else if (ev.key === \"ArrowLeft\" || ev.key === \"Escape\") {\n this.lockedIndex = -1;\n this._items = this._items.map(i => ({ ...i, open: false }));\n } else if (ev.key === \"Enter\" || ev.key === \" \") {\n const item = this._items[this.focusedIndex];\n this.onItemClick(item, this.focusedIndex);\n ev.preventDefault();\n }\n }\n\n private renderMenuItem(item: MenuItem, index: number) {\n const isFocused = this.focusedIndex === index;\n const hasSubmenu = this.type === \"arrow\" && !!item.submenu?.length;\n\n // Checkbox / select-option rows delegate their control to the real\n // rel-checkbox / rel-radio components (pointer-events:none so the whole ROW\n // stays the click target — onItemClick is the single source of truth and\n // the control just reflects item state).\n const control =\n this.type === \"checkbox\"\n ? html`<rel-checkbox\n class=\"menu-control\"\n label=\"${item.label}\"\n status=\"${item.checked ? \"checked\" : \"unchecked\"}\"\n state=\"${item.disabled ? \"disabled\" : \"default\"}\"\n ></rel-checkbox>`\n : this.type === \"select-option\"\n ? html`<rel-radio\n class=\"menu-control\"\n .options=\"${[{ value: item.label, label: item.label, disabled: !!item.disabled }]}\"\n .selectedValue=\"${item.active ? item.label : null}\"\n ></rel-radio>`\n : html`\n <span class=\"menu-label\">${item.label}</span>\n ${hasSubmenu\n ? html`<span class=\"submenu-chevron\"\n ><rel-icon name=\"chevron-right\" size=\"sm\"></rel-icon\n ></span>`\n : \"\"}\n `;\n\n return html`\n <div\n class=\"rel-menu-item ${item.active ? \"active\" : \"\"} ${item.disabled ? \"disabled\" : \"\"}\"\n role=\"menuitem\"\n ?data-focused=\"${isFocused}\"\n @mouseenter=\"${() => this.onItemEnter(item, index)}\"\n @mouseleave=\"${() => this.onItemLeave(item, index)}\"\n @click=\"${(e: Event) => this.onItemClick(item, index, e)}\">\n ${control}\n ${hasSubmenu\n ? html`\n <div\n part=\"panel\" class=\"rel-submenu ${item.open ? \"visible\" : \"\"}\"\n @click=\"${(e: Event) => e.stopPropagation()}\">\n ${item.submenu!.map(\n (sub, subIndex) => html`\n <div\n class=\"rel-menu-item ${sub.active ? \"active\" : \"\"}\"\n role=\"menuitem\"\n @click=\"${(e: Event) => this.onSubClick(index, subIndex, e)}\">\n <span class=\"menu-label\">${sub.label}</span>\n </div>\n `\n )}\n </div>\n `\n : \"\"}\n </div>\n `;\n }\n\n render() {\n return html`\n <style>${RelMenu._css}</style>\n <div\n part=\"list\" class=\"rel-menu ${this.type === \"fixed\" || this.type === \"fit\" ? this.type : \"\"}\"\n role=\"menu\"\n tabindex=\"0\"\n @keydown=\"${this.onKeydown}\"\n @click=\"${(e: Event) => e.stopPropagation()}\">\n ${this._items.map((item, index) => this.renderMenuItem(item, index))}\n </div>\n `;\n }\n}\n","import { LitElement, html, css } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport type { Orientation } from \"../rel-stepper/rel-stepper.js\";\n\nexport interface RadioOption {\n value: string;\n label: string;\n supportingText?: string;\n disabled?: boolean;\n}\n\n@customElement(\"rel-radio\")\nexport class RelRadio extends LitElement {\n @property({ type: Array }) options: RadioOption[] = [];\n\n @property({ type: String }) name = \"radio-group\";\n\n /** Layout axis of the option list. `\"vertical\"` (default) stacks options in\n * a column; `\"horizontal\"` lays them out in a wrapping row. */\n @property({ type: String, reflect: true }) orientation: Orientation = \"vertical\";\n\n /** Control scale. `\"medium\"` (default) = 20px circle with body-lg labels;\n * `\"small\"` = 16px circle with body-md labels. */\n @property({ type: String, reflect: true }) size: \"small\" | \"medium\" = \"medium\";\n\n @property({ type: String, reflect: true })\n selectedValue: string | null = null;\n\n @property({ type: Boolean })\n disabled = false;\n\n @property({ type: Boolean }) error = false;\n\n @property({ type: String }) errorMessage = \"\";\n\n @property({ type: String }) value = \"\";\n\n checked = false;\n\n private _onChange: (value: string) => void = () => {};\n private _onTouched: () => void = () => {};\n\n static styles = css`\n :host {\n color: var(--rel-text-default);\n display: block;\n font-family: var(--rel-fonts-font-family);\n }\n\n .rel-radio-group {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: var(--rel-spacing-xs);\n }\n\n /* Horizontal orientation — options flow in a wrapping row. Wider column\n gap than the vertical rhythm so adjacent option labels read as separate\n choices; row gap keeps the vertical value for wrapped lines. */\n :host([orientation=\"horizontal\"]) .rel-radio-group {\n flex-direction: row;\n flex-wrap: wrap;\n gap: var(--rel-spacing-xs) var(--rel-spacing-xl);\n }\n\n .rel-radio-option {\n display: inline-flex;\n flex-direction: column;\n gap: var(--rel-spacing-3xs);\n cursor: pointer;\n }\n\n .rel-radio-option.disabled {\n opacity: 0.6;\n color: var(--rel-text-disabled);\n cursor: not-allowed !important;\n }\n\n .rel-radio-option:not(.disabled):hover .radio-custom {\n border-color: var(--rel-text-body);\n }\n\n .rel-radio-option:not(.disabled):hover .radio-label {\n color: var(--rel-text-body);\n }\n\n .rel-radio-option:not(.disabled):hover .radio-supporting {\n color: var(--rel-text-caption);\n }\n\n .rel-radio-option:focus-within:has(input:focus-visible) {\n outline: 1.5px solid var(--rel-border-focus);\n outline-offset: 1px;\n }\n\n .radio-main {\n /* Containing block for the hidden input below — without this the\n absolutely-positioned input resolves against the document (or any\n positioned ancestor in the consumer page), where it neither moves\n with intermediate scroll containers nor stays aligned with the\n visible radio. Tabbing to it then makes the browser scroll the\n WRONG scroller, shoving the whole page up (same bug as\n rel-checkbox — keep the two fixes in sync). */\n position: relative;\n display: flex;\n align-items: center;\n gap: var(--rel-spacing-2xs);\n }\n\n input {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n margin: 0;\n opacity: 0;\n pointer-events: none;\n }\n\n .radio-custom {\n width: 20px;\n height: 20px;\n border: 2px solid var(--rel-text-label);\n border-radius: 50%;\n position: relative;\n flex-shrink: 0;\n }\n\n input:checked + .radio-custom::after {\n content: \"\";\n position: absolute;\n inset: 4px;\n background: var(--rel-text-label);\n border-radius: 50%;\n }\n\n .radio-label {\n color: var(--rel-text-default);\n\n font-family: var(--rel-body-lg-regular-font-family);\n\n font-weight: var(--rel-body-lg-regular-font-weight);\n\n font-size: var(--rel-body-lg-regular-font-size);\n\n line-height: var(--rel-body-lg-regular-line-height);\n\n letter-spacing: var(--rel-body-lg-regular-letter-spacing);\n\n }\n\n .radio-supporting {\n margin-left: 28px;\n color: var(--rel-text-caption);\n\n font-family: var(--rel-body-sm-regular-font-family);\n\n font-weight: var(--rel-body-sm-regular-font-weight);\n\n font-size: var(--rel-body-sm-regular-font-size);\n\n line-height: var(--rel-body-sm-regular-line-height);\n\n letter-spacing: var(--rel-body-sm-regular-letter-spacing);\n\n }\n\n /* Size variant (medium is the base scale above). Supporting-text indent =\n circle width + the radio-main gap, so it stays aligned under the label. */\n :host([size=\"small\"]) .radio-custom {\n width: 16px;\n height: 16px;\n }\n\n :host([size=\"small\"]) input:checked + .radio-custom::after {\n inset: 3px;\n }\n\n :host([size=\"small\"]) .radio-label {\n font-family: var(--rel-body-md-regular-font-family);\n font-weight: var(--rel-body-md-regular-font-weight);\n font-size: var(--rel-body-md-regular-font-size);\n line-height: var(--rel-body-md-regular-line-height);\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\n }\n\n :host([size=\"small\"]) .radio-supporting {\n margin-left: 24px;\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 /* Error state (Figma State=Error, both Is Checked values) */\n .rel-radio-option.error-unchecked .radio-custom,\n .rel-radio-option.error-checked .radio-custom {\n border-color: var(--rel-border-danger);\n }\n\n .rel-radio-option.error-checked input:checked + .radio-custom::after {\n background: var(--rel-text-danger);\n }\n\n .rel-radio-option.error-unchecked .radio-label,\n .rel-radio-option.error-checked .radio-label {\n color: var(--rel-text-danger);\n }\n\n .rel-radio-option.error-unchecked .radio-supporting,\n .rel-radio-option.error-checked .radio-supporting {\n color: var(--rel-text-danger);\n }\n\n /* Error message below group */\n .error-message {\n color: var(--rel-text-danger);\n margin-top: var(--rel-spacing-2xs, 4px);\n\n font-family: var(--rel-body-sm-regular-font-family);\n\n font-weight: var(--rel-body-sm-regular-font-weight);\n\n font-size: var(--rel-body-sm-regular-font-size);\n\n line-height: var(--rel-body-sm-regular-line-height);\n\n letter-spacing: var(--rel-body-sm-regular-letter-spacing);\n\n }\n `;\n\n private onChange(value: string) {\n if (this.disabled) return;\n\n this.selectedValue = value;\n this.dispatchEvent(\n new CustomEvent(\"rel-change\", {\n detail: { value, checked: true },\n bubbles: true,\n composed: true,\n })\n );\n this._onChange(this.value);\n }\n\n registerOnChange(fn: (value: string) => void): void { this._onChange = fn; }\n registerOnTouched(fn: () => void): void { this._onTouched = fn; }\n writeValue(value: string): void { this.checked = value === this.value; }\n\n private get hasSelection(): boolean {\n return this.selectedValue !== null && this.selectedValue !== \"\";\n }\n\n private renderOption(option: RadioOption) {\n const isChecked = this.selectedValue === option.value;\n const isDisabled = this.disabled || option.disabled;\n const classes = [\n \"rel-radio-option\",\n isDisabled ? \"disabled\" : \"\",\n this.error && !this.hasSelection ? \"error-unchecked\" : \"\",\n this.error && isChecked ? \"error-checked\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return html`\n <label class=\"${classes}\">\n <div class=\"radio-main\">\n <input\n type=\"radio\"\n name=\"${this.name}\"\n .checked=\"${isChecked}\"\n ?disabled=\"${isDisabled}\"\n @change=\"${() => this.onChange(option.value)}\"\n @blur=\"${() => this._onTouched()}\"\n />\n <span class=\"radio-custom\"></span>\n <span part=\"label\" class=\"radio-label\">${option.label}</span>\n </div>\n\n ${option.supportingText\n ? html`<div class=\"radio-supporting\">${option.supportingText}</div>`\n : \"\"}\n </label>\n `;\n }\n\n render() {\n return html`\n <div\n part=\"base\"\n class=\"rel-radio-group\"\n role=\"radiogroup\"\n aria-orientation=\"${this.orientation}\"\n >\n ${this.options.map((o) => this.renderOption(o))}\n </div>\n ${this.error && this.errorMessage\n ? html`<div class=\"error-message\">${this.errorMessage}</div>`\n : \"\"}\n `;\n }\n}\n","import { LitElement, html } from \"lit\";\nimport { customElement, state } from \"lit/decorators.js\";\nimport { RelMenubarMenu } from \"./rel-menubar-menu\";\nimport \"@reliability-design/icons/rel-icon\";\nimport \"../rel-checkbox/rel-checkbox.js\";\nimport \"../rel-radio/rel-radio.js\";\n\ninterface MenuState {\n menu: RelMenubarMenu;\n open: boolean;\n panelElement?: HTMLElement;\n}\n\n@customElement(\"rel-menubar\")\nexport class RelMenubar extends LitElement {\n @state() private menus: MenuState[] = [];\n @state() private openMenuIndex: number = -1;\n @state() private focusedTriggerIndex: number = 0;\n @state() private focusedItemIndex: number = -1;\n @state() private openSubmenuElement: HTMLElement | null = null;\n\n private hoverSwitchEnabled = false;\n private _onScroll?: () => void;\n\n public static readonly _css = `\n /* This component renders into LIGHT DOM (createRenderRoot returns this), so\n :host / <slot> don't work here — 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 `;\n\n createRenderRoot() {\n return this;\n }\n\n connectedCallback() {\n super.connectedCallback();\n this.discoverMenus();\n document.addEventListener(\"click\", this.handleOutsideClick);\n this._onScroll = () => {\n this._repositionOpenMenu();\n this._repositionOpenSubmenu();\n };\n window.addEventListener('scroll', this._onScroll, { passive: true, capture: true });\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n document.removeEventListener(\"click\", this.handleOutsideClick);\n if (this._onScroll) {\n window.removeEventListener('scroll', this._onScroll, { capture: true });\n }\n }\n\n private _repositionOpenSubmenu() {\n if (!this.openSubmenuElement) return;\n const submenuPanel = this.querySelector('.submenu-panel.open') as HTMLElement;\n if (!submenuPanel) return;\n const trigger = this.querySelector('.menu-submenu-trigger.focused, .menu-submenu-trigger:hover') as HTMLElement\n ?? submenuPanel.previousElementSibling as HTMLElement;\n if (!trigger) return;\n const rect = trigger.getBoundingClientRect();\n submenuPanel.style.top = `${rect.top}px`;\n submenuPanel.style.left = `${rect.right + 4}px`;\n }\n\n private _repositionOpenMenu() {\n if (this.openMenuIndex === -1) return;\n const triggers = this.querySelectorAll('.menubar-trigger');\n const trigger = triggers[this.openMenuIndex] as HTMLElement;\n const panel = this.querySelector(`.menubar-panel[data-menu-index=\"${this.openMenuIndex}\"]`) as HTMLElement;\n if (!trigger || !panel) return;\n const rect = trigger.getBoundingClientRect();\n panel.style.top = `${rect.bottom + 4}px`;\n panel.style.left = `${rect.left}px`;\n }\n\n private discoverMenus() {\n const menuElements = Array.from(\n this.querySelectorAll(\"rel-menubar-menu\")\n ) as RelMenubarMenu[];\n this.menus = menuElements.map((menu) => ({ menu, open: false }));\n }\n\n private handleOutsideClick = (e: MouseEvent) => {\n // composedPath (NOT e.target): a document-level listener sees e.target\n // retargeted to the shadow host when the menubar lives inside a shadow root\n // (e.g. any consumer component), so this.contains(e.target) is false for a\n // click that is actually INSIDE the menubar — closing the menu on the very\n // click that opened it. composedPath pierces shadow boundaries.\n if (!e.composedPath().includes(this)) {\n this.closeAllMenus();\n }\n };\n\n private closeAllMenus() {\n this.openMenuIndex = -1;\n this.openSubmenuElement = null;\n this.hoverSwitchEnabled = false;\n this.requestUpdate();\n }\n\n private openMenu(index: number, triggerElement: HTMLElement) {\n this.openMenuIndex = index;\n this.focusedItemIndex = -1;\n this.openSubmenuElement = null;\n this.requestUpdate();\n\n // Position the panel below the trigger\n this.updateComplete.then(() => {\n const panel = this.querySelector(\n `.menubar-panel[data-menu-index=\"${index}\"]`\n ) as HTMLElement;\n if (panel && triggerElement) {\n const rect = triggerElement.getBoundingClientRect();\n panel.style.top = `${rect.bottom + 4}px`;\n panel.style.left = `${rect.left}px`;\n }\n });\n }\n\n private handleTriggerClick(index: number, event: Event) {\n const target = event.currentTarget as HTMLElement;\n if (this.openMenuIndex === index) {\n this.closeAllMenus();\n } else {\n this.openMenu(index, target);\n this.hoverSwitchEnabled = true;\n }\n }\n\n private handleTriggerMouseEnter(index: number, event: Event) {\n if (this.openMenuIndex !== -1 && this.hoverSwitchEnabled) {\n const target = event.currentTarget as HTMLElement;\n this.openMenu(index, target);\n }\n }\n\n private handleTriggerKeyDown(event: KeyboardEvent) {\n const { key } = event;\n\n if (key === \"ArrowRight\") {\n event.preventDefault();\n this.focusedTriggerIndex = Math.min(\n this.menus.length - 1,\n this.focusedTriggerIndex + 1\n );\n this.focusTrigger(this.focusedTriggerIndex);\n } else if (key === \"ArrowLeft\") {\n event.preventDefault();\n this.focusedTriggerIndex = Math.max(0, this.focusedTriggerIndex - 1);\n this.focusTrigger(this.focusedTriggerIndex);\n } else if (key === \"Enter\" || key === \" \") {\n event.preventDefault();\n const trigger = this.querySelector(\n `.menubar-trigger[data-index=\"${this.focusedTriggerIndex}\"]`\n ) as HTMLElement;\n if (trigger) {\n this.openMenu(this.focusedTriggerIndex, trigger);\n this.updateComplete.then(() => {\n const focusTarget = this.querySelector<HTMLElement>(\n \"[autofocus], [role='menuitem']\"\n );\n if (focusTarget) {\n focusTarget.focus();\n } else {\n this.focusMenuItem(0);\n }\n });\n }\n } else if (key === \"ArrowDown\" && this.openMenuIndex !== -1) {\n event.preventDefault();\n this.focusMenuItem(0);\n }\n }\n\n private focusTrigger(index: number) {\n const trigger = this.querySelector(\n `.menubar-trigger[data-index=\"${index}\"]`\n ) as HTMLElement;\n trigger?.focus();\n }\n\n private handlePanelKeyDown(event: KeyboardEvent) {\n const { key } = event;\n const menuContent = this.menus[this.openMenuIndex]?.menu;\n if (!menuContent) return;\n\n const items = this.getFocusableItems(menuContent);\n\n if (key === \"ArrowDown\") {\n event.preventDefault();\n this.focusedItemIndex = Math.min(items.length - 1, this.focusedItemIndex + 1);\n this.requestUpdate();\n } else if (key === \"ArrowUp\") {\n event.preventDefault();\n this.focusedItemIndex = Math.max(0, this.focusedItemIndex - 1);\n this.requestUpdate();\n } else if (key === \"ArrowRight\") {\n event.preventDefault();\n const currentItem = items[this.focusedItemIndex];\n if (currentItem?.hasAttribute(\"data-submenu\")) {\n this.openSubmenu(currentItem as HTMLElement);\n }\n } else if (key === \"ArrowLeft\") {\n event.preventDefault();\n if (this.openSubmenuElement) {\n this.openSubmenuElement = null;\n this.requestUpdate();\n }\n } else if (key === \"Escape\") {\n event.preventDefault();\n this.closeAllMenus();\n this.focusTrigger(this.openMenuIndex);\n } else if (key === \"Enter\" || key === \" \") {\n event.preventDefault();\n const currentItem = items[this.focusedItemIndex];\n if (currentItem) {\n this.handleItemClick(currentItem as HTMLElement);\n }\n }\n }\n\n private getFocusableItems(menuContent: RelMenubarMenu): Element[] {\n return Array.from(menuContent.children).filter(\n (el) =>\n el.hasAttribute(\"data-item\") ||\n el.hasAttribute(\"data-checkbox\") ||\n el.hasAttribute(\"data-radio\") ||\n el.hasAttribute(\"data-submenu\")\n );\n }\n\n private focusMenuItem(index: number) {\n this.focusedItemIndex = index;\n const panel = this.querySelector(\n `.menubar-panel[data-menu-index=\"${this.openMenuIndex}\"]`\n ) as HTMLElement;\n panel?.focus();\n }\n\n private handleItemClick(item: HTMLElement) {\n if (item.hasAttribute(\"data-checkbox\")) {\n const checkbox = item.querySelector('input[type=\"checkbox\"]') as HTMLInputElement;\n const labelText = Array.from(item.childNodes)\n .filter(n => n.nodeType === Node.TEXT_NODE)\n .map(n => n.textContent?.trim())\n .filter(Boolean)\n .join(' ') || item.getAttribute('label') || '';\n if (checkbox) {\n checkbox.checked = !checkbox.checked;\n this.dispatchChangeEvent(\"checkbox\", labelText, checkbox.checked);\n this.requestUpdate();\n }\n } else if (item.hasAttribute(\"data-radio\")) {\n const radioGroup = item.closest(\"[data-radio-group]\") as HTMLElement;\n const value = item.getAttribute(\"data-radio\") || item.getAttribute(\"value\") || \"\";\n const name = radioGroup?.getAttribute(\"name\") || \"\";\n\n // Update visual state\n const allRadios = radioGroup?.querySelectorAll(\"[data-radio]\");\n allRadios?.forEach((radio) => radio.removeAttribute(\"data-checked\"));\n item.setAttribute(\"data-checked\", \"true\");\n\n // Update internal value\n if (radioGroup) {\n radioGroup.setAttribute(\"value\", value);\n }\n\n this.dispatchChangeEvent(\"radio\", name, value);\n this.requestUpdate();\n } else if (item.hasAttribute(\"data-submenu\")) {\n this.openSubmenu(item);\n } else {\n // Regular item click\n this.closeAllMenus();\n }\n }\n\n private openSubmenu(submenuTrigger: HTMLElement, renderedTrigger?: HTMLElement, submenuIndex?: number) {\n this.openSubmenuElement = submenuTrigger;\n this.requestUpdate();\n\n this.updateComplete.then(() => {\n const submenuId = `submenu-${submenuIndex ?? 0}`;\n const submenuPanel = this.querySelector(\n `.submenu-panel[data-submenu-id=\"${submenuId}\"]`\n ) as HTMLElement;\n if (submenuPanel) {\n const positionTarget = renderedTrigger ?? submenuTrigger;\n const rect = positionTarget.getBoundingClientRect();\n submenuPanel.style.top = `${rect.top}px`;\n submenuPanel.style.left = `${rect.right + 4}px`;\n }\n });\n }\n\n private handleSubmenuItemClick(_item: HTMLElement) {\n // Regular item - just close\n this.closeAllMenus();\n }\n\n private dispatchChangeEvent(type: \"checkbox\" | \"radio\", labelOrName: string, value: string | boolean) {\n const detail =\n type === \"checkbox\"\n ? { type, label: labelOrName, name: \"\", checked: value as boolean }\n : { type, label: \"\", name: labelOrName, value: value as string };\n this.dispatchEvent(\n new CustomEvent(\"rel-menubar-change\", {\n detail,\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private renderMenuItem(item: Element, index: number): any {\n const isFocused = index === this.focusedItemIndex;\n\n if (item.hasAttribute(\"data-item\")) {\n const button = item as HTMLButtonElement;\n const disabled = button.disabled;\n const shortcut = button.getAttribute(\"data-shortcut\") || \"\";\n\n return html`\n <div\n class=\"menu-item ${isFocused ? \"focused\" : \"\"}\"\n data-disabled=\"${disabled}\"\n @click=\"${() => !disabled && this.handleItemClick(item as HTMLElement)}\"\n >\n <span>${button.textContent}</span>\n ${shortcut ? html`<span class=\"menu-shortcut\">${shortcut}</span>` : \"\"}\n </div>\n `;\n }\n\n if (item.hasAttribute(\"data-separator\")) {\n return html`<div class=\"menu-separator\"></div>`;\n }\n\n if (item.hasAttribute(\"data-checkbox\")) {\n const label = item as HTMLLabelElement;\n const checkbox = label.querySelector('input[type=\"checkbox\"]') as HTMLInputElement;\n const labelText = Array.from(label.childNodes)\n .filter(n => n.nodeType === Node.TEXT_NODE)\n .map(n => n.textContent?.trim())\n .filter(Boolean)\n .join(' ') || label.getAttribute('label') || '';\n\n return html`\n <rel-checkbox\n label=${labelText}\n .status=${checkbox?.checked ? \"checked\" : \"unchecked\"}\n @rel-change=${(e: CustomEvent) => {\n if (checkbox) checkbox.checked = e.detail.checked;\n this.dispatchChangeEvent(\"checkbox\", labelText, e.detail.checked);\n }}\n ></rel-checkbox>\n `;\n }\n\n if (item.hasAttribute(\"data-submenu\")) {\n const label = item.getAttribute(\"label\") || item.textContent?.trim() || \"\";\n const submenuId = `submenu-${index}`;\n\n return html`\n <div\n class=\"menu-item menu-submenu-trigger ${isFocused ? \"focused\" : \"\"}\"\n @click=\"${(e: Event) => this.openSubmenu(item as HTMLElement, e.currentTarget as HTMLElement, index)}\"\n @mouseenter=\"${(e: Event) => this.openSubmenu(item as HTMLElement, e.currentTarget as HTMLElement, index)}\"\n >\n <span>${label}</span>\n <rel-icon name=\"chevron-right\"></rel-icon>\n </div>\n ${this.renderSubmenu(item as HTMLElement, submenuId)}\n `;\n }\n\n if (item.hasAttribute(\"data-radio-group\")) {\n const radioButtons = Array.from(item.querySelectorAll(\"[data-radio]\"));\n const currentValue = item.getAttribute(\"value\") || \"\";\n const groupName = item.getAttribute(\"name\") || \"\";\n\n const options = radioButtons.map(radio => ({\n label: radio.textContent?.trim() || \"\",\n value: radio.getAttribute(\"data-radio\") || radio.getAttribute(\"value\") || \"\",\n }));\n\n return html`\n <rel-radio\n .options=${options}\n .value=${currentValue}\n @rel-change=${(e: CustomEvent) => {\n const newValue = e.detail.value;\n item.setAttribute(\"value\", newValue);\n this.dispatchChangeEvent(\"radio\", groupName, newValue);\n }}\n ></rel-radio>\n `;\n }\n\n return null;\n }\n\n private renderSubmenu(submenuElement: HTMLElement, submenuId: string) {\n const isOpen = this.openSubmenuElement === submenuElement;\n const submenuItems = Array.from(submenuElement.children);\n\n return html`\n <div class=\"submenu-panel ${isOpen ? \"open\" : \"\"}\" data-submenu-id=\"${submenuId}\">\n ${submenuItems.map((subItem) => {\n if (subItem.hasAttribute(\"data-item\")) {\n const button = subItem as HTMLButtonElement;\n return html`\n <div\n class=\"menu-item\"\n @click=\"${() => this.handleSubmenuItemClick(subItem as HTMLElement)}\"\n >\n <span>${button.textContent}</span>\n </div>\n `;\n }\n return null;\n })}\n </div>\n `;\n }\n\n private renderMenuPanel(menuState: MenuState, index: number) {\n const isOpen = index === this.openMenuIndex;\n const items = Array.from(menuState.menu.children);\n\n return html`\n <div\n class=\"menubar-panel ${isOpen ? \"open\" : \"\"}\"\n data-menu-index=\"${index}\"\n tabindex=\"-1\"\n @keydown=\"${this.handlePanelKeyDown}\"\n >\n ${items.map((item, idx) => this.renderMenuItem(item, idx))}\n </div>\n `;\n }\n\n render() {\n return html`\n <style>${RelMenubar._css}</style>\n <div class=\"menubar-container\">\n ${this.menus.map(\n (menuState, index) => html`\n <button\n class=\"menubar-trigger ${index === this.openMenuIndex ? \"active\" : \"\"}\"\n data-index=\"${index}\"\n @click=\"${(e: Event) => this.handleTriggerClick(index, e)}\"\n @mouseenter=\"${(e: Event) => this.handleTriggerMouseEnter(index, e)}\"\n @keydown=\"${this.handleTriggerKeyDown}\"\n >\n ${menuState.menu.label}\n </button>\n `\n )}\n </div>\n ${this.menus.map((menuState, index) => this.renderMenuPanel(menuState, index))}\n `;\n }\n}\n","import { LitElement, html } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\nimport \"./rel-menubar-menu.css\";\r\n\r\n@customElement(\"rel-menubar-menu\")\r\nexport class RelMenubarMenu extends LitElement {\r\n @property({ type: String }) label = \"\";\r\n\r\n // Disable shadow DOM to allow parent to access children\r\n createRenderRoot() {\r\n return this;\r\n }\r\n\r\n render() {\r\n return html``;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\r\n/**\r\n * @deprecated rel-navbar is deprecated and will be removed in a future release.\r\n * Use rel-topbar and its sub-components instead:\r\n * rel-topbar, rel-topbar-brand, rel-topbar-actions, rel-topbar-utilities,\r\n * rel-topbar-item, rel-topbar-dropdown, rel-topbar-dropdown-item\r\n */\r\n@customElement(\"rel-navbar\")\r\nexport class RelNavbar extends LitElement {\r\n constructor() {\r\n super();\r\n console.warn(\r\n \"[rel-navbar] rel-navbar is deprecated. Use rel-topbar instead.\"\r\n );\r\n }\r\n\r\n @property({ type: Boolean, reflect: true })\r\n sticky = false;\r\n\r\n @property({ type: String })\r\n device: \"desktop\" | \"tablet\" | \"mobile\" = \"desktop\";\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n display: block;\r\n width: 100%;\r\n }\r\n\r\n :host([sticky]) .navbar {\r\n position: sticky;\r\n top: 0;\r\n z-index: 100;\r\n }\r\n\r\n .navbar {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n background: var(--rel-bg-surface);\r\n color: var(--rel-text-default);\r\n border-bottom: 1px solid var(--rel-border-default);\r\n height: 64px;\r\n padding: 0 var(--rel-spacing-lg);\r\n box-sizing: border-box;\r\n font-family: var(--rel-fonts-font-family, sans-serif);\r\n }\r\n\r\n .brand {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-md);\r\n flex-shrink: 0;\r\n }\r\n\r\n .content {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-sm);\r\n flex: 1;\r\n justify-content: flex-start;\r\n padding: 0 var(--rel-spacing-xl);\r\n }\r\n\r\n .actions {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-sm);\r\n flex-shrink: 0;\r\n }\r\n\r\n /* Mobile/Tablet variants */\r\n :host([device=\"tablet\"]) .navbar {\r\n height: 56px;\r\n padding: 0 var(--rel-spacing-md);\r\n }\r\n\r\n :host([device=\"mobile\"]) .navbar {\r\n height: 56px;\r\n padding: 0 var(--rel-spacing-sm);\r\n }\r\n\r\n :host([device=\"mobile\"]) .content {\r\n display: none;\r\n }\r\n `;\r\n\r\n render() {\r\n return html`\r\n <div class=\"navbar\" part=\"container\" role=\"navigation\">\r\n <div part=\"brand\" class=\"brand\">\r\n <slot name=\"brand\"></slot>\r\n </div>\r\n <div part=\"content\" class=\"content\">\r\n <slot></slot>\r\n </div>\r\n <div part=\"actions\" class=\"actions\">\r\n <slot name=\"actions\"></slot>\r\n </div>\r\n </div>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property, state } from \"lit/decorators.js\";\r\nimport \"@reliability-design/icons/rel-icon\";\r\nimport \"./rel-topbar-brand\";\r\nimport \"./rel-topbar-actions\";\r\nimport \"./rel-topbar-utilities\";\r\nimport \"./rel-topbar-mobile-panel\";\r\nimport \"./rel-topbar-dropdown\";\r\nimport \"./rel-topbar-dropdown-item\";\r\n\r\nexport type TopbarVariant = \"customer\" | \"carrier\";\r\nexport type TopbarForceLayout = \"auto\" | \"desktop\" | \"tablet\" | \"mobile\";\r\n\r\n/**\r\n * `rel-topbar` — Application-level top navigation / header shell.\r\n *\r\n * @deprecated This component's fixed slot structure, hardcoded breakpoint,\r\n * and built-in overflow logic are too rigid for most real layouts. Use the\r\n * \"App Topbar\" recipe at /docs/recipes/app-topbar instead, composed from\r\n * rel-menu/rel-popover, rel-drawer, and rel-button. Still supported, but\r\n * will be removed in a future major version.\r\n *\r\n * Slots:\r\n * brand — Logo / wordmark region (left)\r\n * (default) — Primary nav items (rel-topbar-item elements)\r\n * actions — CTA / action buttons (customer) or dark-pill area (carrier)\r\n * utilities — Utility icon buttons (notifications, search, etc.)\r\n * profile — rel-topbar-profile tile\r\n * mobile-panel — Collapsed nav panel shown when mobileOpen is true\r\n *\r\n * Events:\r\n * rel-menu-toggle — fired when hamburger is clicked { open: boolean }\r\n * rel-mobile-open-change — alias of rel-menu-toggle for convenience\r\n * rel-nav-select — bubbled from child rel-topbar-item { value, label }\r\n */\r\n@customElement(\"rel-topbar\")\r\nexport class RelTopbar extends LitElement {\r\n /** Visual variant — affects action/profile region styling */\r\n @property({ type: String, reflect: true }) variant: TopbarVariant = \"customer\";\r\n\r\n /** Whether the mobile nav panel is currently open */\r\n @property({ type: Boolean, reflect: true }) mobileOpen = false;\r\n\r\n /** Whether to render the hamburger / close toggle button */\r\n @property({ type: Boolean, reflect: true }) showMenuToggle = false;\r\n\r\n /** Reduce height to compact (48 px) mode */\r\n @property({ type: Boolean, reflect: true }) compact = false;\r\n\r\n /** Stick topbar to top of viewport while scrolling */\r\n @property({ type: Boolean, reflect: true }) sticky = false;\r\n\r\n /**\r\n * Override the responsive layout for demos / storybook.\r\n * 'auto' respects CSS media queries.\r\n */\r\n @property({ type: String }) forceLayout: TopbarForceLayout = \"auto\";\r\n\r\n private _overflowItems: Element[] = [];\r\n @state() private _overflowCount: number = 0;\r\n @state() private _overflowItemsData: Array<{ label: string; href: string; disabled: boolean }> = [];\r\n private _resizeObserver?: ResizeObserver;\r\n private _resizeTimer?: number;\r\n private _measuring = false;\r\n private _lastNavWidth = 0;\r\n\r\n static styles = css`\r\n /* ─── Component tokens ─────────────────────────────────────────── */\r\n :host {\r\n color: var(--rel-text-default);\r\n --rel-topbar-height: 64px;\r\n --rel-topbar-height-compact: 48px;\r\n --rel-topbar-bg: var(--rel-bg-surface);\r\n --rel-topbar-border-color: var(--rel-border-default);\r\n --rel-topbar-item-color: var(--rel-text-default);\r\n --rel-topbar-item-active-color: var(--rel-text-success);\r\n --rel-topbar-item-active-indicator: var(--rel-bg-brand);\r\n --rel-topbar-item-hover-bg: var(--rel-bg-surface-elevated);\r\n --rel-topbar-divider-color: var(--rel-border-default);\r\n --rel-topbar-carrier-action-bg: var(--rel-text-default);\r\n --rel-topbar-carrier-action-color: var(--rel-bg-surface);\r\n --rel-topbar-z: 100;\r\n\r\n display: block;\r\n width: 100%;\r\n font-family: var(--rel-fonts-font-family, Poppins, sans-serif);\r\n }\r\n\r\n /* ─── Sticky host ───────────────────────────────────────────────── */\r\n :host([sticky]) {\r\n position: sticky;\r\n top: 0;\r\n z-index: var(--rel-topbar-z);\r\n }\r\n\r\n /* ─── Bar shell ─────────────────────────────────────────────────── */\r\n .topbar {\r\n display: flex;\r\n align-items: center;\r\n height: var(--rel-topbar-height);\r\n background: var(--rel-topbar-bg);\r\n border-bottom: var(--rel-stroke-sm, 1px) solid var(--rel-topbar-border-color);\r\n padding: 0 var(--rel-spacing-xl, 24px);\r\n box-sizing: border-box;\r\n gap: var(--rel-spacing-md, 16px);\r\n }\r\n\r\n :host([compact]) .topbar {\r\n height: var(--rel-topbar-height-compact);\r\n }\r\n\r\n /* ─── Brand ─────────────────────────────────────────────────────── */\r\n .brand-region {\r\n display: flex;\r\n align-items: center;\r\n flex-shrink: 0;\r\n }\r\n\r\n /* ─── Nav (primary, desktop) ────────────────────────────────────── */\r\n .nav-region {\r\n display: flex;\r\n align-items: center;\r\n flex: 1 1 0;\r\n gap: var(--rel-spacing-2xs, 4px);\r\n min-width: 0;\r\n }\r\n\r\n /* ─── Right side cluster ────────────────────────────────────────── */\r\n .right-region {\r\n display: flex;\r\n align-items: center;\r\n flex-shrink: 0;\r\n margin-left: auto;\r\n gap: var(--rel-spacing-xs, 8px);\r\n }\r\n\r\n .actions-region,\r\n .utilities-region,\r\n .profile-region {\r\n display: contents;\r\n }\r\n\r\n /* Vertical divider between util/profile when both are populated */\r\n .divider {\r\n width: var(--rel-stroke-sm, 1px);\r\n height: 24px;\r\n background: var(--rel-topbar-divider-color);\r\n flex-shrink: 0;\r\n }\r\n\r\n /* ─── Carrier action pill wrapper ───────────────────────────────── */\r\n :host([variant=\"carrier\"]) .actions-region ::slotted(*) {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-xs, 8px);\r\n background: var(--rel-topbar-carrier-action-bg);\r\n color: var(--rel-topbar-carrier-action-color);\r\n padding: var(--rel-spacing-2xs, 4px) var(--rel-spacing-sm, 12px);\r\n border-radius: var(--rel-border-radius-full-rounded, 1000px);\r\n }\r\n\r\n /* ─── Mobile toggle button ──────────────────────────────────────── */\r\n .menu-toggle {\r\n display: none;\r\n align-items: center;\r\n justify-content: center;\r\n width: 40px;\r\n height: 40px;\r\n padding: 0;\r\n border: none;\r\n background: transparent;\r\n border-radius: var(--rel-border-radius-sm, 8px);\r\n cursor: pointer;\r\n color: var(--rel-topbar-item-color);\r\n flex-shrink: 0;\r\n }\r\n\r\n .menu-toggle:focus-visible {\r\n outline: 2px solid var(--rel-topbar-item-active-indicator);\r\n outline-offset: 2px;\r\n }\r\n\r\n .menu-toggle:hover {\r\n background: var(--rel-topbar-item-hover-bg);\r\n }\r\n\r\n .menu-toggle svg {\r\n display: block;\r\n }\r\n\r\n /* ─── Mobile panel ──────────────────────────────────────────────── */\r\n .mobile-panel {\r\n display: none;\r\n background: var(--rel-topbar-bg);\r\n border-bottom: var(--rel-stroke-sm, 1px) solid var(--rel-topbar-border-color);\r\n }\r\n\r\n .mobile-panel.open {\r\n display: block;\r\n }\r\n\r\n .mobile-overflow-nav {\r\n display: flex;\r\n flex-direction: column;\r\n padding: var(--rel-spacing-xs, 8px) 0;\r\n border-top: 1px solid var(--rel-topbar-border-color);\r\n }\r\n\r\n .mobile-overflow-item {\r\n display: block;\r\n padding: var(--rel-spacing-xs, 8px) var(--rel-spacing-xl, 24px);\r\n color: var(--rel-topbar-item-color);\r\r\r\r\n text-decoration: none;\n font-family: var(--rel-body-md-medium-font-family);\n font-weight: var(--rel-body-md-medium-font-weight);\n font-size: var(--rel-body-md-medium-font-size);\n line-height: var(--rel-body-md-medium-line-height);\n letter-spacing: var(--rel-body-md-medium-letter-spacing);\n }\r\n\r\n .mobile-overflow-item:hover {\r\n background: var(--rel-topbar-item-hover-bg);\r\n }\r\n\r\n .mobile-overflow-item.disabled {\r\n opacity: 0.45;\r\n pointer-events: none;\r\n }\r\n\r\n /* ─── Responsive: auto mode (CSS media queries) ─────────────────── */\r\n @media (max-width: 768px) {\r\n .topbar:not(.force-desktop) .nav-region {\r\n display: none;\r\n }\r\n\r\n .topbar:not(.force-desktop) .menu-toggle {\r\n display: flex;\r\n }\r\n }\r\n\r\n @media (min-width: 769px) {\r\n .topbar:not(.force-mobile):not(.force-tablet) .menu-toggle {\r\n display: none;\r\n }\r\n }\r\n\r\n /* ─── forceLayout overrides ─────────────────────────────────────── */\r\n .topbar.force-mobile .nav-region,\r\n .topbar.force-tablet .nav-region {\r\n display: none;\r\n }\r\n\r\n .topbar.force-mobile .menu-toggle,\r\n .topbar.force-tablet .menu-toggle {\r\n display: flex;\r\n }\r\n\r\n .topbar.force-desktop .nav-region {\r\n display: flex;\r\n }\r\n\r\n .topbar.force-desktop .menu-toggle {\r\n display: none;\r\n }\r\n `;\r\n\r\n override firstUpdated() {\r\n const navRegion = this.renderRoot.querySelector(\".nav-region\") as HTMLElement;\r\n if (navRegion) {\r\n this._resizeObserver = new ResizeObserver(() => {\r\n clearTimeout(this._resizeTimer);\r\n this._resizeTimer = window.setTimeout(() => this._measureNav(), 150);\r\n });\r\n this._resizeObserver.observe(navRegion);\r\n }\r\n requestAnimationFrame(() => this._measureNav());\r\n }\r\n\r\n override disconnectedCallback() {\r\n super.disconnectedCallback();\r\n this._resizeObserver?.disconnect();\r\n clearTimeout(this._resizeTimer);\r\n }\r\n\r\n private _measureNav() {\r\n if (this._measuring) return;\r\n this._measuring = true;\r\n const navRegion = this.renderRoot.querySelector(\".nav-region\") as HTMLElement;\r\n if (!navRegion) return;\r\n const navSlot = this.renderRoot.querySelector('slot[name=\"nav\"]') as HTMLSlotElement;\r\n if (!navSlot) return;\r\n const items = Array.from(navSlot.assignedElements()).filter(\r\n el => el.tagName.toLowerCase() !== \"rel-topbar-item\" || !el.hasAttribute(\"data-more\")\r\n );\r\n const navWidth = navRegion.getBoundingClientRect().width;\r\n if (Math.abs(navWidth - this._lastNavWidth) < 2) return;\r\n this._lastNavWidth = navWidth;\r\n const available = navWidth - 120;\r\n\r\n let accumulated = 0;\r\n let firstOverflowIndex = items.length;\r\n for (let i = 0; i < items.length; i++) {\r\n accumulated += items[i].getBoundingClientRect().width;\r\n if (accumulated > available) {\r\n firstOverflowIndex = i;\r\n break;\r\n }\r\n }\r\n\r\n const overflowingElements = Array.from(items).slice(firstOverflowIndex);\r\n this._overflowItems = overflowingElements;\r\n this._overflowCount = overflowingElements.length;\r\n this._overflowItemsData = overflowingElements.map(el => ({\r\n label: el.getAttribute(\"label\") ?? \"\",\r\n href: el.getAttribute(\"href\") ?? \"\",\r\n disabled: el.hasAttribute(\"disabled\"),\r\n }));\r\n\r\n for (const el of items) {\r\n if (overflowingElements.includes(el)) {\r\n el.setAttribute(\"hidden\", \"\");\r\n } else {\r\n el.removeAttribute(\"hidden\");\r\n }\r\n }\r\n\r\n this._measuring = false;\r\n }\r\n\r\n private onRouterSlotChange(e: Event) {\r\n const slot = e.target as HTMLSlotElement;\r\n for (const el of slot.assignedElements({ flatten: true })) {\r\n const tag = (el as HTMLElement).tagName.toLowerCase();\r\n const targetSlot =\r\n tag === \"rel-topbar-brand\" ? \"brand\" :\r\n tag === \"rel-topbar-actions\" ? \"actions\" :\r\n tag === \"rel-topbar-utilities\" ? \"utilities\" :\r\n tag === \"rel-topbar-profile\" ? \"profile\" :\r\n tag === \"rel-topbar-mobile-panel\" ? \"mobile-panel\" :\r\n \"nav\";\r\n if ((el as HTMLElement).slot !== targetSlot) {\r\n (el as HTMLElement).slot = targetSlot;\r\n }\r\n }\r\n }\r\n\r\n private get layoutClass(): string {\r\n if (this.forceLayout === \"auto\") return \"\";\r\n return `force-${this.forceLayout}`;\r\n }\r\n\r\n private handleMenuToggle() {\r\n this.mobileOpen = !this.mobileOpen;\r\n const detail = { open: this.mobileOpen };\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-menu-toggle\", { detail, bubbles: true, composed: true })\r\n );\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-mobile-open-change\", { detail, bubbles: true, composed: true })\r\n );\r\n }\r\n\r\n render() {\r\n const topbarClass = [\"topbar\", this.layoutClass].filter(Boolean).join(\" \");\r\n const menuLabel = this.mobileOpen ? \"Close menu\" : \"Open menu\";\r\n\r\n return html`\r\n <!-- router: auto-assigns slot names by tagName; stays empty after redistribution -->\r\n <slot style=\"display:none\" @slotchange=${this.onRouterSlotChange}></slot>\r\n\r\n <header>\r\n <div class=${topbarClass} role=\"banner\">\r\n <div class=\"brand-region\">\r\n <slot name=\"brand\"></slot>\r\n </div>\r\n\r\n <nav class=\"nav-region\" aria-label=\"Primary\">\r\n <slot name=\"nav\" @slotchange=${this._measureNav}></slot>\r\n ${this._overflowCount > 0 ? html`\r\n <rel-topbar-item label=\"More\" expandable data-more>\r\n <rel-topbar-dropdown slot=\"dropdown\">\r\n ${this._overflowItemsData.map(item => html`\r\n <rel-topbar-dropdown-item\r\n label=${item.label}\r\n href=${item.href}\r\n ?disabled=${item.disabled}\r\n ></rel-topbar-dropdown-item>\r\n `)}\r\n </rel-topbar-dropdown>\r\n </rel-topbar-item>\r\n ` : null}\r\n </nav>\r\n\r\n <div class=\"right-region\">\r\n <div class=\"actions-region\">\r\n <slot name=\"actions\"></slot>\r\n </div>\r\n <div class=\"utilities-region\">\r\n <slot name=\"utilities\"></slot>\r\n </div>\r\n <div class=\"profile-region\">\r\n <slot name=\"profile\"></slot>\r\n </div>\r\n\r\n ${this.showMenuToggle\r\n ? html`\r\n <button\r\n class=\"menu-toggle\"\r\n aria-label=${menuLabel}\r\n aria-expanded=${this.mobileOpen}\r\n aria-controls=\"mobile-panel\"\r\n @click=${this.handleMenuToggle}\r\n >\r\n ${this.mobileOpen\r\n ? html`<rel-icon name=\"close\" size=\"md\"></rel-icon>`\r\n : html`<rel-icon name=\"hamburger\" size=\"md\"></rel-icon>`}\r\n </button>\r\n `\r\n : null}\r\n </div>\r\n </div>\r\n </header>\r\n\r\n <div\r\n class=\"mobile-panel ${this.mobileOpen ? \"open\" : \"\"}\"\r\n id=\"mobile-panel\"\r\n role=\"region\"\r\n aria-label=\"Mobile navigation\"\r\n >\r\n <slot name=\"mobile-panel\"></slot>\r\n ${this._overflowItemsData.length > 0 ? html`\r\n <div class=\"mobile-overflow-nav\">\r\n ${this._overflowItemsData.map(item => html`\r\n <a\r\n class=\"mobile-overflow-item ${item.disabled ? \"disabled\" : \"\"}\"\r\n href=${item.href}\r\n ?aria-disabled=${item.disabled}\r\n >${item.label}</a>\r\n `)}\r\n </div>\r\n ` : null}\r\n </div>\r\n `;\r\n }\r\n}\r\n\r\n","import { LitElement, html, css } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\n\n/**\n * @deprecated Part of the deprecated rel-topbar family. Use a plain\n * `<a>`/logo markup inside the \"App Topbar\" recipe at /docs/recipes/app-topbar.\n */\n@customElement(\"rel-topbar-brand\")\nexport class RelTopbarBrand extends LitElement {\n @property({ type: String }) src: string = \"\";\n @property({ type: String }) href: string = \"/\";\n @property({ type: String }) label: string = \"\";\n\n static styles = css`\n :host {\n color: var(--rel-text-default);\n display: inline-flex;\n align-items: center;\n }\n\n a {\n display: inline-flex;\n align-items: center;\n gap: var(--rel-spacing-xs);\n text-decoration: none;\n color: var(--rel-text-default);\n font-family: var(--rel-body-md-semibold-font-family);\n font-weight: var(--rel-body-md-semibold-font-weight);\n font-size: var(--rel-body-md-semibold-font-size);\n line-height: var(--rel-body-md-semibold-line-height);\n letter-spacing: var(--rel-body-md-semibold-letter-spacing);\n }\n\n img {\n display: block;\n }\n `;\n\n render() {\n return html`\n <a href=\"${this.href}\" aria-label=\"${this.label || \"Home\"}\">\n ${this.src\n ? html`<img src=\"${this.src}\" alt=\"${this.label}\" />`\n : html`<slot>${this.label}</slot>`}\n </a>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"rel-topbar-brand\": RelTopbarBrand;\n }\n}\n","import { LitElement, html, css } from \"lit\";\nimport { customElement } from \"lit/decorators.js\";\n\n/**\n * @deprecated Part of the deprecated rel-topbar family. Use plain\n * `rel-button` elements inside the \"App Topbar\" recipe at /docs/recipes/app-topbar.\n */\n@customElement(\"rel-topbar-actions\")\nexport class RelTopbarActions extends LitElement {\n static styles = css`\n .actions {\n display: inline-flex;\n align-items: center;\n gap: var(--rel-spacing-xs, 8px);\n }\n `;\n\n render() {\n return html`<div class=\"actions\"><slot></slot></div>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"rel-topbar-actions\": RelTopbarActions;\n }\n}\n","import { LitElement, html, css } from \"lit\";\nimport { customElement } from \"lit/decorators.js\";\n\n/**\n * @deprecated Part of the deprecated rel-topbar family. Use plain\n * `rel-button` (icon variant) elements inside the \"App Topbar\" recipe at /docs/recipes/app-topbar.\n */\n@customElement(\"rel-topbar-utilities\")\nexport class RelTopbarUtilities extends LitElement {\n static styles = css`\n .utilities {\n display: inline-flex;\n align-items: center;\n gap: var(--rel-spacing-xs, 8px);\n }\n `;\n\n render() {\n return html`<div class=\"utilities\"><slot></slot></div>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"rel-topbar-utilities\": RelTopbarUtilities;\n }\n}\n","import { LitElement, html, css } from \"lit\";\nimport { customElement } from \"lit/decorators.js\";\n\n/**\n * @deprecated Part of the deprecated rel-topbar family. Use `rel-drawer`\n * for the mobile nav panel in the \"App Topbar\" recipe at /docs/recipes/app-topbar.\n */\n@customElement(\"rel-topbar-mobile-panel\")\nexport class RelTopbarMobilePanel extends LitElement {\n static styles = css`\n .mobile-panel {\n display: flex;\n flex-direction: column;\n width: 100%;\n }\n `;\n\n render() {\n return html`<div class=\"mobile-panel\"><slot></slot></div>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"rel-topbar-mobile-panel\": RelTopbarMobilePanel;\n }\n}\n","import { LitElement, html, css } from \"lit\";\nimport { customElement } from \"lit/decorators.js\";\n\n/**\n * @deprecated Part of the deprecated rel-topbar family. Use `rel-menu` or\n * `rel-popover` for nav dropdowns in the \"App Topbar\" recipe at /docs/recipes/app-topbar.\n */\n@customElement(\"rel-topbar-dropdown\")\nexport class RelTopbarDropdown extends LitElement {\n static styles = css`\n .dropdown {\n display: flex;\n flex-direction: column;\n min-width: 160px;\n background: var(--rel-bg-surface);\n border-radius: var(--rel-border-radius-sm);\n box-shadow: var(--rel-shadows-shadow-200);\n padding: var(--rel-spacing-2xs) 0;\n }\n `;\n\n render() {\n return html`<div class=\"dropdown\"><slot></slot></div>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"rel-topbar-dropdown\": RelTopbarDropdown;\n }\n}\n","import { LitElement, html, css } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\n\n/**\n * @deprecated Part of the deprecated rel-topbar family. Use `rel-menu`'s\n * item slots or `rel-popover` content in the \"App Topbar\" recipe at /docs/recipes/app-topbar.\n */\n@customElement(\"rel-topbar-dropdown-item\")\nexport class RelTopbarDropdownItem extends LitElement {\n @property({ type: String }) label: string = \"\";\n @property({ type: String }) href: string = \"#\";\n @property({ type: Boolean, reflect: true }) active = false;\n\n static styles = css`\n .dropdown-item {\n display: block;\n padding: var(--rel-spacing-xs, 8px) var(--rel-spacing-md, 16px);\n color: var(--rel-text-default);\n text-decoration: none;\n font-family: var(--rel-body-md-regular-font-family);\n font-weight: var(--rel-body-md-regular-font-weight);\n font-size: var(--rel-body-md-regular-font-size);\n line-height: var(--rel-body-md-regular-line-height);\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\n }\n\n .dropdown-item:hover {\n background: var(--rel-action-overlay-hover);\n border-radius: 0;\n }\n\n :host([active]) .dropdown-item {\n color: var(--rel-topbar-item-active-color, var(--rel-text-success));\n font-weight: var(--rel-fonts-weight-body-semibold, 600);\n }\n\n `;\n\n private _handleClick(e: MouseEvent) {\n if (this.hasAttribute(\"disabled\")) {\n e.preventDefault();\n return;\n }\n e.preventDefault();\n this.dispatchEvent(new CustomEvent(\"rel-select\", {\n detail: { value: this.href, label: this.label },\n bubbles: true,\n composed: true,\n }));\n this.dispatchEvent(new CustomEvent(\"rel-nav-select\", {\n detail: { value: this.href, label: this.label },\n bubbles: true,\n composed: true,\n }));\n this.active = true;\n const siblings = this.parentElement?.querySelectorAll(\"rel-topbar-dropdown-item\");\n siblings?.forEach(s => { if (s !== this) (s as any).active = false; });\n }\n\n render() {\n return html`<a href=\"${this.href}\" class=\"dropdown-item\" @click=${this._handleClick}>${this.label}</a>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"rel-topbar-dropdown-item\": RelTopbarDropdownItem;\n }\n}\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property, state } from \"lit/decorators.js\";\r\nimport \"./rel-topbar-dropdown\";\r\nimport \"./rel-topbar-dropdown-item\";\r\nimport \"@reliability-design/icons/rel-icon\";\r\n\r\n/**\r\n * `rel-topbar-item` — A navigation item within rel-topbar.\r\n *\r\n * @deprecated Part of the deprecated rel-topbar family. Use the \"App\r\n * Topbar\" recipe at /docs/recipes/app-topbar, which composes nav links and\r\n * `rel-menu`/`rel-popover` dropdowns directly instead of a dedicated item component.\r\n *\r\n * Renders as an `<a>` when `href` is supplied, otherwise a `<button>`.\r\n *\r\n * Slots:\r\n * (default) — Label text / icon (overrides `label` property)\r\n * prefix — Icon/content before the label\r\n * suffix — Icon/content after the label (e.g. badge)\r\n * dropdown — Expandable panel content shown below the item\r\n *\r\n * Events:\r\n * rel-select — fired when a non-disabled, non-expandable item is activated\r\n * rel-toggle — fired when an expandable item is opened/closed { open: boolean }\r\n */\r\n@customElement(\"rel-topbar-item\")\r\nexport class RelTopbarItem extends LitElement {\r\n /** Accessible label — also shown as text when no default slot content */\r\n @property({ type: String }) label?: string;\r\n\r\n /** Navigation href — renders an anchor element when set */\r\n @property({ type: String }) href?: string;\r\n\r\n /** Marks this item as the current/active page */\r\n @property({ type: Boolean, reflect: true }) active = false;\r\n\r\n /** Prevents interaction */\r\n @property({ type: Boolean, reflect: true }) disabled = false;\r\n\r\n /** Shows a chevron and enables dropdown panel */\r\n @property({ type: Boolean, reflect: true }) expandable = false;\r\n\r\n /** Controlled open state of the dropdown panel */\r\n @property({ type: Boolean, reflect: true }) open = false;\r\n\r\n /** Optional string value forwarded in rel-select / rel-toggle events */\r\n @property({ type: String }) value?: string;\r\n\r\n /** @internal tracks whether dropdown slot has content */\r\n @state() private _hasDropdown = false;\r\n\r\n static styles = css`\r\n /* ─── Component tokens ──────────────────────────────────────────── */\r\n :host {\r\n color: var(--rel-text-default);\r\n --_item-color: var(--rel-topbar-item-color, var(--rel-text-default));\r\n --_item-active-color: var(--rel-topbar-item-active-color, var(--rel-text-success));\r\n --_item-active-indicator: var(--rel-topbar-item-active-indicator, var(--rel-bg-brand));\r\n --_item-hover-bg: var(--rel-topbar-item-hover-bg, var(--rel-bg-surface-elevated));\r\n\r\n display: inline-block;\r\n position: relative;\r\n font-family: var(--rel-fonts-font-family, Poppins, sans-serif);\r\n }\r\n\r\n :host([hidden]) {\r\n display: none !important;\r\n }\r\n\r\n /* ─── Trigger (shared for <a> and <button>) ─────────────────────── */\r\n .trigger {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-2xs, 4px);\r\n padding: var(--rel-spacing-xs, 8px) var(--rel-spacing-sm, 12px);\r\n border: none;\r\n background: transparent;\r\n border-radius: var(--rel-border-radius-sm, 8px);\r\n cursor: pointer;\r\n color: var(--_item-color);\r\r\r\r\r\n text-decoration: none;\r\n white-space: nowrap;\r\n position: relative;\r\n transition: background 0.15s ease, color 0.15s ease;\r\n box-sizing: border-box;\n font-family: var(--rel-body-md-medium-font-family);\n font-weight: var(--rel-body-md-medium-font-weight);\n font-size: var(--rel-body-md-medium-font-size);\n line-height: var(--rel-body-md-medium-line-height);\n letter-spacing: var(--rel-body-md-medium-letter-spacing);\n }\r\n\r\n .trigger::after {\r\n content: \"\";\r\n position: absolute;\r\n bottom: -2px;\r\n left: var(--rel-spacing-sm, 12px);\r\n right: var(--rel-spacing-sm, 12px);\r\n height: 2px;\r\n border-radius: 1px;\r\n background: transparent;\r\n transition: background 0.15s ease;\r\n }\r\n\r\n /* Active state */\r\n :host([active]) .trigger {\r\n color: var(--_item-active-color);\r\n font-weight: var(--rel-fonts-weight-body-semibold, 600);\r\n }\r\n\r\n :host([active]) .trigger::after {\r\n background: var(--_item-active-indicator);\r\n }\r\n\r\n /* Hover */\r\n .trigger:hover:not(:disabled) {\r\n background: var(--_item-hover-bg);\r\n }\r\n\r\n /* Focus */\r\n .trigger:focus-visible {\r\n outline: 2px solid var(--_item-active-indicator);\r\n outline-offset: 2px;\r\n }\r\n\r\n /* Disabled */\r\n :host([disabled]) {\r\n cursor: not-allowed;\r\n }\r\n\r\n :host([disabled]) .trigger {\r\n opacity: 0.45;\r\n cursor: not-allowed;\r\n pointer-events: none;\r\n }\r\n\r\n /* Open state (expandable) */\r\n :host([open]) .trigger {\r\n background: var(--_item-hover-bg);\r\n }\r\n\r\n /* ─── Prefix / suffix slots ─────────────────────────────────────── */\r\n .prefix,\r\n .suffix {\r\n display: contents;\r\n }\r\n\r\n /* ─── Chevron icon ──────────────────────────────────────────────── */\r\n .chevron {\r\n display: inline-flex;\r\n align-items: center;\r\n flex-shrink: 0;\r\n transition: transform 0.2s ease;\r\n color: inherit;\r\n }\r\n\r\n :host([open]) .chevron {\r\n transform: rotate(180deg);\r\n }\r\n\r\n /* ─── Dropdown panel ────────────────────────────────────────────── */\r\n .dropdown {\r\n position: absolute;\r\n top: calc(100% + 6px);\r\n left: 0;\r\n min-width: 200px;\r\n background: var(--rel-bg-surface);\r\n border: var(--rel-stroke-sm, 1px) solid var(--rel-border-default);\r\n border-radius: var(--rel-border-radius-sm, 8px);\r\n box-shadow: var(--rel-shadows-shadow-300);\r\n padding: var(--rel-spacing-2xs, 4px);\r\n z-index: 200;\r\n display: none;\r\n }\r\n\r\n :host([open]) .dropdown {\r\n display: block;\r\n }\r\n `;\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n document.addEventListener(\"click\", this._handleOutsideClick);\r\n document.addEventListener(\"keydown\", this._handleDocKeydown);\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback();\r\n document.removeEventListener(\"click\", this._handleOutsideClick);\r\n document.removeEventListener(\"keydown\", this._handleDocKeydown);\r\n }\r\n\r\n private _handleOutsideClick = (e: MouseEvent) => {\r\n if (!this.open) return;\r\n const path = e.composedPath() as Node[];\r\n if (!path.includes(this)) {\r\n this._setOpen(false);\r\n }\r\n };\r\n\r\n private _handleDocKeydown = (e: KeyboardEvent) => {\r\n if (e.key === \"Escape\" && this.open) {\r\n this._setOpen(false);\r\n (this.shadowRoot?.querySelector(\".trigger\") as HTMLElement)?.focus();\r\n }\r\n };\r\n\r\n private _setOpen(value: boolean) {\r\n this.open = value;\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-toggle\", {\r\n detail: { open: this.open, value: this.value },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private _handleTriggerClick(e: MouseEvent) {\r\n if (this.disabled) {\r\n e.preventDefault();\r\n return;\r\n }\r\n\r\n if (this.expandable || this._hasDropdown) {\r\n e.preventDefault();\r\n this._setOpen(!this.open);\r\n return;\r\n }\r\n\r\n if (!this.href) {\r\n e.preventDefault();\r\n }\r\n\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-select\", {\r\n detail: { value: this.value, label: this.label },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n\r\n // Bubble up to topbar\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-nav-select\", {\r\n detail: { value: this.value, label: this.label },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private _routeSlots(e: Event) {\r\n const slot = e.target as HTMLSlotElement;\r\n for (const el of slot.assignedElements({ flatten: true })) {\r\n const targetSlot = (el as HTMLElement).tagName.toLowerCase() === \"rel-topbar-dropdown\" ? \"dropdown\" : \"\";\r\n if ((el as HTMLElement).slot !== targetSlot) {\r\n (el as HTMLElement).slot = targetSlot;\r\n }\r\n }\r\n }\r\n\r\n private _handleDropdownSlotChange(e: Event) {\r\n const slot = e.target as HTMLSlotElement;\r\n const nodes = slot.assignedElements();\r\n this._hasDropdown = nodes.length > 0;\r\n }\r\n\r\n render() {\r\n const isLink = !!this.href && !this.disabled;\r\n const showChevron = this.expandable || this._hasDropdown;\r\n const ariaCurrent = this.active ? \"page\" : undefined;\r\n const ariaExpanded = showChevron ? (this.open ? \"true\" : \"false\") : undefined;\r\n const ariaHasPopup = showChevron ? \"true\" : undefined;\r\n\r\n const triggerContent = html`\r\n <span class=\"prefix\"><slot name=\"prefix\"></slot></span>\r\n <slot>${this.label ?? \"\"}</slot>\r\n <span class=\"suffix\"><slot name=\"suffix\"></slot></span>\r\n ${showChevron\r\n ? html`<span class=\"chevron\" aria-hidden=\"true\">\r\n <rel-icon name=\"chevron-down\" size=\"sm\"></rel-icon>\r\n </span>`\r\n : null}\r\n `;\r\n\r\n const trigger = isLink\r\n ? html`\r\n <a\r\n class=\"trigger\"\r\n href=${this.href!}\r\n aria-current=${ariaCurrent as string}\r\n aria-expanded=${ariaExpanded as string}\r\n aria-haspopup=${ariaHasPopup as string}\r\n @click=${this._handleTriggerClick}\r\n >\r\n ${triggerContent}\r\n </a>\r\n `\r\n : html`\r\n <button\r\n class=\"trigger\"\r\n type=\"button\"\r\n ?disabled=${this.disabled}\r\n aria-current=${ariaCurrent as string}\r\n aria-expanded=${ariaExpanded as string}\r\n aria-haspopup=${ariaHasPopup as string}\r\n @click=${this._handleTriggerClick}\r\n >\r\n ${triggerContent}\r\n </button>\r\n `;\r\n\r\n return html`\r\n <!-- router: auto-assigns slot=\"dropdown\" for rel-topbar-dropdown children -->\r\n <slot style=\"display:none\" @slotchange=${this._routeSlots}></slot>\r\n\r\n ${trigger}\r\n <div class=\"dropdown\" role=\"region\">\r\n <slot name=\"dropdown\" @slotchange=${this._handleDropdownSlotChange}></slot>\r\n </div>\r\n `;\r\n }\r\n}\r\n\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\nimport \"../rel-avatar/rel-avatar.js\";\r\n\r\nexport type TopbarProfileType = \"avatar\" | \"carrier\";\r\nexport type TopbarRewardTier = \"gold\" | \"silver\" | \"platinum\" | \"bronze\" | \"regular\";\r\n\r\n/**\r\n * `rel-topbar-profile` — Profile / user tile for the topbar right region.\r\n *\r\n * @deprecated Part of the deprecated rel-topbar family. Compose `rel-avatar`\r\n * directly inside the \"App Topbar\" recipe at /docs/recipes/app-topbar.\r\n *\r\n * type=\"avatar\" Customer avatar with initials circle + optional name/subtitle.\r\n * type=\"carrier\" Carrier reward tile with reward-tier badge + name/subtitle.\r\n */\r\n@customElement(\"rel-topbar-profile\")\r\nexport class RelTopbarProfile extends LitElement {\r\n /** Visual mode */\r\n @property({ type: String, reflect: true }) type: TopbarProfileType = \"avatar\";\r\n\r\n /** One or two initials shown in the avatar circle */\r\n @property({ type: String }) initials?: string;\r\n\r\n /** Primary display name */\r\n @property({ type: String }) name?: string;\r\n\r\n /** Secondary line (role, plan, etc.) */\r\n @property({ type: String }) subtitle?: string;\r\n\r\n /** Reward tier — only meaningful when type=\"carrier\" */\r\n @property({ type: String, reflect: true }) reward: TopbarRewardTier = \"regular\";\r\n\r\n /** Compact mode — avatar only, no text */\r\n @property({ type: Boolean, reflect: true }) compact = false;\r\n\r\n static styles = css`\r\n /* ─── Component tokens (reward tier palette) ────────────────────── */\r\n :host {\r\n color: var(--rel-text-default);\r\n --_profile-radius: var(--rel-border-radius-full-rounded, 1000px);\r\n --_avatar-size: 36px;\r\n --_avatar-size-sm: 28px;\r\n --_avatar-bg: var(--rel-bg-brand);\r\n --_avatar-color: var(--rel-text-default);\r\n\r\n /* Reward tier colours (reference existing token palette) */\r\n --rel-topbar-reward-gold: var(--rel-bg-warning);\r\n --rel-topbar-reward-gold-bg: var(--rel-bg-warning-light);\r\n --rel-topbar-reward-silver: var(--rel-text-caption);\r\n --rel-topbar-reward-silver-bg: var(--rel-bg-neutral-elevated-1);\r\n --rel-topbar-reward-platinum: var(--rel-text-info);\r\n --rel-topbar-reward-platinum-bg: var(--rel-bg-info-light);\r\n --rel-topbar-reward-bronze: var(--rel-text-warning);\r\n --rel-topbar-reward-bronze-bg: var(--rel-bg-warning-light);\r\n --rel-topbar-reward-regular: var(--rel-border-default);\r\n --rel-topbar-reward-regular-bg: var(--rel-bg-surface-elevated);\r\n\r\n display: inline-flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-xs, 8px);\r\n font-family: var(--rel-fonts-font-family, Poppins, sans-serif);\r\n cursor: pointer;\r\n }\r\n\r\n /* ─── Name / subtitle stack ─────────────────────────────────────── */\r\n .text-stack {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 0;\r\n min-width: 0;\r\n }\r\n\r\n :host([compact]) .text-stack {\r\n display: none;\r\n }\r\n\r\n .name {\r\r\r\n color: var(--rel-text-default);\r\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\n\r\n font-family: var(--rel-body-md-medium-font-family);\n\r\n font-weight: var(--rel-body-md-medium-font-weight);\n\r\n font-size: var(--rel-body-md-medium-font-size);\n\r\n line-height: var(--rel-body-md-medium-line-height);\n\r\n letter-spacing: var(--rel-body-md-medium-letter-spacing);\n\r\n }\r\n\r\n .subtitle {\r\r\r\n color: var(--rel-text-placeholder);\r\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\n\r\n font-family: var(--rel-body-sm-regular-font-family);\n\r\n font-weight: var(--rel-body-sm-regular-font-weight);\n\r\n font-size: var(--rel-body-sm-regular-font-size);\n\r\n line-height: var(--rel-body-sm-regular-line-height);\n\r\n letter-spacing: var(--rel-body-sm-regular-letter-spacing);\n\r\n }\r\n\r\n /* ─── Carrier reward badge ──────────────────────────────────────── */\r\n .reward-badge {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-3xs, 2px);\r\n padding: 2px var(--rel-spacing-2xs, 4px);\r\n border-radius: var(--rel-border-radius-xs, 2px);\r\r\r\n text-transform: uppercase;\r\r\n flex-shrink: 0;\n font-family: var(--rel-body-xs-semibold-font-family);\n font-weight: var(--rel-body-xs-semibold-font-weight);\n font-size: var(--rel-body-xs-semibold-font-size);\n line-height: var(--rel-body-xs-semibold-line-height);\n letter-spacing: var(--rel-body-xs-semibold-letter-spacing);\n }\r\n\r\n /* Gold */\r\n :host([reward=\"gold\"]) .reward-badge {\r\n background: var(--rel-topbar-reward-gold-bg);\r\n color: var(--rel-topbar-reward-gold);\r\n }\r\n\r\n /* Silver */\r\n :host([reward=\"silver\"]) .reward-badge {\r\n background: var(--rel-topbar-reward-silver-bg);\r\n color: var(--rel-text-default);\r\n }\r\n\r\n /* Platinum */\r\n :host([reward=\"platinum\"]) .reward-badge {\r\n background: var(--rel-topbar-reward-platinum-bg);\r\n color: var(--rel-topbar-reward-platinum);\r\n }\r\n\r\n /* Bronze */\r\n :host([reward=\"bronze\"]) .reward-badge {\r\n background: var(--rel-topbar-reward-bronze-bg);\r\n color: var(--rel-topbar-reward-bronze);\r\n }\r\n\r\n /* Regular */\r\n :host([reward=\"regular\"]) .reward-badge {\r\n background: var(--rel-topbar-reward-regular-bg);\r\n color: var(--rel-text-default);\r\n }\r\n\r\n /* ─── Carrier tile shell ────────────────────────────────────────── */\r\n .carrier-tile {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-xs, 8px);\r\n padding: var(--rel-spacing-2xs, 4px) var(--rel-spacing-xs, 8px);\r\n border-radius: var(--rel-border-radius-sm, 8px);\r\n background: var(--rel-bg-surface-elevated);\r\n border: var(--rel-stroke-sm, 1px) solid var(--rel-border-default);\r\n }\r\n\r\n :host([compact]) .carrier-tile {\r\n padding: var(--rel-spacing-2xs, 4px);\r\n }\r\n\r\n .carrier-meta {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 1px;\r\n min-width: 0;\r\n }\r\n\r\n :host([compact]) .carrier-meta {\r\n display: none;\r\n }\r\n `;\r\n\r\n render() {\r\n if (this.type === \"carrier\") {\r\n return this._renderCarrier();\r\n }\r\n return this._renderAvatar();\r\n }\r\n\r\n private _renderAvatar() {\r\n return html`\r\n <rel-avatar\r\n type=\"text\"\r\n text=${this.initials ?? \"\"}\r\n size=${this.compact ? \"xs\" : \"sm\"}\r\n bg=${this._avatarBg()}\r\n ></rel-avatar>\r\n ${!this.compact && (this.name || this.subtitle)\r\n ? html`\r\n <div class=\"text-stack\">\r\n ${this.name ? html`<span class=\"name\">${this.name}</span>` : null}\r\n ${this.subtitle ? html`<span class=\"subtitle\">${this.subtitle}</span>` : null}\r\n </div>\r\n `\r\n : null}\r\n `;\r\n }\r\n\r\n private _avatarBg(): string {\r\n const map: Record<string, string> = {\r\n gold: \"var(--rel-bg-warning)\",\r\n platinum: \"var(--rel-text-info)\",\r\n silver: \"var(--rel-text-caption)\",\r\n bronze: \"var(--rel-text-warning)\",\r\n regular: \"var(--rel-bg-brand)\",\r\n };\r\n return map[this.reward] ?? \"var(--rel-bg-brand)\";\r\n }\r\n\r\n private _renderCarrier() {\r\n const rewardLabel = this.reward.charAt(0).toUpperCase() + this.reward.slice(1);\r\n\r\n return html`\r\n <div class=\"carrier-tile\" role=\"img\" aria-label=\"${this.name ?? \"Profile\"} – ${rewardLabel} member\">\r\n <rel-avatar\r\n type=\"text\"\r\n text=${this.initials ?? \"\"}\r\n size=\"sm\"\r\n bg=${this._avatarBg()}\r\n ></rel-avatar>\r\n <div class=\"carrier-meta\">\r\n ${this.name ? html`<span class=\"name\">${this.name}</span>` : null}\r\n <span class=\"reward-badge\">${rewardLabel}</span>\r\n ${this.subtitle ? html`<span class=\"subtitle\">${this.subtitle}</span>` : null}\r\n </div>\r\n </div>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property, state, query } from \"lit/decorators.js\";\r\n\r\nexport type OtpType = \"numeric\" | \"alphanumeric\";\r\n\r\n@customElement(\"rel-otp\")\r\nexport class RelOtp extends LitElement {\r\n @property({ type: String, reflect: true }) value = \"\";\r\n @property({ type: Number }) length = 6;\r\n @property({ type: Number, attribute: \"group-size\" }) groupSize = 3;\r\n @property({ type: String }) placeholder = \"\";\r\n @property({ type: String }) type: OtpType = \"numeric\";\r\n @property({ type: Boolean }) mask = false;\r\n @property({ type: Boolean, reflect: true }) disabled = false;\r\n @property({ type: Boolean, reflect: true }) readonly = false;\r\n @property({ type: Boolean }) required = false;\r\n @property({ type: String }) name: string | null = null;\r\n @property({ type: String }) autocomplete = \"one-time-code\";\r\n @property({ type: String }) inputmode: \"numeric\" | \"text\" | null = null;\r\n @property({ type: String }) pattern: string | null = null;\r\n @property({ type: String, attribute: \"aria-label\" }) ariaLabel: string | null = null;\r\n @property({ type: Boolean, reflect: true }) invalid = false;\r\n @property({ type: Boolean, attribute: \"show-separator\" }) showSeparator = true;\r\n // reflect: CSS targets :host([size=\"sm\"|\"lg\"]) — without reflection,\r\n // setting `el.size = \"lg\"` as a property silently applies no styles.\r\n @property({ type: String, reflect: true }) size: \"sm\" | \"md\" | \"lg\" = \"md\";\r\n\r\n @state() private cells: string[] = [];\r\n @query(\".hidden-input\") private hiddenInput?: HTMLInputElement;\r\n\r\n private isUpdatingFromValue = false;\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n display: inline-block;\r\n font-family: var(--rel-fonts-font-family);\r\n }\r\n\r\n :host([disabled]) {\r\n opacity: 0.6;\r\n cursor: not-allowed;\r\n }\r\n\r\n .otp-root {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-xs);\r\n position: relative;\r\n }\r\n\r\n .otp-group {\r\n display: flex;\r\n gap: var(--rel-spacing-2xs);\r\n }\r\n\r\n .otp-separator {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n color: var(--rel-border-default);\r\r\n user-select: none;\r\n padding: 0 var(--rel-spacing-3xs);\r\n font-family: var(--rel-action-xl-font-family);\r\n font-weight: var(--rel-action-xl-font-weight);\r\n font-size: var(--rel-action-xl-font-size);\r\n line-height: var(--rel-action-xl-line-height);\r\n letter-spacing: var(--rel-action-xl-letter-spacing);\r\n }\r\n\r\n .otp-separator.hidden {\r\n display: none;\r\n }\r\n\r\n .otp-cell {\r\n width: 40px;\r\n height: 48px;\r\n border: var(--rel-stroke-sm) solid var(--rel-border-default);\r\n border-radius: var(--rel-border-radius-sm);\r\n background: var(--rel-bg-neutral);\r\r\r\n text-align: center;\r\n color: var(--rel-text-default);\r\n outline: none;\r\n transition: border-color 0.15s ease, box-shadow 0.15s ease;\r\n caret-color: var(--rel-text-default);\r\n font-family: var(--rel-body-lg-regular-font-family);\r\n font-weight: var(--rel-body-lg-regular-font-weight);\r\n font-size: var(--rel-body-lg-regular-font-size);\r\n line-height: var(--rel-body-lg-regular-line-height);\r\n letter-spacing: var(--rel-body-lg-regular-letter-spacing);\r\n }\r\n\r\n /* Size variants */\r\n :host([size=\"sm\"]) .otp-cell {\r\n width: 36px;\r\n height: 40px;\r\n font-family: var(--rel-body-md-regular-font-family);\r\n font-weight: var(--rel-body-md-regular-font-weight);\r\n font-size: var(--rel-body-md-regular-font-size);\r\n line-height: var(--rel-body-md-regular-line-height);\r\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\r\n }\r\n\r\n :host([size=\"lg\"]) .otp-cell {\r\n width: 48px;\r\n height: 56px;\r\n font-family: var(--rel-body-xl-regular-font-family);\r\n font-weight: var(--rel-body-xl-regular-font-weight);\r\n font-size: var(--rel-body-xl-regular-font-size);\r\n line-height: var(--rel-body-xl-regular-line-height);\r\n letter-spacing: var(--rel-body-xl-regular-letter-spacing);\r\n }\r\n\r\n .otp-cell::placeholder {\r\n color: var(--rel-text-body);\r\n opacity: 0.6;\r\n }\r\n\r\n .otp-cell:hover:not(:disabled):not(:read-only) {\r\n border-color: var(--rel-border-strong);\r\n }\r\n\r\n .otp-cell:focus-visible {\r\n border-color: var(--rel-border-accent);\r\n box-shadow: 0 0 0 2px var(--rel-border-default);\r\n }\r\n\r\n .otp-cell:disabled {\r\n background: var(--rel-bg-surface-elevated);\r\n color: var(--rel-text-disabled);\r\n cursor: not-allowed;\r\n }\r\n\r\n :host([disabled]) .otp-cell {\r\n cursor: not-allowed;\r\n }\r\n\r\n .otp-cell:read-only {\r\n background: var(--rel-bg-neutral-elevated-1);\r\n cursor: default;\r\n }\r\n\r\n /* Invalid state */\r\n :host([invalid]) .otp-cell {\r\n border-color: var(--rel-border-danger);\r\n }\r\n\r\n :host([invalid]) .otp-cell:focus {\r\n border-color: var(--rel-border-danger);\r\n box-shadow: 0 0 0 2px var(--rel-bg-danger-light);\r\n }\r\n\r\n .hidden-input {\r\n position: absolute;\r\n opacity: 0;\r\n pointer-events: none;\r\n width: 1px;\r\n height: 1px;\r\n }\r\n\r\n /* Reduce motion */\r\n @media (prefers-reduced-motion: reduce) {\r\n .otp-cell {\r\n transition: none;\r\n }\r\n }\r\n\r\n `;\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n this.initializeCells();\r\n }\r\n\r\n updated(changedProperties: Map<string, any>) {\r\n super.updated(changedProperties);\r\n\r\n // Only sync from external value changes, not internal updates\r\n if (changedProperties.has(\"value\") && !this.isUpdatingFromValue) {\r\n this.syncCellsFromValue();\r\n }\r\n\r\n if (changedProperties.has(\"length\")) {\r\n this.initializeCells();\r\n }\r\n }\r\n\r\n private initializeCells() {\r\n this.cells = new Array(this.length).fill(\"\");\r\n this.syncCellsFromValue();\r\n }\r\n\r\n private syncCellsFromValue() {\r\n const chars = this.value.split(\"\").slice(0, this.length);\r\n this.cells = new Array(this.length).fill(\"\").map((_, i) => chars[i] || \"\");\r\n }\r\n\r\n private updateValue() {\r\n this.isUpdatingFromValue = true;\r\n const newValue = this.cells.join(\"\");\r\n this.value = newValue;\r\n\r\n // Update hidden input for forms\r\n if (this.hiddenInput) {\r\n this.hiddenInput.value = newValue;\r\n }\r\n\r\n this.requestUpdate();\r\n\r\n // Use setTimeout to ensure isUpdatingFromValue is reset after update cycle\r\n setTimeout(() => {\r\n this.isUpdatingFromValue = false;\r\n }, 0);\r\n\r\n const complete = newValue.length === this.length && this.isValidValue(newValue);\r\n\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-change\", {\r\n detail: { value: newValue, complete },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n\r\n if (complete) {\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-complete\", {\r\n detail: { value: newValue },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n }\r\n\r\n private isValidChar(char: string): boolean {\r\n if (this.type === \"numeric\") {\r\n return /^\\d$/.test(char);\r\n } else {\r\n return /^[0-9a-zA-Z]$/.test(char);\r\n }\r\n }\r\n\r\n private isValidValue(value: string): boolean {\r\n if (this.type === \"numeric\") {\r\n return /^\\d+$/.test(value);\r\n } else {\r\n return /^[0-9a-zA-Z]+$/.test(value);\r\n }\r\n }\r\n\r\n private getNextEditableIndex(): number {\r\n // Find first empty cell, or return last index if all filled\r\n const emptyIndex = this.cells.findIndex((c) => !c);\r\n return emptyIndex >= 0 ? emptyIndex : this.length - 1;\r\n }\r\n\r\n private handlePointerDown(e: PointerEvent) {\r\n if (this.disabled || this.readonly) return;\r\n\r\n const input = e.currentTarget as HTMLInputElement;\r\n const targetIndex = parseInt(input.dataset.index || \"0\", 10);\r\n const nextEditableIndex = this.getNextEditableIndex();\r\n\r\n // Prevent jumping ahead to empty cells\r\n if (targetIndex > nextEditableIndex) {\r\n e.preventDefault();\r\n this.focusCell(nextEditableIndex);\r\n }\r\n }\r\n\r\n private handleInput(e: Event) {\r\n if (this.disabled || this.readonly) return;\r\n\r\n const input = e.currentTarget as HTMLInputElement;\r\n const index = parseInt(input.dataset.index || \"0\", 10);\r\n let inputValue = input.value;\r\n\r\n // Handle autofill/paste on any cell (mobile OTP can inject full code)\r\n if (inputValue.length > 1) {\r\n this.handlePasteValue(inputValue, index);\r\n return;\r\n }\r\n\r\n // Get only the last character typed (handles replace-on-type)\r\n const char = inputValue.slice(-1);\r\n\r\n if (char && !this.isValidChar(char)) {\r\n // Invalid character, revert\r\n input.value = this.cells[index] || \"\";\r\n return;\r\n }\r\n\r\n // Update cell (replace existing value)\r\n this.cells[index] = char;\r\n input.value = char;\r\n\r\n this.updateValue();\r\n\r\n // Auto-advance to next cell\r\n if (char && index < this.length - 1) {\r\n this.focusCell(index + 1);\r\n }\r\n }\r\n\r\n private handleKeyDown(e: KeyboardEvent) {\r\n if (this.disabled || this.readonly) return;\r\n\r\n const input = e.currentTarget as HTMLInputElement;\r\n const index = parseInt(input.dataset.index || \"0\", 10);\r\n\r\n switch (e.key) {\r\n case \"Backspace\":\r\n e.preventDefault();\r\n if (this.cells[index]) {\r\n // Clear current cell, keep focus\r\n this.cells[index] = \"\";\r\n input.value = \"\";\r\n this.updateValue();\r\n } else if (index > 0) {\r\n // Move to previous cell and clear it\r\n this.cells[index - 1] = \"\";\r\n this.updateValue();\r\n this.focusCell(index - 1);\r\n }\r\n break;\r\n\r\n case \"Delete\":\r\n e.preventDefault();\r\n this.cells[index] = \"\";\r\n input.value = \"\";\r\n this.updateValue();\r\n break;\r\n\r\n case \"ArrowLeft\":\r\n e.preventDefault();\r\n if (index > 0) {\r\n this.focusCell(index - 1);\r\n }\r\n break;\r\n\r\n case \"ArrowRight\":\r\n e.preventDefault();\r\n if (index < this.length - 1) {\r\n this.focusCell(index + 1);\r\n }\r\n break;\r\n\r\n case \"Home\":\r\n e.preventDefault();\r\n this.focusCell(0);\r\n break;\r\n\r\n case \"End\":\r\n e.preventDefault();\r\n this.focusCell(this.length - 1);\r\n break;\r\n\r\n case \"ArrowUp\":\r\n case \"ArrowDown\":\r\n e.preventDefault();\r\n break;\r\n }\r\n }\r\n\r\n private handlePaste(e: ClipboardEvent) {\r\n if (this.disabled || this.readonly) return;\r\n\r\n e.preventDefault();\r\n\r\n const input = e.currentTarget as HTMLInputElement;\r\n const index = parseInt(input.dataset.index || \"0\", 10);\r\n const pastedText = e.clipboardData?.getData(\"text\") || \"\";\r\n\r\n this.handlePasteValue(pastedText, index);\r\n }\r\n\r\n private handlePasteValue(text: string, startIndex: number) {\r\n // Filter valid characters\r\n const validChars = text.split(\"\").filter((char) => this.isValidChar(char));\r\n\r\n // Distribute characters starting from startIndex\r\n let updateIndex = startIndex;\r\n validChars.forEach((char) => {\r\n if (updateIndex < this.length) {\r\n this.cells[updateIndex] = char;\r\n updateIndex++;\r\n }\r\n });\r\n\r\n this.updateValue();\r\n\r\n // Focus next empty cell or last cell\r\n const nextEmptyIndex = this.cells.findIndex((c, i) => i >= startIndex && !c);\r\n if (nextEmptyIndex >= 0) {\r\n this.focusCell(nextEmptyIndex);\r\n } else {\r\n this.focusCell(Math.min(updateIndex, this.length - 1));\r\n }\r\n }\r\n\r\n private handleFocus(e: FocusEvent) {\r\n const input = e.currentTarget as HTMLInputElement;\r\n input.select();\r\n }\r\n\r\n private handleBlur() {\r\n }\r\n\r\n private focusCell(index: number) {\r\n if (index < 0 || index >= this.length) return;\r\n\r\n const input = this.renderRoot.querySelector(\r\n `input[data-index=\"${index}\"]`\r\n ) as HTMLInputElement | null;\r\n\r\n if (input) {\r\n input.focus();\r\n input.select();\r\n }\r\n }\r\n\r\n private getInputMode(): string {\r\n if (this.inputmode) return this.inputmode;\r\n return this.type === \"numeric\" ? \"numeric\" : \"text\";\r\n }\r\n\r\n private getAriaLabel(index: number): string {\r\n const total = this.length;\r\n const position = index + 1;\r\n const label = this.type === \"numeric\" ? \"Digit\" : \"Character\";\r\n return `${label} ${position} of ${total}`;\r\n }\r\n\r\n private getGroups(): number[][] {\r\n const groups: number[][] = [];\r\n if (this.groupSize <= 0 || !this.showSeparator) {\r\n // Single group with all cells\r\n groups.push(Array.from({ length: this.length }, (_, i) => i));\r\n } else {\r\n // Multiple groups\r\n for (let i = 0; i < this.length; i += this.groupSize) {\r\n groups.push(\r\n Array.from(\r\n { length: Math.min(this.groupSize, this.length - i) },\r\n (_, j) => i + j\r\n )\r\n );\r\n }\r\n }\r\n return groups;\r\n }\r\n\r\n render() {\r\n const groups = this.getGroups();\r\n\r\n return html`\r\n <div\r\n part=\"base root\"\r\n class=\"otp-root\"\r\n role=\"group\"\r\n aria-label=\"${this.ariaLabel || \"One-time password input\"}\">\r\n ${groups.map(\r\n (group, groupIndex) => html`\r\n <div class=\"otp-group\">\r\n ${group.map(\r\n (index) => html`\r\n <input\r\n part=\"input cell\"\r\n class=\"otp-cell\"\r\n data-index=\"${index}\"\r\n type=\"${this.mask ? \"password\" : \"text\"}\"\r\n inputmode=\"${this.getInputMode()}\"\r\n autocomplete=\"new-password\"\r\n pattern=\"${this.pattern || \"\"}\"\r\n placeholder=\"${this.placeholder}\"\r\n maxlength=\"1\"\r\n .value=\"${this.cells[index] || \"\"}\"\r\n ?disabled=\"${this.disabled}\"\r\n ?readonly=\"${this.readonly}\"\r\n ?required=\"${this.required && index === 0}\"\r\n aria-label=\"${this.getAriaLabel(index)}\"\r\n @pointerdown=\"${this.handlePointerDown}\"\r\n @input=\"${this.handleInput}\"\r\n @keydown=\"${this.handleKeyDown}\"\r\n @paste=\"${this.handlePaste}\"\r\n @focus=\"${this.handleFocus}\"\r\n @blur=\"${this.handleBlur}\"\r\n />\r\n `\r\n )}\r\n </div>\r\n ${groupIndex < groups.length - 1\r\n ? html`<div part=\"separator\" class=\"otp-separator\">-</div>`\r\n : \"\"}\r\n `\r\n )}\r\n\r\n ${this.name\r\n ? html`<input\r\n part=\"hidden-input\"\r\n class=\"hidden-input\"\r\n type=\"hidden\"\r\n name=\"${this.name}\"\r\n .value=\"${this.value}\"\r\n />`\r\n : \"\"}\r\n </div>\r\n `;\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"rel-otp\": RelOtp;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\n\n@customElement(\"rel-pagination\")\nexport class RelPagination extends LitElement {\n /** Layout type from Figma: extended (numbered pages), compact (prev/next + page text), count-text (range + nav) */\n @property({ type: String, reflect: true })\n type: \"extended\" | \"compact\" | \"count-text\" = \"extended\";\n\n /** Controlled current page */\n @property({ type: Number }) page?: number;\n /** Uncontrolled starting page */\n @property({ type: Number }) defaultPage = 1;\n /** Total number of pages */\n @property({ type: Number }) totalPages = 0;\n /** Total items (used with perPage to auto-compute totalPages in count-text mode) */\n @property({ type: Number }) totalItems = 0;\n /** Items per page (count-text mode) */\n @property({ type: Number }) perPage = 10;\n /** Show \"Viewing page X of Y\" label below extended pagination */\n @property({ type: Boolean }) showLabel = false;\n @property({ type: Boolean, reflect: true }) disabled = false;\n @property({ type: String }) hrefTemplate = \"\";\n @property({ type: String }) ariaLabel = \"Pagination\";\n\n @state() private currentPage = 1;\n\n static styles = css`\n :host {\n /* container-type: inline-size applies INLINE-SIZE CONTAINMENT — the width\n must resolve without consulting the contents. Combined with a\n shrink-to-fit box (inline-block) that is contradictory and the host\n collapses to width:0, which made the whole component invisible.\n A size container must be block-level (or have a definite width). */\n container-type: inline-size;\n color: var(--rel-text-default);\n display: block;\n font-family: var(--rel-fonts-font-family, 'Poppins', sans-serif);\n }\n\n :host([type=\"count-text\"]) {\n display: block;\n width: 100%;\n }\n\n :host([disabled]) {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n :host([disabled]) button {\n pointer-events: none;\n }\n\n /* ── Root / Stack containers ──────────────────────────────── */\n\n .pag-root {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--rel-spacing-md);\n }\n\n .pag-stack {\n display: inline-flex;\n align-items: center;\n gap: var(--rel-spacing-sm);\n }\n\n .pag-count {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--rel-spacing-xl);\n width: 100%;\n }\n\n /* count-text right-side nav: no gap (40+24+40 = 104px, matches Figma) */\n .pag-count-nav {\n display: inline-flex;\n align-items: center;\n }\n\n /* ── Page number list (tighter 4px gap) ──────────────────── */\n\n .pag-numbers {\n display: inline-flex;\n align-items: center;\n gap: var(--rel-spacing-2xs);\n }\n\n /* ── Prev / Next — circular buttons ──────────────────────── */\n\n .pag-nav-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n padding: 0;\n border-radius: var(--rel-border-radius-full-rounded);\n border: 1px solid var(--rel-border-default);\n background: var(--rel-bg-neutral);\n cursor: pointer;\n color: var(--rel-action-neutral-label-icons-ghost);\n box-sizing: border-box;\n transition: background 0.15s ease;\n flex-shrink: 0;\n }\n\n .pag-nav-btn:hover:not(:disabled) {\n background: var(--rel-bg-neutral-elevated-1);\n }\n\n .pag-nav-btn:focus-visible {\n outline: 2px solid var(--rel-border-focus);\n outline-offset: 2px;\n }\n\n .pag-nav-btn:disabled {\n opacity: 0.35;\n cursor: not-allowed;\n }\n\n .pag-nav-btn svg {\n width: 20px;\n height: 20px;\n }\n\n /* ── Page number buttons — square with 8px radius ─────────── */\n\n .pag-page-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n padding: var(--rel-spacing-xs);\n border-radius: var(--rel-border-radius-sm);\n border: 1px solid var(--rel-border-default);\n background: var(--rel-bg-neutral);\n cursor: pointer;\n color: var(--rel-text-default);\n box-sizing: border-box;\n transition: background 0.15s ease, border-color 0.15s ease;\n font-family: var(--rel-body-md-medium-font-family);\n font-weight: var(--rel-body-md-medium-font-weight);\n font-size: var(--rel-body-md-medium-font-size);\n line-height: var(--rel-body-md-medium-line-height);\n letter-spacing: var(--rel-body-md-medium-letter-spacing);\n }\n\n .pag-page-btn:hover {\n background: var(--rel-bg-neutral-elevated-1);\n }\n\n .pag-page-btn:focus-visible {\n outline: 2px solid var(--rel-border-focus);\n outline-offset: 2px;\n }\n\n /* Figma: current page is an inverse chip */\n .pag-page-btn[aria-current=\"page\"] {\n background: var(--rel-bg-neutral-inverse-2);\n border-color: var(--rel-bg-neutral-inverse-2);\n color: var(--rel-text-inverse);\n }\n\n /* ── Ellipsis ─────────────────────────────────────────────── */\n\n .pag-ellipsis {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n color: var(--rel-text-default);\n user-select: none;\n font-family: var(--rel-body-md-medium-font-family);\n font-weight: var(--rel-body-md-medium-font-weight);\n font-size: var(--rel-body-md-medium-font-size);\n line-height: var(--rel-body-md-medium-line-height);\n letter-spacing: var(--rel-body-md-medium-letter-spacing);\n }\n\n /* ── Compact: \"Page X of Y\" ───────────────────────────────── */\n\n .pag-page-text {\n color: var(--rel-text-default);\n white-space: nowrap;\n\n font-family: var(--rel-body-md-medium-font-family);\n\n font-weight: var(--rel-body-md-medium-font-weight);\n\n font-size: var(--rel-body-md-medium-font-size);\n\n line-height: var(--rel-body-md-medium-line-height);\n\n letter-spacing: var(--rel-body-md-medium-letter-spacing);\n\n }\n\n /* ── Count-text: \"1-5 of 50\" ─────────────────────────────── */\n\n .pag-count-text {\n color: var(--rel-text-default);\n white-space: nowrap;\n\n font-family: var(--rel-body-md-medium-font-family);\n\n font-weight: var(--rel-body-md-medium-font-weight);\n\n font-size: var(--rel-body-md-medium-font-size);\n\n line-height: var(--rel-body-md-medium-line-height);\n\n letter-spacing: var(--rel-body-md-medium-letter-spacing);\n\n }\n\n /* ── Count-text: inline current page number ───────────────── */\n\n .pag-current-num {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 40px;\n color: var(--rel-text-default);\n font-family: var(--rel-body-md-medium-font-family);\n font-weight: var(--rel-body-md-medium-font-weight);\n font-size: var(--rel-body-md-medium-font-size);\n line-height: var(--rel-body-md-medium-line-height);\n letter-spacing: var(--rel-body-md-medium-letter-spacing);\n }\n\n /* ── Extended sub-label ───────────────────────────────────── */\n\n .pag-label {\n color: var(--rel-text-caption);\n text-align: center;\n\n font-family: var(--rel-body-md-regular-font-family);\n\n font-weight: var(--rel-body-md-regular-font-weight);\n\n font-size: var(--rel-body-md-regular-font-size);\n\n line-height: var(--rel-body-md-regular-line-height);\n\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\n\n }\n /* ── Task 4: responsive behaviour (conventions §4) ───────────────── */\n .auto-compact {\n display: none;\n }\n\n .pag-numbers {\n flex-wrap: wrap;\n justify-content: center;\n }\n\n @container (max-width: 768px) {\n .pag-page-btn {\n width: auto;\n min-width: 36px;\n }\n }\n\n /* 480–768px: shrink the number window to current ±1 plus first/last */\n @container (min-width: 480px) and (max-width: 768px) {\n .pag-page-btn:not(.near):not(.edge):not([aria-current=\"page\"]),\n .pag-ellipsis {\n display: none;\n }\n }\n\n /* <480px: swap to the compact layout automatically */\n @container (max-width: 479px) {\n .auto-extended {\n display: none;\n }\n\n .auto-compact {\n display: block;\n }\n }\n\n /* Fallback for browsers without container queries */\n @supports not (container-type: inline-size) {\n @media (max-width: 768px) {\n .pag-page-btn {\n width: auto;\n min-width: 36px;\n }\n }\n\n @media (min-width: 480px) and (max-width: 768px) {\n .pag-page-btn:not(.near):not(.edge):not([aria-current=\"page\"]),\n .pag-ellipsis {\n display: none;\n }\n }\n\n @media (max-width: 479px) {\n .auto-extended {\n display: none;\n }\n\n .auto-compact {\n display: block;\n }\n }\n }\n `;\n\n connectedCallback() {\n super.connectedCallback();\n const totalPagesAttr = this.getAttribute(\"total-pages\");\n if (totalPagesAttr) this.totalPages = Number(totalPagesAttr);\n const pageAttr = this.getAttribute(\"page\");\n if (pageAttr) this.page = Number(pageAttr);\n const defaultPageAttr = this.getAttribute(\"default-page\");\n if (defaultPageAttr) this.defaultPage = Number(defaultPageAttr);\n const totalItemsAttr = this.getAttribute(\"total-items\");\n if (totalItemsAttr) this.totalItems = Number(totalItemsAttr);\n const perPageAttr = this.getAttribute(\"per-page\");\n if (perPageAttr) this.perPage = Number(perPageAttr);\n this.currentPage = this.page ?? this.defaultPage;\n }\n\n updated(changedProperties: Map<string, unknown>) {\n if (changedProperties.has(\"page\") && this.page !== undefined) {\n this.currentPage = this.page;\n }\n }\n\n private get activePage(): number {\n return this.page ?? this.currentPage;\n }\n\n private get computedTotalPages(): number {\n if (this.totalPages > 0) return this.totalPages;\n if (this.totalItems > 0 && this.perPage > 0) {\n return Math.ceil(this.totalItems / this.perPage);\n }\n return 0;\n }\n\n private generatePageNumbers(): number[] {\n const pages: number[] = [];\n const current = this.activePage;\n const total = this.computedTotalPages;\n if (total <= 0) return pages;\n if (total <= 7) {\n for (let i = 1; i <= total; i++) pages.push(i);\n } else if (current <= 4) {\n for (let i = 1; i <= 5; i++) pages.push(i);\n pages.push(-1);\n pages.push(total);\n } else if (current >= total - 3) {\n pages.push(1);\n pages.push(-1);\n for (let i = total - 4; i <= total; i++) pages.push(i);\n } else {\n pages.push(1);\n pages.push(-1);\n pages.push(current - 1);\n pages.push(current);\n pages.push(current + 1);\n pages.push(-1);\n pages.push(total);\n }\n return pages;\n }\n\n private handlePageChange(newPage: number) {\n const total = this.computedTotalPages;\n if (this.disabled || newPage < 1 || newPage > total || newPage === this.activePage) return;\n if (this.page === undefined) this.currentPage = newPage;\n this.dispatchEvent(\n new CustomEvent(\"rel-change\", {\n detail: { page: newPage },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private renderChevronLeft() {\n return html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M15 18l-6-6 6-6\"/></svg>`;\n }\n\n private renderChevronRight() {\n return html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 18l6-6-6-6\"/></svg>`;\n }\n\n private renderNavBtn(dir: \"prev\" | \"next\") {\n const current = this.activePage;\n const total = this.computedTotalPages;\n const isPrev = dir === \"prev\";\n const isDisabled = isPrev ? current <= 1 : current >= total;\n const targetPage = isPrev ? current - 1 : current + 1;\n\n return html`\n <button\n type=\"button\"\n class=\"pag-nav-btn\"\n aria-label=\"${isPrev ? \"Previous page\" : \"Next page\"}\"\n ?disabled=\"${isDisabled}\"\n @click=\"${() => this.handlePageChange(targetPage)}\"\n >\n ${isPrev ? this.renderChevronLeft() : this.renderChevronRight()}\n </button>\n `;\n }\n\n private renderExtended() {\n const pages = this.generatePageNumbers();\n const current = this.activePage;\n const total = this.computedTotalPages;\n\n return html`\n <div part=\"base\" class=\"pag-root\" role=\"navigation\" aria-label=\"${this.ariaLabel}\">\n <div class=\"pag-stack\">\n ${this.renderNavBtn(\"prev\")}\n <div class=\"pag-numbers\">\n ${pages.map((p) =>\n p === -1\n ? html`<span class=\"pag-ellipsis\">...</span>`\n : html`<button\n type=\"button\"\n class=\"pag-page-btn ${Math.abs(p - current) <= 1 ? \"near\" : \"\"} ${p === 1 || p === total ? \"edge\" : \"\"}\"\n aria-label=\"Page ${p}\"\n aria-current=\"${p === current ? \"page\" : \"false\"}\"\n @click=\"${() => this.handlePageChange(p)}\"\n >${p}</button>`\n )}\n </div>\n ${this.renderNavBtn(\"next\")}\n </div>\n ${this.showLabel\n ? html`<span class=\"pag-label\">Viewing page ${current} of ${total}</span>`\n : null}\n </div>\n `;\n }\n\n private renderCompact() {\n const current = this.activePage;\n const total = this.computedTotalPages;\n\n return html`\n <div class=\"pag-stack\" role=\"navigation\" aria-label=\"${this.ariaLabel}\">\n ${this.renderNavBtn(\"prev\")}\n <span class=\"pag-page-text\">Page ${current} of ${total}</span>\n ${this.renderNavBtn(\"next\")}\n </div>\n `;\n }\n\n private renderCountText() {\n const current = this.activePage;\n const total = this.computedTotalPages;\n const effectiveTotalItems = this.totalItems > 0 ? this.totalItems : total * this.perPage;\n const start = (current - 1) * this.perPage + 1;\n const end = Math.min(current * this.perPage, effectiveTotalItems);\n\n return html`\n <div part=\"label\" class=\"pag-count\" role=\"navigation\" aria-label=\"${this.ariaLabel}\">\n <span class=\"pag-count-text\">${start}–${end} of ${effectiveTotalItems}</span>\n <div class=\"pag-count-nav\">\n ${this.renderNavBtn(\"prev\")}\n <span class=\"pag-current-num\">${current}</span>\n ${this.renderNavBtn(\"next\")}\n </div>\n </div>\n `;\n }\n\n render() {\n if (this.type === \"compact\") return this.renderCompact();\n if (this.type === \"count-text\") return this.renderCountText();\n /* Task 4: extended auto-switches to the compact layout under 480px\n (container query, media-query fallback) — same markup, CSS-toggled. */\n return html`\n <div class=\"auto-extended\">${this.renderExtended()}</div>\n <div class=\"auto-compact\">${this.renderCompact()}</div>\n `;\n }\n}\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property, state, query } from \"lit/decorators.js\";\r\n\r\ntype SideType = \"top\" | \"right\" | \"bottom\" | \"left\";\r\ntype AlignType = \"start\" | \"center\" | \"end\";\r\n\r\n@customElement(\"rel-popover\")\r\nexport class RelPopover extends LitElement {\r\n /* =======================\r\n * PUBLIC API\r\n * ======================= */\r\n\r\n @property({ type: Boolean, reflect: true }) open?: boolean;\r\n @property({ type: Boolean, attribute: \"defaultopen\" }) defaultOpen = false;\r\n @property({ type: Boolean, reflect: true }) disabled = false;\r\n\r\n @property({ type: String, reflect: true }) side: SideType = \"bottom\";\r\n @property({ type: String, reflect: true }) align: AlignType = \"center\";\r\n @property({ type: Number, attribute: \"sideoffset\" }) sideOffset = 8;\r\n @property({ type: Number, attribute: \"alignoffset\" }) alignOffset = 0;\r\n\r\n @property({ type: Boolean, attribute: \"trapfocus\" }) trapFocus = false;\r\n @property({ type: Boolean, attribute: \"closeonescape\" }) closeOnEscape = true;\r\n @property({ type: Boolean, attribute: \"closeonoutsideclick\" })\r\n closeOnOutsideClick = true;\r\n\r\n /* =======================\r\n * INTERNAL STATE\r\n * ======================= */\r\n\r\n @state() private internalOpen = false;\r\n @state() private contentStyle = \"\";\r\n\r\n @query(\".content-wrapper\") private contentWrapper!: HTMLDivElement;\r\n\r\n private triggerEl: HTMLElement | null = null;\r\n private returnFocusEl: HTMLElement | null = null;\r\n private uniqueId = `popover-${Math.random().toString(36).slice(2)}`;\r\n\r\n /* =======================\r\n * STYLES\r\n * ======================= */\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n display: inline-block;\r\n position: relative;\r\n }\r\n\r\n :host([disabled]) {\r\n opacity: 0.6;\r\n cursor: not-allowed;\r\n }\r\n\r\n :host([disabled]) * {\r\n pointer-events: none;\r\n }\r\n\r\n .content-wrapper {\r\n position: fixed;\r\n z-index: 1001;\r\n display: none;\r\n /* Reset native [popover] UA styles (the wrapper is promoted to the\r\n top layer so transformed ancestors — e.g. a centered rel-modal\r\n panel — can't hijack its containing block or clip it). */\r\n inset: auto;\r\n margin: 0;\r\n padding: 0;\r\n border: none;\r\n background: transparent;\r\n overflow: visible;\r\n color: inherit;\r\n }\r\n\r\n .content-wrapper[open] {\r\n display: block;\r\n }\r\n `;\r\n\r\n /* =======================\r\n * LIFECYCLE\r\n * ======================= */\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n this.internalOpen = this.isControlled() ? !!this.open : this.defaultOpen;\r\n\r\n // ONE interaction entry point — capture phase\r\n this.addEventListener(\"pointerdown\", this.onHostPointerDown, true);\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback();\r\n this.removeEventListener(\"pointerdown\", this.onHostPointerDown, true);\r\n this.removeGlobalListeners();\r\n this.hideNativePopover();\r\n }\r\n\r\n firstUpdated() {\r\n // triggerEl is resolved via onTriggerSlotChange; call aria in case slot\r\n // content was already assigned before firstUpdated\r\n this.applyTriggerAria();\r\n }\r\n\r\n updated(changed: Map<string, unknown>) {\r\n if (changed.has(\"open\") && this.isControlled()) {\r\n this.internalOpen = !!this.open;\r\n }\r\n\r\n if (changed.has(\"internalOpen\") || changed.has(\"open\")) {\r\n this.applyTriggerAria();\r\n this.activeOpen ? this.onOpen() : this.onClose();\r\n }\r\n }\r\n\r\n /* =======================\r\n * STATE HELPERS\r\n * ======================= */\r\n\r\n private isControlled() {\r\n return this.open !== undefined;\r\n }\r\n\r\n private get activeOpen() {\r\n return this.isControlled() ? !!this.open : this.internalOpen;\r\n }\r\n\r\n private setOpen(next: boolean) {\r\n if (!this.isControlled()) {\r\n this.internalOpen = next;\r\n }\r\n\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-open-change\", {\r\n detail: { open: next },\r\n bubbles: true,\r\n composed: true,\r\n }),\r\n );\r\n }\r\n\r\n /* =======================\r\n * POINTER HANDLING (THE FIX)\r\n * ======================= */\r\n\r\n private onHostPointerDown = (e: PointerEvent) => {\r\n if (this.disabled) return;\r\n\r\n const path = e.composedPath();\r\n\r\n // Toggle ONLY if pointerdown originated from the trigger element\r\n if (!this.triggerEl || !path.includes(this.triggerEl)) return;\r\n\r\n // Prevent this interaction from becoming an \"outside click\"\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n this.setOpen(!this.activeOpen);\r\n };\r\n\r\n /* =======================\r\n * OPEN / CLOSE\r\n * ======================= */\r\n\r\n private onOpen() {\r\n this.returnFocusEl =\r\n (document.activeElement as HTMLElement) ?? this.triggerEl;\r\n\r\n this.addGlobalListeners();\r\n this.showNativePopover();\r\n\r\n requestAnimationFrame(() => {\r\n this.updatePosition();\r\n this.focusFirst();\r\n });\r\n }\r\n\r\n private onClose() {\r\n this.removeGlobalListeners();\r\n this.hideNativePopover();\r\n this.restoreFocus();\r\n }\r\n\r\n /* =======================\r\n * TOP LAYER (native Popover API)\r\n *\r\n * A transformed ancestor (e.g. rel-modal's centered panel with\r\n * translate(-50%,-50%)) becomes the containing block for position:fixed\r\n * descendants, breaking viewport-based coordinates and letting the\r\n * panel's overflow:hidden clip the content. Promoting the wrapper to\r\n * the browser top layer sidesteps both. `manual` keeps light-dismiss\r\n * and Escape handling under this component's own control.\r\n * ======================= */\r\n\r\n private showNativePopover() {\r\n const w = this.contentWrapper;\r\n if (!w || typeof w.showPopover !== \"function\") return;\r\n try {\r\n if (!w.matches(\":popover-open\")) w.showPopover();\r\n } catch {\r\n /* older engines / detached element — fixed-position fallback applies */\r\n }\r\n }\r\n\r\n private hideNativePopover() {\r\n const w = this.contentWrapper;\r\n if (!w || typeof w.hidePopover !== \"function\") return;\r\n try {\r\n if (w.matches(\":popover-open\")) w.hidePopover();\r\n } catch {\r\n /* already hidden or unsupported — nothing to do */\r\n }\r\n }\r\n\r\n /* =======================\r\n * GLOBAL LISTENERS\r\n * ======================= */\r\n\r\n private addGlobalListeners() {\r\n if (this.closeOnOutsideClick) {\r\n document.addEventListener(\"pointerdown\", this.onOutsidePointerDown);\r\n }\r\n\r\n if (this.closeOnEscape || this.trapFocus) {\r\n document.addEventListener(\"keydown\", this.onKeyDown);\r\n }\r\n\r\n window.addEventListener(\"resize\", this.updatePosition);\r\n window.addEventListener(\"scroll\", this.updatePosition, true);\r\n }\r\n\r\n private removeGlobalListeners() {\r\n document.removeEventListener(\"pointerdown\", this.onOutsidePointerDown);\r\n document.removeEventListener(\"keydown\", this.onKeyDown);\r\n window.removeEventListener(\"resize\", this.updatePosition);\r\n window.removeEventListener(\"scroll\", this.updatePosition, true);\r\n }\r\n\r\n private onOutsidePointerDown = (e: PointerEvent) => {\r\n if (!this.activeOpen) return;\r\n\r\n const path = e.composedPath();\r\n\r\n if (\r\n path.includes(this) ||\r\n (this.triggerEl && path.includes(this.triggerEl)) ||\r\n (this.contentWrapper && path.includes(this.contentWrapper))\r\n ) {\r\n return;\r\n }\r\n\r\n this.setOpen(false);\r\n };\r\n\r\n private onKeyDown = (e: KeyboardEvent) => {\r\n if (!this.activeOpen) return;\r\n\r\n if (e.key === \"Escape\" && this.closeOnEscape) {\r\n e.preventDefault();\r\n this.setOpen(false);\r\n }\r\n\r\n if (this.trapFocus && e.key === \"Tab\") {\r\n this.trapFocusLoop(e);\r\n }\r\n };\r\n\r\n /* =======================\r\n * FOCUS\r\n * ======================= */\r\n\r\n private focusFirst() {\r\n if (!this.contentWrapper) return;\r\n\r\n const focusable = this.getFocusable(this.contentWrapper);\r\n if (focusable[0]) {\r\n focusable[0].focus();\r\n } else {\r\n this.contentWrapper.focus();\r\n }\r\n }\r\n\r\n private restoreFocus() {\r\n (this.returnFocusEl ?? this.triggerEl)?.focus();\r\n this.returnFocusEl = null;\r\n }\r\n\r\n private trapFocusLoop(e: KeyboardEvent) {\r\n const focusable = this.getFocusable(this.contentWrapper);\r\n if (focusable.length === 0) return;\r\n\r\n const first = focusable[0];\r\n const last = focusable[focusable.length - 1];\r\n\r\n if (e.shiftKey && document.activeElement === first) {\r\n e.preventDefault();\r\n last.focus();\r\n } else if (!e.shiftKey && document.activeElement === last) {\r\n e.preventDefault();\r\n first.focus();\r\n }\r\n }\r\n\r\n private getFocusable(root: HTMLElement): HTMLElement[] {\r\n return Array.from(\r\n root.querySelectorAll<HTMLElement>(\r\n 'a[href],button:not([disabled]),input:not([disabled]),[tabindex]:not([tabindex=\"-1\"])',\r\n ),\r\n ).filter((el) => el.offsetWidth || el.offsetHeight);\r\n }\r\n\r\n /* =======================\r\n * POSITIONING\r\n * ======================= */\r\n\r\n private updatePosition = () => {\r\n if (!this.triggerEl || !this.contentWrapper) return;\r\n\r\n this.contentWrapper.setAttribute(\"open\", \"\");\r\n\r\n const t = this.triggerEl.getBoundingClientRect();\r\n const c = this.contentWrapper.getBoundingClientRect();\r\n\r\n let top = 0;\r\n let left = 0;\r\n\r\n // Alignment along the cross axis. Previously every branch hardcoded the\r\n // centre calculation, so `align` and `alignOffset` were dead code —\r\n // \"center\" worked by accident and \"start\"/\"end\" did nothing.\r\n const alignAxis = (start: number, size: number, contentSize: number) => {\r\n switch (this.align) {\r\n case \"start\": return start;\r\n case \"end\": return start + size - contentSize;\r\n default: return start + size / 2 - contentSize / 2; // center\r\n }\r\n };\r\n\r\n if (this.side === \"top\") {\r\n top = t.top - c.height - this.sideOffset;\r\n left = alignAxis(t.left, t.width, c.width) + this.alignOffset;\r\n }\r\n if (this.side === \"bottom\") {\r\n top = t.bottom + this.sideOffset;\r\n left = alignAxis(t.left, t.width, c.width) + this.alignOffset;\r\n }\r\n if (this.side === \"left\") {\r\n top = alignAxis(t.top, t.height, c.height) + this.alignOffset;\r\n left = t.left - c.width - this.sideOffset;\r\n }\r\n if (this.side === \"right\") {\r\n top = alignAxis(t.top, t.height, c.height) + this.alignOffset;\r\n left = t.right + this.sideOffset;\r\n }\r\n\r\n top = Math.max(8, Math.min(top, window.innerHeight - c.height - 8));\r\n left = Math.max(8, Math.min(left, window.innerWidth - c.width - 8));\r\n\r\n // Without top-layer support a transformed ancestor may be the containing\r\n // block for position:fixed, shifting the wrapper away from the viewport\r\n // coordinates computed above. Apply, re-measure, and cancel the offset.\r\n this.contentWrapper.style.top = `${top}px`;\r\n this.contentWrapper.style.left = `${left}px`;\r\n const applied = this.contentWrapper.getBoundingClientRect();\r\n top -= applied.top - top;\r\n left -= applied.left - left;\r\n this.contentWrapper.style.top = `${top}px`;\r\n this.contentWrapper.style.left = `${left}px`;\r\n\r\n this.contentStyle = `top:${top}px;left:${left}px;`;\r\n };\r\n\r\n /* =======================\r\n * ARIA\r\n * ======================= */\r\n\r\n private onTriggerSlotChange(e: Event) {\r\n const slot = e.target as HTMLSlotElement;\r\n const first = slot.assignedElements({ flatten: true })[0] as HTMLElement | undefined;\r\n this.triggerEl = first ?? null;\r\n this.applyTriggerAria();\r\n }\r\n\r\n private applyTriggerAria() {\r\n if (!this.triggerEl) return;\r\n this.triggerEl.setAttribute(\"aria-haspopup\", \"dialog\");\r\n this.triggerEl.setAttribute(\"aria-expanded\", String(this.activeOpen));\r\n this.triggerEl.setAttribute(\"aria-controls\", this.uniqueId);\r\n }\r\n\r\n /* =======================\r\n * RENDER\r\n * ======================= */\r\n\r\n render() {\r\n return html`\r\n <slot @slotchange=${this.onTriggerSlotChange}></slot>\r\n\r\n <div\r\n id=\"${this.uniqueId}\"\r\n class=\"content-wrapper\"\r\n popover=\"manual\"\r\n style=\"${this.contentStyle}\"\r\n ?open=\"${this.activeOpen}\"\r\n >\r\n <slot name=\"content\"></slot>\r\n </div>\r\n `;\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"rel-popover\": RelPopover;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\r\n@customElement(\"rel-popover-content\")\r\nexport class RelPopoverContent extends LitElement {\r\n @property({ type: String, attribute: \"aria-label\" }) ariaLabel = \"\";\r\n\r\n /** Figma Size axis (S/M/L): panel padding 12/16/20px. */\r\n @property({ type: String, reflect: true }) size: \"sm\" | \"md\" | \"lg\" = \"md\";\r\n\r\n static styles = css`\r\n :host {\r\n gap: var(--rel-spacing-md);\r\n color: var(--rel-text-body);\r\n display: block;\r\n width: 100%;\r\n max-width: 400px;\r\n }\r\n\r\n .popover-content {\r\n background: var(--rel-bg-neutral);\r\n border: var(--rel-stroke-sm) solid var(--rel-border-default);\r\n border-radius: var(--rel-border-radius-sm);\r\n box-shadow: var(--rel-shadows-shadow-300);\r\n padding: var(--rel-spacing-lg);\r\n color: var(--rel-text-label);\r\n font-family: var(--rel-body-md-regular-font-family);\r\n font-weight: var(--rel-body-md-regular-font-weight);\r\n font-size: var(--rel-body-md-regular-font-size);\r\n line-height: var(--rel-body-md-regular-line-height);\r\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\r\n }\r\n\r\n /* Figma Size axis: S = 12px padding, M = 16px, L = 20px */\r\n :host([size=\"sm\"]) .popover-content {\r\n padding: var(--rel-spacing-sm);\r\n }\r\n\r\n :host([size=\"md\"]) .popover-content {\r\n padding: var(--rel-spacing-md);\r\n }\r\n\r\n :host([size=\"lg\"]) .popover-content {\r\n padding: var(--rel-spacing-lg);\r\n }\r\n\r\n .popover-content ::slotted(h1),\r\n .popover-content ::slotted(h2),\r\n .popover-content ::slotted(h3),\r\n .popover-content ::slotted(h4),\r\n .popover-content ::slotted(h5),\r\n .popover-content ::slotted(h6) {\r\n margin: 0 0 var(--rel-spacing-xs);\r\n font-family: var(--rel-headings-sm-font-family);\r\n font-weight: var(--rel-headings-sm-font-weight);\r\n font-size: var(--rel-headings-sm-font-size);\r\n line-height: var(--rel-headings-sm-line-height);\r\n letter-spacing: var(--rel-headings-sm-letter-spacing);\r\n color: var(--rel-text-label);\r\n margin-bottom: var(--rel-spacing-2xs);\r\n }\r\n\r\n .popover-content ::slotted(p) {\r\n margin: 0 0 var(--rel-spacing-sm);\r\n color: var(--rel-text-placeholder);\r\n line-height: var(--rel-body-md-regular-line-height);\r\n }\r\n\r\n .popover-content ::slotted(p:last-child) {\r\n margin-bottom: 0;\r\n }\r\n `;\r\n\r\n render() {\r\n return html`\r\n <div class=\"popover-content\" part=\"content\" role=\"dialog\" aria-label=\"${this.ariaLabel}\">\r\n <slot></slot>\r\n </div>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\r\nexport type ProgressMode =\r\n | \"linear-determinate\"\r\n | \"linear-indeterminate\"\r\n | \"circular-determinate\"\r\n | \"circular-indeterminate\";\r\n\r\n@customElement(\"rel-progress\")\r\nexport class RelProgress extends LitElement {\r\n @property({ type: String, reflect: true })\r\n mode: ProgressMode = \"linear-determinate\";\r\n\r\n @property({ type: Number })\r\n value = 0;\r\n\r\n private radius = 15.9155;\r\n private circumference = 2 * Math.PI * this.radius;\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n display: block;\r\n font-family: var(--rel-fonts-font-family);\r\n }\r\n\r\n :host([mode*=\"circular\"]) {\r\n display: inline-block;\r\n }\r\n\r\n /* Linear */\r\n .linear-track {\r\n background: var(--rel-bg-neutral-elevated-2);\r\n border-radius: var(--rel-border-radius-square);\r\n height: 6px;\r\n overflow: hidden;\r\n width: 100%;\r\n }\r\n\r\n .linear-bar {\r\n background: var(--rel-bg-neutral-inverse-1);\r\n height: 100%;\r\n }\r\n\r\n /* Width animates only when value-driven (Figma Type=Determinate) */\r\n .linear-bar.determinate {\r\n transition: width 0.3s ease;\r\n }\r\n\r\n .linear-bar.indeterminate {\r\n width: 30%;\r\n animation: linear-indeterminate 1.5s infinite;\r\n }\r\n\r\n @keyframes linear-indeterminate {\r\n 0% {\r\n margin-left: -30%;\r\n }\r\n 50% {\r\n margin-left: 50%;\r\n }\r\n 100% {\r\n margin-left: 100%;\r\n }\r\n }\r\n\r\n /* Circular */\r\n .circular {\r\n display: inline-block;\r\n width: 48px;\r\n height: 48px;\r\n }\r\n\r\n .circular-svg {\r\n transform: rotate(-90deg);\r\n width: 100%;\r\n height: 100%;\r\n }\r\n\r\n .circular-bg {\r\n fill: none;\r\n stroke: var(--rel-border-default);\r\n stroke-width: 3;\r\n }\r\n\r\n .circular-progress {\r\n fill: none;\r\n stroke: var(--rel-text-default);\r\n stroke-width: 3;\r\n stroke-linecap: butt;\r\n transition: stroke-dashoffset 0.35s;\r\n }\r\n\r\n /* Spinner */\r\n .spinner {\r\n animation: rotate 2s linear infinite;\r\n }\r\n\r\n .spinner-path {\r\n stroke: var(--rel-text-default);\r\n stroke-linecap: butt;\r\n animation: dash 1.5s ease-in-out infinite;\r\n }\r\n\r\n @keyframes rotate {\r\n 100% {\r\n transform: rotate(360deg);\r\n }\r\n }\r\n\r\n @keyframes dash {\r\n 0% {\r\n stroke-dasharray: 1, 150;\r\n stroke-dashoffset: 0;\r\n }\r\n 50% {\r\n stroke-dasharray: 90, 150;\r\n stroke-dashoffset: -35;\r\n }\r\n 100% {\r\n stroke-dasharray: 90, 150;\r\n stroke-dashoffset: -124;\r\n }\r\n }\r\n\r\n @media (prefers-reduced-motion: reduce) {\r\n .linear-bar {\r\n transition: none;\r\n }\r\n\r\n .linear-bar.indeterminate {\r\n animation: none;\r\n width: 100%;\r\n opacity: 0.5;\r\n }\r\n\r\n .spinner {\r\n animation: none;\r\n }\r\n\r\n .spinner-path {\r\n animation: none;\r\n stroke-dasharray: 90, 150;\r\n stroke-dashoffset: -35;\r\n }\r\n\r\n .circular-progress {\r\n transition: none;\r\n }\r\n }\r\n `;\r\n\r\n private get safeValue() {\r\n return Math.min(100, Math.max(0, this.value));\r\n }\r\n\r\n private renderLinearDeterminate() {\r\n return html`\r\n <div part=\"track\" class=\"linear-track\" role=\"progressbar\"\r\n aria-valuenow=\"${this.safeValue}\" aria-valuemin=\"0\" aria-valuemax=\"100\">\r\n <div part=\"indicator\" class=\"linear-bar determinate\" style=\"width: ${this.safeValue}%\"></div>\r\n </div>\r\n `;\r\n }\r\n\r\n private renderLinearIndeterminate() {\r\n return html`\r\n <div part=\"track\" class=\"linear-track\" role=\"progressbar\">\r\n <div part=\"indicator\" class=\"linear-bar indeterminate\"></div>\r\n </div>\r\n `;\r\n }\r\n\r\n private renderCircularDeterminate() {\r\n const offset =\r\n this.circumference - (this.safeValue / 100) * this.circumference;\r\n\r\n return html`\r\n <div class=\"circular\">\r\n <svg viewBox=\"0 0 36 36\" class=\"circular-svg\">\r\n <circle class=\"circular-bg\" cx=\"18\" cy=\"18\" r=\"${this.radius}\" />\r\n <circle\r\n class=\"circular-progress\"\r\n cx=\"18\"\r\n cy=\"18\"\r\n r=\"${this.radius}\"\r\n stroke-dasharray=\"${this.circumference}\"\r\n stroke-dashoffset=\"${offset}\"\r\n />\r\n </svg>\r\n </div>\r\n `;\r\n }\r\n\r\n private renderCircularIndeterminate() {\r\n return html`\r\n <div class=\"circular\">\r\n <svg viewBox=\"0 0 50 50\" class=\"spinner\">\r\n <circle\r\n class=\"spinner-path\"\r\n cx=\"25\"\r\n cy=\"25\"\r\n r=\"20\"\r\n fill=\"none\"\r\n stroke-width=\"4\"\r\n />\r\n </svg>\r\n </div>\r\n `;\r\n }\r\n\r\n render() {\r\n switch (this.mode) {\r\n case \"linear-indeterminate\":\r\n return this.renderLinearIndeterminate();\r\n case \"circular-determinate\":\r\n return this.renderCircularDeterminate();\r\n case \"circular-indeterminate\":\r\n return this.renderCircularIndeterminate();\r\n default:\r\n return this.renderLinearDeterminate();\r\n }\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\nimport type { RelResizablePanel } from \"./rel-resizable-panel\";\r\nimport type { RelResizableHandle } from \"./rel-resizable-handle\";\r\n\r\n@customElement(\"rel-resizable-group\")\r\nexport class RelResizableGroup extends LitElement {\r\n /* =======================\r\n * PUBLIC API\r\n * ======================= */\r\n\r\n // reflect: CSS targets :host([direction=\"…\"]) for flex-direction — without\r\n // reflection, setting the property in JS leaves the layout unchanged.\r\n @property({ type: String, reflect: true }) direction: \"horizontal\" | \"vertical\" = \"horizontal\";\r\n\r\n /* =======================\r\n * INTERNAL STATE\r\n * ======================= */\r\n\r\n private panels: RelResizablePanel[] = [];\r\n private handles: RelResizableHandle[] = [];\r\n private isDragging = false;\r\n private activeHandleIndex = -1;\r\n private startPointerPos = 0;\r\n private startSizes: number[] = [];\r\n\r\n /* =======================\r\n * STYLES\r\n * ======================= */\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n display: flex;\r\n width: 100%;\r\n height: 100%;\r\n position: relative;\r\n box-sizing: border-box;\r\n }\r\n\r\n :host([direction=\"horizontal\"]) {\r\n flex-direction: row;\r\n }\r\n\r\n :host([direction=\"vertical\"]) {\r\n flex-direction: column;\r\n }\r\n\r\n ::slotted(rel-resizable-panel) {\r\n flex-shrink: 0;\r\n }\r\n `;\r\n\r\n /* =======================\r\n * LIFECYCLE\r\n * ======================= */\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n this.addEventListener(\"pointerdown\", this.onPointerDown);\r\n this.addEventListener(\"keydown\", this.onKeyDown);\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback();\r\n this.removeEventListener(\"pointerdown\", this.onPointerDown);\r\n this.removeEventListener(\"keydown\", this.onKeyDown);\r\n this.removeGlobalListeners();\r\n }\r\n\r\n firstUpdated() {\r\n this.initializeLayout();\r\n }\r\n\r\n /* =======================\r\n * INITIALIZATION\r\n * ======================= */\r\n\r\n private initializeLayout() {\r\n // Query light DOM for panels and handles\r\n this.panels = Array.from(\r\n this.querySelectorAll(\":scope > rel-resizable-panel\")\r\n ) as RelResizablePanel[];\r\n this.handles = Array.from(\r\n this.querySelectorAll(\":scope > rel-resizable-handle\")\r\n ) as RelResizableHandle[];\r\n\r\n // Set handle indices and orientations\r\n this.handles.forEach((handle, idx) => {\r\n handle.handleIndex = idx;\r\n handle.orientation = this.direction;\r\n });\r\n\r\n // Calculate initial sizes\r\n const sizes = this.calculateInitialSizes();\r\n this.applySizes(sizes);\r\n }\r\n\r\n private calculateInitialSizes(): number[] {\r\n const sizes: number[] = [];\r\n let specifiedTotal = 0;\r\n let unspecifiedCount = 0;\r\n\r\n // First pass: collect specified sizes\r\n this.panels.forEach((panel) => {\r\n if (panel.defaultSize !== undefined) {\r\n sizes.push(panel.defaultSize);\r\n specifiedTotal += panel.defaultSize;\r\n } else {\r\n sizes.push(0);\r\n unspecifiedCount++;\r\n }\r\n });\r\n\r\n // Second pass: distribute remaining space to unspecified panels\r\n if (unspecifiedCount > 0) {\r\n const remaining = Math.max(0, 100 - specifiedTotal);\r\n const perPanel = remaining / unspecifiedCount;\r\n sizes.forEach((size, idx) => {\r\n if (size === 0) {\r\n sizes[idx] = perPanel;\r\n }\r\n });\r\n }\r\n\r\n // Normalize to 100%\r\n const total = sizes.reduce((sum, s) => sum + s, 0);\r\n if (total > 0) {\r\n return sizes.map((s) => (s / total) * 100);\r\n }\r\n\r\n // Fallback: equal distribution\r\n return this.panels.map(() => 100 / this.panels.length);\r\n }\r\n\r\n /* =======================\r\n * POINTER HANDLING\r\n * ======================= */\r\n\r\n private onPointerDown = (e: PointerEvent) => {\r\n // Find the handle anywhere in the composed path — a pointerdown on the\r\n // visible `.grabber` (which lives inside the handle's shadow DOM) makes\r\n // composedPath()[0] a <div>, not the handle, so indexing [0] would abort\r\n // the drag whenever the user grabs the obvious target.\r\n const handle = e\r\n .composedPath()\r\n .find(\r\n (el): el is RelResizableHandle =>\r\n el instanceof HTMLElement && el.tagName === \"REL-RESIZABLE-HANDLE\"\r\n );\r\n if (!handle) return;\r\n\r\n const handleIndex = this.handles.indexOf(handle);\r\n if (handleIndex === -1) return;\r\n\r\n e.preventDefault();\r\n this.startDrag(handleIndex, e);\r\n };\r\n\r\n private startDrag(handleIndex: number, e: PointerEvent) {\r\n this.isDragging = true;\r\n this.activeHandleIndex = handleIndex;\r\n this.startPointerPos = this.direction === \"horizontal\" ? e.clientX : e.clientY;\r\n this.startSizes = this.panels.map((p) => p.currentSize);\r\n\r\n const handle = this.handles[handleIndex];\r\n handle.setAttribute(\"data-dragging\", \"\");\r\n\r\n this.addGlobalListeners();\r\n\r\n // Capture pointer\r\n (e.target as HTMLElement).setPointerCapture(e.pointerId);\r\n }\r\n\r\n private onPointerMove = (e: PointerEvent) => {\r\n if (!this.isDragging || this.activeHandleIndex === -1) return;\r\n\r\n e.preventDefault();\r\n\r\n const currentPos = this.direction === \"horizontal\" ? e.clientX : e.clientY;\r\n const delta = currentPos - this.startPointerPos;\r\n\r\n this.applyDragResize(delta);\r\n };\r\n\r\n private onPointerUp = (e: PointerEvent) => {\r\n if (!this.isDragging) return;\r\n\r\n e.preventDefault();\r\n\r\n const handle = this.handles[this.activeHandleIndex];\r\n if (handle) {\r\n handle.removeAttribute(\"data-dragging\");\r\n }\r\n\r\n this.isDragging = false;\r\n this.activeHandleIndex = -1;\r\n\r\n this.removeGlobalListeners();\r\n\r\n // Dispatch resize-end event\r\n this.dispatchResizeEvent(\"rel-resize-end\");\r\n };\r\n\r\n private applyDragResize(deltaPixels: number) {\r\n const rect = this.getBoundingClientRect();\r\n const totalSize = this.direction === \"horizontal\" ? rect.width : rect.height;\r\n const deltaPercent = (deltaPixels / totalSize) * 100;\r\n\r\n const leftIdx = this.activeHandleIndex;\r\n const rightIdx = this.activeHandleIndex + 1;\r\n\r\n if (leftIdx < 0 || rightIdx >= this.panels.length) return;\r\n\r\n const leftPanel = this.panels[leftIdx];\r\n const rightPanel = this.panels[rightIdx];\r\n\r\n let newLeftSize = this.startSizes[leftIdx] + deltaPercent;\r\n let newRightSize = this.startSizes[rightIdx] - deltaPercent;\r\n\r\n // Clamp to min/max\r\n newLeftSize = Math.max(leftPanel.minSize, Math.min(leftPanel.maxSize, newLeftSize));\r\n newRightSize = Math.max(rightPanel.minSize, Math.min(rightPanel.maxSize, newRightSize));\r\n\r\n // Ensure total is preserved\r\n const pairTotal = this.startSizes[leftIdx] + this.startSizes[rightIdx];\r\n const adjustedTotal = newLeftSize + newRightSize;\r\n if (adjustedTotal !== pairTotal) {\r\n const ratio = pairTotal / adjustedTotal;\r\n newLeftSize *= ratio;\r\n newRightSize *= ratio;\r\n }\r\n\r\n // Update sizes\r\n const newSizes = [...this.startSizes];\r\n newSizes[leftIdx] = newLeftSize;\r\n newSizes[rightIdx] = newRightSize;\r\n\r\n this.applySizes(newSizes);\r\n\r\n // Update handle aria value\r\n const handle = this.handles[this.activeHandleIndex];\r\n if (handle) {\r\n const splitPercent = (newLeftSize / pairTotal) * 100;\r\n handle.updateAriaValue(splitPercent);\r\n }\r\n\r\n // Dispatch resize event\r\n this.dispatchResizeEvent(\"rel-resize\");\r\n }\r\n\r\n /* =======================\r\n * KEYBOARD HANDLING\r\n * ======================= */\r\n\r\n private onKeyDown = (e: KeyboardEvent) => {\r\n const target = e.composedPath()[0] as HTMLElement;\r\n if (target.tagName !== \"REL-RESIZABLE-HANDLE\") return;\r\n\r\n const handle = target as RelResizableHandle;\r\n const handleIndex = this.handles.indexOf(handle);\r\n if (handleIndex === -1) return;\r\n\r\n const isHorizontal = this.direction === \"horizontal\";\r\n const step = e.shiftKey ? 5 : 2;\r\n let applied = false;\r\n\r\n if (isHorizontal && (e.key === \"ArrowLeft\" || e.key === \"ArrowRight\")) {\r\n e.preventDefault();\r\n const delta = e.key === \"ArrowLeft\" ? -step : step;\r\n this.applyKeyboardResize(handleIndex, delta);\r\n applied = true;\r\n } else if (!isHorizontal && (e.key === \"ArrowUp\" || e.key === \"ArrowDown\")) {\r\n e.preventDefault();\r\n const delta = e.key === \"ArrowUp\" ? -step : step;\r\n this.applyKeyboardResize(handleIndex, delta);\r\n applied = true;\r\n }\r\n\r\n if (applied) {\r\n this.dispatchResizeEvent(\"rel-resize-end\");\r\n }\r\n };\r\n\r\n private applyKeyboardResize(handleIndex: number, deltaPercent: number) {\r\n const leftIdx = handleIndex;\r\n const rightIdx = handleIndex + 1;\r\n\r\n if (leftIdx < 0 || rightIdx >= this.panels.length) return;\r\n\r\n const leftPanel = this.panels[leftIdx];\r\n const rightPanel = this.panels[rightIdx];\r\n const currentSizes = this.panels.map((p) => p.currentSize);\r\n\r\n let newLeftSize = currentSizes[leftIdx] + deltaPercent;\r\n let newRightSize = currentSizes[rightIdx] - deltaPercent;\r\n\r\n // Clamp to min/max\r\n newLeftSize = Math.max(leftPanel.minSize, Math.min(leftPanel.maxSize, newLeftSize));\r\n newRightSize = Math.max(rightPanel.minSize, Math.min(rightPanel.maxSize, newRightSize));\r\n\r\n // Ensure total is preserved\r\n const pairTotal = currentSizes[leftIdx] + currentSizes[rightIdx];\r\n const adjustedTotal = newLeftSize + newRightSize;\r\n if (adjustedTotal !== pairTotal) {\r\n const ratio = pairTotal / adjustedTotal;\r\n newLeftSize *= ratio;\r\n newRightSize *= ratio;\r\n }\r\n\r\n // Update sizes\r\n const newSizes = [...currentSizes];\r\n newSizes[leftIdx] = newLeftSize;\r\n newSizes[rightIdx] = newRightSize;\r\n\r\n this.applySizes(newSizes);\r\n\r\n // Update handle aria value\r\n const handle = this.handles[handleIndex];\r\n if (handle) {\r\n const splitPercent = (newLeftSize / pairTotal) * 100;\r\n handle.updateAriaValue(splitPercent);\r\n }\r\n }\r\n\r\n /* =======================\r\n * SIZE APPLICATION\r\n * ======================= */\r\n\r\n private applySizes(sizes: number[]) {\r\n this.panels.forEach((panel, idx) => {\r\n const size = sizes[idx] || 0;\r\n panel.currentSize = size;\r\n panel.style.flexBasis = `${size}%`;\r\n panel.style.flexGrow = \"0\";\r\n panel.style.flexShrink = \"0\";\r\n });\r\n }\r\n\r\n /* =======================\r\n * EVENTS\r\n * ======================= */\r\n\r\n private dispatchResizeEvent(eventName: string) {\r\n const sizes = this.panels.map((p) => p.currentSize);\r\n this.dispatchEvent(\r\n new CustomEvent(eventName, {\r\n detail: {\r\n direction: this.direction,\r\n sizes,\r\n },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n /* =======================\r\n * GLOBAL LISTENERS\r\n * ======================= */\r\n\r\n private addGlobalListeners() {\r\n document.addEventListener(\"pointermove\", this.onPointerMove);\r\n document.addEventListener(\"pointerup\", this.onPointerUp);\r\n }\r\n\r\n private removeGlobalListeners() {\r\n document.removeEventListener(\"pointermove\", this.onPointerMove);\r\n document.removeEventListener(\"pointerup\", this.onPointerUp);\r\n }\r\n\r\n /* =======================\r\n * RENDER\r\n * ======================= */\r\n\r\n render() {\r\n return html`<slot></slot>`;\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"rel-resizable-group\": RelResizableGroup;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\r\n@customElement(\"rel-resizable-panel\")\r\nexport class RelResizablePanel extends LitElement {\r\n /* =======================\r\n * PUBLIC API\r\n * ======================= */\r\n\r\n @property({ type: Number, attribute: \"defaultsize\" }) defaultSize?: number;\r\n @property({ type: Number, attribute: \"minsize\" }) minSize = 10;\r\n @property({ type: Number, attribute: \"maxsize\" }) maxSize = 90;\r\n\r\n /* =======================\r\n * INTERNAL STATE\r\n * ======================= */\r\n\r\n /** Current computed size in percentage */\r\n public currentSize = 0;\r\n\r\n /* =======================\r\n * STYLES\r\n * ======================= */\r\n\r\n static styles = css`\r\n /* Default typography for slotted panel headings (Figma headings-md) */\r\n ::slotted(h1), ::slotted(h2), ::slotted(h3), ::slotted(h4) {\r\n font-family: var(--rel-headings-md-font-family);\r\n font-weight: var(--rel-headings-md-font-weight);\r\n font-size: var(--rel-headings-md-font-size);\r\n line-height: var(--rel-headings-md-line-height);\r\n letter-spacing: var(--rel-headings-md-letter-spacing);\r\n }\r\n\r\n :host {\r\n padding: var(--rel-spacing-md);\r\n color: var(--rel-text-default);\r\n display: flex;\r\n flex-direction: column;\r\n overflow: auto;\r\n box-sizing: border-box;\r\n }\r\n `;\r\n\r\n /* =======================\r\n * RENDER\r\n * ======================= */\r\n\r\n render() {\r\n return html`<slot></slot>`;\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"rel-resizable-panel\": RelResizablePanel;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\r\n@customElement(\"rel-resizable-handle\")\r\nexport class RelResizableHandle extends LitElement {\r\n /* =======================\r\n * PUBLIC API\r\n * ======================= */\r\n\r\n @property({ type: String, reflect: true }) orientation: \"horizontal\" | \"vertical\" = \"horizontal\";\r\n\r\n /* =======================\r\n * INTERNAL STATE\r\n * ======================= */\r\n\r\n /** Index of this handle in the parent group */\r\n public handleIndex = -1;\r\n \r\n /** Current split value (0-100) for aria-valuenow */\r\n public splitValue = 50;\r\n\r\n /* =======================\r\n * STYLES\r\n * ======================= */\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex-shrink: 0;\r\n position: relative;\r\n outline: none;\r\n background: var(--rel-border-default);\r\n transition: background 0.15s ease;\r\n }\r\n\r\n :host([orientation=\"horizontal\"]) {\r\n width: 8px;\r\n min-width: 8px;\r\n cursor: col-resize;\r\n }\r\n\r\n :host([orientation=\"vertical\"]) {\r\n height: 8px;\r\n min-height: 8px;\r\n cursor: row-resize;\r\n }\r\n\r\n :host(:hover),\r\n :host(:focus-visible) {\r\n background: var(--rel-bg-neutral-elevated-1);\r\n }\r\n\r\n :host([dragging]) {\r\n background: var(--rel-bg-neutral-elevated-3);\r\n }\r\n\r\n :host(:focus-visible) {\r\n outline: 2px solid var(--rel-border-focus);\r\n outline-offset: 2px;\r\n }\r\n\r\n .grabber {\r\n background: var(--rel-text-body);\r\n border-radius: var(--rel-border-radius-full-rounded);\r\n transition: background 0.15s ease;\r\n }\r\n\r\n :host([orientation=\"horizontal\"]) .grabber {\r\n width: 4px;\r\n height: 24px;\r\n }\r\n\r\n :host([orientation=\"vertical\"]) .grabber {\r\n width: 24px;\r\n height: 4px;\r\n }\r\n\r\n :host(:hover) .grabber,\r\n :host(:focus-visible) .grabber {\r\n background: var(--rel-bg-surface);\r\n }\r\n\r\n :host([data-dragging]) {\r\n background: var(--rel-bg-neutral-elevated-1);\r\n }\r\n\r\n :host([data-dragging]) .grabber {\r\n background: var(--rel-text-default);\r\n }\r\n\r\n @media (prefers-reduced-motion: reduce) {\r\n :host {\r\n transition: none;\r\n }\r\n\r\n .grabber {\r\n transition: none;\r\n }\r\n }\r\n `;\r\n\r\n /* =======================\r\n * LIFECYCLE\r\n * ======================= */\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n this.setAttribute(\"tabindex\", \"0\");\r\n this.setAttribute(\"role\", \"separator\");\r\n this.updateAriaOrientation();\r\n }\r\n\r\n updated(changed: Map<string, unknown>) {\r\n if (changed.has(\"orientation\")) {\r\n this.updateAriaOrientation();\r\n }\r\n }\r\n\r\n /* =======================\r\n * ARIA\r\n * ======================= */\r\n\r\n private updateAriaOrientation() {\r\n this.setAttribute(\"aria-orientation\", this.orientation);\r\n }\r\n\r\n public updateAriaValue(value: number) {\r\n this.splitValue = value;\r\n this.setAttribute(\"aria-valuenow\", String(Math.round(value)));\r\n this.setAttribute(\"aria-valuemin\", \"0\");\r\n this.setAttribute(\"aria-valuemax\", \"100\");\r\n }\r\n\r\n /* =======================\r\n * RENDER\r\n * ======================= */\r\n\r\n render() {\r\n return html`<div class=\"grabber\"></div>`;\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"rel-resizable-handle\": RelResizableHandle;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\r\nexport type SegmentSize = \"small\" | \"medium\";\r\nexport type SegmentAlign = \"left\" | \"middle\" | \"right\";\r\n\r\nexport interface SegmentOption {\r\n label: string;\r\n value: string;\r\n disabled?: boolean;\r\n}\r\n\r\n@customElement(\"rel-segmented-button\")\r\nexport class RelSegmentedButton extends LitElement {\r\n @property({ type: Array }) options: SegmentOption[] = [];\r\n\r\n @property({ type: String }) active: string = \"\";\r\n\r\n @property({ type: String }) size: SegmentSize = \"medium\";\r\n\r\n @property({ type: String }) align: SegmentAlign = \"left\";\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n display: inline-block;\r\n font-family: var(--rel-fonts-font-family);\r\n }\r\n\r\n .segmented-buttons {\r\n display: inline-flex;\r\n border: 1px solid var(--rel-border-default);\r\n border-radius: var(--rel-border-radius-xs);\r\n overflow: hidden;\r\n }\r\n\r\n /* Alignment */\r\n .align-left {\r\n justify-content: flex-start;\r\n }\r\n\r\n .align-middle {\r\n justify-content: center;\r\n }\r\n\r\n .align-right {\r\n justify-content: flex-end;\r\n }\r\n\r\n /* Base segment styling */\r\n .segment {\r\n padding: var(--rel-spacing-2xs) var(--rel-spacing-sm);\r\n background: var(--rel-bg-neutral);\r\n border: none;\r\n border-radius: 0;\r\n cursor: pointer;\r\n border-right: 1px solid var(--rel-border-default);\r\n transition: background 0.2s ease-in-out, color 0.2s ease-in-out, border-color 0.2s ease-in-out;\r\n color: var(--rel-action-neutral-label-icons-ghost);\r\n font-family: var(--rel-action-md-font-family);\r\n font-weight: var(--rel-action-md-font-weight);\r\n font-size: var(--rel-action-md-font-size);\r\n line-height: var(--rel-action-md-line-height);\r\n letter-spacing: var(--rel-action-md-letter-spacing);\r\n }\r\n\r\n .segment:first-child {\r\n border-radius: var(--rel-border-radius-xs) 0 0 var(--rel-border-radius-xs);\r\n }\r\n\r\n .segment:last-child {\r\n border-radius: 0 var(--rel-border-radius-xs) var(--rel-border-radius-xs) 0;\r\n border-right: none;\r\n }\r\n\r\n .segment:focus-visible {\r\n outline: 2px solid var(--rel-border-focus);\r\n outline-offset: -2px;\r\n z-index: 1;\r\n }\r\n\r\n /* Hover */\r\n .segment:hover:not(.disabled):not(.active) {\r\n background: var(--rel-action-overlay-hover);\r\n }\r\n\r\n /* Active — action-neutral tokens flip automatically in dark mode */\r\n .segment.active {\r\n background: var(--rel-action-neutral-fill);\r\n color: var(--rel-text-inverse);\r\n border-radius: var(--rel-border-radius-xs) !important;\r\n }\r\n\r\n .segment.active:hover:not(.disabled) {\r\n background: var(--rel-action-neutral-fill-hover);\r\n color: var(--rel-action-neutral-label-icons-fill-inverse);\r\n }\r\n\r\n /* Disabled */\r\n .segment.disabled,\r\n .segment:disabled {\r\n cursor: not-allowed;\r\n pointer-events: auto;\r\n opacity: 0.5;\r\n background: var(--rel-bg-neutral-elevated-1);\r\n color: var(--rel-text-disabled);\r\n }\r\n\r\n /* Sizes */\r\n .segmented-buttons.small .segment {\r\n padding: var(--rel-spacing-3xs) var(--rel-spacing-xs);\n font-family: var(--rel-body-xs-regular-font-family);\n font-weight: var(--rel-body-xs-semibold-font-weight);\r\n font-size: var(--rel-body-xs-semibold-font-size);\r\n line-height: var(--rel-body-xs-semibold-line-height);\r\n letter-spacing: var(--rel-body-xs-semibold-letter-spacing);\n }\r\n\r\n .segmented-buttons.medium .segment {\r\n padding: var(--rel-spacing-2xs) var(--rel-spacing-md);\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 }\r\n `;\r\n\r\n private setActive(option: SegmentOption) {\r\n if (!option.disabled) {\r\n this.active = option.value;\r\n this.dispatchEvent(\r\n new CustomEvent(\"changed\", {\r\n detail: { value: option.value },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n }\r\n\r\n private renderSegment(option: SegmentOption) {\r\n const isActive = this.active === option.value;\r\n const classes = [\r\n \"segment\",\r\n isActive ? \"active\" : \"\",\r\n option.disabled ? \"disabled\" : \"\",\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return html`\r\n <button\r\n part=\"option\" class=\"${classes}\"\r\n ?disabled=\"${option.disabled}\"\r\n @click=\"${() => this.setActive(option)}\">\r\n ${option.label}\r\n </button>\r\n `;\r\n }\r\n\r\n render() {\r\n const containerClasses = [\r\n \"segmented-buttons\",\r\n this.size,\r\n `align-${this.align}`,\r\n ].join(\" \");\r\n\r\n return html`\r\n <div part=\"base\" class=\"${containerClasses}\">\r\n ${this.options.map((option) => this.renderSegment(option))}\r\n </div>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css, nothing, PropertyValues } from \"lit\";\nimport { customElement, property, state, query } from \"lit/decorators.js\";\nimport { repeat } from \"lit/directives/repeat.js\";\nimport \"@reliability-design/icons/rel-icon\";\nimport \"../rel-chip/rel-chip.js\";\nimport \"../rel-checkbox/rel-checkbox.js\";\nimport type { FieldLabelStyle } from \"../rel-textfield/rel-textfield.js\";\n\nexport type SelectState = \"default\" | \"error\" | \"disabled\";\nexport type SelectSize = \"small\" | \"medium\" | \"large\";\nexport type SelectBorder = \"rounded\" | \"sharp\";\n/** Alias of the shared field type — kept so existing imports keep resolving. */\nexport type SelectLabelStyle = FieldLabelStyle;\n\nexport interface SelectOptionObject {\n value: string;\n label?: string;\n supportingText?: string;\n /** rel-icon name rendered as a prefix (leading icon) on the menu item. */\n icon?: string;\n}\nexport type SelectOption = string | SelectOptionObject;\n\ninterface NormalizedOption {\n value: string;\n label: string;\n supportingText: string;\n icon: string;\n}\n\nfunction normalizeOption(o: SelectOption): NormalizedOption {\n if (typeof o === \"string\") return { value: o, label: o, supportingText: \"\", icon: \"\" };\n return {\n value: o.value,\n label: o.label ?? o.value,\n supportingText: o.supportingText ?? \"\",\n icon: o.icon ?? \"\",\n };\n}\n\n@customElement(\"rel-select\")\nexport class RelSelect extends LitElement {\n @property({ type: String }) label: string = \"\";\n\n // Lit's default attribute name is the property name fully lowercased (no\n // hyphens) — e.g. labelStyle would otherwise only respond to \"labelstyle\".\n // Every multi-word property below gets an explicit kebab-case `attribute`\n // so it works the way HTML usage actually looks.\n @property({ type: String, attribute: \"label-style\", reflect: true })\n labelStyle: SelectLabelStyle = \"default\";\n\n /**\n * Accessible name for the trigger. Required when `labelStyle=\"none\"`, since no\n * `<label>` renders and a placeholder is not a valid naming mechanism.\n */\n @property({ type: String, attribute: \"field-aria-label\" }) fieldAriaLabel?: string;\n /** IDREF list of external element(s) naming the trigger. Wins over `fieldAriaLabel`. */\n @property({ type: String, attribute: \"field-aria-labelledby\" }) fieldAriaLabelledby?: string;\n\n @property({ type: Array }) options: SelectOption[] = [];\n\n /** Enables multi-select: selected values render as removable chips and options as checkboxes. */\n @property({ type: Boolean }) multiple: boolean = false;\n\n /** Selected value — single-select mode only. */\n @property({ type: String }) selected: string = \"\";\n\n /** Selected values — multi-select mode only. */\n @property({ type: Array, attribute: \"selected-values\" }) selectedValues: string[] = [];\n\n @property({ type: String }) state: SelectState = \"default\";\n\n @property({ type: String, attribute: \"supporting-text\" }) supportingText: string = \"\";\n\n @property({ type: String, reflect: true }) size: SelectSize = \"medium\";\n\n @property({ type: String }) border: SelectBorder = \"rounded\";\n\n @property({ type: String, attribute: \"left-icon\" }) leftIcon: string = \"\";\n\n @property({ type: String, attribute: \"right-icon\" }) rightIcon: string = \"\";\n\n @property({ type: String }) placeholder: string = \"Select option\";\n\n @property({ type: String, attribute: \"search-placeholder\" }) searchPlaceholder: string = \"Search option\";\n\n @property({ type: String, attribute: \"select-all-label\" }) selectAllLabel: string = \"Select all\";\n\n /**\n * Optional hard cap on visible chips. By default (no cap) the visible\n * count adapts to the trigger's width: chips collapse into the \"+N\" badge\n * one by one instead of wrapping to a second line.\n */\n @property({ type: Number, attribute: \"max-visible-chips\" }) maxVisibleChips: number = Infinity;\n\n // Boolean props default true and toggled off via =\"false\" are a classic Lit\n // trap: for type:Boolean, attribute *presence* (not its string value)\n // decides truthiness, so searchable=\"false\" would still read as true. Named\n // negatively instead, so the natural HTML idiom — just adding the bare\n // attribute, no value — does what it looks like it does.\n /** Hides the in-panel search field. Figma's \"Single Option\" dropdown has no search bar at all — use this for short, non-searchable lists. */\n @property({ type: Boolean, attribute: \"no-search\" }) noSearch: boolean = false;\n\n @state() private open = false;\n @state() private highlightedIndex = -1;\n @state() private panelStyle = \"\";\n @state() private searchValue = \"\";\n @state() private internalState: \"default\" | \"focused\" = \"default\";\n\n /** How many chips currently fit in the trigger width (width-adaptive). */\n @state() private visibleChipCount = Infinity;\n\n @query(\".select-trigger\") private triggerEl!: HTMLButtonElement;\n @query(\".search-input\") private searchInputEl!: HTMLInputElement;\n @query(\".select-listbox\") private listboxEl!: HTMLDivElement;\n @query(\".select-value\") private valueEl!: HTMLElement;\n @query(\".select-chips-measure\") private chipsMeasureEl!: HTMLElement;\n\n /** Must match the `gap` of .select-chips / .select-chips-measure. */\n private static readonly CHIP_GAP = 6;\n\n private chipResizeObserver?: ResizeObserver;\n\n private uniqueId = `select-${Math.random().toString(36).slice(2)}`;\n\n static styles = css`\n :host {\n color: var(--rel-text-default);\n display: block;\n font-family: var(--rel-fonts-font-family);\n width: 100%;\n }\n\n .select-wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--rel-spacing-2xs);\n width: 100%;\n }\n\n /* Dims everything inside uniformly (label, trigger, icons, value text,\n supporting text) — matches rel-button's :host([disabled]) opacity\n approach instead of relying on one barely-different background tint. */\n .select-wrapper.disabled {\n opacity: 0.5;\n }\n\n .select-label {\n color: var(--rel-select-label-color, var(--rel-text-label));\n\n font-family: var(--rel-body-sm-regular-font-family);\n\n font-weight: var(--rel-body-sm-regular-font-weight);\n\n font-size: var(--rel-body-sm-regular-font-size);\n\n line-height: var(--rel-body-sm-regular-line-height);\n\n letter-spacing: var(--rel-body-sm-regular-letter-spacing);\n\n }\n\n /* ── labelStyle=\"none\" ──\n No label renders. An empty spacer holds the label row's full height so the\n trigger still bottom-aligns with labelled siblings in a form row.\n The reserve covers label line-height + the wrapper gap, and the negative\n margin cancels the flex gap that would otherwise sit below it — so\n --rel-field-label-reserve: 0 collapses the row to genuinely zero\n (toolbars, table cells), not just to the leftover gap. */\n .label-reserve {\n flex: none;\n height: var(\n --rel-field-label-reserve,\n calc(var(--rel-body-sm-regular-line-height) + var(--rel-spacing-2xs))\n );\n margin-bottom: calc(-1 * var(--rel-spacing-2xs));\n }\n\n /* Error only colors the border/focus ring and the supporting text below\n the field — label, floating label, placeholder, and icons stay normal. */\n\n /* Container */\n .select-container {\n position: relative;\n }\n\n /* Trigger button — visually a text field, semantically a combobox button */\n .select-trigger {\n display: flex;\n align-items: center;\n width: 100%;\n box-sizing: border-box;\n gap: 8px;\n background: var(--rel-select-bg, var(--rel-bg-neutral));\n border: 1px solid var(--rel-select-border-default, var(--rel-border-default));\n cursor: pointer;\n font-family: inherit;\n transition: border-color 0.15s ease;\n text-align: left;\n }\n\n .border-rounded .select-trigger {\n border-radius: var(--rel-select-radius, var(--rel-border-radius-xs));\n }\n\n .border-sharp .select-trigger {\n border-radius: 0;\n }\n\n .select-trigger:focus-visible,\n .select-wrapper.open .select-trigger {\n outline: none;\n border-color: var(--rel-select-border-focus, var(--rel-border-strong));\n }\n\n .select-wrapper.error .select-trigger {\n border-color: var(--rel-select-border-error, var(--rel-border-danger));\n }\n\n .select-wrapper.disabled .select-trigger {\n cursor: not-allowed;\n background: var(--rel-select-bg-disabled, var(--rel-bg-neutral-elevated-1));\n border-color: var(--rel-select-border-default, var(--rel-border-default));\n }\n\n /* Sizes */\n .select-wrapper.small .select-trigger {\n padding: var(--rel-spacing-xs) var(--rel-spacing-sm);\n min-height: 40px;\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 .select-wrapper.medium .select-trigger {\n padding: 12px;\n min-height: 48px;\n font-family: var(--rel-body-md-regular-font-family);\n font-weight: var(--rel-body-md-regular-font-weight);\n font-size: var(--rel-body-md-regular-font-size);\n line-height: var(--rel-body-md-regular-line-height);\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\n }\n\n .select-wrapper.large .select-trigger {\n padding: var(--rel-spacing-md);\n min-height: 56px;\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 /* Icons */\n .select-trigger .icon {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n color: var(--rel-select-icon-color, var(--rel-text-default));\n }\n\n .select-trigger .icon.chevron {\n transition: transform 0.15s ease;\n }\n\n .select-wrapper.open .icon.chevron {\n transform: rotate(180deg);\n }\n\n .select-wrapper.disabled .icon {\n color: var(--rel-text-disabled);\n }\n\n /* Value area */\n .select-value {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: nowrap;\n color: var(--rel-select-value-color, var(--rel-text-default));\n overflow: hidden;\n }\n\n .select-value.placeholder {\n color: var(--rel-select-placeholder-color, var(--rel-text-placeholder));\n }\n\n .select-wrapper.disabled .select-value.placeholder {\n color: var(--rel-select-placeholder-disabled-color, var(--rel-text-disabled));\n }\n\n .select-value-text {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n /* Chips never wrap — the number of rendered chips adapts to the\n available width instead (see computeVisibleChips), collapsing the\n remainder into a trailing \"+N\" chip. overflow:hidden guards the one\n frame between a resize and the recomputation catching up. */\n .select-chips {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: nowrap;\n min-width: 0;\n overflow: hidden;\n }\n\n /* Invisible copy of ALL selected chips (plus a worst-case \"+N\" chip),\n laid out unconstrained so computeVisibleChips can read each chip's\n natural width — including chips currently collapsed into \"+N\", whose\n widths are needed again when the field grows. */\n .select-chips-measure {\n position: absolute;\n top: 0;\n left: 0;\n display: flex;\n align-items: center;\n gap: 6px;\n width: max-content;\n visibility: hidden;\n pointer-events: none;\n }\n\n /* rel-chip's outer element is a tabindex=\"0\" span, not a native button —\n a disabled native <button> ancestor doesn't suppress clicks on that\n automatically the way it would for a nested native form control, so\n this has to be switched off explicitly. The cursor still correctly\n falls through to the disabled trigger underneath. */\n .select-wrapper.disabled .select-chips {\n pointer-events: none;\n }\n\n /* Floating label — single element that animates between resting (inside,\n at the value position) and floated (small, on the border line), same\n mechanism as rel-textfield's [floatinglabel]. */\n .floating-label {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n background: var(--rel-select-bg, var(--rel-bg-neutral));\n padding: 0 4px;\n color: var(--rel-select-placeholder-color, var(--rel-text-placeholder));\n pointer-events: none;\n z-index: 1;\n white-space: nowrap;\n transition: top 0.15s ease, left 0.15s ease, font-size 0.15s ease, color 0.15s ease;\n font-family: var(--rel-body-md-regular-font-family);\n font-weight: var(--rel-body-md-regular-font-weight);\n font-size: var(--rel-body-md-regular-font-size);\n line-height: var(--rel-body-md-regular-line-height);\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\n }\n\n .floating-label.has-left-icon {\n left: 40px;\n }\n\n .select-wrapper.focused .floating-label,\n .select-wrapper.has-value .floating-label,\n .select-wrapper.open .floating-label {\n top: 0;\n left: 12px;\n font-size: var(--rel-body-sm-medium-font-size);\n line-height: var(--rel-body-sm-medium-line-height);\n letter-spacing: var(--rel-body-sm-medium-letter-spacing);\n font-weight: var(--rel-body-xs-medium-font-weight);\n color: var(--rel-select-label-color, var(--rel-text-label));\n }\n\n /* The real placeholder hides while the float-label rests in its spot,\n and fades in once the label has moved up to the border. */\n .select-wrapper.floating .select-value.placeholder {\n opacity: 0;\n transition: opacity 0.1s ease;\n }\n\n .select-wrapper.floating.focused .select-value.placeholder,\n .select-wrapper.floating.open .select-value.placeholder {\n opacity: 1;\n }\n\n /* Supporting text */\n .select-support {\n margin-top: var(--rel-spacing-3xs);\n font-size: 13px;\n color: var(--rel-select-supporting-color, var(--rel-text-caption));\n }\n\n .select-support.error {\n color: var(--rel-text-danger);\n }\n\n /* ── Dropdown listbox ── */\n .select-listbox {\n position: fixed;\n z-index: 1001;\n display: none;\n box-sizing: border-box;\n background: var(--rel-select-bg, var(--rel-bg-neutral));\n border: 1px solid var(--rel-select-menu-border, var(--rel-border-default));\n border-radius: var(--rel-select-menu-radius, var(--rel-border-radius-sm));\n /* A border alone doesn't read clearly against a similarly-light page,\n and a shadow alone barely shows on a dark background — together\n they hold up in both themes. */\n box-shadow: var(--rel-select-menu-shadow, var(--rel-shadows-shadow-300));\n max-height: 360px;\n overflow-y: auto;\n }\n\n .select-listbox[data-open] {\n display: block;\n }\n\n .select-search {\n position: sticky;\n top: 0;\n background: var(--rel-select-bg, var(--rel-bg-neutral));\n padding: var(--rel-spacing-xs);\n border-bottom: 1px solid var(--rel-select-divider, var(--rel-border-subtle));\n }\n\n /* Base = \"small\" textfield sizing, shared by both small AND medium\n select — only \"large\" select bumps the search field up to \"medium\". */\n .search-input-wrap {\n display: flex;\n align-items: center;\n gap: 8px;\n border: 1px solid var(--rel-select-search-border, var(--rel-border-default));\n border-radius: 4px;\n padding: var(--rel-spacing-xs) var(--rel-spacing-sm);\n }\n\n .search-input-wrap .icon {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n color: var(--rel-select-icon-color, var(--rel-text-default));\n }\n\n .search-input {\n flex: 1;\n min-width: 0;\n border: none;\n outline: none;\n background: transparent;\n color: var(--rel-select-value-color, var(--rel-text-default));\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 .search-input::placeholder {\n color: var(--rel-select-placeholder-color, var(--rel-text-placeholder));\n }\n\n :host([size=\"large\"]) .search-input-wrap {\n padding: 12px;\n }\n\n :host([size=\"large\"]) .search-input {\n\n font-family: var(--rel-body-md-regular-font-family);\n\n font-weight: var(--rel-body-md-regular-font-weight);\n\n font-size: var(--rel-body-md-regular-font-size);\n\n line-height: var(--rel-body-md-regular-line-height);\n\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\n\n }\n\n .select-options {\n padding: 4px 0;\n }\n\n .select-option {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: var(--rel-spacing-xs) 12px;\n color: var(--rel-select-value-color, var(--rel-text-default));\n cursor: pointer;\n font-family: var(--rel-body-md-regular-font-family);\n font-weight: var(--rel-body-md-regular-font-weight);\n font-size: var(--rel-body-md-regular-font-size);\n line-height: var(--rel-body-md-regular-line-height);\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\n }\n\n /* Groups the optional prefix icon with the label so the trailing\n check indicator stays pinned to the right edge of the row. */\n .select-option-content {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: center;\n gap: var(--rel-spacing-xs);\n }\n\n .select-option-icon {\n flex-shrink: 0;\n color: var(--rel-select-icon-color, var(--rel-text-default));\n }\n\n .select-option-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .select-option-check {\n flex-shrink: 0;\n color: var(--rel-select-value-color, var(--rel-text-default));\n }\n\n .select-option:hover,\n .select-option.highlighted {\n background: var(--rel-select-option-hover, var(--rel-bg-neutral-elevated-1));\n }\n\n .select-option[aria-selected=\"true\"] {\n font-weight: var(--rel-body-md-medium-font-weight);\n }\n\n :host([size=\"large\"]) .select-option[aria-selected=\"true\"] {\n font-weight: var(--rel-body-lg-medium-font-weight);\n }\n\n .checkbox-option {\n padding: 12px;\n }\n\n .checkbox-option:hover,\n .checkbox-option.highlighted {\n background: var(--rel-select-option-hover, var(--rel-bg-neutral-elevated-1));\n }\n\n .select-all-row {\n border-bottom: 1px solid var(--rel-select-divider, var(--rel-border-subtle));\n padding: 12px;\n }\n\n .select-empty {\n padding: var(--rel-spacing-xs) 12px;\n color: var(--rel-select-placeholder-color, var(--rel-text-body));\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 `;\n\n connectedCallback() {\n super.connectedCallback();\n // firstUpdated only runs once — re-observe if the element is re-attached.\n if (this.chipResizeObserver && this.triggerEl) {\n this.chipResizeObserver.observe(this.triggerEl);\n }\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.removeGlobalListeners();\n this.chipResizeObserver?.disconnect();\n }\n\n protected firstUpdated() {\n this.chipResizeObserver = new ResizeObserver(() => this.computeVisibleChips());\n this.chipResizeObserver.observe(this.triggerEl);\n }\n\n protected willUpdate(changed: PropertyValues<this>) {\n if (changed.has(\"multiple\") && this.multiple === false) {\n this.selectedValues = [];\n }\n }\n\n private _warnedNoName = false;\n\n protected updated(changed: PropertyValues<this>) {\n if (\n !this._warnedNoName &&\n this.labelStyle === \"none\" &&\n !this.fieldAriaLabel &&\n !this.fieldAriaLabelledby &&\n !this.getAttribute(\"aria-label\")\n ) {\n this._warnedNoName = true;\n console.warn(\n '<rel-select label-style=\"none\"> has no accessible name. Set ' +\n \"`field-aria-label` or `field-aria-labelledby` — a placeholder is not a \" +\n \"valid naming mechanism.\",\n this\n );\n }\n\n if (\n changed.has(\"selectedValues\") ||\n changed.has(\"options\") ||\n changed.has(\"multiple\") ||\n changed.has(\"size\")\n ) {\n // rAF: rel-chip renders in its own (microtask) update cycle, so its\n // width isn't measurable synchronously here — by the next frame it is.\n requestAnimationFrame(() => this.computeVisibleChips());\n }\n }\n\n /**\n * Width-adaptive chip collapsing: measures every selected chip in the\n * hidden .select-chips-measure row and works out how many fit in the value\n * area, always reserving room for the trailing \"+N\" chip when not all fit.\n * At least one chip stays visible no matter how narrow the field gets.\n */\n private computeVisibleChips() {\n if (!this.isConnected || !this.multiple || this.selectedValues.length === 0) return;\n const measure = this.chipsMeasureEl;\n const container = this.valueEl;\n if (!measure || !container) return;\n\n const available = container.clientWidth;\n if (available <= 0) return; // hidden (display:none) — RO will refire when visible\n\n const children = Array.from(measure.children) as HTMLElement[];\n if (children.length < 2) return;\n\n const gap = RelSelect.CHIP_GAP;\n // Last measure child is the worst-case \"+N\" chip (N = total selected,\n // i.e. the widest label the badge can ever need).\n const overflowWidth = children[children.length - 1].offsetWidth;\n const chipWidths = children.slice(0, -1).map((c) => c.offsetWidth);\n const total = chipWidths.reduce((sum, w) => sum + w, 0) + gap * (chipWidths.length - 1);\n\n let fit: number;\n if (total <= available) {\n fit = chipWidths.length;\n } else {\n fit = 0;\n let used = 0;\n for (let i = 0; i < chipWidths.length; i++) {\n const w = chipWidths[i] + (i > 0 ? gap : 0);\n if (used + w + gap + overflowWidth <= available) {\n used += w;\n fit = i + 1;\n } else {\n break;\n }\n }\n fit = Math.max(1, fit);\n }\n\n if (fit !== this.visibleChipCount) this.visibleChipCount = fit;\n }\n\n private get normalizedOptions(): NormalizedOption[] {\n return this.options.map(normalizeOption);\n }\n\n /** Options matching the current search text (substring match, case-insensitive). */\n private get filteredOptions(): NormalizedOption[] {\n const opts = this.normalizedOptions;\n if (!this.searchValue) return opts;\n const v = this.searchValue.toLowerCase();\n return opts.filter((o) => o.label.toLowerCase().includes(v));\n }\n\n private get hasValue(): boolean {\n return this.multiple ? this.selectedValues.length > 0 : !!this.selected;\n }\n\n /** Icon size scales with the select's own size, matching the trigger. */\n private get iconSize(): \"xs\" | \"sm\" | \"md\" {\n return this.size === \"small\" ? \"xs\" : this.size === \"large\" ? \"md\" : \"sm\";\n }\n\n /** The search field uses \"small\" sizing for both small and medium select — only \"large\" select bumps it to \"medium\". */\n private get searchIconSize(): \"sm\" | \"md\" {\n return this.size === \"large\" ? \"md\" : \"sm\";\n }\n\n private get selectAllStatus(): \"checked\" | \"unchecked\" | \"indeterminate\" {\n const filtered = this.filteredOptions;\n if (filtered.length === 0) return \"unchecked\";\n const selectedCount = filtered.filter((o) => this.selectedValues.includes(o.value)).length;\n if (selectedCount === 0) return \"unchecked\";\n if (selectedCount === filtered.length) return \"checked\";\n return \"indeterminate\";\n }\n\n private addGlobalListeners() {\n document.addEventListener(\"pointerdown\", this.onOutsidePointerDown);\n window.addEventListener(\"resize\", this.updatePosition);\n window.addEventListener(\"scroll\", this.onPageScroll, true);\n }\n\n private removeGlobalListeners() {\n document.removeEventListener(\"pointerdown\", this.onOutsidePointerDown);\n window.removeEventListener(\"resize\", this.updatePosition);\n window.removeEventListener(\"scroll\", this.onPageScroll, true);\n }\n\n private onOutsidePointerDown = (e: PointerEvent) => {\n if (!this.open) return;\n const path = e.composedPath();\n if (path.includes(this)) return;\n this.closeListbox();\n };\n\n // Continuously re-deriving a fixed-position panel's coordinates from\n // every page scroll event is fragile (it's what was causing the panel to\n // jump to the top of the viewport). Instead, close the panel on any\n // *outside* scroll, same as clicking outside — scrolling the option list\n // itself (target is the listbox) is the one case that should NOT close it.\n private onPageScroll = (e: Event) => {\n if (!this.open) return;\n if (e.composedPath()[0] === this.listboxEl) return;\n this.closeListbox();\n };\n\n private emitChange() {\n this.dispatchEvent(\n new CustomEvent(\"changed\", {\n detail: { value: this.multiple ? this.selectedValues : this.selected },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private openListbox() {\n if (this.state === \"disabled\" || this.open) return;\n this.open = true;\n this.searchValue = \"\";\n // No pre-highlight — the first item showing a hover-style highlight\n // before the user has touched anything reads as an unintended default.\n // Highlight only kicks in once they actually hover or press an arrow key.\n this.highlightedIndex = -1;\n this.addGlobalListeners();\n requestAnimationFrame(() => {\n this.updatePosition();\n // preventScroll: focusing the search field must not let the browser\n // scroll the page into view — that would move the trigger (normal\n // flow) out from under the panel (fixed position, already computed\n // above), breaking the anchor. When there's no search field, focus\n // simply stays on the trigger, which already has the nav keydown\n // handling wired up for this case.\n if (!this.noSearch) {\n this.searchInputEl?.focus({ preventScroll: true });\n }\n });\n }\n\n private closeListbox() {\n if (!this.open) return;\n this.open = false;\n this.removeGlobalListeners();\n this.triggerEl?.focus();\n }\n\n private updatePosition = () => {\n if (!this.triggerEl || !this.listboxEl) return;\n\n this.listboxEl.setAttribute(\"data-open\", \"\");\n\n const t = this.triggerEl.getBoundingClientRect();\n const c = this.listboxEl.getBoundingClientRect();\n\n let top = t.bottom + 4;\n if (top + c.height > window.innerHeight - 8) {\n top = Math.max(8, t.top - c.height - 4);\n }\n\n // Use t.width (the trigger's width, which is also what we set the panel's\n // own width to below) rather than c.width — c.width reflects the\n // *previous* render's panelStyle, so on the very next measurement it can\n // be a frame stale, nudging left by a few px even when there's no real\n // overflow. Checking against t.width directly removes that drift.\n let left = t.left;\n if (left + t.width > window.innerWidth - 8) {\n left = Math.max(8, window.innerWidth - t.width - 8);\n }\n\n this.panelStyle = `top:${top}px;left:${left}px;width:${t.width}px;`;\n };\n\n private selectSingleOption(option: NormalizedOption) {\n this.selected = option.value;\n if (this.state === \"error\") this.state = \"default\";\n this.closeListbox();\n this.emitChange();\n }\n\n private toggleMultiOption(option: NormalizedOption) {\n const idx = this.selectedValues.indexOf(option.value);\n this.selectedValues =\n idx >= 0\n ? this.selectedValues.filter((v) => v !== option.value)\n : [...this.selectedValues, option.value];\n if (this.state === \"error\") this.state = \"default\";\n this.emitChange();\n }\n\n private toggleSelectAll() {\n const filtered = this.filteredOptions;\n const status = this.selectAllStatus;\n if (status === \"checked\") {\n const filteredValues = new Set(filtered.map((o) => o.value));\n this.selectedValues = this.selectedValues.filter((v) => !filteredValues.has(v));\n } else {\n const toAdd = filtered.map((o) => o.value).filter((v) => !this.selectedValues.includes(v));\n this.selectedValues = [...this.selectedValues, ...toAdd];\n }\n if (this.state === \"error\") this.state = \"default\";\n this.emitChange();\n }\n\n private removeChip(value: string) {\n if (this.state === \"disabled\") return;\n this.selectedValues = this.selectedValues.filter((v) => v !== value);\n this.emitChange();\n }\n\n private onTriggerClick() {\n if (this.open) this.closeListbox();\n else this.openListbox();\n }\n\n private onTriggerKeyDown(e: KeyboardEvent) {\n if (this.state === \"disabled\") return;\n if (!this.open) {\n if ([\"ArrowDown\", \"ArrowUp\", \"Enter\", \" \"].includes(e.key)) {\n e.preventDefault();\n this.openListbox();\n }\n return;\n }\n // No search field to hold focus/keydown in this mode — the trigger\n // itself keeps focus while open, so it needs the same nav handling.\n if (this.noSearch) this.handleListNavigation(e);\n }\n\n private onSearchInput = (e: InputEvent) => {\n this.searchValue = (e.target as HTMLInputElement).value;\n this.highlightedIndex = this.filteredOptions.length > 0 ? 0 : -1;\n requestAnimationFrame(() => this.updatePosition());\n };\n\n private onSearchKeyDown(e: KeyboardEvent) {\n this.handleListNavigation(e);\n }\n\n private handleListNavigation(e: KeyboardEvent) {\n const filtered = this.filteredOptions;\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n this.highlightedIndex = Math.min(filtered.length - 1, this.highlightedIndex + 1);\n break;\n case \"ArrowUp\":\n e.preventDefault();\n this.highlightedIndex = Math.max(0, this.highlightedIndex - 1);\n break;\n case \"Enter\":\n e.preventDefault();\n if (this.highlightedIndex >= 0 && filtered[this.highlightedIndex]) {\n const opt = filtered[this.highlightedIndex];\n if (this.multiple) this.toggleMultiOption(opt);\n else this.selectSingleOption(opt);\n }\n break;\n case \"Escape\":\n e.preventDefault();\n this.closeListbox();\n break;\n case \"Tab\":\n this.closeListbox();\n break;\n }\n }\n\n private renderChips() {\n const values = this.selectedValues;\n const visible = values.slice(0, Math.min(this.visibleChipCount, this.maxVisibleChips));\n const overflow = values.length - visible.length;\n const opts = this.normalizedOptions;\n\n return html`\n <span class=\"select-chips\">\n ${repeat(\n visible,\n (v) => v,\n (v) => {\n const opt = opts.find((o) => o.value === v);\n // Keyed by value: rel-chip tracks its own \"removed\" flag\n // internally once its (x) is clicked, so reusing DOM nodes\n // positionally (plain .map()) could hand a freshly-shown value\n // a node that still remembers being removed as a *different*\n // value. Keying forces a fresh node per value instead.\n return html`\n <rel-chip\n label=\"${opt?.label ?? v}\"\n size=\"sm\"\n variant=\"subtle\"\n border=\"default\"\n ?removable=${this.state !== \"disabled\"}\n @click=${(e: Event) => e.stopPropagation()}\n @removed=${(e: Event) => {\n e.stopPropagation();\n this.removeChip(v);\n }}\n ></rel-chip>\n `;\n }\n )}\n ${overflow > 0\n ? html`<rel-chip label=\"+${overflow}\" size=\"sm\" variant=\"fill\" border=\"default\"></rel-chip>`\n : nothing}\n </span>\n `;\n }\n\n /**\n * Hidden, unconstrained copy of every selected chip used purely for width\n * measurement (see computeVisibleChips). Chips mirror the visible ones'\n * width-affecting props (removable adds the ✕ icon). The trailing chip is\n * the widest \"+N\" badge that could ever be needed.\n */\n private renderChipsMeasure() {\n const values = this.selectedValues;\n const opts = this.normalizedOptions;\n return html`\n <span class=\"select-chips-measure\" aria-hidden=\"true\">\n ${values.map((v) => {\n const opt = opts.find((o) => o.value === v);\n return html`\n <rel-chip\n label=\"${opt?.label ?? v}\"\n size=\"sm\"\n variant=\"subtle\"\n border=\"default\"\n ?removable=${this.state !== \"disabled\"}\n ></rel-chip>\n `;\n })}\n <rel-chip label=\"+${values.length}\" size=\"sm\" variant=\"fill\" border=\"default\"></rel-chip>\n </span>\n `;\n }\n\n render() {\n const opts = this.normalizedOptions;\n const filtered = this.filteredOptions;\n const isDisabled = this.state === \"disabled\";\n const labelHidden = this.labelStyle === \"none\";\n const showFloatingChrome = this.labelStyle === \"floating\" && !!this.label;\n // With no visible label the ARIA name comes from fieldAriaLabel instead.\n const accessibleName = (labelHidden ? this.fieldAriaLabel : this.label) || \"\";\n\n const wrapperClasses = [\n \"select-wrapper\",\n this.size,\n this.state,\n `border-${this.border}`,\n showFloatingChrome ? \"floating\" : \"\",\n this.internalState === \"focused\" ? \"focused\" : \"\",\n this.hasValue ? \"has-value\" : \"\",\n this.open ? \"open\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const listboxId = `${this.uniqueId}-listbox`;\n const activeOptionId =\n this.open && this.highlightedIndex >= 0 ? `${this.uniqueId}-option-${this.highlightedIndex}` : \"\";\n\n const selectedSingle = opts.find((o) => o.value === this.selected);\n\n return html`\n <div class=\"${wrapperClasses}\">\n ${labelHidden\n ? html`<div class=\"label-reserve\" aria-hidden=\"true\"></div>`\n : !showFloatingChrome && this.label\n ? html`<label part=\"label\" class=\"select-label\" for=\"${this.uniqueId}\">${this.label}</label>`\n : \"\"}\n\n <div class=\"select-container\">\n ${showFloatingChrome\n ? html`<span class=\"floating-label${this.leftIcon ? \" has-left-icon\" : \"\"}\"\n >${this.label}</span\n >`\n : \"\"}\n\n <button\n id=\"${this.uniqueId}\"\n type=\"button\"\n part=\"trigger\" class=\"select-trigger\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-expanded=\"${this.open}\"\n aria-controls=\"${listboxId}\"\n aria-activedescendant=\"${activeOptionId}\"\n aria-invalid=\"${this.state === \"error\"}\"\n aria-label=\"${this.fieldAriaLabelledby ? nothing : accessibleName || this.placeholder}\"\n aria-labelledby=\"${this.fieldAriaLabelledby ?? nothing}\"\n ?disabled=\"${isDisabled}\"\n @click=\"${this.onTriggerClick}\"\n @keydown=\"${this.onTriggerKeyDown}\"\n @focus=\"${() => (this.internalState = \"focused\")}\"\n @blur=\"${() => (this.internalState = \"default\")}\"\n >\n ${this.leftIcon\n ? html`<rel-icon name=\"${this.leftIcon}\" size=\"${this.iconSize}\" class=\"icon left\"></rel-icon>`\n : \"\"}\n\n ${this.multiple\n ? this.selectedValues.length > 0\n ? html`<span part=\"value\" class=\"select-value\">${this.renderChips()}</span>`\n : html`<span part=\"value\" class=\"select-value placeholder\">\n <span class=\"select-value-text\">${this.placeholder}</span>\n </span>`\n : html`<span part=\"value\" class=\"select-value ${selectedSingle ? \"\" : \"placeholder\"}\">\n <span class=\"select-value-text\"\n >${selectedSingle ? selectedSingle.label : this.placeholder}</span\n >\n </span>`}\n\n <rel-icon\n name=\"${this.rightIcon || \"chevron-down\"}\"\n size=\"${this.iconSize}\"\n class=\"icon ${this.rightIcon ? \"\" : \"chevron\"}\"\n ></rel-icon>\n </button>\n\n ${this.multiple && this.selectedValues.length > 0 ? this.renderChipsMeasure() : nothing}\n </div>\n\n ${this.supportingText\n ? html`<span part=\"helper\" class=\"select-support ${this.state === \"error\" ? \"error\" : \"\"}\">\n ${this.supportingText}\n </span>`\n : \"\"}\n </div>\n\n <div\n id=\"${listboxId}\"\n part=\"panel list\" class=\"select-listbox\"\n role=\"listbox\"\n aria-multiselectable=\"${this.multiple}\"\n aria-label=\"${accessibleName || \"Options\"}\"\n style=\"${this.panelStyle}\"\n ?data-open=\"${this.open}\"\n >\n ${!this.noSearch\n ? html`<div class=\"select-search\">\n <div class=\"search-input-wrap\">\n <rel-icon name=\"search\" size=\"${this.searchIconSize}\" class=\"icon\"></rel-icon>\n <input\n part=\"input\" class=\"search-input\"\n type=\"text\"\n placeholder=\"${this.searchPlaceholder}\"\n .value=\"${this.searchValue}\"\n @input=\"${this.onSearchInput}\"\n @keydown=\"${(e: KeyboardEvent) => this.onSearchKeyDown(e)}\"\n />\n </div>\n </div>`\n : \"\"}\n\n ${filtered.length === 0\n ? html`<div class=\"select-empty\">\n ${opts.length === 0 ? \"No options available\" : \"No matches found\"}\n </div>`\n : this.multiple\n ? html`\n <div class=\"select-all-row\">\n <rel-checkbox\n label=\"${this.selectAllLabel}\"\n status=\"${this.selectAllStatus}\"\n @rel-change=${(e: Event) => {\n e.stopPropagation();\n this.toggleSelectAll();\n }}\n ></rel-checkbox>\n </div>\n <div class=\"select-options\">\n ${repeat(\n filtered,\n (option) => option.value,\n (option, index) => html`\n <div\n id=\"${this.uniqueId}-option-${index}\"\n class=\"checkbox-option ${index === this.highlightedIndex ? \"highlighted\" : \"\"}\"\n role=\"option\"\n aria-selected=\"${this.selectedValues.includes(option.value)}\"\n @pointerenter=\"${() => (this.highlightedIndex = index)}\"\n >\n <rel-checkbox\n label=\"${option.label}\"\n icon=\"${option.icon}\"\n supportingtext=\"${option.supportingText}\"\n status=\"${this.selectedValues.includes(option.value) ? \"checked\" : \"unchecked\"}\"\n @rel-change=${(e: Event) => {\n e.stopPropagation();\n this.toggleMultiOption(option);\n }}\n ></rel-checkbox>\n </div>\n `\n )}\n </div>\n `\n : html`\n <div class=\"select-options\">\n ${repeat(\n filtered,\n (option) => option.value,\n (option, index) => html`\n <div\n id=\"${this.uniqueId}-option-${index}\"\n part=\"option\" class=\"select-option ${index === this.highlightedIndex ? \"highlighted\" : \"\"}\"\n role=\"option\"\n aria-selected=\"${option.value === this.selected}\"\n @mousedown=\"${(e: Event) => e.preventDefault()}\"\n @click=\"${() => this.selectSingleOption(option)}\"\n @pointerenter=\"${() => (this.highlightedIndex = index)}\"\n >\n <span class=\"select-option-content\">\n ${option.icon\n ? html`<rel-icon\n name=\"${option.icon}\"\n size=\"sm\"\n class=\"select-option-icon\"\n ></rel-icon>`\n : nothing}\n <span class=\"select-option-label\">${option.label}</span>\n </span>\n ${option.value === this.selected\n ? html`<rel-icon name=\"check\" size=\"sm\" class=\"select-option-check\"></rel-icon>`\n : \"\"}\n </div>\n `\n )}\n </div>\n `}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"rel-select\": RelSelect;\n }\n}\n","import { LitElement, html, css } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\n\nexport type SkeletonShape = \"line\" | \"circle\" | \"block\";\nexport type SkeletonAnimation = \"pulse\" | \"shimmer\" | \"none\";\n\n@customElement(\"rel-skeleton\")\nexport class RelSkeleton extends LitElement {\n @property({ type: String, reflect: true }) shape: SkeletonShape = \"block\";\n @property({ type: Number }) lines = 1;\n @property({ type: String }) width = \"\";\n @property({ type: String }) height = \"\";\n @property({ type: String, reflect: true }) animation: SkeletonAnimation = \"pulse\";\n @property({ type: Boolean, reflect: true }) loaded = false;\n\n protected override updated(changed: Map<string, unknown>) {\n if (changed.has(\"width\") && this.width) this.style.width = this.width;\n if (changed.has(\"height\") && this.height) this.style.height = this.height;\n }\n\n static styles = css`\n :host {\n color: var(--rel-text-default);\n display: block;\n }\n\n :host([loaded]) {\n display: none;\n }\n\n /* ── Circle: aspect-ratio keeps it square without requiring explicit height ── */\n :host([shape=\"circle\"]) {\n aspect-ratio: 1 / 1;\n }\n\n /* ── Base skeleton surface ── */\n .skeleton-shape,\n .skeleton-bar {\n background: var(--rel-skeleton-color, var(--rel-bg-neutral-elevated-3));\n border-radius: var(--rel-border-radius-xs);\n }\n\n /* ── Lines layout ── */\n .skeleton-lines {\n display: flex;\n flex-direction: column;\n gap: 8px;\n width: 100%;\n }\n\n .skeleton-bar {\n height: 14px;\n width: 100%;\n }\n\n /* Last line shortens to 65% — mimics real paragraph text that doesn't reach the edge */\n .skeleton-bar.is-last {\n width: 65%;\n }\n\n /* ── Shape (circle / block) ── */\n .skeleton-shape {\n width: 100%;\n height: 100%;\n min-height: 16px;\n }\n\n :host([shape=\"circle\"]) .skeleton-shape {\n border-radius: 50%;\n /* No min-height — circle is sized entirely by host width + aspect-ratio */\n min-height: unset;\n }\n\n /* ── Pulse animation ── */\n @keyframes rel-skeleton-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.4; }\n }\n\n :host([animation=\"pulse\"]) .skeleton-shape,\n :host([animation=\"pulse\"]) .skeleton-bar {\n animation: rel-skeleton-pulse 1.5s ease-in-out infinite;\n }\n\n /* ── Shimmer animation ── */\n @keyframes rel-skeleton-shimmer {\n 0% { background-position: 200% center; }\n 100% { background-position: -200% center; }\n }\n\n :host([animation=\"shimmer\"]) .skeleton-shape,\n :host([animation=\"shimmer\"]) .skeleton-bar {\n background: linear-gradient(\n 90deg,\n var(--rel-skeleton-color, var(--rel-bg-neutral-elevated-3)) 25%,\n var(--rel-skeleton-highlight, var(--rel-bg-neutral-elevated-2)) 50%,\n var(--rel-skeleton-color, var(--rel-bg-neutral-elevated-3)) 75%\n );\n background-size: 200% 100%;\n animation: rel-skeleton-shimmer 1.5s linear infinite;\n }\n\n /* ── Respect reduced-motion preference ── */\n @media (prefers-reduced-motion: reduce) {\n .skeleton-shape,\n .skeleton-bar {\n animation: none !important;\n }\n }\n `;\n\n render() {\n if (this.loaded) return html``;\n\n if (this.shape === \"line\") {\n const count = Math.max(1, this.lines);\n return html`\n <div class=\"skeleton-lines\">\n ${Array.from({ length: count }, (_, i) => html`\n <div part=\"base\" class=\"skeleton-bar ${i === count - 1 && count > 1 ? \"is-last\" : \"\"}\"></div>\n `)}\n </div>\n `;\n }\n\n return html`<div part=\"base\" class=\"skeleton-shape\"></div>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"rel-skeleton\": RelSkeleton;\n }\n}\n","import { LitElement, html, css } from \"lit\";\nimport { customElement, property, query } from \"lit/decorators.js\";\nimport \"@reliability-design/icons/rel-icon\";\n\nexport type ModalSide = \"top\" | \"bottom\" | \"center\";\n\n@customElement(\"rel-modal\")\nexport class RelModal extends LitElement {\n @property({ type: Boolean, reflect: true }) open = false;\n @property({ type: String }) side: ModalSide = \"bottom\";\n @property({ type: String }) title = \"\";\n @property({ type: String }) description = \"\";\n @property({ type: Boolean }) dismissible = true;\n @property({ type: Boolean }) modal = true;\n\n /**\n * Figma \"Breakpoint\" axis. responsive (default) collapses to a full-width\n * bottom sheet below 480px; web keeps the fixed desktop panel at every size.\n */\n @property({ type: String, reflect: true })\n breakpoint: \"responsive\" | \"web\" = \"responsive\";\n\n @query(\".overlay\") private overlayElement!: HTMLElement;\n\n private previousFocus: HTMLElement | null = null;\n private originalBodyOverflow = \"\";\n private originalBodyPaddingRight = \"\";\n\n static styles = css`\n :host {\n color: var(--rel-text-default);\n --modal-transition-duration: 0.3s;\n --modal-transition-timing: cubic-bezier(0.32, 0.72, 0, 1);\n }\n\n .modal-container {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 1000;\n pointer-events: none;\n /* pointer-events:none only blocks the mouse — the closed modal's\n close button and slotted content would otherwise stay in the Tab\n order and swallow keyboard focus into invisible UI. visibility\n also removes them from the tab order; the transition delays the\n flip to hidden until the close animation has played. */\n visibility: hidden;\n transition: visibility 0s linear var(--modal-transition-duration);\n }\n\n .modal-container.open {\n pointer-events: auto;\n visibility: visible;\n transition-delay: 0s;\n }\n\n .overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--rel-overlay-scrim);\n opacity: 0;\n transition: opacity var(--modal-transition-duration) var(--modal-transition-timing);\n }\n\n .modal-container.open .overlay {\n opacity: 1;\n }\n\n .overlay.no-modal {\n display: none !important;\n }\n\n .panel {\n position: absolute;\n background: var(--rel-bg-surface);\n box-shadow: var(--rel-shadows-shadow-500);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n outline: none;\n font-family: var(--rel-fonts-font-family);\n width: clamp(360px, 49vw, 708px);\n left: 50%;\n transition: transform var(--modal-transition-duration) var(--modal-transition-timing),\n opacity var(--modal-transition-duration) var(--modal-transition-timing);\n }\n\n .panel[data-side=\"bottom\"] {\n bottom: 48px;\n left: 50%;\n width: clamp(360px, 49vw, 708px);\n max-height: calc(100vh - 96px);\n border-radius: var(--rel-border-radius-sm);\n transform: translateX(-50%) translateY(calc(100% + 48px));\n }\n\n .modal-container.open .panel[data-side=\"bottom\"] {\n transform: translateX(-50%) translateY(0);\n }\n\n .panel[data-side=\"top\"] {\n top: 48px;\n left: 50%;\n width: clamp(360px, 49vw, 708px);\n max-height: calc(100vh - 96px);\n border-radius: var(--rel-border-radius-sm);\n transform: translateX(-50%) translateY(calc(-100% - 48px));\n }\n\n .modal-container.open .panel[data-side=\"top\"] {\n transform: translateX(-50%) translateY(0);\n }\n\n .panel[data-side=\"center\"] {\n top: 50%;\n left: 50%;\n width: clamp(360px, 49vw, 708px);\n max-height: calc(100vh - 96px);\n border-radius: var(--rel-border-radius-sm);\n transform: translate(-50%, -50%) scale(0.96);\n opacity: 0;\n }\n\n .modal-container.open .panel[data-side=\"center\"] {\n transform: translate(-50%, -50%) scale(1);\n opacity: 1;\n }\n\n /* Figma Breakpoint=Responsive: below 480px every side collapses to a\n full-width bottom sheet. Breakpoint=Web keeps the desktop panel. */\n @media (max-width: 480px) {\n :host([breakpoint=\"responsive\"]) .panel,\n :host([breakpoint=\"responsive\"]) .panel[data-side=\"top\"],\n :host([breakpoint=\"responsive\"]) .panel[data-side=\"center\"],\n :host([breakpoint=\"responsive\"]) .panel[data-side=\"bottom\"] {\n width: 100%;\n left: 0;\n right: 0;\n top: auto;\n bottom: 0;\n max-height: 90vh;\n border-radius: var(--rel-border-radius-md) var(--rel-border-radius-md) 0 0;\n opacity: 1;\n transform: translateY(100%);\n }\n\n :host([breakpoint=\"responsive\"]) .modal-container.open .panel,\n :host([breakpoint=\"responsive\"]) .modal-container.open .panel[data-side=\"top\"],\n :host([breakpoint=\"responsive\"]) .modal-container.open .panel[data-side=\"center\"],\n :host([breakpoint=\"responsive\"]) .modal-container.open .panel[data-side=\"bottom\"] {\n transform: translateY(0);\n }\n }\n\n .header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n padding: var(--rel-spacing-md) var(--rel-spacing-lg);\n border-bottom: var(--rel-stroke-sm) solid var(--rel-border-default);\n flex-shrink: 0;\n }\n\n .header.empty {\n display: none;\n }\n\n .header-text {\n gap: var(--rel-spacing-2xs);\n display: flex;\n flex-direction: column;\n gap: var(--rel-spacing-2xs);\n }\n\n .title {\n color: var(--rel-text-label);\n margin: 0;\n\n font-family: var(--rel-headings-lg-font-family);\n\n font-weight: var(--rel-headings-lg-font-weight);\n\n font-size: var(--rel-headings-lg-font-size);\n\n line-height: var(--rel-headings-lg-line-height);\n\n letter-spacing: var(--rel-headings-lg-letter-spacing);\n\n }\n\n .description {\n color: var(--rel-text-body);\n margin: 0;\n\n font-family: var(--rel-body-lg-regular-font-family);\n\n font-weight: var(--rel-body-lg-regular-font-weight);\n\n font-size: var(--rel-body-lg-regular-font-size);\n\n line-height: var(--rel-body-lg-regular-line-height);\n\n letter-spacing: var(--rel-body-lg-regular-letter-spacing);\n\n }\n\n /* Emphasised inline text in slotted content (Figma body-lg-medium) */\n .content ::slotted(strong),\n .content ::slotted(b) {\n font-weight: var(--rel-body-lg-medium-font-weight);\n }\n\n .close-button {\n background: transparent;\n border: none;\n cursor: pointer;\n padding: var(--rel-spacing-2xs);\n display: flex;\n align-items: center;\n justify-content: center;\n align-self: flex-start;\n flex-shrink: 0;\n border-radius: var(--rel-border-radius-xs);\n color: var(--rel-text-default);\n transition: background 0.15s ease;\n }\n\n .close-button:hover {\n background: var(--rel-bg-neutral-elevated-1);\n }\n\n .close-button:focus-visible {\n outline: 2px solid var(--rel-border-focus);\n outline-offset: 2px;\n }\n\n .content {\n flex: 1;\n overflow-y: auto;\n padding: var(--rel-spacing-xl);\n }\n\n .footer {\n display: none;\n }\n\n :host([has-footer]) .footer {\n display: flex;\n flex-shrink: 0;\n padding: var(--rel-spacing-md) var(--rel-spacing-lg);\n border-top: var(--rel-stroke-sm) solid var(--rel-border-default);\n justify-content: flex-end;\n gap: var(--rel-spacing-xs);\n }\n\n @media (prefers-reduced-motion: reduce) {\n .overlay,\n .panel {\n transition: none;\n }\n\n .modal-container .panel {\n transform: none;\n }\n\n .modal-container:not(.open) .panel {\n display: none;\n }\n }\n `;\n\n connectedCallback() {\n super.connectedCallback();\n if (this.open) {\n this.lockScroll();\n }\n this.updateComplete.then(() => {\n const footerSlot = this.shadowRoot?.querySelector(\n 'slot[name=\"footer\"]'\n ) as HTMLSlotElement | null;\n if (footerSlot) {\n const sync = () => {\n const hasContent = footerSlot.assignedElements({ flatten: true }).length > 0;\n this.toggleAttribute('has-footer', hasContent);\n };\n footerSlot.addEventListener('slotchange', sync);\n sync();\n }\n });\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.unlockScroll();\n document.removeEventListener(\"keydown\", this.handleKeydown);\n }\n\n protected willUpdate() {\n // `title` doubles as HTML's global tooltip attribute: leaving it on the\n // host shows a native tooltip anywhere over the modal, including the\n // full-viewport backdrop. Sync it into the property, then strip it.\n if (this.hasAttribute(\"title\")) {\n const value = this.getAttribute(\"title\") ?? \"\";\n this.removeAttribute(\"title\");\n this.title = value;\n }\n }\n\n updated(changed: Map<string, unknown>) {\n if (changed.has(\"open\")) {\n if (this.open) {\n this.handleOpen();\n } else {\n this.handleClose();\n }\n }\n }\n\n private handleOpen() {\n this.previousFocus = document.activeElement as HTMLElement;\n this.lockScroll();\n document.addEventListener(\"keydown\", this.handleKeydown);\n this.dispatchEvent(\n new CustomEvent(\"rel-open-change\", {\n detail: true,\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private handleClose() {\n this.unlockScroll();\n document.removeEventListener(\"keydown\", this.handleKeydown);\n if (this.previousFocus?.focus) {\n this.updateComplete.then(() => {\n this.previousFocus?.focus();\n this.previousFocus = null;\n });\n }\n this.dispatchEvent(\n new CustomEvent(\"rel-open-change\", {\n detail: false,\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private lockScroll() {\n if (typeof document === \"undefined\") return;\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\n this.originalBodyOverflow = document.body.style.overflow;\n this.originalBodyPaddingRight = document.body.style.paddingRight;\n document.body.style.overflow = \"hidden\";\n if (scrollbarWidth > 0) {\n document.body.style.paddingRight = `${scrollbarWidth}px`;\n }\n }\n\n private unlockScroll() {\n if (typeof document === \"undefined\") return;\n document.body.style.overflow = this.originalBodyOverflow;\n document.body.style.paddingRight = this.originalBodyPaddingRight;\n }\n\n private handleKeydown = (e: KeyboardEvent) => {\n if (!this.open) return;\n if (e.key === \"Escape\" && this.dismissible) {\n e.preventDefault();\n this.open = false;\n }\n };\n\n private handleOverlayClick = (e: MouseEvent) => {\n if (!this.dismissible) return;\n if (e.target === this.overlayElement) {\n this.open = false;\n }\n };\n\n private handleCloseButtonClick() {\n this.open = false;\n }\n\n render() {\n const hasTitle = !!this.title;\n const hasDescription = !!this.description;\n const showHeader = hasTitle || hasDescription || this.dismissible;\n\n return html`\n <div class=\"modal-container ${this.open ? \"open\" : \"\"}\">\n <div\n part=\"overlay\"\n class=\"overlay ${!this.modal ? 'no-modal' : ''}\"\n @click=\"${this.handleOverlayClick}\"></div>\n\n <div\n part=\"panel\"\n class=\"panel\"\n data-side=\"${this.side}\"\n role=\"${this.modal ? \"dialog\" : \"region\"}\"\n aria-modal=\"${this.modal}\"\n tabindex=\"-1\">\n\n <div part=\"header\" class=\"header ${!showHeader ? \"empty\" : \"\"}\">\n <div class=\"header-text\">\n ${hasTitle ? html`<h2 class=\"title\">${this.title}</h2>` : \"\"}\n ${hasDescription ? html`<p class=\"description\">${this.description}</p>` : \"\"}\n </div>\n ${this.dismissible\n ? html`<button\n part=\"close-button\"\n class=\"close-button\"\n @click=\"${this.handleCloseButtonClick}\"\n aria-label=\"Close\">\n <rel-icon name=\"close\" size=\"sm\"></rel-icon>\n </button>`\n : \"\"}\n </div>\n\n <div part=\"content\" class=\"content\">\n <slot></slot>\n </div>\n\n <div part=\"footer\" class=\"footer\">\n <slot name=\"footer\"></slot>\n </div>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"rel-modal\": RelModal;\n }\n}\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property, state } from \"lit/decorators.js\";\r\n\r\n/**\r\n * \"continuous\"/\"discrete\" are the legacy tick-mode values; Figma's Type axis\r\n * adds \"default\" (alias of continuous) and \"range\" (dual-thumb interval).\r\n */\r\nexport type SliderType = \"continuous\" | \"discrete\" | \"default\" | \"range\";\r\nexport type TrackStyle = \"solid\" | \"dotted\";\r\n\r\n@customElement(\"rel-slider\")\r\nexport class RelSlider extends LitElement {\r\n @property({ type: String, reflect: true }) type: SliderType = \"continuous\";\r\n\r\n /** Figma Size axis (S/M/L): scales track, thumb and ticks. */\r\n @property({ type: String, reflect: true }) size: \"sm\" | \"md\" | \"lg\" = \"md\";\r\n\r\n @property({ type: Number }) min: number = 0;\r\n\r\n @property({ type: Number }) max: number = 100;\r\n\r\n @property({ type: Number }) step: number = 1;\r\n\r\n @property({ type: Boolean }) disabled: boolean = false;\r\n\r\n @property({ type: String }) track: TrackStyle = \"solid\";\r\n\r\n @property({ type: Boolean }) showTickLabels: boolean = false;\r\n\r\n @property({ type: Boolean }) showBubble: boolean = true;\r\n\r\n @property({ type: Number }) value: number = 0;\r\n\r\n /** Upper value when type=\"range\" (attribute value-end). */\r\n @property({ type: Number, attribute: \"value-end\" }) valueEnd: number = 100;\r\n\r\n @state() private ticks: number[] = [];\r\n\r\n private _onChange: (value: number) => void = () => {};\r\n private _onTouched: () => void = () => {};\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n --track-height: 8px;\r\n --thumb-size: 20px;\r\n --thumb-stroke: 7px;\r\n --thumb-halo-color: var(--rel-border-default);\r\n --tick-size: 4px;\r\n --shadow: 0 2px 4px rgba(0, 0, 0, 0.25);\r\n --halo: 0 2px 0 var(--rel-bg-neutral-elevated-1), 0 6px 10px rgba(0, 0, 0, 0.07);\r\n --marker-width: 24px;\r\n --marker-height: 28px;\r\n\r\n display: block;\r\n font-family: var(--rel-label-md-font-family);\r\n font-weight: var(--rel-label-md-font-weight);\r\n font-size: var(--rel-label-md-font-size);\r\n line-height: var(--rel-label-md-line-height);\r\n letter-spacing: var(--rel-label-md-letter-spacing);\r\n }\r\n\r\n /* Figma Size axis: S = 6px track / 16px thumb · M = 8/20 · L = 10/24 */\r\n :host([size=\"sm\"]) {\r\n --track-height: 6px;\r\n --thumb-size: 16px;\r\n --tick-size: 4px;\r\n }\r\n\r\n :host([size=\"md\"]) {\r\n --track-height: 8px;\r\n --thumb-size: 20px;\r\n --tick-size: 5px;\r\n }\r\n\r\n :host([size=\"lg\"]) {\r\n --track-height: 10px;\r\n --thumb-size: 24px;\r\n --tick-size: 6px;\r\n }\r\n\r\n .rel-slider {\r\n position: relative;\r\n width: 100%;\r\n height: 60px;\r\n user-select: none;\r\n }\r\n\r\n /* Track */\r\n .track {\r\n position: absolute;\r\n top: 50%;\r\n left: 0;\r\n width: 100%;\r\n height: var(--track-height);\r\n background: var(--rel-bg-neutral-elevated-3);\r\n border-radius: 2px;\r\n transform: translateY(-50%);\r\n pointer-events: none;\r\n }\r\n\r\n .track-active {\r\n position: absolute;\r\n top: 50%;\r\n left: 0;\r\n height: var(--track-height);\r\n background: var(--rel-text-default);\r\n border-radius: 2px;\r\n transform: translateY(-50%);\r\n pointer-events: none;\r\n }\r\n\r\n .track-active.dotted {\r\n background: radial-gradient(\r\n circle,\r\n var(--rel-text-default) 0 2px,\r\n transparent 2px\r\n ) 0 50%/var(--rel-spacing-sm) 5px repeat-x;\r\n }\r\n\r\n /* Range mode: pointer interaction is handled by the container so each\r\n thumb can be grabbed; the native inputs stay for keyboard/AT. */\r\n .rel-slider.range .slider-input {\r\n pointer-events: none;\r\n }\r\n\r\n .rel-slider.range {\r\n touch-action: none;\r\n }\r\n\r\n /* Input */\r\n .slider-input {\r\n -webkit-appearance: none;\r\n appearance: none;\r\n position: absolute;\r\n top: 0;\r\n width: 100%;\r\n left: 0;\r\n height: 100%;\r\n background: transparent;\r\n outline: none;\r\n cursor: pointer;\r\n z-index: 2;\r\n margin: 0;\r\n padding: 0;\r\n }\r\n\r\n .slider-input::-webkit-slider-runnable-track {\r\n background: transparent;\r\n height: 100%;\r\n border: none;\r\n }\r\n\r\n .slider-input::-moz-range-track {\r\n background: transparent;\r\n height: 100%;\r\n border: none;\r\n }\r\n\r\n .slider-input::slider-track {\r\n background: transparent;\r\n height: 100%;\r\n border: none;\r\n }\r\n\r\n /* Hide native thumb */\r\n .slider-input::-webkit-slider-thumb {\r\n -webkit-appearance: none;\r\n appearance: none;\r\n width: 1px;\r\n height: 1px;\r\n background: transparent;\r\n border: none;\r\n cursor: pointer;\r\n }\r\n\r\n .slider-input::-moz-range-thumb {\r\n width: 1px;\r\n height: 1px;\r\n background: transparent;\r\n border: none;\r\n cursor: pointer;\r\n }\r\n\r\n .slider-input::slider-thumb {\r\n width: 1px;\r\n height: 1px;\r\n background: transparent;\r\n border: none;\r\n cursor: pointer;\r\n }\r\n\r\n .slider-input:focus-visible ~ .thumb-container .custom-thumb {\r\n box-shadow: 0 0 0 var(--thumb-stroke) var(--thumb-halo-color),\r\n var(--shadow), var(--halo);\r\n }\r\n\r\n @media (prefers-reduced-motion: reduce) {\r\n .custom-thumb,\r\n .tick {\r\n transition: none;\r\n }\r\n }\r\n\r\n /* Custom Thumb Container */\r\n .thumb-container {\r\n position: absolute;\r\n left: 0;\r\n top: 50%;\r\n transform: translate(-50%, calc(-100% + var(--thumb-size) / 2));\r\n pointer-events: none;\r\n z-index: 5;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n gap: 0;\r\n }\r\n\r\n /* Value Marker */\r\n .value-marker {\r\n width: var(--marker-width);\r\n height: var(--marker-height);\r\n margin-bottom: var(--rel-spacing-3xs);\r\n }\r\n\r\n .value-marker text {\r\n font-family: var(--rel-label-sm-font-family);\r\n font-weight: var(--rel-label-sm-font-weight);\r\n font-size: var(--rel-label-sm-font-size);\r\n line-height: var(--rel-label-sm-line-height);\r\n }\r\n\r\n .value-marker svg {\r\n width: 100%;\r\n height: 100%;\r\n display: block;\r\n }\r\n\r\n /* Custom Thumb */\r\n .custom-thumb {\r\n width: var(--thumb-size);\r\n height: var(--thumb-size);\r\n background: var(--rel-border-strong);\r\n border-radius: 50%;\r\n transition: box-shadow 0.15s ease;\r\n }\r\n\r\n .slider-input:hover:not(:disabled) ~ .thumb-container .custom-thumb {\r\n box-shadow: 0 0 0 var(--thumb-stroke) var(--rel-action-overlay-hover),\r\n var(--shadow), var(--halo);\r\n }\r\n\r\n .slider-input:active ~ .thumb-container .custom-thumb {\r\n box-shadow: 0 0 0 var(--thumb-stroke) var(--rel-action-overlay-pressed),\r\n var(--shadow), var(--halo);\r\n }\r\n\r\n /* Ticks */\r\n .ticks {\r\n position: absolute;\r\n top: 50%;\r\n left: 0;\r\n width: 100%;\r\n transform: translateY(-50%);\r\n pointer-events: none;\r\n }\r\n\r\n .tick {\r\n position: absolute;\r\n width: var(--tick-size);\r\n height: var(--tick-size);\r\n background: var(--rel-text-default);\r\n border-radius: 50%;\r\n transform: translate(-50%, -50%);\r\n transition: background 0.2s;\r\n z-index: 3;\r\n }\r\n\r\n .tick.active {\r\n background: var(--rel-bg-neutral);\r\n }\r\n\r\n /* Tick labels */\r\n .tick-labels {\r\n position: absolute;\r\n top: calc(50% + var(--tick-size) + var(--rel-spacing-2xs));\r\n left: 0;\r\n width: 100%;\r\n color: var(--rel-text-label);\r\n pointer-events: none;\r\n font-family: var(--rel-label-xs-font-family);\r\n font-weight: var(--rel-label-xs-font-weight);\r\n font-size: var(--rel-label-xs-font-size);\r\n line-height: var(--rel-label-xs-line-height);\r\n letter-spacing: var(--rel-label-xs-letter-spacing);\r\n }\r\n\r\n .tick-label {\r\n position: absolute;\r\n transform: translateX(-50%);\r\n }\r\n\r\n /* Disabled State */\r\n .rel-slider.disabled .track {\r\n background: var(--rel-border-default);\r\n }\r\n\r\n .rel-slider.disabled .track-active {\r\n background: var(--rel-text-placeholder);\r\n }\r\n\r\n .rel-slider.disabled .track-active.dotted {\r\n background: radial-gradient(\r\n circle,\r\n var(--rel-bg-neutral-elevated-1) 0 1px,\r\n transparent 1px\r\n )\r\n center/var(--rel-spacing-sm) 4px repeat-x,\r\n var(--rel-text-placeholder);\r\n }\r\n\r\n .rel-slider.disabled .tick {\r\n background: var(--rel-text-placeholder);\r\n }\r\n\r\n .rel-slider.disabled .tick-label {\r\n color: var(--rel-text-placeholder);\r\n }\r\n\r\n .rel-slider.disabled .slider-input {\r\n cursor: not-allowed;\r\n }\r\n\r\n .rel-slider.disabled .custom-thumb {\r\n background: var(--rel-text-placeholder);\r\n box-shadow: none;\r\n }\r\n\r\n .rel-slider.disabled .slider-input:active ~ .thumb-container .custom-thumb,\r\n .rel-slider.disabled .slider-input:focus-visible ~ .thumb-container .custom-thumb {\r\n box-shadow: none;\r\n }\r\n\r\n .rel-slider.disabled .value-marker svg path {\r\n fill: var(--rel-text-placeholder);\r\n }\r\n\r\n /* Dark mode overrides */\r\n :host-context([data-theme=\"dark\"]),\r\n :host-context(.dark) {\r\n --thumb-halo-color: var(--rel-border-default);\r\n --halo: 0 2px 0 var(--rel-bg-neutral-elevated-2),\r\n 0 6px 10px rgba(0, 0, 0, 0.3);\r\n }\r\n\r\n `;\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n this.setupTicks();\r\n }\r\n\r\n updated(changedProperties: Map<string, any>) {\r\n if (\r\n changedProperties.has(\"type\") ||\r\n changedProperties.has(\"min\") ||\r\n changedProperties.has(\"max\") ||\r\n changedProperties.has(\"step\")\r\n ) {\r\n this.setupTicks();\r\n }\r\n if (\r\n changedProperties.has(\"value\") ||\r\n changedProperties.has(\"valueEnd\") ||\r\n changedProperties.has(\"type\")\r\n ) {\r\n this.updateActiveWidth();\r\n }\r\n }\r\n\r\n private get isRange(): boolean {\r\n return this.type === \"range\";\r\n }\r\n\r\n private get percentage(): number {\r\n if (this.max === this.min) return 0;\r\n return ((this.value - this.min) / (this.max - this.min)) * 100;\r\n }\r\n\r\n private get percentageEnd(): number {\r\n if (this.max === this.min) return 0;\r\n return ((this.valueEnd - this.min) / (this.max - this.min)) * 100;\r\n }\r\n\r\n private dragThumb: \"start\" | \"end\" | null = null;\r\n\r\n private valueFromPointer(e: PointerEvent): number {\r\n const el = this.shadowRoot?.querySelector(\".rel-slider\") as HTMLElement;\r\n if (!el) return this.min;\r\n const rect = el.getBoundingClientRect();\r\n const pct = Math.min(1, Math.max(0, (e.clientX - rect.left) / rect.width));\r\n let v = this.min + pct * (this.max - this.min);\r\n v = Math.round(v / this.step) * this.step;\r\n return Math.min(this.max, Math.max(this.min, v));\r\n }\r\n\r\n private onRangePointerDown(e: PointerEvent) {\r\n if (!this.isRange || this.disabled) return;\r\n const v = this.valueFromPointer(e);\r\n this.dragThumb =\r\n Math.abs(v - this.value) <= Math.abs(v - this.valueEnd) ? \"start\" : \"end\";\r\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\r\n this.applyRangeValue(v);\r\n }\r\n\r\n private onRangePointerMove(e: PointerEvent) {\r\n if (!this.dragThumb) return;\r\n this.applyRangeValue(this.valueFromPointer(e));\r\n }\r\n\r\n private onRangePointerUp() {\r\n this.dragThumb = null;\r\n }\r\n\r\n private applyRangeValue(v: number) {\r\n if (this.dragThumb === \"start\") {\r\n this.value = Math.min(v, this.valueEnd);\r\n } else if (this.dragThumb === \"end\") {\r\n this.valueEnd = Math.max(v, this.value);\r\n }\r\n this.updateActiveWidth();\r\n this.emitRangeChange();\r\n }\r\n\r\n private emitRangeChange() {\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-change\", {\r\n detail: { value: this.value, valueEnd: this.valueEnd },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n this._onChange(this.value);\r\n }\r\n\r\n private onRangeInputStart(ev: Event) {\r\n const next = Number((ev.target as HTMLInputElement).value);\r\n this.value = Math.min(next, this.valueEnd);\r\n this.updateActiveWidth();\r\n this.emitRangeChange();\r\n }\r\n\r\n private onRangeInputEnd(ev: Event) {\r\n const next = Number((ev.target as HTMLInputElement).value);\r\n this.valueEnd = Math.max(next, this.value);\r\n this.updateActiveWidth();\r\n this.emitRangeChange();\r\n }\r\n\r\n private setupTicks() {\r\n if (this.type !== \"discrete\") {\r\n this.ticks = [];\r\n return;\r\n }\r\n\r\n const step = Math.max(1, this.step);\r\n const ticks: number[] = [];\r\n for (let v = this.min; v <= this.max; v += step) {\r\n ticks.push(v);\r\n }\r\n if (ticks[ticks.length - 1] !== this.max) {\r\n ticks.push(this.max);\r\n }\r\n this.ticks = ticks;\r\n }\r\n\r\n private getTickLeftPct(tick: number): number {\r\n const pct = ((tick - this.min) / (this.max - this.min)) * 100;\r\n return Math.round(pct * 1000) / 1000;\r\n }\r\n\r\n private isTickActive(tick: number): boolean {\r\n return tick <= this.value;\r\n }\r\n\r\n private onInput(ev: Event) {\r\n const el = ev.target as HTMLInputElement;\r\n let next = Number(el.value);\r\n\r\n if (this.type === \"discrete\") {\r\n const snapped =\r\n Math.round((next - this.min) / this.step) * this.step + this.min;\r\n next = Math.min(this.max, Math.max(this.min, snapped));\r\n el.value = String(next);\r\n }\r\n\r\n this.value = next;\r\n this.updateActiveWidth();\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-change\", {\r\n detail: { value: this.value },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n this._onChange(this.value);\r\n }\r\n\r\n registerOnChange(fn: (value: number) => void): void { this._onChange = fn; }\r\n registerOnTouched(fn: () => void): void { this._onTouched = fn; }\r\n writeValue(value: number): void { this.value = value; }\r\n\r\n private updateActiveWidth() {\r\n const activeEl = this.shadowRoot?.querySelector(\".track-active\") as HTMLDivElement;\r\n if (!activeEl) return;\r\n\r\n if (this.isRange) {\r\n activeEl.style.left = `${this.percentage}%`;\r\n activeEl.style.width = `${Math.max(0, this.percentageEnd - this.percentage)}%`;\r\n } else if (this.type === \"discrete\") {\r\n const stepPercent = (this.step / (this.max - this.min)) * 100;\r\n const snappedPct = Math.round(this.percentage / stepPercent) * stepPercent;\r\n activeEl.style.width = `${snappedPct}%`;\r\n } else {\r\n activeEl.style.width = `${this.percentage}%`;\r\n }\r\n }\r\n\r\n private renderThumbContainer(pct: number = this.percentage, val: number = this.value) {\r\n return html`\r\n <div class=\"thumb-container\" style=\"left: ${pct}%\">\r\n ${this.showBubble ? html`\r\n <div class=\"value-marker\">\r\n <svg viewBox=\"0 0 24 32\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M12 0C18.6274 0 24 5.37258 24 12C24 21 12 32 12 32C12 32 0 21 0 12C0 5.37258 5.37258 0 12 0Z\"\r\n fill=\"var(--rel-bg-neutral-inverse-2)\" />\r\n <text\r\n x=\"12\"\r\n y=\"16\"\r\n text-anchor=\"middle\"\r\n fill=\"var(--rel-text-inverse)\"\r\n font-size=\"12\"\r\n font-family=\"Poppins\"\r\n font-weight=\"600\">\r\n ${val}\r\n </text>\r\n </svg>\r\n </div>\r\n ` : \"\"}\r\n <div part=\"thumb\" class=\"custom-thumb\"></div>\r\n </div>\r\n `;\r\n }\r\n\r\n private renderTicks() {\r\n if (this.type !== \"discrete\") return \"\";\r\n\r\n return html`\r\n <div class=\"ticks\">\r\n ${this.ticks.map(\r\n (tick) => html`\r\n <div\r\n class=\"tick ${this.isTickActive(tick) ? \"active\" : \"\"}\"\r\n style=\"left: ${this.getTickLeftPct(tick)}%\"></div>\r\n `\r\n )}\r\n </div>\r\n `;\r\n }\r\n\r\n private renderTickLabels() {\r\n if (this.type !== \"discrete\" || !this.showTickLabels) return \"\";\r\n\r\n return html`\r\n <div class=\"tick-labels\">\r\n ${this.ticks.map(\r\n (tick) => html`\r\n <div\r\n class=\"tick-label\"\r\n style=\"left: ${this.getTickLeftPct(tick)}%\">\r\n ${tick}\r\n </div>\r\n `\r\n )}\r\n </div>\r\n `;\r\n }\r\n\r\n render() {\r\n const sliderClasses = [\r\n \"rel-slider\",\r\n this.disabled ? \"disabled\" : \"\",\r\n this.type === \"discrete\" ? \"has-ticks\" : \"\",\r\n this.isRange ? \"range\" : \"\",\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n const trackActiveClasses = [\r\n \"track-active\",\r\n this.track === \"dotted\" ? \"dotted\" : \"\",\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n if (this.isRange) {\r\n return html`\r\n <div\r\n class=\"${sliderClasses}\"\r\n @pointerdown=\"${this.onRangePointerDown}\"\r\n @pointermove=\"${this.onRangePointerMove}\"\r\n @pointerup=\"${this.onRangePointerUp}\"\r\n @pointercancel=\"${this.onRangePointerUp}\"\r\n >\r\n <div part=\"track\" class=\"track\"></div>\r\n <div class=\"${trackActiveClasses}\"></div>\r\n\r\n <input\r\n class=\"slider-input\"\r\n type=\"range\"\r\n aria-label=\"Range start\"\r\n .min=\"${String(this.min)}\"\r\n .max=\"${String(this.max)}\"\r\n .step=\"${String(this.step)}\"\r\n .value=\"${String(this.value)}\"\r\n ?disabled=\"${this.disabled}\"\r\n @input=\"${this.onRangeInputStart}\"\r\n @blur=\"${() => this._onTouched()}\" />\r\n <input\r\n class=\"slider-input\"\r\n type=\"range\"\r\n aria-label=\"Range end\"\r\n .min=\"${String(this.min)}\"\r\n .max=\"${String(this.max)}\"\r\n .step=\"${String(this.step)}\"\r\n .value=\"${String(this.valueEnd)}\"\r\n ?disabled=\"${this.disabled}\"\r\n @input=\"${this.onRangeInputEnd}\"\r\n @blur=\"${() => this._onTouched()}\" />\r\n\r\n ${this.renderThumbContainer(this.percentage, this.value)}\r\n ${this.renderThumbContainer(this.percentageEnd, this.valueEnd)}\r\n </div>\r\n `;\r\n }\r\n\r\n return html`\r\n <div class=\"${sliderClasses}\">\r\n <div part=\"track\" class=\"track\"></div>\r\n <div class=\"${trackActiveClasses}\"></div>\r\n\r\n <input\r\n class=\"slider-input\"\r\n type=\"range\"\r\n .min=\"${String(this.min)}\"\r\n .max=\"${String(this.max)}\"\r\n .step=\"${this.type === 'discrete' ? String(this.step) : '1'}\"\r\n .value=\"${String(this.value)}\"\r\n ?disabled=\"${this.disabled}\"\r\n @input=\"${this.onInput}\"\r\n @blur=\"${() => this._onTouched()}\" />\r\n\r\n ${this.renderThumbContainer()}\r\n ${this.renderTicks()}\r\n ${this.renderTickLabels()}\r\n </div>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property, state } from \"lit/decorators.js\";\r\nimport \"@reliability-design/icons/rel-icon\";\r\n\r\nexport type SnackbarLines = \"single\" | \"double\";\r\nexport type SnackbarType = \"default\" | \"success\" | \"error\" | \"warning\";\r\n\r\n@customElement(\"rel-snackbar\")\r\nexport class RelSnackbar extends LitElement {\r\n @property({ type: String }) message: string = \"This is a snackbar message\";\r\n\r\n @property({ type: String }) action?: string;\r\n\r\n @property({ type: Boolean }) longerAction: boolean = false;\r\n\r\n @property({ type: Boolean }) iconClose: boolean = true;\r\n\r\n @property({ type: String }) lines: SnackbarLines = \"single\";\r\n\r\n @property({ type: Number }) duration: number = 4000;\r\n\r\n @property({ type: String }) type: SnackbarType = \"default\";\r\n @property({ type: Boolean, reflect: true }) show = false;\r\n\r\n @state() private visible: boolean = false;\r\n\r\n private _dismissTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n display: block;\r\n font-family: var(--rel-fonts-font-family);\r\n }\r\n\r\n .snackbar {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n min-width: 280px;\r\n max-width: 500px;\r\n margin: 0;\r\n padding: var(--rel-spacing-sm) var(--rel-spacing-md) var(--rel-spacing-sm) var(--rel-spacing-xs);\r\n border-radius: var(--rel-border-radius-sm);\r\n background-color: var(--rel-bg-static-dark);\r\n color: var(--rel-text-static-light);\r\n font-family: var(--rel-fonts-font-family);\r\n box-shadow: var(--rel-shadows-shadow-300);\r\n animation: slide-up 0.3s ease-out;\r\n border-left: 4px solid transparent;\r\n }\r\n\r\n .snackbar.two-line {\r\n flex-direction: column;\r\n align-items: stretch;\r\n }\r\n\r\n .snackbar.hidden {\r\n display: none;\r\n }\r\n\r\n /* Type variants — border accent using semantic DS tokens */\r\n /* Status fills stay vivid on the always-dark snackbar surface */\r\n .snackbar.type-success {\r\n border-left-color: var(--rel-bg-success);\r\n }\r\n\r\n .snackbar.type-error {\r\n border-left-color: var(--rel-bg-danger);\r\n }\r\n\r\n .snackbar.type-warning {\r\n border-left-color: var(--rel-bg-warning);\r\n }\r\n\r\n /* Icon color matches type accent */\r\n .snackbar.type-success .snackbar-icon {\r\n color: var(--rel-bg-success);\r\n }\r\n\r\n .snackbar.type-error .snackbar-icon {\r\n color: var(--rel-bg-danger);\r\n }\r\n\r\n .snackbar.type-warning .snackbar-icon {\r\n color: var(--rel-bg-warning);\r\n }\r\n\r\n .snackbar-icon {\r\n display: flex;\r\n align-items: center;\r\n margin-right: 10px;\r\n flex-shrink: 0;\r\n }\r\n\r\n .snackbar-body {\r\n display: flex;\r\n align-items: center;\r\n flex: 1;\r\n min-width: 0;\r\n }\r\n\r\n .snackbar-message {\r\r\r\n margin-right: var(--rel-spacing-sm);\r\n flex: 1;\n\r\n font-family: var(--rel-body-md-regular-font-family);\n\r\n font-weight: var(--rel-body-md-regular-font-weight);\n\r\n font-size: var(--rel-body-md-regular-font-size);\n\r\n line-height: var(--rel-body-md-regular-line-height);\n\r\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\n\r\n }\r\n\r\n .snackbar.two-line .snackbar-message {\r\n margin-right: 0;\r\n margin-bottom: 8px;\r\n flex: none;\r\n }\r\n\r\n .snackbar-actions {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-2xs);\r\n flex-shrink: 0;\r\n align-self: center;\r\n }\r\n\r\n .snackbar.two-line .snackbar-actions {\r\n align-self: flex-end;\r\n }\r\n\r\n .snackbar-action {\r\n background: none;\r\n border: none;\r\n color: var(--rel-text-static-light);\r\r\r\r\n cursor: pointer;\r\n padding: 0;\r\n display: flex;\r\n align-items: center;\r\n transition: opacity 0.2s ease;\n font-family: var(--rel-action-md-font-family);\n font-weight: var(--rel-action-md-font-weight);\n font-size: var(--rel-action-md-font-size);\n line-height: var(--rel-action-md-line-height);\n letter-spacing: var(--rel-action-md-letter-spacing);\n }\r\n\r\n .snackbar-action:hover {\r\n opacity: 0.8;\r\n }\r\n\r\n .snackbar-action:active {\r\n opacity: 0.6;\r\n }\r\n\r\n .snackbar-action:focus-visible {\r\n outline: 2px solid var(--rel-text-static-light);\r\n outline-offset: 2px;\r\n border-radius: var(--rel-border-radius-xs);\r\n }\r\n\r\n .snackbar-close {\r\n background: none;\r\n border: none;\r\n color: var(--rel-action-neutral-label-icons-fill-inverse);\r\n cursor: pointer;\r\n padding: 0;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n transition: opacity 0.2s ease;\r\n }\r\n\r\n .snackbar-close:hover {\r\n opacity: 0.8;\r\n }\r\n\r\n .snackbar-close:active {\r\n opacity: 0.6;\r\n }\r\n\r\n .snackbar-close:focus-visible {\r\n outline: 2px solid var(--rel-text-static-light);\r\n outline-offset: 2px;\r\n border-radius: var(--rel-border-radius-xs);\r\n }\r\n\r\n /* Prevent any inherited transform from firing on button click */\r\n .snackbar button:active {\r\n transform: none;\r\n }\r\n\r\n @media (prefers-reduced-motion: reduce) {\r\n .snackbar {\r\n animation: none;\r\n }\r\n }\r\n\r\n @keyframes slide-up {\r\n from {\r\n transform: translateY(50px);\r\n opacity: 0;\r\n }\r\n to {\r\n transform: translateY(0);\r\n opacity: 1;\r\n }\r\n }\r\n `;\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n }\r\n\r\n willUpdate(changed: Map<string, unknown>) {\r\n if (!changed.has('show')) return;\r\n if (this.show) {\r\n this.visible = true;\r\n this.setAutoDismiss();\r\n } else {\r\n this.visible = false;\r\n this.clearDismissTimer();\r\n }\r\n }\r\n\r\n updated(changed: Map<string, unknown>) {\r\n if ((changed.has(\"duration\") || changed.has(\"longerAction\")) && this.show) {\r\n this.setAutoDismiss();\r\n }\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback();\r\n this.clearDismissTimer();\r\n }\r\n\r\n private setAutoDismiss() {\r\n if (this.duration > 0) {\r\n this.clearDismissTimer();\r\n const delay = this.longerAction ? this.duration * 2 : this.duration;\r\n this._dismissTimer = setTimeout(() => this.dismiss(), delay);\r\n }\r\n }\r\n\r\n private clearDismissTimer() {\r\n if (this._dismissTimer !== null) {\r\n clearTimeout(this._dismissTimer);\r\n this._dismissTimer = null;\r\n }\r\n }\r\n\r\n private onActionClick() {\r\n this.dispatchEvent(\r\n new CustomEvent(\"actionClick\", {\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n this.dismiss();\r\n }\r\n\r\n private dismiss() {\r\n this.show = false;\r\n this.visible = false;\r\n this.dispatchEvent(\r\n new CustomEvent(\"close\", {\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private renderIcon() {\r\n const iconMap: Record<string, string> = {\r\n success: \"check-circle\",\r\n error: \"error\",\r\n warning: \"warning\",\r\n };\r\n const name = iconMap[this.type];\r\n if (!name) return html``;\r\n return html`<rel-icon name=\"${name}\" size=\"lg\" class=\"snackbar-icon\"></rel-icon>`;\r\n }\r\n\r\n render() {\r\n const snackbarClasses = [\r\n \"snackbar\",\r\n this.lines === \"double\" ? \"two-line\" : \"\",\r\n !this.visible ? \"hidden\" : \"\",\r\n this.type !== \"default\" ? `type-${this.type}` : \"\",\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return html`\r\n <div class=\"${snackbarClasses}\">\r\n <div class=\"snackbar-body\">\r\n ${this.type !== \"default\" ? this.renderIcon() : \"\"}\r\n <div part=\"label\" class=\"snackbar-message\">${this.message}</div>\r\n </div>\r\n\r\n <div class=\"snackbar-actions\">\r\n ${this.action\r\n ? html`\r\n <button part=\"action\" class=\"snackbar-action\" @click=\"${this.onActionClick}\">\r\n ${this.action}\r\n </button>\r\n `\r\n : \"\"}\r\n ${this.iconClose\r\n ? html`\r\n <button part=\"close-button\" class=\"snackbar-close\" @click=\"${this.dismiss}\">\r\n <rel-icon name=\"close\" size=\"md\"></rel-icon>\r\n </button>\r\n `\r\n : \"\"}\r\n </div>\r\n </div>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\r\nexport type StepStatus = \"done\" | \"progress\" | \"disabled\";\r\nexport type TextAlign = \"right\" | \"below\";\r\nexport type Orientation = \"horizontal\" | \"vertical\";\r\nexport type StepperSize = \"small\" | \"large\";\r\n/** Figma \"Type\": indicator content — default (number, check when done), dot, number, icon. */\r\nexport type StepperType = \"default\" | \"dot\" | \"number\" | \"icon\";\r\n/** Figma \"Typel\": label placement relative to the indicator. */\r\nexport type LabelPlacement = \"top\" | \"centered\" | \"inverted\";\r\n\r\nexport interface Step {\r\n title: string;\r\n status: StepStatus;\r\n}\r\n\r\n@customElement(\"rel-stepper\")\r\nexport class RelStepper extends LitElement {\r\n @property({ type: Array }) steps: Step[] = [];\r\n\r\n @property({ type: String }) textAlign: TextAlign = \"below\";\r\n\r\n @property({ type: String }) orientation: Orientation = \"horizontal\";\r\n\r\n @property({ type: String }) size: StepperSize = \"large\";\r\n\r\n @property({ type: String, reflect: true }) type: StepperType = \"default\";\r\n\r\n /**\r\n * Figma Typel axis: top = label top-aligned beside the indicator,\r\n * centered = label vertically centered beside it, inverted = indicator above\r\n * the label. When unset, the legacy textAlign prop drives the layout\r\n * (below ≈ inverted, right ≈ centered). Note Figma marks Top+Horizontal\r\n * as an unsupported combination.\r\n */\r\n @property({ type: String, reflect: true, attribute: \"label-placement\" })\r\n labelPlacement?: LabelPlacement;\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n display: block;\r\n font-family: var(--rel-fonts-font-family);\r\n }\r\n\r\n /********************************************\r\n * Base Stepper Styles\r\n ********************************************/\r\n .rel-stepper {\r\n display: flex;\r\n font-family: var(--rel-fonts-font-family);\r\n width: 100%;\r\n position: relative;\r\n }\r\n\r\n /* Orientation */\r\n .rel-stepper.horizontal {\r\n flex-direction: row;\r\n align-items: flex-start;\r\n justify-content: center;\r\n }\r\n\r\n .rel-stepper.vertical.text-below {\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: start;\r\n }\r\n\r\n .rel-stepper.vertical.text-right {\r\n flex-direction: column;\r\n align-items: flex-start;\r\n justify-content: start;\r\n }\r\n\r\n /********************************************\r\n * Step Container\r\n ********************************************/\r\n .rel-step {\r\n display: flex;\r\n position: relative;\r\n }\r\n\r\n .rel-stepper.horizontal.text-below .rel-step {\r\n flex-direction: column;\r\n align-items: center;\r\n text-align: center;\r\n position: relative;\r\n flex: 0;\r\n }\r\n\r\n .rel-stepper.horizontal.text-right .rel-step {\r\n flex-direction: row;\r\n align-items: center;\r\n position: relative;\r\n flex: 0;\r\n gap: var(--rel-spacing-2xs);\r\n }\r\n\r\n /* Vertical layout variants */\r\n .rel-stepper.vertical.text-below .rel-step {\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: start;\r\n position: relative;\r\n }\r\n\r\n .rel-stepper.vertical.text-right .rel-step {\r\n flex-direction: row;\r\n align-items: flex-start;\r\n justify-content: center;\r\n position: relative;\r\n gap: var(--rel-spacing-2xs);\r\n }\r\n\r\n /* Wrapper for indicator and connector */\r\n .indicator-wrapper {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n position: relative;\r\n }\r\n\r\n /* Wrapper for indicator and label (text-below only) */\r\n .step-content {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-2xs);\r\n }\r\n\r\n .text-below-content {\r\n flex-direction: column;\r\n }\r\n\r\n .text-right-content {\r\n flex-direction: row;\r\n }\r\n\r\n /********************************************\r\n * Indicator\r\n ********************************************/\r\n .indicator {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: var(--rel-stepper-indicator-size, 22px);\r\n height: var(--rel-stepper-indicator-size, 22px);\r\n border: 2px solid var(--rel-bg-neutral-elevated-2);\r\n background: var(--rel-bg-neutral);\r\n border-radius: 50%;\r\n position: relative;\r\n z-index: 2;\r\n transition: background 0.2s ease, border-color 0.2s ease, color 0.2s ease;\r\n flex-shrink: 0;\r\n font-family: var(--rel-body-sm-semibold-font-family);\r\n font-weight: var(--rel-body-sm-semibold-font-weight);\r\n font-size: var(--rel-body-sm-semibold-font-size);\r\n line-height: var(--rel-body-sm-semibold-line-height);\r\n letter-spacing: var(--rel-body-sm-semibold-letter-spacing);\r\n }\r\n\r\n .indicator svg {\r\n width: 12px;\r\n height: auto;\r\n display: block;\r\n }\r\n\r\n /* Figma Type=Dot: bare dot indicator, no number/icon */\r\n :host([type=\"dot\"]) .indicator {\r\n width: 12px;\r\n height: 12px;\r\n }\r\n\r\n :host([type=\"dot\"]) .rel-step.done .indicator,\r\n :host([type=\"dot\"]) .rel-step.progress .indicator {\r\n background: var(--rel-bg-neutral-inverse-2);\r\n border-color: var(--rel-bg-neutral-inverse-2);\r\n }\r\n\r\n /* Figma Typel=Top: label top-aligned against the indicator */\r\n .rel-stepper.label-top .rel-step {\r\n align-items: flex-start;\r\n }\r\n\r\n /********************************************\r\n * Labels\r\n ********************************************/\r\n .step-label {\r\n white-space: nowrap;\r\n color: var(--rel-text-body);\r\n font-family: var(--rel-body-md-regular-font-family);\r\n font-weight: var(--rel-body-md-regular-font-weight);\r\n font-size: var(--rel-body-md-regular-font-size);\r\n line-height: var(--rel-body-md-regular-line-height);\r\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\r\n }\r\n\r\n /* Horizontal text-below specific */\r\n .rel-stepper.vertical .rel-step {\r\n column-gap: var(--rel-spacing-sm);\r\n }\r\n\r\n .rel-stepper.small .step-label {\r\n font-family: var(--rel-body-sm-regular-font-family);\r\n font-weight: var(--rel-body-sm-regular-font-weight);\r\n font-size: var(--rel-body-sm-regular-font-size);\r\n line-height: var(--rel-body-sm-regular-line-height);\r\n letter-spacing: var(--rel-body-sm-regular-letter-spacing);\r\n }\r\n\r\n .rel-step.disabled .indicator {\r\n color: var(--rel-text-caption);\r\n }\r\n\r\n .rel-stepper.horizontal.text-below .step-label {\r\n margin-top: var(--rel-spacing-2xs);\r\n text-align: center;\r\n }\r\n\r\n /* Horizontal text-right specific */\r\n .rel-stepper.horizontal.text-right .step-label {\r\n margin-top: 0;\r\n margin-left: 0;\r\n margin-right: var(--rel-spacing-xs);\r\n text-align: left;\r\n }\r\n\r\n /* Vertical text-right specific */\r\n .rel-stepper.vertical.text-right .step-label {\r\n margin-top: 0;\r\n margin-left: 0;\r\n text-align: left;\r\n }\r\n\r\n /* Vertical text-below specific */\r\n .rel-stepper.vertical.text-below .step-label {\r\n margin-top: 0;\r\n margin-left: 0;\r\n text-align: center;\r\n }\r\n\r\n /********************************************\r\n * Connector Lines\r\n ********************************************/\r\n .connector {\r\n position: absolute;\r\n background: var(--rel-border-default);\r\n z-index: 1;\r\n }\r\n\r\n /* Horizontal connector */\r\n .rel-stepper.horizontal .connector {\r\n top: 50%;\r\n left: 100%;\r\n transform: translateY(-50%);\r\n height: 2px;\r\n position: absolute;\r\n background: var(--rel-border-default);\r\n }\r\n\r\n .rel-stepper.horizontal .rel-step:last-child .connector {\r\n display: none;\r\n }\r\n\r\n /* Vertical connectors */\r\n .rel-stepper.vertical.text-below .connector {\r\n top: 100%;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n width: 2px;\r\n position: absolute;\r\n }\r\n\r\n .rel-stepper.vertical.text-right .connector {\r\n top: 100%;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n width: 2px;\r\n position: absolute;\r\n }\r\n\r\n .rel-stepper.vertical .rel-step:last-child .connector {\r\n display: none;\r\n }\r\n\r\n .rel-stepper.vertical.text-right\r\n .rel-step:last-child\r\n .indicator-wrapper\r\n .connector {\r\n display: none;\r\n }\r\n\r\n /********************************************\r\n * Step States\r\n ********************************************/\r\n .rel-step.done .indicator {\r\n background: var(--rel-bg-neutral-inverse-2);\r\n border-color: var(--rel-bg-neutral-inverse-2);\r\n color: var(--rel-text-inverse);\r\n }\r\n\r\n .rel-step.progress .indicator {\r\n border-color: var(--rel-border-strong);\r\n background: var(--rel-bg-neutral);\r\n color: var(--rel-text-label);\r\n }\r\n\r\n .rel-step.disabled .indicator {\r\n background: var(--rel-bg-surface-elevated);\r\n border-color: var(--rel-border-default);\r\n color: var(--rel-text-disabled);\r\n }\r\n\r\n .rel-step.done .connector {\r\n background: var(--rel-text-label);\r\n }\r\n\r\n .rel-step.progress .connector {\r\n background: var(--rel-text-label);\r\n }\r\n\r\n .rel-step.done .step-label {\r\n color: var(--rel-text-label);\r\n font-weight: var(--rel-body-md-medium-font-weight);\r\n }\r\n\r\n .rel-step.progress .step-label {\r\n color: var(--rel-text-label);\r\n font-weight: var(--rel-body-md-medium-font-weight);\r\n }\r\n\r\n .rel-step.disabled .step-label {\r\n color: var(--rel-text-disabled);\r\n }\r\n\r\n /* Dark mode: ensure progress/done indicator and labels stay readable */\r\n :host-context(:root[data-theme=\"dark\"]) .rel-step.progress .step-label,\r\n :host-context(.dark) .rel-step.progress .step-label {\r\n color: var(--rel-text-default);\r\n }\r\n\r\n :host-context(:root[data-theme=\"dark\"]) .rel-step.progress .indicator,\r\n :host-context(.dark) .rel-step.progress .indicator {\r\n color: var(--rel-text-default);\r\n }\r\n\r\n /********************************************\r\n * Size Property — controls connector length\r\n ********************************************/\r\n /* Horizontal */\r\n .rel-stepper.large.horizontal {\r\n gap: var(--rel-stepper-connector-length-lg, 86px);\r\n }\r\n\r\n .rel-stepper.small.horizontal {\r\n gap: var(--rel-stepper-connector-length-md, 60px);\r\n }\r\n\r\n .rel-stepper.large.horizontal .connector {\r\n width: var(--rel-stepper-connector-length-lg, 86px);\r\n }\r\n\r\n .rel-stepper.small.horizontal .connector {\r\n width: var(--rel-stepper-connector-length-md, 60px);\r\n }\r\n\r\n /* Vertical */\r\n .rel-stepper.large.vertical .connector {\r\n height: var(--rel-stepper-connector-length-lg, 86px);\r\n }\r\n\r\n .rel-stepper.large.vertical {\r\n gap: var(--rel-stepper-connector-length-lg, 86px);\r\n }\r\n\r\n .rel-stepper.small.vertical .connector {\r\n height: var(--rel-stepper-connector-length-sm, 42px);\r\n }\r\n\r\n .rel-stepper.small.vertical {\r\n gap: var(--rel-stepper-connector-length-sm, 42px);\r\n }\r\n `;\r\n\r\n private isDone(step: Step): boolean {\r\n return step.status === \"done\";\r\n }\r\n\r\n private isProgress(step: Step): boolean {\r\n return step.status === \"progress\";\r\n }\r\n\r\n private isDisabled(step: Step): boolean {\r\n return step.status === \"disabled\";\r\n }\r\n\r\n private getStepClasses(step: Step): string {\r\n const classes = [\"rel-step\"];\r\n if (this.isDone(step)) classes.push(\"done\");\r\n if (this.isProgress(step)) classes.push(\"progress\");\r\n if (this.isDisabled(step)) classes.push(\"disabled\");\r\n return classes.join(\" \");\r\n }\r\n\r\n private onStepClick(step: Step, index: number) {\r\n if (step.status === \"disabled\") return;\r\n\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-step-change\", {\r\n detail: {\r\n index,\r\n step,\r\n },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private renderIndicator(step: Step, index: number) {\r\n if (this.type === \"dot\") return html``;\r\n if (this.type === \"number\") return html`<span>${index + 1}</span>`;\r\n if (this.type === \"icon\" || step.status === \"done\") {\r\n return html`\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"14\"\r\n height=\"10\"\r\n viewBox=\"0 0 18 14\"\r\n fill=\"none\"\r\n class=\"check-icon\"\r\n >\r\n <path\r\n d=\"M6.44479 14L0.5 7.36383L1.9862 5.70478L6.44479 10.6819L16.0138 0L17.5 1.65904L6.44479 14Z\"\r\n fill=\"currentColor\"\r\n />\r\n </svg>\r\n `;\r\n }\r\n return html`<span>${index + 1}</span>`;\r\n }\r\n\r\n render() {\r\n // Figma Typel wins when set; otherwise the legacy textAlign drives layout\r\n // (below ≈ inverted, right ≈ centered).\r\n const placement: LabelPlacement =\r\n this.labelPlacement ?? (this.textAlign === \"below\" ? \"inverted\" : \"centered\");\r\n\r\n const stepperClasses = [\r\n \"rel-stepper\",\r\n this.orientation === \"vertical\" ? \"vertical\" : \"horizontal\",\r\n placement === \"inverted\" ? \"text-below\" : \"text-right\",\r\n placement === \"top\" ? \"label-top\" : \"\",\r\n this.size === \"small\" ? \"small\" : \"large\",\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n const isVertical = this.orientation === \"vertical\";\r\n const isTextRight = placement !== \"inverted\";\r\n\r\n return html`\r\n <div class=\"${stepperClasses}\">\r\n ${this.steps.map(\r\n (step, idx) => html`\r\n <div\r\n class=\"${this.getStepClasses(step)}\"\r\n @click=\"${() => this.onStepClick(step, idx)}\"\r\n >\r\n ${isVertical && isTextRight\r\n ? html`\r\n <!-- Indicator with connector below -->\r\n <div class=\"indicator-wrapper\">\r\n <div part=\"indicator\" class=\"indicator\">\r\n ${this.renderIndicator(step, idx)}\r\n </div>\r\n ${idx < this.steps.length - 1\r\n ? html`<div part=\"track\" class=\"connector\"></div>`\r\n : \"\"}\r\n </div>\r\n\r\n <!-- Step Label to the right -->\r\n <div part=\"label\" class=\"step-label\">${step.title}</div>\r\n `\r\n : isVertical\r\n ? html`\r\n <div class=\"step-content text-below-content\">\r\n <!-- Step Indicator -->\r\n <div part=\"indicator\" class=\"indicator\">\r\n ${this.renderIndicator(step, idx)}\r\n </div>\r\n\r\n <!-- Step Label -->\r\n <div part=\"label\" class=\"step-label\">${step.title}</div>\r\n </div>\r\n\r\n <!-- Connector -->\r\n ${idx < this.steps.length - 1\r\n ? html`<div part=\"track\" class=\"connector\"></div>`\r\n : \"\"}\r\n `\r\n : html`\r\n <!-- Step Indicator -->\r\n <div part=\"indicator\" class=\"indicator\">\r\n ${this.renderIndicator(step, idx)}\r\n </div>\r\n\r\n <!-- Step Label -->\r\n <div part=\"label\" class=\"step-label\">${step.title}</div>\r\n\r\n <!-- Connector (for horizontal only) -->\r\n ${!isVertical && idx < this.steps.length - 1\r\n ? html`<div part=\"track\" class=\"connector\"></div>`\r\n : \"\"}\r\n `}\r\n </div>\r\n `\r\n )}\r\n </div>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property, state } from \"lit/decorators.js\";\r\n\r\n@customElement(\"rel-switch\")\r\nexport class RelSwitch extends LitElement {\r\n @property({ type: Boolean }) checked = false;\r\n @property({ type: Boolean }) disabled = false;\r\n @property({ type: String }) value = \"\";\r\n\r\n private _onChange: (value: boolean) => void = () => {};\r\n private _onTouched: () => void = () => {};\r\n\r\n @state() private isFocused = false;\r\n @state() private isPressed = false;\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n --switch-track: var(--rel-bg-neutral-elevated-2);\r\n --switch-knob-on: var(--rel-bg-neutral-inverse-2);\r\n --switch-knob-off: var(--rel-text-static-light);\r\n --switch-halo: var(--rel-action-overlay-hover-strong);\r\n --switch-disabled: var(--rel-bg-neutral-elevated-1);\r\n display: inline-block;\r\n }\r\n\r\n /* Wrapper */\r\n .switch-wrapper {\r\n position: relative;\r\n display: inline-block;\r\n width: var(--rel-switch-track-width, 42px);\r\n height: var(--rel-switch-track-height, 22px);\r\n cursor: pointer;\r\n }\r\n\r\n .switch-wrapper.switch-disabled {\r\n cursor: not-allowed;\r\n opacity: 0.5;\r\n }\r\n\r\n /* Hide native checkbox */\r\n .switch-wrapper input {\r\n opacity: 0;\r\n width: 0;\r\n height: 0;\r\n }\r\n\r\n /* Track */\r\n .switch-slider {\r\n position: absolute;\r\n top: 50%;\r\n left: var(--rel-spacing-3xs);\r\n right: var(--rel-spacing-3xs);\r\n height: 12px;\r\n background-color: var(--switch-track);\r\n border-radius: 999px;\r\n transform: translateY(-50%);\r\n transition: background-color 0.25s ease;\r\n }\r\n\r\n /* Knob */\r\n .switch-slider::before {\r\n content: \"\";\r\n position: absolute;\r\n top: 50%;\r\n left: -2px;\r\n transform: translateY(-50%);\r\n height: var(--rel-switch-thumb-size, 18px);\r\n width: var(--rel-switch-thumb-size, 18px);\r\n background-color: var(--switch-knob-off);\r\n border-radius: 50%;\r\n transition: transform 0.25s ease, background-color 0.25s ease,\r\n box-shadow 0.2s ease;\r\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);\r\n }\r\n\r\n /* ON state */\r\n input:checked + .switch-slider::before {\r\n background-color: var(--switch-knob-on);\r\n transform: translateY(-50%) translateX(22px);\r\n }\r\n\r\n /* Hover */\r\n .switch-wrapper:hover:not(.switch-disabled) .switch-slider {\r\n background-color: var(--rel-bg-neutral);\r\n }\r\n\r\n /* Hover halo — inverse overlay when checked (dark knob), strong overlay otherwise */\r\n .switch-wrapper:hover:not(.switch-disabled) .switch-slider::before {\r\n box-shadow: 0 0 0 6px var(--rel-action-overlay-hover-strong);\r\n }\r\n\r\n .switch-wrapper:hover:not(.switch-disabled) input:checked + .switch-slider::before {\r\n box-shadow: 0 0 0 6px var(--rel-action-overlay-hover-inverse);\r\n }\r\n\r\n /* Focus halo */\r\n .switch-focused .switch-slider::before {\r\n box-shadow: 0 0 0 2px var(--rel-border-focus-inner), 0 0 0 4px var(--rel-border-focus);\r\n }\r\n\r\n /* Pressed */\r\n .switch-pressed .switch-slider::before {\r\n transform: scale(0.9) translateY(-50%);\r\n box-shadow: 0 0 0 6px var(--rel-action-overlay-pressed);\r\n }\r\n .switch-pressed input:checked + .switch-slider::before {\r\n transform: scale(0.9) translateY(-50%) translateX(22px);\r\n box-shadow: 0 0 0 6px var(--rel-action-overlay-dragged);\r\n }\r\n\r\n /* Disabled */\r\n .switch-disabled .switch-slider {\r\n background-color: var(--switch-disabled);\r\n }\r\n .switch-disabled .switch-slider::before {\r\n background-color: var(--switch-disabled);\r\n }\r\n\r\n @media (prefers-reduced-motion: reduce) {\r\n .switch-slider,\r\n .switch-slider::before {\r\n transition: none;\r\n }\r\n }\r\n `;\r\n\r\n private toggle(ev: Event) {\r\n if (this.disabled) return;\r\n\r\n const input = ev.target as HTMLInputElement;\r\n this.checked = input.checked;\r\n\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-change\", {\r\n detail: {\r\n checked: this.checked,\r\n value: this.value,\r\n },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n this._onChange(this.checked);\r\n }\r\n\r\n registerOnChange(fn: (value: boolean) => void): void { this._onChange = fn; }\r\n registerOnTouched(fn: () => void): void { this._onTouched = fn; }\r\n writeValue(checked: boolean): void { this.checked = checked; }\r\n\r\n private handleFocus() {\r\n this.isFocused = true;\r\n }\r\n\r\n private handleBlur() {\r\n this.isFocused = false;\r\n this.isPressed = false;\r\n this._onTouched();\r\n }\r\n\r\n private handleMouseDown() {\r\n if (!this.disabled) this.isPressed = true;\r\n }\r\n\r\n private handleMouseUp() {\r\n if (!this.disabled) this.isPressed = false;\r\n }\r\n\r\n render() {\r\n const wrapperClasses = [\r\n \"switch-wrapper\",\r\n this.disabled && \"switch-disabled\",\r\n this.isFocused && \"switch-focused\",\r\n this.isPressed && \"switch-pressed\",\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return html`\r\n <label part=\"base\" class=\"${wrapperClasses}\">\r\n <input\r\n type=\"checkbox\"\r\n role=\"switch\"\r\n aria-checked=\"${this.checked}\"\r\n ?disabled=${this.disabled}\r\n .checked=${this.checked}\r\n @change=${(e: Event) => this.toggle(e)}\r\n @focus=${this.handleFocus}\r\n @blur=${this.handleBlur}\r\n @mousedown=${this.handleMouseDown}\r\n @mouseup=${this.handleMouseUp}\r\n />\r\n <span part=\"track\" class=\"switch-slider\"></span>\r\n </label>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property, state } from \"lit/decorators.js\";\r\nimport \"../rel-badge/rel-badge\";\r\n\r\nexport interface TabItem {\r\n label: string;\r\n badge?: number;\r\n badgeDot?: boolean;\r\n disabled?: boolean;\r\n}\r\n\r\n@customElement(\"rel-tab-item\")\r\nexport class RelTabItem extends LitElement {\r\n @property({ type: String }) label: string = \"\";\r\n @property({ type: String }) value: string = \"\";\r\n @property({ type: Number }) badge: number = 0;\r\n /** Shows a small dot instead of a numbered badge — takes precedence over `badge`. */\r\n @property({ type: Boolean, attribute: \"badge-dot\" }) badgeDot: boolean = false;\r\n @property({ type: Boolean }) disabled: boolean = false;\r\n\r\n render() {\r\n return html``;\r\n }\r\n}\r\n\r\n@customElement(\"rel-tab\")\r\nexport class RelTab extends LitElement {\r\n @property({ type: Array }) tabs: TabItem[] = [];\r\n @property({ type: Number, reflect: true }) activeIndex = 0;\r\n\r\n /** Tab size — styled via :host([size]) rules. */\r\n @property({ type: String, reflect: true })\r\n size: \"sm\" | \"md\" | \"lg\" = \"md\";\r\n @state() private _tabItems: RelTabItem[] = [];\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n --tab-active-color: var(--rel-bg-brand);\r\n --tab-text-default: var(--rel-text-default);\r\n --tab-text-disabled: var(--rel-text-disabled);\r\n --tab-text-hover: var(--rel-text-label);\r\n --tab-underline-height: 3px;\r\n --tab-hover-color: var(--rel-bg-neutral-elevated-1);\r\n display: block;\r\n font-family: var(--rel-fonts-font-family);\r\n }\r\n\r\n .tabs-wrapper {\r\n display: flex;\r\n border-bottom: 1px solid var(--rel-border-accent);\r\n font-family: var(--rel-fonts-font-family);\r\n user-select: none;\r\n }\r\n\r\n .tab {\r\n position: relative;\r\n padding: var(--rel-spacing-sm) var(--rel-spacing-md);\r\n cursor: pointer;\r\n color: var(--rel-text-body);\r\r\n transition: color 0.2s ease;\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-xs);\r\n font-family: var(--rel-body-md-regular-font-family);\r\n font-weight: var(--rel-body-md-regular-font-weight);\r\n font-size: var(--rel-body-md-regular-font-size);\r\n line-height: var(--rel-body-md-regular-line-height);\r\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\r\n }\r\n\r\n .tab.active {\r\n color: var(--tab-text-default);\r\n font-weight: var(--rel-body-md-medium-font-weight);\r\n }\r\n\r\n /* Size variants (CSS-only, Figma tab sizes) */\r\n :host([size=\"lg\"]) .tab {\r\n font-family: var(--rel-body-lg-regular-font-family);\r\n font-weight: var(--rel-body-lg-regular-font-weight);\r\n font-size: var(--rel-body-lg-regular-font-size);\r\n line-height: var(--rel-body-lg-regular-line-height);\r\n letter-spacing: var(--rel-body-lg-regular-letter-spacing);\r\n }\r\n\r\n :host([size=\"lg\"]) .tab.active {\r\n font-weight: var(--rel-body-lg-medium-font-weight);\r\n }\r\n\r\n :host([size=\"sm\"]) .tab {\r\n font-family: var(--rel-body-sm-regular-font-family);\r\n font-weight: var(--rel-body-xs-medium-font-weight);\r\n font-size: var(--rel-body-sm-medium-font-size);\r\n line-height: var(--rel-body-sm-medium-line-height);\r\n letter-spacing: var(--rel-body-sm-medium-letter-spacing);\r\n }\r\n\r\n /* Badge tones — pass through rel-badge custom-prop API */\r\n .tab rel-badge {\r\n --rel-badge-bg: var(--rel-bg-danger);\r\n --rel-badge-color: var(--rel-text-static-light);\r\n }\r\n\r\n .tab.disabled rel-badge {\r\n --rel-badge-bg: var(--rel-bg-neutral-inverse-2);\r\n --rel-badge-color: var(--rel-text-inverse);\r\n }\r\n\r\n .tab:focus-visible {\r\n outline: 2px solid var(--rel-border-focus);\r\n outline-offset: -2px;\r\n border-radius: var(--rel-border-radius-xs);\r\n }\r\n\r\n .tab:hover:not(.disabled) .tab-label {\r\n color: var(--tab-text-hover);\r\n }\r\n\r\n .tab.disabled {\r\n color: var(--tab-text-disabled);\r\n cursor: not-allowed;\r\n }\r\n\r\n /* Underline */\r\n .tab-underline {\r\n position: absolute;\r\n left: 0;\r\n bottom: 0;\r\n height: var(--tab-underline-height);\r\n width: 100%;\r\n background-color: transparent;\r\n transition: background-color 0.2s ease, transform 0.2s ease;\r\n }\r\n\r\n .tab.active .tab-underline {\r\n background-color: var(--tab-active-color);\r\n }\r\n\r\n .tab:hover:not(.disabled):not(.active) {\r\n background-color: var(--tab-hover-color);\r\n }\r\n\r\n /* Tab content */\r\n .tab-content {\r\n padding: 1rem 0;\r\n }\r\n `;\r\n\r\n private _onSlotChange(e: Event) {\r\n const slot = e.target as HTMLSlotElement;\r\n this._tabItems = slot\r\n .assignedElements()\r\n .filter((el): el is RelTabItem => el instanceof RelTabItem);\r\n }\r\n\r\n private get _effectiveTabs(): Array<{ label: string; badge?: number; badgeDot?: boolean; disabled?: boolean }> {\r\n if (this._tabItems.length > 0) {\r\n return this._tabItems.map((item) => ({\r\n label: item.label,\r\n badge: item.badge || 0,\r\n badgeDot: item.badgeDot,\r\n disabled: item.disabled,\r\n }));\r\n }\r\n return this.tabs;\r\n }\r\n\r\n private selectTab(index: number) {\r\n if (this._effectiveTabs[index]?.disabled) return;\r\n this.activeIndex = index;\r\n this.dispatchEvent(\r\n new CustomEvent<number>(\"rel-tab-change\", {\r\n detail: index,\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private onKeyDown(event: KeyboardEvent, index: number) {\r\n if (event.key === \"Enter\" || event.key === \" \") {\r\n if (this._effectiveTabs[index]?.disabled) return;\r\n event.preventDefault();\r\n this.selectTab(index);\r\n return;\r\n }\r\n\r\n if (event.key === \"ArrowRight\" || event.key === \"ArrowLeft\") {\r\n event.preventDefault();\r\n const dir = event.key === \"ArrowRight\" ? 1 : -1;\r\n const tabs = this._effectiveTabs;\r\n let next = index;\r\n for (let i = 0; i < tabs.length; i++) {\r\n next = (next + dir + tabs.length) % tabs.length;\r\n if (!tabs[next]?.disabled) break;\r\n }\r\n this.selectTab(next);\r\n this.updateComplete.then(() => {\r\n const tabEls = this.shadowRoot?.querySelectorAll(\"[role=tab]\");\r\n (tabEls?.[next] as HTMLElement)?.focus();\r\n });\r\n }\r\n }\r\n\r\n render() {\r\n const tabs = this._effectiveTabs;\r\n return html`\r\n <slot name=\"items\" style=\"display:none;\" @slotchange=\"${this._onSlotChange}\"></slot>\r\n <div part=\"list\" class=\"tabs-wrapper\" role=\"tablist\">\r\n ${tabs.map(\r\n (tab, i) => html`\r\n <div\r\n part=\"item\" class=\"tab ${i === this.activeIndex\r\n ? \"active\"\r\n : \"\"} ${tab.disabled ? \"disabled\" : \"\"}\"\r\n role=\"tab\"\r\n aria-selected=\"${i === this.activeIndex}\"\r\n aria-disabled=\"${tab.disabled ?? false}\"\r\n tabindex=\"${tab.disabled ? -1 : i === this.activeIndex ? 0 : -1}\"\r\n @click=\"${() => this.selectTab(i)}\"\r\n @keydown=\"${(e: KeyboardEvent) => this.onKeyDown(e, i)}\"\r\n >\r\n <span part=\"label\" class=\"tab-label\">${tab.label}</span>\r\n ${tab.badgeDot\r\n ? html`<rel-badge variant=\"dot\" size=\"sm\"></rel-badge>`\r\n : tab.badge\r\n ? html`<rel-badge number=\"${tab.badge}\" variant=\"number\" size=\"sm\"></rel-badge>`\r\n : \"\"}\r\n <span class=\"tab-underline\"></span>\r\n </div>\r\n `\r\n )}\r\n </div>\r\n <div class=\"tab-content\">\r\n <slot></slot>\r\n </div>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css, nothing } from \"lit\";\nimport { customElement, property, state, query } from \"lit/decorators.js\";\nimport \"@reliability-design/icons/rel-icon\";\nimport \"../rel-button/rel-button\";\n\ntype TimeColumn = \"hour\" | \"minute\" | \"period\";\n\n/**\n * `<rel-time-picker>` — time selection field.\n *\n * Follows the rel-date-picker trigger/field conventions (label, helper/error\n * text, sizes, fullWidth, clearable) and the rel-range-picker draft model:\n * column selections are held in draft state until Apply is clicked; Cancel,\n * Escape, or an outside click discards the draft.\n *\n * The committed `value` is ALWAYS 24-hour \"HH:mm\" regardless of the display\n * `format`, so consumers get a consistent machine-readable string.\n */\n@customElement(\"rel-time-picker\")\nexport class RelTimePicker extends LitElement {\n /** Committed time, 24-hour \"HH:mm\" (e.g. \"09:30\", \"17:05\"). */\n @property({ type: String, reflect: true }) value: string | null = null;\n @property({ type: String }) placeholder = \"Select time\";\n @property({ type: String }) label: string | null = null;\n @property({ type: Boolean, reflect: true }) disabled = false;\n @property({ type: Boolean }) required = false;\n @property({ type: Boolean, reflect: true }) readonly = false;\n\n /** Display format of the trigger text and hour column. Value stays \"HH:mm\". */\n @property({ type: String }) format: \"12h\" | \"24h\" = \"12h\";\n /** Minute granularity of the minutes column (1, 5, 10, 15, 30, …). */\n @property({ type: Number, attribute: \"minute-step\" }) minuteStep = 1;\n\n /** Earliest selectable time, \"HH:mm\" (inclusive). */\n @property({ type: String, attribute: \"min-time\" }) minTime: string | null = null;\n /** Latest selectable time, \"HH:mm\" (inclusive). */\n @property({ type: String, attribute: \"max-time\" }) maxTime: string | null = null;\n\n @property({ type: Boolean, reflect: true }) open = false;\n @property({ type: Boolean }) clearable = false;\n\n // ── Standardized input API (mirrors rel-textfield / rel-date-picker) ──\n @property({ type: Boolean }) error = false;\n /** Alias for `error` (requested-API compat); either flag applies error styling. */\n @property({ type: Boolean }) invalid = false;\n @property({ type: String, attribute: \"error-message\" }) errorMessage?: string;\n @property({ type: String, attribute: \"helper-text\" }) helperText?: string;\n @property({ type: String }) name?: string;\n @property({ type: String }) size: \"small\" | \"medium\" | \"large\" = \"medium\";\n @property({ type: String, reflect: true }) variant: \"outlined\" = \"outlined\";\n @property({ type: Boolean, reflect: true }) fullWidth = false;\n\n // Draft selection (hour is 0–23 internally; committed on Apply only)\n @state() private draftHour: number | null = null;\n @state() private draftMinute: number | null = null;\n\n @query(\".trigger-button\") private triggerButton?: HTMLButtonElement;\n @query(\".columns\") private columnsElement?: HTMLElement;\n\n static styles = css`\n :host {\n color: var(--rel-text-default);\n display: block;\n font-family: var(--rel-fonts-font-family);\n position: relative;\n }\n\n /* Intrinsic width by default; set fullWidth to fill the parent. */\n :host(:not([fullwidth])) {\n display: inline-block;\n width: auto;\n }\n\n :host([disabled]) {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n :host([disabled]) * {\n pointer-events: none;\n }\n\n :host([readonly]) .trigger-button {\n cursor: default;\n }\n\n .time-picker-wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--rel-spacing-xs);\n }\n\n .label {\n color: var(--rel-text-label);\n font-family: var(--rel-body-sm-medium-font-family);\n font-weight: var(--rel-body-sm-medium-font-weight);\n font-size: var(--rel-body-sm-medium-font-size);\n line-height: var(--rel-body-sm-medium-line-height);\n letter-spacing: var(--rel-body-sm-medium-letter-spacing);\n }\n\n .required-mark {\n color: var(--rel-text-danger);\n margin-left: 2px;\n }\n\n /* Support text (helperText / errorMessage) */\n .time-picker-support {\n color: var(--rel-text-placeholder);\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 .time-picker-support.error {\n color: var(--rel-text-danger);\n }\n\n .trigger-button {\n width: 100%;\n min-width: 160px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--rel-spacing-xs);\n padding: var(--rel-spacing-sm) var(--rel-spacing-md);\n background: var(--rel-bg-surface);\n border: 1px solid var(--rel-border-default);\n border-radius: var(--rel-border-radius-sm);\n color: var(--rel-text-default);\n cursor: pointer;\n transition: all 0.15s ease;\n text-align: left;\n font-family: var(--rel-body-md-regular-font-family);\n font-weight: var(--rel-body-md-regular-font-weight);\n font-size: var(--rel-body-md-regular-font-size);\n line-height: var(--rel-body-md-regular-line-height);\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\n }\n\n .trigger-button:hover:not(:disabled) {\n border-color: var(--rel-border-strong);\n }\n\n .trigger-button:focus-visible {\n outline: 2px solid var(--rel-border-focus);\n outline-offset: 2px;\n border-color: var(--rel-border-focus);\n }\n\n .trigger-button:disabled {\n cursor: not-allowed;\n background: var(--rel-bg-surface-elevated);\n }\n\n /* Error state */\n .trigger-button.error,\n .trigger-button.error:hover:not(:disabled) {\n border-color: var(--rel-border-danger);\n }\n\n .trigger-button.error:focus-visible {\n outline-color: var(--rel-border-danger);\n border-color: var(--rel-border-danger);\n }\n\n /* Size variants (medium is the base .trigger-button style) */\n .time-picker-wrapper.small .trigger-button {\n padding: var(--rel-spacing-xs) var(--rel-spacing-sm);\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 .time-picker-wrapper.large .trigger-button {\n padding: var(--rel-spacing-md) var(--rel-spacing-md);\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 .trigger-content {\n flex: 1;\n color: var(--rel-text-default);\n }\n\n .trigger-content.placeholder {\n color: var(--rel-text-placeholder);\n }\n\n .trigger-icons {\n display: flex;\n align-items: center;\n gap: var(--rel-spacing-2xs);\n color: var(--rel-text-placeholder);\n }\n\n .icon-button {\n background: none;\n border: none;\n padding: var(--rel-spacing-3xs);\n cursor: pointer;\n color: var(--rel-text-placeholder);\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--rel-border-radius-xs);\n transition: all 0.15s ease;\n }\n\n .icon-button:hover {\n background: var(--rel-bg-surface-elevated);\n color: var(--rel-text-default);\n }\n\n .icon-button svg {\n width: 16px;\n height: 16px;\n }\n\n .popover {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n z-index: 1000;\n background: var(--rel-bg-surface);\n border: 1px solid var(--rel-border-default);\n border-radius: var(--rel-border-radius-sm);\n box-shadow: var(--rel-shadows-shadow-300);\n padding: var(--rel-spacing-md);\n display: none;\n }\n\n .popover.open {\n display: block;\n }\n\n /* Draft readout (mirrors the range-picker FROM/TO block) */\n .time-readout {\n display: flex;\n align-items: baseline;\n gap: var(--rel-spacing-sm);\n padding-bottom: var(--rel-spacing-sm);\n margin-bottom: var(--rel-spacing-sm);\n border-bottom: 1px solid var(--rel-border-subtle);\n }\n\n .time-readout-label {\n color: var(--rel-text-placeholder);\n text-transform: uppercase;\n font-family: var(--rel-body-xs-semibold-font-family);\n font-weight: var(--rel-body-xs-semibold-font-weight);\n font-size: var(--rel-body-xs-semibold-font-size);\n line-height: var(--rel-body-xs-semibold-line-height);\n letter-spacing: var(--rel-body-xs-semibold-letter-spacing);\n }\n\n .time-readout-value {\n color: var(--rel-text-default);\n font-family: var(--rel-body-md-semibold-font-family);\n font-weight: var(--rel-body-md-semibold-font-weight);\n font-size: var(--rel-body-md-semibold-font-size);\n line-height: var(--rel-body-md-semibold-line-height);\n letter-spacing: var(--rel-body-md-semibold-letter-spacing);\n }\n\n .time-readout-value.empty {\n color: var(--rel-text-placeholder);\n }\n\n .columns {\n display: flex;\n gap: var(--rel-spacing-xs);\n }\n\n /* Columns share the panel width equally, so the two-column 24h layout\n fills the same footprint the footer dictates instead of bunching left. */\n .column {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 64px;\n }\n\n .column-header {\n text-align: center;\n color: var(--rel-text-placeholder);\n padding: var(--rel-spacing-xs);\n text-transform: uppercase;\n font-family: var(--rel-body-xs-semibold-font-family);\n font-weight: var(--rel-body-xs-semibold-font-weight);\n font-size: var(--rel-body-xs-semibold-font-size);\n line-height: var(--rel-body-xs-semibold-line-height);\n letter-spacing: var(--rel-body-xs-semibold-letter-spacing);\n }\n\n .column-list {\n display: flex;\n flex-direction: column;\n gap: var(--rel-spacing-3xs);\n max-height: 224px;\n overflow-y: auto;\n padding: var(--rel-spacing-3xs);\n scrollbar-width: thin;\n }\n\n .option-button {\n border: none;\n background: transparent;\n border-radius: var(--rel-border-radius-sm);\n color: var(--rel-text-default);\n cursor: pointer;\n padding: var(--rel-spacing-xs) var(--rel-spacing-sm);\n text-align: center;\n flex-shrink: 0;\n transition: all 0.15s ease;\n font-family: var(--rel-body-sm-medium-font-family);\n font-weight: var(--rel-body-sm-medium-font-weight);\n font-size: var(--rel-body-sm-medium-font-size);\n line-height: var(--rel-body-sm-medium-line-height);\n letter-spacing: var(--rel-body-sm-medium-letter-spacing);\n }\n\n .option-button:hover:not(:disabled):not(.selected) {\n background: var(--rel-bg-surface-elevated);\n }\n\n .option-button:focus-visible {\n outline: 2px solid var(--rel-border-focus);\n outline-offset: -2px;\n z-index: 1;\n }\n\n .option-button.selected {\n background: var(--rel-action-brand-fill);\n color: var(--rel-action-brand-label-icons-primary);\n font-weight: var(--rel-body-md-semibold-font-weight);\n }\n\n .option-button:disabled {\n color: var(--rel-text-disabled);\n cursor: not-allowed;\n opacity: 0.5;\n }\n\n .option-button:disabled:hover {\n background: transparent;\n }\n\n /* Footer (mirrors the range-picker calendar-footer) */\n .time-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--rel-spacing-sm);\n padding-top: var(--rel-spacing-sm);\n margin-top: var(--rel-spacing-sm);\n border-top: 1px solid var(--rel-border-subtle);\n }\n\n .footer-right {\n display: flex;\n align-items: center;\n gap: var(--rel-spacing-xs);\n }\n\n @media (prefers-reduced-motion: reduce) {\n .trigger-button,\n .icon-button,\n .option-button {\n transition: none;\n }\n }\n `;\n\n connectedCallback() {\n super.connectedCallback();\n document.addEventListener(\"click\", this.handleClickOutside);\n document.addEventListener(\"keydown\", this.handleEscapeKey);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n document.removeEventListener(\"click\", this.handleClickOutside);\n document.removeEventListener(\"keydown\", this.handleEscapeKey);\n }\n\n private handleClickOutside = (e: MouseEvent) => {\n if (!this.open) return;\n const path = e.composedPath();\n if (!path.includes(this)) {\n this.cancelPopover();\n }\n };\n\n private handleEscapeKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && this.open) {\n this.cancelPopover();\n }\n };\n\n updated(changedProperties: Map<string, any>) {\n if (changedProperties.has(\"open\") && this.open) {\n this.resetDraftFromValue();\n // Focus the selected (or first enabled) hour and center each column's\n // selection once the popover has rendered.\n setTimeout(() => {\n this.scrollColumnsToSelection();\n const target =\n this.columnsElement?.querySelector<HTMLButtonElement>(\n \".option-button.selected:not(:disabled)\"\n ) ??\n this.columnsElement?.querySelector<HTMLButtonElement>(\n \".option-button:not(:disabled)\"\n );\n target?.focus();\n }, 0);\n }\n }\n\n // ── Parsing / formatting ──\n\n private parseTime(time: string | null): { hour: number; minute: number } | null {\n if (!time) return null;\n const match = time.match(/^(\\d{1,2}):(\\d{2})$/);\n if (!match) return null;\n const hour = parseInt(match[1], 10);\n const minute = parseInt(match[2], 10);\n if (hour > 23 || minute > 59) return null;\n return { hour, minute };\n }\n\n private formatValue(hour: number, minute: number): string {\n return `${String(hour).padStart(2, \"0\")}:${String(minute).padStart(2, \"0\")}`;\n }\n\n private formatDisplay(hour: number, minute: number): string {\n const mm = String(minute).padStart(2, \"0\");\n if (this.format === \"24h\") {\n return `${String(hour).padStart(2, \"0\")}:${mm}`;\n }\n const period = hour < 12 ? \"AM\" : \"PM\";\n const hour12 = hour % 12 === 0 ? 12 : hour % 12;\n return `${hour12}:${mm} ${period}`;\n }\n\n private toMinutes(hour: number, minute: number): number {\n return hour * 60 + minute;\n }\n\n private get minuteStepSafe(): number {\n const step = Math.floor(this.minuteStep);\n return step >= 1 && step <= 60 ? step : 1;\n }\n\n private get minBoundMinutes(): number {\n const parsed = this.parseTime(this.minTime);\n return parsed ? this.toMinutes(parsed.hour, parsed.minute) : 0;\n }\n\n private get maxBoundMinutes(): number {\n const parsed = this.parseTime(this.maxTime);\n return parsed ? this.toMinutes(parsed.hour, parsed.minute) : 23 * 60 + 59;\n }\n\n private isTimeInRange(hour: number, minute: number): boolean {\n const total = this.toMinutes(hour, minute);\n return total >= this.minBoundMinutes && total <= this.maxBoundMinutes;\n }\n\n /** Minutes shown in the minutes column (respecting minuteStep). */\n private getMinuteOptions(): number[] {\n const minutes: number[] = [];\n for (let m = 0; m < 60; m += this.minuteStepSafe) {\n minutes.push(m);\n }\n return minutes;\n }\n\n /** An hour is enabled if at least one of its step minutes is in range. */\n private isHourEnabled(hour: number): boolean {\n return this.getMinuteOptions().some((m) => this.isTimeInRange(hour, m));\n }\n\n private isPeriodEnabled(period: \"AM\" | \"PM\"): boolean {\n const start = period === \"AM\" ? 0 : 12;\n for (let h = start; h < start + 12; h++) {\n if (this.isHourEnabled(h)) return true;\n }\n return false;\n }\n\n /** Hour column entries: display label + the 0–23 hour it maps to. */\n private getHourOptions(): { label: string; hour24: number }[] {\n if (this.format === \"24h\") {\n return Array.from({ length: 24 }, (_, h) => ({\n label: String(h).padStart(2, \"0\"),\n hour24: h,\n }));\n }\n // 12-hour clock, chronological within the current period: 12, 01 … 11\n const period = this.draftPeriod ?? \"AM\";\n const base = period === \"AM\" ? 0 : 12;\n return Array.from({ length: 12 }, (_, i) => ({\n label: i === 0 ? \"12\" : String(i).padStart(2, \"0\"),\n hour24: base + i,\n }));\n }\n\n private get draftPeriod(): \"AM\" | \"PM\" | null {\n if (this.draftHour === null) return null;\n return this.draftHour < 12 ? \"AM\" : \"PM\";\n }\n\n private resetDraftFromValue() {\n const parsed = this.parseTime(this.value);\n this.draftHour = parsed ? parsed.hour : null;\n this.draftMinute = parsed ? parsed.minute : null;\n }\n\n /** Snap the draft minute to the nearest valid step minute for the hour. */\n private clampDraftToRange() {\n if (this.draftHour === null || this.draftMinute === null) return;\n if (this.isTimeInRange(this.draftHour, this.draftMinute)) return;\n const hour = this.draftHour;\n const valid = this.getMinuteOptions().filter((m) => this.isTimeInRange(hour, m));\n if (valid.length === 0) {\n this.draftMinute = null;\n return;\n }\n const current = this.draftMinute;\n this.draftMinute = valid.reduce((best, m) =>\n Math.abs(m - current) < Math.abs(best - current) ? m : best\n );\n }\n\n // ── Open / close / commit ──\n\n private toggleTimePopover() {\n if (this.disabled || this.readonly) return;\n this.open = !this.open;\n this.dispatchEvent(\n new CustomEvent(\"rel-open-change\", {\n detail: { open: this.open },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n /** Close discarding the draft (Cancel / Escape / outside click). */\n private cancelPopover() {\n this.open = false;\n this.triggerButton?.focus();\n this.dispatchEvent(\n new CustomEvent(\"rel-open-change\", {\n detail: { open: false },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private applySelection() {\n if (this.draftHour === null) return;\n const newValue = this.formatValue(this.draftHour, this.draftMinute ?? 0);\n this.value = newValue;\n this.dispatchEvent(\n new CustomEvent(\"rel-change\", {\n detail: { value: newValue },\n bubbles: true,\n composed: true,\n })\n );\n this.cancelPopover();\n }\n\n /** Set the draft to the current time, snapped to the minute step and range. */\n private selectNow() {\n const now = new Date();\n const step = this.minuteStepSafe;\n this.draftHour = now.getHours();\n this.draftMinute = Math.round(now.getMinutes() / step) * step;\n if (this.draftMinute >= 60) {\n this.draftMinute = 0;\n this.draftHour = (this.draftHour + 1) % 24;\n }\n if (!this.isHourEnabled(this.draftHour)) {\n // Current hour is outside min/max — snap to the nearest enabled hour.\n const enabled: number[] = [];\n for (let h = 0; h < 24; h++) if (this.isHourEnabled(h)) enabled.push(h);\n if (enabled.length === 0) return;\n const currentHour = this.draftHour;\n this.draftHour = enabled.reduce((best, h) =>\n Math.abs(h - currentHour) < Math.abs(best - currentHour) ? h : best\n );\n }\n this.clampDraftToRange();\n this.scrollColumnsToSelection();\n }\n\n private clearValue(e: Event) {\n e.stopPropagation();\n this.value = null;\n this.draftHour = null;\n this.draftMinute = null;\n this.dispatchEvent(\n new CustomEvent(\"rel-change\", {\n detail: { value: null },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n // ── Column selection ──\n\n private selectHour(hour24: number) {\n if (!this.isHourEnabled(hour24)) return;\n this.draftHour = hour24;\n if (this.draftMinute === null) this.draftMinute = 0;\n this.clampDraftToRange();\n }\n\n private selectMinute(minute: number) {\n if (this.draftHour === null) {\n // Minute picked first — default the hour to the first enabled one.\n for (let h = 0; h < 24; h++) {\n if (this.isHourEnabled(h)) {\n this.draftHour = h;\n break;\n }\n }\n if (this.draftHour === null) return;\n }\n if (!this.isTimeInRange(this.draftHour, minute)) return;\n this.draftMinute = minute;\n }\n\n private selectPeriod(period: \"AM\" | \"PM\") {\n if (!this.isPeriodEnabled(period)) return;\n const base = period === \"AM\" ? 0 : 12;\n const hour12 = this.draftHour === null ? 0 : this.draftHour % 12;\n this.draftHour = base + hour12;\n if (this.draftMinute === null) this.draftMinute = 0;\n if (!this.isHourEnabled(this.draftHour)) {\n // Same clock position is out of range in the new period — snap to the\n // nearest enabled hour within that period.\n const enabled: number[] = [];\n for (let h = base; h < base + 12; h++) if (this.isHourEnabled(h)) enabled.push(h);\n const currentHour = this.draftHour;\n this.draftHour = enabled.reduce((best, h) =>\n Math.abs(h - currentHour) < Math.abs(best - currentHour) ? h : best\n );\n }\n this.clampDraftToRange();\n this.scrollColumnsToSelection();\n }\n\n private scrollColumnsToSelection() {\n this.updateComplete.then(() => {\n this.columnsElement\n ?.querySelectorAll<HTMLButtonElement>(\".option-button.selected\")\n .forEach((btn) => btn.scrollIntoView({ block: \"center\" }));\n });\n }\n\n // ── Keyboard ──\n\n private handleTriggerKeydown(e: KeyboardEvent) {\n if (e.key === \"Enter\" || e.key === \" \" || e.key === \"ArrowDown\") {\n e.preventDefault();\n if (!this.open) {\n this.toggleTimePopover();\n }\n }\n }\n\n /**\n * Column navigation: Up/Down move within the column (and select), Left/Right\n * jump between columns, Home/End go to the first/last option, Enter applies.\n */\n private handleOptionKeydown(e: KeyboardEvent, column: TimeColumn) {\n const list = (e.currentTarget as HTMLElement).closest(\".column-list\");\n if (!list) return;\n const buttons = Array.from(\n list.querySelectorAll<HTMLButtonElement>(\".option-button:not(:disabled)\")\n );\n const index = buttons.indexOf(e.currentTarget as HTMLButtonElement);\n let target: HTMLButtonElement | undefined;\n\n switch (e.key) {\n case \"ArrowUp\":\n e.preventDefault();\n target = buttons[Math.max(0, index - 1)];\n break;\n case \"ArrowDown\":\n e.preventDefault();\n target = buttons[Math.min(buttons.length - 1, index + 1)];\n break;\n case \"Home\":\n e.preventDefault();\n target = buttons[0];\n break;\n case \"End\":\n e.preventDefault();\n target = buttons[buttons.length - 1];\n break;\n case \"ArrowLeft\":\n case \"ArrowRight\": {\n e.preventDefault();\n this.focusAdjacentColumn(column, e.key === \"ArrowRight\" ? 1 : -1);\n return;\n }\n case \"Enter\":\n e.preventDefault();\n (e.currentTarget as HTMLButtonElement).click();\n this.applySelection();\n return;\n default:\n return;\n }\n\n if (target && target !== buttons[index]) {\n target.click();\n target.focus();\n target.scrollIntoView({ block: \"nearest\" });\n }\n }\n\n private focusAdjacentColumn(from: TimeColumn, direction: 1 | -1) {\n const order: TimeColumn[] =\n this.format === \"12h\" ? [\"hour\", \"minute\", \"period\"] : [\"hour\", \"minute\"];\n const nextIndex = order.indexOf(from) + direction;\n if (nextIndex < 0 || nextIndex >= order.length) return;\n const lists = this.columnsElement?.querySelectorAll(\".column-list\");\n const list = lists?.[nextIndex];\n const target =\n list?.querySelector<HTMLButtonElement>(\".option-button.selected:not(:disabled)\") ??\n list?.querySelector<HTMLButtonElement>(\".option-button:not(:disabled)\");\n target?.focus();\n target?.scrollIntoView({ block: \"nearest\" });\n }\n\n // ── Render ──\n\n render() {\n const isError = this.error || this.invalid;\n const belowText = isError && this.errorMessage ? this.errorMessage : this.helperText;\n const describedById = belowText ? \"time-picker-desc\" : undefined;\n const parsedValue = this.parseTime(this.value);\n const displayText = parsedValue\n ? this.formatDisplay(parsedValue.hour, parsedValue.minute)\n : \"\";\n const draftDisplay =\n this.draftHour !== null\n ? this.formatDisplay(this.draftHour, this.draftMinute ?? 0)\n : \"\";\n const hourOptions = this.getHourOptions();\n const minuteOptions = this.getMinuteOptions();\n const draftPeriod = this.draftPeriod;\n const wrapperClasses = [\n \"time-picker-wrapper\",\n this.size,\n isError ? \"error\" : \"\",\n this.readonly ? \"readonly\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return html`\n <div part=\"base\" class=\"${wrapperClasses}\">\n ${this.label\n ? html`<label part=\"label\" class=\"label\" id=\"time-picker-label\"\n >${this.label}${this.required\n ? html`<span class=\"required-mark\" aria-hidden=\"true\">*</span>`\n : nothing}</label\n >`\n : nothing}\n\n ${this.name\n ? html`<input type=\"hidden\" name=${this.name} .value=${this.value ?? \"\"} />`\n : nothing}\n\n <button\n part=\"trigger\"\n class=\"trigger-button ${isError ? \"error\" : \"\"}\"\n type=\"button\"\n ?disabled=${this.disabled}\n @click=${this.toggleTimePopover}\n @keydown=${this.handleTriggerKeydown}\n @focus=${() =>\n this.dispatchEvent(\n new CustomEvent(\"rel-focus\", { bubbles: true, composed: true })\n )}\n @blur=${() =>\n this.dispatchEvent(\n new CustomEvent(\"rel-blur\", { bubbles: true, composed: true })\n )}\n aria-label=${this.label || \"Select time\"}\n aria-haspopup=\"dialog\"\n aria-expanded=${this.open}\n aria-required=${this.required}\n aria-invalid=${isError}\n aria-readonly=${this.readonly}\n aria-describedby=${describedById ?? nothing}\n aria-labelledby=${this.label ? \"time-picker-label\" : nothing}\n >\n <span part=\"value\" class=\"trigger-content ${displayText ? \"\" : \"placeholder\"}\">\n ${displayText || this.placeholder}\n </span>\n <span class=\"trigger-icons\">\n ${this.clearable && this.value\n ? html`\n <button\n class=\"icon-button\"\n type=\"button\"\n aria-label=\"Clear time\"\n @click=${this.clearValue}\n >\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\">\n <path\n d=\"M4 4l8 8M12 4l-8 8\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg>\n </button>\n `\n : nothing}\n <rel-icon part=\"icon\" name=\"time-filled\" size=\"sm\"></rel-icon>\n </span>\n </button>\n\n <div\n part=\"panel\"\n class=\"popover ${this.open ? \"open\" : \"\"}\"\n role=\"dialog\"\n aria-label=\"Choose time\"\n >\n <div class=\"time-readout\">\n <span class=\"time-readout-label\">Time</span>\n <span class=\"time-readout-value ${draftDisplay ? \"\" : \"empty\"}\">\n ${draftDisplay || (this.format === \"24h\" ? \"--:--\" : \"--:-- --\")}\n </span>\n </div>\n\n <div class=\"columns\">\n <div class=\"column\">\n <div class=\"column-header\" aria-hidden=\"true\">Hour</div>\n <div class=\"column-list\" role=\"listbox\" aria-label=\"Hours\">\n ${hourOptions.map(\n (opt, i) => html`\n <button\n part=\"option\"\n class=\"option-button ${this.draftHour === opt.hour24\n ? \"selected\"\n : \"\"}\"\n type=\"button\"\n role=\"option\"\n aria-selected=${this.draftHour === opt.hour24}\n ?disabled=${!this.isHourEnabled(opt.hour24)}\n @click=${() => this.selectHour(opt.hour24)}\n @keydown=${(e: KeyboardEvent) => this.handleOptionKeydown(e, \"hour\")}\n tabindex=${this.draftHour === opt.hour24 ||\n (this.draftHour === null && i === 0)\n ? 0\n : -1}\n >\n ${opt.label}\n </button>\n `\n )}\n </div>\n </div>\n\n <div class=\"column\">\n <div class=\"column-header\" aria-hidden=\"true\">Min</div>\n <div class=\"column-list\" role=\"listbox\" aria-label=\"Minutes\">\n ${minuteOptions.map(\n (m, i) => html`\n <button\n part=\"option\"\n class=\"option-button ${this.draftMinute === m ? \"selected\" : \"\"}\"\n type=\"button\"\n role=\"option\"\n aria-selected=${this.draftMinute === m}\n ?disabled=${this.draftHour !== null &&\n !this.isTimeInRange(this.draftHour, m)}\n @click=${() => this.selectMinute(m)}\n @keydown=${(e: KeyboardEvent) =>\n this.handleOptionKeydown(e, \"minute\")}\n tabindex=${this.draftMinute === m ||\n (this.draftMinute === null && i === 0)\n ? 0\n : -1}\n >\n ${String(m).padStart(2, \"0\")}\n </button>\n `\n )}\n </div>\n </div>\n\n ${this.format === \"12h\"\n ? html`\n <div class=\"column\">\n <div class=\"column-header\" aria-hidden=\"true\">AM/PM</div>\n <div class=\"column-list\" role=\"listbox\" aria-label=\"AM or PM\">\n ${([\"AM\", \"PM\"] as const).map(\n (p) => html`\n <button\n part=\"option\"\n class=\"option-button ${draftPeriod === p ? \"selected\" : \"\"}\"\n type=\"button\"\n role=\"option\"\n aria-selected=${draftPeriod === p}\n ?disabled=${!this.isPeriodEnabled(p)}\n @click=${() => this.selectPeriod(p)}\n @keydown=${(e: KeyboardEvent) =>\n this.handleOptionKeydown(e, \"period\")}\n tabindex=${draftPeriod === p ||\n (draftPeriod === null && p === \"AM\")\n ? 0\n : -1}\n >\n ${p}\n </button>\n `\n )}\n </div>\n </div>\n `\n : nothing}\n </div>\n\n <div part=\"footer\" class=\"time-footer\">\n <rel-button\n variant=\"secondary\"\n size=\"small\"\n border=\"corner-radius\"\n @click=${() => this.selectNow()}\n >\n Now\n </rel-button>\n <div class=\"footer-right\">\n <rel-button\n variant=\"secondary\"\n size=\"small\"\n border=\"corner-radius\"\n @click=${() => this.cancelPopover()}\n >\n Cancel\n </rel-button>\n <rel-button\n variant=\"primary\"\n tone=\"default\"\n size=\"small\"\n border=\"corner-radius\"\n ?disabled=${this.draftHour === null}\n @click=${() => this.applySelection()}\n >\n Apply\n </rel-button>\n </div>\n </div>\n </div>\n\n ${belowText\n ? html`<div\n part=\"helper\"\n class=\"time-picker-support ${isError ? \"error\" : \"\"}\"\n id=${describedById}\n >\n ${belowText}\n </div>`\n : nothing}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"rel-time-picker\": RelTimePicker;\n }\n}\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property, state } from \"lit/decorators.js\";\r\n\r\nexport type ToastType = \"default\" | \"error\";\r\n\r\n@customElement(\"rel-toast\")\r\nexport class RelToast extends LitElement {\r\n @property({ type: String }) message: string = \"\";\r\n @property({ type: String }) type: ToastType = \"default\";\r\n @property({ type: String }) actionLabel?: string;\r\n @property({ type: Number }) duration: number = 4000;\r\n @property({ type: Boolean, reflect: true }) show = false;\r\n\r\n @state() private visible: boolean = false;\r\n private _dismissTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n static styles = css`\r\n :host {\r\n color: var(--rel-text-default);\r\n position: fixed;\r\n bottom: 24px;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n display: flex;\r\n justify-content: center;\r\n width: 100%;\r\n pointer-events: none;\r\n z-index: var(--rel-z-toast, 9000);\r\n font-family: var(--rel-fonts-font-family);\r\n }\r\n\r\n /* Toast container */\r\n .toast {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-xs);\r\n background-color: var(--rel-bg-neutral-inverse-1);\r\n color: var(--rel-text-inverse);\r\r\n border-radius: var(--rel-border-radius-sm);\r\n padding: var(--rel-spacing-sm) var(--rel-spacing-md);\r\n box-shadow: var(--rel-shadows-shadow-300);\r\n pointer-events: all;\r\n animation: fadeInUp 0.25s ease;\r\n font-family: var(--rel-body-md-regular-font-family);\r\n font-weight: var(--rel-body-md-regular-font-weight);\r\n font-size: var(--rel-body-md-regular-font-size);\r\n line-height: var(--rel-body-md-regular-line-height);\r\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\r\n }\r\n\r\n .toast.error {\r\n background-color: var(--rel-bg-danger);\r\n color: var(--rel-text-static-light);\r\n }\r\n\r\n .toast.hidden {\r\n display: none;\r\n }\r\n\r\n /* Message */\r\n .toast-message {\r\n flex: 1;\r\n }\r\n\r\n /* Action button */\r\n .toast-action {\r\n background: transparent;\r\n border: none;\r\n color: var(--rel-action-neutral-label-icons-fill-inverse);\r\n font-family: var(--rel-action-md-font-family);\r\n font-weight: var(--rel-action-md-font-weight);\r\n font-size: var(--rel-action-md-font-size);\r\n line-height: var(--rel-action-md-line-height);\r\n letter-spacing: var(--rel-action-md-letter-spacing);\r\n cursor: pointer;\r\n transition: opacity 0.2s;\r\n }\r\n\r\n .toast-action:hover {\r\n background: var(--rel-bg-neutral);\r\n color: var(--rel-text-default);\r\n opacity: 0.75;\r\n }\r\n\r\n .toast-action:focus-visible {\r\n outline: 2px solid var(--rel-text-static-light);\r\n outline-offset: 2px;\r\n border-radius: var(--rel-border-radius-xs);\r\n }\r\n\r\n /* Close button */\r\n .toast-close {\r\n background: transparent;\r\n color: var(--rel-action-neutral-label-icons-ghost);\r\n border: none;\r\n color: inherit;\r\n font-size: 1rem;\r\n cursor: pointer;\r\n line-height: 1;\r\n padding: var(--rel-spacing-2xs);\r\n margin-left: var(--rel-spacing-2xs);\r\n }\r\n\r\n .toast-close:hover {\r\n opacity: 0.75;\r\n }\r\n\r\n .toast-close:focus-visible {\r\n outline: 2px solid var(--rel-text-static-light);\r\n outline-offset: 2px;\r\n border-radius: var(--rel-border-radius-xs);\r\n }\r\n\r\n\r\n @media (prefers-reduced-motion: reduce) {\r\n .toast {\r\n animation: none;\r\n }\r\n }\r\n\r\n /* Animations */\r\n @keyframes fadeInUp {\r\n from {\r\n opacity: 0;\r\n transform: translateY(20px);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: translateY(0);\r\n }\r\n }\r\n `;\r\n\r\n willUpdate(changed: Map<string, unknown>) {\r\n if (!changed.has('show')) return;\r\n if (this.show) {\r\n this.visible = true;\r\n if (this._dismissTimer) clearTimeout(this._dismissTimer);\r\n if (this.duration > 0) {\r\n this._dismissTimer = setTimeout(() => this.close(), this.duration);\r\n }\r\n } else {\r\n this.visible = false;\r\n if (this._dismissTimer) {\r\n clearTimeout(this._dismissTimer);\r\n this._dismissTimer = null;\r\n }\r\n }\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback();\r\n if (this._dismissTimer) clearTimeout(this._dismissTimer);\r\n }\r\n\r\n open() {\r\n this.show = true;\r\n }\r\n\r\n close() {\r\n this.show = false;\r\n this.visible = false;\r\n if (this._dismissTimer) {\r\n clearTimeout(this._dismissTimer);\r\n this._dismissTimer = null;\r\n }\r\n this.dispatchEvent(\r\n new CustomEvent(\"dismissed\", {\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private handleActionClick(event: Event) {\r\n event.stopPropagation();\r\n this.dispatchEvent(\r\n new CustomEvent(\"action\", {\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n this.close();\r\n }\r\n\r\n render() {\r\n return html`\r\n <div part=\"base\" class=\"toast ${this.type} ${this.visible ? \"\" : \"hidden\"}\" role=\"status\" aria-live=\"polite\">\r\n <span part=\"label\" class=\"toast-message\">${this.message}</span>\r\n\r\n ${this.actionLabel\r\n ? html`<button\r\n part=\"action\" class=\"toast-action\"\r\n @click=\"${this.handleActionClick}\"\r\n >\r\n ${this.actionLabel}\r\n </button>`\r\n : \"\"}\r\n\r\n <button part=\"close-button\" class=\"toast-close\" @click=\"${this.close}\" aria-label=\"Dismiss\">✕</button>\r\n </div>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\n\nexport type TooltipPosition = \"above\" | \"below\" | \"left\" | \"right\";\nexport type TooltipType = \"single-line\" | \"multi-line\";\n\n@customElement(\"rel-tooltip\")\nexport class RelTooltip extends LitElement {\n @property({ type: String }) text: string = \"\";\n @property({ type: String }) position: TooltipPosition = \"above\";\n @property({ type: Boolean, attribute: \"show-tail\" }) showTail: boolean =\n false;\n\n /** Figma \"Type\": single-line stays on one line; multi-line wraps at a max width. */\n @property({ type: String, reflect: true }) type: TooltipType = \"single-line\";\n\n // Stable id so aria-describedby can reference the bubble across renders.\n private uniqueId = Math.random().toString(36).slice(2);\n\n static styles = css`\n :host {\n color: var(--rel-text-default);\n display: inline-block;\n position: relative;\n }\n\n /* Tooltip container */\n .tooltip-bubble {\n font-family: var(--rel-body-md-regular-font-family);\n font-weight: var(--rel-body-md-medium-font-weight);\n font-size: var(--rel-body-md-regular-font-size);\n line-height: var(--rel-body-md-regular-line-height);\n letter-spacing: var(--rel-body-md-regular-letter-spacing);\n position: absolute;\n background-color: var(--rel-bg-neutral-inverse-2);\n color: var(--rel-text-inverse);\n padding: var(--rel-spacing-xs, 8px)\n var(--rel-spacing-sm, 12px);\n border-radius: var(--rel-border-radius-sm, 8px);\n white-space: nowrap;\n z-index: 1000;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.2s ease;\n overflow: visible;\n }\n\n /* Figma Type=Multi Line: wrap inside a bounded bubble */\n :host([type=\"multi-line\"]) .tooltip-bubble {\n white-space: normal;\n max-width: 220px;\n width: max-content;\n }\n\n :host(:hover) .tooltip-bubble,\n :host(:focus-within) .tooltip-bubble {\n opacity: 1;\n }\n\n /* Positioning */\n .tooltip-bubble.above {\n bottom: calc(100% + 6px);\n left: 50%;\n transform: translateX(-50%);\n }\n\n .tooltip-bubble.below {\n top: calc(100% + 6px);\n left: 50%;\n transform: translateX(-50%);\n }\n\n .tooltip-bubble.left {\n right: calc(100% + 6px);\n top: 50%;\n transform: translateY(-50%);\n }\n\n .tooltip-bubble.right {\n left: calc(100% + 6px);\n top: 50%;\n transform: translateY(-50%);\n }\n\n /* Tail/Arrow */\n .tooltip-tail {\n position: absolute;\n width: 0;\n height: 0;\n display: block;\n }\n\n .tooltip-bubble.above .tooltip-tail,\n .tooltip-bubble.below .tooltip-tail {\n left: 50%;\n transform: translateX(-50%);\n border-left: 6px solid transparent;\n border-right: 6px solid transparent;\n }\n\n .tooltip-bubble.above .tooltip-tail {\n bottom: -6px;\n border-top: 6px solid var(--rel-bg-neutral-inverse-2);\n border-bottom: none;\n }\n\n .tooltip-bubble.below .tooltip-tail {\n top: -6px;\n border-bottom: 6px solid var(--rel-bg-neutral-inverse-2);\n border-top: none;\n }\n\n .tooltip-bubble.left .tooltip-tail,\n .tooltip-bubble.right .tooltip-tail {\n top: 50%;\n transform: translateY(-50%);\n border-top: 6px solid transparent;\n border-bottom: 6px solid transparent;\n }\n\n .tooltip-bubble.left .tooltip-tail {\n right: -6px;\n border-left: 6px solid var(--rel-bg-neutral-inverse-2);\n border-right: none;\n }\n\n .tooltip-bubble.right .tooltip-tail {\n left: -6px;\n border-right: 6px solid var(--rel-bg-neutral-inverse-2);\n border-left: none;\n }\n `;\n\n firstUpdated() {\n this.linkTrigger();\n }\n\n private linkTrigger() {\n const slot = this.shadowRoot?.querySelector(\"slot\");\n if (!slot) return;\n const trigger = slot.assignedElements()[0];\n if (trigger) {\n trigger.setAttribute(\"aria-describedby\", `tooltip-${this.uniqueId}`);\n }\n }\n\n render() {\n return html`\n <slot @slotchange=\"${this.linkTrigger}\"></slot>\n <div\n part=\"panel\" class=\"tooltip-bubble ${this.position}\"\n id=\"tooltip-${this.uniqueId}\"\n role=\"tooltip\"\n >\n ${this.text}\n ${this.showTail ? html`<span part=\"indicator\" class=\"tooltip-tail\"></span>` : \"\"}\n </div>\n `;\n }\n}\n"],"mappings":"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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAnFY;AAAA,EAA3BC,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GADf,UACiB;AAO5B;AAAA,EADCA,WAAS,EAAE,MAAM,QAAQ,WAAW,eAAe,SAAS,KAAK,CAAC;AAAA,GAPxD,UAQX;AAM2D;AAAA,EAA1DA,WAAS,EAAE,MAAM,QAAQ,WAAW,mBAAmB,CAAC;AAAA,GAd9C,UAcgD;AAEK;AAAA,EAA/DA,WAAS,EAAE,MAAM,QAAQ,WAAW,wBAAwB,CAAC;AAAA,GAhBnD,UAgBqD;AAErC;AAAA,EAA1BA,WAAS,EAAE,MAAM,MAAM,CAAC;AAAA,GAlBd,UAkBgB;AAGE;AAAA,EAA5BA,WAAS,EAAE,MAAM,QAAQ,CAAC;AAAA,GArBhB,UAqBkB;AAGD;AAAA,EAA3BA,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAxBf,UAwBiB;AAG6B;AAAA,EAAxDA,WAAS,EAAE,MAAM,OAAO,WAAW,kBAAkB,CAAC;AAAA,GA3B5C,UA2B8C;AAE7B;AAAA,EAA3BA,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GA7Bf,UA6BiB;AAE8B;AAAA,EAAzDA,WAAS,EAAE,MAAM,QAAQ,WAAW,kBAAkB,CAAC;AAAA,GA/B7C,UA+B+C;AAEf;AAAA,EAA1CA,WAAS,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,GAjC9B,UAiCgC;AAEf;AAAA,EAA3BA,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAnCf,UAmCiB;AAEwB;AAAA,EAAnDA,WAAS,EAAE,MAAM,QAAQ,WAAW,YAAY,CAAC;AAAA,GArCvC,UAqCyC;AAEC;AAAA,EAApDA,WAAS,EAAE,MAAM,QAAQ,WAAW,aAAa,CAAC;AAAA,GAvCxC,UAuC0C;AAEzB;AAAA,EAA3BA,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAzCf,UAyCiB;AAEiC;AAAA,EAA5DA,WAAS,EAAE,MAAM,QAAQ,WAAW,qBAAqB,CAAC;AAAA,GA3ChD,UA2CkD;AAEF;AAAA,EAA1DA,WAAS,EAAE,MAAM,QAAQ,WAAW,mBAAmB,CAAC;AAAA,GA7C9C,UA6CgD;AAOC;AAAA,EAA3DA,WAAS,EAAE,MAAM,QAAQ,WAAW,oBAAoB,CAAC;AAAA,GApD/C,UAoDiD;AAQP;AAAA,EAApDA,WAAS,EAAE,MAAM,SAAS,WAAW,YAAY,CAAC;AAAA,GA5DxC,UA4D0C;AAEpC;AAAA,EAAhBC,QAAM;AAAA,GA9DI,UA8DM;AACA;AAAA,EAAhBA,QAAM;AAAA,GA/DI,UA+DM;AACA;AAAA,EAAhBA,QAAM;AAAA,GAhEI,UAgEM;AACA;AAAA,EAAhBA,QAAM;AAAA,GAjEI,UAiEM;AACA;AAAA,EAAhBA,QAAM;AAAA,GAlEI,UAkEM;AAGA;AAAA,EAAhBA,QAAM;AAAA,GArEI,UAqEM;AAEiB;AAAA,EAAjCC,OAAM,iBAAiB;AAAA,GAvEb,UAuEuB;AACF;AAAA,EAA/BA,OAAM,eAAe;AAAA,GAxEX,UAwEqB;AACE;AAAA,EAAjCA,OAAM,iBAAiB;AAAA,GAzEb,UAyEuB;AACF;AAAA,EAA/BA,OAAM,eAAe;AAAA,GA1EX,UA0EqB;AACQ;AAAA,EAAvCA,OAAM,uBAAuB;AAAA,GA3EnB,UA2E6B;AA3E7B,YAAN;AAAA,EADNC,gBAAc,YAAY;AAAA,GACd;;;ACzCb,SAAS,cAAAC,cAAY,QAAAC,QAAM,OAAAC,aAAW;AACtC,SAAS,iBAAAC,iBAAe,YAAAC,kBAAgB;AAMjC,IAAM,cAAN,cAA0BC,aAAW;AAAA,EAArC;AAAA;AACsC,iBAAuB;AACtC,iBAAQ;AACR,iBAAQ;AACR,kBAAS;AACM,qBAA+B;AAC9B,kBAAS;AAAA;AAAA,EAElC,QAAQ,SAA+B;AACxD,QAAI,QAAQ,IAAI,OAAO,KAAK,KAAK,MAAO,MAAK,MAAM,QAAQ,KAAK;AAChE,QAAI,QAAQ,IAAI,QAAQ,KAAK,KAAK,OAAQ,MAAK,MAAM,SAAS,KAAK;AAAA,EACrE;AAAA,EA6FA,SAAS;AACP,QAAI,KAAK,OAAQ,QAAOC;AAExB,QAAI,KAAK,UAAU,QAAQ;AACzB,YAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,KAAK;AACpC,aAAOA;AAAA;AAAA,YAED,MAAM,KAAK,EAAE,QAAQ,MAAM,GAAG,CAAC,GAAG,MAAMA;AAAA,mDACD,MAAM,QAAQ,KAAK,QAAQ,IAAI,YAAY,EAAE;AAAA,WACrF,CAAC;AAAA;AAAA;AAAA,IAGR;AAEA,WAAOA;AAAA,EACT;AACF;AAxHa,YAaJ,SAASC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAZ2B;AAAA,EAA1CC,WAAS,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,GAD9B,YACgC;AACf;AAAA,EAA3BA,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAFf,YAEiB;AACA;AAAA,EAA3BA,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAHf,YAGiB;AACA;AAAA,EAA3BA,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAJf,YAIiB;AACe;AAAA,EAA1CA,WAAS,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,GAL9B,YAKgC;AACC;AAAA,EAA3CA,WAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAN/B,YAMiC;AANjC,cAAN;AAAA,EADNC,gBAAc,cAAc;AAAA,GAChB;;;ACPb,SAAS,cAAAC,cAAY,QAAAC,QAAM,OAAAC,aAAW;AACtC,SAAS,iBAAAC,iBAAe,YAAAC,YAAU,SAAAC,cAAa;AAC/C,OAAO;AAKA,IAAM,WAAN,cAAuBC,aAAW;AAAA,EAAlC;AAAA;AACuC,gBAAO;AACvB,gBAAkB;AAClB,iBAAQ;AACR,uBAAc;AACb,uBAAc;AACd,iBAAQ;AAOrC,sBAAmC;AAInC,SAAQ,gBAAoC;AAC5C,SAAQ,uBAAuB;AAC/B,SAAQ,2BAA2B;AAyVnC,SAAQ,gBAAgB,CAAC,MAAqB;AAC5C,UAAI,CAAC,KAAK,KAAM;AAChB,UAAI,EAAE,QAAQ,YAAY,KAAK,aAAa;AAC1C,UAAE,eAAe;AACjB,aAAK,OAAO;AAAA,MACd;AAAA,IACF;AAEA,SAAQ,qBAAqB,CAAC,MAAkB;AAC9C,UAAI,CAAC,KAAK,YAAa;AACvB,UAAI,EAAE,WAAW,KAAK,gBAAgB;AACpC,aAAK,OAAO;AAAA,MACd;AAAA,IACF;AAAA;AAAA,EA5GA,oBAAoB;AAClB,UAAM,kBAAkB;AACxB,QAAI,KAAK,MAAM;AACb,WAAK,WAAW;AAAA,IAClB;AACA,SAAK,eAAe,KAAK,MAAM;AAC7B,YAAM,aAAa,KAAK,YAAY;AAAA,QAClC;AAAA,MACF;AACA,UAAI,YAAY;AACd,cAAM,OAAO,MAAM;AACjB,gBAAM,aAAa,WAAW,iBAAiB,EAAE,SAAS,KAAK,CAAC,EAAE,SAAS;AAC3E,eAAK,gBAAgB,cAAc,UAAU;AAAA,QAC/C;AACA,mBAAW,iBAAiB,cAAc,IAAI;AAC9C,aAAK;AAAA,MACP;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,uBAAuB;AACrB,UAAM,qBAAqB;AAC3B,SAAK,aAAa;AAClB,aAAS,oBAAoB,WAAW,KAAK,aAAa;AAAA,EAC5D;AAAA,EAEU,aAAa;AAIrB,QAAI,KAAK,aAAa,OAAO,GAAG;AAC9B,YAAM,QAAQ,KAAK,aAAa,OAAO,KAAK;AAC5C,WAAK,gBAAgB,OAAO;AAC5B,WAAK,QAAQ;AAAA,IACf;AAAA,EACF;AAAA,EAEA,QAAQ,SAA+B;AACrC,QAAI,QAAQ,IAAI,MAAM,GAAG;AACvB,UAAI,KAAK,MAAM;AACb,aAAK,WAAW;AAAA,MAClB,OAAO;AACL,aAAK,YAAY;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,aAAa;AACnB,SAAK,gBAAgB,SAAS;AAC9B,SAAK,WAAW;AAChB,aAAS,iBAAiB,WAAW,KAAK,aAAa;AACvD,SAAK;AAAA,MACH,IAAI,YAAY,mBAAmB;AAAA,QACjC,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,cAAc;AACpB,SAAK,aAAa;AAClB,aAAS,oBAAoB,WAAW,KAAK,aAAa;AAC1D,QAAI,KAAK,eAAe,OAAO;AAC7B,WAAK,eAAe,KAAK,MAAM;AAC7B,aAAK,eAAe,MAAM;AAC1B,aAAK,gBAAgB;AAAA,MACvB,CAAC;AAAA,IACH;AACA,SAAK;AAAA,MACH,IAAI,YAAY,mBAAmB;AAAA,QACjC,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,aAAa;AACnB,QAAI,OAAO,aAAa,YAAa;AACrC,UAAM,iBAAiB,OAAO,aAAa,SAAS,gBAAgB;AACpE,SAAK,uBAAuB,SAAS,KAAK,MAAM;AAChD,SAAK,2BAA2B,SAAS,KAAK,MAAM;AACpD,aAAS,KAAK,MAAM,WAAW;AAC/B,QAAI,iBAAiB,GAAG;AACtB,eAAS,KAAK,MAAM,eAAe,GAAG,cAAc;AAAA,IACtD;AAAA,EACF;AAAA,EAEQ,eAAe;AACrB,QAAI,OAAO,aAAa,YAAa;AACrC,aAAS,KAAK,MAAM,WAAW,KAAK;AACpC,aAAS,KAAK,MAAM,eAAe,KAAK;AAAA,EAC1C;AAAA,EAiBQ,yBAAyB;AAC/B,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,SAAS;AACP,UAAM,WAAW,CAAC,CAAC,KAAK;AACxB,UAAM,iBAAiB,CAAC,CAAC,KAAK;AAC9B,UAAM,aAAa,YAAY,kBAAkB,KAAK;AAEtD,WAAOC;AAAA,oCACyB,KAAK,OAAO,SAAS,EAAE;AAAA;AAAA;AAAA,2BAGhC,CAAC,KAAK,QAAQ,aAAa,EAAE;AAAA,oBACpC,KAAK,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA,uBAKpB,KAAK,IAAI;AAAA,kBACd,KAAK,QAAQ,WAAW,QAAQ;AAAA,wBAC1B,KAAK,KAAK;AAAA;AAAA;AAAA,6CAGW,CAAC,aAAa,UAAU,EAAE;AAAA;AAAA,gBAEvD,WAAWA,2BAAyB,KAAK,KAAK,UAAU,EAAE;AAAA,gBAC1D,iBAAiBA,gCAA8B,KAAK,WAAW,SAAS,EAAE;AAAA;AAAA,cAE5E,KAAK,cACHA;AAAA;AAAA;AAAA,4BAGY,KAAK,sBAAsB;AAAA;AAAA;AAAA,6BAIvC,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAahB;AACF;AA9aa,SAqBJ,SAASC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AApB4B;AAAA,EAA3CC,WAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAD/B,SACiC;AAChB;AAAA,EAA3BA,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAFf,SAEiB;AACA;AAAA,EAA3BA,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAHf,SAGiB;AACA;AAAA,EAA3BA,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAJf,SAIiB;AACC;AAAA,EAA5BA,WAAS,EAAE,MAAM,QAAQ,CAAC;AAAA,GALhB,SAKkB;AACA;AAAA,EAA5BA,WAAS,EAAE,MAAM,QAAQ,CAAC;AAAA,GANhB,SAMkB;AAO7B;AAAA,EADCA,WAAS,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,GAZ9B,SAaX;AAE2B;AAAA,EAA1BC,OAAM,UAAU;AAAA,GAfN,SAegB;AAfhB,WAAN;AAAA,EADNC,gBAAc,WAAW;AAAA,GACb;;;ACPb,SAAS,cAAAC,cAAY,QAAAC,QAAM,OAAAC,aAAW;AACtC,SAAS,iBAAAC,iBAAe,YAAAC,YAAU,SAAAC,eAAa;AAUxC,IAAM,YAAN,cAAwBC,aAAW;AAAA,EAAnC;AAAA;AACsC,gBAAmB;AAGnB,gBAA2B;AAE1C,eAAc;AAEd,eAAc;AAEd,gBAAe;AAEd,oBAAoB;AAErB,iBAAoB;AAEnB,0BAA0B;AAE1B,sBAAsB;AAEvB,iBAAgB;AAGQ,oBAAmB;AAE9D,SAAQ,QAAkB,CAAC;AAEpC,SAAQ,YAAqC,MAAM;AAAA,IAAC;AACpD,SAAQ,aAAyB,MAAM;AAAA,IAAC;AAmWxC,SAAQ,YAAoC;AAAA;AAAA,EArC5C,oBAAoB;AAClB,UAAM,kBAAkB;AACxB,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,QAAQ,mBAAqC;AAC3C,QACE,kBAAkB,IAAI,MAAM,KAC5B,kBAAkB,IAAI,KAAK,KAC3B,kBAAkB,IAAI,KAAK,KAC3B,kBAAkB,IAAI,MAAM,GAC5B;AACA,WAAK,WAAW;AAAA,IAClB;AACA,QACE,kBAAkB,IAAI,OAAO,KAC7B,kBAAkB,IAAI,UAAU,KAChC,kBAAkB,IAAI,MAAM,GAC5B;AACA,WAAK,kBAAkB;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,IAAY,UAAmB;AAC7B,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,IAAY,aAAqB;AAC/B,QAAI,KAAK,QAAQ,KAAK,IAAK,QAAO;AAClC,YAAS,KAAK,QAAQ,KAAK,QAAQ,KAAK,MAAM,KAAK,OAAQ;AAAA,EAC7D;AAAA,EAEA,IAAY,gBAAwB;AAClC,QAAI,KAAK,QAAQ,KAAK,IAAK,QAAO;AAClC,YAAS,KAAK,WAAW,KAAK,QAAQ,KAAK,MAAM,KAAK,OAAQ;AAAA,EAChE;AAAA,EAIQ,iBAAiB,GAAyB;AAChD,UAAM,KAAK,KAAK,YAAY,cAAc,aAAa;AACvD,QAAI,CAAC,GAAI,QAAO,KAAK;AACrB,UAAM,OAAO,GAAG,sBAAsB;AACtC,UAAM,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,EAAE,UAAU,KAAK,QAAQ,KAAK,KAAK,CAAC;AACzE,QAAI,IAAI,KAAK,MAAM,OAAO,KAAK,MAAM,KAAK;AAC1C,QAAI,KAAK,MAAM,IAAI,KAAK,IAAI,IAAI,KAAK;AACrC,WAAO,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC,CAAC;AAAA,EACjD;AAAA,EAEQ,mBAAmB,GAAiB;AAC1C,QAAI,CAAC,KAAK,WAAW,KAAK,SAAU;AACpC,UAAM,IAAI,KAAK,iBAAiB,CAAC;AACjC,SAAK,YACH,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,IAAI,IAAI,KAAK,QAAQ,IAAI,UAAU;AACtE,IAAC,EAAE,cAA8B,kBAAkB,EAAE,SAAS;AAC9D,SAAK,gBAAgB,CAAC;AAAA,EACxB;AAAA,EAEQ,mBAAmB,GAAiB;AAC1C,QAAI,CAAC,KAAK,UAAW;AACrB,SAAK,gBAAgB,KAAK,iBAAiB,CAAC,CAAC;AAAA,EAC/C;AAAA,EAEQ,mBAAmB;AACzB,SAAK,YAAY;AAAA,EACnB;AAAA,EAEQ,gBAAgB,GAAW;AACjC,QAAI,KAAK,cAAc,SAAS;AAC9B,WAAK,QAAQ,KAAK,IAAI,GAAG,KAAK,QAAQ;AAAA,IACxC,WAAW,KAAK,cAAc,OAAO;AACnC,WAAK,WAAW,KAAK,IAAI,GAAG,KAAK,KAAK;AAAA,IACxC;AACA,SAAK,kBAAkB;AACvB,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEQ,kBAAkB;AACxB,SAAK;AAAA,MACH,IAAI,YAAY,cAAc;AAAA,QAC5B,QAAQ,EAAE,OAAO,KAAK,OAAO,UAAU,KAAK,SAAS;AAAA,QACrD,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AACA,SAAK,UAAU,KAAK,KAAK;AAAA,EAC3B;AAAA,EAEQ,kBAAkB,IAAW;AACnC,UAAM,OAAO,OAAQ,GAAG,OAA4B,KAAK;AACzD,SAAK,QAAQ,KAAK,IAAI,MAAM,KAAK,QAAQ;AACzC,SAAK,kBAAkB;AACvB,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEQ,gBAAgB,IAAW;AACjC,UAAM,OAAO,OAAQ,GAAG,OAA4B,KAAK;AACzD,SAAK,WAAW,KAAK,IAAI,MAAM,KAAK,KAAK;AACzC,SAAK,kBAAkB;AACvB,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEQ,aAAa;AACnB,QAAI,KAAK,SAAS,YAAY;AAC5B,WAAK,QAAQ,CAAC;AACd;AAAA,IACF;AAEA,UAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI;AAClC,UAAM,QAAkB,CAAC;AACzB,aAAS,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,MAAM;AAC/C,YAAM,KAAK,CAAC;AAAA,IACd;AACA,QAAI,MAAM,MAAM,SAAS,CAAC,MAAM,KAAK,KAAK;AACxC,YAAM,KAAK,KAAK,GAAG;AAAA,IACrB;AACA,SAAK,QAAQ;AAAA,EACf;AAAA,EAEQ,eAAe,MAAsB;AAC3C,UAAM,OAAQ,OAAO,KAAK,QAAQ,KAAK,MAAM,KAAK,OAAQ;AAC1D,WAAO,KAAK,MAAM,MAAM,GAAI,IAAI;AAAA,EAClC;AAAA,EAEQ,aAAa,MAAuB;AAC1C,WAAO,QAAQ,KAAK;AAAA,EACtB;AAAA,EAEQ,QAAQ,IAAW;AACzB,UAAM,KAAK,GAAG;AACd,QAAI,OAAO,OAAO,GAAG,KAAK;AAE1B,QAAI,KAAK,SAAS,YAAY;AAC5B,YAAM,UACJ,KAAK,OAAO,OAAO,KAAK,OAAO,KAAK,IAAI,IAAI,KAAK,OAAO,KAAK;AAC/D,aAAO,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,OAAO,CAAC;AACrD,SAAG,QAAQ,OAAO,IAAI;AAAA,IACxB;AAEA,SAAK,QAAQ;AACb,SAAK,kBAAkB;AACvB,SAAK;AAAA,MACH,IAAI,YAAY,cAAc;AAAA,QAC5B,QAAQ,EAAE,OAAO,KAAK,MAAM;AAAA,QAC5B,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AACA,SAAK,UAAU,KAAK,KAAK;AAAA,EAC3B;AAAA,EAEA,iBAAiB,IAAmC;AAAE,SAAK,YAAY;AAAA,EAAI;AAAA,EAC3E,kBAAkB,IAAsB;AAAE,SAAK,aAAa;AAAA,EAAI;AAAA,EAChE,WAAW,OAAqB;AAAE,SAAK,QAAQ;AAAA,EAAO;AAAA,EAE9C,oBAAoB;AAC1B,UAAM,WAAW,KAAK,YAAY,cAAc,eAAe;AAC/D,QAAI,CAAC,SAAU;AAEf,QAAI,KAAK,SAAS;AAChB,eAAS,MAAM,OAAO,GAAG,KAAK,UAAU;AACxC,eAAS,MAAM,QAAQ,GAAG,KAAK,IAAI,GAAG,KAAK,gBAAgB,KAAK,UAAU,CAAC;AAAA,IAC7E,WAAW,KAAK,SAAS,YAAY;AACnC,YAAM,cAAe,KAAK,QAAQ,KAAK,MAAM,KAAK,OAAQ;AAC1D,YAAM,aAAa,KAAK,MAAM,KAAK,aAAa,WAAW,IAAI;AAC/D,eAAS,MAAM,QAAQ,GAAG,UAAU;AAAA,IACtC,OAAO;AACL,eAAS,MAAM,QAAQ,GAAG,KAAK,UAAU;AAAA,IAC3C;AAAA,EACF;AAAA,EAEQ,qBAAqB,MAAc,KAAK,YAAY,MAAc,KAAK,OAAO;AACpF,WAAOC;AAAA,kDACuC,GAAG;AAAA,UAC3C,KAAK,aAAaA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAcV,GAAG;AAAA;AAAA;AAAA;AAAA,YAIT,EAAE;AAAA;AAAA;AAAA;AAAA,EAIZ;AAAA,EAEQ,cAAc;AACpB,QAAI,KAAK,SAAS,WAAY,QAAO;AAErC,WAAOA;AAAA;AAAA,UAED,KAAK,MAAM;AAAA,MACX,CAAC,SAASA;AAAA;AAAA,4BAEQ,KAAK,aAAa,IAAI,IAAI,WAAW,EAAE;AAAA,6BACtC,KAAK,eAAe,IAAI,CAAC;AAAA;AAAA,IAE9C,CAAC;AAAA;AAAA;AAAA,EAGP;AAAA,EAEQ,mBAAmB;AACzB,QAAI,KAAK,SAAS,cAAc,CAAC,KAAK,eAAgB,QAAO;AAE7D,WAAOA;AAAA;AAAA,UAED,KAAK,MAAM;AAAA,MACX,CAAC,SAASA;AAAA;AAAA;AAAA,6BAGS,KAAK,eAAe,IAAI,CAAC;AAAA,gBACtC,IAAI;AAAA;AAAA;AAAA,IAGZ,CAAC;AAAA;AAAA;AAAA,EAGP;AAAA,EAEA,SAAS;AACP,UAAM,gBAAgB;AAAA,MACpB;AAAA,MACA,KAAK,WAAW,aAAa;AAAA,MAC7B,KAAK,SAAS,aAAa,cAAc;AAAA,MACzC,KAAK,UAAU,UAAU;AAAA,IAC3B,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,UAAM,qBAAqB;AAAA,MACzB;AAAA,MACA,KAAK,UAAU,WAAW,WAAW;AAAA,IACvC,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,QAAI,KAAK,SAAS;AAChB,aAAOA;AAAA;AAAA,mBAEM,aAAa;AAAA,0BACN,KAAK,kBAAkB;AAAA,0BACvB,KAAK,kBAAkB;AAAA,wBACzB,KAAK,gBAAgB;AAAA,4BACjB,KAAK,gBAAgB;AAAA;AAAA;AAAA,wBAGzB,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAMtB,OAAO,KAAK,GAAG,CAAC;AAAA,oBAChB,OAAO,KAAK,GAAG,CAAC;AAAA,qBACf,OAAO,KAAK,IAAI,CAAC;AAAA,sBAChB,OAAO,KAAK,KAAK,CAAC;AAAA,yBACf,KAAK,QAAQ;AAAA,sBAChB,KAAK,iBAAiB;AAAA,qBACvB,MAAM,KAAK,WAAW,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,oBAKxB,OAAO,KAAK,GAAG,CAAC;AAAA,oBAChB,OAAO,KAAK,GAAG,CAAC;AAAA,qBACf,OAAO,KAAK,IAAI,CAAC;AAAA,sBAChB,OAAO,KAAK,QAAQ,CAAC;AAAA,yBAClB,KAAK,QAAQ;AAAA,sBAChB,KAAK,eAAe;AAAA,qBACrB,MAAM,KAAK,WAAW,CAAC;AAAA;AAAA,YAEhC,KAAK,qBAAqB,KAAK,YAAY,KAAK,KAAK,CAAC;AAAA,YACtD,KAAK,qBAAqB,KAAK,eAAe,KAAK,QAAQ,CAAC;AAAA;AAAA;AAAA,IAGpE;AAEA,WAAOA;AAAA,oBACS,aAAa;AAAA;AAAA,sBAEX,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA,kBAKtB,OAAO,KAAK,GAAG,CAAC;AAAA,kBAChB,OAAO,KAAK,GAAG,CAAC;AAAA,mBACf,KAAK,SAAS,aAAa,OAAO,KAAK,IAAI,IAAI,GAAG;AAAA,oBACjD,OAAO,KAAK,KAAK,CAAC;AAAA,uBACf,KAAK,QAAQ;AAAA,oBAChB,KAAK,OAAO;AAAA,mBACb,MAAM,KAAK,WAAW,CAAC;AAAA;AAAA,UAEhC,KAAK,qBAAqB,CAAC;AAAA,UAC3B,KAAK,YAAY,CAAC;AAAA,UAClB,KAAK,iBAAiB,CAAC;AAAA;AAAA;AAAA,EAG/B;AACF;AAlpBa,UA8BJ,SAASC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA7B2B;AAAA,EAA1CC,WAAS,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,GAD9B,UACgC;AAGA;AAAA,EAA1CA,WAAS,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,GAJ9B,UAIgC;AAEf;AAAA,EAA3BA,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GANf,UAMiB;AAEA;AAAA,EAA3BA,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GARf,UAQiB;AAEA;AAAA,EAA3BA,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAVf,UAUiB;AAEC;AAAA,EAA5BA,WAAS,EAAE,MAAM,QAAQ,CAAC;AAAA,GAZhB,UAYkB;AAED;AAAA,EAA3BA,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAdf,UAciB;AAEC;AAAA,EAA5BA,WAAS,EAAE,MAAM,QAAQ,CAAC;AAAA,GAhBhB,UAgBkB;AAEA;AAAA,EAA5BA,WAAS,EAAE,MAAM,QAAQ,CAAC;AAAA,GAlBhB,UAkBkB;AAED;AAAA,EAA3BA,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GApBf,UAoBiB;AAGwB;AAAA,EAAnDA,WAAS,EAAE,MAAM,QAAQ,WAAW,YAAY,CAAC;AAAA,GAvBvC,UAuByC;AAEnC;AAAA,EAAhBC,QAAM;AAAA,GAzBI,UAyBM;AAzBN,YAAN;AAAA,EADNC,gBAAc,YAAY;AAAA,GACd;;;ACXb,SAAS,cAAAC,cAAY,QAAAC,QAAM,OAAAC,aAAW;AACtC,SAAS,iBAAAC,iBAAe,YAAAC,YAAU,SAAAC,eAAa;AAC/C,OAAO;AAMA,IAAM,cAAN,cAA0BC,aAAW;AAAA,EAArC;AAAA;AACuB,mBAAkB;AAIjB,wBAAwB;AAExB,qBAAqB;AAEtB,iBAAuB;AAEvB,oBAAmB;AAEnB,gBAAqB;AACL,gBAAO;AAE1C,SAAQ,UAAmB;AAEpC,SAAQ,gBAAsD;AAAA;AAAA,EAkM9D,oBAAoB;AAClB,UAAM,kBAAkB;AAAA,EAC1B;AAAA,EAEA,WAAW,SAA+B;AACxC,QAAI,CAAC,QAAQ,IAAI,MAAM,EAAG;AAC1B,QAAI,KAAK,MAAM;AACb,WAAK,UAAU;AACf,WAAK,eAAe;AAAA,IACtB,OAAO;AACL,WAAK,UAAU;AACf,WAAK,kBAAkB;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,QAAQ,SAA+B;AACrC,SAAK,QAAQ,IAAI,UAAU,KAAK,QAAQ,IAAI,cAAc,MAAM,KAAK,MAAM;AACzE,WAAK,eAAe;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,uBAAuB;AACrB,UAAM,qBAAqB;AAC3B,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEQ,iBAAiB;AACvB,QAAI,KAAK,WAAW,GAAG;AACrB,WAAK,kBAAkB;AACvB,YAAM,QAAQ,KAAK,eAAe,KAAK,WAAW,IAAI,KAAK;AAC3D,WAAK,gBAAgB,WAAW,MAAM,KAAK,QAAQ,GAAG,KAAK;AAAA,IAC7D;AAAA,EACF;AAAA,EAEQ,oBAAoB;AAC1B,QAAI,KAAK,kBAAkB,MAAM;AAC/B,mBAAa,KAAK,aAAa;AAC/B,WAAK,gBAAgB;AAAA,IACvB;AAAA,EACF;AAAA,EAEQ,gBAAgB;AACtB,SAAK;AAAA,MACH,IAAI,YAAY,eAAe;AAAA,QAC7B,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AACA,SAAK,QAAQ;AAAA,EACf;AAAA,EAEQ,UAAU;AAChB,SAAK,OAAO;AACZ,SAAK,UAAU;AACf,SAAK;AAAA,MACH,IAAI,YAAY,SAAS;AAAA,QACvB,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,aAAa;AACnB,UAAM,UAAkC;AAAA,MACtC,SAAS;AAAA,MACT,OAAO;AAAA,MACP,SAAS;AAAA,IACX;AACA,UAAM,OAAO,QAAQ,KAAK,IAAI;AAC9B,QAAI,CAAC,KAAM,QAAOC;AAClB,WAAOA,yBAAuB,IAAI;AAAA,EACpC;AAAA,EAEA,SAAS;AACP,UAAM,kBAAkB;AAAA,MACtB;AAAA,MACA,KAAK,UAAU,WAAW,aAAa;AAAA,MACvC,CAAC,KAAK,UAAU,WAAW;AAAA,MAC3B,KAAK,SAAS,YAAY,QAAQ,KAAK,IAAI,KAAK;AAAA,IAClD,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,WAAOA;AAAA,oBACS,eAAe;AAAA;AAAA,YAEvB,KAAK,SAAS,YAAY,KAAK,WAAW,IAAI,EAAE;AAAA,uDACL,KAAK,OAAO;AAAA;AAAA;AAAA;AAAA,YAIvD,KAAK,SACHA;AAAA,wEAC0D,KAAK,aAAa;AAAA,oBACtE,KAAK,MAAM;AAAA;AAAA,kBAGjB,EAAE;AAAA,YACJ,KAAK,YACHA;AAAA,6EAC+D,KAAK,OAAO;AAAA;AAAA;AAAA,kBAI3E,EAAE;AAAA;AAAA;AAAA;AAAA,EAId;AACF;AAjUa,YAoBJ,SAASC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAnBY;AAAA,EAA3BC,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GADf,YACiB;AAEA;AAAA,EAA3BA,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAHf,YAGiB;AAEC;AAAA,EAA5BA,WAAS,EAAE,MAAM,QAAQ,CAAC;AAAA,GALhB,YAKkB;AAEA;AAAA,EAA5BA,WAAS,EAAE,MAAM,QAAQ,CAAC;AAAA,GAPhB,YAOkB;AAED;AAAA,EAA3BA,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GATf,YASiB;AAEA;AAAA,EAA3BA,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAXf,YAWiB;AAEA;AAAA,EAA3BA,WAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAbf,YAaiB;AACgB;AAAA,EAA3CA,WAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAd/B,YAciC;AAE3B;AAAA,EAAhBC,QAAM;AAAA,GAhBI,YAgBM;AAhBN,cAAN;AAAA,EADNC,gBAAc,cAAc;AAAA,GAChB;;;ACRb,SAAS,cAAAC,cAAY,QAAAC,QAAM,OAAAC,aAAW;AACtC,SAAS,iBAAAC,iBAAe,YAAAC,kBAAgB;AAiBjC,IAAM,aAAN,cAAyBC,aAAW;AAAA,EAApC;AAAA;AACsB,iBAAgB,CAAC;AAEhB,qBAAuB;AAEvB,uBAA2B;AAE3B,gBAAoB;AAEL,gBAAoB;AAAA;AAAA,EAqWvD,OAAO,MAAqB;AAClC,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA,EAEQ,WAAW,MAAqB;AACtC,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA,EAEQ,WAAW,MAAqB;AACtC,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA,EAEQ,eAAe,MAAoB;AACzC,UAAM,UAAU,CAAC,UAAU;AAC3B,QAAI,KAAK,OAAO,IAAI,EAAG,SAAQ,KAAK,MAAM;AAC1C,QAAI,KAAK,WAAW,IAAI,EAAG,SAAQ,KAAK,UAAU;AAClD,QAAI,KAAK,WAAW,IAAI,EAAG,SAAQ,KAAK,UAAU;AAClD,WAAO,QAAQ,KAAK,GAAG;AAAA,EACzB;AAAA,EAEQ,YAAY,MAAY,OAAe;AAC7C,QAAI,KAAK,WAAW,WAAY;AAEhC,SAAK;AAAA,MACH,IAAI,YAAY,mBAAmB;AAAA,QACjC,QAAQ;AAAA,UACN;AAAA,UACA;AAAA,QACF;AAAA,QACA,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,gBAAgB,MAAY,OAAe;AACjD,QAAI,KAAK,SAAS,MAAO,QAAOC;AAChC,QAAI,KAAK,SAAS,SAAU,QAAOA,eAAa,QAAQ,CAAC;AACzD,QAAI,KAAK,SAAS,UAAU,KAAK,WAAW,QAAQ;AAClD,aAAOA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAeT;AACA,WAAOA,eAAa,QAAQ,CAAC;AAAA,EAC/B;AAAA,EAEA,SAAS;AAGP,UAAM,YACJ,KAAK,mBAAmB,KAAK,cAAc,UAAU,aAAa;AAEpE,UAAM,iBAAiB;AAAA,MACrB;AAAA,MACA,KAAK,gBAAgB,aAAa,aAAa;AAAA,MAC/C,cAAc,aAAa,eAAe;AAAA,MAC1C,cAAc,QAAQ,cAAc;AAAA,MACpC,KAAK,SAAS,UAAU,UAAU;AAAA,IACpC,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,UAAM,aAAa,KAAK,gBAAgB;AACxC,UAAM,cAAc,cAAc;AAElC,WAAOA;AAAA,oBACS,cAAc;AAAA,UACxB,KAAK,MAAM;AAAA,MACX,CAAC,MAAM,QAAQA;AAAA;AAAA,uBAEF,KAAK,eAAe,IAAI,CAAC;AAAA,wBACxB,MAAM,KAAK,YAAY,MAAM,GAAG,CAAC;AAAA;AAAA,gBAEzC,cAAc,cACZA;AAAA;AAAA;AAAA;AAAA,0BAIQ,KAAK,gBAAgB,MAAM,GAAG,CAAC;AAAA;AAAA,wBAEjC,MAAM,KAAK,MAAM,SAAS,IACxBA,qDACA,EAAE;AAAA;AAAA;AAAA;AAAA,2DAI+B,KAAK,KAAK;AAAA,sBAEnD,aACAA;AAAA;AAAA;AAAA;AAAA,0BAIQ,KAAK,gBAAgB,MAAM,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA,6DAII,KAAK,KAAK;AAAA;AAAA;AAAA;AAAA,sBAIjD,MAAM,KAAK,MAAM,SAAS,IACxBA,qDACA,EAAE;AAAA,sBAERA;AAAA;AAAA;AAAA,wBAGM,KAAK,gBAAgB,MAAM,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA,2DAII,KAAK,KAAK;AAAA;AAAA;AAAA,sBAG/C,CAAC,cAAc,MAAM,KAAK,MAAM,SAAS,IACvCA,qDACA,EAAE;AAAA,mBACP;AAAA;AAAA;AAAA,IAGX,CAAC;AAAA;AAAA;AAAA,EAGP;AACF;AAvfa,WAqBJ,SAASC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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","names":["LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","nothing","customElement","property","state","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","query","html","nothing","css","property","state","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","state","LitElement","html","css","property","state","customElement","LitElement","html","css","nothing","customElement","property","LitElement","html","nothing","css","property","customElement","LitElement","html","css","nothing","customElement","property","state","query","LitElement","html","nothing","css","property","state","query","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","nothing","customElement","property","state","query","LitElement","html","nothing","css","property","state","query","customElement","LitElement","html","css","nothing","customElement","property","state","query","LitElement","html","nothing","css","property","state","query","customElement","LitElement","html","css","customElement","property","state","LitElement","html","css","property","state","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","state","query","LitElement","html","css","customElement","LitElement","html","css","customElement","LitElement","html","css","property","state","query","customElement","LitElement","html","css","nothing","customElement","property","LitElement","html","css","property","customElement","nothing","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","customElement","property","state","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","property","customElement","updated","state","LitElement","html","customElement","state","LitElement","html","state","customElement","LitElement","html","customElement","property","LitElement","html","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","state","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","LitElement","html","css","customElement","LitElement","html","css","customElement","LitElement","html","css","customElement","LitElement","html","css","customElement","LitElement","html","css","customElement","LitElement","html","css","customElement","LitElement","html","css","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","property","state","customElement","LitElement","html","css","customElement","property","state","LitElement","html","css","property","state","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","state","query","LitElement","html","css","property","state","query","customElement","LitElement","html","css","customElement","property","state","LitElement","html","css","property","state","customElement","LitElement","html","css","customElement","property","state","query","LitElement","html","css","property","state","query","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","nothing","customElement","property","state","query","repeat","LitElement","html","repeat","nothing","css","property","state","query","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","query","LitElement","html","css","property","query","customElement","LitElement","html","css","customElement","property","state","LitElement","html","css","property","state","customElement","LitElement","html","css","customElement","property","state","LitElement","html","css","property","state","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","state","LitElement","html","css","property","state","customElement","LitElement","html","css","customElement","property","state","LitElement","html","property","customElement","css","state","LitElement","html","css","nothing","customElement","property","state","query","LitElement","html","nothing","css","property","state","query","customElement","LitElement","html","css","customElement","property","state","LitElement","html","css","property","state","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement"]}