@reliability-design/web 1.2.0 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/components/rel-accordion/rel-accordion.ts +289 -135
  2. package/dist/components/rel-alert/rel-alert.ts +8 -1
  3. package/dist/components/rel-avatar/README.md +15 -4
  4. package/dist/components/rel-avatar/rel-avatar.ts +138 -96
  5. package/dist/components/rel-badge/README.md +7 -0
  6. package/dist/components/rel-badge/rel-badge.ts +61 -8
  7. package/dist/components/rel-button/rel-button.ts +64 -7
  8. package/dist/components/rel-chip/README.md +7 -0
  9. package/dist/components/rel-chip/rel-chip.ts +250 -130
  10. package/dist/components/rel-date-picker/rel-date-picker.ts +116 -14
  11. package/dist/components/rel-drawer/rel-drawer.ts +5 -2
  12. package/dist/components/rel-menubar/rel-menubar.ts +1 -0
  13. package/dist/components/rel-pagination/rel-pagination.ts +442 -425
  14. package/dist/components/rel-radio/rel-radio.ts +16 -16
  15. package/dist/components/rel-range-picker/rel-range-picker.css +349 -349
  16. package/dist/components/rel-range-picker/rel-range-picker.ts +1080 -1079
  17. package/dist/components/rel-select/README.md +34 -28
  18. package/dist/components/rel-select/rel-select.ts +1015 -346
  19. package/dist/components/rel-sheet/rel-sheet.ts +6 -3
  20. package/dist/components/rel-skeleton/rel-skeleton.ts +139 -0
  21. package/dist/components/rel-tab/rel-tab.ts +10 -4
  22. package/dist/components/rel-textfield/rel-textfield.ts +637 -349
  23. package/dist/components/rel-toast/rel-toast.ts +1 -6
  24. package/dist/components/rel-topbar/rel-topbar-actions.ts +4 -0
  25. package/dist/components/rel-topbar/rel-topbar-brand.ts +4 -0
  26. package/dist/components/rel-topbar/rel-topbar-dropdown-item.ts +4 -0
  27. package/dist/components/rel-topbar/rel-topbar-dropdown.ts +4 -0
  28. package/dist/components/rel-topbar/rel-topbar-item.ts +4 -0
  29. package/dist/components/rel-topbar/rel-topbar-mobile-panel.ts +4 -0
  30. package/dist/components/rel-topbar/rel-topbar-profile.ts +3 -0
  31. package/dist/components/rel-topbar/rel-topbar-utilities.ts +4 -0
  32. package/dist/components/rel-topbar/rel-topbar.ts +6 -0
  33. package/dist/index.d.mts +239 -22
  34. package/dist/index.d.ts +239 -22
  35. package/dist/index.js +2609 -981
  36. package/dist/index.js.map +1 -1
  37. package/dist/index.mjs +2621 -994
  38. package/dist/index.mjs.map +1 -1
  39. package/dist/styles/vars.css +17 -0
  40. package/dist/{vars-I2PC74XD.css → vars-F54UGCHM.css} +17 -0
  41. package/package.json +1 -1
package/dist/index.js.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-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-menubar/rel-menubar.ts","../src/components/rel-radio/rel-radio.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-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-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\nexport * from \"@reliability-design/icons\";\r\n","import \"../../styles/vars-v2.css\";\r\nimport { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n@customElement(\"rel-accordion\")\r\nexport class RelAccordion extends LitElement {\r\n @property({ type: String }) title = \"Accordion\";\r\n @property({ type: Boolean, reflect: true }) open = false;\r\n static styles = css`\r\n :host {\r\n display: block;\r\n width: 100%;\r\n font-family: var(--rel-fontFamilies-primary, sans-serif);\r\n }\r\n .accordion {\r\n background: var(--rel-color-bg-primary);\r\n border: none;\r\n border-bottom: 1px solid var(--rel-gray-text-placeholder);\r\n border-radius: 0;\r\n overflow: hidden;\r\n }\r\n /* HEADER --------------------------------------------------- */\r\n .header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: var(--rel-spacing-space-md, 16px);\r\n cursor: pointer;\r\n user-select: none;\r\n border-radius: 0;\r\n }\r\n .header:hover {\r\n background: var(--rel-surface-surface, #f5f5f5);\r\n }\r\n :host([open]) .header:hover {\r\n background: transparent;\r\n }\r\n .header:focus-visible {\r\n outline: 2px solid var(--rel-color-border-focus);\r\n outline-offset: -2px;\r\n }\r\n .title {\r\n font-size: var(--rel-fontSizes-lg, 20px);\r\n font-weight: var(--rel-fontWeights-medium, 500);\r\n color: var(--rel-text-heading, #2b2b2b);\r\n }\r\n /* ICON ----------------------------------------------------- */\r\n .icon {\r\n width: 20px;\r\n height: 20px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n transition: transform 0.25s ease;\r\n }\r\n .icon svg {\r\n width: 20px;\r\n height: 20px;\r\n stroke: var(--rel-text-primary, #333);\r\n stroke-width: 2;\r\n fill: none;\r\n stroke-linecap: round;\r\n stroke-linejoin: round;\r\n }\r\n .icon.rotated {\r\n transform: rotate(180deg);\r\n }\r\n /* BODY ------------------------------------------------------ */\r\n .body {\r\n overflow: hidden;\r\n max-height: 0;\r\n padding: 0 var(--rel-spacing-space-md, 16px);\r\n font-size: var(--rel-fontSizes-md, 14px);\r\n color: var(--rel-text-primary, #333);\r\n transition:\r\n max-height 0.25s ease,\r\n padding 0.2s ease;\r\n }\r\n .body.open {\r\n max-height: 1000px;\r\n padding: var(--rel-spacing-space-xl, 24px)\r\n var(--rel-spacing-space-md, 16px) var(--rel-spacing-space-lg, 20px);\r\n }\r\n @media (prefers-reduced-motion: reduce) {\r\n .icon,\r\n .body {\r\n transition: none;\r\n }\r\n }\r\n `;\r\n private toggle() {\r\n this.open = !this.open;\r\n this.dispatchEvent(\r\n new CustomEvent<boolean>(\"open-change\", {\r\n detail: this.open,\r\n bubbles: true,\r\n composed: true,\r\n }),\r\n );\r\n }\r\n private chevron() {\r\n return html`\r\n <svg viewBox=\"0 0 24 24\">\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n `;\r\n }\r\n render() {\r\n return html`\r\n <div class=\"accordion\">\r\n <div\r\n class=\"header\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n aria-expanded=\"${this.open}\"\r\n @click=${this.toggle}\r\n @keydown=${(e: KeyboardEvent) => {\r\n if (e.key === \"Enter\" || e.key === \" \") {\r\n e.preventDefault();\r\n this.toggle();\r\n }\r\n }}\r\n >\r\n <div class=\"title\">${this.title}</div>\r\n <div class=\"icon ${this.open ? \"rotated\" : \"\"}\">\r\n ${this.chevron()}\r\n </div>\r\n </div>\r\n <!-- IMPORTANT: slot is ALWAYS rendered -->\r\n <div class=\"body ${this.open ? \"open\" : \"\"}\">\r\n <slot></slot>\r\n </div>\r\n </div>\r\n `;\r\n }\r\n}\r\n","import \"../../styles/vars-v2.css\";\r\nimport { LitElement, html, css } from \"lit\";\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 @property({ type: String }) message1 = \"\";\r\n @property({ type: String }) message2?: string;\r\n\r\n @property({ type: String }) urlText?: string;\r\n @property({ type: String }) 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 display: block;\r\n font-family: var(--rel-fontFamilies-primary);\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: center;\r\n gap: var(--rel-spacing-space-xs);\r\n padding: var(--rel-spacing-space-sm) var(--rel-spacing-space-md);\r\n border-radius: var(--rel-borders-radius-border-radius-200);\r\n min-width: 360px;\r\n box-sizing: border-box;\r\n }\r\n\r\n .rel-content {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n }\r\n\r\n .rel-message1 {\r\n margin: 0;\r\n font-size: var(--rel-fontSizes-md);\r\n font-weight: var(--rel-fontWeights-medium);\r\n }\r\n\r\n .rel-message2 {\r\n margin: 0;\r\n font-size: var(--rel-fontSizes-sm);\r\n opacity: 0.9;\r\n }\r\n\r\n .rel-icon svg {\r\n width: 16px;\r\n height: 16px;\r\n }\r\n\r\n .rel-link {\r\n font-size: var(--rel-fontSizes-sm);\r\n font-weight: var(--rel-fontWeights-medium);\r\n text-decoration: underline;\r\n color: inherit;\r\n margin-top: 2px;\r\n }\r\n\r\n .rel-close {\r\n margin-left: auto;\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-space-2xs);\r\n line-height: 1;\r\n border-radius: var(--rel-borders-radius-border-radius-100, 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 — light mode */\r\n .alert-neutral {\r\n background: var(--rel-color-bg-primary);\r\n color: var(--rel-color-text-primary);\r\n }\r\n\r\n .alert-info {\r\n background: var(--rel-background-info);\r\n color: var(--rel-color-text-primary);\r\n --rel-icon-info: var(--rel-colors-blue-tertiary);\r\n }\r\n\r\n .alert-success {\r\n background: var(--rel-background-success);\r\n color: var(--rel-color-text-primary);\r\n --rel-icon-success: var(--rel-success-surface-dark);\r\n }\r\n\r\n .alert-warning {\r\n background: var(--rel-colors-gold-light);\r\n color: var(--rel-color-text-primary);\r\n --rel-icon-warning: var(--rel-warning-surface-dark);\r\n }\r\n\r\n .alert-error {\r\n background: var(--rel-background-error-light);\r\n color: var(--rel-error-surface-dark);\r\n --rel-icon-error: var(--rel-error-surface-dark);\r\n }\r\n\r\n .alert-error .rel-close {\r\n color: var(--rel-color-text-primary);\r\n }\r\n\r\n /* COLORS — dark mode */\r\n :host-context([data-theme=\"dark\"]) .rel-alert,\r\n :host-context(.dark) .rel-alert {\r\n background: var(--rel-color-bg-tertiary);\r\n color: var(--rel-color-text-primary);\r\n border: none;\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .rel-close,\r\n :host-context(.dark) .rel-close {\r\n color: var(--rel-color-text-primary);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .alert-neutral,\r\n :host-context(.dark) .alert-neutral {\r\n border: 1px solid var(--rel-color-border-strong);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .alert-info,\r\n :host-context(.dark) .alert-info {\r\n border: 1px solid var(--rel-colors-blue-tertiary);\r\n --rel-icon-info: var(--rel-colors-blue-tertiary);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .alert-info .rel-message2,\r\n :host-context(.dark) .alert-info .rel-message2 {\r\n color: var(--rel-colors-blue-tertiary);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .alert-warning,\r\n :host-context(.dark) .alert-warning {\r\n border: 1px solid var(--rel-warning-surface-dark);\r\n --rel-icon-warning: var(--rel-warning-surface-dark);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .alert-warning .rel-message2,\r\n :host-context(.dark) .alert-warning .rel-message2 {\r\n color: var(--rel-warning-surface-dark);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .alert-success,\r\n :host-context(.dark) .alert-success {\r\n border: 1px solid var(--rel-success-surface-dark);\r\n --rel-icon-success: var(--rel-success-surface-dark);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .alert-success .rel-message2,\r\n :host-context(.dark) .alert-success .rel-message2 {\r\n color: var(--rel-success-surface-dark);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .alert-error,\r\n :host-context(.dark) .alert-error {\r\n border: 1px solid var(--rel-error-surface-dark);\r\n --rel-icon-error: var(--rel-error-surface-dark);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .alert-error .rel-message2,\r\n :host-context(.dark) .alert-error .rel-message2 {\r\n color: var(--rel-error-surface-dark);\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 private get iconSvg() {\r\n switch (this.type) {\r\n case \"info\":\r\n return html`\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"18\"\r\n height=\"18\"\r\n viewBox=\"0 0 18 18\"\r\n fill=\"none\"\r\n >\r\n <path\r\n d=\"M9 4.75C8.75917 4.75 8.55715 4.8316 8.39395 4.9948C8.23132 5.15743 8.15 5.35917 8.15 5.6C8.15 5.84083 8.23132 6.04285 8.39395 6.20605C8.55715 6.36868 8.75917 6.45 9 6.45C9.24083 6.45 9.44257 6.36868 9.6052 6.20605C9.7684 6.04285 9.85 5.84083 9.85 5.6C9.85 5.35917 9.7684 5.15743 9.6052 4.9948C9.44257 4.8316 9.24083 4.75 9 4.75ZM9.85 8.15L8.15 8.15L8.15 13.25L9.85 13.25L9.85 8.15ZM9 0.499999C10.1758 0.499999 11.2808 0.723266 12.315 1.1698C13.3492 1.61633 14.2488 2.22182 15.0138 2.98625C15.7788 3.75068 16.3842 4.65027 16.8302 5.685C17.2762 6.71973 17.4994 7.82473 17.5 9C17.5006 10.1753 17.2773 11.2803 16.8302 12.315C16.3842 13.3492 15.7787 14.2487 15.0137 15.0137C14.2487 15.7787 13.3492 16.3845 12.315 16.831C11.2808 17.2776 10.1758 17.5006 9 17.5C7.82417 17.4994 6.71917 17.2764 5.685 16.831C4.65083 16.3845 3.75125 15.7787 2.98625 15.0137C2.22125 14.2487 1.61577 13.3492 1.1698 12.315C0.723834 11.2808 0.500567 10.1758 0.500001 9C0.499434 7.82417 0.722701 6.71917 1.1698 5.685C1.61577 4.65083 2.22125 3.75125 2.98625 2.98625C3.75125 2.22125 4.65084 1.61577 5.685 1.1698C6.71917 0.723832 7.82417 0.500566 9 0.499999ZM9 2.2C7.10167 2.2 5.49375 2.85875 4.17625 4.17625C2.85875 5.49375 2.2 7.10167 2.2 9C2.2 10.8983 2.85875 12.5062 4.17625 13.8237C5.49375 15.1412 7.10167 15.8 9 15.8C10.8983 15.8 12.5062 15.1412 13.8237 13.8237C15.1412 12.5062 15.8 10.8983 15.8 9C15.8 7.10167 15.1413 5.49375 13.8238 4.17625C12.5063 2.85875 10.8983 2.2 9 2.2Z\"\r\n fill=\"var(--rel-icon-info)\"\r\n />\r\n </svg>\r\n `;\r\n case \"success\":\r\n return html`\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"18\"\r\n height=\"18\"\r\n viewBox=\"0 0 18 18\"\r\n fill=\"none\"\r\n >\r\n <path\r\n d=\"M7.81 12.91L13.8025 6.9175L12.6125 5.7275L7.81 10.53L5.3875 8.1075L4.1975 9.2975L7.81 12.91ZM9 17.5C7.82417 17.5 6.71917 17.2767 5.685 16.8302C4.65083 16.3837 3.75125 15.7782 2.98625 15.0138C2.22125 14.2493 1.61577 13.3497 1.1698 12.315C0.723834 11.2803 0.500568 10.1753 0.500001 9C0.499434 7.82473 0.722701 6.71973 1.1698 5.685C1.61577 4.65083 2.22125 3.75125 2.98625 2.98625C3.75125 2.22125 4.65083 1.61548 5.685 1.16895C6.71917 0.722418 7.82417 0.499434 9 0.500001C10.1758 0.500568 11.2808 0.723551 12.315 1.16895C13.3492 1.61548 14.2488 2.22125 15.0138 2.98625C15.7788 3.75125 16.3842 4.65083 16.8302 5.685C17.2762 6.71917 17.4994 7.82417 17.5 9C17.5006 10.1758 17.2773 11.2808 16.8302 12.315C16.3842 13.3492 15.7788 14.2488 15.0138 15.0138C14.2488 15.7788 13.3492 16.3842 12.315 16.8302C11.2808 17.2762 10.1758 17.4994 9 17.5ZM9 15.8C10.8983 15.8 12.5062 15.1412 13.8237 13.8237C15.1412 12.5062 15.8 10.8983 15.8 9C15.8 7.10167 15.1412 5.49375 13.8237 4.17625C12.5062 2.85875 10.8983 2.2 9 2.2C7.10167 2.2 5.49375 2.85875 4.17625 4.17625C2.85875 5.49375 2.2 7.10167 2.2 9C2.2 10.8983 2.85875 12.5062 4.17625 13.8237C5.49375 15.1412 7.10167 15.8 9 15.8Z\"\r\n fill=\"var(--rel-icon-success)\"\r\n />\r\n </svg>\r\n `;\r\n case \"warning\":\r\n return html`\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\"\r\n height=\"14\"\r\n viewBox=\"0 0 16 14\"\r\n fill=\"none\"\r\n >\r\n <path\r\n d=\"M0 14L8 0L16 14H0ZM2.50909 12.5263H13.4909L8 2.94737L2.50909 12.5263ZM8 11.7895C8.20606 11.7895 8.37891 11.7187 8.51855 11.5773C8.6577 11.4363 8.72727 11.2614 8.72727 11.0526C8.72727 10.8439 8.6577 10.669 8.51855 10.528C8.37891 10.3865 8.20606 10.3158 8 10.3158C7.79394 10.3158 7.62133 10.3865 7.48218 10.528C7.34255 10.669 7.27273 10.8439 7.27273 11.0526C7.27273 11.2614 7.34255 11.4363 7.48218 11.5773C7.62133 11.7187 7.79394 11.7895 8 11.7895ZM7.27273 9.57895H8.72727V5.89474H7.27273V9.57895Z\"\r\n fill=\"var(--rel-icon-warning)\"\r\n />\r\n </svg>\r\n `;\r\n case \"error\":\r\n return html`\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"18\"\r\n height=\"18\"\r\n viewBox=\"0 0 18 18\"\r\n fill=\"none\"\r\n >\r\n <path\r\n d=\"M9 13.25C9.24083 13.25 9.44285 13.1684 9.60605 13.0052C9.76868 12.8426 9.85 12.6408 9.85 12.4C9.85 12.1592 9.76868 11.9571 9.60605 11.7939C9.44285 11.6313 9.24083 11.55 9 11.55C8.75917 11.55 8.55743 11.6313 8.3948 11.7939C8.2316 11.9571 8.15 12.1592 8.15 12.4C8.15 12.6408 8.2316 12.8426 8.3948 13.0052C8.55743 13.1684 8.75917 13.25 9 13.25ZM8.15 9.85H9.85V4.75H8.15V9.85ZM9 17.5C7.82417 17.5 6.71917 17.2767 5.685 16.8302C4.65083 16.3837 3.75125 15.7782 2.98625 15.0138C2.22125 14.2493 1.61577 13.3497 1.1698 12.315C0.723834 11.2803 0.500568 10.1753 0.500001 9C0.499434 7.82473 0.722701 6.71973 1.1698 5.685C1.61577 4.65083 2.22125 3.75125 2.98625 2.98625C3.75125 2.22125 4.65083 1.61548 5.685 1.16895C6.71917 0.722418 7.82417 0.499434 9 0.500001C10.1758 0.500568 11.2808 0.723551 12.315 1.16895C13.3492 1.61548 14.2488 2.22125 15.0138 2.98625C15.7788 3.75125 16.3842 4.65083 16.8302 5.685C17.2762 6.71917 17.4994 7.82417 17.5 9C17.5006 10.1758 17.2773 11.2808 16.8302 12.315C16.3842 13.3492 15.7788 14.2488 15.0138 15.0138C14.2488 15.7788 13.3492 16.3842 12.315 16.8302C11.2808 17.2762 10.1758 17.4994 9 17.5ZM9 15.8C10.8983 15.8 12.5062 15.1412 13.8237 13.8237C15.1412 12.5062 15.8 10.8983 15.8 9C15.8 7.10167 15.1412 5.49375 13.8237 4.17625C12.5062 2.85875 10.8983 2.2 9 2.2C7.10167 2.2 5.49375 2.85875 4.17625 4.17625C2.85875 5.49375 2.2 7.10167 2.2 9C2.2 10.8983 2.85875 12.5062 4.17625 13.8237C5.49375 15.1412 7.10167 15.8 9 15.8Z\"\r\n fill=\"var(--rel-icon-error)\"\r\n />\r\n </svg>\r\n `;\r\n default:\r\n return html`\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"18\"\r\n height=\"18\"\r\n viewBox=\"0 0 18 18\"\r\n fill=\"none\"\r\n >\r\n <path\r\n d=\"M9 4.75C8.75917 4.75 8.55715 4.8316 8.39395 4.9948C8.23132 5.15743 8.15 5.35917 8.15 5.6C8.15 5.84083 8.23132 6.04285 8.39395 6.20605C8.55715 6.36868 8.75917 6.45 9 6.45C9.24083 6.45 9.44257 6.36868 9.6052 6.20605C9.7684 6.04285 9.85 5.84083 9.85 5.6C9.85 5.35917 9.7684 5.15743 9.6052 4.9948C9.44257 4.8316 9.24083 4.75 9 4.75ZM9.85 8.15L8.15 8.15L8.15 13.25L9.85 13.25L9.85 8.15ZM9 0.499999C10.1758 0.499999 11.2808 0.723266 12.315 1.1698C13.3492 1.61633 14.2488 2.22182 15.0138 2.98625C15.7788 3.75068 16.3842 4.65027 16.8302 5.685C17.2762 6.71973 17.4994 7.82473 17.5 9C17.5006 10.1753 17.2773 11.2803 16.8302 12.315C16.3842 13.3492 15.7787 14.2487 15.0137 15.0137C14.2487 15.7787 13.3492 16.3845 12.315 16.831C11.2808 17.2776 10.1758 17.5006 9 17.5C7.82417 17.4994 6.71917 17.2764 5.685 16.831C4.65083 16.3845 3.75125 15.7787 2.98625 15.0137C2.22125 14.2487 1.61577 13.3492 1.1698 12.315C0.723834 11.2808 0.500567 10.1758 0.500001 9C0.499434 7.82417 0.722701 6.71917 1.1698 5.685C1.61577 4.65083 2.22125 3.75125 2.98625 2.98625C3.75125 2.22125 4.65084 1.61577 5.685 1.1698C6.71917 0.723832 7.82417 0.500566 9 0.499999ZM9 2.2C7.10167 2.2 5.49375 2.85875 4.17625 4.17625C2.85875 5.49375 2.2 7.10167 2.2 9C2.2 10.8983 2.85875 12.5062 4.17625 13.8237C5.49375 15.1412 7.10167 15.8 9 15.8C10.8983 15.8 12.5062 15.1412 13.8237 13.8237C15.1412 12.5062 15.8 10.8983 15.8 9C15.8 7.10167 15.1413 5.49375 13.8238 4.17625C12.5063 2.85875 10.8983 2.2 9 2.2Z\"\r\n fill=\"var(--rel-colors-black)\"\r\n />\r\n </svg>\r\n `;\r\n }\r\n }\r\n\r\n render() {\r\n return html`\r\n <div class=\"rel-alert alert-${this.type}\" role=\"alert\">\r\n <div class=\"rel-icon\">${this.iconSvg}</div>\r\n\r\n <div class=\"rel-content\">\r\n <p class=\"rel-message1\">${this.message1}</p>\r\n\r\n ${this.message2\r\n ? html`<p class=\"rel-message2\">${this.message2}</p>`\r\n : null}\r\n ${this.urlText && this.urlHref\r\n ? html`<a 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 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 \"../../styles/vars-v2.css\";\r\nimport { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\r\n@customElement(\"rel-avatar\")\r\nexport class RelAvatar extends LitElement {\r\n @property({ type: String, reflect: true })\r\n size: \"lg\" | \"md\" | \"sm\" | \"xs\" = \"md\";\r\n\r\n @property({ type: String, reflect: true })\r\n type: \"image\" | \"text\" | \"icon\" = \"image\";\r\n\r\n @property({ type: String }) src = \"\";\r\n @property({ type: String }) text = \"\";\r\n @property({ type: String }) alt = \"Avatar\";\r\n @property({ type: String }) bg: string = \"\";\r\n\r\n static styles = css`\r\n :host {\r\n display: inline-flex;\r\n font-family: var(--rel-fontFamilies-primary);\r\n }\r\n\r\n .avatar {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: 50%;\r\n overflow: hidden;\r\n\r\n background-color: var(--rel-colors-gray-disabled-text);\r\n color: var(--rel-avatar-color, #ffffff);\r\n font-weight: var(--rel-fontWeights-bold);\r\n\r\n user-select: none;\r\n text-transform: uppercase;\r\n }\r\n\r\n /* Sizes */\r\n .avatar-lg {\r\n width: 40px;\r\n height: 40px;\r\n font-size: var(--rel-fontSizes-xl);\r\n }\r\n\r\n .avatar-md {\r\n width: 32px;\r\n height: 32px;\r\n font-size: var(--rel-fontSizes-lg);\r\n }\r\n\r\n .avatar-sm {\r\n width: 24px;\r\n height: 24px;\r\n font-size: var(--rel-fontSizes-md);\r\n }\r\n\r\n .avatar-xs {\r\n width: 18px;\r\n height: 18px;\r\n font-size: var(--rel-fontSizes-xs);\r\n }\r\n\r\n img {\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n }\r\n\r\n .icon-slot {\r\n width: 100%;\r\n height: 100%;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n color: #ffffff;\r\n }\r\n\r\n .icon-slot ::slotted(svg) {\r\n width: 50%;\r\n height: 50%;\r\n }\r\n `;\r\n\r\n render() {\r\n return html`\r\n <div class=\"avatar avatar-${this.size}\" style=${this.bg ? `background-color: ${this.bg}` : \"\"}>\r\n ${this.type === \"image\" && this.src\r\n ? html`<img src=${this.src} alt=${this.alt} />`\r\n : this.type === \"text\"\r\n ? html`<span>${this.text}</span>`\r\n : html`<span class=\"icon-slot\"><slot></slot></span>`}\r\n </div>\r\n `;\r\n }\r\n}\r\n","import \"../../styles/vars-v2.css\";\r\nimport { 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\" = \"md\";\r\n\r\n @property({ type: String, reflect: true })\r\n variant: \"dot\" | \"number\" = \"number\";\r\n\r\n static styles = css`\r\n :host {\r\n display: inline-flex;\r\n }\r\n\r\n .badge {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-family: var(--rel-fontFamilies-primary, sans-serif);\r\n font-weight: var(--rel-fontWeights-semibold, 600);\r\n background-color: var(--rel-error-surface-default);\r\n color: #ffffff;\r\n border-radius: 50%;\r\n }\r\n\r\n /* NUMBER BADGES */\r\n .badge-sm {\r\n width: 20px;\r\n height: 20px;\r\n font-size: var(--rel-fontSizes-xs, 12px);\r\n }\r\n\r\n .badge-md {\r\n width: 28px;\r\n height: 28px;\r\n font-size: var(--rel-fontSizes-sm, 14px);\r\n }\r\n\r\n .badge-lg {\r\n width: 40px;\r\n height: 40px;\r\n font-size: var(--rel-fontSizes-lg, 20px);\r\n }\r\n\r\n /* DOT BADGES */\r\n .badge-dot.badge-sm {\r\n width: 8px;\r\n height: 8px;\r\n }\r\n\r\n .badge-dot.badge-md {\r\n width: 10px;\r\n height: 10px;\r\n }\r\n\r\n .badge-dot.badge-lg {\r\n width: 12px;\r\n height: 12px;\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 render() {\r\n return html`\r\n <span 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 \"../../styles/vars-v2.css\";\r\nimport { 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\n font-family: var(--rel-fontFamilies-primary, sans-serif);\r\n font-size: var(--rel-fontSizes-md);\r\n color: var(--rel-text-primary, #333);\r\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 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-fontWeights-regular);\r\n color: var(--rel-color-text-primary);\r\n }\r\n\r\n a:hover {\r\n text-decoration: underline;\r\n color: var(--rel-color-text-primary);\r\n }\r\n\r\n a:focus-visible {\r\n outline: 2px solid var(--rel-color-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-fontWeights-bold);\r\n color: var(--rel-color-text-primary);\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 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 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 \"../../styles/vars-v2.css\";\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@customElement(\"rel-button\")\r\nexport class RelButton extends LitElement {\r\n @property({ type: String })\r\n variant: \"default\" | \"primary\" | \"secondary\" | \"text\" | \"link\" | \"icon\" =\r\n \"default\";\r\n\r\n @property({ type: String })\r\n tone: \"default\" | \"primary\" | \"secondary\" | \"critical\" | \"success\" = \"default\";\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 static styles = css`\r\n :host {\r\n display: inline-flex;\r\n }\r\n\r\n button {\r\n font-family: var(--rel-fontFamilies-primary);\r\n font-weight: var(--rel-fontWeights-semibold);\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-space-2xs);\r\n outline: none;\r\n }\r\n\r\n /* Sizes */\r\n .size-small {\r\n height: 32px;\r\n padding: 0 var(--rel-spacing-space-md);\r\n font-size: var(--rel-fontSizes-sm);\r\n }\r\n\r\n .size-medium {\r\n height: 40px;\r\n padding: 0 var(--rel-spacing-space-lg);\r\n font-size: var(--rel-fontSizes-md);\r\n }\r\n\r\n .size-large {\r\n height: 48px;\r\n padding: 0 var(--rel-spacing-space-xl);\r\n font-size: var(--rel-fontSizes-lg);\r\n }\r\n\r\n /* Borders */\r\n .border-corner-radius {\r\n border-radius: var(--rel-borders-radius-border-radius-500);\r\n }\r\n\r\n .border-small-corner-radius {\r\n border-radius: var(--rel-borders-radius-border-radius-200);\r\n }\r\n\r\n .border-no-corner-radius {\r\n border-radius: var(--rel-borders-radius-border-radius-0);\r\n }\r\n\r\n /* Disabled */\r\n :host([disabled]) {\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-color-bg-tertiary) !important;\r\n color: var(--rel-color-text-disabled) !important;\r\n border: none !important;\r\n pointer-events: none;\r\n filter: none !important;\r\n }\r\n\r\n :host([disabled]):host-context([data-theme=\"dark\"]) button,\r\n :host([disabled]):host-context(.dark) button {\r\n background-color: var(--rel-color-bg-tertiary) !important;\r\n color: var(--rel-color-text-disabled) !important;\r\n }\r\n\r\n /* Variants & tones (unchanged) */\r\n .btn-default.tone-default {\r\n background: var(--rel-colors-gray-primary);\r\n color: var(--rel-colors-white);\r\n }\r\n .btn-default.tone-critical {\r\n background: var(--rel-error-surface-default);\r\n color: #ffffff;\r\n }\r\n .btn-default.tone-success {\r\n background: var(--rel-colors-green-tertiary);\r\n color: #ffffff;\r\n }\r\n\r\n .btn-primary.tone-default {\r\n background: var(--rel-colors-green-primary);\r\n color: #000000;\r\n }\r\n .btn-primary.tone-critical {\r\n background: var(--rel-error-surface-default);\r\n color: #ffffff;\r\n }\r\n .btn-primary.tone-success {\r\n background: var(--rel-colors-green-tertiary);\r\n color: #ffffff;\r\n }\r\n\r\n .btn-secondary {\r\n background: var(--rel-colors-white);\r\n border: 1px solid var(--rel-color-border-strong);\r\n color: var(--rel-colors-black);\r\n }\r\n\r\n .btn-text {\r\n background: transparent;\r\n color: var(--rel-colors-black);\r\n }\r\n\r\n .btn-link {\r\n background: transparent;\r\n color: var(--rel-colors-blue-primary);\r\n text-decoration: underline;\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-colors-gray-light);\r\n color: var(--rel-colors-black);\r\n border: none;\r\n }\r\n .btn-icon.tone-primary {\r\n background: var(--rel-colors-green-primary);\r\n color: #000000;\r\n border: none;\r\n }\r\n .btn-icon.tone-secondary {\r\n background: var(--rel-colors-white);\r\n color: var(--rel-colors-black);\r\n border: 1px solid var(--rel-color-border-strong);\r\n }\r\n .btn-icon.tone-success {\r\n background: var(--rel-colors-green-tertiary);\r\n color: #ffffff;\r\n border: none;\r\n }\r\n .btn-icon.tone-critical {\r\n background: var(--rel-error-surface-default);\r\n color: #ffffff;\r\n border: none;\r\n }\r\n\r\n button.btn-primary.tone-default:hover:not(:disabled) {\r\n background: var(--rel-color-brand-hover);\r\n }\r\n\r\n button.btn-primary.tone-critical:hover:not(:disabled) {\r\n filter: brightness(0.9);\r\n }\r\n\r\n button.btn-primary.tone-success:hover:not(:disabled) {\r\n filter: brightness(0.9);\r\n }\r\n\r\n /* Generic hover — excludes icon (handled per-tone below) */\r\n button:hover:not(:disabled):not(.btn-primary):not(.btn-default):not(.btn-icon) {\r\n background: var(--rel-color-bg-hover);\r\n }\r\n\r\n button.btn-default:hover:not(:disabled) {\r\n filter: brightness(0.85);\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 filter: brightness(0.9);\r\n }\r\n button.btn-icon.tone-primary:hover:not(:disabled) {\r\n background: var(--rel-color-brand-hover);\r\n }\r\n button.btn-icon.tone-secondary:hover:not(:disabled) {\r\n background: var(--rel-color-bg-hover);\r\n }\r\n button.btn-icon.tone-success:hover:not(:disabled) {\r\n filter: brightness(0.9);\r\n }\r\n button.btn-icon.tone-critical:hover:not(:disabled) {\r\n filter: brightness(0.9);\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-color-border-focus);\r\n outline-offset: 2px;\r\n }\r\n\r\n /* Dark mode overrides */\r\n :host-context([data-theme=\"dark\"]) button.btn-default.tone-default,\r\n :host-context(.dark) button.btn-default.tone-default {\r\n background: var(--rel-gray-text-primary);\r\n color: #000000;\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) button:focus-visible,\r\n :host-context(.dark) button:focus-visible {\r\n outline-color: var(--rel-color-text-primary);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) button.btn-secondary,\r\n :host-context(.dark) button.btn-secondary,\r\n :host-context([data-theme=\"dark\"]) button.btn-icon.tone-secondary,\r\n :host-context(.dark) button.btn-icon.tone-secondary {\r\n background: var(--rel-color-bg-primary);\r\n border-color: var(--rel-color-border-strong);\r\n color: var(--rel-color-text-primary);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) button.btn-text,\r\n :host-context(.dark) button.btn-text {\r\n color: var(--rel-color-text-primary);\r\n }\r\n\r\n /* btn-link: blue in both modes — no dark override */\r\n `;\r\n\r\n private get classes() {\r\n return [\r\n `btn-${this.variant}`,\r\n `tone-${this.tone}`,\r\n `size-${this.size}`,\r\n `border-${this.border}`,\r\n ].join(\" \");\r\n }\r\n\r\n private handleClick(e: MouseEvent) {\r\n if (this.disabled) {\r\n e.preventDefault();\r\n e.stopImmediatePropagation();\r\n return;\r\n }\r\n\r\n // Re-emit click from host (Angular-friendly)\r\n this.dispatchEvent(\r\n new MouseEvent(\"click\", {\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n render() {\r\n return html`\r\n <button\r\n class=\"${this.classes}\"\r\n ?disabled=${this.disabled}\r\n @click=${this.handleClick}\r\n aria-disabled=${this.disabled}\r\n aria-label=${ifDefined(this.ariaLabel ?? undefined)}\r\n >\r\n <slot></slot>\r\n </button>\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\nimport \"../../styles/vars-v2.css\";\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-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-fontFamilies-primary, sans-serif);\r\n background: var(--rel-colors-white, #fff);\r\n border: 1px solid var(--rel-border-default, #ddd);\r\n border-radius: var(--rel-borders-radius-border-radius-200, 8px);\r\n padding: var(--rel-spacing-space-md, 16px);\r\n max-width: 320px;\r\n color: var(--rel-text-primary, #333);\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-space-md);\r\n }\r\n\r\n .header-center {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-space-xs);\r\n font-size: var(--rel-fontSizes-md);\r\n font-weight: var(--rel-fontWeights-semibold);\r\n color: var(--rel-text-heading);\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-borders-radius-border-radius-200);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n cursor: pointer;\r\n color: var(--rel-color-text-primary);\r\n transition: background-color 0.15s ease;\r\n }\r\n\r\n .nav-button:hover {\r\n background: var(--rel-color-bg-secondary);\r\n }\r\n\r\n .nav-button:focus-visible {\r\n outline: 2px solid var(--rel-color-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-space-3xs);\r\n }\r\n\r\n .weekday {\r\n text-align: center;\r\n font-size: var(--rel-fontSizes-xs);\r\n font-weight: var(--rel-fontWeights-semibold);\r\n color: var(--rel-gray-text-placeholder);\r\n padding: var(--rel-spacing-space-xs);\r\n text-transform: uppercase;\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-borders-radius-border-radius-200);\r\n font-size: var(--rel-fontSizes-sm);\r\n font-weight: var(--rel-fontWeights-medium);\r\n color: var(--rel-text-primary);\r\n cursor: pointer;\r\n position: relative;\r\n transition: all 0.15s ease;\r\n font-family: var(--rel-fontFamilies-primary);\r\n }\r\n\r\n .day-button:hover:not(:disabled):not(.selected) {\r\n background: var(--rel-surface-secondary);\r\n }\r\n\r\n .day-button:focus-visible {\r\n outline: 2px solid var(--rel-color-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-color-brand);\r\n }\r\n\r\n .day-button.selected {\r\n background: var(--rel-color-brand);\r\n color: #000000;\r\n font-weight: var(--rel-fontWeights-semibold);\r\n }\r\n\r\n .day-button.other-month {\r\n color: var(--rel-gray-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-color-bg-primary);\r\n border-color: var(--rel-color-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 });\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: this.isDateDisabledInternal(date),\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 class=\"header\">\r\n <button\r\n 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 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 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 class=\"calendar-grid\" role=\"row\">\r\n ${weekdayLabels.map(\r\n (label) => html`\r\n <div 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 class=\"calendar-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 aria-label=\"${this.formatISODate(day.date)}\"\r\n aria-selected=\"${day.isSelected}\"\r\n ?disabled=${day.isDisabled || (!day.isCurrentMonth && 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 } from \"lit\";\r\nimport { customElement } from \"lit/decorators.js\";\r\nimport \"../../styles/vars-v2.css\";\r\n\r\n@customElement(\"rel-card\")\r\nexport class RelCard extends LitElement {\r\n static styles = css`\r\n :host {\r\n display: block;\r\n font-family: var(--rel-fontFamilies-primary, sans-serif);\r\n }\r\n\r\n .card {\r\n background-color: var(--rel-color-bg-primary);\r\n color: var(--rel-color-text-primary);\r\n border-radius: var(--rel-borders-radius-border-radius-200);\r\n border: 1px solid var(--rel-color-border-default);\r\n padding: var(--rel-spacing-space-md);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .card,\r\n :host-context(.dark) .card {\r\n background-color: var(--rel-color-bg-primary);\r\n border-color: var(--rel-color-border-default);\r\n }\r\n `;\r\n\r\n render() {\r\n return html`\r\n <div class=\"card\">\r\n <slot></slot>\r\n </div>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css, nothing } from \"lit\";\nimport { customElement, property, state, query } from \"lit/decorators.js\";\nimport \"../../styles/vars-v2.css\";\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 @property({ type: String }) 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 display: block;\n font-family: var(--rel-fontFamilies-primary);\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 .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-color-bg-tertiary, #f0f0f0);\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-color-border-default);\n background: var(--rel-color-bg-primary);\n color: var(--rel-color-text-primary);\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-color-bg-secondary);\n }\n\n .nav-button:focus-visible {\n outline: 2px solid var(--rel-color-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: 12px;\n }\n\n .nav-button.next {\n right: 12px;\n }\n\n .nav-button svg {\n width: 20px;\n height: 20px;\n }\n\n /* Dots indicator */\n .dots {\n display: flex;\n justify-content: center;\n gap: var(--rel-spacing-space-xs);\n margin-top: var(--rel-spacing-space-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-color-border-default);\n cursor: pointer;\n padding: 0;\n transition: all 0.15s ease;\n }\n\n .dot:hover {\n background: var(--rel-color-border-divider);\n }\n\n .dot.active {\n background: var(--rel-color-brand);\n width: var(--rel-carousel-dot-size-active, 24px);\n border-radius: 4px;\n }\n\n .dot:focus-visible {\n outline: 2px solid var(--rel-color-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-color-bg-secondary);\n border-color: var(--rel-color-border-default);\n color: var(--rel-color-text-primary);\n }\n\n :host-context([data-theme=\"dark\"]) .nav-button:hover,\n :host-context(.dark) .nav-button:hover {\n background: var(--rel-color-bg-tertiary);\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 if (w === 0) return;\n this.style.setProperty('--rel-carousel-slide-width', `${w}px`);\n this.renderRoot.querySelectorAll('.carousel-clone').forEach(el => {\n (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 if (w > 0) {\n this.style.setProperty('--rel-carousel-slide-width', `${w}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 // 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 lastClone.style.width = `${this.viewport?.offsetWidth ?? 0}px`;\n lastClone.style.boxSizing = 'border-box';\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 firstClone.style.width = `${this.viewport?.offsetWidth ?? 0}px`;\n firstClone.style.boxSizing = 'border-box';\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 unit(): number {\n const slideWidth = this.viewport?.offsetWidth ?? 0;\n const gapValue = this.gap && this.gap > 0 ? this.gap : 0;\n return slideWidth + 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 = `translateX(${translate}px)`;\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 = `translateX(${translate}px)`;\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 = `translateX(${translate}px)`;\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 = 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 currentX = e.clientX;\n const deltaX = currentX - this.dragStartX;\n this.currentTranslate = this.prevTranslate + deltaX;\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 = `translateX(${this.currentTranslate}px)`;\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 deltaX = e.clientX - this.dragStartX;\n const slideWidth = this.viewport.offsetWidth;\n const threshold = slideWidth * 0.2; // 20% threshold\n\n if (Math.abs(deltaX) > threshold) {\n if (deltaX > 0 && (this.value > 0 || this.clonesBefore > 0)) {\n this.goToPrevious();\n } else if (deltaX < 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 e.preventDefault();\n this.goToPrevious();\n break;\n case \"ArrowRight\":\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 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.showButtons\n ? html`\n <button\n class=\"nav-button prev\"\n part=\"prev-button\"\n aria-label=\"Previous slide\"\n ?disabled=${!canGoPrev || this.disabled}\n @click=${this.goToPrevious}\n >\n <svg viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M10 12L6 8L10 4\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n\n <button\n class=\"nav-button next\"\n part=\"next-button\"\n aria-label=\"Next slide\"\n ?disabled=${!canGoNext || this.disabled}\n @click=${this.goToNext}\n >\n <svg viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M6 4L10 8L6 12\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n `\n : nothing}\n </div>\n\n ${this.showDots && this.slideCount > 1\n ? html`\n <div class=\"dots\" part=\"dots\">\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 </div>\n `\n : nothing}\n `;\n }\n}\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\nimport \"../../styles/vars-v2.css\";\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 display: block;\r\n font-family: var(--rel-fontFamilies-primary, sans-serif);\r\n }\r\n\r\n .card-media {\r\n background-color: var(--rel-color-bg-primary);\r\n color: var(--rel-color-text-primary);\r\n border-radius: var(--rel-borders-radius-border-radius-200);\r\n border: 1px solid var(--rel-color-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-space-md);\r\n }\r\n\r\n .card-content h3 {\r\n margin: 0 0 4px 0;\r\n font-size: var(--rel-fontSizes-md);\r\n font-weight: var(--rel-fontWeights-semibold);\r\n color: var(--rel-color-text-heading);\r\n }\r\n\r\n .card-content p {\r\n margin: 0 0 8px 0;\r\n font-size: var(--rel-fontSizes-sm);\r\n color: var(--rel-color-text-primary);\r\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-color-bg-primary);\r\n border-color: var(--rel-color-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-color-text-heading);\r\n }\r\n `;\r\n\r\n render() {\r\n return html`\r\n <div class=\"card-media\">\r\n ${this.imageSrc\r\n ? html`\r\n <div 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 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 display: block;\r\n font-family: var(--rel-fontFamilies-primary);\r\n }\r\n\r\n .wrapper {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n }\r\n\r\n .row {\r\n display: flex;\r\n align-items: center;\r\n gap: 10px;\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-gray-text-primary);\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-color-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-gray-text-primary);\r\n border-color: var(--rel-gray-text-primary);\r\n }\r\n\r\n .checked .check-icon {\r\n display: block;\r\n fill: #ffffff;\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-gray-text-primary);\r\n }\r\n\r\n /* Error unchecked — transparent fill, error border */\r\n .error .box {\r\n border-color: var(--rel-error-surface-default);\r\n }\r\n\r\n /* Error checked — error fill, transparent checkmark */\r\n .error.checked .box {\r\n background: var(--rel-error-surface-default);\r\n border-color: var(--rel-error-surface-default);\r\n }\r\n\r\n .error.checked .check-icon {\r\n fill: #ffffff;\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-error-surface-default);\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-color-text-disabled);\r\n }\r\n\r\n /* Dark mode — tokens auto-flip via vars-v2, declared explicitly for clarity */\r\n :host-context([data-theme=\"dark\"]) .box {\r\n border-color: var(--rel-gray-text-primary);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .checked .box {\r\n background: var(--rel-gray-text-primary);\r\n border-color: var(--rel-gray-text-primary);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .checked .check-icon {\r\n fill: var(--rel-color-bg-primary);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .indeterminate .indeterminate-icon {\r\n fill: var(--rel-gray-text-primary);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .error .box {\r\n border-color: var(--rel-error-surface-default);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .error.checked .box {\r\n background: var(--rel-error-surface-default);\r\n border-color: var(--rel-error-surface-default);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .error.checked .check-icon {\r\n fill: var(--rel-color-bg-primary);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .error.indeterminate .indeterminate-icon {\r\n fill: var(--rel-error-surface-default);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .label {\r\n color: var(--rel-gray-text-primary);\r\n }\r\n\r\n .label {\r\n font-size: var(--rel-fontSizes-md, 14px);\r\n font-weight: var(--rel-fontWeights-medium, 500);\r\n color: var(--rel-gray-text-primary);\r\n }\r\n\r\n .text {\r\n font-size: var(--rel-fontSizes-sm, 12px);\r\n color: var(--rel-text-placeholder, #a9a9a9);\r\n padding-left: 28px;\r\n }\r\n `;\r\n\r\n private toggle() {\r\n if (this.state === \"disabled\") return;\r\n\r\n if (this.status === \"unchecked\") this.status = \"checked\";\r\n else if (this.status === \"checked\") this.status = \"indeterminate\";\r\n else this.status = \"unchecked\";\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 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-colors-white, #fff)\">\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-colors-white, #fff)\">\r\n <rect width=\"16\" height=\"2\" />\r\n </svg>\r\n </span>\r\n\r\n <span class=\"label\">${this.label}</span>\r\n </label>\r\n\r\n ${this.supportingtext\r\n ? html`<span 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\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: String }) min: string | null = null;\r\n @property({ type: String }) max: string | null = null;\r\n @property({ type: String, attribute: \"week-start\" }) weekStart: \"sun\" | \"mon\" = \"sun\";\r\n @property({ type: String }) locale = \"en-US\";\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 // 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 @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 display: inline-block;\r\n font-family: var(--rel-fontFamilies-primary);\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 .date-picker-wrapper {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--rel-spacing-space-xs);\r\n }\r\n\r\n .label {\r\n font-size: var(--rel-fontSizes-sm);\r\n font-weight: var(--rel-fontWeights-medium);\r\n color: var(--rel-text-heading);\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-space-xs);\r\n padding: var(--rel-spacing-space-sm) var(--rel-spacing-space-md);\r\n background: var(--rel-color-bg-primary);\r\n border: 1px solid var(--rel-border-default);\r\n border-radius: var(--rel-borders-radius-border-radius-200);\r\n font-family: var(--rel-fontFamilies-primary);\r\n font-size: var(--rel-fontSizes-md);\r\n color: var(--rel-text-primary);\r\n cursor: pointer;\r\n transition: all 0.15s ease;\r\n text-align: left;\r\n }\r\n\r\n .trigger-button:hover:not(:disabled) {\r\n border-color: var(--rel-color-border-strong);\r\n }\r\n\r\n .trigger-button:focus-visible {\r\n outline: 2px solid var(--rel-color-border-focus);\r\n outline-offset: 2px;\r\n border-color: var(--rel-color-border-focus);\r\n }\r\n\r\n .trigger-button:disabled {\r\n cursor: not-allowed;\r\n background: var(--rel-surface-secondary);\r\n }\r\n\r\n .trigger-content {\r\n flex: 1;\r\n color: var(--rel-text-primary);\r\n }\r\n\r\n .trigger-content.placeholder {\r\n color: var(--rel-colors-gray-placeholder);\r\n }\r\n\r\n .trigger-icons {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-space-2xs);\r\n }\r\n\r\n .icon-button {\r\n background: none;\r\n border: none;\r\n padding: var(--rel-spacing-space-3xs);\r\n cursor: pointer;\r\n color: var(--rel-color-text-placeholder);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: var(--rel-borders-radius-border-radius-100);\r\n transition: all 0.15s ease;\r\n }\r\n\r\n .icon-button:hover {\r\n background: var(--rel-surface-secondary);\r\n color: var(--rel-color-text-primary);\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-color-bg-primary);\r\n border: 1px solid var(--rel-border-default);\r\n border-radius: var(--rel-borders-radius-border-radius-200);\r\n box-shadow: var(--rel-shadows-shadow-300);\r\n padding: var(--rel-spacing-space-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-space-md);\r\n gap: var(--rel-spacing-space-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-borders-radius-border-radius-200);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n cursor: pointer;\r\n color: var(--rel-color-text-primary);\r\n transition: background-color 0.15s ease;\r\n }\r\n\r\n .nav-button:hover {\r\n background: var(--rel-surface-secondary);\r\n }\r\n\r\n .nav-button:focus-visible {\r\n outline: 2px solid var(--rel-color-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-space-xs) var(--rel-spacing-space-sm);\r\n background: var(--rel-color-bg-primary);\r\n border: 1px solid var(--rel-border-default);\r\n border-radius: var(--rel-borders-radius-border-radius-200);\r\n font-family: var(--rel-fontFamilies-primary);\r\n font-size: var(--rel-fontSizes-sm);\r\n font-weight: var(--rel-fontWeights-medium);\r\n color: var(--rel-text-heading);\r\n cursor: pointer;\r\n text-align: center;\r\n transition: all 0.15s ease;\r\n }\r\n\r\n .dropdown-trigger:hover {\r\n background: var(--rel-surface-secondary);\r\n }\r\n\r\n .dropdown-trigger:focus-visible {\r\n outline: 2px solid var(--rel-color-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-color-bg-primary);\r\n border: 1px solid var(--rel-border-default);\r\n border-radius: var(--rel-borders-radius-border-radius-200);\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-space-xs) var(--rel-spacing-space-sm);\r\n cursor: pointer;\r\n font-size: var(--rel-fontSizes-sm);\r\n color: var(--rel-text-primary);\r\n transition: background-color 0.15s ease;\r\n }\r\n\r\n .dropdown-item:hover {\r\n background: var(--rel-surface-secondary);\r\n }\r\n\r\n .dropdown-item.selected {\r\n background: var(--rel-background-info);\r\n color: var(--rel-text-info);\r\n font-weight: var(--rel-fontWeights-semibold);\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-space-3xs);\r\n margin-bottom: var(--rel-spacing-space-xs);\r\n }\r\n\r\n .weekday {\r\n text-align: center;\r\n font-size: var(--rel-fontSizes-xs);\r\n font-weight: var(--rel-fontWeights-semibold);\r\n color: var(--rel-color-text-placeholder);\r\n padding: var(--rel-spacing-space-xs);\r\n text-transform: uppercase;\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-space-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-borders-radius-border-radius-200);\r\n font-size: var(--rel-fontSizes-sm);\r\n font-weight: var(--rel-fontWeights-medium);\r\n color: var(--rel-text-primary);\r\n cursor: pointer;\r\n position: relative;\r\n transition: all 0.15s ease;\r\n font-family: var(--rel-fontFamilies-primary);\r\n }\r\n\r\n .day-button:hover:not(:disabled):not(.selected) {\r\n background: var(--rel-surface-secondary);\r\n }\r\n\r\n .day-button:focus-visible {\r\n outline: 2px solid var(--rel-color-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-colors-green-primary);\r\n }\r\n\r\n .day-button.selected {\r\n background: var(--rel-colors-green-primary);\r\n color: var(--rel-color-text-inverse);\r\n font-weight: var(--rel-fontWeights-semibold);\r\n }\r\n\r\n .day-button.other-month {\r\n color: var(--rel-colors-gray-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 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.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: 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.min) {\r\n const minDate = this.parseISODate(this.min);\r\n if (minDate) startYear = Math.max(startYear, minDate.getFullYear() - 5);\r\n }\r\n\r\n if (this.max) {\r\n const maxDate = this.parseISODate(this.max);\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) 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) 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 return html`\r\n <div class=\"date-picker-wrapper\">\r\n ${this.label\r\n ? html`<label class=\"label\" id=\"date-picker-label\">${this.label}</label>`\r\n : nothing}\r\n\r\n <button\r\n class=\"trigger-button\"\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-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 </div>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css, nothing } from \"lit\";\nimport { customElement, property, state, query } from \"lit/decorators.js\";\nimport \"@reliability-design/icons/rel-icon\";\nimport \"../../styles/vars-v2.css\";\n\ninterface RangeDay {\n date: Date;\n day: number;\n isCurrentMonth: boolean;\n isToday: boolean;\n isDraftFrom: boolean;\n isDraftTo: boolean;\n isInRange: boolean;\n isDisabled: boolean;\n}\n\ninterface QuickSelect {\n label: string;\n key: string;\n from: string;\n to: string;\n fullWidth?: boolean;\n}\n\n@customElement(\"rel-range-picker\")\nexport class RelRangePicker extends LitElement {\n @property({ type: String }) from: string = \"\";\n @property({ type: String }) to: string = \"\";\n @property({ type: String }) locale: string = \"en-US\";\n @property({ type: String, attribute: \"week-start\" }) weekStart: \"mon\" | \"sun\" = \"sun\";\n @property({ type: String, attribute: \"min-date\" }) minDate: string = \"\";\n @property({ type: String, attribute: \"max-date\" }) maxDate: string = \"\";\n @property({ type: Boolean, reflect: true }) disabled = false;\n @property({ type: Boolean, reflect: true }) open = false;\n @property({ type: String }) mode: \"popover\" | \"popup\" = \"popover\";\n\n @state() private draftFrom: string = \"\";\n @state() private draftTo: string = \"\";\n @state() private draftActivePreset: string | null = null;\n @state() private viewYear: number = new Date().getFullYear();\n @state() private viewMonth: number = new Date().getMonth();\n @state() private isSelectingRange: boolean = false;\n @state() private hoverDate: string | null = null;\n\n @query(\".trigger-button\") private triggerButton?: HTMLButtonElement;\n\n static styles = css`\n :host {\n display: inline-block;\n font-family: var(--rel-fontFamilies-primary, Poppins, sans-serif);\n position: relative;\n }\n\n :host([disabled]) {\n opacity: 0.6;\n cursor: not-allowed;\n pointer-events: none;\n }\n\n /* ── Trigger ── */\n .trigger-button {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--rel-spacing-space-xs, 8px);\n padding: var(--rel-spacing-space-sm, 12px) var(--rel-spacing-space-md, 16px);\n background: var(--rel-color-bg-primary, #fff);\n border: 1px solid var(--rel-color-border-default, #ddd);\n border-radius: var(--rel-borders-radius-border-radius-200, 8px);\n font-family: var(--rel-fontFamilies-primary, Poppins, sans-serif);\n font-size: var(--rel-fontSizes-md, 14px);\n color: var(--rel-color-text-primary, #333);\n cursor: pointer;\n min-width: 260px;\n width: 100%;\n text-align: left;\n transition: border-color 0.15s ease;\n }\n\n .trigger-button:hover:not(:disabled) {\n border-color: var(--rel-color-border-strong, #999);\n }\n\n .trigger-button:focus-visible {\n outline: 2px solid var(--rel-color-border-focus, #0091ea);\n outline-offset: 2px;\n }\n\n .trigger-content {\n flex: 1;\n color: var(--rel-color-text-primary, #333);\n }\n\n .trigger-content.placeholder {\n color: var(--rel-color-text-placeholder, #a9a9a9);\n }\n\n /* ── Popover shell ── */\n .popover {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n z-index: 1000;\n border: 1px solid var(--rel-color-border-default, #ddd);\n border-radius: var(--rel-borders-radius-border-radius-200, 8px);\n background: var(--rel-color-bg-primary, #fff);\n box-shadow: var(--rel-shadows-shadow-200);\n overflow: visible;\n display: none;\n }\n\n .popover.open { display: block; }\n\n .popover.popup {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n }\n\n .backdrop {\n position: fixed;\n inset: 0;\n z-index: 999;\n background: rgba(0,0,0,0.4);\n }\n\n /* ── Two-panel wrapper ── */\n .picker-wrapper {\n display: flex;\n flex-direction: row;\n align-items: stretch;\n }\n\n /* ── Left panel: presets ── */\n .presets {\n width: 280px;\n flex-shrink: 0;\n flex-grow: 0;\n border-right: 1px solid var(--rel-color-border-default, #ddd);\n padding: 12px;\n display: flex;\n flex-direction: column;\n gap: 0;\n }\n\n .presets-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 6px;\n }\n\n .preset-item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n cursor: pointer;\n font-size: 13px;\n font-weight: var(--rel-fontWeights-medium, 500);\n font-family: var(--rel-fontFamilies-primary, Poppins, sans-serif);\n color: var(--rel-color-text-primary, #333);\n background: var(--rel-color-bg-tertiary, #f5f5f5);\n border: none;\n border-radius: var(--rel-borders-radius-border-radius-200, 8px);\n width: 100%;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n transition: background 0.15s ease;\n line-height: 1.3;\n }\n\n .preset-item:hover:not(.active) {\n background: var(--rel-color-bg-hover, #eeeeee);\n }\n\n .preset-item.active {\n background: #1A1A1A;\n color: #FFFFFF;\n font-weight: var(--rel-fontWeights-semibold, 600);\n }\n\n .preset-item.full-width {\n grid-column: 1 / -1;\n }\n\n /* ── FROM/TO inputs ── */\n .date-inputs {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 14px 8px 4px;\n border-top: 1px solid var(--rel-color-border-default, #ddd);\n margin-top: auto;\n }\n\n .date-input-group {\n flex: 1;\n min-width: 0;\n position: relative;\n }\n\n .date-input-label {\n position: absolute;\n top: -8px;\n left: 10px;\n font-size: 11px;\n font-weight: var(--rel-fontWeights-medium, 500);\n color: var(--rel-color-text-secondary, #9e9e9e);\n background: var(--rel-color-bg-primary, #fff);\n padding: 0 3px;\n line-height: 1;\n }\n\n .date-input-value {\n display: block;\n border: 1px solid var(--rel-color-border-default, #ddd);\n border-radius: var(--rel-borders-radius-border-radius-200, 8px);\n padding: 6px 8px;\n font-size: var(--rel-fontSizes-md, 14px);\n font-weight: var(--rel-fontWeights-semibold, 600);\n font-family: var(--rel-fontFamilies-primary, Poppins, sans-serif);\n color: var(--rel-color-text-primary, #333);\n background: var(--rel-color-bg-primary, #fff);\n width: 100%;\n box-sizing: border-box;\n }\n\n .date-input-value.empty {\n color: var(--rel-color-text-placeholder, #a9a9a9);\n font-weight: var(--rel-fontWeights-regular, 400);\n }\n\n /* ── Right panel: calendar ── */\n .calendar-panel {\n width: 300px;\n flex-shrink: 0;\n flex-grow: 0;\n padding: 12px;\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .calendar-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 2px;\n }\n\n .month-label {\n font-size: 15px;\n font-weight: var(--rel-fontWeights-semibold, 600);\n color: var(--rel-color-text-heading, #2b2b2b);\n }\n\n .nav-btn {\n background: none;\n border: none;\n cursor: pointer;\n color: var(--rel-color-text-primary, #333);\n padding: 4px;\n border-radius: var(--rel-borders-radius-border-radius-200, 8px);\n display: flex;\n align-items: center;\n transition: background 0.15s ease;\n }\n\n .nav-btn:hover { background: var(--rel-color-bg-hover, #f5f5f5); }\n\n /* ── Weekday header ── */\n .week-header {\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n text-align: center;\n }\n\n .week-day {\n font-size: var(--rel-fontSizes-sm, 12px);\n font-weight: var(--rel-fontWeights-semibold, 600);\n color: var(--rel-color-text-secondary, #9e9e9e);\n padding: 2px 0;\n text-align: center;\n }\n\n /* ── Calendar grid ── */\n .calendar-grid {\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n }\n\n .day-cell {\n height: 36px;\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n }\n\n .day-cell.other-month {\n opacity: 0.35;\n pointer-events: none;\n }\n\n .day-cell.disabled {\n opacity: 0.4;\n pointer-events: none;\n }\n\n .day-cell.in-range {\n background: var(--rel-color-bg-selected, #eeeeee);\n }\n\n .day-cell.range-start:not(.range-end) {\n background: linear-gradient(to right, transparent 50%, var(--rel-color-bg-selected, #eeeeee) 50%);\n }\n\n .day-cell.range-end:not(.range-start) {\n background: linear-gradient(to left, transparent 50%, var(--rel-color-bg-selected, #eeeeee) 50%);\n }\n\n .day-cell.range-start.range-end {\n background: transparent;\n }\n\n /* ── Day inner circle ── */\n .day-inner {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n font-size: 13px;\n font-weight: var(--rel-fontWeights-medium, 500);\n font-family: var(--rel-fontFamilies-primary, Poppins, sans-serif);\n color: var(--rel-color-text-primary, #333);\n position: relative;\n z-index: 1;\n transition: background 0.15s ease;\n line-height: 1;\n }\n\n .day-cell:not(.disabled):not(.other-month):not(.range-start):not(.range-end):hover .day-inner {\n background: var(--rel-color-bg-hover, #f5f5f5);\n }\n\n /* Today: green outline */\n .day-cell.today:not(.range-start):not(.range-end) .day-inner {\n border: 2px solid var(--rel-colors-green-primary, #00f49c);\n }\n\n /* Range endpoints: dark fill */\n .day-cell.range-start .day-inner,\n .day-cell.range-end .day-inner {\n background: #1A1A1A;\n color: #FFFFFF;\n font-weight: var(--rel-fontWeights-semibold, 600);\n }\n\n /* Today AND endpoint: green ring + dark fill */\n .day-cell.today.range-start .day-inner,\n .day-cell.today.range-end .day-inner {\n background: #1A1A1A;\n color: #FFFFFF;\n border: 2px solid var(--rel-colors-green-primary, #00f49c);\n }\n\n /* ── Dark mode overrides ── */\n :host-context([data-theme=\"dark\"]) .day-cell.in-range,\n :host-context(.dark) .day-cell.in-range {\n background: var(--rel-color-bg-selected, #404040);\n }\n\n :host-context([data-theme=\"dark\"]) .day-cell.range-start:not(.range-end),\n :host-context(.dark) .day-cell.range-start:not(.range-end) {\n background: linear-gradient(to right, transparent 50%, var(--rel-color-bg-selected, #404040) 50%);\n }\n\n :host-context([data-theme=\"dark\"]) .day-cell.range-end:not(.range-start),\n :host-context(.dark) .day-cell.range-end:not(.range-start) {\n background: linear-gradient(to left, transparent 50%, var(--rel-color-bg-selected, #404040) 50%);\n }\n\n :host-context([data-theme=\"dark\"]) .day-cell.range-start .day-inner,\n :host-context([data-theme=\"dark\"]) .day-cell.range-end .day-inner,\n :host-context(.dark) .day-cell.range-start .day-inner,\n :host-context(.dark) .day-cell.range-end .day-inner {\n background: #F5F5F5;\n color: #1A1A1A;\n }\n\n :host-context([data-theme=\"dark\"]) .day-cell.today.range-start .day-inner,\n :host-context([data-theme=\"dark\"]) .day-cell.today.range-end .day-inner,\n :host-context(.dark) .day-cell.today.range-start .day-inner,\n :host-context(.dark) .day-cell.today.range-end .day-inner {\n background: #F5F5F5;\n color: #1A1A1A;\n border: 2px solid var(--rel-colors-green-primary, #00f49c);\n }\n\n /* ── Footer ── */\n .calendar-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding-top: 12px;\n border-top: 1px solid var(--rel-color-border-default, #ddd);\n margin-top: auto;\n gap: 8px;\n }\n\n .btn-reset,\n .btn-cancel,\n .btn-apply {\n font-family: var(--rel-fontFamilies-primary, Poppins, sans-serif);\n font-size: var(--rel-fontSizes-md, 14px);\n font-weight: var(--rel-fontWeights-medium, 500);\n border-radius: var(--rel-borders-radius-border-radius-500, 1000px);\n padding: 8px 20px;\n cursor: pointer;\n transition: background 0.15s ease, border-color 0.15s ease;\n white-space: nowrap;\n }\n\n .btn-reset,\n .btn-cancel {\n background: transparent;\n border: 1px solid var(--rel-color-border-default, #ddd);\n color: var(--rel-color-text-primary, #333);\n }\n\n .btn-reset:hover:not(:disabled),\n .btn-cancel:hover {\n background: var(--rel-color-bg-hover, #f5f5f5);\n }\n\n .btn-reset:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n\n .btn-apply {\n background: var(--rel-colors-green-primary, #00f49c);\n border: none;\n color: #000000;\n }\n\n .btn-apply:hover:not(:disabled) {\n background: var(--rel-colors-green-secondary, #06d98c);\n }\n\n .btn-apply:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n\n .footer-right {\n display: flex;\n gap: 8px;\n }\n\n @media (prefers-reduced-motion: reduce) {\n .preset-item, .nav-btn, .day-inner, .btn-reset, .btn-cancel, .btn-apply {\n transition: none;\n }\n }\n `;\n\n // ── Lifecycle ──\n\n connectedCallback() {\n super.connectedCallback();\n document.addEventListener(\"click\", this.handleClickOutside);\n document.addEventListener(\"keydown\", this.handleGlobalKeydown);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n document.removeEventListener(\"click\", this.handleClickOutside);\n document.removeEventListener(\"keydown\", this.handleGlobalKeydown);\n }\n\n // ── Open / close ──\n\n private handleClickOutside = (e: MouseEvent) => {\n if (!this.open) return;\n const path = e.composedPath();\n if (!path.includes(this)) {\n this.cancelPopover();\n }\n };\n\n private handleGlobalKeydown = (e: KeyboardEvent) => {\n if (!this.open) return;\n\n if (e.key === \"Escape\") {\n this.cancelPopover();\n this.triggerButton?.focus();\n return;\n }\n\n if ((e.target as HTMLElement)?.tagName === \"INPUT\") return;\n\n const key = e.key.toUpperCase();\n const keyMap: Record<string, string> = {\n T: \"Today\",\n M: \"Tomorrow\",\n B: \"Before Today\",\n W: \"This Week\",\n N: \"Next Week\",\n \"7\": \"Next 7 Days\",\n \"3\": \"Next 30 Days\",\n };\n\n const label = keyMap[key];\n if (!label) return;\n\n const qs = this.getQuickSelects().find((q) => q.label === label);\n if (qs) this.selectQuickSelect(qs);\n };\n\n private toggleOpen() {\n if (this.disabled) return;\n if (this.open) {\n this.cancelPopover();\n } else {\n this.openPopover();\n }\n }\n\n private openPopover() {\n this.draftFrom = this.from;\n this.draftTo = this.to;\n this.draftActivePreset = null;\n this.isSelectingRange = false;\n this.hoverDate = null;\n\n if (this.draftFrom) {\n const date = this.parseISODate(this.draftFrom);\n if (date) {\n this.viewYear = date.getFullYear();\n this.viewMonth = date.getMonth();\n }\n } else {\n const now = new Date();\n this.viewYear = now.getFullYear();\n this.viewMonth = now.getMonth();\n }\n\n this.open = true;\n this.dispatchEvent(\n new CustomEvent(\"rel-open-change\", {\n detail: { open: true },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private cancelPopover() {\n if (!this.open) return;\n this.open = false;\n this.draftFrom = \"\";\n this.draftTo = \"\";\n this.draftActivePreset = null;\n this.isSelectingRange = false;\n this.hoverDate = null;\n this.dispatchEvent(\n new CustomEvent(\"rel-open-change\", {\n detail: { open: false },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private applySelection() {\n if (this.draftFrom || this.draftTo) {\n this.from = this.draftFrom;\n this.to = this.draftTo;\n this.dispatchEvent(\n new CustomEvent(\"rel-change\", {\n detail: { from: this.from, to: this.to },\n bubbles: true,\n composed: true,\n })\n );\n this.open = false;\n this.isSelectingRange = false;\n this.hoverDate = null;\n this.dispatchEvent(\n new CustomEvent(\"rel-open-change\", {\n detail: { open: false },\n bubbles: true,\n composed: true,\n })\n );\n }\n }\n\n private resetDraft() {\n if (this.draftFrom || this.draftTo) {\n this.draftFrom = \"\";\n this.draftTo = \"\";\n this.draftActivePreset = null;\n this.isSelectingRange = false;\n this.hoverDate = null;\n }\n }\n\n private getTriggerLabel(): string {\n const from = this.from ? this.formatDisplayDate(this.from) : null;\n const to = this.to ? this.formatDisplayDate(this.to) : null;\n if (from && to) return `${from} → ${to}`;\n if (from) return from;\n return \"\";\n }\n\n // ── Date utilities ──\n\n private parseISODate(iso: string): Date | null {\n const m = iso.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\n if (!m) return null;\n return new Date(parseInt(m[1]), parseInt(m[2]) - 1, parseInt(m[3]));\n }\n\n private formatISODate(date: Date): string {\n const y = date.getFullYear();\n const mo = String(date.getMonth() + 1).padStart(2, \"0\");\n const d = String(date.getDate()).padStart(2, \"0\");\n return `${y}-${mo}-${d}`;\n }\n\n private formatDisplayDate(iso: string): string {\n const date = this.parseISODate(iso);\n if (!date) return \"\";\n return new Intl.DateTimeFormat(\"en-US\", {\n month: \"2-digit\",\n day: \"2-digit\",\n year: \"numeric\",\n }).format(date);\n }\n\n private isSameDay(a: Date, b: Date): boolean {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n }\n\n private isDateDisabled(date: Date): boolean {\n if (this.minDate) {\n const min = this.parseISODate(this.minDate);\n if (min && date < min) return true;\n }\n if (this.maxDate) {\n const max = this.parseISODate(this.maxDate);\n if (max && date > max) return true;\n }\n return false;\n }\n\n // ── Quick selects ──\n\n private getQuickSelects(): QuickSelect[] {\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n\n const yesterday = new Date(today);\n yesterday.setDate(today.getDate() - 1);\n\n const tomorrow = new Date(today);\n tomorrow.setDate(today.getDate() + 1);\n\n const dow = today.getDay(); // 0 = Sun\n const thisSunday = new Date(today);\n thisSunday.setDate(today.getDate() - dow);\n const thisSaturday = new Date(thisSunday);\n thisSaturday.setDate(thisSunday.getDate() + 6);\n\n const nextSunday = new Date(thisSunday);\n nextSunday.setDate(thisSunday.getDate() + 7);\n const nextSaturday = new Date(nextSunday);\n nextSaturday.setDate(nextSunday.getDate() + 6);\n\n const next7To = new Date(today);\n next7To.setDate(today.getDate() + 6);\n\n const next30To = new Date(today);\n next30To.setDate(today.getDate() + 29);\n\n return [\n { label: \"Today\", key: \"T\", from: this.formatISODate(today), to: this.formatISODate(today) },\n { label: \"Tomorrow\", key: \"M\", from: this.formatISODate(tomorrow), to: this.formatISODate(tomorrow) },\n { label: \"Before Today\", key: \"B\", from: \"1970-01-01\", to: this.formatISODate(yesterday) },\n { label: \"This Week\", key: \"W\", from: this.formatISODate(thisSunday), to: this.formatISODate(thisSaturday) },\n { label: \"Next Week\", key: \"N\", from: this.formatISODate(nextSunday), to: this.formatISODate(nextSaturday) },\n { label: \"Next 7 Days\", key: \"7\", from: this.formatISODate(today), to: this.formatISODate(next7To) },\n { label: \"Next 30 Days\", key: \"3\", from: this.formatISODate(today), to: this.formatISODate(next30To), fullWidth: true },\n ];\n }\n\n private selectQuickSelect(qs: QuickSelect) {\n if (this.disabled) return;\n this.draftFrom = qs.from;\n this.draftTo = qs.to;\n this.draftActivePreset = qs.label;\n this.isSelectingRange = false;\n this.hoverDate = null;\n\n const date = this.parseISODate(qs.from);\n if (date) {\n this.viewYear = date.getFullYear();\n this.viewMonth = date.getMonth();\n }\n }\n\n // ── Calendar navigation ──\n\n private previousMonth() {\n if (this.viewMonth === 0) {\n this.viewMonth = 11;\n this.viewYear--;\n } else {\n this.viewMonth--;\n }\n }\n\n private nextMonth() {\n if (this.viewMonth === 11) {\n this.viewMonth = 0;\n this.viewYear++;\n } else {\n this.viewMonth++;\n }\n }\n\n private getMonthName(): string {\n return new Intl.DateTimeFormat(\"en-US\", { month: \"long\" }).format(\n new Date(this.viewYear, this.viewMonth, 1)\n );\n }\n\n private getWeekdayLabels(): string[] {\n const formatter = new Intl.DateTimeFormat(\"en-US\", { weekday: \"short\" });\n const base = new Date(2024, 0, 7); // Sunday Jan 7 2024\n return Array.from({ length: 7 }, (_, i) => {\n const offset = this.weekStart === \"mon\" ? i + 1 : i;\n const d = new Date(base);\n d.setDate(base.getDate() + offset);\n return formatter.format(d).substring(0, 2);\n });\n }\n\n // ── Calendar day computation ──\n\n private getCalendarDays(): RangeDay[] {\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n\n const firstDay = new Date(this.viewYear, this.viewMonth, 1);\n const lastDay = new Date(this.viewYear, this.viewMonth + 1, 0);\n\n const draftFromDate = this.draftFrom ? this.parseISODate(this.draftFrom) : null;\n const draftToDate = this.draftTo ? this.parseISODate(this.draftTo) : null;\n\n let effectiveFrom: Date | null = draftFromDate;\n let effectiveTo: Date | null = draftToDate;\n\n if (this.isSelectingRange && this.hoverDate && draftFromDate) {\n const hDate = this.parseISODate(this.hoverDate);\n if (hDate) {\n if (hDate.getTime() >= draftFromDate.getTime()) {\n effectiveFrom = draftFromDate;\n effectiveTo = hDate;\n } else {\n effectiveFrom = hDate;\n effectiveTo = draftFromDate;\n }\n }\n }\n\n const days: RangeDay[] = [];\n\n let startDay = firstDay.getDay();\n if (this.weekStart === \"mon\") {\n startDay = startDay === 0 ? 6 : startDay - 1;\n }\n for (let i = startDay - 1; i >= 0; i--) {\n const date = new Date(this.viewYear, this.viewMonth, -i);\n days.push({\n date,\n day: date.getDate(),\n isCurrentMonth: false,\n isToday: false,\n isDraftFrom: false,\n isDraftTo: false,\n isInRange: false,\n isDisabled: true,\n });\n }\n\n for (let d = 1; d <= lastDay.getDate(); d++) {\n const date = new Date(this.viewYear, this.viewMonth, d);\n const t = date.getTime();\n\n const isDraftFrom = !!effectiveFrom && this.isSameDay(date, effectiveFrom);\n const isDraftTo = !!effectiveTo && this.isSameDay(date, effectiveTo);\n const isInRange =\n !!effectiveFrom &&\n !!effectiveTo &&\n t > effectiveFrom.getTime() &&\n t < effectiveTo.getTime();\n\n days.push({\n date,\n day: d,\n isCurrentMonth: true,\n isToday: this.isSameDay(date, today),\n isDraftFrom,\n isDraftTo,\n isInRange,\n isDisabled: this.isDateDisabled(date),\n });\n }\n\n const remaining = 42 - days.length;\n for (let i = 1; i <= remaining; i++) {\n const date = new Date(this.viewYear, this.viewMonth + 1, i);\n days.push({\n date,\n day: date.getDate(),\n isCurrentMonth: false,\n isToday: false,\n isDraftFrom: false,\n isDraftTo: false,\n isInRange: false,\n isDisabled: true,\n });\n }\n\n return days;\n }\n\n // ── Day click / hover ──\n\n private handleDayClick(day: RangeDay) {\n if (day.isDisabled || this.disabled) return;\n const iso = this.formatISODate(day.date);\n\n if (!this.isSelectingRange) {\n this.draftFrom = iso;\n this.draftTo = \"\";\n this.draftActivePreset = null;\n this.isSelectingRange = true;\n this.hoverDate = null;\n } else {\n const fromDate = this.parseISODate(this.draftFrom);\n if (!fromDate) {\n this.draftFrom = iso;\n this.draftTo = \"\";\n return;\n }\n\n if (day.date.getTime() >= fromDate.getTime()) {\n this.draftTo = iso;\n } else {\n this.draftTo = this.draftFrom;\n this.draftFrom = iso;\n }\n\n this.isSelectingRange = false;\n this.hoverDate = null;\n this.draftActivePreset = null;\n }\n }\n\n private handleDayHover(day: RangeDay) {\n if (!this.isSelectingRange || day.isDisabled) return;\n this.hoverDate = this.formatISODate(day.date);\n }\n\n // ── Render ──\n\n render() {\n const quickSelects = this.getQuickSelects();\n const days = this.getCalendarDays();\n const weekdayLabels = this.getWeekdayLabels();\n\n const draftFromDisplay = this.draftFrom ? this.formatDisplayDate(this.draftFrom) : \"\";\n const draftToDisplay = this.draftTo ? this.formatDisplayDate(this.draftTo) : \"\";\n const triggerLabel = this.getTriggerLabel();\n const isDraftEmpty = !this.draftFrom && !this.draftTo;\n const isPopup = this.mode === \"popup\";\n\n return html`\n <button\n class=\"trigger-button\"\n type=\"button\"\n ?disabled=${this.disabled}\n aria-haspopup=\"dialog\"\n aria-expanded=${this.open}\n aria-label=${triggerLabel || \"Select date range\"}\n @click=${this.toggleOpen}\n >\n <span class=\"trigger-content ${triggerLabel ? \"\" : \"placeholder\"}\">\n ${triggerLabel || \"Select date range\"}\n </span>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\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\"/>\n </svg>\n </button>\n\n ${isPopup && this.open\n ? html`<div class=\"backdrop\" @click=${this.cancelPopover}></div>`\n : nothing}\n\n <div\n class=\"popover ${this.open ? \"open\" : \"\"} ${isPopup ? \"popup\" : \"\"}\"\n role=\"dialog\"\n aria-label=\"Select date range\"\n >\n <div class=\"picker-wrapper\">\n\n <!-- ── Left: Quick select ── -->\n <div class=\"presets\">\n <div class=\"presets-grid\" role=\"list\" aria-label=\"Quick date selections\">\n ${quickSelects.map(\n (qs) => html`\n <button\n class=\"preset-item ${qs.fullWidth ? \"full-width\" : \"\"} ${this.draftActivePreset === qs.label ? \"active\" : \"\"}\"\n type=\"button\"\n role=\"listitem\"\n ?disabled=${this.disabled}\n aria-pressed=${this.draftActivePreset === qs.label}\n @click=${() => this.selectQuickSelect(qs)}\n >\n <span>${qs.label}</span>\n ${this.draftActivePreset === qs.label\n ? html`<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"12\" fill=\"#00F49C\"/>\n <path d=\"M7 12.5l3.5 3.5 6.5-7\" stroke=\"#000000\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>`\n : nothing}\n </button>\n `\n )}\n </div>\n\n <div class=\"date-inputs\">\n <div class=\"date-input-group\" aria-label=\"From date\">\n <span class=\"date-input-label\">FROM</span>\n <div class=\"date-input-value ${draftFromDisplay ? \"\" : \"empty\"}\">\n ${draftFromDisplay || \"MM/DD/YYYY\"}\n </div>\n </div>\n <div class=\"date-input-group\" aria-label=\"To date\">\n <span class=\"date-input-label\">TO</span>\n <div class=\"date-input-value ${draftToDisplay ? \"\" : \"empty\"}\">\n ${draftToDisplay || \"MM/DD/YYYY\"}\n </div>\n </div>\n </div>\n </div>\n\n <!-- ── Right: Calendar panel ── -->\n <div class=\"calendar-panel\">\n\n <div class=\"calendar-header\">\n <button\n class=\"nav-btn\"\n type=\"button\"\n aria-label=\"Previous month\"\n @click=${this.previousMonth}\n >\n <rel-icon name=\"chevron-left\" size=\"sm\"></rel-icon>\n </button>\n <span class=\"month-label\">${this.getMonthName()} ${this.viewYear}</span>\n <button\n class=\"nav-btn\"\n type=\"button\"\n aria-label=\"Next month\"\n @click=${this.nextMonth}\n >\n <rel-icon name=\"chevron-right\" size=\"sm\"></rel-icon>\n </button>\n </div>\n\n <div class=\"week-header\" role=\"row\">\n ${weekdayLabels.map(\n (label) => html`\n <div class=\"week-day\" role=\"columnheader\" aria-label=\"${label}\">\n ${label}\n </div>\n `\n )}\n </div>\n\n <div\n class=\"calendar-grid\"\n role=\"grid\"\n aria-label=\"Select date range\"\n @mouseleave=${() => { this.hoverDate = null; }}\n >\n ${days.map((day) => {\n const cellClasses = [\n \"day-cell\",\n day.isInRange ? \"in-range\" : \"\",\n day.isDraftFrom ? \"range-start\" : \"\",\n day.isDraftTo ? \"range-end\" : \"\",\n day.isToday ? \"today\" : \"\",\n day.isDisabled ? \"disabled\" : \"\",\n !day.isCurrentMonth ? \"other-month\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return html`\n <div\n class=\"${cellClasses}\"\n role=\"gridcell\"\n aria-label=\"${this.formatISODate(day.date)}\"\n aria-selected=\"${day.isDraftFrom || day.isDraftTo || day.isInRange}\"\n @click=${() => this.handleDayClick(day)}\n @mouseenter=${() => this.handleDayHover(day)}\n >\n <span class=\"day-inner\">${day.day}</span>\n </div>\n `;\n })}\n </div>\n\n <div class=\"calendar-footer\">\n <button\n class=\"btn-reset\"\n type=\"button\"\n ?disabled=${isDraftEmpty}\n @click=${this.resetDraft}\n >\n Reset\n </button>\n <div class=\"footer-right\">\n <button\n class=\"btn-cancel\"\n type=\"button\"\n @click=${this.cancelPopover}\n >\n Cancel\n </button>\n <button\n class=\"btn-apply\"\n type=\"button\"\n ?disabled=${isDraftEmpty}\n @click=${this.applySelection}\n >\n Apply\n </button>\n </div>\n </div>\n\n </div>\n </div>\n </div>\n `;\n\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"rel-range-picker\": RelRangePicker;\n }\n}\n","import { LitElement, html, css } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport \"../rel-avatar/rel-avatar.js\";\n\n@customElement(\"rel-chip\")\nexport class RelChip extends LitElement {\n @property({ type: String }) label = \"Label\";\n\n // \"yellow\" renamed to \"orange\" — existing serialized \"yellow\" values will fall through to chip-yellow class (no match) and render unstyled\n @property({ type: String })\n tone: \"default\" | \"blue\" | \"orange\" | \"red\" | \"green\" = \"default\";\n\n @property({ type: String }) leadingIcon?: string;\n @property({ type: String }) 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 static styles = css`\n :host {\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 font-family: var(--rel-fontFamilies-primary);\n font-size: var(--rel-fontSizes-md);\n font-weight: var(--rel-fontWeights-medium);\n border-radius: var(--rel-borders-radius-border-radius-100);\n padding: var(--rel-spacing-space-2xs) var(--rel-spacing-space-xs);\n gap: var(--rel-spacing-space-2xs);\n cursor: pointer;\n border: var(--rel-borders-width-stroke-100) solid transparent;\n user-select: none;\n white-space: nowrap;\n background: transparent;\n }\n\n .chip:hover {\n filter: brightness(0.88);\n box-shadow: var(--rel-shadows-shadow-100);\n }\n\n .chip:focus-visible {\n outline: 2px solid var(--rel-color-border-focus);\n outline-offset: 2px;\n }\n\n .chip:active {\n filter: brightness(0.80);\n box-shadow: var(--rel-shadows-shadow-200);\n }\n\n /* TONES — light (default) */\n /* NOTE: #717171 has no exact vars-v2 token; nearest candidates are\n --rel-colors-gray-toast-bg (#404040) and --rel-colors-gray-divider (#BDBDBD) */\n .chip-default {\n background: #717171;\n color: var(--rel-colors-white);\n }\n\n .chip-blue {\n background: var(--rel-colors-blue-tertiary);\n color: var(--rel-colors-white);\n }\n\n .chip-orange {\n background: var(--rel-colors-yellow-pending);\n color: var(--rel-colors-white);\n }\n\n .chip-red {\n background: var(--rel-colors-red-primary);\n color: var(--rel-colors-white);\n }\n\n .chip-green {\n background: var(--rel-colors-green-tertiary);\n color: var(--rel-colors-white);\n }\n\n /* AVATAR — light mode (all tones)\n rel-avatar uses background-color: var(--rel-colors-gray-disabled-text).\n Overriding that custom property here pins avatar bg to white across all tones.\n NOTE: rel-avatar hardcodes color: #ffffff — text color (#000000) cannot be\n overridden from outside the shadow DOM without ::part() or a custom property\n in rel-avatar itself. */\n .chip rel-avatar {\n display: inline-flex;\n width: 20px !important;\n height: 20px !important;\n flex-shrink: 0;\n font-size: 10px;\n }\n\n .chip-default rel-avatar,\n .chip-blue rel-avatar,\n .chip-orange rel-avatar,\n .chip-red rel-avatar,\n .chip-green rel-avatar {\n --rel-colors-gray-disabled-text: #ffffff;\n --rel-avatar-color: #000000;\n }\n\n .chip-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n }\n\n .chip-icon * {\n width: 100%;\n height: 100%;\n }\n\n .chip-icon ::slotted(svg),\n .chip-icon svg {\n width: 16px;\n height: 16px;\n fill: currentColor;\n }\n\n .chip-remove {\n margin-left: var(--rel-spacing-space-3xs);\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: 2px solid var(--rel-colors-white);\n outline-offset: 1px;\n border-radius: 2px;\n }\n\n /* DARK THEME */\n /* NOTE: #717171 (chip-default dark color) has no exact vars-v2 token */\n /* NOTE: #FFFBF5 (chip-orange dark bg) has no exact vars-v2 token;\n nearest is --rel-colors-gray-light (#FAFAFA) */\n\n /* Reinforce layout — external dark-mode stylesheets can override display/width on the host */\n :host-context([data-theme=\"dark\"]) .chip {\n display: inline-flex;\n width: auto;\n }\n\n :host-context([data-theme=\"dark\"]) .chip-default {\n /* --rel-colors-gray-screen-bg flips to #262626 in dark — hardcoded to preserve #EEEEEE */\n background: #EEEEEE;\n color: #717171;\n }\n\n :host-context([data-theme=\"dark\"]) .chip-blue {\n /* --rel-colors-blue-bg flips to #0f1e2c in dark mode — hardcoded to preserve #E1F2FF */\n background: #E1F2FF;\n color: var(--rel-colors-blue-tertiary);\n }\n\n :host-context([data-theme=\"dark\"]) .chip-orange {\n background: #FFFBF5;\n color: var(--rel-colors-yellow-pending);\n }\n\n :host-context([data-theme=\"dark\"]) .chip-red {\n background: var(--rel-colors-red-light);\n color: var(--rel-colors-red-primary);\n }\n\n :host-context([data-theme=\"dark\"]) .chip-green {\n background: var(--rel-colors-green-bg-light);\n color: var(--rel-colors-green-tertiary);\n }\n\n /* AVATAR — dark mode (per tone: bg = light fill color, text = white) */\n :host-context([data-theme=\"dark\"]) .chip-default rel-avatar {\n --rel-colors-gray-disabled-text: #717171;\n --rel-avatar-color: #ffffff;\n }\n\n :host-context([data-theme=\"dark\"]) .chip-blue rel-avatar {\n --rel-colors-gray-disabled-text: #0059F4;\n --rel-avatar-color: #ffffff;\n }\n\n :host-context([data-theme=\"dark\"]) .chip-orange rel-avatar {\n --rel-colors-gray-disabled-text: #FFBF43;\n --rel-avatar-color: #ffffff;\n }\n\n :host-context([data-theme=\"dark\"]) .chip-red rel-avatar {\n --rel-colors-gray-disabled-text: #CC0000;\n --rel-avatar-color: #ffffff;\n }\n\n :host-context([data-theme=\"dark\"]) .chip-green rel-avatar {\n --rel-colors-gray-disabled-text: #00A86B;\n --rel-avatar-color: #ffffff;\n }\n `;\n\n private get classes() {\n return [\"chip\", `chip-${this.tone}`].join(\" \");\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 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 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`<span class=\"chip-icon\">\n ${this.renderIcon(this.leadingIcon!)}\n </span>`\n : null}\n\n <span class=\"chip-label\">${this.label}</span>\n\n ${this.trailingIcon\n ? html`<span class=\"chip-icon\">\n ${this.renderIcon(this.trailingIcon)}\n </span>`\n : null}\n ${this.removable\n ? html`<button\n class=\"chip-remove\"\n aria-label=\"Remove ${this.label}\"\n @click=${this.handleRemove}\n >\n ✕\n </button>`\n : null}\n </span>\n `;\n }\n\n private renderIcon(iconString: string) {\n const template = document.createElement(\"template\");\n template.innerHTML = iconString.trim();\n return template.content.cloneNode(true);\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 }) padding: \"sm\" | \"md\" | \"lg\" = \"md\";\r\n @property({ type: Boolean }) shadow = false;\r\n @property({ type: String }) background: \"light\" | \"white\" | \"none\" = \"white\";\r\n\r\n static styles = css`\r\n :host {\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-borders-radius-border-radius-200);\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-color-bg-primary);\r\n }\r\n\r\n .bg-light {\r\n background-color: var(--rel-color-bg-secondary);\r\n }\r\n\r\n .bg-none {\r\n background: transparent;\r\n }\r\n\r\n .padding-sm {\r\n padding: var(--rel-spacing-space-xs);\r\n }\r\n\r\n .padding-md {\r\n padding: var(--rel-spacing-space-md);\r\n }\r\n\r\n .padding-lg {\r\n padding: var(--rel-spacing-space-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 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 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-fontFamilies-primary);\r\n color: var(--rel-color-text-primary);\r\n }\r\n\r\n /* Horizontal */\r\n .rel-divider.horizontal {\r\n width: 100%;\r\n height: var(--rel-borders-width-stroke-100);\r\n background-color: var(--rel-color-border-divider);\r\n margin: var(--rel-spacing-space-md) 0;\r\n }\r\n\r\n /* Vertical */\r\n .rel-divider.vertical {\r\n width: var(--rel-borders-width-stroke-100);\r\n background-color: var(--rel-color-border-divider);\r\n margin: 0 var(--rel-spacing-space-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 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 --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-color-bg-primary);\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-fontFamilies-primary);\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-borders-radius-border-radius-200)\r\n var(--rel-borders-radius-border-radius-200)\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-color-border-divider);\r\n border-radius: var(--rel-borders-radius-border-radius-500);\r\n margin: var(--rel-spacing-space-xs) auto var(--rel-spacing-space-2xs);\r\n cursor: grab;\r\n touch-action: none;\r\n }\r\n\r\n .handle:active {\r\n cursor: grabbing;\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-space-2xs);\r\n padding: var(--rel-spacing-space-md) var(--rel-spacing-space-lg);\r\n border-bottom: var(--rel-borders-width-stroke-100) solid var(--rel-color-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 }\r\n\r\n .title {\r\n font-size: var(--rel-fontSizes-lg);\r\n font-weight: var(--rel-fontWeights-semibold);\r\n color: var(--rel-text-heading);\r\n margin: 0;\r\n }\r\n\r\n .description {\r\n font-size: var(--rel-fontSizes-sm);\r\n color: var(--rel-text-primary);\r\n margin: 0;\r\n opacity: 0.8;\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-space-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-borders-radius-border-radius-100);\r\n color: var(--rel-color-text-primary);\r\n transition: background 0.15s ease;\r\n }\r\n\r\n .close-button:hover {\r\n background: var(--rel-surface-secondary, #fafafa);\r\n }\r\n\r\n .close-button:active {\r\n background: var(--rel-color-border-divider);\r\n }\r\n\r\n .close-button:focus-visible {\r\n outline: 2px solid var(--rel-color-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-space-lg);\r\n }\r\n\r\n /* Footer */\r\n .footer {\r\n flex-shrink: 0;\r\n padding: var(--rel-spacing-space-md) var(--rel-spacing-space-lg);\r\n border-top: var(--rel-borders-width-stroke-100) solid var(--rel-color-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 = this.shadowRoot?.querySelector<HTMLElement>(\"[autofocus], .close-button, .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 = this.shadowRoot?.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-space-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 } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport \"../../styles/vars-v2.css\";\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 display: inline-flex;\n align-items: center;\n justify-content: center;\n font-family: var(--rel-fontFamilies-primary);\n font-weight: var(--rel-fontWeights-medium);\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 line-height: 1;\n vertical-align: middle;\n }\n\n :host([size=\"sm\"]) {\n font-size: var(--rel-fontSizes-xs);\n padding: var(--rel-spacing-space-3xs) var(--rel-spacing-space-xs);\n min-width: 20px;\n height: 20px;\n border-radius: var(--rel-borders-radius-border-radius-100);\n }\n\n :host([size=\"md\"]) {\n font-size: var(--rel-fontSizes-sm);\n padding: var(--rel-spacing-space-2xs) var(--rel-spacing-space-sm);\n min-width: 24px;\n height: 24px;\n border-radius: var(--rel-borders-radius-border-radius-100);\n }\n\n :host([size=\"lg\"]) {\n font-size: var(--rel-fontSizes-md);\n padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-md);\n min-width: 32px;\n height: 32px;\n border-radius: var(--rel-borders-radius-border-radius-200);\n }\n\n :host([variant=\"default\"]) {\n background: var(--rel-color-bg-secondary);\n color: var(--rel-color-text-heading);\n border: var(--rel-borders-width-stroke-100) solid var(--rel-color-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-color-bg-secondary);\n color: var(--rel-color-text-placeholder);\n border: var(--rel-borders-width-stroke-100) solid var(--rel-color-border-divider);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.03);\n }\n\n :host([pill]) {\n border-radius: var(--rel-borders-radius-border-radius-500);\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-color-bg-secondary);\n border-color: var(--rel-color-border-divider);\n }\n\n :host([inset][variant=\"muted\"]) {\n background: var(--rel-color-border-divider);\n border-color: var(--rel-color-border-default);\n }\n `;\n\n render() {\n return html`<slot></slot>`;\n }\n}\n","import { LitElement, html, css } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport \"../../styles/vars-v2.css\";\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 display: grid;\n width: 100%;\n font-family: var(--rel-fontFamilies-primary);\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 \"../../styles/vars-v2.css\";\n\nexport type MenuType = \"default\" | \"checkbox\" | \"arrow\";\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 display: inline-block;\n }\n\n .rel-menu {\n position: relative;\n display: inline-block;\n background: var(--rel-color-bg-primary);\n color: var(--rel-color-text-primary);\n border-radius: var(--rel-borders-radius-border-radius-300);\n box-shadow: var(--rel-shadows-shadow-300);\n min-width: 220px;\n font-family: var(--rel-fontFamilies-primary, sans-serif);\n font-size: var(--rel-fontSizes-sm);\n padding: var(--rel-spacing-space-3xs) 0;\n outline: none;\n overflow: hidden;\n }\n\n .rel-menu:focus-visible,\n :host(:focus-visible) .rel-menu {\n outline: 2px solid var(--rel-color-border-focus);\n outline-offset: 2px;\n }\n\n .rel-menu-item {\n position: relative;\n display: flex;\n align-items: center;\n gap: var(--rel-spacing-space-xs);\n padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-sm);\n line-height: var(--rel-lineHeights-sm);\n cursor: pointer;\n transition: background 0.15s ease, color 0.15s ease;\n user-select: none;\n }\n\n .rel-menu-item:hover {\n background: var(--rel-color-bg-hover);\n }\n\n .rel-menu-item:active {\n background: var(--rel-color-bg-hover);\n }\n\n .rel-menu-item.active {\n background: var(--rel-color-bg-hover);\n font-weight: var(--rel-fontWeights-medium);\n }\n\n .rel-menu-item.disabled {\n background-color: transparent;\n color: var(--rel-color-text-disabled);\n cursor: not-allowed;\n }\n\n .rel-menu-item[data-focused=\"true\"] {\n outline: 2px solid var(--rel-color-border-focus);\n outline-offset: -2px;\n }\n\n .menu-check-row {\n display: inline-flex;\n align-items: center;\n gap: var(--rel-spacing-space-2xs);\n width: 100%;\n }\n\n .menu-checkbox {\n width: 16px;\n height: 16px;\n cursor: pointer;\n }\n\n .menu-checkbox:disabled {\n cursor: not-allowed;\n }\n\n .menu-label {\n flex: 1 1 auto;\n }\n\n .chevron {\n font-size: var(--rel-fontSizes-lg);\n opacity: 0.75;\n transform: translateY(1px);\n }\n\n .rel-submenu {\n position: absolute;\n top: calc(-1 * var(--rel-spacing-space-3xs));\n left: calc(100% + var(--rel-spacing-space-2xs));\n min-width: 200px;\n background: var(--rel-color-bg-primary);\n color: var(--rel-color-text-primary);\n border-radius: var(--rel-borders-radius-border-radius-300);\n box-shadow: var(--rel-shadows-shadow-300);\n padding: var(--rel-spacing-space-3xs) 0;\n visibility: hidden;\n pointer-events: none;\n z-index: 20;\n }\n\n .rel-submenu.visible {\n visibility: visible;\n pointer-events: auto;\n }\n\n .rel-submenu .rel-menu-item {\n padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-sm);\n }\n `;\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 private handleDocumentClick = (e: MouseEvent) => {\n if (!this.contains(e.target as Node)) {\n this._items = this._items.map(i => ({ ...i, open: false }));\n }\n };\n\n private onItemEnter(item: MenuItem, index: number) {\n if (this.type === \"arrow\" && item.submenu?.length) {\n this._items = this._items.map((i, idx) => ({ ...i, open: idx === index }));\n }\n }\n\n private onItemLeave(_item: MenuItem) {\n // Keep open so user can move into submenu\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 const next = !item.open;\n this._items = this._items.map((i, idx) => ({\n ...i,\n open: idx === index ? next : false,\n }));\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._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 toggleCheckbox(item: MenuItem, ev: Event) {\n ev.stopPropagation();\n if (!item.disabled) {\n item.checked = !item.checked;\n this.dispatchEvent(\n new CustomEvent(\"rel-check\", {\n detail: { item, checked: item.checked },\n bubbles: true,\n composed: true,\n })\n );\n this.requestUpdate();\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 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._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\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)}\"\n @click=\"${(e: Event) => this.onItemClick(item, index, e)}\">\n ${this.type === \"checkbox\"\n ? html`\n <div class=\"menu-check-row\">\n <input\n class=\"menu-checkbox\"\n type=\"checkbox\"\n .checked=\"${item.checked || false}\"\n ?disabled=\"${item.disabled}\"\n @click=\"${(e: Event) => this.toggleCheckbox(item, e)}\" />\n <span class=\"menu-label\">${item.label}</span>\n </div>\n `\n : html`\n <span class=\"menu-label\">${item.label}</span>\n ${this.type === \"arrow\" && item.submenu?.length\n ? html`<span class=\"chevron\">▸</span>`\n : \"\"}\n `}\n ${this.type === \"arrow\" && item.submenu?.length\n ? html`\n <div\n 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 class=\"rel-menu\"\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 } 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\";\nimport \"../../styles/vars-v2.css\";\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 :host {\n display: block;\n }\n\n :host > slot {\n display: none;\n }\n\n .menubar-container {\n display: flex;\n align-items: stretch;\n background: var(--rel-color-bg-secondary);\n border: var(--rel-borders-width-stroke-100) solid var(--rel-color-border-default);\n border-radius: var(--rel-borders-radius-border-radius-200);\n overflow: hidden;\n padding: 0;\n gap: var(--rel-spacing-space-3xs);\n font-family: var(--rel-fontFamilies-primary);\n font-size: var(--rel-fontSizes-sm);\n height: 40px;\n }\n\n .menubar-trigger {\n display: flex;\n align-items: center;\n align-self: stretch;\n height: 100%;\n padding: 0 var(--rel-spacing-space-sm);\n background: transparent;\n border: none;\n cursor: pointer;\n font-family: inherit;\n font-size: inherit;\n color: var(--rel-color-text-heading);\n transition: background 0.15s ease;\n user-select: none;\n outline: none;\n }\n\n .menubar-trigger:hover,\n .menubar-trigger.active {\n background: var(--rel-color-bg-selected);\n }\n\n .menubar-trigger:focus-visible {\n outline: 2px solid var(--rel-color-border-focus);\n outline-offset: 2px;\n }\n\n .menubar-panel {\n position: fixed;\n min-width: 220px;\n background: var(--rel-color-bg-primary);\n border: var(--rel-borders-width-stroke-100) solid var(--rel-color-border-default);\n border-radius: var(--rel-borders-radius-border-radius-200);\n box-shadow: var(--rel-shadows-shadow-300);\n padding: 0;\n overflow: hidden;\n z-index: 1000;\n display: none;\n }\n\n .menubar-panel.open {\n display: block;\n }\n\n .menu-item {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--rel-spacing-space-sm);\n padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-md);\n cursor: pointer;\n transition: background 0.15s ease;\n user-select: none;\n color: var(--rel-color-text-heading);\n line-height: var(--rel-lineHeights-sm);\n }\n\n .menu-item:hover,\n .menu-item.focused {\n background: var(--rel-color-bg-selected);\n }\n\n .menu-item[data-disabled=\"true\"] {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .menu-separator {\n height: var(--rel-borders-width-stroke-100);\n background: var(--rel-color-border-divider);\n margin: 0;\n padding: 0;\n }\n\n rel-icon {\n display: inline-flex;\n pointer-events: none;\n }\n\n .menu-submenu-trigger {\n position: relative;\n }\n\n .menu-submenu-trigger rel-icon {\n opacity: 0.6;\n }\n\n .submenu-panel {\n position: fixed;\n min-width: 200px;\n background: var(--rel-color-bg-primary);\n border: var(--rel-borders-width-stroke-100) solid var(--rel-color-border-default);\n border-radius: var(--rel-borders-radius-border-radius-200);\n box-shadow: var(--rel-shadows-shadow-300);\n padding: 0;\n overflow: hidden;\n z-index: 1001;\n display: none;\n }\n\n .submenu-panel.open {\n display: block;\n }\n\n .menu-shortcut {\n opacity: 0.6;\n font-size: var(--rel-fontSizes-xs);\n margin-left: auto;\n display: flex;\n align-items: center;\n gap: var(--rel-spacing-space-3xs);\n }\n\n .menubar-panel rel-checkbox {\n display: block;\n width: 100%;\n padding: var(--rel-spacing-space-xs, 8px) var(--rel-spacing-space-md, 16px);\n box-sizing: border-box;\n cursor: pointer;\n }\n `;\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 if (!this.contains(e.target as Node)) {\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 <slot></slot>\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, css } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport \"../../styles/vars-v2.css\";\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 display: block;\n font-family: var(--rel-fontFamilies-primary);\n }\n\n .rel-radio-group {\n display: flex;\n flex-direction: column;\n gap: var(--rel-spacing-space-xs);\n }\n\n .rel-radio-option {\n display: flex;\n flex-direction: column;\n gap: var(--rel-spacing-space-3xs);\n cursor: pointer;\n padding: 4px 6px;\n margin: -4px -6px;\n }\n\n .rel-radio-option.disabled {\n opacity: 0.6;\n cursor: not-allowed !important;\n }\n\n .rel-radio-option:not(.disabled):hover {\n background: var(--rel-color-bg-hover, #f5f5f5);\n }\n\n .rel-radio-option:not(.disabled):hover .radio-custom {\n border-color: #525252;\n }\n\n .rel-radio-option:not(.disabled):hover .radio-label {\n color: #525252;\n }\n\n .rel-radio-option:not(.disabled):hover .radio-supporting {\n color: #7D7D7D;\n }\n\n .rel-radio-option:focus-within:has(input:focus-visible) {\n outline: 1px solid #000000;\n outline-offset: 0;\n }\n\n .radio-main {\n display: flex;\n align-items: center;\n gap: var(--rel-spacing-space-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-color-text-heading);\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-color-text-heading);\n border-radius: 50%;\n }\n\n .radio-label {\n font-size: var(--rel-fontSizes-sm);\n font-weight: var(--rel-fontWeights-medium);\n color: var(--rel-color-text-primary);\n }\n\n .radio-supporting {\n font-size: var(--rel-fontSizes-xs);\n margin-left: 28px;\n color: var(--rel-color-text-placeholder);\n }\n\n /* Error state — unchecked only */\n .rel-radio-option.error-unchecked .radio-custom {\n border-color: #CE3131;\n }\n\n .rel-radio-option.error-unchecked .radio-label {\n color: #CE3131;\n }\n\n .rel-radio-option.error-unchecked .radio-supporting {\n color: #CE3131;\n }\n\n /* Error message below group */\n .error-message {\n font-size: var(--rel-fontSizes-xs, 10px);\n color: #CE3131;\n margin-top: var(--rel-spacing-space-2xs, 4px);\n }\n\n /* Dark mode hover overrides */\n :host-context([data-theme=\"dark\"]) .rel-radio-option:not(.disabled):hover .radio-custom,\n :host-context(.dark) .rel-radio-option:not(.disabled):hover .radio-custom {\n border-color: var(--rel-color-text-secondary, #D4D4D4);\n }\n\n :host-context([data-theme=\"dark\"]) .rel-radio-option:not(.disabled):hover .radio-label,\n :host-context(.dark) .rel-radio-option:not(.disabled):hover .radio-label {\n color: var(--rel-color-text-secondary, #D4D4D4);\n }\n\n :host-context([data-theme=\"dark\"]) .rel-radio-option:not(.disabled):hover .radio-supporting,\n :host-context(.dark) .rel-radio-option:not(.disabled):hover .radio-supporting {\n color: var(--rel-color-text-placeholder, #A3A3A3);\n }\n\n :host-context([data-theme=\"dark\"]) .rel-radio-option:focus-within:has(input:focus-visible),\n :host-context(.dark) .rel-radio-option:focus-within:has(input:focus-visible) {\n outline-color: var(--rel-color-text-primary, #F5F5F5);\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 renderOption(option: RadioOption) {\n const isChecked = this.selectedValue === option.value;\n const isDisabled = this.disabled || option.disabled;\n const isErrorActive = this.error && !isChecked;\n\n const classes = [\n \"rel-radio-option\",\n isDisabled ? \"disabled\" : \"\",\n isErrorActive ? \"error-unchecked\" : \"\",\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 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 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\";\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 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-colors-white, #fff);\r\n color: var(--rel-text-primary, #333);\r\n border-bottom: 1px solid var(--rel-border-default, #ddd);\r\n height: 64px;\r\n padding: 0 var(--rel-spacing-space-lg);\r\n box-sizing: border-box;\r\n font-family: var(--rel-fontFamilies-primary, sans-serif);\r\n }\r\n\r\n .brand {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-space-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-space-sm);\r\n flex: 1;\r\n justify-content: flex-start;\r\n padding: 0 var(--rel-spacing-space-xl);\r\n }\r\n\r\n .actions {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-space-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-space-md);\r\n }\r\n\r\n :host([device=\"mobile\"]) .navbar {\r\n height: 56px;\r\n padding: 0 var(--rel-spacing-space-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 \"../../styles/vars-v2.css\";\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 * 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 --rel-topbar-height: 64px;\r\n --rel-topbar-height-compact: 48px;\r\n --rel-topbar-bg: var(--rel-color-bg-primary);\r\n --rel-topbar-border-color: var(--rel-border-default, #ddd);\r\n --rel-topbar-item-color: var(--rel-color-text-primary);\r\n --rel-topbar-item-active-color: var(--rel-colors-green-tertiary, #00a86b);\r\n --rel-topbar-item-active-indicator: var(--rel-colors-green-primary, #00f49c);\r\n --rel-topbar-item-hover-bg: var(--rel-color-bg-secondary);\r\n --rel-topbar-divider-color: var(--rel-border-divider, #bdbdbd);\r\n --rel-topbar-carrier-action-bg: var(--rel-color-text-primary);\r\n --rel-topbar-carrier-action-color: var(--rel-color-bg-primary);\r\n --rel-topbar-z: 100;\r\n\r\n display: block;\r\n width: 100%;\r\n font-family: var(--rel-fontFamilies-primary, 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-borders-width-stroke-100, 1px) solid var(--rel-topbar-border-color);\r\n padding: 0 var(--rel-spacing-space-xl, 24px);\r\n box-sizing: border-box;\r\n gap: var(--rel-spacing-space-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-space-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-space-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-borders-width-stroke-100, 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-space-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-space-2xs, 4px) var(--rel-spacing-space-sm, 12px);\r\n border-radius: var(--rel-borders-radius-border-radius-500, 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-borders-radius-border-radius-200, 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-borders-width-stroke-100, 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-space-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-space-xs, 8px) var(--rel-spacing-space-xl, 24px);\r\n color: var(--rel-topbar-item-color);\r\n font-family: var(--rel-fontFamilies-primary, Poppins, sans-serif);\r\n font-size: var(--rel-fontSizes-md, 14px);\r\n font-weight: var(--rel-fontWeights-medium, 500);\r\n text-decoration: none;\r\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\";\nimport \"../../styles/vars-v2.css\";\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 display: inline-flex;\n align-items: center;\n }\n\n a {\n display: inline-flex;\n align-items: center;\n gap: var(--rel-spacing-space-xs);\n text-decoration: none;\n color: var(--rel-color-text-primary);\n font-weight: var(--rel-fontWeights-semibold);\n font-size: var(--rel-fontSizes-md);\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\";\nimport \"../../styles/vars-v2.css\";\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-space-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\";\nimport \"../../styles/vars-v2.css\";\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-space-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\";\nimport \"../../styles/vars-v2.css\";\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\";\nimport \"../../styles/vars-v2.css\";\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-color-bg-primary);\n border-radius: var(--rel-borders-radius-border-radius-200);\n box-shadow: var(--rel-shadow-200);\n padding: var(--rel-spacing-space-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\";\nimport \"../../styles/vars-v2.css\";\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-space-xs, 8px) var(--rel-spacing-space-md, 16px);\n color: var(--rel-color-text-primary);\n text-decoration: none;\n font-size: var(--rel-fontSizes-md);\n font-family: var(--rel-fontFamilies-primary, sans-serif);\n }\n\n .dropdown-item:hover {\n background: var(--rel-color-bg-hover);\n border-radius: 0;\n }\n\n :host([active]) .dropdown-item {\n color: var(--rel-topbar-item-active-color, var(--rel-colors-green-tertiary, #00a86b));\n font-weight: var(--rel-fontWeights-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 \"../../styles/vars-v2.css\";\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 * 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 --_item-color: var(--rel-topbar-item-color, var(--rel-text-primary, #333));\r\n --_item-active-color: var(--rel-topbar-item-active-color, var(--rel-colors-green-tertiary, #00a86b));\r\n --_item-active-indicator: var(--rel-topbar-item-active-indicator, var(--rel-colors-green-primary, #00f49c));\r\n --_item-hover-bg: var(--rel-topbar-item-hover-bg, var(--rel-surface-secondary, #fafafa));\r\n\r\n display: inline-block;\r\n position: relative;\r\n font-family: var(--rel-fontFamilies-primary, 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-space-2xs, 4px);\r\n padding: var(--rel-spacing-space-xs, 8px) var(--rel-spacing-space-sm, 12px);\r\n border: none;\r\n background: transparent;\r\n border-radius: var(--rel-borders-radius-border-radius-200, 8px);\r\n cursor: pointer;\r\n color: var(--_item-color);\r\n font-family: inherit;\r\n font-size: var(--rel-fontSizes-md, 14px);\r\n font-weight: var(--rel-fontWeights-medium, 500);\r\n line-height: var(--rel-lineHeights-md, 20px);\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;\r\n }\r\n\r\n .trigger::after {\r\n content: \"\";\r\n position: absolute;\r\n bottom: -2px;\r\n left: var(--rel-spacing-space-sm, 12px);\r\n right: var(--rel-spacing-space-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-fontWeights-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-color-bg-primary);\r\n border: var(--rel-borders-width-stroke-100, 1px) solid var(--rel-color-border-default);\r\n border-radius: var(--rel-borders-radius-border-radius-200, 8px);\r\n box-shadow: var(--rel-shadows-shadow-300);\r\n padding: var(--rel-spacing-space-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 \"../../styles/vars-v2.css\";\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 * 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 --_profile-radius: var(--rel-borders-radius-border-radius-500, 1000px);\r\n --_avatar-size: 36px;\r\n --_avatar-size-sm: 28px;\r\n --_avatar-bg: var(--rel-colors-green-primary, #00f49c);\r\n --_avatar-color: var(--rel-color-text-primary);\r\n\r\n /* Reward tier colours (reference existing token palette) */\r\n --rel-topbar-reward-gold: var(--rel-colors-gold, #d6ba00);\r\n --rel-topbar-reward-gold-bg: var(--rel-colors-gold-light, #f6efd7);\r\n --rel-topbar-reward-silver: var(--rel-colors-silver, #bababa);\r\n --rel-topbar-reward-silver-bg: var(--rel-colors-silver-secondary, #f0f0f0);\r\n --rel-topbar-reward-platinum: var(--rel-colors-platinum, #8392c9);\r\n --rel-topbar-reward-platinum-bg: var(--rel-colors-platinum-secondary, #e4e6f2);\r\n --rel-topbar-reward-bronze: var(--rel-colors-bronze, #7d5300);\r\n --rel-topbar-reward-bronze-bg: var(--rel-colors-bronze-secondary, #e2dac7);\r\n --rel-topbar-reward-regular: var(--rel-colors-gray-divider, #bdbdbd);\r\n --rel-topbar-reward-regular-bg: var(--rel-color-bg-secondary);\r\n\r\n display: inline-flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-space-xs, 8px);\r\n font-family: var(--rel-fontFamilies-primary, 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\n font-size: var(--rel-fontSizes-md, 14px);\r\n font-weight: var(--rel-fontWeights-medium, 500);\r\n color: var(--rel-color-text-primary);\r\n line-height: var(--rel-lineHeights-md, 20px);\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n }\r\n\r\n .subtitle {\r\n font-size: var(--rel-fontSizes-sm, 12px);\r\n font-weight: var(--rel-fontWeights-regular, 400);\r\n color: var(--rel-color-text-placeholder);\r\n line-height: var(--rel-lineHeights-sm, 18px);\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\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-space-3xs, 2px);\r\n padding: 2px var(--rel-spacing-space-2xs, 4px);\r\n border-radius: var(--rel-borders-radius-border-radius-100, 2px);\r\n font-size: var(--rel-fontSizes-xs, 10px);\r\n font-weight: var(--rel-fontWeights-bold, 700);\r\n text-transform: uppercase;\r\n letter-spacing: 0.4px;\r\n flex-shrink: 0;\r\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-colors-gray-primary, #333);\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-colors-gray-primary, #333);\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-space-xs, 8px);\r\n padding: var(--rel-spacing-space-2xs, 4px) var(--rel-spacing-space-xs, 8px);\r\n border-radius: var(--rel-borders-radius-border-radius-200, 8px);\r\n background: var(--rel-surface-secondary, #fafafa);\r\n border: var(--rel-borders-width-stroke-100, 1px) solid var(--rel-color-border-default);\r\n }\r\n\r\n :host([compact]) .carrier-tile {\r\n padding: var(--rel-spacing-space-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-colors-gold)\",\r\n platinum: \"var(--rel-colors-platinum)\",\r\n silver: \"var(--rel-colors-silver)\",\r\n bronze: \"var(--rel-colors-bronze)\",\r\n regular: \"var(--rel-colors-green-primary)\",\r\n };\r\n return map[this.reward] ?? \"var(--rel-colors-green-primary)\";\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 @property({ type: String }) 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 display: inline-block;\r\n font-family: var(--rel-fontFamilies-primary);\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-space-2xs);\r\n position: relative;\r\n }\r\n\r\n .otp-group {\r\n display: flex;\r\n gap: var(--rel-spacing-space-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-gray-divider-default);\r\n font-size: var(--rel-fontSizes-lg);\r\n font-weight: var(--rel-fontWeights-semibold);\r\n user-select: none;\r\n padding: 0 var(--rel-spacing-space-3xs);\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-borders-width-stroke-100) solid var(--rel-color-border-default);\r\n border-radius: var(--rel-borders-radius-border-radius-200);\r\n background: var(--rel-color-bg-primary);\r\n font-family: var(--rel-fontFamilies-primary);\r\n font-size: var(--rel-fontSizes-lg);\r\n font-weight: var(--rel-fontWeights-medium);\r\n text-align: center;\r\n color: var(--rel-color-text-primary);\r\n outline: none;\r\n transition: border-color 0.15s ease, box-shadow 0.15s ease;\r\n caret-color: var(--rel-color-text-primary);\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-size: var(--rel-fontSizes-md);\r\n }\r\n\r\n :host([size=\"lg\"]) .otp-cell {\r\n width: 48px;\r\n height: 56px;\r\n font-size: var(--rel-fontSizes-xl);\r\n }\r\n\r\n .otp-cell::placeholder {\r\n color: var(--rel-color-text-placeholder);\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-color-text-primary);\r\n }\r\n\r\n .otp-cell:focus-visible {\r\n border-color: var(--rel-color-text-heading);\r\n box-shadow: 0 0 0 2px var(--rel-color-border-default);\r\n }\r\n\r\n .otp-cell:disabled {\r\n background: var(--rel-color-bg-secondary);\r\n color: var(--rel-color-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-color-bg-tertiary);\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-error);\r\n }\r\n\r\n :host([invalid]) .otp-cell:focus {\r\n border-color: var(--rel-border-error);\r\n box-shadow: 0 0 0 2px var(--rel-background-error-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=\"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=\"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\";\r\nimport { customElement, property, state } from \"lit/decorators.js\";\r\nimport \"../../styles/vars-v2.css\";\r\n\r\ntype DensityType = \"comfortable\" | \"compact\";\r\ntype VariantType = \"default\" | \"icons\";\r\ntype PageItem =\r\n | { type: \"page\"; value: number }\r\n | { type: \"ellipsis\" }\r\n | { type: \"spacer\" }\r\n | { type: \"prev\" }\r\n | { type: \"next\" };\r\n\r\n@customElement(\"rel-pagination\")\r\nexport class RelPagination extends LitElement {\r\n @property({ type: Number }) page?: number;\r\n @property({ type: Number }) defaultPage = 1;\r\n @property({ type: Number }) totalPages = 0;\r\n @property({ type: Number }) siblingCount = 1;\r\n @property({ type: Number }) boundaryCount = 1;\r\n @property({ type: Boolean, reflect: true }) disabled = false;\r\n @property({ type: String }) density: DensityType = \"comfortable\";\r\n @property({ type: String }) variant: VariantType = \"default\";\r\n @property({ type: String }) hrefTemplate = \"\";\r\n @property({ type: String }) ariaLabel = \"Pagination\";\r\n\r\n @state() private currentPage = 1;\r\n\r\n static styles = css`\r\n :host {\r\n display: inline-block;\r\n font-family: var(--rel-fontFamilies-primary);\r\n }\r\n\r\n nav {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-space-2xs);\r\n min-width: max-content;\r\n }\r\n\r\n nav.compact {\r\n gap: var(--rel-spacing-space-3xs);\r\n }\r\n\r\n button,\r\n a {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 40px;\r\n height: 40px;\r\n padding: 0;\r\n font-family: var(--rel-fontFamilies-primary);\r\n font-size: var(--rel-fontSizes-sm);\r\n font-weight: var(--rel-fontWeights-medium);\r\n color: var(--rel-color-text-heading);\r\n background: var(--rel-color-bg-primary);\r\n border: var(--rel-borders-width-stroke-100) solid var(--rel-color-border-default);\r\n border-radius: var(--rel-borders-radius-border-radius-200);\r\n cursor: pointer;\r\n transition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease;\r\n text-decoration: none;\r\n outline: none;\r\n user-select: none;\r\n }\r\n\r\n button.prev-btn, button.next-btn,\r\n a.prev-btn, a.next-btn {\r\n width: auto;\r\n padding: 0 var(--rel-spacing-space-sm);\r\n }\r\n\r\n nav.compact button,\r\n nav.compact a {\r\n width: 32px;\r\n height: 32px;\r\n padding: 0;\r\n font-size: var(--rel-fontSizes-xs);\r\n }\r\n\r\n nav.compact button.prev-btn, nav.compact button.next-btn,\r\n nav.compact a.prev-btn, nav.compact a.next-btn {\r\n width: auto;\r\n padding: 0 var(--rel-spacing-space-xs);\r\n }\r\n\r\n button:hover:not(:disabled),\r\n a:hover:not([aria-disabled=\"true\"]) {\r\n background: var(--rel-color-bg-secondary);\r\n border-color: var(--rel-color-text-primary);\r\n }\r\n\r\n button:focus-visible,\r\n a:focus-visible {\r\n outline: 2px solid var(--rel-colors-blue-primary);\r\n outline-offset: 2px;\r\n }\r\n\r\n button:disabled,\r\n a[aria-disabled=\"true\"] {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n }\r\n\r\n button[aria-current=\"page\"],\r\n a[aria-current=\"page\"] {\r\n background: var(--rel-color-bg-selected);\r\n color: var(--rel-color-text-primary);\r\n border-color: var(--rel-color-text-heading);\r\n font-weight: var(--rel-fontWeights-semibold);\r\n }\r\n\r\n button[aria-current=\"page\"]:hover,\r\n a[aria-current=\"page\"]:hover {\r\n background: var(--rel-color-bg-selected);\r\n border-color: var(--rel-color-text-heading);\r\n }\r\n\r\n .ellipsis {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 40px;\r\n height: 40px;\r\n color: var(--rel-color-text-placeholder);\r\n font-size: var(--rel-fontSizes-sm);\r\n user-select: none;\r\n }\r\n\r\n nav.compact .ellipsis {\r\n width: 32px;\r\n height: 32px;\r\n font-size: var(--rel-fontSizes-xs);\r\n }\r\n\r\n .pagination-spacer {\r\n display: inline-flex;\r\n width: 40px;\r\n height: 40px;\r\n }\r\n\r\n nav.compact .pagination-spacer {\r\n width: 32px;\r\n height: 32px;\r\n }\r\n\r\n .icon {\r\n width: 16px;\r\n height: 16px;\r\n display: inline-block;\r\n }\r\n\r\n nav.compact .icon {\r\n width: 14px;\r\n height: 14px;\r\n }\r\n\r\n :host([disabled]) {\r\n cursor: not-allowed;\r\n }\r\n\r\n :host([disabled]) nav {\r\n opacity: 0.5;\r\n pointer-events: none;\r\n }\r\n `;\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n // Manually parse numeric attributes in case they were set before upgrade\r\n const totalPagesAttr = this.getAttribute('total-pages');\r\n if (totalPagesAttr) {\r\n this.totalPages = Number(totalPagesAttr);\r\n }\r\n const pageAttr = this.getAttribute('page');\r\n if (pageAttr) {\r\n this.page = Number(pageAttr);\r\n }\r\n const defaultPageAttr = this.getAttribute('default-page');\r\n if (defaultPageAttr) {\r\n this.defaultPage = Number(defaultPageAttr);\r\n }\r\n this.currentPage = this.page ?? this.defaultPage;\r\n }\r\n\r\n updated(changedProperties: Map<string, any>) {\r\n // Handle controlled mode: sync currentPage with page prop\r\n if (changedProperties.has(\"page\") && this.page !== undefined) {\r\n this.currentPage = this.page;\r\n }\r\n }\r\n\r\n private get activePage(): number {\r\n return this.page ?? this.currentPage;\r\n }\r\n\r\n private generatePageItems(): PageItem[] {\r\n const items: PageItem[] = [];\r\n const current = this.activePage;\r\n const total = this.totalPages;\r\n\r\n if (total <= 0) return items;\r\n\r\n items.push({ type: \"prev\" });\r\n\r\n if (total <= 7) {\r\n for (let i = 1; i <= total; i++) {\r\n items.push({ type: \"page\", value: i });\r\n }\r\n } else if (current <= 4) {\r\n // Near start: [1, 2, 3, 4, 5] [ellipsis] [last]\r\n for (let i = 1; i <= 5; i++) {\r\n items.push({ type: \"page\", value: i });\r\n }\r\n items.push({ type: \"ellipsis\" });\r\n items.push({ type: \"page\", value: total });\r\n } else if (current >= total - 3) {\r\n // Near end: [1] [ellipsis] [last-4, last-3, last-2, last-1, last]\r\n items.push({ type: \"page\", value: 1 });\r\n items.push({ type: \"ellipsis\" });\r\n for (let i = total - 4; i <= total; i++) {\r\n items.push({ type: \"page\", value: i });\r\n }\r\n } else {\r\n // Middle: [1] [ellipsis] [current-1, current, current+1] [ellipsis] [last]\r\n items.push({ type: \"page\", value: 1 });\r\n items.push({ type: \"ellipsis\" });\r\n items.push({ type: \"page\", value: current - 1 });\r\n items.push({ type: \"page\", value: current });\r\n items.push({ type: \"page\", value: current + 1 });\r\n items.push({ type: \"ellipsis\" });\r\n items.push({ type: \"page\", value: total });\r\n }\r\n\r\n items.push({ type: \"next\" });\r\n\r\n return items;\r\n }\r\n\r\n private handlePageChange(newPage: number) {\r\n if (this.disabled || newPage < 1 || newPage > this.totalPages || newPage === this.activePage) {\r\n return;\r\n }\r\n\r\n // If uncontrolled, update internal state\r\n if (this.page === undefined) {\r\n this.currentPage = newPage;\r\n }\r\n\r\n // Always emit event\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-change\", {\r\n detail: { page: newPage },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private getHref(page: number): string {\r\n if (!this.hrefTemplate) return \"#\";\r\n return this.hrefTemplate.replace(/\\{page\\}/, String(page));\r\n }\r\n\r\n private handleKeyDown(event: KeyboardEvent, callback: () => void) {\r\n if (event.key === \"Enter\" || event.key === \" \") {\r\n event.preventDefault();\r\n callback();\r\n }\r\n }\r\n\r\n private renderPrevIcon() {\r\n return html`\r\n <svg class=\"icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M15 18l-6-6 6-6\" />\r\n </svg>\r\n `;\r\n }\r\n\r\n private renderNextIcon() {\r\n return html`\r\n <svg class=\"icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M9 18l6-6-6-6\" />\r\n </svg>\r\n `;\r\n }\r\n\r\n private renderItem(item: PageItem) {\r\n const current = this.activePage;\r\n const useLinks = !!this.hrefTemplate;\r\n\r\n if (item.type === \"spacer\") {\r\n return html`<span class=\"pagination-spacer\"></span>`;\r\n }\r\n\r\n if (item.type === \"ellipsis\") {\r\n return html`<span class=\"ellipsis\">…</span>`;\r\n }\r\n\r\n if (item.type === \"prev\") {\r\n const disabled = current === 1 || this.disabled;\r\n const targetPage = current - 1;\r\n\r\n if (useLinks) {\r\n const href = disabled ? \"#\" : this.getHref(targetPage);\r\n return html`\r\n <a\r\n href=\"${href}\"\r\n class=\"prev-btn\"\r\n aria-label=\"Go to previous page\"\r\n aria-disabled=\"${disabled}\"\r\n @click=\"${(e: Event) => {\r\n if (disabled) {\r\n e.preventDefault();\r\n return;\r\n }\r\n e.preventDefault();\r\n this.handlePageChange(targetPage);\r\n }}\"\r\n >\r\n ${this.variant === \"icons\" ? this.renderPrevIcon() : \"Previous\"}\r\n </a>\r\n `;\r\n }\r\n\r\n return html`\r\n <button\r\n type=\"button\"\r\n class=\"prev-btn\"\r\n aria-label=\"Go to previous page\"\r\n ?disabled=\"${disabled}\"\r\n @click=\"${() => this.handlePageChange(targetPage)}\"\r\n >\r\n ${this.variant === \"icons\" ? this.renderPrevIcon() : \"Previous\"}\r\n </button>\r\n `;\r\n }\r\n\r\n if (item.type === \"next\") {\r\n const disabled = current === this.totalPages || this.disabled;\r\n const targetPage = current + 1;\r\n\r\n if (useLinks) {\r\n const href = disabled ? \"#\" : this.getHref(targetPage);\r\n return html`\r\n <a\r\n href=\"${href}\"\r\n class=\"next-btn\"\r\n aria-label=\"Go to next page\"\r\n aria-disabled=\"${disabled}\"\r\n @click=\"${(e: Event) => {\r\n if (disabled) {\r\n e.preventDefault();\r\n return;\r\n }\r\n e.preventDefault();\r\n this.handlePageChange(targetPage);\r\n }}\"\r\n >\r\n ${this.variant === \"icons\" ? this.renderNextIcon() : \"Next\"}\r\n </a>\r\n `;\r\n }\r\n\r\n return html`\r\n <button\r\n type=\"button\"\r\n class=\"next-btn\"\r\n aria-label=\"Go to next page\"\r\n ?disabled=\"${disabled}\"\r\n @click=\"${() => this.handlePageChange(targetPage)}\"\r\n >\r\n ${this.variant === \"icons\" ? this.renderNextIcon() : \"Next\"}\r\n </button>\r\n `;\r\n }\r\n\r\n // Page item\r\n const pageNum = item.value;\r\n const isCurrent = pageNum === current;\r\n\r\n if (useLinks) {\r\n const href = this.getHref(pageNum);\r\n return html`\r\n <a\r\n href=\"${href}\"\r\n aria-label=\"Go to page ${pageNum}\"\r\n aria-current=\"${isCurrent ? \"page\" : \"false\"}\"\r\n @click=\"${(e: Event) => {\r\n e.preventDefault();\r\n this.handlePageChange(pageNum);\r\n }}\"\r\n >\r\n ${pageNum}\r\n </a>\r\n `;\r\n }\r\n\r\n return html`\r\n <button\r\n type=\"button\"\r\n aria-label=\"Go to page ${pageNum}\"\r\n aria-current=\"${isCurrent ? \"page\" : \"false\"}\"\r\n @click=\"${() => this.handlePageChange(pageNum)}\"\r\n >\r\n ${pageNum}\r\n </button>\r\n `;\r\n }\r\n\r\n render() {\r\n const items = this.generatePageItems();\r\n\r\n return html`\r\n <nav\r\n class=\"${this.density === \"compact\" ? \"compact\" : \"\"}\"\r\n aria-label=\"${this.ariaLabel}\"\r\n role=\"navigation\"\r\n >\r\n ${items.map((item) => this.renderItem(item))}\r\n </nav>\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 \"../../styles/vars-v2.css\";\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 }) side: SideType = \"bottom\";\r\n @property({ type: String }) 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 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 if (this.side === \"top\") {\r\n top = t.top - c.height - this.sideOffset;\r\n left = t.left + t.width / 2 - c.width / 2;\r\n }\r\n if (this.side === \"bottom\") {\r\n top = t.bottom + this.sideOffset;\r\n left = t.left + t.width / 2 - c.width / 2;\r\n }\r\n if (this.side === \"left\") {\r\n top = t.top + t.height / 2 - c.height / 2;\r\n left = t.left - c.width - this.sideOffset;\r\n }\r\n if (this.side === \"right\") {\r\n top = t.top + t.height / 2 - c.height / 2;\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\nimport \"../../styles/vars-v2.css\";\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 static styles = css`\r\n :host {\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-color-bg-primary);\r\n border: var(--rel-borders-width-stroke-100) solid var(--rel-color-border-default);\r\n border-radius: var(--rel-borders-radius-border-radius-200);\r\n box-shadow: var(--rel-shadows-shadow-300);\r\n padding: var(--rel-spacing-space-md);\r\n font-family: var(--rel-fontFamilies-primary);\r\n font-size: var(--rel-fontSizes-sm);\r\n color: var(--rel-color-text-heading);\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-space-xs);\r\n font-weight: var(--rel-fontWeights-semibold);\r\n color: var(--rel-color-text-heading);\r\n }\r\n\r\n .popover-content ::slotted(p) {\r\n margin: 0 0 var(--rel-spacing-space-sm);\r\n color: var(--rel-color-text-placeholder);\r\n line-height: var(--rel-lineHeights-md);\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\nimport \"../../styles/vars-v2.css\";\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 display: block;\r\n font-family: var(--rel-fontFamilies-primary);\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-color-border-default);\r\n border-radius: var(--rel-borders-radius-border-radius-0);\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-color-text-primary);\r\n height: 100%;\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-color-border-default);\r\n stroke-width: 3;\r\n }\r\n\r\n .circular-progress {\r\n fill: none;\r\n stroke: var(--rel-color-text-primary);\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-color-text-primary);\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 class=\"linear-track\" role=\"progressbar\"\r\n aria-valuenow=\"${this.safeValue}\" aria-valuemin=\"0\" aria-valuemax=\"100\">\r\n <div class=\"linear-bar\" 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 class=\"linear-track\" role=\"progressbar\">\r\n <div 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 @property({ type: String }) 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 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 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 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 :host {\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\nimport \"../../styles/vars-v2.css\";\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 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-color-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-color-bg-selected);\r\n }\r\n\r\n :host(:focus-visible) {\r\n outline: 2px solid var(--rel-colors-blue-primary);\r\n outline-offset: 2px;\r\n }\r\n\r\n .grabber {\r\n background: var(--rel-color-icon-primary);\r\n border-radius: var(--rel-borders-radius-border-radius-500);\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-color-bg-primary);\r\n }\r\n\r\n :host([data-dragging]) {\r\n background: var(--rel-color-bg-selected);\r\n }\r\n\r\n :host([data-dragging]) .grabber {\r\n background: var(--rel-color-text-primary);\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\nimport \"../../styles/vars-v2.css\";\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 display: inline-block;\r\n font-family: var(--rel-fontFamilies-primary);\r\n }\r\n\r\n .segmented-buttons {\r\n display: inline-flex;\r\n border: 1px solid var(--rel-color-border-default);\r\n border-radius: var(--rel-borders-radius-border-radius-100);\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 background: var(--rel-color-bg-primary);\r\n border: none;\r\n border-radius: 0;\r\n cursor: pointer;\r\n font-weight: var(--rel-fontWeights-medium);\r\n border-right: 1px solid var(--rel-color-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-color-text-heading);\r\n font-family: var(--rel-fontFamilies-primary);\r\n }\r\n\r\n .segment:first-child {\r\n border-radius: var(--rel-borders-radius-border-radius-100) 0 0 var(--rel-borders-radius-border-radius-100);\r\n }\r\n\r\n .segment:last-child {\r\n border-radius: 0 var(--rel-borders-radius-border-radius-100) var(--rel-borders-radius-border-radius-100) 0;\r\n border-right: none;\r\n }\r\n\r\n .segment:focus-visible {\r\n outline: 2px solid var(--rel-color-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-color-bg-hover);\r\n }\r\n\r\n /* Active */\r\n .segment.active {\r\n background: #2B2B2B;\r\n color: #FFFFFF;\r\n border-radius: var(--rel-borders-radius-border-radius-100) !important;\r\n }\r\n\r\n .segment.active:hover:not(.disabled) {\r\n background: #333333;\r\n color: #FFFFFF;\r\n }\r\n\r\n /* Dark mode active override */\r\n :host-context([data-theme=\"dark\"]) .segment.active,\r\n :host-context(.dark) .segment.active {\r\n background: #F5F5F5;\r\n color: #1A1A1A;\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .segment.active:hover,\r\n :host-context(.dark) .segment.active:hover {\r\n background: #D4D4D4;\r\n color: #1A1A1A;\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-color-bg-tertiary);\r\n color: var(--rel-color-text-disabled);\r\n }\r\n\r\n /* Sizes */\r\n .segmented-buttons.small .segment {\r\n padding: var(--rel-spacing-space-3xs) var(--rel-spacing-space-xs);\r\n font-size: var(--rel-fontSizes-xs);\r\n }\r\n\r\n .segmented-buttons.medium .segment {\r\n padding: var(--rel-spacing-space-2xs) var(--rel-spacing-space-sm);\r\n font-size: var(--rel-fontSizes-sm);\r\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 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 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 } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\nimport \"../../styles/vars-v2.css\";\r\nimport \"@reliability-design/icons/rel-icon\";\r\n\r\nexport type SelectState = \"default\" | \"error\" | \"disabled\";\r\nexport type SelectSize = \"small\" | \"medium\" | \"large\";\r\nexport type SelectBorder = \"rounded\" | \"sharp\";\r\n\r\n@customElement(\"rel-select\")\r\nexport class RelSelect extends LitElement {\r\n @property({ type: String }) label: string = \"\";\r\n\r\n @property({ type: Array }) options: string[] = [];\r\n\r\n @property({ type: String }) selected: string = \"\";\r\n\r\n @property({ type: String }) state: SelectState = \"default\";\r\n\r\n @property({ type: String }) supportingText: string = \"\";\r\n\r\n @property({ type: String }) size: SelectSize = \"medium\";\r\n\r\n @property({ type: String }) border: SelectBorder = \"rounded\";\r\n\r\n @property({ type: String }) leftIcon: string = \"\";\r\n\r\n @property({ type: String }) rightIcon: string = \"\";\r\n\r\n static styles = css`\r\n :host {\r\n display: block;\r\n font-family: var(--rel-fontFamilies-primary);\r\n width: 100%;\r\n }\r\n\r\n .select-wrapper {\r\n display: flex;\r\n flex-direction: column;\r\n width: 100%;\r\n }\r\n\r\n .select-label {\r\n font-size: var(--rel-fontSizes-sm);\r\n margin-bottom: var(--rel-spacing-space-3xs);\r\n font-weight: var(--rel-fontWeights-medium);\r\n color: var(--rel-color-text-heading);\r\n }\r\n\r\n .select-container {\r\n position: relative;\r\n display: flex;\r\n align-items: center;\r\n }\r\n\r\n .icon {\r\n position: absolute;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n pointer-events: none;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n font-size: 16px;\r\n color: var(--rel-color-text-primary);\r\n }\r\n\r\n .icon.left {\r\n left: 10px;\r\n pointer-events: none;\r\n position: absolute;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n }\r\n\r\n .icon.right {\r\n right: 36px;\r\n }\r\n\r\n .icon.chevron {\r\n right: 12px;\r\n pointer-events: none;\r\n position: absolute;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n color: var(--rel-color-text-primary);\r\n }\r\n\r\n .select-error .icon.chevron {\r\n color: var(--rel-error-surface-default, #D50000);\r\n }\r\n\r\n .select-disabled .icon.chevron {\r\n color: var(--rel-color-text-disabled);\r\n }\r\n\r\n select {\r\n flex: 1;\r\n appearance: none;\r\n border: 1px solid var(--rel-color-border-default);\r\n background-color: var(--rel-color-bg-primary);\r\n font-family: var(--rel-fontFamilies-primary);\r\n cursor: pointer;\r\n transition: border-color 0.2s ease-in-out, box-shadow 0.2s ease-in-out, background-color 0.2s ease-in-out;\r\n color: var(--rel-color-text-heading);\r\n width: 100%;\r\n outline: none;\r\n }\r\n\r\n select:hover:not(:disabled) {\r\n border-color: var(--rel-color-text-primary);\r\n }\r\n\r\n select:focus-visible:not(:disabled) {\r\n border-color: var(--rel-color-border-focus);\r\n box-shadow: 0 0 0 2px var(--rel-color-border-focus);\r\n }\r\n\r\n /* States */\r\n select.error {\r\n border-color: var(--rel-error-surface-default, #D50000);\r\n border-width: 2px;\r\n }\r\n\r\n select.error:focus {\r\n box-shadow: 0 0 0 3px var(--rel-error-surface-light);\r\n }\r\n\r\n select:disabled {\r\n background-color: var(--rel-color-bg-tertiary);\r\n border-color: var(--rel-color-border-default);\r\n color: var(--rel-color-text-disabled);\r\n cursor: not-allowed;\r\n opacity: 0.6;\r\n }\r\n\r\n /* Sizes */\r\n .select-small select {\r\n font-size: var(--rel-fontSizes-xs);\r\n padding: var(--rel-spacing-space-3xs) 36px\r\n var(--rel-spacing-space-3xs) var(--rel-spacing-space-2xs);\r\n }\r\n\r\n .select-medium select {\r\n font-size: var(--rel-fontSizes-sm);\r\n padding: var(--rel-spacing-space-2xs) 40px\r\n var(--rel-spacing-space-2xs) var(--rel-spacing-space-xs);\r\n }\r\n\r\n .select-large select {\r\n font-size: var(--rel-fontSizes-md);\r\n padding: var(--rel-spacing-space-xs) 44px\r\n var(--rel-spacing-space-xs) var(--rel-spacing-space-sm);\r\n }\r\n\r\n /* With icons */\r\n .with-left-icon.select-small select {\r\n padding-left: var(--rel-spacing-space-xl);\r\n }\r\n\r\n .with-left-icon.select-medium select {\r\n padding-left: var(--rel-spacing-space-2xl);\r\n }\r\n\r\n .with-left-icon.select-large select {\r\n padding-left: var(--rel-spacing-space-3xl);\r\n }\r\n\r\n .with-right-icon.select-small select {\r\n padding-right: var(--rel-spacing-space-2xl);\r\n }\r\n\r\n .with-right-icon.select-medium select {\r\n padding-right: var(--rel-spacing-space-3xl);\r\n }\r\n\r\n .with-right-icon.select-large select {\r\n padding-right: 4rem;\r\n }\r\n\r\n /* Border */\r\n .border-rounded select {\r\n border-radius: var(--rel-borders-radius-border-radius-100);\r\n }\r\n\r\n .border-sharp select {\r\n border-radius: 0;\r\n }\r\n\r\n /* Supporting text */\r\n .supporting-text {\r\n font-size: var(--rel-fontSizes-xs);\r\n margin-top: var(--rel-spacing-space-3xs);\r\n color: var(--rel-color-text-placeholder);\r\n }\r\n\r\n .error-text {\r\n color: var(--rel-error-surface-default, #D50000);\r\n }\r\n\r\n .select-error .select-label {\r\n color: var(--rel-error-surface-default, #D50000);\r\n }\r\n\r\n /* Dark mode — flip select background, text, border */\r\n :host-context([data-theme=\"dark\"]) select,\r\n :host-context(.dark) select {\r\n background-color: var(--rel-color-bg-secondary);\r\n color: #ffffff;\r\n border-color: var(--rel-color-border-default);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) select.error,\r\n :host-context(.dark) select.error {\r\n border-color: var(--rel-error-surface-default, #FF5252);\r\n border-width: 2px;\r\n }\r\n\r\n /* Error — placeholder text red */\r\n select.error::placeholder {\r\n color: var(--rel-error-surface-default, #D50000);\r\n }\r\n\r\n /* Error — selected/placeholder option text red */\r\n .select-error select {\r\n color: var(--rel-error-surface-default, #D50000);\r\n }\r\n\r\n /* Error — icon red */\r\n .select-error .icon,\r\n .select-error rel-icon {\r\n color: var(--rel-error-surface-default, #D50000);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .select-error select,\r\n :host-context(.dark) .select-error select {\r\n color: var(--rel-error-surface-default, #FF5252);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .select-error .icon,\r\n :host-context([data-theme=\"dark\"]) .select-error rel-icon,\r\n :host-context(.dark) .select-error .icon,\r\n :host-context(.dark) .select-error rel-icon {\r\n color: var(--rel-error-surface-default, #FF5252);\r\n }\r\n\r\n /* Disabled label */\r\n .select-disabled .select-label {\r\n color: var(--rel-color-text-disabled);\r\n cursor: not-allowed;\r\n user-select: none;\r\n }\r\n\r\n `;\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n const leftIcon = this.getAttribute('left-icon');\r\n if (leftIcon) this.leftIcon = leftIcon;\r\n const rightIcon = this.getAttribute('right-icon');\r\n if (rightIcon) this.rightIcon = rightIcon;\r\n }\r\n\r\n private onChange(event: Event) {\r\n const value = (event.target as HTMLSelectElement).value;\r\n this.selected = value;\r\n this.dispatchEvent(\r\n new CustomEvent(\"changed\", {\r\n detail: { value },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n render() {\r\n const containerClasses = [\r\n \"select-container\",\r\n this.leftIcon ? \"with-left-icon\" : \"\",\r\n this.rightIcon ? \"with-right-icon\" : \"\",\r\n `select-${this.size}`,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n const wrapperClasses = [\r\n \"select-wrapper\",\r\n `select-${this.state}`,\r\n `border-${this.border}`,\r\n ].join(\" \");\r\n\r\n const selectClasses = [this.state === \"error\" ? \"error\" : \"\"]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n const isDisabled = this.state === \"disabled\";\r\n\r\n return html`\r\n <div class=\"${wrapperClasses}\">\r\n ${this.label\r\n ? html`<label class=\"select-label\">${this.label}</label>`\r\n : \"\"}\r\n\r\n <div class=\"${containerClasses}\">\r\n ${this.leftIcon\r\n ? html`<rel-icon name=\"${this.leftIcon}\" size=\"sm\" class=\"icon left\"></rel-icon>`\r\n : \"\"}\r\n\r\n <select\r\n class=\"${selectClasses}\"\r\n ?disabled=\"${isDisabled}\"\r\n @change=\"${this.onChange}\"\r\n .value=\"${this.selected}\">\r\n <option value=\"\" disabled ?selected=\"${!this.selected}\" hidden>\r\n Select Option\r\n </option>\r\n ${this.options.map(\r\n (option) => html`\r\n <option value=\"${option}\" ?selected=\"${option === this.selected}\">\r\n ${option}\r\n </option>\r\n `\r\n )}\r\n </select>\r\n\r\n ${this.rightIcon\r\n ? html`<span class=\"icon right\">${this.rightIcon}</span>`\r\n : \"\"}\r\n\r\n <rel-icon name=\"chevron-down\" size=\"sm\" class=\"icon chevron\"></rel-icon>\r\n </div>\r\n\r\n ${this.supportingText\r\n ? html`\r\n <span\r\n class=\"supporting-text ${this.state === \"error\"\r\n ? \"error-text\"\r\n : \"\"}\">\r\n ${this.supportingText}\r\n </span>\r\n `\r\n : \"\"}\r\n </div>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\nimport { customElement, property, query } from \"lit/decorators.js\";\nimport \"../../styles/vars-v2.css\";\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 @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 --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-color-bg-primary);\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-fontFamilies-primary);\n width: clamp(360px, 49vw, 708px);\n left: 50%;\n transition: transform 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-borders-radius-border-radius-200);\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-borders-radius-border-radius-200);\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-borders-radius-border-radius-200);\n transform: translate(-50%, -50%);\n }\n\n .modal-container.open .panel[data-side=\"center\"] {\n transform: translate(-50%, -50%);\n }\n\n .header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n padding: var(--rel-spacing-space-md) var(--rel-spacing-space-lg);\n border-bottom: var(--rel-borders-width-stroke-100) solid var(--rel-color-border-default);\n flex-shrink: 0;\n }\n\n .header.empty {\n display: none;\n }\n\n .header-text {\n display: flex;\n flex-direction: column;\n gap: var(--rel-spacing-space-2xs);\n }\n\n .title {\n font-size: var(--rel-fontSizes-lg);\n font-weight: var(--rel-fontWeights-semibold);\n color: var(--rel-color-text-heading);\n margin: 0;\n }\n\n .description {\n font-size: var(--rel-fontSizes-sm);\n color: var(--rel-color-text-primary);\n margin: 0;\n }\n\n .close-button {\n background: transparent;\n border: none;\n cursor: pointer;\n padding: var(--rel-spacing-space-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-borders-radius-border-radius-100);\n color: var(--rel-color-text-primary);\n transition: background 0.15s ease;\n }\n\n .close-button:hover {\n background: var(--rel-color-bg-tertiary);\n }\n\n .close-button:focus-visible {\n outline: 2px solid var(--rel-color-border-focus);\n outline-offset: 2px;\n }\n\n .content {\n flex: 1;\n overflow-y: auto;\n padding: var(--rel-spacing-space-lg);\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-space-md) var(--rel-spacing-space-lg);\n border-top: var(--rel-borders-width-stroke-100) solid var(--rel-color-border-default);\n justify-content: flex-end;\n gap: var(--rel-spacing-space-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\nimport \"../../styles/vars-v2.css\";\r\n\r\nexport type SliderType = \"continuous\" | \"discrete\";\r\nexport type TrackStyle = \"solid\" | \"dotted\";\r\n\r\n@customElement(\"rel-slider\")\r\nexport class RelSlider extends LitElement {\r\n @property({ type: String }) type: SliderType = \"continuous\";\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 @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 --track-height: 5px;\r\n --thumb-size: 10px;\r\n --thumb-stroke: 7px;\r\n --thumb-halo-color: var(--rel-color-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-color-bg-tertiary), 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-fontFamilies-primary);\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-color-border-default);\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-color-text-primary);\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-color-text-primary) 0 2px,\r\n transparent 2px\r\n ) 0 50%/12px 5px repeat-x;\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: 4px;\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-color-text-primary);\r\n border-radius: 50%;\r\n transition: box-shadow 0.15s ease;\r\n }\r\n\r\n .slider-input:active ~ .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 /* 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-color-text-primary);\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-color-bg-primary);\r\n }\r\n\r\n /* Tick labels */\r\n .tick-labels {\r\n position: absolute;\r\n top: calc(50% + var(--tick-size) + 6px);\r\n left: 0;\r\n width: 100%;\r\n font-size: var(--rel-fontSizes-xs);\r\n color: var(--rel-color-text-heading);\r\n pointer-events: none;\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-color-border-default);\r\n }\r\n\r\n .rel-slider.disabled .track-active {\r\n background: var(--rel-color-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-color-bg-tertiary) 0 1px,\r\n transparent 1px\r\n )\r\n center/12px 4px repeat-x,\r\n var(--rel-color-text-placeholder);\r\n }\r\n\r\n .rel-slider.disabled .tick {\r\n background: var(--rel-color-text-placeholder);\r\n }\r\n\r\n .rel-slider.disabled .tick-label {\r\n color: var(--rel-color-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-color-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-colors-gray-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-color-border-default);\r\n --halo: 0 2px 0 var(--rel-color-bg-selected),\r\n 0 6px 10px rgba(0, 0, 0, 0.3);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .value-marker svg path,\r\n :host-context(.dark) .value-marker svg path {\r\n fill: #2B2B2B;\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .value-marker text,\r\n :host-context(.dark) .value-marker text {\r\n fill: #FFFFFF;\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 (changedProperties.has(\"value\")) {\r\n this.updateActiveWidth();\r\n }\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 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) {\r\n 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\r\n private renderThumbContainer() {\r\n return html`\r\n <div class=\"thumb-container\" style=\"left: ${this.percentage}%\">\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-color-text-primary)\" />\r\n <text\r\n x=\"12\"\r\n y=\"16\"\r\n text-anchor=\"middle\"\r\n fill=\"var(--rel-color-bg-primary)\"\r\n font-size=\"12\"\r\n font-family=\"Poppins\"\r\n font-weight=\"600\">\r\n ${this.value}\r\n </text>\r\n </svg>\r\n </div>\r\n ` : \"\"}\r\n <div 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 ]\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 return html`\r\n <div class=\"${sliderClasses}\">\r\n <div 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 \"../../styles/vars-v2.css\";\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 display: block;\r\n font-family: var(--rel-fontFamilies-primary);\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: 12px 16px 12px 10px;\r\n border-radius: var(--rel-borders-radius-border-radius-200);\r\n background-color: var(--rel-surface-toast);\r\n color: #FFFFFF;\r\n font-family: var(--rel-fontFamilies-primary);\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 .snackbar.type-success {\r\n border-left-color: var(--rel-colors-green-tertiary);\r\n }\r\n\r\n .snackbar.type-error {\r\n border-left-color: var(--rel-colors-red-primary);\r\n }\r\n\r\n .snackbar.type-warning {\r\n border-left-color: var(--rel-colors-orange-warning);\r\n }\r\n\r\n /* Icon color matches type accent */\r\n .snackbar.type-success .snackbar-icon {\r\n color: var(--rel-colors-green-primary);\r\n }\r\n\r\n .snackbar.type-error .snackbar-icon {\r\n color: var(--rel-colors-red-secondary);\r\n }\r\n\r\n .snackbar.type-warning .snackbar-icon {\r\n color: var(--rel-colors-yellow-pending);\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\n font-size: var(--rel-fontSizes-sm);\r\n line-height: var(--rel-lineHeights-lineheight-200);\r\n margin-right: 12px;\r\n flex: 1;\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-space-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-colors-green-primary);\r\n font-weight: var(--rel-fontWeights-semibold);\r\n font-size: var(--rel-fontSizes-sm);\r\n font-family: var(--rel-fontFamilies-primary);\r\n cursor: pointer;\r\n padding: 0;\r\n display: flex;\r\n align-items: center;\r\n transition: opacity 0.2s ease;\r\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 #FFFFFF;\r\n outline-offset: 2px;\r\n border-radius: 2px;\r\n }\r\n\r\n .snackbar-close {\r\n background: none;\r\n border: none;\r\n color: #FFFFFF;\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 #FFFFFF;\r\n outline-offset: 2px;\r\n border-radius: 2px;\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 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 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 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\nimport \"../../styles/vars-v2.css\";\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\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 static styles = css`\r\n :host {\r\n display: block;\r\n font-family: var(--rel-fontFamilies-primary);\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-fontFamilies-primary);\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-space-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-space-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-space-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-color-border-default);\r\n background: var(--rel-color-bg-primary);\r\n border-radius: 50%;\r\n font-size: var(--rel-fontSizes-sm);\r\n font-weight: var(--rel-fontWeights-medium);\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 }\r\n\r\n .indicator svg {\r\n width: 12px;\r\n height: auto;\r\n display: block;\r\n }\r\n\r\n /********************************************\r\n * Labels\r\n ********************************************/\r\n .step-label {\r\n white-space: nowrap;\r\n font-size: var(--rel-fontSizes-sm);\r\n color: var(--rel-color-text-primary);\r\n }\r\n\r\n /* Horizontal text-below specific */\r\n .rel-stepper.horizontal.text-below .step-label {\r\n margin-top: var(--rel-spacing-space-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-space-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-color-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-color-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-color-text-heading);\r\n border-color: var(--rel-color-text-heading);\r\n color: var(--rel-color-text-inverse);\r\n }\r\n\r\n .rel-step.progress .indicator {\r\n border-color: var(--rel-color-text-heading);\r\n background: var(--rel-color-bg-primary);\r\n color: var(--rel-color-text-heading);\r\n }\r\n\r\n .rel-step.disabled .indicator {\r\n background: var(--rel-color-bg-secondary);\r\n border-color: var(--rel-color-border-default);\r\n color: var(--rel-color-text-disabled);\r\n }\r\n\r\n .rel-step.done .connector {\r\n background: var(--rel-color-text-heading);\r\n }\r\n\r\n .rel-step.progress .connector {\r\n background: var(--rel-color-text-heading);\r\n }\r\n\r\n .rel-step.done .step-label {\r\n color: var(--rel-color-text-heading);\r\n font-weight: var(--rel-fontWeights-semibold);\r\n }\r\n\r\n .rel-step.progress .step-label {\r\n color: var(--rel-color-text-heading);\r\n font-weight: var(--rel-fontWeights-semibold);\r\n }\r\n\r\n .rel-step.disabled .step-label {\r\n color: var(--rel-color-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-color-text-primary);\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: #ffffff;\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 (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 const stepperClasses = [\r\n \"rel-stepper\",\r\n this.orientation === \"vertical\" ? \"vertical\" : \"horizontal\",\r\n this.textAlign === \"below\" ? \"text-below\" : \"text-right\",\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 = this.textAlign === \"right\";\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 class=\"indicator\">\r\n ${this.renderIndicator(step, idx)}\r\n </div>\r\n ${idx < this.steps.length - 1\r\n ? html`<div class=\"connector\"></div>`\r\n : \"\"}\r\n </div>\r\n\r\n <!-- Step Label to the right -->\r\n <div 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 class=\"indicator\">\r\n ${this.renderIndicator(step, idx)}\r\n </div>\r\n\r\n <!-- Step Label -->\r\n <div 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 class=\"connector\"></div>`\r\n : \"\"}\r\n `\r\n : html`\r\n <!-- Step Indicator -->\r\n <div class=\"indicator\">\r\n ${this.renderIndicator(step, idx)}\r\n </div>\r\n\r\n <!-- Step Label -->\r\n <div 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 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\nimport \"../../styles/vars-v2.css\";\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 --switch-track: var(--rel-color-text-placeholder);\r\n --switch-knob-on: var(--rel-color-text-primary);\r\n --switch-knob-off: var(--rel-color-bg-primary);\r\n --switch-halo: var(--rel-color-border-default);\r\n --switch-disabled: var(--rel-color-text-disabled);\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: 4px;\r\n right: 4px;\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-color-text-placeholder);\r\n }\r\n\r\n /* Focus halo */\r\n .switch-focused .switch-slider::before {\r\n box-shadow: 0 0 0 6px var(--switch-halo);\r\n }\r\n\r\n /* Pressed */\r\n .switch-pressed .switch-slider::before {\r\n transform: scale(0.9) translateY(-50%);\r\n }\r\n .switch-pressed input:checked + .switch-slider::before {\r\n transform: scale(0.9) translateY(-50%) translateX(22px);\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 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 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 \"../../styles/vars-v2.css\";\r\nimport \"../rel-badge/rel-badge\";\r\n\r\nexport interface TabItem {\r\n label: string;\r\n badge?: number;\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 @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 @state() private _tabItems: RelTabItem[] = [];\r\n\r\n static styles = css`\r\n :host {\r\n --tab-active-color: var(--rel-colors-green-primary);\r\n --tab-text-default: var(--rel-color-text-primary);\r\n --tab-text-disabled: var(--rel-color-text-disabled);\r\n --tab-text-hover: var(--rel-color-text-heading);\r\n --tab-underline-height: 3px;\r\n --tab-hover-color: var(--rel-color-bg-tertiary);\r\n display: block;\r\n font-family: var(--rel-fontFamilies-primary);\r\n }\r\n\r\n .tabs-wrapper {\r\n display: flex;\r\n border-bottom: 1px solid var(--rel-border-tab);\r\n font-family: var(--rel-fontFamilies-primary);\r\n user-select: none;\r\n }\r\n\r\n .tab {\r\n position: relative;\r\n padding: var(--rel-spacing-space-sm) var(--rel-spacing-space-md);\r\n cursor: pointer;\r\n color: var(--tab-text-default);\r\n font-size: var(--rel-fontSizes-md);\r\n font-weight: var(--rel-fontWeights-medium);\r\n transition: color 0.2s ease;\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-space-2xs);\r\n }\r\n\r\n .tab:focus-visible {\r\n outline: 2px solid var(--rel-color-border-focus);\r\n outline-offset: -2px;\r\n border-radius: var(--rel-borders-radius-border-radius-100);\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; 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 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 class=\"tabs-wrapper\" role=\"tablist\">\r\n ${tabs.map(\r\n (tab, i) => html`\r\n <div\r\n 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 class=\"tab-label\">${tab.label}</span>\r\n ${tab.badge\r\n ? html`<rel-badge number=\"${tab.badge}\" variant=\"number\" size=\"sm\"></rel-badge>`\r\n : \"\"}\r\n <span class=\"tab-underline\"></span>\r\n </div>\r\n `\r\n )}\r\n </div>\r\n <div class=\"tab-content\">\r\n <slot></slot>\r\n </div>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property, state } from \"lit/decorators.js\";\r\nimport \"../../styles/vars-v2.css\";\r\nimport \"@reliability-design/icons/rel-icon\";\r\n\r\nexport type TextFieldState = \"default\" | \"error\" | \"disabled\";\r\nexport type TextFieldSize = \"small\" | \"medium\" | \"large\";\r\n\r\n@customElement(\"rel-textfield\")\r\nexport class RelTextfield extends LitElement {\r\n @property({ type: String }) label?: string;\r\n @property({ type: String }) placeholder: string = \"\";\r\n @property({ type: String }) type: string = \"text\";\r\n @property({ type: String }) value: string = \"\";\r\n @property({ type: String }) leftIcon?: string;\r\n @property({ type: String }) rightIcon?: string;\r\n @property({ type: String }) supportingText?: string;\r\n @property({ type: String }) state: TextFieldState = \"default\";\r\n @property({ type: String }) size: TextFieldSize = \"medium\";\r\n @property({ type: Boolean, reflect: true }) floatingLabel = false;\r\n\r\n @state() private internalState: \"default\" | \"focused\" = \"default\";\r\n private _wasError = false;\r\n\r\n private uniqueId = `textfield-${Math.random().toString(36).slice(2)}`;\r\n\r\n static styles = css`\r\n :host {\r\n display: block;\r\n font-family: var(--rel-fontFamilies-primary);\r\n }\r\n\r\n /* Wrapper */\r\n .textfield-wrapper {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--rel-spacing-space-2xs);\r\n width: 100%;\r\n }\r\n\r\n /* Label */\r\n .textfield-label {\r\n font-size: var(--rel-fontSizes-sm);\r\n font-weight: var(--rel-fontWeights-medium);\r\n color: var(--rel-color-text-heading);\r\n }\r\n\r\n /* Floating label variant */\r\n :host([floatinglabel]) .textfield-wrapper {\r\n gap: 0;\r\n }\r\n\r\n :host([floatinglabel]) .textfield-container {\r\n overflow: visible;\r\n position: relative;\r\n padding-top: 0;\r\n }\r\n\r\n :host([floatinglabel]) .textfield-label {\r\n position: absolute;\r\n left: var(--rel-spacing-space-sm);\r\n top: 50%;\r\n transform: translateY(-50%);\r\n font-size: var(--rel-fontSizes-md);\r\n font-weight: var(--rel-fontWeights-regular);\r\n color: var(--rel-color-text-placeholder);\r\n pointer-events: none;\r\n transition: top 0.15s ease, font-size 0.15s ease, color 0.15s ease, transform 0.15s ease;\r\n background: var(--rel-color-bg-primary);\r\n padding: 0 2px;\r\n z-index: 1;\r\n line-height: 1;\r\n white-space: nowrap;\r\n }\r\n\r\n :host([floatinglabel]) .textfield-wrapper.focused .textfield-label,\r\n :host([floatinglabel]) .textfield-wrapper.has-value .textfield-label {\r\n top: 0;\r\n transform: translateY(-50%);\r\n font-size: var(--rel-fontSizes-xs);\r\n color: var(--rel-color-text-primary);\r\n }\r\n\r\n :host([floatinglabel]) .textfield-wrapper.error .textfield-label {\r\n color: var(--rel-error-text);\r\n }\r\n\r\n :host([floatinglabel]) .textfield-wrapper.focused:not(.error) .textfield-label {\r\n color: var(--rel-color-text-primary);\r\n }\r\n\r\n :host([floatinglabel]) .textfield-wrapper.focused.error .textfield-label,\r\n :host([floatinglabel]) .textfield-wrapper.has-value.error .textfield-label {\r\n top: 0;\r\n transform: translateY(-50%);\r\n font-size: var(--rel-fontSizes-xs);\r\n color: var(--rel-error-text);\r\n }\r\n\r\n :host([floatinglabel]) .textfield-input {\r\n padding-top: var(--rel-spacing-space-sm);\r\n padding-bottom: var(--rel-spacing-space-sm);\r\n }\r\n\r\n :host([floatinglabel]) .textfield-input.has-left-icon {\r\n padding-left: var(--rel-spacing-space-2xl);\r\n }\r\n\r\n :host([floatinglabel]) .textfield-label.has-left-icon {\r\n left: var(--rel-spacing-space-2xl);\r\n }\r\n\r\n :host([floatinglabel]) .textfield-wrapper.focused .textfield-label.has-left-icon,\r\n :host([floatinglabel]) .textfield-wrapper.has-value .textfield-label.has-left-icon {\r\n left: var(--rel-spacing-space-sm);\r\n }\r\n\r\n :host([floatinglabel]) .textfield-wrapper.disabled .textfield-label {\r\n background: var(--rel-color-bg-tertiary);\r\n }\r\n\r\n /* Container */\r\n .textfield-container {\r\n display: flex;\r\n align-items: center;\r\n position: relative;\r\n border: 1px solid var(--rel-color-border-default);\r\n border-radius: var(--rel-borders-radius-border-radius-100);\r\n background: var(--rel-color-bg-primary);\r\n overflow: hidden;\r\n transition: border 0.2s;\r\n }\r\n\r\n .textfield-container.disabled {\r\n background: var(--rel-color-bg-tertiary);\r\n cursor: not-allowed;\r\n }\r\n\r\n /* Input */\r\n .textfield-input {\r\n flex: 1;\r\n border: none;\r\n outline: none;\r\n font-size: var(--rel-fontSizes-md);\r\n padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-sm);\r\n background: transparent;\r\n font-family: var(--rel-fontFamilies-primary);\r\n color: var(--rel-color-text-primary);\r\n }\r\n\r\n .textfield-input:disabled {\r\n cursor: not-allowed;\r\n color: var(--rel-color-text-disabled);\r\n }\r\n\r\n .icon {\r\n position: absolute;\r\n display: flex;\r\n pointer-events: none;\r\n color: var(--rel-color-text-placeholder);\r\n }\r\n\r\n .icon.left {\r\n left: 8px;\r\n }\r\n\r\n .icon.right {\r\n right: 8px;\r\n }\r\n\r\n .textfield-wrapper.small .textfield-input {\r\n padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-sm);\r\n font-size: var(--rel-fontSizes-sm);\r\n }\r\n\r\n .textfield-wrapper.medium .textfield-input {\r\n padding: var(--rel-spacing-space-sm) var(--rel-spacing-space-md);\r\n font-size: var(--rel-fontSizes-md);\r\n }\r\n\r\n .textfield-wrapper.large .textfield-input {\r\n padding: var(--rel-spacing-space-md) var(--rel-spacing-space-md);\r\n font-size: var(--rel-fontSizes-lg);\r\n }\r\n\r\n /* Adjust padding when icons are present */\r\n .textfield-wrapper .textfield-input.has-left-icon {\r\n padding-left: var(--rel-spacing-space-2xl);\r\n }\r\n\r\n .textfield-wrapper .textfield-input.has-right-icon {\r\n padding-right: var(--rel-spacing-space-2xl);\r\n }\r\n\r\n /* States */\r\n .textfield-wrapper.focused .textfield-container {\r\n border-color: var(--rel-color-text-primary);\r\n }\r\n\r\n .textfield-input:focus-visible {\r\n outline: none;\r\n }\r\n\r\n .textfield-wrapper.focused .textfield-container,\r\n .textfield-container:focus-within {\r\n border-color: var(--rel-color-text-primary);\r\n box-shadow: 0 0 0 1px var(--rel-color-text-primary);\r\n }\r\n\r\n .textfield-wrapper.error .textfield-container {\r\n border-color: var(--rel-error-surface-default);\r\n box-shadow: none;\r\n }\r\n\r\n .textfield-wrapper.disabled .textfield-container {\r\n border-color: var(--rel-color-border-default);\r\n }\r\n\r\n /* Supporting text */\r\n .textfield-support {\r\n font-size: var(--rel-fontSizes-xs);\r\n color: var(--rel-color-text-placeholder);\r\n }\r\n\r\n .textfield-support.error {\r\n color: var(--rel-error-text);\r\n }\r\n\r\n /* Placeholder */\r\n .textfield-input::placeholder {\r\n color: var(--rel-color-text-placeholder);\r\n }\r\n\r\n /* Suppress Chrome autofill blue background */\r\n .textfield-input:-webkit-autofill,\r\n .textfield-input:-webkit-autofill:hover,\r\n .textfield-input:-webkit-autofill:focus {\r\n -webkit-box-shadow: 0 0 0px 1000px var(--rel-color-bg-primary) inset;\r\n -webkit-text-fill-color: var(--rel-color-text-primary);\r\n }\r\n `;\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n const leftIcon = this.getAttribute('lefticon') || this.getAttribute('leftIcon');\r\n if (leftIcon) this.leftIcon = leftIcon;\r\n const rightIcon = this.getAttribute('righticon') || this.getAttribute('rightIcon');\r\n if (rightIcon) this.rightIcon = rightIcon;\r\n }\r\n\r\n private handleFocus() {\r\n if (this.state !== \"disabled\") {\r\n this.internalState = \"focused\";\r\n }\r\n }\r\n\r\n private handleBlur() {\r\n if (this.internalState === \"focused\") {\r\n this.internalState = \"default\";\r\n }\r\n }\r\n\r\n private handleInput(e: Event) {\r\n const input = e.target as HTMLInputElement;\r\n this.value = input.value;\r\n if (this.state === \"error\" && this.value) {\r\n this._wasError = true;\r\n this.state = \"default\";\r\n } else if (this._wasError && !this.value) {\r\n this._wasError = false;\r\n this.state = \"error\";\r\n }\r\n this.dispatchEvent(\r\n new CustomEvent<string>(\"rel-change\", {\r\n detail: this.value,\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n render() {\r\n const wrapperClasses = [\r\n \"textfield-wrapper\",\r\n this.size,\r\n this.state,\r\n this.internalState === \"focused\" ? \"focused\" : \"\",\r\n this.value ? \"has-value\" : \"\",\r\n ].filter(Boolean).join(\" \");\r\n\r\n const inputClasses = [\r\n \"textfield-input\",\r\n this.leftIcon ? \"has-left-icon\" : \"\",\r\n this.rightIcon ? \"has-right-icon\" : \"\",\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return html`\r\n <div class=\"${wrapperClasses}\">\r\n ${!this.floatingLabel && this.label\r\n ? html`<label class=\"textfield-label\" for=\"${this.uniqueId}\">${this.label}</label>`\r\n : \"\"}\r\n\r\n <div\r\n class=\"textfield-container ${this.state === \"disabled\"\r\n ? \"disabled\"\r\n : \"\"}\"\r\n >\r\n ${this.floatingLabel && this.label\r\n ? html`<label\r\n class=\"textfield-label${this.leftIcon ? ' has-left-icon' : ''}\"\r\n for=\"${this.uniqueId}\">${this.label}</label>`\r\n : \"\"}\r\n ${this.leftIcon\r\n ? html`<rel-icon name=\"${this.leftIcon}\" size=\"sm\" class=\"icon left\"></rel-icon>`\r\n : \"\"}\r\n\r\n <input\r\n type=\"${this.type}\"\r\n id=\"${this.uniqueId}\"\r\n class=\"${inputClasses}\"\r\n placeholder=\"${this.placeholder}\"\r\n .value=\"${this.value}\"\r\n ?disabled=\"${this.state === \"disabled\"}\"\r\n aria-invalid=\"${this.state === \"error\"}\"\r\n @focus=\"${this.handleFocus}\"\r\n @blur=\"${this.handleBlur}\"\r\n @input=\"${this.handleInput}\"\r\n />\r\n\r\n ${this.rightIcon\r\n ? html`<rel-icon name=\"${this.rightIcon}\" size=\"sm\" class=\"icon right\"></rel-icon>`\r\n : \"\"}\r\n </div>\r\n\r\n ${this.supportingText\r\n ? html`<div\r\n class=\"textfield-support ${this.state === \"error\"\r\n ? \"error\"\r\n : \"\"}\"\r\n >\r\n ${this.supportingText}\r\n </div>`\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\nimport \"../../styles/vars-v2.css\";\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 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-fontFamilies-primary);\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-space-sm);\r\n background-color: var(--rel-color-text-primary);\r\n color: var(--rel-color-bg-primary);\r\n font-family: var(--rel-fontFamilies-primary);\r\n font-size: var(--rel-fontSizes-md);\r\n border-radius: var(--rel-borders-radius-border-radius-200);\r\n padding: var(--rel-spacing-space-md);\r\n box-shadow: var(--rel-shadows-shadow-300);\r\n pointer-events: all;\r\n animation: fadeInUp 0.25s ease;\r\n }\r\n\r\n .toast.error {\r\n background-color: var(--rel-error-surface-default);\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-colors-green-primary);\r\n font-weight: 600;\r\n font-size: 0.85rem;\r\n cursor: pointer;\r\n transition: opacity 0.2s;\r\n font-family: var(--rel-fontFamilies-primary);\r\n }\r\n\r\n .toast-action:hover {\r\n opacity: 0.75;\r\n }\r\n\r\n .toast-action:focus-visible {\r\n outline: 2px solid #FFFFFF;\r\n outline-offset: 2px;\r\n border-radius: 2px;\r\n }\r\n\r\n /* Close button */\r\n .toast-close {\r\n background: transparent;\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-space-2xs);\r\n margin-left: var(--rel-spacing-space-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 #FFFFFF;\r\n outline-offset: 2px;\r\n border-radius: 2px;\r\n }\r\n\r\n /* Dark mode overrides */\r\n :host-context([data-theme=\"dark\"]) .toast-action,\r\n :host-context(.dark) .toast-action {\r\n color: var(--rel-colors-green-tertiary);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .toast.error,\r\n :host-context(.dark) .toast.error {\r\n background-color: var(--rel-error-surface-default);\r\n color: #ffffff;\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 class=\"toast ${this.type} ${this.visible ? \"\" : \"hidden\"}\" role=\"status\" aria-live=\"polite\">\r\n <span class=\"toast-message\">${this.message}</span>\r\n\r\n ${this.actionLabel\r\n ? html`<button\r\n class=\"toast-action\"\r\n @click=\"${this.handleActionClick}\"\r\n >\r\n ${this.actionLabel}\r\n </button>`\r\n : \"\"}\r\n\r\n <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\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\r\nexport type TooltipPosition = \"above\" | \"below\";\r\n\r\n@customElement(\"rel-tooltip\")\r\nexport class RelTooltip extends LitElement {\r\n @property({ type: String }) text: string = \"\";\r\n @property({ type: String }) position: TooltipPosition = \"above\";\r\n @property({ type: Boolean, attribute: \"show-tail\" }) showTail: boolean =\r\n false;\r\n\r\n // Stable id so aria-describedby can reference the bubble across renders.\r\n private uniqueId = Math.random().toString(36).slice(2);\r\n\r\n static styles = css`\r\n :host {\r\n display: inline-block;\r\n position: relative;\r\n }\r\n\r\n /* Tooltip container */\r\n .tooltip-bubble {\r\n position: absolute;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n background-color: #1a1a1a;\r\n color: #ffffff;\r\n padding: var(--rel-spacing-space-xs, 8px)\r\n var(--rel-spacing-space-sm, 12px);\r\n border-radius: var(--rel-borders-radius-border-radius-200, 8px);\r\n font-size: var(--rel-fontSizes-sm, 12px);\r\n font-family: var(--rel-fontFamilies-primary, sans-serif);\r\n white-space: nowrap;\r\n z-index: 1000;\r\n opacity: 0;\r\n pointer-events: none;\r\n transition: opacity 0.2s ease;\r\n overflow: visible;\r\n }\r\n\r\n :host(:hover) .tooltip-bubble,\r\n :host(:focus-within) .tooltip-bubble {\r\n opacity: 1;\r\n }\r\n\r\n /* Positioning */\r\n .tooltip-bubble.above {\r\n bottom: calc(100% + 8px);\r\n }\r\n\r\n .tooltip-bubble.below {\r\n top: calc(100% + 8px);\r\n }\r\n\r\n /* Tail/Arrow */\r\n .tooltip-tail {\r\n position: absolute;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n width: 0;\r\n height: 0;\r\n border-left: 6px solid transparent;\r\n border-right: 6px solid transparent;\r\n display: block;\r\n }\r\n\r\n .tooltip-bubble.above .tooltip-tail {\r\n bottom: -6px;\r\n border-top: 6px solid #1a1a1a;\r\n border-bottom: none;\r\n }\r\n\r\n .tooltip-bubble.below .tooltip-tail {\r\n top: -6px;\r\n border-bottom: 6px solid #1a1a1a;\r\n border-top: none;\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .tooltip-bubble,\r\n :host-context(.dark) .tooltip-bubble {\r\n background-color: #ffffff;\r\n color: #000000;\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .tooltip-bubble.above .tooltip-tail,\r\n :host-context(.dark) .tooltip-bubble.above .tooltip-tail {\r\n border-top-color: #ffffff;\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .tooltip-bubble.below .tooltip-tail,\r\n :host-context(.dark) .tooltip-bubble.below .tooltip-tail {\r\n border-bottom-color: #ffffff;\r\n }\r\n `;\r\n\r\n firstUpdated() {\r\n this.linkTrigger();\r\n }\r\n\r\n private linkTrigger() {\r\n const slot = this.shadowRoot?.querySelector(\"slot\");\r\n if (!slot) return;\r\n const trigger = slot.assignedElements()[0];\r\n if (trigger) {\r\n trigger.setAttribute(\"aria-describedby\", `tooltip-${this.uniqueId}`);\r\n }\r\n }\r\n\r\n render() {\r\n return html`\r\n <slot @slotchange=\"${this.linkTrigger}\"></slot>\r\n <div\r\n class=\"tooltip-bubble ${this.position}\"\r\n id=\"tooltip-${this.uniqueId}\"\r\n role=\"tooltip\"\r\n >\r\n ${this.text}\r\n ${this.showTail ? html`<span class=\"tooltip-tail\"></span>` : \"\"}\r\n </div>\r\n `;\r\n }\r\n}\r\n"],"mappings":"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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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","names":["import_vars_v2","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_lit","import_decorators","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_lit","import_decorators","import_lit","import_decorators","import_lit","import_decorators","import_rel_icon","import_lit","import_decorators","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","updated","import_lit","import_decorators","import_rel_icon","import_lit","import_decorators","import_vars_v2","import_vars_v2","import_lit","import_decorators","import_lit","import_decorators","import_lit","import_decorators","import_vars_v2","import_rel_icon","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_rel_icon","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_lit","import_decorators","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_rel_icon","import_lit","import_decorators","import_vars_v2","import_rel_icon","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_rel_icon","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_rel_icon","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators"]}
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-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-menubar/rel-menubar.ts","../src/components/rel-radio/rel-radio.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 \"../../styles/vars-v2.css\";\nimport \"@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 static styles = css`\n :host {\n display: block;\n width: 100%;\n font-family: var(--rel-fontFamilies-primary, sans-serif);\n }\n\n .accordion {\n background: var(--rel-color-bg-primary, #ffffff);\n border-radius: 8px;\n overflow: hidden;\n box-shadow: 0 2px 4px rgba(11, 11, 11, 0.1);\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: 8px 8px 8px 16px;\n min-height: 56px;\n }\n\n :host([size=\"sm\"]) .header {\n padding: 8px 8px 8px 12px;\n min-height: 48px;\n }\n\n .header:hover {\n background: var(--rel-color-bg-secondary, #f5f5f5);\n }\n\n .header:focus-visible {\n outline: 2px solid var(--rel-color-border-focus);\n outline-offset: -2px;\n }\n\n /* ── Title row ────────────────────────────────────────────── */\n\n .title-row {\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1;\n }\n\n .title {\n font-weight: var(--rel-fontWeights-semibold, 600);\n color: var(--rel-color-text-default, #0b0b0b);\n letter-spacing: -0.3px;\n }\n\n :host([size=\"md\"]) .title {\n font-size: var(--rel-fontSizes-lg, 20px);\n line-height: 28px;\n }\n\n :host([size=\"sm\"]) .title {\n font-size: 16px;\n line-height: 24px;\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-color-text-default, #0b0b0b);\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-color-text-default, #0b0b0b);\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 16px;\n font-size: var(--rel-fontSizes-md, 14px);\n line-height: 22px;\n /* Figma spec value — --rel-color-text-secondary resolves to #9e9e9e (gray-disabled-text), not this */\n color: var(--rel-accordion-body-color, #525252);\n transition:\n max-height 0.25s ease,\n padding 0.2s ease;\n }\n\n :host([size=\"sm\"]) .body {\n font-size: var(--rel-fontSizes-sm, 12px);\n line-height: 20px;\n }\n\n .body.open {\n max-height: 1000px;\n padding: 4px 16px 16px;\n }\n\n /* ── Dark mode ────────────────────────────────────────────── */\n\n :host-context([data-theme=\"dark\"]) .accordion,\n [data-theme=\"dark\"] .accordion {\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);\n }\n\n :host-context([data-theme=\"dark\"]) .title,\n [data-theme=\"dark\"] .title {\n color: var(--rel-color-text-default-dark, #f5f5f5);\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-color-text-default-dark, #f5f5f5);\n }\n\n :host-context([data-theme=\"dark\"]) .leading-icon,\n [data-theme=\"dark\"] .leading-icon {\n color: var(--rel-color-text-default-dark, #f5f5f5);\n }\n\n :host-context([data-theme=\"dark\"]) .body,\n [data-theme=\"dark\"] .body {\n color: var(--rel-accordion-body-color-dark, #a3a3a3);\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 class=\"accordion\">\n <div\n 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 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 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 class=\"body ${this.open ? \"open\" : \"\"}\">\n <slot></slot>\n </div>\n </div>\n `;\n }\n}\n","import \"../../styles/vars-v2.css\";\r\nimport { LitElement, html, css } from \"lit\";\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 @property({ type: String }) message1 = \"\";\r\n @property({ type: String }) message2?: string;\r\n\r\n @property({ type: String }) urlText?: string;\r\n @property({ type: String }) 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 display: block;\r\n font-family: var(--rel-fontFamilies-primary);\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-space-xs);\r\n padding: var(--rel-spacing-space-sm) var(--rel-spacing-space-md);\r\n border-radius: var(--rel-borders-radius-border-radius-200);\r\n min-width: 360px;\r\n box-sizing: border-box;\r\n }\r\n\r\n .rel-content {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n }\r\n\r\n .rel-message1 {\r\n margin: 0;\r\n font-size: var(--rel-fontSizes-md);\r\n font-weight: var(--rel-fontWeights-medium);\r\n }\r\n\r\n .rel-message2 {\r\n margin: 0;\r\n font-size: var(--rel-fontSizes-sm);\r\n opacity: 0.9;\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 font-size: var(--rel-fontSizes-sm);\r\n font-weight: var(--rel-fontWeights-medium);\r\n text-decoration: underline;\r\n color: inherit;\r\n margin-top: 2px;\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-space-2xs);\r\n line-height: 1;\r\n border-radius: var(--rel-borders-radius-border-radius-100, 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 — light mode */\r\n .alert-neutral {\r\n background: var(--rel-color-bg-primary);\r\n color: var(--rel-color-text-primary);\r\n }\r\n\r\n .alert-info {\r\n background: var(--rel-background-info);\r\n color: var(--rel-color-text-primary);\r\n --rel-icon-info: var(--rel-colors-blue-tertiary);\r\n }\r\n\r\n .alert-success {\r\n background: var(--rel-background-success);\r\n color: var(--rel-color-text-primary);\r\n --rel-icon-success: var(--rel-success-surface-dark);\r\n }\r\n\r\n .alert-warning {\r\n background: var(--rel-colors-gold-light);\r\n color: var(--rel-color-text-primary);\r\n --rel-icon-warning: var(--rel-warning-surface-dark);\r\n }\r\n\r\n .alert-error {\r\n background: var(--rel-background-error-light);\r\n color: var(--rel-error-surface-dark);\r\n --rel-icon-error: var(--rel-error-surface-dark);\r\n }\r\n\r\n .alert-error .rel-close {\r\n color: var(--rel-color-text-primary);\r\n }\r\n\r\n /* COLORS — dark mode */\r\n :host-context([data-theme=\"dark\"]) .rel-alert,\r\n :host-context(.dark) .rel-alert {\r\n background: var(--rel-color-bg-tertiary);\r\n color: var(--rel-color-text-primary);\r\n border: none;\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .rel-close,\r\n :host-context(.dark) .rel-close {\r\n color: var(--rel-color-text-primary);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .alert-neutral,\r\n :host-context(.dark) .alert-neutral {\r\n border: 1px solid var(--rel-color-border-strong);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .alert-info,\r\n :host-context(.dark) .alert-info {\r\n border: 1px solid var(--rel-colors-blue-tertiary);\r\n --rel-icon-info: var(--rel-colors-blue-tertiary);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .alert-info .rel-message2,\r\n :host-context(.dark) .alert-info .rel-message2 {\r\n color: var(--rel-colors-blue-tertiary);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .alert-warning,\r\n :host-context(.dark) .alert-warning {\r\n border: 1px solid var(--rel-warning-surface-dark);\r\n --rel-icon-warning: var(--rel-warning-surface-dark);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .alert-warning .rel-message2,\r\n :host-context(.dark) .alert-warning .rel-message2 {\r\n color: var(--rel-warning-surface-dark);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .alert-success,\r\n :host-context(.dark) .alert-success {\r\n border: 1px solid var(--rel-success-surface-dark);\r\n --rel-icon-success: var(--rel-success-surface-dark);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .alert-success .rel-message2,\r\n :host-context(.dark) .alert-success .rel-message2 {\r\n color: var(--rel-success-surface-dark);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .alert-error,\r\n :host-context(.dark) .alert-error {\r\n border: 1px solid var(--rel-error-surface-dark);\r\n --rel-icon-error: var(--rel-error-surface-dark);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .alert-error .rel-message2,\r\n :host-context(.dark) .alert-error .rel-message2 {\r\n color: var(--rel-error-surface-dark);\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 private get iconSvg() {\r\n switch (this.type) {\r\n case \"info\":\r\n return html`\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"18\"\r\n height=\"18\"\r\n viewBox=\"0 0 18 18\"\r\n fill=\"none\"\r\n >\r\n <path\r\n d=\"M9 4.75C8.75917 4.75 8.55715 4.8316 8.39395 4.9948C8.23132 5.15743 8.15 5.35917 8.15 5.6C8.15 5.84083 8.23132 6.04285 8.39395 6.20605C8.55715 6.36868 8.75917 6.45 9 6.45C9.24083 6.45 9.44257 6.36868 9.6052 6.20605C9.7684 6.04285 9.85 5.84083 9.85 5.6C9.85 5.35917 9.7684 5.15743 9.6052 4.9948C9.44257 4.8316 9.24083 4.75 9 4.75ZM9.85 8.15L8.15 8.15L8.15 13.25L9.85 13.25L9.85 8.15ZM9 0.499999C10.1758 0.499999 11.2808 0.723266 12.315 1.1698C13.3492 1.61633 14.2488 2.22182 15.0138 2.98625C15.7788 3.75068 16.3842 4.65027 16.8302 5.685C17.2762 6.71973 17.4994 7.82473 17.5 9C17.5006 10.1753 17.2773 11.2803 16.8302 12.315C16.3842 13.3492 15.7787 14.2487 15.0137 15.0137C14.2487 15.7787 13.3492 16.3845 12.315 16.831C11.2808 17.2776 10.1758 17.5006 9 17.5C7.82417 17.4994 6.71917 17.2764 5.685 16.831C4.65083 16.3845 3.75125 15.7787 2.98625 15.0137C2.22125 14.2487 1.61577 13.3492 1.1698 12.315C0.723834 11.2808 0.500567 10.1758 0.500001 9C0.499434 7.82417 0.722701 6.71917 1.1698 5.685C1.61577 4.65083 2.22125 3.75125 2.98625 2.98625C3.75125 2.22125 4.65084 1.61577 5.685 1.1698C6.71917 0.723832 7.82417 0.500566 9 0.499999ZM9 2.2C7.10167 2.2 5.49375 2.85875 4.17625 4.17625C2.85875 5.49375 2.2 7.10167 2.2 9C2.2 10.8983 2.85875 12.5062 4.17625 13.8237C5.49375 15.1412 7.10167 15.8 9 15.8C10.8983 15.8 12.5062 15.1412 13.8237 13.8237C15.1412 12.5062 15.8 10.8983 15.8 9C15.8 7.10167 15.1413 5.49375 13.8238 4.17625C12.5063 2.85875 10.8983 2.2 9 2.2Z\"\r\n fill=\"var(--rel-icon-info)\"\r\n />\r\n </svg>\r\n `;\r\n case \"success\":\r\n return html`\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"18\"\r\n height=\"18\"\r\n viewBox=\"0 0 18 18\"\r\n fill=\"none\"\r\n >\r\n <path\r\n d=\"M7.81 12.91L13.8025 6.9175L12.6125 5.7275L7.81 10.53L5.3875 8.1075L4.1975 9.2975L7.81 12.91ZM9 17.5C7.82417 17.5 6.71917 17.2767 5.685 16.8302C4.65083 16.3837 3.75125 15.7782 2.98625 15.0138C2.22125 14.2493 1.61577 13.3497 1.1698 12.315C0.723834 11.2803 0.500568 10.1753 0.500001 9C0.499434 7.82473 0.722701 6.71973 1.1698 5.685C1.61577 4.65083 2.22125 3.75125 2.98625 2.98625C3.75125 2.22125 4.65083 1.61548 5.685 1.16895C6.71917 0.722418 7.82417 0.499434 9 0.500001C10.1758 0.500568 11.2808 0.723551 12.315 1.16895C13.3492 1.61548 14.2488 2.22125 15.0138 2.98625C15.7788 3.75125 16.3842 4.65083 16.8302 5.685C17.2762 6.71917 17.4994 7.82417 17.5 9C17.5006 10.1758 17.2773 11.2808 16.8302 12.315C16.3842 13.3492 15.7788 14.2488 15.0138 15.0138C14.2488 15.7788 13.3492 16.3842 12.315 16.8302C11.2808 17.2762 10.1758 17.4994 9 17.5ZM9 15.8C10.8983 15.8 12.5062 15.1412 13.8237 13.8237C15.1412 12.5062 15.8 10.8983 15.8 9C15.8 7.10167 15.1412 5.49375 13.8237 4.17625C12.5062 2.85875 10.8983 2.2 9 2.2C7.10167 2.2 5.49375 2.85875 4.17625 4.17625C2.85875 5.49375 2.2 7.10167 2.2 9C2.2 10.8983 2.85875 12.5062 4.17625 13.8237C5.49375 15.1412 7.10167 15.8 9 15.8Z\"\r\n fill=\"var(--rel-icon-success)\"\r\n />\r\n </svg>\r\n `;\r\n case \"warning\":\r\n return html`\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\"\r\n height=\"14\"\r\n viewBox=\"0 0 16 14\"\r\n fill=\"none\"\r\n >\r\n <path\r\n d=\"M0 14L8 0L16 14H0ZM2.50909 12.5263H13.4909L8 2.94737L2.50909 12.5263ZM8 11.7895C8.20606 11.7895 8.37891 11.7187 8.51855 11.5773C8.6577 11.4363 8.72727 11.2614 8.72727 11.0526C8.72727 10.8439 8.6577 10.669 8.51855 10.528C8.37891 10.3865 8.20606 10.3158 8 10.3158C7.79394 10.3158 7.62133 10.3865 7.48218 10.528C7.34255 10.669 7.27273 10.8439 7.27273 11.0526C7.27273 11.2614 7.34255 11.4363 7.48218 11.5773C7.62133 11.7187 7.79394 11.7895 8 11.7895ZM7.27273 9.57895H8.72727V5.89474H7.27273V9.57895Z\"\r\n fill=\"var(--rel-icon-warning)\"\r\n />\r\n </svg>\r\n `;\r\n case \"error\":\r\n return html`\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"18\"\r\n height=\"18\"\r\n viewBox=\"0 0 18 18\"\r\n fill=\"none\"\r\n >\r\n <path\r\n d=\"M9 13.25C9.24083 13.25 9.44285 13.1684 9.60605 13.0052C9.76868 12.8426 9.85 12.6408 9.85 12.4C9.85 12.1592 9.76868 11.9571 9.60605 11.7939C9.44285 11.6313 9.24083 11.55 9 11.55C8.75917 11.55 8.55743 11.6313 8.3948 11.7939C8.2316 11.9571 8.15 12.1592 8.15 12.4C8.15 12.6408 8.2316 12.8426 8.3948 13.0052C8.55743 13.1684 8.75917 13.25 9 13.25ZM8.15 9.85H9.85V4.75H8.15V9.85ZM9 17.5C7.82417 17.5 6.71917 17.2767 5.685 16.8302C4.65083 16.3837 3.75125 15.7782 2.98625 15.0138C2.22125 14.2493 1.61577 13.3497 1.1698 12.315C0.723834 11.2803 0.500568 10.1753 0.500001 9C0.499434 7.82473 0.722701 6.71973 1.1698 5.685C1.61577 4.65083 2.22125 3.75125 2.98625 2.98625C3.75125 2.22125 4.65083 1.61548 5.685 1.16895C6.71917 0.722418 7.82417 0.499434 9 0.500001C10.1758 0.500568 11.2808 0.723551 12.315 1.16895C13.3492 1.61548 14.2488 2.22125 15.0138 2.98625C15.7788 3.75125 16.3842 4.65083 16.8302 5.685C17.2762 6.71917 17.4994 7.82417 17.5 9C17.5006 10.1758 17.2773 11.2808 16.8302 12.315C16.3842 13.3492 15.7788 14.2488 15.0138 15.0138C14.2488 15.7788 13.3492 16.3842 12.315 16.8302C11.2808 17.2762 10.1758 17.4994 9 17.5ZM9 15.8C10.8983 15.8 12.5062 15.1412 13.8237 13.8237C15.1412 12.5062 15.8 10.8983 15.8 9C15.8 7.10167 15.1412 5.49375 13.8237 4.17625C12.5062 2.85875 10.8983 2.2 9 2.2C7.10167 2.2 5.49375 2.85875 4.17625 4.17625C2.85875 5.49375 2.2 7.10167 2.2 9C2.2 10.8983 2.85875 12.5062 4.17625 13.8237C5.49375 15.1412 7.10167 15.8 9 15.8Z\"\r\n fill=\"var(--rel-icon-error)\"\r\n />\r\n </svg>\r\n `;\r\n default:\r\n return html`\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"18\"\r\n height=\"18\"\r\n viewBox=\"0 0 18 18\"\r\n fill=\"none\"\r\n >\r\n <path\r\n d=\"M9 4.75C8.75917 4.75 8.55715 4.8316 8.39395 4.9948C8.23132 5.15743 8.15 5.35917 8.15 5.6C8.15 5.84083 8.23132 6.04285 8.39395 6.20605C8.55715 6.36868 8.75917 6.45 9 6.45C9.24083 6.45 9.44257 6.36868 9.6052 6.20605C9.7684 6.04285 9.85 5.84083 9.85 5.6C9.85 5.35917 9.7684 5.15743 9.6052 4.9948C9.44257 4.8316 9.24083 4.75 9 4.75ZM9.85 8.15L8.15 8.15L8.15 13.25L9.85 13.25L9.85 8.15ZM9 0.499999C10.1758 0.499999 11.2808 0.723266 12.315 1.1698C13.3492 1.61633 14.2488 2.22182 15.0138 2.98625C15.7788 3.75068 16.3842 4.65027 16.8302 5.685C17.2762 6.71973 17.4994 7.82473 17.5 9C17.5006 10.1753 17.2773 11.2803 16.8302 12.315C16.3842 13.3492 15.7787 14.2487 15.0137 15.0137C14.2487 15.7787 13.3492 16.3845 12.315 16.831C11.2808 17.2776 10.1758 17.5006 9 17.5C7.82417 17.4994 6.71917 17.2764 5.685 16.831C4.65083 16.3845 3.75125 15.7787 2.98625 15.0137C2.22125 14.2487 1.61577 13.3492 1.1698 12.315C0.723834 11.2808 0.500567 10.1758 0.500001 9C0.499434 7.82417 0.722701 6.71917 1.1698 5.685C1.61577 4.65083 2.22125 3.75125 2.98625 2.98625C3.75125 2.22125 4.65084 1.61577 5.685 1.1698C6.71917 0.723832 7.82417 0.500566 9 0.499999ZM9 2.2C7.10167 2.2 5.49375 2.85875 4.17625 4.17625C2.85875 5.49375 2.2 7.10167 2.2 9C2.2 10.8983 2.85875 12.5062 4.17625 13.8237C5.49375 15.1412 7.10167 15.8 9 15.8C10.8983 15.8 12.5062 15.1412 13.8237 13.8237C15.1412 12.5062 15.8 10.8983 15.8 9C15.8 7.10167 15.1413 5.49375 13.8238 4.17625C12.5063 2.85875 10.8983 2.2 9 2.2Z\"\r\n fill=\"var(--rel-colors-black)\"\r\n />\r\n </svg>\r\n `;\r\n }\r\n }\r\n\r\n render() {\r\n return html`\r\n <div class=\"rel-alert alert-${this.type}\" role=\"alert\">\r\n <div class=\"rel-icon\">${this.iconSvg}</div>\r\n\r\n <div class=\"rel-content\">\r\n <p class=\"rel-message1\">${this.message1}</p>\r\n\r\n ${this.message2\r\n ? html`<p class=\"rel-message2\">${this.message2}</p>`\r\n : null}\r\n ${this.urlText && this.urlHref\r\n ? html`<a 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 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 \"../../styles/vars-v2.css\";\nimport { 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 display: inline-flex;\n font-family: var(--rel-fontFamilies-primary);\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-borders-width-stroke-100, 1px) solid transparent;\n font-weight: var(--rel-fontWeights-semibold);\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, #0b0b0b);\n color: var(--rel-avatar-color-fill, #ffffff);\n }\n\n :host([variant=\"subtle\"]) .avatar {\n background-color: var(--rel-avatar-bg-subtle, #f5f5f5);\n color: var(--rel-avatar-color-subtle, #0b0b0b);\n }\n\n :host([variant=\"outline\"]) .avatar {\n background-color: transparent;\n border-color: var(--rel-avatar-border-outline, var(--rel-color-border-default));\n color: var(--rel-avatar-color-outline, #0b0b0b);\n }\n\n /* ── Sizes ────────────────────────────────────────────────── */\n\n .avatar-lg {\n width: 40px;\n height: 40px;\n font-size: var(--rel-fontSizes-lg); /* 20px */\n }\n\n .avatar-md {\n width: 32px;\n height: 32px;\n font-size: 16px;\n }\n\n .avatar-sm {\n width: 24px;\n height: 24px;\n font-size: var(--rel-fontSizes-sm); /* 12px */\n }\n\n .avatar-xs {\n width: 20px;\n height: 20px;\n font-size: var(--rel-fontSizes-xs); /* 10px */\n }\n\n /* ── Image ────────────────────────────────────────────────── */\n\n img {\n width: 100%;\n height: 100%;\n object-fit: cover;\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 /* ── Dark mode ────────────────────────────────────────────────\n :host() can never be preceded by a combinator inside a shadow-tree\n stylesheet, so \":host-context(dark) :host([variant=...]) .avatar\"\n (the previous approach) is invalid and silently matches nothing.\n Instead, redefine the same custom properties the variant rules\n above already read via var(--token, fallback) — a plain\n :host-context() selector with no compounding, guaranteed valid. ── */\n\n :host-context([data-theme=\"dark\"]) {\n --rel-avatar-bg-fill: #ffffff;\n --rel-avatar-color-fill: #0b0b0b;\n --rel-avatar-bg-subtle: #2b2b2b;\n --rel-avatar-color-subtle: #f5f5f5;\n --rel-avatar-border-outline: #525252;\n --rel-avatar-color-outline: #f5f5f5;\n }\n `;\n\n render() {\n return html`\n <div 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 src=${this.src} alt=${this.alt} />`\n : this.type === \"text\"\n ? html`<span>${this.text}</span>`\n : html`<span class=\"icon-slot\"><slot></slot></span>`}\n </div>\n `;\n }\n}\n","import \"../../styles/vars-v2.css\";\r\nimport { 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\" = \"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 display: inline-flex;\r\n }\r\n\r\n .badge {\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-fontFamilies-primary, sans-serif);\r\n font-weight: var(--rel-fontWeights-semibold, 600);\r\n background-color: var(--rel-badge-bg, var(--rel-error-surface-default));\r\n color: var(--rel-badge-color, #ffffff);\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-size: var(--rel-fontSizes-xs, 12px);\r\n }\r\n\r\n .badge-md {\r\n min-width: 28px;\r\n height: 28px;\r\n padding: 0 6px;\r\n font-size: var(--rel-fontSizes-sm, 14px);\r\n }\r\n\r\n .badge-lg {\r\n min-width: 40px;\r\n height: 40px;\r\n padding: 0 8px;\r\n font-size: var(--rel-fontSizes-lg, 20px);\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\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 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 \"../../styles/vars-v2.css\";\r\nimport { 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\n font-family: var(--rel-fontFamilies-primary, sans-serif);\r\n font-size: var(--rel-fontSizes-md);\r\n color: var(--rel-text-primary, #333);\r\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 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-fontWeights-regular);\r\n color: var(--rel-color-text-primary);\r\n }\r\n\r\n a:hover {\r\n text-decoration: underline;\r\n color: var(--rel-color-text-primary);\r\n }\r\n\r\n a:focus-visible {\r\n outline: 2px solid var(--rel-color-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-fontWeights-bold);\r\n color: var(--rel-color-text-primary);\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 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 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 \"../../styles/vars-v2.css\";\r\nimport \"../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@customElement(\"rel-button\")\r\nexport class RelButton extends LitElement {\r\n @property({ type: String })\r\n variant: \"default\" | \"primary\" | \"secondary\" | \"text\" | \"link\" | \"icon\" =\r\n \"default\";\r\n\r\n @property({ type: String })\r\n tone: \"default\" | \"primary\" | \"secondary\" | \"critical\" | \"success\" = \"default\";\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 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-fontFamilies-primary);\r\n font-weight: var(--rel-fontWeights-semibold);\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-space-2xs);\r\n outline: none;\r\n }\r\n\r\n /* Sizes */\r\n .size-small {\r\n height: 32px;\r\n padding: 0 var(--rel-spacing-space-md);\r\n font-size: var(--rel-fontSizes-sm);\r\n }\r\n\r\n .size-medium {\r\n height: 40px;\r\n padding: 0 var(--rel-spacing-space-lg);\r\n font-size: var(--rel-fontSizes-md);\r\n }\r\n\r\n .size-large {\r\n height: 48px;\r\n padding: 0 var(--rel-spacing-space-xl);\r\n font-size: var(--rel-fontSizes-lg);\r\n }\r\n\r\n /* Borders */\r\n .border-corner-radius {\r\n border-radius: var(--rel-borders-radius-border-radius-500);\r\n }\r\n\r\n .border-small-corner-radius {\r\n border-radius: var(--rel-borders-radius-border-radius-200);\r\n }\r\n\r\n .border-no-corner-radius {\r\n border-radius: var(--rel-borders-radius-border-radius-0);\r\n }\r\n\r\n /* Disabled */\r\n :host([disabled]) {\r\n cursor: not-allowed;\r\n /* Without this, clicks on a disabled button hit-test fall through the\r\n inner button's pointer-events:none straight onto the host, which still\r\n dispatches a normal click to any externally-attached listener. */\r\n pointer-events: none;\r\n }\r\n\r\n :host([disabled]) button {\r\n cursor: not-allowed;\r\n background-color: var(--rel-color-bg-tertiary) !important;\r\n color: var(--rel-color-text-disabled) !important;\r\n border: none !important;\r\n pointer-events: none;\r\n filter: none !important;\r\n }\r\n\r\n :host([disabled]):host-context([data-theme=\"dark\"]) button,\r\n :host([disabled]):host-context(.dark) button {\r\n background-color: var(--rel-color-bg-tertiary) !important;\r\n color: var(--rel-color-text-disabled) !important;\r\n }\r\n\r\n /* Variants & tones (unchanged) */\r\n .btn-default.tone-default {\r\n background: var(--rel-colors-gray-primary);\r\n color: var(--rel-colors-white);\r\n }\r\n .btn-default.tone-critical {\r\n background: var(--rel-error-surface-default);\r\n color: #ffffff;\r\n }\r\n .btn-default.tone-success {\r\n background: var(--rel-colors-green-tertiary);\r\n color: #ffffff;\r\n }\r\n\r\n .btn-primary.tone-default {\r\n background: var(--rel-colors-green-primary);\r\n color: #000000;\r\n }\r\n .btn-primary.tone-critical {\r\n background: var(--rel-error-surface-default);\r\n color: #ffffff;\r\n }\r\n .btn-primary.tone-success {\r\n background: var(--rel-colors-green-tertiary);\r\n color: #ffffff;\r\n }\r\n\r\n .btn-secondary {\r\n background: var(--rel-colors-white);\r\n border: 1px solid var(--rel-color-border-strong);\r\n color: var(--rel-colors-black);\r\n }\r\n\r\n .btn-text {\r\n background: transparent;\r\n color: var(--rel-colors-black);\r\n }\r\n\r\n .btn-link {\r\n background: transparent;\r\n color: var(--rel-colors-blue-primary);\r\n text-decoration: underline;\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-colors-gray-light);\r\n color: var(--rel-colors-black);\r\n border: none;\r\n }\r\n .btn-icon.tone-primary {\r\n background: var(--rel-colors-green-primary);\r\n color: #000000;\r\n border: none;\r\n }\r\n .btn-icon.tone-secondary {\r\n background: var(--rel-colors-white);\r\n color: var(--rel-colors-black);\r\n border: 1px solid var(--rel-color-border-strong);\r\n }\r\n .btn-icon.tone-success {\r\n background: var(--rel-colors-green-tertiary);\r\n color: #ffffff;\r\n border: none;\r\n }\r\n .btn-icon.tone-critical {\r\n background: var(--rel-error-surface-default);\r\n color: #ffffff;\r\n border: none;\r\n }\r\n\r\n button.btn-primary.tone-default:hover:not(:disabled) {\r\n background: var(--rel-color-brand-hover);\r\n }\r\n\r\n button.btn-primary.tone-critical:hover:not(:disabled) {\r\n filter: brightness(0.9);\r\n }\r\n\r\n button.btn-primary.tone-success:hover:not(:disabled) {\r\n filter: brightness(0.9);\r\n }\r\n\r\n /* Generic hover — excludes icon (handled per-tone below) */\r\n button:hover:not(:disabled):not(.btn-primary):not(.btn-default):not(.btn-icon) {\r\n background: var(--rel-color-bg-hover);\r\n }\r\n\r\n button.btn-default:hover:not(:disabled) {\r\n filter: brightness(0.85);\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 filter: brightness(0.9);\r\n }\r\n button.btn-icon.tone-primary:hover:not(:disabled) {\r\n background: var(--rel-color-brand-hover);\r\n }\r\n button.btn-icon.tone-secondary:hover:not(:disabled) {\r\n background: var(--rel-color-bg-hover);\r\n }\r\n button.btn-icon.tone-success:hover:not(:disabled) {\r\n filter: brightness(0.9);\r\n }\r\n button.btn-icon.tone-critical:hover:not(:disabled) {\r\n filter: brightness(0.9);\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-color-border-focus);\r\n outline-offset: 2px;\r\n }\r\n\r\n /* Dark mode overrides */\r\n :host-context([data-theme=\"dark\"]) button.btn-default.tone-default,\r\n :host-context(.dark) button.btn-default.tone-default {\r\n background: var(--rel-gray-text-primary);\r\n color: #000000;\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) button:focus-visible,\r\n :host-context(.dark) button:focus-visible {\r\n outline-color: var(--rel-color-text-primary);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) button.btn-secondary,\r\n :host-context(.dark) button.btn-secondary,\r\n :host-context([data-theme=\"dark\"]) button.btn-icon.tone-secondary,\r\n :host-context(.dark) button.btn-icon.tone-secondary {\r\n background: var(--rel-color-bg-primary);\r\n border-color: var(--rel-color-border-strong);\r\n color: var(--rel-color-text-primary);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) button.btn-text,\r\n :host-context(.dark) button.btn-text {\r\n color: var(--rel-color-text-primary);\r\n }\r\n\r\n /* btn-link: blue in both modes — no dark override */\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) {\r\n e.preventDefault();\r\n e.stopImmediatePropagation();\r\n }\r\n };\r\n\r\n private get classes() {\r\n return [\r\n `btn-${this.variant}`,\r\n `tone-${this.tone}`,\r\n `size-${this.size}`,\r\n `border-${this.border}`,\r\n ].join(\" \");\r\n }\r\n\r\n private handleClick(e: MouseEvent) {\r\n if (this.disabled) {\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 class=\"${this.classes}\"\r\n ?disabled=${this.disabled}\r\n @click=${this.handleClick}\r\n aria-disabled=${this.disabled}\r\n aria-label=${ifDefined(this.ariaLabel ?? undefined)}\r\n >\r\n <slot></slot>\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\nimport \"../../styles/vars-v2.css\";\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-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-fontFamilies-primary, sans-serif);\r\n background: var(--rel-colors-white, #fff);\r\n border: 1px solid var(--rel-border-default, #ddd);\r\n border-radius: var(--rel-borders-radius-border-radius-200, 8px);\r\n padding: var(--rel-spacing-space-md, 16px);\r\n max-width: 320px;\r\n color: var(--rel-text-primary, #333);\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-space-md);\r\n }\r\n\r\n .header-center {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-space-xs);\r\n font-size: var(--rel-fontSizes-md);\r\n font-weight: var(--rel-fontWeights-semibold);\r\n color: var(--rel-text-heading);\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-borders-radius-border-radius-200);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n cursor: pointer;\r\n color: var(--rel-color-text-primary);\r\n transition: background-color 0.15s ease;\r\n }\r\n\r\n .nav-button:hover {\r\n background: var(--rel-color-bg-secondary);\r\n }\r\n\r\n .nav-button:focus-visible {\r\n outline: 2px solid var(--rel-color-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-space-3xs);\r\n }\r\n\r\n .weekday {\r\n text-align: center;\r\n font-size: var(--rel-fontSizes-xs);\r\n font-weight: var(--rel-fontWeights-semibold);\r\n color: var(--rel-gray-text-placeholder);\r\n padding: var(--rel-spacing-space-xs);\r\n text-transform: uppercase;\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-borders-radius-border-radius-200);\r\n font-size: var(--rel-fontSizes-sm);\r\n font-weight: var(--rel-fontWeights-medium);\r\n color: var(--rel-text-primary);\r\n cursor: pointer;\r\n position: relative;\r\n transition: all 0.15s ease;\r\n font-family: var(--rel-fontFamilies-primary);\r\n }\r\n\r\n .day-button:hover:not(:disabled):not(.selected) {\r\n background: var(--rel-surface-secondary);\r\n }\r\n\r\n .day-button:focus-visible {\r\n outline: 2px solid var(--rel-color-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-color-brand);\r\n }\r\n\r\n .day-button.selected {\r\n background: var(--rel-color-brand);\r\n color: #000000;\r\n font-weight: var(--rel-fontWeights-semibold);\r\n }\r\n\r\n .day-button.other-month {\r\n color: var(--rel-gray-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-color-bg-primary);\r\n border-color: var(--rel-color-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 });\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: this.isDateDisabledInternal(date),\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 class=\"header\">\r\n <button\r\n 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 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 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 class=\"calendar-grid\" role=\"row\">\r\n ${weekdayLabels.map(\r\n (label) => html`\r\n <div 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 class=\"calendar-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 aria-label=\"${this.formatISODate(day.date)}\"\r\n aria-selected=\"${day.isSelected}\"\r\n ?disabled=${day.isDisabled || (!day.isCurrentMonth && 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 } from \"lit\";\r\nimport { customElement } from \"lit/decorators.js\";\r\nimport \"../../styles/vars-v2.css\";\r\n\r\n@customElement(\"rel-card\")\r\nexport class RelCard extends LitElement {\r\n static styles = css`\r\n :host {\r\n display: block;\r\n font-family: var(--rel-fontFamilies-primary, sans-serif);\r\n }\r\n\r\n .card {\r\n background-color: var(--rel-color-bg-primary);\r\n color: var(--rel-color-text-primary);\r\n border-radius: var(--rel-borders-radius-border-radius-200);\r\n border: 1px solid var(--rel-color-border-default);\r\n padding: var(--rel-spacing-space-md);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .card,\r\n :host-context(.dark) .card {\r\n background-color: var(--rel-color-bg-primary);\r\n border-color: var(--rel-color-border-default);\r\n }\r\n `;\r\n\r\n render() {\r\n return html`\r\n <div class=\"card\">\r\n <slot></slot>\r\n </div>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css, nothing } from \"lit\";\nimport { customElement, property, state, query } from \"lit/decorators.js\";\nimport \"../../styles/vars-v2.css\";\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 @property({ type: String }) 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 display: block;\n font-family: var(--rel-fontFamilies-primary);\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 .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-color-bg-tertiary, #f0f0f0);\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-color-border-default);\n background: var(--rel-color-bg-primary);\n color: var(--rel-color-text-primary);\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-color-bg-secondary);\n }\n\n .nav-button:focus-visible {\n outline: 2px solid var(--rel-color-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: 12px;\n }\n\n .nav-button.next {\n right: 12px;\n }\n\n .nav-button svg {\n width: 20px;\n height: 20px;\n }\n\n /* Dots indicator */\n .dots {\n display: flex;\n justify-content: center;\n gap: var(--rel-spacing-space-xs);\n margin-top: var(--rel-spacing-space-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-color-border-default);\n cursor: pointer;\n padding: 0;\n transition: all 0.15s ease;\n }\n\n .dot:hover {\n background: var(--rel-color-border-divider);\n }\n\n .dot.active {\n background: var(--rel-color-brand);\n width: var(--rel-carousel-dot-size-active, 24px);\n border-radius: 4px;\n }\n\n .dot:focus-visible {\n outline: 2px solid var(--rel-color-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-color-bg-secondary);\n border-color: var(--rel-color-border-default);\n color: var(--rel-color-text-primary);\n }\n\n :host-context([data-theme=\"dark\"]) .nav-button:hover,\n :host-context(.dark) .nav-button:hover {\n background: var(--rel-color-bg-tertiary);\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 if (w === 0) return;\n this.style.setProperty('--rel-carousel-slide-width', `${w}px`);\n this.renderRoot.querySelectorAll('.carousel-clone').forEach(el => {\n (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 if (w > 0) {\n this.style.setProperty('--rel-carousel-slide-width', `${w}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 // 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 lastClone.style.width = `${this.viewport?.offsetWidth ?? 0}px`;\n lastClone.style.boxSizing = 'border-box';\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 firstClone.style.width = `${this.viewport?.offsetWidth ?? 0}px`;\n firstClone.style.boxSizing = 'border-box';\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 unit(): number {\n const slideWidth = this.viewport?.offsetWidth ?? 0;\n const gapValue = this.gap && this.gap > 0 ? this.gap : 0;\n return slideWidth + 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 = `translateX(${translate}px)`;\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 = `translateX(${translate}px)`;\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 = `translateX(${translate}px)`;\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 = 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 currentX = e.clientX;\n const deltaX = currentX - this.dragStartX;\n this.currentTranslate = this.prevTranslate + deltaX;\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 = `translateX(${this.currentTranslate}px)`;\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 deltaX = e.clientX - this.dragStartX;\n const slideWidth = this.viewport.offsetWidth;\n const threshold = slideWidth * 0.2; // 20% threshold\n\n if (Math.abs(deltaX) > threshold) {\n if (deltaX > 0 && (this.value > 0 || this.clonesBefore > 0)) {\n this.goToPrevious();\n } else if (deltaX < 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 e.preventDefault();\n this.goToPrevious();\n break;\n case \"ArrowRight\":\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 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.showButtons\n ? html`\n <button\n class=\"nav-button prev\"\n part=\"prev-button\"\n aria-label=\"Previous slide\"\n ?disabled=${!canGoPrev || this.disabled}\n @click=${this.goToPrevious}\n >\n <svg viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M10 12L6 8L10 4\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n\n <button\n class=\"nav-button next\"\n part=\"next-button\"\n aria-label=\"Next slide\"\n ?disabled=${!canGoNext || this.disabled}\n @click=${this.goToNext}\n >\n <svg viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M6 4L10 8L6 12\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n `\n : nothing}\n </div>\n\n ${this.showDots && this.slideCount > 1\n ? html`\n <div class=\"dots\" part=\"dots\">\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 </div>\n `\n : nothing}\n `;\n }\n}\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\nimport \"../../styles/vars-v2.css\";\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 display: block;\r\n font-family: var(--rel-fontFamilies-primary, sans-serif);\r\n }\r\n\r\n .card-media {\r\n background-color: var(--rel-color-bg-primary);\r\n color: var(--rel-color-text-primary);\r\n border-radius: var(--rel-borders-radius-border-radius-200);\r\n border: 1px solid var(--rel-color-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-space-md);\r\n }\r\n\r\n .card-content h3 {\r\n margin: 0 0 4px 0;\r\n font-size: var(--rel-fontSizes-md);\r\n font-weight: var(--rel-fontWeights-semibold);\r\n color: var(--rel-color-text-heading);\r\n }\r\n\r\n .card-content p {\r\n margin: 0 0 8px 0;\r\n font-size: var(--rel-fontSizes-sm);\r\n color: var(--rel-color-text-primary);\r\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-color-bg-primary);\r\n border-color: var(--rel-color-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-color-text-heading);\r\n }\r\n `;\r\n\r\n render() {\r\n return html`\r\n <div class=\"card-media\">\r\n ${this.imageSrc\r\n ? html`\r\n <div 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 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 display: block;\r\n font-family: var(--rel-fontFamilies-primary);\r\n }\r\n\r\n .wrapper {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n }\r\n\r\n .row {\r\n display: flex;\r\n align-items: center;\r\n gap: 10px;\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-gray-text-primary);\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-color-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-gray-text-primary);\r\n border-color: var(--rel-gray-text-primary);\r\n }\r\n\r\n .checked .check-icon {\r\n display: block;\r\n fill: #ffffff;\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-gray-text-primary);\r\n }\r\n\r\n /* Error unchecked — transparent fill, error border */\r\n .error .box {\r\n border-color: var(--rel-error-surface-default);\r\n }\r\n\r\n /* Error checked — error fill, transparent checkmark */\r\n .error.checked .box {\r\n background: var(--rel-error-surface-default);\r\n border-color: var(--rel-error-surface-default);\r\n }\r\n\r\n .error.checked .check-icon {\r\n fill: #ffffff;\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-error-surface-default);\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-color-text-disabled);\r\n }\r\n\r\n /* Dark mode — tokens auto-flip via vars-v2, declared explicitly for clarity */\r\n :host-context([data-theme=\"dark\"]) .box {\r\n border-color: var(--rel-gray-text-primary);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .checked .box {\r\n background: var(--rel-gray-text-primary);\r\n border-color: var(--rel-gray-text-primary);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .checked .check-icon {\r\n fill: var(--rel-color-bg-primary);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .indeterminate .indeterminate-icon {\r\n fill: var(--rel-gray-text-primary);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .error .box {\r\n border-color: var(--rel-error-surface-default);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .error.checked .box {\r\n background: var(--rel-error-surface-default);\r\n border-color: var(--rel-error-surface-default);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .error.checked .check-icon {\r\n fill: var(--rel-color-bg-primary);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .error.indeterminate .indeterminate-icon {\r\n fill: var(--rel-error-surface-default);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .label {\r\n color: var(--rel-gray-text-primary);\r\n }\r\n\r\n .label {\r\n font-size: var(--rel-fontSizes-md, 14px);\r\n font-weight: var(--rel-fontWeights-medium, 500);\r\n color: var(--rel-gray-text-primary);\r\n }\r\n\r\n .text {\r\n font-size: var(--rel-fontSizes-sm, 12px);\r\n color: var(--rel-text-placeholder, #a9a9a9);\r\n padding-left: 28px;\r\n }\r\n `;\r\n\r\n private toggle() {\r\n if (this.state === \"disabled\") return;\r\n\r\n if (this.status === \"unchecked\") this.status = \"checked\";\r\n else if (this.status === \"checked\") this.status = \"indeterminate\";\r\n else this.status = \"unchecked\";\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 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-colors-white, #fff)\">\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-colors-white, #fff)\">\r\n <rect width=\"16\" height=\"2\" />\r\n </svg>\r\n </span>\r\n\r\n <span class=\"label\">${this.label}</span>\r\n </label>\r\n\r\n ${this.supportingtext\r\n ? html`<span 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\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 @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 display: block;\r\n font-family: var(--rel-fontFamilies-primary);\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-space-xs);\r\n }\r\n\r\n .label {\r\n font-size: var(--rel-fontSizes-sm);\r\n font-weight: var(--rel-fontWeights-medium);\r\n color: var(--rel-text-heading);\r\n }\r\n\r\n .required-mark {\r\n color: var(--rel-error-surface-default, #cc0000);\r\n margin-left: 2px;\r\n }\r\n\r\n /* Support text (helperText / errorMessage) */\r\n .date-picker-support {\r\n font-size: var(--rel-fontSizes-xs);\r\n color: var(--rel-color-text-placeholder);\r\n }\r\n\r\n .date-picker-support.error {\r\n color: var(--rel-error-surface-default, #cc0000);\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-space-xs);\r\n padding: var(--rel-spacing-space-sm) var(--rel-spacing-space-md);\r\n background: var(--rel-color-bg-primary);\r\n border: 1px solid var(--rel-border-default);\r\n border-radius: var(--rel-borders-radius-border-radius-200);\r\n font-family: var(--rel-fontFamilies-primary);\r\n font-size: var(--rel-fontSizes-md);\r\n color: var(--rel-text-primary);\r\n cursor: pointer;\r\n transition: all 0.15s ease;\r\n text-align: left;\r\n }\r\n\r\n .trigger-button:hover:not(:disabled) {\r\n border-color: var(--rel-color-border-strong);\r\n }\r\n\r\n .trigger-button:focus-visible {\r\n outline: 2px solid var(--rel-color-border-focus);\r\n outline-offset: 2px;\r\n border-color: var(--rel-color-border-focus);\r\n }\r\n\r\n .trigger-button:disabled {\r\n cursor: not-allowed;\r\n background: var(--rel-surface-secondary);\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-error-surface-default, #cc0000);\r\n }\r\n\r\n .trigger-button.error:focus-visible {\r\n outline-color: var(--rel-error-surface-default, #cc0000);\r\n border-color: var(--rel-error-surface-default, #cc0000);\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-space-xs) var(--rel-spacing-space-sm);\r\n font-size: var(--rel-fontSizes-sm);\r\n }\r\n\r\n .date-picker-wrapper.large .trigger-button {\r\n padding: var(--rel-spacing-space-md) var(--rel-spacing-space-md);\r\n font-size: var(--rel-fontSizes-lg);\r\n }\r\n\r\n .trigger-content {\r\n flex: 1;\r\n color: var(--rel-text-primary);\r\n }\r\n\r\n .trigger-content.placeholder {\r\n color: var(--rel-colors-gray-placeholder);\r\n }\r\n\r\n .trigger-icons {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-space-2xs);\r\n }\r\n\r\n .icon-button {\r\n background: none;\r\n border: none;\r\n padding: var(--rel-spacing-space-3xs);\r\n cursor: pointer;\r\n color: var(--rel-color-text-placeholder);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: var(--rel-borders-radius-border-radius-100);\r\n transition: all 0.15s ease;\r\n }\r\n\r\n .icon-button:hover {\r\n background: var(--rel-surface-secondary);\r\n color: var(--rel-color-text-primary);\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-color-bg-primary);\r\n border: 1px solid var(--rel-border-default);\r\n border-radius: var(--rel-borders-radius-border-radius-200);\r\n box-shadow: var(--rel-shadows-shadow-300);\r\n padding: var(--rel-spacing-space-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-space-md);\r\n gap: var(--rel-spacing-space-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-borders-radius-border-radius-200);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n cursor: pointer;\r\n color: var(--rel-color-text-primary);\r\n transition: background-color 0.15s ease;\r\n }\r\n\r\n .nav-button:hover {\r\n background: var(--rel-surface-secondary);\r\n }\r\n\r\n .nav-button:focus-visible {\r\n outline: 2px solid var(--rel-color-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-space-xs) var(--rel-spacing-space-sm);\r\n background: var(--rel-color-bg-primary);\r\n border: 1px solid var(--rel-border-default);\r\n border-radius: var(--rel-borders-radius-border-radius-200);\r\n font-family: var(--rel-fontFamilies-primary);\r\n font-size: var(--rel-fontSizes-sm);\r\n font-weight: var(--rel-fontWeights-medium);\r\n color: var(--rel-text-heading);\r\n cursor: pointer;\r\n text-align: center;\r\n transition: all 0.15s ease;\r\n }\r\n\r\n .dropdown-trigger:hover {\r\n background: var(--rel-surface-secondary);\r\n }\r\n\r\n .dropdown-trigger:focus-visible {\r\n outline: 2px solid var(--rel-color-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-color-bg-primary);\r\n border: 1px solid var(--rel-border-default);\r\n border-radius: var(--rel-borders-radius-border-radius-200);\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-space-xs) var(--rel-spacing-space-sm);\r\n cursor: pointer;\r\n font-size: var(--rel-fontSizes-sm);\r\n color: var(--rel-text-primary);\r\n transition: background-color 0.15s ease;\r\n }\r\n\r\n .dropdown-item:hover {\r\n background: var(--rel-surface-secondary);\r\n }\r\n\r\n .dropdown-item.selected {\r\n background: var(--rel-background-info);\r\n color: var(--rel-text-info);\r\n font-weight: var(--rel-fontWeights-semibold);\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-space-3xs);\r\n margin-bottom: var(--rel-spacing-space-xs);\r\n }\r\n\r\n .weekday {\r\n text-align: center;\r\n font-size: var(--rel-fontSizes-xs);\r\n font-weight: var(--rel-fontWeights-semibold);\r\n color: var(--rel-color-text-placeholder);\r\n padding: var(--rel-spacing-space-xs);\r\n text-transform: uppercase;\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-space-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-borders-radius-border-radius-200);\r\n font-size: var(--rel-fontSizes-sm);\r\n font-weight: var(--rel-fontWeights-medium);\r\n color: var(--rel-text-primary);\r\n cursor: pointer;\r\n position: relative;\r\n transition: all 0.15s ease;\r\n font-family: var(--rel-fontFamilies-primary);\r\n }\r\n\r\n .day-button:hover:not(:disabled):not(.selected) {\r\n background: var(--rel-surface-secondary);\r\n }\r\n\r\n .day-button:focus-visible {\r\n outline: 2px solid var(--rel-color-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-colors-green-primary);\r\n }\r\n\r\n .day-button.selected {\r\n background: var(--rel-colors-green-primary);\r\n color: var(--rel-color-text-inverse);\r\n font-weight: var(--rel-fontWeights-semibold);\r\n }\r\n\r\n .day-button.other-month {\r\n color: var(--rel-colors-gray-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 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 class=\"${wrapperClasses}\">\r\n ${this.label\r\n ? html`<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","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 \"../../styles/vars-v2.css\";\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}\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 display: inline-block;\r\n font-family: var(--rel-fontFamilies-primary, Poppins, sans-serif);\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-space-xs, 8px);\r\n padding: var(--rel-spacing-space-sm, 12px) var(--rel-spacing-space-md, 16px);\r\n background: var(--rel-color-bg-primary, #fff);\r\n border: 1px solid var(--rel-color-border-default, #ddd);\r\n border-radius: var(--rel-borders-radius-border-radius-200, 8px);\r\n font-family: var(--rel-fontFamilies-primary, Poppins, sans-serif);\r\n font-size: var(--rel-fontSizes-md, 14px);\r\n color: var(--rel-color-text-primary, #333);\r\n cursor: pointer;\r\n width: 100%;\r\n text-align: left;\r\n transition: border-color 0.15s ease;\r\n }\r\n\r\n .trigger-button:hover:not(:disabled) {\r\n border-color: var(--rel-color-border-strong, #999);\r\n }\r\n\r\n .trigger-button:focus-visible {\r\n outline: 2px solid var(--rel-color-border-focus, #0091ea);\r\n outline-offset: 2px;\r\n }\r\n\r\n .trigger-content {\r\n flex: 1;\r\n color: var(--rel-color-text-primary, #333);\r\n }\r\n\r\n .trigger-content.placeholder {\r\n color: var(--rel-color-text-placeholder, #a9a9a9);\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-color-border-default, #ddd);\r\n border-radius: var(--rel-borders-radius-border-radius-200, 8px);\r\n background: var(--rel-color-bg-primary, #fff);\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 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-color-border-default, #ddd);\r\n padding: 12px;\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 12px;\r\n cursor: pointer;\r\n font-size: 13px;\r\n font-weight: var(--rel-fontWeights-medium, 500);\r\n font-family: var(--rel-fontFamilies-primary, Poppins, sans-serif);\r\n color: var(--rel-color-text-primary, #333);\r\n background: var(--rel-color-bg-tertiary, #f5f5f5);\r\n border: none;\r\n border-radius: var(--rel-borders-radius-border-radius-200, 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 line-height: 1.3;\r\n }\r\n\r\n .preset-item:hover:not(.active) {\r\n background: var(--rel-color-bg-hover, #eeeeee);\r\n }\r\n\r\n .preset-item.active {\r\n background: #1A1A1A;\r\n color: #FFFFFF;\r\n font-weight: var(--rel-fontWeights-semibold, 600);\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-color-border-default, #ddd);\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 font-size: 11px;\r\n font-weight: var(--rel-fontWeights-medium, 500);\r\n color: var(--rel-color-text-secondary, #9e9e9e);\r\n background: var(--rel-color-bg-primary, #fff);\r\n padding: 0 3px;\r\n line-height: 1;\r\n }\r\n\r\n .date-input-value {\r\n display: block;\r\n border: 1px solid var(--rel-color-border-default, #ddd);\r\n border-radius: var(--rel-borders-radius-border-radius-200, 8px);\r\n padding: 6px 8px;\r\n font-size: var(--rel-fontSizes-md, 14px);\r\n font-weight: var(--rel-fontWeights-semibold, 600);\r\n font-family: var(--rel-fontFamilies-primary, Poppins, sans-serif);\r\n color: var(--rel-color-text-primary, #333);\r\n background: var(--rel-color-bg-primary, #fff);\r\n width: 100%;\r\n box-sizing: border-box;\r\n }\r\n\r\n .date-input-value.empty {\r\n color: var(--rel-color-text-placeholder, #a9a9a9);\r\n font-weight: var(--rel-fontWeights-regular, 400);\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-size: 15px;\r\n font-weight: var(--rel-fontWeights-semibold, 600);\r\n color: var(--rel-color-text-heading, #2b2b2b);\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-color-text-primary, #333);\r\n padding: 4px;\r\n border-radius: var(--rel-borders-radius-border-radius-200, 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-color-bg-hover, #f5f5f5); }\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 font-size: var(--rel-fontSizes-sm, 12px);\r\n font-weight: var(--rel-fontWeights-semibold, 600);\r\n color: var(--rel-color-text-secondary, #9e9e9e);\r\n padding: 2px 0;\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-color-bg-selected, #eeeeee);\r\n }\r\n\r\n .day-cell.range-start:not(.range-end) {\r\n background: linear-gradient(to right, transparent 50%, var(--rel-color-bg-selected, #eeeeee) 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-color-bg-selected, #eeeeee) 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-size: 13px;\r\n font-weight: var(--rel-fontWeights-medium, 500);\r\n font-family: var(--rel-fontFamilies-primary, Poppins, sans-serif);\r\n color: var(--rel-color-text-primary, #333);\r\n position: relative;\r\n z-index: 1;\r\n transition: background 0.15s ease;\r\n line-height: 1;\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-color-bg-hover, #f5f5f5);\r\n }\r\n\r\n /* Today: green outline */\r\n .day-cell.today:not(.range-start):not(.range-end) .day-inner {\r\n border: 2px solid var(--rel-colors-green-primary, #00f49c);\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: #1A1A1A;\r\n color: #FFFFFF;\r\n font-weight: var(--rel-fontWeights-semibold, 600);\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: #1A1A1A;\r\n color: #FFFFFF;\r\n border: 2px solid var(--rel-colors-green-primary, #00f49c);\r\n }\r\n\r\n /* ── Dark mode overrides ── */\r\n :host-context([data-theme=\"dark\"]) .day-cell.in-range,\r\n :host-context(.dark) .day-cell.in-range {\r\n background: var(--rel-color-bg-selected, #404040);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .day-cell.range-start:not(.range-end),\r\n :host-context(.dark) .day-cell.range-start:not(.range-end) {\r\n background: linear-gradient(to right, transparent 50%, var(--rel-color-bg-selected, #404040) 50%);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .day-cell.range-end:not(.range-start),\r\n :host-context(.dark) .day-cell.range-end:not(.range-start) {\r\n background: linear-gradient(to left, transparent 50%, var(--rel-color-bg-selected, #404040) 50%);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .day-cell.range-start .day-inner,\r\n :host-context([data-theme=\"dark\"]) .day-cell.range-end .day-inner,\r\n :host-context(.dark) .day-cell.range-start .day-inner,\r\n :host-context(.dark) .day-cell.range-end .day-inner {\r\n background: #F5F5F5;\r\n color: #1A1A1A;\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .day-cell.today.range-start .day-inner,\r\n :host-context([data-theme=\"dark\"]) .day-cell.today.range-end .day-inner,\r\n :host-context(.dark) .day-cell.today.range-start .day-inner,\r\n :host-context(.dark) .day-cell.today.range-end .day-inner {\r\n background: #F5F5F5;\r\n color: #1A1A1A;\r\n border: 2px solid var(--rel-colors-green-primary, #00f49c);\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-color-border-default, #ddd);\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 });\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 });\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 });\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 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 class=\"backdrop\" @click=${this.cancelPopover}></div>`\r\n : nothing}\r\n\r\n <div\r\n 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 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 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=\"#00F49C\"/>\r\n <path d=\"M7 12.5l3.5 3.5 6.5-7\" stroke=\"#000000\" 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 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 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 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 ]\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 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 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 font-family: var(--rel-fontFamilies-primary);\n font-weight: 500;\n letter-spacing: -0.6px;\n gap: 8px;\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: 4px 8px;\n font-size: 16px;\n line-height: 24px;\n }\n\n :host([size=\"md\"]) .chip {\n height: 28px;\n padding: 4px 8px;\n font-size: 14px;\n line-height: 22px;\n }\n\n :host([size=\"sm\"]) .chip {\n height: 24px;\n padding: 4px 8px;\n font-size: 12px;\n line-height: 20px;\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: 4px;\n }\n\n :host([border=\"rounded\"]) .chip {\n border-radius: 1000px;\n padding-left: 12px;\n padding-right: 12px;\n }\n\n /* ── Tone x Variant — Default/Default state colors ── */\n :host([tone=\"neutral\"][variant=\"fill\"]) .chip {\n background: #0b0b0b;\n color: #ffffff;\n }\n :host([tone=\"neutral\"][variant=\"subtle\"]) .chip {\n background: #f5f5f5;\n color: #0b0b0b;\n }\n :host([tone=\"danger\"][variant=\"fill\"]) .chip {\n background: #f83b3b;\n color: #ffffff;\n }\n :host([tone=\"danger\"][variant=\"subtle\"]) .chip {\n background: #fff1f1;\n color: #ce3131;\n }\n :host([tone=\"warning\"][variant=\"fill\"]) .chip {\n background: #ffcb66;\n color: #0b0b0b;\n }\n :host([tone=\"warning\"][variant=\"subtle\"]) .chip {\n background: #ffefd1;\n color: #713f12;\n }\n :host([tone=\"success\"][variant=\"fill\"]) .chip {\n background: #00a86b;\n color: #ffffff;\n }\n :host([tone=\"success\"][variant=\"subtle\"]) .chip {\n background: #edf8f4;\n color: #008655;\n }\n :host([tone=\"info\"][variant=\"fill\"]) .chip {\n background: #0091ea;\n color: #ffffff;\n }\n :host([tone=\"info\"][variant=\"subtle\"]) .chip {\n background: #eff7ff;\n color: #00528d;\n }\n\n /* ── Hover / Dragged — Figma only specs explicit color shifts for the\n \"neutral\" tone; the other four tones have no hover/dragged sample to\n match, so a generic brightness dim covers them instead of leaving\n hover completely inert. Flagged in the handoff notes. ── */\n :host([tone=\"neutral\"][variant=\"fill\"]) .chip:hover {\n background: #363636;\n }\n :host([tone=\"neutral\"][variant=\"fill\"]) .chip:active,\n :host([tone=\"neutral\"][variant=\"fill\"][dragging]) .chip {\n background: #404040;\n }\n :host([tone=\"neutral\"][variant=\"subtle\"]) .chip:active,\n :host([tone=\"neutral\"][variant=\"subtle\"][dragging]) .chip {\n background: #e5e5e5;\n }\n\n :host(:not([tone=\"neutral\"])) .chip:hover {\n filter: brightness(0.96);\n }\n :host(:not([tone=\"neutral\"])) .chip:active,\n :host(:not([tone=\"neutral\"])[dragging]) .chip {\n filter: brightness(0.92);\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, #0b0b0b);\n outline-offset: 0;\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: 16px;\n }\n\n :host([size=\"md\"]) .chip-icon {\n --rel-icon-size: 14px;\n }\n\n :host([size=\"sm\"]) .chip-icon {\n --rel-icon-size: 12px;\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: rgba(255, 255, 255, 0.25);\n --rel-avatar-color-fill: #ffffff;\n }\n\n :host([variant=\"subtle\"]) .chip rel-avatar {\n --rel-avatar-bg-fill: rgba(11, 11, 11, 0.12);\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: 2px;\n }\n\n :host([size=\"lg\"]) .chip-remove {\n --rel-icon-size: 16px;\n }\n :host([size=\"md\"]) .chip-remove {\n --rel-icon-size: 14px;\n }\n :host([size=\"sm\"]) .chip-remove {\n --rel-icon-size: 12px;\n }\n\n /* ── Dark mode — Figma had no dark-mode sample for this new component\n set. Fill stays unchanged (the saturated tones already read fine on\n dark surfaces); Subtle gets a dark-tinted background, following the\n same invert pattern used elsewhere in this design system. Flagged in\n the handoff notes — adjust if exact values exist.\n No [data-theme=\"dark\"] :host(...) fallback here — :host() can never\n be preceded by a combinator, so that form is invalid and silently\n matches nothing (the exact bug hit and fixed multiple times in\n rel-avatar/rel-select earlier this session). :host-context() alone\n has universal modern browser support, so no fallback is needed. ── */\n :host-context([data-theme=\"dark\"])[tone=\"neutral\"][variant=\"subtle\"] .chip {\n background: #333333;\n color: #f5f5f5;\n }\n\n :host-context([data-theme=\"dark\"])[tone=\"danger\"][variant=\"subtle\"] .chip {\n background: #3d1414;\n color: #ff8080;\n }\n\n :host-context([data-theme=\"dark\"])[tone=\"warning\"][variant=\"subtle\"] .chip {\n background: #3d2e0a;\n color: #ffd980;\n }\n\n :host-context([data-theme=\"dark\"])[tone=\"success\"][variant=\"subtle\"] .chip {\n background: #0d2e22;\n color: #4ddba3;\n }\n\n :host-context([data-theme=\"dark\"])[tone=\"info\"][variant=\"subtle\"] .chip {\n background: #0a2e45;\n color: #66c2ff;\n }\n\n :host-context([data-theme=\"dark\"])[tone=\"neutral\"][variant=\"fill\"] .chip {\n background: #f5f5f5;\n color: #0b0b0b;\n }\n\n :host-context([data-theme=\"dark\"]) .chip-remove:focus-visible {\n outline-color: currentColor;\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 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 class=\"chip-icon\" name=\"${this.leadingIcon}\"></rel-icon>`\n : null}\n\n <span 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 }) padding: \"sm\" | \"md\" | \"lg\" = \"md\";\r\n @property({ type: Boolean }) shadow = false;\r\n @property({ type: String }) background: \"light\" | \"white\" | \"none\" = \"white\";\r\n\r\n static styles = css`\r\n :host {\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-borders-radius-border-radius-200);\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-color-bg-primary);\r\n }\r\n\r\n .bg-light {\r\n background-color: var(--rel-color-bg-secondary);\r\n }\r\n\r\n .bg-none {\r\n background: transparent;\r\n }\r\n\r\n .padding-sm {\r\n padding: var(--rel-spacing-space-xs);\r\n }\r\n\r\n .padding-md {\r\n padding: var(--rel-spacing-space-md);\r\n }\r\n\r\n .padding-lg {\r\n padding: var(--rel-spacing-space-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 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 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-fontFamilies-primary);\r\n color: var(--rel-color-text-primary);\r\n }\r\n\r\n /* Horizontal */\r\n .rel-divider.horizontal {\r\n width: 100%;\r\n height: var(--rel-borders-width-stroke-100);\r\n background-color: var(--rel-color-border-divider);\r\n margin: var(--rel-spacing-space-md) 0;\r\n }\r\n\r\n /* Vertical */\r\n .rel-divider.vertical {\r\n width: var(--rel-borders-width-stroke-100);\r\n background-color: var(--rel-color-border-divider);\r\n margin: 0 var(--rel-spacing-space-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 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 --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-color-bg-primary);\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-fontFamilies-primary);\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-borders-radius-border-radius-200)\r\n var(--rel-borders-radius-border-radius-200)\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-color-border-divider);\r\n border-radius: var(--rel-borders-radius-border-radius-500);\r\n margin: var(--rel-spacing-space-xs) auto var(--rel-spacing-space-2xs);\r\n cursor: grab;\r\n touch-action: none;\r\n }\r\n\r\n .handle:active {\r\n cursor: grabbing;\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-space-2xs);\r\n padding: var(--rel-spacing-space-md) var(--rel-spacing-space-lg);\r\n border-bottom: var(--rel-borders-width-stroke-100) solid var(--rel-color-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 }\r\n\r\n .title {\r\n font-size: var(--rel-fontSizes-lg);\r\n font-weight: var(--rel-fontWeights-semibold);\r\n color: var(--rel-text-heading);\r\n margin: 0;\r\n }\r\n\r\n .description {\r\n font-size: var(--rel-fontSizes-sm);\r\n color: var(--rel-text-primary);\r\n margin: 0;\r\n opacity: 0.8;\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-space-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-borders-radius-border-radius-100);\r\n color: var(--rel-color-text-primary);\r\n transition: background 0.15s ease;\r\n }\r\n\r\n .close-button:hover {\r\n background: var(--rel-surface-secondary, #fafafa);\r\n }\r\n\r\n .close-button:active {\r\n background: var(--rel-color-border-divider);\r\n }\r\n\r\n .close-button:focus-visible {\r\n outline: 2px solid var(--rel-color-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-space-lg);\r\n }\r\n\r\n /* Footer */\r\n .footer {\r\n flex-shrink: 0;\r\n padding: var(--rel-spacing-space-md) var(--rel-spacing-space-lg);\r\n border-top: var(--rel-borders-width-stroke-100) solid var(--rel-color-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-space-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 } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport \"../../styles/vars-v2.css\";\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 display: inline-flex;\n align-items: center;\n justify-content: center;\n font-family: var(--rel-fontFamilies-primary);\n font-weight: var(--rel-fontWeights-medium);\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 line-height: 1;\n vertical-align: middle;\n }\n\n :host([size=\"sm\"]) {\n font-size: var(--rel-fontSizes-xs);\n padding: var(--rel-spacing-space-3xs) var(--rel-spacing-space-xs);\n min-width: 20px;\n height: 20px;\n border-radius: var(--rel-borders-radius-border-radius-100);\n }\n\n :host([size=\"md\"]) {\n font-size: var(--rel-fontSizes-sm);\n padding: var(--rel-spacing-space-2xs) var(--rel-spacing-space-sm);\n min-width: 24px;\n height: 24px;\n border-radius: var(--rel-borders-radius-border-radius-100);\n }\n\n :host([size=\"lg\"]) {\n font-size: var(--rel-fontSizes-md);\n padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-md);\n min-width: 32px;\n height: 32px;\n border-radius: var(--rel-borders-radius-border-radius-200);\n }\n\n :host([variant=\"default\"]) {\n background: var(--rel-color-bg-secondary);\n color: var(--rel-color-text-heading);\n border: var(--rel-borders-width-stroke-100) solid var(--rel-color-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-color-bg-secondary);\n color: var(--rel-color-text-placeholder);\n border: var(--rel-borders-width-stroke-100) solid var(--rel-color-border-divider);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.03);\n }\n\n :host([pill]) {\n border-radius: var(--rel-borders-radius-border-radius-500);\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-color-bg-secondary);\n border-color: var(--rel-color-border-divider);\n }\n\n :host([inset][variant=\"muted\"]) {\n background: var(--rel-color-border-divider);\n border-color: var(--rel-color-border-default);\n }\n `;\n\n render() {\n return html`<slot></slot>`;\n }\n}\n","import { LitElement, html, css } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport \"../../styles/vars-v2.css\";\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 display: grid;\n width: 100%;\n font-family: var(--rel-fontFamilies-primary);\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 \"../../styles/vars-v2.css\";\n\nexport type MenuType = \"default\" | \"checkbox\" | \"arrow\";\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 display: inline-block;\n }\n\n .rel-menu {\n position: relative;\n display: inline-block;\n background: var(--rel-color-bg-primary);\n color: var(--rel-color-text-primary);\n border-radius: var(--rel-borders-radius-border-radius-300);\n box-shadow: var(--rel-shadows-shadow-300);\n min-width: 220px;\n font-family: var(--rel-fontFamilies-primary, sans-serif);\n font-size: var(--rel-fontSizes-sm);\n padding: var(--rel-spacing-space-3xs) 0;\n outline: none;\n overflow: hidden;\n }\n\n .rel-menu:focus-visible,\n :host(:focus-visible) .rel-menu {\n outline: 2px solid var(--rel-color-border-focus);\n outline-offset: 2px;\n }\n\n .rel-menu-item {\n position: relative;\n display: flex;\n align-items: center;\n gap: var(--rel-spacing-space-xs);\n padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-sm);\n line-height: var(--rel-lineHeights-sm);\n cursor: pointer;\n transition: background 0.15s ease, color 0.15s ease;\n user-select: none;\n }\n\n .rel-menu-item:hover {\n background: var(--rel-color-bg-hover);\n }\n\n .rel-menu-item:active {\n background: var(--rel-color-bg-hover);\n }\n\n .rel-menu-item.active {\n background: var(--rel-color-bg-hover);\n font-weight: var(--rel-fontWeights-medium);\n }\n\n .rel-menu-item.disabled {\n background-color: transparent;\n color: var(--rel-color-text-disabled);\n cursor: not-allowed;\n }\n\n .rel-menu-item[data-focused=\"true\"] {\n outline: 2px solid var(--rel-color-border-focus);\n outline-offset: -2px;\n }\n\n .menu-check-row {\n display: inline-flex;\n align-items: center;\n gap: var(--rel-spacing-space-2xs);\n width: 100%;\n }\n\n .menu-checkbox {\n width: 16px;\n height: 16px;\n cursor: pointer;\n }\n\n .menu-checkbox:disabled {\n cursor: not-allowed;\n }\n\n .menu-label {\n flex: 1 1 auto;\n }\n\n .chevron {\n font-size: var(--rel-fontSizes-lg);\n opacity: 0.75;\n transform: translateY(1px);\n }\n\n .rel-submenu {\n position: absolute;\n top: calc(-1 * var(--rel-spacing-space-3xs));\n left: calc(100% + var(--rel-spacing-space-2xs));\n min-width: 200px;\n background: var(--rel-color-bg-primary);\n color: var(--rel-color-text-primary);\n border-radius: var(--rel-borders-radius-border-radius-300);\n box-shadow: var(--rel-shadows-shadow-300);\n padding: var(--rel-spacing-space-3xs) 0;\n visibility: hidden;\n pointer-events: none;\n z-index: 20;\n }\n\n .rel-submenu.visible {\n visibility: visible;\n pointer-events: auto;\n }\n\n .rel-submenu .rel-menu-item {\n padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-sm);\n }\n `;\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 private handleDocumentClick = (e: MouseEvent) => {\n if (!this.contains(e.target as Node)) {\n this._items = this._items.map(i => ({ ...i, open: false }));\n }\n };\n\n private onItemEnter(item: MenuItem, index: number) {\n if (this.type === \"arrow\" && item.submenu?.length) {\n this._items = this._items.map((i, idx) => ({ ...i, open: idx === index }));\n }\n }\n\n private onItemLeave(_item: MenuItem) {\n // Keep open so user can move into submenu\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 const next = !item.open;\n this._items = this._items.map((i, idx) => ({\n ...i,\n open: idx === index ? next : false,\n }));\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._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 toggleCheckbox(item: MenuItem, ev: Event) {\n ev.stopPropagation();\n if (!item.disabled) {\n item.checked = !item.checked;\n this.dispatchEvent(\n new CustomEvent(\"rel-check\", {\n detail: { item, checked: item.checked },\n bubbles: true,\n composed: true,\n })\n );\n this.requestUpdate();\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 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._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\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)}\"\n @click=\"${(e: Event) => this.onItemClick(item, index, e)}\">\n ${this.type === \"checkbox\"\n ? html`\n <div class=\"menu-check-row\">\n <input\n class=\"menu-checkbox\"\n type=\"checkbox\"\n .checked=\"${item.checked || false}\"\n ?disabled=\"${item.disabled}\"\n @click=\"${(e: Event) => this.toggleCheckbox(item, e)}\" />\n <span class=\"menu-label\">${item.label}</span>\n </div>\n `\n : html`\n <span class=\"menu-label\">${item.label}</span>\n ${this.type === \"arrow\" && item.submenu?.length\n ? html`<span class=\"chevron\">▸</span>`\n : \"\"}\n `}\n ${this.type === \"arrow\" && item.submenu?.length\n ? html`\n <div\n 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 class=\"rel-menu\"\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 } 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\";\nimport \"../../styles/vars-v2.css\";\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 :host {\n display: block;\n }\n\n :host > slot {\n display: none;\n }\n\n .menubar-container {\n display: flex;\n align-items: stretch;\n background: var(--rel-color-bg-secondary);\n border: var(--rel-borders-width-stroke-100) solid var(--rel-color-border-default);\n border-radius: var(--rel-borders-radius-border-radius-200);\n overflow: hidden;\n padding: 0;\n gap: var(--rel-spacing-space-3xs);\n font-family: var(--rel-fontFamilies-primary);\n font-size: var(--rel-fontSizes-sm);\n height: 40px;\n width: fit-content;\n }\n\n .menubar-trigger {\n display: flex;\n align-items: center;\n align-self: stretch;\n height: 100%;\n padding: 0 var(--rel-spacing-space-sm);\n background: transparent;\n border: none;\n cursor: pointer;\n font-family: inherit;\n font-size: inherit;\n color: var(--rel-color-text-heading);\n transition: background 0.15s ease;\n user-select: none;\n outline: none;\n }\n\n .menubar-trigger:hover,\n .menubar-trigger.active {\n background: var(--rel-color-bg-selected);\n }\n\n .menubar-trigger:focus-visible {\n outline: 2px solid var(--rel-color-border-focus);\n outline-offset: 2px;\n }\n\n .menubar-panel {\n position: fixed;\n min-width: 220px;\n background: var(--rel-color-bg-primary);\n border: var(--rel-borders-width-stroke-100) solid var(--rel-color-border-default);\n border-radius: var(--rel-borders-radius-border-radius-200);\n box-shadow: var(--rel-shadows-shadow-300);\n padding: 0;\n overflow: hidden;\n z-index: 1000;\n display: none;\n }\n\n .menubar-panel.open {\n display: block;\n }\n\n .menu-item {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--rel-spacing-space-sm);\n padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-md);\n cursor: pointer;\n transition: background 0.15s ease;\n user-select: none;\n color: var(--rel-color-text-heading);\n line-height: var(--rel-lineHeights-sm);\n }\n\n .menu-item:hover,\n .menu-item.focused {\n background: var(--rel-color-bg-selected);\n }\n\n .menu-item[data-disabled=\"true\"] {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .menu-separator {\n height: var(--rel-borders-width-stroke-100);\n background: var(--rel-color-border-divider);\n margin: 0;\n padding: 0;\n }\n\n rel-icon {\n display: inline-flex;\n pointer-events: none;\n }\n\n .menu-submenu-trigger {\n position: relative;\n }\n\n .menu-submenu-trigger rel-icon {\n opacity: 0.6;\n }\n\n .submenu-panel {\n position: fixed;\n min-width: 200px;\n background: var(--rel-color-bg-primary);\n border: var(--rel-borders-width-stroke-100) solid var(--rel-color-border-default);\n border-radius: var(--rel-borders-radius-border-radius-200);\n box-shadow: var(--rel-shadows-shadow-300);\n padding: 0;\n overflow: hidden;\n z-index: 1001;\n display: none;\n }\n\n .submenu-panel.open {\n display: block;\n }\n\n .menu-shortcut {\n opacity: 0.6;\n font-size: var(--rel-fontSizes-xs);\n margin-left: auto;\n display: flex;\n align-items: center;\n gap: var(--rel-spacing-space-3xs);\n }\n\n .menubar-panel rel-checkbox {\n display: block;\n width: 100%;\n padding: var(--rel-spacing-space-xs, 8px) var(--rel-spacing-space-md, 16px);\n box-sizing: border-box;\n cursor: pointer;\n }\n `;\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 if (!this.contains(e.target as Node)) {\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 <slot></slot>\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, css } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport \"../../styles/vars-v2.css\";\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 display: block;\n font-family: var(--rel-fontFamilies-primary);\n }\n\n .rel-radio-group {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: var(--rel-spacing-space-xs);\n }\n\n .rel-radio-option {\n display: inline-flex;\n flex-direction: column;\n gap: var(--rel-spacing-space-3xs);\n cursor: pointer;\n }\n\n .rel-radio-option.disabled {\n opacity: 0.6;\n cursor: not-allowed !important;\n }\n\n .rel-radio-option:not(.disabled):hover .radio-custom {\n border-color: #525252;\n }\n\n .rel-radio-option:not(.disabled):hover .radio-label {\n color: #525252;\n }\n\n .rel-radio-option:not(.disabled):hover .radio-supporting {\n color: #7D7D7D;\n }\n\n .rel-radio-option:focus-within:has(input:focus-visible) {\n outline: 1.5px solid #000000;\n outline-offset: 1px;\n }\n\n .radio-main {\n display: flex;\n align-items: center;\n gap: var(--rel-spacing-space-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-color-text-heading);\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-color-text-heading);\n border-radius: 50%;\n }\n\n .radio-label {\n font-size: var(--rel-fontSizes-md, 16px);\n font-weight: var(--rel-fontWeights-medium);\n color: var(--rel-color-text-primary);\n }\n\n .radio-supporting {\n font-size: var(--rel-fontSizes-sm, 12px);\n margin-left: 28px;\n color: #7D7D7D;\n }\n\n /* Error state — unchecked only */\n .rel-radio-option.error-unchecked .radio-custom {\n border-color: #CE3131;\n }\n\n .rel-radio-option.error-unchecked .radio-label {\n color: #CE3131;\n }\n\n .rel-radio-option.error-unchecked .radio-supporting {\n color: #CE3131;\n }\n\n /* Error message below group */\n .error-message {\n font-size: var(--rel-fontSizes-sm, 12px);\n color: #CE3131;\n margin-top: var(--rel-spacing-space-2xs, 4px);\n }\n\n /* Dark mode hover overrides */\n :host-context([data-theme=\"dark\"]) .rel-radio-option:not(.disabled):hover .radio-custom,\n :host-context(.dark) .rel-radio-option:not(.disabled):hover .radio-custom {\n border-color: var(--rel-color-text-secondary, #D4D4D4);\n }\n\n :host-context([data-theme=\"dark\"]) .rel-radio-option:not(.disabled):hover .radio-label,\n :host-context(.dark) .rel-radio-option:not(.disabled):hover .radio-label {\n color: var(--rel-color-text-secondary, #D4D4D4);\n }\n\n :host-context([data-theme=\"dark\"]) .rel-radio-option:not(.disabled):hover .radio-supporting,\n :host-context(.dark) .rel-radio-option:not(.disabled):hover .radio-supporting {\n color: var(--rel-color-text-placeholder, #A3A3A3);\n }\n\n :host-context([data-theme=\"dark\"]) .rel-radio-option:focus-within:has(input:focus-visible),\n :host-context(.dark) .rel-radio-option:focus-within:has(input:focus-visible) {\n outline: 1.5px solid var(--rel-color-text-primary, #F5F5F5);\n outline-offset: 1px;\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 isErrorActive = this.error && !this.hasSelection;\n\n const classes = [\n \"rel-radio-option\",\n isDisabled ? \"disabled\" : \"\",\n isErrorActive ? \"error-unchecked\" : \"\",\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 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 class=\"rel-radio-group\">\n ${this.options.map((o) => this.renderOption(o))}\n </div>\n ${this.error && this.errorMessage && !this.hasSelection\n ? html`<div class=\"error-message\">${this.errorMessage}</div>`\n : \"\"}\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 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-colors-white, #fff);\r\n color: var(--rel-text-primary, #333);\r\n border-bottom: 1px solid var(--rel-border-default, #ddd);\r\n height: 64px;\r\n padding: 0 var(--rel-spacing-space-lg);\r\n box-sizing: border-box;\r\n font-family: var(--rel-fontFamilies-primary, sans-serif);\r\n }\r\n\r\n .brand {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-space-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-space-sm);\r\n flex: 1;\r\n justify-content: flex-start;\r\n padding: 0 var(--rel-spacing-space-xl);\r\n }\r\n\r\n .actions {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-space-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-space-md);\r\n }\r\n\r\n :host([device=\"mobile\"]) .navbar {\r\n height: 56px;\r\n padding: 0 var(--rel-spacing-space-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 \"../../styles/vars-v2.css\";\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 --rel-topbar-height: 64px;\r\n --rel-topbar-height-compact: 48px;\r\n --rel-topbar-bg: var(--rel-color-bg-primary);\r\n --rel-topbar-border-color: var(--rel-border-default, #ddd);\r\n --rel-topbar-item-color: var(--rel-color-text-primary);\r\n --rel-topbar-item-active-color: var(--rel-colors-green-tertiary, #00a86b);\r\n --rel-topbar-item-active-indicator: var(--rel-colors-green-primary, #00f49c);\r\n --rel-topbar-item-hover-bg: var(--rel-color-bg-secondary);\r\n --rel-topbar-divider-color: var(--rel-border-divider, #bdbdbd);\r\n --rel-topbar-carrier-action-bg: var(--rel-color-text-primary);\r\n --rel-topbar-carrier-action-color: var(--rel-color-bg-primary);\r\n --rel-topbar-z: 100;\r\n\r\n display: block;\r\n width: 100%;\r\n font-family: var(--rel-fontFamilies-primary, 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-borders-width-stroke-100, 1px) solid var(--rel-topbar-border-color);\r\n padding: 0 var(--rel-spacing-space-xl, 24px);\r\n box-sizing: border-box;\r\n gap: var(--rel-spacing-space-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-space-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-space-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-borders-width-stroke-100, 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-space-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-space-2xs, 4px) var(--rel-spacing-space-sm, 12px);\r\n border-radius: var(--rel-borders-radius-border-radius-500, 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-borders-radius-border-radius-200, 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-borders-width-stroke-100, 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-space-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-space-xs, 8px) var(--rel-spacing-space-xl, 24px);\r\n color: var(--rel-topbar-item-color);\r\n font-family: var(--rel-fontFamilies-primary, Poppins, sans-serif);\r\n font-size: var(--rel-fontSizes-md, 14px);\r\n font-weight: var(--rel-fontWeights-medium, 500);\r\n text-decoration: none;\r\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\";\nimport \"../../styles/vars-v2.css\";\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 display: inline-flex;\n align-items: center;\n }\n\n a {\n display: inline-flex;\n align-items: center;\n gap: var(--rel-spacing-space-xs);\n text-decoration: none;\n color: var(--rel-color-text-primary);\n font-weight: var(--rel-fontWeights-semibold);\n font-size: var(--rel-fontSizes-md);\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\";\nimport \"../../styles/vars-v2.css\";\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-space-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\";\nimport \"../../styles/vars-v2.css\";\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-space-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\";\nimport \"../../styles/vars-v2.css\";\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\";\nimport \"../../styles/vars-v2.css\";\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-color-bg-primary);\n border-radius: var(--rel-borders-radius-border-radius-200);\n box-shadow: var(--rel-shadow-200);\n padding: var(--rel-spacing-space-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\";\nimport \"../../styles/vars-v2.css\";\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-space-xs, 8px) var(--rel-spacing-space-md, 16px);\n color: var(--rel-color-text-primary);\n text-decoration: none;\n font-size: var(--rel-fontSizes-md);\n font-family: var(--rel-fontFamilies-primary, sans-serif);\n }\n\n .dropdown-item:hover {\n background: var(--rel-color-bg-hover);\n border-radius: 0;\n }\n\n :host([active]) .dropdown-item {\n color: var(--rel-topbar-item-active-color, var(--rel-colors-green-tertiary, #00a86b));\n font-weight: var(--rel-fontWeights-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 \"../../styles/vars-v2.css\";\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 --_item-color: var(--rel-topbar-item-color, var(--rel-text-primary, #333));\r\n --_item-active-color: var(--rel-topbar-item-active-color, var(--rel-colors-green-tertiary, #00a86b));\r\n --_item-active-indicator: var(--rel-topbar-item-active-indicator, var(--rel-colors-green-primary, #00f49c));\r\n --_item-hover-bg: var(--rel-topbar-item-hover-bg, var(--rel-surface-secondary, #fafafa));\r\n\r\n display: inline-block;\r\n position: relative;\r\n font-family: var(--rel-fontFamilies-primary, 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-space-2xs, 4px);\r\n padding: var(--rel-spacing-space-xs, 8px) var(--rel-spacing-space-sm, 12px);\r\n border: none;\r\n background: transparent;\r\n border-radius: var(--rel-borders-radius-border-radius-200, 8px);\r\n cursor: pointer;\r\n color: var(--_item-color);\r\n font-family: inherit;\r\n font-size: var(--rel-fontSizes-md, 14px);\r\n font-weight: var(--rel-fontWeights-medium, 500);\r\n line-height: var(--rel-lineHeights-md, 20px);\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;\r\n }\r\n\r\n .trigger::after {\r\n content: \"\";\r\n position: absolute;\r\n bottom: -2px;\r\n left: var(--rel-spacing-space-sm, 12px);\r\n right: var(--rel-spacing-space-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-fontWeights-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-color-bg-primary);\r\n border: var(--rel-borders-width-stroke-100, 1px) solid var(--rel-color-border-default);\r\n border-radius: var(--rel-borders-radius-border-radius-200, 8px);\r\n box-shadow: var(--rel-shadows-shadow-300);\r\n padding: var(--rel-spacing-space-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 \"../../styles/vars-v2.css\";\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 --_profile-radius: var(--rel-borders-radius-border-radius-500, 1000px);\r\n --_avatar-size: 36px;\r\n --_avatar-size-sm: 28px;\r\n --_avatar-bg: var(--rel-colors-green-primary, #00f49c);\r\n --_avatar-color: var(--rel-color-text-primary);\r\n\r\n /* Reward tier colours (reference existing token palette) */\r\n --rel-topbar-reward-gold: var(--rel-colors-gold, #d6ba00);\r\n --rel-topbar-reward-gold-bg: var(--rel-colors-gold-light, #f6efd7);\r\n --rel-topbar-reward-silver: var(--rel-colors-silver, #bababa);\r\n --rel-topbar-reward-silver-bg: var(--rel-colors-silver-secondary, #f0f0f0);\r\n --rel-topbar-reward-platinum: var(--rel-colors-platinum, #8392c9);\r\n --rel-topbar-reward-platinum-bg: var(--rel-colors-platinum-secondary, #e4e6f2);\r\n --rel-topbar-reward-bronze: var(--rel-colors-bronze, #7d5300);\r\n --rel-topbar-reward-bronze-bg: var(--rel-colors-bronze-secondary, #e2dac7);\r\n --rel-topbar-reward-regular: var(--rel-colors-gray-divider, #bdbdbd);\r\n --rel-topbar-reward-regular-bg: var(--rel-color-bg-secondary);\r\n\r\n display: inline-flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-space-xs, 8px);\r\n font-family: var(--rel-fontFamilies-primary, 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\n font-size: var(--rel-fontSizes-md, 14px);\r\n font-weight: var(--rel-fontWeights-medium, 500);\r\n color: var(--rel-color-text-primary);\r\n line-height: var(--rel-lineHeights-md, 20px);\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n }\r\n\r\n .subtitle {\r\n font-size: var(--rel-fontSizes-sm, 12px);\r\n font-weight: var(--rel-fontWeights-regular, 400);\r\n color: var(--rel-color-text-placeholder);\r\n line-height: var(--rel-lineHeights-sm, 18px);\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\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-space-3xs, 2px);\r\n padding: 2px var(--rel-spacing-space-2xs, 4px);\r\n border-radius: var(--rel-borders-radius-border-radius-100, 2px);\r\n font-size: var(--rel-fontSizes-xs, 10px);\r\n font-weight: var(--rel-fontWeights-bold, 700);\r\n text-transform: uppercase;\r\n letter-spacing: 0.4px;\r\n flex-shrink: 0;\r\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-colors-gray-primary, #333);\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-colors-gray-primary, #333);\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-space-xs, 8px);\r\n padding: var(--rel-spacing-space-2xs, 4px) var(--rel-spacing-space-xs, 8px);\r\n border-radius: var(--rel-borders-radius-border-radius-200, 8px);\r\n background: var(--rel-surface-secondary, #fafafa);\r\n border: var(--rel-borders-width-stroke-100, 1px) solid var(--rel-color-border-default);\r\n }\r\n\r\n :host([compact]) .carrier-tile {\r\n padding: var(--rel-spacing-space-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-colors-gold)\",\r\n platinum: \"var(--rel-colors-platinum)\",\r\n silver: \"var(--rel-colors-silver)\",\r\n bronze: \"var(--rel-colors-bronze)\",\r\n regular: \"var(--rel-colors-green-primary)\",\r\n };\r\n return map[this.reward] ?? \"var(--rel-colors-green-primary)\";\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 @property({ type: String }) 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 display: inline-block;\r\n font-family: var(--rel-fontFamilies-primary);\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-space-2xs);\r\n position: relative;\r\n }\r\n\r\n .otp-group {\r\n display: flex;\r\n gap: var(--rel-spacing-space-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-gray-divider-default);\r\n font-size: var(--rel-fontSizes-lg);\r\n font-weight: var(--rel-fontWeights-semibold);\r\n user-select: none;\r\n padding: 0 var(--rel-spacing-space-3xs);\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-borders-width-stroke-100) solid var(--rel-color-border-default);\r\n border-radius: var(--rel-borders-radius-border-radius-200);\r\n background: var(--rel-color-bg-primary);\r\n font-family: var(--rel-fontFamilies-primary);\r\n font-size: var(--rel-fontSizes-lg);\r\n font-weight: var(--rel-fontWeights-medium);\r\n text-align: center;\r\n color: var(--rel-color-text-primary);\r\n outline: none;\r\n transition: border-color 0.15s ease, box-shadow 0.15s ease;\r\n caret-color: var(--rel-color-text-primary);\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-size: var(--rel-fontSizes-md);\r\n }\r\n\r\n :host([size=\"lg\"]) .otp-cell {\r\n width: 48px;\r\n height: 56px;\r\n font-size: var(--rel-fontSizes-xl);\r\n }\r\n\r\n .otp-cell::placeholder {\r\n color: var(--rel-color-text-placeholder);\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-color-text-primary);\r\n }\r\n\r\n .otp-cell:focus-visible {\r\n border-color: var(--rel-color-text-heading);\r\n box-shadow: 0 0 0 2px var(--rel-color-border-default);\r\n }\r\n\r\n .otp-cell:disabled {\r\n background: var(--rel-color-bg-secondary);\r\n color: var(--rel-color-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-color-bg-tertiary);\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-error);\r\n }\r\n\r\n :host([invalid]) .otp-cell:focus {\r\n border-color: var(--rel-border-error);\r\n box-shadow: 0 0 0 2px var(--rel-background-error-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=\"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=\"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\";\nimport \"../../styles/vars-v2.css\";\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 display: inline-block;\n font-family: var(--rel-fontFamilies-primary, '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: 16px;\n }\n\n .pag-stack {\n display: inline-flex;\n align-items: center;\n gap: 12px;\n }\n\n .pag-count {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\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: 4px;\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: 1000px;\n border: 1px solid #e5e5e5;\n background: #ffffff;\n cursor: pointer;\n color: #0b0b0b;\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: #f5f5f5;\n }\n\n .pag-nav-btn:focus-visible {\n outline: 2px solid var(--rel-color-border-focus, #0059f4);\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: 8px;\n border-radius: 8px;\n border: 1px solid #e5e5e5;\n background: #ffffff;\n cursor: pointer;\n font-family: inherit;\n font-size: 14px;\n font-weight: 500;\n letter-spacing: -0.3px;\n color: #0b0b0b;\n line-height: 22px;\n box-sizing: border-box;\n transition: background 0.15s ease, border-color 0.15s ease;\n }\n\n .pag-page-btn:hover {\n background: #f5f5f5;\n }\n\n .pag-page-btn:focus-visible {\n outline: 2px solid var(--rel-color-border-focus, #0059f4);\n outline-offset: 2px;\n }\n\n .pag-page-btn[aria-current=\"page\"] {\n background: #e5e5e5;\n border-color: #0b0b0b;\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 font-size: 14px;\n font-weight: 500;\n letter-spacing: -0.3px;\n color: #0b0b0b;\n user-select: none;\n }\n\n /* ── Compact: \"Page X of Y\" ───────────────────────────────── */\n\n .pag-page-text {\n font-size: 14px;\n font-weight: 500;\n letter-spacing: -0.3px;\n color: #0b0b0b;\n line-height: 22px;\n white-space: nowrap;\n }\n\n /* ── Count-text: \"1-5 of 50\" ─────────────────────────────── */\n\n .pag-count-text {\n font-size: 14px;\n font-weight: 500;\n letter-spacing: -0.3px;\n color: #0b0b0b;\n line-height: 22px;\n white-space: nowrap;\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 font-size: 14px;\n font-weight: 500;\n letter-spacing: -0.3px;\n color: #0b0b0b;\n line-height: 22px;\n }\n\n /* ── Extended sub-label ───────────────────────────────────── */\n\n .pag-label {\n font-size: 14px;\n font-weight: 400;\n letter-spacing: -0.3px;\n color: #7d7d7d;\n line-height: 22px;\n text-align: center;\n }\n\n /* ── Dark mode ───────────────────────────────────────────── */\n\n :host-context([data-theme=\"dark\"]) .pag-nav-btn,\n [data-theme=\"dark\"] .pag-nav-btn {\n background: #1a1a1a;\n border-color: #333333;\n color: #f5f5f5;\n }\n\n :host-context([data-theme=\"dark\"]) .pag-nav-btn:hover:not(:disabled),\n [data-theme=\"dark\"] .pag-nav-btn:hover:not(:disabled) {\n background: #2b2b2b;\n }\n\n :host-context([data-theme=\"dark\"]) .pag-page-btn,\n [data-theme=\"dark\"] .pag-page-btn {\n background: #1a1a1a;\n border-color: #333333;\n color: #f5f5f5;\n }\n\n :host-context([data-theme=\"dark\"]) .pag-page-btn:hover,\n [data-theme=\"dark\"] .pag-page-btn:hover {\n background: #2b2b2b;\n }\n\n :host-context([data-theme=\"dark\"]) .pag-page-btn[aria-current=\"page\"],\n [data-theme=\"dark\"] .pag-page-btn[aria-current=\"page\"] {\n background: #333333;\n border-color: #f5f5f5;\n }\n\n :host-context([data-theme=\"dark\"]) .pag-ellipsis,\n :host-context([data-theme=\"dark\"]) .pag-page-text,\n :host-context([data-theme=\"dark\"]) .pag-count-text,\n :host-context([data-theme=\"dark\"]) .pag-current-num,\n [data-theme=\"dark\"] .pag-ellipsis,\n [data-theme=\"dark\"] .pag-page-text,\n [data-theme=\"dark\"] .pag-count-text,\n [data-theme=\"dark\"] .pag-current-num {\n color: #f5f5f5;\n }\n\n :host-context([data-theme=\"dark\"]) .pag-label,\n [data-theme=\"dark\"] .pag-label {\n color: #a3a3a3;\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 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\"\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 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 return this.renderExtended();\n }\n}\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property, state, query } from \"lit/decorators.js\";\r\nimport \"../../styles/vars-v2.css\";\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 }) side: SideType = \"bottom\";\r\n @property({ type: String }) 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 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 if (this.side === \"top\") {\r\n top = t.top - c.height - this.sideOffset;\r\n left = t.left + t.width / 2 - c.width / 2;\r\n }\r\n if (this.side === \"bottom\") {\r\n top = t.bottom + this.sideOffset;\r\n left = t.left + t.width / 2 - c.width / 2;\r\n }\r\n if (this.side === \"left\") {\r\n top = t.top + t.height / 2 - c.height / 2;\r\n left = t.left - c.width - this.sideOffset;\r\n }\r\n if (this.side === \"right\") {\r\n top = t.top + t.height / 2 - c.height / 2;\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\nimport \"../../styles/vars-v2.css\";\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 static styles = css`\r\n :host {\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-color-bg-primary);\r\n border: var(--rel-borders-width-stroke-100) solid var(--rel-color-border-default);\r\n border-radius: var(--rel-borders-radius-border-radius-200);\r\n box-shadow: var(--rel-shadows-shadow-300);\r\n padding: var(--rel-spacing-space-md);\r\n font-family: var(--rel-fontFamilies-primary);\r\n font-size: var(--rel-fontSizes-sm);\r\n color: var(--rel-color-text-heading);\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-space-xs);\r\n font-weight: var(--rel-fontWeights-semibold);\r\n color: var(--rel-color-text-heading);\r\n }\r\n\r\n .popover-content ::slotted(p) {\r\n margin: 0 0 var(--rel-spacing-space-sm);\r\n color: var(--rel-color-text-placeholder);\r\n line-height: var(--rel-lineHeights-md);\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\nimport \"../../styles/vars-v2.css\";\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 display: block;\r\n font-family: var(--rel-fontFamilies-primary);\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-color-border-default);\r\n border-radius: var(--rel-borders-radius-border-radius-0);\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-color-text-primary);\r\n height: 100%;\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-color-border-default);\r\n stroke-width: 3;\r\n }\r\n\r\n .circular-progress {\r\n fill: none;\r\n stroke: var(--rel-color-text-primary);\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-color-text-primary);\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 class=\"linear-track\" role=\"progressbar\"\r\n aria-valuenow=\"${this.safeValue}\" aria-valuemin=\"0\" aria-valuemax=\"100\">\r\n <div class=\"linear-bar\" 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 class=\"linear-track\" role=\"progressbar\">\r\n <div 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 @property({ type: String }) 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 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 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 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 :host {\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\nimport \"../../styles/vars-v2.css\";\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 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-color-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-color-bg-selected);\r\n }\r\n\r\n :host(:focus-visible) {\r\n outline: 2px solid var(--rel-colors-blue-primary);\r\n outline-offset: 2px;\r\n }\r\n\r\n .grabber {\r\n background: var(--rel-color-icon-primary);\r\n border-radius: var(--rel-borders-radius-border-radius-500);\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-color-bg-primary);\r\n }\r\n\r\n :host([data-dragging]) {\r\n background: var(--rel-color-bg-selected);\r\n }\r\n\r\n :host([data-dragging]) .grabber {\r\n background: var(--rel-color-text-primary);\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\nimport \"../../styles/vars-v2.css\";\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 display: inline-block;\r\n font-family: var(--rel-fontFamilies-primary);\r\n }\r\n\r\n .segmented-buttons {\r\n display: inline-flex;\r\n border: 1px solid var(--rel-color-border-default);\r\n border-radius: var(--rel-borders-radius-border-radius-100);\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 background: var(--rel-color-bg-primary);\r\n border: none;\r\n border-radius: 0;\r\n cursor: pointer;\r\n font-weight: var(--rel-fontWeights-medium);\r\n border-right: 1px solid var(--rel-color-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-color-text-heading);\r\n font-family: var(--rel-fontFamilies-primary);\r\n }\r\n\r\n .segment:first-child {\r\n border-radius: var(--rel-borders-radius-border-radius-100) 0 0 var(--rel-borders-radius-border-radius-100);\r\n }\r\n\r\n .segment:last-child {\r\n border-radius: 0 var(--rel-borders-radius-border-radius-100) var(--rel-borders-radius-border-radius-100) 0;\r\n border-right: none;\r\n }\r\n\r\n .segment:focus-visible {\r\n outline: 2px solid var(--rel-color-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-color-bg-hover);\r\n }\r\n\r\n /* Active */\r\n .segment.active {\r\n background: #2B2B2B;\r\n color: #FFFFFF;\r\n border-radius: var(--rel-borders-radius-border-radius-100) !important;\r\n }\r\n\r\n .segment.active:hover:not(.disabled) {\r\n background: #333333;\r\n color: #FFFFFF;\r\n }\r\n\r\n /* Dark mode active override */\r\n :host-context([data-theme=\"dark\"]) .segment.active,\r\n :host-context(.dark) .segment.active {\r\n background: #F5F5F5;\r\n color: #1A1A1A;\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .segment.active:hover,\r\n :host-context(.dark) .segment.active:hover {\r\n background: #D4D4D4;\r\n color: #1A1A1A;\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-color-bg-tertiary);\r\n color: var(--rel-color-text-disabled);\r\n }\r\n\r\n /* Sizes */\r\n .segmented-buttons.small .segment {\r\n padding: var(--rel-spacing-space-3xs) var(--rel-spacing-space-xs);\r\n font-size: var(--rel-fontSizes-xs);\r\n }\r\n\r\n .segmented-buttons.medium .segment {\r\n padding: var(--rel-spacing-space-2xs) var(--rel-spacing-space-sm);\r\n font-size: var(--rel-fontSizes-sm);\r\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 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 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 \"../../styles/vars-v2.css\";\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 display: block;\n font-family: var(--rel-fontFamilies-primary);\n width: 100%;\n }\n\n .select-wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--rel-spacing-space-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 font-size: var(--rel-fontSizes-sm, 14px);\n font-weight: var(--rel-fontWeights-regular, 400);\n color: var(--rel-select-label-color, #363636);\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, #ffffff);\n border: 1px solid var(--rel-select-border-default, #e5e5e5);\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, 4px);\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, #0b0b0b);\n }\n\n .select-wrapper.error .select-trigger {\n border-color: var(--rel-select-border-error, #ce3131);\n }\n\n .select-wrapper.disabled .select-trigger {\n cursor: not-allowed;\n background: var(--rel-select-bg-disabled, #fafafa);\n border-color: var(--rel-select-border-default, #e5e5e5);\n }\n\n /* Sizes */\n .select-wrapper.small .select-trigger {\n padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-sm);\n min-height: 40px;\n font-size: var(--rel-fontSizes-sm, 14px);\n }\n\n .select-wrapper.medium .select-trigger {\n padding: 12px;\n min-height: 48px;\n font-size: var(--rel-fontSizes-md, 16px);\n }\n\n .select-wrapper.large .select-trigger {\n padding: var(--rel-spacing-space-md);\n min-height: 56px;\n font-size: var(--rel-fontSizes-lg, 18px);\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, #0b0b0b);\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-color-text-disabled, #a3a3a3);\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, #0b0b0b);\n overflow: hidden;\n }\n\n .select-value.placeholder {\n color: var(--rel-select-placeholder-color, #757575);\n }\n\n .select-wrapper.disabled .select-value.placeholder {\n color: var(--rel-select-placeholder-disabled-color, #7d7d7d);\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, #ffffff);\n padding: 0 4px;\n font-size: var(--rel-fontSizes-md, 16px);\n font-weight: 400;\n line-height: 1;\n color: var(--rel-select-placeholder-color, #757575);\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 }\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: 12px;\n color: var(--rel-select-label-color, #363636);\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 font-size: 13px;\n color: var(--rel-select-supporting-color, #404040);\n }\n\n .select-support.error {\n color: var(--rel-select-border-error, #ce3131);\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, #ffffff);\n border: 1px solid var(--rel-select-menu-border, #d4d4d4);\n border-radius: var(--rel-select-menu-radius, 8px);\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, 0 8px 24px rgba(11, 11, 11, 0.18));\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, #ffffff);\n padding: var(--rel-spacing-space-xs);\n border-bottom: 1px solid var(--rel-select-divider, #f5f5f5);\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, #e5e5e5);\n border-radius: 4px;\n padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-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, #0b0b0b);\n }\n\n .search-input {\n flex: 1;\n min-width: 0;\n border: none;\n outline: none;\n background: transparent;\n font-family: inherit;\n font-size: var(--rel-fontSizes-sm, 14px);\n color: var(--rel-select-value-color, #0b0b0b);\n }\n\n .search-input::placeholder {\n color: var(--rel-select-placeholder-color, #757575);\n }\n\n :host([size=\"large\"]) .search-input-wrap {\n padding: 12px;\n }\n\n :host([size=\"large\"]) .search-input {\n font-size: var(--rel-fontSizes-md, 16px);\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-space-xs) 12px;\n font-size: var(--rel-fontSizes-md, 16px);\n font-family: var(--rel-fontFamilies-primary);\n color: var(--rel-select-value-color, #0b0b0b);\n cursor: pointer;\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, #0b0b0b);\n }\n\n .select-option:hover,\n .select-option.highlighted {\n background: var(--rel-select-option-hover, #ececec);\n }\n\n .select-option[aria-selected=\"true\"] {\n font-weight: var(--rel-fontWeights-medium);\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, #ececec);\n }\n\n .select-all-row {\n border-bottom: 1px solid var(--rel-select-divider, #f5f5f5);\n padding: 12px;\n }\n\n .select-empty {\n padding: var(--rel-spacing-space-xs) 12px;\n font-size: var(--rel-fontSizes-sm, 14px);\n color: var(--rel-select-placeholder-color, #757575);\n }\n\n /* Dark mode */\n /* No :not(.error) needed here — error no longer recolors label/floating\n label, so there's nothing left for these to compete with. */\n :host-context([data-theme=\"dark\"]) .select-label,\n [data-theme=\"dark\"] .select-label {\n color: var(--rel-select-label-color-dark, #f5f5f5);\n }\n\n /* :not(.error) — supporting text IS still red on error, and this rule's\n extra :host-context specificity would otherwise outrank the\n theme-agnostic .select-support.error rule. */\n :host-context([data-theme=\"dark\"]) .select-wrapper:not(.error) .select-support,\n [data-theme=\"dark\"] .select-wrapper:not(.error) .select-support {\n color: var(--rel-select-supporting-color-dark, #b3b3b3);\n }\n\n :host-context([data-theme=\"dark\"]) .select-wrapper.focused .floating-label,\n [data-theme=\"dark\"] .select-wrapper.focused .floating-label,\n :host-context([data-theme=\"dark\"]) .select-wrapper.has-value .floating-label,\n [data-theme=\"dark\"] .select-wrapper.has-value .floating-label,\n :host-context([data-theme=\"dark\"]) .select-wrapper.open .floating-label,\n [data-theme=\"dark\"] .select-wrapper.open .floating-label {\n color: var(--rel-select-label-color-dark, #f5f5f5);\n }\n\n /* Background only here — kept unconditional so error-state triggers\n still get the right dark background. border-color is split into its\n own :not(.error) rule below: this rule's specificity (with the extra\n :host-context) ties or beats the theme-agnostic error-border rule, and\n since it's declared later in the file, an unconditional border-color\n here would win the tie and show the default dark border instead of red\n — regardless of open/focus state, i.e. even at rest. */\n :host-context([data-theme=\"dark\"]) .select-trigger,\n [data-theme=\"dark\"] .select-trigger,\n :host-context([data-theme=\"dark\"]) .floating-label,\n [data-theme=\"dark\"] .floating-label {\n background: var(--rel-select-bg-dark, #1a1a1a);\n }\n\n :host-context([data-theme=\"dark\"]) .select-wrapper:not(.error) .select-trigger,\n [data-theme=\"dark\"] .select-wrapper:not(.error) .select-trigger {\n border-color: var(--rel-select-border-default-dark, #333333);\n }\n\n /* Own border token, a touch lighter than the trigger's — a shadow alone\n barely registers on a dark background, so the panel leans more on this\n border to separate itself from the page behind it. */\n :host-context([data-theme=\"dark\"]) .select-listbox,\n [data-theme=\"dark\"] .select-listbox {\n background: var(--rel-select-bg-dark, #1a1a1a);\n border-color: var(--rel-select-menu-border-dark, #454545);\n }\n\n :host-context([data-theme=\"dark\"]) .select-wrapper.disabled .select-trigger,\n [data-theme=\"dark\"] .select-wrapper.disabled .select-trigger {\n background: var(--rel-select-bg-disabled-dark, #141414);\n }\n\n /* :not(.error): same trap as the label rules — this rule's extra\n :host-context specificity would otherwise outrank the theme-agnostic\n .select-wrapper.error .select-trigger rule and show the focus-white\n border instead of error-red the moment an error field is opened. */\n :host-context([data-theme=\"dark\"]) .select-wrapper:not(.error).open .select-trigger,\n [data-theme=\"dark\"] .select-wrapper:not(.error).open .select-trigger,\n :host-context([data-theme=\"dark\"]) .select-wrapper:not(.error) .select-trigger:focus-visible,\n [data-theme=\"dark\"] .select-wrapper:not(.error) .select-trigger:focus-visible {\n border-color: var(--rel-select-border-focus-dark, #f5f5f5);\n }\n\n :host-context([data-theme=\"dark\"]) .select-value,\n [data-theme=\"dark\"] .select-value,\n :host-context([data-theme=\"dark\"]) .search-input,\n [data-theme=\"dark\"] .search-input,\n :host-context([data-theme=\"dark\"]) .select-option,\n [data-theme=\"dark\"] .select-option,\n :host-context([data-theme=\"dark\"]) .select-option-check,\n [data-theme=\"dark\"] .select-option-check,\n :host-context([data-theme=\"dark\"]) .icon,\n [data-theme=\"dark\"] .icon {\n color: var(--rel-select-value-color-dark, #f5f5f5);\n }\n\n :host-context([data-theme=\"dark\"]) .select-option:hover,\n [data-theme=\"dark\"] .select-option:hover,\n :host-context([data-theme=\"dark\"]) .select-option.highlighted,\n [data-theme=\"dark\"] .select-option.highlighted,\n :host-context([data-theme=\"dark\"]) .checkbox-option:hover,\n [data-theme=\"dark\"] .checkbox-option:hover,\n :host-context([data-theme=\"dark\"]) .checkbox-option.highlighted,\n [data-theme=\"dark\"] .checkbox-option.highlighted {\n background: var(--rel-select-option-hover-dark, #333333);\n }\n\n :host-context([data-theme=\"dark\"]) .select-search,\n [data-theme=\"dark\"] .select-search {\n background: var(--rel-select-bg-dark, #1a1a1a);\n border-color: var(--rel-select-divider-dark, #333333);\n }\n\n :host-context([data-theme=\"dark\"]) .select-all-row,\n [data-theme=\"dark\"] .select-all-row {\n border-color: var(--rel-select-divider-dark, #333333);\n }\n\n :host-context([data-theme=\"dark\"]) .select-value.placeholder,\n [data-theme=\"dark\"] .select-value.placeholder,\n :host-context([data-theme=\"dark\"]) .floating-label,\n [data-theme=\"dark\"] .floating-label,\n :host-context([data-theme=\"dark\"]) .search-input::placeholder,\n [data-theme=\"dark\"] .search-input::placeholder,\n :host-context([data-theme=\"dark\"]) .select-empty,\n [data-theme=\"dark\"] .select-empty {\n color: var(--rel-select-placeholder-color-dark, #a3a3a3);\n }\n\n :host-context([data-theme=\"dark\"]) .search-input-wrap,\n [data-theme=\"dark\"] .search-input-wrap {\n border-color: var(--rel-select-search-border-dark, #333333);\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 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 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 class=\"select-value\">${this.renderChips()}</span>`\n : html`<span class=\"select-value placeholder\">\n <span class=\"select-value-text\">${this.placeholder}</span>\n </span>`\n : html`<span 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 class=\"select-support ${this.state === \"error\" ? \"error\" : \"\"}\">\n ${this.supportingText}\n </span>`\n : \"\"}\n </div>\n\n <div\n id=\"${listboxId}\"\n 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 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 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 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, #c8c8c8);\n border-radius: 4px;\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, #c8c8c8) 25%,\n var(--rel-skeleton-highlight, #e2e2e2) 50%,\n var(--rel-skeleton-color, #c8c8c8) 75%\n );\n background-size: 200% 100%;\n animation: rel-skeleton-shimmer 1.5s linear infinite;\n }\n\n /* ── Dark mode ── */\n :host-context([data-theme=\"dark\"]) {\n --rel-skeleton-color: #2a2a2a;\n --rel-skeleton-highlight: #3d3d3d;\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 class=\"skeleton-bar ${i === count - 1 && count > 1 ? \"is-last\" : \"\"}\"></div>\n `)}\n </div>\n `;\n }\n\n return html`<div 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 \"../../styles/vars-v2.css\";\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 @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 --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-color-bg-primary);\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-fontFamilies-primary);\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-borders-radius-border-radius-200);\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-borders-radius-border-radius-200);\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-borders-radius-border-radius-200);\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 .header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n padding: var(--rel-spacing-space-md) var(--rel-spacing-space-lg);\n border-bottom: var(--rel-borders-width-stroke-100) solid var(--rel-color-border-default);\n flex-shrink: 0;\n }\n\n .header.empty {\n display: none;\n }\n\n .header-text {\n display: flex;\n flex-direction: column;\n gap: var(--rel-spacing-space-2xs);\n }\n\n .title {\n font-size: var(--rel-fontSizes-lg);\n font-weight: var(--rel-fontWeights-semibold);\n color: var(--rel-color-text-heading);\n margin: 0;\n }\n\n .description {\n font-size: var(--rel-fontSizes-sm);\n color: var(--rel-color-text-primary);\n margin: 0;\n }\n\n .close-button {\n background: transparent;\n border: none;\n cursor: pointer;\n padding: var(--rel-spacing-space-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-borders-radius-border-radius-100);\n color: var(--rel-color-text-primary);\n transition: background 0.15s ease;\n }\n\n .close-button:hover {\n background: var(--rel-color-bg-tertiary);\n }\n\n .close-button:focus-visible {\n outline: 2px solid var(--rel-color-border-focus);\n outline-offset: 2px;\n }\n\n .content {\n flex: 1;\n overflow-y: auto;\n padding: var(--rel-spacing-space-lg);\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-space-md) var(--rel-spacing-space-lg);\n border-top: var(--rel-borders-width-stroke-100) solid var(--rel-color-border-default);\n justify-content: flex-end;\n gap: var(--rel-spacing-space-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\nimport \"../../styles/vars-v2.css\";\r\n\r\nexport type SliderType = \"continuous\" | \"discrete\";\r\nexport type TrackStyle = \"solid\" | \"dotted\";\r\n\r\n@customElement(\"rel-slider\")\r\nexport class RelSlider extends LitElement {\r\n @property({ type: String }) type: SliderType = \"continuous\";\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 @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 --track-height: 5px;\r\n --thumb-size: 10px;\r\n --thumb-stroke: 7px;\r\n --thumb-halo-color: var(--rel-color-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-color-bg-tertiary), 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-fontFamilies-primary);\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-color-border-default);\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-color-text-primary);\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-color-text-primary) 0 2px,\r\n transparent 2px\r\n ) 0 50%/12px 5px repeat-x;\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: 4px;\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-color-text-primary);\r\n border-radius: 50%;\r\n transition: box-shadow 0.15s ease;\r\n }\r\n\r\n .slider-input:active ~ .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 /* 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-color-text-primary);\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-color-bg-primary);\r\n }\r\n\r\n /* Tick labels */\r\n .tick-labels {\r\n position: absolute;\r\n top: calc(50% + var(--tick-size) + 6px);\r\n left: 0;\r\n width: 100%;\r\n font-size: var(--rel-fontSizes-xs);\r\n color: var(--rel-color-text-heading);\r\n pointer-events: none;\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-color-border-default);\r\n }\r\n\r\n .rel-slider.disabled .track-active {\r\n background: var(--rel-color-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-color-bg-tertiary) 0 1px,\r\n transparent 1px\r\n )\r\n center/12px 4px repeat-x,\r\n var(--rel-color-text-placeholder);\r\n }\r\n\r\n .rel-slider.disabled .tick {\r\n background: var(--rel-color-text-placeholder);\r\n }\r\n\r\n .rel-slider.disabled .tick-label {\r\n color: var(--rel-color-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-color-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-colors-gray-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-color-border-default);\r\n --halo: 0 2px 0 var(--rel-color-bg-selected),\r\n 0 6px 10px rgba(0, 0, 0, 0.3);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .value-marker svg path,\r\n :host-context(.dark) .value-marker svg path {\r\n fill: #2B2B2B;\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .value-marker text,\r\n :host-context(.dark) .value-marker text {\r\n fill: #FFFFFF;\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 (changedProperties.has(\"value\")) {\r\n this.updateActiveWidth();\r\n }\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 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) {\r\n 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\r\n private renderThumbContainer() {\r\n return html`\r\n <div class=\"thumb-container\" style=\"left: ${this.percentage}%\">\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-color-text-primary)\" />\r\n <text\r\n x=\"12\"\r\n y=\"16\"\r\n text-anchor=\"middle\"\r\n fill=\"var(--rel-color-bg-primary)\"\r\n font-size=\"12\"\r\n font-family=\"Poppins\"\r\n font-weight=\"600\">\r\n ${this.value}\r\n </text>\r\n </svg>\r\n </div>\r\n ` : \"\"}\r\n <div 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 ]\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 return html`\r\n <div class=\"${sliderClasses}\">\r\n <div 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 \"../../styles/vars-v2.css\";\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 display: block;\r\n font-family: var(--rel-fontFamilies-primary);\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: 12px 16px 12px 10px;\r\n border-radius: var(--rel-borders-radius-border-radius-200);\r\n background-color: var(--rel-surface-toast);\r\n color: #FFFFFF;\r\n font-family: var(--rel-fontFamilies-primary);\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 .snackbar.type-success {\r\n border-left-color: var(--rel-colors-green-tertiary);\r\n }\r\n\r\n .snackbar.type-error {\r\n border-left-color: var(--rel-colors-red-primary);\r\n }\r\n\r\n .snackbar.type-warning {\r\n border-left-color: var(--rel-colors-orange-warning);\r\n }\r\n\r\n /* Icon color matches type accent */\r\n .snackbar.type-success .snackbar-icon {\r\n color: var(--rel-colors-green-primary);\r\n }\r\n\r\n .snackbar.type-error .snackbar-icon {\r\n color: var(--rel-colors-red-secondary);\r\n }\r\n\r\n .snackbar.type-warning .snackbar-icon {\r\n color: var(--rel-colors-yellow-pending);\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\n font-size: var(--rel-fontSizes-sm);\r\n line-height: var(--rel-lineHeights-lineheight-200);\r\n margin-right: 12px;\r\n flex: 1;\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-space-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-colors-green-primary);\r\n font-weight: var(--rel-fontWeights-semibold);\r\n font-size: var(--rel-fontSizes-sm);\r\n font-family: var(--rel-fontFamilies-primary);\r\n cursor: pointer;\r\n padding: 0;\r\n display: flex;\r\n align-items: center;\r\n transition: opacity 0.2s ease;\r\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 #FFFFFF;\r\n outline-offset: 2px;\r\n border-radius: 2px;\r\n }\r\n\r\n .snackbar-close {\r\n background: none;\r\n border: none;\r\n color: #FFFFFF;\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 #FFFFFF;\r\n outline-offset: 2px;\r\n border-radius: 2px;\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 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 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 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\nimport \"../../styles/vars-v2.css\";\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\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 static styles = css`\r\n :host {\r\n display: block;\r\n font-family: var(--rel-fontFamilies-primary);\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-fontFamilies-primary);\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-space-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-space-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-space-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-color-border-default);\r\n background: var(--rel-color-bg-primary);\r\n border-radius: 50%;\r\n font-size: var(--rel-fontSizes-sm);\r\n font-weight: var(--rel-fontWeights-medium);\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 }\r\n\r\n .indicator svg {\r\n width: 12px;\r\n height: auto;\r\n display: block;\r\n }\r\n\r\n /********************************************\r\n * Labels\r\n ********************************************/\r\n .step-label {\r\n white-space: nowrap;\r\n font-size: var(--rel-fontSizes-sm);\r\n color: var(--rel-color-text-primary);\r\n }\r\n\r\n /* Horizontal text-below specific */\r\n .rel-stepper.horizontal.text-below .step-label {\r\n margin-top: var(--rel-spacing-space-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-space-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-color-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-color-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-color-text-heading);\r\n border-color: var(--rel-color-text-heading);\r\n color: var(--rel-color-text-inverse);\r\n }\r\n\r\n .rel-step.progress .indicator {\r\n border-color: var(--rel-color-text-heading);\r\n background: var(--rel-color-bg-primary);\r\n color: var(--rel-color-text-heading);\r\n }\r\n\r\n .rel-step.disabled .indicator {\r\n background: var(--rel-color-bg-secondary);\r\n border-color: var(--rel-color-border-default);\r\n color: var(--rel-color-text-disabled);\r\n }\r\n\r\n .rel-step.done .connector {\r\n background: var(--rel-color-text-heading);\r\n }\r\n\r\n .rel-step.progress .connector {\r\n background: var(--rel-color-text-heading);\r\n }\r\n\r\n .rel-step.done .step-label {\r\n color: var(--rel-color-text-heading);\r\n font-weight: var(--rel-fontWeights-semibold);\r\n }\r\n\r\n .rel-step.progress .step-label {\r\n color: var(--rel-color-text-heading);\r\n font-weight: var(--rel-fontWeights-semibold);\r\n }\r\n\r\n .rel-step.disabled .step-label {\r\n color: var(--rel-color-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-color-text-primary);\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: #ffffff;\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 (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 const stepperClasses = [\r\n \"rel-stepper\",\r\n this.orientation === \"vertical\" ? \"vertical\" : \"horizontal\",\r\n this.textAlign === \"below\" ? \"text-below\" : \"text-right\",\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 = this.textAlign === \"right\";\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 class=\"indicator\">\r\n ${this.renderIndicator(step, idx)}\r\n </div>\r\n ${idx < this.steps.length - 1\r\n ? html`<div class=\"connector\"></div>`\r\n : \"\"}\r\n </div>\r\n\r\n <!-- Step Label to the right -->\r\n <div 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 class=\"indicator\">\r\n ${this.renderIndicator(step, idx)}\r\n </div>\r\n\r\n <!-- Step Label -->\r\n <div 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 class=\"connector\"></div>`\r\n : \"\"}\r\n `\r\n : html`\r\n <!-- Step Indicator -->\r\n <div class=\"indicator\">\r\n ${this.renderIndicator(step, idx)}\r\n </div>\r\n\r\n <!-- Step Label -->\r\n <div 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 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\nimport \"../../styles/vars-v2.css\";\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 --switch-track: var(--rel-color-text-placeholder);\r\n --switch-knob-on: var(--rel-color-text-primary);\r\n --switch-knob-off: var(--rel-color-bg-primary);\r\n --switch-halo: var(--rel-color-border-default);\r\n --switch-disabled: var(--rel-color-text-disabled);\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: 4px;\r\n right: 4px;\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-color-text-placeholder);\r\n }\r\n\r\n /* Focus halo */\r\n .switch-focused .switch-slider::before {\r\n box-shadow: 0 0 0 6px var(--switch-halo);\r\n }\r\n\r\n /* Pressed */\r\n .switch-pressed .switch-slider::before {\r\n transform: scale(0.9) translateY(-50%);\r\n }\r\n .switch-pressed input:checked + .switch-slider::before {\r\n transform: scale(0.9) translateY(-50%) translateX(22px);\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 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 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 \"../../styles/vars-v2.css\";\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 @state() private _tabItems: RelTabItem[] = [];\r\n\r\n static styles = css`\r\n :host {\r\n --tab-active-color: var(--rel-colors-green-primary);\r\n --tab-text-default: var(--rel-color-text-primary);\r\n --tab-text-disabled: var(--rel-color-text-disabled);\r\n --tab-text-hover: var(--rel-color-text-heading);\r\n --tab-underline-height: 3px;\r\n --tab-hover-color: var(--rel-color-bg-tertiary);\r\n display: block;\r\n font-family: var(--rel-fontFamilies-primary);\r\n }\r\n\r\n .tabs-wrapper {\r\n display: flex;\r\n border-bottom: 1px solid var(--rel-border-tab);\r\n font-family: var(--rel-fontFamilies-primary);\r\n user-select: none;\r\n }\r\n\r\n .tab {\r\n position: relative;\r\n padding: var(--rel-spacing-space-sm) var(--rel-spacing-space-md);\r\n cursor: pointer;\r\n color: var(--tab-text-default);\r\n font-size: var(--rel-fontSizes-md);\r\n font-weight: var(--rel-fontWeights-medium);\r\n transition: color 0.2s ease;\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-space-2xs);\r\n }\r\n\r\n .tab:focus-visible {\r\n outline: 2px solid var(--rel-color-border-focus);\r\n outline-offset: -2px;\r\n border-radius: var(--rel-borders-radius-border-radius-100);\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 class=\"tabs-wrapper\" role=\"tablist\">\r\n ${tabs.map(\r\n (tab, i) => html`\r\n <div\r\n 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 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 \"../../styles/vars-v2.css\";\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 display: block;\n font-family: var(--rel-fontFamilies-primary);\n }\n\n /* Wrapper */\n .textfield-wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--rel-spacing-space-2xs);\n width: 100%;\n }\n\n /* Label */\n .textfield-label {\n font-size: var(--rel-fontSizes-sm);\n font-weight: var(--rel-fontWeights-medium);\n color: var(--rel-color-text-heading);\n }\n\n .required-mark {\n color: var(--rel-error-surface-default, #CC0000);\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-space-sm);\n top: 50%;\n transform: translateY(-50%);\n font-size: var(--rel-fontSizes-md);\n font-weight: var(--rel-fontWeights-regular);\n color: var(--rel-color-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-color-bg-primary);\n padding: 0 2px;\n z-index: 1;\n line-height: 1;\n white-space: nowrap;\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-space-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 font-size: var(--rel-fontSizes-xs);\n color: var(--rel-color-text-primary);\n }\n\n :host([floatinglabel]) .textfield-wrapper.error .textfield-label {\n color: var(--rel-error-text);\n }\n\n :host([floatinglabel]) .textfield-wrapper.focused:not(.error) .textfield-label {\n color: var(--rel-color-text-primary);\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 font-size: var(--rel-fontSizes-xs);\n color: var(--rel-error-text);\n }\n\n :host([floatinglabel]) .textfield-input {\n padding-top: var(--rel-spacing-space-sm);\n padding-bottom: var(--rel-spacing-space-sm);\n }\n\n :host([floatinglabel]) .textfield-input.has-left-icon {\n padding-left: var(--rel-spacing-space-2xl);\n }\n\n :host([floatinglabel]) .textfield-label.has-left-icon {\n left: var(--rel-spacing-space-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-space-sm);\n }\n\n :host([floatinglabel]) .textfield-wrapper.disabled .textfield-label {\n background: var(--rel-color-bg-tertiary);\n }\n\n /* Container */\n .textfield-container {\n display: flex;\n align-items: center;\n position: relative;\n border: 1px solid var(--rel-color-border-default);\n border-radius: var(--rel-borders-radius-border-radius-100);\n background: var(--rel-color-bg-primary);\n overflow: hidden;\n transition: border 0.2s;\n }\n\n .textfield-container.disabled {\n background: var(--rel-color-bg-tertiary);\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 font-size: var(--rel-fontSizes-md);\n padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-sm);\n background: transparent;\n font-family: var(--rel-fontFamilies-primary);\n color: var(--rel-color-text-primary);\n }\n\n .textfield-input:disabled {\n cursor: not-allowed;\n color: var(--rel-color-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-color-text-placeholder);\n border-radius: 2px;\n }\n\n .icon {\n position: absolute;\n display: flex;\n pointer-events: none;\n color: var(--rel-color-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-input {\n padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-sm);\n font-size: var(--rel-fontSizes-sm);\n }\n\n .textfield-wrapper.medium .textfield-input {\n padding: var(--rel-spacing-space-sm) var(--rel-spacing-space-md);\n font-size: var(--rel-fontSizes-md);\n }\n\n .textfield-wrapper.large .textfield-input {\n padding: var(--rel-spacing-space-md) var(--rel-spacing-space-md);\n font-size: var(--rel-fontSizes-lg);\n }\n\n /* Adjust padding when icons are present */\n .textfield-wrapper .textfield-input.has-left-icon {\n padding-left: var(--rel-spacing-space-2xl);\n }\n\n .textfield-wrapper .textfield-input.has-right-icon {\n padding-right: var(--rel-spacing-space-2xl);\n }\n\n /* States */\n .textfield-wrapper.focused .textfield-container {\n border-color: var(--rel-color-text-primary);\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-color-text-primary);\n box-shadow: 0 0 0 1px var(--rel-color-text-primary);\n }\n\n .textfield-wrapper.error .textfield-container,\n .textfield-wrapper.error .textfield-container:focus-within {\n border-color: var(--rel-error-surface-default);\n box-shadow: none;\n }\n\n .textfield-wrapper.disabled .textfield-container {\n border-color: var(--rel-color-border-default);\n }\n\n .textfield-wrapper.disabled .textfield-label {\n color: var(--rel-color-text-disabled);\n }\n\n /* Supporting text */\n .textfield-support {\n font-size: var(--rel-fontSizes-xs);\n color: var(--rel-color-text-placeholder);\n }\n\n .textfield-support.error {\n color: var(--rel-error-surface-default, #CC0000);\n }\n\n /* Placeholder */\n .textfield-input::placeholder {\n color: var(--rel-color-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-color-bg-primary) inset;\n -webkit-text-fill-color: var(--rel-color-text-primary);\n }\n\n /* ── Underline variant ── */\n :host([variant=\"underline\"]) .textfield-container {\n border: none;\n border-bottom: 2px solid var(--rel-color-border-default);\n border-radius: 0;\n background: var(--rel-color-bg-tertiary, #f5f5f5);\n box-shadow: none;\n overflow: visible;\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-color-text-primary);\n box-shadow: none;\n }\n\n :host([variant=\"underline\"]) .textfield-wrapper.error .textfield-container {\n border-bottom: 2px solid var(--rel-error-surface-default, #CC0000);\n box-shadow: none;\n }\n\n :host([variant=\"underline\"]) .textfield-wrapper.disabled .textfield-container {\n border-bottom: 2px solid var(--rel-color-border-default);\n background: var(--rel-color-bg-tertiary);\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-color-bg-tertiary);\n border-bottom-color: var(--rel-color-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-color-border-default);\n border-radius: var(--rel-borders-radius-border-radius-100);\n background: var(--rel-color-bg-primary);\n transition: border-color 0.2s;\n }\n\n :host([variant=\"legend\"]) .field-legend {\n margin-left: var(--rel-spacing-space-sm);\n padding: 0 var(--rel-spacing-space-2xs);\n font-size: var(--rel-fontSizes-sm);\n font-weight: var(--rel-fontWeights-medium);\n line-height: 1;\n color: var(--rel-color-text-heading);\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-space-sm);\n transform: translateY(-50%);\n }\n :host([variant=\"legend\"]) .field-fieldset.multiline .icon.left {\n top: var(--rel-spacing-space-sm);\n transform: none;\n }\n\n /* Hover */\n :host([variant=\"legend\"]) .field-fieldset:hover {\n border-color: var(--rel-color-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-color-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-color-border-focus);\n }\n\n /* Error */\n :host([variant=\"legend\"]) .textfield-wrapper.error .field-fieldset {\n border-color: var(--rel-error-surface-default);\n box-shadow: none;\n }\n :host([variant=\"legend\"]) .textfield-wrapper.error .field-legend {\n color: var(--rel-error-surface-default);\n }\n\n /* Disabled */\n :host([variant=\"legend\"]) .textfield-wrapper.disabled .field-fieldset {\n background: var(--rel-color-bg-tertiary);\n border-color: var(--rel-color-border-default);\n cursor: not-allowed;\n }\n :host([variant=\"legend\"]) .textfield-wrapper.disabled .field-legend {\n color: var(--rel-color-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 font-size: var(--rel-fontSizes-xs);\n }\n :host([variant=\"legend\"]) .textfield-wrapper.large .field-legend {\n font-size: var(--rel-fontSizes-md);\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 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\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\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 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 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 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\nimport \"../../styles/vars-v2.css\";\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 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-fontFamilies-primary);\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-space-sm);\r\n background-color: var(--rel-color-text-primary);\r\n color: var(--rel-color-bg-primary);\r\n font-family: var(--rel-fontFamilies-primary);\r\n font-size: var(--rel-fontSizes-md);\r\n border-radius: var(--rel-borders-radius-border-radius-200);\r\n padding: var(--rel-spacing-space-md);\r\n box-shadow: var(--rel-shadows-shadow-300);\r\n pointer-events: all;\r\n animation: fadeInUp 0.25s ease;\r\n }\r\n\r\n .toast.error {\r\n background-color: var(--rel-error-surface-default);\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: inherit;\r\n font-weight: 600;\r\n font-size: 0.85rem;\r\n cursor: pointer;\r\n transition: opacity 0.2s;\r\n font-family: var(--rel-fontFamilies-primary);\r\n }\r\n\r\n .toast-action:hover {\r\n opacity: 0.75;\r\n }\r\n\r\n .toast-action:focus-visible {\r\n outline: 2px solid #FFFFFF;\r\n outline-offset: 2px;\r\n border-radius: 2px;\r\n }\r\n\r\n /* Close button */\r\n .toast-close {\r\n background: transparent;\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-space-2xs);\r\n margin-left: var(--rel-spacing-space-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 #FFFFFF;\r\n outline-offset: 2px;\r\n border-radius: 2px;\r\n }\r\n\r\n /* Dark mode overrides */\r\n :host-context([data-theme=\"dark\"]) .toast.error,\r\n :host-context(.dark) .toast.error {\r\n background-color: var(--rel-error-surface-default);\r\n color: #ffffff;\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 class=\"toast ${this.type} ${this.visible ? \"\" : \"hidden\"}\" role=\"status\" aria-live=\"polite\">\r\n <span class=\"toast-message\">${this.message}</span>\r\n\r\n ${this.actionLabel\r\n ? html`<button\r\n class=\"toast-action\"\r\n @click=\"${this.handleActionClick}\"\r\n >\r\n ${this.actionLabel}\r\n </button>`\r\n : \"\"}\r\n\r\n <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\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\r\nexport type TooltipPosition = \"above\" | \"below\";\r\n\r\n@customElement(\"rel-tooltip\")\r\nexport class RelTooltip extends LitElement {\r\n @property({ type: String }) text: string = \"\";\r\n @property({ type: String }) position: TooltipPosition = \"above\";\r\n @property({ type: Boolean, attribute: \"show-tail\" }) showTail: boolean =\r\n false;\r\n\r\n // Stable id so aria-describedby can reference the bubble across renders.\r\n private uniqueId = Math.random().toString(36).slice(2);\r\n\r\n static styles = css`\r\n :host {\r\n display: inline-block;\r\n position: relative;\r\n }\r\n\r\n /* Tooltip container */\r\n .tooltip-bubble {\r\n position: absolute;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n background-color: #1a1a1a;\r\n color: #ffffff;\r\n padding: var(--rel-spacing-space-xs, 8px)\r\n var(--rel-spacing-space-sm, 12px);\r\n border-radius: var(--rel-borders-radius-border-radius-200, 8px);\r\n font-size: var(--rel-fontSizes-sm, 12px);\r\n font-family: var(--rel-fontFamilies-primary, sans-serif);\r\n white-space: nowrap;\r\n z-index: 1000;\r\n opacity: 0;\r\n pointer-events: none;\r\n transition: opacity 0.2s ease;\r\n overflow: visible;\r\n }\r\n\r\n :host(:hover) .tooltip-bubble,\r\n :host(:focus-within) .tooltip-bubble {\r\n opacity: 1;\r\n }\r\n\r\n /* Positioning */\r\n .tooltip-bubble.above {\r\n bottom: calc(100% + 8px);\r\n }\r\n\r\n .tooltip-bubble.below {\r\n top: calc(100% + 8px);\r\n }\r\n\r\n /* Tail/Arrow */\r\n .tooltip-tail {\r\n position: absolute;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n width: 0;\r\n height: 0;\r\n border-left: 6px solid transparent;\r\n border-right: 6px solid transparent;\r\n display: block;\r\n }\r\n\r\n .tooltip-bubble.above .tooltip-tail {\r\n bottom: -6px;\r\n border-top: 6px solid #1a1a1a;\r\n border-bottom: none;\r\n }\r\n\r\n .tooltip-bubble.below .tooltip-tail {\r\n top: -6px;\r\n border-bottom: 6px solid #1a1a1a;\r\n border-top: none;\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .tooltip-bubble,\r\n :host-context(.dark) .tooltip-bubble {\r\n background-color: #ffffff;\r\n color: #000000;\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .tooltip-bubble.above .tooltip-tail,\r\n :host-context(.dark) .tooltip-bubble.above .tooltip-tail {\r\n border-top-color: #ffffff;\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .tooltip-bubble.below .tooltip-tail,\r\n :host-context(.dark) .tooltip-bubble.below .tooltip-tail {\r\n border-bottom-color: #ffffff;\r\n }\r\n `;\r\n\r\n firstUpdated() {\r\n this.linkTrigger();\r\n }\r\n\r\n private linkTrigger() {\r\n const slot = this.shadowRoot?.querySelector(\"slot\");\r\n if (!slot) return;\r\n const trigger = slot.assignedElements()[0];\r\n if (trigger) {\r\n trigger.setAttribute(\"aria-describedby\", `tooltip-${this.uniqueId}`);\r\n }\r\n }\r\n\r\n render() {\r\n return html`\r\n <slot @slotchange=\"${this.linkTrigger}\"></slot>\r\n <div\r\n class=\"tooltip-bubble ${this.position}\"\r\n id=\"tooltip-${this.uniqueId}\"\r\n role=\"tooltip\"\r\n >\r\n ${this.text}\r\n ${this.showTail ? html`<span class=\"tooltip-tail\"></span>` : \"\"}\r\n </div>\r\n `;\r\n }\r\n}\r\n"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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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;AA9BY;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAXf,QAWiB;AAEe;AAAA,MAA1C,8BAAS,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,GAb9B,QAagC;AAEA;AAAA,MAA1C,8BAAS,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,GAf9B,QAegC;AAEA;AAAA,MAA1C,8BAAS,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,GAjB9B,QAiBgC;AAEA;AAAA,MAA1C,8BAAS,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,GAnB9B,QAmBgC;AAGY;AAAA,MAAtD,8BAAS,EAAE,MAAM,QAAQ,WAAW,eAAe,CAAC;AAAA,GAtB1C,QAsB4C;AACC;AAAA,MAAvD,8BAAS,EAAE,MAAM,QAAQ,WAAW,gBAAgB,CAAC;AAAA,GAvB3C,QAuB6C;AAE5B;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAzBf,QAyBiB;AAEC;AAAA,MAA5B,8BAAS,EAAE,MAAM,QAAQ,CAAC;AAAA,GA3BhB,QA2BkB;AAGe;AAAA,MAA3C,8BAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GA9B/B,QA8BiC;AAMc;AAAA,MAAzD,8BAAS,EAAE,MAAM,SAAS,WAAW,iBAAiB,CAAC;AAAA,GApC7C,QAoC+C;AAGzC;AAAA,MAAhB,2BAAM;AAAA,GAvCI,QAuCM;AAvCN,UAAN;AAAA,MADN,mCAAc,UAAU;AAAA,GACZ;;;ACXb,IAAAC,eAAsC;AACtC,IAAAC,sBAAwC;AAGjC,IAAM,eAAN,cAA2B,wBAAW;AAAA,EAAtC;AAAA;AACuB,mBAA8B;AAC7B,kBAAS;AACV,sBAAyC;AAAA;AAAA,EA6CrE,IAAY,UAAU;AACpB,WAAO;AAAA,MACL;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,MACrB,WAAW,KAAK,OAAO;AAAA,MACvB,KAAK,SAAS,WAAW;AAAA,IAC3B,EAAE,KAAK,GAAG;AAAA,EACZ;AAAA,EAEA,SAAS;AACP,WAAO;AAAA,oBACS,KAAK,OAAO;AAAA;AAAA;AAAA;AAAA,EAI9B;AACF;AAhEa,aAKJ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAJY;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GADf,aACiB;AACC;AAAA,MAA5B,8BAAS,EAAE,MAAM,QAAQ,CAAC;AAAA,GAFhB,aAEkB;AACD;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAHf,aAGiB;AAHjB,eAAN;AAAA,MADN,mCAAc,eAAe;AAAA,GACjB;;;ACJX,IAAAC,eAAsC;AACtC,IAAAC,sBAAwC;AAGjC,IAAM,aAAN,cAAyB,wBAAW;AAAA,EAApC;AAAA;AACuB,uBAAyC;AAAA;AAAA,EAiCrE,oBAAoB;AAClB,UAAM,kBAAkB;AACxB,SAAK,aAAa,QAAQ,WAAW;AAAA,EACvC;AAAA,EAEA,UAAU;AACR,SAAK,aAAa,oBAAoB,KAAK,eAAe,YAAY;AAAA,EACxE;AAAA,EAEA,SAAS;AACP,WAAO;AAAA,kCACqB,KAAK,WAAW;AAAA;AAAA,EAE9C;AACF;AAhDa,WAGJ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAFY;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GADf,WACiB;AADjB,aAAN;AAAA,MADN,mCAAc,aAAa;AAAA,GACf;;;ACJf,IAAAC,eAAsC;AACtC,IAAAC,sBAAsD;AACtD,IAAAC,mBAAO;;;ACFP,IAAAC,eAAsC;AACtC,IAAAC,sBAA8B;AAGvB,IAAM,kBAAN,cAA8B,wBAAW;AAAA,EAS9C,SAAS;AACP,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAKT;AACF;AAhBa,gBACJ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AADL,kBAAN;AAAA,MADN,mCAAc,mBAAmB;AAAA,GACrB;;;ADKN,IAAM,YAAN,cAAwB,wBAAW;AAAA,EAAnC;AAAA;AACuC,gBAAO;AACvB,gBAAmB;AAClB,uBAAc;AACd,iBAAQ;AACwB,2BAAkB;AACpB,yBAAgB;AACpB,sBAAa;AACvC,qBAAY;AACgB,yBAAgB;AACpB,qBAAY;AACrC,iBAAQ;AACR,iBAAgB;AAChB,uBAAsB;AAEzC,SAAQ,aAAa;AACrB,SAAQ,aAAa;AAK9B,SAAQ,gBAAoC;AAC5C,SAAQ,SAAS;AACjB,SAAQ,WAAW;AACnB,SAAQ,uBAAuB;AAC/B,SAAQ,2BAA2B;AAmVnC,SAAQ,gBAAgB,CAAC,MAAqB;AAC5C,UAAI,CAAC,KAAK,KAAM;AAEhB,UAAI,EAAE,QAAQ,YAAY,KAAK,eAAe,KAAK,eAAe;AAChE,UAAE,eAAe;AACjB,aAAK,MAAM,QAAQ;AACnB;AAAA,MACF;AAGA,UAAI,EAAE,QAAQ,SAAS,KAAK,OAAO;AACjC,cAAM,YAAY,KAAK,qBAAqB;AAC5C,YAAI,UAAU,WAAW,GAAG;AAC1B,YAAE,eAAe;AACjB;AAAA,QACF;AAEA,cAAM,iBAAiB,UAAU,CAAC;AAClC,cAAM,gBAAgB,UAAU,UAAU,SAAS,CAAC;AACpD,cAAM,gBAAgB,SAAS;AAE/B,YAAI,EAAE,UAAU;AACd,cAAI,kBAAkB,gBAAgB;AACpC,cAAE,eAAe;AACjB,0BAAc,MAAM;AAAA,UACtB;AAAA,QACF,OAAO;AACL,cAAI,kBAAkB,eAAe;AACnC,cAAE,eAAe;AACjB,2BAAe,MAAM;AAAA,UACvB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAmBA;AAAA,SAAQ,oBAAoB,CAAC,MAAoB;AAC/C,UAAI,CAAC,KAAK,aAAa,KAAK,SAAS,SAAU;AAE/C,WAAK,aAAa;AAClB,WAAK,SAAS,EAAE;AAChB,WAAK,WAAW,EAAE;AAClB,WAAK,aAAa;AAElB,YAAM,SAAS,EAAE;AACjB,aAAO,kBAAkB,EAAE,SAAS;AAEpC,eAAS,iBAAiB,eAAe,KAAK,iBAAiB;AAC/D,eAAS,iBAAiB,aAAa,KAAK,eAAe;AAAA,IAC7D;AAEA,SAAQ,oBAAoB,CAAC,MAAoB;AAC/C,UAAI,CAAC,KAAK,WAAY;AAEtB,WAAK,WAAW,EAAE;AAClB,YAAM,SAAS,KAAK,WAAW,KAAK;AAGpC,UAAI,SAAS,GAAG;AACd,aAAK,aAAa;AAClB,aAAK,cAAc;AAAA,MACrB;AAAA,IACF;AAEA,SAAQ,kBAAkB,CAAC,OAAqB;AAC9C,UAAI,CAAC,KAAK,WAAY;AAEtB,WAAK,aAAa;AAElB,YAAM,cAAc,KAAK,cAAc,gBAAgB;AACvD,YAAM,iBAAiB,KAAK,aAAa;AAEzC,UAAI,kBAAkB,KAAK,eAAe;AACxC,aAAK,MAAM,MAAM;AAAA,MACnB;AAEA,WAAK,aAAa;AAClB,WAAK,cAAc;AAEnB,eAAS,oBAAoB,eAAe,KAAK,iBAAiB;AAClE,eAAS,oBAAoB,aAAa,KAAK,eAAe;AAAA,IAChE;AAAA;AAAA,EAvNA,oBAAoB;AAClB,UAAM,kBAAkB;AACxB,QAAI,KAAK,MAAM;AACb,WAAK,WAAW;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,uBAAuB;AACrB,UAAM,qBAAqB;AAC3B,SAAK,aAAa;AAClB,aAAS,oBAAoB,WAAW,KAAK,aAAa;AAAA,EAC5D;AAAA,EAEA,QAAQ,SAA2B;AACjC,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;AAEhB,QAAI,KAAK,OAAO;AACd,WAAK,eAAe,KAAK,MAAM;AAC7B,cAAM,cACJ,KAAK,cAA2B,aAAa,KAC7C,KAAK,cAA2B,eAAe,KAC/C,KAAK,cAA2B,QAAQ;AAC1C,qBAAa,MAAM;AAAA,MACrB,CAAC;AAAA,IACH;AAEA,aAAS,iBAAiB,WAAW,KAAK,aAAa;AAEvD,SAAK;AAAA,MACH,IAAI,YAAY,mBAAmB;AAAA,QACjC,QAAQ,EAAE,MAAM,KAAK;AAAA,QACrB,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,cAAc;AACpB,SAAK,aAAa;AAClB,aAAS,oBAAoB,WAAW,KAAK,aAAa;AAE1D,QAAI,KAAK,iBAAiB,KAAK,cAAc,OAAO;AAClD,WAAK,eAAe,KAAK,MAAM;AAC7B,aAAK,eAAe,MAAM;AAC1B,aAAK,gBAAgB;AAAA,MACvB,CAAC;AAAA,IACH;AAEA,SAAK;AAAA,MACH,IAAI,YAAY,mBAAmB;AAAA,QACjC,QAAQ,EAAE,MAAM,MAAM;AAAA,QACtB,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,aAAa;AACnB,QAAI,OAAO,aAAa,YAAa;AAErC,UAAM,iBAAiB,OAAO,aAAa,SAAS,gBAAgB;AAEpE,SAAK,uBAAuB,SAAS,KAAK,MAAM;AAChD,SAAK,2BAA2B,SAAS,KAAK,MAAM;AAEpD,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;AAErC,aAAS,KAAK,MAAM,WAAW,KAAK;AACpC,aAAS,KAAK,MAAM,eAAe,KAAK;AAAA,EAC1C;AAAA,EAEQ,uBAAsC;AAC5C,QAAI,CAAC,KAAK,aAAc,QAAO,CAAC;AAEhC,UAAM,YAAY;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,GAAG;AAEV,UAAM,WAAW,MAAM;AAAA,MACrB,KAAK,aAAa,iBAAiB,SAAS;AAAA,IAC9C;AAGA,UAAM,QAAQ,KAAK,aAAa,iBAAiB,MAAM;AACvD,UAAM,QAAQ,CAAC,SAAS;AACtB,YAAM,WAAW,KAAK,iBAAiB,EAAE,SAAS,KAAK,CAAC;AACxD,eAAS,QAAQ,CAAC,OAAO;AACvB,cAAM,kBAAkB,GAAG,iBAAiB,SAAS;AACrD,iBAAS,KAAK,GAAI,MAAM,KAAK,eAAe,CAAmB;AAAA,MACjE,CAAC;AAAA,IACH,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAqCQ,mBAAmB,GAAe;AACxC,QAAI,CAAC,KAAK,eAAe,CAAC,KAAK,gBAAiB;AAEhD,QAAI,EAAE,WAAW,KAAK,gBAAgB;AACpC,WAAK,MAAM,UAAU;AAAA,IACvB;AAAA,EACF;AAAA,EAEQ,yBAAyB;AAC/B,SAAK,MAAM,cAAc;AAAA,EAC3B;AAAA,EAEQ,MAAM,SAA4B;AACxC,SAAK,OAAO;AAAA,EACd;AAAA,EAkDQ,gBAAgB;AACtB,QAAI,CAAC,KAAK,cAAc,KAAK,eAAe,GAAG;AAC7C,aAAO;AAAA,IACT;AAEA,WAAO,0CAA0C,KAAK,UAAU;AAAA,EAClE;AAAA,EAEQ,kBAAkB;AACxB,QAAI,CAAC,KAAK,cAAc,KAAK,eAAe,GAAG;AAC7C,aAAO;AAAA,IACT;AAEA,UAAM,cAAc,KAAK,cAAc,gBAAgB;AACvD,UAAM,iBAAiB,KAAK,IAAI,KAAK,aAAa,aAAa,CAAC;AAChE,UAAM,UAAU,OAAO,IAAI;AAE3B,WAAO,YAAY,OAAO;AAAA,EAC5B;AAAA,EAEA,SAAS;AACP,UAAM,WAAW,CAAC,CAAC,KAAK;AACxB,UAAM,iBAAiB,CAAC,CAAC,KAAK;AAC9B,UAAM,kBAAkB,KAAK;AAC7B,UAAM,YAAY,YAAY,kBAAkB;AAEhD,UAAM,gBACJ,KAAK,cAAc,KAAK,SAAS,YAAY,KAAK;AAEpD,WAAO;AAAA,qCAC0B,KAAK,OAAO,SAAS,EAAE;AAAA;AAAA;AAAA,2BAGjC,CAAC,KAAK,QAAQ,aAAa,EAAE,IAAI,KAAK,aAAa,aAAa,EAAE;AAAA,mBAC1E,KAAK,gBAAgB,CAAC;AAAA,oBACrB,KAAK,kBAAkB;AAAA;AAAA;AAAA;AAAA,yBAIlB,KAAK,aAAa,aAAa,EAAE;AAAA,uBACnC,KAAK,IAAI;AAAA,mBACb,KAAK,QAAQ,mBAAmB,KAAK,KAAK,MAAM,EAAE,GAAG,KAAK,YAAY,wBAAwB,KAAK,SAAS,MAAM,EAAE,GAAG,KAAK,cAAc,CAAC;AAAA,kBAC5I,KAAK,QAAQ,WAAW,QAAQ;AAAA,wBAC1B,KAAK,KAAK;AAAA;AAAA,YAEtB,gBACE;AAAA;AAAA;AAAA,gCAGkB,KAAK,iBAAiB,aACxC,EAAE;AAAA;AAAA,6CAE6B,CAAC,YAAY,UAAU,EAAE;AAAA,cACxD,YAAY,kBAAkB,kBAC5B;AAAA;AAAA;AAAA,wBAGQ,WACE,sCAAyB,KAAK,KAAK,UACnC,EAAE;AAAA,wBACJ,iBACE,2CAA8B,KAAK,WAAW,SAC9C,EAAE;AAAA;AAAA,sBAEN,kBACE;AAAA;AAAA;AAAA,oCAGY,KAAK,sBAAsB;AAAA;AAAA;AAAA,qCAIvC,EAAE;AAAA;AAAA,oBAGV,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAahB;AACF;AAxiBa,UA2BJ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA1B4B;AAAA,MAA3C,8BAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAD/B,UACiC;AAChB;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAFf,UAEiB;AACC;AAAA,MAA5B,8BAAS,EAAE,MAAM,QAAQ,CAAC;AAAA,GAHhB,UAGkB;AACA;AAAA,MAA5B,8BAAS,EAAE,MAAM,QAAQ,CAAC;AAAA,GAJhB,UAIkB;AACgC;AAAA,MAA5D,8BAAS,EAAE,MAAM,SAAS,WAAW,oBAAoB,CAAC;AAAA,GALhD,UAKkD;AACF;AAAA,MAA1D,8BAAS,EAAE,MAAM,SAAS,WAAW,kBAAkB,CAAC;AAAA,GAN9C,UAMgD;AACJ;AAAA,MAAtD,8BAAS,EAAE,MAAM,SAAS,WAAW,cAAc,CAAC;AAAA,GAP1C,UAO4C;AAC1B;AAAA,MAA5B,8BAAS,EAAE,MAAM,QAAQ,CAAC;AAAA,GARhB,UAQkB;AAC4B;AAAA,MAAxD,8BAAS,EAAE,MAAM,QAAQ,WAAW,iBAAiB,CAAC;AAAA,GAT5C,UAS8C;AACJ;AAAA,MAApD,8BAAS,EAAE,MAAM,QAAQ,WAAW,aAAa,CAAC;AAAA,GAVxC,UAU0C;AACzB;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAXf,UAWiB;AACA;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAZf,UAYiB;AACA;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAbf,UAaiB;AAEX;AAAA,MAAhB,2BAAM;AAAA,GAfI,UAeM;AACA;AAAA,MAAhB,2BAAM;AAAA,GAhBI,UAgBM;AAEQ;AAAA,MAAxB,2BAAM,QAAQ;AAAA,GAlBJ,UAkBc;AACE;AAAA,MAA1B,2BAAM,UAAU;AAAA,GAnBN,UAmBgB;AAnBhB,YAAN;AAAA,MADN,mCAAc,YAAY;AAAA,GACd;;;AETb,IAAAC,eAAsC;AACtC,IAAAC,sBAAwC;AACxC,IAAAC,mBAAO;AAGA,IAAM,SAAN,cAAqB,wBAAW;AAAA,EAAhC;AAAA;AAEL,gBAA2B;AAG3B,mBAA+B;AAG/B,gBAAO;AAGP,iBAAQ;AAAA;AAAA,EA0ER,SAAS;AACP,WAAO;AAAA,EACT;AACF;AAxFa,OAaJ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAXhB;AAAA,MADC,8BAAS,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,GAD9B,OAEX;AAGA;AAAA,MADC,8BAAS,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,GAJ9B,OAKX;AAGA;AAAA,MADC,8BAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAP/B,OAQX;AAGA;AAAA,MADC,8BAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAV/B,OAWX;AAXW,SAAN;AAAA,MADN,mCAAc,SAAS;AAAA,GACX;;;ACLb,IAAAC,eAAsC;AACtC,IAAAC,sBAAwC;AACxC,IAAAC,mBAAO;AAGA,IAAM,YAAN,cAAwB,wBAAW;AAAA,EAAnC;AAAA;AACuB,eAAM;AAEN,mBAAU;AAEM,sBAAa;AAAA;AAAA,EA8BzD,aAAa;AACX,SAAK,MAAM,YAAY,UAAU,KAAK,GAAG;AACzC,SAAK,MAAM,YAAY,cAAc,OAAO,KAAK,OAAO,CAAC;AAAA,EAC3D;AAAA,EAEA,SAAS;AACP,WAAO;AAAA,EACT;AACF;AA3Ca,UAOJ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AANY;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GADf,UACiB;AAEA;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAHf,UAGiB;AAEgB;AAAA,MAA3C,8BAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAL/B,UAKiC;AALjC,YAAN;AAAA,MADN,mCAAc,YAAY;AAAA,GACd;;;ACLb,IAAAC,eAAiC;AACjC,IAAAC,sBAA+C;AAC/C,IAAAC,mBAAO;AAcA,IAAM,cAAN,cAA0B,wBAAW;AAAA,EAArC;AAAA;AACuB,iBAAgB;AAChB,iBAAgB;AACf,oBAAoB;AACrB,gBAAe;AAAA;AAAA,EAE3C,mBAAmB;AACjB,WAAO;AAAA,EACT;AAAA,EAEA,SAAS;AACP,WAAO;AAAA,EACT;AACF;AAZ8B;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GADf,YACiB;AACA;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAFf,YAEiB;AACC;AAAA,MAA5B,8BAAS,EAAE,MAAM,QAAQ,CAAC;AAAA,GAHhB,YAGkB;AACD;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAJf,YAIiB;AAJjB,cAAN;AAAA,MADN,mCAAc,eAAe;AAAA,GACjB;AAgBN,IAAM,UAAN,cAAsB,wBAAW;AAAA,EAAjC;AAAA;AACuB,gBAAiB;AAElB,iBAAoB,CAAC;AAEvC,SAAQ,eAAuB;AAC/B,SAAQ,SAAqB,CAAC;AAwIvC,SAAQ,sBAAsB,CAAC,MAAkB;AAC/C,UAAI,CAAC,KAAK,SAAS,EAAE,MAAc,GAAG;AACpC,aAAK,SAAS,KAAK,OAAO,IAAI,QAAM,EAAE,GAAG,GAAG,MAAM,MAAM,EAAE;AAAA,MAC5D;AAAA,IACF;AAAA;AAAA,EAxBA,mBAAmB;AACjB,WAAO;AAAA,EACT;AAAA,EAEA,oBAAoB;AAClB,UAAM,kBAAkB;AACxB,aAAS,iBAAiB,SAAS,KAAK,mBAAmB;AAAA,EAC7D;AAAA,EAEA,uBAAuB;AACrB,UAAM,qBAAqB;AAC3B,aAAS,oBAAoB,SAAS,KAAK,mBAAmB;AAAA,EAChE;AAAA,EAEA,QAAQ,mBAAyC;AAC/C,QAAI,kBAAkB,IAAI,OAAO,GAAG;AAClC,WAAK,SAAS,KAAK,MAAM,IAAI,WAAS,EAAE,GAAG,KAAK,EAAE;AAAA,IACpD;AAAA,EACF;AAAA,EAQQ,YAAY,MAAgB,OAAe;AACjD,QAAI,KAAK,SAAS,WAAW,KAAK,SAAS,QAAQ;AACjD,WAAK,SAAS,KAAK,OAAO,IAAI,CAAC,GAAG,SAAS,EAAE,GAAG,GAAG,MAAM,QAAQ,MAAM,EAAE;AAAA,IAC3E;AAAA,EACF;AAAA,EAEQ,YAAY,OAAiB;AAAA,EAErC;AAAA,EAEQ,YAAY,MAAgB,OAAe,IAAY;AAC7D,QAAI,gBAAgB;AACpB,QAAI,KAAK,SAAU;AAEnB,SAAK,eAAe;AAEpB,QAAI,KAAK,SAAS,YAAY;AAC5B,YAAMC,WAAU,EAAE,GAAG,MAAM,SAAS,CAAC,KAAK,QAAQ;AAClD,WAAK,SAAS,KAAK,OAAO,IAAI,CAAC,GAAG,QAAQ,QAAQ,QAAQA,WAAU,CAAC;AACrE,WAAK;AAAA,QACH,IAAI,YAAY,aAAa;AAAA,UAC3B,QAAQ,EAAE,MAAMA,UAAS,SAASA,SAAQ,QAAQ;AAAA,UAClD,SAAS;AAAA,UACT,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAEA,QAAI,KAAK,SAAS,WAAW,KAAK,SAAS,QAAQ;AACjD,YAAM,OAAO,CAAC,KAAK;AACnB,WAAK,SAAS,KAAK,OAAO,IAAI,CAAC,GAAG,SAAS;AAAA,QACzC,GAAG;AAAA,QACH,MAAM,QAAQ,QAAQ,OAAO;AAAA,MAC/B,EAAE;AACF;AAAA,IACF;AAGA,UAAM,UAAU,EAAE,GAAG,MAAM,QAAQ,KAAK;AACxC,SAAK,SAAS,KAAK,OAAO,IAAI,CAAC,GAAG,QAAQ,QAAQ,QAAQ,UAAU,EAAE,GAAG,GAAG,QAAQ,MAAM,CAAC;AAC3F,SAAK;AAAA,MACH,IAAI,YAAY,cAAc;AAAA,QAC5B,QAAQ,EAAE,MAAM,QAAQ;AAAA,QACxB,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,WAAW,aAAqB,UAAkB,IAAY;AACpE,QAAI,gBAAgB;AACpB,SAAK,SAAS,KAAK,OAAO,IAAI,CAAC,GAAG,SAAS;AAAA,MACzC,GAAG;AAAA,MACH,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,SAAS,EAAE,SAAS,IAAI,CAAC,GAAG,UAAU;AAAA,QACpC,GAAG;AAAA,QACH,QAAQ,QAAQ,eAAe,SAAS;AAAA,MAC1C,EAAE;AAAA,IACJ,EAAE;AACF,SAAK;AAAA,MACH,IAAI,YAAY,sBAAsB;AAAA,QACpC,QAAQ;AAAA,UACN,QAAQ,KAAK,OAAO,WAAW;AAAA,UAC/B,KAAK,KAAK,OAAO,WAAW,GAAG,UAAU,QAAQ;AAAA,QACnD;AAAA,QACA,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,eAAe,MAAgB,IAAW;AAChD,OAAG,gBAAgB;AACnB,QAAI,CAAC,KAAK,UAAU;AAClB,WAAK,UAAU,CAAC,KAAK;AACrB,WAAK;AAAA,QACH,IAAI,YAAY,aAAa;AAAA,UAC3B,QAAQ,EAAE,MAAM,SAAS,KAAK,QAAQ;AAAA,UACtC,SAAS;AAAA,UACT,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AACA,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA,EAEQ,UAAU,IAAmB;AACnC,UAAM,OAAO,KAAK,OAAO,SAAS;AAElC,QAAI,GAAG,QAAQ,aAAa;AAC1B,WAAK,eAAe,KAAK,IAAI,MAAM,KAAK,eAAe,CAAC;AACxD,SAAG,eAAe;AAAA,IACpB,WAAW,GAAG,QAAQ,WAAW;AAC/B,WAAK,eAAe,KAAK,IAAI,GAAG,KAAK,eAAe,CAAC;AACrD,SAAG,eAAe;AAAA,IACpB,WAAW,GAAG,QAAQ,cAAc;AAClC,YAAM,OAAO,KAAK,OAAO,KAAK,YAAY;AAC1C,UAAI,KAAK,SAAS,WAAW,MAAM,SAAS,QAAQ;AAClD,aAAK,SAAS,KAAK,OAAO,IAAI,CAAC,GAAG,SAAS;AAAA,UACzC,GAAG;AAAA,UACH,MAAM,QAAQ,KAAK,eAAe,OAAO,EAAE;AAAA,QAC7C,EAAE;AAAA,MACJ;AAAA,IACF,WAAW,GAAG,QAAQ,eAAe,GAAG,QAAQ,UAAU;AACxD,WAAK,SAAS,KAAK,OAAO,IAAI,QAAM,EAAE,GAAG,GAAG,MAAM,MAAM,EAAE;AAAA,IAC5D,WAAW,GAAG,QAAQ,WAAW,GAAG,QAAQ,KAAK;AAC/C,YAAM,OAAO,KAAK,OAAO,KAAK,YAAY;AAC1C,WAAK,YAAY,MAAM,KAAK,YAAY;AACxC,SAAG,eAAe;AAAA,IACpB;AAAA,EACF;AAAA,EAEQ,eAAe,MAAgB,OAAe;AACpD,UAAM,YAAY,KAAK,iBAAiB;AAExC,WAAO;AAAA;AAAA,+BAEoB,KAAK,SAAS,WAAW,EAAE,IAAI,KAAK,WAAW,aAAa,EAAE;AAAA;AAAA,yBAEpE,SAAS;AAAA,uBACX,MAAM,KAAK,YAAY,MAAM,KAAK,CAAC;AAAA,uBACnC,MAAM,KAAK,YAAY,IAAI,CAAC;AAAA,kBACjC,CAAC,MAAa,KAAK,YAAY,MAAM,OAAO,CAAC,CAAC;AAAA,UACtD,KAAK,SAAS,aACZ;AAAA;AAAA;AAAA;AAAA;AAAA,8BAKkB,KAAK,WAAW,KAAK;AAAA,+BACpB,KAAK,QAAQ;AAAA,4BAChB,CAAC,MAAa,KAAK,eAAe,MAAM,CAAC,CAAC;AAAA,2CAC3B,KAAK,KAAK;AAAA;AAAA,gBAGzC;AAAA,yCAC6B,KAAK,KAAK;AAAA,gBACnC,KAAK,SAAS,WAAW,KAAK,SAAS,SACrC,oDACA,EAAE;AAAA,aACP;AAAA,UACH,KAAK,SAAS,WAAW,KAAK,SAAS,SACrC;AAAA;AAAA,qCAEyB,KAAK,OAAO,YAAY,EAAE;AAAA,0BACrC,CAAC,MAAa,EAAE,gBAAgB,CAAC;AAAA,kBACzC,KAAK,QAAQ;AAAA,MACb,CAAC,KAAK,aAAa;AAAA;AAAA,6CAEQ,IAAI,SAAS,WAAW,EAAE;AAAA;AAAA,gCAEvC,CAAC,MAAa,KAAK,WAAW,OAAO,UAAU,CAAC,CAAC;AAAA,iDAChC,IAAI,KAAK;AAAA;AAAA;AAAA,IAG1C,CAAC;AAAA;AAAA,gBAGL,EAAE;AAAA;AAAA;AAAA,EAGZ;AAAA,EAEA,SAAS;AACP,WAAO;AAAA,eACI,QAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,oBAKP,KAAK,SAAS;AAAA,kBAChB,CAAC,MAAa,EAAE,gBAAgB,CAAC;AAAA,UACzC,KAAK,OAAO,IAAI,CAAC,MAAM,UAAU,KAAK,eAAe,MAAM,KAAK,CAAC,CAAC;AAAA;AAAA;AAAA,EAG1E;AACF;AAtUa,QAQY,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAPF;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GADf,QACiB;AAED;AAAA,MAA1B,8BAAS,EAAE,MAAM,MAAM,CAAC;AAAA,GAHd,QAGgB;AAEV;AAAA,MAAhB,2BAAM;AAAA,GALI,QAKM;AACA;AAAA,MAAhB,2BAAM;AAAA,GANI,QAMM;AANN,UAAN;AAAA,MADN,mCAAc,UAAU;AAAA,GACZ;;;AChCb,IAAAC,eAAiC;AACjC,IAAAC,sBAAqC;AAErC,IAAAC,mBAAO;;;ACHP,IAAAC,eAAsC;AACtC,IAAAC,sBAAwC;AACxC,IAAAC,mBAAO;AAUA,IAAM,WAAN,cAAuB,wBAAW;AAAA,EAAlC;AAAA;AACsB,mBAAyB,CAAC;AAEzB,gBAAO;AAGnC,yBAA+B;AAG/B,oBAAW;AAEkB,iBAAQ;AAET,wBAAe;AAEf,iBAAQ;AAEpC,mBAAU;AAEV,SAAQ,YAAqC,MAAM;AAAA,IAAC;AACpD,SAAQ,aAAyB,MAAM;AAAA,IAAC;AAAA;AAAA,EAgIhC,SAAS,OAAe;AAC9B,QAAI,KAAK,SAAU;AAEnB,SAAK,gBAAgB;AACrB,SAAK;AAAA,MACH,IAAI,YAAY,cAAc;AAAA,QAC5B,QAAQ,EAAE,OAAO,SAAS,KAAK;AAAA,QAC/B,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,UAAU,UAAU,KAAK;AAAA,EAAO;AAAA,EAEvE,IAAY,eAAwB;AAClC,WAAO,KAAK,kBAAkB,QAAQ,KAAK,kBAAkB;AAAA,EAC/D;AAAA,EAEQ,aAAa,QAAqB;AACxC,UAAM,YAAY,KAAK,kBAAkB,OAAO;AAChD,UAAM,aAAa,KAAK,YAAY,OAAO;AAC3C,UAAM,gBAAgB,KAAK,SAAS,CAAC,KAAK;AAE1C,UAAM,UAAU;AAAA,MACd;AAAA,MACA,aAAa,aAAa;AAAA,MAC1B,gBAAgB,oBAAoB;AAAA,IACtC,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,WAAO;AAAA,sBACW,OAAO;AAAA;AAAA;AAAA;AAAA,oBAIT,KAAK,IAAI;AAAA,wBACL,SAAS;AAAA,yBACR,UAAU;AAAA,uBACZ,MAAM,KAAK,SAAS,OAAO,KAAK,CAAC;AAAA,qBACnC,MAAM,KAAK,WAAW,CAAC;AAAA;AAAA;AAAA,sCAGN,OAAO,KAAK;AAAA;AAAA;AAAA,UAGxC,OAAO,iBACL,kDAAqC,OAAO,cAAc,WAC1D,EAAE;AAAA;AAAA;AAAA,EAGZ;AAAA,EAEA,SAAS;AACP,WAAO;AAAA;AAAA,UAED,KAAK,QAAQ,IAAI,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC,CAAC;AAAA;AAAA,QAE/C,KAAK,SAAS,KAAK,gBAAgB,CAAC,KAAK,eACvC,+CAAkC,KAAK,YAAY,WACnD,EAAE;AAAA;AAAA,EAEV;AACF;AAvNa,SAsBJ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AArBW;AAAA,MAA1B,8BAAS,EAAE,MAAM,MAAM,CAAC;AAAA,GADd,SACgB;AAEC;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAHf,SAGiB;AAG5B;AAAA,MADC,8BAAS,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,GAL9B,SAMX;AAGA;AAAA,MADC,8BAAS,EAAE,MAAM,QAAQ,CAAC;AAAA,GARhB,SASX;AAE6B;AAAA,MAA5B,8BAAS,EAAE,MAAM,QAAQ,CAAC;AAAA,GAXhB,SAWkB;AAED;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAbf,SAaiB;AAEA;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAff,SAeiB;AAfjB,WAAN;AAAA,MADN,mCAAc,WAAW;AAAA,GACb;;;ADNb,IAAAC,mBAAO;AASA,IAAM,aAAN,cAAyB,wBAAW;AAAA,EAApC;AAAA;AACI,SAAQ,QAAqB,CAAC;AAC9B,SAAQ,gBAAwB;AAChC,SAAQ,sBAA8B;AACtC,SAAQ,mBAA2B;AACnC,SAAQ,qBAAyC;AAE1D,SAAQ,qBAAqB;AA2M7B,SAAQ,qBAAqB,CAAC,MAAkB;AAC9C,UAAI,CAAC,KAAK,SAAS,EAAE,MAAc,GAAG;AACpC,aAAK,cAAc;AAAA,MACrB;AAAA,IACF;AAAA;AAAA,EAzDA,mBAAmB;AACjB,WAAO;AAAA,EACT;AAAA,EAEA,oBAAoB;AAClB,UAAM,kBAAkB;AACxB,SAAK,cAAc;AACnB,aAAS,iBAAiB,SAAS,KAAK,kBAAkB;AAC1D,SAAK,YAAY,MAAM;AACrB,WAAK,oBAAoB;AACzB,WAAK,uBAAuB;AAAA,IAC9B;AACA,WAAO,iBAAiB,UAAU,KAAK,WAAW,EAAE,SAAS,MAAM,SAAS,KAAK,CAAC;AAAA,EACpF;AAAA,EAEA,uBAAuB;AACrB,UAAM,qBAAqB;AAC3B,aAAS,oBAAoB,SAAS,KAAK,kBAAkB;AAC7D,QAAI,KAAK,WAAW;AAClB,aAAO,oBAAoB,UAAU,KAAK,WAAW,EAAE,SAAS,KAAK,CAAC;AAAA,IACxE;AAAA,EACF;AAAA,EAEQ,yBAAyB;AAC/B,QAAI,CAAC,KAAK,mBAAoB;AAC9B,UAAM,eAAe,KAAK,cAAc,qBAAqB;AAC7D,QAAI,CAAC,aAAc;AACnB,UAAM,UAAU,KAAK,cAAc,4DAA4D,KAC1F,aAAa;AAClB,QAAI,CAAC,QAAS;AACd,UAAM,OAAO,QAAQ,sBAAsB;AAC3C,iBAAa,MAAM,MAAM,GAAG,KAAK,GAAG;AACpC,iBAAa,MAAM,OAAO,GAAG,KAAK,QAAQ,CAAC;AAAA,EAC7C;AAAA,EAEQ,sBAAsB;AAC5B,QAAI,KAAK,kBAAkB,GAAI;AAC/B,UAAM,WAAW,KAAK,iBAAiB,kBAAkB;AACzD,UAAM,UAAU,SAAS,KAAK,aAAa;AAC3C,UAAM,QAAQ,KAAK,cAAc,mCAAmC,KAAK,aAAa,IAAI;AAC1F,QAAI,CAAC,WAAW,CAAC,MAAO;AACxB,UAAM,OAAO,QAAQ,sBAAsB;AAC3C,UAAM,MAAM,MAAM,GAAG,KAAK,SAAS,CAAC;AACpC,UAAM,MAAM,OAAO,GAAG,KAAK,IAAI;AAAA,EACjC;AAAA,EAEQ,gBAAgB;AACtB,UAAM,eAAe,MAAM;AAAA,MACzB,KAAK,iBAAiB,kBAAkB;AAAA,IAC1C;AACA,SAAK,QAAQ,aAAa,IAAI,CAAC,UAAU,EAAE,MAAM,MAAM,MAAM,EAAE;AAAA,EACjE;AAAA,EAQQ,gBAAgB;AACtB,SAAK,gBAAgB;AACrB,SAAK,qBAAqB;AAC1B,SAAK,qBAAqB;AAC1B,SAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,SAAS,OAAe,gBAA6B;AAC3D,SAAK,gBAAgB;AACrB,SAAK,mBAAmB;AACxB,SAAK,qBAAqB;AAC1B,SAAK,cAAc;AAGnB,SAAK,eAAe,KAAK,MAAM;AAC7B,YAAM,QAAQ,KAAK;AAAA,QACjB,mCAAmC,KAAK;AAAA,MAC1C;AACA,UAAI,SAAS,gBAAgB;AAC3B,cAAM,OAAO,eAAe,sBAAsB;AAClD,cAAM,MAAM,MAAM,GAAG,KAAK,SAAS,CAAC;AACpC,cAAM,MAAM,OAAO,GAAG,KAAK,IAAI;AAAA,MACjC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,mBAAmB,OAAe,OAAc;AACtD,UAAM,SAAS,MAAM;AACrB,QAAI,KAAK,kBAAkB,OAAO;AAChC,WAAK,cAAc;AAAA,IACrB,OAAO;AACL,WAAK,SAAS,OAAO,MAAM;AAC3B,WAAK,qBAAqB;AAAA,IAC5B;AAAA,EACF;AAAA,EAEQ,wBAAwB,OAAe,OAAc;AAC3D,QAAI,KAAK,kBAAkB,MAAM,KAAK,oBAAoB;AACxD,YAAM,SAAS,MAAM;AACrB,WAAK,SAAS,OAAO,MAAM;AAAA,IAC7B;AAAA,EACF;AAAA,EAEQ,qBAAqB,OAAsB;AACjD,UAAM,EAAE,IAAI,IAAI;AAEhB,QAAI,QAAQ,cAAc;AACxB,YAAM,eAAe;AACrB,WAAK,sBAAsB,KAAK;AAAA,QAC9B,KAAK,MAAM,SAAS;AAAA,QACpB,KAAK,sBAAsB;AAAA,MAC7B;AACA,WAAK,aAAa,KAAK,mBAAmB;AAAA,IAC5C,WAAW,QAAQ,aAAa;AAC9B,YAAM,eAAe;AACrB,WAAK,sBAAsB,KAAK,IAAI,GAAG,KAAK,sBAAsB,CAAC;AACnE,WAAK,aAAa,KAAK,mBAAmB;AAAA,IAC5C,WAAW,QAAQ,WAAW,QAAQ,KAAK;AACzC,YAAM,eAAe;AACrB,YAAM,UAAU,KAAK;AAAA,QACnB,gCAAgC,KAAK,mBAAmB;AAAA,MAC1D;AACA,UAAI,SAAS;AACX,aAAK,SAAS,KAAK,qBAAqB,OAAO;AAC/C,aAAK,eAAe,KAAK,MAAM;AAC7B,gBAAM,cAAc,KAAK;AAAA,YACvB;AAAA,UACF;AACA,cAAI,aAAa;AACf,wBAAY,MAAM;AAAA,UACpB,OAAO;AACL,iBAAK,cAAc,CAAC;AAAA,UACtB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,WAAW,QAAQ,eAAe,KAAK,kBAAkB,IAAI;AAC3D,YAAM,eAAe;AACrB,WAAK,cAAc,CAAC;AAAA,IACtB;AAAA,EACF;AAAA,EAEQ,aAAa,OAAe;AAClC,UAAM,UAAU,KAAK;AAAA,MACnB,gCAAgC,KAAK;AAAA,IACvC;AACA,aAAS,MAAM;AAAA,EACjB;AAAA,EAEQ,mBAAmB,OAAsB;AAC/C,UAAM,EAAE,IAAI,IAAI;AAChB,UAAM,cAAc,KAAK,MAAM,KAAK,aAAa,GAAG;AACpD,QAAI,CAAC,YAAa;AAElB,UAAM,QAAQ,KAAK,kBAAkB,WAAW;AAEhD,QAAI,QAAQ,aAAa;AACvB,YAAM,eAAe;AACrB,WAAK,mBAAmB,KAAK,IAAI,MAAM,SAAS,GAAG,KAAK,mBAAmB,CAAC;AAC5E,WAAK,cAAc;AAAA,IACrB,WAAW,QAAQ,WAAW;AAC5B,YAAM,eAAe;AACrB,WAAK,mBAAmB,KAAK,IAAI,GAAG,KAAK,mBAAmB,CAAC;AAC7D,WAAK,cAAc;AAAA,IACrB,WAAW,QAAQ,cAAc;AAC/B,YAAM,eAAe;AACrB,YAAM,cAAc,MAAM,KAAK,gBAAgB;AAC/C,UAAI,aAAa,aAAa,cAAc,GAAG;AAC7C,aAAK,YAAY,WAA0B;AAAA,MAC7C;AAAA,IACF,WAAW,QAAQ,aAAa;AAC9B,YAAM,eAAe;AACrB,UAAI,KAAK,oBAAoB;AAC3B,aAAK,qBAAqB;AAC1B,aAAK,cAAc;AAAA,MACrB;AAAA,IACF,WAAW,QAAQ,UAAU;AAC3B,YAAM,eAAe;AACrB,WAAK,cAAc;AACnB,WAAK,aAAa,KAAK,aAAa;AAAA,IACtC,WAAW,QAAQ,WAAW,QAAQ,KAAK;AACzC,YAAM,eAAe;AACrB,YAAM,cAAc,MAAM,KAAK,gBAAgB;AAC/C,UAAI,aAAa;AACf,aAAK,gBAAgB,WAA0B;AAAA,MACjD;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,kBAAkB,aAAwC;AAChE,WAAO,MAAM,KAAK,YAAY,QAAQ,EAAE;AAAA,MACtC,CAAC,OACC,GAAG,aAAa,WAAW,KAC3B,GAAG,aAAa,eAAe,KAC/B,GAAG,aAAa,YAAY,KAC5B,GAAG,aAAa,cAAc;AAAA,IAClC;AAAA,EACF;AAAA,EAEQ,cAAc,OAAe;AACnC,SAAK,mBAAmB;AACxB,UAAM,QAAQ,KAAK;AAAA,MACjB,mCAAmC,KAAK,aAAa;AAAA,IACvD;AACA,WAAO,MAAM;AAAA,EACf;AAAA,EAEQ,gBAAgB,MAAmB;AACzC,QAAI,KAAK,aAAa,eAAe,GAAG;AACtC,YAAM,WAAW,KAAK,cAAc,wBAAwB;AAC5D,YAAM,YAAY,MAAM,KAAK,KAAK,UAAU,EACzC,OAAO,OAAK,EAAE,aAAa,KAAK,SAAS,EACzC,IAAI,OAAK,EAAE,aAAa,KAAK,CAAC,EAC9B,OAAO,OAAO,EACd,KAAK,GAAG,KAAK,KAAK,aAAa,OAAO,KAAK;AAC9C,UAAI,UAAU;AACZ,iBAAS,UAAU,CAAC,SAAS;AAC7B,aAAK,oBAAoB,YAAY,WAAW,SAAS,OAAO;AAChE,aAAK,cAAc;AAAA,MACrB;AAAA,IACF,WAAW,KAAK,aAAa,YAAY,GAAG;AAC1C,YAAM,aAAa,KAAK,QAAQ,oBAAoB;AACpD,YAAM,QAAQ,KAAK,aAAa,YAAY,KAAK,KAAK,aAAa,OAAO,KAAK;AAC/E,YAAM,OAAO,YAAY,aAAa,MAAM,KAAK;AAGjD,YAAM,YAAY,YAAY,iBAAiB,cAAc;AAC7D,iBAAW,QAAQ,CAAC,UAAU,MAAM,gBAAgB,cAAc,CAAC;AACnE,WAAK,aAAa,gBAAgB,MAAM;AAGxC,UAAI,YAAY;AACd,mBAAW,aAAa,SAAS,KAAK;AAAA,MACxC;AAEA,WAAK,oBAAoB,SAAS,MAAM,KAAK;AAC7C,WAAK,cAAc;AAAA,IACrB,WAAW,KAAK,aAAa,cAAc,GAAG;AAC5C,WAAK,YAAY,IAAI;AAAA,IACvB,OAAO;AAEL,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA,EAEQ,YAAY,gBAA6B,iBAA+B,cAAuB;AACrG,SAAK,qBAAqB;AAC1B,SAAK,cAAc;AAEnB,SAAK,eAAe,KAAK,MAAM;AAC7B,YAAM,YAAY,WAAW,gBAAgB,CAAC;AAC9C,YAAM,eAAe,KAAK;AAAA,QACxB,mCAAmC,SAAS;AAAA,MAC9C;AACA,UAAI,cAAc;AAChB,cAAM,iBAAiB,mBAAmB;AAC1C,cAAM,OAAO,eAAe,sBAAsB;AAClD,qBAAa,MAAM,MAAM,GAAG,KAAK,GAAG;AACpC,qBAAa,MAAM,OAAO,GAAG,KAAK,QAAQ,CAAC;AAAA,MAC7C;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,uBAAuB,OAAoB;AAEjD,SAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,oBAAoB,MAA4B,aAAqB,OAAyB;AACpG,UAAM,SACJ,SAAS,aACL,EAAE,MAAM,OAAO,aAAa,MAAM,IAAI,SAAS,MAAiB,IAChE,EAAE,MAAM,OAAO,IAAI,MAAM,aAAa,MAAuB;AACnE,SAAK;AAAA,MACH,IAAI,YAAY,sBAAsB;AAAA,QACpC;AAAA,QACA,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,eAAe,MAAe,OAAoB;AACxD,UAAM,YAAY,UAAU,KAAK;AAEjC,QAAI,KAAK,aAAa,WAAW,GAAG;AAClC,YAAM,SAAS;AACf,YAAM,WAAW,OAAO;AACxB,YAAM,WAAW,OAAO,aAAa,eAAe,KAAK;AAEzD,aAAO;AAAA;AAAA,6BAEgB,YAAY,YAAY,EAAE;AAAA,2BAC5B,QAAQ;AAAA,oBACf,MAAM,CAAC,YAAY,KAAK,gBAAgB,IAAmB,CAAC;AAAA;AAAA,kBAE9D,OAAO,WAAW;AAAA,YACxB,WAAW,gDAAmC,QAAQ,YAAY,EAAE;AAAA;AAAA;AAAA,IAG5E;AAEA,QAAI,KAAK,aAAa,gBAAgB,GAAG;AACvC,aAAO;AAAA,IACT;AAEA,QAAI,KAAK,aAAa,eAAe,GAAG;AACtC,YAAM,QAAQ;AACd,YAAM,WAAW,MAAM,cAAc,wBAAwB;AAC7D,YAAM,YAAY,MAAM,KAAK,MAAM,UAAU,EAC1C,OAAO,OAAK,EAAE,aAAa,KAAK,SAAS,EACzC,IAAI,OAAK,EAAE,aAAa,KAAK,CAAC,EAC9B,OAAO,OAAO,EACd,KAAK,GAAG,KAAK,MAAM,aAAa,OAAO,KAAK;AAE/C,aAAO;AAAA;AAAA,kBAEK,SAAS;AAAA,oBACP,UAAU,UAAU,YAAY,WAAW;AAAA,wBACvC,CAAC,MAAmB;AAChC,YAAI,SAAU,UAAS,UAAU,EAAE,OAAO;AAC1C,aAAK,oBAAoB,YAAY,WAAW,EAAE,OAAO,OAAO;AAAA,MAClE,CAAC;AAAA;AAAA;AAAA,IAGP;AAEA,QAAI,KAAK,aAAa,cAAc,GAAG;AACrC,YAAM,QAAQ,KAAK,aAAa,OAAO,KAAK,KAAK,aAAa,KAAK,KAAK;AACxE,YAAM,YAAY,WAAW,KAAK;AAElC,aAAO;AAAA;AAAA,kDAEqC,YAAY,YAAY,EAAE;AAAA,oBACxD,CAAC,MAAa,KAAK,YAAY,MAAqB,EAAE,eAA8B,KAAK,CAAC;AAAA,yBACrF,CAAC,MAAa,KAAK,YAAY,MAAqB,EAAE,eAA8B,KAAK,CAAC;AAAA;AAAA,kBAEjG,KAAK;AAAA;AAAA;AAAA,UAGb,KAAK,cAAc,MAAqB,SAAS,CAAC;AAAA;AAAA,IAExD;AAEA,QAAI,KAAK,aAAa,kBAAkB,GAAG;AACzC,YAAM,eAAe,MAAM,KAAK,KAAK,iBAAiB,cAAc,CAAC;AACrE,YAAM,eAAe,KAAK,aAAa,OAAO,KAAK;AACnD,YAAM,YAAY,KAAK,aAAa,MAAM,KAAK;AAE/C,YAAM,UAAU,aAAa,IAAI,YAAU;AAAA,QACzC,OAAO,MAAM,aAAa,KAAK,KAAK;AAAA,QACpC,OAAO,MAAM,aAAa,YAAY,KAAK,MAAM,aAAa,OAAO,KAAK;AAAA,MAC5E,EAAE;AAEF,aAAO;AAAA;AAAA,qBAEQ,OAAO;AAAA,mBACT,YAAY;AAAA,wBACP,CAAC,MAAmB;AAChC,cAAM,WAAW,EAAE,OAAO;AAC1B,aAAK,aAAa,SAAS,QAAQ;AACnC,aAAK,oBAAoB,SAAS,WAAW,QAAQ;AAAA,MACvD,CAAC;AAAA;AAAA;AAAA,IAGP;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,cAAc,gBAA6B,WAAmB;AACpE,UAAM,SAAS,KAAK,uBAAuB;AAC3C,UAAM,eAAe,MAAM,KAAK,eAAe,QAAQ;AAEvD,WAAO;AAAA,kCACuB,SAAS,SAAS,EAAE,sBAAsB,SAAS;AAAA,UAC3E,aAAa,IAAI,CAAC,YAAY;AAC9B,UAAI,QAAQ,aAAa,WAAW,GAAG;AACrC,cAAM,SAAS;AACf,eAAO;AAAA;AAAA;AAAA,0BAGO,MAAM,KAAK,uBAAuB,OAAsB,CAAC;AAAA;AAAA,wBAE3D,OAAO,WAAW;AAAA;AAAA;AAAA,MAGhC;AACA,aAAO;AAAA,IACT,CAAC,CAAC;AAAA;AAAA;AAAA,EAGR;AAAA,EAEQ,gBAAgB,WAAsB,OAAe;AAC3D,UAAM,SAAS,UAAU,KAAK;AAC9B,UAAM,QAAQ,MAAM,KAAK,UAAU,KAAK,QAAQ;AAEhD,WAAO;AAAA;AAAA,+BAEoB,SAAS,SAAS,EAAE;AAAA,2BACxB,KAAK;AAAA;AAAA,oBAEZ,KAAK,kBAAkB;AAAA;AAAA,UAEjC,MAAM,IAAI,CAAC,MAAM,QAAQ,KAAK,eAAe,MAAM,GAAG,CAAC,CAAC;AAAA;AAAA;AAAA,EAGhE;AAAA,EAEA,SAAS;AACP,WAAO;AAAA,eACI,WAAW,IAAI;AAAA;AAAA;AAAA,UAGpB,KAAK,MAAM;AAAA,MACX,CAAC,WAAW,UAAU;AAAA;AAAA,uCAEO,UAAU,KAAK,gBAAgB,WAAW,EAAE;AAAA,4BACvD,KAAK;AAAA,wBACT,CAAC,MAAa,KAAK,mBAAmB,OAAO,CAAC,CAAC;AAAA,6BAC1C,CAAC,MAAa,KAAK,wBAAwB,OAAO,CAAC,CAAC;AAAA,0BACvD,KAAK,oBAAoB;AAAA;AAAA,gBAEnC,UAAU,KAAK,KAAK;AAAA;AAAA;AAAA,IAG5B,CAAC;AAAA;AAAA,QAED,KAAK,MAAM,IAAI,CAAC,WAAW,UAAU,KAAK,gBAAgB,WAAW,KAAK,CAAC,CAAC;AAAA;AAAA,EAElF;AACF;AA3kBa,WAUY,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AATb;AAAA,MAAhB,2BAAM;AAAA,GADI,WACM;AACA;AAAA,MAAhB,2BAAM;AAAA,GAFI,WAEM;AACA;AAAA,MAAhB,2BAAM;AAAA,GAHI,WAGM;AACA;AAAA,MAAhB,2BAAM;AAAA,GAJI,WAIM;AACA;AAAA,MAAhB,2BAAM;AAAA,GALI,WAKM;AALN,aAAN;AAAA,MADN,mCAAc,aAAa;AAAA,GACf;;;AEfb,IAAAC,eAAiC;AACjC,IAAAC,sBAAwC;AACxC,8BAAO;AAGA,IAAM,iBAAN,cAA6B,wBAAW;AAAA,EAAxC;AAAA;AACuB,iBAAQ;AAAA;AAAA;AAAA,EAGpC,mBAAmB;AACjB,WAAO;AAAA,EACT;AAAA,EAEA,SAAS;AACP,WAAO;AAAA,EACT;AACF;AAV8B;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GADf,eACiB;AADjB,iBAAN;AAAA,MADN,mCAAc,kBAAkB;AAAA,GACpB;;;ACLb,IAAAC,eAAsC;AACtC,IAAAC,sBAAwC;AASjC,IAAM,YAAN,cAAwB,wBAAW;AAAA,EACxC,cAAc;AACZ,UAAM;AAOR,kBAAS;AAGT,kBAA0C;AATxC,YAAQ;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAAA,EAwEA,SAAS;AACP,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaT;AACF;AA7Fa,UAcJ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AALhB;AAAA,MADC,8BAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAR/B,UASX;AAGA;AAAA,MADC,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAXf,UAYX;AAZW,YAAN;AAAA,MADN,mCAAc,YAAY;AAAA,GACd;;;ACVb,IAAAC,eAAsC;AACtC,IAAAC,sBAA+C;AAC/C,IAAAC,mBAAO;AACP,IAAAC,mBAAO;;;ACHP,IAAAC,eAAsC;AACtC,IAAAC,sBAAwC;AACxC,IAAAC,mBAAO;AAOA,IAAM,iBAAN,cAA6B,wBAAW;AAAA,EAAxC;AAAA;AACuB,eAAc;AACd,gBAAe;AACf,iBAAgB;AAAA;AAAA,EAuB5C,SAAS;AACP,WAAO;AAAA,iBACM,KAAK,IAAI,iBAAiB,KAAK,SAAS,MAAM;AAAA,UACrD,KAAK,MACH,8BAAiB,KAAK,GAAG,UAAU,KAAK,KAAK,SAC7C,0BAAa,KAAK,KAAK,SAAS;AAAA;AAAA;AAAA,EAG1C;AACF;AAnCa,eAKJ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAJY;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GADf,eACiB;AACA;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAFf,eAEiB;AACA;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAHf,eAGiB;AAHjB,iBAAN;AAAA,MADN,mCAAc,kBAAkB;AAAA,GACpB;;;ACTb,IAAAC,eAAsC;AACtC,IAAAC,sBAA8B;AAC9B,IAAAC,mBAAO;AAOA,IAAM,mBAAN,cAA+B,wBAAW;AAAA,EAS/C,SAAS;AACP,WAAO;AAAA,EACT;AACF;AAZa,iBACJ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AADL,mBAAN;AAAA,MADN,mCAAc,oBAAoB;AAAA,GACtB;;;ACTb,IAAAC,eAAsC;AACtC,IAAAC,sBAA8B;AAC9B,IAAAC,mBAAO;AAOA,IAAM,qBAAN,cAAiC,wBAAW;AAAA,EASjD,SAAS;AACP,WAAO;AAAA,EACT;AACF;AAZa,mBACJ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AADL,qBAAN;AAAA,MADN,mCAAc,sBAAsB;AAAA,GACxB;;;ACTb,IAAAC,eAAsC;AACtC,IAAAC,sBAA8B;AAC9B,IAAAC,mBAAO;AAOA,IAAM,uBAAN,cAAmC,wBAAW;AAAA,EASnD,SAAS;AACP,WAAO;AAAA,EACT;AACF;AAZa,qBACJ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AADL,uBAAN;AAAA,MADN,mCAAc,yBAAyB;AAAA,GAC3B;;;ACTb,IAAAC,eAAsC;AACtC,IAAAC,sBAA8B;AAC9B,IAAAC,mBAAO;AAOA,IAAM,oBAAN,cAAgC,wBAAW;AAAA,EAahD,SAAS;AACP,WAAO;AAAA,EACT;AACF;AAhBa,kBACJ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AADL,oBAAN;AAAA,MADN,mCAAc,qBAAqB;AAAA,GACvB;;;ACTb,IAAAC,eAAsC;AACtC,IAAAC,sBAAwC;AACxC,IAAAC,mBAAO;AAOA,IAAM,wBAAN,cAAoC,wBAAW;AAAA,EAA/C;AAAA;AACuB,iBAAgB;AAChB,gBAAe;AACC,kBAAS;AAAA;AAAA,EAwB7C,aAAa,GAAe;AAClC,QAAI,KAAK,aAAa,UAAU,GAAG;AACjC,QAAE,eAAe;AACjB;AAAA,IACF;AACA,MAAE,eAAe;AACjB,SAAK,cAAc,IAAI,YAAY,cAAc;AAAA,MAC/C,QAAQ,EAAE,OAAO,KAAK,MAAM,OAAO,KAAK,MAAM;AAAA,MAC9C,SAAS;AAAA,MACT,UAAU;AAAA,IACZ,CAAC,CAAC;AACF,SAAK,cAAc,IAAI,YAAY,kBAAkB;AAAA,MACnD,QAAQ,EAAE,OAAO,KAAK,MAAM,OAAO,KAAK,MAAM;AAAA,MAC9C,SAAS;AAAA,MACT,UAAU;AAAA,IACZ,CAAC,CAAC;AACF,SAAK,SAAS;AACd,UAAM,WAAW,KAAK,eAAe,iBAAiB,0BAA0B;AAChF,cAAU,QAAQ,OAAK;AAAE,UAAI,MAAM,KAAM,CAAC,EAAU,SAAS;AAAA,IAAO,CAAC;AAAA,EACvE;AAAA,EAEA,SAAS;AACP,WAAO,6BAAgB,KAAK,IAAI,kCAAkC,KAAK,YAAY,IAAI,KAAK,KAAK;AAAA,EACnG;AACF;AAnDa,sBAKJ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAJY;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GADf,sBACiB;AACA;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAFf,sBAEiB;AACgB;AAAA,MAA3C,8BAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAH/B,sBAGiC;AAHjC,wBAAN;AAAA,MADN,mCAAc,0BAA0B;AAAA,GAC5B;;;AN4BN,IAAM,YAAN,cAAwB,wBAAW;AAAA,EAAnC;AAAA;AAEsC,mBAAyB;AAGxB,sBAAa;AAGb,0BAAiB;AAGjB,mBAAU;AAGV,kBAAS;AAMzB,uBAAiC;AAE7D,SAAQ,iBAA4B,CAAC;AAC5B,SAAQ,iBAAyB;AACjC,SAAQ,qBAAgF,CAAC;AAGlG,SAAQ,aAAa;AACrB,SAAQ,gBAAgB;AAAA;AAAA,EAuMf,eAAe;AACtB,UAAM,YAAY,KAAK,WAAW,cAAc,aAAa;AAC7D,QAAI,WAAW;AACb,WAAK,kBAAkB,IAAI,eAAe,MAAM;AAC9C,qBAAa,KAAK,YAAY;AAC9B,aAAK,eAAe,OAAO,WAAW,MAAM,KAAK,YAAY,GAAG,GAAG;AAAA,MACrE,CAAC;AACD,WAAK,gBAAgB,QAAQ,SAAS;AAAA,IACxC;AACA,0BAAsB,MAAM,KAAK,YAAY,CAAC;AAAA,EAChD;AAAA,EAES,uBAAuB;AAC9B,UAAM,qBAAqB;AAC3B,SAAK,iBAAiB,WAAW;AACjC,iBAAa,KAAK,YAAY;AAAA,EAChC;AAAA,EAEQ,cAAc;AACpB,QAAI,KAAK,WAAY;AACrB,SAAK,aAAa;AAClB,UAAM,YAAY,KAAK,WAAW,cAAc,aAAa;AAC7D,QAAI,CAAC,UAAW;AAChB,UAAM,UAAU,KAAK,WAAW,cAAc,kBAAkB;AAChE,QAAI,CAAC,QAAS;AACd,UAAM,QAAQ,MAAM,KAAK,QAAQ,iBAAiB,CAAC,EAAE;AAAA,MACnD,QAAM,GAAG,QAAQ,YAAY,MAAM,qBAAqB,CAAC,GAAG,aAAa,WAAW;AAAA,IACtF;AACA,UAAM,WAAW,UAAU,sBAAsB,EAAE;AACnD,QAAI,KAAK,IAAI,WAAW,KAAK,aAAa,IAAI,EAAG;AACjD,SAAK,gBAAgB;AACrB,UAAM,YAAY,WAAW;AAE7B,QAAI,cAAc;AAClB,QAAI,qBAAqB,MAAM;AAC/B,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,qBAAe,MAAM,CAAC,EAAE,sBAAsB,EAAE;AAChD,UAAI,cAAc,WAAW;AAC3B,6BAAqB;AACrB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,sBAAsB,MAAM,KAAK,KAAK,EAAE,MAAM,kBAAkB;AACtE,SAAK,iBAAiB;AACtB,SAAK,iBAAiB,oBAAoB;AAC1C,SAAK,qBAAqB,oBAAoB,IAAI,SAAO;AAAA,MACvD,OAAO,GAAG,aAAa,OAAO,KAAK;AAAA,MACnC,MAAM,GAAG,aAAa,MAAM,KAAK;AAAA,MACjC,UAAU,GAAG,aAAa,UAAU;AAAA,IACtC,EAAE;AAEF,eAAW,MAAM,OAAO;AACtB,UAAI,oBAAoB,SAAS,EAAE,GAAG;AACpC,WAAG,aAAa,UAAU,EAAE;AAAA,MAC9B,OAAO;AACL,WAAG,gBAAgB,QAAQ;AAAA,MAC7B;AAAA,IACF;AAEA,SAAK,aAAa;AAAA,EACpB;AAAA,EAEQ,mBAAmB,GAAU;AACnC,UAAM,OAAO,EAAE;AACf,eAAW,MAAM,KAAK,iBAAiB,EAAE,SAAS,KAAK,CAAC,GAAG;AACzD,YAAM,MAAO,GAAmB,QAAQ,YAAY;AACpD,YAAM,aACJ,QAAQ,qBAAqB,UAC7B,QAAQ,uBAAuB,YAC/B,QAAQ,yBAAyB,cACjC,QAAQ,uBAAuB,YAC/B,QAAQ,4BAA4B,iBACpC;AACF,UAAK,GAAmB,SAAS,YAAY;AAC3C,QAAC,GAAmB,OAAO;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,IAAY,cAAsB;AAChC,QAAI,KAAK,gBAAgB,OAAQ,QAAO;AACxC,WAAO,SAAS,KAAK,WAAW;AAAA,EAClC;AAAA,EAEQ,mBAAmB;AACzB,SAAK,aAAa,CAAC,KAAK;AACxB,UAAM,SAAS,EAAE,MAAM,KAAK,WAAW;AACvC,SAAK;AAAA,MACH,IAAI,YAAY,mBAAmB,EAAE,QAAQ,SAAS,MAAM,UAAU,KAAK,CAAC;AAAA,IAC9E;AACA,SAAK;AAAA,MACH,IAAI,YAAY,0BAA0B,EAAE,QAAQ,SAAS,MAAM,UAAU,KAAK,CAAC;AAAA,IACrF;AAAA,EACF;AAAA,EAEA,SAAS;AACP,UAAM,cAAc,CAAC,UAAU,KAAK,WAAW,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AACzE,UAAM,YAAY,KAAK,aAAa,eAAe;AAEnD,WAAO;AAAA;AAAA,+CAEoC,KAAK,kBAAkB;AAAA;AAAA;AAAA,qBAGjD,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2CAMW,KAAK,WAAW;AAAA,cAC7C,KAAK,iBAAiB,IAAI;AAAA;AAAA;AAAA,oBAGpB,KAAK,mBAAmB,IAAI,UAAQ;AAAA;AAAA,8BAE1B,KAAK,KAAK;AAAA,6BACX,KAAK,IAAI;AAAA,kCACJ,KAAK,QAAQ;AAAA;AAAA,mBAE5B,CAAC;AAAA;AAAA;AAAA,gBAGJ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAcN,KAAK,iBACH;AAAA;AAAA;AAAA,iCAGiB,SAAS;AAAA,oCACN,KAAK,UAAU;AAAA;AAAA,6BAEtB,KAAK,gBAAgB;AAAA;AAAA,sBAE5B,KAAK,aACH,kEACA,mEAAsD;AAAA;AAAA,oBAG9D,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAMU,KAAK,aAAa,SAAS,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAMjD,KAAK,mBAAmB,SAAS,IAAI;AAAA;AAAA,cAEjC,KAAK,mBAAmB,IAAI,UAAQ;AAAA;AAAA,8CAEJ,KAAK,WAAW,aAAa,EAAE;AAAA,uBACtD,KAAK,IAAI;AAAA,iCACC,KAAK,QAAQ;AAAA,iBAC7B,KAAK,KAAK;AAAA,aACd,CAAC;AAAA;AAAA,YAEF,IAAI;AAAA;AAAA;AAAA,EAGd;AACF;AArZa,UA8BJ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA5B2B;AAAA,MAA1C,8BAAS,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,GAF9B,UAEgC;AAGC;AAAA,MAA3C,8BAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAL/B,UAKiC;AAGA;AAAA,MAA3C,8BAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAR/B,UAQiC;AAGA;AAAA,MAA3C,8BAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAX/B,UAWiC;AAGA;AAAA,MAA3C,8BAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAd/B,UAciC;AAMhB;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GApBf,UAoBiB;AAGX;AAAA,MAAhB,2BAAM;AAAA,GAvBI,UAuBM;AACA;AAAA,MAAhB,2BAAM;AAAA,GAxBI,UAwBM;AAxBN,YAAN;AAAA,MADN,mCAAc,YAAY;AAAA,GACd;;;AOrCb,IAAAC,eAAsC;AACtC,IAAAC,sBAA+C;AAG/C,IAAAC,mBAAO;AACP,IAAAC,mBAAO;AAsBA,IAAM,gBAAN,cAA4B,wBAAW;AAAA,EAAvC;AAAA;AAQuC,kBAAS;AAGT,oBAAW;AAGX,sBAAa;AAGb,gBAAO;AAM1C,SAAQ,eAAe;AA6IhC,SAAQ,sBAAsB,CAAC,MAAkB;AAC/C,UAAI,CAAC,KAAK,KAAM;AAChB,YAAM,OAAO,EAAE,aAAa;AAC5B,UAAI,CAAC,KAAK,SAAS,IAAI,GAAG;AACxB,aAAK,SAAS,KAAK;AAAA,MACrB;AAAA,IACF;AAEA,SAAQ,oBAAoB,CAAC,MAAqB;AAChD,UAAI,EAAE,QAAQ,YAAY,KAAK,MAAM;AACnC,aAAK,SAAS,KAAK;AACnB,QAAC,KAAK,YAAY,cAAc,UAAU,GAAmB,MAAM;AAAA,MACrE;AAAA,IACF;AAAA;AAAA,EAzBA,oBAAoB;AAClB,UAAM,kBAAkB;AACxB,aAAS,iBAAiB,SAAS,KAAK,mBAAmB;AAC3D,aAAS,iBAAiB,WAAW,KAAK,iBAAiB;AAAA,EAC7D;AAAA,EAEA,uBAAuB;AACrB,UAAM,qBAAqB;AAC3B,aAAS,oBAAoB,SAAS,KAAK,mBAAmB;AAC9D,aAAS,oBAAoB,WAAW,KAAK,iBAAiB;AAAA,EAChE;AAAA,EAiBQ,SAAS,OAAgB;AAC/B,SAAK,OAAO;AACZ,SAAK;AAAA,MACH,IAAI,YAAY,cAAc;AAAA,QAC5B,QAAQ,EAAE,MAAM,KAAK,MAAM,OAAO,KAAK,MAAM;AAAA,QAC7C,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,oBAAoB,GAAe;AACzC,QAAI,KAAK,UAAU;AACjB,QAAE,eAAe;AACjB;AAAA,IACF;AAEA,QAAI,KAAK,cAAc,KAAK,cAAc;AACxC,QAAE,eAAe;AACjB,WAAK,SAAS,CAAC,KAAK,IAAI;AACxB;AAAA,IACF;AAEA,QAAI,CAAC,KAAK,MAAM;AACd,QAAE,eAAe;AAAA,IACnB;AAEA,SAAK;AAAA,MACH,IAAI,YAAY,cAAc;AAAA,QAC5B,QAAQ,EAAE,OAAO,KAAK,OAAO,OAAO,KAAK,MAAM;AAAA,QAC/C,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAGA,SAAK;AAAA,MACH,IAAI,YAAY,kBAAkB;AAAA,QAChC,QAAQ,EAAE,OAAO,KAAK,OAAO,OAAO,KAAK,MAAM;AAAA,QAC/C,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,YAAY,GAAU;AAC5B,UAAM,OAAO,EAAE;AACf,eAAW,MAAM,KAAK,iBAAiB,EAAE,SAAS,KAAK,CAAC,GAAG;AACzD,YAAM,aAAc,GAAmB,QAAQ,YAAY,MAAM,wBAAwB,aAAa;AACtG,UAAK,GAAmB,SAAS,YAAY;AAC3C,QAAC,GAAmB,OAAO;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,0BAA0B,GAAU;AAC1C,UAAM,OAAO,EAAE;AACf,UAAM,QAAQ,KAAK,iBAAiB;AACpC,SAAK,eAAe,MAAM,SAAS;AAAA,EACrC;AAAA,EAEA,SAAS;AACP,UAAM,SAAS,CAAC,CAAC,KAAK,QAAQ,CAAC,KAAK;AACpC,UAAM,cAAc,KAAK,cAAc,KAAK;AAC5C,UAAM,cAAc,KAAK,SAAS,SAAS;AAC3C,UAAM,eAAe,cAAe,KAAK,OAAO,SAAS,UAAW;AACpE,UAAM,eAAe,cAAc,SAAS;AAE5C,UAAM,iBAAiB;AAAA;AAAA,cAEb,KAAK,SAAS,EAAE;AAAA;AAAA,QAEtB,cACE;AAAA;AAAA,qBAGA,IAAI;AAAA;AAGV,UAAM,UAAU,SACZ;AAAA;AAAA;AAAA,mBAGW,KAAK,IAAK;AAAA,2BACF,WAAqB;AAAA,4BACpB,YAAsB;AAAA,4BACtB,YAAsB;AAAA,qBAC7B,KAAK,mBAAmB;AAAA;AAAA,cAE/B,cAAc;AAAA;AAAA,YAGpB;AAAA;AAAA;AAAA;AAAA,wBAIgB,KAAK,QAAQ;AAAA,2BACV,WAAqB;AAAA,4BACpB,YAAsB;AAAA,4BACtB,YAAsB;AAAA,qBAC7B,KAAK,mBAAmB;AAAA;AAAA,cAE/B,cAAc;AAAA;AAAA;AAIxB,WAAO;AAAA;AAAA,+CAEoC,KAAK,WAAW;AAAA;AAAA,QAEvD,OAAO;AAAA;AAAA,4CAE6B,KAAK,yBAAyB;AAAA;AAAA;AAAA,EAGxE;AACF;AAvSa,cAyBJ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAvBY;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAFf,cAEiB;AAGA;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GALf,cAKiB;AAGgB;AAAA,MAA3C,8BAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAR/B,cAQiC;AAGA;AAAA,MAA3C,8BAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAX/B,cAWiC;AAGA;AAAA,MAA3C,8BAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAd/B,cAciC;AAGA;AAAA,MAA3C,8BAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAjB/B,cAiBiC;AAGhB;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GApBf,cAoBiB;AAGX;AAAA,MAAhB,2BAAM;AAAA,GAvBI,cAuBM;AAvBN,gBAAN;AAAA,MADN,mCAAc,iBAAiB;AAAA,GACnB;;;AC3Bb,IAAAC,eAAsC;AACtC,IAAAC,sBAAwC;AACxC,IAAAC,mBAAO;AAgBA,IAAM,mBAAN,cAA+B,wBAAW;AAAA,EAA1C;AAAA;AAEsC,gBAA0B;AAY1B,kBAA2B;AAG1B,mBAAU;AAAA;AAAA,EAqItD,SAAS;AACP,QAAI,KAAK,SAAS,WAAW;AAC3B,aAAO,KAAK,eAAe;AAAA,IAC7B;AACA,WAAO,KAAK,cAAc;AAAA,EAC5B;AAAA,EAEQ,gBAAgB;AACtB,WAAO;AAAA;AAAA;AAAA,eAGI,KAAK,YAAY,EAAE;AAAA,eACnB,KAAK,UAAU,OAAO,IAAI;AAAA,aAC5B,KAAK,UAAU,CAAC;AAAA;AAAA,QAErB,CAAC,KAAK,YAAY,KAAK,QAAQ,KAAK,YAClC;AAAA;AAAA,gBAEM,KAAK,OAAO,uCAA0B,KAAK,IAAI,YAAY,IAAI;AAAA,gBAC/D,KAAK,WAAW,2CAA8B,KAAK,QAAQ,YAAY,IAAI;AAAA;AAAA,cAGjF,IAAI;AAAA;AAAA,EAEZ;AAAA,EAEQ,YAAoB;AAC1B,UAAM,MAA8B;AAAA,MAClC,MAAU;AAAA,MACV,UAAU;AAAA,MACV,QAAU;AAAA,MACV,QAAU;AAAA,MACV,SAAU;AAAA,IACZ;AACA,WAAO,IAAI,KAAK,MAAM,KAAK;AAAA,EAC7B;AAAA,EAEQ,iBAAiB;AACvB,UAAM,cAAc,KAAK,OAAO,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,OAAO,MAAM,CAAC;AAE7E,WAAO;AAAA,yDAC8C,KAAK,QAAQ,SAAS,MAAM,WAAW;AAAA;AAAA;AAAA,iBAG/E,KAAK,YAAY,EAAE;AAAA;AAAA,eAErB,KAAK,UAAU,CAAC;AAAA;AAAA;AAAA,YAGnB,KAAK,OAAO,uCAA0B,KAAK,IAAI,YAAY,IAAI;AAAA,uCACpC,WAAW;AAAA,YACtC,KAAK,WAAW,2CAA8B,KAAK,QAAQ,YAAY,IAAI;AAAA;AAAA;AAAA;AAAA,EAIrF;AACF;AA9Ma,iBAmBJ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAjB2B;AAAA,MAA1C,8BAAS,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,GAF9B,iBAEgC;AAGf;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GALf,iBAKiB;AAGA;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GARf,iBAQiB;AAGA;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAXf,iBAWiB;AAGe;AAAA,MAA1C,8BAAS,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,GAd9B,iBAcgC;AAGC;AAAA,MAA3C,8BAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAjB/B,iBAiBiC;AAjBjC,mBAAN;AAAA,MADN,mCAAc,oBAAoB;AAAA,GACtB;;;AClBb,IAAAC,eAAsC;AACtC,IAAAC,sBAAsD;AAK/C,IAAM,SAAN,cAAqB,wBAAW;AAAA,EAAhC;AAAA;AACsC,iBAAQ;AACvB,kBAAS;AACgB,qBAAY;AACrC,uBAAc;AACd,gBAAgB;AACf,gBAAO;AACQ,oBAAW;AACX,oBAAW;AAC1B,oBAAW;AACZ,gBAAsB;AACtB,wBAAe;AACf,qBAAuC;AACvC,mBAAyB;AACA,qBAA2B;AACpC,mBAAU;AACI,yBAAgB;AAC9C,gBAA2B;AAE9C,SAAQ,QAAkB,CAAC;AAGpC,SAAQ,sBAAsB;AAAA;AAAA,EA6H9B,oBAAoB;AAClB,UAAM,kBAAkB;AACxB,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEA,QAAQ,mBAAqC;AAC3C,UAAM,QAAQ,iBAAiB;AAG/B,QAAI,kBAAkB,IAAI,OAAO,KAAK,CAAC,KAAK,qBAAqB;AAC/D,WAAK,mBAAmB;AAAA,IAC1B;AAEA,QAAI,kBAAkB,IAAI,QAAQ,GAAG;AACnC,WAAK,gBAAgB;AAAA,IACvB;AAAA,EACF;AAAA,EAEQ,kBAAkB;AACxB,SAAK,QAAQ,IAAI,MAAM,KAAK,MAAM,EAAE,KAAK,EAAE;AAC3C,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEQ,qBAAqB;AAC3B,UAAM,QAAQ,KAAK,MAAM,MAAM,EAAE,EAAE,MAAM,GAAG,KAAK,MAAM;AACvD,SAAK,QAAQ,IAAI,MAAM,KAAK,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,CAAC,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE;AAAA,EAC3E;AAAA,EAEQ,cAAc;AACpB,SAAK,sBAAsB;AAC3B,UAAM,WAAW,KAAK,MAAM,KAAK,EAAE;AACnC,SAAK,QAAQ;AAGb,QAAI,KAAK,aAAa;AACpB,WAAK,YAAY,QAAQ;AAAA,IAC3B;AAEA,SAAK,cAAc;AAGnB,eAAW,MAAM;AACf,WAAK,sBAAsB;AAAA,IAC7B,GAAG,CAAC;AAEJ,UAAM,WAAW,SAAS,WAAW,KAAK,UAAU,KAAK,aAAa,QAAQ;AAE9E,SAAK;AAAA,MACH,IAAI,YAAY,cAAc;AAAA,QAC5B,QAAQ,EAAE,OAAO,UAAU,SAAS;AAAA,QACpC,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAEA,QAAI,UAAU;AACZ,WAAK;AAAA,QACH,IAAI,YAAY,gBAAgB;AAAA,UAC9B,QAAQ,EAAE,OAAO,SAAS;AAAA,UAC1B,SAAS;AAAA,UACT,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,YAAY,MAAuB;AACzC,QAAI,KAAK,SAAS,WAAW;AAC3B,aAAO,OAAO,KAAK,IAAI;AAAA,IACzB,OAAO;AACL,aAAO,gBAAgB,KAAK,IAAI;AAAA,IAClC;AAAA,EACF;AAAA,EAEQ,aAAa,OAAwB;AAC3C,QAAI,KAAK,SAAS,WAAW;AAC3B,aAAO,QAAQ,KAAK,KAAK;AAAA,IAC3B,OAAO;AACL,aAAO,iBAAiB,KAAK,KAAK;AAAA,IACpC;AAAA,EACF;AAAA,EAEQ,uBAA+B;AAErC,UAAM,aAAa,KAAK,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;AACjD,WAAO,cAAc,IAAI,aAAa,KAAK,SAAS;AAAA,EACtD;AAAA,EAEQ,kBAAkB,GAAiB;AACzC,QAAI,KAAK,YAAY,KAAK,SAAU;AAEpC,UAAM,QAAQ,EAAE;AAChB,UAAM,cAAc,SAAS,MAAM,QAAQ,SAAS,KAAK,EAAE;AAC3D,UAAM,oBAAoB,KAAK,qBAAqB;AAGpD,QAAI,cAAc,mBAAmB;AACnC,QAAE,eAAe;AACjB,WAAK,UAAU,iBAAiB;AAAA,IAClC;AAAA,EACF;AAAA,EAEQ,YAAY,GAAU;AAC5B,QAAI,KAAK,YAAY,KAAK,SAAU;AAEpC,UAAM,QAAQ,EAAE;AAChB,UAAM,QAAQ,SAAS,MAAM,QAAQ,SAAS,KAAK,EAAE;AACrD,QAAI,aAAa,MAAM;AAGvB,QAAI,WAAW,SAAS,GAAG;AACzB,WAAK,iBAAiB,YAAY,KAAK;AACvC;AAAA,IACF;AAGA,UAAM,OAAO,WAAW,MAAM,EAAE;AAEhC,QAAI,QAAQ,CAAC,KAAK,YAAY,IAAI,GAAG;AAEnC,YAAM,QAAQ,KAAK,MAAM,KAAK,KAAK;AACnC;AAAA,IACF;AAGA,SAAK,MAAM,KAAK,IAAI;AACpB,UAAM,QAAQ;AAEd,SAAK,YAAY;AAGjB,QAAI,QAAQ,QAAQ,KAAK,SAAS,GAAG;AACnC,WAAK,UAAU,QAAQ,CAAC;AAAA,IAC1B;AAAA,EACF;AAAA,EAEQ,cAAc,GAAkB;AACtC,QAAI,KAAK,YAAY,KAAK,SAAU;AAEpC,UAAM,QAAQ,EAAE;AAChB,UAAM,QAAQ,SAAS,MAAM,QAAQ,SAAS,KAAK,EAAE;AAErD,YAAQ,EAAE,KAAK;AAAA,MACb,KAAK;AACH,UAAE,eAAe;AACjB,YAAI,KAAK,MAAM,KAAK,GAAG;AAErB,eAAK,MAAM,KAAK,IAAI;AACpB,gBAAM,QAAQ;AACd,eAAK,YAAY;AAAA,QACnB,WAAW,QAAQ,GAAG;AAEpB,eAAK,MAAM,QAAQ,CAAC,IAAI;AACxB,eAAK,YAAY;AACjB,eAAK,UAAU,QAAQ,CAAC;AAAA,QAC1B;AACA;AAAA,MAEF,KAAK;AACH,UAAE,eAAe;AACjB,aAAK,MAAM,KAAK,IAAI;AACpB,cAAM,QAAQ;AACd,aAAK,YAAY;AACjB;AAAA,MAEF,KAAK;AACH,UAAE,eAAe;AACjB,YAAI,QAAQ,GAAG;AACb,eAAK,UAAU,QAAQ,CAAC;AAAA,QAC1B;AACA;AAAA,MAEF,KAAK;AACH,UAAE,eAAe;AACjB,YAAI,QAAQ,KAAK,SAAS,GAAG;AAC3B,eAAK,UAAU,QAAQ,CAAC;AAAA,QAC1B;AACA;AAAA,MAEF,KAAK;AACH,UAAE,eAAe;AACjB,aAAK,UAAU,CAAC;AAChB;AAAA,MAEF,KAAK;AACH,UAAE,eAAe;AACjB,aAAK,UAAU,KAAK,SAAS,CAAC;AAC9B;AAAA,MAEF,KAAK;AAAA,MACL,KAAK;AACH,UAAE,eAAe;AACjB;AAAA,IACJ;AAAA,EACF;AAAA,EAEQ,YAAY,GAAmB;AACrC,QAAI,KAAK,YAAY,KAAK,SAAU;AAEpC,MAAE,eAAe;AAEjB,UAAM,QAAQ,EAAE;AAChB,UAAM,QAAQ,SAAS,MAAM,QAAQ,SAAS,KAAK,EAAE;AACrD,UAAM,aAAa,EAAE,eAAe,QAAQ,MAAM,KAAK;AAEvD,SAAK,iBAAiB,YAAY,KAAK;AAAA,EACzC;AAAA,EAEQ,iBAAiB,MAAc,YAAoB;AAEzD,UAAM,aAAa,KAAK,MAAM,EAAE,EAAE,OAAO,CAAC,SAAS,KAAK,YAAY,IAAI,CAAC;AAGzE,QAAI,cAAc;AAClB,eAAW,QAAQ,CAAC,SAAS;AAC3B,UAAI,cAAc,KAAK,QAAQ;AAC7B,aAAK,MAAM,WAAW,IAAI;AAC1B;AAAA,MACF;AAAA,IACF,CAAC;AAED,SAAK,YAAY;AAGjB,UAAM,iBAAiB,KAAK,MAAM,UAAU,CAAC,GAAG,MAAM,KAAK,cAAc,CAAC,CAAC;AAC3E,QAAI,kBAAkB,GAAG;AACvB,WAAK,UAAU,cAAc;AAAA,IAC/B,OAAO;AACL,WAAK,UAAU,KAAK,IAAI,aAAa,KAAK,SAAS,CAAC,CAAC;AAAA,IACvD;AAAA,EACF;AAAA,EAEQ,YAAY,GAAe;AACjC,UAAM,QAAQ,EAAE;AAChB,UAAM,OAAO;AAAA,EACf;AAAA,EAEQ,aAAa;AAAA,EACrB;AAAA,EAEQ,UAAU,OAAe;AAC/B,QAAI,QAAQ,KAAK,SAAS,KAAK,OAAQ;AAEvC,UAAM,QAAQ,KAAK,WAAW;AAAA,MAC5B,qBAAqB,KAAK;AAAA,IAC5B;AAEA,QAAI,OAAO;AACT,YAAM,MAAM;AACZ,YAAM,OAAO;AAAA,IACf;AAAA,EACF;AAAA,EAEQ,eAAuB;AAC7B,QAAI,KAAK,UAAW,QAAO,KAAK;AAChC,WAAO,KAAK,SAAS,YAAY,YAAY;AAAA,EAC/C;AAAA,EAEQ,aAAa,OAAuB;AAC1C,UAAM,QAAQ,KAAK;AACnB,UAAM,WAAW,QAAQ;AACzB,UAAM,QAAQ,KAAK,SAAS,YAAY,UAAU;AAClD,WAAO,GAAG,KAAK,IAAI,QAAQ,OAAO,KAAK;AAAA,EACzC;AAAA,EAEQ,YAAwB;AAC9B,UAAM,SAAqB,CAAC;AAC5B,QAAI,KAAK,aAAa,KAAK,CAAC,KAAK,eAAe;AAE9C,aAAO,KAAK,MAAM,KAAK,EAAE,QAAQ,KAAK,OAAO,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;AAAA,IAC9D,OAAO;AAEL,eAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,KAAK,WAAW;AACpD,eAAO;AAAA,UACL,MAAM;AAAA,YACJ,EAAE,QAAQ,KAAK,IAAI,KAAK,WAAW,KAAK,SAAS,CAAC,EAAE;AAAA,YACpD,CAAC,GAAG,MAAM,IAAI;AAAA,UAChB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,SAAS;AACP,UAAM,SAAS,KAAK,UAAU;AAE9B,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA,sBAKW,KAAK,aAAa,yBAAyB;AAAA,UACvD,OAAO;AAAA,MACP,CAAC,OAAO,eAAe;AAAA;AAAA,gBAEjB,MAAM;AAAA,QACN,CAAC,UAAU;AAAA;AAAA;AAAA;AAAA,kCAIO,KAAK;AAAA,4BACX,KAAK,OAAO,aAAa,MAAM;AAAA,iCAC1B,KAAK,aAAa,CAAC;AAAA;AAAA,+BAErB,KAAK,WAAW,EAAE;AAAA,mCACd,KAAK,WAAW;AAAA;AAAA,8BAErB,KAAK,MAAM,KAAK,KAAK,EAAE;AAAA,iCACpB,KAAK,QAAQ;AAAA,iCACb,KAAK,QAAQ;AAAA,iCACb,KAAK,YAAY,UAAU,CAAC;AAAA,kCAC3B,KAAK,aAAa,KAAK,CAAC;AAAA,oCACtB,KAAK,iBAAiB;AAAA,8BAC5B,KAAK,WAAW;AAAA,gCACd,KAAK,aAAa;AAAA,8BACpB,KAAK,WAAW;AAAA,8BAChB,KAAK,WAAW;AAAA,6BACjB,KAAK,UAAU;AAAA;AAAA;AAAA,MAG9B,CAAC;AAAA;AAAA,cAED,aAAa,OAAO,SAAS,IAC3B,yEACA,EAAE;AAAA;AAAA,IAEV,CAAC;AAAA;AAAA,UAEC,KAAK,OACH;AAAA;AAAA;AAAA;AAAA,sBAIU,KAAK,IAAI;AAAA,wBACP,KAAK,KAAK;AAAA,kBAEtB,EAAE;AAAA;AAAA;AAAA,EAGZ;AACF;AAxea,OAwBJ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAvB2B;AAAA,MAA1C,8BAAS,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,GAD9B,OACgC;AACf;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAFf,OAEiB;AACyB;AAAA,MAApD,8BAAS,EAAE,MAAM,QAAQ,WAAW,aAAa,CAAC;AAAA,GAHxC,OAG0C;AACzB;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAJf,OAIiB;AACA;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GALf,OAKiB;AACC;AAAA,MAA5B,8BAAS,EAAE,MAAM,QAAQ,CAAC;AAAA,GANhB,OAMkB;AACe;AAAA,MAA3C,8BAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAP/B,OAOiC;AACA;AAAA,MAA3C,8BAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAR/B,OAQiC;AACf;AAAA,MAA5B,8BAAS,EAAE,MAAM,QAAQ,CAAC;AAAA,GAThB,OASkB;AACD;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAVf,OAUiB;AACA;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAXf,OAWiB;AACA;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAZf,OAYiB;AACA;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAbf,OAaiB;AACyB;AAAA,MAApD,8BAAS,EAAE,MAAM,QAAQ,WAAW,aAAa,CAAC;AAAA,GAdxC,OAc0C;AACT;AAAA,MAA3C,8BAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAf/B,OAeiC;AACc;AAAA,MAAzD,8BAAS,EAAE,MAAM,SAAS,WAAW,iBAAiB,CAAC;AAAA,GAhB7C,OAgB+C;AAC9B;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAjBf,OAiBiB;AAEX;AAAA,MAAhB,2BAAM;AAAA,GAnBI,OAmBM;AACe;AAAA,MAA/B,2BAAM,eAAe;AAAA,GApBX,OAoBqB;AApBrB,SAAN;AAAA,MADN,mCAAc,SAAS;AAAA,GACX;;;ACNb,IAAAC,eAAsC;AACtC,IAAAC,sBAA+C;AAC/C,IAAAC,mBAAO;AAGA,IAAM,gBAAN,cAA4B,wBAAW;AAAA,EAAvC;AAAA;AAGL,gBAA8C;AAKlB,uBAAc;AAEd,sBAAa;AAEb,sBAAa;AAEb,mBAAU;AAET,qBAAY;AACG,oBAAW;AAC3B,wBAAe;AACf,qBAAY;AAE/B,SAAQ,cAAc;AAAA;AAAA,EAsP/B,oBAAoB;AAClB,UAAM,kBAAkB;AACxB,UAAM,iBAAiB,KAAK,aAAa,aAAa;AACtD,QAAI,eAAgB,MAAK,aAAa,OAAO,cAAc;AAC3D,UAAM,WAAW,KAAK,aAAa,MAAM;AACzC,QAAI,SAAU,MAAK,OAAO,OAAO,QAAQ;AACzC,UAAM,kBAAkB,KAAK,aAAa,cAAc;AACxD,QAAI,gBAAiB,MAAK,cAAc,OAAO,eAAe;AAC9D,UAAM,iBAAiB,KAAK,aAAa,aAAa;AACtD,QAAI,eAAgB,MAAK,aAAa,OAAO,cAAc;AAC3D,UAAM,cAAc,KAAK,aAAa,UAAU;AAChD,QAAI,YAAa,MAAK,UAAU,OAAO,WAAW;AAClD,SAAK,cAAc,KAAK,QAAQ,KAAK;AAAA,EACvC;AAAA,EAEA,QAAQ,mBAAyC;AAC/C,QAAI,kBAAkB,IAAI,MAAM,KAAK,KAAK,SAAS,QAAW;AAC5D,WAAK,cAAc,KAAK;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,IAAY,aAAqB;AAC/B,WAAO,KAAK,QAAQ,KAAK;AAAA,EAC3B;AAAA,EAEA,IAAY,qBAA6B;AACvC,QAAI,KAAK,aAAa,EAAG,QAAO,KAAK;AACrC,QAAI,KAAK,aAAa,KAAK,KAAK,UAAU,GAAG;AAC3C,aAAO,KAAK,KAAK,KAAK,aAAa,KAAK,OAAO;AAAA,IACjD;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,sBAAgC;AACtC,UAAM,QAAkB,CAAC;AACzB,UAAM,UAAU,KAAK;AACrB,UAAM,QAAQ,KAAK;AACnB,QAAI,SAAS,EAAG,QAAO;AACvB,QAAI,SAAS,GAAG;AACd,eAAS,IAAI,GAAG,KAAK,OAAO,IAAK,OAAM,KAAK,CAAC;AAAA,IAC/C,WAAW,WAAW,GAAG;AACvB,eAAS,IAAI,GAAG,KAAK,GAAG,IAAK,OAAM,KAAK,CAAC;AACzC,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,KAAK;AAAA,IAClB,WAAW,WAAW,QAAQ,GAAG;AAC/B,YAAM,KAAK,CAAC;AACZ,YAAM,KAAK,EAAE;AACb,eAAS,IAAI,QAAQ,GAAG,KAAK,OAAO,IAAK,OAAM,KAAK,CAAC;AAAA,IACvD,OAAO;AACL,YAAM,KAAK,CAAC;AACZ,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,UAAU,CAAC;AACtB,YAAM,KAAK,OAAO;AAClB,YAAM,KAAK,UAAU,CAAC;AACtB,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,KAAK;AAAA,IAClB;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,iBAAiB,SAAiB;AACxC,UAAM,QAAQ,KAAK;AACnB,QAAI,KAAK,YAAY,UAAU,KAAK,UAAU,SAAS,YAAY,KAAK,WAAY;AACpF,QAAI,KAAK,SAAS,OAAW,MAAK,cAAc;AAChD,SAAK;AAAA,MACH,IAAI,YAAY,cAAc;AAAA,QAC5B,QAAQ,EAAE,MAAM,QAAQ;AAAA,QACxB,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,oBAAoB;AAC1B,WAAO;AAAA,EACT;AAAA,EAEQ,qBAAqB;AAC3B,WAAO;AAAA,EACT;AAAA,EAEQ,aAAa,KAAsB;AACzC,UAAM,UAAU,KAAK;AACrB,UAAM,QAAQ,KAAK;AACnB,UAAM,SAAS,QAAQ;AACvB,UAAM,aAAa,SAAS,WAAW,IAAI,WAAW;AACtD,UAAM,aAAa,SAAS,UAAU,IAAI,UAAU;AAEpD,WAAO;AAAA;AAAA;AAAA;AAAA,sBAIW,SAAS,kBAAkB,WAAW;AAAA,qBACvC,UAAU;AAAA,kBACb,MAAM,KAAK,iBAAiB,UAAU,CAAC;AAAA;AAAA,UAE/C,SAAS,KAAK,kBAAkB,IAAI,KAAK,mBAAmB,CAAC;AAAA;AAAA;AAAA,EAGrE;AAAA,EAEQ,iBAAiB;AACvB,UAAM,QAAQ,KAAK,oBAAoB;AACvC,UAAM,UAAU,KAAK;AACrB,UAAM,QAAQ,KAAK;AAEnB,WAAO;AAAA,4DACiD,KAAK,SAAS;AAAA;AAAA,YAE9D,KAAK,aAAa,MAAM,CAAC;AAAA;AAAA,cAEvB,MAAM;AAAA,MAAI,CAAC,MACX,MAAM,KACF,2DACA;AAAA;AAAA;AAAA,uCAGqB,CAAC;AAAA,oCACJ,MAAM,UAAU,SAAS,OAAO;AAAA,8BACtC,MAAM,KAAK,iBAAiB,CAAC,CAAC;AAAA,qBACvC,CAAC;AAAA,IACV,CAAC;AAAA;AAAA,YAED,KAAK,aAAa,MAAM,CAAC;AAAA;AAAA,UAE3B,KAAK,YACH,yDAA4C,OAAO,OAAO,KAAK,YAC/D,IAAI;AAAA;AAAA;AAAA,EAGd;AAAA,EAEQ,gBAAgB;AACtB,UAAM,UAAU,KAAK;AACrB,UAAM,QAAQ,KAAK;AAEnB,WAAO;AAAA,6DACkD,KAAK,SAAS;AAAA,UACjE,KAAK,aAAa,MAAM,CAAC;AAAA,2CACQ,OAAO,OAAO,KAAK;AAAA,UACpD,KAAK,aAAa,MAAM,CAAC;AAAA;AAAA;AAAA,EAGjC;AAAA,EAEQ,kBAAkB;AACxB,UAAM,UAAU,KAAK;AACrB,UAAM,QAAQ,KAAK;AACnB,UAAM,sBAAsB,KAAK,aAAa,IAAI,KAAK,aAAa,QAAQ,KAAK;AACjF,UAAM,SAAS,UAAU,KAAK,KAAK,UAAU;AAC7C,UAAM,MAAM,KAAK,IAAI,UAAU,KAAK,SAAS,mBAAmB;AAEhE,WAAO;AAAA,6DACkD,KAAK,SAAS;AAAA,uCACpC,KAAK,IAAI,GAAG,OAAO,mBAAmB;AAAA;AAAA,YAEjE,KAAK,aAAa,MAAM,CAAC;AAAA,0CACK,OAAO;AAAA,YACrC,KAAK,aAAa,MAAM,CAAC;AAAA;AAAA;AAAA;AAAA,EAInC;AAAA,EAEA,SAAS;AACP,QAAI,KAAK,SAAS,UAAW,QAAO,KAAK,cAAc;AACvD,QAAI,KAAK,SAAS,aAAc,QAAO,KAAK,gBAAgB;AAC5D,WAAO,KAAK,eAAe;AAAA,EAC7B;AACF;AApba,cAuBJ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AApBhB;AAAA,MADC,8BAAS,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,GAF9B,cAGX;AAG4B;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GANf,cAMiB;AAEA;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GARf,cAQiB;AAEA;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAVf,cAUiB;AAEA;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAZf,cAYiB;AAEA;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAdf,cAciB;AAEC;AAAA,MAA5B,8BAAS,EAAE,MAAM,QAAQ,CAAC;AAAA,GAhBhB,cAgBkB;AACe;AAAA,MAA3C,8BAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAjB/B,cAiBiC;AAChB;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAlBf,cAkBiB;AACA;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAnBf,cAmBiB;AAEX;AAAA,MAAhB,2BAAM;AAAA,GArBI,cAqBM;AArBN,gBAAN;AAAA,MADN,mCAAc,gBAAgB;AAAA,GAClB;;;ACLb,IAAAC,eAAsC;AACtC,IAAAC,sBAAsD;AACtD,IAAAC,mBAAO;AAMA,IAAM,aAAN,cAAyB,wBAAW;AAAA,EAApC;AAAA;AAMkD,uBAAc;AACzB,oBAAW;AAE3B,gBAAiB;AACjB,iBAAmB;AACM,sBAAa;AACZ,uBAAc;AAEf,qBAAY;AACR,yBAAgB;AAEzE,+BAAsB;AAMb,SAAQ,eAAe;AACvB,SAAQ,eAAe;AAIhC,SAAQ,YAAgC;AACxC,SAAQ,gBAAoC;AAC5C,SAAQ,WAAW,WAAW,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AAiGjE;AAAA;AAAA;AAAA,SAAQ,oBAAoB,CAAC,MAAoB;AAC/C,UAAI,KAAK,SAAU;AAEnB,YAAM,OAAO,EAAE,aAAa;AAG5B,UAAI,CAAC,KAAK,aAAa,CAAC,KAAK,SAAS,KAAK,SAAS,EAAG;AAGvD,QAAE,eAAe;AACjB,QAAE,gBAAgB;AAElB,WAAK,QAAQ,CAAC,KAAK,UAAU;AAAA,IAC/B;AA+CA,SAAQ,uBAAuB,CAAC,MAAoB;AAClD,UAAI,CAAC,KAAK,WAAY;AAEtB,YAAM,OAAO,EAAE,aAAa;AAE5B,UACE,KAAK,SAAS,IAAI,KACjB,KAAK,aAAa,KAAK,SAAS,KAAK,SAAS,KAC9C,KAAK,kBAAkB,KAAK,SAAS,KAAK,cAAc,GACzD;AACA;AAAA,MACF;AAEA,WAAK,QAAQ,KAAK;AAAA,IACpB;AAEA,SAAQ,YAAY,CAAC,MAAqB;AACxC,UAAI,CAAC,KAAK,WAAY;AAEtB,UAAI,EAAE,QAAQ,YAAY,KAAK,eAAe;AAC5C,UAAE,eAAe;AACjB,aAAK,QAAQ,KAAK;AAAA,MACpB;AAEA,UAAI,KAAK,aAAa,EAAE,QAAQ,OAAO;AACrC,aAAK,cAAc,CAAC;AAAA,MACtB;AAAA,IACF;AAkDA;AAAA;AAAA;AAAA,SAAQ,iBAAiB,MAAM;AAC7B,UAAI,CAAC,KAAK,aAAa,CAAC,KAAK,eAAgB;AAE7C,WAAK,eAAe,aAAa,QAAQ,EAAE;AAE3C,YAAM,IAAI,KAAK,UAAU,sBAAsB;AAC/C,YAAM,IAAI,KAAK,eAAe,sBAAsB;AAEpD,UAAI,MAAM;AACV,UAAI,OAAO;AAEX,UAAI,KAAK,SAAS,OAAO;AACvB,cAAM,EAAE,MAAM,EAAE,SAAS,KAAK;AAC9B,eAAO,EAAE,OAAO,EAAE,QAAQ,IAAI,EAAE,QAAQ;AAAA,MAC1C;AACA,UAAI,KAAK,SAAS,UAAU;AAC1B,cAAM,EAAE,SAAS,KAAK;AACtB,eAAO,EAAE,OAAO,EAAE,QAAQ,IAAI,EAAE,QAAQ;AAAA,MAC1C;AACA,UAAI,KAAK,SAAS,QAAQ;AACxB,cAAM,EAAE,MAAM,EAAE,SAAS,IAAI,EAAE,SAAS;AACxC,eAAO,EAAE,OAAO,EAAE,QAAQ,KAAK;AAAA,MACjC;AACA,UAAI,KAAK,SAAS,SAAS;AACzB,cAAM,EAAE,MAAM,EAAE,SAAS,IAAI,EAAE,SAAS;AACxC,eAAO,EAAE,QAAQ,KAAK;AAAA,MACxB;AAEA,YAAM,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,OAAO,cAAc,EAAE,SAAS,CAAC,CAAC;AAClE,aAAO,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,OAAO,aAAa,EAAE,QAAQ,CAAC,CAAC;AAElE,WAAK,eAAe,OAAO,GAAG,WAAW,IAAI;AAAA,IAC/C;AAAA;AAAA;AAAA;AAAA;AAAA,EAtOA,oBAAoB;AAClB,UAAM,kBAAkB;AACxB,SAAK,eAAe,KAAK,aAAa,IAAI,CAAC,CAAC,KAAK,OAAO,KAAK;AAG7D,SAAK,iBAAiB,eAAe,KAAK,mBAAmB,IAAI;AAAA,EACnE;AAAA,EAEA,uBAAuB;AACrB,UAAM,qBAAqB;AAC3B,SAAK,oBAAoB,eAAe,KAAK,mBAAmB,IAAI;AACpE,SAAK,sBAAsB;AAAA,EAC7B;AAAA,EAEA,eAAe;AAGb,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEA,QAAQ,SAA+B;AACrC,QAAI,QAAQ,IAAI,MAAM,KAAK,KAAK,aAAa,GAAG;AAC9C,WAAK,eAAe,CAAC,CAAC,KAAK;AAAA,IAC7B;AAEA,QAAI,QAAQ,IAAI,cAAc,KAAK,QAAQ,IAAI,MAAM,GAAG;AACtD,WAAK,iBAAiB;AACtB,WAAK,aAAa,KAAK,OAAO,IAAI,KAAK,QAAQ;AAAA,IACjD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMQ,eAAe;AACrB,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,IAAY,aAAa;AACvB,WAAO,KAAK,aAAa,IAAI,CAAC,CAAC,KAAK,OAAO,KAAK;AAAA,EAClD;AAAA,EAEQ,QAAQ,MAAe;AAC7B,QAAI,CAAC,KAAK,aAAa,GAAG;AACxB,WAAK,eAAe;AAAA,IACtB;AAEA,SAAK;AAAA,MACH,IAAI,YAAY,mBAAmB;AAAA,QACjC,QAAQ,EAAE,MAAM,KAAK;AAAA,QACrB,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAyBQ,SAAS;AACf,SAAK,gBACF,SAAS,iBAAiC,KAAK;AAElD,SAAK,mBAAmB;AAExB,0BAAsB,MAAM;AAC1B,WAAK,eAAe;AACpB,WAAK,WAAW;AAAA,IAClB,CAAC;AAAA,EACH;AAAA,EAEQ,UAAU;AAChB,SAAK,sBAAsB;AAC3B,SAAK,aAAa;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAMQ,qBAAqB;AAC3B,QAAI,KAAK,qBAAqB;AAC5B,eAAS,iBAAiB,eAAe,KAAK,oBAAoB;AAAA,IACpE;AAEA,QAAI,KAAK,iBAAiB,KAAK,WAAW;AACxC,eAAS,iBAAiB,WAAW,KAAK,SAAS;AAAA,IACrD;AAEA,WAAO,iBAAiB,UAAU,KAAK,cAAc;AACrD,WAAO,iBAAiB,UAAU,KAAK,gBAAgB,IAAI;AAAA,EAC7D;AAAA,EAEQ,wBAAwB;AAC9B,aAAS,oBAAoB,eAAe,KAAK,oBAAoB;AACrE,aAAS,oBAAoB,WAAW,KAAK,SAAS;AACtD,WAAO,oBAAoB,UAAU,KAAK,cAAc;AACxD,WAAO,oBAAoB,UAAU,KAAK,gBAAgB,IAAI;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAmCQ,aAAa;AACnB,QAAI,CAAC,KAAK,eAAgB;AAE1B,UAAM,YAAY,KAAK,aAAa,KAAK,cAAc;AACvD,QAAI,UAAU,CAAC,GAAG;AAChB,gBAAU,CAAC,EAAE,MAAM;AAAA,IACrB,OAAO;AACL,WAAK,eAAe,MAAM;AAAA,IAC5B;AAAA,EACF;AAAA,EAEQ,eAAe;AACrB,KAAC,KAAK,iBAAiB,KAAK,YAAY,MAAM;AAC9C,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEQ,cAAc,GAAkB;AACtC,UAAM,YAAY,KAAK,aAAa,KAAK,cAAc;AACvD,QAAI,UAAU,WAAW,EAAG;AAE5B,UAAM,QAAQ,UAAU,CAAC;AACzB,UAAM,OAAO,UAAU,UAAU,SAAS,CAAC;AAE3C,QAAI,EAAE,YAAY,SAAS,kBAAkB,OAAO;AAClD,QAAE,eAAe;AACjB,WAAK,MAAM;AAAA,IACb,WAAW,CAAC,EAAE,YAAY,SAAS,kBAAkB,MAAM;AACzD,QAAE,eAAe;AACjB,YAAM,MAAM;AAAA,IACd;AAAA,EACF;AAAA,EAEQ,aAAa,MAAkC;AACrD,WAAO,MAAM;AAAA,MACX,KAAK;AAAA,QACH;AAAA,MACF;AAAA,IACF,EAAE,OAAO,CAAC,OAAO,GAAG,eAAe,GAAG,YAAY;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EA4CQ,oBAAoB,GAAU;AACpC,UAAM,OAAO,EAAE;AACf,UAAM,QAAQ,KAAK,iBAAiB,EAAE,SAAS,KAAK,CAAC,EAAE,CAAC;AACxD,SAAK,YAAY,SAAS;AAC1B,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEQ,mBAAmB;AACzB,QAAI,CAAC,KAAK,UAAW;AACrB,SAAK,UAAU,aAAa,iBAAiB,QAAQ;AACrD,SAAK,UAAU,aAAa,iBAAiB,OAAO,KAAK,UAAU,CAAC;AACpE,SAAK,UAAU,aAAa,iBAAiB,KAAK,QAAQ;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS;AACP,WAAO;AAAA,0BACe,KAAK,mBAAmB;AAAA;AAAA;AAAA,cAGpC,KAAK,QAAQ;AAAA;AAAA,iBAEV,KAAK,YAAY;AAAA,iBACjB,KAAK,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,EAK9B;AACF;AAAA;AAAA;AAAA;AA9Ua,WAoCJ,SAAS;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/B4B;AAAA,MAA3C,8BAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAL/B,WAKiC;AACW;AAAA,MAAtD,8BAAS,EAAE,MAAM,SAAS,WAAW,cAAc,CAAC;AAAA,GAN1C,WAM4C;AACX;AAAA,MAA3C,8BAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAP/B,WAOiC;AAEhB;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GATf,WASiB;AACA;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAVf,WAUiB;AACyB;AAAA,MAApD,8BAAS,EAAE,MAAM,QAAQ,WAAW,aAAa,CAAC;AAAA,GAXxC,WAW0C;AACC;AAAA,MAArD,8BAAS,EAAE,MAAM,QAAQ,WAAW,cAAc,CAAC;AAAA,GAZzC,WAY2C;AAED;AAAA,MAApD,8BAAS,EAAE,MAAM,SAAS,WAAW,YAAY,CAAC;AAAA,GAdxC,WAc0C;AACI;AAAA,MAAxD,8BAAS,EAAE,MAAM,SAAS,WAAW,gBAAgB,CAAC;AAAA,GAf5C,WAe8C;AAEzD;AAAA,MADC,8BAAS,EAAE,MAAM,SAAS,WAAW,sBAAsB,CAAC;AAAA,GAhBlD,WAiBX;AAMiB;AAAA,MAAhB,2BAAM;AAAA,GAvBI,WAuBM;AACA;AAAA,MAAhB,2BAAM;AAAA,GAxBI,WAwBM;AAEkB;AAAA,MAAlC,2BAAM,kBAAkB;AAAA,GA1Bd,WA0BwB;AA1BxB,aAAN;AAAA,MADN,mCAAc,aAAa;AAAA,GACf;;;ACRb,IAAAC,eAAsC;AACtC,IAAAC,sBAAwC;AACxC,IAAAC,mBAAO;AAGA,IAAM,oBAAN,cAAgC,wBAAW;AAAA,EAA3C;AAAA;AACgD,qBAAY;AAAA;AAAA,EA0CjE,SAAS;AACP,WAAO;AAAA,8EACmE,KAAK,SAAS;AAAA;AAAA;AAAA;AAAA,EAI1F;AACF;AAlDa,kBAGJ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAFqC;AAAA,MAApD,8BAAS,EAAE,MAAM,QAAQ,WAAW,aAAa,CAAC;AAAA,GADxC,kBAC0C;AAD1C,oBAAN;AAAA,MADN,mCAAc,qBAAqB;AAAA,GACvB;;;ACLb,IAAAC,eAAsC;AACtC,IAAAC,sBAAwC;AACxC,IAAAC,mBAAO;AASA,IAAM,cAAN,cAA0B,wBAAW;AAAA,EAArC;AAAA;AAEL,gBAAqB;AAGrB,iBAAQ;AAER,SAAQ,SAAS;AACjB,SAAQ,gBAAgB,IAAI,KAAK,KAAK,KAAK;AAAA;AAAA,EAkI3C,IAAY,YAAY;AACtB,WAAO,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,KAAK,CAAC;AAAA,EAC9C;AAAA,EAEQ,0BAA0B;AAChC,WAAO;AAAA;AAAA,yBAEc,KAAK,SAAS;AAAA,gDACS,KAAK,SAAS;AAAA;AAAA;AAAA,EAG5D;AAAA,EAEQ,4BAA4B;AAClC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAKT;AAAA,EAEQ,4BAA4B;AAClC,UAAM,SACJ,KAAK,gBAAiB,KAAK,YAAY,MAAO,KAAK;AAErD,WAAO;AAAA;AAAA;AAAA,2DAGgD,KAAK,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,iBAKrD,KAAK,MAAM;AAAA,gCACI,KAAK,aAAa;AAAA,iCACjB,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,EAKrC;AAAA,EAEQ,8BAA8B;AACpC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcT;AAAA,EAEA,SAAS;AACP,YAAQ,KAAK,MAAM;AAAA,MACjB,KAAK;AACH,eAAO,KAAK,0BAA0B;AAAA,MACxC,KAAK;AACH,eAAO,KAAK,0BAA0B;AAAA,MACxC,KAAK;AACH,eAAO,KAAK,4BAA4B;AAAA,MAC1C;AACE,eAAO,KAAK,wBAAwB;AAAA,IACxC;AAAA,EACF;AACF;AAjNa,YAUJ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AARhB;AAAA,MADC,8BAAS,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,GAD9B,YAEX;AAGA;AAAA,MADC,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAJf,YAKX;AALW,cAAN;AAAA,MADN,mCAAc,cAAc;AAAA,GAChB;;;ACXb,IAAAC,eAAsC;AACtC,IAAAC,sBAAwC;AAKjC,IAAM,oBAAN,cAAgC,wBAAW;AAAA,EAA3C;AAAA;AAKuB,qBAAuC;AAMnE;AAAA;AAAA;AAAA,SAAQ,SAA8B,CAAC;AACvC,SAAQ,UAAgC,CAAC;AACzC,SAAQ,aAAa;AACrB,SAAQ,oBAAoB;AAC5B,SAAQ,kBAAkB;AAC1B,SAAQ,aAAuB,CAAC;AAkHhC;AAAA;AAAA;AAAA,SAAQ,gBAAgB,CAAC,MAAoB;AAC3C,YAAM,SAAS,EAAE,aAAa,EAAE,CAAC;AACjC,UAAI,OAAO,YAAY,uBAAwB;AAE/C,YAAM,SAAS;AACf,YAAM,cAAc,KAAK,QAAQ,QAAQ,MAAM;AAC/C,UAAI,gBAAgB,GAAI;AAExB,QAAE,eAAe;AACjB,WAAK,UAAU,aAAa,CAAC;AAAA,IAC/B;AAiBA,SAAQ,gBAAgB,CAAC,MAAoB;AAC3C,UAAI,CAAC,KAAK,cAAc,KAAK,sBAAsB,GAAI;AAEvD,QAAE,eAAe;AAEjB,YAAM,aAAa,KAAK,cAAc,eAAe,EAAE,UAAU,EAAE;AACnE,YAAM,QAAQ,aAAa,KAAK;AAEhC,WAAK,gBAAgB,KAAK;AAAA,IAC5B;AAEA,SAAQ,cAAc,CAAC,MAAoB;AACzC,UAAI,CAAC,KAAK,WAAY;AAEtB,QAAE,eAAe;AAEjB,YAAM,SAAS,KAAK,QAAQ,KAAK,iBAAiB;AAClD,UAAI,QAAQ;AACV,eAAO,gBAAgB,eAAe;AAAA,MACxC;AAEA,WAAK,aAAa;AAClB,WAAK,oBAAoB;AAEzB,WAAK,sBAAsB;AAG3B,WAAK,oBAAoB,gBAAgB;AAAA,IAC3C;AAqDA;AAAA;AAAA;AAAA,SAAQ,YAAY,CAAC,MAAqB;AACxC,YAAM,SAAS,EAAE,aAAa,EAAE,CAAC;AACjC,UAAI,OAAO,YAAY,uBAAwB;AAE/C,YAAM,SAAS;AACf,YAAM,cAAc,KAAK,QAAQ,QAAQ,MAAM;AAC/C,UAAI,gBAAgB,GAAI;AAExB,YAAM,eAAe,KAAK,cAAc;AACxC,YAAM,OAAO,EAAE,WAAW,IAAI;AAC9B,UAAI,UAAU;AAEd,UAAI,iBAAiB,EAAE,QAAQ,eAAe,EAAE,QAAQ,eAAe;AACrE,UAAE,eAAe;AACjB,cAAM,QAAQ,EAAE,QAAQ,cAAc,CAAC,OAAO;AAC9C,aAAK,oBAAoB,aAAa,KAAK;AAC3C,kBAAU;AAAA,MACZ,WAAW,CAAC,iBAAiB,EAAE,QAAQ,aAAa,EAAE,QAAQ,cAAc;AAC1E,UAAE,eAAe;AACjB,cAAM,QAAQ,EAAE,QAAQ,YAAY,CAAC,OAAO;AAC5C,aAAK,oBAAoB,aAAa,KAAK;AAC3C,kBAAU;AAAA,MACZ;AAEA,UAAI,SAAS;AACX,aAAK,oBAAoB,gBAAgB;AAAA,MAC3C;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAzNA,oBAAoB;AAClB,UAAM,kBAAkB;AACxB,SAAK,iBAAiB,eAAe,KAAK,aAAa;AACvD,SAAK,iBAAiB,WAAW,KAAK,SAAS;AAAA,EACjD;AAAA,EAEA,uBAAuB;AACrB,UAAM,qBAAqB;AAC3B,SAAK,oBAAoB,eAAe,KAAK,aAAa;AAC1D,SAAK,oBAAoB,WAAW,KAAK,SAAS;AAClD,SAAK,sBAAsB;AAAA,EAC7B;AAAA,EAEA,eAAe;AACb,SAAK,iBAAiB;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAMQ,mBAAmB;AAEzB,SAAK,SAAS,MAAM;AAAA,MAClB,KAAK,iBAAiB,8BAA8B;AAAA,IACtD;AACA,SAAK,UAAU,MAAM;AAAA,MACnB,KAAK,iBAAiB,+BAA+B;AAAA,IACvD;AAGA,SAAK,QAAQ,QAAQ,CAAC,QAAQ,QAAQ;AACpC,aAAO,cAAc;AACrB,aAAO,cAAc,KAAK;AAAA,IAC5B,CAAC;AAGD,UAAM,QAAQ,KAAK,sBAAsB;AACzC,SAAK,WAAW,KAAK;AAAA,EACvB;AAAA,EAEQ,wBAAkC;AACxC,UAAM,QAAkB,CAAC;AACzB,QAAI,iBAAiB;AACrB,QAAI,mBAAmB;AAGvB,SAAK,OAAO,QAAQ,CAAC,UAAU;AAC7B,UAAI,MAAM,gBAAgB,QAAW;AACnC,cAAM,KAAK,MAAM,WAAW;AAC5B,0BAAkB,MAAM;AAAA,MAC1B,OAAO;AACL,cAAM,KAAK,CAAC;AACZ;AAAA,MACF;AAAA,IACF,CAAC;AAGD,QAAI,mBAAmB,GAAG;AACxB,YAAM,YAAY,KAAK,IAAI,GAAG,MAAM,cAAc;AAClD,YAAM,WAAW,YAAY;AAC7B,YAAM,QAAQ,CAAC,MAAM,QAAQ;AAC3B,YAAI,SAAS,GAAG;AACd,gBAAM,GAAG,IAAI;AAAA,QACf;AAAA,MACF,CAAC;AAAA,IACH;AAGA,UAAM,QAAQ,MAAM,OAAO,CAAC,KAAK,MAAM,MAAM,GAAG,CAAC;AACjD,QAAI,QAAQ,GAAG;AACb,aAAO,MAAM,IAAI,CAAC,MAAO,IAAI,QAAS,GAAG;AAAA,IAC3C;AAGA,WAAO,KAAK,OAAO,IAAI,MAAM,MAAM,KAAK,OAAO,MAAM;AAAA,EACvD;AAAA,EAkBQ,UAAU,aAAqB,GAAiB;AACtD,SAAK,aAAa;AAClB,SAAK,oBAAoB;AACzB,SAAK,kBAAkB,KAAK,cAAc,eAAe,EAAE,UAAU,EAAE;AACvE,SAAK,aAAa,KAAK,OAAO,IAAI,CAAC,MAAM,EAAE,WAAW;AAEtD,UAAM,SAAS,KAAK,QAAQ,WAAW;AACvC,WAAO,aAAa,iBAAiB,EAAE;AAEvC,SAAK,mBAAmB;AAGxB,IAAC,EAAE,OAAuB,kBAAkB,EAAE,SAAS;AAAA,EACzD;AAAA,EAgCQ,gBAAgB,aAAqB;AAC3C,UAAM,OAAO,KAAK,sBAAsB;AACxC,UAAM,YAAY,KAAK,cAAc,eAAe,KAAK,QAAQ,KAAK;AACtE,UAAM,eAAgB,cAAc,YAAa;AAEjD,UAAM,UAAU,KAAK;AACrB,UAAM,WAAW,KAAK,oBAAoB;AAE1C,QAAI,UAAU,KAAK,YAAY,KAAK,OAAO,OAAQ;AAEnD,UAAM,YAAY,KAAK,OAAO,OAAO;AACrC,UAAM,aAAa,KAAK,OAAO,QAAQ;AAEvC,QAAI,cAAc,KAAK,WAAW,OAAO,IAAI;AAC7C,QAAI,eAAe,KAAK,WAAW,QAAQ,IAAI;AAG/C,kBAAc,KAAK,IAAI,UAAU,SAAS,KAAK,IAAI,UAAU,SAAS,WAAW,CAAC;AAClF,mBAAe,KAAK,IAAI,WAAW,SAAS,KAAK,IAAI,WAAW,SAAS,YAAY,CAAC;AAGtF,UAAM,YAAY,KAAK,WAAW,OAAO,IAAI,KAAK,WAAW,QAAQ;AACrE,UAAM,gBAAgB,cAAc;AACpC,QAAI,kBAAkB,WAAW;AAC/B,YAAM,QAAQ,YAAY;AAC1B,qBAAe;AACf,sBAAgB;AAAA,IAClB;AAGA,UAAM,WAAW,CAAC,GAAG,KAAK,UAAU;AACpC,aAAS,OAAO,IAAI;AACpB,aAAS,QAAQ,IAAI;AAErB,SAAK,WAAW,QAAQ;AAGxB,UAAM,SAAS,KAAK,QAAQ,KAAK,iBAAiB;AAClD,QAAI,QAAQ;AACV,YAAM,eAAgB,cAAc,YAAa;AACjD,aAAO,gBAAgB,YAAY;AAAA,IACrC;AAGA,SAAK,oBAAoB,YAAY;AAAA,EACvC;AAAA,EAmCQ,oBAAoB,aAAqB,cAAsB;AACrE,UAAM,UAAU;AAChB,UAAM,WAAW,cAAc;AAE/B,QAAI,UAAU,KAAK,YAAY,KAAK,OAAO,OAAQ;AAEnD,UAAM,YAAY,KAAK,OAAO,OAAO;AACrC,UAAM,aAAa,KAAK,OAAO,QAAQ;AACvC,UAAM,eAAe,KAAK,OAAO,IAAI,CAAC,MAAM,EAAE,WAAW;AAEzD,QAAI,cAAc,aAAa,OAAO,IAAI;AAC1C,QAAI,eAAe,aAAa,QAAQ,IAAI;AAG5C,kBAAc,KAAK,IAAI,UAAU,SAAS,KAAK,IAAI,UAAU,SAAS,WAAW,CAAC;AAClF,mBAAe,KAAK,IAAI,WAAW,SAAS,KAAK,IAAI,WAAW,SAAS,YAAY,CAAC;AAGtF,UAAM,YAAY,aAAa,OAAO,IAAI,aAAa,QAAQ;AAC/D,UAAM,gBAAgB,cAAc;AACpC,QAAI,kBAAkB,WAAW;AAC/B,YAAM,QAAQ,YAAY;AAC1B,qBAAe;AACf,sBAAgB;AAAA,IAClB;AAGA,UAAM,WAAW,CAAC,GAAG,YAAY;AACjC,aAAS,OAAO,IAAI;AACpB,aAAS,QAAQ,IAAI;AAErB,SAAK,WAAW,QAAQ;AAGxB,UAAM,SAAS,KAAK,QAAQ,WAAW;AACvC,QAAI,QAAQ;AACV,YAAM,eAAgB,cAAc,YAAa;AACjD,aAAO,gBAAgB,YAAY;AAAA,IACrC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMQ,WAAW,OAAiB;AAClC,SAAK,OAAO,QAAQ,CAAC,OAAO,QAAQ;AAClC,YAAM,OAAO,MAAM,GAAG,KAAK;AAC3B,YAAM,cAAc;AACpB,YAAM,MAAM,YAAY,GAAG,IAAI;AAC/B,YAAM,MAAM,WAAW;AACvB,YAAM,MAAM,aAAa;AAAA,IAC3B,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAMQ,oBAAoB,WAAmB;AAC7C,UAAM,QAAQ,KAAK,OAAO,IAAI,CAAC,MAAM,EAAE,WAAW;AAClD,SAAK;AAAA,MACH,IAAI,YAAY,WAAW;AAAA,QACzB,QAAQ;AAAA,UACN,WAAW,KAAK;AAAA,UAChB;AAAA,QACF;AAAA,QACA,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMQ,qBAAqB;AAC3B,aAAS,iBAAiB,eAAe,KAAK,aAAa;AAC3D,aAAS,iBAAiB,aAAa,KAAK,WAAW;AAAA,EACzD;AAAA,EAEQ,wBAAwB;AAC9B,aAAS,oBAAoB,eAAe,KAAK,aAAa;AAC9D,aAAS,oBAAoB,aAAa,KAAK,WAAW;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS;AACP,WAAO;AAAA,EACT;AACF;AAAA;AAAA;AAAA;AAzWa,kBAsBJ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAjBY;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GALf,kBAKiB;AALjB,oBAAN;AAAA,MADN,mCAAc,qBAAqB;AAAA,GACvB;;;ACNb,IAAAC,eAAsC;AACtC,IAAAC,sBAAwC;AAGjC,IAAM,oBAAN,cAAgC,wBAAW;AAAA,EAA3C;AAAA;AAM6C,mBAAU;AACV,mBAAU;AAO5D;AAAA;AAAA;AAAA;AAAA,SAAO,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBrB,SAAS;AACP,WAAO;AAAA,EACT;AACF;AAAA;AAAA;AAAA;AApCa,kBAoBJ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAfsC;AAAA,MAArD,8BAAS,EAAE,MAAM,QAAQ,WAAW,cAAc,CAAC;AAAA,GALzC,kBAK2C;AACJ;AAAA,MAAjD,8BAAS,EAAE,MAAM,QAAQ,WAAW,UAAU,CAAC;AAAA,GANrC,kBAMuC;AACA;AAAA,MAAjD,8BAAS,EAAE,MAAM,QAAQ,WAAW,UAAU,CAAC;AAAA,GAPrC,kBAOuC;AAPvC,oBAAN;AAAA,MADN,mCAAc,qBAAqB;AAAA,GACvB;;;ACJb,IAAAC,eAAsC;AACtC,IAAAC,sBAAwC;AACxC,IAAAC,mBAAO;AAGA,IAAM,qBAAN,cAAiC,wBAAW;AAAA,EAA5C;AAAA;AAKsC,uBAAyC;AAOpF;AAAA;AAAA;AAAA;AAAA,SAAO,cAAc;AAGrB;AAAA,SAAO,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAoFpB,oBAAoB;AAClB,UAAM,kBAAkB;AACxB,SAAK,aAAa,YAAY,GAAG;AACjC,SAAK,aAAa,QAAQ,WAAW;AACrC,SAAK,sBAAsB;AAAA,EAC7B;AAAA,EAEA,QAAQ,SAA+B;AACrC,QAAI,QAAQ,IAAI,aAAa,GAAG;AAC9B,WAAK,sBAAsB;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMQ,wBAAwB;AAC9B,SAAK,aAAa,oBAAoB,KAAK,WAAW;AAAA,EACxD;AAAA,EAEO,gBAAgB,OAAe;AACpC,SAAK,aAAa;AAClB,SAAK,aAAa,iBAAiB,OAAO,KAAK,MAAM,KAAK,CAAC,CAAC;AAC5D,SAAK,aAAa,iBAAiB,GAAG;AACtC,SAAK,aAAa,iBAAiB,KAAK;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS;AACP,WAAO;AAAA,EACT;AACF;AAAA;AAAA;AAAA;AAtIa,mBAqBJ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAhB2B;AAAA,MAA1C,8BAAS,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,GAL9B,mBAKgC;AALhC,qBAAN;AAAA,MADN,mCAAc,sBAAsB;AAAA,GACxB;;;ACLb,IAAAC,eAAsC;AACtC,IAAAC,sBAAwC;AACxC,IAAAC,mBAAO;AAYA,IAAM,qBAAN,cAAiC,wBAAW;AAAA,EAA5C;AAAA;AACsB,mBAA2B,CAAC;AAE3B,kBAAiB;AAEjB,gBAAoB;AAEpB,iBAAsB;AAAA;AAAA,EA4G1C,UAAU,QAAuB;AACvC,QAAI,CAAC,OAAO,UAAU;AACpB,WAAK,SAAS,OAAO;AACrB,WAAK;AAAA,QACH,IAAI,YAAY,WAAW;AAAA,UACzB,QAAQ,EAAE,OAAO,OAAO,MAAM;AAAA,UAC9B,SAAS;AAAA,UACT,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,cAAc,QAAuB;AAC3C,UAAM,WAAW,KAAK,WAAW,OAAO;AACxC,UAAM,UAAU;AAAA,MACd;AAAA,MACA,WAAW,WAAW;AAAA,MACtB,OAAO,WAAW,aAAa;AAAA,IACjC,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,WAAO;AAAA;AAAA,iBAEM,OAAO;AAAA,qBACH,OAAO,QAAQ;AAAA,kBAClB,MAAM,KAAK,UAAU,MAAM,CAAC;AAAA,UACpC,OAAO,KAAK;AAAA;AAAA;AAAA,EAGpB;AAAA,EAEA,SAAS;AACP,UAAM,mBAAmB;AAAA,MACvB;AAAA,MACA,KAAK;AAAA,MACL,SAAS,KAAK,KAAK;AAAA,IACrB,EAAE,KAAK,GAAG;AAEV,WAAO;AAAA,oBACS,gBAAgB;AAAA,UAC1B,KAAK,QAAQ,IAAI,CAAC,WAAW,KAAK,cAAc,MAAM,CAAC,CAAC;AAAA;AAAA;AAAA,EAGhE;AACF;AAjKa,mBASJ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AARW;AAAA,MAA1B,8BAAS,EAAE,MAAM,MAAM,CAAC;AAAA,GADd,mBACgB;AAEC;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAHf,mBAGiB;AAEA;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GALf,mBAKiB;AAEA;AAAA,MAA3B,8BAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAPf,mBAOiB;AAPjB,qBAAN;AAAA,MADN,mCAAc,sBAAsB;AAAA,GACxB;;;ACdb,IAAAC,eAA+D;AAC/D,IAAAC,sBAAsD;AACtD,oBAAuB;AACvB,IAAAC,mBAAO;AACP,IAAAC,mBAAO;AAsBP,SAAS,gBAAgB,GAAmC;AAC1D,MAAI,OAAO,MAAM,SAAU,QAAO,EAAE,OAAO,GAAG,OAAO,GAAG,gBAAgB,GAAG;AAC3E,SAAO,EAAE,OAAO,EAAE,OAAO,OAAO,EAAE,SAAS,EAAE,OAAO,gBAAgB,EAAE,kBAAkB,GAAG;AAC7F;AAGO,IAAM,YAAN,cAAwB,wBAAW;AAAA,EAAnC;AAAA;AACuB,iBAAgB;AAMU,sBAA+B;AAE1D,mBAA0B,CAAC;AAGzB,oBAAoB;AAGrB,oBAAmB;AAGU,0BAA2B,CAAC;AAEzD,iBAAqB;AAES,0BAAyB;AAExC,gBAAmB;AAElC,kBAAuB;AAEC,oBAAmB;AAElB,qBAAoB;AAE7C,uBAAsB;AAEW,6BAA4B;AAE9B,0BAAyB;AAGxB,2BAA0B;AAQjC,oBAAoB;AAEhE,SAAQ,OAAO;AACf,SAAQ,mBAAmB;AAC3B,SAAQ,aAAa;AACrB,SAAQ,cAAc;AACtB,SAAQ,gBAAuC;AAMxD,SAAQ,WAAW,UAAU,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AAqgBhE,SAAQ,uBAAuB,CAAC,MAAoB;AAClD,UAAI,CAAC,KAAK,KAAM;AAChB,YAAM,OAAO,EAAE,aAAa;AAC5B,UAAI,KAAK,SAAS,IAAI,EAAG;AACzB,WAAK,aAAa;AAAA,IACpB;AAOA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAQ,eAAe,CAAC,MAAa;AACnC,UAAI,CAAC,KAAK,KAAM;AAChB,UAAI,EAAE,aAAa,EAAE,CAAC,MAAM,KAAK,UAAW;AAC5C,WAAK,aAAa;AAAA,IACpB;AA0CA,SAAQ,iBAAiB,MAAM;AAC7B,UAAI,CAAC,KAAK,aAAa,CAAC,KAAK,UAAW;AAExC,WAAK,UAAU,aAAa,aAAa,EAAE;AAE3C,YAAM,IAAI,KAAK,UAAU,sBAAsB;AAC/C,YAAM,IAAI,KAAK,UAAU,sBAAsB;AAE/C,UAAI,MAAM,EAAE,SAAS;AACrB,UAAI,MAAM,EAAE,SAAS,OAAO,cAAc,GAAG;AAC3C,cAAM,KAAK,IAAI,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC;AAAA,MACxC;AAOA,UAAI,OAAO,EAAE;AACb,UAAI,OAAO,EAAE,QAAQ,OAAO,aAAa,GAAG;AAC1C,eAAO,KAAK,IAAI,GAAG,OAAO,aAAa,EAAE,QAAQ,CAAC;AAAA,MACpD;AAEA,WAAK,aAAa,OAAO,GAAG,WAAW,IAAI,YAAY,EAAE,KAAK;AAAA,IAChE;AA0DA,SAAQ,gBAAgB,CAAC,MAAkB;AACzC,WAAK,cAAe,EAAE,OAA4B;AAClD,WAAK,mBAAmB,KAAK,gBAAgB,SAAS,IAAI,IAAI;AAC9D,4BAAsB,MAAM,KAAK,eAAe,CAAC;AAAA,IACnD;AAAA;AAAA,EA1MA,uBAAuB;AACrB,UAAM,qBAAqB;AAC3B,SAAK,sBAAsB;AAAA,EAC7B;AAAA,EAEU,WAAW,SAA+B;AAClD,QAAI,QAAQ,IAAI,UAAU,KAAK,KAAK,aAAa,OAAO;AACtD,WAAK,iBAAiB,CAAC;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,IAAY,oBAAwC;AAClD,WAAO,KAAK,QAAQ,IAAI,eAAe;AAAA,EACzC;AAAA;AAAA,EAGA,IAAY,kBAAsC;AAChD,UAAM,OAAO,KAAK;AAClB,QAAI,CAAC,KAAK,YAAa,QAAO;AAC9B,UAAM,IAAI,KAAK,YAAY,YAAY;AACvC,WAAO,KAAK,OAAO,CAAC,MAAM,EAAE,MAAM,YAAY,EAAE,SAAS,CAAC,CAAC;AAAA,EAC7D;AAAA,EAEA,IAAY,WAAoB;AAC9B,WAAO,KAAK,WAAW,KAAK,eAAe,SAAS,IAAI,CAAC,CAAC,KAAK;AAAA,EACjE;AAAA;AAAA,EAGA,IAAY,WAA+B;AACzC,WAAO,KAAK,SAAS,UAAU,OAAO,KAAK,SAAS,UAAU,OAAO;AAAA,EACvE;AAAA;AAAA,EAGA,IAAY,iBAA8B;AACxC,WAAO,KAAK,SAAS,UAAU,OAAO;AAAA,EACxC;AAAA,EAEA,IAAY,kBAA6D;AACvE,UAAM,WAAW,KAAK;AACtB,QAAI,SAAS,WAAW,EAAG,QAAO;AAClC,UAAM,gBAAgB,SAAS,OAAO,CAAC,MAAM,KAAK,eAAe,SAAS,EAAE,KAAK,CAAC,EAAE;AACpF,QAAI,kBAAkB,EAAG,QAAO;AAChC,QAAI,kBAAkB,SAAS,OAAQ,QAAO;AAC9C,WAAO;AAAA,EACT;AAAA,EAEQ,qBAAqB;AAC3B,aAAS,iBAAiB,eAAe,KAAK,oBAAoB;AAClE,WAAO,iBAAiB,UAAU,KAAK,cAAc;AACrD,WAAO,iBAAiB,UAAU,KAAK,cAAc,IAAI;AAAA,EAC3D;AAAA,EAEQ,wBAAwB;AAC9B,aAAS,oBAAoB,eAAe,KAAK,oBAAoB;AACrE,WAAO,oBAAoB,UAAU,KAAK,cAAc;AACxD,WAAO,oBAAoB,UAAU,KAAK,cAAc,IAAI;AAAA,EAC9D;AAAA,EAoBQ,aAAa;AACnB,SAAK;AAAA,MACH,IAAI,YAAY,WAAW;AAAA,QACzB,QAAQ,EAAE,OAAO,KAAK,WAAW,KAAK,iBAAiB,KAAK,SAAS;AAAA,QACrE,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,cAAc;AACpB,QAAI,KAAK,UAAU,cAAc,KAAK,KAAM;AAC5C,SAAK,OAAO;AACZ,SAAK,cAAc;AAInB,SAAK,mBAAmB;AACxB,SAAK,mBAAmB;AACxB,0BAAsB,MAAM;AAC1B,WAAK,eAAe;AAOpB,UAAI,CAAC,KAAK,UAAU;AAClB,aAAK,eAAe,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,MACnD;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,eAAe;AACrB,QAAI,CAAC,KAAK,KAAM;AAChB,SAAK,OAAO;AACZ,SAAK,sBAAsB;AAC3B,SAAK,WAAW,MAAM;AAAA,EACxB;AAAA,EA4BQ,mBAAmB,QAA0B;AACnD,SAAK,WAAW,OAAO;AACvB,QAAI,KAAK,UAAU,QAAS,MAAK,QAAQ;AACzC,SAAK,aAAa;AAClB,SAAK,WAAW;AAAA,EAClB;AAAA,EAEQ,kBAAkB,QAA0B;AAClD,UAAM,MAAM,KAAK,eAAe,QAAQ,OAAO,KAAK;AACpD,SAAK,iBACH,OAAO,IACH,KAAK,eAAe,OAAO,CAAC,MAAM,MAAM,OAAO,KAAK,IACpD,CAAC,GAAG,KAAK,gBAAgB,OAAO,KAAK;AAC3C,QAAI,KAAK,UAAU,QAAS,MAAK,QAAQ;AACzC,SAAK,WAAW;AAAA,EAClB;AAAA,EAEQ,kBAAkB;AACxB,UAAM,WAAW,KAAK;AACtB,UAAM,SAAS,KAAK;AACpB,QAAI,WAAW,WAAW;AACxB,YAAM,iBAAiB,IAAI,IAAI,SAAS,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAC3D,WAAK,iBAAiB,KAAK,eAAe,OAAO,CAAC,MAAM,CAAC,eAAe,IAAI,CAAC,CAAC;AAAA,IAChF,OAAO;AACL,YAAM,QAAQ,SAAS,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,eAAe,SAAS,CAAC,CAAC;AACzF,WAAK,iBAAiB,CAAC,GAAG,KAAK,gBAAgB,GAAG,KAAK;AAAA,IACzD;AACA,QAAI,KAAK,UAAU,QAAS,MAAK,QAAQ;AACzC,SAAK,WAAW;AAAA,EAClB;AAAA,EAEQ,WAAW,OAAe;AAChC,QAAI,KAAK,UAAU,WAAY;AAC/B,SAAK,iBAAiB,KAAK,eAAe,OAAO,CAAC,MAAM,MAAM,KAAK;AACnE,SAAK,WAAW;AAAA,EAClB;AAAA,EAEQ,iBAAiB;AACvB,QAAI,KAAK,KAAM,MAAK,aAAa;AAAA,QAC5B,MAAK,YAAY;AAAA,EACxB;AAAA,EAEQ,iBAAiB,GAAkB;AACzC,QAAI,KAAK,UAAU,WAAY;AAC/B,QAAI,CAAC,KAAK,MAAM;AACd,UAAI,CAAC,aAAa,WAAW,SAAS,GAAG,EAAE,SAAS,EAAE,GAAG,GAAG;AAC1D,UAAE,eAAe;AACjB,aAAK,YAAY;AAAA,MACnB;AACA;AAAA,IACF;AAGA,QAAI,KAAK,SAAU,MAAK,qBAAqB,CAAC;AAAA,EAChD;AAAA,EAQQ,gBAAgB,GAAkB;AACxC,SAAK,qBAAqB,CAAC;AAAA,EAC7B;AAAA,EAEQ,qBAAqB,GAAkB;AAC7C,UAAM,WAAW,KAAK;AACtB,YAAQ,EAAE,KAAK;AAAA,MACb,KAAK;AACH,UAAE,eAAe;AACjB,aAAK,mBAAmB,KAAK,IAAI,SAAS,SAAS,GAAG,KAAK,mBAAmB,CAAC;AAC/E;AAAA,MACF,KAAK;AACH,UAAE,eAAe;AACjB,aAAK,mBAAmB,KAAK,IAAI,GAAG,KAAK,mBAAmB,CAAC;AAC7D;AAAA,MACF,KAAK;AACH,UAAE,eAAe;AACjB,YAAI,KAAK,oBAAoB,KAAK,SAAS,KAAK,gBAAgB,GAAG;AACjE,gBAAM,MAAM,SAAS,KAAK,gBAAgB;AAC1C,cAAI,KAAK,SAAU,MAAK,kBAAkB,GAAG;AAAA,cACxC,MAAK,mBAAmB,GAAG;AAAA,QAClC;AACA;AAAA,MACF,KAAK;AACH,UAAE,eAAe;AACjB,aAAK,aAAa;AAClB;AAAA,MACF,KAAK;AACH,aAAK,aAAa;AAClB;AAAA,IACJ;AAAA,EACF;AAAA,EAEQ,cAAc;AACpB,UAAM,SAAS,KAAK;AACpB,UAAM,UAAU,OAAO,MAAM,GAAG,KAAK,eAAe;AACpD,UAAM,WAAW,OAAO,SAAS,QAAQ;AACzC,UAAM,OAAO,KAAK;AAElB,WAAO;AAAA;AAAA,cAED;AAAA,MACA;AAAA,MACA,CAAC,MAAM;AAAA,MACP,CAAC,MAAM;AACL,cAAM,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC;AAM1C,eAAO;AAAA;AAAA,yBAEM,KAAK,SAAS,CAAC;AAAA;AAAA;AAAA;AAAA,6BAIX,KAAK,UAAU,UAAU;AAAA,yBAC7B,CAAC,MAAa,EAAE,gBAAgB,CAAC;AAAA,2BAC/B,CAAC,MAAa;AACvB,YAAE,gBAAgB;AAClB,eAAK,WAAW,CAAC;AAAA,QACnB,CAAC;AAAA;AAAA;AAAA,MAGP;AAAA,IACF,CAAC;AAAA,UACC,WAAW,IACT,sCAAyB,QAAQ,4DACjC,oBAAO;AAAA;AAAA;AAAA,EAGjB;AAAA,EAEA,SAAS;AACP,UAAM,OAAO,KAAK;AAClB,UAAM,WAAW,KAAK;AACtB,UAAM,aAAa,KAAK,UAAU;AAClC,UAAM,qBAAqB,KAAK,eAAe,cAAc,CAAC,CAAC,KAAK;AAEpE,UAAM,iBAAiB;AAAA,MACrB;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL,UAAU,KAAK,MAAM;AAAA,MACrB,qBAAqB,aAAa;AAAA,MAClC,KAAK,kBAAkB,YAAY,YAAY;AAAA,MAC/C,KAAK,WAAW,cAAc;AAAA,MAC9B,KAAK,OAAO,SAAS;AAAA,IACvB,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,UAAM,YAAY,GAAG,KAAK,QAAQ;AAClC,UAAM,iBACJ,KAAK,QAAQ,KAAK,oBAAoB,IAAI,GAAG,KAAK,QAAQ,WAAW,KAAK,gBAAgB,KAAK;AAEjG,UAAM,iBAAiB,KAAK,KAAK,CAAC,MAAM,EAAE,UAAU,KAAK,QAAQ;AAEjE,WAAO;AAAA,oBACS,cAAc;AAAA,UACxB,CAAC,sBAAsB,KAAK,QAC1B,qDAAwC,KAAK,QAAQ,KAAK,KAAK,KAAK,aACpE,EAAE;AAAA;AAAA;AAAA,YAGF,qBACE,+CAAkC,KAAK,WAAW,mBAAmB,EAAE;AAAA,mBAClE,KAAK,KAAK;AAAA,mBAEf,EAAE;AAAA;AAAA;AAAA,kBAGE,KAAK,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,6BAKF,KAAK,IAAI;AAAA,6BACT,SAAS;AAAA,qCACD,cAAc;AAAA,4BACvB,KAAK,UAAU,OAAO;AAAA,0BACxB,KAAK,SAAS,KAAK,WAAW;AAAA,yBAC/B,UAAU;AAAA,sBACb,KAAK,cAAc;AAAA,wBACjB,KAAK,gBAAgB;AAAA,sBACvB,MAAO,KAAK,gBAAgB,SAAU;AAAA,qBACvC,MAAO,KAAK,gBAAgB,SAAU;AAAA;AAAA,cAE7C,KAAK,WACH,oCAAuB,KAAK,QAAQ,WAAW,KAAK,QAAQ,oCAC5D,EAAE;AAAA;AAAA,cAEJ,KAAK,WACH,KAAK,eAAe,SAAS,IAC3B,+CAAkC,KAAK,YAAY,CAAC,YACpD;AAAA,sDACoC,KAAK,WAAW;AAAA,6BAEtD,8CAAiC,iBAAiB,KAAK,aAAa;AAAA;AAAA,uBAE7D,iBAAiB,eAAe,QAAQ,KAAK,WAAW;AAAA;AAAA,wBAEvD;AAAA;AAAA;AAAA,sBAGF,KAAK,aAAa,cAAc;AAAA,sBAChC,KAAK,QAAQ;AAAA,4BACP,KAAK,YAAY,KAAK,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,UAKjD,KAAK,iBACH,gDAAmC,KAAK,UAAU,UAAU,UAAU,EAAE;AAAA,gBACpE,KAAK,cAAc;AAAA,uBAEvB,EAAE;AAAA;AAAA;AAAA;AAAA,cAIA,SAAS;AAAA;AAAA;AAAA,gCAGS,KAAK,QAAQ;AAAA,sBACvB,KAAK,SAAS,SAAS;AAAA,iBAC5B,KAAK,UAAU;AAAA,sBACV,KAAK,IAAI;AAAA;AAAA,UAErB,CAAC,KAAK,WACJ;AAAA;AAAA,gDAEoC,KAAK,cAAc;AAAA;AAAA;AAAA;AAAA,iCAIlC,KAAK,iBAAiB;AAAA,4BAC3B,KAAK,WAAW;AAAA,4BAChB,KAAK,aAAa;AAAA,8BAChB,CAAC,MAAqB,KAAK,gBAAgB,CAAC,CAAC;AAAA;AAAA;AAAA,sBAI/D,EAAE;AAAA;AAAA,UAEJ,SAAS,WAAW,IAClB;AAAA,gBACI,KAAK,WAAW,IAAI,yBAAyB,kBAAkB;AAAA,sBAEnE,KAAK,WACL;AAAA;AAAA;AAAA,2BAGe,KAAK,cAAc;AAAA,4BAClB,KAAK,eAAe;AAAA,gCAChB,CAAC,MAAa;AAC1B,QAAE,gBAAgB;AAClB,WAAK,gBAAgB;AAAA,IACvB,CAAC;AAAA;AAAA;AAAA;AAAA,sBAID;AAAA,MACA;AAAA,MACA,CAAC,WAAW,OAAO;AAAA,MACnB,CAAC,QAAQ,UAAU;AAAA;AAAA,4BAET,KAAK,QAAQ,WAAW,KAAK;AAAA,+CACV,UAAU,KAAK,mBAAmB,gBAAgB,EAAE;AAAA;AAAA,uCAE5D,KAAK,eAAe,SAAS,OAAO,KAAK,CAAC;AAAA,uCAC1C,MAAO,KAAK,mBAAmB,KAAM;AAAA;AAAA;AAAA,iCAG3C,OAAO,KAAK;AAAA,0CACH,OAAO,cAAc;AAAA,kCAC7B,KAAK,eAAe,SAAS,OAAO,KAAK,IAAI,YAAY,WAAW;AAAA,sCAChE,CAAC,MAAa;AAC1B,UAAE,gBAAgB;AAClB,aAAK,kBAAkB,MAAM;AAAA,MAC/B,CAAC;AAAA;AAAA;AAAA;AAAA,IAIT,CAAC;AAAA;AAAA,gBAGL;AAAA;AAAA,sBAEM;AAAA,MACA;AAAA,MACA,CAAC,WAAW,OAAO;AAAA,MACnB,CAAC,QAAQ,UAAU;AAAA;AAAA,4BAET,KAAK,QAAQ,WAAW,KAAK;AAAA,6CACZ,UAAU,KAAK,mBAAmB,gBAAgB,EAAE;AAAA;AAAA,uCAE1D,OAAO,UAAU,KAAK,QAAQ;AAAA,oCACjC,CAAC,MAAa,EAAE,eAAe,CAAC;AAAA,gCACpC,MAAM,KAAK,mBAAmB,MAAM,CAAC;AAAA,uCAC9B,MAAO,KAAK,mBAAmB,KAAM;AAAA;AAAA,0DAElB,OAAO,KAAK;AAAA,wBAC9C,OAAO,UAAU,KAAK,WACpB,8FACA,EAAE;AAAA;AAAA;AAAA,IAGZ,CAAC;AAAA;AAAA,aAEJ;AAAA;AAAA;AAAA,EAGX;AACF;AAh9Ba,UA6DJ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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","names":["import_vars_v2","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_lit","import_decorators","import_lit","import_decorators","import_rel_icon","import_vars_v2","import_lit","import_decorators","import_rel_icon","import_lit","import_decorators","import_lit","import_decorators","import_lit","import_decorators","import_rel_icon","import_lit","import_decorators","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","updated","import_lit","import_decorators","import_rel_icon","import_lit","import_decorators","import_vars_v2","import_vars_v2","import_lit","import_decorators","import_lit","import_decorators","import_lit","import_decorators","import_vars_v2","import_rel_icon","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_rel_icon","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_lit","import_decorators","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_rel_icon","import_lit","import_decorators","import_lit","import_decorators","import_vars_v2","import_rel_icon","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_rel_icon","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators","import_vars_v2","import_rel_icon","import_lit","import_decorators","import_vars_v2","import_lit","import_decorators"]}