@reliability-design/web 1.0.6 → 1.1.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 (60) hide show
  1. package/dist/components/rel-accordion/rel-accordion.ts +4 -0
  2. package/dist/components/rel-alert/rel-alert.ts +83 -13
  3. package/dist/components/rel-avatar/rel-avatar.ts +3 -2
  4. package/dist/components/rel-badge/rel-badge.ts +6 -2
  5. package/dist/components/rel-button/rel-button.ts +64 -8
  6. package/dist/components/rel-calendar/rel-calendar.ts +3 -3
  7. package/dist/components/rel-carousel/rel-carousel.ts +10 -11
  8. package/dist/components/rel-checkbox/rel-checkbox.ts +33 -2
  9. package/dist/components/rel-chip/rel-chip.ts +63 -5
  10. package/dist/components/rel-divider/rel-divider.ts +9 -0
  11. package/dist/components/rel-drawer/rel-drawer-footer.ts +29 -0
  12. package/dist/components/rel-drawer/rel-drawer.ts +17 -26
  13. package/dist/components/rel-menu/rel-menu.ts +53 -21
  14. package/dist/components/rel-menubar/rel-menubar.ts +52 -23
  15. package/dist/components/rel-nav-menu/rel-nav-menu-item.ts +240 -143
  16. package/dist/components/rel-nav-menu/rel-nav-menu.ts +227 -331
  17. package/dist/components/rel-navbar/rel-navbar.ts +13 -0
  18. package/dist/components/rel-pagination/rel-pagination.ts +11 -6
  19. package/dist/components/rel-popover/rel-popover.ts +16 -13
  20. package/dist/components/rel-radio/rel-radio.ts +18 -1
  21. package/dist/components/rel-resizable/rel-resizable-handle.ts +4 -8
  22. package/dist/components/rel-select/rel-select.ts +14 -0
  23. package/dist/components/rel-sheet/rel-sheet.ts +7 -6
  24. package/dist/components/rel-sidebar/rel-sidebar.ts +13 -5
  25. package/dist/components/rel-slider/rel-slider.ts +25 -2
  26. package/dist/components/rel-snackbar/rel-snackbar.ts +46 -16
  27. package/dist/components/rel-stepper/rel-stepper.ts +32 -21
  28. package/dist/components/rel-switch/rel-switch.ts +19 -6
  29. package/dist/components/rel-tab/rel-tab.ts +49 -15
  30. package/dist/components/rel-table/rel-table-body.ts +5 -0
  31. package/dist/components/rel-table/rel-table-caption.ts +6 -1
  32. package/dist/components/rel-table/rel-table-cell.ts +42 -49
  33. package/dist/components/rel-table/rel-table-footer.ts +5 -0
  34. package/dist/components/rel-table/rel-table-head.ts +13 -1
  35. package/dist/components/rel-table/rel-table-header.ts +5 -0
  36. package/dist/components/rel-table/rel-table-row.ts +7 -3
  37. package/dist/components/rel-table/rel-table.ts +8 -2
  38. package/dist/components/rel-textfield/rel-textfield.ts +20 -20
  39. package/dist/components/rel-toast/rel-toast.ts +31 -10
  40. package/dist/components/rel-tooltip/rel-tooltip.ts +123 -80
  41. package/dist/components/rel-topbar/rel-topbar-actions.ts +23 -0
  42. package/dist/components/rel-topbar/rel-topbar-brand.ts +46 -0
  43. package/dist/components/rel-topbar/rel-topbar-dropdown-item.ts +33 -0
  44. package/dist/components/rel-topbar/rel-topbar-dropdown.ts +28 -0
  45. package/dist/components/rel-topbar/rel-topbar-item.ts +315 -0
  46. package/dist/components/rel-topbar/rel-topbar-mobile-panel.ts +23 -0
  47. package/dist/components/rel-topbar/rel-topbar-profile.ts +248 -0
  48. package/dist/components/rel-topbar/rel-topbar-utilities.ts +23 -0
  49. package/dist/components/rel-topbar/rel-topbar.ts +329 -0
  50. package/dist/index.d.mts +278 -289
  51. package/dist/index.d.ts +278 -289
  52. package/dist/index.js +4498 -5727
  53. package/dist/index.js.map +1 -1
  54. package/dist/index.mjs +4535 -5756
  55. package/dist/index.mjs.map +1 -1
  56. package/dist/styles/vars.css +346 -294
  57. package/dist/{vars-ITL2K3KO.css → vars-TBB4BMSD.css} +346 -294
  58. package/package.json +2 -1
  59. package/dist/components/rel-quote-page/README.md +0 -166
  60. package/dist/components/rel-quote-page/rel-quote-page.ts +0 -816
@@ -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-chart/rel-chart.ts","../src/components/rel-checkbox/rel-checkbox.ts","../src/components/rel-date-picker/rel-date-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-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-menubar/rel-menubar-menu.ts","../src/components/rel-nav-menu/rel-nav-menu.ts","../src/components/rel-nav-menu/rel-nav-menu-item.ts","../src/components/rel-nav-menu/rel-nav-menu-panel.ts","../src/components/rel-navbar/rel-navbar.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-quote-page/rel-quote-page.ts","../src/components/rel-radio/rel-radio.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-sidebar/rel-sidebar.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-table/rel-table.ts","../src/components/rel-table/rel-table-header.ts","../src/components/rel-table/rel-table-body.ts","../src/components/rel-table/rel-table-footer.ts","../src/components/rel-table/rel-table-row.ts","../src/components/rel-table/rel-table-head.ts","../src/components/rel-table/rel-table-cell.ts","../src/components/rel-table/rel-table-caption.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-chart/rel-chart\";\r\nexport * from \"./components/rel-checkbox/rel-checkbox\";\r\nexport * from \"./components/rel-date-picker/rel-date-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-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-nav-menu/rel-nav-menu\";\r\nexport * from \"./components/rel-nav-menu/rel-nav-menu-item\";\r\nexport * from \"./components/rel-nav-menu/rel-nav-menu-panel\";\r\nexport * from \"./components/rel-navbar/rel-navbar\";\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-quote-page/rel-quote-page\";\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-sidebar/rel-sidebar\";\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-table/rel-table\";\r\nexport * from \"./components/rel-table/rel-table-header\";\r\nexport * from \"./components/rel-table/rel-table-body\";\r\nexport * from \"./components/rel-table/rel-table-footer\";\r\nexport * from \"./components/rel-table/rel-table-row\";\r\nexport * from \"./components/rel-table/rel-table-head\";\r\nexport * from \"./components/rel-table/rel-table-cell\";\r\nexport * from \"./components/rel-table/rel-table-caption\";\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","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\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\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\r\n .accordion {\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 box-shadow: var(--rel-shadows-shadow-100);\r\n overflow: hidden;\r\n }\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: var(--rel-borders-radius-border-radius-200, 8px);\r\n }\r\n\r\n .header:hover {\r\n background: var(--rel-surface-surface, #f5f5f5);\r\n }\r\n\r\n .header:focus-visible {\r\n outline: 2px solid var(--rel-border-info, #0091ea);\r\n outline-offset: -2px;\r\n }\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\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\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\r\n .icon.rotated {\r\n transform: rotate(180deg);\r\n }\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: max-height 0.25s ease, padding 0.2s ease;\r\n }\r\n\r\n .body.open {\r\n max-height: 1000px;\r\n padding: var(--rel-spacing-space-xl, 24px) var(--rel-spacing-space-md, 16px)\r\n var(--rel-spacing-space-lg, 20px);\r\n }\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\r\n private toggle() {\r\n this.open = !this.open;\r\n\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\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\r\n render() {\r\n return html`\r\n <div class=\"accordion\">\r\n <div 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 <div class=\"title\">${this.title}</div>\r\n\r\n <div class=\"icon ${this.open ? \"rotated\" : \"\"}\">\r\n ${this.chevron()}\r\n </div>\r\n </div>\r\n\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 { 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 */\r\n .alert-info {\r\n background: var(--rel-background-info);\r\n color: var(--rel-text-info);\r\n }\r\n\r\n .alert-success {\r\n background: var(--rel-background-success);\r\n color: var(--rel-text-success);\r\n }\r\n\r\n .alert-warning {\r\n background: var(--rel-background-warning);\r\n color: var(--rel-text-warning);\r\n }\r\n\r\n .alert-error {\r\n background: var(--rel-background-error);\r\n color: var(--rel-text-error);\r\n }\r\n\r\n .alert-neutral {\r\n background: var(--rel-colors-white);\r\n color: var(--rel-text-primary);\r\n border: 1px solid var(--rel-border-default);\r\n }\r\n `;\r\n\r\n private dismissAlert() {\r\n this.dismissed = true;\r\n\r\n this.dispatchEvent(\r\n new CustomEvent(\"dismiss\", {\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n 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 { 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\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-heading);\r\n color: var(--rel-colors-white);\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 }\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}\">\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 { 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, 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-colors-red-primary);\r\n color: var(--rel-colors-white, #fff);\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}\">\r\n ${this.variant === \"number\" ? this.number : null}\r\n </span>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\r\nexport interface BreadcrumbItem {\r\n label: string;\r\n url?: string;\r\n}\r\n\r\n@customElement(\"rel-breadcrumbs\")\r\nexport class RelBreadcrumbs extends LitElement {\r\n @property({ type: Array })\r\n items: BreadcrumbItem[] = [];\r\n\r\n static styles = css`\r\n :host {\r\n display: block;\r\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-medium);\r\n color: var(--rel-text-heading, #2b2b2b);\r\n transition: color 0.2s ease;\r\n }\r\n\r\n a:hover {\r\n text-decoration: underline;\r\n color: var(--rel-colors-blue-primary, #0091ea);\r\n }\r\n\r\n a:focus-visible {\r\n outline: 2px solid var(--rel-colors-blue-primary, #0091ea);\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-text-heading, #2b2b2b);\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 { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.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\" | \"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 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]) button {\r\n cursor: not-allowed;\r\n background-color: var(--rel-colors-gray-border) !important;\r\n color: var(--rel-colors-gray-disabled-text) !important;\r\n pointer-events: none;\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-colors-red-primary);\r\n color: var(--rel-colors-white);\r\n }\r\n .btn-default.tone-success {\r\n background: var(--rel-colors-green-success);\r\n color: var(--rel-colors-white);\r\n }\r\n\r\n .btn-primary.tone-default {\r\n background: var(--rel-colors-green-primary);\r\n color: var(--rel-colors-black);\r\n }\r\n .btn-primary.tone-critical {\r\n background: var(--rel-colors-red-primary);\r\n color: var(--rel-colors-white);\r\n }\r\n .btn-primary.tone-success {\r\n background: var(--rel-colors-green-success);\r\n color: var(--rel-colors-white);\r\n }\r\n\r\n .btn-secondary {\r\n background: var(--rel-colors-white);\r\n border: 1px solid var(--rel-colors-black);\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 background: var(--rel-colors-gray-light);\r\n color: var(--rel-colors-black);\r\n }\r\n\r\n button:hover:not(:disabled) {\r\n filter: brightness(0.92);\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-colors-blue-primary);\r\n outline-offset: 2px;\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 // 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 >\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\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-colors-gray-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-colors-blue-primary);\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-colors-gray-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-colors-blue-primary);\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-blue-primary);\r\n }\r\n\r\n .day-button.selected {\r\n background: var(--rel-colors-green-primary);\r\n color: var(--rel-colors-black);\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\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\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-colors-white, #fff);\r\n color: var(--rel-text-primary, #333);\r\n border-radius: var(--rel-borders-radius-border-radius-300);\r\n padding: var(--rel-spacing-space-md);\r\n box-shadow: var(--rel-shadows-shadow-200);\r\n transition: transform 0.2s ease, box-shadow 0.2s ease;\r\n }\r\n\r\n .card:hover {\r\n transform: translateY(-3px);\r\n box-shadow: var(--rel-shadows-shadow-300);\r\n }\r\n\r\n @media (prefers-reduced-motion: reduce) {\r\n .card {\r\n transition: none;\r\n }\r\n .card:hover {\r\n transform: none;\r\n }\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\";\r\nimport { customElement, property, state, query } from \"lit/decorators.js\";\r\n\r\n@customElement(\"rel-carousel\")\r\nexport class RelCarousel extends LitElement {\r\n @property({ type: Number, reflect: true }) value = 0;\r\n @property({ type: Boolean }) loop = false;\r\n @property({ type: Boolean }) autoplay = false;\r\n @property({ type: Number }) interval = 5000;\r\n @property({ type: Boolean, attribute: \"pause-on-hover\" }) pauseOnHover = true;\r\n @property({ type: Boolean, attribute: \"show-buttons\" }) showButtons = true;\r\n @property({ type: Boolean, attribute: \"show-dots\" }) showDots = true;\r\n @property({ type: String }) orientation: \"horizontal\" | \"vertical\" = \"horizontal\";\r\n @property({ type: String }) align: \"start\" | \"center\" | \"end\" = \"center\";\r\n @property({ type: Number, attribute: \"slides-per-view\" }) slidesPerView = 1;\r\n @property({ type: Number }) gap?: number;\r\n @property({ type: Boolean, reflect: true }) disabled = false;\r\n\r\n @state() private slideCount = 0;\r\n @state() private isDragging = false;\r\n @state() private dragStartX = 0;\r\n @state() private currentTranslate = 0;\r\n @state() private prevTranslate = 0;\r\n\r\n @query(\".viewport\") private viewport?: HTMLElement;\r\n @query(\".track\") private track?: HTMLElement;\r\n @query(\"slot\") private slotElement?: HTMLSlotElement;\r\n\r\n private autoplayTimer?: number;\r\n private animationId?: number;\r\n private prefersReducedMotion = 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 position: relative;\r\n user-select: none;\r\n }\r\n\r\n :host([disabled]) {\r\n opacity: 0.6;\r\n pointer-events: none;\r\n }\r\n\r\n .viewport {\r\n overflow: hidden;\r\n position: relative;\r\n width: 100%;\r\n }\r\n\r\n .track {\r\n display: flex;\r\n transition: transform 0.3s ease-out;\r\n will-change: transform;\r\n }\r\n\r\n .track.dragging {\r\n transition: none;\r\n }\r\n\r\n .track.no-transition {\r\n transition: none;\r\n }\r\n\r\n ::slotted(*) {\r\n flex: 0 0 100%;\r\n min-width: 0;\r\n }\r\n\r\n /* Navigation buttons */\r\n .nav-button {\r\n position: absolute;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n z-index: 10;\r\n width: 40px;\r\n height: 40px;\r\n border-radius: 50%;\r\n border: 1px solid var(--rel-border-default);\r\n background: var(--rel-colors-white);\r\n color: var(--rel-colors-gray-primary);\r\n cursor: pointer;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n transition: all 0.15s ease;\r\n box-shadow: var(--rel-shadows-shadow-100);\r\n }\r\n\r\n .nav-button:hover:not(:disabled) {\r\n background: var(--rel-surface-secondary);\r\n }\r\n\r\n .nav-button:focus-visible {\r\n outline: 2px solid var(--rel-colors-blue-primary);\r\n outline-offset: 2px;\r\n }\r\n\r\n .nav-button:disabled {\r\n opacity: 0.4;\r\n cursor: not-allowed;\r\n }\r\n\r\n .nav-button.prev {\r\n left: 12px;\r\n }\r\n\r\n .nav-button.next {\r\n right: 12px;\r\n }\r\n\r\n .nav-button svg {\r\n width: 20px;\r\n height: 20px;\r\n }\r\n\r\n /* Dots indicator */\r\n .dots {\r\n display: flex;\r\n justify-content: center;\r\n gap: var(--rel-spacing-space-xs);\r\n margin-top: var(--rel-spacing-space-md);\r\n }\r\n\r\n .dot {\r\n width: 8px;\r\n height: 8px;\r\n border-radius: 50%;\r\n border: none;\r\n background: var(--rel-colors-gray-border);\r\n cursor: pointer;\r\n padding: 0;\r\n transition: all 0.15s ease;\r\n }\r\n\r\n .dot:hover {\r\n background: var(--rel-colors-gray-divider);\r\n }\r\n\r\n .dot.active {\r\n background: var(--rel-colors-green-primary);\r\n width: 24px;\r\n border-radius: 4px;\r\n }\r\n\r\n .dot:focus-visible {\r\n outline: 2px solid var(--rel-colors-blue-primary);\r\n outline-offset: 2px;\r\n }\r\n\r\n /* Reduced motion support */\r\n @media (prefers-reduced-motion: reduce) {\r\n .track {\r\n transition: none;\r\n }\r\n }\r\n `;\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n this.prefersReducedMotion = window.matchMedia(\r\n \"(prefers-reduced-motion: reduce)\"\r\n ).matches;\r\n\r\n if (this.autoplay) {\r\n this.startAutoplay();\r\n }\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback();\r\n this.stopAutoplay();\r\n if (this.animationId) {\r\n cancelAnimationFrame(this.animationId);\r\n }\r\n }\r\n\r\n private handleSlotChange() {\r\n const slot = this.slotElement;\r\n if (!slot) return;\r\n\r\n const elements = slot.assignedElements();\r\n this.slideCount = elements.length;\r\n\r\n // Ensure value is within bounds\r\n if (this.value >= this.slideCount) {\r\n this.value = this.slideCount - 1;\r\n }\r\n if (this.value < 0) {\r\n this.value = 0;\r\n }\r\n\r\n this.updateTransform();\r\n }\r\n\r\n private updateTransform() {\r\n if (!this.track || !this.viewport) return;\r\n\r\n const slideWidth = this.viewport.offsetWidth;\r\n const gapValue = this.gap ?? 0;\r\n const translate = -(this.value * (slideWidth + gapValue));\r\n\r\n this.currentTranslate = translate;\r\n this.prevTranslate = translate;\r\n this.track.style.transform = `translateX(${translate}px)`;\r\n\r\n if (this.gap) {\r\n this.track.style.gap = `${this.gap}px`;\r\n } else {\r\n this.track.style.gap = \"\";\r\n }\r\n }\r\n\r\n private goToPrevious() {\r\n if (this.disabled) return;\r\n\r\n if (this.value > 0) {\r\n this.value--;\r\n } else if (this.loop) {\r\n this.value = this.slideCount - 1;\r\n }\r\n\r\n this.updateTransform();\r\n this.emitChange();\r\n }\r\n\r\n private goToNext() {\r\n if (this.disabled) return;\r\n\r\n if (this.value < this.slideCount - 1) {\r\n this.value++;\r\n } else if (this.loop) {\r\n this.value = 0;\r\n }\r\n\r\n this.updateTransform();\r\n this.emitChange();\r\n }\r\n\r\n private goToSlide(index: number) {\r\n if (this.disabled || index < 0 || index >= this.slideCount) return;\r\n\r\n this.value = index;\r\n this.updateTransform();\r\n this.emitChange();\r\n }\r\n\r\n private emitChange() {\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 }\r\n\r\n private startAutoplay() {\r\n if (!this.autoplay || this.disabled) return;\r\n\r\n this.stopAutoplay();\r\n this.autoplayTimer = window.setInterval(() => {\r\n this.goToNext();\r\n }, this.interval);\r\n }\r\n\r\n private stopAutoplay() {\r\n if (this.autoplayTimer) {\r\n clearInterval(this.autoplayTimer);\r\n this.autoplayTimer = undefined;\r\n }\r\n }\r\n\r\n private handlePointerDown(e: PointerEvent) {\r\n if (this.disabled || !this.track) return;\r\n\r\n this.isDragging = true;\r\n this.dragStartX = e.clientX;\r\n this.prevTranslate = this.currentTranslate;\r\n\r\n this.track.classList.add(\"dragging\");\r\n\r\n if (this.autoplay && this.pauseOnHover) {\r\n this.stopAutoplay();\r\n }\r\n\r\n e.preventDefault();\r\n }\r\n\r\n private handlePointerMove(e: PointerEvent) {\r\n if (!this.isDragging || !this.track) return;\r\n\r\n const currentX = e.clientX;\r\n const deltaX = currentX - this.dragStartX;\r\n this.currentTranslate = this.prevTranslate + deltaX;\r\n\r\n if (!this.prefersReducedMotion && this.animationId) {\r\n cancelAnimationFrame(this.animationId);\r\n }\r\n\r\n this.animationId = requestAnimationFrame(() => {\r\n if (this.track) {\r\n this.track.style.transform = `translateX(${this.currentTranslate}px)`;\r\n }\r\n });\r\n }\r\n\r\n private handlePointerUp(e: PointerEvent) {\r\n if (!this.isDragging || !this.track || !this.viewport) return;\r\n\r\n this.isDragging = false;\r\n this.track.classList.remove(\"dragging\");\r\n\r\n const deltaX = e.clientX - this.dragStartX;\r\n const slideWidth = this.viewport.offsetWidth;\r\n const threshold = slideWidth * 0.2; // 20% threshold\r\n\r\n if (Math.abs(deltaX) > threshold) {\r\n if (deltaX > 0 && (this.value > 0 || this.loop)) {\r\n this.goToPrevious();\r\n } else if (deltaX < 0 && (this.value < this.slideCount - 1 || this.loop)) {\r\n this.goToNext();\r\n } else {\r\n this.updateTransform();\r\n }\r\n } else {\r\n this.updateTransform();\r\n }\r\n\r\n if (this.autoplay) {\r\n this.startAutoplay();\r\n }\r\n }\r\n\r\n private handleKeyDown(e: KeyboardEvent) {\r\n if (this.disabled) return;\r\n\r\n switch (e.key) {\r\n case \"ArrowLeft\":\r\n e.preventDefault();\r\n this.goToPrevious();\r\n break;\r\n case \"ArrowRight\":\r\n e.preventDefault();\r\n this.goToNext();\r\n break;\r\n case \"Home\":\r\n e.preventDefault();\r\n this.goToSlide(0);\r\n break;\r\n case \"End\":\r\n e.preventDefault();\r\n this.goToSlide(this.slideCount - 1);\r\n break;\r\n }\r\n }\r\n\r\n private handleMouseEnter() {\r\n if (this.autoplay && this.pauseOnHover) {\r\n this.stopAutoplay();\r\n }\r\n }\r\n\r\n private handleMouseLeave() {\r\n if (this.autoplay && this.pauseOnHover) {\r\n this.startAutoplay();\r\n }\r\n }\r\n\r\n updated(changedProperties: Map<string, any>) {\r\n if (changedProperties.has(\"autoplay\") || changedProperties.has(\"interval\")) {\r\n if (this.autoplay) {\r\n this.startAutoplay();\r\n } else {\r\n this.stopAutoplay();\r\n }\r\n }\r\n\r\n if (changedProperties.has(\"value\")) {\r\n this.updateTransform();\r\n }\r\n }\r\n\r\n render() {\r\n const canGoPrev = this.loop || this.value > 0;\r\n const canGoNext = this.loop || this.value < this.slideCount - 1;\r\n\r\n return html`\r\n <div\r\n class=\"viewport\"\r\n part=\"viewport\"\r\n role=\"region\"\r\n aria-roledescription=\"carousel\"\r\n aria-label=\"Carousel\"\r\n @keydown=${this.handleKeyDown}\r\n @mouseenter=${this.handleMouseEnter}\r\n @mouseleave=${this.handleMouseLeave}\r\n tabindex=\"0\"\r\n >\r\n <div\r\n class=\"track\"\r\n part=\"track\"\r\n @pointerdown=${this.handlePointerDown}\r\n @pointermove=${this.handlePointerMove}\r\n @pointerup=${this.handlePointerUp}\r\n @pointercancel=${this.handlePointerUp}\r\n >\r\n <slot @slotchange=${this.handleSlotChange}></slot>\r\n </div>\r\n\r\n ${this.showButtons\r\n ? html`\r\n <button\r\n class=\"nav-button prev\"\r\n part=\"prev-button\"\r\n aria-label=\"Previous slide\"\r\n ?disabled=${!canGoPrev || this.disabled}\r\n @click=${this.goToPrevious}\r\n >\r\n <svg viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M10 12L6 8L10 4\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n\r\n <button\r\n class=\"nav-button next\"\r\n part=\"next-button\"\r\n aria-label=\"Next slide\"\r\n ?disabled=${!canGoNext || this.disabled}\r\n @click=${this.goToNext}\r\n >\r\n <svg viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M6 4L10 8L6 12\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n `\r\n : nothing}\r\n </div>\r\n\r\n ${this.showDots && this.slideCount > 1\r\n ? html`\r\n <div class=\"dots\" part=\"dots\">\r\n ${Array.from({ length: this.slideCount }, (_, i) => html`\r\n <button\r\n class=\"dot ${i === this.value ? \"active\" : \"\"}\"\r\n part=\"dot\"\r\n aria-label=\"Go to slide ${i + 1}\"\r\n @click=${() => this.goToSlide(i)}\r\n ></button>\r\n `)}\r\n </div>\r\n `\r\n : nothing}\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\n@customElement(\"rel-card-media\")\r\nexport class RelCardMedia extends LitElement {\r\n @property({ type: String }) imageSrc = \"\";\r\n @property({ type: String }) 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-colors-white, #fff);\r\n color: var(--rel-text-primary, #333);\r\n border-radius: var(--rel-borders-radius-border-radius-300);\r\n overflow: hidden;\r\n box-shadow: var(--rel-shadows-shadow-200);\r\n transition: transform 0.2s ease, box-shadow 0.2s ease;\r\n }\r\n\r\n .card-media:hover {\r\n transform: translateY(-4px);\r\n box-shadow: var(--rel-shadows-shadow-300);\r\n }\r\n\r\n @media (prefers-reduced-motion: reduce) {\r\n .card-media {\r\n transition: none;\r\n }\r\n .card-media:hover {\r\n transform: none;\r\n }\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-text-heading, #2b2b2b);\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-text-primary, #333);\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, nothing } from \"lit\";\r\nimport { customElement, property, state, query } from \"lit/decorators.js\";\r\n\r\ninterface SeriesConfig {\r\n key: string;\r\n label?: string;\r\n colorToken?: string;\r\n}\r\n\r\ninterface TooltipData {\r\n x: string;\r\n series: { label: string; value: number; color: string }[];\r\n xPos: number;\r\n yPos: number;\r\n}\r\n\r\n@customElement(\"rel-chart\")\r\nexport class RelChart extends LitElement {\r\n @property({ type: String, reflect: true }) type: \"bar\" | \"line\" = \"bar\";\r\n @property({ type: Number }) height = 320;\r\n @property({ type: String, attribute: \"x-key\" }) xKey = \"\";\r\n @property({ type: String, attribute: \"series-json\" }) seriesJson = \"\";\r\n @property({ type: String, attribute: \"data-json\" }) dataJson = \"\";\r\n @property({ type: Boolean, attribute: \"show-grid\" }) showGrid = true;\r\n @property({ type: Boolean, attribute: \"show-axis\" }) showAxis = true;\r\n @property({ type: Boolean, attribute: \"show-legend\" }) showLegend = true;\r\n @property({ type: Boolean }) stacked = false;\r\n @property({ type: String, attribute: \"format-x\" }) formatX: \"date\" | \"string\" | \"number\" = \"string\";\r\n @property({ type: String }) locale = \"en-US\";\r\n @property({ type: Boolean, reflect: true }) disabled = false;\r\n\r\n // Programmatic properties - using setters to trigger updates\r\n private _data: Array<Record<string, unknown>> = [];\r\n private _series: SeriesConfig[] = [];\r\n\r\n public get data() {\r\n return this._data;\r\n }\r\n\r\n public set data(value: Array<Record<string, unknown>>) {\r\n const oldValue = this._data;\r\n this._data = value;\r\n this.requestUpdate('data', oldValue);\r\n }\r\n\r\n public get series() {\r\n return this._series;\r\n }\r\n\r\n public set series(value: SeriesConfig[]) {\r\n const oldValue = this._series;\r\n this._series = value;\r\n this.requestUpdate('series', oldValue);\r\n }\r\n\r\n @state() private chartWidth = 600; // Default width before measurement\r\n @state() private tooltip: TooltipData | null = null;\r\n\r\n @query(\".chart-container\") private container?: HTMLElement;\r\n\r\n private resizeObserver?: ResizeObserver;\r\n private prefersReducedMotion = false;\r\n private resizeTimeout?: number;\r\n\r\n // Default color palette using RDS tokens\r\n private readonly defaultColors = [\r\n \"var(--rel-colors-blue-primary)\",\r\n \"var(--rel-colors-green-primary)\",\r\n \"var(--rel-colors-orange-warning)\",\r\n \"var(--rel-colors-red-primary)\",\r\n \"var(--rel-colors-gold)\",\r\n \"var(--rel-colors-platinum)\",\r\n ];\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 :host([disabled]) {\r\n opacity: 0.6;\r\n pointer-events: none;\r\n }\r\n\r\n .chart-container {\r\n width: 100%;\r\n position: relative;\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 }\r\n\r\n svg {\r\n display: block;\r\n width: 100%;\r\n overflow: visible;\r\n }\r\n\r\n .grid-line {\r\n stroke: var(--rel-colors-gray-border, #ddd);\r\n stroke-width: 1;\r\n stroke-dasharray: 2 2;\r\n }\r\n\r\n .axis-line {\r\n stroke: var(--rel-colors-gray-divider, #bdbdbd);\r\n stroke-width: 1;\r\n }\r\n\r\n .axis-label {\r\n fill: var(--rel-text-primary, #333);\r\n font-size: var(--rel-fontSizes-xs, 10px);\r\n font-family: var(--rel-fontFamilies-primary, sans-serif);\r\n }\r\n\r\n .bar {\r\n cursor: pointer;\r\n transition: opacity 0.15s ease;\r\n }\r\n\r\n .bar:hover {\r\n opacity: 0.8;\r\n }\r\n\r\n .bar:focus-visible {\r\n outline: 2px solid var(--rel-border-info, #0091ea);\r\n outline-offset: 2px;\r\n }\r\n\r\n .line-path {\r\n fill: none;\r\n stroke-width: 2;\r\n transition: stroke-width 0.15s ease;\r\n }\r\n\r\n .line-path:hover {\r\n stroke-width: 3;\r\n }\r\n\r\n .point {\r\n cursor: pointer;\r\n transition: r 0.15s ease;\r\n }\r\n\r\n .point:hover {\r\n r: 6;\r\n }\r\n\r\n .point:focus-visible {\r\n outline: 2px solid var(--rel-border-info, #0091ea);\r\n outline-offset: 2px;\r\n }\r\n\r\n .legend {\r\n display: flex;\r\n gap: var(--rel-spacing-space-md);\r\n margin-top: var(--rel-spacing-space-md);\r\n flex-wrap: wrap;\r\n justify-content: center;\r\n }\r\n\r\n .legend-item {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-space-xs, 8px);\r\n font-size: var(--rel-fontSizes-sm, 12px);\r\n color: var(--rel-text-primary, #333);\r\n }\r\n\r\n .legend-color {\r\n width: 12px;\r\n height: 12px;\r\n border-radius: var(--rel-borders-radius-border-radius-100);\r\n }\r\n\r\n .tooltip {\r\n position: absolute;\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-sm, 12px);\r\n box-shadow: var(--rel-shadows-shadow-200);\r\n pointer-events: none;\r\n z-index: 100;\r\n font-size: var(--rel-fontSizes-sm, 12px);\r\n min-width: 120px;\r\n }\r\n\r\n .tooltip-title {\r\n font-weight: var(--rel-fontWeights-semibold, 600);\r\n color: var(--rel-text-heading, #2b2b2b);\r\n margin-bottom: var(--rel-spacing-space-xs, 8px);\r\n }\r\n\r\n .tooltip-row {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n gap: var(--rel-spacing-space-md);\r\n margin-bottom: var(--rel-spacing-space-3xs);\r\n }\r\n\r\n .tooltip-row:last-child {\r\n margin-bottom: 0;\r\n }\r\n\r\n .tooltip-label {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-space-xs, 8px);\r\n color: var(--rel-text-primary, #333);\r\n }\r\n\r\n .tooltip-dot {\r\n width: 8px;\r\n height: 8px;\r\n border-radius: 50%;\r\n }\r\n\r\n .tooltip-value {\r\n font-weight: var(--rel-fontWeights-semibold, 600);\r\n color: var(--rel-text-heading, #2b2b2b);\r\n }\r\n\r\n @media (prefers-reduced-motion: reduce) {\r\n .bar,\r\n .line-path,\r\n .point {\r\n transition: none;\r\n }\r\n }\r\n `;\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n this.prefersReducedMotion = window.matchMedia(\r\n \"(prefers-reduced-motion: reduce)\"\r\n ).matches;\r\n\r\n this.resizeObserver = new ResizeObserver(() => {\r\n if (this.resizeTimeout) {\r\n clearTimeout(this.resizeTimeout);\r\n }\r\n this.resizeTimeout = window.setTimeout(() => {\r\n this.measureWidth();\r\n }, 50);\r\n });\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback();\r\n if (this.resizeObserver) {\r\n this.resizeObserver.disconnect();\r\n }\r\n if (this.resizeTimeout) {\r\n clearTimeout(this.resizeTimeout);\r\n }\r\n }\r\n\r\n firstUpdated() {\r\n if (this.container) {\r\n this.resizeObserver?.observe(this.container);\r\n this.measureWidth();\r\n }\r\n }\r\n\r\n updated(changedProperties: Map<string, any>) {\r\n // Re-measure when data or series changes, but only if we have data to render\r\n if ((changedProperties.has(\"data\") || changedProperties.has(\"series\")) && this._data.length > 0) {\r\n // Use requestAnimationFrame to ensure DOM is ready\r\n requestAnimationFrame(() => {\r\n this.measureWidth();\r\n });\r\n }\r\n }\r\n\r\n private measureWidth() {\r\n if (this.container) {\r\n const containerWidth = this.container.offsetWidth;\r\n\r\n if (containerWidth === 0) return;\r\n\r\n const measuredWidth = containerWidth - 32; // Account for padding\r\n const newWidth = Math.max(measuredWidth, 100);\r\n\r\n if (this.chartWidth !== newWidth) {\r\n this.chartWidth = newWidth;\r\n }\r\n }\r\n }\r\n\r\n private getChartData(): Array<Record<string, unknown>> {\r\n if (this.data && this.data.length > 0) {\r\n return this.data;\r\n }\r\n\r\n if (this.dataJson) {\r\n try {\r\n return JSON.parse(this.dataJson);\r\n } catch (e) {\r\n console.error(\"Failed to parse data-json:\", e);\r\n return [];\r\n }\r\n }\r\n\r\n return [];\r\n }\r\n\r\n private getSeriesConfig(): SeriesConfig[] {\r\n if (this.series && this.series.length > 0) {\r\n return this.series;\r\n }\r\n\r\n if (this.seriesJson) {\r\n try {\r\n return JSON.parse(this.seriesJson);\r\n } catch (e) {\r\n console.error(\"Failed to parse series-json:\", e);\r\n return [];\r\n }\r\n }\r\n\r\n return [];\r\n }\r\n\r\n private getSeriesColor(index: number, config?: SeriesConfig): string {\r\n if (config?.colorToken) {\r\n return config.colorToken.startsWith(\"var(\")\r\n ? config.colorToken\r\n : `var(${config.colorToken})`;\r\n }\r\n return this.defaultColors[index % this.defaultColors.length];\r\n }\r\n\r\n private formatXValue(value: unknown): string {\r\n if (this.formatX === \"date\" && value instanceof Date) {\r\n return new Intl.DateTimeFormat(this.locale, {\r\n month: \"short\",\r\n day: \"numeric\",\r\n }).format(value);\r\n }\r\n\r\n if (this.formatX === \"date\" && typeof value === \"string\") {\r\n try {\r\n const date = new Date(value);\r\n return new Intl.DateTimeFormat(this.locale, {\r\n month: \"short\",\r\n day: \"numeric\",\r\n }).format(date);\r\n } catch {\r\n return String(value);\r\n }\r\n }\r\n\r\n return String(value);\r\n }\r\n\r\n private calculateScales(data: Array<Record<string, unknown>>, seriesConfigs: SeriesConfig[]) {\r\n const padding = { top: 20, right: 20, bottom: 40, left: 50 };\r\n const chartHeight = this.height - padding.top - padding.bottom;\r\n const chartWidth = this.chartWidth - padding.left - padding.right;\r\n\r\n // Find max value across all series\r\n let maxValue = 0;\r\n data.forEach((item) => {\r\n seriesConfigs.forEach((config) => {\r\n const value = Number(item[config.key]) || 0;\r\n maxValue = Math.max(maxValue, value);\r\n });\r\n });\r\n\r\n // Add 10% padding to max\r\n maxValue = maxValue * 1.1;\r\n\r\n return {\r\n padding,\r\n chartHeight,\r\n chartWidth,\r\n maxValue,\r\n xScale: (index: number) => padding.left + (index * chartWidth) / data.length,\r\n yScale: (value: number) => padding.top + chartHeight - (value / maxValue) * chartHeight,\r\n barWidth: chartWidth / data.length * 0.6 / seriesConfigs.length,\r\n };\r\n }\r\n\r\n private handleBarHover(\r\n event: MouseEvent,\r\n datum: Record<string, unknown>,\r\n index: number\r\n ) {\r\n if (this.disabled) return;\r\n\r\n const data = this.getChartData();\r\n const seriesConfigs = this.getSeriesConfig();\r\n const target = event.currentTarget as SVGElement;\r\n const rect = target.getBoundingClientRect();\r\n\r\n const tooltipData: TooltipData = {\r\n x: this.formatXValue(datum[this.xKey]),\r\n series: seriesConfigs.map((config, i) => ({\r\n label: config.label || config.key,\r\n value: Number(datum[config.key]) || 0,\r\n color: this.getSeriesColor(i, config),\r\n })),\r\n xPos: rect.left + rect.width / 2,\r\n yPos: rect.top,\r\n };\r\n\r\n this.tooltip = tooltipData;\r\n\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-hover\", {\r\n detail: { index, datum, seriesKey: undefined },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private handlePointHover(\r\n event: MouseEvent,\r\n datum: Record<string, unknown>,\r\n index: number,\r\n seriesKey: string\r\n ) {\r\n if (this.disabled) return;\r\n\r\n const seriesConfigs = this.getSeriesConfig();\r\n const seriesIndex = seriesConfigs.findIndex((s) => s.key === seriesKey);\r\n const config = seriesConfigs[seriesIndex];\r\n const target = event.currentTarget as SVGElement;\r\n const rect = target.getBoundingClientRect();\r\n\r\n const tooltipData: TooltipData = {\r\n x: this.formatXValue(datum[this.xKey]),\r\n series: [{\r\n label: config.label || config.key,\r\n value: Number(datum[config.key]) || 0,\r\n color: this.getSeriesColor(seriesIndex, config),\r\n }],\r\n xPos: rect.left + rect.width / 2,\r\n yPos: rect.top,\r\n };\r\n\r\n this.tooltip = tooltipData;\r\n\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-hover\", {\r\n detail: { index, datum, seriesKey },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private handleMouseLeave() {\r\n this.tooltip = null;\r\n }\r\n\r\n private renderGrid(scales: ReturnType<typeof this.calculateScales>) {\r\n if (!this.showGrid) return nothing;\r\n\r\n const gridLines = [];\r\n const numLines = 5;\r\n\r\n for (let i = 0; i <= numLines; i++) {\r\n const y = scales.padding.top + (i * scales.chartHeight) / numLines;\r\n gridLines.push(html`\r\n <line\r\n class=\"grid-line\"\r\n x1=\"${scales.padding.left}\"\r\n y1=\"${y}\"\r\n x2=\"${scales.padding.left + scales.chartWidth}\"\r\n y2=\"${y}\"\r\n part=\"grid\"\r\n />\r\n `);\r\n }\r\n\r\n return gridLines;\r\n }\r\n\r\n private renderAxis(\r\n data: Array<Record<string, unknown>>,\r\n scales: ReturnType<typeof this.calculateScales>\r\n ) {\r\n if (!this.showAxis) return nothing;\r\n\r\n const yAxisLabels = [];\r\n const numLabels = 5;\r\n\r\n for (let i = 0; i <= numLabels; i++) {\r\n const value = (scales.maxValue * (numLabels - i)) / numLabels;\r\n const y = scales.padding.top + (i * scales.chartHeight) / numLabels;\r\n\r\n yAxisLabels.push(html`\r\n <text\r\n class=\"axis-label\"\r\n x=\"${scales.padding.left - 10}\"\r\n y=\"${y + 4}\"\r\n text-anchor=\"end\"\r\n part=\"axis\"\r\n >\r\n ${Math.round(value)}\r\n </text>\r\n `);\r\n }\r\n\r\n const xAxisLabels = data.map((item, index) => {\r\n const x = scales.xScale(index) + scales.chartWidth / data.length / 2;\r\n return html`\r\n <text\r\n class=\"axis-label\"\r\n x=\"${x}\"\r\n y=\"${scales.padding.top + scales.chartHeight + 20}\"\r\n text-anchor=\"middle\"\r\n part=\"axis\"\r\n >\r\n ${this.formatXValue(item[this.xKey])}\r\n </text>\r\n `;\r\n });\r\n\r\n return html`\r\n <line\r\n class=\"axis-line\"\r\n x1=\"${scales.padding.left}\"\r\n y1=\"${scales.padding.top + scales.chartHeight}\"\r\n x2=\"${scales.padding.left + scales.chartWidth}\"\r\n y2=\"${scales.padding.top + scales.chartHeight}\"\r\n part=\"axis\"\r\n />\r\n <line\r\n class=\"axis-line\"\r\n x1=\"${scales.padding.left}\"\r\n y1=\"${scales.padding.top}\"\r\n x2=\"${scales.padding.left}\"\r\n y2=\"${scales.padding.top + scales.chartHeight}\"\r\n part=\"axis\"\r\n />\r\n ${yAxisLabels} ${xAxisLabels}\r\n `;\r\n }\r\n\r\n private renderBarChart(\r\n data: Array<Record<string, unknown>>,\r\n seriesConfigs: SeriesConfig[]\r\n ) {\r\n const scales = this.calculateScales(data, seriesConfigs);\r\n\r\n const bars = data.flatMap((item, dataIndex) => {\r\n return seriesConfigs.map((config, seriesIndex) => {\r\n const value = Number(item[config.key]) || 0;\r\n const x =\r\n scales.xScale(dataIndex) +\r\n (scales.chartWidth / data.length - scales.barWidth * seriesConfigs.length) / 2 +\r\n seriesIndex * scales.barWidth;\r\n const y = scales.yScale(value);\r\n const height = scales.padding.top + scales.chartHeight - y;\r\n const color = this.getSeriesColor(seriesIndex, config);\r\n\r\n return html`\r\n <rect\r\n class=\"bar\"\r\n part=\"bar\"\r\n x=\"${x}\"\r\n y=\"${y}\"\r\n width=\"${scales.barWidth}\"\r\n height=\"${height}\"\r\n fill=\"${color}\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n aria-label=\"${config.label || config.key}: ${value}\"\r\n @mouseenter=\"${(e: MouseEvent) => this.handleBarHover(e, item, dataIndex)}\"\r\n @mouseleave=\"${this.handleMouseLeave}\"\r\n @focus=\"${(e: FocusEvent) => this.handleBarHover(e as any, item, dataIndex)}\"\r\n @blur=\"${this.handleMouseLeave}\"\r\n />\r\n `;\r\n });\r\n });\r\n\r\n return html`\r\n <svg\r\n height=\"${this.height}\"\r\n part=\"svg\"\r\n role=\"img\"\r\n aria-label=\"Bar chart\"\r\n >\r\n ${this.renderGrid(scales)} ${this.renderAxis(data, scales)} ${bars}\r\n </svg>\r\n `;\r\n }\r\n\r\n private renderLineChart(\r\n data: Array<Record<string, unknown>>,\r\n seriesConfigs: SeriesConfig[]\r\n ) {\r\n const scales = this.calculateScales(data, seriesConfigs);\r\n\r\n const lines = seriesConfigs.map((config, seriesIndex) => {\r\n const points = data.map((item, index) => {\r\n const value = Number(item[config.key]) || 0;\r\n const x = scales.xScale(index) + scales.chartWidth / data.length / 2;\r\n const y = scales.yScale(value);\r\n return { x, y, value, item, index };\r\n });\r\n\r\n const pathData = points\r\n .map((p, i) => `${i === 0 ? \"M\" : \"L\"} ${p.x} ${p.y}`)\r\n .join(\" \");\r\n\r\n return html`\r\n <path\r\n class=\"line-path\"\r\n part=\"line\"\r\n d=\"${pathData}\"\r\n stroke=\"${this.getSeriesColor(seriesIndex, config)}\"\r\n />\r\n ${points.map(\r\n (p) => html`\r\n <circle\r\n class=\"point\"\r\n part=\"point\"\r\n cx=\"${p.x}\"\r\n cy=\"${p.y}\"\r\n r=\"4\"\r\n fill=\"${this.getSeriesColor(seriesIndex, config)}\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n aria-label=\"${config.label || config.key}: ${p.value}\"\r\n @mouseenter=\"${(e: MouseEvent) =>\r\n this.handlePointHover(e, p.item, p.index, config.key)}\"\r\n @mouseleave=\"${this.handleMouseLeave}\"\r\n @focus=\"${(e: FocusEvent) =>\r\n this.handlePointHover(e as any, p.item, p.index, config.key)}\"\r\n @blur=\"${this.handleMouseLeave}\"\r\n />\r\n `\r\n )}\r\n `;\r\n });\r\n\r\n return html`\r\n <svg\r\n height=\"${this.height}\"\r\n part=\"svg\"\r\n role=\"img\"\r\n aria-label=\"Line chart\"\r\n >\r\n ${this.renderGrid(scales)} ${this.renderAxis(data, scales)} ${lines}\r\n </svg>\r\n `;\r\n }\r\n\r\n private renderLegend(seriesConfigs: SeriesConfig[]) {\r\n if (!this.showLegend || seriesConfigs.length === 0) return nothing;\r\n\r\n return html`\r\n <div class=\"legend\" part=\"legend\">\r\n ${seriesConfigs.map(\r\n (config, index) => html`\r\n <div class=\"legend-item\">\r\n <div\r\n class=\"legend-color\"\r\n style=\"background: ${this.getSeriesColor(index, config)}\"\r\n ></div>\r\n <span>${config.label || config.key}</span>\r\n </div>\r\n `\r\n )}\r\n </div>\r\n `;\r\n }\r\n\r\n private renderTooltip() {\r\n if (!this.tooltip) return nothing;\r\n\r\n const containerRect = this.container?.getBoundingClientRect();\r\n if (!containerRect) return nothing;\r\n\r\n const tooltipX = this.tooltip.xPos - containerRect.left;\r\n const tooltipY = this.tooltip.yPos - containerRect.top - 10;\r\n\r\n return html`\r\n <div\r\n class=\"tooltip\"\r\n part=\"tooltip\"\r\n style=\"left: ${tooltipX}px; top: ${tooltipY}px; transform: translate(-50%, -100%)\"\r\n >\r\n <div class=\"tooltip-title\">${this.tooltip.x}</div>\r\n ${this.tooltip.series.map(\r\n (s) => html`\r\n <div class=\"tooltip-row\">\r\n <div class=\"tooltip-label\">\r\n <div\r\n class=\"tooltip-dot\"\r\n style=\"background: ${s.color}\"\r\n ></div>\r\n <span>${s.label}</span>\r\n </div>\r\n <span class=\"tooltip-value\">${s.value}</span>\r\n </div>\r\n `\r\n )}\r\n </div>\r\n `;\r\n }\r\n\r\n render() {\r\n const data = this.getChartData();\r\n const seriesConfigs = this.getSeriesConfig();\r\n\r\n if (!data.length || !seriesConfigs.length || !this.xKey) {\r\n return html`\r\n <div class=\"chart-container\" part=\"container\">\r\n <p style=\"text-align: center; color: var(--rel-text-placeholder, #a9a9a9); padding: 40px;\">\r\n No data available\r\n </p>\r\n </div>\r\n `;\r\n }\r\n\r\n return html`\r\n <div class=\"chart-container\" part=\"container\">\r\n ${this.type === \"bar\"\r\n ? this.renderBarChart(data, seriesConfigs)\r\n : this.renderLineChart(data, seriesConfigs)}\r\n ${this.renderLegend(seriesConfigs)} ${this.renderTooltip()}\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\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 .box {\r\n width: 18px;\r\n height: 18px;\r\n border-radius: 4px;\r\n border: 2px solid var(--rel-text-heading, #2b2b2b);\r\n background: var(--rel-colors-white, #fff);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n transition: all 0.2s;\r\n flex-shrink: 0;\r\n }\r\n\r\n input:focus-visible + .box {\r\n outline: 2px solid var(--rel-border-info, #0091ea);\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 .box,\r\n .indeterminate .box {\r\n background: var(--rel-text-heading, #2b2b2b);\r\n border-color: var(--rel-text-heading, #2b2b2b);\r\n }\r\n\r\n .checked .check-icon {\r\n display: block;\r\n }\r\n\r\n .indeterminate .indeterminate-icon {\r\n display: block;\r\n }\r\n\r\n .error .box {\r\n border-color: var(--rel-colors-red-primary);\r\n }\r\n\r\n .error.checked .box,\r\n .error.indeterminate .box {\r\n background: var(--rel-colors-red-primary);\r\n border-color: var(--rel-colors-red-primary);\r\n }\r\n\r\n .disabled {\r\n opacity: 0.55;\r\n cursor: not-allowed;\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-text-primary, #333);\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(\"change\", {\r\n detail: {\r\n checked: this.status === \"checked\",\r\n indeterminate: this.status === \"indeterminate\",\r\n },\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 <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 ?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 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-colors-white);\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-colors-gray-heading);\r\n }\r\n\r\n .trigger-button:focus-visible {\r\n outline: 2px solid var(--rel-colors-blue-primary);\r\n outline-offset: 2px;\r\n border-color: var(--rel-colors-blue-primary);\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-colors-gray-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-colors-gray-heading);\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-colors-white);\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-colors-gray-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-colors-blue-primary);\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-colors-white);\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-colors-blue-primary);\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-colors-white);\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-colors-blue-bg);\r\n color: var(--rel-colors-blue-primary);\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-colors-gray-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-colors-blue-primary);\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-blue-primary);\r\n }\r\n\r\n .day-button.selected {\r\n background: var(--rel-colors-green-primary);\r\n color: var(--rel-colors-black);\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 } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\r\n@customElement(\"rel-chip\")\r\nexport class RelChip extends LitElement {\r\n @property({ type: String }) label = \"Label\";\r\n\r\n @property({ type: String })\r\n tone: \"default\" | \"blue\" | \"yellow\" | \"red\" | \"green\" = \"default\";\r\n\r\n @property({ type: String }) leadingIcon?: string;\r\n @property({ type: String }) trailingIcon?: string;\r\n @property({ type: String }) avatar?: string;\r\n\r\n @property({ type: Boolean }) removable = false;\r\n @property({ type: Boolean }) outline = false;\r\n\r\n /** IMPORTANT: reflected so CSS + Angular can see it */\r\n @property({ type: Boolean, reflect: true }) removed = false;\r\n\r\n static styles = css`\r\n :host {\r\n display: inline-block;\r\n }\r\n\r\n :host([removed]) {\r\n display: none;\r\n }\r\n\r\n .chip {\r\n display: inline-flex;\r\n align-items: center;\r\n font-family: var(--rel-fontFamilies-primary);\r\n font-size: var(--rel-fontSizes-md);\r\n font-weight: var(--rel-fontWeights-medium);\r\n border-radius: var(--rel-borders-radius-border-radius-500);\r\n padding: var(--rel-spacing-space-2xs) var(--rel-spacing-space-sm);\r\n gap: var(--rel-spacing-space-2xs);\r\n cursor: pointer;\r\n border: var(--rel-borders-width-stroke-100) solid transparent;\r\n user-select: none;\r\n white-space: nowrap;\r\n background: transparent;\r\n }\r\n\r\n .chip:hover {\r\n filter: brightness(0.92);\r\n box-shadow: var(--rel-shadows-shadow-100);\r\n }\r\n\r\n .chip:focus-visible {\r\n outline: 2px solid var(--rel-colors-blue-primary, #0091ea);\r\n outline-offset: 2px;\r\n }\r\n\r\n /* TONES */\r\n .chip-default {\r\n background: var(--rel-colors-gray-border);\r\n color: var(--rel-colors-black);\r\n }\r\n\r\n .chip-blue {\r\n background: var(--rel-colors-blue-tertiary);\r\n color: var(--rel-colors-white);\r\n }\r\n\r\n .chip-yellow {\r\n background: var(--rel-colors-yellow-pending);\r\n color: var(--rel-colors-black);\r\n }\r\n\r\n .chip-red {\r\n background: var(--rel-colors-red-secondary);\r\n color: var(--rel-colors-white);\r\n }\r\n\r\n .chip-green {\r\n background: var(--rel-colors-green-success);\r\n color: var(--rel-colors-white);\r\n }\r\n\r\n /* OUTLINE */\r\n .chip-outline {\r\n background: transparent;\r\n }\r\n\r\n .chip-avatar {\r\n width: 20px;\r\n height: 20px;\r\n border-radius: 50%;\r\n object-fit: cover;\r\n }\r\n\r\n .chip-icon ::slotted(svg),\r\n .chip-icon svg {\r\n width: 16px;\r\n height: 16px;\r\n fill: currentColor;\r\n }\r\n\r\n .chip-remove {\r\n margin-left: var(--rel-spacing-space-3xs);\r\n cursor: pointer;\r\n opacity: 0.7;\r\n background: none;\r\n border: none;\r\n color: inherit;\r\n font: inherit;\r\n padding: 0;\r\n line-height: 1;\r\n }\r\n\r\n .chip-remove:hover {\r\n opacity: 1;\r\n }\r\n\r\n .chip-remove:focus-visible {\r\n outline: 2px solid var(--rel-colors-white, #fff);\r\n outline-offset: 1px;\r\n border-radius: 2px;\r\n }\r\n `;\r\n\r\n private get classes() {\r\n return [\r\n \"chip\",\r\n `chip-${this.tone}`,\r\n this.outline ? \"chip-outline\" : \"\",\r\n ].join(\" \");\r\n }\r\n\r\n private handleRemove(event: Event) {\r\n event.stopPropagation();\r\n this.removed = true;\r\n\r\n this.dispatchEvent(\r\n new CustomEvent(\"removed\", {\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 <span\r\n class=\"${this.classes}\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n aria-label=\"${this.label}\"\r\n >\r\n ${this.avatar\r\n ? html`<img src=${this.avatar} alt=\"\" class=\"chip-avatar\" />`\r\n : null}\r\n ${this.leadingIcon\r\n ? html`<span class=\"chip-icon\">\r\n ${this.renderIcon(this.leadingIcon)}\r\n </span>`\r\n : null}\r\n\r\n <span class=\"chip-label\">${this.label}</span>\r\n\r\n ${this.trailingIcon\r\n ? html`<span class=\"chip-icon\">\r\n ${this.renderIcon(this.trailingIcon)}\r\n </span>`\r\n : null}\r\n ${this.removable\r\n ? html`<button\r\n class=\"chip-remove\"\r\n aria-label=\"Remove ${this.label}\"\r\n @click=${this.handleRemove}\r\n >\r\n ✕\r\n </button>`\r\n : null}\r\n </span>\r\n `;\r\n }\r\n\r\n private renderIcon(iconString: string) {\r\n const template = document.createElement(\"template\");\r\n template.innerHTML = iconString.trim();\r\n return template.content.cloneNode(true);\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-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-colors-white);\r\n }\r\n\r\n .bg-light {\r\n background-color: var(--rel-colors-gray-light);\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-colors-gray-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-colors-gray-border);\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-colors-gray-border);\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 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\n\r\nexport type DrawerSide = \"bottom\" | \"left\" | \"right\" | \"top\";\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 = \"420px\";\r\n @property({ type: Boolean, reflect: true }) disabled = false;\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 :host([disabled]) {\r\n pointer-events: none;\r\n opacity: 0.6;\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: 1;\r\n }\r\n\r\n /* Panel base */\r\n .panel {\r\n position: absolute;\r\n background: var(--rel-colors-white);\r\n box-shadow: var(--rel-shadows-shadow-500);\r\n display: flex;\r\n flex-direction: column;\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: 0;\r\n right: 0;\r\n max-height: var(--drawer-max-height, 80vh);\r\n border-top-left-radius: var(--rel-borders-radius-border-radius-300);\r\n border-top-right-radius: var(--rel-borders-radius-border-radius-300);\r\n transform: translateY(100%);\r\n }\r\n\r\n .drawer-container.open .panel[data-side=\"bottom\"] {\r\n transform: 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, 420px);\r\n max-width: 90vw;\r\n border-top-right-radius: var(--rel-borders-radius-border-radius-300);\r\n border-bottom-right-radius: var(--rel-borders-radius-border-radius-300);\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, 420px);\r\n max-width: 90vw;\r\n border-top-left-radius: var(--rel-borders-radius-border-radius-300);\r\n border-bottom-left-radius: var(--rel-borders-radius-border-radius-300);\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 /* Top drawer */\r\n .panel[data-side=\"top\"] {\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n max-height: var(--drawer-max-height, 80vh);\r\n border-bottom-left-radius: var(--rel-borders-radius-border-radius-300);\r\n border-bottom-right-radius: var(--rel-borders-radius-border-radius-300);\r\n transform: translateY(-100%);\r\n }\r\n\r\n .drawer-container.open .panel[data-side=\"top\"] {\r\n transform: translateY(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 /* Handle */\r\n .handle {\r\n width: 48px;\r\n height: 4px;\r\n background: var(--rel-colors-gray-divider);\r\n border-radius: var(--rel-borders-radius-border-radius-500);\r\n margin: var(--rel-spacing-space-sm) auto var(--rel-spacing-space-xs);\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-colors-gray-border);\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: center;\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 border-radius: var(--rel-borders-radius-border-radius-100);\r\n color: var(--rel-colors-gray-primary, #333);\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-colors-gray-divider, #bdbdbd);\r\n }\r\n\r\n .close-button:focus-visible {\r\n outline: 2px solid var(--rel-colors-blue-primary, #0091ea);\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 padding: var(--rel-spacing-space-md) var(--rel-spacing-space-lg);\r\n border-top: var(--rel-borders-width-stroke-100) solid var(--rel-colors-gray-border);\r\n }\r\n\r\n .footer.empty {\r\n display: none;\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 setTimeout(() => {\r\n this.focusPanel();\r\n }, 50);\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 setTimeout(() => {\r\n this.previousFocus?.focus();\r\n this.previousFocus = null;\r\n }, 50);\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 focusPanel() {\r\n if (!this.panelElement) return;\r\n\r\n const focusable = this.getFocusableElements();\r\n if (focusable.length > 0) {\r\n focusable[0].focus();\r\n } else {\r\n this.panelElement.focus();\r\n }\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 this.dispatchEvent(\r\n new CustomEvent(\"rel-close\", {\r\n detail: { reason },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\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: 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 private hasSlotContent(slotName?: string): boolean {\r\n const slot = this.shadowRoot?.querySelector(\r\n slotName ? `slot[name=\"${slotName}\"]` : \"slot:not([name])\"\r\n ) as HTMLSlotElement;\r\n return slot ? slot.assignedElements({ flatten: true }).length > 0 : false;\r\n }\r\n\r\n render() {\r\n const hasTitle = this.hasSlotContent(\"title\");\r\n const hasDescription = this.hasSlotContent(\"description\");\r\n const hasFooter = this.hasSlotContent(\"footer\");\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.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=\"--drawer-width: ${this.width}; --drawer-max-height: ${this\r\n .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\">\r\n <slot name=\"title\"></slot>\r\n </h2>`\r\n : \"\"}\r\n ${hasDescription\r\n ? html`<p class=\"description\">\r\n <slot name=\"description\"></slot>\r\n </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 <svg\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M12.8 4.27L11.73 3.2L8 6.93L4.27 3.2L3.2 4.27L6.93 8L3.2 11.73L4.27 12.8L8 9.07L11.73 12.8L12.8 11.73L9.07 8L12.8 4.27Z\"\r\n fill=\"currentColor\" />\r\n </svg>\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 ${hasFooter\r\n ? html`<div part=\"footer\" class=\"footer\">\r\n <slot name=\"footer\"></slot>\r\n </div>`\r\n : \"\"}\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\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\r\n@customElement(\"rel-kbd\")\r\nexport class RelKbd extends LitElement {\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: \"default\" | \"muted\" = \"default\";\r\n\r\n @property({ type: Boolean, reflect: true })\r\n pill = false;\r\n\r\n @property({ type: Boolean, reflect: true })\r\n inset = false;\r\n\r\n static styles = css`\r\n :host {\r\n display: inline-flex;\r\n }\r\n\r\n kbd {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-family: var(--rel-fontFamilies-primary);\r\n font-weight: var(--rel-fontWeights-medium);\r\n white-space: nowrap;\r\n user-select: none;\r\n transition: all 0.15s ease;\r\n line-height: 1;\r\n vertical-align: middle;\r\n }\r\n\r\n /* Size variants */\r\n .kbd-sm {\r\n font-size: var(--rel-fontSizes-xs);\r\n padding: var(--rel-spacing-space-3xs) var(--rel-spacing-space-xs);\r\n min-width: 20px;\r\n height: 20px;\r\n border-radius: var(--rel-borders-radius-border-radius-100);\r\n }\r\n\r\n .kbd-md {\r\n font-size: var(--rel-fontSizes-sm);\r\n padding: var(--rel-spacing-space-2xs) var(--rel-spacing-space-sm);\r\n min-width: 24px;\r\n height: 24px;\r\n border-radius: var(--rel-borders-radius-border-radius-100);\r\n }\r\n\r\n .kbd-lg {\r\n font-size: var(--rel-fontSizes-md);\r\n padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-md);\r\n min-width: 32px;\r\n height: 32px;\r\n border-radius: var(--rel-borders-radius-border-radius-200);\r\n }\r\n\r\n /* Variant: default */\r\n .kbd-default {\r\n background: var(--rel-colors-gray-light);\r\n color: var(--rel-colors-gray-heading);\r\n border: var(--rel-borders-width-stroke-100) solid var(--rel-colors-gray-border);\r\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05), 0 1px 0 0 rgba(255, 255, 255, 0.5) inset;\r\n }\r\n\r\n /* Variant: muted */\r\n .kbd-muted {\r\n background: var(--rel-surface-secondary, #fafafa);\r\n color: var(--rel-colors-gray-placeholder);\r\n border: var(--rel-borders-width-stroke-100) solid var(--rel-colors-gray-divider);\r\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.03);\r\n }\r\n\r\n /* Pill modifier */\r\n :host([pill]) .kbd-sm {\r\n border-radius: var(--rel-borders-radius-border-radius-500);\r\n }\r\n\r\n :host([pill]) .kbd-md {\r\n border-radius: var(--rel-borders-radius-border-radius-500);\r\n }\r\n\r\n :host([pill]) .kbd-lg {\r\n border-radius: var(--rel-borders-radius-border-radius-500);\r\n }\r\n\r\n /* Inset modifier - pressed appearance */\r\n :host([inset]) kbd {\r\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1) inset, 0 1px 0 0 rgba(0, 0, 0, 0.05);\r\n transform: translateY(1px);\r\n }\r\n\r\n :host([inset]) .kbd-default {\r\n background: var(--rel-surface-secondary, #fafafa);\r\n border-color: var(--rel-colors-gray-divider);\r\n }\r\n\r\n :host([inset]) .kbd-muted {\r\n background: var(--rel-colors-gray-divider);\r\n border-color: var(--rel-colors-gray-border);\r\n }\r\n `;\r\n\r\n private get classes() {\r\n return [\"kbd\", `kbd-${this.size}`, `kbd-${this.variant}`].join(\" \");\r\n }\r\n\r\n render() {\r\n return html`\r\n <kbd class=\"${this.classes}\" role=\"presentation\">\r\n <slot></slot>\r\n </kbd>\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\n@customElement(\"rel-layout\")\r\nexport class RelLayout extends LitElement {\r\n @property({ type: String }) gap = \"1rem\";\r\n\r\n @property({ type: Number }) columns = 4;\r\n\r\n // 🔥 IMPORTANT: reflect so CSS selectors work\r\n @property({ type: Boolean, reflect: true }) responsive = true;\r\n\r\n static styles = css`\r\n :host {\r\n display: block;\r\n width: 100%;\r\n }\r\n\r\n .layout-grid {\r\n display: grid;\r\n width: 100%;\r\n font-family: var(--rel-fontFamilies-primary);\r\n }\r\n\r\n /* Responsive breakpoints — only when attribute exists */\r\n @media (max-width: 1024px) {\r\n :host([responsive]) .layout-grid {\r\n grid-template-columns: repeat(3, 1fr) !important;\r\n }\r\n }\r\n\r\n @media (max-width: 768px) {\r\n :host([responsive]) .layout-grid {\r\n grid-template-columns: repeat(2, 1fr) !important;\r\n }\r\n }\r\n\r\n @media (max-width: 480px) {\r\n :host([responsive]) .layout-grid {\r\n grid-template-columns: 1fr !important;\r\n }\r\n }\r\n `;\r\n\r\n render() {\r\n return html`\r\n <div\r\n class=\"layout-grid\"\r\n style=\"\r\n gap: ${this.gap};\r\n grid-template-columns: repeat(${this.columns}, 1fr);\r\n \"\r\n >\r\n <slot></slot>\r\n </div>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property, state } from \"lit/decorators.js\";\r\n\r\nexport type MenuType = \"default\" | \"checkbox\" | \"arrow\";\r\n\r\nexport interface MenuItem {\r\n label: string;\r\n active?: boolean;\r\n checked?: boolean;\r\n disabled?: boolean;\r\n submenu?: MenuItem[];\r\n open?: boolean;\r\n}\r\n\r\n@customElement(\"rel-menu\")\r\nexport class RelMenu extends LitElement {\r\n @property({ type: String }) type: MenuType = \"default\";\r\n\r\n @property({ type: Array }) items: MenuItem[] = [];\r\n\r\n @state() private focusedIndex: number = 0;\r\n\r\n static styles = css`\r\n :host {\r\n display: inline-block;\r\n }\r\n\r\n .rel-menu {\r\n position: relative;\r\n display: inline-block;\r\n background: var(--rel-colors-white, #fff);\r\n color: var(--rel-text-primary, #333);\r\n border-radius: var(--rel-borders-radius-border-radius-300);\r\n box-shadow: var(--rel-shadows-shadow-300);\r\n min-width: 220px;\r\n font-family: var(--rel-fontFamilies-primary, sans-serif);\r\n font-size: var(--rel-fontSizes-sm);\r\n padding: var(--rel-spacing-space-3xs) 0;\r\n outline: none;\r\n }\r\n\r\n .rel-menu:focus-visible {\r\n outline: 2px solid var(--rel-colors-blue-primary, #0091ea);\r\n outline-offset: 2px;\r\n }\r\n\r\n .rel-menu-item {\r\n position: relative;\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-space-xs);\r\n padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-sm);\r\n line-height: var(--rel-lineHeights-sm);\r\n cursor: pointer;\r\n transition: background 0.15s ease, color 0.15s ease;\r\n user-select: none;\r\n }\r\n\r\n .rel-menu-item:hover {\r\n background: var(--rel-surface-secondary, #fafafa);\r\n }\r\n\r\n .rel-menu-item:active {\r\n background: var(--rel-colors-gray-divider, #bdbdbd);\r\n }\r\n\r\n .rel-menu-item.active {\r\n background: var(--rel-surface-secondary, #fafafa);\r\n font-weight: var(--rel-fontWeights-medium);\r\n }\r\n\r\n .rel-menu-item.disabled {\r\n background-color: transparent;\r\n color: var(--rel-text-disabled, #9e9e9e);\r\n cursor: not-allowed;\r\n }\r\n\r\n .rel-menu-item[data-focused=\"true\"] {\r\n outline: 2px solid var(--rel-colors-blue-primary, #0091ea);\r\n outline-offset: -2px;\r\n }\r\n\r\n .menu-check-row {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-space-2xs);\r\n width: 100%;\r\n }\r\n\r\n .menu-checkbox {\r\n width: 16px;\r\n height: 16px;\r\n cursor: pointer;\r\n }\r\n\r\n .menu-checkbox:disabled {\r\n cursor: not-allowed;\r\n }\r\n\r\n .menu-label {\r\n flex: 1 1 auto;\r\n }\r\n\r\n .chevron {\r\n font-size: var(--rel-fontSizes-lg);\r\n opacity: 0.75;\r\n transform: translateY(1px);\r\n }\r\n\r\n .rel-submenu {\r\n position: absolute;\r\n top: calc(-1 * var(--rel-spacing-space-3xs));\r\n left: calc(100% + var(--rel-spacing-space-2xs));\r\n min-width: 200px;\r\n background: var(--rel-colors-white, #fff);\r\n color: var(--rel-text-primary, #333);\r\n border-radius: var(--rel-borders-radius-border-radius-300);\r\n box-shadow: var(--rel-shadows-shadow-300);\r\n padding: var(--rel-spacing-space-3xs) 0;\r\n display: none;\r\n z-index: 20;\r\n }\r\n\r\n .rel-submenu.visible {\r\n display: block;\r\n }\r\n\r\n .rel-submenu .rel-menu-item {\r\n padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-sm);\r\n }\r\n `;\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n document.addEventListener(\"click\", this.handleDocumentClick);\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback();\r\n document.removeEventListener(\"click\", this.handleDocumentClick);\r\n }\r\n\r\n private handleDocumentClick = (e: MouseEvent) => {\r\n const path = e.composedPath() as HTMLElement[];\r\n const hit = path.some((n) => n?.classList?.contains(\"rel-menu\"));\r\n if (!hit) {\r\n this.items.forEach((i) => (i.open = false));\r\n this.requestUpdate();\r\n }\r\n };\r\n\r\n private onItemEnter(item: MenuItem) {\r\n if (this.type === \"arrow\" && item.submenu?.length) {\r\n this.items.forEach((i) => {\r\n if (i !== item) i.open = false;\r\n });\r\n item.open = true;\r\n this.requestUpdate();\r\n }\r\n }\r\n\r\n private onItemLeave(_item: MenuItem) {\r\n // Keep open so user can move into submenu\r\n }\r\n\r\n private onItemClick(item: MenuItem, index: number, ev?: Event) {\r\n ev?.stopPropagation();\r\n if (item.disabled) return;\r\n\r\n this.focusedIndex = index;\r\n\r\n if (this.type === \"checkbox\") {\r\n item.checked = !item.checked;\r\n this.dispatchEvent(\r\n new CustomEvent(\"item-checked\", {\r\n detail: { item, checked: item.checked },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n this.requestUpdate();\r\n return;\r\n }\r\n\r\n if (this.type === \"arrow\" && item.submenu?.length) {\r\n const next = !item.open;\r\n this.items.forEach((i) => (i.open = false));\r\n item.open = next;\r\n this.requestUpdate();\r\n return;\r\n }\r\n\r\n // Default: set active\r\n this.items.forEach((i) => (i.active = false));\r\n item.active = true;\r\n this.dispatchEvent(\r\n new CustomEvent(\"item-selected\", {\r\n detail: { item },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n this.requestUpdate();\r\n }\r\n\r\n private onSubClick(parent: MenuItem, sub: MenuItem, ev?: Event) {\r\n ev?.stopPropagation();\r\n this.items.forEach((i) => {\r\n i.active = false;\r\n i.submenu?.forEach((s) => (s.active = false));\r\n });\r\n sub.active = true;\r\n parent.open = false;\r\n this.dispatchEvent(\r\n new CustomEvent(\"submenu-selected\", {\r\n detail: { parent, sub },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n this.requestUpdate();\r\n }\r\n\r\n private toggleCheckbox(item: MenuItem, ev: Event) {\r\n ev.stopPropagation();\r\n if (!item.disabled) {\r\n item.checked = !item.checked;\r\n this.dispatchEvent(\r\n new CustomEvent(\"item-checked\", {\r\n detail: { item, checked: item.checked },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n this.requestUpdate();\r\n }\r\n }\r\n\r\n private onKeydown(ev: KeyboardEvent) {\r\n const last = this.items.length - 1;\r\n\r\n if (ev.key === \"ArrowDown\") {\r\n this.focusedIndex = Math.min(last, this.focusedIndex + 1);\r\n ev.preventDefault();\r\n } else if (ev.key === \"ArrowUp\") {\r\n this.focusedIndex = Math.max(0, this.focusedIndex - 1);\r\n ev.preventDefault();\r\n } else if (ev.key === \"ArrowRight\") {\r\n const item = this.items[this.focusedIndex];\r\n if (this.type === \"arrow\" && item?.submenu?.length) {\r\n item.open = true;\r\n this.requestUpdate();\r\n }\r\n } else if (ev.key === \"ArrowLeft\" || ev.key === \"Escape\") {\r\n this.items.forEach((i) => (i.open = false));\r\n this.requestUpdate();\r\n } else if (ev.key === \"Enter\" || ev.key === \" \") {\r\n const item = this.items[this.focusedIndex];\r\n this.onItemClick(item, this.focusedIndex);\r\n ev.preventDefault();\r\n }\r\n }\r\n\r\n private renderMenuItem(item: MenuItem, index: number) {\r\n const isFocused = this.focusedIndex === index;\r\n\r\n return html`\r\n <div\r\n class=\"rel-menu-item ${item.active ? \"active\" : \"\"} ${item.disabled ? \"disabled\" : \"\"}\"\r\n role=\"menuitem\"\r\n ?data-focused=\"${isFocused}\"\r\n @mouseenter=\"${() => this.onItemEnter(item)}\"\r\n @mouseleave=\"${() => this.onItemLeave(item)}\"\r\n @click=\"${(e: Event) => this.onItemClick(item, index, e)}\">\r\n ${this.type === \"checkbox\"\r\n ? html`\r\n <div class=\"menu-check-row\">\r\n <input\r\n class=\"menu-checkbox\"\r\n type=\"checkbox\"\r\n .checked=\"${item.checked || false}\"\r\n ?disabled=\"${item.disabled}\"\r\n @click=\"${(e: Event) => this.toggleCheckbox(item, e)}\" />\r\n <span class=\"menu-label\">${item.label}</span>\r\n </div>\r\n `\r\n : html`\r\n <span class=\"menu-label\">${item.label}</span>\r\n ${this.type === \"arrow\" && item.submenu?.length\r\n ? html`<span class=\"chevron\">▸</span>`\r\n : \"\"}\r\n `}\r\n ${this.type === \"arrow\" && item.submenu?.length\r\n ? html`\r\n <div\r\n class=\"rel-submenu ${item.open ? \"visible\" : \"\"}\"\r\n @click=\"${(e: Event) => e.stopPropagation()}\">\r\n ${item.submenu.map(\r\n (sub) => html`\r\n <div\r\n class=\"rel-menu-item ${sub.active ? \"active\" : \"\"}\"\r\n role=\"menuitem\"\r\n @click=\"${(e: Event) => this.onSubClick(item, sub, e)}\">\r\n <span class=\"menu-label\">${sub.label}</span>\r\n </div>\r\n `\r\n )}\r\n </div>\r\n `\r\n : \"\"}\r\n </div>\r\n `;\r\n }\r\n\r\n render() {\r\n return html`\r\n <div\r\n class=\"rel-menu\"\r\n role=\"menu\"\r\n tabindex=\"0\"\r\n @keydown=\"${this.onKeydown}\"\r\n @click=\"${(e: Event) => e.stopPropagation()}\">\r\n ${this.items.map((item, index) => this.renderMenuItem(item, index))}\r\n </div>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, state, query } from \"lit/decorators.js\";\r\nimport { RelMenubarMenu } from \"./rel-menubar-menu\";\r\n\r\ninterface MenuState {\r\n menu: RelMenubarMenu;\r\n open: boolean;\r\n panelElement?: HTMLElement;\r\n}\r\n\r\n@customElement(\"rel-menubar\")\r\nexport class RelMenubar extends LitElement {\r\n @state() private menus: MenuState[] = [];\r\n @state() private openMenuIndex: number = -1;\r\n @state() private focusedTriggerIndex: number = 0;\r\n @state() private focusedItemIndex: number = 0;\r\n @state() private openSubmenuElement: HTMLElement | null = null;\r\n\r\n @query(\".menubar-container\") private container!: HTMLElement;\r\n\r\n private hoverSwitchEnabled = false;\r\n\r\n static styles = css`\r\n :host {\r\n display: block;\r\n }\r\n\r\n .menubar-container {\r\n display: flex;\r\n align-items: center;\r\n background: var(--rel-colors-gray-light);\r\n border: var(--rel-borders-width-stroke-100) solid var(--rel-colors-gray-border);\r\n border-radius: var(--rel-borders-radius-border-radius-200);\r\n padding: var(--rel-spacing-space-3xs);\r\n gap: var(--rel-spacing-space-3xs);\r\n font-family: var(--rel-fontFamilies-primary);\r\n font-size: var(--rel-fontSizes-sm);\r\n }\r\n\r\n .menubar-trigger {\r\n padding: var(--rel-spacing-space-2xs) var(--rel-spacing-space-sm);\r\n border-radius: var(--rel-borders-radius-border-radius-100);\r\n background: transparent;\r\n border: none;\r\n cursor: pointer;\r\n font-family: inherit;\r\n font-size: inherit;\r\n color: var(--rel-colors-gray-heading);\r\n transition: background 0.15s ease;\r\n user-select: none;\r\n outline: none;\r\n }\r\n\r\n .menubar-trigger:hover {\r\n background: var(--rel-surface-secondary, #fafafa);\r\n }\r\n\r\n .menubar-trigger:focus-visible {\r\n outline: 2px solid var(--rel-colors-blue-primary);\r\n outline-offset: 2px;\r\n }\r\n\r\n .menubar-trigger.active {\r\n background: var(--rel-surface-secondary, #fafafa);\r\n }\r\n\r\n .menubar-panel {\r\n position: fixed;\r\n min-width: 220px;\r\n background: var(--rel-colors-white);\r\n border: var(--rel-borders-width-stroke-100) solid var(--rel-colors-gray-border);\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-2xs) 0;\r\n z-index: 1000;\r\n display: none;\r\n }\r\n\r\n .menubar-panel.open {\r\n display: block;\r\n }\r\n\r\n .menu-item {\r\n position: relative;\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: var(--rel-spacing-space-sm);\r\n padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-md);\r\n cursor: pointer;\r\n transition: background 0.15s ease;\r\n user-select: none;\r\n color: var(--rel-colors-gray-heading);\r\n line-height: var(--rel-lineHeights-sm);\r\n }\r\n\r\n .menu-item:hover,\r\n .menu-item.focused {\r\n background: var(--rel-surface-secondary, #fafafa);\r\n }\r\n\r\n .menu-item[data-disabled=\"true\"] {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n }\r\n\r\n .menu-separator {\r\n height: var(--rel-borders-width-stroke-100);\r\n background: var(--rel-colors-gray-divider);\r\n margin: var(--rel-spacing-space-2xs) var(--rel-spacing-space-xs);\r\n }\r\n\r\n .menu-checkbox,\r\n .menu-radio-item {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-space-xs);\r\n padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-md);\r\n cursor: pointer;\r\n transition: background 0.15s ease;\r\n user-select: none;\r\n color: var(--rel-colors-gray-heading);\r\n line-height: var(--rel-lineHeights-sm);\r\n }\r\n\r\n .menu-checkbox:hover,\r\n .menu-checkbox.focused,\r\n .menu-radio-item:hover,\r\n .menu-radio-item.focused {\r\n background: var(--rel-surface-secondary, #fafafa);\r\n }\r\n\r\n .menu-checkbox input[type=\"checkbox\"],\r\n .menu-radio-item::before {\r\n margin: 0;\r\n }\r\n\r\n .menu-radio-item {\r\n position: relative;\r\n padding-left: calc(var(--rel-spacing-space-md) + var(--rel-spacing-space-md));\r\n }\r\n\r\n .menu-radio-item::before {\r\n content: \"\";\r\n position: absolute;\r\n left: var(--rel-spacing-space-md);\r\n width: 12px;\r\n height: 12px;\r\n border-radius: 50%;\r\n border: var(--rel-borders-width-stroke-150) solid var(--rel-colors-gray-border);\r\n background: var(--rel-colors-white);\r\n }\r\n\r\n .menu-radio-item.checked::after {\r\n content: \"\";\r\n position: absolute;\r\n left: calc(var(--rel-spacing-space-md) + 3px);\r\n width: 6px;\r\n height: 6px;\r\n border-radius: 50%;\r\n background: var(--rel-colors-blue-primary);\r\n }\r\n\r\n .menu-submenu-trigger {\r\n position: relative;\r\n }\r\n\r\n .menu-submenu-trigger::after {\r\n content: \"▸\";\r\n opacity: 0.6;\r\n font-size: var(--rel-fontSizes-sm);\r\n }\r\n\r\n .submenu-panel {\r\n position: fixed;\r\n min-width: 200px;\r\n background: var(--rel-colors-white);\r\n border: var(--rel-borders-width-stroke-100) solid var(--rel-colors-gray-border);\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-2xs) 0;\r\n z-index: 1001;\r\n display: none;\r\n }\r\n\r\n .submenu-panel.open {\r\n display: block;\r\n }\r\n\r\n .menu-shortcut {\r\n opacity: 0.6;\r\n font-size: var(--rel-fontSizes-xs);\r\n margin-left: auto;\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-space-3xs);\r\n }\r\n `;\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n this.discoverMenus();\r\n document.addEventListener(\"click\", this.handleOutsideClick);\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback();\r\n document.removeEventListener(\"click\", this.handleOutsideClick);\r\n }\r\n\r\n private discoverMenus() {\r\n const menuElements = Array.from(\r\n this.querySelectorAll(\"rel-menubar-menu\")\r\n ) as RelMenubarMenu[];\r\n this.menus = menuElements.map((menu) => ({ menu, open: false }));\r\n }\r\n\r\n private handleOutsideClick = (e: MouseEvent) => {\r\n const path = e.composedPath() as HTMLElement[];\r\n const isInside = path.some(\r\n (el) =>\r\n el === this ||\r\n el.classList?.contains(\"menubar-panel\") ||\r\n el.classList?.contains(\"submenu-panel\")\r\n );\r\n if (!isInside) {\r\n this.closeAllMenus();\r\n }\r\n };\r\n\r\n private closeAllMenus() {\r\n this.openMenuIndex = -1;\r\n this.openSubmenuElement = null;\r\n this.hoverSwitchEnabled = false;\r\n this.requestUpdate();\r\n }\r\n\r\n private openMenu(index: number, triggerElement: HTMLElement) {\r\n this.openMenuIndex = index;\r\n this.focusedItemIndex = 0;\r\n this.openSubmenuElement = null;\r\n this.requestUpdate();\r\n\r\n // Position the panel below the trigger\r\n this.updateComplete.then(() => {\r\n const panel = this.shadowRoot?.querySelector(\r\n `.menubar-panel[data-menu-index=\"${index}\"]`\r\n ) as HTMLElement;\r\n if (panel && triggerElement) {\r\n const rect = triggerElement.getBoundingClientRect();\r\n panel.style.top = `${rect.bottom + 4}px`;\r\n panel.style.left = `${rect.left}px`;\r\n }\r\n });\r\n }\r\n\r\n private handleTriggerClick(index: number, event: Event) {\r\n const target = event.currentTarget as HTMLElement;\r\n if (this.openMenuIndex === index) {\r\n this.closeAllMenus();\r\n } else {\r\n this.openMenu(index, target);\r\n this.hoverSwitchEnabled = true;\r\n }\r\n }\r\n\r\n private handleTriggerMouseEnter(index: number, event: Event) {\r\n if (this.openMenuIndex !== -1 && this.hoverSwitchEnabled) {\r\n const target = event.currentTarget as HTMLElement;\r\n this.openMenu(index, target);\r\n }\r\n }\r\n\r\n private handleTriggerKeyDown(event: KeyboardEvent) {\r\n const { key } = event;\r\n\r\n if (key === \"ArrowRight\") {\r\n event.preventDefault();\r\n this.focusedTriggerIndex = Math.min(\r\n this.menus.length - 1,\r\n this.focusedTriggerIndex + 1\r\n );\r\n this.focusTrigger(this.focusedTriggerIndex);\r\n } else if (key === \"ArrowLeft\") {\r\n event.preventDefault();\r\n this.focusedTriggerIndex = Math.max(0, this.focusedTriggerIndex - 1);\r\n this.focusTrigger(this.focusedTriggerIndex);\r\n } else if (key === \"Enter\" || key === \" \") {\r\n event.preventDefault();\r\n const trigger = this.shadowRoot?.querySelector(\r\n `.menubar-trigger[data-index=\"${this.focusedTriggerIndex}\"]`\r\n ) as HTMLElement;\r\n if (trigger) {\r\n this.openMenu(this.focusedTriggerIndex, trigger);\r\n // Focus first item\r\n setTimeout(() => this.focusMenuItem(0), 50);\r\n }\r\n } else if (key === \"ArrowDown\" && this.openMenuIndex !== -1) {\r\n event.preventDefault();\r\n this.focusMenuItem(0);\r\n }\r\n }\r\n\r\n private focusTrigger(index: number) {\r\n const trigger = this.shadowRoot?.querySelector(\r\n `.menubar-trigger[data-index=\"${index}\"]`\r\n ) as HTMLElement;\r\n trigger?.focus();\r\n }\r\n\r\n private handlePanelKeyDown(event: KeyboardEvent) {\r\n const { key } = event;\r\n const menuContent = this.menus[this.openMenuIndex]?.menu;\r\n if (!menuContent) return;\r\n\r\n const items = this.getFocusableItems(menuContent);\r\n\r\n if (key === \"ArrowDown\") {\r\n event.preventDefault();\r\n this.focusedItemIndex = Math.min(items.length - 1, this.focusedItemIndex + 1);\r\n this.requestUpdate();\r\n } else if (key === \"ArrowUp\") {\r\n event.preventDefault();\r\n this.focusedItemIndex = Math.max(0, this.focusedItemIndex - 1);\r\n this.requestUpdate();\r\n } else if (key === \"ArrowRight\") {\r\n event.preventDefault();\r\n const currentItem = items[this.focusedItemIndex];\r\n if (currentItem?.hasAttribute(\"data-submenu\")) {\r\n this.openSubmenu(currentItem as HTMLElement);\r\n }\r\n } else if (key === \"ArrowLeft\") {\r\n event.preventDefault();\r\n if (this.openSubmenuElement) {\r\n this.openSubmenuElement = null;\r\n this.requestUpdate();\r\n }\r\n } else if (key === \"Escape\") {\r\n event.preventDefault();\r\n this.closeAllMenus();\r\n this.focusTrigger(this.openMenuIndex);\r\n } else if (key === \"Enter\" || key === \" \") {\r\n event.preventDefault();\r\n const currentItem = items[this.focusedItemIndex];\r\n if (currentItem) {\r\n this.handleItemClick(currentItem as HTMLElement);\r\n }\r\n }\r\n }\r\n\r\n private getFocusableItems(menuContent: RelMenubarMenu): Element[] {\r\n return Array.from(menuContent.children).filter(\r\n (el) =>\r\n el.hasAttribute(\"data-item\") ||\r\n el.hasAttribute(\"data-checkbox\") ||\r\n el.hasAttribute(\"data-radio\") ||\r\n el.hasAttribute(\"data-submenu\")\r\n );\r\n }\r\n\r\n private focusMenuItem(index: number) {\r\n this.focusedItemIndex = index;\r\n const panel = this.shadowRoot?.querySelector(\r\n `.menubar-panel[data-menu-index=\"${this.openMenuIndex}\"]`\r\n ) as HTMLElement;\r\n panel?.focus();\r\n }\r\n\r\n private handleItemClick(item: HTMLElement) {\r\n if (item.hasAttribute(\"data-checkbox\")) {\r\n const checkbox = item.querySelector('input[type=\"checkbox\"]') as HTMLInputElement;\r\n if (checkbox) {\r\n checkbox.checked = !checkbox.checked;\r\n this.dispatchChangeEvent(\"checkbox\", item.textContent?.trim() || \"\", checkbox.checked);\r\n }\r\n } else if (item.hasAttribute(\"data-radio\")) {\r\n const radioGroup = item.closest(\"[data-radio-group]\") as HTMLElement;\r\n const value = item.getAttribute(\"data-radio\") || item.getAttribute(\"value\") || \"\";\r\n const name = radioGroup?.getAttribute(\"name\") || \"\";\r\n\r\n // Update visual state\r\n const allRadios = radioGroup?.querySelectorAll(\"[data-radio]\");\r\n allRadios?.forEach((radio) => radio.removeAttribute(\"data-checked\"));\r\n item.setAttribute(\"data-checked\", \"true\");\r\n\r\n // Update internal value\r\n if (radioGroup) {\r\n radioGroup.setAttribute(\"value\", value);\r\n }\r\n\r\n this.dispatchChangeEvent(\"radio\", name, value);\r\n this.requestUpdate();\r\n } else if (item.hasAttribute(\"data-submenu\")) {\r\n this.openSubmenu(item);\r\n } else {\r\n // Regular item click\r\n this.closeAllMenus();\r\n }\r\n }\r\n\r\n private openSubmenu(submenuTrigger: HTMLElement) {\r\n this.openSubmenuElement = submenuTrigger;\r\n this.requestUpdate();\r\n\r\n this.updateComplete.then(() => {\r\n const submenuPanel = this.shadowRoot?.querySelector(\r\n `.submenu-panel[data-submenu-id=\"${submenuTrigger.getAttribute(\"data-submenu\") || \"\"}\"]`\r\n ) as HTMLElement;\r\n if (submenuPanel) {\r\n const rect = submenuTrigger.getBoundingClientRect();\r\n submenuPanel.style.top = `${rect.top}px`;\r\n submenuPanel.style.left = `${rect.right + 4}px`;\r\n }\r\n });\r\n }\r\n\r\n private handleSubmenuItemClick(item: HTMLElement) {\r\n // Regular item - just close\r\n this.closeAllMenus();\r\n }\r\n\r\n private dispatchChangeEvent(type: \"checkbox\" | \"radio\", labelOrName: string, value: string | boolean) {\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-menubar-change\", {\r\n detail: { type, [type === \"checkbox\" ? \"label\" : \"name\"]: labelOrName, [type === \"checkbox\" ? \"checked\" : \"value\"]: value },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private renderMenuItem(item: Element, index: number): any {\r\n const isFocused = index === this.focusedItemIndex;\r\n\r\n if (item.hasAttribute(\"data-item\")) {\r\n const button = item as HTMLButtonElement;\r\n const disabled = button.disabled;\r\n const shortcut = button.getAttribute(\"data-shortcut\") || \"\";\r\n\r\n return html`\r\n <div\r\n class=\"menu-item ${isFocused ? \"focused\" : \"\"}\"\r\n data-disabled=\"${disabled}\"\r\n @click=\"${() => !disabled && this.handleItemClick(item as HTMLElement)}\"\r\n >\r\n <span>${button.textContent}</span>\r\n ${shortcut ? html`<span class=\"menu-shortcut\">${shortcut}</span>` : \"\"}\r\n </div>\r\n `;\r\n }\r\n\r\n if (item.hasAttribute(\"data-separator\")) {\r\n return html`<div class=\"menu-separator\"></div>`;\r\n }\r\n\r\n if (item.hasAttribute(\"data-checkbox\")) {\r\n const label = item as HTMLLabelElement;\r\n const checkbox = label.querySelector('input[type=\"checkbox\"]') as HTMLInputElement;\r\n\r\n return html`\r\n <label\r\n class=\"menu-checkbox ${isFocused ? \"focused\" : \"\"}\"\r\n @click=\"${(e: Event) => {\r\n e.preventDefault();\r\n this.handleItemClick(item as HTMLElement);\r\n }}\"\r\n >\r\n <input type=\"checkbox\" .checked=\"${checkbox?.checked || false}\" @click=\"${(e: Event) => e.stopPropagation()}\" />\r\n <span>${label.textContent?.replace(/\\s+/g, \" \").trim()}</span>\r\n </label>\r\n `;\r\n }\r\n\r\n if (item.hasAttribute(\"data-submenu\")) {\r\n const label = item.getAttribute(\"label\") || item.textContent?.trim() || \"\";\r\n const submenuId = item.getAttribute(\"data-submenu\") || label;\r\n\r\n return html`\r\n <div\r\n class=\"menu-item menu-submenu-trigger ${isFocused ? \"focused\" : \"\"}\"\r\n @click=\"${() => this.openSubmenu(item as HTMLElement)}\"\r\n @mouseenter=\"${() => this.openSubmenu(item as HTMLElement)}\"\r\n >\r\n <span>${label}</span>\r\n </div>\r\n ${this.renderSubmenu(item as HTMLElement, submenuId)}\r\n `;\r\n }\r\n\r\n if (item.hasAttribute(\"data-radio-group\")) {\r\n const radioButtons = Array.from(item.querySelectorAll(\"[data-radio]\"));\r\n const currentValue = item.getAttribute(\"value\") || \"\";\r\n\r\n return html`\r\n ${radioButtons.map((radio) => {\r\n const value = radio.getAttribute(\"data-radio\") || radio.getAttribute(\"value\") || \"\";\r\n const isChecked = value === currentValue || radio.hasAttribute(\"data-checked\");\r\n const text = radio.textContent?.trim() || \"\";\r\n\r\n return html`\r\n <div\r\n class=\"menu-radio-item ${isChecked ? \"checked\" : \"\"} ${isFocused ? \"focused\" : \"\"}\"\r\n @click=\"${() => this.handleItemClick(radio as HTMLElement)}\"\r\n >\r\n <span>${text}</span>\r\n </div>\r\n `;\r\n })}\r\n `;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private renderSubmenu(submenuElement: HTMLElement, submenuId: string) {\r\n const isOpen = this.openSubmenuElement === submenuElement;\r\n const submenuItems = Array.from(submenuElement.children);\r\n\r\n return html`\r\n <div class=\"submenu-panel ${isOpen ? \"open\" : \"\"}\" data-submenu-id=\"${submenuId}\">\r\n ${submenuItems.map((subItem) => {\r\n if (subItem.hasAttribute(\"data-item\")) {\r\n const button = subItem as HTMLButtonElement;\r\n return html`\r\n <div\r\n class=\"menu-item\"\r\n @click=\"${() => this.handleSubmenuItemClick(subItem as HTMLElement)}\"\r\n >\r\n <span>${button.textContent}</span>\r\n </div>\r\n `;\r\n }\r\n return null;\r\n })}\r\n </div>\r\n `;\r\n }\r\n\r\n private renderMenuPanel(menuState: MenuState, index: number) {\r\n const isOpen = index === this.openMenuIndex;\r\n const items = Array.from(menuState.menu.children);\r\n\r\n return html`\r\n <div\r\n class=\"menubar-panel ${isOpen ? \"open\" : \"\"}\"\r\n data-menu-index=\"${index}\"\r\n tabindex=\"-1\"\r\n @keydown=\"${this.handlePanelKeyDown}\"\r\n >\r\n ${items.map((item, idx) => this.renderMenuItem(item, idx))}\r\n </div>\r\n `;\r\n }\r\n\r\n render() {\r\n return html`\r\n <div class=\"menubar-container\">\r\n ${this.menus.map(\r\n (menuState, index) => html`\r\n <button\r\n class=\"menubar-trigger ${index === this.openMenuIndex ? \"active\" : \"\"}\"\r\n data-index=\"${index}\"\r\n @click=\"${(e: Event) => this.handleTriggerClick(index, e)}\"\r\n @mouseenter=\"${(e: Event) => this.handleTriggerMouseEnter(index, e)}\"\r\n @keydown=\"${this.handleTriggerKeyDown}\"\r\n >\r\n ${menuState.menu.label}\r\n </button>\r\n `\r\n )}\r\n </div>\r\n ${this.menus.map((menuState, index) => this.renderMenuPanel(menuState, index))}\r\n <slot style=\"display: none;\"></slot>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\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`<slot></slot>`;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property, state, query } from \"lit/decorators.js\";\r\nimport { RelNavMenuItem } from \"./rel-nav-menu-item\";\r\n\r\ntype DensityType = \"comfortable\" | \"compact\";\r\n\r\n@customElement(\"rel-nav-menu\")\r\nexport class RelNavMenu extends LitElement {\r\n @property({ type: String, reflect: true }) open = \"\";\r\n @property({ type: Boolean, reflect: true }) disabled = false;\r\n @property({ type: String }) density: DensityType = \"comfortable\";\r\n\r\n @state() private items: RelNavMenuItem[] = [];\r\n @state() private focusedIndex = 0;\r\n @state() private hoverSwitchEnabled = false;\r\n\r\n @query(\".nav-container\") private container!: 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 }\r\n\r\n .nav-container {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-space-3xs);\r\n padding: var(--rel-spacing-space-2xs);\r\n background: var(--rel-colors-gray-light);\r\n border-radius: var(--rel-borders-radius-border-radius-200);\r\n border: var(--rel-borders-width-stroke-100) solid var(--rel-colors-gray-border);\r\n }\r\n\r\n .nav-container.compact {\r\n padding: var(--rel-spacing-space-3xs);\r\n gap: 0;\r\n }\r\n\r\n .dropdown-panel {\r\n position: fixed;\r\n min-width: 320px;\r\n max-width: 600px;\r\n background: var(--rel-colors-white);\r\n border: var(--rel-borders-width-stroke-100) solid var(--rel-colors-gray-border);\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-xs);\r\n z-index: 1000;\r\n display: none;\r\n }\r\n\r\n .dropdown-panel.open {\r\n display: block;\r\n }\r\n\r\n :host([disabled]) .nav-container {\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 this.discoverItems();\r\n document.addEventListener(\"click\", this.handleOutsideClick);\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback();\r\n document.removeEventListener(\"click\", this.handleOutsideClick);\r\n }\r\n\r\n private discoverItems() {\r\n const slot = this.shadowRoot?.querySelector(\"slot\");\r\n if (slot) {\r\n const nodes = slot.assignedElements() as RelNavMenuItem[];\r\n this.items = nodes.filter((el) => el.tagName === \"REL-NAV-MENU-ITEM\");\r\n }\r\n }\r\n\r\n private handleSlotChange() {\r\n this.discoverItems();\r\n }\r\n\r\n private handleOutsideClick = (e: MouseEvent) => {\r\n const path = e.composedPath() as HTMLElement[];\r\n const isInside = path.some(\r\n (el) =>\r\n el === this ||\r\n el.classList?.contains(\"dropdown-panel\") ||\r\n el.tagName === \"REL-NAV-MENU-ITEM\"\r\n );\r\n if (!isInside && this.open) {\r\n this.closePanel();\r\n }\r\n };\r\n\r\n private openPanel(itemId: string) {\r\n if (this.disabled) return;\r\n\r\n const wasOpen = this.open === itemId;\r\n this.open = wasOpen ? \"\" : itemId;\r\n\r\n if (!wasOpen) {\r\n this.hoverSwitchEnabled = true;\r\n }\r\n\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-nav-open-change\", {\r\n detail: { openId: this.open },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n\r\n if (this.open) {\r\n this.updateComplete.then(() => this.positionPanel(itemId));\r\n }\r\n }\r\n\r\n private closePanel() {\r\n if (this.open) {\r\n this.open = \"\";\r\n this.hoverSwitchEnabled = false;\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-nav-open-change\", {\r\n detail: { openId: \"\" },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n }\r\n\r\n private positionPanel(itemId: string) {\r\n const item = this.items.find((i) => i.itemId === itemId);\r\n if (!item) return;\r\n\r\n const trigger = item.shadowRoot?.querySelector(\".trigger\") as HTMLElement;\r\n const panel = this.shadowRoot?.querySelector(\r\n `.dropdown-panel[data-item-id=\"${itemId}\"]`\r\n ) as HTMLElement;\r\n\r\n if (!trigger || !panel) return;\r\n\r\n const triggerRect = trigger.getBoundingClientRect();\r\n const panelRect = panel.getBoundingClientRect();\r\n const viewportWidth = window.innerWidth;\r\n const viewportHeight = window.innerHeight;\r\n\r\n // Default: position below trigger, start-aligned\r\n let top = triggerRect.bottom + 8;\r\n let left = triggerRect.left;\r\n\r\n // Handle right overflow\r\n if (left + panelRect.width > viewportWidth) {\r\n left = viewportWidth - panelRect.width - 16;\r\n }\r\n\r\n // Handle left overflow\r\n if (left < 0) {\r\n left = 16;\r\n }\r\n\r\n // Handle bottom overflow (flip above if needed)\r\n if (top + panelRect.height > viewportHeight) {\r\n const spaceAbove = triggerRect.top;\r\n const spaceBelow = viewportHeight - triggerRect.bottom;\r\n\r\n if (spaceAbove > spaceBelow && spaceAbove > panelRect.height) {\r\n top = triggerRect.top - panelRect.height - 8;\r\n }\r\n }\r\n\r\n panel.style.top = `${top}px`;\r\n panel.style.left = `${left}px`;\r\n }\r\n\r\n private handleItemClick(item: RelNavMenuItem, event: Event) {\r\n if (this.disabled || item.disabled) return;\r\n\r\n // If item has href and no content, let default behavior happen\r\n if (item.href && !this.hasItemContent(item)) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n\r\n // If item has content, toggle panel\r\n if (this.hasItemContent(item)) {\r\n this.openPanel(item.itemId);\r\n }\r\n }\r\n\r\n private handleItemMouseEnter(item: RelNavMenuItem) {\r\n if (this.disabled || item.disabled) return;\r\n\r\n // Hover switching: if a panel is open, hovering another trigger switches to it\r\n if (this.open && this.hoverSwitchEnabled && this.hasItemContent(item)) {\r\n this.openPanel(item.itemId);\r\n }\r\n }\r\n\r\n private handleKeyDown(event: KeyboardEvent) {\r\n if (this.disabled) return;\r\n\r\n const { key } = event;\r\n const focusableItems = this.items.filter((item) => !item.disabled);\r\n\r\n if (key === \"ArrowRight\") {\r\n event.preventDefault();\r\n this.focusedIndex = Math.min(focusableItems.length - 1, this.focusedIndex + 1);\r\n this.focusItem(this.focusedIndex);\r\n } else if (key === \"ArrowLeft\") {\r\n event.preventDefault();\r\n this.focusedIndex = Math.max(0, this.focusedIndex - 1);\r\n this.focusItem(this.focusedIndex);\r\n } else if (key === \"Enter\" || key === \" \") {\r\n event.preventDefault();\r\n const item = focusableItems[this.focusedIndex];\r\n if (item && this.hasItemContent(item)) {\r\n this.openPanel(item.itemId);\r\n }\r\n } else if (key === \"Escape\") {\r\n event.preventDefault();\r\n if (this.open) {\r\n this.closePanel();\r\n const openItem = this.items.find((i) => i.itemId === this.open);\r\n if (openItem) {\r\n const trigger = openItem.shadowRoot?.querySelector(\".trigger\") as HTMLElement;\r\n trigger?.focus();\r\n }\r\n }\r\n } else if (key === \"ArrowDown\" && this.open) {\r\n event.preventDefault();\r\n // Move focus into the panel\r\n const panel = this.shadowRoot?.querySelector(\r\n `.dropdown-panel[data-item-id=\"${this.open}\"]`\r\n ) as HTMLElement;\r\n if (panel) {\r\n const firstFocusable = panel.querySelector(\"a, button\") as HTMLElement;\r\n firstFocusable?.focus();\r\n }\r\n }\r\n }\r\n\r\n private focusItem(index: number) {\r\n const focusableItems = this.items.filter((item) => !item.disabled);\r\n const item = focusableItems[index];\r\n if (item) {\r\n const trigger = item.shadowRoot?.querySelector(\".trigger\") as HTMLElement;\r\n trigger?.focus();\r\n }\r\n }\r\n\r\n private hasItemContent(item: RelNavMenuItem): boolean {\r\n const slot = item.shadowRoot?.querySelector(\"slot\");\r\n if (!slot) return false;\r\n const nodes = slot.assignedNodes({ flatten: true });\r\n return nodes.some(\r\n (node) => node.nodeType === Node.ELEMENT_NODE || node.textContent?.trim()\r\n );\r\n }\r\n\r\n private renderDropdownPanel(item: RelNavMenuItem) {\r\n if (!this.hasItemContent(item)) return null;\r\n\r\n const isOpen = this.open === item.itemId;\r\n\r\n return html`\r\n <div\r\n class=\"dropdown-panel ${isOpen ? \"open\" : \"\"}\"\r\n data-item-id=\"${item.itemId}\"\r\n id=\"${item.panelId}\"\r\n role=\"menu\"\r\n @click=\"${(e: Event) => e.stopPropagation()}\"\r\n >\r\n ${this.getItemContent(item)}\r\n </div>\r\n `;\r\n }\r\n\r\n private getItemContent(item: RelNavMenuItem) {\r\n const slot = item.shadowRoot?.querySelector(\"slot\");\r\n if (!slot) return null;\r\n\r\n const nodes = slot.assignedNodes({ flatten: true });\r\n const elements = nodes.filter((node) => node.nodeType === Node.ELEMENT_NODE) as Element[];\r\n\r\n // Clone and return the content\r\n return elements.map((el) => {\r\n const clone = el.cloneNode(true);\r\n return clone;\r\n });\r\n }\r\n\r\n render() {\r\n return html`\r\n <nav\r\n class=\"nav-container ${this.density === \"compact\" ? \"compact\" : \"\"}\"\r\n role=\"navigation\"\r\n @keydown=\"${this.handleKeyDown}\"\r\n >\r\n <slot @slotchange=\"${this.handleSlotChange}\"></slot>\r\n </nav>\r\n\r\n ${this.items.map((item) => {\r\n // Set up click and hover handlers by attaching to the trigger\r\n this.updateComplete.then(() => {\r\n const trigger = item.shadowRoot?.querySelector(\".trigger\") as HTMLElement;\r\n if (trigger) {\r\n // Remove old listeners if any\r\n trigger.onclick = (e) => this.handleItemClick(item, e);\r\n trigger.onmouseenter = () => this.handleItemMouseEnter(item);\r\n\r\n // Update active state\r\n trigger.classList.toggle(\"active\", this.open === item.itemId);\r\n\r\n // Update ARIA attributes\r\n if (this.hasItemContent(item)) {\r\n trigger.setAttribute(\"aria-expanded\", this.open === item.itemId ? \"true\" : \"false\");\r\n }\r\n }\r\n });\r\n\r\n return this.renderDropdownPanel(item);\r\n })}\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property, state } from \"lit/decorators.js\";\r\n\r\n@customElement(\"rel-nav-menu-item\")\r\nexport class RelNavMenuItem extends LitElement {\r\n @property({ type: String }) label = \"\";\r\n @property({ type: String }) href = \"\";\r\n @property({ type: String, attribute: \"item-id\" }) itemId = \"\";\r\n @property({ type: Boolean, reflect: true }) disabled = false;\r\n @property({ type: String }) icon = \"\";\r\n\r\n @state() private hasContent = false;\r\n\r\n static styles = css`\r\n :host {\r\n display: inline-block;\r\n }\r\n\r\n .trigger {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-space-2xs);\r\n padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-md);\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-colors-gray-heading);\r\n background: transparent;\r\n border: none;\r\n border-radius: var(--rel-borders-radius-border-radius-200);\r\n cursor: pointer;\r\n transition: all 0.15s ease;\r\n text-decoration: none;\r\n outline: none;\r\n user-select: none;\r\n }\r\n\r\n .trigger:hover:not(:disabled) {\r\n background: var(--rel-surface-secondary, #fafafa);\r\n }\r\n\r\n .trigger:focus-visible {\r\n outline: 2px solid var(--rel-colors-blue-primary);\r\n outline-offset: 2px;\r\n }\r\n\r\n .trigger.active {\r\n background: var(--rel-surface-secondary, #fafafa);\r\n }\r\n\r\n .trigger:disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n }\r\n\r\n :host([disabled]) .trigger {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n }\r\n\r\n .content {\r\n display: none;\r\n }\r\n `;\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n // Generate item-id from label if not provided\r\n if (!this.itemId && this.label) {\r\n this.itemId = this.label.toLowerCase().replace(/\\s+/g, \"-\");\r\n }\r\n }\r\n\r\n firstUpdated() {\r\n // Check if there's any slotted content\r\n const slot = this.shadowRoot?.querySelector(\"slot\");\r\n if (slot) {\r\n const nodes = slot.assignedNodes({ flatten: true });\r\n this.hasContent = nodes.some(\r\n (node) => node.nodeType === Node.ELEMENT_NODE || node.textContent?.trim()\r\n );\r\n }\r\n }\r\n\r\n private handleSlotChange() {\r\n const slot = this.shadowRoot?.querySelector(\"slot\");\r\n if (slot) {\r\n const nodes = slot.assignedNodes({ flatten: true });\r\n this.hasContent = nodes.some(\r\n (node) => node.nodeType === Node.ELEMENT_NODE || node.textContent?.trim()\r\n );\r\n }\r\n }\r\n\r\n get triggerId() {\r\n return `nav-trigger-${this.itemId}`;\r\n }\r\n\r\n get panelId() {\r\n return `nav-panel-${this.itemId}`;\r\n }\r\n\r\n render() {\r\n const isLink = !!this.href && !this.hasContent;\r\n const tagName = isLink ? \"a\" : \"button\";\r\n const attrs = isLink\r\n ? { href: this.href }\r\n : {\r\n type: \"button\",\r\n \"aria-haspopup\": this.hasContent ? \"menu\" : undefined,\r\n \"aria-controls\": this.hasContent ? this.panelId : undefined,\r\n };\r\n\r\n return html`\r\n ${isLink\r\n ? html`\r\n <a\r\n class=\"trigger\"\r\n href=\"${this.href}\"\r\n id=\"${this.triggerId}\"\r\n ?disabled=\"${this.disabled}\"\r\n >\r\n ${this.label}\r\n </a>\r\n `\r\n : html`\r\n <button\r\n class=\"trigger\"\r\n id=\"${this.triggerId}\"\r\n type=\"button\"\r\n ?disabled=\"${this.disabled}\"\r\n aria-haspopup=\"${this.hasContent ? \"menu\" : \"false\"}\"\r\n aria-controls=\"${this.hasContent ? this.panelId : \"\"}\"\r\n >\r\n ${this.label}\r\n </button>\r\n `}\r\n <div class=\"content\">\r\n <slot @slotchange=\"${this.handleSlotChange}\"></slot>\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\n\r\n@customElement(\"rel-nav-menu-panel\")\r\nexport class RelNavMenuPanel extends LitElement {\r\n static styles = css`\r\n :host {\r\n display: block;\r\n width: 100%;\r\n }\r\n\r\n .panel-content {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--rel-spacing-space-2xs);\r\n padding: var(--rel-spacing-space-xs);\r\n }\r\n\r\n ::slotted(a[data-nav-item]) {\r\n display: block;\r\n padding: var(--rel-spacing-space-sm);\r\n border-radius: var(--rel-borders-radius-border-radius-100);\r\n transition: background 0.15s ease;\r\n text-decoration: none;\r\n color: inherit;\r\n }\r\n\r\n ::slotted(a[data-nav-item]:hover) {\r\n background: var(--rel-surface-secondary, #fafafa);\r\n }\r\n\r\n ::slotted([data-title]) {\r\n font-size: var(--rel-fontSizes-sm);\r\n font-weight: var(--rel-fontWeights-semibold);\r\n color: var(--rel-colors-gray-heading);\r\n margin-bottom: var(--rel-spacing-space-3xs);\r\n }\r\n\r\n ::slotted([data-desc]) {\r\n font-size: var(--rel-fontSizes-xs);\r\n color: var(--rel-colors-gray-placeholder);\r\n line-height: var(--rel-lineHeights-xs);\r\n }\r\n `;\r\n\r\n render() {\r\n return html`\r\n <div class=\"panel-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 } from \"lit/decorators.js\";\r\n\r\n@customElement(\"rel-navbar\")\r\nexport class RelNavbar extends LitElement {\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, 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 @state() private focusedIndex: number = -1;\r\n\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 pointer-events: none;\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, 8px);\r\n position: relative;\r\n }\r\n\r\n .otp-group {\r\n display: flex;\r\n gap: var(--rel-spacing-space-2xs, 8px);\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-colors-gray-divider);\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, 4px);\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-border-default);\r\n border-radius: var(--rel-borders-radius-border-radius-200);\r\n background: var(--rel-colors-white);\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-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-colors-gray-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-colors-gray-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-colors-gray-primary);\r\n }\r\n\r\n .otp-cell:focus-visible {\r\n border-color: var(--rel-colors-gray-heading);\r\n box-shadow: 0 0 0 2px var(--rel-border-default);\r\n }\r\n\r\n .otp-cell:disabled {\r\n background: var(--rel-colors-gray-light);\r\n color: var(--rel-colors-gray-disabled-text);\r\n cursor: not-allowed;\r\n }\r\n\r\n .otp-cell:read-only {\r\n background: var(--rel-colors-gray-surface);\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 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 const index = parseInt(input.dataset.index || \"0\", 10);\r\n\r\n this.focusedIndex = index;\r\n\r\n // Select all text on focus for easy replacement\r\n input.select();\r\n }\r\n\r\n private handleBlur() {\r\n this.focusedIndex = -1;\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=\"${index === 0 ? this.autocomplete : \"off\"}\"\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\n\r\ntype DensityType = \"comfortable\" | \"compact\";\r\ntype VariantType = \"default\" | \"icons\";\r\ntype PageItem = { type: \"page\"; value: number } | { type: \"ellipsis\" } | { type: \"prev\" } | { 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!: number;\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 }\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 min-width: 40px;\r\n height: 40px;\r\n padding: 0 var(--rel-spacing-space-sm);\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-colors-gray-heading);\r\n background: var(--rel-colors-white);\r\n border: var(--rel-borders-width-stroke-100) solid var(--rel-colors-gray-border);\r\n border-radius: var(--rel-borders-radius-border-radius-200);\r\n cursor: pointer;\r\n transition: all 0.15s ease;\r\n text-decoration: none;\r\n outline: none;\r\n user-select: none;\r\n }\r\n\r\n nav.compact button,\r\n nav.compact a {\r\n min-width: 32px;\r\n height: 32px;\r\n padding: 0 var(--rel-spacing-space-xs);\r\n font-size: var(--rel-fontSizes-xs);\r\n }\r\n\r\n button:hover:not(:disabled),\r\n a:hover:not([aria-disabled=\"true\"]) {\r\n background: var(--rel-surface-secondary, #fafafa);\r\n border-color: var(--rel-colors-gray-primary, #333);\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 pointer-events: none;\r\n }\r\n\r\n button[aria-current=\"page\"],\r\n a[aria-current=\"page\"] {\r\n background: var(--rel-colors-gray-heading);\r\n color: var(--rel-colors-white);\r\n border-color: var(--rel-colors-gray-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-colors-gray-primary);\r\n border-color: var(--rel-colors-gray-primary);\r\n }\r\n\r\n .ellipsis {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n min-width: 40px;\r\n height: 40px;\r\n color: var(--rel-colors-gray-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 min-width: 32px;\r\n height: 32px;\r\n font-size: var(--rel-fontSizes-xs);\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]) 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 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 const sibling = this.siblingCount;\r\n const boundary = this.boundaryCount;\r\n\r\n items.push({ type: \"prev\" });\r\n\r\n // Calculate page ranges\r\n const leftBoundary = Array.from({ length: Math.min(boundary, total) }, (_, i) => i + 1);\r\n const rightBoundary = Array.from(\r\n { length: Math.min(boundary, total) },\r\n (_, i) => total - boundary + i + 1\r\n ).filter((p) => p > 0);\r\n\r\n const leftSiblings = Array.from(\r\n { length: sibling },\r\n (_, i) => current - sibling + i\r\n ).filter((p) => p > boundary && p < current);\r\n\r\n const rightSiblings = Array.from(\r\n { length: sibling },\r\n (_, i) => current + i + 1\r\n ).filter((p) => p > current && p <= total - boundary);\r\n\r\n // Combine all visible pages\r\n const visiblePages = new Set([\r\n ...leftBoundary,\r\n ...leftSiblings,\r\n current,\r\n ...rightSiblings,\r\n ...rightBoundary,\r\n ]);\r\n\r\n const sortedPages = Array.from(visiblePages).sort((a, b) => a - b);\r\n\r\n // Build items with ellipsis\r\n sortedPages.forEach((page, index) => {\r\n if (index > 0) {\r\n const prevPage = sortedPages[index - 1];\r\n if (page - prevPage > 1) {\r\n items.push({ type: \"ellipsis\" });\r\n }\r\n }\r\n items.push({ type: \"page\", value: page });\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 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 === \"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.hrefTemplate.replace(\"{page}\", String(targetPage));\r\n return html`\r\n <a\r\n href=\"${href}\"\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 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.hrefTemplate.replace(\"{page}\", String(targetPage));\r\n return html`\r\n <a\r\n href=\"${href}\"\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 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.hrefTemplate.replace(\"{page}\", String(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\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\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 pointer-events: none;\r\n opacity: 0.6;\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 // Resolve trigger once from light DOM\r\n this.triggerEl = this.querySelector(\r\n '[slot=\"trigger\"]',\r\n ) as HTMLElement | null;\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 trigger\r\n const triggerNode = path.find(\r\n (n) => n instanceof HTMLElement && n.getAttribute?.(\"slot\") === \"trigger\",\r\n ) as HTMLElement | undefined;\r\n\r\n if (!triggerNode) 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.triggerEl = triggerNode;\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.triggerEl?.focus();\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 = t.bottom + this.sideOffset;\r\n let left = t.left + t.width / 2 - c.width / 2;\r\n\r\n if (this.side === \"top\") top = t.top - c.height - this.sideOffset;\r\n if (this.side === \"left\") left = t.left - c.width - this.sideOffset;\r\n if (this.side === \"right\") left = t.right + this.sideOffset;\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 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 }\r\n\r\n /* =======================\r\n * RENDER\r\n * ======================= */\r\n\r\n render() {\r\n return html`\r\n <slot name=\"trigger\"></slot>\r\n\r\n <div\r\n class=\"content-wrapper\"\r\n style=\"${this.contentStyle}\"\r\n ?open=\"${this.activeOpen}\"\r\n >\r\n <slot></slot>\r\n </div>\r\n `;\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"rel-popover\": RelPopover;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\r\n@customElement(\"rel-popover-content\")\r\nexport class RelPopoverContent extends LitElement {\r\n @property({ type: String, attribute: \"aria-label\" }) ariaLabel = \"\";\r\n\r\n 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-colors-white);\r\n border: var(--rel-borders-width-stroke-100) solid var(--rel-colors-gray-border);\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-colors-gray-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-colors-gray-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-colors-gray-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\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, sans-serif);\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-colors-gray-border, #ddd);\r\n border-radius: var(--rel-borders-radius-border-radius-200, 8px);\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-colors-black);\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-colors-gray-border);\r\n stroke-width: 3;\r\n }\r\n\r\n .circular-progress {\r\n fill: none;\r\n stroke: var(--rel-colors-black);\r\n stroke-width: 3;\r\n stroke-linecap: round;\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-colors-black);\r\n stroke-linecap: round;\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, state } from \"lit/decorators.js\";\r\n\r\nexport interface QuoteFormData {\r\n pickupLocation: string;\r\n dropoffLocation: string;\r\n serviceLevel: \"standard\" | \"guaranteed\";\r\n originType: \"commercial\" | \"residential\";\r\n destinationType: \"commercial\" | \"residential\";\r\n loadingRequirements: string;\r\n deliveryRequirements: string;\r\n loadingLimitedAccessType: string;\r\n deliveryLimitedAccessType: string;\r\n pickupDate: string;\r\n isHazmat: boolean;\r\n commodity: string;\r\n commodityDescription: string;\r\n handlingUnits: number;\r\n handlingType: string;\r\n length: number;\r\n width: number;\r\n height: number;\r\n totalWeight: number;\r\n class: string;\r\n insuredValue: number;\r\n nmfcNumber: string;\r\n}\r\n\r\n@customElement(\"rel-quote-page\")\r\nexport class RelQuotePage extends LitElement {\r\n @state() private formData: QuoteFormData = {\r\n pickupLocation: \"\",\r\n dropoffLocation: \"\",\r\n serviceLevel: \"standard\",\r\n originType: \"commercial\",\r\n destinationType: \"commercial\",\r\n loadingRequirements: \"\",\r\n deliveryRequirements: \"\",\r\n loadingLimitedAccessType: \"\",\r\n deliveryLimitedAccessType: \"\",\r\n pickupDate: \"\",\r\n isHazmat: false,\r\n commodity: \"\",\r\n commodityDescription: \"\",\r\n handlingUnits: 0,\r\n handlingType: \"\",\r\n length: 0,\r\n width: 0,\r\n height: 0,\r\n totalWeight: 0,\r\n class: \"\",\r\n insuredValue: 0,\r\n nmfcNumber: \"\",\r\n };\r\n\r\n static styles = css`\r\n :host {\r\n display: block;\r\n font-family: var(--rel-fontFamilies-primary);\r\n background: var(--rel-colors-white);\r\n padding: var(--rel-spacing-space-xl);\r\n border-radius: var(--rel-borders-radius-border-radius-300);\r\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\r\n }\r\n\r\n .quote-page {\r\n max-width: 900px;\r\n margin: 0 auto;\r\n }\r\n\r\n .section {\r\n margin-bottom: var(--rel-spacing-space-2xl);\r\n }\r\n\r\n .section-title {\r\n font-size: var(--rel-fontSizes-xl);\r\n font-weight: var(--rel-fontWeights-bold);\r\n margin: 0 0 var(--rel-spacing-space-lg) 0;\r\n color: var(--rel-colors-black);\r\n }\r\n\r\n .section-row {\r\n display: grid;\r\n grid-template-columns: 1fr 1fr;\r\n gap: var(--rel-spacing-space-lg);\r\n margin-bottom: var(--rel-spacing-space-lg);\r\n }\r\n\r\n .section-row.single {\r\n grid-template-columns: 1fr;\r\n }\r\n\r\n .field-group {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--rel-spacing-space-2xs);\r\n }\r\n\r\n .field-label {\r\n font-size: var(--rel-fontSizes-sm);\r\n font-weight: var(--rel-fontWeights-medium);\r\n color: var(--rel-colors-gray-heading);\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-space-3xs);\r\n }\r\n\r\n .required {\r\n color: var(--rel-colors-red-primary);\r\n }\r\n\r\n .info-icon {\r\n width: 16px;\r\n height: 16px;\r\n border: 1px solid var(--rel-colors-gray-border);\r\n border-radius: 50%;\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-size: 11px;\r\n cursor: help;\r\n color: var(--rel-colors-gray-primary);\r\n }\r\n\r\n .subsection-title {\r\n font-size: var(--rel-fontSizes-md);\r\n font-weight: var(--rel-fontWeights-semibold);\r\n margin: var(--rel-spacing-space-md) 0 var(--rel-spacing-space-sm) 0;\r\n color: var(--rel-colors-gray-heading);\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-space-xs);\r\n }\r\n\r\n .subsection-title::before {\r\n content: \"\";\r\n width: 8px;\r\n height: 8px;\r\n border-radius: 50%;\r\n background: var(--rel-colors-green-primary);\r\n }\r\n\r\n .service-level-tabs {\r\n display: flex;\r\n gap: 0;\r\n border: 1px solid var(--rel-colors-gray-border);\r\n border-radius: var(--rel-borders-radius-border-radius-300);\r\n overflow: hidden;\r\n width: fit-content;\r\n margin-bottom: var(--rel-spacing-space-md);\r\n }\r\n\r\n .tab-button {\r\n padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-lg);\r\n background: var(--rel-colors-white);\r\n border: none;\r\n cursor: pointer;\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-colors-gray-primary);\r\n transition: all 0.2s;\r\n border-right: 1px solid var(--rel-colors-gray-border);\r\n }\r\n\r\n .tab-button:last-child {\r\n border-right: none;\r\n }\r\n\r\n .tab-button.active {\r\n background: var(--rel-colors-black);\r\n color: var(--rel-colors-white);\r\n }\r\n\r\n .radio-group {\r\n display: flex;\r\n gap: var(--rel-spacing-space-lg);\r\n }\r\n\r\n .radio-option {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-space-xs);\r\n cursor: pointer;\r\n }\r\n\r\n .radio-input {\r\n width: 20px;\r\n height: 20px;\r\n border: 2px solid var(--rel-colors-gray-border);\r\n border-radius: 50%;\r\n position: relative;\r\n flex-shrink: 0;\r\n }\r\n\r\n .radio-input.checked {\r\n border-color: var(--rel-colors-black);\r\n }\r\n\r\n .radio-input.checked::after {\r\n content: \"\";\r\n position: absolute;\r\n inset: 4px;\r\n background: var(--rel-colors-black);\r\n border-radius: 50%;\r\n }\r\n\r\n .radio-label {\r\n font-size: var(--rel-fontSizes-sm);\r\n font-weight: var(--rel-fontWeights-medium);\r\n color: var(--rel-colors-gray-heading);\r\n }\r\n\r\n .input-field {\r\n padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-sm);\r\n border: 1px solid var(--rel-colors-gray-border);\r\n border-radius: var(--rel-borders-radius-border-radius-300);\r\n font-family: var(--rel-fontFamilies-primary);\r\n font-size: var(--rel-fontSizes-sm);\r\n outline: none;\r\n transition: border-color 0.2s;\r\n }\r\n\r\n .input-field:focus-visible {\r\n border-color: var(--rel-colors-black);\r\n }\r\n\r\n .input-with-icon {\r\n position: relative;\r\n }\r\n\r\n .input-icon {\r\n position: absolute;\r\n right: var(--rel-spacing-space-sm);\r\n top: 50%;\r\n transform: translateY(-50%);\r\n color: var(--rel-colors-gray-primary);\r\n pointer-events: none;\r\n }\r\n\r\n .input-with-icon .input-field {\r\n padding-right: var(--rel-spacing-space-2xl);\r\n }\r\n\r\n select {\r\n padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-sm);\r\n border: 1px solid var(--rel-colors-gray-border);\r\n border-radius: var(--rel-borders-radius-border-radius-300);\r\n font-family: var(--rel-fontFamilies-primary);\r\n font-size: var(--rel-fontSizes-sm);\r\n outline: none;\r\n background: var(--rel-colors-white);\r\n cursor: pointer;\r\n transition: border-color 0.2s;\r\n appearance: none;\r\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23666' d='M6 9L1 4h10z'/%3E%3C/svg%3E\");\r\n background-repeat: no-repeat;\r\n background-position: right 12px center;\r\n padding-right: var(--rel-spacing-space-2xl);\r\n }\r\n\r\n select:focus-visible {\r\n border-color: var(--rel-colors-black);\r\n }\r\n\r\n .helper-text {\r\n font-size: var(--rel-fontSizes-xs);\r\n color: var(--rel-colors-gray-placeholder);\r\n margin-top: var(--rel-spacing-space-2xs);\r\n }\r\n\r\n .dimension-inputs {\r\n display: grid;\r\n grid-template-columns: repeat(4, 1fr);\r\n gap: var(--rel-spacing-space-sm);\r\n }\r\n\r\n .dimension-field {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--rel-spacing-space-3xs);\r\n }\r\n\r\n .dimension-label {\r\n font-size: var(--rel-fontSizes-xs);\r\n font-weight: var(--rel-fontWeights-medium);\r\n color: var(--rel-colors-gray-heading);\r\n }\r\n\r\n .dimension-input-wrapper {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-space-xs);\r\n }\r\n\r\n .dimension-input {\r\n flex: 1;\r\n padding: var(--rel-spacing-space-xs);\r\n border: 1px solid var(--rel-colors-gray-border);\r\n border-radius: var(--rel-borders-radius-border-radius-300);\r\n font-family: var(--rel-fontFamilies-primary);\r\n font-size: var(--rel-fontSizes-sm);\r\n outline: none;\r\n }\r\n\r\n .dimension-unit {\r\n font-size: var(--rel-fontSizes-xs);\r\n color: var(--rel-colors-gray-primary);\r\n }\r\n\r\n .max-note {\r\n font-size: var(--rel-fontSizes-xs);\r\n color: var(--rel-colors-gray-placeholder);\r\n margin-top: 2px;\r\n }\r\n\r\n @media (max-width: 768px) {\r\n .section-row {\r\n grid-template-columns: 1fr;\r\n }\r\n\r\n .dimension-inputs {\r\n grid-template-columns: repeat(2, 1fr);\r\n }\r\n }\r\n `;\r\n\r\n private updateField(field: keyof QuoteFormData, value: any) {\r\n this.formData = { ...this.formData, [field]: value };\r\n this.dispatchEvent(\r\n new CustomEvent(\"form-change\", {\r\n detail: this.formData,\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 <div class=\"quote-page\">\r\n <!-- Shipping Details Section -->\r\n <div class=\"section\">\r\n <h2 class=\"section-title\">Shipping Details</h2>\r\n\r\n <div class=\"subsection-title\">Origin</div>\r\n <div class=\"section-row\">\r\n <div class=\"field-group\">\r\n <label class=\"field-label\">\r\n Pickup Location <span class=\"required\">*</span>\r\n </label>\r\n <div class=\"input-with-icon\">\r\n <input\r\n type=\"text\"\r\n class=\"input-field\"\r\n placeholder=\"Enter pickup location\"\r\n .value=\"${this.formData.pickupLocation}\"\r\n @input=\"${(e: Event) =>\r\n this.updateField(\r\n \"pickupLocation\",\r\n (e.target as HTMLInputElement).value\r\n )}\"\r\n />\r\n <span class=\"input-icon\">🔍</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"field-group\">\r\n <label class=\"field-label\">\r\n Drop off Location <span class=\"required\">*</span>\r\n </label>\r\n <div class=\"input-with-icon\">\r\n <input\r\n type=\"text\"\r\n class=\"input-field\"\r\n placeholder=\"Enter drop off location\"\r\n .value=\"${this.formData.dropoffLocation}\"\r\n @input=\"${(e: Event) =>\r\n this.updateField(\r\n \"dropoffLocation\",\r\n (e.target as HTMLInputElement).value\r\n )}\"\r\n />\r\n <span class=\"input-icon\">🔍</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"field-group\" style=\"margin-bottom: var(--rel-spacing-space-md);\">\r\n <label class=\"field-label\">Service Level</label>\r\n <div class=\"service-level-tabs\">\r\n <button\r\n class=\"tab-button ${this.formData.serviceLevel === \"standard\"\r\n ? \"active\"\r\n : \"\"}\"\r\n @click=\"${() => this.updateField(\"serviceLevel\", \"standard\")}\"\r\n >\r\n Standard\r\n </button>\r\n <button\r\n class=\"tab-button ${this.formData.serviceLevel === \"guaranteed\"\r\n ? \"active\"\r\n : \"\"}\"\r\n @click=\"${() => this.updateField(\"serviceLevel\", \"guaranteed\")}\"\r\n >\r\n Guaranteed\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"section-row\">\r\n <div class=\"field-group\">\r\n <label class=\"field-label\">Origin Type</label>\r\n <div class=\"radio-group\">\r\n <div\r\n class=\"radio-option\"\r\n @click=\"${() => this.updateField(\"originType\", \"commercial\")}\"\r\n >\r\n <div\r\n class=\"radio-input ${this.formData.originType === \"commercial\"\r\n ? \"checked\"\r\n : \"\"}\"\r\n ></div>\r\n <span class=\"radio-label\">Commercial</span>\r\n </div>\r\n <div\r\n class=\"radio-option\"\r\n @click=\"${() => this.updateField(\"originType\", \"residential\")}\"\r\n >\r\n <div\r\n class=\"radio-input ${this.formData.originType === \"residential\"\r\n ? \"checked\"\r\n : \"\"}\"\r\n ></div>\r\n <span class=\"radio-label\">Residential</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"field-group\">\r\n <label class=\"field-label\">Destination Type</label>\r\n <div class=\"radio-group\">\r\n <div\r\n class=\"radio-option\"\r\n @click=\"${() =>\r\n this.updateField(\"destinationType\", \"commercial\")}\"\r\n >\r\n <div\r\n class=\"radio-input ${this.formData.destinationType ===\r\n \"commercial\"\r\n ? \"checked\"\r\n : \"\"}\"\r\n ></div>\r\n <span class=\"radio-label\">Commercial</span>\r\n </div>\r\n <div\r\n class=\"radio-option\"\r\n @click=\"${() =>\r\n this.updateField(\"destinationType\", \"residential\")}\"\r\n >\r\n <div\r\n class=\"radio-input ${this.formData.destinationType ===\r\n \"residential\"\r\n ? \"checked\"\r\n : \"\"}\"\r\n ></div>\r\n <span class=\"radio-label\">Residential</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"section-row\">\r\n <div class=\"field-group\">\r\n <label class=\"field-label\">Loading Requirements</label>\r\n <select\r\n .value=\"${this.formData.loadingRequirements}\"\r\n @change=\"${(e: Event) =>\r\n this.updateField(\r\n \"loadingRequirements\",\r\n (e.target as HTMLSelectElement).value\r\n )}\"\r\n >\r\n <option value=\"\">Select</option>\r\n <option value=\"dock\">Dock</option>\r\n <option value=\"liftgate\">Liftgate</option>\r\n <option value=\"inside\">Inside Pickup</option>\r\n </select>\r\n <p class=\"helper-text\">\r\n If inside pickup/delivery is selected, the driver will bring a\r\n pallet jack to move the goods from the dock to the truck (or\r\n vice-versa). If inside pickup or delivery is at a residence or a\r\n non-dock location, please also select the \"Lift gate\" as well.\r\n </p>\r\n </div>\r\n\r\n <div class=\"field-group\">\r\n <label class=\"field-label\">Delivery Requirements</label>\r\n <select\r\n .value=\"${this.formData.deliveryRequirements}\"\r\n @change=\"${(e: Event) =>\r\n this.updateField(\r\n \"deliveryRequirements\",\r\n (e.target as HTMLSelectElement).value\r\n )}\"\r\n >\r\n <option value=\"\">Select</option>\r\n <option value=\"dock\">Dock</option>\r\n <option value=\"liftgate\">Liftgate</option>\r\n <option value=\"inside\">Inside Delivery</option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"section-row\">\r\n <div class=\"field-group\">\r\n <label class=\"field-label\">Loading Limited Access Type</label>\r\n <select\r\n .value=\"${this.formData.loadingLimitedAccessType}\"\r\n @change=\"${(e: Event) =>\r\n this.updateField(\r\n \"loadingLimitedAccessType\",\r\n (e.target as HTMLSelectElement).value\r\n )}\"\r\n >\r\n <option value=\"\">Select</option>\r\n <option value=\"none\">None</option>\r\n <option value=\"residential\">Residential</option>\r\n <option value=\"construction\">Construction Site</option>\r\n </select>\r\n </div>\r\n\r\n <div class=\"field-group\">\r\n <label class=\"field-label\">Delivery Limited Access Type</label>\r\n <select\r\n .value=\"${this.formData.deliveryLimitedAccessType}\"\r\n @change=\"${(e: Event) =>\r\n this.updateField(\r\n \"deliveryLimitedAccessType\",\r\n (e.target as HTMLSelectElement).value\r\n )}\"\r\n >\r\n <option value=\"\">Select</option>\r\n <option value=\"none\">None</option>\r\n <option value=\"residential\">Residential</option>\r\n <option value=\"construction\">Construction Site</option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"section-row single\">\r\n <div class=\"field-group\">\r\n <label class=\"field-label\">\r\n Pickup Date <span class=\"required\">*</span>\r\n </label>\r\n <input\r\n type=\"date\"\r\n class=\"input-field\"\r\n .value=\"${this.formData.pickupDate}\"\r\n @input=\"${(e: Event) =>\r\n this.updateField(\r\n \"pickupDate\",\r\n (e.target as HTMLInputElement).value\r\n )}\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Commodity Details Section -->\r\n <div class=\"section\">\r\n <h2 class=\"section-title\">Commodity Details</h2>\r\n\r\n <div class=\"field-group\" style=\"margin-bottom: var(--rel-spacing-space-md);\">\r\n <label class=\"field-label\">Is this a hazmat commodity?</label>\r\n <div class=\"radio-group\">\r\n <div\r\n class=\"radio-option\"\r\n @click=\"${() => this.updateField(\"isHazmat\", true)}\"\r\n >\r\n <div\r\n class=\"radio-input ${this.formData.isHazmat ? \"checked\" : \"\"}\"\r\n ></div>\r\n <span class=\"radio-label\">Yes</span>\r\n </div>\r\n <div\r\n class=\"radio-option\"\r\n @click=\"${() => this.updateField(\"isHazmat\", false)}\"\r\n >\r\n <div\r\n class=\"radio-input ${!this.formData.isHazmat ? \"checked\" : \"\"}\"\r\n ></div>\r\n <span class=\"radio-label\">No</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"section-row\">\r\n <div class=\"field-group\">\r\n <label class=\"field-label\">\r\n Commodity <span class=\"required\">*</span>\r\n </label>\r\n <input\r\n type=\"text\"\r\n class=\"input-field\"\r\n .value=\"${this.formData.commodity}\"\r\n @input=\"${(e: Event) =>\r\n this.updateField(\r\n \"commodity\",\r\n (e.target as HTMLInputElement).value\r\n )}\"\r\n />\r\n </div>\r\n\r\n <div class=\"field-group\">\r\n <label class=\"field-label\">\r\n Commodity Description <span class=\"required\">*</span>\r\n </label>\r\n <input\r\n type=\"text\"\r\n class=\"input-field\"\r\n .value=\"${this.formData.commodityDescription}\"\r\n @input=\"${(e: Event) =>\r\n this.updateField(\r\n \"commodityDescription\",\r\n (e.target as HTMLInputElement).value\r\n )}\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div class=\"section-row\">\r\n <div class=\"field-group\">\r\n <label class=\"field-label\">\r\n Handling Units <span class=\"required\">*</span>\r\n <span class=\"info-icon\">ⓘ</span>\r\n </label>\r\n <input\r\n type=\"number\"\r\n class=\"input-field\"\r\n .value=\"${this.formData.handlingUnits}\"\r\n @input=\"${(e: Event) =>\r\n this.updateField(\r\n \"handlingUnits\",\r\n parseInt((e.target as HTMLInputElement).value) || 0\r\n )}\"\r\n />\r\n </div>\r\n\r\n <div class=\"field-group\">\r\n <label class=\"field-label\">\r\n Handling Type <span class=\"required\">*</span>\r\n </label>\r\n <select\r\n .value=\"${this.formData.handlingType}\"\r\n @change=\"${(e: Event) =>\r\n this.updateField(\r\n \"handlingType\",\r\n (e.target as HTMLSelectElement).value\r\n )}\"\r\n >\r\n <option value=\"\">Select</option>\r\n <option value=\"pallet\">Pallet</option>\r\n <option value=\"crate\">Crate</option>\r\n <option value=\"box\">Box</option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"field-group\" style=\"margin-bottom: var(--rel-spacing-space-md);\">\r\n <div class=\"dimension-inputs\">\r\n <div class=\"dimension-field\">\r\n <label class=\"dimension-label\">\r\n Length <span class=\"required\">*</span>\r\n </label>\r\n <div class=\"dimension-input-wrapper\">\r\n <input\r\n type=\"number\"\r\n class=\"dimension-input\"\r\n .value=\"${this.formData.length}\"\r\n @input=\"${(e: Event) =>\r\n this.updateField(\r\n \"length\",\r\n parseFloat((e.target as HTMLInputElement).value) || 0\r\n )}\"\r\n />\r\n <span class=\"dimension-unit\">inches</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"dimension-field\">\r\n <label class=\"dimension-label\">\r\n Width <span class=\"required\">*</span>\r\n </label>\r\n <div class=\"dimension-input-wrapper\">\r\n <input\r\n type=\"number\"\r\n class=\"dimension-input\"\r\n .value=\"${this.formData.width}\"\r\n @input=\"${(e: Event) =>\r\n this.updateField(\r\n \"width\",\r\n parseFloat((e.target as HTMLInputElement).value) || 0\r\n )}\"\r\n />\r\n <span class=\"dimension-unit\">inches</span>\r\n </div>\r\n <div class=\"max-note\">96\" max</div>\r\n </div>\r\n\r\n <div class=\"dimension-field\">\r\n <label class=\"dimension-label\">\r\n Height <span class=\"required\">*</span>\r\n </label>\r\n <div class=\"dimension-input-wrapper\">\r\n <input\r\n type=\"number\"\r\n class=\"dimension-input\"\r\n .value=\"${this.formData.height}\"\r\n @input=\"${(e: Event) =>\r\n this.updateField(\r\n \"height\",\r\n parseFloat((e.target as HTMLInputElement).value) || 0\r\n )}\"\r\n />\r\n <span class=\"dimension-unit\">inches</span>\r\n </div>\r\n <div class=\"max-note\">96\" max</div>\r\n </div>\r\n\r\n <div class=\"dimension-field\">\r\n <label class=\"dimension-label\">\r\n Total Weight <span class=\"required\">*</span>\r\n </label>\r\n <div class=\"dimension-input-wrapper\">\r\n <input\r\n type=\"number\"\r\n class=\"dimension-input\"\r\n .value=\"${this.formData.totalWeight}\"\r\n @input=\"${(e: Event) =>\r\n this.updateField(\r\n \"totalWeight\",\r\n parseFloat((e.target as HTMLInputElement).value) || 0\r\n )}\"\r\n />\r\n <span class=\"dimension-unit\">lbs</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"section-row\">\r\n <div class=\"field-group\">\r\n <label class=\"field-label\">\r\n Class <span class=\"required\">*</span>\r\n </label>\r\n <select\r\n .value=\"${this.formData.class}\"\r\n @change=\"${(e: Event) =>\r\n this.updateField(\"class\", (e.target as HTMLSelectElement).value)}\"\r\n >\r\n <option value=\"\">Select</option>\r\n <option value=\"50\">Class 50</option>\r\n <option value=\"55\">Class 55</option>\r\n <option value=\"60\">Class 60</option>\r\n <option value=\"65\">Class 65</option>\r\n <option value=\"70\">Class 70</option>\r\n <option value=\"77.5\">Class 77.5</option>\r\n <option value=\"85\">Class 85</option>\r\n <option value=\"92.5\">Class 92.5</option>\r\n <option value=\"100\">Class 100</option>\r\n </select>\r\n </div>\r\n\r\n <div class=\"field-group\">\r\n <label class=\"field-label\">\r\n Insured Value\r\n <span class=\"info-icon\">ⓘ</span>\r\n </label>\r\n <input\r\n type=\"number\"\r\n class=\"input-field\"\r\n .value=\"${this.formData.insuredValue}\"\r\n @input=\"${(e: Event) =>\r\n this.updateField(\r\n \"insuredValue\",\r\n parseFloat((e.target as HTMLInputElement).value) || 0\r\n )}\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div class=\"section-row single\">\r\n <div class=\"field-group\">\r\n <label class=\"field-label\">NMFC Number</label>\r\n <input\r\n type=\"text\"\r\n class=\"input-field\"\r\n .value=\"${this.formData.nmfcNumber}\"\r\n @input=\"${(e: Event) =>\r\n this.updateField(\r\n \"nmfcNumber\",\r\n (e.target as HTMLInputElement).value\r\n )}\"\r\n />\r\n <p class=\"helper-text\">\r\n Failure to provide NMFC may result in additional variance\r\n charges\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\r\nexport interface RadioOption {\r\n value: string;\r\n label: string;\r\n supportingText?: string;\r\n disabled?: boolean;\r\n error?: boolean;\r\n}\r\n\r\n@customElement(\"rel-radio\")\r\nexport class RelRadio extends LitElement {\r\n @property({ type: Array }) options: RadioOption[] = [];\r\n\r\n @property({ type: String }) name = \"radio-group\";\r\n\r\n @property({ type: String, reflect: true })\r\n selectedValue: string | null = null;\r\n\r\n @property({ type: Boolean })\r\n disabled = 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 .rel-radio-group {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--rel-spacing-space-xs);\r\n }\r\n\r\n .rel-radio-option {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--rel-spacing-space-3xs);\r\n cursor: pointer;\r\n }\r\n\r\n .rel-radio-option.disabled {\r\n opacity: 0.6;\r\n cursor: not-allowed !important;\r\n }\r\n\r\n .radio-main {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-space-2xs);\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 .radio-custom {\r\n width: 20px;\r\n height: 20px;\r\n border: 2px solid var(--rel-text-heading, #2b2b2b);\r\n border-radius: 50%;\r\n position: relative;\r\n flex-shrink: 0;\r\n }\r\n\r\n input:focus-visible + .radio-custom {\r\n outline: 2px solid var(--rel-border-info, #0091ea);\r\n outline-offset: 2px;\r\n }\r\n\r\n input:checked + .radio-custom::after {\r\n content: \"\";\r\n position: absolute;\r\n inset: 4px;\r\n background: var(--rel-text-heading, #2b2b2b);\r\n border-radius: 50%;\r\n }\r\n\r\n .radio-label {\r\n font-size: var(--rel-fontSizes-sm, 12px);\r\n font-weight: var(--rel-fontWeights-medium, 500);\r\n color: var(--rel-text-primary, #333);\r\n }\r\n\r\n .radio-supporting {\r\n font-size: var(--rel-fontSizes-xs, 10px);\r\n margin-left: 28px;\r\n color: var(--rel-text-placeholder, #a9a9a9);\r\n }\r\n\r\n .error .radio-custom {\r\n border-color: var(--rel-colors-red-secondary);\r\n }\r\n\r\n .error input:checked + .radio-custom::after {\r\n background: var(--rel-colors-red-secondary);\r\n }\r\n `;\r\n\r\n private onChange(value: string) {\r\n if (this.disabled) return;\r\n\r\n this.selectedValue = value;\r\n this.dispatchEvent(\r\n new CustomEvent(\"changed\", {\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private renderOption(option: RadioOption) {\r\n const isChecked = this.selectedValue === option.value;\r\n const isDisabled = this.disabled || option.disabled;\r\n\r\n const classes = [\r\n \"rel-radio-option\",\r\n isDisabled ? \"disabled\" : \"\",\r\n option.error ? \"error\" : \"\",\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return html`\r\n <label class=\"${classes}\">\r\n <div class=\"radio-main\">\r\n <input\r\n type=\"radio\"\r\n name=\"${this.name}\"\r\n .checked=\"${isChecked}\"\r\n ?disabled=\"${isDisabled}\"\r\n @change=\"${() => this.onChange(option.value)}\"\r\n />\r\n <span class=\"radio-custom\"></span>\r\n <span class=\"radio-label\">${option.label}</span>\r\n </div>\r\n\r\n ${option.supportingText\r\n ? html`<div class=\"radio-supporting\">${option.supportingText}</div>`\r\n : \"\"}\r\n </label>\r\n `;\r\n }\r\n\r\n render() {\r\n return html`\r\n <div class=\"rel-radio-group\">\r\n ${this.options.map((o) => this.renderOption(o))}\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 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\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-colors-gray-border);\r\n transition: background 0.15s ease;\r\n }\r\n\r\n :host([orientation=\"horizontal\"]) {\r\n width: var(--rel-borders-width-stroke-100);\r\n min-width: var(--rel-borders-width-stroke-100);\r\n cursor: col-resize;\r\n padding: 0 var(--rel-spacing-space-xs);\r\n margin: 0 calc(var(--rel-spacing-space-xs) * -1);\r\n }\r\n\r\n :host([orientation=\"vertical\"]) {\r\n height: var(--rel-borders-width-stroke-100);\r\n min-height: var(--rel-borders-width-stroke-100);\r\n cursor: row-resize;\r\n padding: var(--rel-spacing-space-xs) 0;\r\n margin: calc(var(--rel-spacing-space-xs) * -1) 0;\r\n }\r\n\r\n :host(:hover),\r\n :host(:focus-visible) {\r\n background: var(--rel-colors-blue-primary);\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-colors-gray-placeholder);\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-colors-white);\r\n }\r\n\r\n :host([data-dragging]) {\r\n background: var(--rel-colors-blue-primary);\r\n }\r\n\r\n :host([data-dragging]) .grabber {\r\n background: var(--rel-colors-white);\r\n }\r\n\r\n @media (prefers-reduced-motion: reduce) {\r\n :host {\r\n transition: none;\r\n }\r\n\r\n .grabber {\r\n transition: none;\r\n }\r\n }\r\n `;\r\n\r\n /* =======================\r\n * LIFECYCLE\r\n * ======================= */\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n this.setAttribute(\"tabindex\", \"0\");\r\n this.setAttribute(\"role\", \"separator\");\r\n this.updateAriaOrientation();\r\n }\r\n\r\n updated(changed: Map<string, unknown>) {\r\n if (changed.has(\"orientation\")) {\r\n this.updateAriaOrientation();\r\n }\r\n }\r\n\r\n /* =======================\r\n * ARIA\r\n * ======================= */\r\n\r\n private updateAriaOrientation() {\r\n this.setAttribute(\"aria-orientation\", this.orientation);\r\n }\r\n\r\n public updateAriaValue(value: number) {\r\n this.splitValue = value;\r\n this.setAttribute(\"aria-valuenow\", String(Math.round(value)));\r\n this.setAttribute(\"aria-valuemin\", \"0\");\r\n this.setAttribute(\"aria-valuemax\", \"100\");\r\n }\r\n\r\n /* =======================\r\n * RENDER\r\n * ======================= */\r\n\r\n render() {\r\n return html`<div class=\"grabber\"></div>`;\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"rel-resizable-handle\": RelResizableHandle;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\r\nexport type SegmentSize = \"small\" | \"medium\";\r\nexport type SegmentAlign = \"left\" | \"middle\" | \"right\";\r\n\r\nexport interface SegmentOption {\r\n label: string;\r\n value: string;\r\n disabled?: boolean;\r\n}\r\n\r\n@customElement(\"rel-segmented-button\")\r\nexport class RelSegmentedButton extends LitElement {\r\n @property({ type: Array }) options: SegmentOption[] = [];\r\n\r\n @property({ type: String }) active: string = \"\";\r\n\r\n @property({ type: String }) size: SegmentSize = \"medium\";\r\n\r\n @property({ type: String }) align: SegmentAlign = \"left\";\r\n\r\n static styles = css`\r\n :host {\r\n 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: 2px solid var(--rel-colors-gray-border);\r\n border-radius: var(--rel-borders-radius-border-radius-300);\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-colors-white, #fff);\r\n border: none;\r\n cursor: pointer;\r\n font-weight: var(--rel-fontWeights-medium, 500);\r\n border-right: 2px solid var(--rel-colors-gray-border, #ddd);\r\n transition: all 0.2s ease-in-out;\r\n color: var(--rel-text-heading, #2b2b2b);\r\n font-family: var(--rel-fontFamilies-primary, sans-serif);\r\n }\r\n\r\n .segment:focus-visible {\r\n outline: 2px solid var(--rel-border-info, #0091ea);\r\n outline-offset: -2px;\r\n z-index: 1;\r\n }\r\n\r\n .segment:last-child {\r\n border-right: none;\r\n }\r\n\r\n /* Hover */\r\n .segment:hover:not(.disabled):not(.active) {\r\n background: var(--rel-surface-surface, #f5f5f5);\r\n }\r\n\r\n /* Active */\r\n .segment.active {\r\n background: var(--rel-text-heading, #2b2b2b);\r\n color: var(--rel-colors-white, #fff);\r\n }\r\n\r\n .segment.active:hover:not(.disabled) {\r\n background: var(--rel-text-heading, #2b2b2b);\r\n color: var(--rel-colors-white, #fff);\r\n }\r\n\r\n /* Disabled */\r\n .segment.disabled,\r\n .segment:disabled {\r\n cursor: not-allowed;\r\n opacity: 0.5;\r\n background: var(--rel-surface-surface, #f5f5f5);\r\n color: var(--rel-text-disabled, #9e9e9e);\r\n pointer-events: none;\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\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, sans-serif);\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-colors-gray-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-colors-gray-primary);\r\n }\r\n\r\n .icon.left {\r\n left: 12px;\r\n }\r\n\r\n .icon.right {\r\n right: 36px;\r\n }\r\n\r\n select {\r\n flex: 1;\r\n appearance: none;\r\n border: 1px solid var(--rel-colors-gray-border, #ddd);\r\n background-color: var(--rel-colors-white, #fff);\r\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='currentColor' d='M6 9L1 4h10z'/%3E%3C/svg%3E\");\r\n background-repeat: no-repeat;\r\n background-position: right 12px center;\r\n font-family: var(--rel-fontFamilies-primary, sans-serif);\r\n cursor: pointer;\r\n transition: all 0.2s ease-in-out;\r\n color: var(--rel-text-heading, #2b2b2b);\r\n width: 100%;\r\n outline: none;\r\n }\r\n\r\n select:hover:not(:disabled) {\r\n border-color: var(--rel-colors-gray-primary, #333);\r\n }\r\n\r\n select:focus-visible:not(:disabled) {\r\n border-color: var(--rel-colors-primary-500, #0091ea);\r\n box-shadow: 0 0 0 2px var(--rel-colors-primary-500, #0091ea);\r\n }\r\n\r\n /* States */\r\n select.error {\r\n border-color: var(--rel-colors-red-secondary);\r\n }\r\n\r\n select.error:focus {\r\n box-shadow: 0 0 0 3px var(--rel-background-error-light);\r\n }\r\n\r\n select:disabled {\r\n background-color: var(--rel-surface-surface, #f5f5f5);\r\n border-color: var(--rel-colors-gray-border, #ddd);\r\n color: var(--rel-text-disabled, #9e9e9e);\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) var(--rel-spacing-space-lg)\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) var(--rel-spacing-space-xl)\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) var(--rel-spacing-space-2xl)\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-300);\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-colors-gray-placeholder);\r\n }\r\n\r\n .error-text {\r\n color: var(--rel-colors-red-secondary);\r\n }\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`<span class=\"icon left\">${this.leftIcon}</span>`\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 </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\";\r\nimport { customElement, property, state, query } from \"lit/decorators.js\";\r\n\r\nexport type SheetSide = \"top\" | \"right\" | \"bottom\" | \"left\";\r\nexport type SheetSize = \"sm\" | \"md\" | \"lg\" | \"xl\";\r\nexport type SheetCloseReason = \"trigger\" | \"close\" | \"overlay\" | \"escape\" | \"api\";\r\n\r\n// ============================================================================\r\n// rel-sheet (Controller/Root Component)\r\n// ============================================================================\r\n@customElement(\"rel-sheet\")\r\nexport class RelSheet extends LitElement {\r\n @property({ type: Boolean, reflect: true }) open?: boolean;\r\n @property({ type: Boolean, attribute: \"defaultopen\" }) defaultOpen = false;\r\n @property({ type: Boolean }) disabled = false;\r\n @property({ type: Boolean }) modal = true;\r\n\r\n @state() private internalOpen = false;\r\n\r\n static styles = css`\r\n :host {\r\n display: contents;\r\n }\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\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\r\n private isControlled() {\r\n return this.open !== undefined;\r\n }\r\n\r\n get activeOpen() {\r\n return this.isControlled() ? !!this.open : this.internalOpen;\r\n }\r\n\r\n setOpen(next: boolean, reason: SheetCloseReason = \"api\") {\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, reason },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n render() {\r\n return html`<slot></slot>`;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// rel-sheet-trigger (Opens Sheet)\r\n// ============================================================================\r\n@customElement(\"rel-sheet-trigger\")\r\nexport class RelSheetTrigger extends LitElement {\r\n static styles = css`\r\n :host {\r\n display: inline-block;\r\n }\r\n\r\n button {\r\n background: none;\r\n border: none;\r\n padding: 0;\r\n margin: 0;\r\n font: inherit;\r\n cursor: pointer;\r\n display: contents;\r\n }\r\n `;\r\n\r\n private getSheet(): RelSheet | null {\r\n let parent = this.parentElement;\r\n while (parent) {\r\n if (parent instanceof RelSheet) {\r\n return parent;\r\n }\r\n parent = parent.parentElement;\r\n }\r\n return null;\r\n }\r\n\r\n private handleClick = () => {\r\n const sheet = this.getSheet();\r\n if (sheet && !sheet.disabled) {\r\n sheet.setOpen(!sheet.activeOpen, \"trigger\");\r\n }\r\n };\r\n\r\n render() {\r\n return html`\r\n <button @click=\"${this.handleClick}\" type=\"button\">\r\n <slot></slot>\r\n </button>\r\n `;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// rel-sheet-content (Panel)\r\n// ============================================================================\r\n@customElement(\"rel-sheet-content\")\r\nexport class RelSheetContent extends LitElement {\r\n @property({ type: String }) side: SheetSide = \"right\";\r\n @property({ type: String }) size: SheetSize = \"md\";\r\n @property({ type: Boolean, attribute: \"hide-overlay\" }) hideOverlay = false;\r\n @property({ type: Boolean, attribute: \"close-on-overlay\" }) closeOnOverlay = true;\r\n @property({ type: Boolean, attribute: \"show-close\" }) showClose = true;\r\n\r\n @query(\".panel\") private panelElement!: HTMLElement;\r\n @query(\".overlay\") private overlayElement!: HTMLElement;\r\n\r\n private sheet: RelSheet | null = null;\r\n private previousFocus: HTMLElement | null = null;\r\n private originalBodyOverflow = \"\";\r\n private originalBodyPaddingRight = \"\";\r\n private isOpen = false;\r\n\r\n static styles = css`\r\n :host {\r\n --sheet-transition-duration: 0.3s;\r\n --sheet-transition-timing: cubic-bezier(0.32, 0.72, 0, 1);\r\n --sheet-size-sm: 320px;\r\n --sheet-size-md: 420px;\r\n --sheet-size-lg: 540px;\r\n --sheet-size-xl: 640px;\r\n }\r\n\r\n .sheet-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 .sheet-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(--sheet-transition-duration) var(--sheet-transition-timing);\r\n }\r\n\r\n .sheet-container.open .overlay {\r\n opacity: 1;\r\n }\r\n\r\n .overlay.hidden {\r\n display: none;\r\n }\r\n\r\n /* Panel base */\r\n .panel {\r\n position: absolute;\r\n background: var(--rel-colors-white);\r\n box-shadow: var(--rel-shadows-shadow-500);\r\n display: flex;\r\n flex-direction: column;\r\n outline: none;\r\n font-family: var(--rel-fontFamilies-primary);\r\n transition: transform var(--sheet-transition-duration) var(--sheet-transition-timing);\r\n overflow: hidden;\r\n }\r\n\r\n /* Right side (default) */\r\n .panel[data-side=\"right\"] {\r\n top: 0;\r\n right: 0;\r\n bottom: 0;\r\n width: var(--sheet-width);\r\n max-width: 90vw;\r\n border-top-left-radius: var(--rel-borders-radius-border-radius-300);\r\n border-bottom-left-radius: var(--rel-borders-radius-border-radius-300);\r\n transform: translateX(100%);\r\n }\r\n\r\n .sheet-container.open .panel[data-side=\"right\"] {\r\n transform: translateX(0);\r\n }\r\n\r\n /* Left side */\r\n .panel[data-side=\"left\"] {\r\n top: 0;\r\n left: 0;\r\n bottom: 0;\r\n width: var(--sheet-width);\r\n max-width: 90vw;\r\n border-top-right-radius: var(--rel-borders-radius-border-radius-300);\r\n border-bottom-right-radius: var(--rel-borders-radius-border-radius-300);\r\n transform: translateX(-100%);\r\n }\r\n\r\n .sheet-container.open .panel[data-side=\"left\"] {\r\n transform: translateX(0);\r\n }\r\n\r\n /* Top side */\r\n .panel[data-side=\"top\"] {\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n height: var(--sheet-width);\r\n max-height: 80vh;\r\n border-bottom-left-radius: var(--rel-borders-radius-border-radius-300);\r\n border-bottom-right-radius: var(--rel-borders-radius-border-radius-300);\r\n transform: translateY(-100%);\r\n }\r\n\r\n .sheet-container.open .panel[data-side=\"top\"] {\r\n transform: translateY(0);\r\n }\r\n\r\n /* Bottom side */\r\n .panel[data-side=\"bottom\"] {\r\n bottom: 0;\r\n left: 0;\r\n right: 0;\r\n height: var(--sheet-width);\r\n max-height: 80vh;\r\n border-top-left-radius: var(--rel-borders-radius-border-radius-300);\r\n border-top-right-radius: var(--rel-borders-radius-border-radius-300);\r\n transform: translateY(100%);\r\n }\r\n\r\n .sheet-container.open .panel[data-side=\"bottom\"] {\r\n transform: translateY(0);\r\n }\r\n\r\n /* Panel content wrapper */\r\n .panel-content {\r\n flex: 1;\r\n overflow-y: auto;\r\n padding: var(--rel-spacing-space-lg);\r\n }\r\n\r\n /* Close button */\r\n .close-button {\r\n position: absolute;\r\n top: var(--rel-spacing-space-md);\r\n right: var(--rel-spacing-space-md);\r\n background: none;\r\n border: none;\r\n cursor: pointer;\r\n padding: var(--rel-spacing-space-xs);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: var(--rel-borders-radius-border-radius-200);\r\n color: var(--rel-colors-gray-heading);\r\n font-size: 20px;\r\n line-height: 1;\r\n z-index: 1;\r\n transition: background 0.2s;\r\n }\r\n\r\n .close-button:hover {\r\n background: var(--rel-colors-gray-surface);\r\n }\r\n\r\n .close-button:focus-visible {\r\n outline: 2px solid var(--rel-colors-primary-500);\r\n outline-offset: 2px;\r\n }\r\n\r\n /* Left side close button positioning */\r\n .panel[data-side=\"left\"] .close-button {\r\n right: auto;\r\n left: var(--rel-spacing-space-md);\r\n }\r\n\r\n /* Reduced motion support */\r\n @media (prefers-reduced-motion: reduce) {\r\n .overlay,\r\n .panel {\r\n transition: none;\r\n }\r\n\r\n .sheet-container .panel {\r\n transform: none;\r\n }\r\n\r\n .sheet-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 this.findSheet();\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback();\r\n this.cleanup();\r\n }\r\n\r\n private findSheet() {\r\n let parent = this.parentElement;\r\n while (parent) {\r\n if (parent instanceof RelSheet) {\r\n this.sheet = parent;\r\n break;\r\n }\r\n parent = parent.parentElement;\r\n }\r\n\r\n if (this.sheet) {\r\n this.sheet.addEventListener(\"rel-open-change\", this.handleSheetOpenChange);\r\n }\r\n }\r\n\r\n private handleSheetOpenChange = (e: Event) => {\r\n const customEvent = e as CustomEvent<{ open: boolean }>;\r\n const nextOpen = customEvent.detail.open;\r\n\r\n if (nextOpen !== this.isOpen) {\r\n this.isOpen = nextOpen;\r\n if (nextOpen) {\r\n this.handleOpen();\r\n } else {\r\n this.handleClose();\r\n }\r\n this.requestUpdate();\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.sheet?.modal) {\r\n setTimeout(() => {\r\n this.focusPanel();\r\n }, 50);\r\n }\r\n\r\n document.addEventListener(\"keydown\", this.handleKeydown);\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 setTimeout(() => {\r\n this.previousFocus?.focus();\r\n this.previousFocus = null;\r\n }, 50);\r\n }\r\n }\r\n\r\n private cleanup() {\r\n this.unlockScroll();\r\n document.removeEventListener(\"keydown\", this.handleKeydown);\r\n if (this.sheet) {\r\n this.sheet.removeEventListener(\"rel-open-change\", this.handleSheetOpenChange);\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 focusPanel() {\r\n if (!this.panelElement) return;\r\n\r\n const focusable = this.getFocusableElements();\r\n if (focusable.length > 0) {\r\n focusable[0].focus();\r\n } else {\r\n this.panelElement.setAttribute(\"tabindex\", \"-1\");\r\n this.panelElement.focus();\r\n }\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.filter((el) => el.offsetWidth || el.offsetHeight);\r\n }\r\n\r\n private handleKeydown = (e: KeyboardEvent) => {\r\n if (!this.isOpen) return;\r\n\r\n if (e.key === \"Escape\") {\r\n e.preventDefault();\r\n this.sheet?.setOpen(false, \"escape\");\r\n return;\r\n }\r\n\r\n // Focus trap\r\n if (e.key === \"Tab\" && this.sheet?.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.closeOnOverlay) return;\r\n\r\n if (e.target === this.overlayElement) {\r\n this.sheet?.setOpen(false, \"overlay\");\r\n }\r\n };\r\n\r\n private handleCloseClick = () => {\r\n this.sheet?.setOpen(false, \"close\");\r\n };\r\n\r\n private getSizeValue(): string {\r\n const sizeMap: Record<SheetSize, string> = {\r\n sm: \"var(--sheet-size-sm)\",\r\n md: \"var(--sheet-size-md)\",\r\n lg: \"var(--sheet-size-lg)\",\r\n xl: \"var(--sheet-size-xl)\",\r\n };\r\n return sizeMap[this.size] || sizeMap.md;\r\n }\r\n\r\n private getTitle(): string | null {\r\n const titleEl = this.querySelector(\"rel-sheet-title\");\r\n return titleEl?.textContent?.trim() || null;\r\n }\r\n\r\n private getDescription(): string | null {\r\n const descEl = this.querySelector(\"rel-sheet-description\");\r\n return descEl?.textContent?.trim() || null;\r\n }\r\n\r\n render() {\r\n const title = this.getTitle();\r\n const description = this.getDescription();\r\n const titleId = title ? \"sheet-title\" : undefined;\r\n const descId = description ? \"sheet-description\" : undefined;\r\n\r\n return html`\r\n <div class=\"sheet-container ${this.isOpen ? \"open\" : \"\"}\">\r\n <div\r\n part=\"overlay\"\r\n class=\"overlay ${this.hideOverlay ? \"hidden\" : \"\"}\"\r\n @click=\"${this.handleOverlayClick}\"></div>\r\n\r\n <div\r\n part=\"panel\"\r\n class=\"panel\"\r\n data-side=\"${this.side}\"\r\n style=\"--sheet-width: ${this.getSizeValue()}\"\r\n role=\"dialog\"\r\n aria-modal=\"${this.sheet?.modal ?? true}\"\r\n aria-labelledby=\"${titleId || \"\"}\"\r\n aria-describedby=\"${descId || \"\"}\"\r\n tabindex=\"-1\">\r\n ${this.showClose\r\n ? html`\r\n <button\r\n class=\"close-button\"\r\n @click=\"${this.handleCloseClick}\"\r\n aria-label=\"Close\"\r\n type=\"button\">\r\n ✕\r\n </button>\r\n `\r\n : \"\"}\r\n\r\n <div class=\"panel-content\">\r\n <slot></slot>\r\n </div>\r\n </div>\r\n </div>\r\n `;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// rel-sheet-header (Layout Helper)\r\n// ============================================================================\r\n@customElement(\"rel-sheet-header\")\r\nexport class RelSheetHeader extends LitElement {\r\n static styles = css`\r\n :host {\r\n display: block;\r\n padding-bottom: var(--rel-spacing-space-md);\r\n border-bottom: 1px solid var(--rel-colors-gray-border);\r\n margin-bottom: var(--rel-spacing-space-lg);\r\n }\r\n `;\r\n\r\n render() {\r\n return html`<slot></slot>`;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// rel-sheet-footer (Layout Helper)\r\n// ============================================================================\r\n@customElement(\"rel-sheet-footer\")\r\nexport class RelSheetFooter extends LitElement {\r\n static styles = css`\r\n :host {\r\n display: block;\r\n padding-top: var(--rel-spacing-space-md);\r\n border-top: 1px solid var(--rel-colors-gray-border);\r\n margin-top: var(--rel-spacing-space-lg);\r\n }\r\n `;\r\n\r\n render() {\r\n return html`<slot></slot>`;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// rel-sheet-title (Layout Helper)\r\n// ============================================================================\r\n@customElement(\"rel-sheet-title\")\r\nexport class RelSheetTitle extends LitElement {\r\n static styles = css`\r\n :host {\r\n display: block;\r\n font-size: 20px;\r\n font-weight: 600;\r\n color: var(--rel-colors-gray-heading);\r\n margin: 0 0 var(--rel-spacing-space-xs) 0;\r\n padding-right: var(--rel-spacing-space-lg);\r\n }\r\n `;\r\n\r\n render() {\r\n return html`<slot></slot>`;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// rel-sheet-description (Layout Helper)\r\n// ============================================================================\r\n@customElement(\"rel-sheet-description\")\r\nexport class RelSheetDescription extends LitElement {\r\n static styles = css`\r\n :host {\r\n display: block;\r\n font-size: 14px;\r\n color: var(--rel-colors-gray-body);\r\n margin: 0;\r\n line-height: 1.5;\r\n }\r\n `;\r\n\r\n render() {\r\n return html`<slot></slot>`;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// rel-sheet-close (Close Button Wrapper)\r\n// ============================================================================\r\n@customElement(\"rel-sheet-close\")\r\nexport class RelSheetClose extends LitElement {\r\n static styles = css`\r\n :host {\r\n display: inline-block;\r\n }\r\n\r\n button {\r\n background: none;\r\n border: none;\r\n padding: 0;\r\n margin: 0;\r\n font: inherit;\r\n cursor: pointer;\r\n display: contents;\r\n }\r\n `;\r\n\r\n private getSheet(): RelSheet | null {\r\n let parent = this.parentElement;\r\n while (parent) {\r\n if (parent instanceof RelSheet) {\r\n return parent;\r\n }\r\n parent = parent.parentElement;\r\n }\r\n return null;\r\n }\r\n\r\n private handleClick = () => {\r\n const sheet = this.getSheet();\r\n if (sheet) {\r\n sheet.setOpen(false, \"close\");\r\n }\r\n };\r\n\r\n render() {\r\n return html`\r\n <button @click=\"${this.handleClick}\" type=\"button\">\r\n <slot></slot>\r\n </button>\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 SidebarVariant = \"sidebar\" | \"floating\" | \"inset\";\r\nexport type SidebarSide = \"left\" | \"right\";\r\nexport type SidebarCollapsible = \"offcanvas\" | \"icon\" | \"none\";\r\nexport type SidebarWidth = \"sm\" | \"md\" | \"lg\";\r\nexport type SidebarChangeReason = \"trigger\" | \"rail\" | \"overlay\" | \"escape\" | \"shortcut\" | \"api\";\r\n\r\n// ============================================================================\r\n// rel-sidebar-provider (Root State Manager)\r\n// ============================================================================\r\n@customElement(\"rel-sidebar-provider\")\r\nexport class RelSidebarProvider extends LitElement {\r\n @property({ type: Boolean, reflect: true }) open?: boolean;\r\n @property({ type: Boolean, attribute: \"defaultopen\" }) defaultOpen = true;\r\n @property({ type: Boolean, reflect: true }) collapsed?: boolean;\r\n @property({ type: Boolean, attribute: \"defaultcollapsed\" }) defaultCollapsed = false;\r\n @property({ type: String }) variant: SidebarVariant = \"sidebar\";\r\n @property({ type: String }) side: SidebarSide = \"left\";\r\n @property({ type: String }) collapsible: SidebarCollapsible = \"icon\";\r\n @property({ type: String }) width: SidebarWidth = \"md\";\r\n @property({ type: String, attribute: \"persist-key\" }) persistKey = \"rel-sidebar\";\r\n @property({ type: Boolean, attribute: \"keyboard-shortcut\" }) keyboardShortcut = true;\r\n @property({ type: Boolean, attribute: \"disable-persist\" }) disablePersist = false;\r\n @property({ type: Boolean, attribute: \"disable-overlay-close\" }) disableOverlayClose = false;\r\n\r\n @state() private internalOpen = true;\r\n @state() private internalCollapsed = false;\r\n @state() public isMobile = false;\r\n\r\n private mediaQuery: MediaQueryList | null = null;\r\n private isInitialized = false;\r\n\r\n static styles = css`\r\n :host {\r\n display: contents;\r\n }\r\n `;\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n\r\n // Setup mobile detection first (synchronous)\r\n this.setupMediaQuery();\r\n\r\n // Load state with mobile awareness\r\n this.loadInitialState();\r\n\r\n // Setup keyboard shortcut\r\n if (this.keyboardShortcut) {\r\n document.addEventListener(\"keydown\", this.handleKeyDown);\r\n }\r\n\r\n this.isInitialized = true;\r\n\r\n // Notify children of initial state after a microtask\r\n requestAnimationFrame(() => {\r\n this.notifyStateChange();\r\n });\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback();\r\n if (this.mediaQuery) {\r\n this.mediaQuery.removeEventListener(\"change\", this.handleMediaChange);\r\n }\r\n document.removeEventListener(\"keydown\", this.handleKeyDown);\r\n }\r\n\r\n updated(changed: Map<string, unknown>) {\r\n if (changed.has(\"open\") && this.isOpenControlled()) {\r\n this.internalOpen = !!this.open;\r\n this.notifyStateChange();\r\n }\r\n if (changed.has(\"collapsed\") && this.isCollapsedControlled()) {\r\n this.internalCollapsed = !!this.collapsed;\r\n this.notifyStateChange();\r\n }\r\n }\r\n\r\n private isOpenControlled() {\r\n return this.open !== undefined;\r\n }\r\n\r\n private isCollapsedControlled() {\r\n return this.collapsed !== undefined;\r\n }\r\n\r\n get activeOpen() {\r\n return this.isOpenControlled() ? !!this.open : this.internalOpen;\r\n }\r\n\r\n get activeCollapsed() {\r\n return this.isCollapsedControlled() ? !!this.collapsed : this.internalCollapsed;\r\n }\r\n\r\n private setupMediaQuery() {\r\n this.mediaQuery = window.matchMedia(\"(max-width: 768px)\");\r\n this.isMobile = this.mediaQuery.matches;\r\n this.mediaQuery.addEventListener(\"change\", this.handleMediaChange);\r\n }\r\n\r\n private handleMediaChange = (e: MediaQueryListEvent) => {\r\n const wasMobile = this.isMobile;\r\n this.isMobile = e.matches;\r\n\r\n // When switching to mobile, close the sidebar unless controlled\r\n if (!wasMobile && this.isMobile && !this.isOpenControlled()) {\r\n this.internalOpen = false;\r\n this.persistState();\r\n }\r\n\r\n this.notifyStateChange();\r\n };\r\n\r\n private isOffcanvasMode(): boolean {\r\n return this.isMobile || this.collapsible === \"offcanvas\";\r\n }\r\n\r\n private loadInitialState() {\r\n // If controlled, use controlled value\r\n if (this.isOpenControlled()) {\r\n this.internalOpen = !!this.open;\r\n } else if (this.isOffcanvasMode()) {\r\n // Mobile/offcanvas: always start closed, ignore persisted state\r\n this.internalOpen = false;\r\n } else {\r\n // Desktop: use persisted state or default\r\n if (!this.disablePersist) {\r\n this.loadPersistedState();\r\n } else {\r\n this.internalOpen = this.defaultOpen;\r\n this.internalCollapsed = this.defaultCollapsed;\r\n }\r\n }\r\n\r\n // Load collapsed state\r\n if (!this.isCollapsedControlled()) {\r\n if (!this.disablePersist && !this.isOffcanvasMode()) {\r\n const persisted = this.getPersistedState();\r\n if (persisted) {\r\n this.internalCollapsed = persisted.collapsed ?? this.defaultCollapsed;\r\n } else {\r\n this.internalCollapsed = this.defaultCollapsed;\r\n }\r\n } else {\r\n this.internalCollapsed = this.defaultCollapsed;\r\n }\r\n } else {\r\n this.internalCollapsed = !!this.collapsed;\r\n }\r\n }\r\n\r\n private getPersistedState(): { open?: boolean; collapsed?: boolean } | null {\r\n try {\r\n const stored = localStorage.getItem(this.persistKey);\r\n if (stored) {\r\n return JSON.parse(stored);\r\n }\r\n } catch (e) {\r\n // ignore\r\n }\r\n return null;\r\n }\r\n\r\n private loadPersistedState() {\r\n const persisted = this.getPersistedState();\r\n if (persisted) {\r\n this.internalOpen = persisted.open ?? this.defaultOpen;\r\n this.internalCollapsed = persisted.collapsed ?? this.defaultCollapsed;\r\n } else {\r\n this.internalOpen = this.defaultOpen;\r\n this.internalCollapsed = this.defaultCollapsed;\r\n }\r\n }\r\n\r\n private persistState() {\r\n if (this.disablePersist) return;\r\n\r\n // Don't persist open state for offcanvas mode\r\n const stateToPersist = this.isOffcanvasMode()\r\n ? { collapsed: this.activeCollapsed }\r\n : { open: this.activeOpen, collapsed: this.activeCollapsed };\r\n\r\n try {\r\n localStorage.setItem(this.persistKey, JSON.stringify(stateToPersist));\r\n } catch (e) {\r\n // Silently fail if localStorage is unavailable\r\n }\r\n }\r\n\r\n private handleKeyDown = (e: KeyboardEvent) => {\r\n if (!this.keyboardShortcut) return;\r\n\r\n // Ctrl/Cmd + B\r\n if ((e.ctrlKey || e.metaKey) && e.key === \"b\") {\r\n e.preventDefault();\r\n\r\n if (this.isMobile || this.collapsible === \"offcanvas\") {\r\n // Toggle open state\r\n this.setOpen(!this.activeOpen, \"shortcut\");\r\n } else if (this.collapsible === \"icon\") {\r\n // Toggle collapsed state\r\n this.setCollapsed(!this.activeCollapsed, \"shortcut\");\r\n }\r\n }\r\n };\r\n\r\n setOpen(next: boolean, reason: SidebarChangeReason = \"api\") {\r\n if (!this.isOpenControlled()) {\r\n this.internalOpen = next;\r\n }\r\n\r\n this.persistState();\r\n this.notifyStateChange();\r\n this.dispatchChangeEvent(reason);\r\n }\r\n\r\n setCollapsed(next: boolean, reason: SidebarChangeReason = \"api\") {\r\n if (!this.isCollapsedControlled()) {\r\n this.internalCollapsed = next;\r\n }\r\n\r\n this.persistState();\r\n this.notifyStateChange();\r\n this.dispatchChangeEvent(reason);\r\n }\r\n\r\n private dispatchChangeEvent(reason: SidebarChangeReason) {\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-sidebar-change\", {\r\n detail: {\r\n open: this.activeOpen,\r\n collapsed: this.activeCollapsed,\r\n reason,\r\n },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private notifyStateChange() {\r\n // Dispatch a state event that children can listen to\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-sidebar-state\", {\r\n detail: {\r\n isOpen: this.activeOpen,\r\n isCollapsed: this.activeCollapsed,\r\n isMobile: this.isMobile,\r\n side: this.side,\r\n variant: this.variant,\r\n collapsible: this.collapsible,\r\n width: this.width,\r\n },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n render() {\r\n return html`<slot></slot>`;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// rel-sidebar (Visual Container)\r\n// ============================================================================\r\n@customElement(\"rel-sidebar\")\r\nexport class RelSidebar extends LitElement {\r\n @property({ type: Boolean }) inset = false;\r\n\r\n @state() private isOpen = true;\r\n @state() private isCollapsed = false;\r\n @state() private isMobile = false;\r\n @state() private side: SidebarSide = \"left\";\r\n @state() private variant: SidebarVariant = \"sidebar\";\r\n @state() private collapsible: SidebarCollapsible = \"icon\";\r\n @state() private width: SidebarWidth = \"md\";\r\n\r\n @query(\".sidebar-container\") private containerElement!: HTMLElement;\r\n\r\n private provider: RelSidebarProvider | null = null;\r\n private triggerElement: HTMLElement | null = null;\r\n private originalBodyOverflow = \"\";\r\n private originalBodyPaddingRight = \"\";\r\n\r\n static styles = css`\r\n :host {\r\n --sidebar-width-sm: 240px;\r\n --sidebar-width-md: 280px;\r\n --sidebar-width-lg: 320px;\r\n --sidebar-width-collapsed: 56px;\r\n --sidebar-transition-duration: 0.2s;\r\n --sidebar-transition-timing: cubic-bezier(0.4, 0, 0.2, 1);\r\n }\r\n\r\n .sidebar-wrapper {\r\n position: relative;\r\n height: 100%;\r\n }\r\n\r\n /* Overlay for offcanvas mode */\r\n .overlay {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n background: var(--rel-overlay-scrim, rgba(0, 0, 0, 0.5));\r\n z-index: 999;\r\n opacity: 0;\r\n pointer-events: none;\r\n transition: opacity var(--sidebar-transition-duration)\r\n var(--sidebar-transition-timing);\r\n }\r\n\r\n .overlay.visible {\r\n opacity: 1;\r\n pointer-events: auto;\r\n }\r\n\r\n /* Sidebar container */\r\n .sidebar-container {\r\n position: fixed;\r\n top: 0;\r\n bottom: 0;\r\n z-index: 1000;\r\n background: var(--rel-surface-secondary, #fafafa);\r\n color: var(--rel-text-primary, #333);\r\n display: flex;\r\n flex-direction: column;\r\n transition: transform var(--sidebar-transition-duration)\r\n var(--sidebar-transition-timing),\r\n width var(--sidebar-transition-duration)\r\n var(--sidebar-transition-timing);\r\n width: var(--sidebar-width);\r\n outline: none;\r\n overflow: hidden;\r\n }\r\n\r\n /* Left side */\r\n .sidebar-container[data-side=\"left\"] {\r\n left: 0;\r\n border-right: 1px solid var(--rel-border-default, #ddd);\r\n }\r\n\r\n .sidebar-container[data-side=\"left\"].offcanvas-hidden {\r\n transform: translateX(-100%);\r\n }\r\n\r\n /* Right side */\r\n .sidebar-container[data-side=\"right\"] {\r\n right: 0;\r\n border-left: 1px solid var(--rel-border-default, #ddd);\r\n }\r\n\r\n .sidebar-container[data-side=\"right\"].offcanvas-hidden {\r\n transform: translateX(100%);\r\n }\r\n\r\n /* Floating variant */\r\n .sidebar-container.variant-floating {\r\n top: var(--rel-spacing-space-md, 16px);\r\n bottom: var(--rel-spacing-space-md, 16px);\r\n background: var(--rel-surface-secondary, #fafafa);\r\n border: 1px solid var(--rel-border-default, #ddd);\r\n border-radius: var(--rel-borders-radius-border-radius-300, 16px);\r\n box-shadow: var(--rel-shadows-shadow-400);\r\n }\r\n\r\n .sidebar-container.variant-floating[data-side=\"left\"] {\r\n left: var(--rel-spacing-space-md, 16px);\r\n }\r\n\r\n .sidebar-container.variant-floating[data-side=\"right\"] {\r\n right: var(--rel-spacing-space-md, 16px);\r\n }\r\n\r\n /* Inset variant */\r\n .sidebar-container.variant-inset {\r\n position: relative;\r\n border: none;\r\n border-radius: 0;\r\n box-shadow: none;\r\n }\r\n\r\n .sidebar-container.variant-inset[data-side=\"left\"] {\r\n border-right: 1px solid var(--rel-border-default, #ddd);\r\n }\r\n\r\n .sidebar-container.variant-inset[data-side=\"right\"] {\r\n border-left: 1px solid var(--rel-border-default, #ddd);\r\n }\r\n\r\n /* Desktop mode - not offcanvas */\r\n @media (min-width: 769px) {\r\n .sidebar-container:not(.offcanvas-mode) {\r\n position: relative;\r\n }\r\n\r\n .overlay:not(.offcanvas-mode) {\r\n display: none;\r\n }\r\n }\r\n\r\n /* Collapsed state */\r\n .sidebar-container.collapsed {\r\n width: var(--sidebar-width-collapsed);\r\n }\r\n\r\n /* Reduced motion */\r\n @media (prefers-reduced-motion: reduce) {\r\n .overlay,\r\n .sidebar-container {\r\n transition: none;\r\n }\r\n }\r\n `;\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n this.findProvider();\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback();\r\n this.cleanup();\r\n }\r\n\r\n private findProvider() {\r\n let parent = this.parentElement;\r\n while (parent) {\r\n if (parent instanceof RelSidebarProvider) {\r\n this.provider = parent;\r\n break;\r\n }\r\n parent = parent.parentElement;\r\n }\r\n\r\n if (this.provider) {\r\n this.provider.addEventListener(\r\n \"rel-sidebar-state\",\r\n this.handleStateChange,\r\n );\r\n // Trigger initial state sync\r\n this.syncState();\r\n }\r\n }\r\n\r\n private syncState() {\r\n if (!this.provider) return;\r\n\r\n const wasOpen = this.isOpen;\r\n const wasOffcanvas = this.isOffcanvasMode();\r\n\r\n this.isOpen = this.provider.activeOpen;\r\n this.isCollapsed = this.provider.activeCollapsed;\r\n this.isMobile = this.provider.isMobile;\r\n this.side = this.provider.side;\r\n this.variant = this.provider.variant;\r\n this.collapsible = this.provider.collapsible;\r\n this.width = this.provider.width;\r\n\r\n const isOffcanvas = this.isOffcanvasMode();\r\n\r\n // Handle offcanvas behavior\r\n if (isOffcanvas) {\r\n if (this.isOpen && !wasOpen) {\r\n this.lockScroll();\r\n this.setupFocusTrap();\r\n } else if (!this.isOpen && wasOpen) {\r\n this.unlockScroll();\r\n this.removeFocusTrap();\r\n }\r\n } else if (wasOffcanvas && !isOffcanvas) {\r\n // Switched from offcanvas to normal mode\r\n this.unlockScroll();\r\n this.removeFocusTrap();\r\n }\r\n\r\n this.requestUpdate();\r\n }\r\n\r\n private handleStateChange = (e: Event) => {\r\n this.syncState();\r\n };\r\n\r\n private isOffcanvasMode(): boolean {\r\n return this.isMobile || this.collapsible === \"offcanvas\";\r\n }\r\n\r\n private lockScroll() {\r\n if (typeof document === \"undefined\") return;\r\n\r\n const scrollbarWidth =\r\n 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 setupFocusTrap() {\r\n this.triggerElement = document.activeElement as HTMLElement;\r\n document.addEventListener(\"keydown\", this.handleKeydown);\r\n\r\n // Focus first focusable element or container\r\n requestAnimationFrame(() => {\r\n const focusable = this.getFocusableElements();\r\n if (focusable.length > 0) {\r\n focusable[0].focus();\r\n } else if (this.containerElement) {\r\n this.containerElement.setAttribute(\"tabindex\", \"-1\");\r\n this.containerElement.focus();\r\n }\r\n });\r\n }\r\n\r\n private removeFocusTrap() {\r\n document.removeEventListener(\"keydown\", this.handleKeydown);\r\n\r\n // Restore focus to trigger\r\n if (this.triggerElement && this.triggerElement.focus) {\r\n requestAnimationFrame(() => {\r\n this.triggerElement?.focus();\r\n this.triggerElement = null;\r\n });\r\n }\r\n }\r\n\r\n private getFocusableElements(): HTMLElement[] {\r\n if (!this.containerElement) 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.containerElement.querySelectorAll(selectors),\r\n ) as HTMLElement[];\r\n\r\n return elements.filter((el) => el.offsetWidth || el.offsetHeight);\r\n }\r\n\r\n private handleKeydown = (e: KeyboardEvent) => {\r\n if (!this.isOpen || !this.isOffcanvasMode()) return;\r\n\r\n if (e.key === \"Escape\") {\r\n e.preventDefault();\r\n this.provider?.setOpen(false, \"escape\");\r\n return;\r\n }\r\n\r\n // Focus trap\r\n if (e.key === \"Tab\") {\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 =\r\n 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 = () => {\r\n if (this.provider && !this.provider.disableOverlayClose) {\r\n this.provider.setOpen(false, \"overlay\");\r\n }\r\n };\r\n\r\n private cleanup() {\r\n this.unlockScroll();\r\n this.removeFocusTrap();\r\n if (this.provider) {\r\n this.provider.removeEventListener(\r\n \"rel-sidebar-state\",\r\n this.handleStateChange,\r\n );\r\n }\r\n }\r\n\r\n private getWidthValue(): string {\r\n const widthMap: Record<SidebarWidth, string> = {\r\n sm: \"var(--sidebar-width-sm)\",\r\n md: \"var(--sidebar-width-md)\",\r\n lg: \"var(--sidebar-width-lg)\",\r\n };\r\n return widthMap[this.width] || widthMap.md;\r\n }\r\n\r\n render() {\r\n const isOffcanvas = this.isOffcanvasMode();\r\n const showOverlay = isOffcanvas && this.isOpen;\r\n const containerClasses = [\r\n \"sidebar-container\",\r\n `variant-${this.variant}`,\r\n this.isCollapsed && !isOffcanvas ? \"collapsed\" : \"\",\r\n isOffcanvas ? \"offcanvas-mode\" : \"\",\r\n isOffcanvas && !this.isOpen ? \"offcanvas-hidden\" : \"\",\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return html`\r\n <div class=\"sidebar-wrapper\">\r\n ${showOverlay\r\n ? html`\r\n <div\r\n class=\"overlay visible\"\r\n @click=\"${this.handleOverlayClick}\"\r\n ></div>\r\n `\r\n : \"\"}\r\n\r\n <nav\r\n class=\"${containerClasses}\"\r\n data-side=\"${this.side}\"\r\n style=\"--sidebar-width: ${this.getWidthValue()}\"\r\n role=\"navigation\"\r\n aria-hidden=\"${isOffcanvas && !this.isOpen}\"\r\n tabindex=\"-1\"\r\n >\r\n <slot></slot>\r\n </nav>\r\n </div>\r\n `;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// rel-sidebar-trigger (Toggle Button)\r\n// ============================================================================\r\n@customElement(\"rel-sidebar-trigger\")\r\nexport class RelSidebarTrigger extends LitElement {\r\n @state() private isOpen = true;\r\n @state() private isCollapsed = false;\r\n\r\n private provider: RelSidebarProvider | null = null;\r\n\r\n static styles = css`\r\n :host {\r\n display: inline-block;\r\n }\r\n\r\n button {\r\n background: none;\r\n border: none;\r\n padding: var(--rel-spacing-space-xs, 8px);\r\n margin: 0;\r\n cursor: pointer;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: var(--rel-borders-radius-border-radius-200, 8px);\r\n color: var(--rel-text-heading, #2b2b2b);\r\n transition: background 0.15s ease;\r\n }\r\n\r\n button:hover {\r\n background: var(--rel-surface-surface, #f5f5f5);\r\n }\r\n\r\n button:active {\r\n background: var(--rel-border-default, #ddd);\r\n }\r\n\r\n button:focus-visible {\r\n outline: 2px solid var(--rel-border-info, #0091ea);\r\n outline-offset: 2px;\r\n }\r\n `;\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n this.findProvider();\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback();\r\n if (this.provider) {\r\n this.provider.removeEventListener(\r\n \"rel-sidebar-state\",\r\n this.handleStateChange,\r\n );\r\n }\r\n }\r\n\r\n private findProvider() {\r\n let parent = this.parentElement;\r\n while (parent) {\r\n if (parent instanceof RelSidebarProvider) {\r\n this.provider = parent;\r\n break;\r\n }\r\n parent = parent.parentElement;\r\n }\r\n\r\n if (this.provider) {\r\n this.provider.addEventListener(\r\n \"rel-sidebar-state\",\r\n this.handleStateChange,\r\n );\r\n this.syncState();\r\n }\r\n }\r\n\r\n private syncState() {\r\n if (!this.provider) return;\r\n this.isOpen = this.provider.activeOpen;\r\n this.isCollapsed = this.provider.activeCollapsed;\r\n }\r\n\r\n private handleStateChange = () => {\r\n this.syncState();\r\n };\r\n\r\n private handleClick = () => {\r\n if (!this.provider) return;\r\n\r\n if (this.provider.isMobile || this.provider.collapsible === \"offcanvas\") {\r\n this.provider.setOpen(!this.isOpen, \"trigger\");\r\n } else if (this.provider.collapsible === \"icon\") {\r\n this.provider.setCollapsed(!this.isCollapsed, \"rail\");\r\n }\r\n };\r\n\r\n render() {\r\n return html`\r\n <button\r\n @click=\"${this.handleClick}\"\r\n type=\"button\"\r\n aria-expanded=\"${this.isOpen}\"\r\n aria-label=\"Toggle sidebar\"\r\n >\r\n <slot>\r\n <svg\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n >\r\n <line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\"></line>\r\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"></line>\r\n <line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\"></line>\r\n </svg>\r\n </slot>\r\n </button>\r\n `;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Layout Helpers\r\n// ============================================================================\r\n\r\n@customElement(\"rel-sidebar-header\")\r\nexport class RelSidebarHeader extends LitElement {\r\n static styles = css`\r\n :host {\r\n display: block;\r\n padding: var(--rel-spacing-space-md, 16px);\r\n border-bottom: 1px solid var(--rel-border-default, #ddd);\r\n flex-shrink: 0;\r\n color: var(--rel-text-heading, #2b2b2b);\r\n }\r\n `;\r\n\r\n render() {\r\n return html`<slot></slot>`;\r\n }\r\n}\r\n\r\n@customElement(\"rel-sidebar-content\")\r\nexport class RelSidebarContent extends LitElement {\r\n static styles = css`\r\n :host {\r\n display: block;\r\n flex: 1;\r\n overflow-y: auto;\r\n padding: var(--rel-spacing-space-sm, 12px) var(--rel-spacing-space-xs, 8px);\r\n }\r\n\r\n /* Scrollbar styling */\r\n :host::-webkit-scrollbar {\r\n width: 4px;\r\n }\r\n :host::-webkit-scrollbar-track {\r\n background: transparent;\r\n }\r\n :host::-webkit-scrollbar-thumb {\r\n background: var(--rel-border-default, #ddd);\r\n border-radius: 2px;\r\n }\r\n `;\r\n\r\n render() {\r\n return html`<slot></slot>`;\r\n }\r\n}\r\n\r\n@customElement(\"rel-sidebar-footer\")\r\nexport class RelSidebarFooter extends LitElement {\r\n static styles = css`\r\n :host {\r\n display: block;\r\n padding: var(--rel-spacing-space-md, 16px);\r\n border-top: 1px solid var(--rel-border-default, #ddd);\r\n flex-shrink: 0;\r\n color: var(--rel-text-primary, #333);\r\n }\r\n `;\r\n\r\n render() {\r\n return html`<slot></slot>`;\r\n }\r\n}\r\n\r\n@customElement(\"rel-sidebar-group\")\r\nexport class RelSidebarGroup extends LitElement {\r\n static styles = css`\r\n :host {\r\n display: block;\r\n margin-bottom: var(--rel-spacing-space-md, 16px);\r\n }\r\n\r\n :host(:last-child) {\r\n margin-bottom: 0;\r\n }\r\n `;\r\n\r\n render() {\r\n return html`<slot></slot>`;\r\n }\r\n}\r\n\r\n@customElement(\"rel-sidebar-group-label\")\r\nexport class RelSidebarGroupLabel extends LitElement {\r\n static styles = css`\r\n :host {\r\n display: block;\r\n font-size: var(--rel-fontSizes-xs, 10px);\r\n font-weight: var(--rel-fontWeights-semibold, 600);\r\n color: var(--rel-text-placeholder, #a9a9a9);\r\n text-transform: uppercase;\r\n letter-spacing: 0.05em;\r\n padding: var(--rel-spacing-space-xs, 8px) var(--rel-spacing-space-sm, 12px) var(--rel-spacing-space-2xs, 4px);\r\n margin-bottom: var(--rel-spacing-space-2xs, 4px);\r\n }\r\n\r\n :host(.collapsed) {\r\n text-align: center;\r\n font-size: var(--rel-fontSizes-xs, 10px);\r\n padding: var(--rel-spacing-space-xs, 8px) var(--rel-spacing-space-2xs, 4px) var(--rel-spacing-space-2xs, 4px);\r\n }\r\n `;\r\n\r\n render() {\r\n return html`<slot></slot>`;\r\n }\r\n}\r\n\r\n@customElement(\"rel-sidebar-group-content\")\r\nexport class RelSidebarGroupContent extends LitElement {\r\n static styles = css`\r\n :host {\r\n display: block;\r\n }\r\n `;\r\n\r\n render() {\r\n return html`<slot></slot>`;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// Menu Primitives\r\n// ============================================================================\r\n\r\n@customElement(\"rel-sidebar-menu\")\r\nexport class RelSidebarMenu extends LitElement {\r\n static styles = css`\r\n :host {\r\n display: block;\r\n list-style: none;\r\n margin: 0;\r\n padding: 0;\r\n }\r\n `;\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n this.addEventListener(\"keydown\", this.handleKeyDown);\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback();\r\n this.removeEventListener(\"keydown\", this.handleKeyDown);\r\n }\r\n\r\n private handleKeyDown = (e: KeyboardEvent) => {\r\n if (e.key !== \"ArrowUp\" && e.key !== \"ArrowDown\") return;\r\n\r\n e.preventDefault();\r\n const items = Array.from(\r\n this.querySelectorAll(\"rel-sidebar-menu-button:not([disabled])\"),\r\n ) as HTMLElement[];\r\n if (items.length === 0) return;\r\n\r\n const active = items.findIndex(\r\n (item) => item.shadowRoot?.activeElement || item === document.activeElement,\r\n );\r\n let next: number;\r\n if (e.key === \"ArrowDown\") {\r\n next = active < items.length - 1 ? active + 1 : 0;\r\n } else {\r\n next = active > 0 ? active - 1 : items.length - 1;\r\n }\r\n\r\n const btn = items[next]?.shadowRoot?.querySelector(\"button\") as HTMLElement | null;\r\n btn?.focus();\r\n };\r\n\r\n render() {\r\n return html`<slot></slot>`;\r\n }\r\n}\r\n\r\n@customElement(\"rel-sidebar-menu-item\")\r\nexport class RelSidebarMenuItem extends LitElement {\r\n static styles = css`\r\n :host {\r\n display: block;\r\n margin-bottom: var(--rel-spacing-space-2xs, 4px);\r\n padding: 0 var(--rel-spacing-space-xs, 8px);\r\n }\r\n `;\r\n\r\n render() {\r\n return html`<slot></slot>`;\r\n }\r\n}\r\n\r\n@customElement(\"rel-sidebar-menu-button\")\r\nexport class RelSidebarMenuButton extends LitElement {\r\n @property({ type: Boolean }) active = false;\r\n @property({ type: Boolean }) disabled = false;\r\n @property({ type: String }) tooltip = \"\";\r\n\r\n @state() private isCollapsed = false;\r\n\r\n private provider: RelSidebarProvider | null = null;\r\n\r\n static styles = css`\r\n :host {\r\n display: block;\r\n }\r\n\r\n button {\r\n width: 100%;\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-space-sm, 12px);\r\n padding: var(--rel-spacing-space-xs, 8px) var(--rel-spacing-space-sm, 12px);\r\n min-height: 40px;\r\n background: none;\r\n border: none;\r\n border-radius: var(--rel-borders-radius-border-radius-200, 8px);\r\n cursor: pointer;\r\n font-family: var(--rel-fontFamilies-primary, sans-serif);\r\n font-size: var(--rel-fontSizes-md, 14px);\r\n font-weight: var(--rel-fontWeights-medium, 500);\r\n color: var(--rel-text-primary, #333);\r\n transition: background 0.15s ease, color 0.15s ease;\r\n text-align: left;\r\n position: relative;\r\n }\r\n\r\n button:hover:not([disabled]) {\r\n background: var(--rel-surface-surface, #f5f5f5);\r\n color: var(--rel-text-heading, #2b2b2b);\r\n }\r\n\r\n button:active:not([disabled]) {\r\n background: var(--rel-border-default, #ddd);\r\n }\r\n\r\n button:focus-visible {\r\n outline: 2px solid var(--rel-border-info, #0091ea);\r\n outline-offset: -2px;\r\n }\r\n\r\n button[disabled] {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n }\r\n\r\n button.active {\r\n background: var(--rel-surface-surface, #f5f5f5);\r\n color: var(--rel-text-heading, #2b2b2b);\r\n font-weight: var(--rel-fontWeights-semibold, 600);\r\n }\r\n\r\n button.active::before {\r\n content: \"\";\r\n position: absolute;\r\n left: 0;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n width: 3px;\r\n height: 20px;\r\n background: var(--rel-colors-primary-500, #0091ea);\r\n border-radius: 0 2px 2px 0;\r\n }\r\n\r\n button.collapsed {\r\n justify-content: center;\r\n padding: var(--rel-spacing-space-xs, 8px);\r\n min-height: 40px;\r\n }\r\n\r\n button.collapsed.active::before {\r\n display: none;\r\n }\r\n\r\n button.collapsed.active {\r\n background: var(--rel-surface-surface, #f5f5f5);\r\n }\r\n\r\n .icon {\r\n flex-shrink: 0;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 18px;\r\n height: 18px;\r\n }\r\n\r\n .label {\r\n flex: 1;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n line-height: 1.4;\r\n }\r\n\r\n button.collapsed .label {\r\n display: none;\r\n }\r\n `;\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n this.findProvider();\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback();\r\n if (this.provider) {\r\n this.provider.removeEventListener(\r\n \"rel-sidebar-state\",\r\n this.handleStateChange,\r\n );\r\n }\r\n }\r\n\r\n private findProvider() {\r\n let parent = this.parentElement;\r\n while (parent) {\r\n if (parent instanceof RelSidebarProvider) {\r\n this.provider = parent;\r\n break;\r\n }\r\n parent = parent.parentElement;\r\n }\r\n\r\n if (this.provider) {\r\n this.provider.addEventListener(\r\n \"rel-sidebar-state\",\r\n this.handleStateChange,\r\n );\r\n this.syncState();\r\n }\r\n }\r\n\r\n private syncState() {\r\n if (!this.provider) return;\r\n this.isCollapsed = this.provider.activeCollapsed && !this.provider.isMobile;\r\n }\r\n\r\n private handleStateChange = () => {\r\n this.syncState();\r\n };\r\n\r\n render() {\r\n const buttonClass = [\r\n this.active ? \"active\" : \"\",\r\n this.isCollapsed ? \"collapsed\" : \"\",\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n const tooltipTitle = this.isCollapsed && this.tooltip ? this.tooltip : \"\";\r\n\r\n return html`\r\n <button\r\n class=\"${buttonClass}\"\r\n ?disabled=\"${this.disabled}\"\r\n title=\"${tooltipTitle}\"\r\n aria-current=\"${this.active ? \"page\" : \"false\"}\"\r\n part=\"button\"\r\n >\r\n <span class=\"icon\" part=\"icon\">\r\n <slot name=\"icon\"></slot>\r\n </span>\r\n <span class=\"label\" part=\"label\">\r\n <slot></slot>\r\n </span>\r\n </button>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property, state } from \"lit/decorators.js\";\r\n\r\nexport type 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 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-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-surface-surface), 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, sans-serif);\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-colors-gray-border);\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-colors-black);\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-colors-white) 0 1px,\r\n transparent 1px\r\n )\r\n center/12px 4px repeat-x,\r\n var(--rel-colors-black);\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 /* 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: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: 23.5%;\r\n transform: translate(-50%, -50%);\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-colors-black);\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-colors-gray-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-colors-white);\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-colors-gray-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-colors-gray-primary);\r\n }\r\n\r\n .rel-slider.disabled .track-active {\r\n background: var(--rel-colors-gray-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-surface-surface) 0 1px,\r\n transparent 1px\r\n )\r\n center/12px 4px repeat-x,\r\n var(--rel-colors-gray-placeholder);\r\n }\r\n\r\n .rel-slider.disabled .tick {\r\n background: var(--rel-colors-gray-placeholder);\r\n }\r\n\r\n .rel-slider.disabled .tick-label {\r\n color: var(--rel-colors-gray-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-colors-gray-placeholder);\r\n box-shadow: 0 0 0 var(--thumb-stroke) var(--rel-surface-surface);\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\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(\"valueChange\", {\r\n detail: { value: this.value },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\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-colors-black)\" />\r\n <text\r\n x=\"12\"\r\n y=\"16\"\r\n text-anchor=\"middle\"\r\n fill=\"var(--rel-colors-white)\"\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\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\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\r\n @state() private visible: boolean = true;\r\n\r\n private timeout: number | 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;\r\n border-radius: var(--rel-borders-radius-border-radius-200);\r\n background-color: var(--rel-colors-black);\r\n color: var(--rel-colors-white);\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 */\r\n .snackbar.type-success {\r\n border-left-color: var(--rel-colors-green-secondary, #4ade80);\r\n }\r\n\r\n .snackbar.type-error {\r\n border-left-color: var(--rel-colors-red-primary, #f87171);\r\n }\r\n\r\n .snackbar.type-warning {\r\n border-left-color: var(--rel-colors-amber-primary, #fbbf24);\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 font-size: 14px;\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-secondary);\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 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 var(--rel-colors-white, #fff);\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: var(--rel-colors-white, #fff);\r\n cursor: pointer;\r\n font-size: 16px;\r\n padding: 0;\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: opacity 0.2s ease;\r\n }\r\n\r\n .snackbar-close:hover {\r\n opacity: 0.8;\r\n }\r\n\r\n .snackbar-close:active {\r\n opacity: 0.6;\r\n }\r\n\r\n .snackbar-close:focus-visible {\r\n outline: 2px solid var(--rel-colors-white, #fff);\r\n outline-offset: 2px;\r\n border-radius: 2px;\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 this.setAutoDismiss();\r\n }\r\n\r\n updated(changed: Map<string, unknown>) {\r\n if (changed.has(\"duration\") || changed.has(\"longerAction\")) {\r\n this.setAutoDismiss();\r\n }\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback();\r\n this.clearTimeout();\r\n }\r\n\r\n private setAutoDismiss() {\r\n if (this.duration > 0) {\r\n this.clearTimeout();\r\n const delay = this.longerAction ? this.duration * 2 : this.duration;\r\n this.timeout = window.setTimeout(() => this.dismiss(), delay);\r\n }\r\n }\r\n\r\n private clearTimeout() {\r\n if (this.timeout !== null) {\r\n window.clearTimeout(this.timeout);\r\n this.timeout = 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.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 getIcon(): string {\r\n switch (this.type) {\r\n case \"success\": return \"✓\";\r\n case \"error\": return \"✕\";\r\n case \"warning\": return \"⚠\";\r\n default: return \"\";\r\n }\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 const icon = this.getIcon();\r\n\r\n return html`\r\n <div class=\"${snackbarClasses}\">\r\n <div class=\"snackbar-body\">\r\n ${icon ? html`<span class=\"snackbar-icon\">${icon}</span>` : \"\"}\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 ✖\r\n </button>\r\n `\r\n : \"\"}\r\n </div>\r\n </div>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\r\nexport type StepStatus = \"done\" | \"progress\" | \"disabled\";\r\nexport type TextAlign = \"right\" | \"below\";\r\nexport type Orientation = \"horizontal\" | \"vertical\";\r\nexport type StepperSize = \"small\" | \"large\";\r\n\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: 22px;\r\n height: 22px;\r\n border: 2px solid var(--rel-colors-gray-border);\r\n background: var(--rel-colors-white);\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: all 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-text-primary, #333);\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-colors-gray-border);\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-colors-gray-border);\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-colors-black);\r\n border-color: var(--rel-colors-black);\r\n color: var(--rel-colors-white);\r\n }\r\n\r\n .rel-step.progress .indicator {\r\n border-color: var(--rel-colors-black);\r\n color: var(--rel-colors-black);\r\n background: var(--rel-colors-white);\r\n }\r\n\r\n .rel-step.disabled .indicator {\r\n background: var(--rel-colors-gray-light, #fafafa);\r\n border-color: var(--rel-colors-gray-border, #ddd);\r\n color: var(--rel-text-disabled, #9e9e9e);\r\n }\r\n\r\n .rel-step.done .connector {\r\n background: var(--rel-colors-black);\r\n }\r\n\r\n .rel-step.progress .connector {\r\n background: var(--rel-colors-black);\r\n }\r\n\r\n .rel-step.done .step-label {\r\n color: var(--rel-colors-black);\r\n font-weight: var(--rel-fontWeights-semibold);\r\n }\r\n\r\n .rel-step.progress .step-label {\r\n color: var(--rel-colors-black);\r\n font-weight: var(--rel-fontWeights-semibold);\r\n }\r\n\r\n .rel-step.disabled .step-label {\r\n color: var(--rel-text-disabled, #9e9e9e);\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: 86px;\r\n }\r\n\r\n .rel-stepper.small.horizontal {\r\n gap: 60px;\r\n }\r\n\r\n .rel-stepper.large.horizontal .connector {\r\n width: 86px;\r\n }\r\n\r\n .rel-stepper.small.horizontal .connector {\r\n width: 60px;\r\n }\r\n\r\n /* Vertical */\r\n .rel-stepper.large.vertical .connector {\r\n height: 86px;\r\n }\r\n\r\n .rel-stepper.large.vertical {\r\n gap: 86px;\r\n }\r\n\r\n .rel-stepper.small.vertical .connector {\r\n height: 42px;\r\n }\r\n\r\n .rel-stepper.small.vertical {\r\n gap: 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(\"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\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\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-text-placeholder);\r\n --switch-knob-on: var(--rel-colors-black);\r\n --switch-knob-off: var(--rel-colors-white);\r\n --switch-halo: var(--rel-border-default);\r\n --switch-disabled: var(--rel-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: 42px;\r\n 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: 18px;\r\n width: 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-text-dark-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<boolean>(\"changed\", {\r\n detail: this.checked,\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\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 }\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 } from \"lit/decorators.js\";\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\")\r\nexport class RelTab extends LitElement {\r\n @property({ type: Array }) tabs: TabItem[] = [];\r\n @property({ type: Number, reflect: true }) activeIndex = 0;\r\n\r\n static styles = css`\r\n :host {\r\n --tab-active-color: var(--rel-colors-green-primary);\r\n --tab-text-default: var(--rel-text-primary);\r\n --tab-text-disabled: var(--rel-text-disabled);\r\n --tab-text-hover: var(--rel-text-heading);\r\n --tab-underline-height: 3px;\r\n --tab-hover-color: var(--rel-surface-surface);\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, #c4c4c4);\r\n font-family: var(--rel-fontFamilies-primary, sans-serif);\r\n user-select: none;\r\n }\r\n\r\n .tab {\r\n position: relative;\r\n padding: var(--rel-spacing-space-sm, 12px) var(--rel-spacing-space-md, 16px);\r\n cursor: pointer;\r\n color: var(--tab-text-default);\r\n font-size: var(--rel-fontSizes-md, 14px);\r\n font-weight: var(--rel-fontWeights-medium, 500);\r\n transition: color 0.2s ease;\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-space-2xs, 4px);\r\n }\r\n\r\n .tab:focus-visible {\r\n outline: 2px solid var(--rel-border-info, #0091ea);\r\n outline-offset: -2px;\r\n border-radius: var(--rel-borders-radius-border-radius-100, 2px);\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 /* Badge */\r\n .tab-badge {\r\n display: inline-flex;\r\n justify-content: center;\r\n align-items: center;\r\n background: var(--rel-colors-red-primary);\r\n color: var(--rel-colors-white);\r\n border-radius: 50%;\r\n font-size: 11px;\r\n font-weight: 600;\r\n min-width: 16px;\r\n text-align: center;\r\n height: 16px;\r\n padding: 2px;\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 selectTab(index: number) {\r\n if (this.tabs[index]?.disabled) return;\r\n this.activeIndex = index;\r\n this.dispatchEvent(\r\n new CustomEvent<number>(\"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.tabs[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 let next = index;\r\n for (let i = 0; i < this.tabs.length; i++) {\r\n next = (next + dir + this.tabs.length) % this.tabs.length;\r\n if (!this.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 return html`\r\n <div class=\"tabs-wrapper\" role=\"tablist\">\r\n ${this.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`<span class=\"tab-badge\">${tab.badge}</span>`\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 } from \"lit/decorators.js\";\r\n\r\n@customElement(\"rel-table\")\r\nexport class RelTable extends LitElement {\r\n @property({ type: Boolean, reflect: true }) bordered = false;\r\n @property({ type: Boolean, reflect: true }) compact = 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 position: relative;\r\n width: 100%;\r\n }\r\n\r\n .table-wrapper {\r\n position: relative;\r\n width: 100%;\r\n overflow-x: auto;\r\n }\r\n\r\n :host([bordered]) .table-wrapper {\r\n border: var(--rel-borders-width-stroke-100) solid var(--rel-colors-gray-border);\r\n border-radius: var(--rel-borders-radius-border-radius-200);\r\n }\r\n\r\n table {\r\n width: 100%;\r\n caption-side: bottom;\r\n border-collapse: collapse;\r\n font-size: var(--rel-fontSizes-md);\r\n color: var(--rel-colors-gray-primary);\r\n font-family: var(--rel-fontFamilies-primary);\r\n }\r\n `;\r\n\r\n render() {\r\n return html`\r\n <div class=\"table-wrapper\">\r\n <table>\r\n <slot></slot>\r\n </table>\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\n\r\n@customElement(\"rel-table-header\")\r\nexport class RelTableHeader extends LitElement {\r\n static styles = css`\r\n :host {\r\n display: table-header-group;\r\n font-family: var(--rel-fontFamilies-primary);\r\n }\r\n `;\r\n\r\n render() {\r\n return html`<slot></slot>`;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement } from \"lit/decorators.js\";\r\n\r\n@customElement(\"rel-table-body\")\r\nexport class RelTableBody extends LitElement {\r\n static styles = css`\r\n :host {\r\n display: table-row-group;\r\n font-family: var(--rel-fontFamilies-primary);\r\n }\r\n `;\r\n\r\n render() {\r\n return html`<slot></slot>`;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement } from \"lit/decorators.js\";\r\n\r\n@customElement(\"rel-table-footer\")\r\nexport class RelTableFooter extends LitElement {\r\n static styles = css`\r\n :host {\r\n display: table-footer-group;\r\n font-family: var(--rel-fontFamilies-primary);\r\n font-weight: var(--rel-fontWeights-medium, 500);\r\n background-color: var(--rel-colors-gray-light);\r\n }\r\n `;\r\n\r\n render() {\r\n return html`<slot></slot>`;\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-table-row\")\r\nexport class RelTableRow extends LitElement {\r\n @property({ type: Boolean, reflect: true }) selected = false;\r\n\r\n static styles = css`\r\n :host {\r\n display: table-row;\r\n font-family: var(--rel-fontFamilies-primary);\r\n border-bottom: var(--rel-borders-width-stroke-100) solid var(--rel-colors-gray-border);\r\n transition: background-color 0.15s ease;\r\n }\r\n\r\n :host(:hover) {\r\n background-color: var(--rel-colors-gray-light);\r\n }\r\n\r\n :host([selected]) {\r\n background-color: var(--rel-colors-gray-surface);\r\n }\r\n\r\n :host([selected]:hover) {\r\n background-color: var(--rel-colors-gray-warm);\r\n }\r\n `;\r\n\r\n render() {\r\n return html`<slot></slot>`;\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-table-head\")\r\nexport class RelTableHead extends LitElement {\r\n @property({ type: String, reflect: true }) align: \"left\" | \"center\" | \"right\" = \"left\";\r\n\r\n static styles = css`\r\n :host {\r\n display: table-cell;\r\n font-family: var(--rel-fontFamilies-primary);\r\n padding: var(--rel-spacing-space-sm) var(--rel-spacing-space-md);\r\n text-align: left;\r\n font-weight: var(--rel-fontWeights-medium, 500);\r\n font-size: var(--rel-fontSizes-sm);\r\n color: var(--rel-colors-gray-placeholder);\r\n vertical-align: middle;\r\n height: 48px;\r\n }\r\n\r\n :host([align=\"center\"]) {\r\n text-align: center;\r\n }\r\n\r\n :host([align=\"right\"]) {\r\n text-align: right;\r\n }\r\n `;\r\n\r\n render() {\r\n return html`<slot></slot>`;\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-table-cell\")\r\nexport class RelTableCell extends LitElement {\r\n @property({ type: String, reflect: true }) align: \"left\" | \"center\" | \"right\" = \"left\";\r\n @property({ type: Number, reflect: true }) colspan?: number;\r\n\r\n static styles = css`\r\n :host {\r\n display: table-cell;\r\n font-family: var(--rel-fontFamilies-primary);\r\n padding: var(--rel-spacing-space-sm) var(--rel-spacing-space-md);\r\n font-size: var(--rel-fontSizes-md);\r\n color: var(--rel-colors-gray-primary);\r\n vertical-align: middle;\r\n text-align: left;\r\n }\r\n\r\n :host([align=\"center\"]) {\r\n text-align: center;\r\n }\r\n\r\n :host([align=\"right\"]) {\r\n text-align: right;\r\n }\r\n `;\r\n\r\n render() {\r\n return html`<slot></slot>`;\r\n }\r\n\r\n updated(changedProperties: Map<string, any>) {\r\n super.updated(changedProperties);\r\n // Handle colspan attribute\r\n if (changedProperties.has(\"colspan\") && this.colspan) {\r\n // Apply colspan to the host element since it's display: table-cell\r\n this.style.setProperty(\"--colspan\", this.colspan.toString());\r\n }\r\n }\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n // Set colspan attribute on the host element for table layout\r\n if (this.colspan) {\r\n this.setAttribute(\"colspan\", this.colspan.toString());\r\n }\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement } from \"lit/decorators.js\";\r\n\r\n@customElement(\"rel-table-caption\")\r\nexport class RelTableCaption extends LitElement {\r\n static styles = css`\r\n :host {\r\n display: table-caption;\r\n caption-side: bottom;\r\n font-family: var(--rel-fontFamilies-primary);\r\n margin-top: var(--rel-spacing-space-md);\r\n padding-top: var(--rel-spacing-space-sm);\r\n font-size: var(--rel-fontSizes-sm);\r\n color: var(--rel-colors-gray-placeholder);\r\n text-align: center;\r\n }\r\n `;\r\n\r\n render() {\r\n return html`<slot></slot>`;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property, state } from \"lit/decorators.js\";\r\n\r\nexport type TextFieldState = \"default\" | \"focused\" | \"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\r\n @state() private internalState: TextFieldState = \"default\";\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 /* Wrapper */\r\n .textfield-wrapper {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--rel-spacing-space-2xs, 4px);\r\n width: 100%;\r\n }\r\n\r\n /* Label */\r\n .textfield-label {\r\n font-size: var(--rel-fontSizes-sm, 12px);\r\n font-weight: var(--rel-fontWeights-medium, 500);\r\n color: var(--rel-text-heading, #2b2b2b);\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-border-default, #ddd);\r\n border-radius: var(--rel-borders-radius-border-radius-200, 8px);\r\n background: var(--rel-colors-white, #fff);\r\n transition: border 0.2s;\r\n }\r\n\r\n .textfield-container.disabled {\r\n background: var(--rel-surface-surface, #f5f5f5);\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, 14px);\r\n padding: 0.5rem 0.75rem;\r\n background: transparent;\r\n font-family: var(--rel-fontFamilies-primary, sans-serif);\r\n color: var(--rel-text-primary, #333);\r\n }\r\n\r\n .textfield-input:disabled {\r\n cursor: not-allowed;\r\n color: var(--rel-text-disabled, #9e9e9e);\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-text-placeholder, #a9a9a9);\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: 0.5rem 1rem;\r\n font-size: 0.9rem;\r\n }\r\n\r\n .textfield-wrapper.medium .textfield-input {\r\n padding: 0.688rem 1rem;\r\n font-size: 1rem;\r\n }\r\n\r\n .textfield-wrapper.large .textfield-input {\r\n padding: 0.875rem 1rem;\r\n font-size: 1.1rem;\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: 2.5rem;\r\n }\r\n\r\n .textfield-wrapper .textfield-input.has-right-icon {\r\n padding-right: 2.5rem;\r\n }\r\n\r\n /* States */\r\n .textfield-wrapper.focused .textfield-container {\r\n border-color: var(--rel-colors-primary-500, #0091ea);\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-colors-primary-500, #0091ea);\r\n box-shadow: 0 0 0 1px var(--rel-colors-primary-500, #0091ea);\r\n }\r\n\r\n .textfield-wrapper.error .textfield-container {\r\n border-color: var(--rel-border-error, #cc0000);\r\n }\r\n\r\n .textfield-wrapper.disabled .textfield-container {\r\n border-color: var(--rel-border-default, #ddd);\r\n }\r\n\r\n /* Supporting text */\r\n .textfield-support {\r\n font-size: var(--rel-fontSizes-xs, 10px);\r\n color: var(--rel-text-placeholder, #a9a9a9);\r\n }\r\n\r\n .textfield-support.error {\r\n color: var(--rel-text-error, #cc0000);\r\n }\r\n\r\n /* Placeholder */\r\n .textfield-input::placeholder {\r\n color: var(--rel-text-placeholder, #a9a9a9);\r\n }\r\n `;\r\n\r\n private get currentState(): TextFieldState {\r\n return this.state !== \"default\" ? this.state : this.internalState;\r\n }\r\n\r\n private handleFocus() {\r\n if (this.state !== \"disabled\" && this.state !== \"error\") {\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 this.dispatchEvent(\r\n new CustomEvent<string>(\"input-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.currentState,\r\n ].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.label\r\n ? html`<label class=\"textfield-label\">${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.leftIcon\r\n ? html`<span class=\"icon left\">${this.leftIcon}</span>`\r\n : \"\"}\r\n\r\n <input\r\n type=\"${this.type}\"\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`<span class=\"icon right\">${this.rightIcon}</span>`\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\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\r\n @state() private visible: boolean = false;\r\n private timeoutId?: number;\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: 1000;\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, 12px);\r\n background-color: var(--rel-surface-toast, #404040);\r\n color: var(--rel-colors-white, #fff);\r\n font-family: var(--rel-fontFamilies-primary, sans-serif);\r\n font-size: var(--rel-fontSizes-md, 14px);\r\n border-radius: var(--rel-borders-radius-border-radius-200, 8px);\r\n padding: var(--rel-spacing-space-md, 16px);\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-colors-red-secondary);\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 var(--rel-colors-white, #fff);\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, 4px);\r\n margin-left: var(--rel-spacing-space-2xs, 4px);\r\n }\r\n\r\n .toast-close:hover {\r\n opacity: 0.75;\r\n }\r\n\r\n .toast-close:focus-visible {\r\n outline: 2px solid var(--rel-colors-white, #fff);\r\n outline-offset: 2px;\r\n border-radius: 2px;\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 show() {\r\n this.visible = true;\r\n\r\n if (this.duration > 0) {\r\n this.timeoutId = window.setTimeout(() => this.close(), this.duration);\r\n }\r\n }\r\n\r\n close() {\r\n this.visible = false;\r\n this.dispatchEvent(\r\n new CustomEvent(\"dismissed\", {\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n if (this.timeoutId) {\r\n clearTimeout(this.timeoutId);\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 }) showTail: boolean = false;\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: var(--rel-surface-toast, #404040);\r\n color: var(--rel-colors-white, #fff);\r\n padding: var(--rel-spacing-space-xs, 8px) 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 }\r\n\r\n :host(:hover) .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 }\r\n\r\n .tooltip-bubble.above .tooltip-tail {\r\n bottom: -6px;\r\n border-top: 6px solid var(--rel-surface-toast, #404040);\r\n }\r\n\r\n .tooltip-bubble.below .tooltip-tail {\r\n top: -6px;\r\n border-bottom: 6px solid var(--rel-surface-toast, #404040);\r\n }\r\n `;\r\n\r\n render() {\r\n return html`\r\n <slot></slot>\r\n <div class=\"tooltip-bubble ${this.position}\" role=\"tooltip\" aria-hidden=\"true\">\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,IAGf,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKX;AACF;AAt4Ba,cA2BJ,SAASE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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","names":["LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","LitElement","html","css","customElement","LitElement","html","css","nothing","customElement","property","state","LitElement","html","nothing","css","property","state","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","nothing","customElement","property","state","query","LitElement","nothing","html","css","property","state","query","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","nothing","customElement","property","state","query","LitElement","html","nothing","css","property","state","query","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","state","query","LitElement","html","css","property","state","query","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","state","LitElement","html","css","property","state","customElement","LitElement","html","css","customElement","state","query","LitElement","html","css","state","query","customElement","LitElement","html","customElement","property","LitElement","html","property","customElement","LitElement","html","css","customElement","property","state","query","LitElement","item","html","css","property","state","query","customElement","LitElement","html","css","customElement","property","state","LitElement","html","css","property","state","customElement","LitElement","html","css","customElement","LitElement","html","css","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","state","query","LitElement","html","css","property","state","query","customElement","LitElement","html","css","customElement","property","state","LitElement","html","css","property","state","customElement","LitElement","html","css","customElement","property","state","query","LitElement","html","css","property","state","query","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","state","LitElement","html","css","state","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","state","query","LitElement","html","css","property","state","customElement","query","LitElement","html","css","customElement","property","state","query","LitElement","html","css","property","state","customElement","query","LitElement","html","css","customElement","property","state","LitElement","html","css","property","state","customElement","LitElement","html","css","customElement","property","state","LitElement","html","css","property","state","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","state","LitElement","html","css","property","state","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","LitElement","html","css","customElement","LitElement","html","css","customElement","LitElement","html","css","customElement","LitElement","html","css","customElement","LitElement","html","css","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","LitElement","html","css","customElement","LitElement","html","css","customElement","property","state","LitElement","html","css","property","state","customElement","LitElement","html","css","customElement","property","state","LitElement","html","css","property","state","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement"]}
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-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-menubar/rel-menubar-menu.ts","../src/components/rel-nav-menu/rel-nav-menu.ts","../src/components/rel-nav-menu/rel-nav-menu-item.ts","../src/components/rel-nav-menu/rel-nav-menu-panel.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-item.ts","../src/components/rel-topbar/rel-topbar-dropdown.ts","../src/components/rel-topbar/rel-topbar-dropdown-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-radio/rel-radio.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-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-nav-menu/rel-nav-menu\";\r\nexport * from \"./components/rel-nav-menu/rel-nav-menu-item\";\r\nexport * from \"./components/rel-nav-menu/rel-nav-menu-panel\";\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 { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\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\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\r\n .accordion {\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 box-shadow: var(--rel-shadows-shadow-100);\r\n overflow: hidden;\r\n }\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: var(--rel-borders-radius-border-radius-200, 8px);\r\n }\r\n\r\n .header:hover {\r\n background: var(--rel-surface-surface, #f5f5f5);\r\n }\r\n\r\n :host([open]) .header:hover {\r\n background: transparent;\r\n }\r\n\r\n .header:focus-visible {\r\n outline: 2px solid var(--rel-border-info, #0091ea);\r\n outline-offset: -2px;\r\n }\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\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\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\r\n .icon.rotated {\r\n transform: rotate(180deg);\r\n }\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: max-height 0.25s ease, padding 0.2s ease;\r\n }\r\n\r\n .body.open {\r\n max-height: 1000px;\r\n padding: var(--rel-spacing-space-xl, 24px) var(--rel-spacing-space-md, 16px)\r\n var(--rel-spacing-space-lg, 20px);\r\n }\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\r\n private toggle() {\r\n this.open = !this.open;\r\n\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\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\r\n render() {\r\n return html`\r\n <div class=\"accordion\">\r\n <div 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 <div class=\"title\">${this.title}</div>\r\n\r\n <div class=\"icon ${this.open ? \"rotated\" : \"\"}\">\r\n ${this.chevron()}\r\n </div>\r\n </div>\r\n\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 { 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 (pinned Figma hex) */\r\n .alert-neutral {\r\n background: #ffffff;\r\n color: #000000;\r\n }\r\n\r\n .alert-info {\r\n background: #E1F2FF;\r\n color: #000000;\r\n --rel-icon-info: #0059F4;\r\n }\r\n\r\n .alert-success {\r\n background: #E2FEEE;\r\n color: #000000;\r\n --rel-icon-success: #00A86B;\r\n }\r\n\r\n .alert-warning {\r\n background: #F6EFD7;\r\n color: #000000;\r\n --rel-icon-warning: #F2915C;\r\n }\r\n\r\n .alert-error {\r\n background: #FFDEDE;\r\n color: #9C1E33;\r\n --rel-icon-error: #9C1E33;\r\n }\r\n\r\n .alert-error .rel-close {\r\n color: #000000;\r\n }\r\n\r\n /* COLORS — dark mode (pinned Figma hex) */\r\n :host-context([data-theme=\"dark\"]) .rel-alert,\r\n :host-context(.dark) .rel-alert {\r\n background: #2B2B2B;\r\n color: #ffffff;\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: #ffffff;\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 #ffffff;\r\n --rel-colors-black: #ffffff;\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 #0059F4;\r\n --rel-icon-info: #0059F4;\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: #0059F4;\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 #F2915C;\r\n --rel-icon-warning: #F2915C;\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: #F2915C;\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 #00A86B;\r\n --rel-icon-success: #00A86B;\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: #00A86B;\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 #9C1E33;\r\n --rel-icon-error: #9C1E33;\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: #9C1E33;\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 { 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\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: #9E9E9E;\r\n 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}\">\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 { 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-colors-red-primary);\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 { 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-medium);\r\n color: var(--rel-text-heading, #2b2b2b);\r\n transition: color 0.2s ease;\r\n }\r\n\r\n a:hover {\r\n text-decoration: underline;\r\n color: var(--rel-colors-blue-primary, #0091ea);\r\n }\r\n\r\n a:focus-visible {\r\n outline: 2px solid var(--rel-colors-blue-primary, #0091ea);\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-text-heading, #2b2b2b);\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 { 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\" | \"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: 1px solid var(--rel-color-border-default) !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 border-color: var(--rel-color-border-default) !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-colors-red-primary);\r\n color: #ffffff;\r\n }\r\n .btn-default.tone-success {\r\n background: var(--rel-colors-green-success);\r\n color: var(--rel-colors-white);\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-colors-red-primary);\r\n color: #ffffff;\r\n }\r\n .btn-primary.tone-success {\r\n background: var(--rel-colors-green-success);\r\n color: var(--rel-colors-white);\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 background: var(--rel-colors-gray-light);\r\n color: var(--rel-colors-black);\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 button:hover:not(:disabled):not(.btn-primary):not(.btn-default) {\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 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-colors-blue-primary);\r\n outline-offset: 2px;\r\n }\r\n\r\n /* Dark mode overrides */\r\n :host-context([data-theme=\"dark\"]) button:focus-visible,\r\n :host-context(.dark) button:focus-visible {\r\n outline-color: #ffffff;\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) button.btn-secondary,\r\n :host-context(.dark) button.btn-secondary {\r\n background: #000000;\r\n border-color: #ffffff;\r\n color: #ffffff;\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: #ffffff;\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) button.btn-link,\r\n :host-context(.dark) button.btn-link {\r\n color: #ffffff;\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 // 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\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-colors-gray-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-colors-blue-primary);\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-colors-gray-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-colors-blue-primary);\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-border-focus);\r\n }\r\n\r\n .day-button.selected {\r\n background: var(--rel-color-brand);\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\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\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-colors-white, #fff);\r\n color: var(--rel-text-primary, #333);\r\n border-radius: var(--rel-borders-radius-border-radius-300);\r\n padding: var(--rel-spacing-space-md);\r\n box-shadow: var(--rel-shadows-shadow-200);\r\n transition: transform 0.2s ease, box-shadow 0.2s ease;\r\n }\r\n\r\n .card:hover {\r\n transform: translateY(-3px);\r\n box-shadow: var(--rel-shadows-shadow-300);\r\n }\r\n\r\n @media (prefers-reduced-motion: reduce) {\r\n .card {\r\n transition: none;\r\n }\r\n .card:hover {\r\n transform: none;\r\n }\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\";\r\nimport { customElement, property, state, query } from \"lit/decorators.js\";\r\n\r\n@customElement(\"rel-carousel\")\r\nexport class RelCarousel extends LitElement {\r\n @property({ type: Number, reflect: true }) value = 0;\r\n @property({ type: Boolean }) loop = false;\r\n @property({ type: Boolean }) autoplay = false;\r\n @property({ type: Number }) interval = 5000;\r\n @property({ type: Boolean, attribute: \"pause-on-hover\" }) pauseOnHover = true;\r\n @property({ type: Boolean, attribute: \"show-buttons\" }) showButtons = true;\r\n @property({ type: Boolean, attribute: \"show-dots\" }) showDots = true;\r\n @property({ type: String }) orientation: \"horizontal\" | \"vertical\" = \"horizontal\";\r\n @property({ type: String }) label: string = \"Carousel\";\r\n @property({ type: Number }) gap?: number;\r\n @property({ type: Boolean, reflect: true }) disabled = false;\r\n\r\n @state() private slideCount = 0;\r\n @state() private isDragging = false;\r\n @state() private dragStartX = 0;\r\n @state() private currentTranslate = 0;\r\n @state() private prevTranslate = 0;\r\n\r\n @query(\".viewport\") private viewport?: HTMLElement;\r\n @query(\".track\") private track?: HTMLElement;\r\n @query(\"slot\") private slotElement?: HTMLSlotElement;\r\n\r\n private autoplayTimer?: number;\r\n private animationId?: number;\r\n private prefersReducedMotion = 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 position: relative;\r\n user-select: none;\r\n }\r\n\r\n :host([disabled]) {\r\n opacity: 0.6;\r\n pointer-events: none;\r\n }\r\n\r\n .viewport {\r\n overflow: hidden;\r\n position: relative;\r\n width: 100%;\r\n }\r\n\r\n .track {\r\n display: flex;\r\n transition: transform 0.3s ease-out;\r\n will-change: transform;\r\n }\r\n\r\n .track.dragging {\r\n transition: none;\r\n }\r\n\r\n .track.no-transition {\r\n transition: none;\r\n }\r\n\r\n ::slotted(*) {\r\n flex: 0 0 100%;\r\n min-width: 0;\r\n }\r\n\r\n /* Navigation buttons */\r\n .nav-button {\r\n position: absolute;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n z-index: 10;\r\n width: var(--rel-carousel-nav-size, 40px);\r\n height: var(--rel-carousel-nav-size, 40px);\r\n border-radius: 50%;\r\n border: 1px solid var(--rel-color-border-default);\r\n background: var(--rel-color-bg-primary);\r\n color: var(--rel-colors-gray-primary);\r\n cursor: pointer;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n transition: all 0.15s ease;\r\n box-shadow: var(--rel-shadows-shadow-100);\r\n }\r\n\r\n .nav-button:hover:not(:disabled) {\r\n background: var(--rel-surface-secondary);\r\n }\r\n\r\n .nav-button:focus-visible {\r\n outline: 2px solid var(--rel-colors-blue-primary);\r\n outline-offset: 2px;\r\n }\r\n\r\n .nav-button:disabled {\r\n opacity: 0.4;\r\n cursor: not-allowed;\r\n }\r\n\r\n .nav-button.prev {\r\n left: 12px;\r\n }\r\n\r\n .nav-button.next {\r\n right: 12px;\r\n }\r\n\r\n .nav-button svg {\r\n width: 20px;\r\n height: 20px;\r\n }\r\n\r\n /* Dots indicator */\r\n .dots {\r\n display: flex;\r\n justify-content: center;\r\n gap: var(--rel-spacing-space-xs);\r\n margin-top: var(--rel-spacing-space-md);\r\n }\r\n\r\n .dot {\r\n width: var(--rel-carousel-dot-size, 8px);\r\n height: var(--rel-carousel-dot-size, 8px);\r\n border-radius: 50%;\r\n border: none;\r\n background: var(--rel-colors-gray-border);\r\n cursor: pointer;\r\n padding: 0;\r\n transition: all 0.15s ease;\r\n }\r\n\r\n .dot:hover {\r\n background: var(--rel-colors-gray-divider);\r\n }\r\n\r\n .dot.active {\r\n background: var(--rel-color-brand);\r\n width: var(--rel-carousel-dot-size-active, 24px);\r\n border-radius: 4px;\r\n }\r\n\r\n .dot:focus-visible {\r\n outline: 2px solid var(--rel-colors-blue-primary);\r\n outline-offset: 2px;\r\n }\r\n\r\n /* Reduced motion support */\r\n @media (prefers-reduced-motion: reduce) {\r\n .track {\r\n transition: none;\r\n }\r\n }\r\n `;\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n this.prefersReducedMotion = window.matchMedia(\r\n \"(prefers-reduced-motion: reduce)\"\r\n ).matches;\r\n\r\n if (this.autoplay) {\r\n this.startAutoplay();\r\n }\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback();\r\n this.stopAutoplay();\r\n if (this.animationId) {\r\n cancelAnimationFrame(this.animationId);\r\n }\r\n }\r\n\r\n private handleSlotChange() {\r\n const slot = this.slotElement;\r\n if (!slot) return;\r\n\r\n const elements = slot.assignedElements();\r\n this.slideCount = elements.length;\r\n\r\n // Ensure value is within bounds\r\n if (this.value >= this.slideCount) {\r\n this.value = this.slideCount - 1;\r\n }\r\n if (this.value < 0) {\r\n this.value = 0;\r\n }\r\n\r\n this.updateTransform();\r\n }\r\n\r\n private updateTransform() {\r\n if (!this.track || !this.viewport) return;\r\n\r\n const slideWidth = this.viewport.offsetWidth;\r\n const gapValue = this.gap ?? 0;\r\n const translate = -(this.value * (slideWidth + gapValue));\r\n\r\n this.currentTranslate = translate;\r\n this.prevTranslate = translate;\r\n this.track.style.transform = `translateX(${translate}px)`;\r\n\r\n if (this.gap) {\r\n this.track.style.gap = `${this.gap}px`;\r\n } else {\r\n this.track.style.gap = \"\";\r\n }\r\n }\r\n\r\n private goToPrevious() {\r\n if (this.disabled) return;\r\n\r\n if (this.value > 0) {\r\n this.value--;\r\n } else if (this.loop) {\r\n this.value = this.slideCount - 1;\r\n }\r\n\r\n this.updateTransform();\r\n this.emitChange();\r\n }\r\n\r\n private goToNext() {\r\n if (this.disabled) return;\r\n\r\n if (this.value < this.slideCount - 1) {\r\n this.value++;\r\n } else if (this.loop) {\r\n this.value = 0;\r\n }\r\n\r\n this.updateTransform();\r\n this.emitChange();\r\n }\r\n\r\n private goToSlide(index: number) {\r\n if (this.disabled || index < 0 || index >= this.slideCount) return;\r\n\r\n this.value = index;\r\n this.updateTransform();\r\n this.emitChange();\r\n }\r\n\r\n private emitChange() {\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 }\r\n\r\n private startAutoplay() {\r\n if (!this.autoplay || this.disabled) return;\r\n\r\n this.stopAutoplay();\r\n this.autoplayTimer = window.setInterval(() => {\r\n this.goToNext();\r\n }, this.interval);\r\n }\r\n\r\n private stopAutoplay() {\r\n if (this.autoplayTimer) {\r\n clearInterval(this.autoplayTimer);\r\n this.autoplayTimer = undefined;\r\n }\r\n }\r\n\r\n private handlePointerDown(e: PointerEvent) {\r\n if (this.disabled || !this.track) return;\r\n\r\n this.isDragging = true;\r\n this.dragStartX = e.clientX;\r\n this.prevTranslate = this.currentTranslate;\r\n\r\n this.track.classList.add(\"dragging\");\r\n\r\n if (this.autoplay && this.pauseOnHover) {\r\n this.stopAutoplay();\r\n }\r\n\r\n e.preventDefault();\r\n }\r\n\r\n private handlePointerMove(e: PointerEvent) {\r\n if (!this.isDragging || !this.track) return;\r\n\r\n const currentX = e.clientX;\r\n const deltaX = currentX - this.dragStartX;\r\n this.currentTranslate = this.prevTranslate + deltaX;\r\n\r\n if (!this.prefersReducedMotion && this.animationId) {\r\n cancelAnimationFrame(this.animationId);\r\n }\r\n\r\n this.animationId = requestAnimationFrame(() => {\r\n if (this.track) {\r\n this.track.style.transform = `translateX(${this.currentTranslate}px)`;\r\n }\r\n });\r\n }\r\n\r\n private handlePointerUp(e: PointerEvent) {\r\n if (!this.isDragging || !this.track || !this.viewport) return;\r\n\r\n this.isDragging = false;\r\n this.track.classList.remove(\"dragging\");\r\n\r\n const deltaX = e.clientX - this.dragStartX;\r\n const slideWidth = this.viewport.offsetWidth;\r\n const threshold = slideWidth * 0.2; // 20% threshold\r\n\r\n if (Math.abs(deltaX) > threshold) {\r\n if (deltaX > 0 && (this.value > 0 || this.loop)) {\r\n this.goToPrevious();\r\n } else if (deltaX < 0 && (this.value < this.slideCount - 1 || this.loop)) {\r\n this.goToNext();\r\n } else {\r\n this.updateTransform();\r\n }\r\n } else {\r\n this.updateTransform();\r\n }\r\n\r\n if (this.autoplay) {\r\n this.startAutoplay();\r\n }\r\n }\r\n\r\n private handleKeyDown(e: KeyboardEvent) {\r\n if (this.disabled) return;\r\n\r\n switch (e.key) {\r\n case \"ArrowLeft\":\r\n e.preventDefault();\r\n this.goToPrevious();\r\n break;\r\n case \"ArrowRight\":\r\n e.preventDefault();\r\n this.goToNext();\r\n break;\r\n case \"Home\":\r\n e.preventDefault();\r\n this.goToSlide(0);\r\n break;\r\n case \"End\":\r\n e.preventDefault();\r\n this.goToSlide(this.slideCount - 1);\r\n break;\r\n }\r\n }\r\n\r\n private handleMouseEnter() {\r\n if (this.autoplay && this.pauseOnHover) {\r\n this.stopAutoplay();\r\n }\r\n }\r\n\r\n private handleMouseLeave() {\r\n if (this.autoplay && this.pauseOnHover) {\r\n this.startAutoplay();\r\n }\r\n }\r\n\r\n updated(changedProperties: Map<string, any>) {\r\n if (changedProperties.has(\"autoplay\") || changedProperties.has(\"interval\")) {\r\n if (this.autoplay) {\r\n this.startAutoplay();\r\n } else {\r\n this.stopAutoplay();\r\n }\r\n }\r\n\r\n if (changedProperties.has(\"value\")) {\r\n this.updateTransform();\r\n }\r\n }\r\n\r\n render() {\r\n const canGoPrev = this.loop || this.value > 0;\r\n const canGoNext = this.loop || this.value < this.slideCount - 1;\r\n\r\n return html`\r\n <div\r\n class=\"viewport\"\r\n part=\"viewport\"\r\n role=\"region\"\r\n aria-roledescription=\"carousel\"\r\n aria-label=${this.label}\r\n @keydown=${this.handleKeyDown}\r\n @mouseenter=${this.handleMouseEnter}\r\n @mouseleave=${this.handleMouseLeave}\r\n tabindex=\"0\"\r\n >\r\n <div\r\n class=\"track\"\r\n part=\"track\"\r\n @pointerdown=${this.handlePointerDown}\r\n @pointermove=${this.handlePointerMove}\r\n @pointerup=${this.handlePointerUp}\r\n @pointercancel=${this.handlePointerUp}\r\n >\r\n <slot @slotchange=${this.handleSlotChange}></slot>\r\n </div>\r\n\r\n ${this.showButtons\r\n ? html`\r\n <button\r\n class=\"nav-button prev\"\r\n part=\"prev-button\"\r\n aria-label=\"Previous slide\"\r\n ?disabled=${!canGoPrev || this.disabled}\r\n @click=${this.goToPrevious}\r\n >\r\n <svg viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M10 12L6 8L10 4\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n\r\n <button\r\n class=\"nav-button next\"\r\n part=\"next-button\"\r\n aria-label=\"Next slide\"\r\n ?disabled=${!canGoNext || this.disabled}\r\n @click=${this.goToNext}\r\n >\r\n <svg viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path\r\n d=\"M6 4L10 8L6 12\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n `\r\n : nothing}\r\n </div>\r\n\r\n ${this.showDots && this.slideCount > 1\r\n ? html`\r\n <div class=\"dots\" part=\"dots\">\r\n ${Array.from({ length: this.slideCount }, (_, i) => html`\r\n <button\r\n class=\"dot ${i === this.value ? \"active\" : \"\"}\"\r\n part=\"dot\"\r\n aria-label=\"Go to slide ${i + 1}\"\r\n @click=${() => this.goToSlide(i)}\r\n ></button>\r\n `)}\r\n </div>\r\n `\r\n : nothing}\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\n@customElement(\"rel-card-media\")\r\nexport class RelCardMedia extends LitElement {\r\n @property({ type: String }) imageSrc = \"\";\r\n @property({ type: String }) 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-colors-white, #fff);\r\n color: var(--rel-text-primary, #333);\r\n border-radius: var(--rel-borders-radius-border-radius-300);\r\n overflow: hidden;\r\n box-shadow: var(--rel-shadows-shadow-200);\r\n transition: transform 0.2s ease, box-shadow 0.2s ease;\r\n }\r\n\r\n .card-media:hover {\r\n transform: translateY(-4px);\r\n box-shadow: var(--rel-shadows-shadow-300);\r\n }\r\n\r\n @media (prefers-reduced-motion: reduce) {\r\n .card-media {\r\n transition: none;\r\n }\r\n .card-media:hover {\r\n transform: none;\r\n }\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-text-heading, #2b2b2b);\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-text-primary, #333);\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 .box {\r\n width: 18px;\r\n height: 18px;\r\n border-radius: 4px;\r\n border: 2px solid var(--rel-text-heading, #2b2b2b);\r\n background: var(--rel-colors-white, #fff);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n transition: all 0.2s;\r\n flex-shrink: 0;\r\n }\r\n\r\n input:focus-visible + .box {\r\n outline: 2px solid var(--rel-border-info, #0091ea);\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 .box,\r\n .indeterminate .box {\r\n background: var(--rel-text-heading, #2b2b2b);\r\n border-color: var(--rel-text-heading, #2b2b2b);\r\n }\r\n\r\n .checked .check-icon {\r\n display: block;\r\n }\r\n\r\n .indeterminate .indeterminate-icon {\r\n display: block;\r\n }\r\n\r\n .error .box {\r\n border-color: var(--rel-colors-red-primary);\r\n }\r\n\r\n .error.checked .box,\r\n .error.indeterminate .box {\r\n background: var(--rel-colors-red-primary);\r\n border-color: var(--rel-colors-red-primary);\r\n }\r\n\r\n /* Pin checkmark/dash to white on red background — correct in both themes */\r\n .error.checked svg,\r\n .error.indeterminate svg {\r\n fill: #ffffff;\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 .label {\r\n font-size: var(--rel-fontSizes-md, 14px);\r\n font-weight: var(--rel-fontWeights-medium, 500);\r\n color: var(--rel-text-primary, #333);\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 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-colors-white);\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-colors-gray-heading);\r\n }\r\n\r\n .trigger-button:focus-visible {\r\n outline: 2px solid var(--rel-colors-blue-primary);\r\n outline-offset: 2px;\r\n border-color: var(--rel-colors-blue-primary);\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-colors-gray-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-colors-gray-heading);\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-colors-white);\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-colors-gray-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-colors-blue-primary);\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-colors-white);\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-colors-blue-primary);\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-colors-white);\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-colors-blue-bg);\r\n color: var(--rel-colors-blue-primary);\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-colors-gray-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-colors-blue-primary);\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-blue-primary);\r\n }\r\n\r\n .day-button.selected {\r\n background: var(--rel-colors-green-primary);\r\n color: var(--rel-colors-black);\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 } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\r\n@customElement(\"rel-chip\")\r\nexport class RelChip extends LitElement {\r\n @property({ type: String }) label = \"Label\";\r\n\r\n @property({ type: String })\r\n tone: \"default\" | \"blue\" | \"yellow\" | \"red\" | \"green\" = \"default\";\r\n\r\n @property({ type: String }) leadingIcon?: string;\r\n @property({ type: String }) trailingIcon?: string;\r\n @property({ type: String }) avatar?: string;\r\n\r\n @property({ type: Boolean }) removable = false;\r\n @property({ type: Boolean }) outline = false;\r\n\r\n /** IMPORTANT: reflected so CSS + Angular can see it */\r\n @property({ type: Boolean, reflect: true }) removed = false;\r\n\r\n static styles = css`\r\n :host {\r\n display: inline-block;\r\n }\r\n\r\n :host([removed]) {\r\n display: none;\r\n }\r\n\r\n .chip {\r\n display: inline-flex;\r\n align-items: center;\r\n font-family: var(--rel-fontFamilies-primary);\r\n font-size: var(--rel-fontSizes-md);\r\n font-weight: var(--rel-fontWeights-medium);\r\n border-radius: var(--rel-borders-radius-border-radius-500);\r\n padding: var(--rel-spacing-space-2xs) var(--rel-spacing-space-sm);\r\n gap: var(--rel-spacing-space-2xs);\r\n cursor: pointer;\r\n border: var(--rel-borders-width-stroke-100) solid transparent;\r\n user-select: none;\r\n white-space: nowrap;\r\n background: transparent;\r\n }\r\n\r\n .chip:hover {\r\n filter: brightness(0.92);\r\n box-shadow: var(--rel-shadows-shadow-100);\r\n }\r\n\r\n .chip:focus-visible {\r\n outline: 2px solid var(--rel-colors-blue-primary, #0091ea);\r\n outline-offset: 2px;\r\n }\r\n\r\n /* TONES */\r\n .chip-default {\r\n background: var(--rel-colors-gray-border);\r\n color: #000000;\r\n }\r\n\r\n .chip-blue {\r\n background: var(--rel-colors-blue-tertiary);\r\n color: #ffffff;\r\n }\r\n\r\n .chip-yellow {\r\n background: var(--rel-colors-yellow-pending);\r\n color: #000000;\r\n }\r\n\r\n .chip-red {\r\n background: var(--rel-colors-red-secondary);\r\n color: #ffffff;\r\n }\r\n\r\n .chip-green {\r\n background: var(--rel-colors-green-success);\r\n color: #ffffff;\r\n }\r\n\r\n /* OUTLINE */\r\n .chip-outline {\r\n background: transparent;\r\n border-color: var(--rel-color-border-default);\r\n }\r\n\r\n .chip-blue.chip-outline {\r\n color: #000000;\r\n background: transparent;\r\n border-color: #0059F4;\r\n }\r\n\r\n .chip-red.chip-outline {\r\n color: #9C1E33;\r\n background: transparent;\r\n border-color: #9C1E33;\r\n }\r\n\r\n .chip-green.chip-outline {\r\n color: #00A86B;\r\n background: transparent;\r\n border-color: #00A86B;\r\n }\r\n\r\n .chip-yellow.chip-outline {\r\n color: #92400E;\r\n background: transparent;\r\n border-color: #F2915C;\r\n }\r\n\r\n .chip-avatar {\r\n width: 20px;\r\n height: 20px;\r\n border-radius: 50%;\r\n object-fit: cover;\r\n }\r\n\r\n .chip-icon {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 14px;\r\n height: 14px;\r\n flex-shrink: 0;\r\n }\r\n\r\n .chip-icon * {\r\n width: 100%;\r\n height: 100%;\r\n }\r\n\r\n .chip-icon ::slotted(svg),\r\n .chip-icon svg {\r\n width: 16px;\r\n height: 16px;\r\n fill: currentColor;\r\n }\r\n\r\n .chip-remove {\r\n margin-left: var(--rel-spacing-space-3xs);\r\n cursor: pointer;\r\n opacity: 0.7;\r\n background: none;\r\n border: none;\r\n color: inherit;\r\n font: inherit;\r\n padding: 0;\r\n line-height: 1;\r\n }\r\n\r\n .chip-remove:hover {\r\n opacity: 1;\r\n }\r\n\r\n .chip-remove:focus-visible {\r\n outline: 2px solid var(--rel-colors-white, #fff);\r\n outline-offset: 1px;\r\n border-radius: 2px;\r\n }\r\n\r\n /* Dark mode overrides */\r\n :host-context([data-theme=\"dark\"]) .chip-default,\r\n :host-context(.dark) .chip-default {\r\n color: #ffffff;\r\n background: var(--rel-color-bg-secondary);\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .chip-default.chip-outline,\r\n :host-context(.dark) .chip-default.chip-outline {\r\n color: #ffffff;\r\n border-color: #ffffff;\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .chip-outline,\r\n :host-context(.dark) .chip-outline {\r\n color: #ffffff;\r\n border-color: currentColor;\r\n }\r\n `;\r\n\r\n private get classes() {\r\n return [\r\n \"chip\",\r\n `chip-${this.tone}`,\r\n this.outline ? \"chip-outline\" : \"\",\r\n ].join(\" \");\r\n }\r\n\r\n private handleRemove(event: Event) {\r\n event.stopPropagation();\r\n this.removed = true;\r\n\r\n this.dispatchEvent(\r\n new CustomEvent(\"removed\", {\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 <span\r\n class=\"${this.classes}\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n aria-label=\"${this.label}\"\r\n >\r\n ${this.avatar\r\n ? html`<img src=${this.avatar} alt=\"\" class=\"chip-avatar\" />`\r\n : null}\r\n ${this.leadingIcon\r\n ? html`<span class=\"chip-icon\">\r\n ${this.renderIcon(this.leadingIcon)}\r\n </span>`\r\n : null}\r\n\r\n <span class=\"chip-label\">${this.label}</span>\r\n\r\n ${this.trailingIcon\r\n ? html`<span class=\"chip-icon\">\r\n ${this.renderIcon(this.trailingIcon)}\r\n </span>`\r\n : null}\r\n ${this.removable\r\n ? html`<button\r\n class=\"chip-remove\"\r\n aria-label=\"Remove ${this.label}\"\r\n @click=${this.handleRemove}\r\n >\r\n ✕\r\n </button>`\r\n : null}\r\n </span>\r\n `;\r\n }\r\n\r\n private renderIcon(iconString: string) {\r\n const template = document.createElement(\"template\");\r\n template.innerHTML = iconString.trim();\r\n return template.content.cloneNode(true);\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-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-colors-white);\r\n }\r\n\r\n .bg-light {\r\n background-color: var(--rel-colors-gray-light);\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-colors-gray-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-colors-gray-border);\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-colors-gray-border);\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 \"./rel-drawer-footer\";\r\n\r\nexport type DrawerSide = \"bottom\" | \"left\" | \"right\" | \"top\";\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 = \"420px\";\r\n @property({ type: Boolean, reflect: true }) disabled = false;\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 :host([disabled]) {\r\n pointer-events: none;\r\n opacity: 0.6;\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-colors-white);\r\n box-shadow: var(--rel-shadows-shadow-500);\r\n display: flex;\r\n flex-direction: column;\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: 0;\r\n right: 0;\r\n max-height: var(--drawer-max-height, 80vh);\r\n border-top-left-radius: var(--rel-borders-radius-border-radius-300);\r\n border-top-right-radius: var(--rel-borders-radius-border-radius-300);\r\n transform: translateY(100%);\r\n }\r\n\r\n .drawer-container.open .panel[data-side=\"bottom\"] {\r\n transform: 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, 420px);\r\n max-width: 90vw;\r\n border-top-right-radius: var(--rel-borders-radius-border-radius-300);\r\n border-bottom-right-radius: var(--rel-borders-radius-border-radius-300);\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, 420px);\r\n max-width: 90vw;\r\n border-top-left-radius: var(--rel-borders-radius-border-radius-300);\r\n border-bottom-left-radius: var(--rel-borders-radius-border-radius-300);\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 /* Top drawer */\r\n .panel[data-side=\"top\"] {\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n max-height: var(--drawer-max-height, 80vh);\r\n border-bottom-left-radius: var(--rel-borders-radius-border-radius-300);\r\n border-bottom-right-radius: var(--rel-borders-radius-border-radius-300);\r\n transform: translateY(-100%);\r\n }\r\n\r\n .drawer-container.open .panel[data-side=\"top\"] {\r\n transform: translateY(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 /* Handle */\r\n .handle {\r\n width: 48px;\r\n height: 4px;\r\n background: var(--rel-colors-gray-divider);\r\n border-radius: var(--rel-borders-radius-border-radius-500);\r\n margin: var(--rel-spacing-space-sm) auto var(--rel-spacing-space-xs);\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-colors-gray-border);\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: center;\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 border-radius: var(--rel-borders-radius-border-radius-100);\r\n color: var(--rel-colors-gray-primary, #333);\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-colors-gray-divider, #bdbdbd);\r\n }\r\n\r\n .close-button:focus-visible {\r\n outline: 2px solid var(--rel-colors-blue-primary, #0091ea);\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 padding: var(--rel-spacing-space-md) var(--rel-spacing-space-lg);\r\n border-top: var(--rel-borders-width-stroke-100) solid var(--rel-colors-gray-border);\r\n }\r\n\r\n .footer.empty {\r\n display: none;\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 focusPanel() {\r\n if (!this.panelElement) return;\r\n\r\n const focusable = this.getFocusableElements();\r\n if (focusable.length > 0) {\r\n focusable[0].focus();\r\n } else {\r\n this.panelElement.focus();\r\n }\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: 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 private hasSlotContent(slotName?: string): boolean {\r\n const slot = this.shadowRoot?.querySelector(\r\n slotName ? `slot[name=\"${slotName}\"]` : \"slot:not([name])\"\r\n ) as HTMLSlotElement;\r\n return slot ? slot.assignedElements({ flatten: true }).length > 0 : false;\r\n }\r\n\r\n render() {\r\n const hasTitle = !!this.title;\r\n const hasDescription = !!this.description;\r\n const hasFooter = this.hasSlotContent(\"footer\");\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.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 <svg\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M12.8 4.27L11.73 3.2L8 6.93L4.27 3.2L3.2 4.27L6.93 8L3.2 11.73L4.27 12.8L8 9.07L11.73 12.8L12.8 11.73L9.07 8L12.8 4.27Z\"\r\n fill=\"currentColor\" />\r\n </svg>\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 ${hasFooter\r\n ? html`<div part=\"footer\" class=\"footer\">\r\n <rel-drawer-footer><slot name=\"footer\"></slot></rel-drawer-footer>\r\n </div>`\r\n : \"\"}\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 padding-top: var(--rel-spacing-space-md);\n border-top: 1px solid var(--rel-color-border-divider);\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\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\r\n@customElement(\"rel-kbd\")\r\nexport class RelKbd extends LitElement {\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: \"default\" | \"muted\" = \"default\";\r\n\r\n @property({ type: Boolean, reflect: true })\r\n pill = false;\r\n\r\n @property({ type: Boolean, reflect: true })\r\n inset = false;\r\n\r\n static styles = css`\r\n :host {\r\n display: inline-flex;\r\n }\r\n\r\n kbd {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-family: var(--rel-fontFamilies-primary);\r\n font-weight: var(--rel-fontWeights-medium);\r\n white-space: nowrap;\r\n user-select: none;\r\n transition: all 0.15s ease;\r\n line-height: 1;\r\n vertical-align: middle;\r\n }\r\n\r\n /* Size variants */\r\n .kbd-sm {\r\n font-size: var(--rel-fontSizes-xs);\r\n padding: var(--rel-spacing-space-3xs) var(--rel-spacing-space-xs);\r\n min-width: 20px;\r\n height: 20px;\r\n border-radius: var(--rel-borders-radius-border-radius-100);\r\n }\r\n\r\n .kbd-md {\r\n font-size: var(--rel-fontSizes-sm);\r\n padding: var(--rel-spacing-space-2xs) var(--rel-spacing-space-sm);\r\n min-width: 24px;\r\n height: 24px;\r\n border-radius: var(--rel-borders-radius-border-radius-100);\r\n }\r\n\r\n .kbd-lg {\r\n font-size: var(--rel-fontSizes-md);\r\n padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-md);\r\n min-width: 32px;\r\n height: 32px;\r\n border-radius: var(--rel-borders-radius-border-radius-200);\r\n }\r\n\r\n /* Variant: default */\r\n .kbd-default {\r\n background: var(--rel-colors-gray-light);\r\n color: var(--rel-colors-gray-heading);\r\n border: var(--rel-borders-width-stroke-100) solid var(--rel-colors-gray-border);\r\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05), 0 1px 0 0 rgba(255, 255, 255, 0.5) inset;\r\n }\r\n\r\n /* Variant: muted */\r\n .kbd-muted {\r\n background: var(--rel-surface-secondary, #fafafa);\r\n color: var(--rel-colors-gray-placeholder);\r\n border: var(--rel-borders-width-stroke-100) solid var(--rel-colors-gray-divider);\r\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.03);\r\n }\r\n\r\n /* Pill modifier */\r\n :host([pill]) .kbd-sm {\r\n border-radius: var(--rel-borders-radius-border-radius-500);\r\n }\r\n\r\n :host([pill]) .kbd-md {\r\n border-radius: var(--rel-borders-radius-border-radius-500);\r\n }\r\n\r\n :host([pill]) .kbd-lg {\r\n border-radius: var(--rel-borders-radius-border-radius-500);\r\n }\r\n\r\n /* Inset modifier - pressed appearance */\r\n :host([inset]) kbd {\r\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1) inset, 0 1px 0 0 rgba(0, 0, 0, 0.05);\r\n transform: translateY(1px);\r\n }\r\n\r\n :host([inset]) .kbd-default {\r\n background: var(--rel-surface-secondary, #fafafa);\r\n border-color: var(--rel-colors-gray-divider);\r\n }\r\n\r\n :host([inset]) .kbd-muted {\r\n background: var(--rel-colors-gray-divider);\r\n border-color: var(--rel-colors-gray-border);\r\n }\r\n `;\r\n\r\n private get classes() {\r\n return [\"kbd\", `kbd-${this.size}`, `kbd-${this.variant}`].join(\" \");\r\n }\r\n\r\n render() {\r\n return html`\r\n <kbd class=\"${this.classes}\" role=\"presentation\">\r\n <slot></slot>\r\n </kbd>\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\n@customElement(\"rel-layout\")\r\nexport class RelLayout extends LitElement {\r\n @property({ type: String }) gap = \"1rem\";\r\n\r\n @property({ type: Number }) columns = 4;\r\n\r\n // 🔥 IMPORTANT: reflect so CSS selectors work\r\n @property({ type: Boolean, reflect: true }) responsive = true;\r\n\r\n static styles = css`\r\n :host {\r\n display: block;\r\n width: 100%;\r\n }\r\n\r\n .layout-grid {\r\n display: grid;\r\n width: 100%;\r\n font-family: var(--rel-fontFamilies-primary);\r\n }\r\n\r\n /* Responsive breakpoints — only when attribute exists */\r\n @media (max-width: 1024px) {\r\n :host([responsive]) .layout-grid {\r\n grid-template-columns: repeat(3, 1fr) !important;\r\n }\r\n }\r\n\r\n @media (max-width: 768px) {\r\n :host([responsive]) .layout-grid {\r\n grid-template-columns: repeat(2, 1fr) !important;\r\n }\r\n }\r\n\r\n @media (max-width: 480px) {\r\n :host([responsive]) .layout-grid {\r\n grid-template-columns: 1fr !important;\r\n }\r\n }\r\n `;\r\n\r\n render() {\r\n return html`\r\n <div\r\n class=\"layout-grid\"\r\n style=\"\r\n gap: ${this.gap};\r\n grid-template-columns: repeat(${this.columns}, 1fr);\r\n \"\r\n >\r\n <slot></slot>\r\n </div>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property, state } from \"lit/decorators.js\";\r\n\r\nexport type MenuType = \"default\" | \"checkbox\" | \"arrow\";\r\n\r\nexport interface MenuItem {\r\n label: string;\r\n active?: boolean;\r\n checked?: boolean;\r\n disabled?: boolean;\r\n submenu?: MenuItem[];\r\n open?: boolean;\r\n}\r\n\r\n@customElement(\"rel-menu-item\")\r\nexport class RelMenuItem extends LitElement {\r\n @property({ type: String }) label: string = \"\";\r\n @property({ type: String }) value: string = \"\";\r\n @property({ type: Boolean }) disabled: boolean = false;\r\n @property({ type: String }) icon: string = \"\";\r\n\r\n render() {\r\n return html``;\r\n }\r\n}\r\n\r\n@customElement(\"rel-menu\")\r\nexport class RelMenu extends LitElement {\r\n @property({ type: String }) type: MenuType = \"default\";\r\n\r\n @property({ type: Array }) items: MenuItem[] = [];\r\n\r\n @state() private focusedIndex: number = 0;\r\n @state() private _menuItems: RelMenuItem[] = [];\r\n\r\n static styles = css`\r\n :host {\r\n display: inline-block;\r\n }\r\n\r\n .rel-menu {\r\n position: relative;\r\n display: inline-block;\r\n background: var(--rel-color-bg-primary);\r\n color: var(--rel-color-text-primary);\r\n border-radius: var(--rel-borders-radius-border-radius-300);\r\n box-shadow: var(--rel-shadows-shadow-300);\r\n min-width: 220px;\r\n font-family: var(--rel-fontFamilies-primary, sans-serif);\r\n font-size: var(--rel-fontSizes-sm);\r\n padding: var(--rel-spacing-space-3xs) 0;\r\n outline: none;\r\n overflow: hidden;\r\n }\r\n\r\n .rel-menu:focus-visible {\r\n outline: 2px solid var(--rel-colors-blue-primary, #0091ea);\r\n outline-offset: 2px;\r\n }\r\n\r\n .rel-menu-item {\r\n position: relative;\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-space-xs);\r\n padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-sm);\r\n line-height: var(--rel-lineHeights-sm);\r\n cursor: pointer;\r\n transition: background 0.15s ease, color 0.15s ease;\r\n user-select: none;\r\n }\r\n\r\n .rel-menu-item:hover {\r\n background: var(--rel-color-bg-hover);\r\n }\r\n\r\n .rel-menu-item:active {\r\n background: var(--rel-color-bg-hover);\r\n }\r\n\r\n .rel-menu-item.active {\r\n background: var(--rel-color-bg-hover);\r\n font-weight: var(--rel-fontWeights-medium);\r\n }\r\n\r\n .rel-menu-item.disabled {\r\n background-color: transparent;\r\n color: var(--rel-text-disabled, #9e9e9e);\r\n cursor: not-allowed;\r\n }\r\n\r\n .rel-menu-item[data-focused=\"true\"] {\r\n outline: 2px solid var(--rel-colors-blue-primary, #0091ea);\r\n outline-offset: -2px;\r\n }\r\n\r\n .menu-check-row {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-space-2xs);\r\n width: 100%;\r\n }\r\n\r\n .menu-checkbox {\r\n width: 16px;\r\n height: 16px;\r\n cursor: pointer;\r\n }\r\n\r\n .menu-checkbox:disabled {\r\n cursor: not-allowed;\r\n }\r\n\r\n .menu-label {\r\n flex: 1 1 auto;\r\n }\r\n\r\n .chevron {\r\n font-size: var(--rel-fontSizes-lg);\r\n opacity: 0.75;\r\n transform: translateY(1px);\r\n }\r\n\r\n .rel-submenu {\r\n position: absolute;\r\n top: calc(-1 * var(--rel-spacing-space-3xs));\r\n left: calc(100% + var(--rel-spacing-space-2xs));\r\n min-width: 200px;\r\n background: var(--rel-color-bg-primary);\r\n color: var(--rel-color-text-primary);\r\n border-radius: var(--rel-borders-radius-border-radius-300);\r\n box-shadow: var(--rel-shadows-shadow-300);\r\n padding: var(--rel-spacing-space-3xs) 0;\r\n display: none;\r\n z-index: 20;\r\n }\r\n\r\n .rel-submenu.visible {\r\n display: block;\r\n }\r\n\r\n .rel-submenu .rel-menu-item {\r\n padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-sm);\r\n }\r\n `;\r\n\r\n private _onSlotChange(e: Event) {\r\n const slot = e.target as HTMLSlotElement;\r\n this._menuItems = slot\r\n .assignedElements()\r\n .filter((el): el is RelMenuItem => el instanceof RelMenuItem);\r\n }\r\n\r\n private get _effectiveItems(): MenuItem[] {\r\n if (this._menuItems.length > 0) {\r\n return this._menuItems.map((el) => ({\r\n label: el.label,\r\n disabled: el.disabled,\r\n }));\r\n }\r\n return this.items;\r\n }\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n document.addEventListener(\"click\", this.handleDocumentClick);\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback();\r\n document.removeEventListener(\"click\", this.handleDocumentClick);\r\n }\r\n\r\n private handleDocumentClick = (e: MouseEvent) => {\r\n const path = e.composedPath() as HTMLElement[];\r\n const hit = path.some((n) => n?.classList?.contains(\"rel-menu\"));\r\n if (!hit) {\r\n this._effectiveItems.forEach((i) => (i.open = false));\r\n this.requestUpdate();\r\n }\r\n };\r\n\r\n private onItemEnter(item: MenuItem) {\r\n if (this.type === \"arrow\" && item.submenu?.length) {\r\n this._effectiveItems.forEach((i) => {\r\n if (i !== item) i.open = false;\r\n });\r\n item.open = true;\r\n this.requestUpdate();\r\n }\r\n }\r\n\r\n private onItemLeave(_item: MenuItem) {\r\n // Keep open so user can move into submenu\r\n }\r\n\r\n private onItemClick(item: MenuItem, index: number, ev?: Event) {\r\n ev?.stopPropagation();\r\n if (item.disabled) return;\r\n\r\n this.focusedIndex = index;\r\n\r\n if (this.type === \"checkbox\") {\r\n item.checked = !item.checked;\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-check\", {\r\n detail: { item, checked: item.checked },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n this.requestUpdate();\r\n return;\r\n }\r\n\r\n if (this.type === \"arrow\" && item.submenu?.length) {\r\n const next = !item.open;\r\n this._effectiveItems.forEach((i) => (i.open = false));\r\n item.open = next;\r\n this.requestUpdate();\r\n return;\r\n }\r\n\r\n // Default: set active\r\n this._effectiveItems.forEach((i) => (i.active = false));\r\n item.active = true;\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-select\", {\r\n detail: { item },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n this.requestUpdate();\r\n }\r\n\r\n private onSubClick(parent: MenuItem, sub: MenuItem, ev?: Event) {\r\n ev?.stopPropagation();\r\n this._effectiveItems.forEach((i) => {\r\n i.active = false;\r\n i.submenu?.forEach((s) => (s.active = false));\r\n });\r\n sub.active = true;\r\n parent.open = false;\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-submenu-select\", {\r\n detail: { parent, sub },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n this.requestUpdate();\r\n }\r\n\r\n private toggleCheckbox(item: MenuItem, ev: Event) {\r\n ev.stopPropagation();\r\n if (!item.disabled) {\r\n item.checked = !item.checked;\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-check\", {\r\n detail: { item, checked: item.checked },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n this.requestUpdate();\r\n }\r\n }\r\n\r\n private onKeydown(ev: KeyboardEvent) {\r\n const last = this._effectiveItems.length - 1;\r\n\r\n if (ev.key === \"ArrowDown\") {\r\n this.focusedIndex = Math.min(last, this.focusedIndex + 1);\r\n ev.preventDefault();\r\n } else if (ev.key === \"ArrowUp\") {\r\n this.focusedIndex = Math.max(0, this.focusedIndex - 1);\r\n ev.preventDefault();\r\n } else if (ev.key === \"ArrowRight\") {\r\n const item = this._effectiveItems[this.focusedIndex];\r\n if (this.type === \"arrow\" && item?.submenu?.length) {\r\n item.open = true;\r\n this.requestUpdate();\r\n }\r\n } else if (ev.key === \"ArrowLeft\" || ev.key === \"Escape\") {\r\n this._effectiveItems.forEach((i) => (i.open = false));\r\n this.requestUpdate();\r\n } else if (ev.key === \"Enter\" || ev.key === \" \") {\r\n const item = this._effectiveItems[this.focusedIndex];\r\n this.onItemClick(item, this.focusedIndex);\r\n ev.preventDefault();\r\n }\r\n }\r\n\r\n private renderMenuItem(item: MenuItem, index: number) {\r\n const isFocused = this.focusedIndex === index;\r\n\r\n return html`\r\n <div\r\n class=\"rel-menu-item ${item.active ? \"active\" : \"\"} ${item.disabled ? \"disabled\" : \"\"}\"\r\n role=\"menuitem\"\r\n ?data-focused=\"${isFocused}\"\r\n @mouseenter=\"${() => this.onItemEnter(item)}\"\r\n @mouseleave=\"${() => this.onItemLeave(item)}\"\r\n @click=\"${(e: Event) => this.onItemClick(item, index, e)}\">\r\n ${this.type === \"checkbox\"\r\n ? html`\r\n <div class=\"menu-check-row\">\r\n <input\r\n class=\"menu-checkbox\"\r\n type=\"checkbox\"\r\n .checked=\"${item.checked || false}\"\r\n ?disabled=\"${item.disabled}\"\r\n @click=\"${(e: Event) => this.toggleCheckbox(item, e)}\" />\r\n <span class=\"menu-label\">${item.label}</span>\r\n </div>\r\n `\r\n : html`\r\n <span class=\"menu-label\">${item.label}</span>\r\n ${this.type === \"arrow\" && item.submenu?.length\r\n ? html`<span class=\"chevron\">▸</span>`\r\n : \"\"}\r\n `}\r\n ${this.type === \"arrow\" && item.submenu?.length\r\n ? html`\r\n <div\r\n class=\"rel-submenu ${item.open ? \"visible\" : \"\"}\"\r\n @click=\"${(e: Event) => e.stopPropagation()}\">\r\n ${item.submenu.map(\r\n (sub) => html`\r\n <div\r\n class=\"rel-menu-item ${sub.active ? \"active\" : \"\"}\"\r\n role=\"menuitem\"\r\n @click=\"${(e: Event) => this.onSubClick(item, sub, e)}\">\r\n <span class=\"menu-label\">${sub.label}</span>\r\n </div>\r\n `\r\n )}\r\n </div>\r\n `\r\n : \"\"}\r\n </div>\r\n `;\r\n }\r\n\r\n render() {\r\n return html`\r\n <slot name=\"items\" style=\"display:none;\" @slotchange=\"${this._onSlotChange}\"></slot>\r\n <div\r\n class=\"rel-menu\"\r\n role=\"menu\"\r\n tabindex=\"0\"\r\n @keydown=\"${this.onKeydown}\"\r\n @click=\"${(e: Event) => e.stopPropagation()}\">\r\n ${this._effectiveItems.map((item, index) => this.renderMenuItem(item, index))}\r\n </div>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, state, query } from \"lit/decorators.js\";\r\nimport { RelMenubarMenu } from \"./rel-menubar-menu\";\r\nimport \"@reliability-design/icons/rel-icon\";\r\nimport \"../rel-checkbox/rel-checkbox\";\r\n\r\ninterface MenuState {\r\n menu: RelMenubarMenu;\r\n open: boolean;\r\n panelElement?: HTMLElement;\r\n}\r\n\r\n@customElement(\"rel-menubar\")\r\nexport class RelMenubar extends LitElement {\r\n @state() private menus: MenuState[] = [];\r\n @state() private openMenuIndex: number = -1;\r\n @state() private focusedTriggerIndex: number = 0;\r\n @state() private focusedItemIndex: number = 0;\r\n @state() private openSubmenuElement: HTMLElement | null = null;\r\n\r\n @query(\".menubar-container\") private container!: HTMLElement;\r\n\r\n private hoverSwitchEnabled = false;\r\n\r\n static styles = css`\r\n :host {\r\n display: block;\r\n }\r\n\r\n .menubar-container {\r\n display: flex;\r\n align-items: center;\r\n background: var(--rel-colors-gray-light);\r\n border: var(--rel-borders-width-stroke-100) solid var(--rel-colors-gray-border);\r\n border-radius: var(--rel-borders-radius-border-radius-200);\r\n padding: var(--rel-spacing-space-3xs);\r\n gap: var(--rel-spacing-space-3xs);\r\n font-family: var(--rel-fontFamilies-primary);\r\n font-size: var(--rel-fontSizes-sm);\r\n }\r\n\r\n .menubar-trigger {\r\n padding: var(--rel-spacing-space-2xs) var(--rel-spacing-space-sm);\r\n border-radius: var(--rel-borders-radius-border-radius-100);\r\n background: transparent;\r\n border: none;\r\n cursor: pointer;\r\n font-family: inherit;\r\n font-size: inherit;\r\n color: var(--rel-colors-gray-heading);\r\n transition: background 0.15s ease;\r\n user-select: none;\r\n outline: none;\r\n }\r\n\r\n .menubar-trigger:hover {\r\n background: var(--rel-color-bg-hover);\r\n }\r\n\r\n .menubar-trigger:focus-visible {\r\n outline: 2px solid var(--rel-colors-blue-primary);\r\n outline-offset: 2px;\r\n }\r\n\r\n .menubar-trigger.active {\r\n background: var(--rel-color-bg-hover);\r\n }\r\n\r\n .menubar-panel {\r\n position: fixed;\r\n min-width: 220px;\r\n background: var(--rel-color-bg-primary);\r\n border: var(--rel-borders-width-stroke-100) solid var(--rel-colors-gray-border);\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-2xs) 0;\r\n z-index: 1000;\r\n display: none;\r\n }\r\n\r\n .menubar-panel.open {\r\n display: block;\r\n }\r\n\r\n .menu-item {\r\n position: relative;\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: var(--rel-spacing-space-sm);\r\n padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-md);\r\n cursor: pointer;\r\n transition: background 0.15s ease;\r\n user-select: none;\r\n color: var(--rel-colors-gray-heading);\r\n line-height: var(--rel-lineHeights-sm);\r\n }\r\n\r\n .menu-item:hover,\r\n .menu-item.focused {\r\n background: var(--rel-color-bg-hover);\r\n }\r\n\r\n .menu-item[data-disabled=\"true\"] {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n }\r\n\r\n .menu-separator {\r\n height: var(--rel-borders-width-stroke-100);\r\n background: var(--rel-colors-gray-divider);\r\n margin: var(--rel-spacing-space-2xs) var(--rel-spacing-space-xs);\r\n }\r\n\r\n .menu-checkbox,\r\n .menu-radio-item {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-space-xs);\r\n padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-md);\r\n cursor: pointer;\r\n transition: background 0.15s ease;\r\n user-select: none;\r\n color: var(--rel-colors-gray-heading);\r\n line-height: var(--rel-lineHeights-sm);\r\n }\r\n\r\n .menu-checkbox:hover,\r\n .menu-checkbox.focused,\r\n .menu-radio-item:hover,\r\n .menu-radio-item.focused {\r\n background: var(--rel-color-bg-hover);\r\n }\r\n\r\n .menu-checkbox rel-checkbox,\r\n .menu-radio-item::before {\r\n margin: 0;\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) rel-checkbox,\r\n :host-context(.dark) rel-checkbox {\r\n color: var(--rel-color-text-primary);\r\n }\r\n\r\n rel-icon {\r\n display: inline-flex;\r\n pointer-events: none;\r\n }\r\n\r\n .menu-radio-item {\r\n position: relative;\r\n padding-left: calc(var(--rel-spacing-space-md) + var(--rel-spacing-space-md));\r\n }\r\n\r\n .menu-radio-item::before {\r\n content: \"\";\r\n position: absolute;\r\n left: var(--rel-spacing-space-md);\r\n width: 12px;\r\n height: 12px;\r\n border-radius: 50%;\r\n border: var(--rel-borders-width-stroke-150) solid var(--rel-colors-gray-border);\r\n background: var(--rel-colors-white);\r\n }\r\n\r\n .menu-radio-item.checked::after {\r\n content: \"\";\r\n position: absolute;\r\n left: calc(var(--rel-spacing-space-md) + 3px);\r\n width: 6px;\r\n height: 6px;\r\n border-radius: 50%;\r\n background: var(--rel-colors-blue-primary);\r\n }\r\n\r\n .menu-submenu-trigger {\r\n position: relative;\r\n }\r\n\r\n .menu-submenu-trigger rel-icon {\r\n opacity: 0.6;\r\n }\r\n\r\n .submenu-panel {\r\n position: fixed;\r\n min-width: 200px;\r\n background: var(--rel-color-bg-primary);\r\n border: var(--rel-borders-width-stroke-100) solid var(--rel-colors-gray-border);\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-2xs) 0;\r\n z-index: 1001;\r\n display: none;\r\n }\r\n\r\n .submenu-panel.open {\r\n display: block;\r\n }\r\n\r\n .menu-shortcut {\r\n opacity: 0.6;\r\n font-size: var(--rel-fontSizes-xs);\r\n margin-left: auto;\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-space-3xs);\r\n }\r\n `;\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n this.discoverMenus();\r\n document.addEventListener(\"click\", this.handleOutsideClick);\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback();\r\n document.removeEventListener(\"click\", this.handleOutsideClick);\r\n }\r\n\r\n private discoverMenus() {\r\n const menuElements = Array.from(\r\n this.querySelectorAll(\"rel-menubar-menu\")\r\n ) as RelMenubarMenu[];\r\n this.menus = menuElements.map((menu) => ({ menu, open: false }));\r\n }\r\n\r\n private handleOutsideClick = (e: MouseEvent) => {\r\n const path = e.composedPath() as HTMLElement[];\r\n const isInside = path.some(\r\n (el) =>\r\n el === this ||\r\n el.classList?.contains(\"menubar-panel\") ||\r\n el.classList?.contains(\"submenu-panel\")\r\n );\r\n if (!isInside) {\r\n this.closeAllMenus();\r\n }\r\n };\r\n\r\n private closeAllMenus() {\r\n this.openMenuIndex = -1;\r\n this.openSubmenuElement = null;\r\n this.hoverSwitchEnabled = false;\r\n this.requestUpdate();\r\n }\r\n\r\n private openMenu(index: number, triggerElement: HTMLElement) {\r\n this.openMenuIndex = index;\r\n this.focusedItemIndex = 0;\r\n this.openSubmenuElement = null;\r\n this.requestUpdate();\r\n\r\n // Position the panel below the trigger\r\n this.updateComplete.then(() => {\r\n const panel = this.shadowRoot?.querySelector(\r\n `.menubar-panel[data-menu-index=\"${index}\"]`\r\n ) as HTMLElement;\r\n if (panel && triggerElement) {\r\n const rect = triggerElement.getBoundingClientRect();\r\n panel.style.top = `${rect.bottom + 4}px`;\r\n panel.style.left = `${rect.left}px`;\r\n }\r\n });\r\n }\r\n\r\n private handleTriggerClick(index: number, event: Event) {\r\n const target = event.currentTarget as HTMLElement;\r\n if (this.openMenuIndex === index) {\r\n this.closeAllMenus();\r\n } else {\r\n this.openMenu(index, target);\r\n this.hoverSwitchEnabled = true;\r\n }\r\n }\r\n\r\n private handleTriggerMouseEnter(index: number, event: Event) {\r\n if (this.openMenuIndex !== -1 && this.hoverSwitchEnabled) {\r\n const target = event.currentTarget as HTMLElement;\r\n this.openMenu(index, target);\r\n }\r\n }\r\n\r\n private handleTriggerKeyDown(event: KeyboardEvent) {\r\n const { key } = event;\r\n\r\n if (key === \"ArrowRight\") {\r\n event.preventDefault();\r\n this.focusedTriggerIndex = Math.min(\r\n this.menus.length - 1,\r\n this.focusedTriggerIndex + 1\r\n );\r\n this.focusTrigger(this.focusedTriggerIndex);\r\n } else if (key === \"ArrowLeft\") {\r\n event.preventDefault();\r\n this.focusedTriggerIndex = Math.max(0, this.focusedTriggerIndex - 1);\r\n this.focusTrigger(this.focusedTriggerIndex);\r\n } else if (key === \"Enter\" || key === \" \") {\r\n event.preventDefault();\r\n const trigger = this.shadowRoot?.querySelector(\r\n `.menubar-trigger[data-index=\"${this.focusedTriggerIndex}\"]`\r\n ) as HTMLElement;\r\n if (trigger) {\r\n this.openMenu(this.focusedTriggerIndex, trigger);\r\n this.updateComplete.then(() => {\r\n const focusTarget = this.shadowRoot?.querySelector<HTMLElement>(\r\n \"[autofocus], [role='menuitem']\"\r\n );\r\n if (focusTarget) {\r\n focusTarget.focus();\r\n } else {\r\n this.focusMenuItem(0);\r\n }\r\n });\r\n }\r\n } else if (key === \"ArrowDown\" && this.openMenuIndex !== -1) {\r\n event.preventDefault();\r\n this.focusMenuItem(0);\r\n }\r\n }\r\n\r\n private focusTrigger(index: number) {\r\n const trigger = this.shadowRoot?.querySelector(\r\n `.menubar-trigger[data-index=\"${index}\"]`\r\n ) as HTMLElement;\r\n trigger?.focus();\r\n }\r\n\r\n private handlePanelKeyDown(event: KeyboardEvent) {\r\n const { key } = event;\r\n const menuContent = this.menus[this.openMenuIndex]?.menu;\r\n if (!menuContent) return;\r\n\r\n const items = this.getFocusableItems(menuContent);\r\n\r\n if (key === \"ArrowDown\") {\r\n event.preventDefault();\r\n this.focusedItemIndex = Math.min(items.length - 1, this.focusedItemIndex + 1);\r\n this.requestUpdate();\r\n } else if (key === \"ArrowUp\") {\r\n event.preventDefault();\r\n this.focusedItemIndex = Math.max(0, this.focusedItemIndex - 1);\r\n this.requestUpdate();\r\n } else if (key === \"ArrowRight\") {\r\n event.preventDefault();\r\n const currentItem = items[this.focusedItemIndex];\r\n if (currentItem?.hasAttribute(\"data-submenu\")) {\r\n this.openSubmenu(currentItem as HTMLElement);\r\n }\r\n } else if (key === \"ArrowLeft\") {\r\n event.preventDefault();\r\n if (this.openSubmenuElement) {\r\n this.openSubmenuElement = null;\r\n this.requestUpdate();\r\n }\r\n } else if (key === \"Escape\") {\r\n event.preventDefault();\r\n this.closeAllMenus();\r\n this.focusTrigger(this.openMenuIndex);\r\n } else if (key === \"Enter\" || key === \" \") {\r\n event.preventDefault();\r\n const currentItem = items[this.focusedItemIndex];\r\n if (currentItem) {\r\n this.handleItemClick(currentItem as HTMLElement);\r\n }\r\n }\r\n }\r\n\r\n private getFocusableItems(menuContent: RelMenubarMenu): Element[] {\r\n return Array.from(menuContent.children).filter(\r\n (el) =>\r\n el.hasAttribute(\"data-item\") ||\r\n el.hasAttribute(\"data-checkbox\") ||\r\n el.hasAttribute(\"data-radio\") ||\r\n el.hasAttribute(\"data-submenu\")\r\n );\r\n }\r\n\r\n private focusMenuItem(index: number) {\r\n this.focusedItemIndex = index;\r\n const panel = this.shadowRoot?.querySelector(\r\n `.menubar-panel[data-menu-index=\"${this.openMenuIndex}\"]`\r\n ) as HTMLElement;\r\n panel?.focus();\r\n }\r\n\r\n private handleItemClick(item: HTMLElement) {\r\n if (item.hasAttribute(\"data-checkbox\")) {\r\n // Toggle is handled by rel-checkbox @rel-change; nothing to do here\r\n } else if (item.hasAttribute(\"data-radio\")) {\r\n const radioGroup = item.closest(\"[data-radio-group]\") as HTMLElement;\r\n const value = item.getAttribute(\"data-radio\") || item.getAttribute(\"value\") || \"\";\r\n const name = radioGroup?.getAttribute(\"name\") || \"\";\r\n\r\n // Update visual state\r\n const allRadios = radioGroup?.querySelectorAll(\"[data-radio]\");\r\n allRadios?.forEach((radio) => radio.removeAttribute(\"data-checked\"));\r\n item.setAttribute(\"data-checked\", \"true\");\r\n\r\n // Update internal value\r\n if (radioGroup) {\r\n radioGroup.setAttribute(\"value\", value);\r\n }\r\n\r\n this.dispatchChangeEvent(\"radio\", name, value);\r\n this.requestUpdate();\r\n } else if (item.hasAttribute(\"data-submenu\")) {\r\n this.openSubmenu(item);\r\n } else {\r\n // Regular item click\r\n this.closeAllMenus();\r\n }\r\n }\r\n\r\n private openSubmenu(submenuTrigger: HTMLElement, renderedTrigger?: HTMLElement) {\r\n this.openSubmenuElement = submenuTrigger;\r\n this.requestUpdate();\r\n\r\n this.updateComplete.then(() => {\r\n const submenuPanel = this.shadowRoot?.querySelector(\r\n `.submenu-panel[data-submenu-id=\"${submenuTrigger.getAttribute(\"data-submenu\") || \"\"}\"]`\r\n ) as HTMLElement;\r\n if (submenuPanel) {\r\n // Use the rendered shadow-DOM element for getBoundingClientRect() —\r\n // the light-DOM submenuTrigger is in a display:none slot and returns {0,0,0,0}.\r\n const positionTarget = renderedTrigger ?? submenuTrigger;\r\n const rect = positionTarget.getBoundingClientRect();\r\n submenuPanel.style.top = `${rect.top}px`;\r\n submenuPanel.style.left = `${rect.right + 4}px`;\r\n }\r\n });\r\n }\r\n\r\n private handleSubmenuItemClick(item: HTMLElement) {\r\n // Regular item - just close\r\n this.closeAllMenus();\r\n }\r\n\r\n private dispatchChangeEvent(type: \"checkbox\" | \"radio\", labelOrName: string, value: string | boolean) {\r\n const detail =\r\n type === \"checkbox\"\r\n ? { type, label: labelOrName, name: \"\", checked: value as boolean }\r\n : { type, label: \"\", name: labelOrName, value: value as string };\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-menubar-change\", {\r\n detail,\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n private renderMenuItem(item: Element, index: number): any {\r\n const isFocused = index === this.focusedItemIndex;\r\n\r\n if (item.hasAttribute(\"data-item\")) {\r\n const button = item as HTMLButtonElement;\r\n const disabled = button.disabled;\r\n const shortcut = button.getAttribute(\"data-shortcut\") || \"\";\r\n\r\n return html`\r\n <div\r\n class=\"menu-item ${isFocused ? \"focused\" : \"\"}\"\r\n data-disabled=\"${disabled}\"\r\n @click=\"${() => !disabled && this.handleItemClick(item as HTMLElement)}\"\r\n >\r\n <span>${button.textContent}</span>\r\n ${shortcut ? html`<span class=\"menu-shortcut\">${shortcut}</span>` : \"\"}\r\n </div>\r\n `;\r\n }\r\n\r\n if (item.hasAttribute(\"data-separator\")) {\r\n return html`<div class=\"menu-separator\"></div>`;\r\n }\r\n\r\n if (item.hasAttribute(\"data-checkbox\")) {\r\n const label = item as HTMLLabelElement;\r\n const checkbox = label.querySelector('input[type=\"checkbox\"]') as HTMLInputElement;\r\n\r\n return html`\r\n <label\r\n class=\"menu-checkbox ${isFocused ? \"focused\" : \"\"}\"\r\n @click=\"${(e: Event) => {\r\n e.preventDefault();\r\n this.handleItemClick(item as HTMLElement);\r\n }}\"\r\n >\r\n <rel-checkbox\r\n .checked=\"${checkbox?.checked || false}\"\r\n @click=\"${(e: Event) => e.stopPropagation()}\"\r\n @rel-change=\"${(e: CustomEvent) => {\r\n if (checkbox) checkbox.checked = e.detail.checked;\r\n this.dispatchChangeEvent(\"checkbox\", label.textContent?.replace(/\\s+/g, \" \").trim() || \"\", e.detail.checked);\r\n }}\"\r\n ></rel-checkbox>\r\n <span>${label.textContent?.replace(/\\s+/g, \" \").trim()}</span>\r\n </label>\r\n `;\r\n }\r\n\r\n if (item.hasAttribute(\"data-submenu\")) {\r\n const label = item.getAttribute(\"label\") || item.textContent?.trim() || \"\";\r\n const submenuId = item.getAttribute(\"data-submenu\") || label;\r\n\r\n return html`\r\n <div\r\n class=\"menu-item menu-submenu-trigger ${isFocused ? \"focused\" : \"\"}\"\r\n @click=\"${(e: Event) => this.openSubmenu(item as HTMLElement, e.currentTarget as HTMLElement)}\"\r\n @mouseenter=\"${(e: Event) => this.openSubmenu(item as HTMLElement, e.currentTarget as HTMLElement)}\"\r\n >\r\n <span>${label}</span>\r\n <rel-icon name=\"chevron-right\"></rel-icon>\r\n </div>\r\n ${this.renderSubmenu(item as HTMLElement, submenuId)}\r\n `;\r\n }\r\n\r\n if (item.hasAttribute(\"data-radio-group\")) {\r\n const radioButtons = Array.from(item.querySelectorAll(\"[data-radio]\"));\r\n const currentValue = item.getAttribute(\"value\") || \"\";\r\n\r\n return html`\r\n ${radioButtons.map((radio) => {\r\n const value = radio.getAttribute(\"data-radio\") || radio.getAttribute(\"value\") || \"\";\r\n const isChecked = value === currentValue || radio.hasAttribute(\"data-checked\");\r\n const text = radio.textContent?.trim() || \"\";\r\n\r\n return html`\r\n <div\r\n class=\"menu-radio-item ${isChecked ? \"checked\" : \"\"} ${isFocused ? \"focused\" : \"\"}\"\r\n @click=\"${() => this.handleItemClick(radio as HTMLElement)}\"\r\n >\r\n <span>${text}</span>\r\n </div>\r\n `;\r\n })}\r\n `;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private renderSubmenu(submenuElement: HTMLElement, submenuId: string) {\r\n const isOpen = this.openSubmenuElement === submenuElement;\r\n const submenuItems = Array.from(submenuElement.children);\r\n\r\n return html`\r\n <div class=\"submenu-panel ${isOpen ? \"open\" : \"\"}\" data-submenu-id=\"${submenuId}\">\r\n ${submenuItems.map((subItem) => {\r\n if (subItem.hasAttribute(\"data-item\")) {\r\n const button = subItem as HTMLButtonElement;\r\n return html`\r\n <div\r\n class=\"menu-item\"\r\n @click=\"${() => this.handleSubmenuItemClick(subItem as HTMLElement)}\"\r\n >\r\n <span>${button.textContent}</span>\r\n </div>\r\n `;\r\n }\r\n return null;\r\n })}\r\n </div>\r\n `;\r\n }\r\n\r\n private renderMenuPanel(menuState: MenuState, index: number) {\r\n const isOpen = index === this.openMenuIndex;\r\n const items = Array.from(menuState.menu.children);\r\n\r\n return html`\r\n <div\r\n class=\"menubar-panel ${isOpen ? \"open\" : \"\"}\"\r\n data-menu-index=\"${index}\"\r\n tabindex=\"-1\"\r\n @keydown=\"${this.handlePanelKeyDown}\"\r\n >\r\n ${items.map((item, idx) => this.renderMenuItem(item, idx))}\r\n </div>\r\n `;\r\n }\r\n\r\n render() {\r\n return html`\r\n <div class=\"menubar-container\">\r\n ${this.menus.map(\r\n (menuState, index) => html`\r\n <button\r\n class=\"menubar-trigger ${index === this.openMenuIndex ? \"active\" : \"\"}\"\r\n data-index=\"${index}\"\r\n @click=\"${(e: Event) => this.handleTriggerClick(index, e)}\"\r\n @mouseenter=\"${(e: Event) => this.handleTriggerMouseEnter(index, e)}\"\r\n @keydown=\"${this.handleTriggerKeyDown}\"\r\n >\r\n ${menuState.menu.label}\r\n </button>\r\n `\r\n )}\r\n </div>\r\n ${this.menus.map((menuState, index) => this.renderMenuPanel(menuState, index))}\r\n <slot style=\"display: none;\"></slot>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\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`<slot></slot>`;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\nimport { customElement, property, state, query } from \"lit/decorators.js\";\nimport { RelNavMenuItem } from \"./rel-nav-menu-item\";\n\ntype DensityType = \"comfortable\" | \"compact\";\n\n@customElement(\"rel-nav-menu\")\nexport class RelNavMenu extends LitElement {\n @property({ type: String, reflect: true }) open = \"\";\n @property({ type: Boolean, reflect: true }) disabled = false;\n @property({ type: String }) density: DensityType = \"comfortable\";\n\n @state() private items: RelNavMenuItem[] = [];\n @state() private focusedIndex = 0;\n @state() private hoverSwitchEnabled = false;\n\n @query(\".nav-container\") private container!: HTMLElement;\n\n static styles = css`\n :host {\n display: block;\n font-family: var(--rel-fontFamilies-primary);\n }\n\n .nav-container {\n display: flex;\n align-items: center;\n gap: var(--rel-spacing-space-3xs);\n padding: var(--rel-spacing-space-2xs);\n background: var(--rel-colors-gray-light);\n border-radius: var(--rel-borders-radius-border-radius-200);\n border: var(--rel-borders-width-stroke-100) solid var(--rel-colors-gray-border);\n }\n\n .nav-container.compact {\n padding: var(--rel-spacing-space-3xs);\n gap: 0;\n }\n\n :host([disabled]) .nav-container {\n opacity: 0.5;\n pointer-events: none;\n }\n `;\n\n // ── Lifecycle ──────────────────────────────────────────────────────────────\n\n connectedCallback() {\n super.connectedCallback();\n this.discoverItems();\n document.addEventListener(\"click\", this.handleOutsideClick);\n // Delegate item interactions via composed events — no shadow DOM mutation.\n this.addEventListener(\"rel-nav-item-click\", this.handleNavItemClick as EventListener);\n this.addEventListener(\"rel-nav-item-hover\", this.handleNavItemHover as EventListener);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n document.removeEventListener(\"click\", this.handleOutsideClick);\n this.removeEventListener(\"rel-nav-item-click\", this.handleNavItemClick as EventListener);\n this.removeEventListener(\"rel-nav-item-hover\", this.handleNavItemHover as EventListener);\n }\n\n // ── Item discovery ─────────────────────────────────────────────────────────\n\n private discoverItems() {\n const slot = this.shadowRoot?.querySelector(\"slot\");\n if (slot) {\n const nodes = slot.assignedElements() as RelNavMenuItem[];\n this.items = nodes.filter((el) => el.tagName === \"REL-NAV-MENU-ITEM\");\n }\n }\n\n private handleSlotChange() {\n this.discoverItems();\n }\n\n // ── Outside-click dismissal ────────────────────────────────────────────────\n\n private handleOutsideClick = (e: MouseEvent) => {\n const path = e.composedPath() as HTMLElement[];\n const isInside = path.some(\n (el) => el === this || el.tagName === \"REL-NAV-MENU-ITEM\"\n );\n if (!isInside && this.open) {\n this.closePanel();\n }\n };\n\n // ── Delegated item event handlers ──────────────────────────────────────────\n\n private handleNavItemClick = (e: Event) => {\n const { itemId, hasContent } = (e as CustomEvent).detail;\n const item = this.items.find((i) => i.itemId === itemId);\n if (!item || this.disabled || item.disabled) return;\n // Plain link with no panel content — let the browser navigate.\n if (item.href && !hasContent) return;\n e.preventDefault();\n if (hasContent) this.openPanel(itemId);\n };\n\n private handleNavItemHover = (e: Event) => {\n const { itemId } = (e as CustomEvent).detail;\n const item = this.items.find((i) => i.itemId === itemId);\n if (!item || this.disabled || item.disabled) return;\n if (this.open && this.hoverSwitchEnabled && item.hasContent) {\n this.openPanel(itemId);\n }\n };\n\n // ── Panel open/close ───────────────────────────────────────────────────────\n\n private openPanel(itemId: string) {\n if (this.disabled) return;\n\n // Close the currently open item before switching.\n if (this.open && this.open !== itemId) {\n const prev = this.items.find((i) => i.itemId === this.open);\n if (prev) prev.open = false;\n }\n\n const wasOpen = this.open === itemId;\n this.open = wasOpen ? \"\" : itemId;\n\n const item = this.items.find((i) => i.itemId === itemId);\n if (item) item.open = !wasOpen;\n\n if (!wasOpen) {\n this.hoverSwitchEnabled = true;\n }\n\n this.dispatchEvent(\n new CustomEvent(\"rel-nav-open-change\", {\n detail: { openId: this.open },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private closePanel() {\n if (this.open) {\n const openItem = this.items.find((i) => i.itemId === this.open);\n if (openItem) openItem.open = false;\n this.open = \"\";\n this.hoverSwitchEnabled = false;\n this.dispatchEvent(\n new CustomEvent(\"rel-nav-open-change\", {\n detail: { openId: \"\" },\n bubbles: true,\n composed: true,\n })\n );\n }\n }\n\n // ── Keyboard navigation ────────────────────────────────────────────────────\n\n private handleKeyDown(event: KeyboardEvent) {\n if (this.disabled) return;\n\n const { key } = event;\n const focusableItems = this.items.filter((item) => !item.disabled);\n\n if (key === \"ArrowRight\") {\n event.preventDefault();\n this.focusedIndex = Math.min(focusableItems.length - 1, this.focusedIndex + 1);\n this.focusItem(this.focusedIndex);\n } else if (key === \"ArrowLeft\") {\n event.preventDefault();\n this.focusedIndex = Math.max(0, this.focusedIndex - 1);\n this.focusItem(this.focusedIndex);\n } else if (key === \"Enter\" || key === \" \") {\n event.preventDefault();\n const item = focusableItems[this.focusedIndex];\n if (item && item.hasContent) {\n this.openPanel(item.itemId);\n }\n } else if (key === \"Escape\") {\n event.preventDefault();\n if (this.open) {\n // Capture before closePanel() clears this.open.\n const openItemId = this.open;\n this.closePanel();\n const openItem = this.items.find((i) => i.itemId === openItemId);\n if (openItem) {\n const trigger = openItem.shadowRoot?.querySelector(\".trigger\") as HTMLElement;\n trigger?.focus();\n }\n }\n } else if (key === \"ArrowDown\" && this.open) {\n event.preventDefault();\n // Move focus into the open panel (now inside the item's shadow root).\n const openItem = this.items.find((i) => i.itemId === this.open);\n if (openItem) {\n const panel = openItem.shadowRoot?.querySelector(\".panel\") as HTMLElement;\n if (panel) {\n const firstFocusable = panel.querySelector(\"a, button\") as HTMLElement;\n firstFocusable?.focus();\n }\n }\n }\n }\n\n private focusItem(index: number) {\n const focusableItems = this.items.filter((item) => !item.disabled);\n const item = focusableItems[index];\n if (item) {\n const trigger = item.shadowRoot?.querySelector(\".trigger\") as HTMLElement;\n trigger?.focus();\n }\n }\n\n // ── Render ─────────────────────────────────────────────────────────────────\n\n render() {\n return html`\n <nav\n class=\"nav-container ${this.density === \"compact\" ? \"compact\" : \"\"}\"\n role=\"navigation\"\n @keydown=\"${this.handleKeyDown}\"\n >\n <slot @slotchange=\"${this.handleSlotChange}\"></slot>\n </nav>\n `;\n }\n}\n","import { LitElement, html, css } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\n\n@customElement(\"rel-nav-menu-item\")\nexport class RelNavMenuItem extends LitElement {\n @property({ type: String }) label = \"\";\n @property({ type: String }) href = \"\";\n @property({ type: String, attribute: \"item-id\" }) itemId = \"\";\n @property({ type: Boolean, reflect: true }) disabled = false;\n @property({ type: String }) icon = \"\";\n\n /** Promoted from @state so rel-nav-menu can read it as a property. */\n @property({ type: Boolean, reflect: true }) hasContent = false;\n\n /** Set by rel-nav-menu to open/close this item's panel. */\n @property({ type: Boolean, reflect: true }) open = false;\n\n static styles = css`\n :host {\n display: inline-block;\n }\n\n .trigger {\n display: inline-flex;\n align-items: center;\n gap: var(--rel-spacing-space-2xs);\n padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-md);\n font-family: var(--rel-fontFamilies-primary);\n font-size: var(--rel-fontSizes-sm);\n font-weight: var(--rel-fontWeights-medium);\n color: var(--rel-colors-gray-heading);\n background: transparent;\n border: none;\n border-radius: var(--rel-borders-radius-border-radius-200);\n cursor: pointer;\n transition: all 0.15s ease;\n text-decoration: none;\n outline: none;\n user-select: none;\n }\n\n .trigger:hover:not(:disabled) {\n background: var(--rel-surface-secondary, #fafafa);\n }\n\n .trigger:focus-visible {\n outline: 2px solid var(--rel-colors-blue-primary);\n outline-offset: 2px;\n }\n\n /* Active state driven by :host([open]) — no external class manipulation needed */\n :host([open]) .trigger,\n .trigger.active {\n background: var(--rel-surface-secondary, #fafafa);\n }\n\n .trigger:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n :host([disabled]) .trigger {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n /* Panel lives inside the item's own shadow DOM */\n .panel {\n position: fixed;\n min-width: 320px;\n max-width: 600px;\n background: var(--rel-colors-white);\n border: var(--rel-borders-width-stroke-100) solid var(--rel-colors-gray-border);\n border-radius: var(--rel-borders-radius-border-radius-200);\n box-shadow: var(--rel-shadows-shadow-300);\n padding: var(--rel-spacing-space-xs);\n z-index: 1000;\n display: none;\n }\n\n .panel.open {\n display: block;\n }\n `;\n\n connectedCallback() {\n super.connectedCallback();\n if (!this.itemId && this.label) {\n this.itemId = this.label.toLowerCase().replace(/\\s+/g, \"-\");\n }\n }\n\n firstUpdated() {\n this.updateHasContent();\n }\n\n updated(changed: Map<string, any>) {\n if (changed.has(\"open\") && this.open) {\n // Wait for paint so the panel has layout dimensions before positioning.\n this.updateComplete.then(() => this.positionPanel());\n }\n }\n\n // ── Content detection ──────────────────────────────────────────────────────\n\n private updateHasContent() {\n const slot = this.shadowRoot?.querySelector(\"slot\");\n if (slot) {\n const nodes = slot.assignedNodes({ flatten: true });\n this.hasContent = nodes.some(\n (node) => node.nodeType === Node.ELEMENT_NODE || node.textContent?.trim()\n );\n }\n }\n\n private handleSlotChange() {\n this.updateHasContent();\n }\n\n // ── Panel positioning (moved from rel-nav-menu) ────────────────────────────\n\n private positionPanel() {\n const trigger = this.shadowRoot?.querySelector(\".trigger\") as HTMLElement;\n const panel = this.shadowRoot?.querySelector(\".panel\") as HTMLElement;\n if (!trigger || !panel) return;\n\n const triggerRect = trigger.getBoundingClientRect();\n const panelRect = panel.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n let top = triggerRect.bottom + 8;\n let left = triggerRect.left;\n\n // Handle right overflow\n if (left + panelRect.width > viewportWidth) {\n left = viewportWidth - panelRect.width - 16;\n }\n\n // Handle left overflow\n if (left < 0) left = 16;\n\n // Handle bottom overflow — flip above if more space\n if (top + panelRect.height > viewportHeight) {\n const spaceAbove = triggerRect.top;\n const spaceBelow = viewportHeight - triggerRect.bottom;\n if (spaceAbove > spaceBelow && spaceAbove > panelRect.height) {\n top = triggerRect.top - panelRect.height - 8;\n }\n }\n\n panel.style.top = `${top}px`;\n panel.style.left = `${left}px`;\n }\n\n // ── Events dispatched upward — rel-nav-menu listens via connectedCallback ──\n\n private handleTriggerClick() {\n if (this.disabled) return;\n this.dispatchEvent(\n new CustomEvent(\"rel-nav-item-click\", {\n detail: { itemId: this.itemId, hasContent: this.hasContent },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private handleTriggerMouseEnter() {\n if (this.disabled) return;\n this.dispatchEvent(\n new CustomEvent(\"rel-nav-item-hover\", {\n detail: { itemId: this.itemId },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n // ── ID helpers ─────────────────────────────────────────────────────────────\n\n get triggerId() {\n return `nav-trigger-${this.itemId}`;\n }\n\n get panelId() {\n return `nav-panel-${this.itemId}`;\n }\n\n // ── Render ─────────────────────────────────────────────────────────────────\n\n render() {\n const isLink = !!this.href && !this.hasContent;\n\n return html`\n ${isLink\n ? html`\n <a\n class=\"trigger\"\n href=\"${this.href}\"\n id=\"${this.triggerId}\"\n ?disabled=\"${this.disabled}\"\n @click=\"${this.handleTriggerClick}\"\n @mouseenter=\"${this.handleTriggerMouseEnter}\"\n >\n ${this.label}\n </a>\n `\n : html`\n <button\n class=\"trigger\"\n id=\"${this.triggerId}\"\n type=\"button\"\n ?disabled=\"${this.disabled}\"\n aria-haspopup=\"${this.hasContent ? \"menu\" : \"false\"}\"\n aria-controls=\"${this.hasContent ? this.panelId : \"\"}\"\n aria-expanded=\"${this.open ? \"true\" : \"false\"}\"\n @click=\"${this.handleTriggerClick}\"\n @mouseenter=\"${this.handleTriggerMouseEnter}\"\n >\n ${this.label}\n </button>\n `}\n\n <!--\n Panel rendered inside this shadow root.\n Slot projects the consumer's light-DOM children directly — no cloning.\n rel-nav-menu sets item.open = true/false to show/hide.\n -->\n <div\n class=\"panel ${this.open ? \"open\" : \"\"}\"\n id=\"${this.panelId}\"\n role=\"menu\"\n @click=\"${(e: Event) => e.stopPropagation()}\"\n >\n <slot @slotchange=\"${this.handleSlotChange}\"></slot>\n </div>\n `;\n }\n}\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement } from \"lit/decorators.js\";\r\n\r\n@customElement(\"rel-nav-menu-panel\")\r\nexport class RelNavMenuPanel extends LitElement {\r\n static styles = css`\r\n :host {\r\n display: block;\r\n width: 100%;\r\n }\r\n\r\n .panel-content {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--rel-spacing-space-2xs);\r\n padding: var(--rel-spacing-space-xs);\r\n }\r\n\r\n ::slotted(a[data-nav-item]) {\r\n display: block;\r\n padding: var(--rel-spacing-space-sm);\r\n border-radius: var(--rel-borders-radius-border-radius-100);\r\n transition: background 0.15s ease;\r\n text-decoration: none;\r\n color: inherit;\r\n }\r\n\r\n ::slotted(a[data-nav-item]:hover) {\r\n background: var(--rel-surface-secondary, #fafafa);\r\n }\r\n\r\n ::slotted([data-title]) {\r\n font-size: var(--rel-fontSizes-sm);\r\n font-weight: var(--rel-fontWeights-semibold);\r\n color: var(--rel-colors-gray-heading);\r\n margin-bottom: var(--rel-spacing-space-3xs);\r\n }\r\n\r\n ::slotted([data-desc]) {\r\n font-size: var(--rel-fontSizes-xs);\r\n color: var(--rel-colors-gray-placeholder);\r\n line-height: var(--rel-lineHeights-xs);\r\n }\r\n `;\r\n\r\n render() {\r\n return html`\r\n <div class=\"panel-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 } 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 } from \"lit/decorators.js\";\r\nimport \"./rel-topbar-brand\";\r\nimport \"./rel-topbar-actions\";\r\nimport \"./rel-topbar-utilities\";\r\nimport \"./rel-topbar-mobile-panel\";\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 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-colors-white, #fff);\r\n --rel-topbar-border-color: var(--rel-border-default, #ddd);\r\n --rel-topbar-item-color: var(--rel-text-primary, #333);\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-surface-secondary, #fafafa);\r\n --rel-topbar-divider-color: var(--rel-border-divider, #bdbdbd);\r\n --rel-topbar-carrier-action-bg: var(--rel-colors-gray-primary, #333);\r\n --rel-topbar-carrier-action-color: var(--rel-colors-white, #fff);\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;\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 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 /* ─── 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 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\"></slot>\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 ? _iconClose() : _iconMenu()}\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 </div>\r\n `;\r\n }\r\n}\r\n\r\n/* ─── Inline SVG helpers ──────────────────────────────────────────────── */\r\n\r\nfunction _iconMenu() {\r\n return html`\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" aria-hidden=\"true\" focusable=\"false\">\r\n <rect x=\"2\" y=\"5\" width=\"16\" height=\"1.5\" rx=\"0.75\" fill=\"currentColor\"/>\r\n <rect x=\"2\" y=\"9.25\" width=\"16\" height=\"1.5\" rx=\"0.75\" fill=\"currentColor\"/>\r\n <rect x=\"2\" y=\"13.5\" width=\"16\" height=\"1.5\" rx=\"0.75\" fill=\"currentColor\"/>\r\n </svg>\r\n `;\r\n}\r\n\r\nfunction _iconClose() {\r\n return html`\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" aria-hidden=\"true\" focusable=\"false\">\r\n <path d=\"M5 5L15 15M15 5L5 15\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\r\n </svg>\r\n `;\r\n}\r\n","import { LitElement, html, css } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\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\";\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\";\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\";\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\";\r\nimport { customElement, property, state } from \"lit/decorators.js\";\r\nimport \"./rel-topbar-dropdown\";\r\nimport \"./rel-topbar-dropdown-item\";\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 /* ─── 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]) .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-colors-white, #fff);\r\n border: var(--rel-borders-width-stroke-100, 1px) solid var(--rel-border-default, #ddd);\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\">${_iconChevron()}</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\nfunction _iconChevron() {\r\n return html`\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\" focusable=\"false\">\r\n <path d=\"M3 5L7 9L11 5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n `;\r\n}\r\n","import { LitElement, html, css } from \"lit\";\nimport { customElement } from \"lit/decorators.js\";\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: 1px solid var(--rel-color-border-default);\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\";\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\n static styles = css`\n .dropdown-item {\n display: block;\n padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-md);\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 }\n `;\n\n render() {\n return html`<a href=\"${this.href}\" class=\"dropdown-item\">${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 } from \"lit/decorators.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-colors-gray-primary, #333);\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-surface-secondary, #fafafa);\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 /* ─── Avatar circle ─────────────────────────────────────────────── */\r\n .avatar {\r\n width: var(--_avatar-size);\r\n height: var(--_avatar-size);\r\n border-radius: var(--_profile-radius);\r\n background: var(--_avatar-bg);\r\n color: var(--_avatar-color);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n font-size: var(--rel-fontSizes-sm, 12px);\r\n font-weight: var(--rel-fontWeights-semibold, 600);\r\n flex-shrink: 0;\r\n user-select: none;\r\n }\r\n\r\n :host([compact]) .avatar {\r\n width: var(--_avatar-size-sm);\r\n height: var(--_avatar-size-sm);\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-text-primary, #333);\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-text-placeholder, #a9a9a9);\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\"]) .avatar {\r\n background: var(--rel-topbar-reward-gold-bg);\r\n color: var(--rel-topbar-reward-gold);\r\n border: 1.5px solid var(--rel-topbar-reward-gold);\r\n }\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\"]) .avatar {\r\n background: var(--rel-topbar-reward-silver-bg);\r\n color: var(--rel-colors-gray-primary, #333);\r\n border: 1.5px solid var(--rel-topbar-reward-silver);\r\n }\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\"]) .avatar {\r\n background: var(--rel-topbar-reward-platinum-bg);\r\n color: var(--rel-topbar-reward-platinum);\r\n border: 1.5px solid var(--rel-topbar-reward-platinum);\r\n }\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\"]) .avatar {\r\n background: var(--rel-topbar-reward-bronze-bg);\r\n color: var(--rel-topbar-reward-bronze);\r\n border: 1.5px solid var(--rel-topbar-reward-bronze);\r\n }\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\"]) .avatar,\r\n :host(:not([reward])) .avatar {\r\n background: var(--rel-topbar-reward-regular-bg);\r\n color: var(--rel-colors-gray-primary, #333);\r\n border: 1.5px solid var(--rel-topbar-reward-regular);\r\n }\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-border-default, #ddd);\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 <div class=\"avatar\" aria-hidden=\"true\">\r\n ${this.initials ?? \"\"}\r\n </div>\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 _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 <div class=\"avatar\">${this.initials ?? \"\"}</div>\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 @state() private focusedIndex: number = -1;\r\n\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 pointer-events: none;\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, 8px);\r\n position: relative;\r\n }\r\n\r\n .otp-group {\r\n display: flex;\r\n gap: var(--rel-spacing-space-2xs, 8px);\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-colors-gray-divider);\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, 4px);\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-border-default);\r\n border-radius: var(--rel-borders-radius-border-radius-200);\r\n background: var(--rel-colors-white);\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-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-colors-gray-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-colors-gray-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-colors-gray-primary);\r\n }\r\n\r\n .otp-cell:focus-visible {\r\n border-color: var(--rel-colors-gray-heading);\r\n box-shadow: 0 0 0 2px var(--rel-border-default);\r\n }\r\n\r\n .otp-cell:disabled {\r\n background: var(--rel-colors-gray-light);\r\n color: var(--rel-colors-gray-disabled-text);\r\n cursor: not-allowed;\r\n }\r\n\r\n .otp-cell:read-only {\r\n background: var(--rel-colors-gray-surface);\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 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 const index = parseInt(input.dataset.index || \"0\", 10);\r\n\r\n this.focusedIndex = index;\r\n\r\n // Select all text on focus for easy replacement\r\n input.select();\r\n }\r\n\r\n private handleBlur() {\r\n this.focusedIndex = -1;\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=\"${index === 0 ? this.autocomplete : \"off\"}\"\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\n\r\ntype DensityType = \"comfortable\" | \"compact\";\r\ntype VariantType = \"default\" | \"icons\";\r\ntype PageItem = { type: \"page\"; value: number } | { type: \"ellipsis\" } | { type: \"prev\" } | { 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 }\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 min-width: 40px;\r\n height: 40px;\r\n padding: 0 var(--rel-spacing-space-sm);\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-colors-gray-heading);\r\n background: var(--rel-colors-white);\r\n border: var(--rel-borders-width-stroke-100) solid var(--rel-colors-gray-border);\r\n border-radius: var(--rel-borders-radius-border-radius-200);\r\n cursor: pointer;\r\n transition: all 0.15s ease;\r\n text-decoration: none;\r\n outline: none;\r\n user-select: none;\r\n }\r\n\r\n nav.compact button,\r\n nav.compact a {\r\n min-width: 32px;\r\n height: 32px;\r\n padding: 0 var(--rel-spacing-space-xs);\r\n font-size: var(--rel-fontSizes-xs);\r\n }\r\n\r\n button:hover:not(:disabled),\r\n a:hover:not([aria-disabled=\"true\"]) {\r\n background: var(--rel-surface-secondary, #fafafa);\r\n border-color: var(--rel-colors-gray-primary, #333);\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 pointer-events: none;\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-colors-gray-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-colors-gray-primary);\r\n border-color: var(--rel-colors-gray-primary);\r\n }\r\n\r\n .ellipsis {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n min-width: 40px;\r\n height: 40px;\r\n color: var(--rel-colors-gray-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 min-width: 32px;\r\n height: 32px;\r\n font-size: var(--rel-fontSizes-xs);\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]) 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 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 const sibling = this.siblingCount;\r\n const boundary = this.boundaryCount;\r\n\r\n items.push({ type: \"prev\" });\r\n\r\n // Calculate page ranges\r\n const leftBoundary = Array.from({ length: Math.min(boundary, total) }, (_, i) => i + 1);\r\n const rightBoundary = Array.from(\r\n { length: Math.min(boundary, total) },\r\n (_, i) => total - boundary + i + 1\r\n ).filter((p) => p > 0);\r\n\r\n const leftSiblings = Array.from(\r\n { length: sibling },\r\n (_, i) => current - sibling + i\r\n ).filter((p) => p > boundary && p < current);\r\n\r\n const rightSiblings = Array.from(\r\n { length: sibling },\r\n (_, i) => current + i + 1\r\n ).filter((p) => p > current && p <= total - boundary);\r\n\r\n // Combine all visible pages\r\n const visiblePages = new Set([\r\n ...leftBoundary,\r\n ...leftSiblings,\r\n current,\r\n ...rightSiblings,\r\n ...rightBoundary,\r\n ]);\r\n\r\n const sortedPages = Array.from(visiblePages).sort((a, b) => a - b);\r\n\r\n // Build items with ellipsis\r\n sortedPages.forEach((page, index) => {\r\n if (index > 0) {\r\n const prevPage = sortedPages[index - 1];\r\n if (page - prevPage > 1) {\r\n items.push({ type: \"ellipsis\" });\r\n }\r\n }\r\n items.push({ type: \"page\", value: page });\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 === \"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 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 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 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 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\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 pointer-events: none;\r\n opacity: 0.6;\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.triggerEl?.focus();\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 = t.bottom + this.sideOffset;\r\n let left = t.left + t.width / 2 - c.width / 2;\r\n\r\n if (this.side === \"top\") top = t.top - c.height - this.sideOffset;\r\n if (this.side === \"left\") left = t.left - c.width - this.sideOffset;\r\n if (this.side === \"right\") left = t.right + this.sideOffset;\r\n\r\n top = Math.max(8, Math.min(top, window.innerHeight - c.height - 8));\r\n left = Math.max(8, Math.min(left, window.innerWidth - c.width - 8));\r\n\r\n this.contentStyle = `top:${top}px;left:${left}px;`;\r\n };\r\n\r\n /* =======================\r\n * ARIA\r\n * ======================= */\r\n\r\n private onTriggerSlotChange(e: Event) {\r\n const slot = e.target as HTMLSlotElement;\r\n const first = slot.assignedElements({ flatten: true })[0] as HTMLElement | undefined;\r\n this.triggerEl = first ?? null;\r\n this.applyTriggerAria();\r\n }\r\n\r\n private applyTriggerAria() {\r\n if (!this.triggerEl) return;\r\n this.triggerEl.setAttribute(\"aria-haspopup\", \"dialog\");\r\n this.triggerEl.setAttribute(\"aria-expanded\", String(this.activeOpen));\r\n this.triggerEl.setAttribute(\"aria-controls\", this.uniqueId);\r\n }\r\n\r\n /* =======================\r\n * RENDER\r\n * ======================= */\r\n\r\n render() {\r\n return html`\r\n <slot @slotchange=${this.onTriggerSlotChange}></slot>\r\n\r\n <div\r\n id=\"${this.uniqueId}\"\r\n class=\"content-wrapper\"\r\n style=\"${this.contentStyle}\"\r\n ?open=\"${this.activeOpen}\"\r\n >\r\n <slot name=\"content\"></slot>\r\n </div>\r\n `;\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"rel-popover\": RelPopover;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\r\n@customElement(\"rel-popover-content\")\r\nexport class RelPopoverContent extends LitElement {\r\n @property({ type: String, attribute: \"aria-label\" }) ariaLabel = \"\";\r\n\r\n 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-colors-white);\r\n border: var(--rel-borders-width-stroke-100) solid var(--rel-colors-gray-border);\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-colors-gray-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-colors-gray-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-colors-gray-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\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, sans-serif);\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-colors-gray-border, #ddd);\r\n border-radius: var(--rel-borders-radius-border-radius-200, 8px);\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-colors-black);\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-colors-gray-border);\r\n stroke-width: 3;\r\n }\r\n\r\n .circular-progress {\r\n fill: none;\r\n stroke: var(--rel-colors-black);\r\n stroke-width: 3;\r\n stroke-linecap: round;\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-colors-black);\r\n stroke-linecap: round;\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\n\r\nexport interface RadioOption {\r\n value: string;\r\n label: string;\r\n supportingText?: string;\r\n disabled?: boolean;\r\n error?: boolean;\r\n}\r\n\r\n@customElement(\"rel-radio\")\r\nexport class RelRadio extends LitElement {\r\n @property({ type: Array }) options: RadioOption[] = [];\r\n\r\n @property({ type: String }) name = \"radio-group\";\r\n\r\n @property({ type: String, reflect: true })\r\n selectedValue: string | null = null;\r\n\r\n @property({ type: Boolean })\r\n disabled = false;\r\n\r\n @property({ type: String }) value = \"\";\r\n\r\n checked = false;\r\n\r\n private _onChange: (value: string) => 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 .rel-radio-group {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--rel-spacing-space-xs);\r\n }\r\n\r\n .rel-radio-option {\r\n display: flex;\r\n flex-direction: column;\r\n gap: var(--rel-spacing-space-3xs);\r\n cursor: pointer;\r\n }\r\n\r\n .rel-radio-option.disabled {\r\n opacity: 0.6;\r\n cursor: not-allowed !important;\r\n }\r\n\r\n .radio-main {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-space-2xs);\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 .radio-custom {\r\n width: 20px;\r\n height: 20px;\r\n border: 2px solid var(--rel-text-heading, #2b2b2b);\r\n border-radius: 50%;\r\n position: relative;\r\n flex-shrink: 0;\r\n }\r\n\r\n input:focus-visible + .radio-custom {\r\n outline: 2px solid var(--rel-border-info, #0091ea);\r\n outline-offset: 2px;\r\n }\r\n\r\n input:checked + .radio-custom::after {\r\n content: \"\";\r\n position: absolute;\r\n inset: 4px;\r\n background: var(--rel-text-heading, #2b2b2b);\r\n border-radius: 50%;\r\n }\r\n\r\n .radio-label {\r\n font-size: var(--rel-fontSizes-sm, 12px);\r\n font-weight: var(--rel-fontWeights-medium, 500);\r\n color: var(--rel-text-primary, #333);\r\n }\r\n\r\n .radio-supporting {\r\n font-size: var(--rel-fontSizes-xs, 10px);\r\n margin-left: 28px;\r\n color: var(--rel-text-placeholder, #a9a9a9);\r\n }\r\n\r\n .error .radio-custom {\r\n border-color: var(--rel-colors-red-secondary);\r\n }\r\n\r\n .error input:checked + .radio-custom::after {\r\n background: var(--rel-colors-red-secondary);\r\n }\r\n `;\r\n\r\n private onChange(value: string) {\r\n if (this.disabled) return;\r\n\r\n this.selectedValue = value;\r\n this.dispatchEvent(\r\n new CustomEvent(\"rel-change\", {\r\n detail: {\r\n checked: this.selectedValue === value,\r\n value,\r\n },\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: string) => void): void { this._onChange = fn; }\r\n registerOnTouched(fn: () => void): void { this._onTouched = fn; }\r\n writeValue(value: string): void { this.checked = value === this.value; }\r\n\r\n private renderOption(option: RadioOption) {\r\n const isChecked = this.selectedValue === option.value;\r\n const isDisabled = this.disabled || option.disabled;\r\n\r\n const classes = [\r\n \"rel-radio-option\",\r\n isDisabled ? \"disabled\" : \"\",\r\n option.error ? \"error\" : \"\",\r\n ]\r\n .filter(Boolean)\r\n .join(\" \");\r\n\r\n return html`\r\n <label class=\"${classes}\">\r\n <div class=\"radio-main\">\r\n <input\r\n type=\"radio\"\r\n name=\"${this.name}\"\r\n .checked=\"${isChecked}\"\r\n ?disabled=\"${isDisabled}\"\r\n @change=\"${() => this.onChange(option.value)}\"\r\n @blur=\"${() => this._onTouched()}\"\r\n />\r\n <span class=\"radio-custom\"></span>\r\n <span class=\"radio-label\">${option.label}</span>\r\n </div>\r\n\r\n ${option.supportingText\r\n ? html`<div class=\"radio-supporting\">${option.supportingText}</div>`\r\n : \"\"}\r\n </label>\r\n `;\r\n }\r\n\r\n render() {\r\n return html`\r\n <div class=\"rel-radio-group\">\r\n ${this.options.map((o) => this.renderOption(o))}\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 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\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-colors-gray-border);\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-colors-blue-primary);\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-colors-gray-placeholder);\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-colors-white);\r\n }\r\n\r\n :host([data-dragging]) {\r\n background: var(--rel-colors-blue-primary);\r\n }\r\n\r\n :host([data-dragging]) .grabber {\r\n background: var(--rel-colors-white);\r\n }\r\n\r\n @media (prefers-reduced-motion: reduce) {\r\n :host {\r\n transition: none;\r\n }\r\n\r\n .grabber {\r\n transition: none;\r\n }\r\n }\r\n `;\r\n\r\n /* =======================\r\n * LIFECYCLE\r\n * ======================= */\r\n\r\n connectedCallback() {\r\n super.connectedCallback();\r\n this.setAttribute(\"tabindex\", \"0\");\r\n this.setAttribute(\"role\", \"separator\");\r\n this.updateAriaOrientation();\r\n }\r\n\r\n updated(changed: Map<string, unknown>) {\r\n if (changed.has(\"orientation\")) {\r\n this.updateAriaOrientation();\r\n }\r\n }\r\n\r\n /* =======================\r\n * ARIA\r\n * ======================= */\r\n\r\n private updateAriaOrientation() {\r\n this.setAttribute(\"aria-orientation\", this.orientation);\r\n }\r\n\r\n public updateAriaValue(value: number) {\r\n this.splitValue = value;\r\n this.setAttribute(\"aria-valuenow\", String(Math.round(value)));\r\n this.setAttribute(\"aria-valuemin\", \"0\");\r\n this.setAttribute(\"aria-valuemax\", \"100\");\r\n }\r\n\r\n /* =======================\r\n * RENDER\r\n * ======================= */\r\n\r\n render() {\r\n return html`<div class=\"grabber\"></div>`;\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n \"rel-resizable-handle\": RelResizableHandle;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\r\nexport type SegmentSize = \"small\" | \"medium\";\r\nexport type SegmentAlign = \"left\" | \"middle\" | \"right\";\r\n\r\nexport interface SegmentOption {\r\n label: string;\r\n value: string;\r\n disabled?: boolean;\r\n}\r\n\r\n@customElement(\"rel-segmented-button\")\r\nexport class RelSegmentedButton extends LitElement {\r\n @property({ type: Array }) options: SegmentOption[] = [];\r\n\r\n @property({ type: String }) active: string = \"\";\r\n\r\n @property({ type: String }) size: SegmentSize = \"medium\";\r\n\r\n @property({ type: String }) align: SegmentAlign = \"left\";\r\n\r\n static styles = css`\r\n :host {\r\n 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: 2px solid var(--rel-colors-gray-border);\r\n border-radius: var(--rel-borders-radius-border-radius-300);\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-colors-white, #fff);\r\n border: none;\r\n cursor: pointer;\r\n font-weight: var(--rel-fontWeights-medium, 500);\r\n border-right: 2px solid var(--rel-colors-gray-border, #ddd);\r\n transition: all 0.2s ease-in-out;\r\n color: var(--rel-text-heading, #2b2b2b);\r\n font-family: var(--rel-fontFamilies-primary, sans-serif);\r\n }\r\n\r\n .segment:focus-visible {\r\n outline: 2px solid var(--rel-border-info, #0091ea);\r\n outline-offset: -2px;\r\n z-index: 1;\r\n }\r\n\r\n .segment:last-child {\r\n border-right: none;\r\n }\r\n\r\n /* Hover */\r\n .segment:hover:not(.disabled):not(.active) {\r\n background: var(--rel-surface-surface, #f5f5f5);\r\n }\r\n\r\n /* Active */\r\n .segment.active {\r\n background: var(--rel-text-heading, #2b2b2b);\r\n color: var(--rel-colors-white, #fff);\r\n }\r\n\r\n .segment.active:hover:not(.disabled) {\r\n background: var(--rel-text-heading, #2b2b2b);\r\n color: var(--rel-colors-white, #fff);\r\n }\r\n\r\n /* Disabled */\r\n .segment.disabled,\r\n .segment:disabled {\r\n cursor: not-allowed;\r\n opacity: 0.5;\r\n background: var(--rel-surface-surface, #f5f5f5);\r\n color: var(--rel-text-disabled, #9e9e9e);\r\n pointer-events: none;\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\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, sans-serif);\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-colors-gray-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-colors-gray-primary);\r\n }\r\n\r\n .icon.left {\r\n left: 12px;\r\n }\r\n\r\n .icon.right {\r\n right: 36px;\r\n }\r\n\r\n select {\r\n flex: 1;\r\n appearance: none;\r\n border: 1px solid var(--rel-colors-gray-border, #ddd);\r\n background-color: var(--rel-colors-white, #fff);\r\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='currentColor' d='M6 9L1 4h10z'/%3E%3C/svg%3E\");\r\n background-repeat: no-repeat;\r\n background-position: right 12px center;\r\n font-family: var(--rel-fontFamilies-primary, sans-serif);\r\n cursor: pointer;\r\n transition: all 0.2s ease-in-out;\r\n color: var(--rel-text-heading, #2b2b2b);\r\n width: 100%;\r\n outline: none;\r\n }\r\n\r\n select:hover:not(:disabled) {\r\n border-color: var(--rel-colors-gray-primary, #333);\r\n }\r\n\r\n select:focus-visible:not(:disabled) {\r\n border-color: var(--rel-colors-primary-500, #0091ea);\r\n box-shadow: 0 0 0 2px var(--rel-colors-primary-500, #0091ea);\r\n }\r\n\r\n /* States */\r\n select.error {\r\n border-color: var(--rel-colors-red-secondary);\r\n }\r\n\r\n select.error:focus {\r\n box-shadow: 0 0 0 3px var(--rel-background-error-light);\r\n }\r\n\r\n select:disabled {\r\n background-color: var(--rel-surface-surface, #f5f5f5);\r\n border-color: var(--rel-colors-gray-border, #ddd);\r\n color: var(--rel-text-disabled, #9e9e9e);\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) var(--rel-spacing-space-lg)\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) var(--rel-spacing-space-xl)\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) var(--rel-spacing-space-2xl)\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-300);\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-colors-gray-placeholder);\r\n }\r\n\r\n .error-text {\r\n color: var(--rel-colors-red-secondary);\r\n }\r\n\r\n /* Dark mode — flip select background, text, border, and chevron icon to white */\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 background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23ffffff' d='M6 9L1 4h10z'/%3E%3C/svg%3E\");\r\n }\r\n\r\n :host-context([data-theme=\"dark\"]) .select-label,\r\n :host-context(.dark) .select-label {\r\n color: var(--rel-color-text-primary);\r\n }\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`<span class=\"icon left\">${this.leftIcon}</span>`\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 </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\";\r\nimport { customElement, property, state, query } from \"lit/decorators.js\";\r\n\r\nexport type SheetSide = \"top\" | \"right\" | \"bottom\" | \"left\";\r\nexport type SheetSize = \"sm\" | \"md\" | \"lg\" | \"xl\";\r\nexport type SheetCloseReason = \"trigger\" | \"close\" | \"overlay\" | \"escape\" | \"api\";\r\n\r\n// ============================================================================\r\n// rel-sheet (Controller/Root Component)\r\n// ============================================================================\r\n@customElement(\"rel-sheet\")\r\nexport class RelSheet extends LitElement {\r\n @property({ type: Boolean, reflect: true }) open?: boolean;\r\n @property({ type: Boolean, attribute: \"defaultopen\" }) defaultOpen = false;\r\n @property({ type: Boolean }) disabled = false;\r\n @property({ type: Boolean }) modal = true;\r\n\r\n @state() private internalOpen = false;\r\n\r\n static styles = css`\r\n :host {\r\n display: contents;\r\n }\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\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\r\n private isControlled() {\r\n return this.open !== undefined;\r\n }\r\n\r\n get activeOpen() {\r\n return this.isControlled() ? !!this.open : this.internalOpen;\r\n }\r\n\r\n setOpen(next: boolean, reason: SheetCloseReason = \"api\") {\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, reason },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n }\r\n\r\n render() {\r\n return html`<slot></slot>`;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// rel-sheet-trigger (Opens Sheet)\r\n// ============================================================================\r\n@customElement(\"rel-sheet-trigger\")\r\nexport class RelSheetTrigger extends LitElement {\r\n static styles = css`\r\n :host {\r\n display: inline-block;\r\n }\r\n\r\n button {\r\n background: none;\r\n border: none;\r\n padding: 0;\r\n margin: 0;\r\n font: inherit;\r\n cursor: pointer;\r\n display: contents;\r\n }\r\n `;\r\n\r\n private getSheet(): RelSheet | null {\r\n let parent = this.parentElement;\r\n while (parent) {\r\n if (parent instanceof RelSheet) {\r\n return parent;\r\n }\r\n parent = parent.parentElement;\r\n }\r\n return null;\r\n }\r\n\r\n private handleClick = () => {\r\n const sheet = this.getSheet();\r\n if (sheet && !sheet.disabled) {\r\n sheet.setOpen(!sheet.activeOpen, \"trigger\");\r\n }\r\n };\r\n\r\n render() {\r\n return html`\r\n <button @click=\"${this.handleClick}\" type=\"button\">\r\n <slot></slot>\r\n </button>\r\n `;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// rel-sheet-content (Panel)\r\n// ============================================================================\r\n@customElement(\"rel-sheet-content\")\r\nexport class RelSheetContent extends LitElement {\r\n @property({ type: String }) side: SheetSide = \"right\";\r\n @property({ type: String }) size: SheetSize = \"md\";\r\n @property({ type: Boolean, attribute: \"hide-overlay\" }) hideOverlay = false;\r\n @property({ type: Boolean, attribute: \"close-on-overlay\" }) closeOnOverlay = true;\r\n @property({ type: Boolean, attribute: \"show-close\" }) showClose = true;\r\n\r\n @query(\".panel\") private panelElement!: HTMLElement;\r\n @query(\".overlay\") private overlayElement!: HTMLElement;\r\n\r\n private sheet: RelSheet | null = null;\r\n private previousFocus: HTMLElement | null = null;\r\n private originalBodyOverflow = \"\";\r\n private originalBodyPaddingRight = \"\";\r\n private isOpen = false;\r\n\r\n static styles = css`\r\n :host {\r\n --sheet-transition-duration: 0.3s;\r\n --sheet-transition-timing: cubic-bezier(0.32, 0.72, 0, 1);\r\n --sheet-size-sm: 320px;\r\n --sheet-size-md: 420px;\r\n --sheet-size-lg: 540px;\r\n --sheet-size-xl: 640px;\r\n }\r\n\r\n .sheet-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 .sheet-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(--sheet-transition-duration) var(--sheet-transition-timing);\r\n }\r\n\r\n .sheet-container.open .overlay {\r\n opacity: var(--rel-sheet-scrim-opacity, 1);\r\n }\r\n\r\n .overlay.hidden {\r\n display: none;\r\n }\r\n\r\n /* Panel base */\r\n .panel {\r\n position: absolute;\r\n background: var(--rel-colors-white);\r\n box-shadow: var(--rel-shadows-shadow-500);\r\n display: flex;\r\n flex-direction: column;\r\n outline: none;\r\n font-family: var(--rel-fontFamilies-primary);\r\n transition: transform var(--sheet-transition-duration) var(--sheet-transition-timing);\r\n overflow: hidden;\r\n }\r\n\r\n /* Right side (default) */\r\n .panel[data-side=\"right\"] {\r\n top: 0;\r\n right: 0;\r\n bottom: 0;\r\n width: var(--sheet-width);\r\n max-width: 90vw;\r\n border-top-left-radius: var(--rel-borders-radius-border-radius-300);\r\n border-bottom-left-radius: var(--rel-borders-radius-border-radius-300);\r\n transform: translateX(100%);\r\n }\r\n\r\n .sheet-container.open .panel[data-side=\"right\"] {\r\n transform: translateX(0);\r\n }\r\n\r\n /* Left side */\r\n .panel[data-side=\"left\"] {\r\n top: 0;\r\n left: 0;\r\n bottom: 0;\r\n width: var(--sheet-width);\r\n max-width: 90vw;\r\n border-top-right-radius: var(--rel-borders-radius-border-radius-300);\r\n border-bottom-right-radius: var(--rel-borders-radius-border-radius-300);\r\n transform: translateX(-100%);\r\n }\r\n\r\n .sheet-container.open .panel[data-side=\"left\"] {\r\n transform: translateX(0);\r\n }\r\n\r\n /* Top side */\r\n .panel[data-side=\"top\"] {\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n height: var(--sheet-width);\r\n max-height: 80vh;\r\n border-bottom-left-radius: var(--rel-borders-radius-border-radius-300);\r\n border-bottom-right-radius: var(--rel-borders-radius-border-radius-300);\r\n transform: translateY(-100%);\r\n }\r\n\r\n .sheet-container.open .panel[data-side=\"top\"] {\r\n transform: translateY(0);\r\n }\r\n\r\n /* Bottom side */\r\n .panel[data-side=\"bottom\"] {\r\n bottom: 0;\r\n left: 0;\r\n right: 0;\r\n height: var(--sheet-width);\r\n max-height: 80vh;\r\n border-top-left-radius: var(--rel-borders-radius-border-radius-300);\r\n border-top-right-radius: var(--rel-borders-radius-border-radius-300);\r\n transform: translateY(100%);\r\n }\r\n\r\n .sheet-container.open .panel[data-side=\"bottom\"] {\r\n transform: translateY(0);\r\n }\r\n\r\n /* Panel content wrapper */\r\n .panel-content {\r\n flex: 1;\r\n overflow-y: auto;\r\n padding: var(--rel-spacing-space-lg);\r\n }\r\n\r\n /* Close button */\r\n .close-button {\r\n position: absolute;\r\n top: var(--rel-spacing-space-md);\r\n right: var(--rel-spacing-space-md);\r\n background: none;\r\n border: none;\r\n cursor: pointer;\r\n padding: var(--rel-spacing-space-xs);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border-radius: var(--rel-borders-radius-border-radius-200);\r\n color: var(--rel-colors-gray-heading);\r\n font-size: 20px;\r\n line-height: 1;\r\n z-index: 1;\r\n transition: background 0.2s;\r\n }\r\n\r\n .close-button:hover {\r\n background: var(--rel-colors-gray-surface);\r\n }\r\n\r\n .close-button:focus-visible {\r\n outline: 2px solid var(--rel-colors-primary-500);\r\n outline-offset: 2px;\r\n }\r\n\r\n /* Left side close button positioning */\r\n .panel[data-side=\"left\"] .close-button {\r\n right: auto;\r\n left: var(--rel-spacing-space-md);\r\n }\r\n\r\n /* Reduced motion support */\r\n @media (prefers-reduced-motion: reduce) {\r\n .overlay,\r\n .panel {\r\n transition: none;\r\n }\r\n\r\n .sheet-container .panel {\r\n transform: none;\r\n }\r\n\r\n .sheet-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 this.findSheet();\r\n }\r\n\r\n disconnectedCallback() {\r\n super.disconnectedCallback();\r\n this.cleanup();\r\n }\r\n\r\n private findSheet() {\r\n let parent = this.parentElement;\r\n while (parent) {\r\n if (parent instanceof RelSheet) {\r\n this.sheet = parent;\r\n break;\r\n }\r\n parent = parent.parentElement;\r\n }\r\n\r\n if (this.sheet) {\r\n this.sheet.addEventListener(\"rel-open-change\", this.handleSheetOpenChange);\r\n }\r\n }\r\n\r\n private handleSheetOpenChange = (e: Event) => {\r\n const customEvent = e as CustomEvent<{ open: boolean }>;\r\n const nextOpen = customEvent.detail.open;\r\n\r\n if (nextOpen !== this.isOpen) {\r\n this.isOpen = nextOpen;\r\n if (nextOpen) {\r\n this.handleOpen();\r\n } else {\r\n this.handleClose();\r\n }\r\n this.requestUpdate();\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.sheet?.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\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\r\n private cleanup() {\r\n this.unlockScroll();\r\n document.removeEventListener(\"keydown\", this.handleKeydown);\r\n if (this.sheet) {\r\n this.sheet.removeEventListener(\"rel-open-change\", this.handleSheetOpenChange);\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 focusPanel() {\r\n if (!this.panelElement) return;\r\n\r\n const focusable = this.getFocusableElements();\r\n if (focusable.length > 0) {\r\n focusable[0].focus();\r\n } else {\r\n this.panelElement.setAttribute(\"tabindex\", \"-1\");\r\n this.panelElement.focus();\r\n }\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.filter((el) => el.offsetWidth || el.offsetHeight);\r\n }\r\n\r\n private handleKeydown = (e: KeyboardEvent) => {\r\n if (!this.isOpen) return;\r\n\r\n if (e.key === \"Escape\") {\r\n e.preventDefault();\r\n this.sheet?.setOpen(false, \"escape\");\r\n return;\r\n }\r\n\r\n // Focus trap\r\n if (e.key === \"Tab\" && this.sheet?.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.closeOnOverlay) return;\r\n\r\n if (e.target === this.overlayElement) {\r\n this.sheet?.setOpen(false, \"overlay\");\r\n }\r\n };\r\n\r\n private handleCloseClick = () => {\r\n this.sheet?.setOpen(false, \"close\");\r\n };\r\n\r\n private getSizeValue(): string {\r\n const sizeMap: Record<SheetSize, string> = {\r\n sm: \"var(--sheet-size-sm)\",\r\n md: \"var(--sheet-size-md)\",\r\n lg: \"var(--sheet-size-lg)\",\r\n xl: \"var(--sheet-size-xl)\",\r\n };\r\n return sizeMap[this.size] || sizeMap.md;\r\n }\r\n\r\n private getTitle(): string | null {\r\n const titleEl = this.querySelector(\"rel-sheet-title\");\r\n return titleEl?.textContent?.trim() || null;\r\n }\r\n\r\n private getDescription(): string | null {\r\n const descEl = this.querySelector(\"rel-sheet-description\");\r\n return descEl?.textContent?.trim() || null;\r\n }\r\n\r\n render() {\r\n const title = this.getTitle();\r\n const description = this.getDescription();\r\n const titleId = title ? \"sheet-title\" : undefined;\r\n const descId = description ? \"sheet-description\" : undefined;\r\n\r\n return html`\r\n <div class=\"sheet-container ${this.isOpen ? \"open\" : \"\"}\">\r\n <div\r\n part=\"overlay\"\r\n class=\"overlay ${this.hideOverlay ? \"hidden\" : \"\"}\"\r\n @click=\"${this.handleOverlayClick}\"></div>\r\n\r\n <div\r\n part=\"panel\"\r\n class=\"panel\"\r\n data-side=\"${this.side}\"\r\n style=\"--sheet-width: ${this.getSizeValue()}\"\r\n role=\"dialog\"\r\n aria-modal=\"${this.sheet?.modal ?? true}\"\r\n aria-labelledby=\"${titleId || \"\"}\"\r\n aria-describedby=\"${descId || \"\"}\"\r\n tabindex=\"-1\">\r\n ${this.showClose\r\n ? html`\r\n <button\r\n class=\"close-button\"\r\n @click=\"${this.handleCloseClick}\"\r\n aria-label=\"Close\"\r\n type=\"button\">\r\n ✕\r\n </button>\r\n `\r\n : \"\"}\r\n\r\n <div class=\"panel-content\">\r\n <slot></slot>\r\n </div>\r\n </div>\r\n </div>\r\n `;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// rel-sheet-header (Layout Helper)\r\n// ============================================================================\r\n@customElement(\"rel-sheet-header\")\r\nexport class RelSheetHeader extends LitElement {\r\n static styles = css`\r\n :host {\r\n display: block;\r\n padding-bottom: var(--rel-spacing-space-md);\r\n border-bottom: 1px solid var(--rel-colors-gray-border);\r\n margin-bottom: var(--rel-spacing-space-lg);\r\n }\r\n `;\r\n\r\n render() {\r\n return html`<slot></slot>`;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// rel-sheet-footer (Layout Helper)\r\n// ============================================================================\r\n@customElement(\"rel-sheet-footer\")\r\nexport class RelSheetFooter extends LitElement {\r\n static styles = css`\r\n :host {\r\n display: block;\r\n padding-top: var(--rel-spacing-space-md);\r\n border-top: 1px solid var(--rel-colors-gray-border);\r\n margin-top: var(--rel-spacing-space-lg);\r\n }\r\n `;\r\n\r\n render() {\r\n return html`<slot></slot>`;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// rel-sheet-title (Layout Helper)\r\n// ============================================================================\r\n@customElement(\"rel-sheet-title\")\r\nexport class RelSheetTitle extends LitElement {\r\n static styles = css`\r\n :host {\r\n display: block;\r\n font-size: 20px;\r\n font-weight: 600;\r\n color: var(--rel-colors-gray-heading);\r\n margin: 0 0 var(--rel-spacing-space-xs) 0;\r\n padding-right: var(--rel-spacing-space-lg);\r\n }\r\n `;\r\n\r\n render() {\r\n return html`<slot></slot>`;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// rel-sheet-description (Layout Helper)\r\n// ============================================================================\r\n@customElement(\"rel-sheet-description\")\r\nexport class RelSheetDescription extends LitElement {\r\n static styles = css`\r\n :host {\r\n display: block;\r\n font-size: 14px;\r\n color: var(--rel-colors-gray-body);\r\n margin: 0;\r\n line-height: 1.5;\r\n }\r\n `;\r\n\r\n render() {\r\n return html`<slot></slot>`;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// rel-sheet-close (Close Button Wrapper)\r\n// ============================================================================\r\n@customElement(\"rel-sheet-close\")\r\nexport class RelSheetClose extends LitElement {\r\n static styles = css`\r\n :host {\r\n display: inline-block;\r\n }\r\n\r\n button {\r\n background: none;\r\n border: none;\r\n padding: 0;\r\n margin: 0;\r\n font: inherit;\r\n cursor: pointer;\r\n display: contents;\r\n }\r\n `;\r\n\r\n private getSheet(): RelSheet | null {\r\n let parent = this.parentElement;\r\n while (parent) {\r\n if (parent instanceof RelSheet) {\r\n return parent;\r\n }\r\n parent = parent.parentElement;\r\n }\r\n return null;\r\n }\r\n\r\n private handleClick = () => {\r\n const sheet = this.getSheet();\r\n if (sheet) {\r\n sheet.setOpen(false, \"close\");\r\n }\r\n };\r\n\r\n render() {\r\n return html`\r\n <button @click=\"${this.handleClick}\" type=\"button\">\r\n <slot></slot>\r\n </button>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property, state } from \"lit/decorators.js\";\r\n\r\nexport type 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-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-surface-surface), 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, sans-serif);\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-colors-gray-border);\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-colors-black);\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-colors-white) 0 1px,\r\n transparent 1px\r\n )\r\n center/12px 4px repeat-x,\r\n var(--rel-colors-black);\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: 23.5%;\r\n transform: translate(-50%, -50%);\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-colors-black);\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-colors-gray-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-colors-white);\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-colors-gray-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-colors-gray-primary);\r\n }\r\n\r\n .rel-slider.disabled .track-active {\r\n background: var(--rel-colors-gray-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-surface-surface) 0 1px,\r\n transparent 1px\r\n )\r\n center/12px 4px repeat-x,\r\n var(--rel-colors-gray-placeholder);\r\n }\r\n\r\n .rel-slider.disabled .tick {\r\n background: var(--rel-colors-gray-placeholder);\r\n }\r\n\r\n .rel-slider.disabled .tick-label {\r\n color: var(--rel-colors-gray-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-colors-gray-placeholder);\r\n box-shadow: 0 0 0 var(--thumb-stroke) var(--rel-surface-surface);\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\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-colors-black)\" />\r\n <text\r\n x=\"12\"\r\n y=\"16\"\r\n text-anchor=\"middle\"\r\n fill=\"var(--rel-colors-white)\"\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\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;\r\n border-radius: var(--rel-borders-radius-border-radius-200);\r\n background-color: var(--rel-colors-black);\r\n color: var(--rel-colors-white);\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-600, #16a34a);\r\n }\r\n\r\n .snackbar.type-error {\r\n border-left-color: var(--rel-colors-red-600, #dc2626);\r\n }\r\n\r\n .snackbar.type-warning {\r\n border-left-color: var(--rel-colors-amber-600, #d97706);\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-400, #4ade80);\r\n }\r\n\r\n .snackbar.type-error .snackbar-icon {\r\n color: var(--rel-colors-red-400, #f87171);\r\n }\r\n\r\n .snackbar.type-warning .snackbar-icon {\r\n color: var(--rel-colors-amber-400, #fbbf24);\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 font-size: 14px;\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-400, #4ade80);\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 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 var(--rel-colors-white, #fff);\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: var(--rel-colors-white, #fff);\r\n cursor: pointer;\r\n font-size: 16px;\r\n padding: 0;\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: opacity 0.2s ease;\r\n }\r\n\r\n .snackbar-close:hover {\r\n opacity: 0.8;\r\n }\r\n\r\n .snackbar-close:active {\r\n opacity: 0.6;\r\n }\r\n\r\n .snackbar-close:focus-visible {\r\n outline: 2px solid var(--rel-colors-white, #fff);\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 getIcon(): string {\r\n switch (this.type) {\r\n case \"success\": return \"✓\";\r\n case \"error\": return \"✕\";\r\n case \"warning\": return \"⚠\";\r\n default: return \"\";\r\n }\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 const icon = this.getIcon();\r\n\r\n return html`\r\n <div class=\"${snackbarClasses}\">\r\n <div class=\"snackbar-body\">\r\n ${icon ? html`<span class=\"snackbar-icon\">${icon}</span>` : \"\"}\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 ✖\r\n </button>\r\n `\r\n : \"\"}\r\n </div>\r\n </div>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property } from \"lit/decorators.js\";\r\n\r\nexport type StepStatus = \"done\" | \"progress\" | \"disabled\";\r\nexport type TextAlign = \"right\" | \"below\";\r\nexport type Orientation = \"horizontal\" | \"vertical\";\r\nexport type StepperSize = \"small\" | \"large\";\r\n\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-colors-gray-border);\r\n background: var(--rel-colors-white);\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: all 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-text-primary, #333);\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-colors-gray-border);\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-colors-gray-border);\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-colors-gray-light, #fafafa);\r\n border-color: var(--rel-colors-gray-border, #ddd);\r\n color: var(--rel-text-disabled, #9e9e9e);\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-text-disabled, #9e9e9e);\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\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-text-placeholder);\r\n --switch-knob-on: var(--rel-colors-black);\r\n --switch-knob-off: var(--rel-colors-white);\r\n --switch-halo: var(--rel-border-default);\r\n --switch-disabled: var(--rel-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-text-dark-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\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-text-primary);\r\n --tab-text-disabled: var(--rel-text-disabled);\r\n --tab-text-hover: var(--rel-text-heading);\r\n --tab-underline-height: 3px;\r\n --tab-hover-color: var(--rel-surface-surface);\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, #c4c4c4);\r\n font-family: var(--rel-fontFamilies-primary, sans-serif);\r\n user-select: none;\r\n }\r\n\r\n .tab {\r\n position: relative;\r\n padding: var(--rel-spacing-space-sm, 12px) var(--rel-spacing-space-md, 16px);\r\n cursor: pointer;\r\n color: var(--tab-text-default);\r\n font-size: var(--rel-fontSizes-md, 14px);\r\n font-weight: var(--rel-fontWeights-medium, 500);\r\n transition: color 0.2s ease;\r\n display: flex;\r\n align-items: center;\r\n gap: var(--rel-spacing-space-2xs, 4px);\r\n }\r\n\r\n .tab:focus-visible {\r\n outline: 2px solid var(--rel-border-info, #0091ea);\r\n outline-offset: -2px;\r\n border-radius: var(--rel-borders-radius-border-radius-100, 2px);\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 /* Badge */\r\n .tab-badge {\r\n display: inline-flex;\r\n justify-content: center;\r\n align-items: center;\r\n background: var(--rel-color-brand);\r\n color: #000000;\r\n border-radius: var(--rel-tab-badge-radius, 50%);\r\n font-size: var(--rel-fontSizes-xs);\r\n font-weight: 600;\r\n min-width: var(--rel-tab-badge-min-width, 16px);\r\n text-align: center;\r\n height: var(--rel-tab-badge-height, 16px);\r\n padding: var(--rel-spacing-space-3xs, 2px);\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`<span class=\"tab-badge\">${tab.badge}</span>`\r\n : \"\"}\r\n <span class=\"tab-underline\"></span>\r\n </div>\r\n `\r\n )}\r\n </div>\r\n <div class=\"tab-content\">\r\n <slot></slot>\r\n </div>\r\n `;\r\n }\r\n}\r\n","import { LitElement, html, css } from \"lit\";\r\nimport { customElement, property, state } from \"lit/decorators.js\";\r\n\r\nexport type 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\r\n @state() private internalState: \"default\" | \"focused\" = \"default\";\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, sans-serif);\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, 4px);\r\n width: 100%;\r\n }\r\n\r\n /* Label */\r\n .textfield-label {\r\n font-size: var(--rel-fontSizes-sm, 12px);\r\n font-weight: var(--rel-fontWeights-medium, 500);\r\n color: var(--rel-text-heading, #2b2b2b);\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-border-default, #ddd);\r\n border-radius: var(--rel-borders-radius-border-radius-200, 8px);\r\n background: var(--rel-colors-white, #fff);\r\n transition: border 0.2s;\r\n }\r\n\r\n .textfield-container.disabled {\r\n background: var(--rel-surface-surface, #f5f5f5);\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, 14px);\r\n padding: var(--rel-spacing-space-xs, 8px) var(--rel-spacing-space-sm, 12px);\r\n background: transparent;\r\n font-family: var(--rel-fontFamilies-primary, sans-serif);\r\n color: var(--rel-text-primary, #333);\r\n }\r\n\r\n .textfield-input:disabled {\r\n cursor: not-allowed;\r\n color: var(--rel-text-disabled, #9e9e9e);\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-text-placeholder, #a9a9a9);\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, 8px) var(--rel-spacing-space-sm, 12px);\r\n font-size: var(--rel-fontSizes-sm, 12px);\r\n }\r\n\r\n .textfield-wrapper.medium .textfield-input {\r\n padding: var(--rel-spacing-space-sm, 12px) var(--rel-spacing-space-md, 16px);\r\n font-size: var(--rel-fontSizes-md, 14px);\r\n }\r\n\r\n .textfield-wrapper.large .textfield-input {\r\n padding: var(--rel-spacing-space-md, 16px) var(--rel-spacing-space-md, 16px);\r\n font-size: var(--rel-fontSizes-lg, 20px);\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, 32px);\r\n }\r\n\r\n .textfield-wrapper .textfield-input.has-right-icon {\r\n padding-right: var(--rel-spacing-space-2xl, 32px);\r\n }\r\n\r\n /* States */\r\n .textfield-wrapper.focused .textfield-container {\r\n border-color: var(--rel-colors-primary-500, #0091ea);\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-colors-primary-500, #0091ea);\r\n box-shadow: 0 0 0 1px var(--rel-colors-primary-500, #0091ea);\r\n }\r\n\r\n .textfield-wrapper.error .textfield-container {\r\n border-color: var(--rel-border-error, #cc0000);\r\n }\r\n\r\n .textfield-wrapper.disabled .textfield-container {\r\n border-color: var(--rel-border-default, #ddd);\r\n }\r\n\r\n /* Supporting text */\r\n .textfield-support {\r\n font-size: var(--rel-fontSizes-xs, 10px);\r\n color: var(--rel-text-placeholder, #a9a9a9);\r\n }\r\n\r\n .textfield-support.error {\r\n color: var(--rel-text-error, #cc0000);\r\n }\r\n\r\n /* Placeholder */\r\n .textfield-input::placeholder {\r\n color: var(--rel-text-placeholder, #a9a9a9);\r\n }\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 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 ].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.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.leftIcon\r\n ? html`<span class=\"icon left\">${this.leftIcon}</span>`\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`<span class=\"icon right\">${this.rightIcon}</span>`\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\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, 12px);\r\n background-color: var(--rel-surface-toast, #404040);\r\n color: var(--rel-colors-white, #fff);\r\n font-family: var(--rel-fontFamilies-primary, sans-serif);\r\n font-size: var(--rel-fontSizes-md, 14px);\r\n border-radius: var(--rel-borders-radius-border-radius-200, 8px);\r\n padding: var(--rel-spacing-space-md, 16px);\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-colors-red-secondary);\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 var(--rel-colors-white, #fff);\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, 4px);\r\n margin-left: var(--rel-spacing-space-2xs, 4px);\r\n }\r\n\r\n .toast-close:hover {\r\n opacity: 0.75;\r\n }\r\n\r\n .toast-close:focus-visible {\r\n outline: 2px solid var(--rel-colors-white, #fff);\r\n outline-offset: 2px;\r\n border-radius: 2px;\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\";\nimport { customElement, property } from \"lit/decorators.js\";\n\nexport type TooltipPosition = \"above\" | \"below\";\n\n@customElement(\"rel-tooltip\")\nexport class RelTooltip extends LitElement {\n @property({ type: String }) text: string = \"\";\n @property({ type: String }) position: TooltipPosition = \"above\";\n @property({ type: Boolean, attribute: \"show-tail\" }) showTail: boolean =\n false;\n\n // Stable id so aria-describedby can reference the bubble across renders.\n private uniqueId = Math.random().toString(36).slice(2);\n\n static styles = css`\n :host {\n display: inline-block;\n position: relative;\n }\n\n /* Tooltip container */\n .tooltip-bubble {\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n background-color: #1a1a1a;\n color: #ffffff;\n padding: var(--rel-spacing-space-xs, 8px)\n var(--rel-spacing-space-sm, 12px);\n border-radius: var(--rel-borders-radius-border-radius-200, 8px);\n font-size: var(--rel-fontSizes-sm, 12px);\n font-family: var(--rel-fontFamilies-primary, sans-serif);\n white-space: nowrap;\n z-index: 1000;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.2s ease;\n overflow: visible;\n }\n\n :host(:hover) .tooltip-bubble,\n :host(:focus-within) .tooltip-bubble {\n opacity: 1;\n }\n\n /* Positioning */\n .tooltip-bubble.above {\n bottom: calc(100% + 8px);\n }\n\n .tooltip-bubble.below {\n top: calc(100% + 8px);\n }\n\n /* Tail/Arrow */\n .tooltip-tail {\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n width: 0;\n height: 0;\n border-left: 6px solid transparent;\n border-right: 6px solid transparent;\n display: block;\n }\n\n .tooltip-bubble.above .tooltip-tail {\n bottom: -6px;\n border-top: 6px solid #1a1a1a;\n border-bottom: none;\n }\n\n .tooltip-bubble.below .tooltip-tail {\n top: -6px;\n border-bottom: 6px solid #1a1a1a;\n border-top: none;\n }\n\n :host-context([data-theme=\"dark\"]) .tooltip-bubble,\n :host-context(.dark) .tooltip-bubble {\n background-color: #ffffff;\n color: #000000;\n }\n\n :host-context([data-theme=\"dark\"]) .tooltip-bubble.above .tooltip-tail,\n :host-context(.dark) .tooltip-bubble.above .tooltip-tail {\n border-top-color: #ffffff;\n }\n\n :host-context([data-theme=\"dark\"]) .tooltip-bubble.below .tooltip-tail,\n :host-context(.dark) .tooltip-bubble.below .tooltip-tail {\n border-bottom-color: #ffffff;\n }\n `;\n\n firstUpdated() {\n this.linkTrigger();\n }\n\n private linkTrigger() {\n const slot = this.shadowRoot?.querySelector(\"slot\");\n if (!slot) return;\n const trigger = slot.assignedElements()[0];\n if (trigger) {\n trigger.setAttribute(\"aria-describedby\", `tooltip-${this.uniqueId}`);\n }\n }\n\n render() {\n return html`\n <slot @slotchange=\"${this.linkTrigger}\"></slot>\n <div\n class=\"tooltip-bubble ${this.position}\"\n id=\"tooltip-${this.uniqueId}\"\n role=\"tooltip\"\n >\n ${this.text}\n ${this.showTail ? html`<span class=\"tooltip-tail\"></span>` : \"\"}\n </div>\n `;\n }\n}\n"],"mappings":"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","names":["LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","LitElement","html","css","customElement","LitElement","html","css","nothing","customElement","property","state","LitElement","html","nothing","css","property","state","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","nothing","customElement","property","state","query","LitElement","html","nothing","css","property","state","query","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","state","query","LitElement","html","css","customElement","LitElement","html","css","customElement","LitElement","html","css","property","state","query","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","state","LitElement","html","property","customElement","css","state","LitElement","html","css","customElement","state","query","LitElement","html","css","state","query","customElement","LitElement","html","customElement","property","LitElement","html","property","customElement","LitElement","html","css","customElement","property","state","query","LitElement","item","html","css","property","state","query","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","LitElement","html","css","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","LitElement","html","css","customElement","LitElement","html","css","customElement","LitElement","html","css","customElement","LitElement","html","css","customElement","LitElement","html","css","customElement","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","state","LitElement","html","css","customElement","LitElement","html","css","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","property","state","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","state","query","LitElement","html","css","property","state","query","customElement","LitElement","html","css","customElement","property","state","LitElement","html","css","property","state","customElement","LitElement","html","css","customElement","property","state","query","LitElement","html","css","property","state","query","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","state","query","LitElement","html","css","property","state","customElement","query","LitElement","html","css","customElement","property","state","LitElement","html","css","property","state","customElement","LitElement","html","css","customElement","property","state","LitElement","html","css","property","state","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement","LitElement","html","css","customElement","property","state","LitElement","html","css","property","state","customElement","LitElement","html","css","customElement","property","state","LitElement","html","property","customElement","css","state","LitElement","html","css","customElement","property","state","LitElement","html","css","property","state","customElement","LitElement","html","css","customElement","property","state","LitElement","html","css","property","state","customElement","LitElement","html","css","customElement","property","LitElement","html","css","property","customElement"]}