{
  "version": 3,
  "sources": ["../src/index.ts", "../src/components/ashtakavarga-grid.ts", "../src/tokens/index.ts", "../src/utils/base-styles.ts", "../src/components/biorhythm-chart.ts", "../src/components/choghadiya-grid.ts", "../src/utils/string.ts", "../src/components/compatibility-card.ts", "../src/utils/format.ts", "../src/components/dasha-timeline.ts", "../src/components/data.ts", "../src/components/divisional-chart.ts", "../src/utils/kundli-render.ts", "../src/components/dosha-card.ts", "../src/components/endpoint-form.ts", "../src/components/guna-milan.ts", "../src/components/hexagram.ts", "../src/components/horoscope-card.ts", "../src/components/kp-planets-table.ts", "../src/components/location-search.ts", "../src/utils/debounce.ts", "../src/components/moon-phase.ts", "../src/components/natal-chart.ts", "../src/utils/degree.ts", "../src/components/numerology-card.ts", "../src/components/panchang-table.ts", "../src/components/shadbala-table.ts", "../src/components/synastry-chart.ts", "../src/components/tarot-card.ts", "../src/components/tarot-spread.ts", "../src/components/transits-table.ts", "../src/components/vedic-kundli.ts", "../src/components/yoga-list.ts", "../src/manifest.ts", "../src/version.ts"],
  "sourcesContent": ["/**\n * @roxyapi/ui main entry. Importing this file registers every custom element.\n *\n * For tree-shake friendly usage, import per-component:\n *   import '@roxyapi/ui/components/natal-chart';\n */\n\nexport { RoxyAshtakavargaGrid } from './components/ashtakavarga-grid.js';\n// Biorhythm\nexport { RoxyBiorhythmChart } from './components/biorhythm-chart.js';\nexport { RoxyChoghadiyaGrid } from './components/choghadiya-grid.js';\nexport { RoxyCompatibilityCard } from './components/compatibility-card.js';\nexport { RoxyDashaTimeline } from './components/dasha-timeline.js';\n// Generic fallback first so it is always available for nested rendering\nexport { RoxyData } from './components/data.js';\nexport { RoxyDivisionalChart } from './components/divisional-chart.js';\nexport { RoxyDoshaCard } from './components/dosha-card.js';\n// Helpers\nexport { RoxyEndpointForm } from './components/endpoint-form.js';\nexport { RoxyGunaMilan } from './components/guna-milan.js';\n// I Ching\nexport { RoxyHexagram } from './components/hexagram.js';\nexport { RoxyHoroscopeCard } from './components/horoscope-card.js';\nexport { RoxyKpPlanetsTable } from './components/kp-planets-table.js';\nexport { RoxyLocationSearch } from './components/location-search.js';\nexport { RoxyMoonPhase } from './components/moon-phase.js';\n// Western astrology\nexport { RoxyNatalChart } from './components/natal-chart.js';\n// Numerology\nexport { RoxyNumerologyCard } from './components/numerology-card.js';\nexport { RoxyPanchangTable } from './components/panchang-table.js';\nexport { RoxyShadbalaTable } from './components/shadbala-table.js';\nexport { RoxySynastryChart } from './components/synastry-chart.js';\n// Tarot\nexport { RoxyTarotCard } from './components/tarot-card.js';\nexport { RoxyTarotSpread } from './components/tarot-spread.js';\nexport { RoxyTransitsTable } from './components/transits-table.js';\n// Vedic astrology\nexport { RoxyVedicKundli } from './components/vedic-kundli.js';\nexport { RoxyYogaList } from './components/yoga-list.js';\n\nimport { ROXY_COMPONENTS, type RoxyComponentSlug } from './manifest.js';\n\nexport {\n\tROXY_COMPONENTS,\n\ttype RoxyComponent,\n\ttype RoxyComponentSlug,\n} from './manifest.js';\nexport { ROXY_UI_VERSION } from './version.js';\n\n/** Slugs in declaration order. Kept for the auto-mount widgets script and downstream codegen. */\nexport const ROXY_UI_COMPONENTS: readonly RoxyComponentSlug[] =\n\tROXY_COMPONENTS.map((c) => c.slug) as RoxyComponentSlug[];\n", "import { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { SIGN_GLYPH } from '../tokens/index.js';\nimport type { AshtakavargaResponse } from '../types/index.js';\nimport { baseStyles } from '../utils/base-styles.js';\n\ntype Tab = 'sarva' | 'bhinna' | 'pinda';\n\nconst TAB_LABELS: Record<Tab, string> = {\n\tsarva: 'Sarvashtakavarga',\n\tbhinna: 'Bhinnashtakavarga',\n\tpinda: 'Shodhya Pinda',\n};\n\nconst TABS: Tab[] = ['sarva', 'bhinna', 'pinda'];\n\n/**\n * Ashtakavarga grid with three tabbed views: Sarvashtakavarga, Bhinnashtakavarga,\n * and Shodhya Pinda. Pass `data` from /vedic-astrology/ashtakavarga.\n */\n@customElement('roxy-ashtakavarga-grid')\nexport class RoxyAshtakavargaGrid extends LitElement {\n\tstatic styles = [\n\t\tbaseStyles,\n\t\tcss`\n\t\t\t.wrap {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\n\t\t\t.head {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\talign-items: baseline;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t\tflex-wrap: wrap;\n\t\t\t}\n\n\t\t\t.title {\n\t\t\t\tfont-size: var(--roxy-text-lg, 1.125rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tmargin: 0;\n\t\t\t}\n\n\t\t\t.subtitle {\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tmargin: 0;\n\t\t\t}\n\n\t\t\t/* Tabs */\n\t\t\t.tablist {\n\t\t\t\tdisplay: flex;\n\t\t\t\tgap: 2px;\n\t\t\t\tborder-bottom: 2px solid var(--roxy-border, #e4e4e7);\n\t\t\t}\n\n\t\t\t.tab {\n\t\t\t\tpadding: var(--roxy-space-xs, 0.25rem) var(--roxy-space-md, 1rem);\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tbackground: none;\n\t\t\t\tborder: none;\n\t\t\t\tborder-bottom: 2px solid transparent;\n\t\t\t\tmargin-bottom: -2px;\n\t\t\t\tcursor: pointer;\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tfont-family: inherit;\n\t\t\t\ttransition: color var(--roxy-motion-duration, 200ms) var(--roxy-motion-easing, ease);\n\t\t\t}\n\n\t\t\t.tab[aria-selected='true'] {\n\t\t\t\tcolor: var(--roxy-accent-fg, #b45309);\n\t\t\t\tborder-bottom-color: var(--roxy-accent, #f59e0b);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t}\n\n\t\t\t.tab:hover:not([aria-selected='true']) {\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t}\n\n\t\t\t/* Tables */\n\t\t\t.overflow-scroll {\n\t\t\t\toverflow-x: auto;\n\t\t\t\t-webkit-overflow-scrolling: touch;\n\t\t\t}\n\n\t\t\ttable {\n\t\t\t\twidth: 100%;\n\t\t\t\tborder-collapse: collapse;\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t}\n\n\t\t\tth,\n\t\t\ttd {\n\t\t\t\tpadding: var(--roxy-space-sm, 0.5rem);\n\t\t\t\tborder-bottom: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\ttext-align: center;\n\t\t\t}\n\n\t\t\tth {\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tletter-spacing: 0.06em;\n\t\t\t}\n\n\t\t\ttd:first-child,\n\t\t\tth:first-child {\n\t\t\t\ttext-align: left;\n\t\t\t}\n\n\t\t\t.glyph {\n\t\t\t\tfont-size: 1.1em;\n\t\t\t\tmargin-right: 3px;\n\t\t\t\tline-height: 1;\n\t\t\t}\n\n\t\t\t.planet-cell {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 4px;\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\n\t\t\t.total-row td {\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tborder-top: 2px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tborder-bottom: none;\n\t\t\t}\n\n\t\t\t/* Heat cells */\n\t\t\t.heat-cell {\n\t\t\t\tborder-radius: var(--roxy-radius-sm, 4px);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tmin-width: 2rem;\n\t\t\t\tfont-variant-numeric: tabular-nums;\n\t\t\t}\n\n\t\t\t.heat-1 { background: var(--roxy-heat-1, #f0fdf4); color: var(--roxy-fg, #0a0a0a); }\n\t\t\t.heat-2 { background: var(--roxy-heat-2, #d1fae5); color: var(--roxy-fg, #0a0a0a); }\n\t\t\t.heat-3 { background: var(--roxy-heat-3, #a7f3d0); color: var(--roxy-fg, #0a0a0a); }\n\t\t\t.heat-4 { background: var(--roxy-heat-4, #fde68a); color: var(--roxy-fg, #0a0a0a); }\n\t\t\t.heat-5 { background: var(--roxy-heat-5, #fdba74); color: var(--roxy-fg, #0a0a0a); }\n\t\t\t.heat-6 { background: var(--roxy-heat-6, #fb923c); color: var(--roxy-fg, #0a0a0a); }\n\t\t\t.heat-7 { background: var(--roxy-heat-7, #ef4444); color: var(--roxy-fg, #0a0a0a); }\n\n\t\t\t/* Bhinna grid: planet header column narrower */\n\t\t\t.bhinna-table th:first-child,\n\t\t\t.bhinna-table td:first-child {\n\t\t\t\tmin-width: 5rem;\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\tdata: AshtakavargaResponse | null = null;\n\n\t@state()\n\tactiveTab: Tab = 'sarva';\n\n\trender() {\n\t\tif (!this.data) {\n\t\t\treturn html`<div class=\"roxy-empty\" role=\"status\">No ashtakavarga data</div>`;\n\t\t}\n\n\t\tconst signs = this.data.signs ?? [];\n\n\t\treturn html`<div class=\"wrap\" aria-label=\"Ashtakavarga grid\">\n\t\t\t<div class=\"head\">\n\t\t\t\t<h2 class=\"title\">Ashtakavarga</h2>\n\t\t\t\t${\n\t\t\t\t\tsigns.length\n\t\t\t\t\t\t? html`<p class=\"subtitle\">${signs.length} signs</p>`\n\t\t\t\t\t\t: nothing\n\t\t\t\t}\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tclass=\"tablist\"\n\t\t\t\trole=\"tablist\"\n\t\t\t\taria-label=\"Ashtakavarga views\"\n\t\t\t\t@keydown=${this.onTabKeyDown}\n\t\t\t>\n\t\t\t\t${TABS.map(\n\t\t\t\t\t(tab) => html`<button\n\t\t\t\t\t\tclass=\"tab\"\n\t\t\t\t\t\trole=\"tab\"\n\t\t\t\t\t\tid=\"tab-${tab}\"\n\t\t\t\t\t\taria-selected=${this.activeTab === tab ? 'true' : 'false'}\n\t\t\t\t\t\taria-controls=\"panel-${tab}\"\n\t\t\t\t\t\ttabindex=${this.activeTab === tab ? '0' : '-1'}\n\t\t\t\t\t\t@click=${() => {\n\t\t\t\t\t\t\tthis.activeTab = tab;\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t${TAB_LABELS[tab]}\n\t\t\t\t\t</button>`,\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tid=\"panel-${this.activeTab}\"\n\t\t\t\trole=\"tabpanel\"\n\t\t\t\taria-labelledby=\"tab-${this.activeTab}\"\n\t\t\t>\n\t\t\t\t${\n\t\t\t\t\tthis.activeTab === 'sarva'\n\t\t\t\t\t\t? this.renderSarva(signs)\n\t\t\t\t\t\t: this.activeTab === 'bhinna'\n\t\t\t\t\t\t\t? this.renderBhinna(signs)\n\t\t\t\t\t\t\t: this.renderPinda()\n\t\t\t\t}\n\t\t\t</div>\n\t\t</div>`;\n\t}\n\n\tprivate onTabKeyDown(e: KeyboardEvent) {\n\t\tconst idx = TABS.indexOf(this.activeTab);\n\t\tif (e.key === 'ArrowRight') {\n\t\t\te.preventDefault();\n\t\t\tthis.activeTab = TABS[(idx + 1) % TABS.length];\n\t\t\tthis.focusActiveTab();\n\t\t} else if (e.key === 'ArrowLeft') {\n\t\t\te.preventDefault();\n\t\t\tthis.activeTab = TABS[(idx - 1 + TABS.length) % TABS.length];\n\t\t\tthis.focusActiveTab();\n\t\t}\n\t}\n\n\tprivate focusActiveTab() {\n\t\trequestAnimationFrame(() => {\n\t\t\tconst btn = this.shadowRoot?.querySelector<HTMLButtonElement>(\n\t\t\t\t`#tab-${this.activeTab}`,\n\t\t\t);\n\t\t\tbtn?.focus();\n\t\t});\n\t}\n\n\tprivate heatClass(count: number): string {\n\t\tif (count <= 1) return 'heat-1';\n\t\tif (count <= 2) return 'heat-2';\n\t\tif (count <= 3) return 'heat-3';\n\t\tif (count <= 4) return 'heat-4';\n\t\tif (count <= 5) return 'heat-5';\n\t\tif (count <= 6) return 'heat-6';\n\t\treturn 'heat-7';\n\t}\n\n\tprivate renderSarva(signs: AshtakavargaResponse['signs']) {\n\t\tconst sav = this.data!.sarvashtakavarga;\n\t\tif (!sav) return html`<p class=\"roxy-empty\">No sarvashtakavarga data</p>`;\n\n\t\treturn html`<div class=\"overflow-scroll\">\n\t\t\t<table aria-label=\"Sarvashtakavarga bindu counts per sign\">\n\t\t\t\t<thead>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<th scope=\"col\">Sign</th>\n\t\t\t\t\t\t<th scope=\"col\">Bindus</th>\n\t\t\t\t\t</tr>\n\t\t\t\t</thead>\n\t\t\t\t<tbody>\n\t\t\t\t\t${signs.map((sign, i) => {\n\t\t\t\t\t\tconst count = sav.bindus[i] ?? 0;\n\t\t\t\t\t\tconst hc = this.heatClass(count);\n\t\t\t\t\t\treturn html`<tr>\n\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t<div class=\"planet-cell\">\n\t\t\t\t\t\t\t\t\t<span class=\"glyph\" aria-hidden=\"true\">${SIGN_GLYPH[sign] ?? ''}</span>\n\t\t\t\t\t\t\t\t\t${sign}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t<td class=\"${`heat-cell ${hc}`}\">${count}</td>\n\t\t\t\t\t\t</tr>`;\n\t\t\t\t\t})}\n\t\t\t\t</tbody>\n\t\t\t\t<tfoot>\n\t\t\t\t\t<tr class=\"total-row\">\n\t\t\t\t\t\t<td>Total</td>\n\t\t\t\t\t\t<td>${sav.total}</td>\n\t\t\t\t\t</tr>\n\t\t\t\t</tfoot>\n\t\t\t</table>\n\t\t</div>`;\n\t}\n\n\tprivate renderBhinna(signs: AshtakavargaResponse['signs']) {\n\t\tconst bhinna = this.data!.bhinnashtakavarga;\n\t\tif (!bhinna?.length)\n\t\t\treturn html`<p class=\"roxy-empty\">No bhinnashtakavarga data</p>`;\n\n\t\treturn html`<div class=\"overflow-scroll\">\n\t\t\t<table class=\"bhinna-table\" aria-label=\"Bhinnashtakavarga planet-by-sign grid\">\n\t\t\t\t<thead>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<th scope=\"col\">Planet</th>\n\t\t\t\t\t\t${signs.map(\n\t\t\t\t\t\t\t(s) =>\n\t\t\t\t\t\t\t\thtml`<th scope=\"col\" title=${s}>${SIGN_GLYPH[s] ?? s.slice(0, 2)}</th>`,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<th scope=\"col\">Total</th>\n\t\t\t\t\t</tr>\n\t\t\t\t</thead>\n\t\t\t\t<tbody>\n\t\t\t\t\t${bhinna.map(\n\t\t\t\t\t\t(row) => html`<tr>\n\t\t\t\t\t\t<td>${row.planet}</td>\n\t\t\t\t\t\t${row.bindus.map((count) => {\n\t\t\t\t\t\t\tconst hc = this.heatClass(count);\n\t\t\t\t\t\t\treturn html`<td class=\"${`heat-cell ${hc}`}\">${count}</td>`;\n\t\t\t\t\t\t})}\n\t\t\t\t\t\t<td>${row.total}</td>\n\t\t\t\t\t</tr>`,\n\t\t\t\t\t)}\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t</div>`;\n\t}\n\n\tprivate renderPinda() {\n\t\tconst pinda = this.data!.shodhyaPinda;\n\t\tif (!pinda?.length)\n\t\t\treturn html`<p class=\"roxy-empty\">No shodhya pinda data</p>`;\n\n\t\treturn html`<div class=\"overflow-scroll\">\n\t\t\t<table aria-label=\"Shodhya Pinda planet strength scores\">\n\t\t\t\t<thead>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<th scope=\"col\">Planet</th>\n\t\t\t\t\t\t<th scope=\"col\">Rashi Pinda</th>\n\t\t\t\t\t\t<th scope=\"col\">Graha Pinda</th>\n\t\t\t\t\t\t<th scope=\"col\">Shodhya Pinda</th>\n\t\t\t\t\t</tr>\n\t\t\t\t</thead>\n\t\t\t\t<tbody>\n\t\t\t\t\t${pinda.map(\n\t\t\t\t\t\t(row) => html`<tr>\n\t\t\t\t\t\t\t<td>${row.planet}</td>\n\t\t\t\t\t\t\t<td>${row.rashiPinda}</td>\n\t\t\t\t\t\t\t<td>${row.grahaPinda}</td>\n\t\t\t\t\t\t\t<td>${row.shodhyaPinda}</td>\n\t\t\t\t\t\t</tr>`,\n\t\t\t\t\t)}\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t</div>`;\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'roxy-ashtakavarga-grid': RoxyAshtakavargaGrid;\n\t}\n}\n", "/**\n * Symbol constants used across components. Single source of truth so chart\n * wheels, card headers, hexagram displays, and panchang tables stay visually\n * consistent.\n */\n\nexport const PLANET_GLYPH: Record<string, string> = {\n\tSun: '\u2609',\n\tMoon: '\u263D',\n\tMercury: '\u263F',\n\tVenus: '\u2640',\n\tEarth: '\u2641',\n\tMars: '\u2642',\n\tJupiter: '\u2643',\n\tSaturn: '\u2644',\n\tUranus: '\u2645',\n\tNeptune: '\u2646',\n\tPluto: '\u2647',\n\tRahu: '\u260A',\n\tKetu: '\u260B',\n\tAscendant: 'Asc',\n\tLagna: 'La',\n\tNorthNode: '\u260A',\n\tSouthNode: '\u260B',\n\t'North node': '\u260A',\n\t'South node': '\u260B',\n\tChiron: '\u26B7',\n\tLilith: '\u26B8',\n\t'Black moon lilith': '\u26B8',\n};\n\nexport const PLANET_ABBR: Record<string, string> = {\n\tSun: 'Su',\n\tMoon: 'Mo',\n\tMercury: 'Me',\n\tVenus: 'Ve',\n\tMars: 'Ma',\n\tJupiter: 'Ju',\n\tSaturn: 'Sa',\n\tUranus: 'Ur',\n\tNeptune: 'Ne',\n\tPluto: 'Pl',\n\tRahu: 'Ra',\n\tKetu: 'Ke',\n\tAscendant: 'Asc',\n\tLagna: 'La',\n};\n\nexport const SIGN_GLYPH: Record<string, string> = {\n\tAries: '\u2648',\n\tTaurus: '\u2649',\n\tGemini: '\u264A',\n\tCancer: '\u264B',\n\tLeo: '\u264C',\n\tVirgo: '\u264D',\n\tLibra: '\u264E',\n\tScorpio: '\u264F',\n\tSagittarius: '\u2650',\n\tCapricorn: '\u2651',\n\tAquarius: '\u2652',\n\tPisces: '\u2653',\n};\n\nexport const SIGN_ABBR: Record<string, string> = {\n\tAries: 'Ar',\n\tTaurus: 'Ta',\n\tGemini: 'Ge',\n\tCancer: 'Cn',\n\tLeo: 'Le',\n\tVirgo: 'Vi',\n\tLibra: 'Li',\n\tScorpio: 'Sc',\n\tSagittarius: 'Sg',\n\tCapricorn: 'Cp',\n\tAquarius: 'Aq',\n\tPisces: 'Pi',\n};\n\nexport const SIGNS_ORDER = [\n\t'Aries',\n\t'Taurus',\n\t'Gemini',\n\t'Cancer',\n\t'Leo',\n\t'Virgo',\n\t'Libra',\n\t'Scorpio',\n\t'Sagittarius',\n\t'Capricorn',\n\t'Aquarius',\n\t'Pisces',\n] as const;\n\n/**\n * Lowercase rashi keys in canonical zodiac order. Derived from `SIGNS_ORDER`\n * so the two stay in lockstep. The /vedic-astrology/birth-chart response\n * carries planet buckets keyed by these names.\n */\nexport const RASHI_KEYS = SIGNS_ORDER.map((s) =>\n\ts.toLowerCase(),\n) as readonly Lowercase<(typeof SIGNS_ORDER)[number]>[];\n\n/** Aspect symbols. Used by synastry and natal chart aspect tables. */\nexport const ASPECT_SYMBOL: Record<string, string> = {\n\tconjunction: '\u260C',\n\topposition: '\u260D',\n\ttrine: '\u25B3',\n\tsquare: '\u25A1',\n\tsextile: '\u2731',\n\tquincunx: '\u22BB',\n\tsemisextile: '\u22BC',\n};\n\n/** Trigrams used by I Ching hexagrams. Eight trigrams compose 64 hexagrams. */\nexport const TRIGRAM_GLYPH: Record<string, string> = {\n\theaven: '\u2630',\n\tlake: '\u2631',\n\tfire: '\u2632',\n\tthunder: '\u2633',\n\twind: '\u2634',\n\twater: '\u2635',\n\tmountain: '\u2636',\n\tearth: '\u2637',\n\tHeaven: '\u2630',\n\tLake: '\u2631',\n\tFire: '\u2632',\n\tThunder: '\u2633',\n\tWind: '\u2634',\n\tWater: '\u2635',\n\tMountain: '\u2636',\n\tEarth: '\u2637',\n};\n\n/** Moon phase emoji set. Used by moon phase card. */\nexport const MOON_PHASE_EMOJI: Record<string, string> = {\n\t'new moon': '\uD83C\uDF11',\n\t'waxing crescent': '\uD83C\uDF12',\n\t'first quarter': '\uD83C\uDF13',\n\t'waxing gibbous': '\uD83C\uDF14',\n\t'full moon': '\uD83C\uDF15',\n\t'waning gibbous': '\uD83C\uDF16',\n\t'last quarter': '\uD83C\uDF17',\n\t'waning crescent': '\uD83C\uDF18',\n};\n", "import { css } from 'lit';\n\n/**\n * Shared host styles every component pulls in. Sets default font, color,\n * container query support, and the entry fade-in.\n */\nexport const baseStyles = css`\n\t:host {\n\t\tdisplay: block;\n\t\tcontainer-type: inline-size;\n\t\tfont-family: var(\n\t\t\t--roxy-font-sans,\n\t\t\tsystem-ui,\n\t\t\t-apple-system,\n\t\t\tBlinkMacSystemFont,\n\t\t\t'Segoe UI',\n\t\t\tRoboto,\n\t\t\tsans-serif\n\t\t);\n\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\tbackground: transparent;\n\t\tfont-size: var(--roxy-text-base, 1rem);\n\t\tline-height: var(--roxy-leading-normal, 1.5);\n\t\tanimation: roxy-fade-in var(--roxy-motion-duration, 200ms)\n\t\t\tvar(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1)) both;\n\t}\n\n\t*,\n\t*::before,\n\t*::after {\n\t\tbox-sizing: border-box;\n\t}\n\n\t@keyframes roxy-fade-in {\n\t\tfrom {\n\t\t\topacity: 0;\n\t\t\ttransform: translateY(2px);\n\t\t}\n\t\tto {\n\t\t\topacity: 1;\n\t\t\ttransform: translateY(0);\n\t\t}\n\t}\n\n\t@media (prefers-reduced-motion: reduce) {\n\t\t:host {\n\t\t\tanimation: none;\n\t\t}\n\t}\n\n\t.roxy-skeleton {\n\t\tbackground: linear-gradient(\n\t\t\t90deg,\n\t\t\tvar(--roxy-border, #e4e4e7) 0%,\n\t\t\tcolor-mix(in srgb, var(--roxy-border, #e4e4e7) 60%, transparent) 50%,\n\t\t\tvar(--roxy-border, #e4e4e7) 100%\n\t\t);\n\t\tbackground-size: 200% 100%;\n\t\tanimation: roxy-shimmer 1.4s ease-in-out infinite;\n\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t}\n\n\t@keyframes roxy-shimmer {\n\t\t0% {\n\t\t\tbackground-position: 200% 0;\n\t\t}\n\t\t100% {\n\t\t\tbackground-position: -200% 0;\n\t\t}\n\t}\n\n\t@media (prefers-reduced-motion: reduce) {\n\t\t.roxy-skeleton {\n\t\t\tanimation: none;\n\t\t}\n\t}\n\n\t.roxy-empty {\n\t\tpadding: var(--roxy-space-lg, 1.5rem);\n\t\tcolor: var(--roxy-muted, #71717a);\n\t\ttext-align: center;\n\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t}\n\n\t:host(:focus-within) .roxy-card {\n\t\toutline: 2px solid var(--roxy-ring, rgba(245, 158, 11, 0.4));\n\t\toutline-offset: 2px;\n\t}\n`;\n", "import { css, html, LitElement, nothing, svg } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type {\n\tGetCriticalDaysResponse,\n\tGetDailyBiorhythmResponse,\n\tGetForecastResponse,\n} from '../types/index.js';\nimport { baseStyles } from '../utils/base-styles.js';\n\ntype BiorhythmData =\n\t| GetDailyBiorhythmResponse\n\t| GetForecastResponse\n\t| GetCriticalDaysResponse;\n\nconst CYCLE_COLOR: Record<string, string> = {\n\tphysical: '#dc2626',\n\temotional: '#0284c7',\n\tintellectual: '#16a34a',\n\tintuitive: '#a855f7',\n\taesthetic: '#f59e0b',\n\tawareness: '#ec4899',\n\tspiritual: '#14b8a6',\n\tpassion: '#ef4444',\n\tmastery: '#6366f1',\n\twisdom: '#475569',\n};\n\n/**\n * Biorhythm chart. Renders /biorhythm/{daily,forecast,critical-days}.\n */\n@customElement('roxy-biorhythm-chart')\nexport class RoxyBiorhythmChart extends LitElement {\n\tstatic styles = [\n\t\tbaseStyles,\n\t\tcss`\n\t\t\t.wrap {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\t\t\t.head {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\talign-items: center;\n\t\t\t\tflex-wrap: wrap;\n\t\t\t\tgap: var(--roxy-space-sm, 0.5rem);\n\t\t\t}\n\t\t\t.title {\n\t\t\t\tmargin: 0;\n\t\t\t\tfont-size: var(--roxy-text-lg, 1.125rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t}\n\t\t\t.energy {\n\t\t\t\tfont-variant-numeric: tabular-nums;\n\t\t\t\tcolor: var(--roxy-accent-fg, #b45309);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t}\n\t\t\t.bars {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: var(--roxy-space-xs, 0.25rem);\n\t\t\t}\n\t\t\t.bar {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: 8rem 1fr 3.5rem;\n\t\t\t\tgap: var(--roxy-space-sm, 0.5rem);\n\t\t\t\talign-items: center;\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t}\n\t\t\t.track {\n\t\t\t\theight: 14px;\n\t\t\t\tbackground: var(--roxy-border, #e4e4e7);\n\t\t\t\tborder-radius: var(--roxy-radius-full, 9999px);\n\t\t\t\toverflow: hidden;\n\t\t\t\tposition: relative;\n\t\t\t}\n\t\t\t.fill {\n\t\t\t\tdisplay: block;\n\t\t\t\theight: 100%;\n\t\t\t\ttransition:\n\t\t\t\t\twidth var(--roxy-motion-duration, 200ms)\n\t\t\t\t\tvar(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1));\n\t\t\t}\n\t\t\t.value {\n\t\t\t\tfont-variant-numeric: tabular-nums;\n\t\t\t\ttext-align: right;\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t}\n\t\t\t.advice {\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t}\n\t\t\t.alert {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-warning, #ea580c) 12%, transparent);\n\t\t\t\tborder: 1px solid color-mix(in srgb, var(--roxy-warning, #ea580c) 32%, transparent);\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t\tpadding: var(--roxy-space-sm, 0.5rem);\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tmargin: 0;\n\t\t\t}\n\t\t\tsvg {\n\t\t\t\tdisplay: block;\n\t\t\t\twidth: 100%;\n\t\t\t\theight: auto;\n\t\t\t}\n\t\t\t.crit {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-danger, #dc2626) 12%, transparent);\n\t\t\t\tborder-radius: var(--roxy-radius-sm, 4px);\n\t\t\t\tpadding: 4px 8px;\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tdisplay: inline-block;\n\t\t\t\tmargin: 2px;\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\tdata: BiorhythmData | null = null;\n\n\t@property({ type: String, reflect: true })\n\tmode: 'daily' | 'forecast' | 'critical-days' = 'daily';\n\n\trender() {\n\t\tconst d = this.data;\n\t\tif (!d)\n\t\t\treturn html`<div class=\"roxy-empty\" role=\"status\">No biorhythm data</div>`;\n\n\t\tif (this.mode === 'critical-days' && 'criticalDays' in d) {\n\t\t\treturn this.renderCritical(d as GetCriticalDaysResponse);\n\t\t}\n\t\tif (this.mode === 'forecast' && 'days' in d) {\n\t\t\treturn this.renderForecast(d as GetForecastResponse);\n\t\t}\n\t\treturn this.renderDaily(d as GetDailyBiorhythmResponse);\n\t}\n\n\tprivate renderDaily(d: GetDailyBiorhythmResponse) {\n\t\tconst raw = d.quickRead ?? {};\n\t\tconst entries = Object.entries(raw).map(([cycle, value]) => {\n\t\t\tconst v = typeof value === 'number' ? value : 0;\n\t\t\tconst normalized = Math.abs(v) > 1 ? v / 100 : v;\n\t\t\treturn [cycle, normalized] as const;\n\t\t});\n\t\treturn html`<section class=\"wrap\" aria-label=\"Daily biorhythm\">\n\t\t\t<header class=\"head\">\n\t\t\t\t<h2 class=\"title\">Biorhythm</h2>\n\t\t\t\t${\n\t\t\t\t\ttypeof d.energyRating === 'number'\n\t\t\t\t\t\t? html`<span class=\"energy\">Energy ${d.energyRating}/10</span>`\n\t\t\t\t\t\t: nothing\n\t\t\t\t}\n\t\t\t</header>\n\t\t\t<div class=\"bars\" role=\"list\">\n\t\t\t\t${entries.map(([cycle, v]) => {\n\t\t\t\t\tconst pct = ((v + 1) / 2) * 100; // -1..1 -> 0..100\n\t\t\t\t\tconst color = CYCLE_COLOR[cycle] ?? 'var(--roxy-accent, #f59e0b)';\n\t\t\t\t\treturn html`<div class=\"bar\" role=\"listitem\">\n\t\t\t\t\t\t<span style=\"text-transform: capitalize\">${cycle}</span>\n\t\t\t\t\t\t<span class=\"track\">\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclass=\"fill\"\n\t\t\t\t\t\t\t\tstyle=\"width: ${pct}%; background: ${color}\"\n\t\t\t\t\t\t\t></span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span class=\"value\">${Math.round(v * 100)}%</span>\n\t\t\t\t\t</div>`;\n\t\t\t\t})}\n\t\t\t</div>\n\t\t\t${d.dailyMessage ? html`<p class=\"advice\">${d.dailyMessage}</p>` : nothing}\n\t\t\t${d.advice ? html`<p class=\"advice\">${d.advice}</p>` : nothing}\n\t\t</section>`;\n\t}\n\n\tprivate renderForecast(d: GetForecastResponse) {\n\t\tconst days = d.days ?? [];\n\t\tif (days.length === 0)\n\t\t\treturn html`<div class=\"roxy-empty\" role=\"status\">No forecast</div>`;\n\t\tconst w = 600;\n\t\tconst h = 160;\n\t\tconst xStep = w / Math.max(days.length - 1, 1);\n\t\tconst cycleKeys = [\n\t\t\t'physical',\n\t\t\t'emotional',\n\t\t\t'intellectual',\n\t\t\t'intuitive',\n\t\t] as const;\n\t\treturn html`<section class=\"wrap\" aria-label=\"Biorhythm forecast\">\n\t\t\t<header class=\"head\">\n\t\t\t\t<h2 class=\"title\">Forecast</h2>\n\t\t\t\t<span class=\"energy\">${d.startDate} - ${d.endDate}</span>\n\t\t\t</header>\n\t\t\t<svg\n\t\t\t\tviewBox=\"0 0 ${w} ${h}\"\n\t\t\t\trole=\"img\"\n\t\t\t\taria-label=\"Biorhythm cycle lines across the forecast window\"\n\t\t\t>\n\t\t\t\t<title>Biorhythm forecast</title>\n\t\t\t\t<line\n\t\t\t\t\tx1=\"0\"\n\t\t\t\t\ty1=${h / 2}\n\t\t\t\t\tx2=${w}\n\t\t\t\t\ty2=${h / 2}\n\t\t\t\t\tstroke=\"var(--roxy-border, #e4e4e7)\"\n\t\t\t\t\tstroke-width=\"1\"\n\t\t\t\t/>\n\t\t\t\t${cycleKeys.map((cycle) => {\n\t\t\t\t\tconst points = days\n\t\t\t\t\t\t.map((day, i) => {\n\t\t\t\t\t\t\tconst v = day[cycle] ?? 0;\n\t\t\t\t\t\t\tconst x = i * xStep;\n\t\t\t\t\t\t\tconst y = h / 2 - (v / 100) * (h / 2 - 8);\n\t\t\t\t\t\t\treturn `${x.toFixed(2)},${y.toFixed(2)}`;\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.join(' ');\n\t\t\t\t\tconst color = CYCLE_COLOR[cycle] ?? '#475569';\n\t\t\t\t\treturn svg`<polyline points=${points} fill=\"none\" stroke=${color} stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />`;\n\t\t\t\t})}\n\t\t\t</svg>\n\t\t\t${\n\t\t\t\td.summary?.periodAdvice\n\t\t\t\t\t? html`<p class=\"advice\">${d.summary.periodAdvice}</p>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t</section>`;\n\t}\n\n\tprivate renderCritical(d: GetCriticalDaysResponse) {\n\t\treturn html`<section class=\"wrap\" aria-label=\"Critical days\">\n\t\t\t<header class=\"head\">\n\t\t\t\t<h2 class=\"title\">Critical days</h2>\n\t\t\t\t<span class=\"energy\">${d.totalCriticalDays} total</span>\n\t\t\t</header>\n\t\t\t<div>\n\t\t\t\t${d.criticalDays.map(\n\t\t\t\t\t(day) => html`<span class=\"crit\"\n\t\t\t\t\t\t>${day.date} \u00B7 ${day.cycle} ${day.severity}</span\n\t\t\t\t\t>`,\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</section>`;\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'roxy-biorhythm-chart': RoxyBiorhythmChart;\n\t}\n}\n", "import { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { PLANET_GLYPH } from '../tokens/index.js';\nimport type { GetChoghadiyaResponse } from '../types/index.js';\nimport { baseStyles } from '../utils/base-styles.js';\nimport { capitalize } from '../utils/string.js';\n\ntype ChoghadiyaPeriod = GetChoghadiyaResponse['dayChoghadiya'][number];\n\n/**\n * Format an ISO 8601 datetime string to a short local time (HH:MM).\n * Falls back to the raw string when parsing fails.\n */\nfunction fmtTime(iso: string): string {\n\ttry {\n\t\tconst d = new Date(iso);\n\t\tif (Number.isNaN(d.getTime())) return iso;\n\t\treturn d.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\n\t} catch {\n\t\treturn iso;\n\t}\n}\n\n/**\n * Choghadiya muhurta grid. Accepts a GetChoghadiyaResponse and renders\n * 8 daytime and 8 nighttime muhurta tiles in a two-column responsive layout.\n * Good periods are highlighted in green, Bad periods in red.\n */\n@customElement('roxy-choghadiya-grid')\nexport class RoxyChoghadiyaGrid extends LitElement {\n\tstatic styles = [\n\t\tbaseStyles,\n\t\tcss`\n\t\t\t.wrap {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\t\t\t.header {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: var(--roxy-space-xs, 0.25rem);\n\t\t\t}\n\t\t\t.title {\n\t\t\t\tfont-size: var(--roxy-text-lg, 1.125rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tmargin: 0;\n\t\t\t}\n\t\t\t.subtitle {\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tmargin: 0;\n\t\t\t}\n\t\t\t.cho-grid {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: 1fr;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\t\t\t@media (min-width: 720px) {\n\t\t\t\t.cho-grid {\n\t\t\t\t\tgrid-template-columns: 1fr 1fr;\n\t\t\t\t}\n\t\t\t}\n\t\t\t.period-col {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: var(--roxy-space-xs, 0.25rem);\n\t\t\t}\n\t\t\t.period-heading {\n\t\t\t\tfont-size: var(--roxy-text-base, 1rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tmargin: 0 0 var(--roxy-space-xs, 0.25rem);\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t}\n\t\t\t.cho-tile {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: 1fr auto;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 0.25em 0.75em;\n\t\t\t\tpadding: 0.55em 0.85em;\n\t\t\t\tborder: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t}\n\t\t\t.cho-tile.good {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-success, #22c55e) 18%, transparent);\n\t\t\t\tborder-color: color-mix(in srgb, var(--roxy-success, #22c55e) 45%, transparent);\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t}\n\t\t\t.cho-tile.bad {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-danger, #ef4444) 18%, transparent);\n\t\t\t\tborder-color: color-mix(in srgb, var(--roxy-danger, #ef4444) 45%, transparent);\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t}\n\t\t\t.cho-tile.neutral {\n\t\t\t\tbackground: transparent;\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t}\n\t\t\t.tile-name {\n\t\t\t\tfont-size: var(--roxy-text-base, 1rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tgrid-column: 1;\n\t\t\t}\n\t\t\t.tile-time {\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\topacity: 0.8;\n\t\t\t\twhite-space: nowrap;\n\t\t\t\tgrid-column: 2;\n\t\t\t\tgrid-row: 1 / 3;\n\t\t\t\ttext-align: right;\n\t\t\t\talign-self: center;\n\t\t\t}\n\t\t\t.tile-lord {\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\topacity: 0.85;\n\t\t\t\tgrid-column: 1;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 0.25em;\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\tdata: GetChoghadiyaResponse | null = null;\n\n\tprivate renderTile(period: ChoghadiyaPeriod) {\n\t\tconst effectClass =\n\t\t\tperiod.effect === 'Good'\n\t\t\t\t? 'good'\n\t\t\t\t: period.effect === 'Bad'\n\t\t\t\t\t? 'bad'\n\t\t\t\t\t: 'neutral';\n\t\tconst lordGlyph = PLANET_GLYPH[capitalize(period.lord)] ?? '';\n\t\tconst timeRange = `${fmtTime(period.start)} - ${fmtTime(period.end)}`;\n\t\treturn html`<div class=\"cho-tile ${effectClass}\" role=\"listitem\">\n\t\t\t<span class=\"tile-name\">${period.name}</span>\n\t\t\t<span class=\"tile-time\" aria-label=\"Time range\">${timeRange}</span>\n\t\t\t<span class=\"tile-lord\">\n\t\t\t\t${lordGlyph ? html`<span aria-hidden=\"true\">${lordGlyph}</span>` : nothing}\n\t\t\t\t${period.lord}\n\t\t\t</span>\n\t\t</div>`;\n\t}\n\n\trender() {\n\t\tif (!this.data)\n\t\t\treturn html`<div class=\"roxy-empty\" role=\"status\">No choghadiya data</div>`;\n\n\t\tconst { date, dayChoghadiya, nightChoghadiya } = this.data;\n\n\t\treturn html`<div class=\"wrap\">\n\t\t\t<div class=\"header\">\n\t\t\t\t<h2 class=\"title\">Choghadiya</h2>\n\t\t\t\t${date ? html`<p class=\"subtitle\">${date}</p>` : nothing}\n\t\t\t</div>\n\n\t\t\t<div class=\"cho-grid\">\n\t\t\t\t<section class=\"period-col\" aria-label=\"Day muhurta periods\">\n\t\t\t\t\t<h3 class=\"period-heading\">Day</h3>\n\t\t\t\t\t<div role=\"list\" aria-label=\"Daytime choghadiya\">\n\t\t\t\t\t\t${\n\t\t\t\t\t\t\tdayChoghadiya && dayChoghadiya.length > 0\n\t\t\t\t\t\t\t\t? dayChoghadiya.map((p) => this.renderTile(p))\n\t\t\t\t\t\t\t\t: html`<p class=\"roxy-empty\" role=\"status\">No daytime periods</p>`\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t</section>\n\n\t\t\t\t<section class=\"period-col\" aria-label=\"Night muhurta periods\">\n\t\t\t\t\t<h3 class=\"period-heading\">Night</h3>\n\t\t\t\t\t<div role=\"list\" aria-label=\"Nighttime choghadiya\">\n\t\t\t\t\t\t${\n\t\t\t\t\t\t\tnightChoghadiya && nightChoghadiya.length > 0\n\t\t\t\t\t\t\t\t? nightChoghadiya.map((p) => this.renderTile(p))\n\t\t\t\t\t\t\t\t: html`<p class=\"roxy-empty\" role=\"status\">No nighttime periods</p>`\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t</section>\n\t\t\t</div>\n\t\t</div>`;\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'roxy-choghadiya-grid': RoxyChoghadiyaGrid;\n\t}\n}\n", "/**\n * Shared string helpers used across components. Single source of truth so the\n * same formatting rules apply to every key/label/title that surfaces in the\n * shadow tree.\n *\n *  - `capitalize`: title-cases the first character, lowercases the rest. Used\n *    when matching API-supplied planet/sign names against the glyph maps in\n *    `tokens/index.ts`, which use canonical TitleCase keys.\n *  - `humanize`: turns an API key (`birth_date`, `birthDate`, `mahadasha-end`)\n *    into a label suitable for display (\"Birth date\", \"Mahadasha end\").\n */\n\nexport function capitalize(s: string): string {\n\tif (!s) return '';\n\treturn s.charAt(0).toUpperCase() + s.slice(1).toLowerCase();\n}\n\nexport function humanize(s: string): string {\n\treturn s\n\t\t.replace(/[_-]+/g, ' ')\n\t\t.replace(/([a-z])([A-Z])/g, '$1 $2')\n\t\t.replace(/^\\w/, (c) => c.toUpperCase());\n}\n", "import { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type {\n\tCalculateBioCompatibilityResponse,\n\tCalculateCompatibilityResponse,\n\tCalculateNumCompatibilityResponse,\n} from '../types/index.js';\nimport { baseStyles } from '../utils/base-styles.js';\nimport { formatNumber } from '../utils/format.js';\n\ntype CompatibilityData =\n\t| CalculateCompatibilityResponse\n\t| CalculateNumCompatibilityResponse\n\t| CalculateBioCompatibilityResponse;\n\n/**\n * Cross-domain compatibility card. Renders /astrology/compatibility-score,\n * /numerology/compatibility, or /biorhythm/compatibility responses.\n */\n@customElement('roxy-compatibility-card')\nexport class RoxyCompatibilityCard extends LitElement {\n\tstatic styles = [\n\t\tbaseStyles,\n\t\tcss`\n\t\t\t.card {\n\t\t\t\tbackground: var(--roxy-bg, #fff);\n\t\t\t\tborder: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t\tpadding: var(--roxy-space-lg, 1.5rem);\n\t\t\t\tbox-shadow: var(--roxy-shadow-sm);\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\n\t\t\t.head {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: 1fr auto;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\t\t\t.head h2 {\n\t\t\t\tmargin: 0;\n\t\t\t\tfont-size: var(--roxy-text-lg, 1.125rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\ttext-transform: capitalize;\n\t\t\t}\n\n\t\t\t.score {\n\t\t\t\tfont-variant-numeric: tabular-nums;\n\t\t\t\tfont-size: 2rem;\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tcolor: var(--roxy-accent-fg, #b45309);\n\t\t\t\tline-height: 1;\n\t\t\t}\n\t\t\t.rating {\n\t\t\t\tcolor: var(--roxy-secondary, #475569);\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t}\n\n\t\t\t.bar-row {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: 8rem 1fr 3.5rem;\n\t\t\t\tgap: var(--roxy-space-sm, 0.5rem);\n\t\t\t\talign-items: center;\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t}\n\t\t\t.bar {\n\t\t\t\theight: 8px;\n\t\t\t\tbackground: var(--roxy-border, #e4e4e7);\n\t\t\t\tborder-radius: var(--roxy-radius-full, 9999px);\n\t\t\t\toverflow: hidden;\n\t\t\t}\n\t\t\t.bar > span {\n\t\t\t\tdisplay: block;\n\t\t\t\theight: 100%;\n\t\t\t\tbackground: var(--roxy-accent, #f59e0b);\n\t\t\t\ttransition:\n\t\t\t\t\twidth var(--roxy-motion-duration, 200ms)\n\t\t\t\t\tvar(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1));\n\t\t\t}\n\t\t\t.bar-row > span:last-child {\n\t\t\t\tfont-variant-numeric: tabular-nums;\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\ttext-align: right;\n\t\t\t}\n\n\t\t\t.archetype {\n\t\t\t\tcolor: var(--roxy-accent-fg, #b45309);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t}\n\n\t\t\t.lists {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\t\t\t.lists h3 {\n\t\t\t\tmargin: 0 0 var(--roxy-space-xs, 0.25rem);\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tletter-spacing: 0.06em;\n\t\t\t}\n\t\t\t.lists ul {\n\t\t\t\tmargin: 0;\n\t\t\t\tpadding-left: var(--roxy-space-md, 1rem);\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\tdata: CompatibilityData | null = null;\n\n\t@property({ type: String, reflect: true })\n\tmode: 'astrology' | 'numerology' | 'biorhythm' = 'astrology';\n\n\tprivate getBreakdown(): Record<string, number> {\n\t\tconst d = this.data;\n\t\tif (!d) return {};\n\t\tif ('categories' in d && d.categories) {\n\t\t\tconst out: Record<string, number> = {};\n\t\t\tfor (const [k, v] of Object.entries(d.categories)) {\n\t\t\t\tif (typeof v === 'number' && Number.isFinite(v)) out[k] = v;\n\t\t\t}\n\t\t\treturn out;\n\t\t}\n\t\treturn {};\n\t}\n\n\trender() {\n\t\tconst d = this.data;\n\t\tif (!d)\n\t\t\treturn html`<div class=\"roxy-empty\" role=\"status\">No compatibility data</div>`;\n\n\t\tconst score = d.overallScore;\n\t\tconst breakdown = this.getBreakdown();\n\t\tconst rating =\n\t\t\t'rating' in d\n\t\t\t\t? (d as CalculateNumCompatibilityResponse).rating\n\t\t\t\t: undefined;\n\t\tconst archetype =\n\t\t\t'archetype' in d\n\t\t\t\t? (d as CalculateCompatibilityResponse).archetype\n\t\t\t\t: undefined;\n\t\tconst advice =\n\t\t\t'advice' in d\n\t\t\t\t? (d as CalculateNumCompatibilityResponse).advice\n\t\t\t\t: undefined;\n\t\tconst summary =\n\t\t\t'summary' in d\n\t\t\t\t? (d as CalculateCompatibilityResponse).summary\n\t\t\t\t: undefined;\n\t\tconst interpretation =\n\t\t\t'interpretation' in d\n\t\t\t\t? (d as CalculateCompatibilityResponse).interpretation\n\t\t\t\t: undefined;\n\t\tconst strengths = 'strengths' in d ? d.strengths : undefined;\n\t\tconst challenges = 'challenges' in d ? d.challenges : undefined;\n\t\tconst keyAspects =\n\t\t\t'keyAspects' in d\n\t\t\t\t? (d as CalculateCompatibilityResponse).keyAspects\n\t\t\t\t: undefined;\n\n\t\treturn html`<article\n\t\t\tclass=\"card\"\n\t\t\taria-label=${`Compatibility (${this.mode})`}\n\t\t>\n\t\t\t<div class=\"head\">\n\t\t\t\t<h2>${this.mode} compatibility</h2>\n\t\t\t\t<div>\n\t\t\t\t\t${\n\t\t\t\t\t\ttypeof score === 'number'\n\t\t\t\t\t\t\t? html`<div class=\"score\">${formatNumber(score, 0)}</div>`\n\t\t\t\t\t\t\t: nothing\n\t\t\t\t\t}\n\t\t\t\t\t${rating ? html`<div class=\"rating\">${rating}</div>` : nothing}\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t${\n\t\t\t\tObject.keys(breakdown).length > 0\n\t\t\t\t\t? html`<div role=\"list\">\n\t\t\t\t\t\t${Object.entries(breakdown).map(\n\t\t\t\t\t\t\t([k, v]) => html`<div class=\"bar-row\" role=\"listitem\">\n\t\t\t\t\t\t\t\t<span style=\"text-transform: capitalize\">${k}</span>\n\t\t\t\t\t\t\t\t<span class=\"bar\"\n\t\t\t\t\t\t\t\t\t><span style=\"width: ${Math.max(0, Math.min(100, v))}%\"></span\n\t\t\t\t\t\t\t\t></span>\n\t\t\t\t\t\t\t\t<span>${formatNumber(v, 0)}</span>\n\t\t\t\t\t\t\t</div>`,\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t\t${\n\t\t\t\tarchetype\n\t\t\t\t\t? html`<p>\n\t\t\t\t\t\t<span class=\"archetype\">${archetype.label}</span>\n\t\t\t\t\t\t${archetype.description ? html` \u00B7 ${archetype.description}` : nothing}\n\t\t\t\t\t</p>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t\t${summary ? html`<p>${summary}</p>` : nothing}\n\t\t\t${interpretation && !summary ? html`<p>${interpretation}</p>` : nothing}\n\t\t\t${advice ? html`<p>${advice}</p>` : nothing}\n\t\t\t${\n\t\t\t\t(strengths?.length ?? 0) > 0 || (challenges?.length ?? 0) > 0\n\t\t\t\t\t? html`<div class=\"lists\">\n\t\t\t\t\t\t${\n\t\t\t\t\t\t\tstrengths?.length\n\t\t\t\t\t\t\t\t? html`<div>\n\t\t\t\t\t\t\t\t\t<h3>Strengths</h3>\n\t\t\t\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t\t\t\t${strengths.map((s) => html`<li>${s}</li>`)}\n\t\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t\t</div>`\n\t\t\t\t\t\t\t\t: nothing\n\t\t\t\t\t\t}\n\t\t\t\t\t\t${\n\t\t\t\t\t\t\tchallenges?.length\n\t\t\t\t\t\t\t\t? html`<div>\n\t\t\t\t\t\t\t\t\t<h3>Challenges</h3>\n\t\t\t\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t\t\t\t${challenges.map((s) => html`<li>${s}</li>`)}\n\t\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t\t</div>`\n\t\t\t\t\t\t\t\t: nothing\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t\t${\n\t\t\t\tkeyAspects?.length\n\t\t\t\t\t? html`<div>\n\t\t\t\t\t\t<h3 style=\"margin: 0 0 0.25rem; font-size: var(--roxy-text-xs); color: var(--roxy-muted); text-transform: uppercase; letter-spacing: 0.06em;\">Key aspects</h3>\n\t\t\t\t\t\t<ul style=\"margin: 0; padding-left: 1rem; font-size: var(--roxy-text-sm);\">\n\t\t\t\t\t\t\t${keyAspects.slice(0, 6).map((a) => html`<li>${formatAspect(a)}</li>`)}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</div>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t</article>`;\n\t}\n}\n\ntype KeyAspect = CalculateCompatibilityResponse extends {\n\tkeyAspects: Array<infer T>;\n}\n\t? T\n\t: never;\n\nfunction formatAspect(a: KeyAspect): string {\n\tconst aspect = a.type.toLowerCase().replace(/_/g, '-');\n\tconst orb =\n\t\ttypeof a.orb === 'number' ? ` (orb ${formatNumber(a.orb, 1)}\u00B0)` : '';\n\tconst head = [a.planet1, aspect, a.planet2].filter(Boolean).join(' ');\n\treturn a.description ? `${head}${orb} \u00B7 ${a.description}` : `${head}${orb}`;\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'roxy-compatibility-card': RoxyCompatibilityCard;\n\t}\n}\n", "/**\n * Display formatters for ISO timestamps and floats coming back from the API.\n * Every helper returns \"\" for nullish or unparseable input so it falls out of\n * template literals cleanly.\n */\n\nexport function formatTime(input: unknown): string {\n\tif (typeof input !== 'string' || input.length === 0) return '';\n\tif (/^\\d{4}-\\d{2}-\\d{2}$/.test(input)) return '';\n\tconst bareTime = /^\\d{2}:\\d{2}(:\\d{2})?$/.test(input);\n\tconst iso = bareTime ? `1970-01-01T${input}` : input;\n\tconst d = new Date(iso);\n\tif (Number.isNaN(d.getTime())) return input;\n\treturn d.toLocaleTimeString(undefined, {\n\t\thour: 'numeric',\n\t\tminute: '2-digit',\n\t\thour12: true,\n\t});\n}\n\nexport function formatDate(input: unknown): string {\n\tif (typeof input !== 'string' || input.length === 0) return '';\n\tconst d = new Date(\n\t\t/^\\d{4}-\\d{2}-\\d{2}$/.test(input) ? `${input}T00:00:00` : input,\n\t);\n\tif (Number.isNaN(d.getTime())) return input;\n\treturn d.toLocaleDateString(undefined, {\n\t\tmonth: 'short',\n\t\tday: 'numeric',\n\t\tyear: 'numeric',\n\t});\n}\n\nexport function formatTimeRange(\n\tt: { start?: string; end?: string } | undefined,\n): string {\n\tif (!t) return '';\n\tconst start = formatTime(t.start);\n\tconst end = formatTime(t.end);\n\tif (start && end) return `${start} - ${end}`;\n\treturn start || end || '';\n}\n\nexport function formatNumber(value: unknown, dp = 1): string {\n\tif (typeof value !== 'number' || !Number.isFinite(value)) return '';\n\treturn value.toFixed(dp).replace(/\\.?0+$/, '');\n}\n\nexport function formatPercent(value: unknown, dp = 1): string {\n\tconst n = formatNumber(value, dp);\n\treturn n ? `${n}%` : '';\n}\n\n/**\n * CSS class name per aspect type. Used by natal and synastry chart aspect\n * lines so the same color encoding (harmonious vs challenging) applies in\n * both wheels. Keys are lowercase canonical names, values are CSS class\n * suffixes the chart components define in their `:host` styles.\n */\nexport const ASPECT_CLASS: Record<string, string> = {\n\tconjunction: 'aspect-conjunction',\n\tsextile: 'aspect-sextile',\n\tsquare: 'aspect-square',\n\ttrine: 'aspect-trine',\n\topposition: 'aspect-opposition',\n};\n\n/**\n * Normalize an aspect entry's `type` field to a lowercase, hyphen-separated\n * canonical name (`SEMI_SEXTILE` \u2192 `semi-sextile`). Accepts any aspect-shaped\n * object so both natal and synastry inter-aspect entries can share this.\n */\nexport function normalizeAspect(a: { type?: string }): string {\n\treturn (a.type ?? '').toLowerCase().replace(/_/g, '-');\n}\n", "import { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type {\n\tGetCurrentDashaResponse,\n\tGetMajorDashasResponse,\n\tGetSubDashasResponse,\n} from '../types/index.js';\nimport { baseStyles } from '../utils/base-styles.js';\nimport { formatNumber } from '../utils/format.js';\n\ntype DashaData =\n\t| GetCurrentDashaResponse\n\t| GetMajorDashasResponse\n\t| GetSubDashasResponse;\n\ntype DashaPeriod = {\n\tplanet: string;\n\tstartDate: string;\n\tendDate: string;\n\tdurationYears: number;\n\tinterpretation?: string;\n};\n\n/**\n * Dasha timeline. Renders /vedic-astrology/dasha/{current,major,sub/{...}}.\n * Default mode shows the active mahadasha + antardasha + pratyantardasha.\n * Switch to period=\"major\" for the full 120-year Vimshottari timeline.\n */\n@customElement('roxy-dasha-timeline')\nexport class RoxyDashaTimeline extends LitElement {\n\tstatic styles = [\n\t\tbaseStyles,\n\t\tcss`\n\t\t\t.wrap {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\t\t\t.head {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\talign-items: center;\n\t\t\t\tflex-wrap: wrap;\n\t\t\t\tgap: var(--roxy-space-sm, 0.5rem);\n\t\t\t}\n\t\t\t.title {\n\t\t\t\tmargin: 0;\n\t\t\t\tfont-size: var(--roxy-text-lg, 1.125rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t}\n\t\t\t.nakshatra {\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t}\n\n\t\t\t.current {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: repeat(auto-fit, minmax(10rem, 1fr));\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t\tbackground: var(--roxy-bg, #fff);\n\t\t\t\tborder: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t\tpadding: var(--roxy-space-md, 1rem);\n\t\t\t\tbox-shadow: var(--roxy-shadow-sm);\n\t\t\t}\n\t\t\t.current div span:first-child {\n\t\t\t\tdisplay: block;\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tletter-spacing: 0.06em;\n\t\t\t}\n\t\t\t.current div strong {\n\t\t\t\tfont-size: var(--roxy-text-base, 1rem);\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t}\n\n\t\t\t.timeline {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: var(--roxy-space-xs, 0.25rem);\n\t\t\t}\n\t\t\t.bar {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: 5rem 1fr 8rem;\n\t\t\t\tgap: var(--roxy-space-sm, 0.5rem);\n\t\t\t\talign-items: center;\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t}\n\t\t\t.bar-track {\n\t\t\t\theight: 14px;\n\t\t\t\tbackground: var(--roxy-border, #e4e4e7);\n\t\t\t\tborder-radius: var(--roxy-radius-full, 9999px);\n\t\t\t\toverflow: hidden;\n\t\t\t}\n\t\t\t.bar-track > span {\n\t\t\t\tdisplay: block;\n\t\t\t\theight: 100%;\n\t\t\t\tbackground: var(--roxy-accent, #f59e0b);\n\t\t\t\ttransition:\n\t\t\t\t\twidth var(--roxy-motion-duration, 200ms)\n\t\t\t\t\tvar(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1));\n\t\t\t}\n\t\t\t.dates {\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tfont-variant-numeric: tabular-nums;\n\t\t\t\ttext-align: right;\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\tdata: DashaData | null = null;\n\n\t@property({ type: String, reflect: true })\n\tperiod: 'current' | 'major' | 'sub' = 'current';\n\n\trender() {\n\t\tconst d = this.data;\n\t\tif (!d)\n\t\t\treturn html`<div class=\"roxy-empty\" role=\"status\">No dasha data</div>`;\n\n\t\tconst periods = this.collectPeriods(d);\n\t\tconst maxYears = periods.length\n\t\t\t? Math.max(...periods.map((p) => p.durationYears))\n\t\t\t: 0;\n\n\t\treturn html`<div class=\"wrap\" aria-label=\"Dasha timeline\">\n\t\t\t<header class=\"head\">\n\t\t\t\t<h2 class=\"title\">\n\t\t\t\t\t${\n\t\t\t\t\t\tthis.period === 'major'\n\t\t\t\t\t\t\t? 'Vimshottari Mahadasha'\n\t\t\t\t\t\t\t: this.period === 'sub'\n\t\t\t\t\t\t\t\t? 'Antardasha'\n\t\t\t\t\t\t\t\t: 'Active dashas'\n\t\t\t\t\t}\n\t\t\t\t</h2>\n\t\t\t\t${\n\t\t\t\t\t'nakshatraName' in d && d.nakshatraName\n\t\t\t\t\t\t? html`<div class=\"nakshatra\">\n\t\t\t\t\t\tMoon nakshatra: ${d.nakshatraName}\n\t\t\t\t\t\t${'nakshatraLord' in d && d.nakshatraLord ? html`(lord ${d.nakshatraLord})` : nothing}\n\t\t\t\t\t</div>`\n\t\t\t\t\t\t: nothing\n\t\t\t\t}\n\t\t\t</header>\n\n\t\t\t${this.period === 'current' ? this.renderCurrent(d) : nothing}\n\t\t\t${\n\t\t\t\tperiods.length > 0\n\t\t\t\t\t? html`<div class=\"timeline\" role=\"list\">\n\t\t\t\t\t\t${periods.map((p) => this.renderBar(p, maxYears))}\n\t\t\t\t\t</div>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t</div>`;\n\t}\n\n\tprivate renderCurrent(d: DashaData) {\n\t\tif (!('mahadasha' in d)) return nothing;\n\t\treturn html`<div class=\"current\">\n\t\t\t${\n\t\t\t\t'mahadasha' in d && d.mahadasha\n\t\t\t\t\t? html`<div>\n\t\t\t\t\t<span>Mahadasha</span>\n\t\t\t\t\t<strong>${d.mahadasha.planet}</strong>\n\t\t\t\t\t${\n\t\t\t\t\t\t'remainingInMahadasha' in d && d.remainingInMahadasha\n\t\t\t\t\t\t\t? html`<small>${formatNumber(d.remainingInMahadasha.years + d.remainingInMahadasha.months / 12, 1)} years left</small>`\n\t\t\t\t\t\t\t: nothing\n\t\t\t\t\t}\n\t\t\t\t</div>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t\t${\n\t\t\t\t'antardasha' in d && d.antardasha\n\t\t\t\t\t? html`<div>\n\t\t\t\t\t<span>Antardasha</span>\n\t\t\t\t\t<strong>${d.antardasha.planet}</strong>\n\t\t\t\t\t${\n\t\t\t\t\t\t'remainingInAntardasha' in d && d.remainingInAntardasha\n\t\t\t\t\t\t\t? html`<small>${formatNumber(d.remainingInAntardasha.years + d.remainingInAntardasha.months / 12, 1)} years left</small>`\n\t\t\t\t\t\t\t: nothing\n\t\t\t\t\t}\n\t\t\t\t</div>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t\t${\n\t\t\t\t'pratyantardasha' in d && d.pratyantardasha\n\t\t\t\t\t? html`<div>\n\t\t\t\t\t<span>Pratyantardasha</span>\n\t\t\t\t\t<strong>${d.pratyantardasha.planet}</strong>\n\t\t\t\t\t${\n\t\t\t\t\t\t'remainingInPratyantardasha' in d && d.remainingInPratyantardasha\n\t\t\t\t\t\t\t? html`<small>${formatNumber(d.remainingInPratyantardasha.years + d.remainingInPratyantardasha.months / 12, 1)} years left</small>`\n\t\t\t\t\t\t\t: nothing\n\t\t\t\t\t}\n\t\t\t\t</div>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t</div>`;\n\t}\n\n\tprivate collectPeriods(d: DashaData): DashaPeriod[] {\n\t\tif ('mahadashas' in d && d.mahadashas?.length) return d.mahadashas;\n\t\tif ('antardashas' in d && d.antardashas?.length) return d.antardashas;\n\t\treturn [];\n\t}\n\n\tprivate renderBar(p: DashaPeriod, max: number) {\n\t\tconst years = p.durationYears;\n\t\tconst width = max > 0 ? (years / max) * 100 : 0;\n\t\treturn html`<div class=\"bar\" role=\"listitem\">\n\t\t\t<span>${p.planet}</span>\n\t\t\t<span class=\"bar-track\"><span style=\"width: ${width}%\"></span></span>\n\t\t\t<span class=\"dates\">\n\t\t\t\t${p.startDate ? formatYear(p.startDate) : ''}\n\t\t\t\t${p.endDate ? html`- ${formatYear(p.endDate)}` : ''}\n\t\t\t</span>\n\t\t</div>`;\n\t}\n}\n\nfunction formatYear(s: string): string {\n\tconst m = s.match(/^(\\d{4})/);\n\treturn m ? m[1] : s;\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'roxy-dasha-timeline': RoxyDashaTimeline;\n\t}\n}\n", "import { css, html, LitElement, nothing, type TemplateResult } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { baseStyles } from '../utils/base-styles.js';\nimport { humanize } from '../utils/string.js';\n\n/**\n * Generic fallback renderer. Accepts ANY OpenAPI response shape and renders\n * it via field-name heuristics so future spec additions render reasonably\n * without hand-wired components.\n *\n * Heuristic order:\n *   1. Primitive (string, number, boolean) -> single line.\n *   2. Array of primitives -> chip list.\n *   3. Array of objects with shared keys -> table.\n *   4. Object with title-like field -> card with key/value rows.\n *   5. Otherwise -> definition list of all keys.\n *\n * When a schema declares an `x-roxy-ui` hint, a future dispatcher can opt\n * into a hand-tuned component instead of this fallback.\n */\n\ntype Json = string | number | boolean | null | Json[] | { [key: string]: Json };\n\nconst TITLE_KEYS = ['title', 'name', 'label', 'heading', 'overview', 'summary'];\nconst IMAGE_KEYS = ['imageUrl', 'image', 'icon', 'symbol'];\nconst SKIP_KEYS = ['imageUrl', 'image']; // rendered separately, not in body rows\n\n// Hard cap on recursion. Real RoxyAPI responses nest at most 5-6 deep; anything\n// deeper is either a circular reference (which would otherwise infinite-loop)\n// or a payload too rich for the generic fallback to render usefully. The\n// recursion is otherwise safe: <roxy-data> is registered globally by its\n// `@customElement` decorator on import, so the nested template resolves to\n// this same class without a separate import.\nconst MAX_DEPTH = 6;\n\n@customElement('roxy-data')\nexport class RoxyData extends LitElement {\n\tstatic styles = [\n\t\tbaseStyles,\n\t\tcss`\n\t\t\t.roxy-card {\n\t\t\t\tbackground: var(--roxy-bg, #fff);\n\t\t\t\tborder: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t\tpadding: var(--roxy-space-md, 1rem);\n\t\t\t\tbox-shadow: var(--roxy-shadow-sm);\n\t\t\t}\n\n\t\t\t.roxy-title {\n\t\t\t\tfont-size: var(--roxy-text-lg, 1.125rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tmargin: 0 0 var(--roxy-space-sm, 0.5rem) 0;\n\t\t\t\tcolor: var(--roxy-primary, #0f172a);\n\t\t\t\tletter-spacing: var(--roxy-tracking-tight);\n\t\t\t}\n\n\t\t\t.roxy-summary {\n\t\t\t\tcolor: var(--roxy-secondary, #475569);\n\t\t\t\tmargin: 0 0 var(--roxy-space-md, 1rem) 0;\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t}\n\n\t\t\tdl.roxy-rows {\n\t\t\t\tmargin: 0;\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: minmax(8ch, max-content) 1fr;\n\t\t\t\tgap: var(--roxy-space-xs, 0.25rem) var(--roxy-space-md, 1rem);\n\t\t\t}\n\t\t\tdl.roxy-rows dt {\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\ttext-transform: capitalize;\n\t\t\t}\n\t\t\tdl.roxy-rows dd {\n\t\t\t\tmargin: 0;\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tword-break: break-word;\n\t\t\t}\n\n\t\t\tul.roxy-chips {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-wrap: wrap;\n\t\t\t\tgap: var(--roxy-space-xs, 0.25rem);\n\t\t\t\tpadding: 0;\n\t\t\t\tmargin: 0;\n\t\t\t\tlist-style: none;\n\t\t\t}\n\t\t\tul.roxy-chips li {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-accent, #f59e0b) 14%, transparent);\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t\tpadding: 2px 8px;\n\t\t\t\tborder-radius: var(--roxy-radius-full, 9999px);\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t}\n\n\t\t\ttable.roxy-table {\n\t\t\t\twidth: 100%;\n\t\t\t\tborder-collapse: collapse;\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t}\n\t\t\ttable.roxy-table th,\n\t\t\ttable.roxy-table td {\n\t\t\t\tborder-bottom: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tpadding: var(--roxy-space-sm, 0.5rem);\n\t\t\t\ttext-align: left;\n\t\t\t\ttext-transform: none;\n\t\t\t}\n\t\t\ttable.roxy-table th {\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\ttext-transform: capitalize;\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tletter-spacing: 0.04em;\n\t\t\t}\n\n\t\t\t.roxy-image {\n\t\t\t\tmax-width: 100%;\n\t\t\t\theight: auto;\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t\tmargin-bottom: var(--roxy-space-md, 1rem);\n\t\t\t}\n\n\t\t\t.roxy-section {\n\t\t\t\tmargin-bottom: var(--roxy-space-md, 1rem);\n\t\t\t}\n\t\t\t.roxy-section h4 {\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tcolor: var(--roxy-secondary, #475569);\n\t\t\t\tmargin: 0 0 var(--roxy-space-xs, 0.25rem) 0;\n\t\t\t\ttext-transform: capitalize;\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\tdata: Json = null;\n\n\t/**\n\t * Internal recursion depth. Nested <roxy-data> instances inherit this from\n\t * the parent and increment to guard against circular references in the\n\t * input. Not part of the public API; do not set from consumer code.\n\t */\n\t@property({ attribute: false })\n\tdepth = 0;\n\n\trender() {\n\t\tif (this.data == null) {\n\t\t\treturn html`<div class=\"roxy-empty\" role=\"status\">No data</div>`;\n\t\t}\n\t\tif (this.depth >= MAX_DEPTH) {\n\t\t\treturn html`<div class=\"roxy-empty\" role=\"status\">\u2026</div>`;\n\t\t}\n\t\treturn html`<div\n\t\t\tclass=\"roxy-card\"\n\t\t\taria-label=\"Generic data display\"\n\t\t>\n\t\t\t${this.renderValue(this.data)}\n\t\t</div>`;\n\t}\n\n\tprivate renderValue(value: Json): TemplateResult | typeof nothing {\n\t\tif (value === null || value === undefined) return nothing;\n\t\tif (typeof value === 'string') return html`<p>${value}</p>`;\n\t\tif (typeof value === 'number' || typeof value === 'boolean') {\n\t\t\treturn html`<p>${String(value)}</p>`;\n\t\t}\n\t\tif (Array.isArray(value)) return this.renderArray(value);\n\t\treturn this.renderObject(value as Record<string, Json>);\n\t}\n\n\tprivate renderArray(arr: Json[]): TemplateResult {\n\t\tif (arr.length === 0) {\n\t\t\treturn html`<div class=\"roxy-empty\" role=\"status\">Empty list</div>`;\n\t\t}\n\t\tconst allPrimitive = arr.every(\n\t\t\t(v) => v === null || ['string', 'number', 'boolean'].includes(typeof v),\n\t\t);\n\t\tif (allPrimitive) {\n\t\t\treturn html`<ul class=\"roxy-chips\">\n\t\t\t\t${arr.map((v) => html`<li>${String(v)}</li>`)}\n\t\t\t</ul>`;\n\t\t}\n\t\tconst allObjects = arr.every(\n\t\t\t(v) => v !== null && typeof v === 'object' && !Array.isArray(v),\n\t\t);\n\t\tif (allObjects) return this.renderTable(arr as Record<string, Json>[]);\n\t\treturn html`<ol>\n\t\t\t${arr.map((v) => html`<li>${this.renderValue(v)}</li>`)}\n\t\t</ol>`;\n\t}\n\n\tprivate renderTable(rows: Record<string, Json>[]): TemplateResult {\n\t\tconst keys = this.collectKeys(rows);\n\t\treturn html`<table class=\"roxy-table\" role=\"table\">\n\t\t\t<thead>\n\t\t\t\t<tr>\n\t\t\t\t\t${keys.map((k) => html`<th>${humanize(k)}</th>`)}\n\t\t\t\t</tr>\n\t\t\t</thead>\n\t\t\t<tbody>\n\t\t\t\t${rows.map(\n\t\t\t\t\t(row) => html`<tr>\n\t\t\t\t\t\t${keys.map((k) => html`<td>${this.formatPrimitive(row[k])}</td>`)}\n\t\t\t\t\t</tr>`,\n\t\t\t\t)}\n\t\t\t</tbody>\n\t\t</table>`;\n\t}\n\n\tprivate renderObject(obj: Record<string, Json>): TemplateResult {\n\t\tconst titleKey = TITLE_KEYS.find((k) => typeof obj[k] === 'string');\n\t\tconst imageKey = IMAGE_KEYS.find(\n\t\t\t(k) =>\n\t\t\t\ttypeof obj[k] === 'string' && (obj[k] as string).startsWith('http'),\n\t\t);\n\t\tconst summaryKey =\n\t\t\ttitleKey !== 'summary' && typeof obj.summary === 'string'\n\t\t\t\t? 'summary'\n\t\t\t\t: null;\n\t\tconst rows = Object.entries(obj).filter(\n\t\t\t([k, v]) =>\n\t\t\t\tk !== titleKey &&\n\t\t\t\tk !== summaryKey &&\n\t\t\t\t!SKIP_KEYS.includes(k) &&\n\t\t\t\tv !== null &&\n\t\t\t\tv !== undefined,\n\t\t);\n\n\t\treturn html`\n\t\t\t${\n\t\t\t\timageKey\n\t\t\t\t\t? html`<img\n\t\t\t\t\t\tclass=\"roxy-image\"\n\t\t\t\t\t\tsrc=${String(obj[imageKey])}\n\t\t\t\t\t\talt=${titleKey ? String(obj[titleKey]) : 'illustration'}\n\t\t\t\t\t\tloading=\"lazy\"\n\t\t\t\t\t/>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t\t${titleKey ? html`<h3 class=\"roxy-title\">${obj[titleKey]}</h3>` : nothing}\n\t\t\t${summaryKey ? html`<p class=\"roxy-summary\">${obj[summaryKey]}</p>` : nothing}\n\t\t\t${\n\t\t\t\trows.length > 0\n\t\t\t\t\t? html`<dl class=\"roxy-rows\">\n\t\t\t\t\t\t${rows.map(\n\t\t\t\t\t\t\t([k, v]) => html`\n\t\t\t\t\t\t\t\t<dt>${humanize(k)}</dt>\n\t\t\t\t\t\t\t\t<dd>${this.renderField(v)}</dd>\n\t\t\t\t\t\t\t`,\n\t\t\t\t\t\t)}\n\t\t\t\t\t</dl>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t`;\n\t}\n\n\tprivate renderField(value: Json): TemplateResult | string {\n\t\tif (value === null || value === undefined) return '';\n\t\tif (typeof value === 'string') return value;\n\t\tif (typeof value === 'number' || typeof value === 'boolean')\n\t\t\treturn String(value);\n\t\tif (Array.isArray(value)) {\n\t\t\tconst allPrimitive = value.every((v) =>\n\t\t\t\t['string', 'number', 'boolean'].includes(typeof v),\n\t\t\t);\n\t\t\tif (allPrimitive) {\n\t\t\t\treturn html`<ul class=\"roxy-chips\">\n\t\t\t\t\t${value.map((v) => html`<li>${String(v)}</li>`)}\n\t\t\t\t</ul>`;\n\t\t\t}\n\t\t}\n\t\treturn html`<roxy-data .data=${value} .depth=${this.depth + 1}></roxy-data>`;\n\t}\n\n\tprivate formatPrimitive(value: Json | undefined): string {\n\t\tif (value === null || value === undefined) return '';\n\t\tif (typeof value === 'string') return value;\n\t\tif (typeof value === 'number' || typeof value === 'boolean')\n\t\t\treturn String(value);\n\t\tif (Array.isArray(value)) return value.map(String).join(', ');\n\t\treturn JSON.stringify(value);\n\t}\n\n\tprivate collectKeys(rows: Record<string, Json>[]): string[] {\n\t\tconst seen = new Set<string>();\n\t\tfor (const row of rows) {\n\t\t\tfor (const k of Object.keys(row)) seen.add(k);\n\t\t}\n\t\treturn Array.from(seen);\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'roxy-data': RoxyData;\n\t}\n}\n", "import { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { PLANET_GLYPH, RASHI_KEYS } from '../tokens/index.js';\nimport type { DivisionalChartResponse } from '../types/index.js';\nimport { baseStyles } from '../utils/base-styles.js';\nimport type { HouseDef } from '../utils/kundli-render.js';\nimport {\n\tRASHI_TO_SIGN,\n\trenderNorthFrame,\n\trenderNorthHouseGroup,\n\trenderSouthFrame,\n\trenderSouthHouseGroup,\n} from '../utils/kundli-render.js';\n\ntype RashiBucket = {\n\trashi?: string;\n\tsigns?: Array<{ graha: string; isRetrograde?: boolean }>;\n};\ntype ChartByRashi = { [key: string]: RashiBucket | unknown };\n\n/**\n * Divisional chart renderer (D2-D60). Accepts a DivisionalChartResponse and\n * renders the same south/north kundli wheel as the birth chart, plus division\n * metadata and Vargottama planet pills.\n */\n@customElement('roxy-divisional-chart')\nexport class RoxyDivisionalChart extends LitElement {\n\tstatic styles = [\n\t\tbaseStyles,\n\t\tcss`\n\t\t\t.wrap {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\t\t\t.header {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: var(--roxy-space-xs, 0.25rem);\n\t\t\t}\n\t\t\t.title {\n\t\t\t\tfont-size: var(--roxy-text-lg, 1.125rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tmargin: 0;\n\t\t\t}\n\t\t\t.division-meta {\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tmargin: 0;\n\t\t\t}\n\t\t\t.significance {\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tborder-left: 2px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tpadding-left: var(--roxy-space-sm, 0.5rem);\n\t\t\t\tmargin: 0;\n\t\t\t}\n\t\t\tsvg {\n\t\t\t\tdisplay: block;\n\t\t\t\twidth: 100%;\n\t\t\t\tmax-width: 360px;\n\t\t\t\tmargin: 0 auto;\n\t\t\t}\n\t\t\t.line {\n\t\t\t\tfill: transparent;\n\t\t\t\tstroke: var(--roxy-border, #e4e4e7);\n\t\t\t}\n\t\t\t.sign-text {\n\t\t\t\tfill: var(--roxy-muted, #71717a);\n\t\t\t\tfont-size: 9px;\n\t\t\t\tfont-weight: 500;\n\t\t\t\tfont-family: var(--roxy-font-sans);\n\t\t\t}\n\t\t\t.planet-text {\n\t\t\t\tfill: var(--roxy-fg, #0a0a0a);\n\t\t\t\tfont-size: 11px;\n\t\t\t\tfont-weight: 600;\n\t\t\t\tfont-family: var(--roxy-font-sans);\n\t\t\t}\n\t\t\t.house-num {\n\t\t\t\tfill: var(--roxy-muted, #71717a);\n\t\t\t\tfont-size: 9px;\n\t\t\t\tfont-weight: 400;\n\t\t\t\tfont-family: var(--roxy-font-sans);\n\t\t\t}\n\t\t\t.lagna-marker {\n\t\t\t\tfill: var(--roxy-accent-fg, #b45309);\n\t\t\t\tfont-size: 8px;\n\t\t\t\tfont-weight: 700;\n\t\t\t\tfont-family: var(--roxy-font-sans);\n\t\t\t\tletter-spacing: 0.05em;\n\t\t\t}\n\t\t\t.lagna-bg {\n\t\t\t\tfill: color-mix(in srgb, var(--roxy-accent, #f59e0b) 12%, transparent);\n\t\t\t\tstroke: color-mix(in srgb, var(--roxy-accent, #f59e0b) 45%, transparent);\n\t\t\t\tstroke-width: 0.8;\n\t\t\t}\n\t\t\t.vargottama-row {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-wrap: wrap;\n\t\t\t\tgap: var(--roxy-space-xs, 0.25rem);\n\t\t\t\talign-items: center;\n\t\t\t}\n\t\t\t.vargottama-label {\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tfont-weight: 500;\n\t\t\t\tmargin-right: var(--roxy-space-xs, 0.25rem);\n\t\t\t}\n\t\t\t.vargottama-pill {\n\t\t\t\tdisplay: inline-flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 0.2em;\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tfont-weight: 600;\n\t\t\t\tpadding: 0.15em 0.6em;\n\t\t\t\tborder-radius: 999px;\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-accent, #f59e0b) 22%, transparent);\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t\tborder: 1px solid color-mix(in srgb, var(--roxy-accent, #f59e0b) 45%, transparent);\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\tdata: DivisionalChartResponse | null = null;\n\n\t@property({ type: String, reflect: true, attribute: 'chart-style' })\n\tchartStyle: 'south' | 'north' = 'south';\n\n\tprivate buildHouses(): HouseDef[] {\n\t\tif (!this.data) return [];\n\t\tconst chart = this.data.chart as ChartByRashi;\n\t\tconst meta =\n\t\t\t(this.data.chart as { meta?: Record<string, { rashi?: string }> }).meta ??\n\t\t\t{};\n\t\tconst lagnaSign = meta.Lagna?.rashi ?? '';\n\t\tconst houses: HouseDef[] = [];\n\t\tfor (let i = 0; i < 12; i++) {\n\t\t\tconst key = RASHI_KEYS[i];\n\t\t\tconst bucket = chart[key] as RashiBucket | undefined;\n\t\t\tconst planets = (bucket?.signs ?? []).map((p) => p.graha).filter(Boolean);\n\t\t\tconst sign = RASHI_TO_SIGN[key] ?? '';\n\t\t\thouses.push({\n\t\t\t\tnumber: i + 1,\n\t\t\t\tsign,\n\t\t\t\tplanets,\n\t\t\t\tisLagna: lagnaSign\n\t\t\t\t\t? lagnaSign.toLowerCase() === sign.toLowerCase()\n\t\t\t\t\t: false,\n\t\t\t});\n\t\t}\n\t\treturn houses;\n\t}\n\n\trender() {\n\t\tif (!this.data)\n\t\t\treturn html`<div class=\"roxy-empty\" role=\"status\">No divisional chart data</div>`;\n\n\t\tconst { division, vargottama } = this.data;\n\t\tconst houses = this.buildHouses();\n\t\tconst isNorth = this.chartStyle === 'north';\n\n\t\treturn html`<div class=\"wrap\">\n\t\t\t<div class=\"header\">\n\t\t\t\t<h2 class=\"title\">\n\t\t\t\t\tD${division.number} ${division.name}\n\t\t\t\t\t${\n\t\t\t\t\t\tdivision.sanskritName && division.sanskritName !== division.name\n\t\t\t\t\t\t\t? html`<span class=\"division-meta\"> \u00B7 ${division.sanskritName}</span>`\n\t\t\t\t\t\t\t: nothing\n\t\t\t\t\t}\n\t\t\t\t</h2>\n\t\t\t\t${\n\t\t\t\t\tdivision.significance\n\t\t\t\t\t\t? html`<p class=\"significance\">${division.significance}</p>`\n\t\t\t\t\t\t: nothing\n\t\t\t\t}\n\t\t\t</div>\n\n\t\t\t<svg\n\t\t\t\tviewBox=\"0 0 300 300\"\n\t\t\t\trole=\"img\"\n\t\t\t\taria-label=\"D${division.number} ${division.name} divisional chart with twelve sign houses\"\n\t\t\t>\n\t\t\t\t<title>D${division.number} ${division.name}</title>\n\t\t\t\t${isNorth ? renderNorthFrame() : renderSouthFrame()}\n\t\t\t\t${\n\t\t\t\t\tisNorth\n\t\t\t\t\t\t? houses.map((h) => renderNorthHouseGroup(h))\n\t\t\t\t\t\t: houses.map((h) => renderSouthHouseGroup(h))\n\t\t\t\t}\n\t\t\t</svg>\n\n\t\t\t${\n\t\t\t\tvargottama && vargottama.length > 0\n\t\t\t\t\t? html`<div class=\"vargottama-row\" role=\"list\" aria-label=\"Vargottama planets\">\n\t\t\t\t\t\t<span class=\"vargottama-label\">Vargottama:</span>\n\t\t\t\t\t\t${vargottama.map(\n\t\t\t\t\t\t\t(planet) =>\n\t\t\t\t\t\t\t\thtml`<span class=\"vargottama-pill\" role=\"listitem\">\n\t\t\t\t\t\t\t\t\t${PLANET_GLYPH[planet] ?? ''} ${planet}\n\t\t\t\t\t\t\t\t</span>`,\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t</div>`;\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'roxy-divisional-chart': RoxyDivisionalChart;\n\t}\n}\n", "import type { TemplateResult } from 'lit';\nimport { nothing, svg } from 'lit';\nimport { PLANET_ABBR, SIGN_ABBR, SIGNS_ORDER } from '../tokens/index.js';\nimport { capitalize } from './string.js';\n\nexport const KUNDLI_SIZE = 300;\nexport const KUNDLI_CENTER = 150;\n\n/**\n * Maps a lowercase rashi key (e.g. \"aries\") back to its canonical sign name\n * (e.g. \"Aries\"). Used by every kundli consumer to bridge spec lowercase\n * rashi keys to the title-cased SIGNS_ORDER tokens.\n */\nexport const RASHI_TO_SIGN: Record<string, string> = Object.fromEntries(\n\tSIGNS_ORDER.map((s) => [s.toLowerCase(), s] as const),\n);\n\n/**\n * South Indian fixed-house square grid: house centers for planet text labels.\n * House 1 is fixed top-center; positions are in the 300x300 viewBox.\n */\nexport const SOUTH_HOUSE_CENTERS: Record<number, { x: number; y: number }> = {\n\t1: { x: 150, y: 58 },\n\t2: { x: 205, y: 52 },\n\t3: { x: 253, y: 112 },\n\t4: { x: 243, y: 150 },\n\t5: { x: 253, y: 188 },\n\t6: { x: 205, y: 248 },\n\t7: { x: 150, y: 242 },\n\t8: { x: 95, y: 248 },\n\t9: { x: 47, y: 188 },\n\t10: { x: 57, y: 150 },\n\t11: { x: 47, y: 112 },\n\t12: { x: 95, y: 52 },\n};\n\n/**\n * South Indian sign abbreviation positions (slightly outward from center).\n */\nexport const SOUTH_SIGN_POSITIONS: Record<number, { x: number; y: number }> = {\n\t1: { x: 150, y: 35 },\n\t2: { x: 222, y: 40 },\n\t3: { x: 265, y: 100 },\n\t4: { x: 265, y: 150 },\n\t5: { x: 265, y: 200 },\n\t6: { x: 222, y: 260 },\n\t7: { x: 150, y: 265 },\n\t8: { x: 78, y: 260 },\n\t9: { x: 35, y: 200 },\n\t10: { x: 35, y: 150 },\n\t11: { x: 35, y: 100 },\n\t12: { x: 78, y: 40 },\n};\n\n/**\n * North Indian style: 12 triangular house positions.\n * Lagna (house 1) is the top diamond, numbered clockwise.\n * Centers represent the visual midpoint of each triangular cell.\n */\nexport const NORTH_HOUSE_CENTERS: Record<number, { x: number; y: number }> = {\n\t1: { x: 150, y: 60 },\n\t2: { x: 225, y: 100 },\n\t3: { x: 255, y: 150 },\n\t4: { x: 225, y: 200 },\n\t5: { x: 150, y: 240 },\n\t6: { x: 75, y: 200 },\n\t7: { x: 45, y: 150 },\n\t8: { x: 75, y: 100 },\n\t9: { x: 100, y: 80 },\n\t10: { x: 150, y: 108 },\n\t11: { x: 200, y: 80 },\n\t12: { x: 200, y: 220 },\n};\n\nexport interface HouseDef {\n\t/** 1-based house number. */\n\tnumber: number;\n\t/** Sign name (TitleCase, e.g. \"Aries\"). */\n\tsign: string;\n\t/** Planet abbreviation strings to display. */\n\tplanets: string[];\n\t/** Whether this house is the ascendant (Lagna). */\n\tisLagna: boolean;\n}\n\n/**\n * Render a single house group: lagna highlight, sign abbreviation, planet labels.\n * Returns an SVG fragment for use inside an `<svg>` element.\n */\nexport function renderSouthHouseGroup(\n\th: HouseDef,\n): TemplateResult | typeof nothing {\n\tconst center = SOUTH_HOUSE_CENTERS[h.number];\n\tconst signPos = SOUTH_SIGN_POSITIONS[h.number];\n\tif (!center || !signPos) return nothing;\n\tconst signAbbr = SIGN_ABBR[h.sign] ?? '';\n\tconst planets = h.planets;\n\treturn svg`\n\t\t<g>\n\t\t\t${\n\t\t\t\th.isLagna\n\t\t\t\t\t? svg`<rect\n\t\t\t\t\t\t\tclass=\"lagna-bg\"\n\t\t\t\t\t\t\tx=${center.x - 30} y=${center.y - 28}\n\t\t\t\t\t\t\twidth=\"60\" height=\"56\" rx=\"6\"\n\t\t\t\t\t\t/>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t\t${\n\t\t\t\tsignAbbr\n\t\t\t\t\t? svg`<text class=\"sign-text\" x=${signPos.x} y=${signPos.y} text-anchor=\"middle\" dominant-baseline=\"central\">${signAbbr}</text>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t\t${\n\t\t\t\th.isLagna\n\t\t\t\t\t? svg`<text class=\"lagna-marker\" x=${center.x} y=${center.y - 18} text-anchor=\"middle\" dominant-baseline=\"central\">LAGNA</text>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t\t${planets.map((planet, j) => {\n\t\t\t\tconst abbr = PLANET_ABBR[capitalize(planet)] ?? planet.slice(0, 2);\n\t\t\t\tconst lineHeight = 13;\n\t\t\t\tconst baseY = h.isLagna ? center.y + 8 : center.y;\n\t\t\t\tconst startY = baseY - ((planets.length - 1) * lineHeight) / 2;\n\t\t\t\tconst yPos = startY + j * lineHeight;\n\t\t\t\treturn svg`<text class=\"planet-text\" x=${center.x} y=${yPos} text-anchor=\"middle\" dominant-baseline=\"central\">${abbr}</text>`;\n\t\t\t})}\n\t\t</g>\n\t`;\n}\n\n/**\n * Render a north-Indian-style kundli wheel frame (grid lines only).\n * Returns the SVG structural lines; call `renderNorthHouseGroup` for content.\n */\nexport function renderNorthFrame(): TemplateResult {\n\treturn svg`\n\t\t<polygon class=\"line\" points=\"150,10 290,150 150,290 10,150\" stroke-width=\"1.5\" />\n\t\t<line class=\"line\" x1=\"150\" y1=\"10\" x2=\"150\" y2=\"290\" stroke-width=\"1\" />\n\t\t<line class=\"line\" x1=\"10\" y1=\"150\" x2=\"290\" y2=\"150\" stroke-width=\"1\" />\n\t\t<line class=\"line\" x1=\"150\" y1=\"10\" x2=\"10\" y2=\"150\" stroke-width=\"0.6\" stroke-dasharray=\"3,3\" />\n\t\t<line class=\"line\" x1=\"150\" y1=\"10\" x2=\"290\" y2=\"150\" stroke-width=\"0.6\" stroke-dasharray=\"3,3\" />\n\t\t<line class=\"line\" x1=\"150\" y1=\"290\" x2=\"10\" y2=\"150\" stroke-width=\"0.6\" stroke-dasharray=\"3,3\" />\n\t\t<line class=\"line\" x1=\"150\" y1=\"290\" x2=\"290\" y2=\"150\" stroke-width=\"0.6\" stroke-dasharray=\"3,3\" />\n\t`;\n}\n\n/**\n * Render a north-Indian house group (sign abbr + house number + planets).\n */\nexport function renderNorthHouseGroup(\n\th: HouseDef,\n): TemplateResult | typeof nothing {\n\tconst center = NORTH_HOUSE_CENTERS[h.number];\n\tif (!center) return nothing;\n\tconst signAbbr = SIGN_ABBR[h.sign] ?? '';\n\tconst planets = h.planets;\n\treturn svg`\n\t\t<g>\n\t\t\t${\n\t\t\t\th.isLagna\n\t\t\t\t\t? svg`<circle class=\"lagna-bg\" cx=${center.x} cy=${center.y} r=\"22\" />`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t\t${\n\t\t\t\tsignAbbr\n\t\t\t\t\t? svg`<text class=\"sign-text\" x=${center.x} y=${center.y - 10} text-anchor=\"middle\" dominant-baseline=\"central\">${signAbbr}</text>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t\t<text class=\"house-num\" x=${center.x} y=${center.y + 2} text-anchor=\"middle\" dominant-baseline=\"central\">${h.number}</text>\n\t\t\t${planets.map((planet, j) => {\n\t\t\t\tconst abbr = PLANET_ABBR[capitalize(planet)] ?? planet.slice(0, 2);\n\t\t\t\tconst lineHeight = 11;\n\t\t\t\tconst startY = center.y + 14 - ((planets.length - 1) * lineHeight) / 2;\n\t\t\t\tconst yPos = startY + j * lineHeight;\n\t\t\t\treturn svg`<text class=\"planet-text\" x=${center.x} y=${yPos} text-anchor=\"middle\" dominant-baseline=\"central\">${abbr}</text>`;\n\t\t\t})}\n\t\t</g>\n\t`;\n}\n\n/**\n * Render the south-Indian square frame (border diamond + inner square + radial lines).\n */\nexport function renderSouthFrame(): TemplateResult {\n\treturn svg`\n\t\t<polygon class=\"line\" points=\"150,10 290,150 150,290 10,150\" stroke-width=\"1.5\" />\n\t\t<polygon class=\"line\" points=\"220,80 220,220 80,220 80,80\" stroke-width=\"1\" fill=\"none\" />\n\t\t<line class=\"line\" x1=\"150\" y1=\"10\" x2=\"80\" y2=\"80\" stroke-width=\"1\" />\n\t\t<line class=\"line\" x1=\"150\" y1=\"10\" x2=\"220\" y2=\"80\" stroke-width=\"1\" />\n\t\t<line class=\"line\" x1=\"290\" y1=\"150\" x2=\"220\" y2=\"80\" stroke-width=\"1\" />\n\t\t<line class=\"line\" x1=\"290\" y1=\"150\" x2=\"220\" y2=\"220\" stroke-width=\"1\" />\n\t\t<line class=\"line\" x1=\"150\" y1=\"290\" x2=\"220\" y2=\"220\" stroke-width=\"1\" />\n\t\t<line class=\"line\" x1=\"150\" y1=\"290\" x2=\"80\" y2=\"220\" stroke-width=\"1\" />\n\t\t<line class=\"line\" x1=\"10\" y1=\"150\" x2=\"80\" y2=\"220\" stroke-width=\"1\" />\n\t\t<line class=\"line\" x1=\"10\" y1=\"150\" x2=\"80\" y2=\"80\" stroke-width=\"1\" />\n\t`;\n}\n", "import { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type {\n\tKalsarpaResponse,\n\tManglikResponse,\n\tSadhesatiResponse,\n} from '../types/index.js';\nimport { baseStyles } from '../utils/base-styles.js';\n\ntype DoshaData = ManglikResponse | KalsarpaResponse | SadhesatiResponse;\n\nconst DOSHA_LABELS: Record<string, string> = {\n\tmanglik: 'Mangal Dosha',\n\tkalsarpa: 'Kaal Sarp Dosha',\n\tsadhesati: 'Sade Sati',\n};\n\n/**\n * Dosha presence card. Renders /vedic-astrology/dosha/{manglik,kalsarpa,sadhesati}.\n * Visual severity indicator + remedies + scoped effects.\n */\n@customElement('roxy-dosha-card')\nexport class RoxyDoshaCard extends LitElement {\n\tstatic styles = [\n\t\tbaseStyles,\n\t\tcss`\n\t\t\t.card {\n\t\t\t\tbackground: var(--roxy-bg, #fff);\n\t\t\t\tborder: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t\tpadding: var(--roxy-space-lg, 1.5rem);\n\t\t\t\tbox-shadow: var(--roxy-shadow-sm);\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\t\t\t.head {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t\tflex-wrap: wrap;\n\t\t\t}\n\t\t\t.title {\n\t\t\t\tmargin: 0;\n\t\t\t\tfont-size: var(--roxy-text-lg, 1.125rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\ttext-transform: capitalize;\n\t\t\t}\n\t\t\t.badge {\n\t\t\t\tdisplay: inline-flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: var(--roxy-space-xs, 0.25rem);\n\t\t\t\tpadding: 4px 10px;\n\t\t\t\tborder-radius: var(--roxy-radius-full, 9999px);\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tletter-spacing: 0.06em;\n\t\t\t}\n\t\t\t.badge.absent {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-success, #16a34a) 16%, transparent);\n\t\t\t\tcolor: var(--roxy-success-fg, #166534);\n\t\t\t}\n\t\t\t.badge.present {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-danger, #dc2626) 16%, transparent);\n\t\t\t\tcolor: var(--roxy-danger-fg, #991b1b);\n\t\t\t}\n\t\t\t.severity-bar {\n\t\t\t\tposition: relative;\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 8px;\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-border, #e4e4e7) 30%, transparent);\n\t\t\t\tborder-radius: 4px;\n\t\t\t\toverflow: hidden;\n\t\t\t}\n\t\t\t.severity-fill {\n\t\t\t\tdisplay: block;\n\t\t\t\theight: 100%;\n\t\t\t\ttransition: width var(--roxy-motion-duration, 200ms) ease-out;\n\t\t\t\tborder-radius: 4px;\n\t\t\t}\n\t\t\t@media (prefers-reduced-motion: reduce) {\n\t\t\t\t.severity-fill {\n\t\t\t\t\ttransition: none;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.description {\n\t\t\t\tmargin: 0;\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t}\n\n\t\t\th3 {\n\t\t\t\tmargin: 0 0 var(--roxy-space-xs, 0.25rem);\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tletter-spacing: 0.06em;\n\t\t\t}\n\t\t\tul {\n\t\t\t\tmargin: 0;\n\t\t\t\tpadding-left: var(--roxy-space-md, 1rem);\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t}\n\t\t\t.effects {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\t\t\t.effects p {\n\t\t\t\tmargin: 0;\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\tdata: DoshaData | null = null;\n\n\t@property({ type: String, reflect: true })\n\ttype: 'manglik' | 'kalsarpa' | 'sadhesati' | string = 'manglik';\n\n\trender() {\n\t\tconst d = this.data;\n\t\tif (!d)\n\t\t\treturn html`<div class=\"roxy-empty\" role=\"status\">No dosha data</div>`;\n\n\t\tconst present = !!d.present;\n\t\tconst label = DOSHA_LABELS[this.type] ?? this.type;\n\t\tconst sevLower = (d.severity ?? '').toLowerCase();\n\t\tconst tier =\n\t\t\tsevLower === 'severe'\n\t\t\t\t? 3\n\t\t\t\t: sevLower === 'moderate'\n\t\t\t\t\t? 2\n\t\t\t\t\t: sevLower === 'mild'\n\t\t\t\t\t\t? 1\n\t\t\t\t\t\t: 0;\n\t\tconst pct = tier * 33;\n\t\tconst barColor =\n\t\t\ttier === 3\n\t\t\t\t? 'var(--roxy-danger)'\n\t\t\t\t: tier === 2\n\t\t\t\t\t? 'var(--roxy-warning)'\n\t\t\t\t\t: tier === 1\n\t\t\t\t\t\t? 'var(--roxy-success)'\n\t\t\t\t\t\t: 'transparent';\n\n\t\treturn html`<article\n\t\t\tclass=\"card\"\n\t\t\taria-label=${label}\n\t\t>\n\t\t\t<header class=\"head\">\n\t\t\t\t<h2 class=\"title\">${label}</h2>\n\t\t\t\t<span class=${`badge ${present ? 'present' : 'absent'}`}>\n\t\t\t\t\t${present ? 'Present' : 'Absent'}\n\t\t\t\t</span>\n\t\t\t</header>\n\t\t\t${\n\t\t\t\td.severity\n\t\t\t\t\t? html`<div\n\t\t\t\t\t\tclass=\"severity-bar\"\n\t\t\t\t\t\trole=\"meter\"\n\t\t\t\t\t\taria-valuemin=\"0\"\n\t\t\t\t\t\taria-valuemax=\"3\"\n\t\t\t\t\t\taria-valuenow=\"${tier}\"\n\t\t\t\t\t\taria-label=\"Severity ${d.severity}\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<span class=\"severity-fill\" style=\"width: ${pct}%; background: ${barColor};\"></span>\n\t\t\t\t\t</div>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t\t${d.description ? html`<p class=\"description\">${d.description}</p>` : nothing}\n\t\t\t${this.renderEffects(d)}\n\t\t\t${\n\t\t\t\td.remedies && d.remedies.length > 0\n\t\t\t\t\t? html`<div>\n\t\t\t\t\t\t<h3>Remedies</h3>\n\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t${d.remedies.map((r) => html`<li>${r}</li>`)}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</div>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t\t${\n\t\t\t\t'exceptions' in d && d.exceptions && d.exceptions.length > 0\n\t\t\t\t\t? html`<div>\n\t\t\t\t\t<h3>Exceptions</h3>\n\t\t\t\t\t<ul>\n\t\t\t\t\t\t${d.exceptions.map((r) => html`<li>${r}</li>`)}\n\t\t\t\t\t</ul>\n\t\t\t\t</div>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t</article>`;\n\t}\n\n\tprivate renderEffects(d: DoshaData) {\n\t\tif (!d.effects) return nothing;\n\t\tconst entries = Object.entries(d.effects).filter(\n\t\t\t([, v]) => typeof v === 'string' && v.length > 0,\n\t\t);\n\t\tif (entries.length === 0) return nothing;\n\t\treturn html`<div class=\"effects\">\n\t\t\t${entries.map(\n\t\t\t\t([k, v]) => html`<div>\n\t\t\t\t\t<h3>${k}</h3>\n\t\t\t\t\t<p>${v}</p>\n\t\t\t\t</div>`,\n\t\t\t)}\n\t\t</div>`;\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'roxy-dosha-card': RoxyDoshaCard;\n\t}\n}\n", "import { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { baseStyles } from '../utils/base-styles.js';\nimport { humanize } from '../utils/string.js';\n\ninterface OpenApiSchemaRef {\n\t$ref?: string;\n}\n\ninterface OpenApiSchema extends OpenApiSchemaRef {\n\ttype?: string;\n\tformat?: string;\n\tdescription?: string;\n\tenum?: string[];\n\tdefault?: unknown;\n\tminimum?: number;\n\tmaximum?: number;\n\tproperties?: Record<string, OpenApiSchema>;\n\trequired?: string[];\n\titems?: OpenApiSchema;\n\texample?: unknown;\n}\n\ninterface FieldDef {\n\tname: string;\n\ttype: string;\n\trequired: boolean;\n\tdescription?: string;\n\tenum?: string[];\n\tmin?: number;\n\tmax?: number;\n\tdefault?: unknown;\n}\n\ninterface OpenApiDoc {\n\tpaths?: Record<string, Record<string, unknown>>;\n\tcomponents?: { schemas?: Record<string, OpenApiSchema> };\n}\n\nconst specCache = new Map<string, Promise<OpenApiDoc>>();\n\nasync function loadSpec(url: string): Promise<OpenApiDoc> {\n\tlet pending = specCache.get(url);\n\tif (!pending) {\n\t\tpending = fetch(url)\n\t\t\t.then(async (res) => {\n\t\t\t\tif (!res.ok) throw new Error(`HTTP ${res.status}`);\n\t\t\t\treturn (await res.json()) as OpenApiDoc;\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\t// Evict the rejected promise BEFORE rethrowing so subsequent\n\t\t\t\t// callers (the user clicking Retry, a remount) hit the network\n\t\t\t\t// again instead of replaying the cached failure forever.\n\t\t\t\tspecCache.delete(url);\n\t\t\t\tthrow err;\n\t\t\t});\n\t\tspecCache.set(url, pending);\n\t}\n\treturn pending;\n}\n\n/**\n * Schema-driven form. Pass `endpoint` (e.g. \"vedic-astrology/birth-chart\").\n * The form introspects the cached OpenAPI spec, slots a roxy-location-search\n * when latitude+longitude+timezone fields are present, and emits a\n * `roxy-submit` CustomEvent with the validated payload on submit. The caller\n * decides what to do (call the SDK, render a chart, navigate).\n *\n * Build-time hints (x-roxy-ui formGroups) are read by scripts/build.ts and\n * baked into a static map. At runtime the component falls back to runtime\n * fetch of /api/v2/openapi.json when no map is provided.\n */\n@customElement('roxy-endpoint-form')\nexport class RoxyEndpointForm extends LitElement {\n\tstatic styles = [\n\t\tbaseStyles,\n\t\tcss`\n\t\t\tform {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t\tbackground: var(--roxy-bg, #fff);\n\t\t\t\tborder: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t\tpadding: var(--roxy-space-lg, 1.5rem);\n\t\t\t\tbox-shadow: var(--roxy-shadow-sm);\n\t\t\t}\n\t\t\t.title {\n\t\t\t\tmargin: 0;\n\t\t\t\tfont-size: var(--roxy-text-lg, 1.125rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t}\n\t\t\t.fields {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));\n\t\t\t\talign-items: start;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\t\t\t.field {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: var(--roxy-space-xs, 0.25rem);\n\t\t\t\tmin-width: 0;\n\t\t\t}\n\t\t\tlabel {\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tcolor: var(--roxy-secondary, #475569);\n\t\t\t}\n\t\t\tlabel .req {\n\t\t\t\tcolor: var(--roxy-danger-fg, #991b1b);\n\t\t\t\tmargin-left: 4px;\n\t\t\t}\n\t\t\tinput,\n\t\t\tselect {\n\t\t\t\twidth: 100%;\n\t\t\t\tbox-sizing: border-box;\n\t\t\t\tpadding: var(--roxy-space-sm, 0.5rem) var(--roxy-space-md, 1rem);\n\t\t\t\tfont-size: var(--roxy-text-base, 1rem);\n\t\t\t\tfont-family: inherit;\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t\tbackground: var(--roxy-bg, #fff);\n\t\t\t\tborder: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t}\n\t\t\tinput:focus,\n\t\t\tselect:focus {\n\t\t\t\toutline: 2px solid var(--roxy-ring, rgba(245, 158, 11, 0.4));\n\t\t\t\toutline-offset: 2px;\n\t\t\t\tborder-color: var(--roxy-accent-fg, #b45309);\n\t\t\t}\n\t\t\t.help {\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t}\n\t\t\t.location-block {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: var(--roxy-space-xs, 0.25rem);\n\t\t\t\tgrid-column: 1 / -1;\n\t\t\t}\n\t\t\t.coords {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: repeat(3, 1fr);\n\t\t\t\tgap: var(--roxy-space-sm, 0.5rem);\n\t\t\t}\n\t\t\t.coords input {\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t}\n\t\t\tbutton.submit {\n\t\t\t\tjustify-self: start;\n\t\t\t\tbackground: var(--roxy-accent-fg, #b45309);\n\t\t\t\tcolor: var(--roxy-bg, #fff);\n\t\t\t\tborder: 0;\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t\tpadding: var(--roxy-space-sm, 0.5rem) var(--roxy-space-lg, 1.5rem);\n\t\t\t\tfont-size: var(--roxy-text-base, 1rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tcursor: pointer;\n\t\t\t\ttransition:\n\t\t\t\t\ttransform var(--roxy-motion-duration, 200ms)\n\t\t\t\t\tvar(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1));\n\t\t\t}\n\t\t\tbutton.submit:hover {\n\t\t\t\ttransform: scale(1.02);\n\t\t\t}\n\t\t\tbutton.submit:focus-visible {\n\t\t\t\toutline: 2px solid var(--roxy-ring, rgba(245, 158, 11, 0.4));\n\t\t\t\toutline-offset: 2px;\n\t\t\t}\n\t\t\t.spec-error {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t\tjustify-items: start;\n\t\t\t\tbackground: var(--roxy-bg, #fff);\n\t\t\t\tborder: 1px solid var(--roxy-danger, #dc2626);\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t\tpadding: var(--roxy-space-lg, 1.5rem);\n\t\t\t\tcolor: var(--roxy-danger-fg, #991b1b);\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ type: String, attribute: 'data-endpoint' })\n\tendpoint = 'vedic-astrology/birth-chart';\n\n\t@property({ type: String })\n\tmethod: 'GET' | 'POST' = 'POST';\n\n\t@property({ type: String, attribute: 'spec-url' })\n\tspecUrl = 'https://roxyapi.com/api/v2/openapi.json';\n\n\t@property({ type: String, attribute: 'submit-label' })\n\tsubmitLabel = 'Submit';\n\n\t@state()\n\tprivate fields: FieldDef[] = [];\n\n\t@state()\n\tprivate values: Record<string, unknown> = {};\n\n\t@state()\n\tprivate hasLocation = false;\n\n\t@state()\n\tprivate loaded = false;\n\n\t@state()\n\tprivate specError: string | null = null;\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t\tvoid this.loadSchema();\n\t}\n\n\tprivate async loadSchema() {\n\t\tthis.specError = null;\n\t\ttry {\n\t\t\tconst spec = await loadSpec(this.specUrl);\n\t\t\tconst path = `/${this.endpoint.replace(/^\\//, '')}`;\n\t\t\tconst op = spec.paths?.[path]?.[this.method.toLowerCase()] as\n\t\t\t\t| {\n\t\t\t\t\t\trequestBody?: {\n\t\t\t\t\t\t\tcontent?: Record<\n\t\t\t\t\t\t\t\tstring,\n\t\t\t\t\t\t\t\t{ schema?: OpenApiSchema | OpenApiSchemaRef }\n\t\t\t\t\t\t\t>;\n\t\t\t\t\t\t};\n\t\t\t\t\t\tparameters?: Array<{\n\t\t\t\t\t\t\tname: string;\n\t\t\t\t\t\t\tin: string;\n\t\t\t\t\t\t\trequired?: boolean;\n\t\t\t\t\t\t\tschema?: OpenApiSchema;\n\t\t\t\t\t\t}>;\n\t\t\t\t  }\n\t\t\t\t| undefined;\n\t\t\tif (!op) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Endpoint ${this.method} ${path} not found in OpenAPI spec`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst schemas = spec.components?.schemas ?? {};\n\t\t\tconst fields: FieldDef[] = [];\n\t\t\tlet bodySchema: OpenApiSchema | undefined;\n\n\t\t\tif (op.requestBody) {\n\t\t\t\tconst ref = op.requestBody.content?.['application/json']?.schema;\n\t\t\t\tbodySchema = this.resolve(ref, schemas);\n\t\t\t}\n\n\t\t\tif (bodySchema?.properties) {\n\t\t\t\tconst required = new Set(bodySchema.required ?? []);\n\t\t\t\tfor (const [name, sub] of Object.entries(bodySchema.properties)) {\n\t\t\t\t\tconst resolved = this.resolve(sub, schemas) ?? {};\n\t\t\t\t\tfields.push({\n\t\t\t\t\t\tname,\n\t\t\t\t\t\ttype: this.fieldType(resolved),\n\t\t\t\t\t\trequired: required.has(name),\n\t\t\t\t\t\tdescription: resolved.description,\n\t\t\t\t\t\tenum: resolved.enum,\n\t\t\t\t\t\tmin: resolved.minimum,\n\t\t\t\t\t\tmax: resolved.maximum,\n\t\t\t\t\t\tdefault: resolved.default,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const param of op.parameters ?? []) {\n\t\t\t\tif (param.in === 'path' || param.in === 'query') {\n\t\t\t\t\tconst resolved = this.resolve(param.schema, schemas) ?? {};\n\t\t\t\t\tfields.push({\n\t\t\t\t\t\tname: param.name,\n\t\t\t\t\t\ttype: this.fieldType(resolved),\n\t\t\t\t\t\trequired: !!param.required,\n\t\t\t\t\t\tdescription: resolved.description,\n\t\t\t\t\t\tenum: resolved.enum,\n\t\t\t\t\t\tdefault: resolved.default,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.fields = fields;\n\t\t\tthis.hasLocation =\n\t\t\t\tfields.some((f) => f.name === 'latitude') &&\n\t\t\t\tfields.some((f) => f.name === 'longitude') &&\n\t\t\t\tfields.some((f) => f.name === 'timezone');\n\n\t\t\t// Pre-fill defaults\n\t\t\tconst init: Record<string, unknown> = {};\n\t\t\tfor (const f of fields) {\n\t\t\t\tif (f.default !== undefined) init[f.name] = f.default;\n\t\t\t}\n\t\t\tthis.values = init;\n\t\t\tthis.loaded = true;\n\t\t} catch (err) {\n\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\tthis.specError = message;\n\t\t\tthis.loaded = true;\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent('roxy-spec-error', {\n\t\t\t\t\tdetail: { url: this.specUrl, message },\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate retryLoadSchema = () => {\n\t\tthis.loaded = false;\n\t\tthis.specError = null;\n\t\tvoid this.loadSchema();\n\t};\n\n\tprivate resolve(\n\t\tschema: OpenApiSchema | OpenApiSchemaRef | undefined,\n\t\tall: Record<string, OpenApiSchema>,\n\t): OpenApiSchema | undefined {\n\t\tif (!schema) return undefined;\n\t\tif ('$ref' in schema && schema.$ref) {\n\t\t\tconst name = schema.$ref.split('/').pop();\n\t\t\treturn name ? all[name] : undefined;\n\t\t}\n\t\treturn schema as OpenApiSchema;\n\t}\n\n\tprivate fieldType(s: OpenApiSchema): string {\n\t\tif (s.enum) return 'enum';\n\t\tif (s.format === 'date') return 'date';\n\t\tif (s.format === 'time') return 'time';\n\t\tif (s.format === 'date-time') return 'datetime';\n\t\tif (s.type === 'integer' || s.type === 'number') return 'number';\n\t\treturn 'text';\n\t}\n\n\tprivate setValue(name: string, value: unknown) {\n\t\tthis.values = { ...this.values, [name]: value };\n\t}\n\n\tprivate onLocation = (e: Event) => {\n\t\tconst detail = (e as CustomEvent).detail as {\n\t\t\tlatitude?: number;\n\t\t\tlongitude?: number;\n\t\t\ttimezone?: string;\n\t\t\tutcOffset?: number;\n\t\t};\n\t\tif (detail) {\n\t\t\tthis.values = {\n\t\t\t\t...this.values,\n\t\t\t\tlatitude: detail.latitude,\n\t\t\t\tlongitude: detail.longitude,\n\t\t\t\ttimezone: detail.timezone ?? detail.utcOffset,\n\t\t\t};\n\t\t}\n\t};\n\n\tprivate onSubmit = (e: Event) => {\n\t\te.preventDefault();\n\t\tconst missing = this.fields\n\t\t\t.filter((f) => f.required)\n\t\t\t.filter(\n\t\t\t\t(f) => this.values[f.name] === undefined || this.values[f.name] === '',\n\t\t\t);\n\t\tif (missing.length > 0) {\n\t\t\tthis.dispatchEvent(\n\t\t\t\tnew CustomEvent('roxy-validation-error', {\n\t\t\t\t\tdetail: { missing: missing.map((m) => m.name) },\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true,\n\t\t\t\t}),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent('roxy-submit', {\n\t\t\t\tdetail: { endpoint: this.endpoint, values: this.values },\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t}),\n\t\t);\n\t};\n\n\trender() {\n\t\tif (!this.loaded) {\n\t\t\treturn html`<form><div class=\"roxy-skeleton\" style=\"height: 8rem\"></div></form>`;\n\t\t}\n\n\t\tif (this.specError) {\n\t\t\treturn html`<div class=\"spec-error\" role=\"alert\">\n\t\t\t\tSchema load failed: ${this.specError}\n\t\t\t\t<button type=\"button\" class=\"submit\" @click=${this.retryLoadSchema}>Retry</button>\n\t\t\t</div>`;\n\t\t}\n\n\t\tconst renderField = (f: FieldDef) => {\n\t\t\tif (\n\t\t\t\tthis.hasLocation &&\n\t\t\t\t(f.name === 'latitude' ||\n\t\t\t\t\tf.name === 'longitude' ||\n\t\t\t\t\tf.name === 'timezone')\n\t\t\t) {\n\t\t\t\treturn nothing;\n\t\t\t}\n\t\t\tconst inputId = `roxy-form-${f.name}`;\n\t\t\treturn html`<div class=\"field\">\n\t\t\t\t<label for=${inputId}>\n\t\t\t\t\t${humanize(f.name)}${f.required ? html`<span class=\"req\" aria-hidden=\"true\">*</span>` : nothing}\n\t\t\t\t</label>\n\t\t\t\t${\n\t\t\t\t\tf.enum\n\t\t\t\t\t\t? html`<select\n\t\t\t\t\t\t\tid=${inputId}\n\t\t\t\t\t\t\t?required=${f.required}\n\t\t\t\t\t\t\t@change=${(e: Event) => this.setValue(f.name, (e.target as HTMLSelectElement).value)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<option value=\"\">Choose</option>\n\t\t\t\t\t\t\t${f.enum.map(\n\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t\topt,\n\t\t\t\t\t\t\t\t) => html`<option value=${opt} ?selected=${this.values[f.name] === opt}>\n\t\t\t\t\t\t\t\t\t${opt}\n\t\t\t\t\t\t\t\t</option>`,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</select>`\n\t\t\t\t\t\t: html`<input\n\t\t\t\t\t\t\tid=${inputId}\n\t\t\t\t\t\t\ttype=${this.htmlType(f.type)}\n\t\t\t\t\t\t\t?required=${f.required}\n\t\t\t\t\t\t\tmin=${f.min ?? ''}\n\t\t\t\t\t\t\tmax=${f.max ?? ''}\n\t\t\t\t\t\t\tstep=${f.type === 'number' ? 'any' : ''}\n\t\t\t\t\t\t\t.value=${(this.values[f.name] ?? '') as string}\n\t\t\t\t\t\t\t@input=${(e: Event) =>\n\t\t\t\t\t\t\t\tthis.setValue(\n\t\t\t\t\t\t\t\t\tf.name,\n\t\t\t\t\t\t\t\t\tthis.coerce(f.type, (e.target as HTMLInputElement).value),\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>`\n\t\t\t\t}\n\t\t\t\t${f.description ? html`<small class=\"help\">${f.description}</small>` : nothing}\n\t\t\t</div>`;\n\t\t};\n\n\t\treturn html`<form @submit=${this.onSubmit}>\n\t\t\t<h2 class=\"title\">${humanize(this.endpoint.split('/').pop() ?? '')}</h2>\n\t\t\t${\n\t\t\t\tthis.hasLocation\n\t\t\t\t\t? html`<div class=\"location-block\">\n\t\t\t\t\t\t<label>Birth location</label>\n\t\t\t\t\t\t<roxy-location-search\n\t\t\t\t\t\t\t@roxy-location-select=${this.onLocation}\n\t\t\t\t\t\t\tplaceholder=\"City of birth\"\n\t\t\t\t\t\t></roxy-location-search>\n\t\t\t\t\t\t<small class=\"help\">\n\t\t\t\t\t\t\tRequired: latitude, longitude, timezone. Pick a city to autofill.\n\t\t\t\t\t\t</small>\n\t\t\t\t\t</div>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t\t<div class=\"fields\">\n\t\t\t\t${this.fields.map((f) => renderField(f))}\n\t\t\t</div>\n\t\t\t<button class=\"submit\" type=\"submit\">${this.submitLabel}</button>\n\t\t</form>`;\n\t}\n\n\tprivate htmlType(t: string): string {\n\t\tswitch (t) {\n\t\t\tcase 'date':\n\t\t\t\treturn 'date';\n\t\t\tcase 'time':\n\t\t\t\treturn 'time';\n\t\t\tcase 'datetime':\n\t\t\t\treturn 'datetime-local';\n\t\t\tcase 'number':\n\t\t\t\treturn 'number';\n\t\t\tdefault:\n\t\t\t\treturn 'text';\n\t\t}\n\t}\n\n\tprivate coerce(t: string, v: string): unknown {\n\t\tif (v === '') return undefined;\n\t\tif (t === 'number') {\n\t\t\tconst n = Number(v);\n\t\t\treturn Number.isFinite(n) ? n : undefined;\n\t\t}\n\t\treturn v;\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'roxy-endpoint-form': RoxyEndpointForm;\n\t}\n}\n", "import { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type { CompatibilityResponse } from '../types/index.js';\nimport { baseStyles } from '../utils/base-styles.js';\nimport { formatNumber, formatPercent } from '../utils/format.js';\n\nconst STANDARD_CATEGORIES = [\n\t'Varna',\n\t'Vasya',\n\t'Tara',\n\t'Yoni',\n\t'Maitri',\n\t'Gana',\n\t'Bhakoot',\n\t'Nadi',\n];\n\n/**\n * 36-point Ashtakoota score card. Renders /vedic-astrology/compatibility.\n */\n@customElement('roxy-guna-milan')\nexport class RoxyGunaMilan extends LitElement {\n\tstatic styles = [\n\t\tbaseStyles,\n\t\tcss`\n\t\t\t.card {\n\t\t\t\tbackground: var(--roxy-bg, #fff);\n\t\t\t\tborder: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t\tpadding: var(--roxy-space-lg, 1.5rem);\n\t\t\t\tbox-shadow: var(--roxy-shadow-sm);\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\n\t\t\t.score-header {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 1rem;\n\t\t\t}\n\t\t\t.score-info {\n\t\t\t\tflex: 1;\n\t\t\t}\n\t\t\t.score-bar {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: 1fr auto;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\t\t\t.total {\n\t\t\t\tfont-size: 2.25rem;\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tcolor: var(--roxy-accent-fg, #b45309);\n\t\t\t\tfont-variant-numeric: tabular-nums;\n\t\t\t\tline-height: 1;\n\t\t\t}\n\t\t\t.over {\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tfont-size: var(--roxy-text-base, 1rem);\n\t\t\t}\n\t\t\t.recommendation {\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tcolor: var(--roxy-secondary, #475569);\n\t\t\t}\n\t\t\t.score-ring {\n\t\t\t\twidth: 120px;\n\t\t\t\theight: 120px;\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\t\t\t.score-ring svg {\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 100%;\n\t\t\t}\n\t\t\t.score-ring .ring-text {\n\t\t\t\tfont-size: 22px;\n\t\t\t\tfont-weight: 700;\n\t\t\t\tfill: var(--roxy-fg, #0a0a0a);\n\t\t\t\tfont-family: var(--roxy-font-sans);\n\t\t\t}\n\t\t\t.score-ring .ring-max {\n\t\t\t\tfont-size: 10px;\n\t\t\t\tfill: var(--roxy-muted, #71717a);\n\t\t\t\tfont-family: var(--roxy-font-sans);\n\t\t\t}\n\n\t\t\ttable {\n\t\t\t\twidth: 100%;\n\t\t\t\tborder-collapse: collapse;\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t}\n\t\t\tth,\n\t\t\ttd {\n\t\t\t\tpadding: var(--roxy-space-sm, 0.5rem);\n\t\t\t\tborder-bottom: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\ttext-align: left;\n\t\t\t}\n\t\t\tth {\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tletter-spacing: 0.06em;\n\t\t\t}\n\t\t\ttd.score {\n\t\t\t\ttext-align: right;\n\t\t\t\tfont-variant-numeric: tabular-nums;\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t}\n\t\t\ttd.bar-cell {\n\t\t\t\twidth: 30%;\n\t\t\t}\n\t\t\t.mini-bar {\n\t\t\t\theight: 8px;\n\t\t\t\tbackground: var(--roxy-border, #e4e4e7);\n\t\t\t\tborder-radius: var(--roxy-radius-full, 9999px);\n\t\t\t\toverflow: hidden;\n\t\t\t}\n\t\t\t.mini-bar > span {\n\t\t\t\tdisplay: block;\n\t\t\t\theight: 100%;\n\t\t\t\tbackground: var(--roxy-accent, #f59e0b);\n\t\t\t\ttransition:\n\t\t\t\t\twidth var(--roxy-motion-duration, 200ms)\n\t\t\t\t\tvar(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1));\n\t\t\t}\n\n\t\t\t.tags {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-wrap: wrap;\n\t\t\t\tgap: var(--roxy-space-xs, 0.25rem);\n\t\t\t}\n\t\t\t.tags span {\n\t\t\t\tpadding: 2px 8px;\n\t\t\t\tborder-radius: var(--roxy-radius-full, 9999px);\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t}\n\t\t\t.tags .dosha {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-danger, #dc2626) 16%, transparent);\n\t\t\t\tcolor: var(--roxy-danger-fg, #991b1b);\n\t\t\t}\n\t\t\t.tags .cancel {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-success, #16a34a) 18%, transparent);\n\t\t\t\tcolor: var(--roxy-success-fg, #166534);\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\tdata: CompatibilityResponse | null = null;\n\n\trender() {\n\t\tconst d = this.data;\n\t\tif (!d)\n\t\t\treturn html`<div class=\"roxy-empty\" role=\"status\">No Guna Milan data</div>`;\n\n\t\tconst breakdown = (d.breakdown ?? []).filter(\n\t\t\t(b) => b?.category !== undefined,\n\t\t);\n\n\t\tconst score = d.total ?? 0;\n\t\tconst max = d.maxScore ?? 36;\n\t\tconst pct = (score / max) * 100;\n\t\tconst trackColor =\n\t\t\t'color-mix(in srgb, var(--roxy-border) 50%, transparent)';\n\t\tconst fillColor =\n\t\t\tpct >= 70\n\t\t\t\t? 'var(--roxy-success)'\n\t\t\t\t: pct >= 50\n\t\t\t\t\t? 'var(--roxy-warning)'\n\t\t\t\t\t: 'var(--roxy-danger)';\n\t\t// SVG circle with r=45: circumference = 2 * pi * 45 = 282.74\n\t\t// dasharray segments = pct * 2.827, (100 - pct) * 2.827\n\t\tconst dashFill = pct * 2.827;\n\t\tconst dashGap = (100 - pct) * 2.827;\n\n\t\treturn html`<article class=\"card\" aria-label=\"Guna Milan score\">\n\t\t\t<div class=\"score-header\">\n\t\t\t\t<div class=\"score-info\">\n\t\t\t\t\t<div class=\"score-bar\">\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<span class=\"total\">${formatNumber(d.total, 1)}</span>\n\t\t\t\t\t\t\t<span class=\"over\"> / ${d.maxScore}</span>\n\t\t\t\t\t\t\t${\n\t\t\t\t\t\t\t\ttypeof d.percentage === 'number'\n\t\t\t\t\t\t\t\t\t? html`<small style=\"margin-left: 0.5rem; color: var(--roxy-muted)\">\n\t\t\t\t\t\t\t\t\t\t${formatPercent(d.percentage, 1)}\n\t\t\t\t\t\t\t\t\t</small>`\n\t\t\t\t\t\t\t\t\t: nothing\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t${\n\t\t\t\t\t\t\td.recommendation\n\t\t\t\t\t\t\t\t? html`<span class=\"recommendation\">${d.recommendation}</span>`\n\t\t\t\t\t\t\t\t: nothing\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"score-ring\" role=\"meter\" aria-label=\"Guna milan score\" aria-valuemin=\"0\" aria-valuemax=\"36\" aria-valuenow=\"${score}\">\n\t\t\t\t\t<svg viewBox=\"0 0 100 100\" aria-hidden=\"true\">\n\t\t\t\t\t\t<circle class=\"ring-track\" cx=\"50\" cy=\"50\" r=\"45\" fill=\"none\" stroke=\"${trackColor}\" stroke-width=\"8\"/>\n\t\t\t\t\t\t<circle class=\"ring-fill\" cx=\"50\" cy=\"50\" r=\"45\" fill=\"none\" stroke=\"${fillColor}\" stroke-width=\"8\"\n\t\t\t\t\t\t\t\tstroke-dasharray=\"${dashFill},${dashGap}\" stroke-linecap=\"round\"\n\t\t\t\t\t\t\t\ttransform=\"rotate(-90 50 50)\"/>\n\t\t\t\t\t\t<text x=\"50\" y=\"50\" text-anchor=\"middle\" dominant-baseline=\"central\" class=\"ring-text\">${score}</text>\n\t\t\t\t\t\t<text x=\"50\" y=\"64\" text-anchor=\"middle\" dominant-baseline=\"central\" class=\"ring-max\">/${max}</text>\n\t\t\t\t\t</svg>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t${\n\t\t\t\tbreakdown.length > 0\n\t\t\t\t\t? html`<table>\n\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<th>Category</th>\n\t\t\t\t\t\t\t\t<th>Progress</th>\n\t\t\t\t\t\t\t\t<th class=\"score\">Score</th>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t${breakdown.map((b) => {\n\t\t\t\t\t\t\t\tconst score = b.score ?? 0;\n\t\t\t\t\t\t\t\tconst maxScore = b.maxScore ?? defaultMax(b.category);\n\t\t\t\t\t\t\t\tconst pct = maxScore ? (score / maxScore) * 100 : 0;\n\t\t\t\t\t\t\t\treturn html`<tr>\n\t\t\t\t\t\t\t\t\t<td>${b.category}</td>\n\t\t\t\t\t\t\t\t\t<td class=\"bar-cell\">\n\t\t\t\t\t\t\t\t\t\t<div class=\"mini-bar\">\n\t\t\t\t\t\t\t\t\t\t\t<span style=\"width: ${pct}%\"></span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t<td class=\"score\">${formatNumber(score, 1)} / ${maxScore}</td>\n\t\t\t\t\t\t\t\t</tr>`;\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</table>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t\t${\n\t\t\t\t(d.doshas?.length ?? 0) > 0 || (d.doshaCancellations?.length ?? 0) > 0\n\t\t\t\t\t? html`<div class=\"tags\">\n\t\t\t\t\t\t${d.doshas?.map((x) => html`<span class=\"dosha\">${x}</span>`)}\n\t\t\t\t\t\t${d.doshaCancellations?.map(\n\t\t\t\t\t\t\t(x) =>\n\t\t\t\t\t\t\t\thtml`<span class=\"cancel\" title=${x.reason}>${x.dosha} cancelled</span>`,\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t</article>`;\n\t}\n}\n\nfunction defaultMax(name?: string): number {\n\tif (!name) return 1;\n\tswitch (name.toLowerCase()) {\n\t\tcase 'varna':\n\t\t\treturn 1;\n\t\tcase 'vasya':\n\t\t\treturn 2;\n\t\tcase 'tara':\n\t\t\treturn 3;\n\t\tcase 'yoni':\n\t\t\treturn 4;\n\t\tcase 'maitri':\n\t\t\treturn 5;\n\t\tcase 'gana':\n\t\t\treturn 6;\n\t\tcase 'bhakoot':\n\t\t\treturn 7;\n\t\tcase 'nadi':\n\t\t\treturn 8;\n\t\tdefault:\n\t\t\treturn 1;\n\t}\n}\n\nexport const GUNA_CATEGORIES = STANDARD_CATEGORIES;\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'roxy-guna-milan': RoxyGunaMilan;\n\t}\n}\n", "import { css, html, LitElement, nothing, svg } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { TRIGRAM_GLYPH } from '../tokens/index.js';\nimport type {\n\tCastReadingResponse,\n\tGetDailyHexagramResponse,\n\tGetHexagramResponse,\n\tGetRandomHexagramResponse,\n\tHexagram,\n\tLookupHexagramResponse,\n} from '../types/index.js';\nimport { baseStyles } from '../utils/base-styles.js';\n\ntype HexagramData =\n\t| GetHexagramResponse\n\t| GetRandomHexagramResponse\n\t| LookupHexagramResponse\n\t| GetDailyHexagramResponse\n\t| CastReadingResponse;\n\n/**\n * I Ching hexagram card. Renders /iching/hexagrams/{number}, /iching/cast,\n * /iching/daily, /iching/daily/cast.\n */\n@customElement('roxy-hexagram')\nexport class RoxyHexagram extends LitElement {\n\tstatic styles = [\n\t\tbaseStyles,\n\t\tcss`\n\t\t\t.card {\n\t\t\t\tbackground: var(--roxy-bg, #fff);\n\t\t\t\tborder: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t\tpadding: var(--roxy-space-lg, 1.5rem);\n\t\t\t\tbox-shadow: var(--roxy-shadow-sm);\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: 6rem 1fr;\n\t\t\t\tgap: var(--roxy-space-lg, 1.5rem);\n\t\t\t}\n\n\t\t\t@container (max-width: 480px) {\n\t\t\t\t.card {\n\t\t\t\t\tgrid-template-columns: 1fr;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.glyphs {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t\tjustify-items: center;\n\t\t\t}\n\t\t\t.symbol {\n\t\t\t\tfont-size: 3rem;\n\t\t\t\tline-height: 1;\n\t\t\t\tcolor: var(--roxy-accent-fg, #b45309);\n\t\t\t}\n\t\t\t.lines {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: 4px;\n\t\t\t\twidth: 4rem;\n\t\t\t}\n\t\t\t.line {\n\t\t\t\tdisplay: flex;\n\t\t\t\tgap: 4px;\n\t\t\t\tjustify-content: center;\n\t\t\t\talign-items: center;\n\t\t\t\theight: 8px;\n\t\t\t}\n\t\t\t.seg {\n\t\t\t\tdisplay: block;\n\t\t\t\theight: 6px;\n\t\t\t\tbackground: var(--roxy-fg, #0a0a0a);\n\t\t\t\tborder-radius: 1px;\n\t\t\t}\n\t\t\t.line.broken .seg {\n\t\t\t\twidth: 1.4rem;\n\t\t\t}\n\t\t\t.line.solid .seg {\n\t\t\t\twidth: 3rem;\n\t\t\t}\n\t\t\t.line.changing .seg {\n\t\t\t\tbackground: var(--roxy-accent, #f59e0b);\n\t\t\t}\n\n\t\t\t.title {\n\t\t\t\tmargin: 0;\n\t\t\t\tfont-size: var(--roxy-text-xl, 1.5rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tletter-spacing: var(--roxy-tracking-tight);\n\t\t\t}\n\t\t\t.subtitle {\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tmargin: 0 0 var(--roxy-space-sm, 0.5rem);\n\t\t\t}\n\t\t\t.trigrams {\n\t\t\t\tdisplay: flex;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t\tmargin-bottom: var(--roxy-space-sm, 0.5rem);\n\t\t\t\tcolor: var(--roxy-secondary, #475569);\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tletter-spacing: 0.06em;\n\t\t\t}\n\t\t\t.tri-glyph {\n\t\t\t\tfont-size: var(--roxy-text-xl, 1.5rem);\n\t\t\t\tcolor: var(--roxy-accent-fg, #b45309);\n\t\t\t\tmargin-right: 4px;\n\t\t\t\tvertical-align: middle;\n\t\t\t}\n\t\t\t.judgment,\n\t\t\t.image,\n\t\t\t.message {\n\t\t\t\tmargin: 0 0 var(--roxy-space-sm, 0.5rem);\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t}\n\t\t\t.judgment::before {\n\t\t\t\tcontent: 'Judgment. ';\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tcolor: var(--roxy-secondary, #475569);\n\t\t\t}\n\t\t\t.image::before {\n\t\t\t\tcontent: 'Image. ';\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tcolor: var(--roxy-secondary, #475569);\n\t\t\t}\n\n\t\t\t.changing {\n\t\t\t\tmargin-top: var(--roxy-space-md, 1rem);\n\t\t\t\tpadding-top: var(--roxy-space-md, 1rem);\n\t\t\t\tborder-top: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tcolor: var(--roxy-accent-fg, #b45309);\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\tdata: HexagramData | null = null;\n\n\t@property({ type: String, reflect: true })\n\tmode: 'lookup' | 'cast' | 'daily' = 'lookup';\n\n\tprivate resolveHexagram(): {\n\t\thex: Hexagram;\n\t\tlines?: number[];\n\t\tchangingLinePositions?: number[];\n\t\tdailyMessage?: string;\n\t\tresultingHexagram?: Hexagram;\n\t} | null {\n\t\tconst d = this.data;\n\t\tif (!d) return null;\n\t\tif ('hexagram' in d && d.hexagram) {\n\t\t\tif ('lines' in d) {\n\t\t\t\tconst cast = d as CastReadingResponse;\n\t\t\t\treturn {\n\t\t\t\t\thex: cast.hexagram as Hexagram,\n\t\t\t\t\tlines: cast.lines,\n\t\t\t\t\tchangingLinePositions: cast.changingLinePositions,\n\t\t\t\t\tresultingHexagram: cast.resultingHexagram as Hexagram | undefined,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst daily = d as GetDailyHexagramResponse;\n\t\t\treturn {\n\t\t\t\thex: daily.hexagram as Hexagram,\n\t\t\t\tdailyMessage: daily.dailyMessage,\n\t\t\t};\n\t\t}\n\t\treturn { hex: d as Hexagram };\n\t}\n\n\trender() {\n\t\tconst resolved = this.resolveHexagram();\n\t\tif (!resolved)\n\t\t\treturn html`<div class=\"roxy-empty\" role=\"status\">No hexagram data</div>`;\n\n\t\tconst {\n\t\t\thex: h,\n\t\t\tlines: castLines,\n\t\t\tchangingLinePositions,\n\t\t\tdailyMessage,\n\t\t\tresultingHexagram,\n\t\t} = resolved;\n\t\tconst lines = castLines ?? this.derivedLines(h);\n\t\tconst changing = new Set(changingLinePositions ?? []);\n\n\t\treturn html`<article class=\"card\" aria-label=\"I Ching hexagram\">\n\t\t\t<div class=\"glyphs\">\n\t\t\t\t${h.symbol ? html`<div class=\"symbol\">${h.symbol}</div>` : nothing}\n\t\t\t\t<div class=\"lines\" aria-hidden=\"true\">\n\t\t\t\t\t${lines\n\t\t\t\t\t\t.slice()\n\t\t\t\t\t\t.reverse()\n\t\t\t\t\t\t.map((l, idx) => {\n\t\t\t\t\t\t\t// reverse so visual top is line 6\n\t\t\t\t\t\t\tconst realIdx = lines.length - 1 - idx + 1;\n\t\t\t\t\t\t\tconst isChanging = changing.has(realIdx);\n\t\t\t\t\t\t\tconst broken = l === 6 || l === 8;\n\t\t\t\t\t\t\tconst cls = `${broken ? 'broken' : 'solid'}${isChanging ? ' changing' : ''}`;\n\t\t\t\t\t\t\treturn html`<div class=\"line ${cls}\">\n\t\t\t\t\t\t\t\t${\n\t\t\t\t\t\t\t\t\tbroken\n\t\t\t\t\t\t\t\t\t\t? svg`<span class=\"seg\"></span><span class=\"seg\"></span>`\n\t\t\t\t\t\t\t\t\t\t: svg`<span class=\"seg\"></span>`\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</div>`;\n\t\t\t\t\t\t})}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div>\n\t\t\t\t<h2 class=\"title\">\n\t\t\t\t\t${h.number ? html`${h.number}. ` : nothing}${h.english ?? h.chinese ?? 'Hexagram'}\n\t\t\t\t</h2>\n\t\t\t\t<p class=\"subtitle\">\n\t\t\t\t\t${h.chinese ? html`${h.chinese}` : nothing}\n\t\t\t\t\t${h.pinyin ? html` \u00B7 ${h.pinyin}` : nothing}\n\t\t\t\t</p>\n\t\t\t\t<div class=\"trigrams\">\n\t\t\t\t\t${\n\t\t\t\t\t\th.upperTrigram\n\t\t\t\t\t\t\t? html`<div>\n\t\t\t\t\t\t\t\tUpper\n\t\t\t\t\t\t\t\t<span class=\"tri-glyph\"\n\t\t\t\t\t\t\t\t\t>${TRIGRAM_GLYPH[h.upperTrigram] ?? ''}</span\n\t\t\t\t\t\t\t\t>${h.upperTrigram}\n\t\t\t\t\t\t\t</div>`\n\t\t\t\t\t\t\t: nothing\n\t\t\t\t\t}\n\t\t\t\t\t${\n\t\t\t\t\t\th.lowerTrigram\n\t\t\t\t\t\t\t? html`<div>\n\t\t\t\t\t\t\t\tLower\n\t\t\t\t\t\t\t\t<span class=\"tri-glyph\"\n\t\t\t\t\t\t\t\t\t>${TRIGRAM_GLYPH[h.lowerTrigram] ?? ''}</span\n\t\t\t\t\t\t\t\t>${h.lowerTrigram}\n\t\t\t\t\t\t\t</div>`\n\t\t\t\t\t\t\t: nothing\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t\t${h.judgment ? html`<p class=\"judgment\">${h.judgment}</p>` : nothing}\n\t\t\t\t${h.image ? html`<p class=\"image\">${h.image}</p>` : nothing}\n\t\t\t\t${dailyMessage ? html`<p class=\"message\">${dailyMessage}</p>` : nothing}\n\t\t\t\t${\n\t\t\t\t\th.interpretation?.general\n\t\t\t\t\t\t? html`<p>${h.interpretation.general}</p>`\n\t\t\t\t\t\t: nothing\n\t\t\t\t}\n\t\t\t\t${\n\t\t\t\t\tchanging.size > 0\n\t\t\t\t\t\t? html`<div class=\"changing\">\n\t\t\t\t\t\t\tChanging lines: ${Array.from(changing)\n\t\t\t\t\t\t\t\t.sort((a, b) => a - b)\n\t\t\t\t\t\t\t\t.join(', ')}.\n\t\t\t\t\t\t\t${\n\t\t\t\t\t\t\t\tresultingHexagram?.english\n\t\t\t\t\t\t\t\t\t? html` Becomes hexagram ${resultingHexagram.number}\n\t\t\t\t\t\t\t\t\t\t${resultingHexagram.english}.`\n\t\t\t\t\t\t\t\t\t: nothing\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</div>`\n\t\t\t\t\t\t: nothing\n\t\t\t\t}\n\t\t\t</div>\n\t\t</article>`;\n\t}\n\n\t/** When the API only ships symbol+number with no line array, render six solid yang. */\n\tprivate derivedLines(h: Hexagram): number[] {\n\t\t// Map each character of the unicode hexagram block (U+4DC0..) to broken/solid\n\t\tconst cp = h.symbol.codePointAt(0) ?? 0;\n\t\tif (cp >= 0x4dc0 && cp <= 0x4dff) {\n\t\t\tconst offset = cp - 0x4dc0;\n\t\t\tconst lines: number[] = [];\n\t\t\tfor (let i = 0; i < 6; i++) {\n\t\t\t\tconst broken = (offset >> i) & 1;\n\t\t\t\tlines.push(broken ? 8 : 7);\n\t\t\t}\n\t\t\treturn lines;\n\t\t}\n\t\treturn Array.from({ length: 6 }, () => 7);\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'roxy-hexagram': RoxyHexagram;\n\t}\n}\n", "import { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { SIGN_GLYPH } from '../tokens/index.js';\nimport type {\n\tGetDailyHoroscopeResponse,\n\tGetMonthlyHoroscopeResponse,\n\tGetWeeklyHoroscopeResponse,\n} from '../types/index.js';\nimport { baseStyles } from '../utils/base-styles.js';\nimport { capitalize } from '../utils/string.js';\n\ntype HoroscopeData =\n\t| GetDailyHoroscopeResponse\n\t| GetWeeklyHoroscopeResponse\n\t| GetMonthlyHoroscopeResponse;\n\n/**\n * Daily, weekly, or monthly horoscope card. Pass `data` from\n * /astrology/horoscope/{sign}/{daily|weekly|monthly}.\n */\n@customElement('roxy-horoscope-card')\nexport class RoxyHoroscopeCard extends LitElement {\n\tstatic styles = [\n\t\tbaseStyles,\n\t\tcss`\n\t\t\t.card {\n\t\t\t\tbackground: var(--roxy-bg, #fff);\n\t\t\t\tborder: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t\tpadding: var(--roxy-space-lg, 1.5rem);\n\t\t\t\tbox-shadow: var(--roxy-shadow-sm);\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\n\t\t\t.head {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\n\t\t\t.glyph {\n\t\t\t\tfont-size: 2.25rem;\n\t\t\t\tcolor: var(--roxy-accent-fg, #b45309);\n\t\t\t\tline-height: 1;\n\t\t\t}\n\n\t\t\t.title {\n\t\t\t\tfont-size: var(--roxy-text-xl, 1.5rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tmargin: 0;\n\t\t\t\tletter-spacing: var(--roxy-tracking-tight);\n\t\t\t\ttext-transform: capitalize;\n\t\t\t}\n\n\t\t\t.date {\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t}\n\n\t\t\t.energy {\n\t\t\t\tmargin-left: auto;\n\t\t\t\tfont-variant-numeric: tabular-nums;\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tcolor: var(--roxy-secondary, #475569);\n\t\t\t}\n\t\t\t.energy-bar {\n\t\t\t\tdisplay: inline-block;\n\t\t\t\twidth: 6rem;\n\t\t\t\theight: 6px;\n\t\t\t\tbackground: var(--roxy-border, #e4e4e7);\n\t\t\t\tborder-radius: var(--roxy-radius-full, 9999px);\n\t\t\t\toverflow: hidden;\n\t\t\t\tmargin-left: 6px;\n\t\t\t\tvertical-align: middle;\n\t\t\t}\n\t\t\t.energy-bar > span {\n\t\t\t\tdisplay: block;\n\t\t\t\theight: 100%;\n\t\t\t\tbackground: var(--roxy-accent, #f59e0b);\n\t\t\t\ttransition:\n\t\t\t\t\twidth var(--roxy-motion-duration, 200ms)\n\t\t\t\t\tvar(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1));\n\t\t\t}\n\n\t\t\t.overview {\n\t\t\t\tfont-size: var(--roxy-text-base, 1rem);\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t\tmargin: 0;\n\t\t\t}\n\n\t\t\t.sections {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\n\t\t\t.section h3 {\n\t\t\t\tmargin: 0 0 var(--roxy-space-xs, 0.25rem) 0;\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tletter-spacing: 0.06em;\n\t\t\t}\n\t\t\t.section p {\n\t\t\t\tmargin: 0;\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t}\n\n\t\t\t.lucky {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-wrap: wrap;\n\t\t\t\tgap: var(--roxy-space-sm, 0.5rem);\n\t\t\t\tborder-top: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tpadding-top: var(--roxy-space-md, 1rem);\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tcolor: var(--roxy-secondary, #475569);\n\t\t\t}\n\n\t\t\t.lucky strong {\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t}\n\n\t\t\t.compat-wrap {\n\t\t\t\twidth: 100%;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tflex-wrap: wrap;\n\t\t\t\tgap: var(--roxy-space-xs, 0.25rem);\n\t\t\t}\n\t\t\t.compat {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-wrap: wrap;\n\t\t\t\tgap: var(--roxy-space-xs, 0.25rem);\n\t\t\t}\n\t\t\t.compat span {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-accent, #f59e0b) 16%, transparent);\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t\tpadding: 2px 8px;\n\t\t\t\tborder-radius: var(--roxy-radius-full, 9999px);\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\ttext-transform: capitalize;\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\tdata: HoroscopeData | null = null;\n\n\t@property({ type: String, reflect: true })\n\tperiod: 'daily' | 'weekly' | 'monthly' = 'daily';\n\n\trender() {\n\t\tconst d = this.data;\n\t\tif (!d)\n\t\t\treturn html`<div class=\"roxy-empty\" role=\"status\">No horoscope data</div>`;\n\n\t\tconst sign = d.sign ?? '';\n\t\tconst glyph = sign ? (SIGN_GLYPH[capitalize(sign)] ?? '') : '';\n\t\tconst energy =\n\t\t\t'energyRating' in d && typeof d.energyRating === 'number'\n\t\t\t\t? d.energyRating\n\t\t\t\t: null;\n\t\tconst dateLabel =\n\t\t\t('date' in d && d.date) ||\n\t\t\t('week' in d && d.week) ||\n\t\t\t('month' in d && d.month) ||\n\t\t\t'';\n\n\t\treturn html`<article\n\t\t\tclass=\"card\"\n\t\t\taria-label=${`${this.period} horoscope for ${sign}`}\n\t\t>\n\t\t\t<header class=\"head\">\n\t\t\t\t<span class=\"glyph\" aria-hidden=\"true\">${glyph}</span>\n\t\t\t\t<div>\n\t\t\t\t\t<h2 class=\"title\">${sign} ${this.period}</h2>\n\t\t\t\t\t${dateLabel ? html`<div class=\"date\">${dateLabel}</div>` : nothing}\n\t\t\t\t</div>\n\t\t\t\t${\n\t\t\t\t\tenergy !== null\n\t\t\t\t\t\t? html`<span class=\"energy\" aria-label=${`Energy ${energy} of 10`}>\n\t\t\t\t\t\t\tEnergy ${energy}/10\n\t\t\t\t\t\t\t<span class=\"energy-bar\"\n\t\t\t\t\t\t\t\t><span style=\"width: ${(energy / 10) * 100}%\"></span\n\t\t\t\t\t\t\t></span>\n\t\t\t\t\t\t</span>`\n\t\t\t\t\t\t: nothing\n\t\t\t\t}\n\t\t\t</header>\n\n\t\t\t${d.overview ? html`<p class=\"overview\">${d.overview}</p>` : nothing}\n\n\t\t\t<div class=\"sections\">\n\t\t\t\t${\n\t\t\t\t\td.love\n\t\t\t\t\t\t? html`<div class=\"section\">\n\t\t\t\t\t\t\t<h3>Love</h3>\n\t\t\t\t\t\t\t<p>${d.love}</p>\n\t\t\t\t\t\t</div>`\n\t\t\t\t\t\t: nothing\n\t\t\t\t}\n\t\t\t\t${\n\t\t\t\t\td.career\n\t\t\t\t\t\t? html`<div class=\"section\">\n\t\t\t\t\t\t\t<h3>Career</h3>\n\t\t\t\t\t\t\t<p>${d.career}</p>\n\t\t\t\t\t\t</div>`\n\t\t\t\t\t\t: nothing\n\t\t\t\t}\n\t\t\t\t${\n\t\t\t\t\td.health\n\t\t\t\t\t\t? html`<div class=\"section\">\n\t\t\t\t\t\t\t<h3>Health</h3>\n\t\t\t\t\t\t\t<p>${d.health}</p>\n\t\t\t\t\t\t</div>`\n\t\t\t\t\t\t: nothing\n\t\t\t\t}\n\t\t\t\t${\n\t\t\t\t\td.finance\n\t\t\t\t\t\t? html`<div class=\"section\">\n\t\t\t\t\t\t\t<h3>Finance</h3>\n\t\t\t\t\t\t\t<p>${d.finance}</p>\n\t\t\t\t\t\t</div>`\n\t\t\t\t\t\t: nothing\n\t\t\t\t}\n\t\t\t\t${\n\t\t\t\t\t'advice' in d && d.advice\n\t\t\t\t\t\t? html`<div class=\"section\">\n\t\t\t\t\t\t\t<h3>Advice</h3>\n\t\t\t\t\t\t\t<p>${d.advice}</p>\n\t\t\t\t\t\t</div>`\n\t\t\t\t\t\t: nothing\n\t\t\t\t}\n\t\t\t</div>\n\n\t\t\t${(() => {\n\t\t\t\tconst luckyNumber =\n\t\t\t\t\t'luckyNumber' in d && d.luckyNumber !== undefined\n\t\t\t\t\t\t? d.luckyNumber\n\t\t\t\t\t\t: undefined;\n\t\t\t\tconst luckyColor =\n\t\t\t\t\t'luckyColor' in d && d.luckyColor ? d.luckyColor : '';\n\t\t\t\tconst luckyNumbers =\n\t\t\t\t\t'luckyNumbers' in d && d.luckyNumbers ? d.luckyNumbers : [];\n\t\t\t\tconst luckyDays = 'luckyDays' in d && d.luckyDays ? d.luckyDays : [];\n\t\t\t\tconst compatibleSigns = d.compatibleSigns ?? [];\n\t\t\t\tif (\n\t\t\t\t\tluckyNumber === undefined &&\n\t\t\t\t\t!luckyColor &&\n\t\t\t\t\tluckyNumbers.length === 0 &&\n\t\t\t\t\tluckyDays.length === 0 &&\n\t\t\t\t\tcompatibleSigns.length === 0\n\t\t\t\t)\n\t\t\t\t\treturn nothing;\n\t\t\t\treturn html`<div class=\"lucky\">\n\t\t\t\t\t\t${\n\t\t\t\t\t\t\tluckyNumber !== undefined\n\t\t\t\t\t\t\t\t? html`<span>Lucky number <strong>${luckyNumber}</strong></span>`\n\t\t\t\t\t\t\t\t: nothing\n\t\t\t\t\t\t}\n\t\t\t\t\t\t${\n\t\t\t\t\t\t\tluckyColor\n\t\t\t\t\t\t\t\t? html`<span>Lucky color <strong>${luckyColor}</strong></span>`\n\t\t\t\t\t\t\t\t: nothing\n\t\t\t\t\t\t}\n\t\t\t\t\t\t${\n\t\t\t\t\t\t\tluckyNumbers.length\n\t\t\t\t\t\t\t\t? html`<span\n\t\t\t\t\t\t\t\t\t>Lucky numbers\n\t\t\t\t\t\t\t\t\t<strong>${luckyNumbers.join(', ')}</strong></span\n\t\t\t\t\t\t\t\t>`\n\t\t\t\t\t\t\t\t: nothing\n\t\t\t\t\t\t}\n\t\t\t\t\t\t${\n\t\t\t\t\t\t\tluckyDays.length\n\t\t\t\t\t\t\t\t? html`<span\n\t\t\t\t\t\t\t\t\t>Lucky days <strong>${luckyDays.join(', ')}</strong></span\n\t\t\t\t\t\t\t\t>`\n\t\t\t\t\t\t\t\t: nothing\n\t\t\t\t\t\t}\n\t\t\t\t\t\t${\n\t\t\t\t\t\t\tcompatibleSigns.length\n\t\t\t\t\t\t\t\t? html`<span class=\"compat-wrap\">\n\t\t\t\t\t\t\t\t\tBest with\n\t\t\t\t\t\t\t\t\t<span class=\"compat\"\n\t\t\t\t\t\t\t\t\t\t>${compatibleSigns.map(\n\t\t\t\t\t\t\t\t\t\t\t(s) => html`<span>${s}</span>`,\n\t\t\t\t\t\t\t\t\t\t)}</span\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t</span>`\n\t\t\t\t\t\t\t\t: nothing\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>`;\n\t\t\t})()}\n\t\t</article>`;\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'roxy-horoscope-card': RoxyHoroscopeCard;\n\t}\n}\n", "import { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type { KpPlanetsResponse } from '../types/index.js';\nimport { baseStyles } from '../utils/base-styles.js';\nimport { formatNumber } from '../utils/format.js';\n\n/**\n * KP planets table with sub-lord and sub-sub-lord columns. Renders\n * /vedic-astrology/kp/planets.\n */\n@customElement('roxy-kp-planets-table')\nexport class RoxyKpPlanetsTable extends LitElement {\n\tstatic styles = [\n\t\tbaseStyles,\n\t\tcss`\n\t\t\t.wrap {\n\t\t\t\tborder: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t\tbackground: var(--roxy-bg, #fff);\n\t\t\t\toverflow: auto;\n\t\t\t\tbox-shadow: var(--roxy-shadow-sm);\n\t\t\t}\n\t\t\t.head {\n\t\t\t\tpadding: var(--roxy-space-md, 1rem);\n\t\t\t\tborder-bottom: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\tflex-wrap: wrap;\n\t\t\t\tgap: var(--roxy-space-sm, 0.5rem);\n\t\t\t}\n\t\t\t.title {\n\t\t\t\tmargin: 0;\n\t\t\t\tfont-size: var(--roxy-text-lg, 1.125rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t}\n\t\t\t.ayanamsa {\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t}\n\t\t\ttable {\n\t\t\t\twidth: 100%;\n\t\t\t\tborder-collapse: collapse;\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tmin-width: 560px;\n\t\t\t}\n\t\t\tthead {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-border, #e4e4e7) 20%, transparent);\n\t\t\t}\n\t\t\tth,\n\t\t\ttd {\n\t\t\t\tpadding: var(--roxy-space-sm, 0.5rem) var(--roxy-space-md, 1rem);\n\t\t\t\ttext-align: left;\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\t\t\tth {\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tletter-spacing: 0.04em;\n\t\t\t}\n\t\t\ttbody tr {\n\t\t\t\tborder-top: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t}\n\t\t\ttd.planet {\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t}\n\t\t\t.retro {\n\t\t\t\tcolor: var(--roxy-warning-fg, #9a3412);\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tmargin-left: 4px;\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\tdata: KpPlanetsResponse | null = null;\n\n\trender() {\n\t\tif (!this.data)\n\t\t\treturn html`<div class=\"roxy-empty\" role=\"status\">No KP data</div>`;\n\t\tconst planets = this.data.planets ?? [];\n\n\t\treturn html`<div\n\t\t\tclass=\"wrap\"\n\t\t\taria-label=\"KP planets table\"\n\t\t\ttabindex=\"0\"\n\t\t>\n\t\t\t<header class=\"head\">\n\t\t\t\t<h2 class=\"title\">KP planets</h2>\n\t\t\t\t${\n\t\t\t\t\ttypeof this.data.ayanamsa === 'number'\n\t\t\t\t\t\t? html`<span class=\"ayanamsa\">Ayanamsa: ${formatNumber(this.data.ayanamsa, 2)}\u00B0</span>`\n\t\t\t\t\t\t: nothing\n\t\t\t\t}\n\t\t\t</header>\n\t\t\t<table role=\"table\">\n\t\t\t\t<thead>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<th scope=\"col\">Planet</th>\n\t\t\t\t\t\t<th scope=\"col\">Sign</th>\n\t\t\t\t\t\t<th scope=\"col\">Sign lord</th>\n\t\t\t\t\t\t<th scope=\"col\">Nakshatra</th>\n\t\t\t\t\t\t<th scope=\"col\">Star lord</th>\n\t\t\t\t\t\t<th scope=\"col\">Sub lord</th>\n\t\t\t\t\t\t<th scope=\"col\">Sub sub lord</th>\n\t\t\t\t\t\t<th scope=\"col\">KP no.</th>\n\t\t\t\t\t</tr>\n\t\t\t\t</thead>\n\t\t\t\t<tbody>\n\t\t\t\t\t${planets.map(\n\t\t\t\t\t\t(p) => html`<tr>\n\t\t\t\t\t\t\t<td class=\"planet\">\n\t\t\t\t\t\t\t\t${p.planet}\n\t\t\t\t\t\t\t\t${p.retrograde ? html`<span class=\"retro\">R</span>` : nothing}\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t<td>${p.sign ?? ''}</td>\n\t\t\t\t\t\t\t<td>${p.signLord ?? ''}</td>\n\t\t\t\t\t\t\t<td>${p.nakshatra ?? ''}</td>\n\t\t\t\t\t\t\t<td>${p.nakshatraLord ?? ''}</td>\n\t\t\t\t\t\t\t<td>${p.subLord ?? ''}</td>\n\t\t\t\t\t\t\t<td>${p.subSubLord ?? ''}</td>\n\t\t\t\t\t\t\t<td>${p.kpNumber ?? ''}</td>\n\t\t\t\t\t\t</tr>`,\n\t\t\t\t\t)}\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t</div>`;\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'roxy-kp-planets-table': RoxyKpPlanetsTable;\n\t}\n}\n", "import { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport type { SearchCitiesResponse } from '../types/index.js';\nimport { baseStyles } from '../utils/base-styles.js';\nimport { debounce } from '../utils/debounce.js';\n\ntype CityResult = SearchCitiesResponse['cities'][number];\n\n/**\n * Stateful location search input. Calls /location/search and emits\n * `roxy-location-select` CustomEvent with the chosen city. Required for any\n * chart endpoint.\n *\n * Behavior: 300ms input debounce, click-outside dismiss, keyboard navigation\n * with arrow keys / Enter / Escape, AbortController on stale requests.\n *\n * Attributes:\n *   api-key            optional. Direct call to roxyapi.com when set.\n *   publishable-key    optional. Browser-safe pk_* key with allowed_origins.\n *   endpoint           optional. Override URL (default https://roxyapi.com/api/v2/location/search).\n *   placeholder        optional. Input placeholder.\n *   default-value      optional. Pre-filled query.\n */\n@customElement('roxy-location-search')\nexport class RoxyLocationSearch extends LitElement {\n\tstatic styles = [\n\t\tbaseStyles,\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: block;\n\t\t\t\tposition: relative;\n\t\t\t}\n\t\t\t.field {\n\t\t\t\tposition: relative;\n\t\t\t}\n\t\t\tinput {\n\t\t\t\twidth: 100%;\n\t\t\t\tpadding: var(--roxy-space-sm, 0.5rem) var(--roxy-space-md, 1rem);\n\t\t\t\tfont-size: var(--roxy-text-base, 1rem);\n\t\t\t\tfont-family: inherit;\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t\tbackground: var(--roxy-bg, #fff);\n\t\t\t\tborder: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t\ttransition:\n\t\t\t\t\tborder-color var(--roxy-motion-duration, 200ms)\n\t\t\t\t\tvar(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1));\n\t\t\t\tbox-sizing: border-box;\n\t\t\t}\n\t\t\tinput:focus {\n\t\t\t\toutline: 2px solid var(--roxy-ring, rgba(245, 158, 11, 0.4));\n\t\t\t\toutline-offset: 2px;\n\t\t\t\tborder-color: var(--roxy-accent-fg, #b45309);\n\t\t\t}\n\t\t\t.spinner {\n\t\t\t\tposition: absolute;\n\t\t\t\tright: 12px;\n\t\t\t\ttop: 50%;\n\t\t\t\ttransform: translateY(-50%);\n\t\t\t\twidth: 14px;\n\t\t\t\theight: 14px;\n\t\t\t\tborder: 2px solid var(--roxy-muted, #71717a);\n\t\t\t\tborder-top-color: transparent;\n\t\t\t\tborder-radius: 50%;\n\t\t\t\tanimation: roxy-spin 700ms linear infinite;\n\t\t\t}\n\t\t\t@keyframes roxy-spin {\n\t\t\t\tto {\n\t\t\t\t\ttransform: translateY(-50%) rotate(360deg);\n\t\t\t\t}\n\t\t\t}\n\t\t\t@media (prefers-reduced-motion: reduce) {\n\t\t\t\t.spinner {\n\t\t\t\t\tanimation: none;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.results {\n\t\t\t\tposition: absolute;\n\t\t\t\tz-index: 50;\n\t\t\t\ttop: calc(100% + 4px);\n\t\t\t\tleft: 0;\n\t\t\t\tright: 0;\n\t\t\t\tbackground: var(--roxy-bg, #fff);\n\t\t\t\tborder: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t\tbox-shadow: var(--roxy-shadow-md);\n\t\t\t\tmax-height: 22rem;\n\t\t\t\toverflow-y: auto;\n\t\t\t\tanimation: roxy-fade-in var(--roxy-motion-duration, 200ms)\n\t\t\t\t\tvar(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1));\n\t\t\t}\n\t\t\t.option {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: baseline;\n\t\t\t\tgap: var(--roxy-space-sm, 0.5rem);\n\t\t\t\twidth: 100%;\n\t\t\t\tpadding: var(--roxy-space-sm, 0.5rem) var(--roxy-space-md, 1rem);\n\t\t\t\tbackground: transparent;\n\t\t\t\tborder: 0;\n\t\t\t\ttext-align: left;\n\t\t\t\tfont-family: inherit;\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t\tcursor: pointer;\n\t\t\t\ttransition: background-color var(--roxy-motion-duration, 200ms);\n\t\t\t}\n\t\t\t.option:hover,\n\t\t\t.option[aria-selected='true'] {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-accent, #f59e0b) 10%, transparent);\n\t\t\t}\n\t\t\t.option .city {\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t}\n\t\t\t.option .where {\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tflex-grow: 1;\n\t\t\t}\n\t\t\t.option .tz {\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tfont-variant-numeric: tabular-nums;\n\t\t\t}\n\t\t\t.empty {\n\t\t\t\tpadding: var(--roxy-space-md, 1rem);\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ type: String, attribute: 'api-key' })\n\tapiKey?: string;\n\n\t@property({ type: String, attribute: 'publishable-key' })\n\tpublishableKey?: string;\n\n\t@property({ type: String })\n\tendpoint = 'https://roxyapi.com/api/v2/location/search';\n\n\t@property({ type: String })\n\tplaceholder = 'Search city';\n\n\t@property({ type: String, attribute: 'default-value' })\n\tdefaultValue = '';\n\n\t@state()\n\tprivate query = '';\n\n\t@state()\n\tprivate results: CityResult[] = [];\n\n\t@state()\n\tprivate isOpen = false;\n\n\t@state()\n\tprivate isLoading = false;\n\n\t@state()\n\tprivate highlight = -1;\n\n\tprivate clickOutsideHandler?: (e: MouseEvent) => void;\n\tprivate abortController?: AbortController;\n\tprivate secretKeyWarned = false;\n\tprivate debouncedFetch = debounce((q: string) => {\n\t\tvoid this.fetchResults(q);\n\t}, 300);\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t\tthis.query = this.defaultValue;\n\t\tthis.clickOutsideHandler = (e: MouseEvent) => {\n\t\t\tconst path = e.composedPath();\n\t\t\tif (!path.includes(this)) this.isOpen = false;\n\t\t};\n\t\tdocument.addEventListener('mousedown', this.clickOutsideHandler);\n\t}\n\n\tdisconnectedCallback(): void {\n\t\tsuper.disconnectedCallback();\n\t\tif (this.clickOutsideHandler) {\n\t\t\tdocument.removeEventListener('mousedown', this.clickOutsideHandler);\n\t\t}\n\t\tthis.debouncedFetch.cancel();\n\t\tif (this.abortController) {\n\t\t\tthis.abortController.abort();\n\t\t\tthis.abortController = undefined;\n\t\t}\n\t}\n\n\tprivate warnIfSecretKey() {\n\t\tif (this.secretKeyWarned) return;\n\t\tif (!this.apiKey) return;\n\t\t// Browser-safe publishable keys carry the `pk_` prefix and a server-side\n\t\t// origin allowlist. Anything else (a raw secret key, UUID-style token)\n\t\t// must not ship to the browser.\n\t\tif (this.apiKey.startsWith('pk_')) return;\n\t\tthis.secretKeyWarned = true;\n\t\tconst message =\n\t\t\t'Possible secret key in client-side <roxy-location-search>; use a `pk_` publishable key with origin allowlist instead.';\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.warn(message);\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent('roxy-validation-error', {\n\t\t\t\tdetail: { reason: 'possible-secret-key', message },\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t}),\n\t\t);\n\t}\n\n\tprivate async fetchResults(q: string) {\n\t\tthis.warnIfSecretKey();\n\t\t// Abort any in-flight request so a stale response cannot overwrite a\n\t\t// fresher one (debounced typing) or land after disconnect.\n\t\tif (this.abortController) this.abortController.abort();\n\t\tconst controller = new AbortController();\n\t\tthis.abortController = controller;\n\t\tthis.isLoading = true;\n\t\ttry {\n\t\t\tconst url = new URL(this.endpoint);\n\t\t\turl.searchParams.set('q', q);\n\t\t\turl.searchParams.set('limit', '8');\n\t\t\tconst headers: Record<string, string> = {\n\t\t\t\tAccept: 'application/json',\n\t\t\t};\n\t\t\tif (this.apiKey) headers['X-API-Key'] = this.apiKey;\n\t\t\tif (this.publishableKey) headers['X-API-Key'] = this.publishableKey;\n\t\t\tconst res = await fetch(url, { headers, signal: controller.signal });\n\t\t\tif (!res.ok) throw new Error(`HTTP ${res.status}`);\n\t\t\tconst json = (await res.json()) as SearchCitiesResponse;\n\t\t\tif (controller.signal.aborted) return;\n\t\t\tthis.results = json.cities ?? [];\n\t\t\tthis.isOpen = this.results.length > 0;\n\t\t\tthis.highlight = this.results.length > 0 ? 0 : -1;\n\t\t} catch (err) {\n\t\t\tif ((err as { name?: string })?.name === 'AbortError') return;\n\t\t\tthis.results = [];\n\t\t\tthis.isOpen = false;\n\t\t} finally {\n\t\t\tif (this.abortController === controller) {\n\t\t\t\tthis.abortController = undefined;\n\t\t\t}\n\t\t\tif (!controller.signal.aborted) this.isLoading = false;\n\t\t}\n\t}\n\n\tprivate onInput = (e: Event) => {\n\t\tconst value = (e.target as HTMLInputElement).value;\n\t\tthis.query = value;\n\t\tif (value.length < 2) {\n\t\t\tthis.results = [];\n\t\t\tthis.isOpen = false;\n\t\t\tthis.highlight = -1;\n\t\t\treturn;\n\t\t}\n\t\tthis.debouncedFetch(value);\n\t};\n\n\tprivate select(city: CityResult) {\n\t\tthis.query = `${city.city}${city.province ? `, ${city.province}` : ''}, ${city.country}`;\n\t\tthis.isOpen = false;\n\t\tthis.results = [];\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent('roxy-location-select', {\n\t\t\t\tdetail: city,\n\t\t\t\tbubbles: true,\n\t\t\t\tcomposed: true,\n\t\t\t}),\n\t\t);\n\t}\n\n\tprivate onKeyDown = (e: KeyboardEvent) => {\n\t\tif (!this.isOpen || this.results.length === 0) {\n\t\t\tif (e.key === 'ArrowDown' && this.query.length >= 2) {\n\t\t\t\tvoid this.fetchResults(this.query);\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (e.key === 'ArrowDown') {\n\t\t\te.preventDefault();\n\t\t\tthis.highlight = (this.highlight + 1) % this.results.length;\n\t\t} else if (e.key === 'ArrowUp') {\n\t\t\te.preventDefault();\n\t\t\tthis.highlight =\n\t\t\t\t(this.highlight - 1 + this.results.length) % this.results.length;\n\t\t} else if (e.key === 'Enter') {\n\t\t\te.preventDefault();\n\t\t\tconst target = this.results[this.highlight] ?? this.results[0];\n\t\t\tif (target) this.select(target);\n\t\t} else if (e.key === 'Escape') {\n\t\t\tthis.isOpen = false;\n\t\t}\n\t};\n\n\trender() {\n\t\treturn html`<div class=\"field\">\n\t\t\t<input\n\t\t\t\ttype=\"text\"\n\t\t\t\trole=\"combobox\"\n\t\t\t\taria-expanded=${this.isOpen ? 'true' : 'false'}\n\t\t\t\taria-controls=\"roxy-location-listbox\"\n\t\t\t\taria-autocomplete=\"list\"\n\t\t\t\tautocomplete=\"off\"\n\t\t\t\tplaceholder=${this.placeholder}\n\t\t\t\t.value=${this.query}\n\t\t\t\t@input=${this.onInput}\n\t\t\t\t@keydown=${this.onKeyDown}\n\t\t\t\t@focus=${() => {\n\t\t\t\t\tif (this.results.length > 0) this.isOpen = true;\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t${this.isLoading ? html`<span class=\"spinner\" role=\"status\" aria-label=\"Loading\"></span>` : nothing}\n\t\t\t${\n\t\t\t\tthis.isOpen\n\t\t\t\t\t? html`<ul\n\t\t\t\t\t\tid=\"roxy-location-listbox\"\n\t\t\t\t\t\tclass=\"results\"\n\t\t\t\t\t\trole=\"listbox\"\n\t\t\t\t\t>\n\t\t\t\t\t\t${\n\t\t\t\t\t\t\tthis.results.length === 0\n\t\t\t\t\t\t\t\t? html`<li class=\"empty\" role=\"status\">No cities found</li>`\n\t\t\t\t\t\t\t\t: this.results.map(\n\t\t\t\t\t\t\t\t\t\t(city, idx) => html`<li role=\"presentation\">\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tclass=\"option\"\n\t\t\t\t\t\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\t\t\t\t\t\taria-selected=${this.highlight === idx ? 'true' : 'false'}\n\t\t\t\t\t\t\t\t\t\t\t@click=${() => this.select(city)}\n\t\t\t\t\t\t\t\t\t\t\t@mouseenter=${() => {\n\t\t\t\t\t\t\t\t\t\t\t\tthis.highlight = idx;\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"city\">${city.city}</span>\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"where\"\n\t\t\t\t\t\t\t\t\t\t\t\t>${city.province ? html`${city.province}, ` : ''}${city.country}</span\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"tz\"\n\t\t\t\t\t\t\t\t\t\t\t\t>UTC${city.utcOffset >= 0 ? '+' : ''}${city.utcOffset}</span\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t</li>`,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t</ul>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t</div>`;\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'roxy-location-search': RoxyLocationSearch;\n\t}\n}\n", "/**\n * Lightweight debounce for input handlers. Used by location search.\n *\n * The returned function exposes a `.cancel()` method so callers can clear a\n * pending invocation when the host element disconnects, preventing the timer\n * from firing on a detached node and mutating reactive state after teardown.\n */\nexport interface Debounced<F extends (...args: never[]) => unknown> {\n\t(...args: Parameters<F>): void;\n\tcancel: () => void;\n}\n\nexport function debounce<F extends (...args: never[]) => unknown>(\n\tfn: F,\n\twait: number,\n): Debounced<F> {\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\tconst debounced = ((...args: Parameters<F>) => {\n\t\tif (timer) clearTimeout(timer);\n\t\ttimer = setTimeout(() => {\n\t\t\ttimer = undefined;\n\t\t\tfn(...args);\n\t\t}, wait);\n\t}) as Debounced<F>;\n\tdebounced.cancel = () => {\n\t\tif (timer) {\n\t\t\tclearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t}\n\t};\n\treturn debounced;\n}\n", "import { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { MOON_PHASE_EMOJI } from '../tokens/index.js';\nimport type {\n\tGetCurrentMoonPhaseResponse,\n\tGetMoonCalendarResponse,\n\tGetUpcomingMoonPhasesResponse,\n} from '../types/index.js';\nimport { baseStyles } from '../utils/base-styles.js';\nimport { formatNumber } from '../utils/format.js';\n\ntype MoonPhaseData =\n\t| GetCurrentMoonPhaseResponse\n\t| GetUpcomingMoonPhasesResponse\n\t| GetMoonCalendarResponse;\ntype MoonListEntry =\n\t| GetUpcomingMoonPhasesResponse['phases'][number]\n\t| GetMoonCalendarResponse['calendar'][number];\n\n/**\n * Moon phase card. Renders /astrology/moon-phase/{current,upcoming,calendar/...}.\n */\n@customElement('roxy-moon-phase')\nexport class RoxyMoonPhase extends LitElement {\n\tstatic styles = [\n\t\tbaseStyles,\n\t\tcss`\n\t\t\t.card {\n\t\t\t\tbackground: var(--roxy-bg, #fff);\n\t\t\t\tborder: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t\tpadding: var(--roxy-space-lg, 1.5rem);\n\t\t\t\tbox-shadow: var(--roxy-shadow-sm);\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\n\t\t\t.hero {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\t\t\t.emoji {\n\t\t\t\tfont-size: 3rem;\n\t\t\t\tline-height: 1;\n\t\t\t}\n\t\t\t.label {\n\t\t\t\tmargin: 0;\n\t\t\t\tfont-size: var(--roxy-text-lg, 1.125rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\ttext-transform: capitalize;\n\t\t\t}\n\t\t\t.date {\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t}\n\n\t\t\t.stats {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: repeat(auto-fit, minmax(8rem, 1fr));\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tcolor: var(--roxy-secondary, #475569);\n\t\t\t}\n\t\t\t.stats div span:first-child {\n\t\t\t\tdisplay: block;\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tletter-spacing: 0.06em;\n\t\t\t}\n\t\t\t.stats strong {\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t\tfont-variant-numeric: tabular-nums;\n\t\t\t}\n\n\t\t\t.meaning {\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t}\n\t\t\t.keywords {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-wrap: wrap;\n\t\t\t\tgap: var(--roxy-space-xs, 0.25rem);\n\t\t\t\tmargin-top: var(--roxy-space-sm, 0.5rem);\n\t\t\t}\n\t\t\t.keywords span {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-accent, #f59e0b) 14%, transparent);\n\t\t\t\tpadding: 2px 8px;\n\t\t\t\tborder-radius: var(--roxy-radius-full, 9999px);\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t}\n\n\t\t\t.list {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: var(--roxy-space-sm, 0.5rem);\n\t\t\t}\n\t\t\t.list-item {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: 2.5rem 1fr auto;\n\t\t\t\tgap: var(--roxy-space-sm, 0.5rem);\n\t\t\t\talign-items: center;\n\t\t\t\tborder-bottom: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tpadding: var(--roxy-space-sm, 0.5rem) 0;\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t}\n\t\t\t.list-item:last-child {\n\t\t\t\tborder-bottom: none;\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\tdata: MoonPhaseData | null = null;\n\n\t@property({ type: String, reflect: true })\n\tmode: 'current' | 'upcoming' | 'calendar' = 'current';\n\n\trender() {\n\t\tconst d = this.data;\n\t\tif (!d)\n\t\t\treturn html`<div class=\"roxy-empty\" role=\"status\">No moon phase data</div>`;\n\t\tconst list: MoonListEntry[] =\n\t\t\t'phases' in d ? d.phases : 'calendar' in d ? d.calendar : [];\n\t\tif (this.mode !== 'current' && list.length > 0) {\n\t\t\tconst month = 'month' in d ? d.month : undefined;\n\t\t\tconst year = 'year' in d ? d.year : undefined;\n\t\t\treturn html`<article\n\t\t\t\tclass=\"card\"\n\t\t\t\taria-label=\"Moon phase calendar\"\n\t\t\t>\n\t\t\t\t<h2 class=\"label\">${month ?? 'Moon phases'} ${year ?? ''}</h2>\n\t\t\t\t<div class=\"list\" role=\"list\">\n\t\t\t\t\t${list.map((phase) => this.renderListItem(phase))}\n\t\t\t\t</div>\n\t\t\t</article>`;\n\t\t}\n\t\tif (!('phase' in d)) return nothing;\n\t\treturn this.renderSingle(d);\n\t}\n\n\tprivate renderSingle(d: GetCurrentMoonPhaseResponse) {\n\t\tconst emoji = phaseEmoji(d.phase);\n\t\treturn html`<article class=\"card\" aria-label=\"Current moon phase\">\n\t\t\t<div class=\"hero\">\n\t\t\t\t<span class=\"emoji\" aria-hidden=\"true\">${emoji}</span>\n\t\t\t\t<div>\n\t\t\t\t\t<h2 class=\"label\">${d.phase ?? 'Moon'}</h2>\n\t\t\t\t\t${d.date ? html`<div class=\"date\">${d.date}</div>` : nothing}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"stats\">\n\t\t\t\t${\n\t\t\t\t\ttypeof d.illumination === 'number'\n\t\t\t\t\t\t? html`<div>\n\t\t\t\t\t\t\t<span>Illumination</span>\n\t\t\t\t\t\t\t<strong>${formatIllumination(d.illumination)}</strong>\n\t\t\t\t\t\t</div>`\n\t\t\t\t\t\t: nothing\n\t\t\t\t}\n\t\t\t\t${\n\t\t\t\t\ttypeof d.age === 'number'\n\t\t\t\t\t\t? html`<div>\n\t\t\t\t\t\t\t<span>Age</span>\n\t\t\t\t\t\t\t<strong>${formatNumber(d.age, 1)} days</strong>\n\t\t\t\t\t\t</div>`\n\t\t\t\t\t\t: nothing\n\t\t\t\t}\n\t\t\t\t${\n\t\t\t\t\td.sign\n\t\t\t\t\t\t? html`<div>\n\t\t\t\t\t\t\t<span>Sign</span>\n\t\t\t\t\t\t\t<strong>${d.sign}</strong>\n\t\t\t\t\t\t</div>`\n\t\t\t\t\t\t: nothing\n\t\t\t\t}\n\t\t\t\t${\n\t\t\t\t\ttypeof d.distance === 'number'\n\t\t\t\t\t\t? html`<div>\n\t\t\t\t\t\t\t<span>Distance</span>\n\t\t\t\t\t\t\t<strong>${(d.distance / 1000).toFixed(0)}k km</strong>\n\t\t\t\t\t\t</div>`\n\t\t\t\t\t\t: nothing\n\t\t\t\t}\n\t\t\t</div>\n\t\t\t${\n\t\t\t\td.meaning?.description\n\t\t\t\t\t? html`<p class=\"meaning\">${d.meaning.description}</p>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t\t${\n\t\t\t\td.meaning?.keywords?.length\n\t\t\t\t\t? html`<div class=\"keywords\">\n\t\t\t\t\t\t${d.meaning.keywords.map((k) => html`<span>${k}</span>`)}\n\t\t\t\t\t</div>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t</article>`;\n\t}\n\n\tprivate renderListItem(p: MoonListEntry) {\n\t\tconst emoji = phaseEmoji(p.phase);\n\t\treturn html`<div class=\"list-item\" role=\"listitem\">\n\t\t\t<span aria-hidden=\"true\">${emoji}</span>\n\t\t\t<span>${p.phase}</span>\n\t\t\t<span>${p.date ?? ''}</span>\n\t\t</div>`;\n\t}\n}\n\nfunction phaseEmoji(phase: string | undefined): string {\n\tif (!phase) return '\uD83C\uDF19';\n\treturn MOON_PHASE_EMOJI[phase.toLowerCase()] ?? '\uD83C\uDF19';\n}\n\nfunction formatIllumination(v: number): string {\n\tconst pct = v <= 1 ? v * 100 : v;\n\treturn `${Math.round(pct)}%`;\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'roxy-moon-phase': RoxyMoonPhase;\n\t}\n}\n", "import { css, html, LitElement, nothing, svg } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { PLANET_GLYPH, SIGN_GLYPH, SIGNS_ORDER } from '../tokens/index.js';\nimport type { NatalChartResponse } from '../types/index.js';\nimport { baseStyles } from '../utils/base-styles.js';\nimport { polarToCartesian } from '../utils/degree.js';\nimport {\n\tASPECT_CLASS,\n\tformatNumber,\n\tnormalizeAspect,\n} from '../utils/format.js';\nimport { capitalize } from '../utils/string.js';\n\ntype PlanetEntry = NatalChartResponse['planets'][number];\ntype AspectEntry = NatalChartResponse['aspects'][number];\n\nconst SIZE = 420;\nconst CENTER = SIZE / 2;\nconst OUTER_R = 164;\nconst SIGN_R = 146;\nconst HOUSE_R = 120;\nconst PLANET_R = 96;\nconst ANGLE_TICK_R = 178;\nconst ANGLE_LABEL_R = 196;\n\n/**\n * Western natal chart wheel. Renders the 12 zodiac signs, 12 houses, planet\n * markers, and aspect lines from a /astrology/natal-chart response.\n */\n@customElement('roxy-natal-chart')\nexport class RoxyNatalChart extends LitElement {\n\tstatic styles = [\n\t\tbaseStyles,\n\t\tcss`\n\t\t\t.wrap {\n\t\t\t\twidth: 100%;\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\n\t\t\t.title {\n\t\t\t\tfont-size: var(--roxy-text-lg, 1.125rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tmargin: 0;\n\t\t\t\tcolor: var(--roxy-primary, #0f172a);\n\t\t\t}\n\n\t\t\t.meta {\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t}\n\n\t\t\tsvg {\n\t\t\t\tdisplay: block;\n\t\t\t\twidth: 100%;\n\t\t\t\tmax-width: 360px;\n\t\t\t\theight: auto;\n\t\t\t\tmargin: 0 auto;\n\t\t\t}\n\n\t\t\t.wheel-line {\n\t\t\t\tfill: none;\n\t\t\t\tstroke: var(--roxy-border, #e4e4e7);\n\t\t\t}\n\n\t\t\t.sign-glyph {\n\t\t\t\tfill: var(--roxy-secondary, #475569);\n\t\t\t\tfont-size: 14px;\n\t\t\t\tfont-family: var(--roxy-font-sans);\n\t\t\t}\n\n\t\t\t.planet-glyph {\n\t\t\t\tfill: var(--roxy-accent, #f59e0b);\n\t\t\t\tfont-size: 14px;\n\t\t\t\tfont-weight: 600;\n\t\t\t\tfont-family: var(--roxy-font-sans);\n\t\t\t}\n\n\t\t\t.house-num {\n\t\t\t\tfill: var(--roxy-muted, #71717a);\n\t\t\t\tfont-size: 9px;\n\t\t\t\tfont-family: var(--roxy-font-sans);\n\t\t\t}\n\n\t\t\t.aspect {\n\t\t\t\tstroke-width: 0.8;\n\t\t\t\tfill: none;\n\t\t\t\topacity: 0.55;\n\t\t\t}\n\t\t\t.aspect-trine,\n\t\t\t.aspect-sextile {\n\t\t\t\tstroke: var(--roxy-success, #16a34a);\n\t\t\t}\n\t\t\t.aspect-square,\n\t\t\t.aspect-opposition {\n\t\t\t\tstroke: var(--roxy-danger, #dc2626);\n\t\t\t}\n\t\t\t.aspect-conjunction {\n\t\t\t\tstroke: var(--roxy-accent-fg, #b45309);\n\t\t\t}\n\t\t\t.aspect-other {\n\t\t\t\tstroke: var(--roxy-muted, #71717a);\n\t\t\t\topacity: 0.4;\n\t\t\t}\n\n\t\t\t.angle-marker {\n\t\t\t\tfill: var(--roxy-accent-fg, #b45309);\n\t\t\t\tfont-size: 10px;\n\t\t\t\tfont-weight: 700;\n\t\t\t\tfont-family: var(--roxy-font-sans);\n\t\t\t\tletter-spacing: 0.04em;\n\t\t\t}\n\t\t\t.angle-tick {\n\t\t\t\tstroke: var(--roxy-accent-fg, #b45309);\n\t\t\t\tstroke-width: 1.5;\n\t\t\t}\n\n\t\t\t.legend {\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-wrap: wrap;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\t\t\t.legend-swatch {\n\t\t\t\tdisplay: inline-block;\n\t\t\t\twidth: 8px;\n\t\t\t\theight: 8px;\n\t\t\t\tborder-radius: 50%;\n\t\t\t\tmargin-right: 4px;\n\t\t\t\tvertical-align: middle;\n\t\t\t}\n\n\t\t\t.details {\n\t\t\t\tmargin-top: var(--roxy-space-md, 1rem);\n\t\t\t}\n\n\t\t\t.pill-row {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-wrap: wrap;\n\t\t\t\tgap: var(--roxy-space-xs, 0.25rem);\n\t\t\t\tmargin-bottom: var(--roxy-space-xs, 0.25rem);\n\t\t\t}\n\n\t\t\t.pill {\n\t\t\t\tpadding: 2px 8px;\n\t\t\t\tborder-radius: var(--roxy-radius-sm, 4px);\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-fg, #0f172a) 8%, transparent);\n\t\t\t\tcolor: var(--roxy-fg, #0f172a);\n\t\t\t}\n\n\t\t\t.pill--success {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-success, #16a34a) 15%, transparent);\n\t\t\t\tcolor: var(--roxy-success, #16a34a);\n\t\t\t}\n\n\t\t\t.pill--danger {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-danger, #dc2626) 15%, transparent);\n\t\t\t\tcolor: var(--roxy-danger, #dc2626);\n\t\t\t}\n\n\t\t\t.pill--muted {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-border, #e4e4e7) 60%, transparent);\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t}\n\n\t\t\t.summary {\n\t\t\t\tcolor: var(--roxy-fg, #0f172a);\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tmargin: var(--roxy-space-md, 1rem) 0;\n\t\t\t}\n\n\t\t\t.dist-grid {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: 1fr 1fr;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\n\t\t\t@container (max-width: 639px) {\n\t\t\t\t.dist-grid {\n\t\t\t\t\tgrid-template-columns: 1fr;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.dist-section h3 {\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tmargin: 0 0 var(--roxy-space-xs, 0.25rem);\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tletter-spacing: 0.05em;\n\t\t\t}\n\n\t\t\t.dist-row {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: 4rem 1fr 1.5rem;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: var(--roxy-space-xs, 0.25rem);\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tcolor: var(--roxy-fg, #0f172a);\n\t\t\t\tmargin-bottom: 4px;\n\t\t\t}\n\n\t\t\t.dist-bar {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-accent, #f59e0b) 20%, transparent);\n\t\t\t\theight: 6px;\n\t\t\t\tborder-radius: 3px;\n\t\t\t}\n\n\t\t\t.dist-bar > span {\n\t\t\t\tdisplay: block;\n\t\t\t\theight: 100%;\n\t\t\t\tbackground: var(--roxy-accent, #f59e0b);\n\t\t\t\tborder-radius: 3px;\n\t\t\t}\n\n\t\t\t.interpretations {\n\t\t\t\tmargin-top: var(--roxy-space-md, 1rem);\n\t\t\t}\n\t\t\t.interpretations h3 {\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tfont-weight: 600;\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tletter-spacing: 0.06em;\n\t\t\t\tmargin: 0 0 var(--roxy-space-sm, 0.5rem);\n\t\t\t}\n\t\t\t.interp-card {\n\t\t\t\tborder: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t\tpadding: var(--roxy-space-sm, 0.5rem) var(--roxy-space-md, 1rem);\n\t\t\t\tmargin-bottom: var(--roxy-space-xs, 0.25rem);\n\t\t\t}\n\t\t\t.interp-card summary {\n\t\t\t\tcursor: pointer;\n\t\t\t\tfont-weight: 500;\n\t\t\t\tcolor: var(--roxy-fg, #0f172a);\n\t\t\t}\n\t\t\t.interp-card summary small {\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tmargin-left: 0.5em;\n\t\t\t\tfont-weight: 400;\n\t\t\t}\n\t\t\t.interp-body {\n\t\t\t\tmargin-top: var(--roxy-space-xs, 0.25rem);\n\t\t\t\tcolor: var(--roxy-fg, #0f172a);\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t}\n\t\t\t.interp-keywords {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-wrap: wrap;\n\t\t\t\tgap: 0.25rem;\n\t\t\t\tmargin-top: 0.5rem;\n\t\t\t}\n\t\t\t.interp-keywords .kw {\n\t\t\t\tpadding: 1px 8px;\n\t\t\t\tborder-radius: 9999px;\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-accent, #f59e0b) 14%, transparent);\n\t\t\t\tcolor: var(--roxy-accent-fg, #b45309);\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\tdata: NatalChartResponse | null = null;\n\n\t@property({ type: String, attribute: 'house-system', reflect: true })\n\thouseSystem: 'placidus' | 'whole-sign' | 'equal' | 'koch' = 'placidus';\n\n\tprivate getPlanets(): PlanetEntry[] {\n\t\treturn this.data?.planets ?? [];\n\t}\n\n\tprivate getAscendant(): number {\n\t\treturn this.data?.ascendant?.longitude ?? 0;\n\t}\n\n\tprivate getMidheaven(): number | null {\n\t\tconst m = this.data?.midheaven?.longitude;\n\t\treturn typeof m === 'number' ? m : null;\n\t}\n\n\tprivate toAngle(lon: number): number {\n\t\treturn 180 + this.getAscendant() - lon;\n\t}\n\n\trender() {\n\t\tif (!this.data)\n\t\t\treturn html`<div class=\"roxy-empty\" role=\"status\">No chart data</div>`;\n\t\tconst planets = this.getPlanets();\n\t\tconst aspects = this.data.aspects ?? [];\n\n\t\treturn html`<div class=\"wrap\">\n\t\t\t<header>\n\t\t\t\t<h2 class=\"title\">Natal chart</h2>\n\t\t\t\t${\n\t\t\t\t\tthis.data.birthDetails\n\t\t\t\t\t\t? html`<div class=\"meta\">\n\t\t\t\t\t\t\t${[this.data.birthDetails.date, this.data.birthDetails.time]\n\t\t\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t\t\t\t.join(' \u00B7 ')}\n\t\t\t\t\t\t</div>`\n\t\t\t\t\t\t: nothing\n\t\t\t\t}\n\t\t\t</header>\n\t\t\t<svg\n\t\t\t\tviewBox=\"0 0 ${SIZE} ${SIZE}\"\n\t\t\t\trole=\"img\"\n\t\t\t\taria-label=\"Natal chart wheel with twelve houses, planets, and aspects\"\n\t\t\t>\n\t\t\t\t<title>Natal chart wheel</title>\n\t\t\t\t<desc>\n\t\t\t\t\tTwelve zodiac sign segments around a circular wheel. Planet glyphs are\n\t\t\t\t\tplaced at their ecliptic longitudes. Aspect lines connect related planets.\n\t\t\t\t</desc>\n\t\t\t\t<circle\n\t\t\t\t\tclass=\"wheel-line\"\n\t\t\t\t\tcx=${CENTER}\n\t\t\t\t\tcy=${CENTER}\n\t\t\t\t\tr=${OUTER_R}\n\t\t\t\t\tstroke-width=\"1.5\"\n\t\t\t\t/>\n\t\t\t\t<circle\n\t\t\t\t\tclass=\"wheel-line\"\n\t\t\t\t\tcx=${CENTER}\n\t\t\t\t\tcy=${CENTER}\n\t\t\t\t\tr=${HOUSE_R}\n\t\t\t\t\tstroke-width=\"1\"\n\t\t\t\t/>\n\t\t\t\t<circle\n\t\t\t\t\tclass=\"wheel-line\"\n\t\t\t\t\tcx=${CENTER}\n\t\t\t\t\tcy=${CENTER}\n\t\t\t\t\tr=${PLANET_R - 16}\n\t\t\t\t\tstroke-width=\"0.5\"\n\t\t\t\t/>\n\t\t\t\t${this.renderSpokes()} ${this.renderSigns()} ${this.renderHouseNumbers()}\n\t\t\t\t${this.renderAspects(planets, aspects)} ${this.renderPlanets(planets)}\n\t\t\t\t${this.renderAngles()}\n\t\t\t</svg>\n\t\t\t<div class=\"legend\">\n\t\t\t\t<span>${planets.length} planets</span>\n\t\t\t\t<span>${aspects.length} aspects</span>\n\t\t\t\t<span><span class=\"legend-swatch\" style=\"background: var(--roxy-success)\"></span>harmonious</span>\n\t\t\t\t<span><span class=\"legend-swatch\" style=\"background: var(--roxy-danger)\"></span>challenging</span>\n\t\t\t</div>\n\t\t\t${this.renderDetails()}\n\t\t\t${this.renderInterpretations()}\n\t\t</div>`;\n\t}\n\n\tprivate renderAngles() {\n\t\tconst asc = this.getAscendant();\n\t\tconst mc = this.getMidheaven();\n\t\tconst items = [this.renderAngleMark(asc, 'ASC')];\n\t\tif (mc !== null) items.push(this.renderAngleMark(mc, 'MC'));\n\t\treturn items;\n\t}\n\n\tprivate renderAngleMark(longitude: number, label: string) {\n\t\tconst angle = this.toAngle(longitude);\n\t\tconst tickInner = polarToCartesian(CENTER, CENTER, OUTER_R, angle);\n\t\tconst tickOuter = polarToCartesian(CENTER, CENTER, ANGLE_TICK_R, angle);\n\t\tconst labelPos = polarToCartesian(CENTER, CENTER, ANGLE_LABEL_R, angle);\n\t\treturn svg`\n\t\t\t<g>\n\t\t\t\t<line class=\"angle-tick\" x1=${tickInner.x} y1=${tickInner.y} x2=${tickOuter.x} y2=${tickOuter.y} />\n\t\t\t\t<text class=\"angle-marker\" x=${labelPos.x} y=${labelPos.y} text-anchor=\"middle\" dominant-baseline=\"central\">${label}</text>\n\t\t\t</g>\n\t\t`;\n\t}\n\n\tprivate renderSpokes() {\n\t\treturn Array.from({ length: 12 }, (_, i) => {\n\t\t\tconst angle = this.toAngle(i * 30);\n\t\t\tconst start = polarToCartesian(CENTER, CENTER, HOUSE_R, angle);\n\t\t\tconst end = polarToCartesian(CENTER, CENTER, OUTER_R, angle);\n\t\t\treturn svg`<line class=\"wheel-line\" x1=${start.x} y1=${start.y} x2=${end.x} y2=${end.y} stroke-width=\"0.8\" />`;\n\t\t});\n\t}\n\n\tprivate renderSigns() {\n\t\treturn SIGNS_ORDER.map((sign, i) => {\n\t\t\tconst angle = this.toAngle(i * 30 + 15);\n\t\t\tconst pos = polarToCartesian(CENTER, CENTER, SIGN_R, angle);\n\t\t\treturn svg`<text class=\"sign-glyph\" x=${pos.x} y=${pos.y} text-anchor=\"middle\" dominant-baseline=\"central\">${SIGN_GLYPH[sign]}</text>`;\n\t\t});\n\t}\n\n\tprivate renderHouseNumbers() {\n\t\tconst ascSignIndex = Math.floor(this.getAscendant() / 30);\n\t\treturn Array.from({ length: 12 }, (_, i) => {\n\t\t\tconst angle = this.toAngle(i * 30 + 15);\n\t\t\tconst pos = polarToCartesian(CENTER, CENTER, HOUSE_R - 12, angle);\n\t\t\tconst houseNum = ((i - ascSignIndex + 12) % 12) + 1;\n\t\t\treturn svg`<text class=\"house-num\" x=${pos.x} y=${pos.y} text-anchor=\"middle\" dominant-baseline=\"central\">${houseNum}</text>`;\n\t\t});\n\t}\n\n\tprivate renderPlanets(planets: PlanetEntry[]) {\n\t\treturn planets.map((p) => {\n\t\t\tif (!Number.isFinite(p.longitude)) return nothing;\n\t\t\tconst angle = this.toAngle(p.longitude);\n\t\t\tconst pos = polarToCartesian(CENTER, CENTER, PLANET_R, angle);\n\t\t\tconst glyph = PLANET_GLYPH[capitalize(p.name)] ?? p.name.slice(0, 2);\n\t\t\tconst retro = p.isRetrograde ? ' R' : '';\n\t\t\tconst display = retro ? `${glyph}\u1D3F` : glyph;\n\t\t\treturn svg`<text class=\"planet-glyph\" x=${pos.x} y=${pos.y} text-anchor=\"middle\" dominant-baseline=\"central\"><title>${p.name}${retro}</title>${display}</text>`;\n\t\t});\n\t}\n\n\tprivate renderDetails() {\n\t\tconst summary = this.data?.summary;\n\t\tconst ai = this.data?.aspectsInterpretation;\n\t\tif (!summary && !ai) return nothing;\n\n\t\tconst retrogrades = summary?.retrogradePlanets ?? [];\n\t\tconst elementDist = summary?.elementDistribution ?? {};\n\t\tconst modalityDist = summary?.modalityDistribution ?? {};\n\t\tconst elementMax = Math.max(1, ...Object.values(elementDist));\n\t\tconst modalityMax = Math.max(1, ...Object.values(modalityDist));\n\n\t\treturn html`<div class=\"details\">\n\t\t\t${\n\t\t\t\tsummary?.dominantElement || summary?.dominantModality\n\t\t\t\t\t? html`<div class=\"pill-row\">\n\t\t\t\t\t\t${summary.dominantElement ? html`<span class=\"pill\">Dominant element: ${summary.dominantElement}</span>` : nothing}\n\t\t\t\t\t\t${summary.dominantModality ? html`<span class=\"pill\">Dominant modality: ${summary.dominantModality}</span>` : nothing}\n\t\t\t\t\t</div>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t\t${\n\t\t\t\tai\n\t\t\t\t\t? html`<div class=\"pill-row\">\n\t\t\t\t\t\t<span class=\"pill pill--success\">Harmonious ${ai.harmonious}</span>\n\t\t\t\t\t\t<span class=\"pill pill--danger\">Challenging ${ai.challenging}</span>\n\t\t\t\t\t\t<span class=\"pill pill--muted\">Neutral ${ai.neutral}</span>\n\t\t\t\t\t</div>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t\t${\n\t\t\t\tretrogrades.length > 0\n\t\t\t\t\t? html`<div class=\"pill-row\">\n\t\t\t\t\t\t${retrogrades.map((p) => {\n\t\t\t\t\t\t\tconst glyph = PLANET_GLYPH[p] ?? p.slice(0, 2);\n\t\t\t\t\t\t\treturn html`<span class=\"pill pill--muted\">${glyph} ${p} R</span>`;\n\t\t\t\t\t\t})}\n\t\t\t\t\t</div>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t\t${ai?.summary ? html`<p class=\"summary\">${ai.summary}</p>` : nothing}\n\t\t\t${\n\t\t\t\tObject.keys(elementDist).length > 0 ||\n\t\t\t\tObject.keys(modalityDist).length > 0\n\t\t\t\t\t? html`<div class=\"dist-grid\">\n\t\t\t\t\t\t${\n\t\t\t\t\t\t\tObject.keys(elementDist).length > 0\n\t\t\t\t\t\t\t\t? html`<div class=\"dist-section\">\n\t\t\t\t\t\t\t\t\t<h3>Elements</h3>\n\t\t\t\t\t\t\t\t\t${Object.entries(elementDist).map(\n\t\t\t\t\t\t\t\t\t\t([label, count]) => html`<div class=\"dist-row\">\n\t\t\t\t\t\t\t\t\t\t\t<span>${label}</span>\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"dist-bar\"><span style=\"width: ${Math.round((count / elementMax) * 100)}%\"></span></div>\n\t\t\t\t\t\t\t\t\t\t\t<span>${count}</span>\n\t\t\t\t\t\t\t\t\t\t</div>`,\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>`\n\t\t\t\t\t\t\t\t: nothing\n\t\t\t\t\t\t}\n\t\t\t\t\t\t${\n\t\t\t\t\t\t\tObject.keys(modalityDist).length > 0\n\t\t\t\t\t\t\t\t? html`<div class=\"dist-section\">\n\t\t\t\t\t\t\t\t\t<h3>Modalities</h3>\n\t\t\t\t\t\t\t\t\t${Object.entries(modalityDist).map(\n\t\t\t\t\t\t\t\t\t\t([label, count]) => html`<div class=\"dist-row\">\n\t\t\t\t\t\t\t\t\t\t\t<span>${label}</span>\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"dist-bar\"><span style=\"width: ${Math.round((count / modalityMax) * 100)}%\"></span></div>\n\t\t\t\t\t\t\t\t\t\t\t<span>${count}</span>\n\t\t\t\t\t\t\t\t\t\t</div>`,\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>`\n\t\t\t\t\t\t\t\t: nothing\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t</div>`;\n\t}\n\n\tprivate renderInterpretations() {\n\t\tconst planets = this.getPlanets().filter((p) => p.interpretation);\n\t\tif (planets.length === 0) return nothing;\n\t\treturn html`<section class=\"interpretations\">\n\t\t\t<h3>Planet readings</h3>\n\t\t\t${planets.map((p, idx) => {\n\t\t\t\tconst interp = p.interpretation!;\n\t\t\t\tconst glyph = PLANET_GLYPH[capitalize(p.name)] ?? '';\n\t\t\t\tconst deg = formatNumber(p.degree ?? 0, 1);\n\t\t\t\treturn html`<details class=\"interp-card\" name=\"natal-planet-readings\" ?open=${idx === 0}>\n\t\t\t\t\t<summary>${glyph} ${p.name} <small>${p.sign ?? ''} ${deg}</small></summary>\n\t\t\t\t\t<div class=\"interp-body\">\n\t\t\t\t\t\t${interp.summary ? html`<p class=\"interp-summary\">${interp.summary}</p>` : nothing}\n\t\t\t\t\t\t${interp.detailed ? html`<p class=\"interp-detail\">${interp.detailed}</p>` : nothing}\n\t\t\t\t\t\t${\n\t\t\t\t\t\t\tinterp.keywords?.length\n\t\t\t\t\t\t\t\t? html`<div class=\"interp-keywords\">${interp.keywords.map((k) => html`<span class=\"kw\">${k}</span>`)}</div>`\n\t\t\t\t\t\t\t\t: nothing\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t</details>`;\n\t\t\t})}\n\t\t</section>`;\n\t}\n\n\tprivate renderAspects(planets: PlanetEntry[], aspects: AspectEntry[]) {\n\t\tconst planetMap = new Map<string, number>();\n\t\tfor (const p of planets) {\n\t\t\tif (typeof p.longitude !== 'number') continue;\n\t\t\tconst name = capitalize(p.name);\n\t\t\tif (name) planetMap.set(name, p.longitude);\n\t\t}\n\t\treturn aspects.map((a) => {\n\t\t\tconst l1 = planetMap.get(capitalize(a.planet1));\n\t\t\tconst l2 = planetMap.get(capitalize(a.planet2));\n\t\t\tif (l1 === undefined || l2 === undefined) return nothing;\n\t\t\tconst p1 = polarToCartesian(\n\t\t\t\tCENTER,\n\t\t\t\tCENTER,\n\t\t\t\tPLANET_R - 18,\n\t\t\t\tthis.toAngle(l1),\n\t\t\t);\n\t\t\tconst p2 = polarToCartesian(\n\t\t\t\tCENTER,\n\t\t\t\tCENTER,\n\t\t\t\tPLANET_R - 18,\n\t\t\t\tthis.toAngle(l2),\n\t\t\t);\n\t\t\tconst aspectName = normalizeAspect(a);\n\t\t\tconst aspectClass = ASPECT_CLASS[aspectName] ?? 'aspect-other';\n\t\t\tconst orbLabel = formatNumber(a.orb, 1);\n\t\t\treturn svg`<line class=${`aspect ${aspectClass}`} x1=${p1.x} y1=${p1.y} x2=${p2.x} y2=${p2.y}><title>${a.planet1} ${aspectName || ''} ${a.planet2}${orbLabel ? ` (orb ${orbLabel}\u00B0)` : ''}</title></line>`;\n\t\t});\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'roxy-natal-chart': RoxyNatalChart;\n\t}\n}\n", "/**\n * Math helpers for converting raw ecliptic longitude decimals into the\n * sign / degree / minute / second triplet used across chart components.\n */\n\nimport { SIGNS_ORDER } from '../tokens/index.js';\n\nexport interface SignPosition {\n\tsign: string;\n\tsignIndex: number;\n\tdegree: number;\n\tminute: number;\n\tsecond: number;\n}\n\n/**\n * Wrap longitude into [0, 360) so negative or out-of-range values still\n * resolve to a real sign. Robust to wonky upstream data.\n */\nexport function normalizeLongitude(lon: number): number {\n\tconst wrapped = lon % 360;\n\treturn wrapped < 0 ? wrapped + 360 : wrapped;\n}\n\n/**\n * Convert decimal ecliptic longitude (0-360) into sign/degree/minute/second.\n * Used by every chart wheel and aspect table.\n */\nexport function longitudeToSignPosition(longitude: number): SignPosition {\n\tconst lon = normalizeLongitude(longitude);\n\tconst signIndex = Math.floor(lon / 30) % 12;\n\tconst within = lon % 30;\n\tconst degree = Math.floor(within);\n\tconst minuteFloat = (within - degree) * 60;\n\tconst minute = Math.floor(minuteFloat);\n\tconst second = Math.round((minuteFloat - minute) * 60);\n\treturn {\n\t\tsign: SIGNS_ORDER[signIndex] ?? 'Aries',\n\t\tsignIndex,\n\t\tdegree,\n\t\tminute,\n\t\tsecond,\n\t};\n}\n\n/** Compact display string like \"12\u00B0 Leo 34'\". Used in chart labels. */\nexport function formatSignPosition(longitude: number): string {\n\tconst { sign, degree, minute } = longitudeToSignPosition(longitude);\n\treturn `${degree}\u00B0 ${sign} ${String(minute).padStart(2, '0')}'`;\n}\n\n/** Polar to cartesian for SVG wheel positioning. Angle in degrees, 0 at 3 o'clock. */\nexport function polarToCartesian(\n\tcx: number,\n\tcy: number,\n\tradius: number,\n\tangleDeg: number,\n): { x: number; y: number } {\n\tconst angleRad = (angleDeg * Math.PI) / 180;\n\treturn {\n\t\tx: cx + radius * Math.cos(angleRad),\n\t\ty: cy + radius * Math.sin(angleRad),\n\t};\n}\n", "import { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type {\n\tCalculateExpressionResponse,\n\tCalculateLifePathResponse,\n\tCalculatePersonalYearResponse,\n\tGenerateNumerologyChartResponse,\n} from '../types/index.js';\nimport { baseStyles } from '../utils/base-styles.js';\nimport { humanize } from '../utils/string.js';\n\ntype NumerologyData =\n\t| CalculateLifePathResponse\n\t| CalculateExpressionResponse\n\t| CalculatePersonalYearResponse\n\t| GenerateNumerologyChartResponse;\n\n/**\n * Numerology card. Renders /numerology/{life-path,expression,personal-year,chart}.\n * Use the `type` attribute to switch the layout.\n */\n@customElement('roxy-numerology-card')\nexport class RoxyNumerologyCard extends LitElement {\n\tstatic styles = [\n\t\tbaseStyles,\n\t\tcss`\n\t\t\t.card {\n\t\t\t\tbackground: var(--roxy-bg, #fff);\n\t\t\t\tborder: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t\tpadding: var(--roxy-space-lg, 1.5rem);\n\t\t\t\tbox-shadow: var(--roxy-shadow-sm);\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\n\t\t\t.hero {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\t\t\t.numeral {\n\t\t\t\tfont-size: 4rem;\n\t\t\t\tline-height: 1;\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tcolor: var(--roxy-accent-fg, #b45309);\n\t\t\t\tfont-variant-numeric: tabular-nums;\n\t\t\t}\n\t\t\t.label {\n\t\t\t\tmargin: 0;\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tletter-spacing: 0.06em;\n\t\t\t}\n\t\t\t.title {\n\t\t\t\tmargin: 0;\n\t\t\t\tfont-size: var(--roxy-text-lg, 1.125rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t}\n\t\t\t.meaning {\n\t\t\t\tmargin: 0;\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t}\n\n\t\t\t.calc {\n\t\t\t\tmargin: 0;\n\t\t\t\tfont-family: var(--roxy-font-mono);\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-border, #e4e4e7) 30%, transparent);\n\t\t\t\tpadding: var(--roxy-space-sm, 0.5rem);\n\t\t\t\tborder-radius: var(--roxy-radius-sm, 4px);\n\t\t\t\twhite-space: pre-wrap;\n\t\t\t\toverflow-wrap: anywhere;\n\t\t\t}\n\n\t\t\t.chips {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-wrap: wrap;\n\t\t\t\tgap: var(--roxy-space-xs, 0.25rem);\n\t\t\t}\n\t\t\t.chips span {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-accent, #f59e0b) 14%, transparent);\n\t\t\t\tpadding: 2px 8px;\n\t\t\t\tborder-radius: var(--roxy-radius-full, 9999px);\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t}\n\n\t\t\t.cores {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: repeat(auto-fit, minmax(8rem, 1fr));\n\t\t\t\tgap: var(--roxy-space-sm, 0.5rem);\n\t\t\t\tborder-top: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tpadding-top: var(--roxy-space-md, 1rem);\n\t\t\t}\n\t\t\t.cores .item {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: baseline;\n\t\t\t\tgap: var(--roxy-space-xs, 0.25rem);\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t}\n\t\t\t.cores .item span:first-child {\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\ttext-transform: capitalize;\n\t\t\t}\n\t\t\t.cores .item strong {\n\t\t\t\tcolor: var(--roxy-accent-fg, #b45309);\n\t\t\t\tfont-variant-numeric: tabular-nums;\n\t\t\t\tfont-size: var(--roxy-text-base, 1rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t}\n\n\t\t\t.karmic {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-warning, #ea580c) 12%, transparent);\n\t\t\t\tborder: 1px solid color-mix(in srgb, var(--roxy-warning, #ea580c) 32%, transparent);\n\t\t\t\tpadding: var(--roxy-space-sm, 0.5rem) var(--roxy-space-md, 1rem);\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\tdata: NumerologyData | null = null;\n\n\t@property({ type: String, reflect: true })\n\ttype: 'life-path' | 'expression' | 'personal-year' | 'chart' = 'life-path';\n\n\trender() {\n\t\tconst d = this.data;\n\t\tif (!d)\n\t\t\treturn html`<div class=\"roxy-empty\" role=\"status\">No numerology data</div>`;\n\n\t\tconst headerLabel = LABELS[this.type] ?? this.type;\n\n\t\tif ('coreNumbers' in d) return this.renderChart(d, headerLabel);\n\t\tif ('personalYear' in d) return this.renderPersonalYear(d, headerLabel);\n\t\treturn this.renderNumberCard(\n\t\t\td as CalculateLifePathResponse | CalculateExpressionResponse,\n\t\t\theaderLabel,\n\t\t);\n\t}\n\n\tprivate renderNumberCard(\n\t\td: CalculateLifePathResponse | CalculateExpressionResponse,\n\t\theaderLabel: string,\n\t) {\n\t\tconst keywords = d.meaning?.keywords ?? [];\n\t\treturn html`<article class=\"card\" aria-label=${headerLabel}>\n\t\t\t<div class=\"hero\">\n\t\t\t\t${typeof d.number === 'number' ? html`<div class=\"numeral\">${d.number}</div>` : nothing}\n\t\t\t\t<div>\n\t\t\t\t\t<p class=\"label\">${headerLabel}</p>\n\t\t\t\t\t${d.meaning?.title ? html`<h2 class=\"title\">${d.meaning.title}</h2>` : nothing}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t${d.meaning?.description ? html`<p class=\"meaning\">${d.meaning.description}</p>` : nothing}\n\t\t\t${d.calculation ? html`<pre class=\"calc\">${d.calculation}</pre>` : nothing}\n\t\t\t${\n\t\t\t\tkeywords.length > 0\n\t\t\t\t\t? html`<div class=\"chips\">\n\t\t\t\t\t\t${keywords.map((k) => html`<span>${k}</span>`)}\n\t\t\t\t\t</div>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t\t${\n\t\t\t\td.hasKarmicDebt && d.karmicDebtNumber\n\t\t\t\t\t? html`<div class=\"karmic\">\n\t\t\t\t\t\tKarmic debt ${d.karmicDebtNumber}.\n\t\t\t\t\t\t${karmicDebtText(d.karmicDebtMeaning)}\n\t\t\t\t\t</div>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t</article>`;\n\t}\n\n\tprivate renderPersonalYear(\n\t\td: CalculatePersonalYearResponse,\n\t\theaderLabel: string,\n\t) {\n\t\treturn html`<article class=\"card\" aria-label=${headerLabel}>\n\t\t\t<div class=\"hero\">\n\t\t\t\t${typeof d.personalYear === 'number' ? html`<div class=\"numeral\">${d.personalYear}</div>` : nothing}\n\t\t\t\t<div>\n\t\t\t\t\t<p class=\"label\">${headerLabel}</p>\n\t\t\t\t\t${d.theme ? html`<h2 class=\"title\">${d.theme}</h2>` : nothing}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t${d.forecast ? html`<p class=\"meaning\">${d.forecast}</p>` : nothing}\n\t\t\t${d.advice ? html`<p>${d.advice}</p>` : nothing}\n\t\t</article>`;\n\t}\n\n\tprivate renderChart(d: GenerateNumerologyChartResponse, headerLabel: string) {\n\t\tconst cores = Object.entries(d.coreNumbers).filter(\n\t\t\t([, v]) => v !== null && v !== undefined,\n\t\t);\n\t\treturn html`<article class=\"card\" aria-label=${headerLabel}>\n\t\t\t<div>\n\t\t\t\t<p class=\"label\">${headerLabel}</p>\n\t\t\t\t${d.profile?.name ? html`<h2 class=\"title\">${d.profile.name}</h2>` : nothing}\n\t\t\t</div>\n\t\t\t${\n\t\t\t\tcores.length > 0\n\t\t\t\t\t? html`<div class=\"cores\">\n\t\t\t\t\t\t${cores.map(\n\t\t\t\t\t\t\t([k, v]) => html`<div class=\"item\">\n\t\t\t\t\t\t\t\t<span>${humanize(k)}</span>\n\t\t\t\t\t\t\t\t<strong>${v.number ?? ''}</strong>\n\t\t\t\t\t\t\t</div>`,\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t</article>`;\n\t}\n}\n\nconst LABELS: Record<string, string> = {\n\t'life-path': 'Life Path',\n\texpression: 'Expression',\n\t'personal-year': 'Personal Year',\n\tchart: 'Numerology chart',\n};\n\ntype KarmicDebtMeaning = {\n\tdescription: string;\n\tchallenge: string;\n\tresolution: string;\n};\n\nfunction karmicDebtText(value: KarmicDebtMeaning | undefined): string {\n\tif (!value) return '';\n\treturn [value.description, value.challenge, value.resolution]\n\t\t.filter(Boolean)\n\t\t.join(' ');\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'roxy-numerology-card': RoxyNumerologyCard;\n\t}\n}\n", "import { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type {\n\tGetBasicPanchangResponse,\n\tGetDetailedPanchangResponse,\n} from '../types/index.js';\nimport { baseStyles } from '../utils/base-styles.js';\nimport { formatDate, formatTime, formatTimeRange } from '../utils/format.js';\n\ntype PanchangData = GetBasicPanchangResponse | GetDetailedPanchangResponse;\ntype PanchangTime = GetDetailedPanchangResponse['rahuKaal'];\n\n/** Panchang table for /vedic-astrology/panchang/{basic,detailed}. */\n@customElement('roxy-panchang-table')\nexport class RoxyPanchangTable extends LitElement {\n\tstatic styles = [\n\t\tbaseStyles,\n\t\tcss`\n\t\t\t.wrap {\n\t\t\t\tborder: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t\tbackground: var(--roxy-bg, #fff);\n\t\t\t\toverflow: hidden;\n\t\t\t\tbox-shadow: var(--roxy-shadow-sm);\n\t\t\t}\n\t\t\t.head {\n\t\t\t\tpadding: var(--roxy-space-md, 1rem);\n\t\t\t\tborder-bottom: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\tflex-wrap: wrap;\n\t\t\t\tgap: var(--roxy-space-sm, 0.5rem);\n\t\t\t}\n\t\t\t.title {\n\t\t\t\tmargin: 0;\n\t\t\t\tfont-size: var(--roxy-text-lg, 1.125rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t}\n\t\t\t.date {\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t}\n\t\t\ttable {\n\t\t\t\twidth: 100%;\n\t\t\t\tborder-collapse: collapse;\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t}\n\t\t\ttbody tr:nth-child(odd) {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-border, #e4e4e7) 24%, transparent);\n\t\t\t}\n\t\t\tth,\n\t\t\ttd {\n\t\t\t\tpadding: var(--roxy-space-sm, 0.5rem) var(--roxy-space-md, 1rem);\n\t\t\t\ttext-align: left;\n\t\t\t\tvertical-align: top;\n\t\t\t}\n\t\t\tth {\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\twidth: 38%;\n\t\t\t\ttext-transform: capitalize;\n\t\t\t}\n\t\t\ttd {\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t\tfont-variant-numeric: tabular-nums;\n\t\t\t}\n\t\t\t.section {\n\t\t\t\tborder-top: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tpadding: var(--roxy-space-sm, 0.5rem) var(--roxy-space-md, 1rem);\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tletter-spacing: 0.06em;\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\tdata: PanchangData | null = null;\n\n\t@property({ type: String, reflect: true })\n\tdetail: 'basic' | 'detailed' = 'detailed';\n\n\trender() {\n\t\tconst d = this.data;\n\t\tif (!d)\n\t\t\treturn html`<div class=\"roxy-empty\" role=\"status\">No panchang data</div>`;\n\t\tconst detailed = 'sunrise' in d ? d : null;\n\n\t\tconst fivefold: Array<[string, string]> = [\n\t\t\t['Tithi', this.formatPart(d.tithi)],\n\t\t\t['Nakshatra', this.formatPart(d.nakshatra)],\n\t\t\t['Yoga', this.formatPart(d.yoga)],\n\t\t\t['Karana', this.formatPart(d.karana)],\n\t\t];\n\t\tif (detailed) fivefold.push(['Vara', this.formatPart(detailed.vara)]);\n\n\t\tconst muhurtas: Array<[string, PanchangTime | undefined]> = detailed\n\t\t\t? [\n\t\t\t\t\t['Brahma Muhurta', detailed.brahmaMuhurta],\n\t\t\t\t\t['Abhijit Muhurta', detailed.abhijitMuhurta],\n\t\t\t\t\t['Vijaya Muhurta', detailed.vijayaMuhurta],\n\t\t\t\t\t['Godhuli Muhurta', detailed.godhuliMuhurta],\n\t\t\t\t\t['Nishita Muhurta', detailed.nishitaMuhurta],\n\t\t\t\t\t['Pratah Sandhya', detailed.pratahSandhya],\n\t\t\t\t\t['Sayahna Sandhya', detailed.sayahnaSandhya],\n\t\t\t\t]\n\t\t\t: [];\n\n\t\tconst inauspicious: Array<[string, PanchangTime | undefined]> = detailed\n\t\t\t? [\n\t\t\t\t\t['Rahu Kaal', detailed.rahuKaal],\n\t\t\t\t\t['Yamaganda', detailed.yamaganda],\n\t\t\t\t\t['Gulika', detailed.gulika],\n\t\t\t\t]\n\t\t\t: [];\n\n\t\treturn html`<div class=\"wrap\" aria-label=\"Panchang\">\n\t\t\t<header class=\"head\">\n\t\t\t\t<h2 class=\"title\">Panchang</h2>\n\t\t\t\t<span class=\"date\">${detailed ? formatDate(detailed.date) : ''}</span>\n\t\t\t</header>\n\t\t\t<table>\n\t\t\t\t<tbody>\n\t\t\t\t\t${fivefold.map(\n\t\t\t\t\t\t([k, v]) => html`<tr>\n\t\t\t\t\t\t\t<th>${k}</th>\n\t\t\t\t\t\t\t<td>${v}</td>\n\t\t\t\t\t\t</tr>`,\n\t\t\t\t\t)}\n\t\t\t\t\t${\n\t\t\t\t\t\tdetailed?.sunrise\n\t\t\t\t\t\t\t? html`<tr>\n\t\t\t\t\t\t\t\t<th>Sunrise</th>\n\t\t\t\t\t\t\t\t<td>${formatTime(detailed.sunrise)}</td>\n\t\t\t\t\t\t\t</tr>`\n\t\t\t\t\t\t\t: nothing\n\t\t\t\t\t}\n\t\t\t\t\t${\n\t\t\t\t\t\tdetailed?.sunset\n\t\t\t\t\t\t\t? html`<tr>\n\t\t\t\t\t\t\t\t<th>Sunset</th>\n\t\t\t\t\t\t\t\t<td>${formatTime(detailed.sunset)}</td>\n\t\t\t\t\t\t\t</tr>`\n\t\t\t\t\t\t\t: nothing\n\t\t\t\t\t}\n\t\t\t\t\t${\n\t\t\t\t\t\tdetailed?.moonrise\n\t\t\t\t\t\t\t? html`<tr>\n\t\t\t\t\t\t\t\t<th>Moonrise</th>\n\t\t\t\t\t\t\t\t<td>${formatTime(detailed.moonrise)}</td>\n\t\t\t\t\t\t\t</tr>`\n\t\t\t\t\t\t\t: nothing\n\t\t\t\t\t}\n\t\t\t\t\t${\n\t\t\t\t\t\tdetailed?.moonset\n\t\t\t\t\t\t\t? html`<tr>\n\t\t\t\t\t\t\t\t<th>Moonset</th>\n\t\t\t\t\t\t\t\t<td>${formatTime(detailed.moonset)}</td>\n\t\t\t\t\t\t\t</tr>`\n\t\t\t\t\t\t\t: nothing\n\t\t\t\t\t}\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t\t${\n\t\t\t\tthis.detail === 'detailed' &&\n\t\t\t\t(muhurtas.some((m) => !!m[1]) || inauspicious.some((m) => !!m[1]))\n\t\t\t\t\t? html`\n\t\t\t\t\t\t<div class=\"section\">Auspicious muhurtas</div>\n\t\t\t\t\t\t<table>\n\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t${muhurtas\n\t\t\t\t\t\t\t\t\t.filter(([, v]) => !!v)\n\t\t\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t\t\t([k, v]) => html`<tr>\n\t\t\t\t\t\t\t\t\t\t\t<th>${k}</th>\n\t\t\t\t\t\t\t\t\t\t\t<td>${formatTimeRange(v)}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>`,\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t\t<div class=\"section\">Inauspicious periods</div>\n\t\t\t\t\t\t<table>\n\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t${inauspicious\n\t\t\t\t\t\t\t\t\t.filter(([, v]) => !!v)\n\t\t\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t\t\t([k, v]) => html`<tr>\n\t\t\t\t\t\t\t\t\t\t\t<th>${k}</th>\n\t\t\t\t\t\t\t\t\t\t\t<td>${formatTimeRange(v)}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>`,\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t</div>`;\n\t}\n\n\tprivate formatPart(v: unknown): string {\n\t\tif (!v) return '';\n\t\tif (typeof v === 'string') return v;\n\t\tif (typeof v === 'object') {\n\t\t\tconst obj = v as {\n\t\t\t\tname?: string;\n\t\t\t\tlord?: string;\n\t\t\t\tphase?: string;\n\t\t\t\tend?: string;\n\t\t\t};\n\t\t\tconst parts = [\n\t\t\t\tobj.name,\n\t\t\t\tobj.lord ? `(${obj.lord})` : '',\n\t\t\t\tobj.phase,\n\t\t\t].filter(Boolean);\n\t\t\treturn parts.join(' ');\n\t\t}\n\t\treturn String(v);\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'roxy-panchang-table': RoxyPanchangTable;\n\t}\n}\n", "import { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { PLANET_GLYPH } from '../tokens/index.js';\nimport type { ShadbalaResponse } from '../types/index.js';\nimport { baseStyles } from '../utils/base-styles.js';\nimport { formatNumber } from '../utils/format.js';\nimport { capitalize } from '../utils/string.js';\n\ntype Planet = ShadbalaResponse['planets'][number];\n\n/** CSS variable and display name for each of the 6 bala components. */\nconst BALA_COMPONENTS: Array<{\n\tkey: keyof Pick<\n\t\tPlanet,\n\t\t| 'sthanaBala'\n\t\t| 'digBala'\n\t\t| 'kalaBala'\n\t\t| 'chestaBala'\n\t\t| 'naisargikaBala'\n\t\t| 'drikBala'\n\t>;\n\tlabel: string;\n\tcolor: string;\n}> = [\n\t{ key: 'sthanaBala', label: 'Sthana', color: 'var(--roxy-info, #0284c7)' },\n\t{ key: 'digBala', label: 'Dig', color: 'var(--roxy-success, #16a34a)' },\n\t{ key: 'kalaBala', label: 'Kala', color: 'var(--roxy-warning, #ea580c)' },\n\t{ key: 'chestaBala', label: 'Chesta', color: 'var(--roxy-accent, #f59e0b)' },\n\t{\n\t\tkey: 'naisargikaBala',\n\t\tlabel: 'Naisargika',\n\t\tcolor: 'var(--roxy-secondary, #475569)',\n\t},\n\t{ key: 'drikBala', label: 'Drik', color: 'var(--roxy-danger, #dc2626)' },\n];\n\n/**\n * Shadbala six-fold planetary strength table with stacked bar visualization.\n * Pass `data` from /vedic-astrology/shadbala.\n */\n@customElement('roxy-shadbala-table')\nexport class RoxyShadbalaTable extends LitElement {\n\tstatic styles = [\n\t\tbaseStyles,\n\t\tcss`\n\t\t\t.wrap {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\n\t\t\t.head {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\talign-items: baseline;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t\tflex-wrap: wrap;\n\t\t\t}\n\n\t\t\t.title {\n\t\t\t\tfont-size: var(--roxy-text-lg, 1.125rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tmargin: 0;\n\t\t\t}\n\n\t\t\t.subtitle {\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tmargin: 0;\n\t\t\t}\n\n\t\t\t.planet-row {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: 8rem 1fr auto;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: var(--roxy-space-sm, 0.5rem);\n\t\t\t\tpadding: var(--roxy-space-sm, 0.5rem) 0;\n\t\t\t\tborder-bottom: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t}\n\n\t\t\t.planet-row:last-of-type {\n\t\t\t\tborder-bottom: none;\n\t\t\t}\n\n\t\t\t.planet-label {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 6px;\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t}\n\n\t\t\t.glyph {\n\t\t\t\tfont-size: 1.2em;\n\t\t\t\tline-height: 1;\n\t\t\t}\n\n\t\t\t.bar-wrap {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 4px;\n\t\t\t}\n\n\t\t\t.bar {\n\t\t\t\tdisplay: flex;\n\t\t\t\theight: 12px;\n\t\t\t\tborder-radius: var(--roxy-radius-sm, 4px);\n\t\t\t\toverflow: hidden;\n\t\t\t\tbackground: var(--roxy-border, #e4e4e7);\n\t\t\t}\n\n\t\t\t.bar-segment {\n\t\t\t\theight: 100%;\n\t\t\t\ttransition: flex-grow var(--roxy-motion-duration, 200ms)\n\t\t\t\t\tvar(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1));\n\t\t\t}\n\n\t\t\t.pills {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\talign-items: flex-end;\n\t\t\t\tgap: 4px;\n\t\t\t}\n\n\t\t\t.rupas-label {\n\t\t\t\tfont-variant-numeric: tabular-nums;\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\n\t\t\t.adequacy-badge {\n\t\t\t\tdisplay: inline-block;\n\t\t\t\tpadding: 1px 6px;\n\t\t\t\tborder-radius: var(--roxy-radius-full, 9999px);\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t}\n\n\t\t\t.adequacy-badge--adequate {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-success, #16a34a) 12%, transparent);\n\t\t\t\tcolor: var(--roxy-success-fg, #166534);\n\t\t\t}\n\n\t\t\t.adequacy-badge--weak {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-danger, #dc2626) 12%, transparent);\n\t\t\t\tcolor: var(--roxy-danger-fg, #991b1b);\n\t\t\t}\n\n\t\t\t.rank-badge {\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tcolor: var(--roxy-accent-fg, #b45309);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t}\n\n\t\t\t.legend {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-wrap: wrap;\n\t\t\t\tgap: var(--roxy-space-sm, 0.5rem) var(--roxy-space-md, 1rem);\n\t\t\t\tborder-top: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tpadding-top: var(--roxy-space-sm, 0.5rem);\n\t\t\t}\n\n\t\t\t.legend-row {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 6px;\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t}\n\n\t\t\t.legend-swatch {\n\t\t\t\tdisplay: inline-block;\n\t\t\t\twidth: 10px;\n\t\t\t\theight: 10px;\n\t\t\t\tborder-radius: var(--roxy-radius-sm, 4px);\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t@container (max-width: 480px) {\n\t\t\t\t.planet-row {\n\t\t\t\t\tgrid-template-columns: 6rem 1fr;\n\t\t\t\t\tgrid-template-rows: auto auto;\n\t\t\t\t}\n\t\t\t\t.pills {\n\t\t\t\t\tgrid-column: 1 / -1;\n\t\t\t\t\tflex-direction: row;\n\t\t\t\t\talign-items: center;\n\t\t\t\t\tjustify-content: flex-start;\n\t\t\t\t}\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\tdata: ShadbalaResponse | null = null;\n\n\trender() {\n\t\tif (!this.data?.planets?.length) {\n\t\t\treturn html`<div class=\"roxy-empty\" role=\"status\">No shadbala data</div>`;\n\t\t}\n\n\t\tconst sorted = [...this.data.planets].sort(\n\t\t\t(a, b) => a.relativeRank - b.relativeRank,\n\t\t);\n\n\t\treturn html`<div class=\"wrap\" aria-label=\"Shadbala planetary strength\">\n\t\t\t<div class=\"head\">\n\t\t\t\t<h2 class=\"title\">Shadbala</h2>\n\t\t\t\t<p class=\"subtitle\">${sorted.length} planets ranked by strength</p>\n\t\t\t</div>\n\n\t\t\t<div role=\"list\" aria-label=\"Planet strength bars\">\n\t\t\t\t${sorted.map((p) => this.renderPlanetRow(p))}\n\t\t\t</div>\n\n\t\t\t<div class=\"legend\" aria-label=\"Strength component legend\">\n\t\t\t\t${BALA_COMPONENTS.map(\n\t\t\t\t\t(b) => html`<div class=\"legend-row\">\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclass=\"legend-swatch\"\n\t\t\t\t\t\t\tstyle=\"background: ${b.color}\"\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t></span>\n\t\t\t\t\t\t${b.label}\n\t\t\t\t\t</div>`,\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>`;\n\t}\n\n\tprivate renderPlanetRow(p: Planet) {\n\t\tconst glyph = PLANET_GLYPH[capitalize(p.planet)] ?? '';\n\n\t\t// Compute positive component values (drikBala can be negative)\n\t\tconst values = BALA_COMPONENTS.map((b) => Math.max(0, p[b.key] as number));\n\t\tconst total = values.reduce((s, v) => s + v, 0);\n\n\t\tconst isAdequate =\n\t\t\ttypeof p.strengthRatio === 'number' && p.strengthRatio >= 1;\n\t\tconst badgeClass = isAdequate\n\t\t\t? 'adequacy-badge--adequate'\n\t\t\t: 'adequacy-badge--weak';\n\t\tconst badgeLabel = isAdequate ? 'adequate' : 'weak';\n\n\t\tconst rupasStr =\n\t\t\tformatNumber(p.totalRupas, 2) && formatNumber(p.minRequired, 2)\n\t\t\t\t? `${formatNumber(p.totalRupas, 2)} / ${formatNumber(p.minRequired, 2)} R`\n\t\t\t\t: '';\n\n\t\treturn html`<div class=\"planet-row\" role=\"listitem\" aria-label=\"${p.planet} shadbala\">\n\t\t\t<div class=\"planet-label\">\n\t\t\t\t<span class=\"glyph\" aria-hidden=\"true\">${glyph}</span>\n\t\t\t\t${p.planet}\n\t\t\t\t<span class=\"rank-badge\" aria-label=\"rank ${p.relativeRank}\">#${p.relativeRank}</span>\n\t\t\t</div>\n\t\t\t<div class=\"bar-wrap\">\n\t\t\t\t<div class=\"bar\" role=\"img\" aria-label=\"Strength components for ${p.planet}\">\n\t\t\t\t\t${\n\t\t\t\t\t\ttotal > 0\n\t\t\t\t\t\t\t? BALA_COMPONENTS.map((b, i) => {\n\t\t\t\t\t\t\t\t\tconst v = values[i];\n\t\t\t\t\t\t\t\t\tif (v <= 0) return nothing;\n\t\t\t\t\t\t\t\t\tconst grow = (v / total) * 100;\n\t\t\t\t\t\t\t\t\treturn html`<div\n\t\t\t\t\t\t\t\t\tclass=\"bar-segment\"\n\t\t\t\t\t\t\t\t\tstyle=\"flex-grow: ${grow}; background: ${b.color};\"\n\t\t\t\t\t\t\t\t\ttitle=\"${b.label}: ${formatNumber(v, 1)}\"\n\t\t\t\t\t\t\t\t></div>`;\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t: nothing\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"pills\">\n\t\t\t\t${rupasStr ? html`<span class=\"rupas-label\">${rupasStr}</span>` : nothing}\n\t\t\t\t<span class=\"${`adequacy-badge ${badgeClass}`}\">${badgeLabel}</span>\n\t\t\t</div>\n\t\t</div>`;\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'roxy-shadbala-table': RoxyShadbalaTable;\n\t}\n}\n", "import { css, html, LitElement, nothing, svg } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { PLANET_GLYPH, SIGN_GLYPH, SIGNS_ORDER } from '../tokens/index.js';\nimport type {\n\tCalculateSynastryResponse,\n\tNatalChartResponse,\n} from '../types/index.js';\nimport { baseStyles } from '../utils/base-styles.js';\nimport { polarToCartesian } from '../utils/degree.js';\nimport {\n\tASPECT_CLASS,\n\tformatNumber,\n\tnormalizeAspect,\n} from '../utils/format.js';\nimport { capitalize } from '../utils/string.js';\n\ntype PlanetEntry = NatalChartResponse['planets'][number];\ntype InterAspect = CalculateSynastryResponse['interAspects'][number];\n\n// Drawing the dual wheel requires per-person planet longitudes alongside\n// the synastry response. Callers can merge planet arrays from\n// /astrology/natal-chart into `person1.planets` and `person2.planets`\n// before passing the payload in; without them, the component falls back\n// to the inter-aspects table and a status note instead of an empty wheel.\ntype SynastryWithPlanets = CalculateSynastryResponse & {\n\tperson1?: { planets?: PlanetEntry[] };\n\tperson2?: { planets?: PlanetEntry[] };\n};\n\nconst SIZE = 360;\nconst CENTER = SIZE / 2;\nconst OUTER_R = 170;\nconst SIGN_R = 154;\nconst P1_R = 124;\nconst P2_R = 96;\n\n/**\n * Dual-wheel synastry chart with inter-aspects table. Pass `data` from\n * /astrology/synastry.\n */\n@customElement('roxy-synastry-chart')\nexport class RoxySynastryChart extends LitElement {\n\tstatic styles = [\n\t\tbaseStyles,\n\t\tcss`\n\t\t\t.wrap {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\n\t\t\t.head {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t\tflex-wrap: wrap;\n\t\t\t}\n\n\t\t\t.title {\n\t\t\t\tfont-size: var(--roxy-text-lg, 1.125rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tmargin: 0;\n\t\t\t}\n\n\t\t\t.score {\n\t\t\t\tfont-variant-numeric: tabular-nums;\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tcolor: var(--roxy-accent-fg, #b45309);\n\t\t\t\tfont-size: var(--roxy-text-xl, 1.5rem);\n\t\t\t}\n\n\t\t\tsvg {\n\t\t\t\tdisplay: block;\n\t\t\t\twidth: 100%;\n\t\t\t\tmax-width: 400px;\n\t\t\t\tmargin: 0 auto;\n\t\t\t}\n\n\t\t\t.wheel-line {\n\t\t\t\tfill: none;\n\t\t\t\tstroke: var(--roxy-border, #e4e4e7);\n\t\t\t}\n\t\t\t.sign {\n\t\t\t\tfill: var(--roxy-secondary, #475569);\n\t\t\t\tfont-size: 14px;\n\t\t\t}\n\t\t\t.p1 {\n\t\t\t\tfill: var(--roxy-accent, #f59e0b);\n\t\t\t\tfont-weight: 600;\n\t\t\t\tfont-size: 13px;\n\t\t\t}\n\t\t\t.p2 {\n\t\t\t\tfill: var(--roxy-info, #0284c7);\n\t\t\t\tfont-weight: 600;\n\t\t\t\tfont-size: 13px;\n\t\t\t}\n\t\t\t.aspect {\n\t\t\t\tstroke-width: 0.8;\n\t\t\t\tfill: none;\n\t\t\t\topacity: 0.5;\n\t\t\t}\n\t\t\t.aspect-trine,\n\t\t\t.aspect-sextile {\n\t\t\t\tstroke: var(--roxy-success, #16a34a);\n\t\t\t}\n\t\t\t.aspect-square,\n\t\t\t.aspect-opposition {\n\t\t\t\tstroke: var(--roxy-danger, #dc2626);\n\t\t\t}\n\t\t\t.aspect-conjunction {\n\t\t\t\tstroke: var(--roxy-accent-fg, #b45309);\n\t\t\t}\n\t\t\t.aspect-other {\n\t\t\t\tstroke: var(--roxy-muted, #71717a);\n\t\t\t\topacity: 0.35;\n\t\t\t}\n\t\t\t.legend-row {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-wrap: wrap;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tmargin-top: calc(var(--roxy-space-xs, 0.25rem) * -1);\n\t\t\t}\n\t\t\t.legend-row .swatch {\n\t\t\t\tdisplay: inline-block;\n\t\t\t\twidth: 8px;\n\t\t\t\theight: 8px;\n\t\t\t\tborder-radius: 50%;\n\t\t\t\tmargin-right: 4px;\n\t\t\t\tvertical-align: middle;\n\t\t\t}\n\n\t\t\t.summary {\n\t\t\t\tmargin: 0;\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t\tfont-size: var(--roxy-text-base, 1rem);\n\t\t\t}\n\n\t\t\ttable {\n\t\t\t\twidth: 100%;\n\t\t\t\tborder-collapse: collapse;\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t}\n\t\t\tth,\n\t\t\ttd {\n\t\t\t\tpadding: var(--roxy-space-sm, 0.5rem);\n\t\t\t\tborder-bottom: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\ttext-align: left;\n\t\t\t}\n\t\t\tth {\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tletter-spacing: 0.06em;\n\t\t\t}\n\t\t\ttd.orb {\n\t\t\t\tfont-variant-numeric: tabular-nums;\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t}\n\n\t\t\t.lists {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: repeat(auto-fit, minmax(14rem, 1fr));\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\t\t\t.lists h3 {\n\t\t\t\tmargin: 0 0 var(--roxy-space-xs, 0.25rem) 0;\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tletter-spacing: 0.06em;\n\t\t\t}\n\t\t\t.lists ul {\n\t\t\t\tmargin: 0;\n\t\t\t\tpadding-left: var(--roxy-space-md, 1rem);\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t}\n\n\t\t\t.missing-planets {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-accent, #f59e0b) 8%, transparent);\n\t\t\t\tborder: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t\tpadding: var(--roxy-space-md, 1rem);\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tline-height: 1.5;\n\t\t\t}\n\t\t\t.missing-planets code {\n\t\t\t\tfont-family: var(--roxy-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);\n\t\t\t\tfont-size: 0.95em;\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-fg, #0a0a0a) 6%, transparent);\n\t\t\t\tpadding: 0 4px;\n\t\t\t\tborder-radius: 4px;\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\tdata: SynastryWithPlanets | null = null;\n\n\trender() {\n\t\tif (!this.data)\n\t\t\treturn html`<div class=\"roxy-empty\" role=\"status\">No synastry data</div>`;\n\t\tconst { person1, person2, compatibilityScore, analysis } = this.data;\n\t\tconst interAspects = this.data.interAspects ?? [];\n\t\tconst p1Planets = person1?.planets ?? [];\n\t\tconst p2Planets = person2?.planets ?? [];\n\n\t\tconst score =\n\t\t\ttypeof compatibilityScore === 'number'\n\t\t\t\t? Math.round(compatibilityScore)\n\t\t\t\t: undefined;\n\t\tconst summaryText = analysis?.overall;\n\t\tconst strengths = analysis?.strengths ?? [];\n\t\tconst challenges = analysis?.challenges ?? [];\n\n\t\t// /astrology/synastry does not return per-person planet positions, so the\n\t\t// dual-wheel cannot be drawn from a bare synastry response. Surface this\n\t\t// explicitly instead of rendering a blank wheel; keep the inter-aspects\n\t\t// table when it is present so callers still get useful output.\n\t\tconst hasPlanets = p1Planets.length > 0 && p2Planets.length > 0;\n\t\tif (!hasPlanets) {\n\t\t\treturn html`<div\n\t\t\t\tclass=\"wrap\"\n\t\t\t\taria-label=\"Synastry compatibility chart\"\n\t\t\t>\n\t\t\t\t<div class=\"head\">\n\t\t\t\t\t<h2 class=\"title\">Synastry</h2>\n\t\t\t\t\t${\n\t\t\t\t\t\ttypeof score === 'number'\n\t\t\t\t\t\t\t? html`<span class=\"score\" aria-label=${`Score ${score} of 100`}\n\t\t\t\t\t\t\t\t>${score} / 100</span\n\t\t\t\t\t\t\t>`\n\t\t\t\t\t\t\t: nothing\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"missing-planets\" role=\"status\">\n\t\t\t\t\tSynastry response missing planet positions. Pass\n\t\t\t\t\t<code>data</code> with <code>person1.planets</code> and\n\t\t\t\t\t<code>person2.planets</code> arrays from the natal-chart endpoint, or\n\t\t\t\t\tuse the <code>&lt;roxy-data&gt;</code> fallback.\n\t\t\t\t</div>\n\t\t\t\t${summaryText ? html`<p class=\"summary\">${summaryText}</p>` : nothing}\n\t\t\t\t${interAspects.length > 0 ? this.renderAspects(interAspects) : nothing}\n\t\t\t\t${\n\t\t\t\t\tstrengths.length > 0 || challenges.length > 0\n\t\t\t\t\t\t? html`<div class=\"lists\">\n\t\t\t\t\t\t\t${\n\t\t\t\t\t\t\t\tstrengths.length\n\t\t\t\t\t\t\t\t\t? html`<div>\n\t\t\t\t\t\t\t\t\t\t<h3>Strengths</h3>\n\t\t\t\t\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t\t\t\t\t${strengths.map((s) => html`<li>${s}</li>`)}\n\t\t\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t\t\t</div>`\n\t\t\t\t\t\t\t\t\t: nothing\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t${\n\t\t\t\t\t\t\t\tchallenges.length\n\t\t\t\t\t\t\t\t\t? html`<div>\n\t\t\t\t\t\t\t\t\t\t<h3>Challenges</h3>\n\t\t\t\t\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t\t\t\t\t${challenges.map((s) => html`<li>${s}</li>`)}\n\t\t\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t\t\t</div>`\n\t\t\t\t\t\t\t\t\t: nothing\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</div>`\n\t\t\t\t\t\t: nothing\n\t\t\t\t}\n\t\t\t</div>`;\n\t\t}\n\n\t\treturn html`<div\n\t\t\tclass=\"wrap\"\n\t\t\taria-label=\"Synastry compatibility chart\"\n\t\t>\n\t\t\t<div class=\"head\">\n\t\t\t\t<h2 class=\"title\">Synastry</h2>\n\t\t\t\t${\n\t\t\t\t\ttypeof score === 'number'\n\t\t\t\t\t\t? html`<span class=\"score\" aria-label=${`Score ${score} of 100`}\n\t\t\t\t\t\t\t>${score} / 100</span\n\t\t\t\t\t\t>`\n\t\t\t\t\t\t: nothing\n\t\t\t\t}\n\t\t\t</div>\n\t\t\t<svg\n\t\t\t\tviewBox=\"0 0 ${SIZE} ${SIZE}\"\n\t\t\t\trole=\"img\"\n\t\t\t\taria-label=\"Dual chart wheel comparing two natal charts\"\n\t\t\t>\n\t\t\t\t<title>Synastry dual wheel</title>\n\t\t\t\t<circle\n\t\t\t\t\tclass=\"wheel-line\"\n\t\t\t\t\tcx=${CENTER}\n\t\t\t\t\tcy=${CENTER}\n\t\t\t\t\tr=${OUTER_R}\n\t\t\t\t\tstroke-width=\"1.5\"\n\t\t\t\t/>\n\t\t\t\t<circle\n\t\t\t\t\tclass=\"wheel-line\"\n\t\t\t\t\tcx=${CENTER}\n\t\t\t\t\tcy=${CENTER}\n\t\t\t\t\tr=${P2_R + 14}\n\t\t\t\t\tstroke-width=\"0.8\"\n\t\t\t\t/>\n\t\t\t\t<circle\n\t\t\t\t\tclass=\"wheel-line\"\n\t\t\t\t\tcx=${CENTER}\n\t\t\t\t\tcy=${CENTER}\n\t\t\t\t\tr=${P2_R - 14}\n\t\t\t\t\tstroke-width=\"0.6\"\n\t\t\t\t/>\n\t\t\t\t${this.renderSpokes()} ${this.renderSigns()}\n\t\t\t\t${this.renderInterAspectLines(p1Planets, p2Planets, interAspects)}\n\t\t\t\t${this.renderRing(p1Planets, P1_R, 'p1')} ${this.renderRing(p2Planets, P2_R, 'p2')}\n\t\t\t</svg>\n\t\t\t<div class=\"legend-row\">\n\t\t\t\t<span><span class=\"swatch\" style=\"background: var(--roxy-accent)\"></span>Person 1</span>\n\t\t\t\t<span><span class=\"swatch\" style=\"background: var(--roxy-info)\"></span>Person 2</span>\n\t\t\t\t<span><span class=\"swatch\" style=\"background: var(--roxy-success)\"></span>harmonious</span>\n\t\t\t\t<span><span class=\"swatch\" style=\"background: var(--roxy-danger)\"></span>challenging</span>\n\t\t\t</div>\n\t\t\t${summaryText ? html`<p class=\"summary\">${summaryText}</p>` : nothing}\n\t\t\t${interAspects.length > 0 ? this.renderAspects(interAspects) : nothing}\n\t\t\t${\n\t\t\t\tstrengths.length > 0 || challenges.length > 0\n\t\t\t\t\t? html`<div class=\"lists\">\n\t\t\t\t\t\t${\n\t\t\t\t\t\t\tstrengths.length\n\t\t\t\t\t\t\t\t? html`<div>\n\t\t\t\t\t\t\t\t\t<h3>Strengths</h3>\n\t\t\t\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t\t\t\t${strengths.map((s) => html`<li>${s}</li>`)}\n\t\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t\t</div>`\n\t\t\t\t\t\t\t\t: nothing\n\t\t\t\t\t\t}\n\t\t\t\t\t\t${\n\t\t\t\t\t\t\tchallenges.length\n\t\t\t\t\t\t\t\t? html`<div>\n\t\t\t\t\t\t\t\t\t<h3>Challenges</h3>\n\t\t\t\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t\t\t\t${challenges.map((s) => html`<li>${s}</li>`)}\n\t\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t\t</div>`\n\t\t\t\t\t\t\t\t: nothing\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t</div>`;\n\t}\n\n\tprivate toAngle(longitude: number): number {\n\t\treturn 180 - longitude;\n\t}\n\n\tprivate renderSpokes() {\n\t\treturn Array.from({ length: 12 }, (_, i) => {\n\t\t\tconst angle = this.toAngle(i * 30);\n\t\t\tconst start = polarToCartesian(CENTER, CENTER, P2_R - 14, angle);\n\t\t\tconst end = polarToCartesian(CENTER, CENTER, OUTER_R, angle);\n\t\t\treturn svg`<line class=\"wheel-line\" x1=${start.x} y1=${start.y} x2=${end.x} y2=${end.y} stroke-width=\"0.6\" />`;\n\t\t});\n\t}\n\n\tprivate renderSigns() {\n\t\treturn SIGNS_ORDER.map((s, i) => {\n\t\t\tconst angle = this.toAngle(i * 30 + 15);\n\t\t\tconst pos = polarToCartesian(CENTER, CENTER, SIGN_R, angle);\n\t\t\treturn svg`<text class=\"sign\" x=${pos.x} y=${pos.y} text-anchor=\"middle\" dominant-baseline=\"central\">${SIGN_GLYPH[s]}</text>`;\n\t\t});\n\t}\n\n\tprivate renderRing(planets: PlanetEntry[], radius: number, cls: string) {\n\t\treturn planets.map((p) => {\n\t\t\tif (!Number.isFinite(p.longitude)) return nothing;\n\t\t\tconst pos = polarToCartesian(\n\t\t\t\tCENTER,\n\t\t\t\tCENTER,\n\t\t\t\tradius,\n\t\t\t\tthis.toAngle(p.longitude),\n\t\t\t);\n\t\t\tconst glyph = PLANET_GLYPH[capitalize(p.name)] ?? p.name.slice(0, 2);\n\t\t\treturn svg`<text class=${cls} x=${pos.x} y=${pos.y} text-anchor=\"middle\" dominant-baseline=\"central\"><title>${p.name}</title>${glyph}</text>`;\n\t\t});\n\t}\n\n\tprivate renderInterAspectLines(\n\t\tp1: PlanetEntry[],\n\t\tp2: PlanetEntry[],\n\t\taspects: InterAspect[],\n\t) {\n\t\tconst longitudeOf = (\n\t\t\tlist: PlanetEntry[],\n\t\t\tname: string,\n\t\t): number | undefined => {\n\t\t\tconst target = capitalize(name);\n\t\t\tfor (const p of list) {\n\t\t\t\tif (capitalize(p.name) !== target) continue;\n\t\t\t\tif (typeof p.longitude === 'number') return p.longitude;\n\t\t\t}\n\t\t\treturn undefined;\n\t\t};\n\t\treturn aspects.map((a) => {\n\t\t\tconst l1 = longitudeOf(p1, a.planet1);\n\t\t\tconst l2 = longitudeOf(p2, a.planet2);\n\t\t\tif (l1 === undefined || l2 === undefined) return nothing;\n\t\t\tconst out = polarToCartesian(CENTER, CENTER, P1_R - 12, this.toAngle(l1));\n\t\t\tconst inn = polarToCartesian(CENTER, CENTER, P2_R + 8, this.toAngle(l2));\n\t\t\tconst aspectName = normalizeAspect(a);\n\t\t\tconst cls = ASPECT_CLASS[aspectName] ?? 'aspect-other';\n\t\t\tconst orbLabel = formatNumber(a.orb, 1);\n\t\t\treturn svg`<line class=${`aspect ${cls}`} x1=${out.x} y1=${out.y} x2=${inn.x} y2=${inn.y}><title>${a.planet1} ${aspectName} ${a.planet2}${orbLabel ? ` (orb ${orbLabel}\u00B0)` : ''}</title></line>`;\n\t\t});\n\t}\n\n\tprivate renderAspects(aspects: InterAspect[]) {\n\t\treturn html`<table>\n\t\t\t<thead>\n\t\t\t\t<tr>\n\t\t\t\t\t<th>Planet 1</th>\n\t\t\t\t\t<th>Planet 2</th>\n\t\t\t\t\t<th>Aspect</th>\n\t\t\t\t\t<th>Orb</th>\n\t\t\t\t\t<th>Strength</th>\n\t\t\t\t</tr>\n\t\t\t</thead>\n\t\t\t<tbody>\n\t\t\t\t${aspects.slice(0, 12).map(\n\t\t\t\t\t(a) => html`<tr>\n\t\t\t\t\t\t<td>${a.planet1}</td>\n\t\t\t\t\t\t<td>${a.planet2}</td>\n\t\t\t\t\t\t<td>${normalizeAspect(a) || ''}</td>\n\t\t\t\t\t\t<td class=\"orb\">${formatNumber(a.orb, 1)}</td>\n\t\t\t\t\t\t<td>${formatStrength(a.strength)}</td>\n\t\t\t\t\t</tr>`,\n\t\t\t\t)}\n\t\t\t</tbody>\n\t\t</table>`;\n\t}\n}\n\nfunction formatStrength(s: number | undefined): string {\n\tif (typeof s === 'number') return Math.round(s).toString();\n\treturn '';\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'roxy-synastry-chart': RoxySynastryChart;\n\t}\n}\n", "import { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport type { GetCardResponse, GetDailyCardResponse } from '../types/index.js';\nimport { baseStyles } from '../utils/base-styles.js';\n\ntype TarotData = GetCardResponse | GetDailyCardResponse;\n\n/**\n * Tarot card. Renders /tarot/cards/{id} or /tarot/daily. Click to flip\n * between upright and reversed where the data shape supports it.\n */\n@customElement('roxy-tarot-card')\nexport class RoxyTarotCard extends LitElement {\n\tstatic styles = [\n\t\tbaseStyles,\n\t\tcss`\n\t\t\t.card {\n\t\t\t\tbackground: var(--roxy-bg, #fff);\n\t\t\t\tborder: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t\tpadding: var(--roxy-space-lg, 1.5rem);\n\t\t\t\tbox-shadow: var(--roxy-shadow-sm);\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: minmax(0, 9rem) 1fr;\n\t\t\t\tgap: var(--roxy-space-lg, 1.5rem);\n\t\t\t\talign-items: start;\n\t\t\t}\n\n\t\t\t@container (max-width: 480px) {\n\t\t\t\t.card {\n\t\t\t\t\tgrid-template-columns: 1fr;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.image-wrap {\n\t\t\t\tperspective: 800px;\n\t\t\t}\n\t\t\t.image {\n\t\t\t\tdisplay: block;\n\t\t\t\twidth: 100%;\n\t\t\t\theight: auto;\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-border, #e4e4e7) 60%, transparent);\n\t\t\t\ttransition:\n\t\t\t\t\ttransform var(--roxy-motion-duration, 200ms)\n\t\t\t\t\tvar(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1));\n\t\t\t\tcursor: pointer;\n\t\t\t}\n\t\t\t.image.reversed {\n\t\t\t\ttransform: rotate(180deg);\n\t\t\t}\n\t\t\t.image:focus-visible {\n\t\t\t\toutline: 2px solid var(--roxy-ring, rgba(245, 158, 11, 0.4));\n\t\t\t\toutline-offset: 2px;\n\t\t\t}\n\n\t\t\t.title {\n\t\t\t\tmargin: 0;\n\t\t\t\tfont-size: var(--roxy-text-xl, 1.5rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tletter-spacing: var(--roxy-tracking-tight);\n\t\t\t}\n\t\t\t.meta {\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tletter-spacing: 0.06em;\n\t\t\t\tmargin-bottom: var(--roxy-space-sm, 0.5rem);\n\t\t\t}\n\n\t\t\t.message {\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t\tmargin: var(--roxy-space-sm, 0.5rem) 0 var(--roxy-space-md, 1rem);\n\t\t\t}\n\n\t\t\t.chips {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-wrap: wrap;\n\t\t\t\tgap: var(--roxy-space-xs, 0.25rem);\n\t\t\t\tmargin-top: var(--roxy-space-sm, 0.5rem);\n\t\t\t}\n\t\t\t.chips span {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-accent, #f59e0b) 14%, transparent);\n\t\t\t\tpadding: 2px 8px;\n\t\t\t\tborder-radius: var(--roxy-radius-full, 9999px);\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t}\n\n\t\t\t.flip {\n\t\t\t\tmargin-top: var(--roxy-space-sm, 0.5rem);\n\t\t\t\tbackground: transparent;\n\t\t\t\tborder: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t\tpadding: 4px 12px;\n\t\t\t\tfont-family: inherit;\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tcolor: var(--roxy-secondary, #475569);\n\t\t\t\tcursor: pointer;\n\t\t\t\ttransition:\n\t\t\t\t\ttransform var(--roxy-motion-duration, 200ms)\n\t\t\t\t\tvar(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1));\n\t\t\t}\n\t\t\t.flip:hover {\n\t\t\t\ttransform: scale(1.02);\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\tdata: TarotData | null = null;\n\n\t@state()\n\tprivate flipped = false;\n\n\tprivate toggleFlip = () => {\n\t\tthis.flipped = !this.flipped;\n\t};\n\n\trender() {\n\t\tconst d = this.data;\n\t\tif (!d)\n\t\t\treturn html`<div class=\"roxy-empty\" role=\"status\">No tarot data</div>`;\n\n\t\tif ('card' in d) return this.renderDailyCard(d);\n\t\treturn this.renderFullCard(d);\n\t}\n\n\tprivate renderDailyCard(d: GetDailyCardResponse) {\n\t\tconst card = d.card;\n\t\tconst isReversed = this.flipped !== Boolean(card.reversed);\n\t\tconst keywords = card.keywords ?? [];\n\n\t\treturn html`<article class=\"card\" aria-label=${card.name ?? 'Tarot card'}>\n\t\t\t<div class=\"image-wrap\">\n\t\t\t\t${\n\t\t\t\t\tcard.imageUrl\n\t\t\t\t\t\t? html`<img\n\t\t\t\t\t\t\tclass=${`image ${isReversed ? 'reversed' : ''}`}\n\t\t\t\t\t\t\tsrc=${card.imageUrl}\n\t\t\t\t\t\t\talt=${card.name ?? 'Tarot card'}\n\t\t\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t\t\t\t@click=${this.toggleFlip}\n\t\t\t\t\t\t\t@keydown=${(e: KeyboardEvent) => {\n\t\t\t\t\t\t\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\tthis.toggleFlip();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>`\n\t\t\t\t\t\t: html`<div\n\t\t\t\t\t\t\tclass=${`image ${isReversed ? 'reversed' : ''}`}\n\t\t\t\t\t\t\tstyle=\"aspect-ratio: 0.6; display: flex; align-items: center; justify-content: center; color: var(--roxy-muted)\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t${card.name ?? '?'}\n\t\t\t\t\t\t</div>`\n\t\t\t\t}\n\t\t\t</div>\n\t\t\t<div>\n\t\t\t\t<div class=\"meta\">\n\t\t\t\t\t${card.arcana ? html`${card.arcana} arcana` : nothing}\n\t\t\t\t\t${isReversed ? html` \u00B7 reversed` : nothing}\n\t\t\t\t</div>\n\t\t\t\t<h2 class=\"title\">${card.name ?? 'Tarot card'}</h2>\n\t\t\t\t${d.dailyMessage ? html`<p class=\"message\">${d.dailyMessage}</p>` : nothing}\n\t\t\t\t${card.meaning ? html`<p>${card.meaning}</p>` : nothing}\n\t\t\t\t${\n\t\t\t\t\tkeywords.length > 0\n\t\t\t\t\t\t? html`<div class=\"chips\">\n\t\t\t\t\t\t\t${keywords.map((k) => html`<span>${k}</span>`)}\n\t\t\t\t\t\t</div>`\n\t\t\t\t\t\t: nothing\n\t\t\t\t}\n\t\t\t\t<button\n\t\t\t\t\tclass=\"flip\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t@click=${this.toggleFlip}\n\t\t\t\t\taria-pressed=${this.flipped ? 'true' : 'false'}\n\t\t\t\t>\n\t\t\t\t\tFlip card\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</article>`;\n\t}\n\n\tprivate renderFullCard(d: GetCardResponse) {\n\t\tconst isReversed = this.flipped;\n\t\tconst orientedMeaning = isReversed ? d.reversed : d.upright;\n\t\tconst keywords = isReversed\n\t\t\t? (d.keywords?.reversed ?? [])\n\t\t\t: (d.keywords?.upright ?? []);\n\n\t\treturn html`<article class=\"card\" aria-label=${d.name ?? 'Tarot card'}>\n\t\t\t<div class=\"image-wrap\">\n\t\t\t\t${\n\t\t\t\t\td.imageUrl\n\t\t\t\t\t\t? html`<img\n\t\t\t\t\t\t\tclass=${`image ${isReversed ? 'reversed' : ''}`}\n\t\t\t\t\t\t\tsrc=${d.imageUrl}\n\t\t\t\t\t\t\talt=${d.name ?? 'Tarot card'}\n\t\t\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t\t\t\t@click=${this.toggleFlip}\n\t\t\t\t\t\t\t@keydown=${(e: KeyboardEvent) => {\n\t\t\t\t\t\t\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\tthis.toggleFlip();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>`\n\t\t\t\t\t\t: html`<div\n\t\t\t\t\t\t\tclass=${`image ${isReversed ? 'reversed' : ''}`}\n\t\t\t\t\t\t\tstyle=\"aspect-ratio: 0.6; display: flex; align-items: center; justify-content: center; color: var(--roxy-muted)\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t${d.name ?? '?'}\n\t\t\t\t\t\t</div>`\n\t\t\t\t}\n\t\t\t</div>\n\t\t\t<div>\n\t\t\t\t<div class=\"meta\">\n\t\t\t\t\t${d.arcana ? html`${d.arcana} arcana` : nothing}\n\t\t\t\t\t${d.number !== undefined && d.number !== null ? html` \u00B7 ${d.number}` : nothing}\n\t\t\t\t\t${isReversed ? html` \u00B7 reversed` : nothing}\n\t\t\t\t</div>\n\t\t\t\t<h2 class=\"title\">${d.name ?? 'Tarot card'}</h2>\n\t\t\t\t${orientedMeaning?.description ? html`<p>${orientedMeaning.description}</p>` : nothing}\n\t\t\t\t${\n\t\t\t\t\tkeywords.length > 0\n\t\t\t\t\t\t? html`<div class=\"chips\">\n\t\t\t\t\t\t\t${keywords.map((k) => html`<span>${k}</span>`)}\n\t\t\t\t\t\t</div>`\n\t\t\t\t\t\t: nothing\n\t\t\t\t}\n\t\t\t\t<button\n\t\t\t\t\tclass=\"flip\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t@click=${this.toggleFlip}\n\t\t\t\t\taria-pressed=${this.flipped ? 'true' : 'false'}\n\t\t\t\t>\n\t\t\t\t\tFlip card\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</article>`;\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'roxy-tarot-card': RoxyTarotCard;\n\t}\n}\n", "import { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type {\n\tCastCelticCrossResponse,\n\tCastLoveSpreadResponse,\n\tCastReadingResponse,\n\tCastThreeCardResponse,\n\tCastYesNoResponse,\n\tDrawCardsResponse,\n} from '../types/index.js';\nimport { baseStyles } from '../utils/base-styles.js';\n\ntype TarotSpreadData =\n\t| CastThreeCardResponse\n\t| CastCelticCrossResponse\n\t| CastLoveSpreadResponse\n\t| CastYesNoResponse\n\t| CastReadingResponse\n\t| DrawCardsResponse;\n\n/**\n * Tarot spread card. Renders /tarot/spreads/{three-card,celtic-cross,love},\n * /tarot/yes-no, /tarot/draw responses.\n */\n@customElement('roxy-tarot-spread')\nexport class RoxyTarotSpread extends LitElement {\n\tstatic styles = [\n\t\tbaseStyles,\n\t\tcss`\n\t\t\t.wrap {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\n\t\t\t.head {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t\tflex-wrap: wrap;\n\t\t\t\talign-items: baseline;\n\t\t\t}\n\t\t\t.title {\n\t\t\t\tmargin: 0;\n\t\t\t\tfont-size: var(--roxy-text-lg, 1.125rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\ttext-transform: capitalize;\n\t\t\t}\n\t\t\t.question {\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tfont-style: italic;\n\t\t\t}\n\n\t\t\t.answer {\n\t\t\t\tdisplay: inline-block;\n\t\t\t\tpadding: 4px 14px;\n\t\t\t\tborder-radius: var(--roxy-radius-full, 9999px);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tfont-size: var(--roxy-text-base, 1rem);\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tletter-spacing: 0.06em;\n\t\t\t}\n\t\t\t.answer.yes {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-success, #16a34a) 16%, transparent);\n\t\t\t\tcolor: var(--roxy-success-fg, #166534);\n\t\t\t}\n\t\t\t.answer.no {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-danger, #dc2626) 16%, transparent);\n\t\t\t\tcolor: var(--roxy-danger-fg, #991b1b);\n\t\t\t}\n\t\t\t.answer.maybe {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-warning, #ea580c) 16%, transparent);\n\t\t\t\tcolor: var(--roxy-warning-fg, #9a3412);\n\t\t\t}\n\n\t\t\t.grid {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: repeat(auto-fit, minmax(8rem, 1fr));\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\n\t\t\t.card {\n\t\t\t\tborder: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t\tpadding: var(--roxy-space-sm, 0.5rem);\n\t\t\t\tbackground: var(--roxy-bg, #fff);\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: var(--roxy-space-xs, 0.25rem);\n\t\t\t}\n\t\t\t.label {\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tletter-spacing: 0.06em;\n\t\t\t\tmargin: 0;\n\t\t\t}\n\t\t\t.image {\n\t\t\t\twidth: 100%;\n\t\t\t\taspect-ratio: 0.6;\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-border, #e4e4e7) 60%, transparent);\n\t\t\t\tborder-radius: var(--roxy-radius-sm, 4px);\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\toverflow: hidden;\n\t\t\t}\n\t\t\t.image img {\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 100%;\n\t\t\t\tobject-fit: cover;\n\t\t\t\ttransition:\n\t\t\t\t\ttransform var(--roxy-motion-duration, 200ms)\n\t\t\t\t\tvar(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1));\n\t\t\t}\n\t\t\t.image img.reversed {\n\t\t\t\ttransform: rotate(180deg);\n\t\t\t}\n\t\t\t.name {\n\t\t\t\tmargin: 0;\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t}\n\t\t\t.interp {\n\t\t\t\tmargin: 0;\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tcolor: var(--roxy-secondary, #475569);\n\t\t\t}\n\n\t\t\t.reading {\n\t\t\t\tmargin: 0;\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\tdata: TarotSpreadData | null = null;\n\n\t@property({ type: String, reflect: true })\n\tspread: 'three-card' | 'celtic-cross' | 'love' | 'yes-no' | 'draw' =\n\t\t'three-card';\n\n\trender() {\n\t\tconst d = this.data;\n\t\tif (!d)\n\t\t\treturn html`<div class=\"roxy-empty\" role=\"status\">No tarot spread</div>`;\n\n\t\tconst isYesNo = 'answer' in d;\n\t\tconst isDrawn = 'cards' in d && !('spread' in d);\n\t\tconst positions = isDrawn\n\t\t\t? []\n\t\t\t: 'positions' in d\n\t\t\t\t? (d.positions ?? [])\n\t\t\t\t: [];\n\t\tconst cards = isDrawn && 'cards' in d ? (d as DrawCardsResponse).cards : [];\n\t\tconst answer = isYesNo ? (d as CastYesNoResponse).answer : undefined;\n\t\tconst strength = isYesNo ? (d as CastYesNoResponse).strength : undefined;\n\t\tconst spreadLabel =\n\t\t\t'spread' in d\n\t\t\t\t? (d as CastThreeCardResponse).spread\n\t\t\t\t: this.spread.replace(/-/g, ' ');\n\t\tconst question =\n\t\t\t'question' in d ? (d as CastThreeCardResponse).question : undefined;\n\t\tconst summary =\n\t\t\t'summary' in d ? (d as CastThreeCardResponse).summary : undefined;\n\t\tconst yesNoInterp = isYesNo\n\t\t\t? (d as CastYesNoResponse).interpretation\n\t\t\t: undefined;\n\t\tconst answerClass = answer\n\t\t\t? answer.toLowerCase().replace(/[^a-z]/g, '')\n\t\t\t: '';\n\n\t\treturn html`<article class=\"wrap\" aria-label=\"Tarot spread\">\n\t\t\t<header class=\"head\">\n\t\t\t\t<h2 class=\"title\">${spreadLabel}</h2>\n\t\t\t\t${question ? html`<span class=\"question\">\"${question}\"</span>` : nothing}\n\t\t\t</header>\n\t\t\t${\n\t\t\t\tisYesNo\n\t\t\t\t\t? html`<div>\n\t\t\t\t\t\t<span class=${`answer ${answerClass}`}>${answer}</span>\n\t\t\t\t\t\t${strength ? html`<small> \u00B7 ${strength}</small>` : nothing}\n\t\t\t\t\t</div>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t\t${\n\t\t\t\tpositions.length > 0\n\t\t\t\t\t? html`<div class=\"grid\">\n\t\t\t\t\t\t${positions.map(\n\t\t\t\t\t\t\t(p) => html`<div class=\"card\">\n\t\t\t\t\t\t\t\t<p class=\"label\">${p.name ?? ''}</p>\n\t\t\t\t\t\t\t\t<div class=\"image\">\n\t\t\t\t\t\t\t\t\t${\n\t\t\t\t\t\t\t\t\t\tp.card?.imageUrl\n\t\t\t\t\t\t\t\t\t\t\t? html`<img\n\t\t\t\t\t\t\t\t\t\t\t\tsrc=${p.card.imageUrl}\n\t\t\t\t\t\t\t\t\t\t\t\talt=${p.card.name ?? 'tarot card'}\n\t\t\t\t\t\t\t\t\t\t\t\tclass=${p.card.reversed ? 'reversed' : ''}\n\t\t\t\t\t\t\t\t\t\t\t/>`\n\t\t\t\t\t\t\t\t\t\t\t: html`${p.card?.name ?? '?'}`\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<p class=\"name\">\n\t\t\t\t\t\t\t\t\t${p.card?.name ?? ''}\n\t\t\t\t\t\t\t\t\t${p.card?.reversed ? html`<small>(reversed)</small>` : nothing}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t${p.interpretation ? html`<p class=\"interp\">${p.interpretation}</p>` : nothing}\n\t\t\t\t\t\t\t</div>`,\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t\t${\n\t\t\t\tcards.length > 0\n\t\t\t\t\t? html`<div class=\"grid\">\n\t\t\t\t\t\t${cards.map(\n\t\t\t\t\t\t\t(c) => html`<div class=\"card\">\n\t\t\t\t\t\t\t\t<div class=\"image\">\n\t\t\t\t\t\t\t\t\t${\n\t\t\t\t\t\t\t\t\t\tc.imageUrl\n\t\t\t\t\t\t\t\t\t\t\t? html`<img\n\t\t\t\t\t\t\t\t\t\t\t\tsrc=${c.imageUrl}\n\t\t\t\t\t\t\t\t\t\t\t\talt=${c.name ?? 'tarot card'}\n\t\t\t\t\t\t\t\t\t\t\t\tclass=${c.reversed ? 'reversed' : ''}\n\t\t\t\t\t\t\t\t\t\t\t/>`\n\t\t\t\t\t\t\t\t\t\t\t: html`${c.name ?? '?'}`\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<p class=\"name\">\n\t\t\t\t\t\t\t\t\t${c.name ?? ''}\n\t\t\t\t\t\t\t\t\t${c.reversed ? html`<small>(reversed)</small>` : nothing}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t${c.meaning ? html`<p class=\"interp\">${c.meaning}</p>` : nothing}\n\t\t\t\t\t\t\t</div>`,\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t\t${summary ? html`<p class=\"reading\">${summary}</p>` : nothing}\n\t\t\t${yesNoInterp ? html`<p class=\"reading\">${yesNoInterp}</p>` : nothing}\n\t\t</article>`;\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'roxy-tarot-spread': RoxyTarotSpread;\n\t}\n}\n", "import { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { PLANET_GLYPH, SIGN_GLYPH } from '../tokens/index.js';\nimport type { TransitsResponse } from '../types/index.js';\nimport { baseStyles } from '../utils/base-styles.js';\nimport { formatDate, formatNumber, formatTime } from '../utils/format.js';\nimport { capitalize } from '../utils/string.js';\n\n/**\n * Transit positions and aspect table. Pass `data` from /astrology/transits.\n * When natalChart is included in the request, `data.transitAspects` and\n * `data.summary` are present and rendered automatically.\n */\n@customElement('roxy-transits-table')\nexport class RoxyTransitsTable extends LitElement {\n\tstatic styles = [\n\t\tbaseStyles,\n\t\tcss`\n\t\t\t.wrap {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\n\t\t\t.head {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\talign-items: baseline;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t\tflex-wrap: wrap;\n\t\t\t}\n\n\t\t\t.title {\n\t\t\t\tfont-size: var(--roxy-text-lg, 1.125rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tmargin: 0;\n\t\t\t}\n\n\t\t\t.subtitle {\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tmargin: 0;\n\t\t\t}\n\n\t\t\t.summary-pills {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-wrap: wrap;\n\t\t\t\tgap: var(--roxy-space-sm, 0.5rem);\n\t\t\t}\n\n\t\t\t.pill {\n\t\t\t\tdisplay: inline-flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 4px;\n\t\t\t\tpadding: 2px var(--roxy-space-sm, 0.5rem);\n\t\t\t\tborder-radius: var(--roxy-radius-full, 9999px);\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tborder: 1px solid currentColor;\n\t\t\t}\n\n\t\t\t.pill--muted {\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-border, #e4e4e7) 60%, transparent);\n\t\t\t}\n\n\t\t\t.pill--success {\n\t\t\t\tcolor: var(--roxy-success-fg, #166534);\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-success, #16a34a) 10%, transparent);\n\t\t\t}\n\n\t\t\t.pill--danger {\n\t\t\t\tcolor: var(--roxy-danger-fg, #991b1b);\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-danger, #dc2626) 10%, transparent);\n\t\t\t}\n\n\t\t\ttable {\n\t\t\t\twidth: 100%;\n\t\t\t\tborder-collapse: collapse;\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t}\n\n\t\t\tth,\n\t\t\ttd {\n\t\t\t\tpadding: var(--roxy-space-sm, 0.5rem);\n\t\t\t\tborder-bottom: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\ttext-align: left;\n\t\t\t}\n\n\t\t\tth {\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tletter-spacing: 0.06em;\n\t\t\t}\n\n\t\t\t.section-label {\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tletter-spacing: 0.06em;\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tmargin: 0 0 var(--roxy-space-xs, 0.25rem) 0;\n\t\t\t}\n\n\t\t\t.glyph {\n\t\t\t\tfont-size: 1.1em;\n\t\t\t\tmargin-right: 2px;\n\t\t\t\tline-height: 1;\n\t\t\t}\n\n\t\t\t.planet-cell {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 4px;\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\n\t\t\t.retro-badge {\n\t\t\t\tdisplay: inline-block;\n\t\t\t\tfont-size: 0.7em;\n\t\t\t\tpadding: 1px 4px;\n\t\t\t\tborder-radius: var(--roxy-radius-sm, 4px);\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-warning, #ea580c) 12%, transparent);\n\t\t\t\tcolor: var(--roxy-warning-fg, #9a3412);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tmargin-left: 2px;\n\t\t\t\tvertical-align: middle;\n\t\t\t}\n\n\t\t\t.speed {\n\t\t\t\tfont-variant-numeric: tabular-nums;\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\n\t\t\t.speed-arrow {\n\t\t\t\tfont-size: 0.85em;\n\t\t\t}\n\n\t\t\ttd.num {\n\t\t\t\tfont-variant-numeric: tabular-nums;\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t}\n\n\t\t\t.overflow-scroll {\n\t\t\t\toverflow-x: auto;\n\t\t\t\t-webkit-overflow-scrolling: touch;\n\t\t\t}\n\n\t\t\t.aspect-card {\n\t\t\t\tborder: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t\tpadding: var(--roxy-space-sm, 0.5rem) var(--roxy-space-md, 1rem);\n\t\t\t\tmargin-bottom: var(--roxy-space-xs, 0.25rem);\n\t\t\t}\n\t\t\t.aspect-card summary {\n\t\t\t\tcursor: pointer;\n\t\t\t\tfont-weight: 500;\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-wrap: wrap;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 0.5em;\n\t\t\t}\n\t\t\t.aspect-card summary .meta {\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tfont-weight: 400;\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tmargin-left: auto;\n\t\t\t\tfont-variant-numeric: tabular-nums;\n\t\t\t}\n\t\t\t.aspect-card .interp-body {\n\t\t\t\tmargin-top: var(--roxy-space-xs, 0.25rem);\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tline-height: 1.45;\n\t\t\t}\n\t\t\t.aspect-card .interp-body p {\n\t\t\t\tmargin: 0 0 var(--roxy-space-xs, 0.25rem);\n\t\t\t}\n\t\t\t.interp-keywords {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-wrap: wrap;\n\t\t\t\tgap: 0.25rem;\n\t\t\t\tmargin-top: 0.5rem;\n\t\t\t}\n\t\t\t.interp-keywords .kw {\n\t\t\t\tpadding: 1px 8px;\n\t\t\t\tborder-radius: 9999px;\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-accent, #f59e0b) 14%, transparent);\n\t\t\t\tcolor: var(--roxy-accent-fg, #b45309);\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t}\n\t\t\t.nature-badge {\n\t\t\t\tdisplay: inline-block;\n\t\t\t\tpadding: 1px 8px;\n\t\t\t\tborder-radius: 9999px;\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tfont-weight: 600;\n\t\t\t}\n\t\t\t.nature-badge.harmonious {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-success, #16a34a) 12%, transparent);\n\t\t\t\tcolor: var(--roxy-success-fg, #166534);\n\t\t\t}\n\t\t\t.nature-badge.challenging {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-danger, #dc2626) 12%, transparent);\n\t\t\t\tcolor: var(--roxy-danger-fg, #991b1b);\n\t\t\t}\n\t\t\t.nature-badge.neutral {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-border, #e4e4e7) 60%, transparent);\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\tdata: TransitsResponse | null = null;\n\n\trender() {\n\t\tif (!this.data?.transitPlanets?.length) {\n\t\t\treturn html`<div class=\"roxy-empty\" role=\"status\">No transits data</div>`;\n\t\t}\n\n\t\tconst {\n\t\t\ttransitDate,\n\t\t\ttransitTime,\n\t\t\ttransitPlanets,\n\t\t\ttransitAspects,\n\t\t\tsummary,\n\t\t} = this.data;\n\n\t\tconst dateStr = [formatDate(transitDate), formatTime(transitTime)]\n\t\t\t.filter(Boolean)\n\t\t\t.join(' ');\n\n\t\treturn html`<div class=\"wrap\" aria-label=\"Transit positions table\">\n\t\t\t<div class=\"head\">\n\t\t\t\t<h2 class=\"title\">Transits</h2>\n\t\t\t\t${dateStr ? html`<p class=\"subtitle\">${dateStr}</p>` : nothing}\n\t\t\t</div>\n\n\t\t\t${summary ? this.renderSummaryPills(summary) : nothing}\n\n\t\t\t<div>\n\t\t\t\t<p class=\"section-label\">Planet positions</p>\n\t\t\t\t<div class=\"overflow-scroll\">\n\t\t\t\t\t${this.renderPlanetsTable(transitPlanets)}\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t${\n\t\t\t\ttransitAspects?.length\n\t\t\t\t\t? html`<div>\n\t\t\t\t\t\t<p class=\"section-label\">Transit aspects</p>\n\t\t\t\t\t\t<div class=\"overflow-scroll\">\n\t\t\t\t\t\t\t${this.renderAspectsList(transitAspects)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t</div>`;\n\t}\n\n\tprivate renderSummaryPills(\n\t\tsummary: NonNullable<TransitsResponse['summary']>,\n\t) {\n\t\treturn html`<div class=\"summary-pills\" role=\"region\" aria-label=\"Aspect summary\">\n\t\t\t<span class=\"pill pill--muted\">\n\t\t\t\tTotal: ${summary.totalAspects}\n\t\t\t</span>\n\t\t\t<span class=\"pill pill--success\">\n\t\t\t\tHarmonious: ${summary.harmonious}\n\t\t\t</span>\n\t\t\t<span class=\"pill pill--danger\">\n\t\t\t\tChallenging: ${summary.challenging}\n\t\t\t</span>\n\t\t\t<span class=\"pill pill--muted\">\n\t\t\t\tNeutral: ${summary.neutral}\n\t\t\t</span>\n\t\t</div>`;\n\t}\n\n\tprivate renderPlanetsTable(planets: TransitsResponse['transitPlanets']) {\n\t\treturn html`<table class=\"planets-table\">\n\t\t\t<thead>\n\t\t\t\t<tr>\n\t\t\t\t\t<th scope=\"col\">Planet</th>\n\t\t\t\t\t<th scope=\"col\">Sign</th>\n\t\t\t\t\t<th scope=\"col\">Degree</th>\n\t\t\t\t\t<th scope=\"col\">Speed</th>\n\t\t\t\t</tr>\n\t\t\t</thead>\n\t\t\t<tbody>\n\t\t\t\t${planets.map((p) => {\n\t\t\t\t\tconst pGlyph = PLANET_GLYPH[capitalize(p.name)] ?? '';\n\t\t\t\t\tconst sGlyph = SIGN_GLYPH[capitalize(p.sign)] ?? '';\n\t\t\t\t\tconst speedArrow = p.speed >= 0 ? '\u2191' : '\u2193';\n\t\t\t\t\treturn html`<tr>\n\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t<div class=\"planet-cell\">\n\t\t\t\t\t\t\t\t<span class=\"glyph\" aria-hidden=\"true\">${pGlyph}</span>\n\t\t\t\t\t\t\t\t${p.name}\n\t\t\t\t\t\t\t\t${\n\t\t\t\t\t\t\t\t\tp.isRetrograde\n\t\t\t\t\t\t\t\t\t\t? html`<span class=\"retro-badge\" aria-label=\"retrograde\">R</span>`\n\t\t\t\t\t\t\t\t\t\t: nothing\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t<div class=\"planet-cell\">\n\t\t\t\t\t\t\t\t<span class=\"glyph\" aria-hidden=\"true\">${sGlyph}</span>\n\t\t\t\t\t\t\t\t${p.sign}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t\t<td class=\"num\">${formatNumber(p.degree, 2)}</td>\n\t\t\t\t\t\t<td class=\"speed\">\n\t\t\t\t\t\t\t<span class=\"speed-arrow\" aria-hidden=\"true\">${speedArrow}</span>\n\t\t\t\t\t\t\t${formatNumber(Math.abs(p.speed), 4)}\n\t\t\t\t\t\t</td>\n\t\t\t\t\t</tr>`;\n\t\t\t\t})}\n\t\t\t</tbody>\n\t\t</table>`;\n\t}\n\n\tprivate renderAspectsList(\n\t\taspects: NonNullable<TransitsResponse['transitAspects']>,\n\t) {\n\t\treturn html`<div role=\"list\" aria-label=\"Transit aspects\">\n\t\t\t${aspects.map((a, idx) => {\n\t\t\t\tconst tGlyph = PLANET_GLYPH[capitalize(a.transitPlanet)] ?? '';\n\t\t\t\tconst nGlyph = PLANET_GLYPH[capitalize(a.natalPlanet)] ?? '';\n\t\t\t\tconst nature = (a.nature ?? 'neutral').toLowerCase();\n\t\t\t\tconst interp = a.interpretation;\n\t\t\t\tconst type = (a.type ?? '').toLowerCase();\n\t\t\t\tconst status = a.isApplying ? 'Applying' : 'Separating';\n\t\t\t\treturn html`<details class=\"aspect-card\" role=\"listitem\" name=\"transit-aspects\" ?open=${idx === 0}>\n\t\t\t\t\t<summary>\n\t\t\t\t\t\t<span aria-hidden=\"true\">${tGlyph}</span>\n\t\t\t\t\t\t${a.transitPlanet}\n\t\t\t\t\t\t<span class=\"nature-badge ${nature}\">${type}</span>\n\t\t\t\t\t\t<span aria-hidden=\"true\">${nGlyph}</span>\n\t\t\t\t\t\t${a.natalPlanet}\n\t\t\t\t\t\t<span class=\"meta\">\n\t\t\t\t\t\t\t${status} \u00B7 orb ${formatNumber(a.orb, 2)}\u00B0 \u00B7 strength ${formatNumber(a.strength, 1)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</summary>\n\t\t\t\t\t<div class=\"interp-body\">\n\t\t\t\t\t\t${interp?.summary ? html`<p>${interp.summary}</p>` : nothing}\n\t\t\t\t\t\t${interp?.impact ? html`<p><strong>Impact:</strong> ${interp.impact}</p>` : nothing}\n\t\t\t\t\t\t${interp?.timing ? html`<p><strong>Timing:</strong> ${interp.timing}</p>` : nothing}\n\t\t\t\t\t\t${interp?.guidance ? html`<p><strong>Guidance:</strong> ${interp.guidance}</p>` : nothing}\n\t\t\t\t\t\t${\n\t\t\t\t\t\t\tinterp?.keywords?.length\n\t\t\t\t\t\t\t\t? html`<div class=\"interp-keywords\">\n\t\t\t\t\t\t\t\t\t\t${interp.keywords.map((k) => html`<span class=\"kw\">${k}</span>`)}\n\t\t\t\t\t\t\t\t\t</div>`\n\t\t\t\t\t\t\t\t: nothing\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t</details>`;\n\t\t\t})}\n\t\t</div>`;\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'roxy-transits-table': RoxyTransitsTable;\n\t}\n}\n", "import { css, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { RASHI_KEYS } from '../tokens/index.js';\nimport type { BirthChartResponse } from '../types/index.js';\nimport { baseStyles } from '../utils/base-styles.js';\nimport type { HouseDef } from '../utils/kundli-render.js';\nimport {\n\tRASHI_TO_SIGN,\n\trenderNorthFrame,\n\trenderNorthHouseGroup,\n\trenderSouthFrame,\n\trenderSouthHouseGroup,\n} from '../utils/kundli-render.js';\n\ntype RashiBucket = BirthChartResponse['aries'];\n\n// The /vedic-astrology/birth-chart response carries all 12 rashi keys\n// (aries, taurus, ..., pisces), each shaped like the spec-typed `aries`\n// bucket. This local alias indexes by rashi name without per-call casts.\ntype BirthChartByRashi = BirthChartResponse & Record<string, RashiBucket>;\n\n/**\n * Vedic kundli (D1 Rashi chart). South Indian style by default. Pass `data`\n * from /vedic-astrology/birth-chart. North Indian style via chartStyle=\"north\".\n *\n * Theming flows through CSS custom properties on :host, so the chart adopts\n * the host page palette without runtime color probing.\n */\n@customElement('roxy-vedic-kundli')\nexport class RoxyVedicKundli extends LitElement {\n\tstatic styles = [\n\t\tbaseStyles,\n\t\tcss`\n\t\t\t.wrap {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\t\t\t.title {\n\t\t\t\tfont-size: var(--roxy-text-lg, 1.125rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tmargin: 0;\n\t\t\t}\n\t\t\tsvg {\n\t\t\t\tdisplay: block;\n\t\t\t\twidth: 100%;\n\t\t\t\tmax-width: 360px;\n\t\t\t\tmargin: 0 auto;\n\t\t\t}\n\t\t\t.line {\n\t\t\t\tfill: transparent;\n\t\t\t\tstroke: var(--roxy-border, #e4e4e7);\n\t\t\t}\n\t\t\t.sign-text {\n\t\t\t\tfill: var(--roxy-muted, #71717a);\n\t\t\t\tfont-size: 9px;\n\t\t\t\tfont-weight: 500;\n\t\t\t\tfont-family: var(--roxy-font-sans);\n\t\t\t}\n\t\t\t.planet-text {\n\t\t\t\tfill: var(--roxy-fg, #0a0a0a);\n\t\t\t\tfont-size: 11px;\n\t\t\t\tfont-weight: 600;\n\t\t\t\tfont-family: var(--roxy-font-sans);\n\t\t\t}\n\t\t\t.house-num {\n\t\t\t\tfill: var(--roxy-muted, #71717a);\n\t\t\t\tfont-size: 9px;\n\t\t\t\tfont-weight: 400;\n\t\t\t\tfont-family: var(--roxy-font-sans);\n\t\t\t}\n\t\t\t.lagna-marker {\n\t\t\t\tfill: var(--roxy-accent-fg, #b45309);\n\t\t\t\tfont-size: 8px;\n\t\t\t\tfont-weight: 700;\n\t\t\t\tfont-family: var(--roxy-font-sans);\n\t\t\t\tletter-spacing: 0.05em;\n\t\t\t}\n\t\t\t.lagna-bg {\n\t\t\t\tfill: color-mix(in srgb, var(--roxy-accent, #f59e0b) 12%, transparent);\n\t\t\t\tstroke: color-mix(in srgb, var(--roxy-accent, #f59e0b) 45%, transparent);\n\t\t\t\tstroke-width: 0.8;\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\tdata: BirthChartResponse | null = null;\n\n\t@property({ type: String, reflect: true, attribute: 'chart-style' })\n\tchartStyle: 'south' | 'north' = 'south';\n\n\tprivate buildHouses(): HouseDef[] {\n\t\tif (!this.data) return [];\n\t\tconst data = this.data as BirthChartByRashi;\n\t\tconst lagnaSign = this.data?.meta?.Lagna?.rashi ?? '';\n\t\tconst houses: HouseDef[] = [];\n\t\tfor (let i = 0; i < 12; i++) {\n\t\t\tconst key = RASHI_KEYS[i];\n\t\t\tconst bucket = data[key];\n\t\t\tconst planets = (bucket?.signs ?? []).map((p) => p.graha).filter(Boolean);\n\t\t\tconst sign = RASHI_TO_SIGN[key] ?? '';\n\t\t\thouses.push({\n\t\t\t\tnumber: i + 1,\n\t\t\t\tsign,\n\t\t\t\tplanets,\n\t\t\t\tisLagna: lagnaSign\n\t\t\t\t\t? lagnaSign.toLowerCase() === sign.toLowerCase()\n\t\t\t\t\t: false,\n\t\t\t});\n\t\t}\n\t\treturn houses;\n\t}\n\n\trender() {\n\t\tif (!this.data)\n\t\t\treturn html`<div class=\"roxy-empty\" role=\"status\">No kundli data</div>`;\n\t\tconst houses = this.buildHouses();\n\t\tconst isNorth = this.chartStyle === 'north';\n\n\t\treturn html`<div class=\"wrap\">\n\t\t\t<h2 class=\"title\">Vedic kundli</h2>\n\t\t\t<svg\n\t\t\t\tviewBox=\"0 0 300 300\"\n\t\t\t\trole=\"img\"\n\t\t\t\taria-label=\"Vedic birth chart with twelve sign houses\"\n\t\t\t>\n\t\t\t\t<title>Vedic kundli</title>\n\t\t\t\t${isNorth ? renderNorthFrame() : renderSouthFrame()}\n\t\t\t\t${\n\t\t\t\t\tisNorth\n\t\t\t\t\t\t? houses.map((h) => renderNorthHouseGroup(h))\n\t\t\t\t\t\t: houses.map((h) => renderSouthHouseGroup(h))\n\t\t\t\t}\n\t\t\t</svg>\n\t\t</div>`;\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'roxy-vedic-kundli': RoxyVedicKundli;\n\t}\n}\n", "import { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport type { GetYogaResponse, ListYogasResponse } from '../types/index.js';\nimport { baseStyles } from '../utils/base-styles.js';\n\ntype YogaListData =\n\t| ListYogasResponse\n\t| GetYogaResponse\n\t| { yogas: Array<GetYogaResponse> };\n\n/**\n * Yoga catalog and detail renderer. Accepts three data modes:\n *   - Catalog: ListYogasResponse (yogas array of {id, name} + total)\n *   - Detail: GetYogaResponse (single yoga with description, result, quality)\n *   - Detail array: { yogas: Array<GetYogaResponse> } for pre-filtered sets\n *\n * Catalog and detail-array modes include a live search filter.\n */\n@customElement('roxy-yoga-list')\nexport class RoxyYogaList extends LitElement {\n\tstatic styles = [\n\t\tbaseStyles,\n\t\tcss`\n\t\t\t.wrap {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\t\t\t.head {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\talign-items: baseline;\n\t\t\t\tflex-wrap: wrap;\n\t\t\t\tgap: var(--roxy-space-sm, 0.5rem);\n\t\t\t}\n\t\t\t.title {\n\t\t\t\tfont-size: var(--roxy-text-lg, 1.125rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tmargin: 0;\n\t\t\t}\n\t\t\t.count {\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t}\n\t\t\t.search-wrap {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: var(--roxy-space-sm, 0.5rem);\n\t\t\t}\n\t\t\t.search {\n\t\t\t\twidth: 100%;\n\t\t\t\tmax-width: 280px;\n\t\t\t\tpadding: 0.35em 0.75em;\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tfont-family: var(--roxy-font-sans);\n\t\t\t\tborder: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t\tbackground: var(--roxy-bg, #fff);\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t\toutline: none;\n\t\t\t}\n\t\t\t.search::placeholder {\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t\topacity: 0.65;\n\t\t\t}\n\t\t\t.search:focus {\n\t\t\t\tborder-color: var(--roxy-accent, #f59e0b);\n\t\t\t\tbox-shadow: 0 0 0 2px color-mix(in srgb, var(--roxy-accent, #f59e0b) 30%, transparent);\n\t\t\t}\n\t\t\t.grid {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: var(--roxy-space-sm, 0.5rem);\n\t\t\t\tgrid-template-columns: repeat(auto-fill, minmax(180px, 1fr));\n\t\t\t}\n\t\t\t.yoga-chip {\n\t\t\t\tpadding: 0.4em 0.8em;\n\t\t\t\tborder: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tbackground: var(--roxy-bg, #fff);\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t\tword-break: break-word;\n\t\t\t}\n\t\t\t.yoga-chip .yoga-id {\n\t\t\t\tdisplay: block;\n\t\t\t\tfont-size: 0.7em;\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t\topacity: 0.75;\n\t\t\t\tmargin-top: 0.15em;\n\t\t\t}\n\t\t\t.detail-card {\n\t\t\t\tborder: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t\tpadding: var(--roxy-space-md, 1rem);\n\t\t\t\tbackground: var(--roxy-bg, #fff);\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: var(--roxy-space-sm, 0.5rem);\n\t\t\t}\n\t\t\t.detail-name {\n\t\t\t\tfont-size: var(--roxy-text-lg, 1.125rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tmargin: 0;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: var(--roxy-space-sm, 0.5rem);\n\t\t\t\tflex-wrap: wrap;\n\t\t\t}\n\t\t\t.quality-chip {\n\t\t\t\tdisplay: inline-block;\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tfont-weight: 600;\n\t\t\t\tpadding: 0.15em 0.6em;\n\t\t\t\tborder-radius: 999px;\n\t\t\t}\n\t\t\t.quality-Positive {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-success, #22c55e) 18%, transparent);\n\t\t\t\tcolor: var(--roxy-success-fg, #15803d);\n\t\t\t\tborder: 1px solid color-mix(in srgb, var(--roxy-success, #22c55e) 40%, transparent);\n\t\t\t}\n\t\t\t.quality-Negative {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-danger, #ef4444) 18%, transparent);\n\t\t\t\tcolor: var(--roxy-danger-fg, #b91c1c);\n\t\t\t\tborder: 1px solid color-mix(in srgb, var(--roxy-danger, #ef4444) 40%, transparent);\n\t\t\t}\n\t\t\t.quality-Both {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-warning, #f59e0b) 18%, transparent);\n\t\t\t\tcolor: var(--roxy-warning-fg, #b45309);\n\t\t\t\tborder: 1px solid color-mix(in srgb, var(--roxy-warning, #f59e0b) 40%, transparent);\n\t\t\t}\n\t\t\t.description {\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tmargin: 0;\n\t\t\t\tline-height: var(--roxy-leading-normal, 1.5);\n\t\t\t}\n\t\t\tdetails {\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t}\n\t\t\tdetails summary {\n\t\t\t\tcursor: pointer;\n\t\t\t\tcolor: var(--roxy-accent-fg, #b45309);\n\t\t\t\tfont-weight: 500;\n\t\t\t\tpadding: 0.25em 0;\n\t\t\t\tlist-style: none;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 0.4em;\n\t\t\t}\n\t\t\tdetails summary::before {\n\t\t\t\tcontent: '+';\n\t\t\t\tfont-size: 1.1em;\n\t\t\t\tline-height: 1;\n\t\t\t}\n\t\t\tdetails[open] summary::before {\n\t\t\t\tcontent: '-';\n\t\t\t}\n\t\t\tdetails .result-body {\n\t\t\t\tpadding-top: var(--roxy-space-xs, 0.25rem);\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t\tline-height: var(--roxy-leading-normal, 1.5);\n\t\t\t}\n\t\t\t.no-results {\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tpadding: var(--roxy-space-md, 1rem) 0;\n\t\t\t\ttext-align: center;\n\t\t\t}\n\t\t\t.detail-grid {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: var(--roxy-space-sm, 0.5rem);\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\tdata: YogaListData | null = null;\n\n\t@state()\n\tprivate filter = '';\n\n\tprivate readonly handleInput = (e: Event) => {\n\t\tthis.filter = (e.target as HTMLInputElement).value;\n\t};\n\n\tprivate renderQualityChip(quality: string) {\n\t\tconst cls = `quality-chip quality-${quality}`;\n\t\treturn html`<span class=${cls}>${quality}</span>`;\n\t}\n\n\tprivate renderDetailCard(yoga: GetYogaResponse) {\n\t\treturn html`<div class=\"detail-card\">\n\t\t\t<p class=\"detail-name\">\n\t\t\t\t${yoga.name}\n\t\t\t\t${yoga.quality ? this.renderQualityChip(yoga.quality) : nothing}\n\t\t\t</p>\n\t\t\t${\n\t\t\t\tyoga.description\n\t\t\t\t\t? html`<p class=\"description\">${yoga.description}</p>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t\t${\n\t\t\t\tyoga.result\n\t\t\t\t\t? html`<details>\n\t\t\t\t\t\t<summary>Effects</summary>\n\t\t\t\t\t\t<div class=\"result-body\">${yoga.result}</div>\n\t\t\t\t\t</details>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t</div>`;\n\t}\n\n\trender() {\n\t\tif (!this.data)\n\t\t\treturn html`<div class=\"roxy-empty\" role=\"status\">No yoga data</div>`;\n\n\t\tconst d = this.data;\n\t\tconst lc = this.filter.toLowerCase();\n\n\t\t// Detail mode: single GetYogaResponse\n\t\tif (\n\t\t\t'description' in d &&\n\t\t\ttypeof (d as GetYogaResponse).description === 'string'\n\t\t) {\n\t\t\tconst yoga = d as GetYogaResponse;\n\t\t\treturn html`<div class=\"wrap\">${this.renderDetailCard(yoga)}</div>`;\n\t\t}\n\n\t\t// Detail-array mode: { yogas: Array<GetYogaResponse> } where items have description\n\t\tif ('yogas' in d && Array.isArray((d as { yogas: unknown[] }).yogas)) {\n\t\t\tconst allYogas = (\n\t\t\t\td as { yogas: Array<GetYogaResponse | { id: string; name: string }> }\n\t\t\t).yogas;\n\t\t\tconst isDetailArray = allYogas.length > 0 && 'description' in allYogas[0];\n\n\t\t\tif (isDetailArray) {\n\t\t\t\tconst detailYogas = allYogas as GetYogaResponse[];\n\t\t\t\tconst filtered = lc\n\t\t\t\t\t? detailYogas.filter((y) => y.name.toLowerCase().includes(lc))\n\t\t\t\t\t: detailYogas;\n\t\t\t\tconst total = (d as ListYogasResponse).total;\n\t\t\t\treturn html`<div class=\"wrap\">\n\t\t\t\t\t<div class=\"head\">\n\t\t\t\t\t\t<h2 class=\"title\">Yoga catalog</h2>\n\t\t\t\t\t\t${\n\t\t\t\t\t\t\ttotal !== undefined\n\t\t\t\t\t\t\t\t? html`<span class=\"count\">${total} total</span>`\n\t\t\t\t\t\t\t\t: nothing\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"search-wrap\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tclass=\"search\"\n\t\t\t\t\t\t\ttype=\"search\"\n\t\t\t\t\t\t\tplaceholder=\"Filter yogas...\"\n\t\t\t\t\t\t\taria-label=\"Filter yoga list by name\"\n\t\t\t\t\t\t\t.value=${this.filter}\n\t\t\t\t\t\t\t@input=${this.handleInput}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclass=\"detail-grid\"\n\t\t\t\t\t\trole=\"region\"\n\t\t\t\t\t\taria-live=\"polite\"\n\t\t\t\t\t\taria-label=\"Yoga results\"\n\t\t\t\t\t>\n\t\t\t\t\t\t${\n\t\t\t\t\t\t\tfiltered.length > 0\n\t\t\t\t\t\t\t\t? filtered.map((y) => this.renderDetailCard(y))\n\t\t\t\t\t\t\t\t: html`<p class=\"no-results\">No yogas match your search.</p>`\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t</div>`;\n\t\t\t}\n\n\t\t\t// Catalog mode: ListYogasResponse with {id, name} items\n\t\t\tconst catalogYogas = allYogas as Array<{ id: string; name: string }>;\n\t\t\tconst filtered = lc\n\t\t\t\t? catalogYogas.filter((y) => y.name.toLowerCase().includes(lc))\n\t\t\t\t: catalogYogas;\n\t\t\tconst total = (d as ListYogasResponse).total;\n\t\t\treturn html`<div class=\"wrap\">\n\t\t\t\t<div class=\"head\">\n\t\t\t\t\t<h2 class=\"title\">Yoga catalog</h2>\n\t\t\t\t\t${\n\t\t\t\t\t\ttotal !== undefined\n\t\t\t\t\t\t\t? html`<span class=\"count\">${total} total</span>`\n\t\t\t\t\t\t\t: nothing\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"search-wrap\">\n\t\t\t\t\t<input\n\t\t\t\t\t\tclass=\"search\"\n\t\t\t\t\t\ttype=\"search\"\n\t\t\t\t\t\tplaceholder=\"Filter yogas...\"\n\t\t\t\t\t\taria-label=\"Filter yoga list by name\"\n\t\t\t\t\t\t.value=${this.filter}\n\t\t\t\t\t\t@input=${this.handleInput}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div\n\t\t\t\t\tclass=\"grid\"\n\t\t\t\t\trole=\"region\"\n\t\t\t\t\taria-live=\"polite\"\n\t\t\t\t\taria-label=\"Yoga results\"\n\t\t\t\t>\n\t\t\t\t\t${\n\t\t\t\t\t\tfiltered.length > 0\n\t\t\t\t\t\t\t? filtered.map(\n\t\t\t\t\t\t\t\t\t(y) => html`<div class=\"yoga-chip\">\n\t\t\t\t\t\t\t\t\t${y.name}\n\t\t\t\t\t\t\t\t\t<span class=\"yoga-id\">${y.id}</span>\n\t\t\t\t\t\t\t\t</div>`,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: html`<p class=\"no-results\">No yogas match your search.</p>`\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t</div>`;\n\t\t}\n\n\t\treturn html`<div class=\"roxy-empty\" role=\"status\">No yoga data</div>`;\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'roxy-yoga-list': RoxyYogaList;\n\t}\n}\n", "/**\n * Single source of truth for component metadata. Every consumer that needs\n * the (tag, pascal, slug, description, heading) tuple reads from here:\n * scripts/build-react.ts, scripts/build-registry.ts, scripts/sync-docs.ts,\n * scripts/build-widgets.ts, and the browser-side apps/docs/manifest.js\n * (mirrored at build time).\n *\n * Hand-maintained. Add a component \u2192 add one entry here. The OpenAPI spec\n * does not yet carry component metadata, so this stays manual.\n */\n\nexport interface RoxyComponent {\n\t/** Pascal-case React export name, e.g. RoxyNatalChart */\n\tpascal: string;\n\t/** Custom-element tag, e.g. roxy-natal-chart */\n\ttag: string;\n\t/** Slug used in registry filenames and shadcn paths, e.g. natal-chart */\n\tslug: string;\n\t/** Short human-readable heading shown on demo cards. */\n\theading: string;\n\t/** One-line description for registry / docs / SEO meta. */\n\tdescription: string;\n\t/** Domain column label in the synced README/AGENTS table. */\n\tdocsLabel: string;\n\t/** Endpoint(s) column body in the synced README/AGENTS table. */\n\tendpointLabel: string;\n\t/** What-it-renders column body in the synced README/AGENTS table. */\n\tdocsSummary: string;\n\t/** Filter category in the browser demo grid. */\n\ttopic: string;\n\t/**\n\t * True when the component does not consume a typed RoxyAPI response from a\n\t * customer server route. Three cases today:\n\t *   - <roxy-data>: pure renderer, accepts any shape, no fetch.\n\t *   - <roxy-location-search>: calls /location/search itself via publishable key.\n\t *   - <roxy-endpoint-form>: introspects the OpenAPI spec, emits roxy-submit.\n\t * The shadcn registry codegen emits a different doc body for these so we\n\t * never document a server route example with an undefined `data` reference.\n\t */\n\tselfFetching?: boolean;\n}\n\nexport const ROXY_COMPONENTS: readonly RoxyComponent[] = [\n\t{\n\t\tpascal: 'RoxyNatalChart',\n\t\ttag: 'roxy-natal-chart',\n\t\tslug: 'natal-chart',\n\t\theading: 'Natal chart',\n\t\tdescription:\n\t\t\t'Western natal chart wheel for /astrology/natal-chart responses',\n\t\tdocsLabel: 'Western',\n\t\tendpointLabel: 'POST /astrology/natal-chart',\n\t\tdocsSummary: 'Natal chart wheel with planet glyphs and aspect lines',\n\t\ttopic: 'Astrology',\n\t},\n\t{\n\t\tpascal: 'RoxyHoroscopeCard',\n\t\ttag: 'roxy-horoscope-card',\n\t\tslug: 'horoscope-card',\n\t\theading: 'Daily horoscope',\n\t\tdescription:\n\t\t\t'Daily, weekly, or monthly horoscope card for /astrology/horoscope/...',\n\t\tdocsLabel: 'Western',\n\t\tendpointLabel: 'GET /astrology/horoscope/{sign}/{daily,weekly,monthly}',\n\t\tdocsSummary: 'Daily, weekly, or monthly horoscope card',\n\t\ttopic: 'Astrology',\n\t},\n\t{\n\t\tpascal: 'RoxySynastryChart',\n\t\ttag: 'roxy-synastry-chart',\n\t\tslug: 'synastry-chart',\n\t\theading: 'Synastry',\n\t\tdescription: 'Dual-wheel synastry chart with inter-aspects table',\n\t\tdocsLabel: 'Western',\n\t\tendpointLabel: 'POST /astrology/synastry',\n\t\tdocsSummary: 'Dual-wheel synastry with inter-aspects table',\n\t\ttopic: 'Astrology',\n\t},\n\t{\n\t\tpascal: 'RoxyCompatibilityCard',\n\t\ttag: 'roxy-compatibility-card',\n\t\tslug: 'compatibility-card',\n\t\theading: 'Compatibility score',\n\t\tdescription: 'Cross-domain compatibility score card',\n\t\tdocsLabel: 'Cross',\n\t\tendpointLabel:\n\t\t\t'POST /astrology/compatibility-score, /numerology/compatibility, /biorhythm/compatibility',\n\t\tdocsSummary: 'Score card with category breakdown',\n\t\ttopic: 'Astrology',\n\t},\n\t{\n\t\tpascal: 'RoxyMoonPhase',\n\t\ttag: 'roxy-moon-phase',\n\t\tslug: 'moon-phase',\n\t\theading: 'Moon phase',\n\t\tdescription: 'Moon phase card and calendar',\n\t\tdocsLabel: 'Western',\n\t\tendpointLabel: 'GET /astrology/moon-phase/{current,upcoming,calendar/...}',\n\t\tdocsSummary: 'Moon phase card and calendar',\n\t\ttopic: 'Astrology',\n\t},\n\t{\n\t\tpascal: 'RoxyVedicKundli',\n\t\ttag: 'roxy-vedic-kundli',\n\t\tslug: 'vedic-kundli',\n\t\theading: 'Vedic kundli',\n\t\tdescription:\n\t\t\t'South or North Indian Vedic kundli for /vedic-astrology/birth-chart',\n\t\tdocsLabel: 'Vedic',\n\t\tendpointLabel: 'POST /vedic-astrology/birth-chart',\n\t\tdocsSummary: 'South or North Indian kundli',\n\t\ttopic: 'Vedic',\n\t},\n\t{\n\t\tpascal: 'RoxyPanchangTable',\n\t\ttag: 'roxy-panchang-table',\n\t\tslug: 'panchang-table',\n\t\theading: 'Panchang',\n\t\tdescription:\n\t\t\t'Panchang muhurta table with auspicious and inauspicious periods',\n\t\tdocsLabel: 'Vedic',\n\t\tendpointLabel: 'POST /vedic-astrology/panchang/{basic,detailed}',\n\t\tdocsSummary: '15+ muhurtas in detailed mode',\n\t\ttopic: 'Vedic',\n\t},\n\t{\n\t\tpascal: 'RoxyDashaTimeline',\n\t\ttag: 'roxy-dasha-timeline',\n\t\tslug: 'dasha-timeline',\n\t\theading: 'Vimshottari dasha',\n\t\tdescription: 'Vimshottari dasha timeline with active mahadasha highlighted',\n\t\tdocsLabel: 'Vedic',\n\t\tendpointLabel: 'POST /vedic-astrology/dasha/{current,major,sub/...}',\n\t\tdocsSummary: 'Vimshottari mahadasha + antardasha + pratyantardasha',\n\t\ttopic: 'Vedic',\n\t},\n\t{\n\t\tpascal: 'RoxyDoshaCard',\n\t\ttag: 'roxy-dosha-card',\n\t\tslug: 'dosha-card',\n\t\theading: 'Manglik dosha',\n\t\tdescription: 'Manglik, Kaal Sarp, or Sade Sati presence card',\n\t\tdocsLabel: 'Vedic',\n\t\tendpointLabel: 'POST /vedic-astrology/dosha/{manglik,kalsarpa,sadhesati}',\n\t\tdocsSummary: 'Presence, severity, remedies, scoped effects',\n\t\ttopic: 'Vedic',\n\t},\n\t{\n\t\tpascal: 'RoxyGunaMilan',\n\t\ttag: 'roxy-guna-milan',\n\t\tslug: 'guna-milan',\n\t\theading: 'Guna milan',\n\t\tdescription: '36-point Ashtakoota matrimonial compatibility breakdown',\n\t\tdocsLabel: 'Vedic',\n\t\tendpointLabel: 'POST /vedic-astrology/compatibility',\n\t\tdocsSummary: '36-point Ashtakoota with eight sub-scores',\n\t\ttopic: 'Vedic',\n\t},\n\t{\n\t\tpascal: 'RoxyKpPlanetsTable',\n\t\ttag: 'roxy-kp-planets-table',\n\t\tslug: 'kp-planets-table',\n\t\theading: 'KP planets',\n\t\tdescription: 'KP planets table with sub-lord and sub-sub-lord columns',\n\t\tdocsLabel: 'Vedic (KP)',\n\t\tendpointLabel: 'POST /vedic-astrology/kp/planets',\n\t\tdocsSummary: 'Sub-lord and sub-sub-lord columns',\n\t\ttopic: 'Vedic',\n\t},\n\t{\n\t\tpascal: 'RoxyTransitsTable',\n\t\ttag: 'roxy-transits-table',\n\t\tslug: 'transits-table',\n\t\theading: 'Transits',\n\t\tdescription: 'Live planet positions plus aspects to a natal chart',\n\t\tdocsLabel: 'Western',\n\t\tendpointLabel: 'POST /astrology/transits',\n\t\tdocsSummary:\n\t\t\t'Transit planet positions plus optional aspects to a natal chart',\n\t\ttopic: 'Astrology',\n\t},\n\t{\n\t\tpascal: 'RoxyDivisionalChart',\n\t\ttag: 'roxy-divisional-chart',\n\t\tslug: 'divisional-chart',\n\t\theading: 'Divisional chart',\n\t\tdescription: 'D2 to D60 varga chart wheel with Vargottama markers',\n\t\tdocsLabel: 'Vedic',\n\t\tendpointLabel: 'POST /vedic-astrology/divisional-chart',\n\t\tdocsSummary:\n\t\t\t'Generic divisional varga wheel from D2 Hora to D60 Shashtiamsa',\n\t\ttopic: 'Vedic',\n\t},\n\t{\n\t\tpascal: 'RoxyAshtakavargaGrid',\n\t\ttag: 'roxy-ashtakavarga-grid',\n\t\tslug: 'ashtakavarga-grid',\n\t\theading: 'Ashtakavarga',\n\t\tdescription: 'Sarva and Bhinna ashtakavarga heatmap with bindu scores',\n\t\tdocsLabel: 'Vedic',\n\t\tendpointLabel: 'POST /vedic-astrology/ashtakavarga',\n\t\tdocsSummary: 'Sarva, Bhinna, and Shodhya Pinda views in a tabbed heatmap',\n\t\ttopic: 'Vedic',\n\t},\n\t{\n\t\tpascal: 'RoxyShadbalaTable',\n\t\ttag: 'roxy-shadbala-table',\n\t\tslug: 'shadbala-table',\n\t\theading: 'Shadbala',\n\t\tdescription: 'Six-fold planetary strength with adequacy badge per planet',\n\t\tdocsLabel: 'Vedic',\n\t\tendpointLabel: 'POST /vedic-astrology/shadbala',\n\t\tdocsSummary:\n\t\t\t'Six-fold planetary strength bar plus rupas and adequacy badge',\n\t\ttopic: 'Vedic',\n\t},\n\t{\n\t\tpascal: 'RoxyYogaList',\n\t\ttag: 'roxy-yoga-list',\n\t\tslug: 'yoga-list',\n\t\theading: 'Yoga catalog',\n\t\tdescription:\n\t\t\t'Yoga reference cards from the catalog with optional detail mode',\n\t\tdocsLabel: 'Vedic',\n\t\tendpointLabel: 'GET /vedic-astrology/yoga, /yoga/{id}',\n\t\tdocsSummary: 'Filterable yoga cards from the 300 plus yoga catalog',\n\t\ttopic: 'Vedic',\n\t},\n\t{\n\t\tpascal: 'RoxyChoghadiyaGrid',\n\t\ttag: 'roxy-choghadiya-grid',\n\t\tslug: 'choghadiya-grid',\n\t\theading: 'Choghadiya',\n\t\tdescription: 'Day and night Choghadiya muhurta tiles for activity timing',\n\t\tdocsLabel: 'Vedic',\n\t\tendpointLabel: 'POST /vedic-astrology/panchang/choghadiya',\n\t\tdocsSummary: 'Day and night Choghadiya muhurta tiles colored by effect',\n\t\ttopic: 'Vedic',\n\t},\n\t{\n\t\tpascal: 'RoxyNumerologyCard',\n\t\ttag: 'roxy-numerology-card',\n\t\tslug: 'numerology-card',\n\t\theading: 'Life path number',\n\t\tdescription:\n\t\t\t'Numerology card for life path, expression, personal year, or full chart',\n\t\tdocsLabel: 'Numerology',\n\t\tendpointLabel:\n\t\t\t'POST /numerology/{life-path,expression,personal-year,chart}',\n\t\tdocsSummary: 'Life path, expression, personal year, full chart',\n\t\ttopic: 'Numerology',\n\t},\n\t{\n\t\tpascal: 'RoxyTarotCard',\n\t\ttag: 'roxy-tarot-card',\n\t\tslug: 'tarot-card',\n\t\theading: 'Daily tarot card',\n\t\tdescription: 'Single tarot card with upright/reversed flip animation',\n\t\tdocsLabel: 'Tarot',\n\t\tendpointLabel: 'GET /tarot/cards/{id}, POST /tarot/daily',\n\t\tdocsSummary: 'Single card with upright and reversed flip',\n\t\ttopic: 'Tarot',\n\t},\n\t{\n\t\tpascal: 'RoxyTarotSpread',\n\t\ttag: 'roxy-tarot-spread',\n\t\tslug: 'tarot-spread',\n\t\theading: 'Three-card spread',\n\t\tdescription:\n\t\t\t'Tarot spread renderer for three-card, Celtic Cross, love, or yes/no',\n\t\tdocsLabel: 'Tarot',\n\t\tendpointLabel:\n\t\t\t'POST /tarot/spreads/{three-card,celtic-cross,love}, /tarot/yes-no, /tarot/draw',\n\t\tdocsSummary: 'Spreads with positions and reading',\n\t\ttopic: 'Tarot',\n\t},\n\t{\n\t\tpascal: 'RoxyBiorhythmChart',\n\t\ttag: 'roxy-biorhythm-chart',\n\t\tslug: 'biorhythm-chart',\n\t\theading: 'Daily biorhythm',\n\t\tdescription: 'Daily biorhythm bars or multi-day forecast cycle lines',\n\t\tdocsLabel: 'Biorhythm',\n\t\tendpointLabel: 'POST /biorhythm/{daily,forecast,critical-days}',\n\t\tdocsSummary: 'Daily bars, forecast cycle lines, critical days',\n\t\ttopic: 'Biorhythm',\n\t},\n\t{\n\t\tpascal: 'RoxyHexagram',\n\t\ttag: 'roxy-hexagram',\n\t\tslug: 'hexagram',\n\t\theading: 'I Ching hexagram',\n\t\tdescription:\n\t\t\t'I Ching hexagram with trigram glyphs, judgment, image, and changing lines',\n\t\tdocsLabel: 'I Ching',\n\t\tendpointLabel:\n\t\t\t'GET /iching/hexagrams/{number}, /iching/cast, POST /iching/daily, /iching/daily/cast',\n\t\tdocsSummary: 'Hexagram with trigrams, judgment, image, changing lines',\n\t\ttopic: 'I Ching',\n\t},\n\t{\n\t\tpascal: 'RoxyEndpointForm',\n\t\ttag: 'roxy-endpoint-form',\n\t\tslug: 'endpoint-form',\n\t\theading: 'Schema-driven form',\n\t\tdescription:\n\t\t\t'Schema-driven form that emits roxy-submit with a validated payload',\n\t\tdocsLabel: 'Helper',\n\t\tendpointLabel: 'Any endpoint via x-roxy-ui hints',\n\t\tdocsSummary: 'Schema-driven form, emits roxy-submit',\n\t\ttopic: 'Helpers',\n\t\tselfFetching: true,\n\t},\n\t{\n\t\tpascal: 'RoxyLocationSearch',\n\t\ttag: 'roxy-location-search',\n\t\tslug: 'location-search',\n\t\theading: 'City search',\n\t\tdescription: 'City search input with debounced /location/search calls',\n\t\tdocsLabel: 'Helper',\n\t\tendpointLabel: 'GET /location/search',\n\t\tdocsSummary: 'Debounced city search input, emits roxy-location-select',\n\t\ttopic: 'Helpers',\n\t\tselfFetching: true,\n\t},\n\t{\n\t\tpascal: 'RoxyData',\n\t\ttag: 'roxy-data',\n\t\tslug: 'data',\n\t\theading: 'Generic renderer',\n\t\tdescription: 'Generic fallback renderer for any OpenAPI response shape',\n\t\tdocsLabel: 'Helper',\n\t\tendpointLabel: 'Any response shape',\n\t\tdocsSummary: 'Generic fallback renderer for unknown shapes',\n\t\ttopic: 'Helpers',\n\t\tselfFetching: true,\n\t},\n];\n\nexport type RoxyComponentSlug = (typeof ROXY_COMPONENTS)[number]['slug'];\n", "// Generated by scripts/sync-version.ts. Do not edit.\nexport const ROXY_UI_VERSION = '0.2.3';\n"],
  "mappings": "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",
  "names": ["import_lit", "import_lit", "import_decorators", "import_lit", "import_decorators", "import_lit", "import_decorators", "import_lit", "import_decorators", "import_lit", "import_decorators", "import_lit", "import_decorators", "import_lit", "import_lit", "import_decorators", "import_lit", "import_decorators", "import_lit", "import_decorators", "score", "pct", "import_lit", "import_decorators", "import_lit", "import_decorators", "import_lit", "import_decorators", "import_lit", "import_decorators", "import_lit", "import_decorators", "import_lit", "import_decorators", "import_lit", "import_decorators", "import_lit", "import_decorators", "import_lit", "import_decorators", "import_lit", "import_decorators", "SIZE", "CENTER", "OUTER_R", "SIGN_R", "import_lit", "import_decorators", "import_lit", "import_decorators", "import_lit", "import_decorators", "import_lit", "import_decorators", "import_lit", "import_decorators", "filtered", "total"]
}
