@reliability-design/web 1.4.0 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -0
- package/dist/components/rel-alert/rel-alert.ts +5 -9
- package/dist/components/rel-calendar/rel-calendar.ts +7 -0
- package/dist/components/rel-drawer/rel-drawer.ts +50 -15
- package/dist/components/rel-textfield/rel-textfield.ts +46 -1
- package/dist/index.d.mts +8 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +91 -15
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +91 -15
- package/dist/index.mjs.map +1 -1
- package/dist/styles/vars.css +213 -0
- package/dist/{vars-WY2XCF5G.css → vars-BYCEEKWJ.css} +213 -0
- package/package.json +3 -2
package/dist/index.mjs.map
CHANGED
|
@@ -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-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-textfield/rel-textfield.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-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 .alert-info .rel-message2 {\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 .alert-success .rel-message2 {\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 .alert-warning .rel-message2 {\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-danger);\r\n }\r\n\r\n .alert-error .rel-message1,\r\n .alert-error .rel-message2 {\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 } 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 }\r\n\r\n :host([disabled]) button {\r\n cursor: not-allowed;\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 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 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\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 @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 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 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 .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 <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\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 }\r\n\r\n .drawer-container.open {\r\n pointer-events: auto;\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 /* 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\r\r\n color: var(--rel-text-label);\r\n margin: 0;\n\r\n font-family: var(--rel-headings-lg-font-family);\n\r\n font-weight: var(--rel-headings-lg-font-weight);\n\r\n font-size: var(--rel-headings-lg-font-size);\n\r\n line-height: var(--rel-headings-lg-line-height);\n\r\n letter-spacing: var(--rel-headings-lg-letter-spacing);\n\r\n }\r\n\r\n .description {\r\r\n color: var(--rel-text-body);\r\n margin: 0;\r\n opacity: 0.8;\n\r\n font-family: var(--rel-body-lg-regular-font-family);\n\r\n font-weight: var(--rel-body-lg-regular-font-weight);\n\r\n font-size: var(--rel-body-lg-regular-font-size);\n\r\n line-height: var(--rel-body-lg-regular-line-height);\n\r\n letter-spacing: var(--rel-body-lg-regular-letter-spacing);\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 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.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\" : \"\"}\"\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 display: flex;\n align-items: center;\n gap: var(--rel-spacing-2xs);\n }\n\n input {\n position: absolute;\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 }\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 }\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\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.restoreFocus();\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 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 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}\nexport type SelectOption = string | SelectOptionObject;\n\ninterface NormalizedOption {\n value: string;\n label: string;\n supportingText: string;\n}\n\nfunction normalizeOption(o: SelectOption): NormalizedOption {\n if (typeof o === \"string\") return { value: o, label: o, supportingText: \"\" };\n return { value: o.value, label: o.label ?? o.value, supportingText: o.supportingText ?? \"\" };\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 /** Max selected chips shown before collapsing the rest into a \"+N\" badge. */\n @property({ type: Number, attribute: \"max-visible-chips\" }) maxVisibleChips: number = 3;\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 @query(\".select-trigger\") private triggerEl!: HTMLButtonElement;\n @query(\".search-input\") private searchInputEl!: HTMLInputElement;\n @query(\".select-listbox\") private listboxEl!: HTMLDivElement;\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: wrap;\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 .select-chips {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\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 .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 disconnectedCallback() {\n super.disconnectedCallback();\n this.removeGlobalListeners();\n }\n\n protected willUpdate(changed: PropertyValues<this>) {\n if (changed.has(\"multiple\") && this.multiple === false) {\n this.selectedValues = [];\n }\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, 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 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 </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 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-label\">${option.label}</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 }\n\n .modal-container.open {\n pointer-events: auto;\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 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 } 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 @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 .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 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 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 name=\"${this.rightIcon}\" size=\"sm\" class=\"icon right\"></rel-icon>`\n : \"\"}\n </div>\n\n ${belowTemplate}\n </div>\n `;\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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA5DY;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;AAGC;AAAA,EAA3DA,WAAS,EAAE,MAAM,QAAQ,WAAW,oBAAoB,CAAC;AAAA,GAvC/C,UAuCiD;AAQP;AAAA,EAApDA,WAAS,EAAE,MAAM,SAAS,WAAW,YAAY,CAAC;AAAA,GA/CxC,UA+C0C;AAEpC;AAAA,EAAhBC,QAAM;AAAA,GAjDI,UAiDM;AACA;AAAA,EAAhBA,QAAM;AAAA,GAlDI,UAkDM;AACA;AAAA,EAAhBA,QAAM;AAAA,GAnDI,UAmDM;AACA;AAAA,EAAhBA,QAAM;AAAA,GApDI,UAoDM;AACA;AAAA,EAAhBA,QAAM;AAAA,GArDI,UAqDM;AAEiB;AAAA,EAAjCC,OAAM,iBAAiB;AAAA,GAvDb,UAuDuB;AACF;AAAA,EAA/BA,OAAM,eAAe;AAAA,GAxDX,UAwDqB;AACE;AAAA,EAAjCA,OAAM,iBAAiB;AAAA,GAzDb,UAyDuB;AAzDvB,YAAN;AAAA,EADNC,gBAAc,YAAY;AAAA,GACd;;;AC/Bb,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;AAqUnC,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,EAjGA,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,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;AA1Za,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;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;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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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","names":["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","LitElement","html","nothing","css","property","customElement","LitElement","html","css","nothing","customElement","property","state","LitElement","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","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","LitElement","html","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","LitElement","html","nothing","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"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/components/rel-accordion/rel-accordion.ts","../src/components/rel-alert/rel-alert.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-textfield/rel-textfield.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-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 } 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 }\r\n\r\n :host([disabled]) button {\r\n cursor: not-allowed;\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 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\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 @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 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 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 .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 <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 }\r\n\r\n .drawer-container.open {\r\n pointer-events: auto;\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 display: flex;\n align-items: center;\n gap: var(--rel-spacing-2xs);\n }\n\n input {\n position: absolute;\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 }\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 }\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\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.restoreFocus();\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 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 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}\nexport type SelectOption = string | SelectOptionObject;\n\ninterface NormalizedOption {\n value: string;\n label: string;\n supportingText: string;\n}\n\nfunction normalizeOption(o: SelectOption): NormalizedOption {\n if (typeof o === \"string\") return { value: o, label: o, supportingText: \"\" };\n return { value: o.value, label: o.label ?? o.value, supportingText: o.supportingText ?? \"\" };\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 /** Max selected chips shown before collapsing the rest into a \"+N\" badge. */\n @property({ type: Number, attribute: \"max-visible-chips\" }) maxVisibleChips: number = 3;\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 @query(\".select-trigger\") private triggerEl!: HTMLButtonElement;\n @query(\".search-input\") private searchInputEl!: HTMLInputElement;\n @query(\".select-listbox\") private listboxEl!: HTMLDivElement;\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: wrap;\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 .select-chips {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\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 .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 disconnectedCallback() {\n super.disconnectedCallback();\n this.removeGlobalListeners();\n }\n\n protected willUpdate(changed: PropertyValues<this>) {\n if (changed.has(\"multiple\") && this.multiple === false) {\n this.selectedValues = [];\n }\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, 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 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 </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 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-label\">${option.label}</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 }\n\n .modal-container.open {\n pointer-events: auto;\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 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 } 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 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\";\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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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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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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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","names":["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","LitElement","html","nothing","css","property","customElement","LitElement","html","css","nothing","customElement","property","state","LitElement","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","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","LitElement","html","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","LitElement","html","nothing","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"]}
|