@roxyapi/ui 0.9.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +53 -27
- package/README.md +42 -12
- package/components-catalog.json +1022 -0
- package/dist/cdn/components/angel-number-card.js +52 -0
- package/dist/cdn/components/angel-number-card.js.map +7 -0
- package/dist/cdn/components/angel-number-lookup.js +52 -0
- package/dist/cdn/components/angel-number-lookup.js.map +7 -0
- package/dist/cdn/components/ashtakavarga-grid.js +10 -3
- package/dist/cdn/components/ashtakavarga-grid.js.map +4 -4
- package/dist/cdn/components/aspects-table.js +52 -0
- package/dist/cdn/components/aspects-table.js.map +7 -0
- package/dist/cdn/components/biorhythm-chart.js +10 -3
- package/dist/cdn/components/biorhythm-chart.js.map +4 -4
- package/dist/cdn/components/bodygraph.js +17 -10
- package/dist/cdn/components/bodygraph.js.map +4 -4
- package/dist/cdn/components/choghadiya-grid.js +10 -3
- package/dist/cdn/components/choghadiya-grid.js.map +4 -4
- package/dist/cdn/components/compatibility-card.js +10 -3
- package/dist/cdn/components/compatibility-card.js.map +4 -4
- package/dist/cdn/components/crystal-card.js +52 -0
- package/dist/cdn/components/crystal-card.js.map +7 -0
- package/dist/cdn/components/crystal-grid.js +52 -0
- package/dist/cdn/components/crystal-grid.js.map +7 -0
- package/dist/cdn/components/dasha-timeline.js +10 -3
- package/dist/cdn/components/dasha-timeline.js.map +4 -4
- package/dist/cdn/components/data.js +10 -3
- package/dist/cdn/components/data.js.map +4 -4
- package/dist/cdn/components/divisional-chart.js +31 -24
- package/dist/cdn/components/divisional-chart.js.map +4 -4
- package/dist/cdn/components/dosha-card.js +10 -3
- package/dist/cdn/components/dosha-card.js.map +4 -4
- package/dist/cdn/components/dream-card.js +52 -0
- package/dist/cdn/components/dream-card.js.map +7 -0
- package/dist/cdn/components/dream-search.js +52 -0
- package/dist/cdn/components/dream-search.js.map +7 -0
- package/dist/cdn/components/endpoint-form.js +3 -3
- package/dist/cdn/components/endpoint-form.js.map +3 -3
- package/dist/cdn/components/forecast-digest.js +52 -0
- package/dist/cdn/components/forecast-digest.js.map +7 -0
- package/dist/cdn/components/forecast-timeline.js +10 -3
- package/dist/cdn/components/forecast-timeline.js.map +4 -4
- package/dist/cdn/components/guna-milan.js +10 -3
- package/dist/cdn/components/guna-milan.js.map +4 -4
- package/dist/cdn/components/hd-connection.js +52 -0
- package/dist/cdn/components/hd-connection.js.map +7 -0
- package/dist/cdn/components/hd-penta.js +52 -0
- package/dist/cdn/components/hd-penta.js.map +7 -0
- package/dist/cdn/components/hd-variables.js +52 -0
- package/dist/cdn/components/hd-variables.js.map +7 -0
- package/dist/cdn/components/hexagram.js +10 -3
- package/dist/cdn/components/hexagram.js.map +4 -4
- package/dist/cdn/components/hora-table.js +52 -0
- package/dist/cdn/components/hora-table.js.map +7 -0
- package/dist/cdn/components/horoscope-card.js +10 -3
- package/dist/cdn/components/horoscope-card.js.map +4 -4
- package/dist/cdn/components/kp-chart.js +10 -3
- package/dist/cdn/components/kp-chart.js.map +4 -4
- package/dist/cdn/components/kp-planets-table.js +10 -3
- package/dist/cdn/components/kp-planets-table.js.map +4 -4
- package/dist/cdn/components/kp-ruling-planets.js +10 -3
- package/dist/cdn/components/kp-ruling-planets.js.map +4 -4
- package/dist/cdn/components/location-search.js +3 -3
- package/dist/cdn/components/location-search.js.map +2 -2
- package/dist/cdn/components/moon-phase.js +10 -3
- package/dist/cdn/components/moon-phase.js.map +4 -4
- package/dist/cdn/components/nakshatra-card.js +10 -3
- package/dist/cdn/components/nakshatra-card.js.map +4 -4
- package/dist/cdn/components/natal-chart.js +16 -9
- package/dist/cdn/components/natal-chart.js.map +4 -4
- package/dist/cdn/components/numerology-card.js +10 -3
- package/dist/cdn/components/numerology-card.js.map +4 -4
- package/dist/cdn/components/panchang-table.js +10 -3
- package/dist/cdn/components/panchang-table.js.map +4 -4
- package/dist/cdn/components/reference-card.js +52 -0
- package/dist/cdn/components/reference-card.js.map +7 -0
- package/dist/cdn/components/shadbala-table.js +10 -3
- package/dist/cdn/components/shadbala-table.js.map +4 -4
- package/dist/cdn/components/synastry-chart.js +16 -9
- package/dist/cdn/components/synastry-chart.js.map +4 -4
- package/dist/cdn/components/tarot-card.js +10 -3
- package/dist/cdn/components/tarot-card.js.map +4 -4
- package/dist/cdn/components/tarot-catalog.js +52 -0
- package/dist/cdn/components/tarot-catalog.js.map +7 -0
- package/dist/cdn/components/tarot-spread.js +10 -3
- package/dist/cdn/components/tarot-spread.js.map +4 -4
- package/dist/cdn/components/transits-table.js +10 -3
- package/dist/cdn/components/transits-table.js.map +4 -4
- package/dist/cdn/components/vedic-aspects.js +52 -0
- package/dist/cdn/components/vedic-aspects.js.map +7 -0
- package/dist/cdn/components/vedic-kundli.js +31 -24
- package/dist/cdn/components/vedic-kundli.js.map +4 -4
- package/dist/cdn/components/vedic-planets-table.js +10 -3
- package/dist/cdn/components/vedic-planets-table.js.map +4 -4
- package/dist/cdn/components/western-planets-table.js +10 -3
- package/dist/cdn/components/western-planets-table.js.map +4 -4
- package/dist/cdn/components/yoga-list.js +10 -3
- package/dist/cdn/components/yoga-list.js.map +4 -4
- package/dist/cdn/roxy-ui.js +92 -81
- package/dist/cdn/roxy-ui.js.map +4 -4
- package/dist/components/angel-number-card.d.ts +17 -0
- package/dist/components/angel-number-card.d.ts.map +1 -0
- package/dist/components/angel-number-card.js +2 -0
- package/dist/components/angel-number-card.js.map +7 -0
- package/dist/components/angel-number-lookup.d.ts +21 -0
- package/dist/components/angel-number-lookup.d.ts.map +1 -0
- package/dist/components/angel-number-lookup.js +2 -0
- package/dist/components/angel-number-lookup.js.map +7 -0
- package/dist/components/ashtakavarga-grid.d.ts +4 -5
- package/dist/components/ashtakavarga-grid.d.ts.map +1 -1
- package/dist/components/ashtakavarga-grid.js +1 -1
- package/dist/components/ashtakavarga-grid.js.map +4 -4
- package/dist/components/aspects-table.d.ts +23 -0
- package/dist/components/aspects-table.d.ts.map +1 -0
- package/dist/components/aspects-table.js +2 -0
- package/dist/components/aspects-table.js.map +7 -0
- package/dist/components/biorhythm-chart.d.ts +4 -5
- package/dist/components/biorhythm-chart.d.ts.map +1 -1
- package/dist/components/biorhythm-chart.js +1 -1
- package/dist/components/biorhythm-chart.js.map +4 -4
- package/dist/components/bodygraph.d.ts +4 -5
- package/dist/components/bodygraph.d.ts.map +1 -1
- package/dist/components/bodygraph.js +9 -9
- package/dist/components/bodygraph.js.map +4 -4
- package/dist/components/choghadiya-grid.d.ts +4 -5
- package/dist/components/choghadiya-grid.d.ts.map +1 -1
- package/dist/components/choghadiya-grid.js +1 -1
- package/dist/components/choghadiya-grid.js.map +4 -4
- package/dist/components/compatibility-card.d.ts +4 -5
- package/dist/components/compatibility-card.d.ts.map +1 -1
- package/dist/components/compatibility-card.js +1 -1
- package/dist/components/compatibility-card.js.map +4 -4
- package/dist/components/crystal-card.d.ts +19 -0
- package/dist/components/crystal-card.d.ts.map +1 -0
- package/dist/components/crystal-card.js +2 -0
- package/dist/components/crystal-card.js.map +7 -0
- package/dist/components/crystal-grid.d.ts +26 -0
- package/dist/components/crystal-grid.d.ts.map +1 -0
- package/dist/components/crystal-grid.js +2 -0
- package/dist/components/crystal-grid.js.map +7 -0
- package/dist/components/dasha-timeline.d.ts +4 -5
- package/dist/components/dasha-timeline.d.ts.map +1 -1
- package/dist/components/dasha-timeline.js +1 -1
- package/dist/components/dasha-timeline.js.map +4 -4
- package/dist/components/data.d.ts +5 -8
- package/dist/components/data.d.ts.map +1 -1
- package/dist/components/data.js +1 -1
- package/dist/components/data.js.map +4 -4
- package/dist/components/divisional-chart.d.ts +4 -5
- package/dist/components/divisional-chart.d.ts.map +1 -1
- package/dist/components/divisional-chart.js +59 -59
- package/dist/components/divisional-chart.js.map +4 -4
- package/dist/components/dosha-card.d.ts +4 -5
- package/dist/components/dosha-card.d.ts.map +1 -1
- package/dist/components/dosha-card.js +1 -1
- package/dist/components/dosha-card.js.map +4 -4
- package/dist/components/dream-card.d.ts +16 -0
- package/dist/components/dream-card.d.ts.map +1 -0
- package/dist/components/dream-card.js +2 -0
- package/dist/components/dream-card.js.map +7 -0
- package/dist/components/dream-search.d.ts +18 -0
- package/dist/components/dream-search.d.ts.map +1 -0
- package/dist/components/dream-search.js +2 -0
- package/dist/components/dream-search.js.map +7 -0
- package/dist/components/endpoint-form.d.ts +10 -5
- package/dist/components/endpoint-form.d.ts.map +1 -1
- package/dist/components/endpoint-form.js +1 -1
- package/dist/components/endpoint-form.js.map +3 -3
- package/dist/components/forecast-digest.d.ts +19 -0
- package/dist/components/forecast-digest.d.ts.map +1 -0
- package/dist/components/forecast-digest.js +2 -0
- package/dist/components/forecast-digest.js.map +7 -0
- package/dist/components/forecast-timeline.d.ts +8 -6
- package/dist/components/forecast-timeline.d.ts.map +1 -1
- package/dist/components/forecast-timeline.js +1 -1
- package/dist/components/forecast-timeline.js.map +4 -4
- package/dist/components/guna-milan.d.ts +4 -5
- package/dist/components/guna-milan.d.ts.map +1 -1
- package/dist/components/guna-milan.js +1 -1
- package/dist/components/guna-milan.js.map +4 -4
- package/dist/components/hd-connection.d.ts +18 -0
- package/dist/components/hd-connection.d.ts.map +1 -0
- package/dist/components/hd-connection.js +2 -0
- package/dist/components/hd-connection.js.map +7 -0
- package/dist/components/hd-penta.d.ts +18 -0
- package/dist/components/hd-penta.d.ts.map +1 -0
- package/dist/components/hd-penta.js +2 -0
- package/dist/components/hd-penta.js.map +7 -0
- package/dist/components/hd-variables.d.ts +17 -0
- package/dist/components/hd-variables.d.ts.map +1 -0
- package/dist/components/hd-variables.js +2 -0
- package/dist/components/hd-variables.js.map +7 -0
- package/dist/components/hexagram.d.ts +4 -5
- package/dist/components/hexagram.d.ts.map +1 -1
- package/dist/components/hexagram.js +1 -1
- package/dist/components/hexagram.js.map +4 -4
- package/dist/components/hora-table.d.ts +17 -0
- package/dist/components/hora-table.d.ts.map +1 -0
- package/dist/components/hora-table.js +2 -0
- package/dist/components/hora-table.js.map +7 -0
- package/dist/components/horoscope-card.d.ts +4 -5
- package/dist/components/horoscope-card.d.ts.map +1 -1
- package/dist/components/horoscope-card.js +1 -1
- package/dist/components/horoscope-card.js.map +4 -4
- package/dist/components/kp-chart.d.ts +4 -5
- package/dist/components/kp-chart.d.ts.map +1 -1
- package/dist/components/kp-chart.js +1 -1
- package/dist/components/kp-chart.js.map +4 -4
- package/dist/components/kp-planets-table.d.ts +4 -5
- package/dist/components/kp-planets-table.d.ts.map +1 -1
- package/dist/components/kp-planets-table.js +1 -1
- package/dist/components/kp-planets-table.js.map +4 -4
- package/dist/components/kp-ruling-planets.d.ts +4 -5
- package/dist/components/kp-ruling-planets.d.ts.map +1 -1
- package/dist/components/kp-ruling-planets.js +1 -1
- package/dist/components/kp-ruling-planets.js.map +4 -4
- package/dist/components/location-search.js +1 -1
- package/dist/components/location-search.js.map +2 -2
- package/dist/components/moon-phase.d.ts +5 -5
- package/dist/components/moon-phase.d.ts.map +1 -1
- package/dist/components/moon-phase.js +1 -1
- package/dist/components/moon-phase.js.map +4 -4
- package/dist/components/nakshatra-card.d.ts +4 -5
- package/dist/components/nakshatra-card.d.ts.map +1 -1
- package/dist/components/nakshatra-card.js +1 -1
- package/dist/components/nakshatra-card.js.map +4 -4
- package/dist/components/natal-chart.d.ts +4 -5
- package/dist/components/natal-chart.d.ts.map +1 -1
- package/dist/components/natal-chart.js +8 -8
- package/dist/components/natal-chart.js.map +4 -4
- package/dist/components/numerology-card.d.ts +15 -10
- package/dist/components/numerology-card.d.ts.map +1 -1
- package/dist/components/numerology-card.js +1 -1
- package/dist/components/numerology-card.js.map +4 -4
- package/dist/components/panchang-table.d.ts +4 -5
- package/dist/components/panchang-table.d.ts.map +1 -1
- package/dist/components/panchang-table.js +1 -1
- package/dist/components/panchang-table.js.map +4 -4
- package/dist/components/reference-card.d.ts +19 -0
- package/dist/components/reference-card.d.ts.map +1 -0
- package/dist/components/reference-card.js +2 -0
- package/dist/components/reference-card.js.map +7 -0
- package/dist/components/shadbala-table.d.ts +4 -5
- package/dist/components/shadbala-table.d.ts.map +1 -1
- package/dist/components/shadbala-table.js +1 -1
- package/dist/components/shadbala-table.js.map +4 -4
- package/dist/components/synastry-chart.d.ts +4 -5
- package/dist/components/synastry-chart.d.ts.map +1 -1
- package/dist/components/synastry-chart.js +7 -7
- package/dist/components/synastry-chart.js.map +4 -4
- package/dist/components/tarot-card.d.ts +4 -5
- package/dist/components/tarot-card.d.ts.map +1 -1
- package/dist/components/tarot-card.js +1 -1
- package/dist/components/tarot-card.js.map +4 -4
- package/dist/components/tarot-catalog.d.ts +20 -0
- package/dist/components/tarot-catalog.d.ts.map +1 -0
- package/dist/components/tarot-catalog.js +2 -0
- package/dist/components/tarot-catalog.js.map +7 -0
- package/dist/components/tarot-spread.d.ts +7 -8
- package/dist/components/tarot-spread.d.ts.map +1 -1
- package/dist/components/tarot-spread.js +1 -1
- package/dist/components/tarot-spread.js.map +4 -4
- package/dist/components/transits-table.d.ts +4 -5
- package/dist/components/transits-table.d.ts.map +1 -1
- package/dist/components/transits-table.js +1 -1
- package/dist/components/transits-table.js.map +4 -4
- package/dist/components/vedic-aspects.d.ts +16 -0
- package/dist/components/vedic-aspects.d.ts.map +1 -0
- package/dist/components/vedic-aspects.js +2 -0
- package/dist/components/vedic-aspects.js.map +7 -0
- package/dist/components/vedic-kundli.d.ts +22 -5
- package/dist/components/vedic-kundli.d.ts.map +1 -1
- package/dist/components/vedic-kundli.js +63 -63
- package/dist/components/vedic-kundli.js.map +4 -4
- package/dist/components/vedic-planets-table.d.ts +4 -5
- package/dist/components/vedic-planets-table.d.ts.map +1 -1
- package/dist/components/vedic-planets-table.js +1 -1
- package/dist/components/vedic-planets-table.js.map +4 -4
- package/dist/components/western-planets-table.d.ts +4 -5
- package/dist/components/western-planets-table.d.ts.map +1 -1
- package/dist/components/western-planets-table.js +1 -1
- package/dist/components/western-planets-table.js.map +4 -4
- package/dist/components/yoga-list.d.ts +6 -7
- package/dist/components/yoga-list.d.ts.map +1 -1
- package/dist/components/yoga-list.js +1 -1
- package/dist/components/yoga-list.js.map +4 -4
- package/dist/generated/endpoint-bindings.d.ts +15 -0
- package/dist/generated/endpoint-bindings.d.ts.map +1 -0
- package/dist/index.cjs +73 -73
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +71 -71
- package/dist/index.js.map +4 -4
- package/dist/manifest.d.ts.map +1 -1
- package/dist/manifest.json +39 -24
- package/dist/styles/tokens-css.d.ts +1 -1
- package/dist/styles/tokens-css.d.ts.map +1 -1
- package/dist/styles/tokens.css +4 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/types.gen.d.ts +1103 -164
- package/dist/types/types.gen.d.ts.map +1 -1
- package/dist/utils/angel-sections.d.ts +14 -0
- package/dist/utils/angel-sections.d.ts.map +1 -0
- package/dist/utils/base-element.d.ts +73 -0
- package/dist/utils/base-element.d.ts.map +1 -0
- package/dist/utils/base-styles.d.ts.map +1 -1
- package/dist/utils/fetch-controller.d.ts +60 -0
- package/dist/utils/fetch-controller.d.ts.map +1 -0
- package/dist/utils/kundli-render.d.ts +2 -1
- package/dist/utils/kundli-render.d.ts.map +1 -1
- package/dist/utils/kundli-styles.d.ts.map +1 -1
- package/dist/utils/markup-data.d.ts +34 -0
- package/dist/utils/markup-data.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/package.json +2 -1
- package/src/components/angel-number-card.ts +210 -0
- package/src/components/angel-number-lookup.ts +207 -0
- package/src/components/ashtakavarga-grid.ts +15 -20
- package/src/components/aspects-table.ts +329 -0
- package/src/components/biorhythm-chart.ts +14 -18
- package/src/components/bodygraph.ts +9 -20
- package/src/components/choghadiya-grid.ts +15 -19
- package/src/components/compatibility-card.ts +9 -19
- package/src/components/crystal-card.ts +242 -0
- package/src/components/crystal-grid.ts +182 -0
- package/src/components/dasha-timeline.ts +9 -20
- package/src/components/data.ts +8 -27
- package/src/components/divisional-chart.ts +10 -18
- package/src/components/dosha-card.ts +8 -19
- package/src/components/dream-card.ts +88 -0
- package/src/components/dream-search.ts +135 -0
- package/src/components/endpoint-form.ts +149 -55
- package/src/components/forecast-digest.ts +213 -0
- package/src/components/forecast-timeline.ts +24 -19
- package/src/components/guna-milan.ts +8 -19
- package/src/components/hd-connection.ts +188 -0
- package/src/components/hd-penta.ts +165 -0
- package/src/components/hd-variables.ts +128 -0
- package/src/components/hexagram.ts +10 -18
- package/src/components/hora-table.ts +149 -0
- package/src/components/horoscope-card.ts +9 -19
- package/src/components/kp-chart.ts +11 -20
- package/src/components/kp-planets-table.ts +11 -20
- package/src/components/kp-ruling-planets.ts +8 -18
- package/src/components/moon-phase.ts +10 -19
- package/src/components/nakshatra-card.ts +11 -20
- package/src/components/natal-chart.ts +20 -23
- package/src/components/numerology-card.ts +90 -31
- package/src/components/panchang-table.ts +9 -19
- package/src/components/reference-card.ts +212 -0
- package/src/components/shadbala-table.ts +15 -18
- package/src/components/synastry-chart.ts +17 -20
- package/src/components/tarot-card.ts +9 -20
- package/src/components/tarot-catalog.ts +129 -0
- package/src/components/tarot-spread.ts +20 -21
- package/src/components/transits-table.ts +17 -20
- package/src/components/vedic-aspects.ts +188 -0
- package/src/components/vedic-kundli.ts +46 -19
- package/src/components/vedic-planets-table.ts +11 -19
- package/src/components/western-planets-table.ts +11 -19
- package/src/components/yoga-list.ts +17 -23
- package/src/generated/endpoint-bindings.ts +655 -0
- package/src/index.ts +27 -0
- package/src/manifest.ts +198 -6
- package/src/styles/tokens-css.ts +4 -0
- package/src/styles/tokens.css +4 -0
- package/src/types/index.ts +1 -1
- package/src/types/types.gen.ts +1123 -164
- package/src/utils/angel-sections.ts +38 -0
- package/src/utils/base-element.ts +183 -0
- package/src/utils/base-styles.ts +33 -0
- package/src/utils/fetch-controller.ts +166 -0
- package/src/utils/kundli-render.ts +9 -2
- package/src/utils/kundli-styles.ts +7 -1
- package/src/utils/markup-data.ts +45 -0
- package/src/version.ts +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1,92 +1,92 @@
|
|
|
1
|
-
"use strict";var Hr=Object.defineProperty;var St=Object.getOwnPropertyDescriptor;var qt=Object.getOwnPropertyNames;var Vt=Object.prototype.hasOwnProperty;var Ft=(o,n)=>{for(var e in n)Hr(o,e,{get:n[e],enumerable:!0})},Ut=(o,n,e,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let t of qt(n))!Vt.call(o,t)&&t!==e&&Hr(o,t,{get:()=>n[t],enumerable:!(r=St(n,t))||r.enumerable});return o};var Wt=o=>Ut(Hr({},"__esModule",{value:!0}),o),d=(o,n,e,r)=>{for(var t=r>1?void 0:r?St(n,e):n,a=o.length-1,s;a>=0;a--)(s=o[a])&&(t=(r?s(n,e,t):s(t))||t);return r&&t&&Hr(n,e,t),t};var Qa={};Ft(Qa,{ROXY_COMPONENTS:()=>lt,ROXY_UI_COMPONENTS:()=>Xa,ROXY_UI_VERSION:()=>Yt,RoxyAshtakavargaGrid:()=>$e,RoxyBiorhythmChart:()=>we,RoxyBodygraph:()=>je,RoxyChoghadiyaGrid:()=>Be,RoxyCompatibilityCard:()=>ke,RoxyDashaTimeline:()=>Se,RoxyData:()=>Ce,RoxyDivisionalChart:()=>Le,RoxyDoshaCard:()=>Te,RoxyEndpointForm:()=>ae,RoxyForecastTimeline:()=>Ye,RoxyGunaMilan:()=>qe,RoxyHexagram:()=>Re,RoxyHoroscopeCard:()=>Ae,RoxyKpChart:()=>Ee,RoxyKpPlanetsTable:()=>Ve,RoxyKpRulingPlanets:()=>Fe,RoxyLocationSearch:()=>ee,RoxyMoonPhase:()=>Ne,RoxyNakshatraCard:()=>Ue,RoxyNatalChart:()=>ve,RoxyNumerologyCard:()=>ze,RoxyPanchangTable:()=>Me,RoxyShadbalaTable:()=>We,RoxySynastryChart:()=>Je,RoxyTarotCard:()=>De,RoxyTarotSpread:()=>Ge,RoxyTransitsTable:()=>Oe,RoxyVedicKundli:()=>He,RoxyVedicPlanetsTable:()=>Xe,RoxyWesternPlanetsTable:()=>Qe,RoxyYogaList:()=>Ie});module.exports=Wt(Qa);var U=require("lit"),nr=require("lit/decorators.js");var I={Sun:"\u2609",Moon:"\u263D",Mercury:"\u263F",Venus:"\u2640",Earth:"\u2641",Mars:"\u2642",Jupiter:"\u2643",Saturn:"\u2644",Uranus:"\u2645",Neptune:"\u2646",Pluto:"\u2647",Rahu:"\u260A",Ketu:"\u260B",Ascendant:"Asc",Lagna:"La",NorthNode:"\u260A",SouthNode:"\u260B","North node":"\u260A","South node":"\u260B",Chiron:"\u26B7",Lilith:"\u26B8","Black moon lilith":"\u26B8"},Ct={Sun:"Su",Moon:"Mo",Mercury:"Me",Venus:"Ve",Mars:"Ma",Jupiter:"Ju",Saturn:"Sa",Uranus:"Ur",Neptune:"Ne",Pluto:"Pl",Rahu:"Ra",Ketu:"Ke",Ascendant:"Asc",Lagna:"La"},oe={Aries:"\u2648",Taurus:"\u2649",Gemini:"\u264A",Cancer:"\u264B",Leo:"\u264C",Virgo:"\u264D",Libra:"\u264E",Scorpio:"\u264F",Sagittarius:"\u2650",Capricorn:"\u2651",Aquarius:"\u2652",Pisces:"\u2653"},Ir={Aries:"Ar",Taurus:"Ta",Gemini:"Ge",Cancer:"Cn",Leo:"Le",Virgo:"Vi",Libra:"Li",Scorpio:"Sc",Sagittarius:"Sg",Capricorn:"Cp",Aquarius:"Aq",Pisces:"Pi"},Q=["Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius","Pisces"],es=Q.map(o=>o.toLowerCase()),fr={conjunction:"\u260C",opposition:"\u260D",trine:"\u25B3",square:"\u25A1",sextile:"\u2731",quincunx:"\u22BB",semisextile:"\u22BC"},dt={heaven:"\u2630",lake:"\u2631",fire:"\u2632",thunder:"\u2633",wind:"\u2634",water:"\u2635",mountain:"\u2636",earth:"\u2637",Heaven:"\u2630",Lake:"\u2631",Fire:"\u2632",Thunder:"\u2633",Wind:"\u2634",Water:"\u2635",Mountain:"\u2636",Earth:"\u2637"},Pt={"new moon":"\u{1F311}","waxing crescent":"\u{1F312}","first quarter":"\u{1F313}","waxing gibbous":"\u{1F314}","full moon":"\u{1F315}","waning gibbous":"\u{1F316}","last quarter":"\u{1F317}","waning crescent":"\u{1F318}"};var Lt=require("lit"),y=Lt.css`:host{font-family:var(--roxy-font-sans,system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-base,1rem);line-height:var(--roxy-leading-normal,1.5);animation:roxy-fade-in var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1)) both;background:0 0;display:block;container-type:inline-size}*,:before,:after{box-sizing:border-box}@keyframes roxy-fade-in{0%{opacity:0;transform:translateY(2px)}to{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion:reduce){:host{animation:none}}.roxy-skeleton{background:linear-gradient(90deg, var(--roxy-border,#e4e4e7) 0%, color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent) 50%, var(--roxy-border,#e4e4e7) 100%);border-radius:var(--roxy-radius-md,8px);background-size:200% 100%;animation:1.4s ease-in-out infinite roxy-shimmer}@keyframes roxy-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}@media (prefers-reduced-motion:reduce){.roxy-skeleton{animation:none}}.roxy-empty{padding:var(--roxy-space-lg,1.5rem);color:var(--roxy-muted,#71717a);text-align:center;font-size:var(--roxy-text-sm,.875rem)}:host(:focus-within) .roxy-card{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}:host{font-variant-emoji:text}`;var Jt="roxy-data";function Xt(o){return o.nodeName==="SCRIPT"&&o.getAttribute("type")==="application/json"}var h=class{constructor(n){this.host=n,n.addController(this)}hostConnected(){if(this.host.data!=null)return;let n=this.read();n!==void 0&&(this.host.data=n,this.host.requestUpdate())}read(){let n=this.findInlineScript();return n?this.parse(n.textContent):void 0}findInlineScript(){for(let n of Array.from(this.host.children))if(Xt(n)&&n.classList.contains(Jt))return n;return null}parse(n){if(n?.trim())try{return JSON.parse(n)}catch{return}}};var Qt={sarva:"Sarvashtakavarga",bhinna:"Bhinnashtakavarga",pinda:"Shodhya Pinda"},er=["sarva","bhinna","pinda"],$e=class extends U.LitElement{constructor(){super();this.data=null;this.activeTab="sarva";new h(this)}render(){if(!this.data)return U.html`<div class="roxy-empty" role="status">No ashtakavarga data</div>`;let e=this.data.signs??[];return U.html`<div class="wrap" aria-label="Ashtakavarga grid"><div class="head"><h2 class="title">Ashtakavarga</h2>${e.length?U.html`<p class="subtitle">${e.length} signs</p>`:U.nothing}</div><div class="tablist" role="tablist" aria-label="Ashtakavarga views" @keydown="${this.onTabKeyDown}">${er.map(r=>U.html`<button class="tab" role="tab" id="tab-${r}" aria-selected="${this.activeTab===r?"true":"false"}" aria-controls="panel-${r}" tabindex="${this.activeTab===r?"0":"-1"}" @click="${()=>{this.activeTab=r}}">${Qt[r]}</button>`)}</div><div id="panel-${this.activeTab}" role="tabpanel" aria-labelledby="tab-${this.activeTab}">${this.activeTab==="sarva"?this.renderSarva(e):this.activeTab==="bhinna"?this.renderBhinna(e):this.renderPinda()}</div></div>`}onTabKeyDown(e){let r=er.indexOf(this.activeTab);e.key==="ArrowRight"?(e.preventDefault(),this.activeTab=er[(r+1)%er.length],this.focusActiveTab()):e.key==="ArrowLeft"&&(e.preventDefault(),this.activeTab=er[(r-1+er.length)%er.length],this.focusActiveTab())}focusActiveTab(){requestAnimationFrame(()=>{this.shadowRoot?.querySelector(`#tab-${this.activeTab}`)?.focus()})}bhinnaHeat(e){return e<=1?"heat-1":e<=2?"heat-2":e<=3?"heat-3":e<=4?"heat-4":e<=5?"heat-5":e<=6?"heat-6":"heat-7"}sarvaHeat(e){return e<=18?"heat-1":e<=23?"heat-2":e<=28?"heat-3":e<=32?"heat-4":e<=37?"heat-5":e<=42?"heat-6":"heat-7"}renderSarva(e){let r=this.data.sarvashtakavarga;return r?U.html`<div class="overflow-scroll"><table aria-label="Sarvashtakavarga bindu counts per sign"><thead><tr><th scope="col">Sign</th><th scope="col">Bindus</th></tr></thead><tbody>${e.map((t,a)=>{let s=r.bindus[a]??0,i=this.sarvaHeat(s);return U.html`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${oe[t]??""}</span> ${t}</div></td><td class="${`heat-cell ${i}`}">${s}</td></tr>`})}</tbody><tfoot><tr class="total-row"><td>Total</td><td>${r.total}</td></tr></tfoot></table></div>`:U.html`<p class="roxy-empty">No sarvashtakavarga data</p>`}renderBhinna(e){let r=this.data.bhinnashtakavarga;return r?.length?U.html`<div class="overflow-scroll"><table class="bhinna-table" aria-label="Bhinnashtakavarga planet-by-sign grid"><thead><tr><th scope="col">Planet</th>${e.map(t=>U.html`<th scope="col" title="${t}">${oe[t]??t.slice(0,2)}</th>`)}<th scope="col">Total</th></tr></thead><tbody>${r.map(t=>U.html`<tr><td>${t.planet}</td>${t.bindus.map(a=>{let s=this.bhinnaHeat(a);return U.html`<td class="${`heat-cell ${s}`}">${a}</td>`})}<td>${t.total}</td></tr>`)}</tbody></table></div>`:U.html`<p class="roxy-empty">No bhinnashtakavarga data</p>`}renderPinda(){let e=this.data.shodhyaPinda;return e?.length?U.html`<div class="overflow-scroll"><table aria-label="Shodhya Pinda planet strength scores"><thead><tr><th scope="col">Planet</th><th scope="col">Rashi Pinda</th><th scope="col">Graha Pinda</th><th scope="col">Shodhya Pinda</th></tr></thead><tbody>${e.map(r=>U.html`<tr><td>${r.planet}</td><td>${r.rashiPinda}</td><td>${r.grahaPinda}</td><td>${r.shodhyaPinda}</td></tr>`)}</tbody></table></div>`:U.html`<p class="roxy-empty">No shodhya pinda data</p>`}};$e.styles=[y,U.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.tablist{border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);transition:color var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.tab[aria-selected=true]{color:var(--roxy-accent-ink,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}.overflow-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:center}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td:first-child,th:first-child{text-align:left}.glyph{margin-right:3px;font-size:1.1em;line-height:1}.planet-cell{white-space:nowrap;align-items:center;gap:4px;display:flex}.total-row td{font-weight:var(--roxy-weight-bold,600);border-top:2px solid var(--roxy-border,#e4e4e7);border-bottom:none}.heat-cell{border-radius:var(--roxy-radius-sm,4px);font-weight:var(--roxy-weight-bold,600);font-variant-numeric:tabular-nums;min-width:2rem;color:var(--roxy-fg,currentColor)}.heat-1{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 6%, transparent)}.heat-2{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 14%, transparent)}.heat-3{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 26%, transparent)}.heat-4{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 40%, transparent)}.heat-5{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 55%, transparent)}.heat-6{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 72%, transparent)}.heat-7{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 90%, transparent)}.bhinna-table th:first-child,.bhinna-table td:first-child{min-width:5rem}@container (width<=480px){.bhinna-table th,.bhinna-table td{font-size:var(--roxy-text-xs,.75rem);padding:.3rem .35rem}.bhinna-table th:first-child,.bhinna-table td:first-child{min-width:3.5rem}.heat-cell{min-width:1.5rem}}.overflow-scroll{-webkit-mask-image:linear-gradient(90deg,#0000 0,#000 .5rem calc(100% - 1rem),#0000 100%);mask-image:linear-gradient(90deg,#0000 0,#000 .5rem calc(100% - 1rem),#0000 100%)}`],d([(0,nr.property)({attribute:!1})],$e.prototype,"data",2),d([(0,nr.state)()],$e.prototype,"activeTab",2),$e=d([(0,nr.customElement)("roxy-ashtakavarga-grid")],$e);var V=require("lit"),br=require("lit/decorators.js");var Tt={physical:"#dc2626",emotional:"#0284c7",intellectual:"#16a34a",intuitive:"#a855f7",aesthetic:"#f59e0b",awareness:"#ec4899",spiritual:"#14b8a6",passion:"#ef4444",mastery:"#6366f1",wisdom:"#475569"},we=class extends V.LitElement{constructor(){super();this.data=null;this.mode="daily";new h(this)}render(){let e=this.data;return e?this.mode==="critical-days"&&"criticalDays"in e?this.renderCritical(e):this.mode==="forecast"&&"days"in e?this.renderForecast(e):this.renderDaily(e):V.html`<div class="roxy-empty" role="status">No biorhythm data</div>`}renderDaily(e){let r=e.quickRead??{},t=Object.entries(r).map(([a,s])=>{let i=typeof s=="number"?s:0,l=Math.abs(i)>1?i/100:i;return[a,l]});return V.html`<section class="wrap" aria-label="Daily biorhythm"><header class="head"><h2 class="title">Biorhythm</h2>${typeof e.energyRating=="number"?V.html`<span class="energy">Energy ${e.energyRating}/10</span>`:V.nothing}</header><div class="bars" role="list">${t.map(([a,s])=>{let i=(s+1)/2*100,l=Tt[a]??"var(--roxy-accent, #f59e0b)";return V.html`<div class="bar" role="listitem"><span style="text-transform:capitalize">${a}</span> <span class="track"><span class="fill" style="width:${i}%;background:${l}"></span> </span><span class="value">${Math.round(s*100)}%</span></div>`})}</div>${e.dailyMessage?V.html`<p class="advice">${e.dailyMessage}</p>`:V.nothing} ${e.advice?V.html`<p class="advice">${e.advice}</p>`:V.nothing}</section>`}renderForecast(e){let r=e.days??[];if(r.length===0)return V.html`<div class="roxy-empty" role="status">No forecast</div>`;let t=600,a=160,s=t/Math.max(r.length-1,1),i=["physical","emotional","intellectual","intuitive"];return V.html`<section class="wrap" aria-label="Biorhythm forecast"><header class="head"><h2 class="title">Forecast</h2><span class="energy">${e.startDate} - ${e.endDate}</span></header><svg viewBox="0 0 ${t} ${a}" role="img" aria-label="Biorhythm cycle lines across the forecast window"><title>Biorhythm forecast</title><line x1="0" y1="${a/2}" x2="${t}" y2="${a/2}" stroke="var(--roxy-border, #e4e4e7)" stroke-width="1"/>${i.map(l=>{let c=r.map((p,u)=>{let P=p[l]??0,x=u*s,Ze=a/2-P/100*(a/2-8);return`${x.toFixed(2)},${Ze.toFixed(2)}`}).join(" "),m=Tt[l]??"#475569";return V.svg`<polyline points=${c} fill="none" stroke=${m} stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />`})}</svg> ${e.summary?.periodAdvice?V.html`<p class="advice">${e.summary.periodAdvice}</p>`:V.nothing}</section>`}renderCritical(e){return V.html`<section class="wrap" aria-label="Critical days"><header class="head"><h2 class="title">Critical days</h2><span class="energy">${e.totalCriticalDays} total</span></header><div>${e.criticalDays.map(r=>V.html`<span class="crit">${r.date} · ${r.cycle} ${r.severity}</span>`)}</div></section>`}};we.styles=[y,V.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.energy{font-variant-numeric:tabular-nums;color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.bars{gap:var(--roxy-space-xs,.25rem);display:grid}.bar{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:8rem 1fr 3.5rem;align-items:center;display:grid}.track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:14px;position:relative;overflow:hidden}.fill{height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.value{font-variant-numeric:tabular-nums;text-align:right;color:var(--roxy-muted,#71717a)}.advice{color:var(--roxy-fg,#0a0a0a)}.alert{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);border:1px solid color-mix(in srgb, var(--roxy-warning,#ea580c) 32%, transparent);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);margin:0}svg{width:100%;height:auto;display:block}.crit{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);border-radius:var(--roxy-radius-sm,4px);font-size:var(--roxy-text-xs,.75rem);margin:2px;padding:4px 8px;display:inline-block}`],d([(0,br.property)({attribute:!1})],we.prototype,"data",2),d([(0,br.property)({type:String,reflect:!0})],we.prototype,"mode",2),we=d([(0,br.customElement)("roxy-biorhythm-chart")],we);var _=require("lit"),Yr=require("lit/decorators.js");var ge=require("lit"),_r=4,Kr=9,At=(100+2*Kr)*_r,Zt=(100+2*Kr)*_r;function ce(o,n){return{x:(o+Kr)*_r,y:(n+Kr)*_r}}var vr=50,gt=o=>2*vr-o,ct={head:{64:[45.5,11.2],61:[50,11.2],63:[54.5,11.2]},ajna:{47:[45.3,18],24:[50,18],4:[54.7,18],17:[45.6,20.6],11:[54.4,20.6],43:[50,25.3]},throat:{62:[45.5,32.3],23:[50,32.3],56:[54.5,32.3],16:[42,34.6],35:[58,34.6],12:[58,37.6],20:[42,40.6],45:[58,40.6],31:[46,42.4],8:[50,42.4],33:[54,42.4]},g:{1:[50,47.5],7:[45.6,50.3],13:[54.4,50.3],10:[40,53.3],25:[60,53.3],15:[45.6,56.6],46:[54.4,56.6],2:[50,59]},heart:{21:[62.5,58.5],51:[62.5,61.3],26:[62.5,64.1],40:[73,61.3]},spleen:{48:[20,70.6],57:[24,72.3],44:[28,74],50:[32,75.6],32:[28,77.2],28:[24,78.9],18:[20,80.6]},sacral:{5:[45.5,72.5],14:[50,72.5],29:[54.5,72.5],34:[42,75.6],27:[42,79],59:[58,79],42:[45.5,81.4],3:[50,81.4],9:[54.5,81.4]},"solar-plexus":{},root:{53:[45.5,89.9],60:[50,89.9],52:[54.5,89.9],54:[42,92.7],19:[58,92.7],38:[42,95.3],39:[58,95.3],58:[42,98],41:[58,98]}},ea={48:36,57:22,44:37,50:6,32:49,28:55,18:30};function ra(){let o={},n={};for(let[e,[r,t]]of Object.entries(ct.spleen))ct["solar-plexus"][ea[Number(e)]]=[gt(r),t];for(let[e,r]of Object.entries(ct))for(let[t,[a,s]]of Object.entries(r))o[Number(t)]=ce(a,s),n[Number(t)]=e;return{points:o,centerOf:n}}var{points:mt,centerOf:gs}=ra(),ys=At/2;function rr(o){return o.map(([n,e])=>ce(n,e))}function pt(o,n,e){return rr([[vr-o,n],[vr+o,n],[vr+o,e],[vr-o,e]])}var Rt=[[18.4,68],[18.4,81.8],[34.7,74.9]],ta=[{id:"head",label:"Head",color:"gold",points:rr([[40,14.3],[60,14.3],[50,6]]),labelAnchor:ce(63,9),labelAlign:"start"},{id:"ajna",label:"Ajna",color:"green",points:rr([[40,15.6],[60,15.6],[50,27.6]]),labelAnchor:ce(62,21),labelAlign:"start"},{id:"throat",label:"Throat",color:"brown",points:pt(9.5,30.4,43.6),labelAnchor:ce(83,34),labelAlign:"start"},{id:"g",label:"G",color:"gold",points:rr([[50,45],[60.7,53.3],[50,61.6],[39.3,53.3]]),labelAnchor:ce(13,51),labelAlign:"end"},{id:"heart",label:"Heart",color:"red",points:rr([[61.5,57],[76.5,61.3],[61.5,65.6]]),labelAnchor:ce(85,56),labelAlign:"start"},{id:"spleen",label:"Spleen",color:"brown",points:rr(Rt),labelAnchor:ce(13,70),labelAlign:"end"},{id:"sacral",label:"Sacral",color:"red",points:pt(9.5,70.6,83.6),labelAnchor:ce(85,88),labelAlign:"start"},{id:"solar-plexus",label:"Solar Plexus",color:"brown",points:rr(Rt.map(([o,n])=>[gt(o),n])),labelAnchor:ce(87,73),labelAlign:"start"},{id:"root",label:"Root",color:"brown",points:pt(9.5,87.9,99.9),labelAnchor:ce(50,103),labelAlign:"middle"}],aa=[[64,47],[61,24],[63,4],[17,62],[11,56],[43,23],[16,48],[20,34],[20,10],[7,31],[1,8],[13,33],[21,45],[12,22],[35,36],[57,20],[15,5],[2,14],[46,29],[34,10],[10,57],[25,51],[27,50],[57,34],[26,44],[18,58],[28,38],[32,54],[3,60],[9,52],[42,53],[59,6],[19,49],[39,55],[41,30],[37,40]],sa=oa();function oa(){let o=gt,n=[[50,-2],[60,-2],[60.5,9],[57,18],[56,21],[54,24],[52,27],[54,28],[64,30],[80,34],[83.5,40],[84,56],[83,74],[82,84],[76,92],[68,97],[64,99],[62,100],[60,100]],e=[`M ${jr(n[0])}`];for(let r=1;r+2<n.length;r+=3)e.push(`C ${jr(n[r])} ${jr(n[r+1])} ${jr(n[r+2])}`);e.push(`L ${Br(n[n.length-1],o)}`);for(let r=n.length-3;r>=1;r-=3)e.push(`C ${Br(n[r+1],o)} ${Br(n[r],o)} ${Br(n[r-1],o)}`);return e.push("Z"),e.join(" ")}function jr([o,n]){let e=ce(o,n);return`${e.x} ${e.y}`}function Br([o,n],e){let r=ce(e(o),n);return`${r.x} ${r.y}`}function na(o){return o.map(n=>`${n.x},${n.y}`).join(" ")}function Et(o,n){return o<n?`${o}-${n}`:`${n}-${o}`}function ia(){return ge.svg`<path class="bg-body" d=${sa} />`}function la(o,n){let e=[];for(let[r,t]of aa){let a=mt[r],s=mt[t];if(!a||!s)continue;if(e.push(ge.svg`<line class="bg-channel" x1=${a.x} y1=${a.y} x2=${s.x} y2=${s.y} />`),o.has(Et(r,t))){e.push(ge.svg`<line class="bg-channel on" x1=${a.x} y1=${a.y} x2=${s.x} y2=${s.y} />`);continue}let i={x:(a.x+s.x)/2,y:(a.y+s.y)/2};n.has(r)&&e.push(ge.svg`<line class="bg-half" x1=${a.x} y1=${a.y} x2=${i.x} y2=${i.y} />`),n.has(t)&&e.push(ge.svg`<line class="bg-half" x1=${s.x} y1=${s.y} x2=${i.x} y2=${i.y} />`)}return e}function da(o,n,e){let r=e.x-n.x,t=e.y-n.y,a=r*r+t*t;if(a===0)return n;let s=Math.max(0,Math.min(1,((o.x-n.x)*r+(o.y-n.y)*t)/a));return{x:n.x+s*r,y:n.y+s*t}}function ca(o,n){let e=n[0],r=Number.POSITIVE_INFINITY;for(let t=0;t<n.length;t++){let a=da(o,n[t],n[(t+1)%n.length]),s=(a.x-o.x)**2+(a.y-o.y)**2;s<r&&(r=s,e=a)}return e}function pa(o){return ta.map(n=>{let e=o.has(n.id),r=`bg-center bg-${n.color}${e?" defined":""}`,t=ca(n.labelAnchor,n.points);return ge.svg`<g>
|
|
2
|
-
<line class="bg-leader" x1=${
|
|
3
|
-
<polygon class=${r} points=${
|
|
4
|
-
<text class="bg-center-label" x=${
|
|
5
|
-
</g>`})}function
|
|
6
|
-
${
|
|
7
|
-
${
|
|
8
|
-
${
|
|
9
|
-
${
|
|
10
|
-
`}function b(o){return o?o.charAt(0).toUpperCase()+o.slice(1).toLowerCase():""}function ye(o){return o.replace(/[_-]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/^\w/,n=>n.toUpperCase())}var je=class extends _.LitElement{constructor(){super();this.data=null;new h(this)}render(){let e=this.data;if(!e)return _.html`<div class="roxy-empty" role="status">No bodygraph data</div>`;let r=new Set((e.centers??[]).filter(i=>i.defined).map(i=>i.id)),t=new Set((e.gates??[]).map(i=>i.gate).filter(i=>i!=null)),a=new Set((e.channels??[]).map(i=>Nt(i.gateA,i.gateB))),s=this.buildGateTitles(e.gates??[]);return _.html`<div class="wrap"><header class="head"><h2 class="title">Bodygraph</h2>${e.type?_.html`<div class="type-line">${e.type}${e.profile?_.html`· Profile ${e.profile}`:_.nothing}</div>`:_.nothing}</header><div class="layout"><svg viewBox="${zt}" preserveAspectRatio="xMidYMid meet" role="img" aria-label="Human Design bodygraph with nine centers, channels, and activated gates overlaid on a human silhouette"><title>Human Design bodygraph</title><desc>Nine energy centers in their canonical positions over a human silhouette, each filled with its traditional color when defined and outlined when open, wired by channels between activated gates.</desc>${Mt({definedCenters:r,activeChannels:a,activeGates:t,gateTitles:s})}</svg> ${this.renderSummary(e)}</div></div>`}buildGateTitles(e){let r=new Map;for(let t of e){if(t.gate==null)continue;let a=[`Gate ${t.gate}`];t.line!=null&&(a[0]+=`.${t.line}`),t.gateName&&a.push(t.gateName);let s=t.planet?b(t.planet):"",i=s?I[s]??s:"";i&&a.push(`${i} ${t.side??""}`.trim()),r.set(t.gate,a.join(" \xB7 "))}return r}renderSummary(e){let r=[{label:"Type",value:e.type},{label:"Strategy",value:e.strategy},{label:"Authority",value:e.authority},{label:"Profile",value:e.profile},{label:"Definition",value:e.definition}],t=e.incarnationCross;return _.html`<div class="summary"><div class="facts">${r.map(a=>a.value?_.html`<div class="fact"><span>${a.label}</span> <strong>${a.value}</strong></div>`:_.nothing)}</div>${t?.name?_.html`<p class="cross">${t.name} ${t.gates?.length?_.html`<span class="gates">(${t.gates.join(", ")})</span>`:_.nothing}</p>`:_.nothing} ${e.signature||e.notSelf?_.html`<div class="themes">${e.signature?_.html`<span class="pill pill--good">Signature: ${e.signature}</span>`:_.nothing} ${e.notSelf?_.html`<span class="pill pill--shadow">Not-self: ${e.notSelf}</span>`:_.nothing}</div>`:_.nothing}<div class="legend"><span class="legend-caption">Center colors when defined. Open centers are outlined.</span> <span><span class="swatch bg-gold defined"></span>Head, G</span> <span><span class="swatch bg-green defined"></span>Ajna</span> <span><span class="swatch bg-brown defined"></span>Throat, Spleen, Solar Plexus, Root</span> <span><span class="swatch bg-red defined"></span>Heart, Sacral</span> <span><span class="swatch"></span>Open center</span></div></div>`}};je.styles=[y,_.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.type-line{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.layout{gap:var(--roxy-space-lg,1.5rem);grid-template-columns:minmax(0,1fr);align-items:start;display:grid}@container (width>=520px){.layout{grid-template-columns:minmax(0,340px) minmax(0,1fr)}}svg{width:100%;max-width:340px;height:auto;margin:0 auto;display:block}.bg-body{fill:color-mix(in srgb, var(--roxy-secondary,#475569) 8%, transparent);stroke:var(--roxy-border,#e4e4e7);stroke-width:1px}.bg-channel{stroke:var(--roxy-secondary,#475569);stroke-width:1.6px;opacity:.3}.bg-channel.on{stroke-width:3.4px;stroke-linecap:round;opacity:1}.bg-half{stroke:var(--roxy-secondary,#475569);stroke-width:3.2px;stroke-linecap:round;opacity:.9}.bg-leader{stroke:var(--roxy-muted,#71717a);stroke-width:1px;opacity:.5}.bg-center{fill:#0000;stroke:var(--roxy-secondary,#475569);stroke-width:1.8px}.bg-center.defined{stroke:#00000073}.bg-center.bg-gold.defined{fill:#e0a200}.bg-center.bg-green.defined{fill:#2f8f00}.bg-center.bg-red.defined{fill:#c41f1f}.bg-center.bg-brown.defined{fill:#76502f}.bg-center-label{fill:var(--roxy-muted,#71717a);font-size:11px;font-family:var(--roxy-font-sans)}.bg-gate{fill:var(--roxy-fg,#0a0a0a);font-size:8px;font-weight:600;font-family:var(--roxy-font-sans);paint-order:stroke;stroke:var(--roxy-bg,#fff);stroke-width:1.6px;stroke-linejoin:round}.summary{gap:var(--roxy-space-md,1rem);display:grid}.facts{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.fact{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff)}.fact span{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.fact strong{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a)}.cross{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);border-left:2px solid var(--roxy-accent,#f59e0b);padding-left:var(--roxy-space-sm,.5rem);margin:0}.cross .gates{color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.themes{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.pill{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 10px}.pill--good{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.pill--shadow{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.legend{gap:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);flex-wrap:wrap;display:flex}.legend-caption{color:var(--roxy-muted,#71717a);flex-basis:100%}.legend .swatch{vertical-align:middle;border:1px solid var(--roxy-secondary,#475569);border-radius:2px;width:10px;height:10px;margin-right:4px;display:inline-block}.legend .swatch.defined{border-color:#00000073}.legend .swatch.bg-gold{background:#e0a200}.legend .swatch.bg-green{background:#2f8f00}.legend .swatch.bg-red{background:#c41f1f}.legend .swatch.bg-brown{background:#76502f}`],d([(0,Yr.property)({attribute:!1})],je.prototype,"data",2),je=d([(0,Yr.customElement)("roxy-bodygraph")],je);var Z=require("lit"),qr=require("lit/decorators.js");function Dt(o){try{let n=new Date(o);return Number.isNaN(n.getTime())?o:n.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}catch{return o}}var Be=class extends Z.LitElement{constructor(){super();this.data=null;new h(this)}isCurrent(e){let r=Date.now(),t=Date.parse(e.start),a=Date.parse(e.end);return Number.isNaN(t)||Number.isNaN(a)?!1:r>=t&&r<a}renderTile(e){let r=e.effect==="Good"?"good":e.effect==="Bad"?"bad":"neutral",t=this.isCurrent(e),a=I[b(e.lord)]??"",s=`${Dt(e.start)} - ${Dt(e.end)}`;return Z.html`<div class="cho-tile ${r}${t?" now":""}" role="listitem" aria-current="${t?"time":"false"}"><span class="tile-name">${e.name}${t?Z.html`<span class="now-badge">Now</span>`:Z.nothing} </span><span class="tile-time" aria-label="Time range">${s}</span> <span class="tile-lord">${a?Z.html`<span aria-hidden="true">${a}</span>`:Z.nothing} ${e.lord}</span></div>`}render(){if(!this.data)return Z.html`<div class="roxy-empty" role="status">No choghadiya data</div>`;let{date:e,dayChoghadiya:r,nightChoghadiya:t}=this.data;return Z.html`<div class="wrap"><div class="header"><h2 class="title">Choghadiya</h2>${e?Z.html`<p class="subtitle">${e}</p>`:Z.nothing}</div><div class="cho-grid"><section class="period-col" aria-label="Day muhurta periods"><h3 class="period-heading">Day</h3><div role="list" aria-label="Daytime choghadiya">${r&&r.length>0?r.map(a=>this.renderTile(a)):Z.html`<p class="roxy-empty" role="status">No daytime periods</p>`}</div></section><section class="period-col" aria-label="Night muhurta periods"><h3 class="period-heading">Night</h3><div role="list" aria-label="Nighttime choghadiya">${t&&t.length>0?t.map(a=>this.renderTile(a)):Z.html`<p class="roxy-empty" role="status">No nighttime periods</p>`}</div></section></div></div>`}};Be.styles=[y,Z.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.header{gap:var(--roxy-space-xs,.25rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin:0}.cho-grid{gap:var(--roxy-space-md,1rem);grid-template-columns:1fr;display:grid}@media (width>=720px){.cho-grid{grid-template-columns:1fr 1fr}}.period-col{gap:var(--roxy-space-xs,.25rem);display:grid}.period-heading{font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a)}.cho-tile{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);grid-template-columns:1fr auto;align-items:center;gap:.25em .75em;padding:.55em .85em;display:grid}.cho-tile.good{background:color-mix(in srgb, var(--roxy-success,#22c55e) 18%, transparent);border-color:color-mix(in srgb, var(--roxy-success,#22c55e) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.cho-tile.bad{background:color-mix(in srgb, var(--roxy-danger,#ef4444) 18%, transparent);border-color:color-mix(in srgb, var(--roxy-danger,#ef4444) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.cho-tile.neutral{color:var(--roxy-fg,#0a0a0a);background:0 0}.cho-tile.now{outline:2px solid var(--roxy-accent,#f59e0b);outline-offset:1px;box-shadow:0 0 0 4px color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent)}.now-badge{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);text-transform:uppercase;letter-spacing:.06em;margin-left:.4em;display:inline-block}.tile-name{font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);grid-column:1}.tile-time{font-size:var(--roxy-text-xs,.75rem);opacity:.8;white-space:nowrap;text-align:right;grid-area:1/2/3;align-self:center}.tile-lord{font-size:var(--roxy-text-sm,.875rem);opacity:.85;grid-column:1;align-items:center;gap:.25em;display:flex}`],d([(0,qr.property)({attribute:!1})],Be.prototype,"data",2),Be=d([(0,qr.customElement)("roxy-choghadiya-grid")],Be);var L=require("lit"),$r=require("lit/decorators.js");function he(o){if(typeof o!="string"||o.length===0||/^\d{4}-\d{2}-\d{2}$/.test(o))return"";let e=/^\d{2}:\d{2}(:\d{2})?$/.test(o)?`1970-01-01T${o}`:o,r=new Date(e);return Number.isNaN(r.getTime())?o:r.toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit",hour12:!0})}function _e(o){if(typeof o!="string"||o.length===0)return"";let n=new Date(/^\d{4}-\d{2}-\d{2}$/.test(o)?`${o}T00:00:00`:o);return Number.isNaN(n.getTime())?o:n.toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})}function yt(o){if(!o)return"";let n=he(o.start),e=he(o.end);return n&&e?`${n} - ${e}`:n||e||""}function v(o,n=1){return typeof o!="number"||!Number.isFinite(o)?"":o.toFixed(n).replace(/\.?0+$/,"")}function Gt(o,n=1){let e=v(o,n);return e?`${e}%`:""}var tr={conjunction:"aspect-conjunction",sextile:"aspect-sextile",square:"aspect-square",trine:"aspect-trine",opposition:"aspect-opposition"};function ir(o){return(o.type??"").toLowerCase().replace(/_/g,"-")}var ke=class extends L.LitElement{constructor(){super();this.data=null;this.mode="astrology";new h(this)}getBreakdown(){let e=this.data;if(!e)return{};if("categories"in e&&e.categories){let r={};for(let[t,a]of Object.entries(e.categories))typeof a=="number"&&Number.isFinite(a)&&(r[t]=a);return r}return{}}render(){let e=this.data;if(!e)return L.html`<div class="roxy-empty" role="status">No compatibility data</div>`;let r=e.overallScore,t=this.getBreakdown(),a="rating"in e?e.rating:void 0,s="archetype"in e?e.archetype:void 0,i="advice"in e?e.advice:void 0,l="summary"in e?e.summary:void 0,c="interpretation"in e?e.interpretation:void 0,m="strengths"in e?e.strengths:void 0,p="challenges"in e?e.challenges:void 0,u="keyAspects"in e?e.keyAspects:void 0;return L.html`<article class="card" aria-label="${`Compatibility (${this.mode})`}"><div class="head"><h2>${this.mode} compatibility</h2><div>${typeof r=="number"?L.html`<div class="score">${v(r,0)}</div>`:L.nothing} ${a?L.html`<div class="rating">${a}</div>`:L.nothing}</div></div>${Object.keys(t).length>0?L.html`<div role="list">${Object.entries(t).map(([P,x])=>L.html`<div class="bar-row" role="listitem"><span style="text-transform:capitalize">${P}</span> <span class="bar"><span style="width:${Math.max(0,Math.min(100,x))}%"></span></span> <span>${v(x,0)}</span></div>`)}</div>`:L.nothing} ${s?L.html`<p><span class="archetype">${s.label}</span> ${s.description?L.html`· ${s.description}`:L.nothing}</p>`:L.nothing} ${l?L.html`<p>${l}</p>`:L.nothing} ${c&&!l?L.html`<p>${c}</p>`:L.nothing} ${i?L.html`<p>${i}</p>`:L.nothing} ${(m?.length??0)>0||(p?.length??0)>0?L.html`<div class="lists">${m?.length?L.html`<div><h3>Strengths</h3><ul>${m.map(P=>L.html`<li>${P}</li>`)}</ul></div>`:L.nothing} ${p?.length?L.html`<div><h3>Challenges</h3><ul>${p.map(P=>L.html`<li>${P}</li>`)}</ul></div>`:L.nothing}</div>`:L.nothing} ${u?.length?L.html`<div><h3 style="margin:0 0 .25rem;font-size:var(--roxy-text-xs);color:var(--roxy-muted);text-transform:uppercase;letter-spacing:.06em">Key aspects</h3><ul style="margin:0;padding-left:1rem;font-size:var(--roxy-text-sm)">${u.slice(0,6).map(P=>L.html`<li>${ga(P)}</li>`)}</ul></div>`:L.nothing}</article>`}};ke.styles=[y,L.css`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);grid-template-columns:1fr auto;display:grid}.head h2{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.score{font-variant-numeric:tabular-nums;font-size:2rem;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);line-height:1}.rating{color:var(--roxy-secondary,#475569);font-size:var(--roxy-text-sm,.875rem)}.bar-row{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:8rem 1fr 3.5rem;align-items:center;display:grid}.bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:8px;overflow:hidden}.bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.bar-row>span:last-child{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a);text-align:right}.archetype{color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.lists{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.lists h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.lists ul{padding-left:var(--roxy-space-md,1rem);margin:0}`],d([(0,$r.property)({attribute:!1})],ke.prototype,"data",2),d([(0,$r.property)({type:String,reflect:!0})],ke.prototype,"mode",2),ke=d([(0,$r.customElement)("roxy-compatibility-card")],ke);function ga(o){let n=o.type.toLowerCase().replace(/_/g,"-"),e=typeof o.orb=="number"?` (orb ${v(o.orb,1)}\xB0)`:"",r=[o.planet1,n,o.planet2].filter(Boolean).join(" ");return o.description?`${r}${e} \xB7 ${o.description}`:`${r}${e}`}var w=require("lit"),wr=require("lit/decorators.js");var Se=class extends w.LitElement{constructor(){super();this.data=null;this.period="current";new h(this)}render(){let e=this.data;if(!e)return w.html`<div class="roxy-empty" role="status">No dasha data</div>`;let r=this.collectPeriods(e),t=r.length?Math.max(...r.map(a=>a.durationYears)):0;return w.html`<div class="wrap" aria-label="Dasha timeline"><header class="head"><h2 class="title">${this.period==="major"?"Vimshottari Mahadasha":this.period==="sub"?"Antardasha":"Active dashas"}</h2>${"nakshatraName"in e&&e.nakshatraName?w.html`<div class="nakshatra">Moon nakshatra: ${e.nakshatraName} ${"nakshatraLord"in e&&e.nakshatraLord?w.html`(lord ${e.nakshatraLord})`:w.nothing}</div>`:w.nothing}</header>${this.renderBirthBalance(e)} ${this.period==="current"?this.renderCurrent(e):w.nothing} ${r.length>0?w.html`<div class="timeline" role="list">${r.map(a=>this.renderBar(a,t))}</div>`:w.nothing} ${this.renderActiveInterpretation(r)}</div>`}renderBirthBalance(e){if(!("birthDashaBalance"in e)||!e.birthDashaBalance)return w.nothing;let r=e.birthDashaBalance,t="nakshatraLord"in e&&e.nakshatraLord?e.nakshatraLord:"",a=r.years??0,s=r.months??0,i=r.days??0,l=[];a&&l.push(`${a}y`),s&&l.push(`${s}m`),i&&l.push(`${i}d`);let c=l.length?l.join(" "):"0d";return w.html`<p class="balance">Birth dasha balance: ${c} of ${t?w.html`<strong>${t}</strong>`:"the opening mahadasha"} remained at birth.</p>`}renderActiveInterpretation(e){let r=e.find(t=>this.isCurrent(t));return r?.interpretation?w.html`<div class="interp"><h3>${r.planet} mahadasha</h3><p>${r.interpretation}</p></div>`:w.nothing}renderCurrent(e){return"mahadasha"in e?w.html`<div class="current">${"mahadasha"in e&&e.mahadasha?w.html`<div><span>Mahadasha</span> <strong>${e.mahadasha.planet}</strong> ${"remainingInMahadasha"in e&&e.remainingInMahadasha?w.html`<small>${v(e.remainingInMahadasha.years+e.remainingInMahadasha.months/12,1)} years left</small>`:w.nothing}</div>`:w.nothing} ${"antardasha"in e&&e.antardasha?w.html`<div><span>Antardasha</span> <strong>${e.antardasha.planet}</strong> ${"remainingInAntardasha"in e&&e.remainingInAntardasha?w.html`<small>${v(e.remainingInAntardasha.years+e.remainingInAntardasha.months/12,1)} years left</small>`:w.nothing}</div>`:w.nothing} ${"pratyantardasha"in e&&e.pratyantardasha?w.html`<div><span>Pratyantardasha</span> <strong>${e.pratyantardasha.planet}</strong> ${"remainingInPratyantardasha"in e&&e.remainingInPratyantardasha?w.html`<small>${v(e.remainingInPratyantardasha.years+e.remainingInPratyantardasha.months/12,1)} years left</small>`:w.nothing}</div>`:w.nothing}</div>`:w.nothing}collectPeriods(e){return"mahadashas"in e&&e.mahadashas?.length?e.mahadashas:"antardashas"in e&&e.antardashas?.length?e.antardashas:[]}isCurrent(e){if(!e.startDate||!e.endDate)return!1;let r=Date.now(),t=Date.parse(e.startDate),a=Date.parse(e.endDate);return Number.isNaN(t)||Number.isNaN(a)?!1:r>=t&&r<a}progressIn(e){if(!e.startDate||!e.endDate)return-1;let r=Date.parse(e.startDate),t=Date.parse(e.endDate),a=Date.now();return Number.isNaN(r)||Number.isNaN(t)||a<r||a>=t||t<=r?-1:(a-r)/(t-r)}renderBar(e,r){let t=e.durationYears,a=r>0?t/r*100:0,s=this.isCurrent(e),i=s?this.progressIn(e):-1,l=s?"bar-track bar-now":"bar-track";return w.html`<div class="${s?"bar now":"bar"}" role="listitem" aria-current="${s?"time":"false"}"><span><strong>${e.planet}</strong>${s?w.html`<span class="now-badge">Now</span>`:w.nothing} </span><span class="${l}"><span class="bar-fill" style="width:${a}%"></span> ${i>=0?w.html`<span class="bar-progress" style="left:${i*a}%" aria-hidden="true"></span>`:w.nothing} </span><span class="dates">${e.startDate?Ot(e.startDate):""} ${e.endDate?w.html`- ${Ot(e.endDate)}`:""}</span></div>`}};Se.styles=[y,w.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.nakshatra{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.current{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);grid-template-columns:repeat(auto-fit,minmax(10rem,1fr));display:grid}.current div span:first-child{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.current div strong{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a)}.balance{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);border-left:2px solid var(--roxy-border,#e4e4e7);padding-left:var(--roxy-space-sm,.5rem);margin:0}.timeline{gap:var(--roxy-space-xs,.25rem);display:grid}.bar{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:5rem 1fr 8rem;align-items:center;display:grid}.bar.now strong{color:var(--roxy-accent-ink,#b45309)}.now-badge{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);text-transform:uppercase;letter-spacing:.06em;margin-left:.4em;display:inline-block}.bar-track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:14px;position:relative;overflow:hidden}.bar-fill{background:var(--roxy-accent,#f59e0b);opacity:.45;height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.bar-now .bar-fill{opacity:1}.bar-progress{background:var(--roxy-accent-ink,#b45309);width:2px;box-shadow:0 0 0 2px color-mix(in srgb, var(--roxy-accent,#f59e0b) 35%, transparent);border-radius:2px;position:absolute;top:-2px;bottom:-2px}.dates{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;text-align:right}.interp{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff)}.interp h3{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);margin:0}.interp p{margin:var(--roxy-space-sm,.5rem) 0 0;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}`],d([(0,wr.property)({attribute:!1})],Se.prototype,"data",2),d([(0,wr.property)({type:String,reflect:!0})],Se.prototype,"period",2),Se=d([(0,wr.customElement)("roxy-dasha-timeline")],Se);function Ot(o){let n=o.match(/^(\d{4})/);return n?n[1]:o}var N=require("lit"),kr=require("lit/decorators.js");var ya=["title","name","label","heading","overview","summary"],ua=["imageUrl","image","icon","symbol"],ha=["imageUrl","image"],xa=6,Ce=class extends N.LitElement{constructor(){super();this.data=null;this.depth=0;new h(this)}render(){return this.data==null?N.html`<div class="roxy-empty" role="status">No data</div>`:this.depth>=xa?N.html`<div class="roxy-empty" role="status">…</div>`:N.html`<div class="roxy-card" aria-label="Generic data display">${this.renderValue(this.data)}</div>`}renderValue(e){return e==null?N.nothing:typeof e=="string"?N.html`<p>${e}</p>`:typeof e=="number"||typeof e=="boolean"?N.html`<p>${String(e)}</p>`:Array.isArray(e)?this.renderArray(e):this.renderObject(e)}renderArray(e){return e.length===0?N.html`<div class="roxy-empty" role="status">Empty list</div>`:e.every(a=>a===null||["string","number","boolean"].includes(typeof a))?N.html`<ul class="roxy-chips">${e.map(a=>N.html`<li>${String(a)}</li>`)}</ul>`:e.every(a=>a!==null&&typeof a=="object"&&!Array.isArray(a))?this.renderTable(e):N.html`<ol>${e.map(a=>N.html`<li>${this.renderValue(a)}</li>`)}</ol>`}renderTable(e){let r=this.collectKeys(e);return N.html`<table class="roxy-table" role="table"><thead><tr>${r.map(t=>N.html`<th>${ye(t)}</th>`)}</tr></thead><tbody>${e.map(t=>N.html`<tr>${r.map(a=>N.html`<td>${this.formatPrimitive(t[a])}</td>`)}</tr>`)}</tbody></table>`}renderObject(e){let r=ya.find(i=>typeof e[i]=="string"),t=ua.find(i=>typeof e[i]=="string"&&e[i].startsWith("http")),a=r!=="summary"&&typeof e.summary=="string"?"summary":null,s=Object.entries(e).filter(([i,l])=>i!==r&&i!==a&&!ha.includes(i)&&l!==null&&l!==void 0);return N.html`${t?N.html`<img class="roxy-image" src="${String(e[t])}" alt="${r?String(e[r]):"illustration"}" loading="lazy">`:N.nothing} ${r?N.html`<h3 class="roxy-title">${e[r]}</h3>`:N.nothing} ${a?N.html`<p class="roxy-summary">${e[a]}</p>`:N.nothing} ${s.length>0?N.html`<dl class="roxy-rows">${s.map(([i,l])=>N.html`<dt>${ye(i)}</dt><dd>${this.renderField(l)}</dd>`)}</dl>`:N.nothing}`}renderField(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)&&e.every(t=>["string","number","boolean"].includes(typeof t))?N.html`<ul class="roxy-chips">${e.map(t=>N.html`<li>${String(t)}</li>`)}</ul>`:N.html`<roxy-data .data="${e}" .depth="${this.depth+1}"></roxy-data>`}formatPrimitive(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)?e.map(String).join(", "):JSON.stringify(e)}collectKeys(e){let r=new Set;for(let t of e)for(let a of Object.keys(t))r.add(a);return Array.from(r)}};Ce.styles=[y,N.css`.roxy-card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm)}.roxy-title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-sm,.5rem) 0;color:var(--roxy-primary,#0f172a);letter-spacing:var(--roxy-tracking-tight)}.roxy-summary{color:var(--roxy-secondary,#475569);margin:0 0 var(--roxy-space-md,1rem) 0;font-size:var(--roxy-text-sm,.875rem)}dl.roxy-rows{gap:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);grid-template-columns:minmax(8ch,max-content) 1fr;margin:0;display:grid}dl.roxy-rows dt{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);text-transform:capitalize}dl.roxy-rows dd{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);word-break:break-word;margin:0}ul.roxy-chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;margin:0;padding:0;list-style:none;display:flex}ul.roxy-chips li{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}table.roxy-table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}table.roxy-table th,table.roxy-table td{border-bottom:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem);text-align:left;text-transform:none}table.roxy-table th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}.roxy-image{border-radius:var(--roxy-radius-md,8px);max-width:100%;height:auto;margin-bottom:var(--roxy-space-md,1rem)}.roxy-section{margin-bottom:var(--roxy-space-md,1rem)}.roxy-section h4{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569);margin:0 0 var(--roxy-space-xs,.25rem) 0;text-transform:capitalize}`],d([(0,kr.property)({attribute:!1})],Ce.prototype,"data",2),d([(0,kr.property)({attribute:!1})],Ce.prototype,"depth",2),Ce=d([(0,kr.customElement)("roxy-data")],Ce);var ne=require("lit"),Sr=require("lit/decorators.js");var S=require("lit");function xe(o){let n=o%360;return n<0?n+360:n}function fe(o){let n=xe(o),e=Math.floor(n/30)%12,r=n%30,t=Math.floor(r),a=(r-t)*60,s=Math.floor(a),i=Math.round((a-s)*60);return{sign:Q[e]??"Aries",signIndex:e,degree:t,minute:s,second:i}}function Vr(o){let{sign:n,degree:e,minute:r}=fe(o);return`${e}\xB0 ${n} ${String(r).padStart(2,"0")}'`}function ut(o){return xe(o+180)}function Ht(o,n){let e=xe(o),r=xe(n)-e;return r<0&&(r+=360),xe(e+r/2)}function G(o,n,e,r){let t=r*Math.PI/180;return{x:o+e*Math.cos(t),y:n+e*Math.sin(t)}}var ar=require("lit"),Ke=ar.css`.roxy-tablist{border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.roxy-tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);transition:color var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.roxy-tab[aria-selected=true]{color:var(--roxy-accent-ink,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.roxy-tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}.roxy-tab:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-radius:4px}`;function lr(o){let{items:n,active:e,onSelect:r,label:t,idPrefix:a,controls:s=!1}=o;return ar.html`<div class="roxy-tablist" role="tablist" aria-label="${t}" @keydown="${l=>{if(l.key!=="ArrowRight"&&l.key!=="ArrowLeft")return;l.preventDefault();let c=n.findIndex(P=>P.id===e);if(c===-1)return;let m=l.key==="ArrowRight"?1:-1,p=n[(c+m+n.length)%n.length];if(!p)return;r(p.id);let u=l.currentTarget.getRootNode();requestAnimationFrame(()=>{u.querySelector(`#${a}-tab-${p.id}`)?.focus()})}}">${n.map(l=>ar.html`<button type="button" class="roxy-tab" role="tab" id="${a}-tab-${l.id}" aria-selected="${e===l.id?"true":"false"}" aria-controls="${s&&e===l.id?`${a}-panel-${l.id}`:ar.nothing}" tabindex="${e===l.id?"0":"-1"}" @click="${()=>r(l.id)}">${l.label}</button>`)}</div>`}var ue=400,O=20,te=ue-2*O,F=ue/2,fa=Object.fromEntries(Q.map(o=>[o.toLowerCase(),o])),ba=[{id:"north",label:"North"},{id:"south",label:"South"},{id:"east",label:"East"}],va="\u02B3";function It(o,n){return typeof o.longitude!="number"||!Number.isFinite(o.longitude)?!1:fe(o.longitude).sign.toLowerCase()!==n.toLowerCase()}function $a(o,n){let e=Ct[b(o.graha)]??o.graha.slice(0,2),r=o.isRetrograde?va:"";if(typeof o.longitude!="number"||!Number.isFinite(o.longitude)||It(o,n))return`${e}${r}`;let{degree:t}=fe(o.longitude);return`${e} ${t}\xB0${r}`}function wa(o,n){let e=[b(o.graha)],r=It(o,n);if(r&&e.push(`in ${n}`),typeof o.longitude=="number"&&Number.isFinite(o.longitude)){let t=fe(o.longitude),a=String(t.minute).padStart(2,"0");e.push(r?`D1: ${t.degree}\xB0${a}' ${t.sign}`:`${t.degree}\xB0${a}' ${t.sign}`)}if(o.nakshatra?.name){let t=o.nakshatra.pada?` pada ${o.nakshatra.pada}`:"";e.push(`${o.nakshatra.name}${t}`)}return o.awastha&&e.push(o.awastha),o.isRetrograde&&e.push("retrograde"),e.join(" \xB7 ")}function ht(o,n,e,r,t){let a=r-(o.length-1)*t/2;return o.map((s,i)=>{let l=a+i*t;return S.svg`<text class="planet-text" x=${e} y=${l} text-anchor="middle" dominant-baseline="central">${$a(s,n)}<title>${wa(s,n)}</title></text>`})}function Ur(o,n){let e={};for(let t of Q)e[t.toLowerCase()]=[];let r="";for(let[t,a]of Object.entries(o??{})){let s=(a?.rashi??"").toLowerCase();if(t==="Lagna"||a?.graha==="Lagna"){r=fa[s]??"";continue}!s||!(s in e)||e[s]?.push({graha:a.graha??t,longitude:a.longitude,nakshatra:a.nakshatra,isRetrograde:a.isRetrograde,awastha:a.awastha})}return{lagnaSign:r,placements:e,divisionLabel:n}}var sr=te/4,ka={Pisces:{col:0,row:0},Aries:{col:1,row:0},Taurus:{col:2,row:0},Gemini:{col:3,row:0},Cancer:{col:3,row:1},Leo:{col:3,row:2},Virgo:{col:3,row:3},Libra:{col:2,row:3},Scorpio:{col:1,row:3},Sagittarius:{col:0,row:3},Capricorn:{col:0,row:2},Aquarius:{col:0,row:1}};function Sa(o){let n=ka[o]??{col:0,row:0};return{x:O+n.col*sr,y:O+n.row*sr,w:sr,h:sr}}function Ca(o){let n=O,e=O+sr,r=O+2*sr,t=O+3*sr,a=ue-O;return S.svg`
|
|
11
|
-
<rect class="line" x=${
|
|
12
|
-
<line class="line" x1=${
|
|
13
|
-
<line class="line" x1=${
|
|
14
|
-
<line class="line" x1=${e} y1=${
|
|
15
|
-
<line class="line" x1=${t} y1=${
|
|
16
|
-
<line class="line" x1=${
|
|
17
|
-
<line class="line" x1=${t} y1=${r} x2=${
|
|
18
|
-
<line class="line" x1=${r} y1=${
|
|
19
|
-
<line class="line" x1=${r} y1=${t} x2=${r} y2=${
|
|
20
|
-
${
|
|
21
|
-
`}function
|
|
1
|
+
"use strict";var Zr=Object.defineProperty;var Xa=Object.getOwnPropertyDescriptor;var Wt=Object.getOwnPropertyNames;var Jt=Object.prototype.hasOwnProperty;var Xt=(n,a)=>{for(var e in a)Zr(n,e,{get:a[e],enumerable:!0})},Zt=(n,a,e,r)=>{if(a&&typeof a=="object"||typeof a=="function")for(let t of Wt(a))!Jt.call(n,t)&&t!==e&&Zr(n,t,{get:()=>a[t],enumerable:!(r=Xa(a,t))||r.enumerable});return n};var Qt=n=>Zt(Zr({},"__esModule",{value:!0}),n),d=(n,a,e,r)=>{for(var t=r>1?void 0:r?Xa(a,e):a,s=n.length-1,o;s>=0;s--)(o=n[s])&&(t=(r?o(a,e,t):o(t))||t);return r&&t&&Zr(a,e,t),t};var lo={};Xt(lo,{ROXY_COMPONENTS:()=>Na,ROXY_UI_COMPONENTS:()=>io,ROXY_UI_VERSION:()=>Ut,RoxyAngelNumberCard:()=>cr,RoxyAngelNumberLookup:()=>pr,RoxyAshtakavargaGrid:()=>Ie,RoxyAspectsTable:()=>yr,RoxyBiorhythmChart:()=>_e,RoxyBodygraph:()=>xr,RoxyChoghadiyaGrid:()=>hr,RoxyCompatibilityCard:()=>Fe,RoxyCrystalCard:()=>fr,RoxyCrystalGrid:()=>qe,RoxyDashaTimeline:()=>Ve,RoxyData:()=>Ye,RoxyDivisionalChart:()=>We,RoxyDoshaCard:()=>Je,RoxyDreamCard:()=>$r,RoxyDreamSearch:()=>wr,RoxyEndpointForm:()=>ce,RoxyForecastDigest:()=>kr,RoxyForecastTimeline:()=>Sr,RoxyGunaMilan:()=>Rr,RoxyHdConnection:()=>Cr,RoxyHdPenta:()=>Tr,RoxyHdVariables:()=>Er,RoxyHexagram:()=>Xe,RoxyHoraTable:()=>Dr,RoxyHoroscopeCard:()=>Ze,RoxyKpChart:()=>Qe,RoxyKpPlanetsTable:()=>Pr,RoxyKpRulingPlanets:()=>zr,RoxyLocationSearch:()=>ie,RoxyMoonPhase:()=>er,RoxyNakshatraCard:()=>Ar,RoxyNatalChart:()=>je,RoxyNumerologyCard:()=>rr,RoxyPanchangTable:()=>ar,RoxyReferenceCard:()=>Nr,RoxyShadbalaTable:()=>Lr,RoxySynastryChart:()=>Mr,RoxyTarotCard:()=>tr,RoxyTarotCatalog:()=>sr,RoxyTarotSpread:()=>nr,RoxyTransitsTable:()=>ir,RoxyVedicAspects:()=>Gr,RoxyVedicKundli:()=>Ge,RoxyVedicPlanetsTable:()=>Hr,RoxyWesternPlanetsTable:()=>Or,RoxyYogaList:()=>lr,roxyDataScript:()=>rt,serializeRoxyData:()=>La});module.exports=Qt(lo);var G=require("lit"),tt=require("lit/decorators.js");var es=[{key:"spiritual",label:"Spiritual"},{key:"love",label:"Love"},{key:"career",label:"Career"},{key:"money",label:"Money"},{key:"twinFlame",label:"Twin flame"}];function Qr(n,a,e){let r=[];if(n)for(let t of es){let s=n[t.key];s&&r.push({label:t.label,body:s})}return a&&r.push({label:"Biblical",body:a}),e&&r.push({label:"Shadow",body:e}),r}var Be=require("lit"),Se=require("lit/decorators.js"),at=require("lit/directives/if-defined.js");var Za=require("lit"),g=Za.css`:host{font-family:var(--roxy-font-sans,system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-base,1rem);line-height:var(--roxy-leading-normal,1.5);animation:roxy-fade-in var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1)) both;background:0 0;display:block;container-type:inline-size}:host([bare]){--roxy-surface:transparent;--roxy-shadow-sm:none;--roxy-shadow-md:none}*,:before,:after{box-sizing:border-box}@keyframes roxy-fade-in{0%{opacity:0;transform:translateY(2px)}to{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion:reduce){:host{animation:none}}.roxy-skeleton{background:linear-gradient(90deg, var(--roxy-border,#e4e4e7) 0%, color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent) 50%, var(--roxy-border,#e4e4e7) 100%);border-radius:var(--roxy-radius-md,8px);background-size:200% 100%;animation:1.4s ease-in-out infinite roxy-shimmer}@keyframes roxy-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}@media (prefers-reduced-motion:reduce){.roxy-skeleton{animation:none}}.roxy-empty{padding:var(--roxy-space-lg,1.5rem);color:var(--roxy-muted,#71717a);text-align:center;font-size:var(--roxy-text-sm,.875rem)}.roxy-error{gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-lg,1.5rem);background:var(--roxy-surface,#fff);border:1px solid var(--roxy-danger,#dc2626);border-radius:var(--roxy-radius-md,8px);color:var(--roxy-danger-fg,#991b1b);font-size:var(--roxy-text-sm,.875rem);justify-items:start;display:grid}.roxy-surface{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a)}:host(:focus-within) .roxy-card{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}:host{font-variant-emoji:text}`;var rs="https://roxyapi.com/api/v2",ea=class{constructor(a){this.baseUrl=rs;this.host=a,a.addController(this)}hostDisconnected(){this.abort?.abort(),this.abort=void 0}async run(a){if(!this.submitUrl&&this.secretKeyRefused())return;this.abort?.abort();let e=new AbortController;this.abort=e,this.host.loading=!0,this.host.error=null;try{let r=this.submitUrl?await fetch(this.submitUrl,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(a),signal:e.signal}):await this.callApi(a,e.signal);if(!r.ok)throw new Error(await this.readError(r));let t=await r.json();if(e.signal.aborted)return;this.host.data=t}catch(r){if(r?.name==="AbortError")return;this.host.error=r instanceof Error?r.message:String(r)}finally{this.abort===e&&(this.abort=void 0),e.signal.aborted||(this.host.loading=!1)}}callApi(a,e){let r=new URL(`${this.baseUrl}${a.path}`);for(let[s,o]of Object.entries(a.query??{}))o!=null&&r.searchParams.set(s,String(o));let t={Accept:"application/json"};return this.publishableKey&&(t["X-API-Key"]=this.publishableKey),a.body!=null&&(t["Content-Type"]="application/json"),fetch(r,{method:a.method??"GET",headers:t,body:a.body!=null?JSON.stringify(a.body):void 0,signal:e})}secretKeyRefused(){let a=this.publishableKey;return!a||a.startsWith("pk_")?!1:(this.host.error="Client-side components accept a pk_ publishable key only. Use a publishable key with an origin allowlist, or render server-side.",this.host.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{reason:"possible-secret-key"},bubbles:!0,composed:!0})),!0)}async readError(a){try{let e=await a.json();if(e?.error)return e.error}catch{}return`Request failed (${a.status})`}};function Qa(n,a,e){let r={...e},t=`/${n.replace(/^\//,"")}`.replace(/\{([^}]+)\}/g,(i,l)=>{let c=r[l];return delete r[l],encodeURIComponent(String(c??""))}),s={},o={};for(let[i,l]of Object.entries(r))l===void 0||l===""||(a==="GET"?s[i]=l:o[i]=l);return{path:t,method:a,query:s,body:a==="POST"?o:void 0}}var et="roxy-data";function La(n){return JSON.stringify(n).replace(/</g,"\\u003c").replace(/>/g,"\\u003e").replace(/&/g,"\\u0026").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}function rt(n){return`<script type="application/json" class="${et}">${La(n)}</script>`}function as(n){return n.nodeName==="SCRIPT"&&n.getAttribute("type")==="application/json"}var ra=class{constructor(a){this.host=a,a.addController(this)}hostConnected(){if(this.host.data!=null)return;let a=this.read();a!==void 0&&(this.host.data=a,this.host.requestUpdate())}read(){let a=this.findInlineScript();return a?this.parse(a.textContent):void 0}findInlineScript(){for(let a of Array.from(this.host.children))if(as(a)&&a.classList.contains(et))return a;return null}parse(a){if(a?.trim())try{return JSON.parse(a)}catch{return}}};var m=class extends Be.LitElement{constructor(){super();this.data=null;this.endpoint="";this.method="POST";this.remember=!1;this.loading=!1;this.error=null;this.onFormSubmit=e=>{let r=e.detail;this.remember&&this.writeRemembered(r.values),this.fetcher.run(Qa(this.endpoint,this.method,r.values))};new ra(this),this.fetcher=new ea(this)}static{this.styles=[g]}willUpdate(e){e.has("publishableKey")&&(this.fetcher.publishableKey=this.publishableKey),e.has("baseUrl")&&this.baseUrl&&(this.fetcher.baseUrl=this.baseUrl),e.has("submitUrl")&&(this.fetcher.submitUrl=this.submitUrl)}render(){return this.loading?this.renderLoading():this.error!=null?this.renderError(this.error):this.data!=null?this.renderData(this.data):this.renderNoData()}renderNoData(){return this.endpoint?this.renderForm():this.renderEmpty()}renderForm(){return Be.html`<roxy-endpoint-form data-endpoint="${this.endpoint}" method="${this.method}" spec-url="${(0,at.ifDefined)(this.specUrl)}" .initialValues="${this.remember?this.readRemembered():void 0}" @roxy-submit="${this.onFormSubmit}"></roxy-endpoint-form>`}rememberKey(){return`roxy-ui:form:${this.endpoint}`}readRemembered(){try{let e=sessionStorage.getItem(this.rememberKey());return e?JSON.parse(e):void 0}catch{return}}writeRemembered(e){try{sessionStorage.setItem(this.rememberKey(),JSON.stringify(e))}catch{}}renderEmpty(){return Be.html`<div class="roxy-empty" role="status">No data</div>`}renderLoading(){return Be.html`<div class="roxy-skeleton" style="height:8rem" role="status" aria-label="Loading"></div>`}renderError(e){let r=Be.html`<div class="roxy-error" role="alert">${e}</div>`;return this.endpoint?Be.html`${r}${this.renderForm()}`:r}};d([(0,Se.property)({attribute:!1})],m.prototype,"data",2),d([(0,Se.property)({type:String,attribute:"data-endpoint"})],m.prototype,"endpoint",2),d([(0,Se.property)({type:String})],m.prototype,"method",2),d([(0,Se.property)({type:String,attribute:"publishable-key"})],m.prototype,"publishableKey",2),d([(0,Se.property)({type:String,attribute:"base-url"})],m.prototype,"baseUrl",2),d([(0,Se.property)({type:String,attribute:"spec-url"})],m.prototype,"specUrl",2),d([(0,Se.property)({type:String,attribute:"submit-url"})],m.prototype,"submitUrl",2),d([(0,Se.property)({type:Boolean})],m.prototype,"remember",2),d([(0,Se.state)()],m.prototype,"loading",2),d([(0,Se.state)()],m.prototype,"error",2);var cr=class extends m{renderData(a){let e=(a.energy??"").toLowerCase(),r=e==="positive"||e==="cautionary"||e==="neutral"?e:"",t=a.keywords??[],s=a.actionSteps??[];return G.html`<article class="card" aria-label="${`Angel number ${a.number??""}`}"><div class="hero">${a.number?G.html`<div class="numeral">${a.number}</div>`:G.nothing}<div><p class="label">Angel number</p>${a.title?G.html`<h2 class="title">${a.title}</h2>`:G.nothing}</div></div>${a.coreMessage?G.html`<p class="core">${a.coreMessage}</p>`:G.nothing}<div class="badges">${a.type?G.html`<span class="badge">${a.type}</span>`:G.nothing} ${typeof a.digitRoot=="number"?G.html`<span class="badge">Digit root ${a.digitRoot}</span>`:G.nothing} ${a.energy?G.html`<span class="${`badge ${r}`}">${a.energy}</span>`:G.nothing}</div>${t.length>0?G.html`<div class="chips">${t.map(o=>G.html`<span>${o}</span>`)}</div>`:G.nothing} ${this.renderSections(a)} ${a.affirmation?G.html`<p class="affirmation">${a.affirmation}</p>`:G.nothing} ${s.length>0?G.html`<div class="steps"><h3>Action steps</h3><ul>${s.map(o=>G.html`<li>${o}</li>`)}</ul></div>`:G.nothing}</article>`}renderEmpty(){return G.html`<div class="roxy-empty" role="status">No angel number</div>`}renderSections(a){let e=Qr(a.meaning,a.biblical,a.shadow);return e.length===0?G.nothing:G.html`<div class="sections">${e.map((r,t)=>G.html`<details name="angel-meaning" ?open="${t===0}"><summary>${r.label}</summary><p>${r.body}</p></details>`)}</div>`}};cr.styles=[g,G.css`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.numeral{font-size:3rem;line-height:1;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.core{color:var(--roxy-fg,#0a0a0a);margin:0;line-height:1.6}.badges{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.badge{align-items:center;gap:var(--roxy-space-xs,.25rem);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 35%, transparent);color:var(--roxy-fg,#0a0a0a);text-transform:capitalize;padding:3px 10px;display:inline-flex}.badge.positive{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.badge.cautionary{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.badge.neutral{background:color-mix(in srgb, var(--roxy-info,#0284c7) 16%, transparent);color:var(--roxy-info-fg,#075985)}.chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.sections{gap:var(--roxy-space-xs,.25rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);display:grid}details{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-sm,4px);overflow:hidden}summary{cursor:pointer;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem);list-style-position:inside}details p{padding:0 var(--roxy-space-md,1rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0;line-height:1.6}.affirmation{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 12%, transparent);border-left:3px solid var(--roxy-accent,#f59e0b);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-radius:var(--roxy-radius-sm,4px);color:var(--roxy-fg,#0a0a0a);margin:0;font-style:italic}.steps h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.steps ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);gap:2px;margin:0;display:grid}`],cr=d([(0,tt.customElement)("roxy-angel-number-card")],cr);var $=require("lit"),st=require("lit/decorators.js");var pr=class extends m{renderEmpty(){return $.html`<div class="roxy-empty" role="status">No number analysis</div>`}renderData(a){let e=a.knownMeaning,r=a.digitRootMeaning,t=e?.title??"Number analysis";return $.html`<article class="card" aria-label="${`Number ${a.number??""}`}"><div class="hero">${a.number?$.html`<div class="numeral">${a.number}</div>`:$.nothing}<div><p class="label">Number analysis</p><h2 class="title">${t}</h2></div></div><div class="badges">${a.type?$.html`<span class="badge">${a.type}</span>`:$.nothing} ${typeof a.digits=="number"?$.html`<span class="badge">${a.digits} digits</span>`:$.nothing} ${typeof a.uniqueDigits=="number"?$.html`<span class="badge">${a.uniqueDigits} unique</span>`:$.nothing} ${typeof a.digitRoot=="number"?$.html`<span class="badge">Digit root ${a.digitRoot}</span>`:$.nothing} ${a.isPalindrome?$.html`<span class="badge flag">Palindrome</span>`:$.nothing} ${a.isRepeating?$.html`<span class="badge flag">Repeating</span>`:$.nothing}</div>${e?$.html`<div class="section"><p class="label">Known angel number</p>${e.coreMessage?$.html`<p>${e.coreMessage}</p>`:$.nothing} ${e.keywords&&e.keywords.length>0?$.html`<div class="chips">${e.keywords.map(s=>$.html`<span>${s}</span>`)}</div>`:$.nothing} ${this.renderMeaning(e.meaning,e.biblical,e.shadow)} ${e.affirmation?$.html`<p><em>${e.affirmation}</em></p>`:$.nothing}</div>`:$.nothing} ${r?$.html`<div class="section"><p class="label">Foundational digit root${r.number?` (${r.number})`:""}</p>${r.title?$.html`<h3>${r.title}</h3>`:$.nothing} ${r.coreMessage?$.html`<p>${r.coreMessage}</p>`:$.nothing} ${e?$.nothing:this.renderRootMeaning(r)}</div>`:$.nothing}</article>`}renderMeaning(a,e,r){let t=Qr(a,e,r);return t.length===0?$.nothing:$.html`${t.map((s,o)=>$.html`<details name="lookup-meaning" ?open="${o===0}"><summary>${s.label}</summary><p>${s.body}</p></details>`)}`}renderRootMeaning(a){return $.html`${a.keywords&&a.keywords.length>0?$.html`<div class="chips">${a.keywords.map(e=>$.html`<span>${e}</span>`)}</div>`:$.nothing}${this.renderMeaning(a.meaning)}${a.affirmation?$.html`<p><em>${a.affirmation}</em></p>`:$.nothing}`}};pr.styles=[g,$.css`.card{background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.numeral{font-size:3rem;line-height:1;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.badges{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.badge{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 35%, transparent);color:var(--roxy-fg,#0a0a0a);text-transform:capitalize;align-items:center;padding:3px 10px;display:inline-flex}.badge.flag{background:color-mix(in srgb, var(--roxy-info,#0284c7) 16%, transparent);color:var(--roxy-info-fg,#075985)}.section{border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);gap:var(--roxy-space-sm,.5rem);display:grid}.section>.label{margin:0}.section h3{font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.section p{color:var(--roxy-fg,#0a0a0a);line-height:1.6;font-size:var(--roxy-text-sm,.875rem);margin:0}.chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}details{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-sm,4px);overflow:hidden}summary{cursor:pointer;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem);list-style-position:inside}details p{padding:0 var(--roxy-space-md,1rem) var(--roxy-space-md,1rem)}`],pr=d([(0,st.customElement)("roxy-angel-number-lookup")],pr);var re=require("lit"),ta=require("lit/decorators.js");var N={Sun:"\u2609",Moon:"\u263D",Mercury:"\u263F",Venus:"\u2640",Earth:"\u2641",Mars:"\u2642",Jupiter:"\u2643",Saturn:"\u2644",Uranus:"\u2645",Neptune:"\u2646",Pluto:"\u2647",Rahu:"\u260A",Ketu:"\u260B",Ascendant:"Asc",Lagna:"La",NorthNode:"\u260A",SouthNode:"\u260B","North node":"\u260A","South node":"\u260B",Chiron:"\u26B7",Lilith:"\u26B8","Black moon lilith":"\u26B8"},ot={Sun:"Su",Moon:"Mo",Mercury:"Me",Venus:"Ve",Mars:"Ma",Jupiter:"Ju",Saturn:"Sa",Uranus:"Ur",Neptune:"Ne",Pluto:"Pl",Rahu:"Ra",Ketu:"Ke",Ascendant:"Asc",Lagna:"La"},pe={Aries:"\u2648",Taurus:"\u2649",Gemini:"\u264A",Cancer:"\u264B",Leo:"\u264C",Virgo:"\u264D",Libra:"\u264E",Scorpio:"\u264F",Sagittarius:"\u2650",Capricorn:"\u2651",Aquarius:"\u2652",Pisces:"\u2653"},aa={Aries:"Ar",Taurus:"Ta",Gemini:"Ge",Cancer:"Cn",Leo:"Le",Virgo:"Vi",Libra:"Li",Scorpio:"Sc",Sagittarius:"Sg",Capricorn:"Cp",Aquarius:"Aq",Pisces:"Pi"},te=["Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius","Pisces"],Po=te.map(n=>n.toLowerCase()),Yr={conjunction:"\u260C",opposition:"\u260D",trine:"\u25B3",square:"\u25A1",sextile:"\u2731",quincunx:"\u22BB",semisextile:"\u22BC"},Ma={heaven:"\u2630",lake:"\u2631",fire:"\u2632",thunder:"\u2633",wind:"\u2634",water:"\u2635",mountain:"\u2636",earth:"\u2637",Heaven:"\u2630",Lake:"\u2631",Fire:"\u2632",Thunder:"\u2633",Wind:"\u2634",Water:"\u2635",Mountain:"\u2636",Earth:"\u2637"},nt={"new moon":"\u{1F311}","waxing crescent":"\u{1F312}","first quarter":"\u{1F313}","waxing gibbous":"\u{1F314}","full moon":"\u{1F315}","waning gibbous":"\u{1F316}","last quarter":"\u{1F317}","waning crescent":"\u{1F318}"};var ts={sarva:"Sarvashtakavarga",bhinna:"Bhinnashtakavarga",pinda:"Shodhya Pinda"},mr=["sarva","bhinna","pinda"],Ie=class extends m{constructor(){super(...arguments);this.activeTab="sarva"}renderEmpty(){return re.html`<div class="roxy-empty" role="status">No ashtakavarga data</div>`}renderData(e){let r=e.signs??[];return re.html`<div class="wrap" aria-label="Ashtakavarga grid"><div class="head"><h2 class="title">Ashtakavarga</h2>${r.length?re.html`<p class="subtitle">${r.length} signs</p>`:re.nothing}</div><div class="tablist" role="tablist" aria-label="Ashtakavarga views" @keydown="${this.onTabKeyDown}">${mr.map(t=>re.html`<button class="tab" role="tab" id="tab-${t}" aria-selected="${this.activeTab===t?"true":"false"}" aria-controls="panel-${t}" tabindex="${this.activeTab===t?"0":"-1"}" @click="${()=>{this.activeTab=t}}">${ts[t]}</button>`)}</div><div id="panel-${this.activeTab}" role="tabpanel" aria-labelledby="tab-${this.activeTab}">${this.activeTab==="sarva"?this.renderSarva(r):this.activeTab==="bhinna"?this.renderBhinna(r):this.renderPinda()}</div></div>`}onTabKeyDown(e){let r=mr.indexOf(this.activeTab);e.key==="ArrowRight"?(e.preventDefault(),this.activeTab=mr[(r+1)%mr.length],this.focusActiveTab()):e.key==="ArrowLeft"&&(e.preventDefault(),this.activeTab=mr[(r-1+mr.length)%mr.length],this.focusActiveTab())}focusActiveTab(){requestAnimationFrame(()=>{this.shadowRoot?.querySelector(`#tab-${this.activeTab}`)?.focus()})}bhinnaHeat(e){return e<=1?"heat-1":e<=2?"heat-2":e<=3?"heat-3":e<=4?"heat-4":e<=5?"heat-5":e<=6?"heat-6":"heat-7"}sarvaHeat(e){return e<=18?"heat-1":e<=23?"heat-2":e<=28?"heat-3":e<=32?"heat-4":e<=37?"heat-5":e<=42?"heat-6":"heat-7"}renderSarva(e){let r=this.data.sarvashtakavarga;return r?re.html`<div class="overflow-scroll"><table aria-label="Sarvashtakavarga bindu counts per sign"><thead><tr><th scope="col">Sign</th><th scope="col">Bindus</th></tr></thead><tbody>${e.map((t,s)=>{let o=r.bindus[s]??0,i=this.sarvaHeat(o);return re.html`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${pe[t]??""}</span> ${t}</div></td><td class="${`heat-cell ${i}`}">${o}</td></tr>`})}</tbody><tfoot><tr class="total-row"><td>Total</td><td>${r.total}</td></tr></tfoot></table></div>`:re.html`<p class="roxy-empty">No sarvashtakavarga data</p>`}renderBhinna(e){let r=this.data.bhinnashtakavarga;return r?.length?re.html`<div class="overflow-scroll"><table class="bhinna-table" aria-label="Bhinnashtakavarga planet-by-sign grid"><thead><tr><th scope="col">Planet</th>${e.map(t=>re.html`<th scope="col" title="${t}">${pe[t]??t.slice(0,2)}</th>`)}<th scope="col">Total</th></tr></thead><tbody>${r.map(t=>re.html`<tr><td>${t.planet}</td>${t.bindus.map(s=>{let o=this.bhinnaHeat(s);return re.html`<td class="${`heat-cell ${o}`}">${s}</td>`})}<td>${t.total}</td></tr>`)}</tbody></table></div>`:re.html`<p class="roxy-empty">No bhinnashtakavarga data</p>`}renderPinda(){let e=this.data.shodhyaPinda;return e?.length?re.html`<div class="overflow-scroll"><table aria-label="Shodhya Pinda planet strength scores"><thead><tr><th scope="col">Planet</th><th scope="col">Rashi Pinda</th><th scope="col">Graha Pinda</th><th scope="col">Shodhya Pinda</th></tr></thead><tbody>${e.map(r=>re.html`<tr><td>${r.planet}</td><td>${r.rashiPinda}</td><td>${r.grahaPinda}</td><td>${r.shodhyaPinda}</td></tr>`)}</tbody></table></div>`:re.html`<p class="roxy-empty">No shodhya pinda data</p>`}};Ie.styles=[g,re.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.tablist{border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);transition:color var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.tab[aria-selected=true]{color:var(--roxy-accent-ink,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}.overflow-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:center}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td:first-child,th:first-child{text-align:left}.glyph{margin-right:3px;font-size:1.1em;line-height:1}.planet-cell{white-space:nowrap;align-items:center;gap:4px;display:flex}.total-row td{font-weight:var(--roxy-weight-bold,600);border-top:2px solid var(--roxy-border,#e4e4e7);border-bottom:none}.heat-cell{border-radius:var(--roxy-radius-sm,4px);font-weight:var(--roxy-weight-bold,600);font-variant-numeric:tabular-nums;min-width:2rem;color:var(--roxy-fg,currentColor)}.heat-1{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 6%, transparent)}.heat-2{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 14%, transparent)}.heat-3{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 26%, transparent)}.heat-4{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 40%, transparent)}.heat-5{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 55%, transparent)}.heat-6{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 72%, transparent)}.heat-7{background:color-mix(in srgb, var(--roxy-heat,#ef4444) 90%, transparent)}.bhinna-table th:first-child,.bhinna-table td:first-child{min-width:5rem}@container (width<=480px){.bhinna-table th,.bhinna-table td{font-size:var(--roxy-text-xs,.75rem);padding:.3rem .35rem}.bhinna-table th:first-child,.bhinna-table td:first-child{min-width:3.5rem}.heat-cell{min-width:1.5rem}}.overflow-scroll{-webkit-mask-image:linear-gradient(90deg,#0000 0,#000 .5rem calc(100% - 1rem),#0000 100%);mask-image:linear-gradient(90deg,#0000 0,#000 .5rem calc(100% - 1rem),#0000 100%)}`],d([(0,ta.state)()],Ie.prototype,"activeTab",2),Ie=d([(0,ta.customElement)("roxy-ashtakavarga-grid")],Ie);var v=require("lit"),lt=require("lit/decorators.js");var sa=require("lit");function Re(){return sa.html`<svg class="roxy-chevron" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"><path d="M4 6l4 4 4-4" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>`}var Ke=sa.css`summary{list-style:none}summary::-webkit-details-marker{display:none}.roxy-chevron{aspect-ratio:auto;width:14px;height:14px;color:var(--roxy-muted,#71717a);transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);flex-shrink:0}details[open]>summary .roxy-chevron{transform:rotate(180deg)}@media (prefers-reduced-motion:reduce){.roxy-chevron{transition:none}}`;function Ne(n){if(typeof n!="string"||n.length===0||/^\d{4}-\d{2}-\d{2}$/.test(n))return"";let e=/^\d{2}:\d{2}(:\d{2})?$/.test(n)?`1970-01-01T${n}`:n,r=new Date(e);return Number.isNaN(r.getTime())?n:r.toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit",hour12:!0})}function Ce(n){if(typeof n!="string"||n.length===0)return"";let a=new Date(/^\d{4}-\d{2}-\d{2}$/.test(n)?`${n}T00:00:00`:n);return Number.isNaN(a.getTime())?n:a.toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})}function Ga(n){if(!n)return"";let a=Ne(n.start),e=Ne(n.end);return a&&e?`${a} - ${e}`:a||e||""}function f(n,a=1){return typeof n!="number"||!Number.isFinite(n)?"":n.toFixed(a).replace(/\.?0+$/,"")}function it(n,a=1){let e=f(n,a);return e?`${e}%`:""}var gr={conjunction:"aspect-conjunction",sextile:"aspect-sextile",square:"aspect-square",trine:"aspect-trine",opposition:"aspect-opposition"};function jr(n){return(n.type??"").toLowerCase().replace(/_/g,"-")}function h(n){return n?n.charAt(0).toUpperCase()+n.slice(1).toLowerCase():""}function Y(n){return n.replace(/[_-]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").replace(/^\w/,a=>a.toUpperCase())}var yr=class extends m{renderEmpty(){return v.html`<div class="roxy-empty" role="status">No aspect data</div>`}renderData(a){let e="aspects"in a?a.aspects??[]:[],r="patterns"in a?a.patterns??[]:[],t="summary"in a?a.summary:void 0;return e.length===0&&r.length===0?this.renderEmpty():v.html`<div class="wrap" aria-label="Aspects"><div class="head"><h2 class="title">Aspects</h2>${e.length>0?v.html`<p class="subtitle">${e.length} aspects</p>`:v.nothing}</div>${t?this.renderSummary(t):v.nothing} ${e.length>0?v.html`<div role="list" aria-label="Aspect list">${e.map((s,o)=>this.renderAspect(s,o))}</div>`:v.nothing} ${r.length>0?v.html`<div><p class="section-label">Patterns</p>${r.map(s=>this.renderPattern(s))}</div>`:v.nothing}</div>`}renderSummary(a){let e="totalAspects"in a?a.totalAspects:a.total;return v.html`<div class="summary-pills" role="region" aria-label="Aspect summary">${typeof e=="number"?v.html`<span class="pill pill--muted">Total: ${e}</span>`:v.nothing} <span class="pill pill--success">Harmonious: ${a.harmonious}</span> <span class="pill pill--danger">Challenging: ${a.challenging}</span> <span class="pill pill--muted">Neutral: ${a.neutral}</span></div>`}renderAspect(a,e){let r=N[h(a.planet1)]??"",t=N[h(a.planet2)]??"",s=(a.interpretation??"neutral").toLowerCase(),o=(a.type??"").toLowerCase().replace(/_/g," "),i=a.isApplying?"Applying":"Separating",l="meaning"in a?a.meaning:void 0,c="transitInterpretation"in a?a.transitInterpretation:void 0,p=!!(l||c),y=v.html`<span aria-hidden="true" class="glyph">${r}</span>${a.planet1} <span class="nature-badge ${s}">${o}</span> <span aria-hidden="true" class="glyph">${t}</span>${a.planet2} <span class="meta">${i} · orb ${f(a.orb,2)}° · str ${f(a.strength,0)}</span>`;return p?v.html`<details class="aspect-card" role="listitem" name="aspects" ?open="${e===0}"><summary>${y}${Re()}</summary><div class="interp-body">${l?this.renderMeaning(l):v.nothing} ${c?this.renderTransit(c):v.nothing}</div></details>`:v.html`<div class="aspect-card" role="listitem"><div class="summary" style="cursor:default">${y}</div></div>`}renderMeaning(a){let e=a.description?.short??a.description?.long;return v.html`${e?v.html`<p>${e}</p>`:v.nothing} ${a.keywords?.length?v.html`<div class="interp-keywords">${a.keywords.map(r=>v.html`<span class="kw">${r}</span>`)}</div>`:v.nothing}`}renderTransit(a){return v.html`${a.summary?v.html`<p>${a.summary}</p>`:v.nothing} ${a.impact?v.html`<p><strong>Impact:</strong> ${a.impact}</p>`:v.nothing} ${a.timing?v.html`<p><strong>Timing:</strong> ${a.timing}</p>`:v.nothing} ${a.guidance?v.html`<p><strong>Guidance:</strong> ${a.guidance}</p>`:v.nothing} ${a.keywords?.length?v.html`<div class="interp-keywords">${a.keywords.map(e=>v.html`<span class="kw">${e}</span>`)}</div>`:v.nothing}`}renderPattern(a){let e=a.planets??[];return v.html`<div class="pattern"><div class="pattern-head"><span class="pattern-name">${a.name??a.kind??"Pattern"}</span> ${e.length?v.html`<span class="pattern-planets">${e.join(", ")}</span>`:v.nothing} ${typeof a.tightness=="number"?v.html`<span class="pattern-tight">${f(a.tightness,0)}% tight</span>`:v.nothing}</div>${a.interpretation?v.html`<p class="pattern-interp">${a.interpretation}</p>`:v.nothing}</div>`}};yr.styles=[g,Ke,v.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.summary-pills{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.pill{padding:2px var(--roxy-space-sm,.5rem);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);border:1px solid;align-items:center;gap:4px;display:inline-flex}.pill--muted{color:var(--roxy-fg,#0a0a0a);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent)}.pill--success{color:var(--roxy-success-fg,#166534);background:color-mix(in srgb, var(--roxy-success,#16a34a) 10%, transparent)}.pill--danger{color:var(--roxy-danger-fg,#991b1b);background:color-mix(in srgb, var(--roxy-danger,#dc2626) 10%, transparent)}.section-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem) 0}.aspect-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-xs,.25rem)}.aspect-card summary{cursor:pointer;color:var(--roxy-fg,#0a0a0a);flex-wrap:wrap;align-items:center;gap:.5em;font-weight:500;display:flex}.aspect-card summary .meta{color:var(--roxy-muted,#71717a);font-weight:400;font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;margin-left:auto}.interp-body{margin-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);line-height:1.45}.interp-body p{margin:0 0 var(--roxy-space-xs,.25rem)}.interp-keywords{flex-wrap:wrap;gap:.25rem;margin-top:.5rem;display:flex}.kw{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px}.glyph{font-size:1.1em;line-height:1}.nature-badge{font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize;border-radius:9999px;padding:1px 8px;font-weight:600;display:inline-block}.nature-badge.harmonious{background:color-mix(in srgb, var(--roxy-success,#16a34a) 12%, transparent);color:var(--roxy-success-fg,#166534)}.nature-badge.challenging{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);color:var(--roxy-danger-fg,#991b1b)}.nature-badge.neutral{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);color:var(--roxy-fg,#0a0a0a)}.pattern{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-xs,.25rem);gap:.35rem;display:grid}.pattern-head{flex-wrap:wrap;align-items:baseline;gap:.5rem;display:flex}.pattern-name{font-weight:var(--roxy-weight-bold,600)}.pattern-planets{color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem)}.pattern-tight{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;margin-left:auto}.pattern-interp{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);margin:0;line-height:1.45}`],yr=d([(0,lt.customElement)("roxy-aspects-table")],yr);var ee=require("lit"),oa=require("lit/decorators.js");var dt={physical:"#dc2626",emotional:"#0284c7",intellectual:"#16a34a",intuitive:"#a855f7",aesthetic:"#f59e0b",awareness:"#ec4899",spiritual:"#14b8a6",passion:"#ef4444",mastery:"#6366f1",wisdom:"#475569"},_e=class extends m{constructor(){super(...arguments);this.mode="daily"}renderEmpty(){return ee.html`<div class="roxy-empty" role="status">No biorhythm data</div>`}renderData(e){return this.mode==="critical-days"&&"criticalDays"in e?this.renderCritical(e):this.mode==="forecast"&&"days"in e?this.renderForecast(e):this.renderDaily(e)}renderDaily(e){let r=e.quickRead??{},t=Object.entries(r).map(([s,o])=>{let i=typeof o=="number"?o:0,l=Math.abs(i)>1?i/100:i;return[s,l]});return ee.html`<section class="wrap" aria-label="Daily biorhythm"><header class="head"><h2 class="title">Biorhythm</h2>${typeof e.energyRating=="number"?ee.html`<span class="energy">Energy ${e.energyRating}/10</span>`:ee.nothing}</header><div class="bars" role="list">${t.map(([s,o])=>{let i=(o+1)/2*100,l=dt[s]??"var(--roxy-accent, #f59e0b)";return ee.html`<div class="bar" role="listitem"><span style="text-transform:capitalize">${s}</span> <span class="track"><span class="fill" style="width:${i}%;background:${l}"></span> </span><span class="value">${Math.round(o*100)}%</span></div>`})}</div>${e.dailyMessage?ee.html`<p class="advice">${e.dailyMessage}</p>`:ee.nothing} ${e.advice?ee.html`<p class="advice">${e.advice}</p>`:ee.nothing}</section>`}renderForecast(e){let r=e.days??[];if(r.length===0)return ee.html`<div class="roxy-empty" role="status">No forecast</div>`;let t=600,s=160,o=t/Math.max(r.length-1,1),i=["physical","emotional","intellectual","intuitive"];return ee.html`<section class="wrap" aria-label="Biorhythm forecast"><header class="head"><h2 class="title">Forecast</h2><span class="energy">${e.startDate} - ${e.endDate}</span></header><svg viewBox="0 0 ${t} ${s}" role="img" aria-label="Biorhythm cycle lines across the forecast window"><title>Biorhythm forecast</title><line x1="0" y1="${s/2}" x2="${t}" y2="${s/2}" stroke="var(--roxy-border, #e4e4e7)" stroke-width="1"/>${i.map(l=>{let c=r.map((y,x)=>{let j=y[l]??0,b=x*o,dr=s/2-j/100*(s/2-8);return`${b.toFixed(2)},${dr.toFixed(2)}`}).join(" "),p=dt[l]??"#475569";return ee.svg`<polyline points=${c} fill="none" stroke=${p} stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />`})}</svg> ${e.summary?.periodAdvice?ee.html`<p class="advice">${e.summary.periodAdvice}</p>`:ee.nothing}</section>`}renderCritical(e){return ee.html`<section class="wrap" aria-label="Critical days"><header class="head"><h2 class="title">Critical days</h2><span class="energy">${e.totalCriticalDays} total</span></header><div>${e.criticalDays.map(r=>ee.html`<span class="crit">${r.date} · ${r.cycle} ${r.severity}</span>`)}</div></section>`}};_e.styles=[g,ee.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.energy{font-variant-numeric:tabular-nums;color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.bars{gap:var(--roxy-space-xs,.25rem);display:grid}.bar{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:8rem 1fr 3.5rem;align-items:center;display:grid}.track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:14px;position:relative;overflow:hidden}.fill{height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.value{font-variant-numeric:tabular-nums;text-align:right;color:var(--roxy-muted,#71717a)}.advice{color:var(--roxy-fg,#0a0a0a)}.alert{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);border:1px solid color-mix(in srgb, var(--roxy-warning,#ea580c) 32%, transparent);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);margin:0}svg{width:100%;max-width:var(--roxy-chart-max-width,600px);height:auto;display:block}.crit{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);border-radius:var(--roxy-radius-sm,4px);font-size:var(--roxy-text-xs,.75rem);margin:2px;padding:4px 8px;display:inline-block}`],d([(0,oa.property)({type:String,reflect:!0})],_e.prototype,"mode",2),_e=d([(0,oa.customElement)("roxy-biorhythm-chart")],_e);var U=require("lit"),xt=require("lit/decorators.js");var Te=require("lit"),la=4,da=9,pt=(100+2*da)*la,ss=(100+2*da)*la;function fe(n,a){return{x:(n+da)*la,y:(a+da)*la}}var Ur=50,Ba=n=>2*Ur-n,Ha={head:{64:[45.5,11.2],61:[50,11.2],63:[54.5,11.2]},ajna:{47:[45.3,18],24:[50,18],4:[54.7,18],17:[45.6,20.6],11:[54.4,20.6],43:[50,25.3]},throat:{62:[45.5,32.3],23:[50,32.3],56:[54.5,32.3],16:[42,34.6],35:[58,34.6],12:[58,37.6],20:[42,40.6],45:[58,40.6],31:[46,42.4],8:[50,42.4],33:[54,42.4]},g:{1:[50,47.5],7:[45.6,50.3],13:[54.4,50.3],10:[40,53.3],25:[60,53.3],15:[45.6,56.6],46:[54.4,56.6],2:[50,59]},heart:{21:[62.5,58.5],51:[62.5,61.3],26:[62.5,64.1],40:[73,61.3]},spleen:{48:[20,70.6],57:[24,72.3],44:[28,74],50:[32,75.6],32:[28,77.2],28:[24,78.9],18:[20,80.6]},sacral:{5:[45.5,72.5],14:[50,72.5],29:[54.5,72.5],34:[42,75.6],27:[42,79],59:[58,79],42:[45.5,81.4],3:[50,81.4],9:[54.5,81.4]},"solar-plexus":{},root:{53:[45.5,89.9],60:[50,89.9],52:[54.5,89.9],54:[42,92.7],19:[58,92.7],38:[42,95.3],39:[58,95.3],58:[42,98],41:[58,98]}},os={48:36,57:22,44:37,50:6,32:49,28:55,18:30};function ns(){let n={},a={};for(let[e,[r,t]]of Object.entries(Ha.spleen))Ha["solar-plexus"][os[Number(e)]]=[Ba(r),t];for(let[e,r]of Object.entries(Ha))for(let[t,[s,o]]of Object.entries(r))n[Number(t)]=fe(s,o),a[Number(t)]=e;return{points:n,centerOf:a}}var{points:ja,centerOf:Zo}=ns(),Qo=pt/2;function ur(n){return n.map(([a,e])=>fe(a,e))}function Oa(n,a,e){return ur([[Ur-n,a],[Ur+n,a],[Ur+n,e],[Ur-n,e]])}var ct=[[18.4,68],[18.4,81.8],[34.7,74.9]],is=[{id:"head",label:"Head",color:"gold",points:ur([[40,14.3],[60,14.3],[50,6]]),labelAnchor:fe(63,9),labelAlign:"start"},{id:"ajna",label:"Ajna",color:"green",points:ur([[40,15.6],[60,15.6],[50,27.6]]),labelAnchor:fe(62,21),labelAlign:"start"},{id:"throat",label:"Throat",color:"brown",points:Oa(9.5,30.4,43.6),labelAnchor:fe(83,34),labelAlign:"start"},{id:"g",label:"G",color:"gold",points:ur([[50,45],[60.7,53.3],[50,61.6],[39.3,53.3]]),labelAnchor:fe(13,51),labelAlign:"end"},{id:"heart",label:"Heart",color:"red",points:ur([[61.5,57],[76.5,61.3],[61.5,65.6]]),labelAnchor:fe(85,56),labelAlign:"start"},{id:"spleen",label:"Spleen",color:"brown",points:ur(ct),labelAnchor:fe(13,70),labelAlign:"end"},{id:"sacral",label:"Sacral",color:"red",points:Oa(9.5,70.6,83.6),labelAnchor:fe(85,88),labelAlign:"start"},{id:"solar-plexus",label:"Solar Plexus",color:"brown",points:ur(ct.map(([n,a])=>[Ba(n),a])),labelAnchor:fe(87,73),labelAlign:"start"},{id:"root",label:"Root",color:"brown",points:Oa(9.5,87.9,99.9),labelAnchor:fe(50,103),labelAlign:"middle"}],ls=[[64,47],[61,24],[63,4],[17,62],[11,56],[43,23],[16,48],[20,34],[20,10],[7,31],[1,8],[13,33],[21,45],[12,22],[35,36],[57,20],[15,5],[2,14],[46,29],[34,10],[10,57],[25,51],[27,50],[57,34],[26,44],[18,58],[28,38],[32,54],[3,60],[9,52],[42,53],[59,6],[19,49],[39,55],[41,30],[37,40]],ds=cs();function cs(){let n=Ba,a=[[50,-2],[60,-2],[60.5,9],[57,18],[56,21],[54,24],[52,27],[54,28],[64,30],[80,34],[83.5,40],[84,56],[83,74],[82,84],[76,92],[68,97],[64,99],[62,100],[60,100]],e=[`M ${na(a[0])}`];for(let r=1;r+2<a.length;r+=3)e.push(`C ${na(a[r])} ${na(a[r+1])} ${na(a[r+2])}`);e.push(`L ${ia(a[a.length-1],n)}`);for(let r=a.length-3;r>=1;r-=3)e.push(`C ${ia(a[r+1],n)} ${ia(a[r],n)} ${ia(a[r-1],n)}`);return e.push("Z"),e.join(" ")}function na([n,a]){let e=fe(n,a);return`${e.x} ${e.y}`}function ia([n,a],e){let r=fe(e(n),a);return`${r.x} ${r.y}`}function ps(n){return n.map(a=>`${a.x},${a.y}`).join(" ")}function mt(n,a){return n<a?`${n}-${a}`:`${a}-${n}`}function ms(){return Te.svg`<path class="bg-body" d=${ds} />`}function gs(n,a){let e=[];for(let[r,t]of ls){let s=ja[r],o=ja[t];if(!s||!o)continue;if(e.push(Te.svg`<line class="bg-channel" x1=${s.x} y1=${s.y} x2=${o.x} y2=${o.y} />`),n.has(mt(r,t))){e.push(Te.svg`<line class="bg-channel on" x1=${s.x} y1=${s.y} x2=${o.x} y2=${o.y} />`);continue}let i={x:(s.x+o.x)/2,y:(s.y+o.y)/2};a.has(r)&&e.push(Te.svg`<line class="bg-half" x1=${s.x} y1=${s.y} x2=${i.x} y2=${i.y} />`),a.has(t)&&e.push(Te.svg`<line class="bg-half" x1=${o.x} y1=${o.y} x2=${i.x} y2=${i.y} />`)}return e}function ys(n,a,e){let r=e.x-a.x,t=e.y-a.y,s=r*r+t*t;if(s===0)return a;let o=Math.max(0,Math.min(1,((n.x-a.x)*r+(n.y-a.y)*t)/s));return{x:a.x+o*r,y:a.y+o*t}}function us(n,a){let e=a[0],r=Number.POSITIVE_INFINITY;for(let t=0;t<a.length;t++){let s=ys(n,a[t],a[(t+1)%a.length]),o=(s.x-n.x)**2+(s.y-n.y)**2;o<r&&(r=o,e=s)}return e}function xs(n){return is.map(a=>{let e=n.has(a.id),r=`bg-center bg-${a.color}${e?" defined":""}`,t=us(a.labelAnchor,a.points);return Te.svg`<g>
|
|
2
|
+
<line class="bg-leader" x1=${a.labelAnchor.x} y1=${a.labelAnchor.y} x2=${t.x} y2=${t.y} />
|
|
3
|
+
<polygon class=${r} points=${ps(a.points)}><title>${a.label}: ${e?"defined":"open"}</title></polygon>
|
|
4
|
+
<text class="bg-center-label" x=${a.labelAnchor.x} y=${a.labelAnchor.y} text-anchor=${a.labelAlign} dominant-baseline="central">${a.label}</text>
|
|
5
|
+
</g>`})}function hs(n,a){let e=[];for(let[r,t]of Object.entries(ja)){let s=Number(r);if(!n.has(s))continue;let o=a.get(s);e.push(Te.svg`<text class="bg-gate" x=${t.x} y=${t.y} text-anchor="middle" dominant-baseline="central">${s}${o?Te.svg`<title>${o}</title>`:Te.nothing}</text>`)}return e}function gt(n,a){return mt(n,a)}var yt=`0 0 ${pt} ${ss}`;function ut(n){return Te.svg`
|
|
6
|
+
${ms()}
|
|
7
|
+
${gs(n.activeChannels,n.activeGates)}
|
|
8
|
+
${xs(n.definedCenters)}
|
|
9
|
+
${hs(n.activeGates,n.gateTitles)}
|
|
10
|
+
`}var xr=class extends m{renderEmpty(){return U.html`<div class="roxy-empty" role="status">No bodygraph data</div>`}renderData(a){let e=new Set((a.centers??[]).filter(o=>o.defined).map(o=>o.id)),r=new Set((a.gates??[]).map(o=>o.gate).filter(o=>o!=null)),t=new Set((a.channels??[]).map(o=>gt(o.gateA,o.gateB))),s=this.buildGateTitles(a.gates??[]);return U.html`<div class="wrap"><header class="head"><h2 class="title">Bodygraph</h2>${a.type?U.html`<div class="type-line">${a.type}${a.profile?U.html`· Profile ${a.profile}`:U.nothing}</div>`:U.nothing}</header><div class="layout"><svg viewBox="${yt}" preserveAspectRatio="xMidYMid meet" role="img" aria-label="Human Design bodygraph with nine centers, channels, and activated gates overlaid on a human silhouette"><title>Human Design bodygraph</title><desc>Nine energy centers in their canonical positions over a human silhouette, each filled with its traditional color when defined and outlined when open, wired by channels between activated gates.</desc>${ut({definedCenters:e,activeChannels:t,activeGates:r,gateTitles:s})}</svg> ${this.renderSummary(a)}</div></div>`}buildGateTitles(a){let e=new Map;for(let r of a){if(r.gate==null)continue;let t=[`Gate ${r.gate}`];r.line!=null&&(t[0]+=`.${r.line}`),r.gateName&&t.push(r.gateName);let s=r.planet?h(r.planet):"",o=s?N[s]??s:"";o&&t.push(`${o} ${r.side??""}`.trim()),e.set(r.gate,t.join(" \xB7 "))}return e}renderSummary(a){let e=[{label:"Type",value:a.type},{label:"Strategy",value:a.strategy},{label:"Authority",value:a.authority},{label:"Profile",value:a.profile},{label:"Definition",value:a.definition}],r=a.incarnationCross;return U.html`<div class="summary"><div class="facts">${e.map(t=>t.value?U.html`<div class="fact"><span>${t.label}</span> <strong>${t.value}</strong></div>`:U.nothing)}</div>${r?.name?U.html`<p class="cross">${r.name} ${r.gates?.length?U.html`<span class="gates">(${r.gates.join(", ")})</span>`:U.nothing}</p>`:U.nothing} ${a.signature||a.notSelf?U.html`<div class="themes">${a.signature?U.html`<span class="pill pill--good">Signature: ${a.signature}</span>`:U.nothing} ${a.notSelf?U.html`<span class="pill pill--shadow">Not-self: ${a.notSelf}</span>`:U.nothing}</div>`:U.nothing}<div class="legend"><span class="legend-caption">Center colors when defined. Open centers are outlined.</span> <span><span class="swatch bg-gold defined"></span>Head, G</span> <span><span class="swatch bg-green defined"></span>Ajna</span> <span><span class="swatch bg-brown defined"></span>Throat, Spleen, Solar Plexus, Root</span> <span><span class="swatch bg-red defined"></span>Heart, Sacral</span> <span><span class="swatch"></span>Open center</span></div></div>`}};xr.styles=[g,U.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.type-line{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.layout{gap:var(--roxy-space-lg,1.5rem);grid-template-columns:minmax(0,1fr);align-items:start;display:grid}@container (width>=520px){.layout{grid-template-columns:minmax(0,340px) minmax(0,1fr)}}svg{width:100%;max-width:var(--roxy-chart-max-width,340px);height:auto;margin:0 auto;display:block}.bg-body{fill:color-mix(in srgb, var(--roxy-secondary,#475569) 8%, transparent);stroke:var(--roxy-border,#e4e4e7);stroke-width:1px}.bg-channel{stroke:var(--roxy-secondary,#475569);stroke-width:1.6px;opacity:.3}.bg-channel.on{stroke-width:3.4px;stroke-linecap:round;opacity:1}.bg-half{stroke:var(--roxy-secondary,#475569);stroke-width:3.2px;stroke-linecap:round;opacity:.9}.bg-leader{stroke:var(--roxy-muted,#71717a);stroke-width:1px;opacity:.5}.bg-center{fill:#0000;stroke:var(--roxy-secondary,#475569);stroke-width:1.8px}.bg-center.defined{stroke:#00000073}.bg-center.bg-gold.defined{fill:#e0a200}.bg-center.bg-green.defined{fill:#2f8f00}.bg-center.bg-red.defined{fill:#c41f1f}.bg-center.bg-brown.defined{fill:#76502f}.bg-center-label{fill:var(--roxy-muted,#71717a);font-size:11px;font-family:var(--roxy-font-sans)}.bg-gate{fill:var(--roxy-fg,#0a0a0a);font-size:8px;font-weight:600;font-family:var(--roxy-font-sans);paint-order:stroke;stroke:var(--roxy-bg,#fff);stroke-width:1.6px;stroke-linejoin:round}.summary{gap:var(--roxy-space-md,1rem);display:grid}.facts{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.fact{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);background:var(--roxy-surface,#fff)}.fact span{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.fact strong{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a)}.cross{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);border-left:2px solid var(--roxy-accent,#f59e0b);padding-left:var(--roxy-space-sm,.5rem);margin:0}.cross .gates{color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.themes{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.pill{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 10px}.pill--good{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.pill--shadow{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.legend{gap:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);flex-wrap:wrap;display:flex}.legend-caption{color:var(--roxy-muted,#71717a);flex-basis:100%}.legend .swatch{vertical-align:middle;border:1px solid var(--roxy-secondary,#475569);border-radius:2px;width:10px;height:10px;margin-right:4px;display:inline-block}.legend .swatch.defined{border-color:#00000073}.legend .swatch.bg-gold{background:#e0a200}.legend .swatch.bg-green{background:#2f8f00}.legend .swatch.bg-red{background:#c41f1f}.legend .swatch.bg-brown{background:#76502f}`],xr=d([(0,xt.customElement)("roxy-bodygraph")],xr);var me=require("lit"),ft=require("lit/decorators.js");function ht(n){try{let a=new Date(n);return Number.isNaN(a.getTime())?n:a.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})}catch{return n}}var hr=class extends m{isCurrent(a){let e=Date.now(),r=Date.parse(a.start),t=Date.parse(a.end);return Number.isNaN(r)||Number.isNaN(t)?!1:e>=r&&e<t}renderTile(a){let e=a.effect==="Good"?"good":a.effect==="Bad"?"bad":"neutral",r=this.isCurrent(a),t=N[h(a.lord)]??"",s=`${ht(a.start)} - ${ht(a.end)}`;return me.html`<div class="cho-tile ${e}${r?" now":""}" role="listitem" aria-current="${r?"time":"false"}"><span class="tile-name">${a.name}${r?me.html`<span class="now-badge">Now</span>`:me.nothing} </span><span class="tile-time" aria-label="Time range">${s}</span> <span class="tile-lord">${t?me.html`<span aria-hidden="true">${t}</span>`:me.nothing} ${a.lord}</span></div>`}renderEmpty(){return me.html`<div class="roxy-empty" role="status">No choghadiya data</div>`}renderData(a){let{date:e,dayChoghadiya:r,nightChoghadiya:t}=a;return me.html`<div class="wrap"><div class="header"><h2 class="title">Choghadiya</h2>${e?me.html`<p class="subtitle">${e}</p>`:me.nothing}</div><div class="cho-grid"><section class="period-col" aria-label="Day muhurta periods"><h3 class="period-heading">Day</h3><div role="list" aria-label="Daytime choghadiya">${r&&r.length>0?r.map(s=>this.renderTile(s)):me.html`<p class="roxy-empty" role="status">No daytime periods</p>`}</div></section><section class="period-col" aria-label="Night muhurta periods"><h3 class="period-heading">Night</h3><div role="list" aria-label="Nighttime choghadiya">${t&&t.length>0?t.map(s=>this.renderTile(s)):me.html`<p class="roxy-empty" role="status">No nighttime periods</p>`}</div></section></div></div>`}};hr.styles=[g,me.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.header{gap:var(--roxy-space-xs,.25rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin:0}.cho-grid{gap:var(--roxy-space-md,1rem);grid-template-columns:1fr;display:grid}@media (width>=720px){.cho-grid{grid-template-columns:1fr 1fr}}.period-col{gap:var(--roxy-space-xs,.25rem);display:grid}.period-heading{font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a)}.cho-tile{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);grid-template-columns:1fr auto;align-items:center;gap:.25em .75em;padding:.55em .85em;display:grid}.cho-tile.good{background:color-mix(in srgb, var(--roxy-success,#22c55e) 18%, transparent);border-color:color-mix(in srgb, var(--roxy-success,#22c55e) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.cho-tile.bad{background:color-mix(in srgb, var(--roxy-danger,#ef4444) 18%, transparent);border-color:color-mix(in srgb, var(--roxy-danger,#ef4444) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.cho-tile.neutral{color:var(--roxy-fg,#0a0a0a);background:0 0}.cho-tile.now{outline:2px solid var(--roxy-accent,#f59e0b);outline-offset:1px;box-shadow:0 0 0 4px color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent)}.now-badge{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);text-transform:uppercase;letter-spacing:.06em;margin-left:.4em;display:inline-block}.tile-name{font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);grid-column:1}.tile-time{font-size:var(--roxy-text-xs,.75rem);opacity:.8;white-space:nowrap;text-align:right;grid-area:1/2/3;align-self:center}.tile-lord{font-size:var(--roxy-text-sm,.875rem);opacity:.85;grid-column:1;align-items:center;gap:.25em;display:flex}`],hr=d([(0,ft.customElement)("roxy-choghadiya-grid")],hr);var D=require("lit"),ca=require("lit/decorators.js");var Fe=class extends m{constructor(){super(...arguments);this.mode="astrology"}getBreakdown(){let e=this.data;if(!e)return{};if("categories"in e&&e.categories){let r={};for(let[t,s]of Object.entries(e.categories))typeof s=="number"&&Number.isFinite(s)&&(r[t]=s);return r}return{}}renderEmpty(){return D.html`<div class="roxy-empty" role="status">No compatibility data</div>`}renderData(e){let r=e.overallScore,t=this.getBreakdown(),s="rating"in e?e.rating:void 0,o="archetype"in e?e.archetype:void 0,i="advice"in e?e.advice:void 0,l="summary"in e?e.summary:void 0,c="interpretation"in e?e.interpretation:void 0,p="strengths"in e?e.strengths:void 0,y="challenges"in e?e.challenges:void 0,x="keyAspects"in e?e.keyAspects:void 0;return D.html`<article class="card" aria-label="${`Compatibility (${this.mode})`}"><div class="head"><h2>${this.mode} compatibility</h2><div>${typeof r=="number"?D.html`<div class="score">${f(r,0)}</div>`:D.nothing} ${s?D.html`<div class="rating">${s}</div>`:D.nothing}</div></div>${Object.keys(t).length>0?D.html`<div role="list">${Object.entries(t).map(([j,b])=>D.html`<div class="bar-row" role="listitem"><span style="text-transform:capitalize">${j}</span> <span class="bar"><span style="width:${Math.max(0,Math.min(100,b))}%"></span></span> <span>${f(b,0)}</span></div>`)}</div>`:D.nothing} ${o?D.html`<p><span class="archetype">${o.label}</span> ${o.description?D.html`· ${o.description}`:D.nothing}</p>`:D.nothing} ${l?D.html`<p>${l}</p>`:D.nothing} ${c&&!l?D.html`<p>${c}</p>`:D.nothing} ${i?D.html`<p>${i}</p>`:D.nothing} ${(p?.length??0)>0||(y?.length??0)>0?D.html`<div class="lists">${p?.length?D.html`<div><h3>Strengths</h3><ul>${p.map(j=>D.html`<li>${j}</li>`)}</ul></div>`:D.nothing} ${y?.length?D.html`<div><h3>Challenges</h3><ul>${y.map(j=>D.html`<li>${j}</li>`)}</ul></div>`:D.nothing}</div>`:D.nothing} ${x?.length?D.html`<div><h3 style="margin:0 0 .25rem;font-size:var(--roxy-text-xs);color:var(--roxy-muted);text-transform:uppercase;letter-spacing:.06em">Key aspects</h3><ul style="margin:0;padding-left:1rem;font-size:var(--roxy-text-sm)">${x.slice(0,6).map(j=>D.html`<li>${fs(j)}</li>`)}</ul></div>`:D.nothing}</article>`}};Fe.styles=[g,D.css`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);grid-template-columns:1fr auto;display:grid}.head h2{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.score{font-variant-numeric:tabular-nums;font-size:2rem;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);line-height:1}.rating{color:var(--roxy-secondary,#475569);font-size:var(--roxy-text-sm,.875rem)}.bar-row{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:8rem 1fr 3.5rem;align-items:center;display:grid}.bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:8px;overflow:hidden}.bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.bar-row>span:last-child{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a);text-align:right}.archetype{color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.lists{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.lists h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.lists ul{padding-left:var(--roxy-space-md,1rem);margin:0}`],d([(0,ca.property)({type:String,reflect:!0})],Fe.prototype,"mode",2),Fe=d([(0,ca.customElement)("roxy-compatibility-card")],Fe);function fs(n){let a=n.type.toLowerCase().replace(/_/g,"-"),e=typeof n.orb=="number"?` (orb ${f(n.orb,1)}\xB0)`:"",r=[n.planet1,a,n.planet2].filter(Boolean).join(" ");return n.description?`${r}${e} \xB7 ${n.description}`:`${r}${e}`}var H=require("lit"),bt=require("lit/decorators.js");var bs=["January","February","March","April","May","June","July","August","September","October","November","December"],fr=class extends m{renderEmpty(){return H.html`<div class="roxy-empty" role="status">No crystal data</div>`}renderData(a){let e=a.colors??[],r=a.keywords??[],t=a.pairsWith??[],s=typeof a.birthMonth=="number"?bs[a.birthMonth-1]:void 0;return H.html`<article class="wrap" aria-label="${a.name??"Crystal"}"><div class="hero">${a.imageUrl?H.html`<img class="photo" src="${a.imageUrl}" alt="${a.name??"Crystal"}" loading="lazy">`:H.nothing}<div><h2 class="title">${a.name}</h2>${a.description?H.html`<p class="desc">${a.description}</p>`:H.nothing}</div></div><dl class="attrs">${this.attr("Planet",a.planet)} ${this.attr("Hardness",typeof a.hardness=="number"?`${a.hardness} Mohs`:void 0)} ${this.attr("Vibration",a.numericalVibration)} ${this.attr("Birthstone",s)} ${this.list("Chakras",a.chakras)} ${this.list("Zodiac",a.zodiacSigns)} ${this.list("Elements",a.elements)} ${e.length?H.html`<div class="attr"><dt>Colors</dt><dd><div class="colors">${e.map(o=>H.html`<span class="color"><span class="dot" style="background:${o}"></span>${o}</span>`)}</div></dd></div>`:H.nothing}</dl>${this.renderMeaning(a.meaning)} ${r.length?H.html`<div><p class="section-label">Keywords</p><div class="chips">${r.map(o=>H.html`<span class="chip">${o}</span>`)}</div></div>`:H.nothing} ${a.affirmation?H.html`<p class="affirmation">${a.affirmation}</p>`:H.nothing} ${t.length?H.html`<div><p class="section-label">Pairs with</p><div class="chips">${t.map(o=>H.html`<span class="chip">${String(o).replace(/-/g," ")}</span>`)}</div></div>`:H.nothing}</article>`}attr(a,e){return e==null||e===""?H.nothing:H.html`<div class="attr"><dt>${a}</dt><dd>${e}</dd></div>`}list(a,e){return e?.length?H.html`<div class="attr"><dt>${a}</dt><dd>${e.join(", ")}</dd></div>`:H.nothing}renderMeaning(a){if(!a)return H.nothing;let r=[["Spiritual",a.spiritual],["Emotional",a.emotional],["Physical",a.physical]].filter(([,t])=>!!t);return r.length===0?H.nothing:H.html`<div class="meaning">${r.map(([t,s])=>H.html`<h3>${t}</h3><p>${s}</p>`)}</div>`}};fr.styles=[g,H.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{gap:var(--roxy-space-md,1rem);align-items:flex-start;display:flex}.photo{border-radius:var(--roxy-radius-md,8px);object-fit:cover;background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 35%, transparent);flex:none;width:96px;height:96px}.title{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600)}.desc{line-height:1.55;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0}.attrs{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(7rem,1fr));display:grid}.attr{gap:2px;display:grid}.attr dt{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.attr dd{font-size:var(--roxy-text-sm,.875rem);margin:0;font-weight:500}.colors{flex-wrap:wrap;gap:.4rem;display:flex}.color{font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize;align-items:center;gap:.3rem;display:inline-flex}.dot{border-radius:var(--roxy-radius-full,9999px);border:1px solid color-mix(in srgb, var(--roxy-fg,#0a0a0a) 18%, transparent);width:.7rem;height:.7rem}.meaning h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.meaning p{margin:0 0 var(--roxy-space-sm,.5rem) 0;font-size:var(--roxy-text-sm,.875rem);line-height:1.55}.chips{flex-wrap:wrap;gap:.3rem;display:flex}.chip{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize;padding:1px 8px}.section-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem) 0}.affirmation{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-left:3px solid var(--roxy-accent,#f59e0b);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent);font-style:italic;font-size:var(--roxy-text-sm,.875rem);border-radius:0 var(--roxy-radius-sm,4px) var(--roxy-radius-sm,4px) 0;margin:0}`],fr=d([(0,bt.customElement)("roxy-crystal-card")],fr);var Ee=require("lit"),pa=require("lit/decorators.js");var vs=["January","February","March","April","May","June","July","August","September","October","November","December"],qe=class extends m{constructor(){super(...arguments);this.heading=""}renderEmpty(){return Ee.html`<div class="roxy-empty" role="status">No crystals</div>`}renderData(e){let r=e.crystals??[];if(r.length===0)return this.renderEmpty();let t=this.heading||this.deriveHeading(e),s="total"in e&&typeof e.total=="number"?e.total:r.length;return Ee.html`<section class="wrap" aria-label="${t}"><header class="head"><h2 class="title">${t}</h2><span class="count">${s} ${s===1?"crystal":"crystals"}</span></header><ul class="grid">${r.map(o=>Ee.html`<li class="tile">${o.imageUrl?Ee.html`<img class="photo" src="${o.imageUrl}" alt="${o.name??"Crystal"}" loading="lazy">`:Ee.html`<div class="photo" aria-hidden="true"></div>`}<p class="name">${o.name}</p>${o.colors&&o.colors.length>0?Ee.html`<div class="colors" aria-label="${`Colours: ${o.colors.join(", ")}`}">${o.colors.map(i=>Ee.html`<span class="swatch" style="${`background:${$s(i)}`}" title="${i}"></span>`)}</div>`:Ee.nothing}</li>`)}</ul></section>`}deriveHeading(e){return"chakra"in e&&e.chakra?`${e.chakra} chakra crystals`:"element"in e&&e.element?`${e.element} element crystals`:"sign"in e&&e.sign?`Crystals for ${e.sign}`:"month"in e&&typeof e.month=="number"?`${vs[e.month-1]??""} birthstones`.trim():"Crystals"}};qe.styles=[g,Ee.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.count{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.grid{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fill,minmax(8rem,1fr));margin:0;padding:0;list-style:none;display:grid}.tile{gap:var(--roxy-space-xs,.25rem);background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);box-shadow:var(--roxy-shadow-sm);display:grid}.photo{aspect-ratio:1;border-radius:var(--roxy-radius-sm,4px);object-fit:cover;background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 35%, transparent);width:100%}.name{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.colors{flex-wrap:wrap;gap:4px;display:flex}.swatch{border-radius:var(--roxy-radius-full,9999px);border:1px solid color-mix(in srgb, var(--roxy-fg,#0a0a0a) 18%, transparent);width:10px;height:10px}`],d([(0,pa.property)({type:String,reflect:!0})],qe.prototype,"heading",2),qe=d([(0,pa.customElement)("roxy-crystal-grid")],qe);function $s(n){return n.trim().toLowerCase().replace(/\s+/g,"")}var R=require("lit"),ma=require("lit/decorators.js");var Ve=class extends m{constructor(){super(...arguments);this.period="current"}renderEmpty(){return R.html`<div class="roxy-empty" role="status">No dasha data</div>`}renderData(e){let r=this.collectPeriods(e),t=r.length?Math.max(...r.map(s=>s.durationYears)):0;return R.html`<div class="wrap" aria-label="Dasha timeline"><header class="head"><h2 class="title">${this.period==="major"?"Vimshottari Mahadasha":this.period==="sub"?"Antardasha":"Active dashas"}</h2>${"nakshatraName"in e&&e.nakshatraName?R.html`<div class="nakshatra">Moon nakshatra: ${e.nakshatraName} ${"nakshatraLord"in e&&e.nakshatraLord?R.html`(lord ${e.nakshatraLord})`:R.nothing}</div>`:R.nothing}</header>${this.renderBirthBalance(e)} ${this.period==="current"?this.renderCurrent(e):R.nothing} ${r.length>0?R.html`<div class="timeline" role="list">${r.map(s=>this.renderBar(s,t))}</div>`:R.nothing} ${this.renderActiveInterpretation(r)}</div>`}renderBirthBalance(e){if(!("birthDashaBalance"in e)||!e.birthDashaBalance)return R.nothing;let r=e.birthDashaBalance,t="nakshatraLord"in e&&e.nakshatraLord?e.nakshatraLord:"",s=r.years??0,o=r.months??0,i=r.days??0,l=[];s&&l.push(`${s}y`),o&&l.push(`${o}m`),i&&l.push(`${i}d`);let c=l.length?l.join(" "):"0d";return R.html`<p class="balance">Birth dasha balance: ${c} of ${t?R.html`<strong>${t}</strong>`:"the opening mahadasha"} remained at birth.</p>`}renderActiveInterpretation(e){let r=e.find(t=>this.isCurrent(t));return r?.interpretation?R.html`<div class="interp"><h3>${r.planet} mahadasha</h3><p>${r.interpretation}</p></div>`:R.nothing}renderCurrent(e){return"mahadasha"in e?R.html`<div class="current">${"mahadasha"in e&&e.mahadasha?R.html`<div><span>Mahadasha</span> <strong>${e.mahadasha.planet}</strong> ${"remainingInMahadasha"in e&&e.remainingInMahadasha?R.html`<small>${f(e.remainingInMahadasha.years+e.remainingInMahadasha.months/12,1)} years left</small>`:R.nothing}</div>`:R.nothing} ${"antardasha"in e&&e.antardasha?R.html`<div><span>Antardasha</span> <strong>${e.antardasha.planet}</strong> ${"remainingInAntardasha"in e&&e.remainingInAntardasha?R.html`<small>${f(e.remainingInAntardasha.years+e.remainingInAntardasha.months/12,1)} years left</small>`:R.nothing}</div>`:R.nothing} ${"pratyantardasha"in e&&e.pratyantardasha?R.html`<div><span>Pratyantardasha</span> <strong>${e.pratyantardasha.planet}</strong> ${"remainingInPratyantardasha"in e&&e.remainingInPratyantardasha?R.html`<small>${f(e.remainingInPratyantardasha.years+e.remainingInPratyantardasha.months/12,1)} years left</small>`:R.nothing}</div>`:R.nothing}</div>`:R.nothing}collectPeriods(e){return"mahadashas"in e&&e.mahadashas?.length?e.mahadashas:"antardashas"in e&&e.antardashas?.length?e.antardashas:[]}isCurrent(e){if(!e.startDate||!e.endDate)return!1;let r=Date.now(),t=Date.parse(e.startDate),s=Date.parse(e.endDate);return Number.isNaN(t)||Number.isNaN(s)?!1:r>=t&&r<s}progressIn(e){if(!e.startDate||!e.endDate)return-1;let r=Date.parse(e.startDate),t=Date.parse(e.endDate),s=Date.now();return Number.isNaN(r)||Number.isNaN(t)||s<r||s>=t||t<=r?-1:(s-r)/(t-r)}renderBar(e,r){let t=e.durationYears,s=r>0?t/r*100:0,o=this.isCurrent(e),i=o?this.progressIn(e):-1,l=o?"bar-track bar-now":"bar-track";return R.html`<div class="${o?"bar now":"bar"}" role="listitem" aria-current="${o?"time":"false"}"><span><strong>${e.planet}</strong>${o?R.html`<span class="now-badge">Now</span>`:R.nothing} </span><span class="${l}"><span class="bar-fill" style="width:${s}%"></span> ${i>=0?R.html`<span class="bar-progress" style="left:${i*s}%" aria-hidden="true"></span>`:R.nothing} </span><span class="dates">${e.startDate?vt(e.startDate):""} ${e.endDate?R.html`- ${vt(e.endDate)}`:""}</span></div>`}};Ve.styles=[g,R.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.nakshatra{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.current{gap:var(--roxy-space-md,1rem);background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);grid-template-columns:repeat(auto-fit,minmax(10rem,1fr));display:grid}.current div span:first-child{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.current div strong{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a)}.balance{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);border-left:2px solid var(--roxy-border,#e4e4e7);padding-left:var(--roxy-space-sm,.5rem);margin:0}.timeline{gap:var(--roxy-space-xs,.25rem);display:grid}.bar{gap:var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:5rem 1fr 8rem;align-items:center;display:grid}.bar.now strong{color:var(--roxy-accent-ink,#b45309)}.now-badge{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);text-transform:uppercase;letter-spacing:.06em;margin-left:.4em;display:inline-block}.bar-track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:14px;position:relative;overflow:hidden}.bar-fill{background:var(--roxy-accent,#f59e0b);opacity:.45;height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.bar-now .bar-fill{opacity:1}.bar-progress{background:var(--roxy-accent-ink,#b45309);width:2px;box-shadow:0 0 0 2px color-mix(in srgb, var(--roxy-accent,#f59e0b) 35%, transparent);border-radius:2px;position:absolute;top:-2px;bottom:-2px}.dates{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;text-align:right}.interp{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);background:var(--roxy-surface,#fff)}.interp h3{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);margin:0}.interp p{margin:var(--roxy-space-sm,.5rem) 0 0;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}`],d([(0,ma.property)({type:String,reflect:!0})],Ve.prototype,"period",2),Ve=d([(0,ma.customElement)("roxy-dasha-timeline")],Ve);function vt(n){let a=n.match(/^(\d{4})/);return a?a[1]:n}var L=require("lit"),ga=require("lit/decorators.js");var ws=["title","name","label","heading","overview","summary"],ks=["imageUrl","image","icon","symbol"],Ss=["imageUrl","image"],Rs=6,Ye=class extends m{constructor(){super(...arguments);this.depth=0}renderData(e){return this.depth>=Rs?L.html`<div class="roxy-empty" role="status">…</div>`:L.html`<div class="roxy-card" aria-label="Generic data display">${this.renderValue(e)}</div>`}renderValue(e){return e==null?L.nothing:typeof e=="string"?L.html`<p>${e}</p>`:typeof e=="number"||typeof e=="boolean"?L.html`<p>${String(e)}</p>`:Array.isArray(e)?this.renderArray(e):this.renderObject(e)}renderArray(e){return e.length===0?L.html`<div class="roxy-empty" role="status">Empty list</div>`:e.every(s=>s===null||["string","number","boolean"].includes(typeof s))?L.html`<ul class="roxy-chips">${e.map(s=>L.html`<li>${String(s)}</li>`)}</ul>`:e.every(s=>s!==null&&typeof s=="object"&&!Array.isArray(s))?this.renderTable(e):L.html`<ol>${e.map(s=>L.html`<li>${this.renderValue(s)}</li>`)}</ol>`}renderTable(e){let r=this.collectKeys(e);return L.html`<table class="roxy-table" role="table"><thead><tr>${r.map(t=>L.html`<th>${Y(t)}</th>`)}</tr></thead><tbody>${e.map(t=>L.html`<tr>${r.map(s=>L.html`<td>${this.formatPrimitive(t[s])}</td>`)}</tr>`)}</tbody></table>`}renderObject(e){let r=ws.find(i=>typeof e[i]=="string"),t=ks.find(i=>typeof e[i]=="string"&&e[i].startsWith("http")),s=r!=="summary"&&typeof e.summary=="string"?"summary":null,o=Object.entries(e).filter(([i,l])=>i!==r&&i!==s&&!Ss.includes(i)&&l!==null&&l!==void 0);return L.html`${t?L.html`<img class="roxy-image" src="${String(e[t])}" alt="${r?String(e[r]):"illustration"}" loading="lazy">`:L.nothing} ${r?L.html`<h3 class="roxy-title">${e[r]}</h3>`:L.nothing} ${s?L.html`<p class="roxy-summary">${e[s]}</p>`:L.nothing} ${o.length>0?L.html`<dl class="roxy-rows">${o.map(([i,l])=>L.html`<dt>${Y(i)}</dt><dd>${this.renderField(l)}</dd>`)}</dl>`:L.nothing}`}renderField(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)&&e.every(t=>["string","number","boolean"].includes(typeof t))?L.html`<ul class="roxy-chips">${e.map(t=>L.html`<li>${String(t)}</li>`)}</ul>`:L.html`<roxy-data .data="${e}" .depth="${this.depth+1}"></roxy-data>`}formatPrimitive(e){return e==null?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):Array.isArray(e)?e.map(String).join(", "):JSON.stringify(e)}collectKeys(e){let r=new Set;for(let t of e)for(let s of Object.keys(t))r.add(s);return Array.from(r)}};Ye.styles=[g,L.css`.roxy-card{background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm)}.roxy-title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-sm,.5rem) 0;color:var(--roxy-primary,#0f172a);letter-spacing:var(--roxy-tracking-tight)}.roxy-summary{color:var(--roxy-secondary,#475569);margin:0 0 var(--roxy-space-md,1rem) 0;font-size:var(--roxy-text-sm,.875rem)}dl.roxy-rows{gap:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);grid-template-columns:minmax(8ch,max-content) 1fr;margin:0;display:grid}dl.roxy-rows dt{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);text-transform:capitalize}dl.roxy-rows dd{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);word-break:break-word;margin:0}ul.roxy-chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;margin:0;padding:0;list-style:none;display:flex}ul.roxy-chips li{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}table.roxy-table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}table.roxy-table th,table.roxy-table td{border-bottom:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem);text-align:left;text-transform:none}table.roxy-table th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}.roxy-image{border-radius:var(--roxy-radius-md,8px);max-width:100%;height:auto;margin-bottom:var(--roxy-space-md,1rem)}.roxy-section{margin-bottom:var(--roxy-space-md,1rem)}.roxy-section h4{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569);margin:0 0 var(--roxy-space-xs,.25rem) 0;text-transform:capitalize}`],d([(0,ga.property)({attribute:!1})],Ye.prototype,"depth",2),Ye=d([(0,ga.customElement)("roxy-data")],Ye);var be=require("lit"),va=require("lit/decorators.js");var T=require("lit");function Le(n){let a=n%360;return a<0?a+360:a}function Me(n){let a=Le(n),e=Math.floor(a/30)%12,r=a%30,t=Math.floor(r),s=(r-t)*60,o=Math.floor(s),i=Math.round((s-o)*60);return{sign:te[e]??"Aries",signIndex:e,degree:t,minute:o,second:i}}function ya(n){let{sign:a,degree:e,minute:r}=Me(n);return`${e}\xB0 ${a} ${String(r).padStart(2,"0")}'`}function Ia(n){return Le(n+180)}function $t(n,a){let e=Le(n),r=Le(a)-e;return r<0&&(r+=360),Le(e+r/2)}function B(n,a,e,r){let t=r*Math.PI/180;return{x:n+e*Math.cos(t),y:a+e*Math.sin(t)}}var br=require("lit"),Ue=br.css`.roxy-tablist{border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.roxy-tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);transition:color var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.roxy-tab[aria-selected=true]{color:var(--roxy-accent-ink,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.roxy-tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}.roxy-tab:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-radius:4px}`;function Br(n){let{items:a,active:e,onSelect:r,label:t,idPrefix:s,controls:o=!1}=n;return br.html`<div class="roxy-tablist" role="tablist" aria-label="${t}" @keydown="${l=>{if(l.key!=="ArrowRight"&&l.key!=="ArrowLeft")return;l.preventDefault();let c=a.findIndex(j=>j.id===e);if(c===-1)return;let p=l.key==="ArrowRight"?1:-1,y=a[(c+p+a.length)%a.length];if(!y)return;r(y.id);let x=l.currentTarget.getRootNode();requestAnimationFrame(()=>{x.querySelector(`#${s}-tab-${y.id}`)?.focus()})}}">${a.map(l=>br.html`<button type="button" class="roxy-tab" role="tab" id="${s}-tab-${l.id}" aria-selected="${e===l.id?"true":"false"}" aria-controls="${o&&e===l.id?`${s}-panel-${l.id}`:br.nothing}" tabindex="${e===l.id?"0":"-1"}" @click="${()=>r(l.id)}">${l.label}</button>`)}</div>`}var ze=400,I=20,de=ze-2*I,W=ze/2,wt=Object.fromEntries(te.map(n=>[n.toLowerCase(),n])),Cs=[{id:"north",label:"North"},{id:"south",label:"South"},{id:"east",label:"East"}],Ts="\u02B3";function kt(n,a){return typeof n.longitude!="number"||!Number.isFinite(n.longitude)?!1:Me(n.longitude).sign.toLowerCase()!==a.toLowerCase()}function Es(n,a){let e=ot[h(n.graha)]??n.graha.slice(0,2),r=n.isRetrograde?Ts:"";if(typeof n.longitude!="number"||!Number.isFinite(n.longitude)||kt(n,a))return`${e}${r}`;let{degree:t}=Me(n.longitude);return`${e} ${t}\xB0${r}`}function Ds(n,a){let e=[h(n.graha)],r=kt(n,a);if(r&&e.push(`in ${a}`),typeof n.longitude=="number"&&Number.isFinite(n.longitude)){let t=Me(n.longitude),s=String(t.minute).padStart(2,"0");e.push(r?`D1: ${t.degree}\xB0${s}' ${t.sign}`:`${t.degree}\xB0${s}' ${t.sign}`)}if(n.nakshatra?.name){let t=n.nakshatra.pada?` pada ${n.nakshatra.pada}`:"";e.push(`${n.nakshatra.name}${t}`)}return n.awastha&&e.push(n.awastha),n.isRetrograde&&e.push("retrograde"),e.join(" \xB7 ")}function Ka(n,a,e,r,t){let s=r-(n.length-1)*t/2;return n.map((o,i)=>{let l=s+i*t;return T.svg`<text class="planet-text" x=${e} y=${l} text-anchor="middle" dominant-baseline="central">${Es(o,a)}<title>${Ds(o,a)}</title></text>`})}function xa(n,a,e){let r={};for(let o of te)r[o.toLowerCase()]=[];let t=e?wt[e.toLowerCase()]??"":"",s=t;for(let[o,i]of Object.entries(n??{})){let l=(i?.rashi??"").toLowerCase();if(o==="Lagna"||i?.graha==="Lagna"){t||(s=wt[l]??"");continue}!l||!(l in r)||r[l]?.push({graha:i.graha??o,longitude:i.longitude,nakshatra:i.nakshatra,isRetrograde:i.isRetrograde,awastha:i.awastha})}return{lagnaSign:s,placements:r,divisionLabel:a}}var vr=de/4,Ps={Pisces:{col:0,row:0},Aries:{col:1,row:0},Taurus:{col:2,row:0},Gemini:{col:3,row:0},Cancer:{col:3,row:1},Leo:{col:3,row:2},Virgo:{col:3,row:3},Libra:{col:2,row:3},Scorpio:{col:1,row:3},Sagittarius:{col:0,row:3},Capricorn:{col:0,row:2},Aquarius:{col:0,row:1}};function zs(n){let a=Ps[n]??{col:0,row:0};return{x:I+a.col*vr,y:I+a.row*vr,w:vr,h:vr}}function As(n){let a=I,e=I+vr,r=I+2*vr,t=I+3*vr,s=ze-I;return T.svg`
|
|
11
|
+
<rect class="line" x=${a} y=${a} width=${de} height=${de} stroke-width="1.5" fill="none" />
|
|
12
|
+
<line class="line" x1=${a} y1=${e} x2=${s} y2=${e} stroke-width="1" />
|
|
13
|
+
<line class="line" x1=${a} y1=${t} x2=${s} y2=${t} stroke-width="1" />
|
|
14
|
+
<line class="line" x1=${e} y1=${a} x2=${e} y2=${s} stroke-width="1" />
|
|
15
|
+
<line class="line" x1=${t} y1=${a} x2=${t} y2=${s} stroke-width="1" />
|
|
16
|
+
<line class="line" x1=${a} y1=${r} x2=${e} y2=${r} stroke-width="1" />
|
|
17
|
+
<line class="line" x1=${t} y1=${r} x2=${s} y2=${r} stroke-width="1" />
|
|
18
|
+
<line class="line" x1=${r} y1=${a} x2=${r} y2=${e} stroke-width="1" />
|
|
19
|
+
<line class="line" x1=${r} y1=${t} x2=${r} y2=${s} stroke-width="1" />
|
|
20
|
+
${n?T.svg`<text class="centre-label" x=${W} y=${W} text-anchor="middle" dominant-baseline="central">${n}</text>`:T.nothing}
|
|
21
|
+
`}function St(n,a){let e=te.findIndex(t=>t===a),r=te.findIndex(t=>t===n);return e===-1||r===-1?0:(r-e+12)%12+1}function Ns(n,a,e,r){let t=zs(n),s=t.x+t.w/2,o=t.y+t.h/2,i=aa[n]??n.slice(0,2),l=14;return T.svg`
|
|
22
22
|
<g class=${e?"cell lagna":"cell"}>
|
|
23
|
-
${e?
|
|
23
|
+
${e?T.svg`
|
|
24
24
|
<rect class="lagna-bg" x=${t.x} y=${t.y} width=${t.w} height=${t.h} />
|
|
25
25
|
<line class="lagna-slash" x1=${t.x+t.w-l} y1=${t.y+l} x2=${t.x+l} y2=${t.y+t.h-l} stroke-width="1.2" />
|
|
26
|
-
`:
|
|
26
|
+
`:T.nothing}
|
|
27
27
|
<text class="sign-text" x=${t.x+6} y=${t.y+12} text-anchor="start" dominant-baseline="central">${i}</text>
|
|
28
|
-
${r>0?
|
|
29
|
-
${e?
|
|
30
|
-
${
|
|
28
|
+
${r>0?T.svg`<text class="house-num" x=${t.x+t.w-6} y=${t.y+12} text-anchor="end" dominant-baseline="central">${r}</text>`:T.nothing}
|
|
29
|
+
${e?T.svg`<text class="lagna-marker" x=${s} y=${t.y+26} text-anchor="middle" dominant-baseline="central">Asc</text>`:T.nothing}
|
|
30
|
+
${a.length?Ka(a,n,s,o+4,14):T.nothing}
|
|
31
31
|
</g>
|
|
32
|
-
`}function
|
|
33
|
-
${
|
|
34
|
-
${
|
|
35
|
-
`}var
|
|
36
|
-
<rect class="line" x=${
|
|
37
|
-
<polygon class="line" points="${
|
|
38
|
-
<line class="line" x1=${
|
|
32
|
+
`}function Ls(n){let a=n.lagnaSign.toLowerCase();return T.svg`
|
|
33
|
+
${As(n.divisionLabel)}
|
|
34
|
+
${te.map(e=>Ns(e,n.placements[e.toLowerCase()]??[],e.toLowerCase()===a,St(e,n.lagnaSign)))}
|
|
35
|
+
`}var O={tl:{x:I,y:I},tr:{x:ze-I,y:I},br:{x:ze-I,y:ze-I},bl:{x:I,y:ze-I},top:{x:W,y:I},right:{x:ze-I,y:W},bottom:{x:W,y:ze-I},left:{x:I,y:W},tlMid:{x:W-de/4,y:W-de/4},trMid:{x:W+de/4,y:W-de/4},brMid:{x:W+de/4,y:W+de/4},blMid:{x:W-de/4,y:W+de/4}};function He(n){let a=n.reduce((r,t)=>r+t.x,0)/n.length,e=n.reduce((r,t)=>r+t.y,0)/n.length;return{x:a,y:e}}var Ms={1:{x:W,y:O.tlMid.y},2:He([O.tl,O.top,O.tlMid]),3:He([O.tl,O.left,O.tlMid]),4:{x:O.tlMid.x,y:W},5:He([O.bl,O.left,O.blMid]),6:He([O.bl,O.bottom,O.blMid]),7:{x:W,y:O.blMid.y},8:He([O.br,O.bottom,O.brMid]),9:He([O.br,O.right,O.brMid]),10:{x:O.brMid.x,y:W},11:He([O.tr,O.right,O.trMid]),12:He([O.tr,O.top,O.trMid])};function Gs(n,a){let e=te.findIndex(r=>r===a);return e===-1?n:(e+n-1)%12+1}function Hs(n){let{tl:a,tr:e,br:r,bl:t,top:s,right:o,bottom:i,left:l}=O;return T.svg`
|
|
36
|
+
<rect class="line" x=${a.x} y=${a.y} width=${de} height=${de} stroke-width="1.5" fill="none" />
|
|
37
|
+
<polygon class="line" points="${s.x},${s.y} ${o.x},${o.y} ${i.x},${i.y} ${l.x},${l.y}" stroke-width="1" fill="none" />
|
|
38
|
+
<line class="line" x1=${a.x} y1=${a.y} x2=${r.x} y2=${r.y} stroke-width="1" />
|
|
39
39
|
<line class="line" x1=${e.x} y1=${e.y} x2=${t.x} y2=${t.y} stroke-width="1" />
|
|
40
|
-
${
|
|
41
|
-
`}function
|
|
40
|
+
${n?T.svg`<text class="centre-label" x=${W} y=${W} text-anchor="middle" dominant-baseline="central">${n}</text>`:T.nothing}
|
|
41
|
+
`}function Os(n,a,e,r,t){let s=Ms[n];if(!s)return T.svg``;let o=Math.min(14,Math.abs(s.y-W)*.45+6),i=o+12,l=t?`${a} \xB7 ${aa[e]??e.slice(0,2)}`:`${a}`;return T.svg`
|
|
42
42
|
<g class=${t?"cell lagna":"cell"}>
|
|
43
|
-
<text class="rashi-num" x=${
|
|
44
|
-
${t?
|
|
45
|
-
${r.length?
|
|
43
|
+
<text class="rashi-num" x=${s.x} y=${s.y-o} text-anchor="middle" dominant-baseline="central">${l}</text>
|
|
44
|
+
${t?T.svg`<text class="lagna-marker" x=${s.x} y=${s.y-i} text-anchor="middle" dominant-baseline="central">Asc</text>`:T.nothing}
|
|
45
|
+
${r.length?Ka(r,e,s.x,s.y+8,12):T.nothing}
|
|
46
46
|
</g>
|
|
47
|
-
`}function
|
|
48
|
-
${
|
|
49
|
-
${Array.from({length:12},(e,r)=>{let t=r+1,
|
|
50
|
-
`}var
|
|
51
|
-
<rect class="line" x=${
|
|
52
|
-
<line class="line" x1=${
|
|
47
|
+
`}function js(n){let a=n.lagnaSign||"Aries";return T.svg`
|
|
48
|
+
${Hs(n.divisionLabel)}
|
|
49
|
+
${Array.from({length:12},(e,r)=>{let t=r+1,s=Gs(t,a),o=te[s-1]??"Aries";return Os(t,s,o,n.placements[o.toLowerCase()]??[],t===1)})}
|
|
50
|
+
`}var ua=de/3;function Bs(){let n=I,a=I+ua,e=I+2*ua,r=ze-I,Pe={Aries:[{x:a,y:n},{x:e,y:n},{x:e,y:a},{x:a,y:a}],Taurus:[{x:n,y:n},{x:a,y:n},{x:a,y:a}],Gemini:[{x:n,y:n},{x:a,y:a},{x:n,y:a}],Cancer:[{x:n,y:a},{x:a,y:a},{x:a,y:e},{x:n,y:e}],Leo:[{x:n,y:e},{x:a,y:e},{x:n,y:r}],Virgo:[{x:a,y:e},{x:a,y:r},{x:n,y:r}],Libra:[{x:a,y:e},{x:e,y:e},{x:e,y:r},{x:a,y:r}],Scorpio:[{x:e,y:e},{x:e,y:r},{x:r,y:r}],Sagittarius:[{x:e,y:e},{x:r,y:r},{x:r,y:e}],Capricorn:[{x:e,y:a},{x:r,y:a},{x:r,y:e},{x:e,y:e}],Aquarius:[{x:r,y:n},{x:r,y:a},{x:e,y:a}],Pisces:[{x:e,y:n},{x:r,y:n},{x:e,y:a}]},Vr={};for(let[Jr,Xr]of Object.entries(Pe))Vr[Jr]={points:[...Xr],centroid:He(Xr)};return Vr}var Is=Bs();function Ks(n){let a=I,e=I+ua,r=I+2*ua,t=ze-I;return T.svg`
|
|
51
|
+
<rect class="line" x=${a} y=${a} width=${de} height=${de} stroke-width="1.5" fill="none" />
|
|
52
|
+
<line class="line" x1=${a} y1=${e} x2=${e} y2=${e} stroke-width="1" />
|
|
53
53
|
<line class="line" x1=${r} y1=${e} x2=${t} y2=${e} stroke-width="1" />
|
|
54
|
-
<line class="line" x1=${
|
|
54
|
+
<line class="line" x1=${a} y1=${r} x2=${e} y2=${r} stroke-width="1" />
|
|
55
55
|
<line class="line" x1=${r} y1=${r} x2=${t} y2=${r} stroke-width="1" />
|
|
56
|
-
<line class="line" x1=${e} y1=${
|
|
56
|
+
<line class="line" x1=${e} y1=${a} x2=${e} y2=${e} stroke-width="1" />
|
|
57
57
|
<line class="line" x1=${e} y1=${r} x2=${e} y2=${t} stroke-width="1" />
|
|
58
|
-
<line class="line" x1=${r} y1=${
|
|
58
|
+
<line class="line" x1=${r} y1=${a} x2=${r} y2=${e} stroke-width="1" />
|
|
59
59
|
<line class="line" x1=${r} y1=${r} x2=${r} y2=${t} stroke-width="1" />
|
|
60
|
-
<line class="line" x1=${
|
|
61
|
-
<line class="line" x1=${t} y1=${
|
|
60
|
+
<line class="line" x1=${a} y1=${a} x2=${e} y2=${e} stroke-width="1" />
|
|
61
|
+
<line class="line" x1=${t} y1=${a} x2=${r} y2=${e} stroke-width="1" />
|
|
62
62
|
<line class="line" x1=${t} y1=${t} x2=${r} y2=${r} stroke-width="1" />
|
|
63
|
-
<line class="line" x1=${
|
|
64
|
-
${
|
|
65
|
-
`}function
|
|
63
|
+
<line class="line" x1=${a} y1=${t} x2=${e} y2=${r} stroke-width="1" />
|
|
64
|
+
${n?T.svg`<text class="centre-label" x=${W} y=${W} text-anchor="middle" dominant-baseline="central">${n}</text>`:T.nothing}
|
|
65
|
+
`}function _s(n,a,e,r){let t=Is[n];if(!t)return T.svg``;let{centroid:s,points:o}=t,i=aa[n]??n.slice(0,2),l=o.map(c=>`${c.x},${c.y}`).join(" ");return T.svg`
|
|
66
66
|
<g class=${e?"cell lagna":"cell"}>
|
|
67
|
-
${e?
|
|
68
|
-
<text class="sign-text" x=${
|
|
69
|
-
${r>0?
|
|
70
|
-
${e?
|
|
71
|
-
${
|
|
67
|
+
${e?T.svg`<polygon class="lagna-bg" points=${l} />`:T.nothing}
|
|
68
|
+
<text class="sign-text" x=${s.x} y=${s.y-16} text-anchor="middle" dominant-baseline="central">${i}</text>
|
|
69
|
+
${r>0?T.svg`<text class="house-num" x=${s.x+18} y=${s.y-16} text-anchor="start" dominant-baseline="central">${r}</text>`:T.nothing}
|
|
70
|
+
${e?T.svg`<text class="lagna-marker" x=${s.x} y=${s.y-30} text-anchor="middle" dominant-baseline="central">Asc</text>`:T.nothing}
|
|
71
|
+
${a.length?Ka(a,n,s.x,s.y+4,12):T.nothing}
|
|
72
72
|
</g>
|
|
73
|
-
`}function
|
|
74
|
-
${
|
|
75
|
-
${
|
|
76
|
-
`}function Wr(o,n){switch(n){case"north":return Na(o);case"east":return Oa(o);default:return La(o)}}function Jr(o,n){return lr({items:ba,active:o,onSelect:n,label:"Kundli style",idPrefix:"kundli"})}var Bt=require("lit"),Xr=Bt.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.header{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}svg{aspect-ratio:1;width:100%;max-width:560px;height:auto;margin:0 auto;display:block}.line{fill:#0000;stroke:var(--roxy-border,#d4d4d8)}.sign-text{fill:var(--roxy-muted,#71717a);font-size:11px;font-weight:500;font-family:var(--roxy-font-sans);text-transform:uppercase;letter-spacing:.04em}.rashi-num{fill:var(--roxy-muted,#71717a);font-size:12px;font-weight:500;font-family:var(--roxy-font-sans)}.house-num{fill:var(--roxy-accent-ink,#b45309);font-size:11px;font-weight:600;font-family:var(--roxy-font-sans);opacity:.85}.planet-text{fill:var(--roxy-fg,#0a0a0a);font-size:13px;font-weight:600;font-family:var(--roxy-font-sans)}.centre-label{fill:var(--roxy-muted,#71717a);font-size:14px;font-weight:600;font-family:var(--roxy-font-sans);letter-spacing:.02em}.lagna-marker{fill:var(--roxy-accent-ink,#b45309);font-size:10px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.08em;text-transform:uppercase}.lagna-bg{fill:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent)}.lagna-slash{stroke:var(--roxy-accent,#f59e0b);stroke-linecap:round;opacity:.7}`;var Le=class extends ne.LitElement{constructor(){super();this.data=null;this.chartStyle="north";this.setStyle=e=>{this.chartStyle=e};new h(this)}viewModel(){if(!this.data?.chart?.meta)return null;let{division:e}=this.data,r=`D${e.number} ${e.name}`;return Ur(this.data.chart.meta,r)}render(){let e=this.viewModel();if(!this.data||!e)return ne.html`<div class="roxy-empty" role="status">No divisional chart data</div>`;let{division:r,vargottama:t}=this.data;return ne.html`<div class="wrap"><div class="header"><div><h2 class="title">D${r.number} ${r.name} ${r.sanskritName&&r.sanskritName!==r.name?ne.html`<span class="division-meta">· ${r.sanskritName}</span>`:ne.nothing}</h2>${r.significance?ne.html`<p class="significance">${r.significance}</p>`:ne.nothing}</div>${Jr(this.chartStyle,this.setStyle)}</div><svg viewBox="0 0 400 400" preserveAspectRatio="xMidYMid meet" role="img" aria-label="D${r.number} ${r.name} divisional chart with twelve sign houses"><title>D${r.number} ${r.name}</title>${Wr(e,this.chartStyle)}</svg> ${t&&t.length>0?ne.html`<div class="vargottama-row" role="list" aria-label="Vargottama planets"><span class="vargottama-label">Vargottama:</span> ${t.map(a=>ne.html`<span class="vargottama-pill" role="listitem">${I[a]??""} ${a}</span>`)}</div>`:ne.nothing}</div>`}};Le.styles=[y,Xr,Ke,ne.css`.division-meta{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin:0}.significance{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);border-left:2px solid var(--roxy-border,#e4e4e7);padding-left:var(--roxy-space-sm,.5rem);margin:0}.vargottama-row{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;align-items:center;display:flex}.vargottama-label{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin-right:var(--roxy-space-xs,.25rem);font-weight:500}.vargottama-pill{font-size:var(--roxy-text-sm,.875rem);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 22%, transparent);color:var(--roxy-fg,#0a0a0a);border:1px solid color-mix(in srgb, var(--roxy-accent,#f59e0b) 45%, transparent);border-radius:999px;align-items:center;gap:.2em;padding:.15em .6em;font-weight:600;display:inline-flex}`],d([(0,Sr.property)({attribute:!1})],Le.prototype,"data",2),d([(0,Sr.property)({type:String,reflect:!0,attribute:"chart-style"})],Le.prototype,"chartStyle",2),Le=d([(0,Sr.customElement)("roxy-divisional-chart")],Le);var W=require("lit"),Cr=require("lit/decorators.js");var Ha={manglik:"Mangal Dosha",kalsarpa:"Kaal Sarp Dosha",sadhesati:"Sade Sati"},Te=class extends W.LitElement{constructor(){super();this.data=null;this.type="manglik";new h(this)}render(){let e=this.data;if(!e)return W.html`<div class="roxy-empty" role="status">No dosha data</div>`;let r=!!e.present,t=Ha[this.type]??this.type,a=(e.severity??"").toLowerCase(),s=a==="severe"?3:a==="moderate"?2:a==="mild"?1:0,i=s*33,l=s===3?"var(--roxy-danger)":s===2?"var(--roxy-warning)":s===1?"var(--roxy-success)":"transparent";return W.html`<article class="card" aria-label="${t}"><header class="head"><h2 class="title">${t}</h2><span class="${`badge ${r?"present":"absent"}`}">${r?"Present":"Absent"}</span></header>${e.severity?W.html`<div class="severity-bar" role="meter" aria-valuemin="0" aria-valuemax="3" aria-valuenow="${s}" aria-label="Severity ${e.severity}"><span class="severity-fill" style="width:${i}%;background:${l}"></span></div>`:W.nothing} ${e.description?W.html`<p class="description">${e.description}</p>`:W.nothing} ${this.renderEffects(e)} ${e.remedies&&e.remedies.length>0?W.html`<div><h3>Remedies</h3><ul>${e.remedies.map(c=>W.html`<li>${c}</li>`)}</ul></div>`:W.nothing} ${"exceptions"in e&&e.exceptions&&e.exceptions.length>0?W.html`<div><h3>Exceptions</h3><ul>${e.exceptions.map(c=>W.html`<li>${c}</li>`)}</ul></div>`:W.nothing}</article>`}renderEffects(e){if(!e.effects)return W.nothing;let r=Object.entries(e.effects).filter(([,t])=>typeof t=="string"&&t.length>0);return r.length===0?W.nothing:W.html`<div class="effects">${r.map(([t,a])=>W.html`<div><h3>${t}</h3><p>${a}</p></div>`)}</div>`}};Te.styles=[y,W.css`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.badge{align-items:center;gap:var(--roxy-space-xs,.25rem);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em;padding:4px 10px;display:inline-flex}.badge.absent{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.badge.present{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.severity-bar{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 30%, transparent);border-radius:4px;width:100%;height:8px;position:relative;overflow:hidden}.severity-fill{height:100%;transition:width var(--roxy-motion-duration,.2s) ease-out;border-radius:4px;display:block}@media (prefers-reduced-motion:reduce){.severity-fill{transition:none}}.description{color:var(--roxy-fg,#0a0a0a);margin:0}h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);margin:0}.effects{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.effects p{font-size:var(--roxy-text-sm,.875rem);margin:0}`],d([(0,Cr.property)({attribute:!1})],Te.prototype,"data",2),d([(0,Cr.property)({type:String,reflect:!0})],Te.prototype,"type",2),Te=d([(0,Cr.customElement)("roxy-dosha-card")],Te);var J=require("lit"),pe=require("lit/decorators.js");var xt=new Map;async function Ia(o){let n=xt.get(o);return n||(n=fetch(o).then(async e=>{if(!e.ok)throw new Error(`HTTP ${e.status}`);return await e.json()}).catch(e=>{throw xt.delete(o),e}),xt.set(o,n)),n}var ae=class extends J.LitElement{constructor(){super(...arguments);this.endpoint="vedic-astrology/birth-chart";this.method="POST";this.specUrl="https://roxyapi.com/api/v2/openapi.json";this.submitLabel="Submit";this.fields=[];this.values={};this.hasLocation=!1;this.loaded=!1;this.specError=null;this.retryLoadSchema=()=>{this.loaded=!1,this.specError=null,this.loadSchema()};this.onLocation=e=>{let r=e.detail;r&&(this.values={...this.values,latitude:r.latitude,longitude:r.longitude,timezone:r.timezone??r.utcOffset})};this.onSubmit=e=>{e.preventDefault();let r=this.fields.filter(t=>t.required).filter(t=>this.values[t.name]===void 0||this.values[t.name]==="");if(r.length>0){this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{missing:r.map(t=>t.name)},bubbles:!0,composed:!0}));return}this.dispatchEvent(new CustomEvent("roxy-submit",{detail:{endpoint:this.endpoint,values:this.values},bubbles:!0,composed:!0}))}}connectedCallback(){super.connectedCallback(),this.loadSchema()}async loadSchema(){this.specError=null;try{let e=await Ia(this.specUrl),r=`/${this.endpoint.replace(/^\//,"")}`,t=e.paths?.[r]?.[this.method.toLowerCase()];if(!t)throw new Error(`Endpoint ${this.method} ${r} not found in OpenAPI spec`);let a=e.components?.schemas??{},s=[],i;if(t.requestBody){let c=t.requestBody.content?.["application/json"]?.schema;i=this.resolve(c,a)}if(i?.properties){let c=new Set(i.required??[]);for(let[m,p]of Object.entries(i.properties)){let u=this.resolve(p,a)??{};s.push({name:m,type:this.fieldType(u),required:c.has(m),description:u.description,enum:u.enum,min:u.minimum,max:u.maximum,default:u.default})}}for(let c of t.parameters??[])if(c.in==="path"||c.in==="query"){let m=this.resolve(c.schema,a)??{};s.push({name:c.name,type:this.fieldType(m),required:!!c.required,description:m.description,enum:m.enum,default:m.default})}this.fields=s,this.hasLocation=s.some(c=>c.name==="latitude")&&s.some(c=>c.name==="longitude")&&s.some(c=>c.name==="timezone");let l={};for(let c of s)c.default!==void 0&&(l[c.name]=c.default);this.values=l,this.loaded=!0}catch(e){let r=e instanceof Error?e.message:String(e);this.specError=r,this.loaded=!0,this.dispatchEvent(new CustomEvent("roxy-spec-error",{detail:{url:this.specUrl,message:r},bubbles:!0,composed:!0}))}}resolve(e,r){if(e){if("$ref"in e&&e.$ref){let t=e.$ref.split("/").pop();return t?r[t]:void 0}return e}}fieldType(e){return e.enum?"enum":e.format==="date"?"date":e.format==="time"?"time":e.format==="date-time"?"datetime":e.type==="integer"||e.type==="number"?"number":"text"}setValue(e,r){this.values={...this.values,[e]:r}}render(){if(!this.loaded)return J.html`<form><div class="roxy-skeleton" style="height:8rem"></div></form>`;if(this.specError)return J.html`<div class="spec-error" role="alert">Schema load failed: ${this.specError} <button type="button" class="submit" @click="${this.retryLoadSchema}">Retry</button></div>`;let e=r=>{if(this.hasLocation&&(r.name==="latitude"||r.name==="longitude"||r.name==="timezone"))return J.nothing;let t=`roxy-form-${r.name}`;return J.html`<div class="field"><label for="${t}">${ye(r.name)}${r.required?J.html`<span class="req" aria-hidden="true">*</span>`:J.nothing}</label> ${r.enum?J.html`<select id="${t}" ?required="${r.required}" @change="${a=>this.setValue(r.name,a.target.value)}"><option value="">Choose</option>${r.enum.map(a=>J.html`<option value="${a}" ?selected="${this.values[r.name]===a}">${a}</option>`)}</select>`:J.html`<input id="${t}" type="${this.htmlType(r.type)}" ?required="${r.required}" min="${r.min??""}" max="${r.max??""}" step="${r.type==="number"?"any":""}" .value="${this.values[r.name]??""}" @input="${a=>this.setValue(r.name,this.coerce(r.type,a.target.value))}">`} ${r.description?J.html`<small class="help">${r.description}</small>`:J.nothing}</div>`};return J.html`<form @submit="${this.onSubmit}"><h2 class="title">${ye(this.endpoint.split("/").pop()??"")}</h2>${this.hasLocation?J.html`<div class="location-block"><label>Birth location</label><roxy-location-search @roxy-location-select="${this.onLocation}" placeholder="City of birth"></roxy-location-search><small class="help">Required: latitude, longitude, timezone. Pick a city to autofill.</small></div>`:J.nothing}<div class="fields">${this.fields.map(r=>e(r))}</div><button class="submit" type="submit">${this.submitLabel}</button></form>`}htmlType(e){switch(e){case"date":return"date";case"time":return"time";case"datetime":return"datetime-local";case"number":return"number";default:return"text"}}coerce(e,r){if(r!==""){if(e==="number"){let t=Number(r);return Number.isFinite(t)?t:void 0}return r}}};ae.styles=[y,J.css`form{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.fields{align-items:start;gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.field{gap:var(--roxy-space-xs,.25rem);flex-direction:column;min-width:0;display:flex}label{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569)}label .req{color:var(--roxy-danger-fg,#991b1b);margin-left:4px}input,select{box-sizing:border-box;width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-family:inherit}input:focus,select:focus{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-color:var(--roxy-accent-ink,#b45309)}.help{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem)}.location-block{gap:var(--roxy-space-xs,.25rem);grid-column:1/-1;display:grid}.coords{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(3,1fr);display:grid}.coords input{font-size:var(--roxy-text-sm,.875rem)}button.submit{background:var(--roxy-accent-ink,#b45309);color:var(--roxy-bg,#fff);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-lg,1.5rem);font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);cursor:pointer;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));border:0;justify-self:start}button.submit:hover{transform:scale(1.02)}button.submit:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}.spec-error{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-danger,#dc2626);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);color:var(--roxy-danger-fg,#991b1b);font-size:var(--roxy-text-sm,.875rem);justify-items:start;display:grid}`],d([(0,pe.property)({type:String,attribute:"data-endpoint"})],ae.prototype,"endpoint",2),d([(0,pe.property)({type:String})],ae.prototype,"method",2),d([(0,pe.property)({type:String,attribute:"spec-url"})],ae.prototype,"specUrl",2),d([(0,pe.property)({type:String,attribute:"submit-label"})],ae.prototype,"submitLabel",2),d([(0,pe.state)()],ae.prototype,"fields",2),d([(0,pe.state)()],ae.prototype,"values",2),d([(0,pe.state)()],ae.prototype,"hasLocation",2),d([(0,pe.state)()],ae.prototype,"loaded",2),d([(0,pe.state)()],ae.prototype,"specError",2),ae=d([(0,pe.customElement)("roxy-endpoint-form")],ae);var K=require("lit"),Qr=require("lit/decorators.js");var ja={western:"Western",vedic:"Vedic",biorhythm:"Biorhythm"},Ba=["western","vedic","biorhythm"],Ye=class extends K.LitElement{constructor(){super();this.data=null;new h(this)}render(){let e=this.data;if(!e)return K.html`<div class="roxy-empty" role="status">No forecast data</div>`;let r=e.events??[],t=this.groupByDate(r),a=Ba.filter(s=>r.some(i=>i.domain===s));return K.html`<div class="wrap" aria-label="Forecast timeline"><header class="head"><h2 class="title">Forecast timeline</h2>${e.startDate&&e.endDate?K.html`<div class="range">${_e(e.startDate)} - ${_e(e.endDate)} · ${e.count??r.length} events</div>`:K.nothing}</header>${a.length?K.html`<div class="legend">${a.map(s=>K.html`<span><span class="swatch swatch-${s}"></span>${ja[s]}</span>`)}</div>`:K.nothing} ${t.length?K.html`<div class="days" role="list">${t.map(([s,i])=>this.renderDay(s,i))}</div>`:K.html`<p class="roxy-empty" role="status">No events in this window</p>`}</div>`}groupByDate(e){let r=new Map;for(let t of e){let a=t.date??"",s=r.get(a)??[];s.push(t),r.set(a,s)}return[...r.entries()]}renderDay(e,r){return K.html`<div class="day" role="listitem"><div class="day-date">${_e(e)}</div><div class="events">${r.map(t=>this.renderEvent(t))}</div></div>`}renderEvent(e){let r=typeof e.significance=="number"?e.significance:0,t=Math.max(0,Math.min(100,r));return K.html`<div class="event"><span class="dot dot-${e.domain}" aria-hidden="true"></span><div class="event-body"><div class="event-line">${this.renderHeadline(e)}</div>${e.description?K.html`<p class="event-desc">${e.description}</p>`:K.nothing}<div class="sig" title="Significance ${t} of 100"><span class="sig-track"><span class="sig-fill sig-fill-${e.domain}" style="width:${t}%"></span> </span><span class="sig-val">${t}</span></div></div></div>`}renderHeadline(e){let r=e.body?b(e.body):"",t=e.target?b(e.target):"",a=e.aspect?e.aspect.toLowerCase():"",s=tr[a]??"",i=a?fr[a]??a:"",l=typeof e.orb=="number"?v(e.orb,1):"",c=this.typeQualifier(e);return a&&t?K.html`<strong>${r}</strong> <span class="${s}">${i}</span> <strong>${t}</strong>${l?K.html`<span class="kind">orb ${l}°</span>`:K.nothing}`:K.html`<strong>${r||ye(e.type??"")}</strong>${c?K.html`<span class="kind">${c}</span>`:K.nothing}`}typeQualifier(e){return e.type==="sign-ingress"&&e.target?`enters ${b(e.target)}`:e.type==="retrograde-station"&&e.station?e.station:e.type==="eclipse"?[e.kind,"eclipse"].filter(Boolean).join(" "):e.type==="critical-day"?"critical day":e.type==="dasha-change"&&e.target?`dasha ${b(e.target)}`:ye(e.type??"")}};Ye.styles=[y,K.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.range{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);font-variant-numeric:tabular-nums}.legend{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);flex-wrap:wrap;display:flex}.legend .swatch{vertical-align:middle;border-radius:50%;width:10px;height:10px;margin-right:4px;display:inline-block}.swatch-western{background:var(--roxy-accent,#f59e0b)}.swatch-vedic{background:var(--roxy-info,#2563eb)}.swatch-biorhythm{background:var(--roxy-success,#16a34a)}.day{gap:var(--roxy-space-md,1rem);padding-block:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);grid-template-columns:4.5rem 1fr;display:grid}.day:first-of-type{border-top:none}.day-date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;padding-top:2px}.events{gap:var(--roxy-space-sm,.5rem);display:grid}.event{gap:var(--roxy-space-sm,.5rem);grid-template-columns:.6rem 1fr;align-items:start;display:grid}.dot{border-radius:50%;width:.6rem;height:.6rem;margin-top:4px}.dot-western{background:var(--roxy-accent,#f59e0b)}.dot-vedic{background:var(--roxy-info,#2563eb)}.dot-biorhythm{background:var(--roxy-success,#16a34a)}.event-body{min-width:0}.event-line{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.event-line .aspect-trine,.event-line .aspect-sextile{color:var(--roxy-success-fg,#166534)}.event-line .aspect-square,.event-line .aspect-opposition{color:var(--roxy-danger-fg,#991b1b)}.event-line .aspect-conjunction{color:var(--roxy-accent-ink,#b45309)}.event-line .kind{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.04em;margin-left:.35em}.event-desc{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);margin:2px 0 0}.sig{align-items:center;gap:.4rem;margin-top:4px;display:flex}.sig-track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);flex:1;max-width:8rem;height:4px;overflow:hidden}.sig-fill{border-radius:var(--roxy-radius-full,9999px);height:100%;display:block}.sig-fill-western{background:var(--roxy-accent,#f59e0b)}.sig-fill-vedic{background:var(--roxy-info,#2563eb)}.sig-fill-biorhythm{background:var(--roxy-success,#16a34a)}.sig-val{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums}`],d([(0,Qr.property)({attribute:!1})],Ye.prototype,"data",2),Ye=d([(0,Qr.customElement)("roxy-forecast-timeline")],Ye);var X=require("lit"),Zr=require("lit/decorators.js");var qe=class extends X.LitElement{constructor(){super();this.data=null;new h(this)}render(){let e=this.data;if(!e)return X.html`<div class="roxy-empty" role="status">No Guna Milan data</div>`;let r=(e.breakdown??[]).filter(p=>p?.category!==void 0),t=e.total??0,a=e.maxScore??36,s=t/a*100,i="color-mix(in srgb, var(--roxy-border) 50%, transparent)",l=s>=70?"var(--roxy-success)":s>=50?"var(--roxy-warning)":"var(--roxy-danger)",c=s*2.827,m=(100-s)*2.827;return X.html`<article class="card" aria-label="Guna Milan score"><div class="score-header"><div class="score-info"><div class="score-bar"><div><span class="total">${v(e.total,1)}</span> <span class="over">/ ${e.maxScore}</span> ${typeof e.percentage=="number"?X.html`<small style="margin-left:.5rem;color:var(--roxy-muted)">${Gt(e.percentage,1)}</small>`:X.nothing}</div>${e.recommendation?X.html`<span class="recommendation">${e.recommendation}</span>`:X.nothing}</div></div><div class="score-ring" role="meter" aria-label="Guna milan score" aria-valuemin="0" aria-valuemax="36" aria-valuenow="${t}"><svg viewBox="0 0 100 100" aria-hidden="true"><circle class="ring-track" cx="50" cy="50" r="45" fill="none" stroke="${i}" stroke-width="8"/><circle class="ring-fill" cx="50" cy="50" r="45" fill="none" stroke="${l}" stroke-width="8" stroke-dasharray="${c},${m}" stroke-linecap="round" transform="rotate(-90 50 50)"/><text x="50" y="50" text-anchor="middle" dominant-baseline="central" class="ring-text">${t}</text><text x="50" y="64" text-anchor="middle" dominant-baseline="central" class="ring-max">/${a}</text></svg></div></div>${r.length>0?X.html`<table><thead><tr><th>Category</th><th>Progress</th><th class="score">Score</th></tr></thead><tbody>${r.map(p=>{let u=p.score??0,P=p.maxScore??_a(p.category),x=P?u/P*100:0;return X.html`<tr><td>${p.category}</td><td class="bar-cell"><div class="mini-bar"><span style="width:${x}%"></span></div></td><td class="score">${v(u,1)} / ${P}</td></tr>`})}</tbody></table>`:X.nothing} ${(e.doshas?.length??0)>0||(e.doshaCancellations?.length??0)>0?X.html`<div class="tags">${e.doshas?.map(p=>X.html`<span class="dosha">${p}</span>`)} ${e.doshaCancellations?.map(p=>X.html`<span class="cancel" title="${p.reason}">${p.dosha} cancelled</span>`)}</div>`:X.nothing}</article>`}};qe.styles=[y,X.css`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.score-header{align-items:center;gap:1rem;display:flex}.score-info{flex:1}.score-bar{align-items:center;gap:var(--roxy-space-md,1rem);grid-template-columns:1fr auto;display:grid}.total{font-size:2.25rem;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums;line-height:1}.over{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-base,1rem)}.recommendation{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569)}.score-ring{flex-shrink:0;width:120px;height:120px}.score-ring svg{width:100%;height:100%}.score-ring .ring-text{fill:var(--roxy-fg,#0a0a0a);font-size:22px;font-weight:700;font-family:var(--roxy-font-sans)}.score-ring .ring-max{fill:var(--roxy-muted,#71717a);font-size:10px;font-family:var(--roxy-font-sans)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td.score{text-align:right;font-variant-numeric:tabular-nums;color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600)}td.bar-cell{width:30%}.mini-bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:8px;overflow:hidden}.mini-bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.tags{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.tags span{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.tags .dosha{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.tags .cancel{background:color-mix(in srgb, var(--roxy-success,#16a34a) 18%, transparent);color:var(--roxy-success-fg,#166534)}`],d([(0,Zr.property)({attribute:!1})],qe.prototype,"data",2),qe=d([(0,Zr.customElement)("roxy-guna-milan")],qe);function _a(o){if(!o)return 1;switch(o.toLowerCase()){case"varna":return 1;case"vasya":return 2;case"tara":return 3;case"yoni":return 4;case"maitri":return 5;case"gana":return 6;case"bhakoot":return 7;case"nadi":return 8;default:return 1}}var T=require("lit"),Pr=require("lit/decorators.js");var Re=class extends T.LitElement{constructor(){super();this.data=null;this.mode="lookup";new h(this)}resolveHexagram(){let e=this.data;if(!e)return null;if("hexagram"in e&&e.hexagram){if("lines"in e){let t=e;return{hex:t.hexagram,lines:t.lines,changingLinePositions:t.changingLinePositions,resultingHexagram:t.resultingHexagram}}let r=e;return{hex:r.hexagram,dailyMessage:r.dailyMessage}}return{hex:e}}render(){let e=this.resolveHexagram();if(!e)return T.html`<div class="roxy-empty" role="status">No hexagram data</div>`;let{hex:r,lines:t,changingLinePositions:a,dailyMessage:s,resultingHexagram:i}=e,l=t??this.derivedLines(r),c=new Set(a??[]);return T.html`<article class="card" aria-label="I Ching hexagram"><div class="glyphs">${r.symbol?T.html`<div class="symbol">${r.symbol}</div>`:T.nothing}<div class="lines" aria-hidden="true">${l.slice().reverse().map((m,p)=>{let u=l.length-1-p+1,P=c.has(u),x=m===6||m===8;return T.html`<div class="line ${`${x?"broken":"solid"}${P?" changing":""}`}">${x?T.svg`<span class="seg"></span><span class="seg"></span>`:T.svg`<span class="seg"></span>`}</div>`})}</div></div><div><h2 class="title">${r.number?T.html`${r.number}.`:T.nothing}${r.english??r.chinese??"Hexagram"}</h2><p class="subtitle">${r.chinese?T.html`${r.chinese}`:T.nothing} ${r.pinyin?T.html`· ${r.pinyin}`:T.nothing}</p><div class="trigrams">${r.upperTrigram?T.html`<div>Upper <span class="tri-glyph">${dt[r.upperTrigram]??""}</span>${r.upperTrigram}</div>`:T.nothing} ${r.lowerTrigram?T.html`<div>Lower <span class="tri-glyph">${dt[r.lowerTrigram]??""}</span>${r.lowerTrigram}</div>`:T.nothing}</div>${r.judgment?T.html`<p class="judgment">${r.judgment}</p>`:T.nothing} ${r.image?T.html`<p class="image">${r.image}</p>`:T.nothing} ${s?T.html`<p class="message">${s}</p>`:T.nothing} ${r.interpretation?.general?T.html`<p>${r.interpretation.general}</p>`:T.nothing} ${c.size>0?T.html`<div class="changing">Changing lines: ${Array.from(c).sort((m,p)=>m-p).join(", ")}. ${i?.english?T.html`Becomes hexagram ${i.number} ${i.english}.`:T.nothing}</div>`:T.nothing}</div></article>`}derivedLines(e){let r=e.symbol.codePointAt(0)??0;if(r>=19904&&r<=19967){let t=r-19904,a=[];for(let s=0;s<6;s++){let i=t>>s&1;a.push(i?8:7)}return a}return Array.from({length:6},()=>7)}};Re.styles=[y,T.css`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-lg,1.5rem);grid-template-columns:6rem 1fr;display:grid}@container (width<=480px){.card{grid-template-columns:1fr}}.glyphs{gap:var(--roxy-space-md,1rem);justify-items:center;display:grid}.symbol{color:var(--roxy-accent-ink,#b45309);font-size:3rem;line-height:1}.lines{gap:4px;width:4rem;display:grid}.line{justify-content:center;align-items:center;gap:4px;height:8px;display:flex}.seg{background:var(--roxy-fg,#0a0a0a);border-radius:1px;height:6px;display:block}.line.broken .seg{width:1.4rem}.line.solid .seg{width:3rem}.line.changing .seg{background:var(--roxy-accent,#f59e0b)}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0 0 var(--roxy-space-sm,.5rem)}.trigrams{gap:var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-sm,.5rem);color:var(--roxy-secondary,#475569);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:flex}.tri-glyph{font-size:var(--roxy-text-xl,1.5rem);color:var(--roxy-accent-ink,#b45309);vertical-align:middle;margin-right:4px}.judgment,.image,.message{margin:0 0 var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.judgment:before{content:"Judgment. ";font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569)}.image:before{content:"Image. ";font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569)}.changing{margin-top:var(--roxy-space-md,1rem);padding-top:var(--roxy-space-md,1rem);border-top:1px solid var(--roxy-border,#e4e4e7);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem)}`],d([(0,Pr.property)({attribute:!1})],Re.prototype,"data",2),d([(0,Pr.property)({type:String,reflect:!0})],Re.prototype,"mode",2),Re=d([(0,Pr.customElement)("roxy-hexagram")],Re);var C=require("lit"),Lr=require("lit/decorators.js");var Ae=class extends C.LitElement{constructor(){super();this.data=null;this.period="daily";new h(this)}render(){let e=this.data;if(!e)return C.html`<div class="roxy-empty" role="status">No horoscope data</div>`;let r=e.sign??"",t=r?oe[b(r)]??"":"",a="energyRating"in e&&typeof e.energyRating=="number"?e.energyRating:null,s="date"in e&&e.date||"week"in e&&e.week||"month"in e&&e.month||"";return C.html`<article class="card" aria-label="${`${this.period} horoscope for ${r}`}"><header class="head"><span class="glyph" aria-hidden="true">${t}</span><div><h2 class="title">${r} ${this.period}</h2>${s?C.html`<div class="date">${s}</div>`:C.nothing}</div>${a!==null?C.html`<span class="energy" aria-label="${`Energy ${a} of 10`}">Energy ${a}/10 <span class="energy-bar"><span style="width:${a/10*100}%"></span></span></span>`:C.nothing}</header>${e.overview?C.html`<p class="overview">${e.overview}</p>`:C.nothing}<div class="sections">${e.love?C.html`<div class="section"><h3>Love</h3><p>${e.love}</p></div>`:C.nothing} ${e.career?C.html`<div class="section"><h3>Career</h3><p>${e.career}</p></div>`:C.nothing} ${e.health?C.html`<div class="section"><h3>Health</h3><p>${e.health}</p></div>`:C.nothing} ${e.finance?C.html`<div class="section"><h3>Finance</h3><p>${e.finance}</p></div>`:C.nothing} ${"advice"in e&&e.advice?C.html`<div class="section"><h3>Advice</h3><p>${e.advice}</p></div>`:C.nothing}</div>${(()=>{let i="luckyNumber"in e&&e.luckyNumber!==void 0?e.luckyNumber:void 0,l="luckyColor"in e&&e.luckyColor?e.luckyColor:"",c="luckyNumbers"in e&&e.luckyNumbers?e.luckyNumbers:[],m="luckyDays"in e&&e.luckyDays?e.luckyDays:[],p=e.compatibleSigns??[];return i===void 0&&!l&&c.length===0&&m.length===0&&p.length===0?C.nothing:C.html`<div class="lucky">${i!==void 0?C.html`<span>Lucky number <strong>${i}</strong></span>`:C.nothing} ${l?C.html`<span>Lucky color <strong>${l}</strong></span>`:C.nothing} ${c.length?C.html`<span>Lucky numbers <strong>${c.join(", ")}</strong></span>`:C.nothing} ${m.length?C.html`<span>Lucky days <strong>${m.join(", ")}</strong></span>`:C.nothing} ${p.length?C.html`<span class="compat-wrap">Best with <span class="compat">${p.map(u=>C.html`<span>${u}</span>`)}</span></span>`:C.nothing}</div>`})()}</article>`}};Ae.styles=[y,C.css`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.glyph{color:var(--roxy-accent-ink,#b45309);font-size:2.25rem;line-height:1}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);text-transform:capitalize;margin:0}.date{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.energy{font-variant-numeric:tabular-nums;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);margin-left:auto}.energy-bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);vertical-align:middle;width:6rem;height:6px;margin-left:6px;display:inline-block;overflow:hidden}.energy-bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.overview{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);margin:0}.sections{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.section h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em}.section p{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0}.lucky{gap:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);flex-wrap:wrap;display:flex}.lucky strong{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600)}.compat-wrap{align-items:center;gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;width:100%;display:flex}.compat{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.compat span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 16%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize;padding:2px 8px}`],d([(0,Lr.property)({attribute:!1})],Ae.prototype,"data",2),d([(0,Lr.property)({type:String,reflect:!0})],Ae.prototype,"period",2),Ae=d([(0,Lr.customElement)("roxy-horoscope-card")],Ae);var D=require("lit"),dr=require("lit/decorators.js");var Ee=class extends D.LitElement{constructor(){super();this.data=null;this.activeTab="planets";new h(this)}bodies(){let e=this.data;if(!e)return[];let r=(e.planets??[]).map(a=>({name:a.planet,sign:a.sign,house:a.house,nakshatra:a.nakshatra,starLord:a.starLord,subLord:a.subLord,subSubLord:a.subSubLord,kpNumber:a.kpNumber,retrograde:a.retrograde})),t=e.nodes;for(let[a,s]of[["Rahu",t?.rahu],["Ketu",t?.ketu]])s&&r.push({name:a,sign:s.sign,house:s.house,nakshatra:s.nakshatra,starLord:s.starLord,subLord:s.subLord,subSubLord:s.subSubLord,retrograde:!0});return r}onTabKeyDown(e){if(e.key!=="ArrowRight"&&e.key!=="ArrowLeft")return;e.preventDefault(),this.activeTab=this.activeTab==="planets"?"cusps":"planets";let r=this.activeTab;requestAnimationFrame(()=>{this.shadowRoot?.querySelector(`#tab-${r}`)?.focus()})}render(){if(!this.data)return D.html`<div class="roxy-empty" role="status">No KP chart data</div>`;let e=this.data,r=e.ascendant;return D.html`<div class="wrap" aria-label="KP chart" tabindex="0"><header class="head"><h2 class="title">KP chart</h2>${r?D.html`<div class="asc">Ascendant: <strong>${r.sign??""}</strong> ${r.nakshatra?D.html`· ${r.nakshatra}`:D.nothing} ${r.subLord?D.html`· sub lord ${r.subLord}`:D.nothing} ${typeof r.kpNumber=="number"?D.html`· KP ${r.kpNumber}`:D.nothing}</div>`:D.nothing} ${typeof e.meta?.ayanamsa=="number"?D.html`<div class="ayan">${e.meta.ayanamsaType??"Ayanamsa"}: ${v(e.meta.ayanamsa,4)}° ${e.meta.houseSystem?D.html`· ${e.meta.houseSystem} houses`:D.nothing}</div>`:D.nothing}</header><div class="tablist" role="tablist" aria-label="KP chart views" @keydown="${this.onTabKeyDown}">${["planets","cusps"].map(t=>D.html`<button class="tab" role="tab" id="tab-${t}" aria-selected="${this.activeTab===t?"true":"false"}" aria-controls="panel-${t}" tabindex="${this.activeTab===t?"0":"-1"}" @click="${()=>{this.activeTab=t}}">${t==="planets"?"Planets":"Cusps"}</button>`)}</div><div id="panel-${this.activeTab}" role="tabpanel" aria-labelledby="tab-${this.activeTab}">${this.activeTab==="planets"?this.renderPlanets():this.renderCusps()}</div></div>`}renderPlanets(){let e=this.bodies();return e.length?D.html`<table role="table" aria-label="KP planets and nodes"><thead><tr><th scope="col">Body</th><th scope="col">Sign</th><th scope="col">House</th><th scope="col">Nakshatra</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(r=>D.html`<tr><td class="body">${r.name}${r.retrograde?D.html`<span class="retro">R</span>`:D.nothing}</td><td>${r.sign??""}</td><td class="num">${typeof r.house=="number"?r.house:""}</td><td>${r.nakshatra??""}</td><td>${r.starLord??""}</td><td>${r.subLord??""}</td><td>${r.subSubLord??""}</td><td class="num">${typeof r.kpNumber=="number"?r.kpNumber:""}</td></tr>`)}</tbody></table>`:D.html`<p class="roxy-empty" role="status">No planets</p>`}renderCusps(){let e=this.data?.cusps??[];return e.length?D.html`<table role="table" aria-label="KP Placidus cusps"><thead><tr><th scope="col">House</th><th scope="col">Sign</th><th scope="col">Sign lord</th><th scope="col">Nakshatra</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(r=>D.html`<tr><td class="body num">${r.house}</td><td>${r.sign??""}</td><td>${r.signLord??""}</td><td>${r.nakshatra??""}</td><td>${r.starLord??""}</td><td>${r.subLord??""}</td><td>${r.subSubLord??""}</td><td class="num">${typeof r.kpNumber=="number"?r.kpNumber:""}</td></tr>`)}</tbody></table>`:D.html`<p class="roxy-empty" role="status">No cusps</p>`}};Ee.styles=[y,D.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);gap:var(--roxy-space-xs,.25rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.asc,.ayan{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.asc strong{color:var(--roxy-fg,#0a0a0a)}.tablist{padding:0 var(--roxy-space-md,1rem);border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.tab[aria-selected=true]{color:var(--roxy-accent-ink,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:620px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}td.body{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);margin-left:4px}.num{font-variant-numeric:tabular-nums}`],d([(0,dr.property)({attribute:!1})],Ee.prototype,"data",2),d([(0,dr.state)()],Ee.prototype,"activeTab",2),Ee=d([(0,dr.customElement)("roxy-kp-chart")],Ee);var me=require("lit"),et=require("lit/decorators.js");var Ve=class extends me.LitElement{constructor(){super();this.data=null;new h(this)}render(){if(!this.data)return me.html`<div class="roxy-empty" role="status">No KP data</div>`;let e=this.data.planets??[];return me.html`<div class="wrap" aria-label="KP planets table" tabindex="0"><header class="head"><h2 class="title">KP planets</h2>${typeof this.data.ayanamsa=="number"?me.html`<span class="ayanamsa">Ayanamsa: ${v(this.data.ayanamsa,2)}°</span>`:me.nothing}</header><table role="table"><thead><tr><th scope="col">Planet</th><th scope="col">Sign</th><th scope="col">Sign lord</th><th scope="col">Nakshatra</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(r=>me.html`<tr><td class="planet">${r.planet} ${r.retrograde?me.html`<span class="retro">R</span>`:me.nothing}</td><td>${r.sign??""}</td><td>${r.signLord??""}</td><td>${r.nakshatra??""}</td><td>${r.nakshatraLord??""}</td><td>${r.subLord??""}</td><td>${r.subSubLord??""}</td><td>${r.kpNumber??""}</td></tr>`)}</tbody></table></div>`}};Ve.styles=[y,me.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);justify-content:space-between;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.ayanamsa{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:560px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}td.planet{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);margin-left:4px}`],d([(0,et.property)({attribute:!1})],Ve.prototype,"data",2),Ve=d([(0,et.customElement)("roxy-kp-planets-table")],Ve);var se=require("lit"),rt=require("lit/decorators.js");var Fe=class extends se.LitElement{constructor(){super();this.data=null;new h(this)}render(){if(!this.data)return se.html`<div class="roxy-empty" role="status">No ruling planets data</div>`;let e=this.data,r=e.significators??[];return se.html`<div class="wrap" aria-label="KP ruling planets"><header><h2 class="title">KP ruling planets</h2>${e.dayLord?se.html`<div class="day-lord">Day lord: <strong>${e.dayLord}</strong></div>`:se.nothing}</header><div class="groups"><div class="group"><h3>Moon</h3><dl><dt>Sign lord</dt><dd>${e.moonSignLord??""}</dd><dt>Star lord</dt><dd>${e.moonStarLord??""}</dd><dt>Sub lord</dt><dd>${e.moonSublord??""}</dd><dt>Sub-sub lord</dt><dd>${e.moonSubSublord??""}</dd></dl></div><div class="group"><h3>Lagna</h3><dl><dt>Sign lord</dt><dd>${e.lagnaSignLord??""}</dd><dt>Star lord</dt><dd>${e.lagnaStarLord??""}</dd><dt>Sub lord</dt><dd>${e.lagnaSublord??""}</dd><dt>Sub-sub lord</dt><dd>${e.lagnaSubSublord??""}</dd></dl></div></div>${e.rulingPlanets?.length?se.html`<div class="rp-list" role="list" aria-label="Ruling planets by strength"><span class="rp-label">Ruling planets</span> ${e.rulingPlanets.map((t,a)=>se.html`<span class="rp" role="listitem"><span class="rank">${a+1}</span> ${t}</span>`)}</div>`:se.nothing} ${r.length?se.html`<table aria-label="House significators"><thead><tr><th scope="col">Planet</th><th scope="col">Signifies houses</th></tr></thead><tbody>${r.map(t=>se.html`<tr><td>${t.planet}</td><td>${(t.signifies??[]).join(", ")}</td></tr>`)}</tbody></table>`:se.nothing}</div>`}};Fe.styles=[y,se.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);padding:var(--roxy-space-md,1rem);gap:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.day-lord{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.day-lord strong{color:var(--roxy-fg,#0a0a0a)}.groups{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(11rem,1fr));display:grid}.group h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.group dl{gap:2px var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:auto 1fr;margin:0;display:grid}.group dt{color:var(--roxy-muted,#71717a)}.group dd{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600);margin:0}.rp-list{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;align-items:center;display:flex}.rp-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em;margin-right:var(--roxy-space-xs,.25rem)}.rp{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:999px;align-items:center;gap:.3em;padding:.15em .6em;display:inline-flex}.rp .rank{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-accent-ink,#b45309)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-sm,.5rem);text-align:left;border-bottom:1px solid var(--roxy-border,#e4e4e7)}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}`],d([(0,rt.property)({attribute:!1})],Fe.prototype,"data",2),Fe=d([(0,rt.customElement)("roxy-kp-ruling-planets")],Fe);var le=require("lit"),de=require("lit/decorators.js");function _t(o,n){let e,r=((...t)=>{e&&clearTimeout(e),e=setTimeout(()=>{e=void 0,o(...t)},n)});return r.cancel=()=>{e&&(clearTimeout(e),e=void 0)},r}var ee=class extends le.LitElement{constructor(){super(...arguments);this.endpoint="https://roxyapi.com/api/v2/location/search";this.placeholder="Search city";this.defaultValue="";this.query="";this.results=[];this.isOpen=!1;this.isLoading=!1;this.highlight=-1;this.secretKeyWarned=!1;this.debouncedFetch=_t(e=>{this.fetchResults(e)},300);this.onInput=e=>{let r=e.target.value;if(this.query=r,r.length<2){this.results=[],this.isOpen=!1,this.highlight=-1;return}this.debouncedFetch(r)};this.onKeyDown=e=>{if(!this.isOpen||this.results.length===0){e.key==="ArrowDown"&&this.query.length>=2&&(this.fetchResults(this.query),e.preventDefault());return}if(e.key==="ArrowDown")e.preventDefault(),this.highlight=(this.highlight+1)%this.results.length;else if(e.key==="ArrowUp")e.preventDefault(),this.highlight=(this.highlight-1+this.results.length)%this.results.length;else if(e.key==="Enter"){e.preventDefault();let r=this.results[this.highlight]??this.results[0];r&&this.select(r)}else e.key==="Escape"&&(this.isOpen=!1)}}connectedCallback(){super.connectedCallback(),this.query=this.defaultValue,this.clickOutsideHandler=e=>{e.composedPath().includes(this)||(this.isOpen=!1)},document.addEventListener("mousedown",this.clickOutsideHandler)}disconnectedCallback(){super.disconnectedCallback(),this.clickOutsideHandler&&document.removeEventListener("mousedown",this.clickOutsideHandler),this.debouncedFetch.cancel(),this.abortController&&(this.abortController.abort(),this.abortController=void 0)}warnIfSecretKey(){if(this.secretKeyWarned||!this.apiKey||this.apiKey.startsWith("pk_"))return;this.secretKeyWarned=!0;let e="Possible secret key in client-side <roxy-location-search>; use a `pk_` publishable key with origin allowlist instead.";console.warn(e),this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{reason:"possible-secret-key",message:e},bubbles:!0,composed:!0}))}async fetchResults(e){this.warnIfSecretKey(),this.abortController&&this.abortController.abort();let r=new AbortController;this.abortController=r,this.isLoading=!0;try{let t=new URL(this.endpoint);t.searchParams.set("q",e),t.searchParams.set("limit","8");let a={Accept:"application/json"};this.apiKey&&this.publishableKey&&console.warn("[roxy-location-search] both api-key and publishable-key set; using publishable-key. Remove api-key from your widget markup.");let s=this.publishableKey??this.apiKey;s&&(a["X-API-Key"]=s);let i=await fetch(t,{headers:a,signal:r.signal});if(!i.ok)throw new Error(`HTTP ${i.status}`);let l=await i.json();if(r.signal.aborted)return;this.results=l.cities??[],this.isOpen=this.results.length>0,this.highlight=this.results.length>0?0:-1}catch(t){if(t?.name==="AbortError")return;this.results=[],this.isOpen=!1}finally{this.abortController===r&&(this.abortController=void 0),r.signal.aborted||(this.isLoading=!1)}}select(e){this.query=`${e.city}${e.province?`, ${e.province}`:""}, ${e.country}`,this.isOpen=!1,this.results=[],this.dispatchEvent(new CustomEvent("roxy-location-select",{detail:e,bubbles:!0,composed:!0}))}render(){return le.html`<div class="field"><input type="text" role="combobox" aria-expanded="${this.isOpen?"true":"false"}" aria-controls="roxy-location-listbox" aria-activedescendant="${this.isOpen&&this.highlight>=0?`roxy-location-option-${this.highlight}`:""}" aria-autocomplete="list" autocomplete="off" placeholder="${this.placeholder}" .value="${this.query}" @input="${this.onInput}" @keydown="${this.onKeyDown}" @focus="${()=>{this.results.length>0&&(this.isOpen=!0)}}"> ${this.isLoading?le.html`<span class="spinner" role="status" aria-label="Loading"></span>`:le.nothing} ${this.isOpen?le.html`<ul id="roxy-location-listbox" class="results" role="listbox">${this.results.length===0?le.html`<li class="empty" role="status">No cities found</li>`:this.results.map((e,r)=>le.html`<li role="presentation"><button type="button" class="option" role="option" id="${`roxy-location-option-${r}`}" aria-selected="${this.highlight===r?"true":"false"}" @click="${()=>this.select(e)}" @mouseenter="${()=>{this.highlight=r}}"><span class="city">${e.city}</span> <span class="where">${e.province?le.html`${e.province},`:""}${e.country}</span> <span class="tz">UTC${e.utcOffset>=0?"+":""}${e.utcOffset}</span></button></li>`)}</ul>`:le.nothing}</div>`}};ee.styles=[y,le.css`:host{display:block;position:relative}.field{position:relative}input{width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);transition:border-color var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));box-sizing:border-box;font-family:inherit}input:focus{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-color:var(--roxy-accent-ink,#b45309)}.spinner{border:2px solid var(--roxy-muted,#71717a);border-top-color:#0000;border-radius:50%;width:14px;height:14px;animation:.7s linear infinite roxy-spin;position:absolute;top:50%;right:12px;transform:translateY(-50%)}@keyframes roxy-spin{to{transform:translateY(-50%)rotate(360deg)}}@media (prefers-reduced-motion:reduce){.spinner{animation:none}}.results{z-index:50;background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);box-shadow:var(--roxy-shadow-md);max-height:22rem;animation:roxy-fade-in var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));position:absolute;top:calc(100% + 4px);left:0;right:0;overflow-y:auto}.option{align-items:baseline;gap:var(--roxy-space-sm,.5rem);width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;font-family:inherit;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);cursor:pointer;transition:background-color var(--roxy-motion-duration,.2s);background:0 0;border:0;display:flex}.option:hover,.option[aria-selected=true]{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 10%, transparent)}.option .city{font-weight:var(--roxy-weight-bold,600)}.option .where{color:var(--roxy-muted,#71717a);flex-grow:1}.option .tz{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums}.empty{padding:var(--roxy-space-md,1rem);color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}`],d([(0,de.property)({type:String,attribute:"api-key"})],ee.prototype,"apiKey",2),d([(0,de.property)({type:String,attribute:"publishable-key"})],ee.prototype,"publishableKey",2),d([(0,de.property)({type:String})],ee.prototype,"endpoint",2),d([(0,de.property)({type:String})],ee.prototype,"placeholder",2),d([(0,de.property)({type:String,attribute:"default-value"})],ee.prototype,"defaultValue",2),d([(0,de.state)()],ee.prototype,"query",2),d([(0,de.state)()],ee.prototype,"results",2),d([(0,de.state)()],ee.prototype,"isOpen",2),d([(0,de.state)()],ee.prototype,"isLoading",2),d([(0,de.state)()],ee.prototype,"highlight",2),ee=d([(0,de.customElement)("roxy-location-search")],ee);var j=require("lit"),Tr=require("lit/decorators.js");var Ne=class extends j.LitElement{constructor(){super();this.data=null;this.mode="current";new h(this)}render(){let e=this.data;if(!e)return j.html`<div class="roxy-empty" role="status">No moon phase data</div>`;let r="phases"in e?e.phases:"calendar"in e?e.calendar:[];if(this.mode!=="current"&&r.length>0){let t="month"in e?e.month:void 0,a="year"in e?e.year:void 0;return j.html`<article class="card" aria-label="Moon phase calendar"><h2 class="label">${t??"Moon phases"} ${a??""}</h2><div class="list" role="list">${r.map(s=>this.renderListItem(s))}</div></article>`}return"phase"in e?this.renderSingle(e):j.nothing}renderSingle(e){let r=Kt(e.phase);return j.html`<article class="card" aria-label="Current moon phase"><div class="hero"><span class="emoji" aria-hidden="true">${r}</span><div><h2 class="label">${e.phase??"Moon"}</h2>${e.date?j.html`<div class="date">${e.date}</div>`:j.nothing}</div></div><div class="stats">${typeof e.illumination=="number"?j.html`<div><span>Illumination</span> <strong>${Ka(e.illumination)}</strong></div>`:j.nothing} ${typeof e.age=="number"?j.html`<div><span>Age</span> <strong>${v(e.age,1)} days</strong></div>`:j.nothing} ${e.sign?j.html`<div><span>Sign</span> <strong>${e.sign}</strong></div>`:j.nothing} ${typeof e.distance=="number"?j.html`<div><span>Distance</span> <strong>${(e.distance/1e3).toFixed(0)}k km</strong></div>`:j.nothing}</div>${e.meaning?.description?j.html`<p class="meaning">${e.meaning.description}</p>`:j.nothing} ${e.meaning?.keywords?.length?j.html`<div class="keywords">${e.meaning.keywords.map(t=>j.html`<span>${t}</span>`)}</div>`:j.nothing}</article>`}renderListItem(e){let r=Kt(e.phase);return j.html`<div class="list-item" role="listitem"><span aria-hidden="true">${r}</span> <span>${e.phase}</span> <span>${e.date??""}</span></div>`}};Ne.styles=[y,j.css`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.emoji{font-size:3rem;line-height:1}.label{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.stats{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.stats div span:first-child{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.stats strong{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}.meaning{color:var(--roxy-fg,#0a0a0a)}.keywords{gap:var(--roxy-space-xs,.25rem);margin-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.keywords span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.list{gap:var(--roxy-space-sm,.5rem);display:grid}.list-item{gap:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem) 0;font-size:var(--roxy-text-sm,.875rem);grid-template-columns:2.5rem 1fr auto;align-items:center;display:grid}.list-item:last-child{border-bottom:none}`],d([(0,Tr.property)({attribute:!1})],Ne.prototype,"data",2),d([(0,Tr.property)({type:String,reflect:!0})],Ne.prototype,"mode",2),Ne=d([(0,Tr.customElement)("roxy-moon-phase")],Ne);function Kt(o){return o?Pt[o.toLowerCase()]??"\u{1F319}":"\u{1F319}"}function Ka(o){let n=o<=1?o*100:o;return`${Math.round(n)}%`}var H=require("lit"),tt=require("lit/decorators.js");var Ue=class extends H.LitElement{constructor(){super();this.data=null;new h(this)}render(){if(!this.data)return H.html`<div class="roxy-empty" role="status">No nakshatra data</div>`;let e=this.data,r=e.remedies;return H.html`<article class="wrap" aria-label="${`Nakshatra ${e.name}`}"><header class="head"><h2 class="name">${e.name}</h2>${typeof e.number=="number"?H.html`<span class="number">Nakshatra ${e.number} of 27</span>`:H.nothing} ${e.range?H.html`<span class="range">${e.range}</span>`:H.nothing}</header><dl class="facts">${e.lord?H.html`<div class="fact"><dt>Lord</dt><dd>${e.lord}</dd></div>`:H.nothing} ${e.deity?H.html`<div class="fact"><dt>Deity</dt><dd>${e.deity}</dd></div>`:H.nothing} ${e.symbol?H.html`<div class="fact"><dt>Symbol</dt><dd>${e.symbol}</dd></div>`:H.nothing}</dl>${e.characteristics?H.html`<div class="section"><h3>Characteristics</h3><p>${e.characteristics}</p></div>`:H.nothing} ${r?H.html`<div class="section"><h3>Remedies</h3><div class="remedies">${r.mantras?H.html`<div class="remedy"><strong>Mantras:</strong> ${r.mantras}</div>`:H.nothing} ${r.gemstones?H.html`<div class="remedy"><strong>Gemstones:</strong> ${r.gemstones}</div>`:H.nothing} ${r.rituals?H.html`<div class="remedy"><strong>Rituals:</strong> ${r.rituals}</div>`:H.nothing}</div></div>`:H.nothing}</article>`}};Ue.styles=[y,H.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);padding:var(--roxy-space-md,1rem);gap:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);display:grid}.head{align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.number{color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600)}.range{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.facts{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.fact{gap:2px;display:grid}.fact dt{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.05em}.fact dd{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);margin:0}.section h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.section p{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0;line-height:1.5}.remedies{gap:var(--roxy-space-xs,.25rem);display:grid}.remedy{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.remedy strong{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600)}`],d([(0,tt.property)({attribute:!1})],Ue.prototype,"data",2),Ue=d([(0,tt.customElement)("roxy-nakshatra-card")],Ue);var g=require("lit"),or=require("lit/decorators.js");var at=require("lit");function be(){return at.html`<svg class="roxy-chevron" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"><path d="M4 6l4 4 4-4" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>`}var cr=at.css`summary{list-style:none}summary::-webkit-details-marker{display:none}.roxy-chevron{aspect-ratio:auto;width:14px;height:14px;color:var(--roxy-muted,#71717a);transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,ease);flex-shrink:0}details[open]>summary .roxy-chevron{transform:rotate(180deg)}@media (prefers-reduced-motion:reduce){.roxy-chevron{transition:none}}`;var bt=420,$=bt/2,pr=164,ft=146,Rr=120,mr=96,Ya=178,qa=196,ve=class extends g.LitElement{constructor(){super();this.data=null;this.houseSystem="placidus";this.view="wheel";new h(this)}getPlanets(){return this.data?.planets??[]}getAscendant(){return this.data?.ascendant?.longitude??0}getMidheaven(){let e=this.data?.midheaven?.longitude;return typeof e=="number"?e:null}toAngle(e){return 180+this.getAscendant()-e}render(){if(!this.data)return g.html`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.getPlanets(),r=this.data.aspects??[],t=this.view;return g.html`<div class="wrap"><header><h2 class="title">Natal chart</h2>${this.data.birthDetails?g.html`<div class="meta">${[this.data.birthDetails.date,this.data.birthDetails.time].filter(Boolean).join(" \xB7 ")}</div>`:g.nothing}</header>${lr({items:[{id:"wheel",label:"Wheel"},{id:"grid",label:"Aspect grid"}],active:t,onSelect:a=>{this.view=a},label:"Natal chart views",idPrefix:"natal",controls:!0})}<div id="natal-panel-${t}" role="tabpanel" aria-labelledby="natal-tab-${t}">${t==="wheel"?this.renderWheel(e,r):this.renderAspectGrid(e,r)}</div><div class="legend"><span>${e.length} planets</span> <span>${r.length} aspects</span> ${this.data.houseSystem?g.html`<span>${this.data.houseSystem} houses</span>`:g.nothing} <span><span class="legend-swatch" style="background:var(--roxy-success)"></span>harmonious</span> <span><span class="legend-swatch" style="background:var(--roxy-danger)"></span>challenging</span></div>${this.renderDetails()} ${this.renderInterpretations()}</div>`}renderWheel(e,r){return g.html`<svg viewBox="0 0 ${bt} ${bt}" role="img" aria-label="Natal chart wheel with twelve houses, planets, and aspects"><title>Natal chart wheel</title><desc>Twelve zodiac sign segments around a circular wheel. Planet glyphs are placed at their ecliptic longitudes. Aspect lines connect related planets.</desc><circle class="wheel-line" cx="${$}" cy="${$}" r="${pr}" stroke-width="1.5"/><circle class="wheel-line" cx="${$}" cy="${$}" r="${ft-14}" stroke-width="0.8"/><circle class="wheel-line" cx="${$}" cy="${$}" r="${Rr}" stroke-width="1"/><circle class="wheel-line" cx="${$}" cy="${$}" r="${mr-16}" stroke-width="0.5"/>${this.renderTicks()} ${this.renderSpokes()} ${this.renderSigns()} ${this.renderHouseNumbers()} ${this.renderCuspDegrees()} ${this.renderAspects(e,r)} ${this.renderPlanets(e)} ${this.renderAngles()}</svg>`}renderAspectGrid(e,r){let t=e.map(s=>b(s.name)),a=new Map;for(let s of r){let i=[b(s.planet1),b(s.planet2)].sort().join("|");a.set(i,s)}return t.length===0?g.html`<p class="roxy-empty" role="status">No planets to grid</p>`:g.html`<div class="grid-scroll"><table class="aspect-grid" aria-label="Planet by planet aspect grid"><thead><tr><th></th>${t.slice(0,-1).map(s=>{let i=I[s]??s.slice(0,2);return g.html`<th scope="col" title="${s}">${i}</th>`})}</tr></thead><tbody>${t.slice(1).map((s,i)=>{let l=I[s]??s.slice(0,2);return g.html`<tr><th scope="row" title="${s}">${l}</th>${t.slice(0,i+1).map(c=>{let m=a.get([s,c].sort().join("|"));if(!m)return g.html`<td class="empty"></td>`;let p=ir(m),u=fr[p]??fr[p.replace(/-/g,"")]??p.slice(0,3),P=tr[p]??"aspect-other",x=v(m.orb,1);return g.html`<td class="${`cell ${P}`}" title="${`${s} ${p} ${c}${x?` (orb ${x}\xB0)`:""}`}"><span class="asp">${u}</span></td>`})} ${t.slice(i+1,-1).map(()=>g.html`<td class="empty"></td>`)}</tr>`})}</tbody></table></div>`}renderAngles(){let e=this.getAscendant(),r=this.getMidheaven(),t=[this.renderAngleMark(e,"ASC"),this.renderAngleMark(ut(e),"DSC")];r!==null&&(t.push(this.renderAngleMark(r,"MC")),t.push(this.renderAngleMark(ut(r),"IC")));let a=this.data?.partOfFortune?.longitude;typeof a=="number"&&t.push(this.renderAngleMark(xe(a),"PoF"));let s=this.data?.vertex?.longitude;return typeof s=="number"&&t.push(this.renderAngleMark(xe(s),"Vtx")),t}renderAngleMark(e,r){let t=this.toAngle(e),a=G($,$,pr,t),s=G($,$,Ya,t),i=G($,$,qa,t);return g.svg`
|
|
73
|
+
`}function Fs(n){let a=n.lagnaSign.toLowerCase();return T.svg`
|
|
74
|
+
${Ks(n.divisionLabel)}
|
|
75
|
+
${te.map(e=>_s(e,n.placements[e.toLowerCase()]??[],e.toLowerCase()===a,St(e,n.lagnaSign)))}
|
|
76
|
+
`}function ha(n,a){switch(a){case"north":return js(n);case"east":return Fs(n);default:return Ls(n)}}function fa(n,a){return Br({items:Cs,active:n,onSelect:a,label:"Kundli style",idPrefix:"kundli"})}var Rt=require("lit"),ba=Rt.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.header{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}svg{width:100%;max-width:var(--roxy-chart-max-width,560px);aspect-ratio:1;height:auto;margin:0 auto;display:block}.line{fill:#0000;stroke:var(--roxy-border,#d4d4d8)}.sign-text{fill:var(--roxy-muted,#71717a);font-size:11px;font-weight:500;font-family:var(--roxy-font-sans);text-transform:uppercase;letter-spacing:.04em}.rashi-num{fill:var(--roxy-muted,#71717a);font-size:12px;font-weight:500;font-family:var(--roxy-font-sans)}.house-num{fill:var(--roxy-accent-ink,#b45309);font-size:11px;font-weight:600;font-family:var(--roxy-font-sans);opacity:.85}.planet-text{fill:var(--roxy-fg,#0a0a0a);font-size:13px;font-weight:600;font-family:var(--roxy-font-sans)}.centre-label{fill:var(--roxy-muted,#71717a);font-size:14px;font-weight:600;font-family:var(--roxy-font-sans);letter-spacing:.02em}.lagna-marker{fill:var(--roxy-accent-ink,#b45309);font-size:10px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.08em;text-transform:uppercase}.lagna-bg{fill:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent)}.lagna-slash{stroke:var(--roxy-accent,#f59e0b);stroke-linecap:round;opacity:.7}`;var We=class extends m{constructor(){super(...arguments);this.chartStyle="north";this.setStyle=e=>{this.chartStyle=e}}viewModel(){if(!this.data?.chart?.meta)return null;let{division:e}=this.data,r=`D${e.number} ${e.name}`;return xa(this.data.chart.meta,r)}renderEmpty(){return be.html`<div class="roxy-empty" role="status">No divisional chart data</div>`}renderData(e){let r=this.viewModel();if(!r)return this.renderEmpty();let{division:t,vargottama:s}=e;return be.html`<div class="wrap"><div class="header"><div><h2 class="title">D${t.number} ${t.name} ${t.sanskritName&&t.sanskritName!==t.name?be.html`<span class="division-meta">· ${t.sanskritName}</span>`:be.nothing}</h2>${t.significance?be.html`<p class="significance">${t.significance}</p>`:be.nothing}</div>${fa(this.chartStyle,this.setStyle)}</div><svg viewBox="0 0 400 400" preserveAspectRatio="xMidYMid meet" role="img" aria-label="D${t.number} ${t.name} divisional chart with twelve sign houses"><title>D${t.number} ${t.name}</title>${ha(r,this.chartStyle)}</svg> ${s&&s.length>0?be.html`<div class="vargottama-row" role="list" aria-label="Vargottama planets"><span class="vargottama-label">Vargottama:</span> ${s.map(o=>be.html`<span class="vargottama-pill" role="listitem">${N[o]??""} ${o}</span>`)}</div>`:be.nothing}</div>`}};We.styles=[g,ba,Ue,be.css`.division-meta{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin:0}.significance{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);border-left:2px solid var(--roxy-border,#e4e4e7);padding-left:var(--roxy-space-sm,.5rem);margin:0}.vargottama-row{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;align-items:center;display:flex}.vargottama-label{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);margin-right:var(--roxy-space-xs,.25rem);font-weight:500}.vargottama-pill{font-size:var(--roxy-text-sm,.875rem);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 22%, transparent);color:var(--roxy-fg,#0a0a0a);border:1px solid color-mix(in srgb, var(--roxy-accent,#f59e0b) 45%, transparent);border-radius:999px;align-items:center;gap:.2em;padding:.15em .6em;font-weight:600;display:inline-flex}`],d([(0,va.property)({type:String,reflect:!0,attribute:"chart-style"})],We.prototype,"chartStyle",2),We=d([(0,va.customElement)("roxy-divisional-chart")],We);var ae=require("lit"),$a=require("lit/decorators.js");var qs={manglik:"Mangal Dosha",kalsarpa:"Kaal Sarp Dosha",sadhesati:"Sade Sati"},Je=class extends m{constructor(){super(...arguments);this.type="manglik"}renderEmpty(){return ae.html`<div class="roxy-empty" role="status">No dosha data</div>`}renderData(e){let r=!!e.present,t=qs[this.type]??this.type,s=(e.severity??"").toLowerCase(),o=s==="severe"?3:s==="moderate"?2:s==="mild"?1:0,i=o*33,l=o===3?"var(--roxy-danger)":o===2?"var(--roxy-warning)":o===1?"var(--roxy-success)":"transparent";return ae.html`<article class="card" aria-label="${t}"><header class="head"><h2 class="title">${t}</h2><span class="${`badge ${r?"present":"absent"}`}">${r?"Present":"Absent"}</span></header>${e.severity?ae.html`<div class="severity-bar" role="meter" aria-valuemin="0" aria-valuemax="3" aria-valuenow="${o}" aria-label="Severity ${e.severity}"><span class="severity-fill" style="width:${i}%;background:${l}"></span></div>`:ae.nothing} ${e.description?ae.html`<p class="description">${e.description}</p>`:ae.nothing} ${this.renderEffects(e)} ${e.remedies&&e.remedies.length>0?ae.html`<div><h3>Remedies</h3><ul>${e.remedies.map(c=>ae.html`<li>${c}</li>`)}</ul></div>`:ae.nothing} ${"exceptions"in e&&e.exceptions&&e.exceptions.length>0?ae.html`<div><h3>Exceptions</h3><ul>${e.exceptions.map(c=>ae.html`<li>${c}</li>`)}</ul></div>`:ae.nothing}</article>`}renderEffects(e){if(!e.effects)return ae.nothing;let r=Object.entries(e.effects).filter(([,t])=>typeof t=="string"&&t.length>0);return r.length===0?ae.nothing:ae.html`<div class="effects">${r.map(([t,s])=>ae.html`<div><h3>${t}</h3><p>${s}</p></div>`)}</div>`}};Je.styles=[g,ae.css`.card{background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.badge{align-items:center;gap:var(--roxy-space-xs,.25rem);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em;padding:4px 10px;display:inline-flex}.badge.absent{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.badge.present{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.severity-bar{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 30%, transparent);border-radius:4px;width:100%;height:8px;position:relative;overflow:hidden}.severity-fill{height:100%;transition:width var(--roxy-motion-duration,.2s) ease-out;border-radius:4px;display:block}@media (prefers-reduced-motion:reduce){.severity-fill{transition:none}}.description{color:var(--roxy-fg,#0a0a0a);margin:0}h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);margin:0}.effects{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.effects p{font-size:var(--roxy-text-sm,.875rem);margin:0}`],d([(0,$a.property)({type:String,reflect:!0})],Je.prototype,"type",2),Je=d([(0,$a.customElement)("roxy-dosha-card")],Je);var De=require("lit"),Ct=require("lit/decorators.js");var $r=class extends m{renderData(a){return De.html`<article class="card" aria-label="${a.name??"Dream symbol"}"><header class="head">${a.letter?De.html`<span class="letter" aria-hidden="true">${a.letter}</span>`:De.nothing}<div><p class="label">Dream symbol</p>${a.name?De.html`<h2 class="name">${a.name}</h2>`:De.nothing}</div></header>${a.meaning?De.html`<p class="meaning">${a.meaning}</p>`:De.nothing}</article>`}renderEmpty(){return De.html`<div class="roxy-empty" role="status">No dream symbol</div>`}};$r.styles=[g,De.css`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.letter{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 16%, transparent);width:2.5rem;height:2.5rem;color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-variant-numeric:tabular-nums;flex:none;justify-content:center;align-items:center;display:inline-flex}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.meaning{color:var(--roxy-fg,#0a0a0a);margin:0;line-height:1.6}`],$r=d([(0,Ct.customElement)("roxy-dream-card")],$r);var Oe=require("lit"),Tt=require("lit/decorators.js");var wr=class extends m{renderEmpty(){return Oe.html`<div class="roxy-empty" role="status">No symbols match</div>`}renderData(a){let e=a.symbols??[];if(e.length===0)return this.renderEmpty();let r=typeof a.total=="number"?a.total:e.length;return Oe.html`<section class="wrap" aria-label="Dream symbols"><header class="head"><h2 class="title">Dream Symbols</h2><span class="count">${r} match${r===1?"":"es"}</span></header><ul class="grid">${e.map(t=>Oe.html`<li><button type="button" class="result" @click="${()=>this.select(t)}">${t.letter?Oe.html`<span class="letter" aria-hidden="true">${t.letter}</span>`:Oe.nothing} <span class="name">${t.name}</span></button></li>`)}</ul></section>`}select(a){this.dispatchEvent(new CustomEvent("roxy-symbol-select",{detail:{id:a.id,name:a.name,letter:a.letter},bubbles:!0,composed:!0}))}};wr.styles=[g,Oe.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.count{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.grid{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fill,minmax(8rem,1fr));margin:0;padding:0;list-style:none;display:grid}.result{align-items:center;gap:var(--roxy-space-sm,.5rem);text-align:left;width:100%;font:inherit;color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);cursor:pointer;background:0 0;transition:border-color .12s,background .12s;display:flex}.result:hover,.result:focus-visible{border-color:var(--roxy-accent,#f59e0b);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent);outline:none}.letter{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 16%, transparent);width:1.6rem;height:1.6rem;color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;flex:none;place-items:center;display:grid}.name{font-size:var(--roxy-text-sm,.875rem);font-weight:500}`],wr=d([(0,Tt.customElement)("roxy-dream-search")],wr);var Q=require("lit"),ve=require("lit/decorators.js");var _a=new Map;async function Vs(n){let a=_a.get(n);return a||(a=fetch(n).then(async e=>{if(!e.ok)throw new Error(`HTTP ${e.status}`);return await e.json()}).catch(e=>{throw _a.delete(n),e}),_a.set(n,a)),a}var ce=class extends Q.LitElement{constructor(){super(...arguments);this.endpoint="vedic-astrology/birth-chart";this.method="POST";this.specUrl="https://roxyapi.com/api/v2/openapi.json";this.submitLabel="Submit";this.fields=[];this.values={};this.loaded=!1;this.specError=null;this.retryLoadSchema=()=>{this.loaded=!1,this.specError=null,this.loadSchema()};this.onSubmit=e=>{e.preventDefault();let r=this.fields.filter(s=>s.required).filter(s=>this.values[s.key]===void 0||this.values[s.key]==="");if(r.length>0){this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{missing:r.map(s=>s.key)},bubbles:!0,composed:!0}));return}let t={};for(let s of this.fields){let o=this.values[s.key];if(!(o===void 0||o===""))if(s.group){let i=t[s.group]??{};i[s.name]=o,t[s.group]=i}else t[s.name]=o}this.dispatchEvent(new CustomEvent("roxy-submit",{detail:{endpoint:this.endpoint,values:t},bubbles:!0,composed:!0}))}}connectedCallback(){super.connectedCallback(),this.loadSchema()}async loadSchema(){this.specError=null;try{let e=await Vs(this.specUrl),r=`/${this.endpoint.replace(/^\//,"")}`,t=e.paths?.[r]?.[this.method.toLowerCase()];if(!t)throw new Error(`Endpoint ${this.method} ${r} not found in OpenAPI spec`);let s=e.components?.schemas??{},o=[],i;if(t.requestBody){let c=t.requestBody.content?.["application/json"]?.schema;i=this.resolve(c,s)}if(i?.properties){let c=new Set(i.required??[]);for(let[p,y]of Object.entries(i.properties)){let x=this.resolve(y,s)??{};if(x.type==="object"&&x.properties){let j=new Set(x.required??[]);for(let[b,dr]of Object.entries(x.properties)){let Pe=this.resolve(dr,s)??{};o.push({key:`${p}.${b}`,name:b,group:p,type:this.fieldType(Pe),required:c.has(p)&&j.has(b),description:Pe.description,enum:Pe.enum,min:Pe.minimum,max:Pe.maximum,default:Pe.default})}}else o.push({key:p,name:p,type:this.fieldType(x),required:c.has(p),description:x.description,enum:x.enum,min:x.minimum,max:x.maximum,default:x.default})}}for(let c of t.parameters??[])if(c.in==="path"||c.in==="query"){let p=this.resolve(c.schema,s)??{};o.push({key:c.name,name:c.name,type:this.fieldType(p),required:!!c.required,description:p.description,enum:p.enum,default:p.default})}this.fields=o;let l={};for(let c of o){c.default!==void 0&&(l[c.key]=c.default);let p=c.group?this.initialValues?.[c.group]?.[c.name]:this.initialValues?.[c.name];p!==void 0&&(l[c.key]=p)}this.values=l,this.loaded=!0}catch(e){let r=e instanceof Error?e.message:String(e);this.specError=r,this.loaded=!0,this.dispatchEvent(new CustomEvent("roxy-spec-error",{detail:{url:this.specUrl,message:r},bubbles:!0,composed:!0}))}}resolve(e,r){if(e){if("$ref"in e&&e.$ref){let t=e.$ref.split("/").pop();return t?r[t]:void 0}return e}}fieldType(e){return e.enum?"enum":e.format==="date"?"date":e.format==="time"?"time":e.format==="date-time"?"datetime":e.type==="integer"||e.type==="number"?"number":"text"}setValue(e,r){this.values={...this.values,[e]:r}}groupHasLocation(e){let r=this.fields.filter(t=>t.group===e);return["latitude","longitude","timezone"].every(t=>r.some(s=>s.name===t))}onLocationFor(e){let r=e?`${e}.`:"";return t=>{let s=t.detail;s&&(this.values={...this.values,[`${r}latitude`]:s.latitude,[`${r}longitude`]:s.longitude,[`${r}timezone`]:s.timezone??s.utcOffset})}}render(){if(!this.loaded)return Q.html`<form><div class="roxy-skeleton" style="height:8rem"></div></form>`;if(this.specError)return Q.html`<div class="spec-error" role="alert">Schema load failed: ${this.specError} <button type="button" class="submit" @click="${this.retryLoadSchema}">Retry</button></div>`;let e=o=>{if(this.groupHasLocation(o.group)&&(o.name==="latitude"||o.name==="longitude"||o.name==="timezone"))return Q.nothing;let i=`roxy-form-${o.key}`;return Q.html`<div class="field"><label for="${i}">${Y(o.name)}${o.required?Q.html`<span class="req" aria-hidden="true">*</span>`:Q.nothing}</label> ${o.enum?Q.html`<select id="${i}" ?required="${o.required}" @change="${l=>this.setValue(o.key,l.target.value)}"><option value="">Choose</option>${o.enum.map(l=>Q.html`<option value="${l}" ?selected="${this.values[o.key]===l}">${l}</option>`)}</select>`:Q.html`<input id="${i}" type="${this.htmlType(o.type)}" ?required="${o.required}" min="${o.min??""}" max="${o.max??""}" step="${o.type==="number"?"any":""}" .value="${this.values[o.key]??""}" @input="${l=>this.setValue(o.key,this.coerce(o.type,l.target.value))}">`} ${o.description?Q.html`<small class="help">${o.description}</small>`:Q.nothing}</div>`},r=[];for(let o of this.fields)r.includes(o.group)||r.push(o.group);let t=o=>this.groupHasLocation(o)?Q.html`<div class="location-block"><label>${o?`${Y(o)} location`:"Birth location"}</label><roxy-location-search @roxy-location-select="${this.onLocationFor(o)}" placeholder="City of birth"></roxy-location-search><small class="help">Required: latitude, longitude, timezone. Pick a city to autofill.</small></div>`:Q.nothing,s=o=>Q.html`${t(o)}<div class="fields">${this.fields.filter(i=>i.group===o).map(i=>e(i))}</div>`;return Q.html`<form @submit="${this.onSubmit}"><h2 class="title">${Y(this.endpoint.split("/").pop()??"")}</h2>${r.map(o=>o===void 0?s(void 0):Q.html`<fieldset class="person-group"><legend>${Y(o)}</legend>${s(o)}</fieldset>`)} <button class="submit" type="submit">${this.submitLabel}</button></form>`}htmlType(e){switch(e){case"date":return"date";case"time":return"time";case"datetime":return"datetime-local";case"number":return"number";default:return"text"}}coerce(e,r){if(r!==""){if(e==="number"){let t=Number(r);return Number.isFinite(t)?t:void 0}return r}}};ce.styles=[g,Q.css`form{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.fields{align-items:start;gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.person-group{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);margin:0 0 var(--roxy-space-md,1rem);gap:var(--roxy-space-md,1rem);min-inline-size:0;display:grid}.person-group legend{padding:0 var(--roxy-space-xs,.25rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize}.field{gap:var(--roxy-space-xs,.25rem);flex-direction:column;min-width:0;display:flex}label{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569)}label .req{color:var(--roxy-danger-fg,#991b1b);margin-left:4px}input,select{box-sizing:border-box;width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-family:inherit}input:focus,select:focus{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-color:var(--roxy-accent-ink,#b45309)}.help{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem)}.location-block{gap:var(--roxy-space-xs,.25rem);grid-column:1/-1;display:grid}.coords{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(3,1fr);display:grid}.coords input{font-size:var(--roxy-text-sm,.875rem)}button.submit{background:var(--roxy-accent-ink,#b45309);color:var(--roxy-bg,#fff);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-lg,1.5rem);font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600);cursor:pointer;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));border:0;justify-self:start}button.submit:hover{transform:scale(1.02)}button.submit:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}.spec-error{gap:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-danger,#dc2626);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);color:var(--roxy-danger-fg,#991b1b);font-size:var(--roxy-text-sm,.875rem);justify-items:start;display:grid}`],d([(0,ve.property)({type:String,attribute:"data-endpoint"})],ce.prototype,"endpoint",2),d([(0,ve.property)({type:String})],ce.prototype,"method",2),d([(0,ve.property)({type:String,attribute:"spec-url"})],ce.prototype,"specUrl",2),d([(0,ve.property)({type:String,attribute:"submit-label"})],ce.prototype,"submitLabel",2),d([(0,ve.property)({attribute:!1})],ce.prototype,"initialValues",2),d([(0,ve.state)()],ce.prototype,"fields",2),d([(0,ve.state)()],ce.prototype,"values",2),d([(0,ve.state)()],ce.prototype,"loaded",2),d([(0,ve.state)()],ce.prototype,"specError",2),ce=d([(0,ve.customElement)("roxy-endpoint-form")],ce);var ge=require("lit"),Et=require("lit/decorators.js");var kr=class extends m{renderEmpty(){return ge.html`<div class="roxy-empty" role="status">No digest data</div>`}renderData(a){let e=a.windows??[];if(e.length===0)return this.renderEmpty();let r=[Ce(a.startDate),Ce(a.endDate)].filter(Boolean).join(" \u2013 ");return ge.html`<div class="wrap" aria-label="Forecast digest"><div class="head"><h2 class="title">Forecast Digest</h2>${r?ge.html`<p class="subtitle">${r}</p>`:ge.nothing}</div>${e.map(t=>this.renderWindow(t))}</div>`}windowLabel(a){return a===1?"Next 24 hours":typeof a=="number"?`Next ${a} days`:"Window"}renderWindow(a){let e=a.top??[],r=a.byDomain??{},t=Object.entries(r);return ge.html`<section class="window"><div class="window-head"><span class="window-label">${this.windowLabel(a.days)}</span> <span class="window-count">${a.count??0} event${a.count===1?"":"s"}</span></div>${t.length>0?ge.html`<div class="domains">${t.map(([s,o])=>ge.html`<span class="domain-chip"><span class="swatch sw-${s}"></span>${Y(s)} ${o}</span>`)}</div>`:ge.nothing} ${e.length>0?ge.html`<div role="list">${e.map(s=>this.renderEvent(s))}</div>`:ge.html`<p class="quiet">No notable events.</p>`}</section>`}renderEvent(a){let e=typeof a.significance=="number"?a.significance:0;return ge.html`<div class="event" role="listitem"><span class="event-date">${Ce(a.date)}</span> <span class="event-desc">${a.description??Y(a.type??"")}</span> <span class="sig" role="img" aria-label="significance ${f(e,0)} of 100"><span class="sig-fill ${a.domain}" style="width:${Math.max(0,Math.min(100,e))}%"></span></span></div>`}};kr.styles=[g,ge.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.window{gap:var(--roxy-space-sm,.5rem);padding-top:var(--roxy-space-md,1rem);border-top:1px solid var(--roxy-border,#e4e4e7);display:grid}.window:first-of-type{border-top:none;padding-top:0}.window-head{flex-wrap:wrap;align-items:baseline;gap:.5rem;display:flex}.window-label{font-weight:var(--roxy-weight-bold,600)}.window-count{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;margin-left:auto}.domains{flex-wrap:wrap;gap:.4rem;display:flex}.domain-chip{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);align-items:center;gap:.35rem;display:inline-flex}.swatch{border-radius:2px;width:.65rem;height:.65rem;display:inline-block}.sw-western{background:var(--roxy-accent,#f59e0b)}.sw-vedic{background:var(--roxy-info,#2563eb)}.sw-biorhythm{background:var(--roxy-success,#16a34a)}.event{grid-template-columns:auto 1fr;align-items:baseline;gap:.25rem .6rem;display:grid}.event-date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;white-space:nowrap}.event-desc{font-size:var(--roxy-text-sm,.875rem);line-height:1.4}.sig{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);border-radius:2px;grid-column:2;height:4px;overflow:hidden}.sig-fill{border-radius:2px;height:100%;display:block}.sig-fill.western{background:var(--roxy-accent,#f59e0b)}.sig-fill.vedic{background:var(--roxy-info,#2563eb)}.sig-fill.biorhythm{background:var(--roxy-success,#16a34a)}.quiet{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);font-style:italic}`],kr=d([(0,Et.customElement)("roxy-forecast-digest")],kr);var J=require("lit"),Dt=require("lit/decorators.js");var Ys={western:"Western",vedic:"Vedic",biorhythm:"Biorhythm"},Us=["western","vedic","biorhythm"],Sr=class extends m{renderEmpty(){return J.html`<div class="roxy-empty" role="status">No forecast data</div>`}renderData(a){let e=a.events??[],r=this.groupByDate(e),t=Us.filter(s=>e.some(o=>o.domain===s));return J.html`<div class="wrap" aria-label="Forecast timeline"><header class="head"><h2 class="title">Forecast timeline</h2>${a.startDate&&a.endDate?J.html`<div class="range">${Ce(a.startDate)} - ${Ce(a.endDate)} · ${a.count??e.length} events</div>`:J.nothing}</header>${t.length?J.html`<div class="legend">${t.map(s=>J.html`<span><span class="swatch swatch-${s}"></span>${Ys[s]}</span>`)}</div>`:J.nothing} ${r.length?J.html`<div class="days" role="list">${r.map(([s,o])=>this.renderDay(s,o))}</div>`:J.html`<p class="roxy-empty" role="status">No events in this window</p>`}</div>`}groupByDate(a){let e=new Map;for(let r of a){let t=r.date??"",s=e.get(t)??[];s.push(r),e.set(t,s)}return[...e.entries()]}renderDay(a,e){return J.html`<div class="day" role="listitem"><div class="day-date">${Ce(a)}</div><div class="events">${e.map(r=>this.renderEvent(r))}</div></div>`}renderEvent(a){let e=typeof a.significance=="number"?a.significance:0,r=Math.max(0,Math.min(100,e));return J.html`<div class="event"><span class="dot dot-${a.domain}" aria-hidden="true"></span><div class="event-body"><div class="event-line">${this.renderHeadline(a)}</div>${a.description?J.html`<p class="event-desc">${a.description}</p>`:J.nothing}<div class="sig" title="Significance ${r} of 100"><span class="sig-track"><span class="sig-fill sig-fill-${a.domain}" style="width:${r}%"></span> </span><span class="sig-val">${r}</span></div></div></div>`}renderHeadline(a){let e=a.body?h(a.body):"",r=a.target?h(a.target):"",t=a.aspect?a.aspect.toLowerCase():"",s=gr[t]??"",o=t?Yr[t]??t:"",i=typeof a.orb=="number"?f(a.orb,1):"",l=this.typeQualifier(a);return t&&r?J.html`<strong>${e}</strong> <span class="${s}">${o}</span> <strong>${r}</strong>${i?J.html`<span class="kind">orb ${i}°</span>`:J.nothing}`:J.html`<strong>${e||Y(a.type??"")}</strong>${l?J.html`<span class="kind">${l}</span>`:J.nothing}`}typeQualifier(a){return a.type==="sign-ingress"&&a.target?`enters ${h(a.target)}`:a.type==="retrograde-station"&&a.station?a.station:a.type==="eclipse"?[a.kind,"eclipse"].filter(Boolean).join(" "):a.type==="critical-day"?"critical day":a.type==="dasha-change"&&a.target?`dasha ${h(a.target)}`:Y(a.type??"")}};Sr.styles=[g,J.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.range{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);font-variant-numeric:tabular-nums}.legend{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);flex-wrap:wrap;display:flex}.legend .swatch{vertical-align:middle;border-radius:50%;width:10px;height:10px;margin-right:4px;display:inline-block}.swatch-western{background:var(--roxy-accent,#f59e0b)}.swatch-vedic{background:var(--roxy-info,#2563eb)}.swatch-biorhythm{background:var(--roxy-success,#16a34a)}.day{gap:var(--roxy-space-md,1rem);padding-block:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);grid-template-columns:4.5rem 1fr;display:grid}.day:first-of-type{border-top:none}.day-date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;padding-top:2px}.events{gap:var(--roxy-space-sm,.5rem);display:grid}.event{gap:var(--roxy-space-sm,.5rem);grid-template-columns:.6rem 1fr;align-items:start;display:grid}.dot{border-radius:50%;width:.6rem;height:.6rem;margin-top:4px}.dot-western{background:var(--roxy-accent,#f59e0b)}.dot-vedic{background:var(--roxy-info,#2563eb)}.dot-biorhythm{background:var(--roxy-success,#16a34a)}.event-body{min-width:0}.event-line{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.event-line .aspect-trine,.event-line .aspect-sextile{color:var(--roxy-success-fg,#166534)}.event-line .aspect-square,.event-line .aspect-opposition{color:var(--roxy-danger-fg,#991b1b)}.event-line .aspect-conjunction{color:var(--roxy-accent-ink,#b45309)}.event-line .kind{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.04em;margin-left:.35em}.event-desc{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);margin:2px 0 0}.sig{align-items:center;gap:.4rem;margin-top:4px;display:flex}.sig-track{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);flex:1;max-width:8rem;height:4px;overflow:hidden}.sig-fill{border-radius:var(--roxy-radius-full,9999px);height:100%;display:block}.sig-fill-western{background:var(--roxy-accent,#f59e0b)}.sig-fill-vedic{background:var(--roxy-info,#2563eb)}.sig-fill-biorhythm{background:var(--roxy-success,#16a34a)}.sig-val{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums}`],Sr=d([(0,Dt.customElement)("roxy-forecast-timeline")],Sr);var ne=require("lit"),Pt=require("lit/decorators.js");var Rr=class extends m{renderEmpty(){return ne.html`<div class="roxy-empty" role="status">No Guna Milan data</div>`}renderData(a){let e=(a.breakdown??[]).filter(p=>p?.category!==void 0),r=a.total??0,t=a.maxScore??36,s=r/t*100,o="color-mix(in srgb, var(--roxy-border) 50%, transparent)",i=s>=70?"var(--roxy-success)":s>=50?"var(--roxy-warning)":"var(--roxy-danger)",l=s*2.827,c=(100-s)*2.827;return ne.html`<article class="card" aria-label="Guna Milan score"><div class="score-header"><div class="score-info"><div class="score-bar"><div><span class="total">${f(a.total,1)}</span> <span class="over">/ ${a.maxScore}</span> ${typeof a.percentage=="number"?ne.html`<small style="margin-left:.5rem;color:var(--roxy-muted)">${it(a.percentage,1)}</small>`:ne.nothing}</div>${a.recommendation?ne.html`<span class="recommendation">${a.recommendation}</span>`:ne.nothing}</div></div><div class="score-ring" role="meter" aria-label="Guna milan score" aria-valuemin="0" aria-valuemax="36" aria-valuenow="${r}"><svg viewBox="0 0 100 100" aria-hidden="true"><circle class="ring-track" cx="50" cy="50" r="45" fill="none" stroke="${o}" stroke-width="8"/><circle class="ring-fill" cx="50" cy="50" r="45" fill="none" stroke="${i}" stroke-width="8" stroke-dasharray="${l},${c}" stroke-linecap="round" transform="rotate(-90 50 50)"/><text x="50" y="50" text-anchor="middle" dominant-baseline="central" class="ring-text">${r}</text><text x="50" y="64" text-anchor="middle" dominant-baseline="central" class="ring-max">/${t}</text></svg></div></div>${e.length>0?ne.html`<table><thead><tr><th>Category</th><th>Progress</th><th class="score">Score</th></tr></thead><tbody>${e.map(p=>{let y=p.score??0,x=p.maxScore??Ws(p.category),j=x?y/x*100:0;return ne.html`<tr><td>${p.category}</td><td class="bar-cell"><div class="mini-bar"><span style="width:${j}%"></span></div></td><td class="score">${f(y,1)} / ${x}</td></tr>`})}</tbody></table>`:ne.nothing} ${(a.doshas?.length??0)>0||(a.doshaCancellations?.length??0)>0?ne.html`<div class="tags">${a.doshas?.map(p=>ne.html`<span class="dosha">${p}</span>`)} ${a.doshaCancellations?.map(p=>ne.html`<span class="cancel" title="${p.reason}">${p.dosha} cancelled</span>`)}</div>`:ne.nothing}</article>`}};Rr.styles=[g,ne.css`.card{background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.score-header{align-items:center;gap:1rem;display:flex}.score-info{flex:1}.score-bar{align-items:center;gap:var(--roxy-space-md,1rem);grid-template-columns:1fr auto;display:grid}.total{font-size:2.25rem;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums;line-height:1}.over{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-base,1rem)}.recommendation{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569)}.score-ring{flex-shrink:0;width:120px;height:120px}.score-ring svg{width:100%;height:100%}.score-ring .ring-text{fill:var(--roxy-fg,#0a0a0a);font-size:22px;font-weight:700;font-family:var(--roxy-font-sans)}.score-ring .ring-max{fill:var(--roxy-muted,#71717a);font-size:10px;font-family:var(--roxy-font-sans)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td.score{text-align:right;font-variant-numeric:tabular-nums;color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600)}td.bar-cell{width:30%}.mini-bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);height:8px;overflow:hidden}.mini-bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.tags{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.tags span{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.tags .dosha{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.tags .cancel{background:color-mix(in srgb, var(--roxy-success,#16a34a) 18%, transparent);color:var(--roxy-success-fg,#166534)}`],Rr=d([(0,Pt.customElement)("roxy-guna-milan")],Rr);function Ws(n){if(!n)return 1;switch(n.toLowerCase()){case"varna":return 1;case"vasya":return 2;case"tara":return 3;case"yoni":return 4;case"maitri":return 5;case"gana":return 6;case"bhakoot":return 7;case"nadi":return 8;default:return 1}}var se=require("lit"),zt=require("lit/decorators.js");var Cr=class extends m{renderData(a){let e=a.channels??[];return se.html`<div class="wrap" aria-label="Human Design connection"><header class="head"><h2 class="title">Connection</h2>${typeof a.totalChannels=="number"?se.html`<span class="count">${a.totalChannels} channels</span>`:se.nothing}</header>${a.combinedDefinition?se.html`<p class="def">Combined definition: <strong>${Y(String(a.combinedDefinition))}</strong></p>`:se.nothing} ${this.renderSummary(a.summary)} ${e.length>0?se.html`<div class="scroll"><table role="table" aria-label="Connection channels"><thead><tr><th scope="col">Channel</th><th scope="col">Gates</th><th scope="col">Circuit</th><th scope="col">Dynamic</th><th scope="col">Held by</th></tr></thead><tbody>${e.map(r=>this.renderChannel(r))}</tbody></table></div>`:se.nothing}</div>`}renderSummary(a){if(!a)return se.nothing;let e=[["Electromagnetic",a.electromagnetic],["Dominance",a.dominance],["Compromise",a.compromise],["Companionship",a.companionship]];return se.html`<div class="stats" aria-label="Channel dynamics">${e.map(([r,t])=>typeof t=="number"?se.html`<span class="stat">${r} <b>${t}</b></span>`:se.nothing)}</div>`}renderChannel(a){let e=a.personAGates??[],r=a.personBGates??[],t=[e.length?"A":"",r.length?"B":""].filter(Boolean).join(" + ")||"-";return se.html`<tr><td>${a.name??""}</td><td class="gates">${a.gateA}-${a.gateB}</td><td>${a.circuit??""}</td><td>${a.dynamic?se.html`<span class="dyn">${a.dynamic}</span>`:""}</td><td class="who">${t}</td></tr>`}renderEmpty(){return se.html`<div class="roxy-empty" role="status">No connection data</div>`}};Cr.styles=[g,se.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.count{color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);font-variant-numeric:tabular-nums}.def{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.def strong{color:var(--roxy-fg,#0a0a0a);text-transform:capitalize}.stats{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.stat{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 12%, transparent);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-fg,#0a0a0a);align-items:baseline;gap:.35rem;padding:2px 10px;display:inline-flex}.stat b{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{text-align:left;padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr:last-child td{border-bottom:none}.gates{font-variant-numeric:tabular-nums;color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.dyn{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 16%, transparent);color:var(--roxy-fg,#0a0a0a);padding:1px 8px;display:inline-block}.who{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem)}.scroll{overflow-x:auto}`],Cr=d([(0,zt.customElement)("roxy-hd-connection")],Cr);var X=require("lit"),At=require("lit/decorators.js");var Tr=class extends m{renderData(a){let e=a.channels??[],r=e.filter(s=>s.position==="upper"),t=e.filter(s=>s.position==="lower");return X.html`<div class="wrap" aria-label="Human Design penta"><header class="head"><h2 class="title">Penta</h2>${typeof a.memberCount=="number"?X.html`<span class="count">${a.memberCount} members</span>`:X.nothing}</header>${this.renderSummary(a.summary)} ${this.renderGroup("Upper (direction)",r)} ${this.renderGroup("Lower (execution)",t)}</div>`}renderSummary(a){if(!a)return X.nothing;let e=a.gapGates??[];return X.html`<div class="stats" aria-label="Penta summary">${typeof a.definedChannels=="number"?X.html`<span class="stat">Defined channels <b>${a.definedChannels}</b></span>`:X.nothing} ${typeof a.filledGates=="number"?X.html`<span class="stat">Filled gates <b>${a.filledGates}</b></span>`:X.nothing} ${e.length>0?X.html`<span class="stat">Gap gates <b>${e.join(", ")}</b></span>`:X.nothing} ${typeof a.coreDefined=="boolean"?X.html`<span class="stat">${a.coreDefined?"Core defined":"Core open"}</span>`:X.nothing}</div>`}renderGroup(a,e){return e.length===0?X.nothing:X.html`<div class="section"><h3>${a}</h3>${e.map(r=>X.html`<div class="row"><span class="gates">${r.gateA}-${r.gateB}</span> <span class="cname">${r.name??""}</span> <span class="badge ${r.defined?"defined":"open"}">${r.defined?"Defined":"Open"}</span> ${r.isCore?X.html`<span class="badge core">Core</span>`:X.nothing}</div>`)}</div>`}renderEmpty(){return X.html`<div class="roxy-empty" role="status">No penta data</div>`}};Tr.styles=[g,X.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.count{color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600)}.stats{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.stat{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 12%, transparent);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-fg,#0a0a0a);align-items:baseline;gap:.35rem;padding:2px 10px;display:inline-flex}.stat b{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}.section h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.row{align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-sm,.5rem) 0;border-bottom:1px solid var(--roxy-border,#e4e4e7);font-size:var(--roxy-text-sm,.875rem);flex-wrap:wrap;display:flex}.row:last-child{border-bottom:none}.gates{font-variant-numeric:tabular-nums;color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600);min-width:3.5rem}.cname{flex:1;min-width:8rem}.badge{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);padding:1px 8px;display:inline-flex}.badge.defined{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.badge.open{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 45%, transparent);color:var(--roxy-fg,#0a0a0a)}.badge.core{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent);color:var(--roxy-fg,#0a0a0a)}`],Tr=d([(0,At.customElement)("roxy-hd-penta")],Tr);var $e=require("lit"),Nt=require("lit/decorators.js");var Er=class extends m{renderData(a){let e=a.arrows??[];return $e.html`<div class="wrap" aria-label="Human Design variables"><h2 class="title">Variables</h2><div class="grid">${e.map(r=>this.renderArrow(r))}</div>${a.confident===!1?$e.html`<p class="note" role="note">Low confidence: a birth time near a color or tone boundary${typeof a.confidenceMarginDeg=="number"?` (within ${a.confidenceMarginDeg}\xB0)`:""}. Verify the exact birth time.</p>`:$e.nothing}</div>`}renderArrow(a){let e=a.direction==="left"?"\u2190":"\u2192";return $e.html`<div class="arrow"><div class="arrow-head"><span class="glyph" aria-hidden="true">${e}</span> <span class="name">${a.name??""}</span></div>${a.layer?$e.html`<span class="layer">${a.layer}</span>`:$e.nothing} <span class="labels">${[a.directionLabel,a.colorLabel].filter(Boolean).join(" \xB7 ")} </span>${typeof a.color=="number"?$e.html`<span class="ctb">Color ${a.color} · Tone ${a.tone} · Base ${a.base}</span>`:$e.nothing}</div>`}renderEmpty(){return $e.html`<div class="roxy-empty" role="status">No variables data</div>`}};Er.styles=[g,$e.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.grid{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(2,1fr);display:grid}.arrow{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);gap:var(--roxy-space-xs,.25rem);display:grid}.arrow-head{align-items:center;gap:var(--roxy-space-sm,.5rem);display:flex}.glyph{color:var(--roxy-accent-ink,#b45309);font-size:1.75rem;line-height:1}.name{font-weight:var(--roxy-weight-bold,600)}.layer{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.labels{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.ctb{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.note{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-warning-fg,#9a3412)}@container (width<=28rem){.grid{grid-template-columns:1fr}}`],Er=d([(0,Nt.customElement)("roxy-hd-variables")],Er);var P=require("lit"),wa=require("lit/decorators.js");var Xe=class extends m{constructor(){super(...arguments);this.mode="lookup"}resolveHexagram(){let e=this.data;if(!e)return null;if("hexagram"in e&&e.hexagram){if("lines"in e){let t=e;return{hex:t.hexagram,lines:t.lines,changingLinePositions:t.changingLinePositions,resultingHexagram:t.resultingHexagram}}let r=e;return{hex:r.hexagram,dailyMessage:r.dailyMessage}}return{hex:e}}renderEmpty(){return P.html`<div class="roxy-empty" role="status">No hexagram data</div>`}renderData(){let e=this.resolveHexagram();if(!e)return this.renderEmpty();let{hex:r,lines:t,changingLinePositions:s,dailyMessage:o,resultingHexagram:i}=e,l=t??this.derivedLines(r),c=new Set(s??[]);return P.html`<article class="card" aria-label="I Ching hexagram"><div class="glyphs">${r.symbol?P.html`<div class="symbol">${r.symbol}</div>`:P.nothing}<div class="lines" aria-hidden="true">${l.slice().reverse().map((p,y)=>{let x=l.length-1-y+1,j=c.has(x),b=p===6||p===8;return P.html`<div class="line ${`${b?"broken":"solid"}${j?" changing":""}`}">${b?P.svg`<span class="seg"></span><span class="seg"></span>`:P.svg`<span class="seg"></span>`}</div>`})}</div></div><div><h2 class="title">${r.number?P.html`${r.number}.`:P.nothing}${r.english??r.chinese??"Hexagram"}</h2><p class="subtitle">${r.chinese?P.html`${r.chinese}`:P.nothing} ${r.pinyin?P.html`· ${r.pinyin}`:P.nothing}</p><div class="trigrams">${r.upperTrigram?P.html`<div>Upper <span class="tri-glyph">${Ma[r.upperTrigram]??""}</span>${r.upperTrigram}</div>`:P.nothing} ${r.lowerTrigram?P.html`<div>Lower <span class="tri-glyph">${Ma[r.lowerTrigram]??""}</span>${r.lowerTrigram}</div>`:P.nothing}</div>${r.judgment?P.html`<p class="judgment">${r.judgment}</p>`:P.nothing} ${r.image?P.html`<p class="image">${r.image}</p>`:P.nothing} ${o?P.html`<p class="message">${o}</p>`:P.nothing} ${r.interpretation?.general?P.html`<p>${r.interpretation.general}</p>`:P.nothing} ${c.size>0?P.html`<div class="changing">Changing lines: ${Array.from(c).sort((p,y)=>p-y).join(", ")}. ${i?.english?P.html`Becomes hexagram ${i.number} ${i.english}.`:P.nothing}</div>`:P.nothing}</div></article>`}derivedLines(e){let r=e.symbol.codePointAt(0)??0;if(r>=19904&&r<=19967){let t=r-19904,s=[];for(let o=0;o<6;o++){let i=t>>o&1;s.push(i?8:7)}return s}return Array.from({length:6},()=>7)}};Xe.styles=[g,P.css`.card{background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-lg,1.5rem);grid-template-columns:6rem 1fr;display:grid}@container (width<=480px){.card{grid-template-columns:1fr}}.glyphs{gap:var(--roxy-space-md,1rem);justify-items:center;display:grid}.symbol{color:var(--roxy-accent-ink,#b45309);font-size:3rem;line-height:1}.lines{gap:4px;width:4rem;display:grid}.line{justify-content:center;align-items:center;gap:4px;height:8px;display:flex}.seg{background:var(--roxy-fg,#0a0a0a);border-radius:1px;height:6px;display:block}.line.broken .seg{width:1.4rem}.line.solid .seg{width:3rem}.line.changing .seg{background:var(--roxy-accent,#f59e0b)}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0 0 var(--roxy-space-sm,.5rem)}.trigrams{gap:var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-sm,.5rem);color:var(--roxy-secondary,#475569);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:flex}.tri-glyph{font-size:var(--roxy-text-xl,1.5rem);color:var(--roxy-accent-ink,#b45309);vertical-align:middle;margin-right:4px}.judgment,.image,.message{margin:0 0 var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.judgment:before{content:"Judgment. ";font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569)}.image:before{content:"Image. ";font-weight:var(--roxy-weight-bold,600);color:var(--roxy-secondary,#475569)}.changing{margin-top:var(--roxy-space-md,1rem);padding-top:var(--roxy-space-md,1rem);border-top:1px solid var(--roxy-border,#e4e4e7);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem)}`],d([(0,wa.property)({type:String,reflect:!0})],Xe.prototype,"mode",2),Xe=d([(0,wa.customElement)("roxy-hexagram")],Xe);var we=require("lit"),Mt=require("lit/decorators.js");function Lt(n){return n?String(n).slice(11,16)||String(n):""}var Dr=class extends m{renderEmpty(){return we.html`<div class="roxy-empty" role="status">No hora data</div>`}renderData(a){let e=a.dayHoras??[],r=a.nightHoras??[];return e.length===0&&r.length===0?this.renderEmpty():we.html`<div class="wrap" aria-label="Hora periods"><div class="head"><h2 class="title">Hora</h2>${a.date?we.html`<p class="subtitle">${a.date}</p>`:we.nothing}</div><div class="cols">${this.renderColumn("Day",e)} ${this.renderColumn("Night",r)}</div></div>`}renderColumn(a,e){return e.length===0?we.nothing:we.html`<div class="col"><p class="section-label">${a}</p>${e.map(r=>we.html`<div class="row"><span class="glyph" aria-hidden="true">${N[h(r.planet??"")]??"\xB7"}</span> <span class="planet">${r.planet}</span> <span class="time">${Lt(r.start)}-${Lt(r.end)}</span> ${typeof r.number=="number"?we.html`<span class="num">${r.number}</span>`:we.nothing}</div>`)}</div>`}};Dr.styles=[g,we.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.cols{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(2,1fr);display:grid}.section-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem) 0}.row{align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-xs,.25rem) 0;border-bottom:1px solid var(--roxy-border,#e4e4e7);font-size:var(--roxy-text-sm,.875rem);display:flex}.row:last-child{border-bottom:none}.glyph{color:var(--roxy-accent-ink,#b45309);text-align:center;width:1.25em;font-size:1.15em;line-height:1}.planet{flex:1;font-weight:500}.time{color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums;white-space:nowrap}.num{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;text-align:right;width:1.5em}@container (width<=30rem){.cols{grid-template-columns:1fr}}`],Dr=d([(0,Mt.customElement)("roxy-hora-table")],Dr);var E=require("lit"),ka=require("lit/decorators.js");var Ze=class extends m{constructor(){super(...arguments);this.period="daily"}renderEmpty(){return E.html`<div class="roxy-empty" role="status">No horoscope data</div>`}renderData(e){let r=e.sign??"",t=r?pe[h(r)]??"":"",s="energyRating"in e&&typeof e.energyRating=="number"?e.energyRating:null,o="date"in e&&e.date||"week"in e&&e.week||"month"in e&&e.month||"";return E.html`<article class="card" aria-label="${`${this.period} horoscope for ${r}`}"><header class="head"><span class="glyph" aria-hidden="true">${t}</span><div><h2 class="title">${r} ${this.period}</h2>${o?E.html`<div class="date">${o}</div>`:E.nothing}</div>${s!==null?E.html`<span class="energy" aria-label="${`Energy ${s} of 10`}">Energy ${s}/10 <span class="energy-bar"><span style="width:${s/10*100}%"></span></span></span>`:E.nothing}</header>${e.overview?E.html`<p class="overview">${e.overview}</p>`:E.nothing}<div class="sections">${e.love?E.html`<div class="section"><h3>Love</h3><p>${e.love}</p></div>`:E.nothing} ${e.career?E.html`<div class="section"><h3>Career</h3><p>${e.career}</p></div>`:E.nothing} ${e.health?E.html`<div class="section"><h3>Health</h3><p>${e.health}</p></div>`:E.nothing} ${e.finance?E.html`<div class="section"><h3>Finance</h3><p>${e.finance}</p></div>`:E.nothing} ${"advice"in e&&e.advice?E.html`<div class="section"><h3>Advice</h3><p>${e.advice}</p></div>`:E.nothing}</div>${(()=>{let i="luckyNumber"in e&&e.luckyNumber!==void 0?e.luckyNumber:void 0,l="luckyColor"in e&&e.luckyColor?e.luckyColor:"",c="luckyNumbers"in e&&e.luckyNumbers?e.luckyNumbers:[],p="luckyDays"in e&&e.luckyDays?e.luckyDays:[],y=e.compatibleSigns??[];return i===void 0&&!l&&c.length===0&&p.length===0&&y.length===0?E.nothing:E.html`<div class="lucky">${i!==void 0?E.html`<span>Lucky number <strong>${i}</strong></span>`:E.nothing} ${l?E.html`<span>Lucky color <strong>${l}</strong></span>`:E.nothing} ${c.length?E.html`<span>Lucky numbers <strong>${c.join(", ")}</strong></span>`:E.nothing} ${p.length?E.html`<span>Lucky days <strong>${p.join(", ")}</strong></span>`:E.nothing} ${y.length?E.html`<span class="compat-wrap">Best with <span class="compat">${y.map(x=>E.html`<span>${x}</span>`)}</span></span>`:E.nothing}</div>`})()}</article>`}};Ze.styles=[g,E.css`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.glyph{color:var(--roxy-accent-ink,#b45309);font-size:2.25rem;line-height:1}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);text-transform:capitalize;margin:0}.date{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.energy{font-variant-numeric:tabular-nums;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);margin-left:auto}.energy-bar{background:var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-full,9999px);vertical-align:middle;width:6rem;height:6px;margin-left:6px;display:inline-block;overflow:hidden}.energy-bar>span{background:var(--roxy-accent,#f59e0b);height:100%;transition:width var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));display:block}.overview{font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);margin:0}.sections{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));display:grid}.section h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em}.section p{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0}.lucky{gap:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);flex-wrap:wrap;display:flex}.lucky strong{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600)}.compat-wrap{align-items:center;gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;width:100%;display:flex}.compat{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.compat span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 16%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize;padding:2px 8px}`],d([(0,ka.property)({type:String,reflect:!0})],Ze.prototype,"period",2),Ze=d([(0,ka.customElement)("roxy-horoscope-card")],Ze);var K=require("lit"),Sa=require("lit/decorators.js");var Qe=class extends m{constructor(){super(...arguments);this.activeTab="planets"}bodies(){let e=this.data;if(!e)return[];let r=(e.planets??[]).map(s=>({name:s.planet,sign:s.sign,house:s.house,nakshatra:s.nakshatra,starLord:s.starLord,subLord:s.subLord,subSubLord:s.subSubLord,kpNumber:s.kpNumber,retrograde:s.retrograde})),t=e.nodes;for(let[s,o]of[["Rahu",t?.rahu],["Ketu",t?.ketu]])o&&r.push({name:s,sign:o.sign,house:o.house,nakshatra:o.nakshatra,starLord:o.starLord,subLord:o.subLord,subSubLord:o.subSubLord,retrograde:!0});return r}onTabKeyDown(e){if(e.key!=="ArrowRight"&&e.key!=="ArrowLeft")return;e.preventDefault(),this.activeTab=this.activeTab==="planets"?"cusps":"planets";let r=this.activeTab;requestAnimationFrame(()=>{this.shadowRoot?.querySelector(`#tab-${r}`)?.focus()})}renderEmpty(){return K.html`<div class="roxy-empty" role="status">No KP chart data</div>`}renderData(e){let r=e.ascendant;return K.html`<div class="wrap" aria-label="KP chart" tabindex="0"><header class="head"><h2 class="title">KP chart</h2>${r?K.html`<div class="asc">Ascendant: <strong>${r.sign??""}</strong> ${r.nakshatra?K.html`· ${r.nakshatra}`:K.nothing} ${r.subLord?K.html`· sub lord ${r.subLord}`:K.nothing} ${typeof r.kpNumber=="number"?K.html`· KP ${r.kpNumber}`:K.nothing}</div>`:K.nothing} ${typeof e.meta?.ayanamsa=="number"?K.html`<div class="ayan">${e.meta.ayanamsaType??"Ayanamsa"}: ${f(e.meta.ayanamsa,4)}° ${e.meta.houseSystem?K.html`· ${e.meta.houseSystem} houses`:K.nothing}</div>`:K.nothing}</header><div class="tablist" role="tablist" aria-label="KP chart views" @keydown="${this.onTabKeyDown}">${["planets","cusps"].map(t=>K.html`<button class="tab" role="tab" id="tab-${t}" aria-selected="${this.activeTab===t?"true":"false"}" aria-controls="panel-${t}" tabindex="${this.activeTab===t?"0":"-1"}" @click="${()=>{this.activeTab=t}}">${t==="planets"?"Planets":"Cusps"}</button>`)}</div><div id="panel-${this.activeTab}" role="tabpanel" aria-labelledby="tab-${this.activeTab}">${this.activeTab==="planets"?this.renderPlanets():this.renderCusps()}</div></div>`}renderPlanets(){let e=this.bodies();return e.length?K.html`<table role="table" aria-label="KP planets and nodes"><thead><tr><th scope="col">Body</th><th scope="col">Sign</th><th scope="col">House</th><th scope="col">Nakshatra</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(r=>K.html`<tr><td class="body">${r.name}${r.retrograde?K.html`<span class="retro">R</span>`:K.nothing}</td><td>${r.sign??""}</td><td class="num">${typeof r.house=="number"?r.house:""}</td><td>${r.nakshatra??""}</td><td>${r.starLord??""}</td><td>${r.subLord??""}</td><td>${r.subSubLord??""}</td><td class="num">${typeof r.kpNumber=="number"?r.kpNumber:""}</td></tr>`)}</tbody></table>`:K.html`<p class="roxy-empty" role="status">No planets</p>`}renderCusps(){let e=this.data?.cusps??[];return e.length?K.html`<table role="table" aria-label="KP Placidus cusps"><thead><tr><th scope="col">House</th><th scope="col">Sign</th><th scope="col">Sign lord</th><th scope="col">Nakshatra</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(r=>K.html`<tr><td class="body num">${r.house}</td><td>${r.sign??""}</td><td>${r.signLord??""}</td><td>${r.nakshatra??""}</td><td>${r.starLord??""}</td><td>${r.subLord??""}</td><td>${r.subSubLord??""}</td><td class="num">${typeof r.kpNumber=="number"?r.kpNumber:""}</td></tr>`)}</tbody></table>`:K.html`<p class="roxy-empty" role="status">No cusps</p>`}};Qe.styles=[g,K.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);box-shadow:var(--roxy-shadow-sm);width:100%;overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);gap:var(--roxy-space-xs,.25rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.asc,.ayan{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.asc strong{color:var(--roxy-fg,#0a0a0a)}.tablist{padding:0 var(--roxy-space-md,1rem);border-bottom:2px solid var(--roxy-border,#e4e4e7);gap:2px;display:flex}.tab{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);cursor:pointer;color:var(--roxy-muted,#71717a);background:0 0;border:none;border-bottom:2px solid #0000;margin-bottom:-2px;font-family:inherit}.tab[aria-selected=true]{color:var(--roxy-accent-ink,#b45309);border-bottom-color:var(--roxy-accent,#f59e0b);font-weight:var(--roxy-weight-bold,600)}.tab:hover:not([aria-selected=true]){color:var(--roxy-fg,#0a0a0a)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:620px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}td.body{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);margin-left:4px}.num{font-variant-numeric:tabular-nums}`],d([(0,Sa.state)()],Qe.prototype,"activeTab",2),Qe=d([(0,Sa.customElement)("roxy-kp-chart")],Qe);var Ae=require("lit"),Gt=require("lit/decorators.js");var Pr=class extends m{renderEmpty(){return Ae.html`<div class="roxy-empty" role="status">No KP data</div>`}renderData(a){let e=a.planets??[];return Ae.html`<div class="wrap" aria-label="KP planets table" tabindex="0"><header class="head"><h2 class="title">KP planets</h2>${typeof a.ayanamsa=="number"?Ae.html`<span class="ayanamsa">Ayanamsa: ${f(a.ayanamsa,2)}°</span>`:Ae.nothing}</header><table role="table"><thead><tr><th scope="col">Planet</th><th scope="col">Sign</th><th scope="col">Sign lord</th><th scope="col">Nakshatra</th><th scope="col">Star lord</th><th scope="col">Sub lord</th><th scope="col">Sub sub lord</th><th scope="col">KP no.</th></tr></thead><tbody>${e.map(r=>Ae.html`<tr><td class="planet">${r.planet} ${r.retrograde?Ae.html`<span class="retro">R</span>`:Ae.nothing}</td><td>${r.sign??""}</td><td>${r.signLord??""}</td><td>${r.nakshatra??""}</td><td>${r.nakshatraLord??""}</td><td>${r.subLord??""}</td><td>${r.subSubLord??""}</td><td>${r.kpNumber??""}</td></tr>`)}</tbody></table></div>`}};Pr.styles=[g,Ae.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);justify-content:space-between;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.ayanamsa{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:560px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}td.planet{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);margin-left:4px}`],Pr=d([(0,Gt.customElement)("roxy-kp-planets-table")],Pr);var ue=require("lit"),Ht=require("lit/decorators.js");var zr=class extends m{renderEmpty(){return ue.html`<div class="roxy-empty" role="status">No ruling planets data</div>`}renderData(a){let e=a.significators??[];return ue.html`<div class="wrap" aria-label="KP ruling planets"><header><h2 class="title">KP ruling planets</h2>${a.dayLord?ue.html`<div class="day-lord">Day lord: <strong>${a.dayLord}</strong></div>`:ue.nothing}</header><div class="groups"><div class="group"><h3>Moon</h3><dl><dt>Sign lord</dt><dd>${a.moonSignLord??""}</dd><dt>Star lord</dt><dd>${a.moonStarLord??""}</dd><dt>Sub lord</dt><dd>${a.moonSublord??""}</dd><dt>Sub-sub lord</dt><dd>${a.moonSubSublord??""}</dd></dl></div><div class="group"><h3>Lagna</h3><dl><dt>Sign lord</dt><dd>${a.lagnaSignLord??""}</dd><dt>Star lord</dt><dd>${a.lagnaStarLord??""}</dd><dt>Sub lord</dt><dd>${a.lagnaSublord??""}</dd><dt>Sub-sub lord</dt><dd>${a.lagnaSubSublord??""}</dd></dl></div></div>${a.rulingPlanets?.length?ue.html`<div class="rp-list" role="list" aria-label="Ruling planets by strength"><span class="rp-label">Ruling planets</span> ${a.rulingPlanets.map((r,t)=>ue.html`<span class="rp" role="listitem"><span class="rank">${t+1}</span> ${r}</span>`)}</div>`:ue.nothing} ${e.length?ue.html`<table aria-label="House significators"><thead><tr><th scope="col">Planet</th><th scope="col">Signifies houses</th></tr></thead><tbody>${e.map(r=>ue.html`<tr><td>${r.planet}</td><td>${(r.signifies??[]).join(", ")}</td></tr>`)}</tbody></table>`:ue.nothing}</div>`}};zr.styles=[g,ue.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);padding:var(--roxy-space-md,1rem);gap:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.day-lord{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.day-lord strong{color:var(--roxy-fg,#0a0a0a)}.groups{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(11rem,1fr));display:grid}.group h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.group dl{gap:2px var(--roxy-space-sm,.5rem);font-size:var(--roxy-text-sm,.875rem);grid-template-columns:auto 1fr;margin:0;display:grid}.group dt{color:var(--roxy-muted,#71717a)}.group dd{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600);margin:0}.rp-list{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;align-items:center;display:flex}.rp-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em;margin-right:var(--roxy-space-xs,.25rem)}.rp{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 18%, transparent);color:var(--roxy-fg,#0a0a0a);border-radius:999px;align-items:center;gap:.3em;padding:.15em .6em;display:inline-flex}.rp .rank{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-accent-ink,#b45309)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-xs,.25rem) var(--roxy-space-sm,.5rem);text-align:left;border-bottom:1px solid var(--roxy-border,#e4e4e7)}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}`],zr=d([(0,Ht.customElement)("roxy-kp-ruling-planets")],zr);var xe=require("lit"),he=require("lit/decorators.js");function Ot(n,a){let e,r=((...t)=>{e&&clearTimeout(e),e=setTimeout(()=>{e=void 0,n(...t)},a)});return r.cancel=()=>{e&&(clearTimeout(e),e=void 0)},r}var ie=class extends xe.LitElement{constructor(){super(...arguments);this.endpoint="https://roxyapi.com/api/v2/location/search";this.placeholder="Search city";this.defaultValue="";this.query="";this.results=[];this.isOpen=!1;this.isLoading=!1;this.highlight=-1;this.secretKeyWarned=!1;this.debouncedFetch=Ot(e=>{this.fetchResults(e)},300);this.onInput=e=>{let r=e.target.value;if(this.query=r,r.length<2){this.results=[],this.isOpen=!1,this.highlight=-1;return}this.debouncedFetch(r)};this.onKeyDown=e=>{if(!this.isOpen||this.results.length===0){e.key==="ArrowDown"&&this.query.length>=2&&(this.fetchResults(this.query),e.preventDefault());return}if(e.key==="ArrowDown")e.preventDefault(),this.highlight=(this.highlight+1)%this.results.length;else if(e.key==="ArrowUp")e.preventDefault(),this.highlight=(this.highlight-1+this.results.length)%this.results.length;else if(e.key==="Enter"){e.preventDefault();let r=this.results[this.highlight]??this.results[0];r&&this.select(r)}else e.key==="Escape"&&(this.isOpen=!1)}}connectedCallback(){super.connectedCallback(),this.query=this.defaultValue,this.clickOutsideHandler=e=>{e.composedPath().includes(this)||(this.isOpen=!1)},document.addEventListener("mousedown",this.clickOutsideHandler)}disconnectedCallback(){super.disconnectedCallback(),this.clickOutsideHandler&&document.removeEventListener("mousedown",this.clickOutsideHandler),this.debouncedFetch.cancel(),this.abortController&&(this.abortController.abort(),this.abortController=void 0)}warnIfSecretKey(){if(this.secretKeyWarned||!this.apiKey||this.apiKey.startsWith("pk_"))return;this.secretKeyWarned=!0;let e="Possible secret key in client-side <roxy-location-search>; use a `pk_` publishable key with origin allowlist instead.";console.warn(e),this.dispatchEvent(new CustomEvent("roxy-validation-error",{detail:{reason:"possible-secret-key",message:e},bubbles:!0,composed:!0}))}async fetchResults(e){this.warnIfSecretKey(),this.abortController&&this.abortController.abort();let r=new AbortController;this.abortController=r,this.isLoading=!0;try{let t=new URL(this.endpoint);t.searchParams.set("q",e),t.searchParams.set("limit","8");let s={Accept:"application/json"};this.apiKey&&this.publishableKey&&console.warn("[roxy-location-search] both api-key and publishable-key set; using publishable-key. Remove api-key from your widget markup.");let o=this.publishableKey??this.apiKey;o&&(s["X-API-Key"]=o);let i=await fetch(t,{headers:s,signal:r.signal});if(!i.ok)throw new Error(`HTTP ${i.status}`);let l=await i.json();if(r.signal.aborted)return;this.results=l.cities??[],this.isOpen=this.results.length>0,this.highlight=this.results.length>0?0:-1}catch(t){if(t?.name==="AbortError")return;this.results=[],this.isOpen=!1}finally{this.abortController===r&&(this.abortController=void 0),r.signal.aborted||(this.isLoading=!1)}}select(e){this.query=`${e.city}${e.province?`, ${e.province}`:""}, ${e.country}`,this.isOpen=!1,this.results=[],this.dispatchEvent(new CustomEvent("roxy-location-select",{detail:e,bubbles:!0,composed:!0}))}render(){return xe.html`<div class="field"><input type="text" role="combobox" aria-expanded="${this.isOpen?"true":"false"}" aria-controls="roxy-location-listbox" aria-activedescendant="${this.isOpen&&this.highlight>=0?`roxy-location-option-${this.highlight}`:""}" aria-autocomplete="list" autocomplete="off" placeholder="${this.placeholder}" .value="${this.query}" @input="${this.onInput}" @keydown="${this.onKeyDown}" @focus="${()=>{this.results.length>0&&(this.isOpen=!0)}}"> ${this.isLoading?xe.html`<span class="spinner" role="status" aria-label="Loading"></span>`:xe.nothing} ${this.isOpen?xe.html`<ul id="roxy-location-listbox" class="results" role="listbox">${this.results.length===0?xe.html`<li class="empty" role="status">No cities found</li>`:this.results.map((e,r)=>xe.html`<li role="presentation"><button type="button" class="option" role="option" id="${`roxy-location-option-${r}`}" aria-selected="${this.highlight===r?"true":"false"}" @click="${()=>this.select(e)}" @mouseenter="${()=>{this.highlight=r}}"><span class="city">${e.city}</span> <span class="where">${e.province?xe.html`${e.province},`:""}${e.country}</span> <span class="tz">UTC${e.utcOffset>=0?"+":""}${e.utcOffset}</span></button></li>`)}</ul>`:xe.nothing}</div>`}};ie.styles=[g,xe.css`:host{display:block;position:relative}.field{position:relative}input{width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-base,1rem);color:var(--roxy-fg,#0a0a0a);background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);transition:border-color var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));box-sizing:border-box;font-family:inherit}input:focus{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px;border-color:var(--roxy-accent-ink,#b45309)}.spinner{border:2px solid var(--roxy-muted,#71717a);border-top-color:#0000;border-radius:50%;width:14px;height:14px;animation:.7s linear infinite roxy-spin;position:absolute;top:50%;right:12px;transform:translateY(-50%)}@keyframes roxy-spin{to{transform:translateY(-50%)rotate(360deg)}}@media (prefers-reduced-motion:reduce){.spinner{animation:none}}.results{z-index:50;background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);box-shadow:var(--roxy-shadow-md);max-height:22rem;animation:roxy-fade-in var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));position:absolute;top:calc(100% + 4px);left:0;right:0;overflow-y:auto}.option{align-items:baseline;gap:var(--roxy-space-sm,.5rem);width:100%;padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;font-family:inherit;font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);cursor:pointer;transition:background-color var(--roxy-motion-duration,.2s);background:0 0;border:0;display:flex}.option:hover,.option[aria-selected=true]{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 10%, transparent)}.option .city{font-weight:var(--roxy-weight-bold,600)}.option .where{color:var(--roxy-muted,#71717a);flex-grow:1}.option .tz{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums}.empty{padding:var(--roxy-space-md,1rem);color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}`],d([(0,he.property)({type:String,attribute:"api-key"})],ie.prototype,"apiKey",2),d([(0,he.property)({type:String,attribute:"publishable-key"})],ie.prototype,"publishableKey",2),d([(0,he.property)({type:String})],ie.prototype,"endpoint",2),d([(0,he.property)({type:String})],ie.prototype,"placeholder",2),d([(0,he.property)({type:String,attribute:"default-value"})],ie.prototype,"defaultValue",2),d([(0,he.state)()],ie.prototype,"query",2),d([(0,he.state)()],ie.prototype,"results",2),d([(0,he.state)()],ie.prototype,"isOpen",2),d([(0,he.state)()],ie.prototype,"isLoading",2),d([(0,he.state)()],ie.prototype,"highlight",2),ie=d([(0,he.customElement)("roxy-location-search")],ie);var F=require("lit"),Ra=require("lit/decorators.js");var er=class extends m{constructor(){super(...arguments);this.mode="current"}renderEmpty(){return F.html`<div class="roxy-empty" role="status">No moon phase data</div>`}renderData(e){let r="phases"in e?e.phases:"calendar"in e?e.calendar:[];if(this.mode!=="current"&&r.length>0){let t="month"in e?e.month:void 0,s="year"in e?e.year:void 0;return F.html`<article class="card" aria-label="Moon phase calendar"><h2 class="label">${t??"Moon phases"} ${s??""}</h2><div class="list" role="list">${r.map(o=>this.renderListItem(o))}</div></article>`}return"phase"in e?this.renderSingle(e):F.nothing}renderSingle(e){let r=jt(e.phase);return F.html`<article class="card" aria-label="Current moon phase"><div class="hero"><span class="emoji" aria-hidden="true">${r}</span><div><h2 class="label">${e.phase??"Moon"}</h2>${e.date?F.html`<div class="date">${e.date}</div>`:F.nothing}</div></div><div class="stats">${typeof e.illumination=="number"?F.html`<div><span>Illumination</span> <strong>${Js(e.illumination)}</strong></div>`:F.nothing} ${typeof e.age=="number"?F.html`<div><span>Age</span> <strong>${f(e.age,1)} days</strong></div>`:F.nothing} ${e.sign?F.html`<div><span>Sign</span> <strong>${e.sign}</strong></div>`:F.nothing} ${typeof e.distance=="number"?F.html`<div><span>Distance</span> <strong>${(e.distance/1e3).toFixed(0)}k km</strong></div>`:F.nothing}</div>${e.meaning?.description?F.html`<p class="meaning">${e.meaning.description}</p>`:F.nothing} ${e.meaning?.keywords?.length?F.html`<div class="keywords">${e.meaning.keywords.map(t=>F.html`<span>${t}</span>`)}</div>`:F.nothing}</article>`}renderListItem(e){let r=jt(e.phase);return F.html`<div class="list-item" role="listitem"><span aria-hidden="true">${r}</span> <span>${e.phase}</span> <span>${e.date??""}</span></div>`}};er.styles=[g,F.css`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.emoji{font-size:3rem;line-height:1}.label{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.stats{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-secondary,#475569);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.stats div span:first-child{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.06em;display:block}.stats strong{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}.meaning{color:var(--roxy-fg,#0a0a0a)}.keywords{gap:var(--roxy-space-xs,.25rem);margin-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.keywords span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.list{gap:var(--roxy-space-sm,.5rem);display:grid}.list-item{gap:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem) 0;font-size:var(--roxy-text-sm,.875rem);grid-template-columns:2.5rem 1fr auto;align-items:center;display:grid}.list-item:last-child{border-bottom:none}`],d([(0,Ra.property)({type:String,reflect:!0})],er.prototype,"mode",2),er=d([(0,Ra.customElement)("roxy-moon-phase")],er);function jt(n){return n?nt[n.toLowerCase()]??"\u{1F319}":"\u{1F319}"}function Js(n){let a=n<=1?n*100:n;return`${Math.round(a)}%`}var _=require("lit"),Bt=require("lit/decorators.js");var Ar=class extends m{renderData(a){let e=a.remedies;return _.html`<article class="wrap" aria-label="${`Nakshatra ${a.name}`}"><header class="head"><h2 class="name">${a.name}</h2>${typeof a.number=="number"?_.html`<span class="number">Nakshatra ${a.number} of 27</span>`:_.nothing} ${a.range?_.html`<span class="range">${a.range}</span>`:_.nothing}</header><dl class="facts">${a.lord?_.html`<div class="fact"><dt>Lord</dt><dd>${a.lord}</dd></div>`:_.nothing} ${a.deity?_.html`<div class="fact"><dt>Deity</dt><dd>${a.deity}</dd></div>`:_.nothing} ${a.symbol?_.html`<div class="fact"><dt>Symbol</dt><dd>${a.symbol}</dd></div>`:_.nothing}</dl>${a.characteristics?_.html`<div class="section"><h3>Characteristics</h3><p>${a.characteristics}</p></div>`:_.nothing} ${e?_.html`<div class="section"><h3>Remedies</h3><div class="remedies">${e.mantras?_.html`<div class="remedy"><strong>Mantras:</strong> ${e.mantras}</div>`:_.nothing} ${e.gemstones?_.html`<div class="remedy"><strong>Gemstones:</strong> ${e.gemstones}</div>`:_.nothing} ${e.rituals?_.html`<div class="remedy"><strong>Rituals:</strong> ${e.rituals}</div>`:_.nothing}</div></div>`:_.nothing}</article>`}renderEmpty(){return _.html`<div class="roxy-empty" role="status">No nakshatra data</div>`}};Ar.styles=[g,_.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);padding:var(--roxy-space-md,1rem);gap:var(--roxy-space-md,1rem);box-shadow:var(--roxy-shadow-sm);display:grid}.head{align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.number{color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600)}.range{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.facts{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.fact{gap:2px;display:grid}.fact dt{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:uppercase;letter-spacing:.05em}.fact dd{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);margin:0}.section h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em}.section p{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a);margin:0;line-height:1.5}.remedies{gap:var(--roxy-space-xs,.25rem);display:grid}.remedy{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}.remedy strong{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600)}`],Ar=d([(0,Bt.customElement)("roxy-nakshatra-card")],Ar);var u=require("lit"),_r=require("lit/decorators.js");var qa=420,k=qa/2,Ir=164,Fa=146,Wr=120,Kr=96,Xs=178,Zs=196,je=class extends m{constructor(){super(...arguments);this.houseSystem="placidus";this.view="wheel"}getPlanets(){return this.data?.planets??[]}getAscendant(){return this.data?.ascendant?.longitude??0}getMidheaven(){let e=this.data?.midheaven?.longitude;return typeof e=="number"?e:null}toAngle(e){return 180+this.getAscendant()-e}renderEmpty(){return u.html`<div class="roxy-empty" role="status">No chart data</div>`}renderData(e){let r=this.getPlanets(),t=e.aspects??[],s=this.view;return u.html`<div class="wrap"><header><h2 class="title">Natal chart</h2>${e.birthDetails?u.html`<div class="meta">${[e.birthDetails.date,e.birthDetails.time].filter(Boolean).join(" \xB7 ")}</div>`:u.nothing}</header>${Br({items:[{id:"wheel",label:"Wheel"},{id:"grid",label:"Aspect grid"}],active:s,onSelect:o=>{this.view=o},label:"Natal chart views",idPrefix:"natal",controls:!0})}<div id="natal-panel-${s}" role="tabpanel" aria-labelledby="natal-tab-${s}">${s==="wheel"?this.renderWheel(r,t):this.renderAspectGrid(r,t)}</div><div class="legend"><span>${r.length} planets</span> <span>${t.length} aspects</span> ${e.houseSystem?u.html`<span>${e.houseSystem} houses</span>`:u.nothing} <span><span class="legend-swatch" style="background:var(--roxy-success)"></span>harmonious</span> <span><span class="legend-swatch" style="background:var(--roxy-danger)"></span>challenging</span></div>${this.renderDetails()} ${this.renderInterpretations()}</div>`}renderWheel(e,r){return u.html`<svg viewBox="0 0 ${qa} ${qa}" role="img" aria-label="Natal chart wheel with twelve houses, planets, and aspects"><title>Natal chart wheel</title><desc>Twelve zodiac sign segments around a circular wheel. Planet glyphs are placed at their ecliptic longitudes. Aspect lines connect related planets.</desc><circle class="wheel-line" cx="${k}" cy="${k}" r="${Ir}" stroke-width="1.5"/><circle class="wheel-line" cx="${k}" cy="${k}" r="${Fa-14}" stroke-width="0.8"/><circle class="wheel-line" cx="${k}" cy="${k}" r="${Wr}" stroke-width="1"/><circle class="wheel-line" cx="${k}" cy="${k}" r="${Kr-16}" stroke-width="0.5"/>${this.renderTicks()} ${this.renderSpokes()} ${this.renderSigns()} ${this.renderHouseNumbers()} ${this.renderCuspDegrees()} ${this.renderAspects(e,r)} ${this.renderPlanets(e)} ${this.renderAngles()}</svg>`}renderAspectGrid(e,r){let t=e.map(o=>h(o.name)),s=new Map;for(let o of r){let i=[h(o.planet1),h(o.planet2)].sort().join("|");s.set(i,o)}return t.length===0?u.html`<p class="roxy-empty" role="status">No planets to grid</p>`:u.html`<div class="grid-scroll"><table class="aspect-grid" aria-label="Planet by planet aspect grid"><thead><tr><th></th>${t.slice(0,-1).map(o=>{let i=N[o]??o.slice(0,2);return u.html`<th scope="col" title="${o}">${i}</th>`})}</tr></thead><tbody>${t.slice(1).map((o,i)=>{let l=N[o]??o.slice(0,2);return u.html`<tr><th scope="row" title="${o}">${l}</th>${t.slice(0,i+1).map(c=>{let p=s.get([o,c].sort().join("|"));if(!p)return u.html`<td class="empty"></td>`;let y=jr(p),x=Yr[y]??Yr[y.replace(/-/g,"")]??y.slice(0,3),j=gr[y]??"aspect-other",b=f(p.orb,1);return u.html`<td class="${`cell ${j}`}" title="${`${o} ${y} ${c}${b?` (orb ${b}\xB0)`:""}`}"><span class="asp">${x}</span></td>`})} ${t.slice(i+1,-1).map(()=>u.html`<td class="empty"></td>`)}</tr>`})}</tbody></table></div>`}renderAngles(){let e=this.getAscendant(),r=this.getMidheaven(),t=[this.renderAngleMark(e,"ASC"),this.renderAngleMark(Ia(e),"DSC")];r!==null&&(t.push(this.renderAngleMark(r,"MC")),t.push(this.renderAngleMark(Ia(r),"IC")));let s=this.data?.partOfFortune?.longitude;typeof s=="number"&&t.push(this.renderAngleMark(Le(s),"PoF"));let o=this.data?.vertex?.longitude;return typeof o=="number"&&t.push(this.renderAngleMark(Le(o),"Vtx")),t}renderAngleMark(e,r){let t=this.toAngle(e),s=B(k,k,Ir,t),o=B(k,k,Xs,t),i=B(k,k,Zs,t);return u.svg`
|
|
77
77
|
<g>
|
|
78
|
-
<line class="angle-tick" x1=${
|
|
78
|
+
<line class="angle-tick" x1=${s.x} y1=${s.y} x2=${o.x} y2=${o.y} />
|
|
79
79
|
<text class="angle-marker" x=${i.x} y=${i.y} text-anchor="middle" dominant-baseline="central">${r}</text>
|
|
80
80
|
</g>
|
|
81
|
-
`}renderSpokes(){let e=this.data?.houses??[];return(e.length===12?e.map(t=>t.longitude):Array.from({length:12},(t,
|
|
82
|
-
${
|
|
83
|
-
<text class="planet-glyph" x=${
|
|
84
|
-
<text class="planet-deg" x=${
|
|
85
|
-
</g>`})}renderDetails(){let e=this.data?.summary,r=this.data?.aspectsInterpretation;if(!e&&!r)return g.nothing;let t=e?.retrogradePlanets??[];return g.html`<div class="details">${e?.dominantElement||e?.dominantModality?g.html`<div class="pill-row">${e.dominantElement?g.html`<span class="pill">Dominant element: ${e.dominantElement}</span>`:g.nothing} ${e.dominantModality?g.html`<span class="pill">Dominant modality: ${e.dominantModality}</span>`:g.nothing}</div>`:g.nothing} ${r?g.html`<div class="pill-row"><span class="pill pill--success">Harmonious ${r.harmonious}</span> <span class="pill pill--danger">Challenging ${r.challenging}</span> <span class="pill pill--muted">Neutral ${r.neutral}</span></div>`:g.nothing} ${t.length>0?g.html`<div class="pill-row">${t.map(a=>{let s=I[a]??a.slice(0,2);return g.html`<span class="pill pill--muted">${s} ${a} R</span>`})}</div>`:g.nothing} ${r?.summary?g.html`<p class="summary">${r.summary}</p>`:g.nothing} ${this.renderElementModalityGrid()}</div>`}renderElementModalityGrid(){let e=this.getPlanets();if(e.length===0)return g.nothing;let r=["Fire","Earth","Air","Water"],t=["Cardinal","Fixed","Mutable"],a=Q,s={};for(let i of r)s[i]={Cardinal:[],Fixed:[],Mutable:[]};for(let i of e){let l=a.indexOf(b(i.sign??""));if(l<0)continue;let c=r[l%4],m=t[l%3],p=I[b(i.name)]??b(i.name).slice(0,2);s[c]?.[m]?.push(p)}return g.html`<table class="em-grid" aria-label="Element and modality distribution"><thead><tr><th></th>${t.map(i=>g.html`<th scope="col">${i.slice(0,3)}</th>`)}<th scope="col">Total</th></tr></thead><tbody>${r.map(i=>{let l=t.reduce((c,m)=>c+(s[i]?.[m]?.length??0),0);return g.html`<tr><th scope="row">${i}</th>${t.map(c=>g.html`<td>${(s[i]?.[c]??[]).join(" ")}</td>`)}<td class="em-total">${l}</td></tr>`})}<tr><th scope="row">Total</th>${t.map(i=>g.html`<td class="em-total">${r.reduce((l,c)=>l+(s[c]?.[i]?.length??0),0)}</td>`)}<td class="em-total">${e.length}</td></tr></tbody></table>`}renderInterpretations(){let e=this.getPlanets().filter(r=>r.interpretation);return e.length===0?g.nothing:g.html`<section class="interpretations"><h3>Planet readings</h3>${e.map((r,t)=>{let a=r.interpretation,s=I[b(r.name)]??"",i=v(r.degree??0,1);return g.html`<details class="interp-card" name="natal-planet-readings" ?open="${t===0}"><summary><span>${s} ${r.name}</span> <span class="interp-aside"><small>${r.sign??""} ${i}</small> ${be()}</span></summary><div class="interp-body">${a.summary?g.html`<p class="interp-summary">${a.summary}</p>`:g.nothing} ${a.detailed?g.html`<p class="interp-detail">${a.detailed}</p>`:g.nothing} ${a.keywords?.length?g.html`<div class="interp-keywords">${a.keywords.map(l=>g.html`<span class="kw">${l}</span>`)}</div>`:g.nothing}</div></details>`})}</section>`}renderAspects(e,r){let t=new Map;for(let a of e){if(typeof a.longitude!="number")continue;let s=b(a.name);s&&t.set(s,a.longitude)}return r.map(a=>{let s=t.get(b(a.planet1)),i=t.get(b(a.planet2));if(s===void 0||i===void 0)return g.nothing;let l=G($,$,mr-18,this.toAngle(s)),c=G($,$,mr-18,this.toAngle(i)),m=ir(a),p=tr[m]??"aspect-other",u=v(a.orb,1);return g.svg`<line class=${`aspect ${p}`} x1=${l.x} y1=${l.y} x2=${c.x} y2=${c.y}><title>${a.planet1} ${m||""} ${a.planet2}${u?` (orb ${u}\xB0)`:""}</title></line>`})}};ve.styles=[y,Ke,cr,g.css`.wrap{gap:var(--roxy-space-md,1rem);width:100%;display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-primary,#0f172a);margin:0}.meta{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}svg{aspect-ratio:1;width:100%;max-width:560px;height:auto;margin:0 auto;display:block}.wheel-line{fill:none;stroke:var(--roxy-border,#e4e4e7)}.sign-glyph{fill:var(--roxy-secondary,#475569);font-size:14px;font-family:var(--roxy-font-sans)}.planet-glyph{fill:var(--roxy-accent,#f59e0b);font-size:14px;font-weight:600;font-family:var(--roxy-font-sans)}.planet-deg{fill:var(--roxy-fg,#0a0a0a);font-size:7px;font-family:var(--roxy-font-sans)}@container (width<=480px){.sign-glyph,.planet-glyph{font-size:18px}.planet-deg{font-size:10px}.house-num{font-size:12px}}.planet-deg .retro{fill:var(--roxy-danger,#dc2626)}.planet-leader{stroke:var(--roxy-accent,#f59e0b);stroke-width:.5px;opacity:.55}.house-num{fill:var(--roxy-muted,#71717a);font-size:9px;font-family:var(--roxy-font-sans)}.cusp-deg{fill:var(--roxy-muted,#71717a);font-size:6px;font-family:var(--roxy-font-sans)}.tick{stroke:var(--roxy-border,#e4e4e7)}.tick-major{stroke:var(--roxy-secondary,#475569)}.aspect{stroke-width:.8px;fill:none;opacity:.55}.aspect-trine,.aspect-sextile{stroke:var(--roxy-success,#16a34a)}.aspect-square,.aspect-opposition{stroke:var(--roxy-danger,#dc2626)}.aspect-conjunction{stroke:var(--roxy-accent-ink,#b45309)}.aspect-other{stroke:var(--roxy-muted,#71717a);opacity:.4}.angle-marker{fill:var(--roxy-accent-ink,#b45309);font-size:10px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.04em}.angle-tick{stroke:var(--roxy-accent-ink,#b45309);stroke-width:1.5px}.legend{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.legend-swatch{vertical-align:middle;border-radius:50%;width:8px;height:8px;margin-right:4px;display:inline-block}.grid-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}table.aspect-grid{border-collapse:collapse;font-size:var(--roxy-text-xs,.75rem);margin:0 auto}table.aspect-grid th,table.aspect-grid td{text-align:center;border:1px solid var(--roxy-border,#e4e4e7);width:1.6rem;height:1.6rem;padding:0}table.aspect-grid th{color:var(--roxy-secondary,#475569);font-weight:var(--roxy-weight-bold,600)}table.aspect-grid td.cell{cursor:default}table.aspect-grid td.empty{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 18%, transparent)}table.aspect-grid td .asp{font-size:.95em;line-height:1}table.aspect-grid td.aspect-trine .asp,table.aspect-grid td.aspect-sextile .asp{color:var(--roxy-success,#16a34a)}table.aspect-grid td.aspect-square .asp,table.aspect-grid td.aspect-opposition .asp{color:var(--roxy-danger,#dc2626)}table.aspect-grid td.aspect-conjunction .asp{color:var(--roxy-accent-ink,#b45309)}table.aspect-grid td.aspect-other .asp{color:var(--roxy-muted,#71717a)}.details{margin-top:var(--roxy-space-md,1rem)}.pill-row{gap:var(--roxy-space-xs,.25rem);margin-bottom:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.pill{border-radius:var(--roxy-radius-sm,4px);font-size:var(--roxy-text-xs,.75rem);background:color-mix(in srgb, var(--roxy-fg,#0f172a) 8%, transparent);color:var(--roxy-fg,#0f172a);padding:2px 8px}.pill--success{background:color-mix(in srgb, var(--roxy-success,#16a34a) 15%, transparent);color:var(--roxy-success,#16a34a)}.pill--danger{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 15%, transparent);color:var(--roxy-danger,#dc2626)}.pill--muted{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);color:var(--roxy-fg,#0a0a0a)}.summary{color:var(--roxy-fg,#0f172a);font-size:var(--roxy-text-sm,.875rem);margin:var(--roxy-space-md,1rem) 0}.em-grid{border-collapse:collapse;font-size:var(--roxy-text-xs,.75rem);width:100%}.em-grid th,.em-grid td{border:1px solid var(--roxy-border,#e4e4e7);text-align:center;vertical-align:middle;padding:3px 5px}.em-grid th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.04em}.em-grid th[scope=row]{text-align:left}.em-grid td{color:var(--roxy-accent,#f59e0b);min-width:1.4rem;font-size:.95em;line-height:1.4}.em-grid .em-total{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 25%, transparent)}.interpretations{margin-top:var(--roxy-space-md,1rem)}.interpretations h3{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0 0 var(--roxy-space-sm,.5rem);font-weight:600}.interp-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-xs,.25rem)}.interp-card summary{cursor:pointer;color:var(--roxy-fg,#0f172a);justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);font-weight:500;display:flex}.interp-aside{align-items:center;gap:.6em;display:inline-flex}.interp-aside small{color:var(--roxy-muted,#71717a);font-weight:400}.interp-body{margin-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0f172a);font-size:var(--roxy-text-sm,.875rem)}.interp-keywords{flex-wrap:wrap;gap:.25rem;margin-top:.5rem;display:flex}.interp-keywords .kw{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px}`],d([(0,or.property)({attribute:!1})],ve.prototype,"data",2),d([(0,or.property)({type:String,attribute:"house-system",reflect:!0})],ve.prototype,"houseSystem",2),d([(0,or.state)()],ve.prototype,"view",2),ve=d([(0,or.customElement)("roxy-natal-chart")],ve);var R=require("lit"),Ar=require("lit/decorators.js");var ze=class extends R.LitElement{constructor(){super();this.data=null;this.type="life-path";new h(this)}render(){let e=this.data;if(!e)return R.html`<div class="roxy-empty" role="status">No numerology data</div>`;let r=Va[this.type]??this.type;return"coreNumbers"in e?this.renderChart(e,r):"personalYear"in e?this.renderPersonalYear(e,r):this.renderNumberCard(e,r)}renderNumberCard(e,r){let t=e.meaning?.keywords??[];return R.html`<article class="card" aria-label="${r}"><div class="hero">${typeof e.number=="number"?R.html`<div class="numeral">${e.number}</div>`:R.nothing}<div><p class="label">${r}</p>${e.meaning?.title?R.html`<h2 class="title">${e.meaning.title}</h2>`:R.nothing}</div></div>${e.meaning?.description?R.html`<p class="meaning">${e.meaning.description}</p>`:R.nothing} ${e.calculation?R.html`<pre class="calc">${e.calculation}</pre>`:R.nothing} ${t.length>0?R.html`<div class="chips">${t.map(a=>R.html`<span>${a}</span>`)}</div>`:R.nothing} ${e.hasKarmicDebt&&e.karmicDebtNumber?R.html`<div class="karmic">Karmic debt ${e.karmicDebtNumber}. ${Fa(e.karmicDebtMeaning)}</div>`:R.nothing}</article>`}renderPersonalYear(e,r){return R.html`<article class="card" aria-label="${r}"><div class="hero">${typeof e.personalYear=="number"?R.html`<div class="numeral">${e.personalYear}</div>`:R.nothing}<div><p class="label">${r}</p>${e.theme?R.html`<h2 class="title">${e.theme}</h2>`:R.nothing}</div></div>${e.forecast?R.html`<p class="meaning">${e.forecast}</p>`:R.nothing} ${e.advice?R.html`<p>${e.advice}</p>`:R.nothing}</article>`}renderChart(e,r){let t=Object.entries(e.coreNumbers).filter(([,a])=>a!=null);return R.html`<article class="card" aria-label="${r}"><div><p class="label">${r}</p>${e.profile?.name?R.html`<h2 class="title">${e.profile.name}</h2>`:R.nothing}</div>${t.length>0?R.html`<div class="cores">${t.map(([a,s])=>R.html`<div class="item"><span>${ye(a)}</span> <strong>${s.number??""}</strong></div>`)}</div>`:R.nothing}</article>`}};ze.styles=[y,R.css`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.numeral{font-size:4rem;line-height:1;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.meaning{color:var(--roxy-fg,#0a0a0a);margin:0}.calc{font-family:var(--roxy-font-mono);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 30%, transparent);padding:var(--roxy-space-sm,.5rem);border-radius:var(--roxy-radius-sm,4px);white-space:pre-wrap;overflow-wrap:anywhere;margin:0}.chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.cores{gap:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.cores .item{align-items:baseline;gap:var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-sm,.875rem);display:flex}.cores .item span:first-child{color:var(--roxy-muted,#71717a);text-transform:capitalize}.cores .item strong{color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums;font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600)}.karmic{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);border:1px solid color-mix(in srgb, var(--roxy-warning,#ea580c) 32%, transparent);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-radius:var(--roxy-radius-md,8px);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}`],d([(0,Ar.property)({attribute:!1})],ze.prototype,"data",2),d([(0,Ar.property)({type:String,reflect:!0})],ze.prototype,"type",2),ze=d([(0,Ar.customElement)("roxy-numerology-card")],ze);var Va={"life-path":"Life Path",expression:"Expression","personal-year":"Personal Year",chart:"Numerology chart"};function Fa(o){return o?[o.description,o.challenge,o.resolution].filter(Boolean).join(" "):""}var B=require("lit"),Er=require("lit/decorators.js");var Me=class extends B.LitElement{constructor(){super();this.data=null;this.detail="detailed";new h(this)}render(){let e=this.data;if(!e)return B.html`<div class="roxy-empty" role="status">No panchang data</div>`;let r="sunrise"in e?e:null,t=[["Tithi",this.formatPart(e.tithi)],["Nakshatra",this.formatPart(e.nakshatra)],["Yoga",this.formatPart(e.yoga)],["Karana",this.formatPart(e.karana)]];r&&t.push(["Vara",this.formatPart(r.vara)]);let a=r?[["Moon sign",this.formatRashi(r.moonSign)],["Sun sign",this.formatRashi(r.sunSign)],["Sun nakshatra",this.formatSunNakshatra(r.sunNakshatra)],["Hora",this.formatHora(r.hora)]].filter(p=>!!p[1]):[],s=r?[["Brahma Muhurta",r.brahmaMuhurta],["Abhijit Muhurta",r.abhijitMuhurta],["Vijaya Muhurta",r.vijayaMuhurta],["Godhuli Muhurta",r.godhuliMuhurta],["Nishita Muhurta",r.nishitaMuhurta],["Pratah Sandhya",r.pratahSandhya],["Sayahna Sandhya",r.sayahnaSandhya]]:[],i=r?this.expandWindows("Amrit Kalam",r.amritKalam):[],l=r?[["Rahu Kaal",r.rahuKaal],["Yamaganda",r.yamaganda],["Gulika",r.gulika]]:[],c=r?[...this.expandWindows("Dur Muhurta",r.durMuhurta),...this.expandWindows("Varjyam",r.varjyam)]:[],m=r&&"transitions"in r?r.transitions:void 0;return B.html`<div class="wrap" aria-label="Panchang"><header class="head"><h2 class="title">Panchang</h2><span class="date">${r?_e(r.date):""}</span></header><table><tbody>${t.map(([p,u])=>B.html`<tr><th>${p}</th><td>${u}</td></tr>`)} ${r?.sunrise?B.html`<tr><th>Sunrise</th><td>${he(r.sunrise)}</td></tr>`:B.nothing} ${r?.sunset?B.html`<tr><th>Sunset</th><td>${he(r.sunset)}</td></tr>`:B.nothing} ${r?.moonrise?B.html`<tr><th>Moonrise</th><td>${he(r.moonrise)}</td></tr>`:B.nothing} ${r?.moonset?B.html`<tr><th>Moonset</th><td>${he(r.moonset)}</td></tr>`:B.nothing} ${a.map(([p,u])=>B.html`<tr><th>${p}</th><td>${u}</td></tr>`)}</tbody></table>${m?B.html`<div class="section">Next transitions</div><table><tbody>${this.renderTransitionRow("Tithi",m.tithi)} ${this.renderTransitionRow("Nakshatra",m.nakshatra)} ${this.renderTransitionRow("Yoga",m.yoga)} ${this.renderTransitionRow("Karana",m.karana)}</tbody></table>`:B.nothing} ${this.detail==="detailed"&&(s.some(p=>!!p[1])||i.length>0||l.some(p=>!!p[1])||c.length>0)?B.html`<div class="section">Auspicious muhurtas</div><table><tbody>${this.renderPeriodRows([...s.filter(p=>!!p[1]),...i])}</tbody></table><div class="section">Inauspicious periods</div><table><tbody>${this.renderPeriodRows([...l.filter(p=>!!p[1]),...c])}</tbody></table>`:B.nothing}</div>`}renderPeriodRows(e){return e.map(([r,t])=>{let a=yt(t);return a?B.html`<tr><th>${r}</th><td>${a}</td></tr>`:B.nothing})}expandWindows(e,r){return!r||r.length===0?[]:r.map((t,a)=>[r.length>1?`${e} ${a+1}`:e,t])}renderTransitionRow(e,r){if(!r?.endsAt)return B.nothing;let t=he(r.endsAt),a=r.next?` \u2192 ${r.next}`:"";return B.html`<tr><th>${e}</th><td>ends ${t}${a}</td></tr>`}formatPart(e){if(!e)return"";if(typeof e=="string")return e;if(typeof e=="object"){let r=e;return[r.name,r.paksha?`(${r.paksha} paksha)`:"",r.lord?`\xB7 ${r.lord}`:"",r.phase].filter(Boolean).join(" ")}return String(e)}formatRashi(e){return e?.name?e.sanskritName&&e.sanskritName!==e.name?`${e.name} (${e.sanskritName})`:e.name:""}formatSunNakshatra(e){return e?.name?[e.name,typeof e.pada=="number"?`pada ${e.pada}`:"",e.lord?`\xB7 ${e.lord}`:""].filter(Boolean).join(" "):""}formatHora(e){if(!e?.current)return"";let r=yt(e);return r?`${e.current} (${r})`:e.current}};Me.styles=[y,B.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:hidden}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);justify-content:space-between;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}tbody tr:nth-child(odd){background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 24%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;vertical-align:top}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;width:38%}td{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}.section{border-top:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em}`],d([(0,Er.property)({attribute:!1})],Me.prototype,"data",2),d([(0,Er.property)({type:String,reflect:!0})],Me.prototype,"detail",2),Me=d([(0,Er.customElement)("roxy-panchang-table")],Me);var ie=require("lit"),st=require("lit/decorators.js");var vt=[{key:"sthanaBala",label:"Sthana",color:"var(--roxy-info, #0284c7)"},{key:"digBala",label:"Dig",color:"var(--roxy-success, #16a34a)"},{key:"kalaBala",label:"Kala",color:"var(--roxy-warning, #ea580c)"},{key:"chestaBala",label:"Chesta",color:"var(--roxy-accent, #f59e0b)"},{key:"naisargikaBala",label:"Naisargika",color:"var(--roxy-secondary, #475569)"},{key:"drikBala",label:"Drik",color:"var(--roxy-danger, #dc2626)"}],We=class extends ie.LitElement{constructor(){super();this.data=null;new h(this)}render(){if(!this.data?.planets?.length)return ie.html`<div class="roxy-empty" role="status">No shadbala data</div>`;let e=[...this.data.planets].sort((r,t)=>r.relativeRank-t.relativeRank);return ie.html`<div class="wrap" aria-label="Shadbala planetary strength"><div class="head"><h2 class="title">Shadbala</h2><p class="subtitle">${e.length} planets ranked by strength</p></div><div role="list" aria-label="Planet strength bars">${e.map(r=>this.renderPlanetRow(r))}</div><div class="legend" aria-label="Strength component legend">${vt.map(r=>ie.html`<div class="legend-row"><span class="legend-swatch" style="background:${r.color}" aria-hidden="true"></span> ${r.label}</div>`)}</div></div>`}renderPlanetRow(e){let r=I[b(e.planet)]??"",t=vt.map(m=>Math.max(0,e[m.key])),a=t.reduce((m,p)=>m+p,0),s=typeof e.strengthRatio=="number"&&e.strengthRatio>=1,i=s?"adequacy-badge--adequate":"adequacy-badge--weak",l=s?"adequate":"weak",c=v(e.totalRupas,2)&&v(e.minRequired,2)?`${v(e.totalRupas,2)} / ${v(e.minRequired,2)} R`:"";return ie.html`<div class="planet-row" role="listitem" aria-label="${e.planet} shadbala"><div class="planet-label"><span class="glyph" aria-hidden="true">${r}</span> ${e.planet} <span class="rank-badge" aria-label="rank ${e.relativeRank}">#${e.relativeRank}</span></div><div class="bar-wrap"><div class="bar" role="img" aria-label="Strength components for ${e.planet}">${a>0?vt.map((m,p)=>{let u=t[p];if(u<=0)return ie.nothing;let P=u/a*100;return ie.html`<div class="bar-segment" style="flex-grow:${P};background:${m.color}" title="${m.label}: ${v(u,1)}"></div>`}):ie.nothing}</div></div><div class="pills">${c?ie.html`<span class="rupas-label">${c}</span>`:ie.nothing} <span class="${`adequacy-badge ${i}`}">${l}</span></div></div>`}};We.styles=[y,ie.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.planet-row{align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-sm,.5rem) 0;border-bottom:1px solid var(--roxy-border,#e4e4e7);grid-template-columns:8rem 1fr auto;display:grid}.planet-row:last-of-type{border-bottom:none}.planet-label{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);align-items:center;gap:6px;display:flex}.glyph{font-size:1.2em;line-height:1}.bar-wrap{flex-direction:column;gap:4px;display:flex}.bar{border-radius:var(--roxy-radius-sm,4px);background:var(--roxy-border,#e4e4e7);height:12px;display:flex;overflow:hidden}.bar-segment{height:100%;transition:flex-grow var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1))}.pills{flex-direction:column;align-items:flex-end;gap:4px;display:flex}.rupas-label{font-variant-numeric:tabular-nums;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);white-space:nowrap}.adequacy-badge{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);padding:1px 6px;display:inline-block}.adequacy-badge--adequate{background:color-mix(in srgb, var(--roxy-success,#16a34a) 12%, transparent);color:var(--roxy-success-fg,#166534)}.adequacy-badge--weak{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);color:var(--roxy-danger-fg,#991b1b)}.rank-badge{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.legend{gap:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.legend-row{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);align-items:center;gap:6px;display:flex}.legend-swatch{border-radius:var(--roxy-radius-sm,4px);flex-shrink:0;width:10px;height:10px;display:inline-block}@container (width<=480px){.planet-row{grid-template-rows:auto auto;grid-template-columns:6rem 1fr}.pills{flex-direction:row;grid-column:1/-1;justify-content:flex-start;align-items:center}}`],d([(0,st.property)({attribute:!1})],We.prototype,"data",2),We=d([(0,st.customElement)("roxy-shadbala-table")],We);var f=require("lit"),ot=require("lit/decorators.js");var kt=360,q=kt/2,$t=170,Ua=154,wt=124,gr=96,Je=class extends f.LitElement{constructor(){super();this.data=null;new h(this)}render(){if(!this.data)return f.html`<div class="roxy-empty" role="status">No synastry data</div>`;let{person1:e,person2:r,compatibilityScore:t,analysis:a}=this.data,s=this.data.interAspects??[],i=e?.planets??[],l=r?.planets??[],c=typeof t=="number"?Math.round(t):void 0,m=a?.overall,p=a?.strengths??[],u=a?.challenges??[];return i.length>0&&l.length>0?f.html`<div class="wrap" aria-label="Synastry compatibility chart"><div class="head"><h2 class="title">Synastry</h2>${typeof c=="number"?f.html`<span class="score" aria-label="${`Score ${c} of 100`}">${c} / 100</span>`:f.nothing}</div><svg viewBox="0 0 ${kt} ${kt}" role="img" aria-label="Dual chart wheel comparing two natal charts"><title>Synastry dual wheel</title><circle class="wheel-line" cx="${q}" cy="${q}" r="${$t}" stroke-width="1.5"/><circle class="wheel-line" cx="${q}" cy="${q}" r="${gr+14}" stroke-width="0.8"/><circle class="wheel-line" cx="${q}" cy="${q}" r="${gr-14}" stroke-width="0.6"/>${this.renderSpokes()} ${this.renderSigns()} ${this.renderInterAspectLines(i,l,s)} ${this.renderRing(i,wt,"p1",1)} ${this.renderRing(l,gr,"p2",2)} ${this.renderAscendants(this.data)}</svg><div class="legend-row"><span><span class="swatch" style="background:var(--roxy-accent)"></span>Person 1</span> <span><span class="swatch" style="background:var(--roxy-info)"></span>Person 2</span> <span><span class="swatch" style="background:var(--roxy-success)"></span>harmonious</span> <span><span class="swatch" style="background:var(--roxy-danger)"></span>challenging</span></div>${m?f.html`<p class="summary">${m}</p>`:f.nothing} ${s.length>0?this.renderAspects(s):f.nothing} ${p.length>0||u.length>0?f.html`<div class="lists">${p.length?f.html`<div><h3>Strengths</h3><ul>${p.map(x=>f.html`<li>${x}</li>`)}</ul></div>`:f.nothing} ${u.length?f.html`<div><h3>Challenges</h3><ul>${u.map(x=>f.html`<li>${x}</li>`)}</ul></div>`:f.nothing}</div>`:f.nothing}</div>`:f.html`<div class="wrap" aria-label="Synastry compatibility chart"><div class="head"><h2 class="title">Synastry</h2>${typeof c=="number"?f.html`<span class="score" aria-label="${`Score ${c} of 100`}">${c} / 100</span>`:f.nothing}</div><div class="missing-planets" role="status">Synastry response missing planet positions. Pass <code>data</code> with <code>person1.planets</code> and <code>person2.planets</code> arrays from the natal-chart endpoint, or use the <code><roxy-data></code> fallback.</div>${m?f.html`<p class="summary">${m}</p>`:f.nothing} ${s.length>0?this.renderAspects(s):f.nothing} ${p.length>0||u.length>0?f.html`<div class="lists">${p.length?f.html`<div><h3>Strengths</h3><ul>${p.map(x=>f.html`<li>${x}</li>`)}</ul></div>`:f.nothing} ${u.length?f.html`<div><h3>Challenges</h3><ul>${u.map(x=>f.html`<li>${x}</li>`)}</ul></div>`:f.nothing}</div>`:f.nothing}</div>`}toAngle(e){return 180-e}renderSpokes(){return Array.from({length:12},(e,r)=>{let t=this.toAngle(r*30),a=G(q,q,gr-14,t),s=G(q,q,$t,t);return f.svg`<line class="wheel-line" x1=${a.x} y1=${a.y} x2=${s.x} y2=${s.y} stroke-width="0.6" />`})}renderSigns(){return Q.map((e,r)=>{let t=this.toAngle(r*30+15),a=G(q,q,Ua,t);return f.svg`<text class="sign" x=${a.x} y=${a.y} text-anchor="middle" dominant-baseline="central">${oe[e]}</text>`})}renderRing(e,r,t,a){return e.map(s=>{if(!Number.isFinite(s.longitude))return f.nothing;let i=this.toAngle(s.longitude),l=G(q,q,r,i),m=G(q,q,r+(a===1?-12:-10),i),p=I[b(s.name)]??s.name.slice(0,2),u=fe(s.longitude),P=s.isRetrograde===!0,x=`${u.degree}\xB0${String(u.minute).padStart(2,"0")}'`,Ze=`${s.name}${P?" retrograde":""} - ${x} ${u.sign}`;return f.svg`<g>
|
|
86
|
-
<text class=${
|
|
87
|
-
<text class="planet-deg" x=${
|
|
88
|
-
</g>`})}renderAscendants(
|
|
89
|
-
<line class="asc-tick" x1=${p.x} y1=${p.y} x2=${
|
|
90
|
-
<text class="asc-label" x=${
|
|
91
|
-
</g>`)};return t(e.person1?.ascendant,1),t(e.person2?.ascendant,2),r}renderInterAspectLines(e,r,t){let a=(s,i)=>{let l=b(i);for(let c of s)if(b(c.name)===l&&typeof c.longitude=="number")return c.longitude};return t.map(s=>{let i=a(e,s.planet1),l=a(r,s.planet2);if(i===void 0||l===void 0)return f.nothing;let c=G(q,q,wt-12,this.toAngle(i)),m=G(q,q,gr+8,this.toAngle(l)),p=ir(s),u=tr[p]??"aspect-other",P=v(s.orb,1);return f.svg`<line class=${`aspect ${u}`} x1=${c.x} y1=${c.y} x2=${m.x} y2=${m.y}><title>${s.planet1} ${p} ${s.planet2}${P?` (orb ${P}\xB0)`:""}</title></line>`})}renderAspects(e){return f.html`<table><thead><tr><th>Planet 1</th><th>Planet 2</th><th>Aspect</th><th>Orb</th><th>Strength</th></tr></thead><tbody>${e.slice(0,12).map(r=>f.html`<tr><td>${r.planet1}</td><td>${r.planet2}</td><td>${ir(r)||""}</td><td class="orb">${v(r.orb,1)}</td><td>${Wa(r.strength)}</td></tr>`)}</tbody></table>`}};Je.styles=[y,f.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.score{font-variant-numeric:tabular-nums;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xl,1.5rem)}svg{aspect-ratio:1;width:100%;max-width:560px;height:auto;margin:0 auto;display:block}.wheel-line{fill:none;stroke:var(--roxy-border,#e4e4e7)}.sign{fill:var(--roxy-secondary,#475569);font-size:14px}.p1{fill:var(--roxy-accent,#f59e0b);font-size:13px;font-weight:600}.p2{fill:var(--roxy-info,#0284c7);font-size:13px;font-weight:600}.person-tag{opacity:.85;font-size:7px;font-weight:700}.planet-deg{fill:var(--roxy-muted,#71717a);font-size:7px;font-family:var(--roxy-font-sans)}.planet-deg .retro{fill:var(--roxy-danger,#dc2626)}.asc-tick{stroke:var(--roxy-accent-ink,#b45309);stroke-width:1px;opacity:.75}.asc-label{fill:var(--roxy-accent-ink,#b45309);font-size:9px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.04em}.aspect{stroke-width:.8px;fill:none;opacity:.5}.aspect-trine,.aspect-sextile{stroke:var(--roxy-success,#16a34a)}.aspect-square,.aspect-opposition{stroke:var(--roxy-danger,#dc2626)}.aspect-conjunction{stroke:var(--roxy-accent-ink,#b45309)}.aspect-other{stroke:var(--roxy-muted,#71717a);opacity:.35}.legend-row{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);margin-top:calc(var(--roxy-space-xs,.25rem) * -1);flex-wrap:wrap;display:flex}.legend-row .swatch{vertical-align:middle;border-radius:50%;width:8px;height:8px;margin-right:4px;display:inline-block}.summary{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-base,1rem);margin:0}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td.orb{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.lists{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(14rem,1fr));display:grid}.lists h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.lists ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);margin:0}.missing-planets{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);line-height:1.5}.missing-planets code{font-family:var(--roxy-font-mono,ui-monospace, SFMono-Regular, Menlo, monospace);background:color-mix(in srgb, var(--roxy-fg,#0a0a0a) 6%, transparent);border-radius:4px;padding:0 4px;font-size:.95em}`],d([(0,ot.property)({attribute:!1})],Je.prototype,"data",2),Je=d([(0,ot.customElement)("roxy-synastry-chart")],Je);function Wa(o){return typeof o=="number"?Math.round(o).toString():""}var E=require("lit"),yr=require("lit/decorators.js");var De=class extends E.LitElement{constructor(){super();this.data=null;this.flipped=!1;this.toggleFlip=()=>{this.flipped=!this.flipped};new h(this)}render(){let e=this.data;return e?"card"in e?this.renderDailyCard(e):this.renderFullCard(e):E.html`<div class="roxy-empty" role="status">No tarot data</div>`}renderDailyCard(e){let r=e.card,t=this.flipped!==!!r.reversed,a=r.keywords??[];return E.html`<article class="card" aria-label="${r.name??"Tarot card"}"><div class="image-wrap">${r.imageUrl?E.html`<img class="${`image ${t?"reversed":""}`}" src="${r.imageUrl}" alt="${r.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${s=>{(s.key==="Enter"||s.key===" ")&&(s.preventDefault(),this.toggleFlip())}}">`:E.html`<div class="${`image ${t?"reversed":""}`}" style="aspect-ratio:0.6;display:flex;align-items:center;justify-content:center;color:var(--roxy-muted)">${r.name??"?"}</div>`}</div><div><div class="meta">${r.arcana?E.html`${r.arcana} arcana`:E.nothing} ${t?E.html`· reversed`:E.nothing}</div><h2 class="title">${r.name??"Tarot card"}</h2>${e.dailyMessage?E.html`<p class="message">${e.dailyMessage}</p>`:E.nothing} ${r.meaning?E.html`<p>${r.meaning}</p>`:E.nothing} ${a.length>0?E.html`<div class="chips">${a.map(s=>E.html`<span>${s}</span>`)}</div>`:E.nothing} <button class="flip" type="button" @click="${this.toggleFlip}" aria-pressed="${this.flipped?"true":"false"}">Flip card</button></div></article>`}renderFullCard(e){let r=this.flipped,t=r?e.reversed:e.upright,a=r?e.keywords?.reversed??[]:e.keywords?.upright??[];return E.html`<article class="card" aria-label="${e.name??"Tarot card"}"><div class="image-wrap">${e.imageUrl?E.html`<img class="${`image ${r?"reversed":""}`}" src="${e.imageUrl}" alt="${e.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${s=>{(s.key==="Enter"||s.key===" ")&&(s.preventDefault(),this.toggleFlip())}}">`:E.html`<div class="${`image ${r?"reversed":""}`}" style="aspect-ratio:0.6;display:flex;align-items:center;justify-content:center;color:var(--roxy-muted)">${e.name??"?"}</div>`}</div><div><div class="meta">${e.arcana?E.html`${e.arcana} arcana`:E.nothing} ${e.number!==void 0&&e.number!==null?E.html`· ${e.number}`:E.nothing} ${r?E.html`· reversed`:E.nothing}</div><h2 class="title">${e.name??"Tarot card"}</h2>${t?.description?E.html`<p>${t.description}</p>`:E.nothing} ${a.length>0?E.html`<div class="chips">${a.map(s=>E.html`<span>${s}</span>`)}</div>`:E.nothing} <button class="flip" type="button" @click="${this.toggleFlip}" aria-pressed="${this.flipped?"true":"false"}">Flip card</button></div></article>`}};De.styles=[y,E.css`.card{background:var(--roxy-bg,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-lg,1.5rem);grid-template-columns:minmax(0,9rem) 1fr;align-items:start;display:grid}@container (width<=480px){.card{grid-template-columns:1fr}}.image-wrap{perspective:800px}.image{border-radius:var(--roxy-radius-md,8px);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);width:100%;height:auto;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));cursor:pointer;display:block}.image.reversed{transform:rotate(180deg)}.image:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);margin:0}.meta{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);text-transform:uppercase;letter-spacing:.06em;margin-bottom:var(--roxy-space-sm,.5rem)}.message{color:var(--roxy-fg,#0a0a0a);margin:var(--roxy-space-sm,.5rem) 0 var(--roxy-space-md,1rem)}.chips{gap:var(--roxy-space-xs,.25rem);margin-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.flip{margin-top:var(--roxy-space-sm,.5rem);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-family:inherit;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-secondary,#475569);cursor:pointer;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));background:0 0;padding:4px 12px}.flip:hover{transform:scale(1.02)}`],d([(0,yr.property)({attribute:!1})],De.prototype,"data",2),d([(0,yr.state)()],De.prototype,"flipped",2),De=d([(0,yr.customElement)("roxy-tarot-card")],De);var A=require("lit"),Nr=require("lit/decorators.js");var Ge=class extends A.LitElement{constructor(){super();this.data=null;this.spread="three-card";new h(this)}render(){let e=this.data;if(!e)return A.html`<div class="roxy-empty" role="status">No tarot spread</div>`;let r="answer"in e,t="cards"in e&&!("spread"in e),a=t?[]:"positions"in e?e.positions??[]:[],s=t&&"cards"in e?e.cards:[],i=r?e.answer:void 0,l=r?e.strength:void 0,c="spread"in e?e.spread:this.spread.replace(/-/g," "),m="question"in e?e.question:void 0,p="summary"in e?e.summary:void 0,u=r?e.interpretation:void 0,P=i?i.toLowerCase().replace(/[^a-z]/g,""):"";return A.html`<article class="wrap" aria-label="Tarot spread"><header class="head"><h2 class="title">${c}</h2>${m?A.html`<span class="question">"${m}"</span>`:A.nothing}</header>${r?A.html`<div><span class="${`answer ${P}`}">${i}</span> ${l?A.html`<small>· ${l}</small>`:A.nothing}</div>`:A.nothing} ${a.length>0?A.html`<div class="grid">${a.map(x=>A.html`<div class="card"><p class="label">${x.name??""}</p><div class="image">${x.card?.imageUrl?A.html`<img src="${x.card.imageUrl}" alt="${x.card.name??"tarot card"}" class="${x.card.reversed?"reversed":""}">`:A.html`${x.card?.name??"?"}`}</div><p class="name">${x.card?.name??""} ${x.card?.reversed?A.html`<small>(reversed)</small>`:A.nothing}</p>${x.interpretation?A.html`<p class="interp">${x.interpretation}</p>`:A.nothing}</div>`)}</div>`:A.nothing} ${s.length>0?A.html`<div class="grid">${s.map(x=>A.html`<div class="card"><div class="image">${x.imageUrl?A.html`<img src="${x.imageUrl}" alt="${x.name??"tarot card"}" class="${x.reversed?"reversed":""}">`:A.html`${x.name??"?"}`}</div><p class="name">${x.name??""} ${x.reversed?A.html`<small>(reversed)</small>`:A.nothing}</p>${x.meaning?A.html`<p class="interp">${x.meaning}</p>`:A.nothing}</div>`)}</div>`:A.nothing} ${p?A.html`<p class="reading">${p}</p>`:A.nothing} ${u?A.html`<p class="reading">${u}</p>`:A.nothing}</article>`}};Ge.styles=[y,A.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;align-items:baseline;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.question{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);font-style:italic}.answer{border-radius:var(--roxy-radius-full,9999px);font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-base,1rem);text-transform:uppercase;letter-spacing:.06em;padding:4px 14px;display:inline-block}.answer.yes{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.answer.no{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.answer.maybe{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 16%, transparent);color:var(--roxy-warning-fg,#9a3412)}.grid{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);background:var(--roxy-bg,#fff);gap:var(--roxy-space-xs,.25rem);display:grid}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.image{aspect-ratio:.6;background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);border-radius:var(--roxy-radius-sm,4px);width:100%;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);justify-content:center;align-items:center;display:flex;overflow:hidden}.image img{object-fit:cover;width:100%;height:100%;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1))}.image img.reversed{transform:rotate(180deg)}.name{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);margin:0}.interp{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-secondary,#475569);margin:0}.reading{color:var(--roxy-fg,#0a0a0a);margin:0}`],d([(0,Nr.property)({attribute:!1})],Ge.prototype,"data",2),d([(0,Nr.property)({type:String,reflect:!0})],Ge.prototype,"spread",2),Ge=d([(0,Nr.customElement)("roxy-tarot-spread")],Ge);var z=require("lit"),ur=require("lit/decorators.js");var Oe=class extends z.LitElement{constructor(){super();this.data=null;this.tab="positions";new h(this)}render(){if(!this.data?.transitPlanets?.length)return z.html`<div class="roxy-empty" role="status">No transits data</div>`;let{transitDate:e,transitTime:r,transitPlanets:t,transitAspects:a,summary:s}=this.data,i=[_e(e),he(r)].filter(Boolean).join(" "),l=a?.length??0,c=this.tab;return z.html`<div class="wrap" aria-label="Transits"><div class="head"><h2 class="title">Transits</h2>${i?z.html`<p class="subtitle">${i}</p>`:z.nothing}</div>${l>0?z.html`${lr({items:[{id:"positions",label:"Positions"},{id:"aspects",label:`Aspects (${l})`}],active:c,onSelect:m=>{this.tab=m},label:"Transit views",idPrefix:"transits",controls:!0})}<div id="transits-panel-${c}" role="tabpanel" aria-labelledby="transits-tab-${c}">${c==="positions"?z.html`<div class="overflow-scroll">${this.renderPlanetsTable(t)}</div>`:z.html`${s?this.renderSummaryPills(s):z.nothing}<div class="overflow-scroll">${this.renderAspectsList(a??[])}</div>`}</div>`:z.html`<div class="overflow-scroll">${this.renderPlanetsTable(t)}</div>`}</div>`}renderSummaryPills(e){return z.html`<div class="summary-pills" role="region" aria-label="Aspect summary"><span class="pill pill--muted">Total: ${e.totalAspects} </span><span class="pill pill--success">Harmonious: ${e.harmonious} </span><span class="pill pill--danger">Challenging: ${e.challenging} </span><span class="pill pill--muted">Neutral: ${e.neutral}</span></div>`}renderPlanetsTable(e){return z.html`<table class="planets-table"><thead><tr><th scope="col">Planet</th><th scope="col">Sign</th><th scope="col">Degree</th><th scope="col">Speed</th></tr></thead><tbody>${e.map(r=>{let t=I[b(r.name)]??"",a=oe[b(r.sign)]??"",s=r.speed>=0?"\u2191":"\u2193";return z.html`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${t}</span> ${r.name} ${r.isRetrograde?z.html`<span class="retro-badge" aria-label="retrograde">R</span>`:z.nothing}</div></td><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${a}</span> ${r.sign}</div></td><td class="num">${v(r.degree,2)}</td><td class="speed"><span class="speed-arrow" aria-hidden="true">${s}</span> ${v(Math.abs(r.speed),4)}</td></tr>`})}</tbody></table>`}renderAspectsList(e){return z.html`<div role="list" aria-label="Transit aspects">${e.map((r,t)=>{let a=I[b(r.transitPlanet)]??"",s=I[b(r.natalPlanet)]??"",i=(r.nature??"neutral").toLowerCase(),l=r.interpretation,c=(r.type??"").toLowerCase(),m=r.isApplying?"Applying":"Separating";return z.html`<details class="aspect-card" role="listitem" name="transit-aspects" ?open="${t===0}"><summary><span aria-hidden="true">${a}</span> ${r.transitPlanet} <span class="nature-badge ${i}">${c}</span> <span aria-hidden="true">${s}</span> ${r.natalPlanet} <span class="meta">${m} · orb ${v(r.orb,2)}° · strength ${v(r.strength,1)} </span>${be()}</summary><div class="interp-body">${l?.summary?z.html`<p>${l.summary}</p>`:z.nothing} ${l?.impact?z.html`<p><strong>Impact:</strong> ${l.impact}</p>`:z.nothing} ${l?.timing?z.html`<p><strong>Timing:</strong> ${l.timing}</p>`:z.nothing} ${l?.guidance?z.html`<p><strong>Guidance:</strong> ${l.guidance}</p>`:z.nothing} ${l?.keywords?.length?z.html`<div class="interp-keywords">${l.keywords.map(p=>z.html`<span class="kw">${p}</span>`)}</div>`:z.nothing}</div></details>`})}</div>`}};Oe.styles=[y,Ke,cr,z.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.summary-pills{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.pill{padding:2px var(--roxy-space-sm,.5rem);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);border:1px solid;align-items:center;gap:4px;display:inline-flex}.pill--muted{color:var(--roxy-fg,#0a0a0a);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent)}.pill--success{color:var(--roxy-success-fg,#166534);background:color-mix(in srgb, var(--roxy-success,#16a34a) 10%, transparent)}.pill--danger{color:var(--roxy-danger-fg,#991b1b);background:color-mix(in srgb, var(--roxy-danger,#dc2626) 10%, transparent)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}.section-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem) 0}.glyph{margin-right:2px;font-size:1.1em;line-height:1}.planet-cell{white-space:nowrap;align-items:center;gap:4px;display:flex}.retro-badge{border-radius:var(--roxy-radius-sm,4px);background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);color:var(--roxy-warning-fg,#9a3412);font-size:.7em;font-weight:var(--roxy-weight-bold,600);vertical-align:middle;margin-left:2px;padding:1px 4px;display:inline-block}.speed{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a);white-space:nowrap}.speed-arrow{font-size:.85em}td.num{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.overflow-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}.aspect-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-xs,.25rem)}.aspect-card summary{cursor:pointer;color:var(--roxy-fg,#0a0a0a);flex-wrap:wrap;align-items:center;gap:.5em;font-weight:500;display:flex}.aspect-card summary .meta{color:var(--roxy-muted,#71717a);font-weight:400;font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;margin-left:auto}.aspect-card .interp-body{margin-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);line-height:1.45}.aspect-card .interp-body p{margin:0 0 var(--roxy-space-xs,.25rem)}.interp-keywords{flex-wrap:wrap;gap:.25rem;margin-top:.5rem;display:flex}.interp-keywords .kw{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px}.nature-badge{font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px;font-weight:600;display:inline-block}.nature-badge.harmonious{background:color-mix(in srgb, var(--roxy-success,#16a34a) 12%, transparent);color:var(--roxy-success-fg,#166534)}.nature-badge.challenging{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);color:var(--roxy-danger-fg,#991b1b)}.nature-badge.neutral{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);color:var(--roxy-fg,#0a0a0a)}`],d([(0,ur.property)({attribute:!1})],Oe.prototype,"data",2),d([(0,ur.state)()],Oe.prototype,"tab",2),Oe=d([(0,ur.customElement)("roxy-transits-table")],Oe);var zr=require("lit"),Mr=require("lit/decorators.js");var He=class extends zr.LitElement{constructor(){super();this.data=null;this.chartStyle="north";this.setStyle=e=>{this.chartStyle=e};new h(this)}viewModel(){return this.data?.meta?Ur(this.data.meta,"D1 Rashi"):null}render(){let e=this.viewModel();return e?zr.html`<div class="wrap"><div class="header"><h2 class="title">Vedic kundli</h2>${Jr(this.chartStyle,this.setStyle)}</div><svg viewBox="0 0 400 400" preserveAspectRatio="xMidYMid meet" role="img" aria-label="Vedic birth chart with twelve sign houses"><title>Vedic kundli</title>${Wr(e,this.chartStyle)}</svg></div>`:zr.html`<div class="roxy-empty" role="status">No kundli data</div>`}};He.styles=[y,Xr,Ke],d([(0,Mr.property)({attribute:!1})],He.prototype,"data",2),d([(0,Mr.property)({type:String,reflect:!0,attribute:"chart-style"})],He.prototype,"chartStyle",2),He=d([(0,Mr.customElement)("roxy-vedic-kundli")],He);var k=require("lit"),nt=require("lit/decorators.js");var Ja=["Lagna","Sun","Moon","Mars","Mercury","Jupiter","Venus","Saturn","Rahu","Ketu"],Xe=class extends k.LitElement{constructor(){super();this.data=null;new h(this)}orderedRows(){let e=this.data?.meta??{},r=new Set,t=[];for(let a of Ja){let s=e[a];s&&(t.push([a,s]),r.add(a))}for(let[a,s]of Object.entries(e))r.has(a)||t.push([a,s]);return t}render(){if(!this.data?.meta)return k.html`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.orderedRows();return k.html`<div class="wrap" aria-label="Vedic planetary positions"><header class="head"><h2 class="title">Planetary positions</h2></header><div class="scroll" tabindex="0"><table role="table"><thead><tr><th scope="col">Graha</th><th scope="col">Rashi</th><th scope="col">Degree</th><th scope="col">Nakshatra</th><th scope="col">Pada</th><th scope="col">Nak. lord</th><th scope="col">House</th><th scope="col">Avastha</th><th scope="col">Retro</th></tr></thead><tbody>${e.map(([r,t])=>{let a=(t.graha??r)==="Lagna",s=I[b(t.graha??r)]??"",i=oe[b(t.rashi??"")]??"";return k.html`<tr class="${a?"lagna":""}"><td class="graha">${s?k.html`<span class="glyph">${s}</span>`:k.nothing}${t.graha??r}</td><td>${i?k.html`<span class="glyph">${i}</span>`:k.nothing}${t.rashi??""}</td><td class="num">${typeof t.longitude=="number"?Vr(t.longitude):""}</td><td>${t.nakshatra?.name??""}</td><td class="num">${t.nakshatra?.pada??""}</td><td>${t.nakshatra?.lord??""}</td><td class="num">${typeof t.house=="number"?t.house:""}</td><td>${t.awastha??""}</td><td>${t.isRetrograde?k.html`<span class="retro">R</span>`:k.nothing}</td></tr>`})}</tbody></table></div>${this.renderCombustion()} ${this.renderPlanetaryWar()} ${this.renderInterpretations()} ${this.renderYogas()} ${this.renderHouses()}</div>`}renderCombustion(){let e=this.data?.combustion??[];return e.length===0?k.nothing:k.html`<details class="panel"><summary>Combust grahas<span class="summary-count">${e.length}</span>${be()}</summary><div class="panel-body">${e.map(r=>{let t=I[b(r.planet)]??"",a=v(r.distanceFromSun,2),s=v(r.orb,1);return k.html`<div class="condition"><span class="planet">${t?`${t} `:""}${r.planet}</span> <span class="detail">${a} deg from Sun, within ${s} deg orb</span></div>`})}</div></details>`}renderPlanetaryWar(){let e=this.data?.planetaryWar??[];return e.length===0?k.nothing:k.html`<details class="panel"><summary>Planetary wars<span class="summary-count">${e.length}</span>${be()}</summary><div class="panel-body">${e.map(r=>{let t=v(r.distance,2);return k.html`<div class="condition"><span class="planet">${r.planet1} vs ${r.planet2}</span> <span class="detail">${t} deg apart</span> <span class="winner">${r.winner} wins</span></div>`})}</div></details>`}renderInterpretations(){let e=this.data?.interpretations??{},r=this.orderedRows().map(([t,a])=>[a.graha??t,e[a.graha??t]]).filter(([,t])=>t!=null);return r.length===0?k.nothing:k.html`<details class="panel"><summary>Interpretations<span class="summary-count">${r.length}</span>${be()}</summary><div class="panel-body">${r.map(([t,a])=>{let s=I[b(t)]??"";return k.html`<div class="interp"><span class="planet">${s?`${s} `:""}${t}</span> ${a.rashi?k.html`<p><span class="label">Rashi.</span> ${a.rashi}</p>`:k.nothing} ${a.nakshatra?k.html`<p><span class="label">Nakshatra.</span> ${a.nakshatra}</p>`:k.nothing}</div>`})}</div></details>`}renderHouses(){let e=(this.data?.houses??[]).filter(r=>r.name||r.description);return e.length===0?k.nothing:k.html`<details class="panel"><summary>Bhava significations<span class="summary-count">${e.length}</span>${be()}</summary><div class="panel-body">${e.map(r=>k.html`<div class="bhava"><span class="name">${r.number}. ${r.name??""}</span> ${r.description?k.html`<p class="desc">${r.description}</p>`:k.nothing}</div>`)}</div></details>`}renderYogas(){let e=(this.data?.yogas??[]).filter(r=>r.present);return e.length===0?k.nothing:k.html`<details class="panel"><summary>Yogas<span class="summary-count">${e.length}</span>${be()}</summary><div class="panel-body">${e.map(r=>k.html`<div class="bhava"><span class="name">${r.name} ${r.quality?k.html`<span class="quality ${r.quality.toLowerCase()}">${r.quality}</span>`:k.nothing}</span> ${r.result?k.html`<p class="desc">${r.result}</p>`:k.nothing}</div>`)}</div></details>`}};Xe.styles=[y,cr,k.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:hidden}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7)}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.scroll{overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:620px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}tbody tr.lagna{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 10%, transparent)}td.graha{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.glyph{color:var(--roxy-muted,#71717a);margin-right:.4em}tbody tr.lagna .glyph{color:var(--roxy-accent-ink,#b45309)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600)}.num{font-variant-numeric:tabular-nums}details.panel{border-top:1px solid var(--roxy-border,#e4e4e7)}details.panel>summary{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);cursor:pointer;font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);display:flex}details.panel>summary:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:-2px}.summary-count{margin-left:auto;margin-right:var(--roxy-space-xs,.25rem);font-weight:var(--roxy-weight-normal,400);color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.panel-body{padding:0 var(--roxy-space-md,1rem) var(--roxy-space-md,1rem);gap:var(--roxy-space-sm,.5rem);display:grid}.condition{font-size:var(--roxy-text-sm,.875rem);flex-wrap:wrap;align-items:baseline;gap:.4em;display:flex}.condition .planet{font-weight:var(--roxy-weight-bold,600)}.condition .detail{color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.condition .winner{color:var(--roxy-success-fg,#166534);font-weight:var(--roxy-weight-bold,600)}.interp{gap:.15em;display:grid}.interp .planet{font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem)}.interp p{font-size:var(--roxy-text-sm,.875rem);line-height:var(--roxy-leading-normal,1.5);margin:0}.interp .label{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600)}.bhava{gap:.15em;display:grid}.bhava .name{font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem)}.bhava .desc{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);line-height:var(--roxy-leading-normal,1.5);margin:0}.quality{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.04em}.quality.positive{color:var(--roxy-success-fg,#166534)}.quality.negative{color:var(--roxy-danger-fg,#991b1b)}.quality.both{color:var(--roxy-muted,#71717a)}`],d([(0,nt.property)({attribute:!1})],Xe.prototype,"data",2),Xe=d([(0,nt.customElement)("roxy-vedic-planets-table")],Xe);var re=require("lit"),it=require("lit/decorators.js");var Qe=class extends re.LitElement{constructor(){super();this.data=null;new h(this)}rows(){let e=this.data;if(!e)return[];let r=(e.planets??[]).map(t=>({name:t.name,sign:t.sign,longitude:t.longitude,house:t.house,speed:t.speed,isRetrograde:t.isRetrograde}));for(let[t,a]of[["Ascendant",e.ascendant],["Midheaven",e.midheaven],["Part of Fortune",e.partOfFortune],["Vertex",e.vertex]])a&&r.push({name:t,sign:a.sign,longitude:a.longitude,isPoint:!0});return r}render(){if(!this.data?.planets)return re.html`<div class="roxy-empty" role="status">No chart data</div>`;let e=this.rows();return re.html`<div class="wrap" aria-label="Western planetary positions" tabindex="0"><header class="head"><h2 class="title">Planetary positions</h2></header><table role="table"><thead><tr><th scope="col">Body</th><th scope="col">Sign</th><th scope="col">Degree</th><th scope="col">House</th><th scope="col">Motion</th></tr></thead><tbody>${e.map(r=>{let t=I[b(r.name)]??"",a=oe[b(r.sign??"")]??"",s=typeof r.speed=="number"?v(r.speed,3):"";return re.html`<tr class="${r.isPoint?"point":""}"><td class="body">${t?re.html`<span class="glyph">${t}</span>`:re.nothing}${r.name}</td><td>${a?re.html`<span class="glyph">${a}</span>`:re.nothing}${r.sign??""}</td><td class="num">${typeof r.longitude=="number"?Vr(r.longitude):""}</td><td class="num">${typeof r.house=="number"?r.house:""}</td><td class="num">${s?re.html`${s}°/day`:re.nothing} ${r.isRetrograde?re.html`<span class="retro">℞</span>`:re.nothing}</td></tr>`})}</tbody></table></div>`}};Qe.styles=[y,re.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7)}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:460px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}tbody tr.point{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent)}td.body{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.glyph{color:var(--roxy-muted,#71717a);margin-right:.4em}.retro{color:var(--roxy-danger,#dc2626);font-weight:var(--roxy-weight-bold,600)}.num{font-variant-numeric:tabular-nums}`],d([(0,it.property)({attribute:!1})],Qe.prototype,"data",2),Qe=d([(0,it.customElement)("roxy-western-planets-table")],Qe);var Y=require("lit"),hr=require("lit/decorators.js");var Ie=class extends Y.LitElement{constructor(){super();this.data=null;this.filter="";this.handleInput=e=>{this.filter=e.target.value};new h(this)}renderQualityChip(e){let r=`quality-chip quality-${e}`;return Y.html`<span class="${r}">${e}</span>`}renderDetailCard(e){return Y.html`<div class="detail-card"><p class="detail-name">${e.name} ${e.quality?this.renderQualityChip(e.quality):Y.nothing}</p>${e.description?Y.html`<p class="description">${e.description}</p>`:Y.nothing} ${e.result?Y.html`<details><summary>Effects</summary><div class="result-body">${e.result}</div></details>`:Y.nothing}</div>`}render(){if(!this.data)return Y.html`<div class="roxy-empty" role="status">No yoga data</div>`;let e=this.data,r=this.filter.toLowerCase();if("description"in e&&typeof e.description=="string"){let t=e;return Y.html`<div class="wrap">${this.renderDetailCard(t)}</div>`}if("yogas"in e&&Array.isArray(e.yogas)){let t=e.yogas;if(t.length>0&&"description"in t[0]){let c=t,m=r?c.filter(u=>u.name.toLowerCase().includes(r)):c,p=e.total;return Y.html`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${p!==void 0?Y.html`<span class="count">${p} total</span>`:Y.nothing}</div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter yoga list by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="detail-grid" role="region" aria-live="polite" aria-label="Yoga results">${m.length>0?m.map(u=>this.renderDetailCard(u)):Y.html`<p class="no-results">No yogas match your search.</p>`}</div></div>`}let s=t,i=r?s.filter(c=>c.name.toLowerCase().includes(r)):s,l=e.total;return Y.html`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${l!==void 0?Y.html`<span class="count">${l} total</span>`:Y.nothing}</div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter yoga list by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="grid" role="region" aria-live="polite" aria-label="Yoga results">${i.length>0?i.map(c=>Y.html`<div class="yoga-chip">${c.name} <span class="yoga-id">${c.id}</span></div>`):Y.html`<p class="no-results">No yogas match your search.</p>`}</div></div>`}return Y.html`<div class="roxy-empty" role="status">No yoga data</div>`}};Ie.styles=[y,Y.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.count{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.search-wrap{align-items:center;gap:var(--roxy-space-sm,.5rem);display:flex}.search{width:100%;max-width:280px;font-size:var(--roxy-text-sm,.875rem);font-family:var(--roxy-font-sans);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-bg,#fff);color:var(--roxy-fg,#0a0a0a);outline:none;padding:.35em .75em}.search::placeholder{color:var(--roxy-fg,#0a0a0a);opacity:.65}.search:focus{border-color:var(--roxy-accent,#f59e0b);box-shadow:0 0 0 2px color-mix(in srgb, var(--roxy-accent,#f59e0b) 30%, transparent)}.grid{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fill,minmax(180px,1fr));display:grid}.yoga-chip{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-size:var(--roxy-text-sm,.875rem);background:var(--roxy-bg,#fff);color:var(--roxy-fg,#0a0a0a);word-break:break-word;padding:.4em .8em}.yoga-chip .yoga-id{color:var(--roxy-fg,#0a0a0a);opacity:.75;margin-top:.15em;font-size:.7em;display:block}.detail-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);background:var(--roxy-bg,#fff);gap:var(--roxy-space-sm,.5rem);display:grid}.detail-name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;margin:0;display:flex}.quality-chip{font-size:var(--roxy-text-xs,.75rem);border-radius:999px;padding:.15em .6em;font-weight:600;display:inline-block}.quality-Positive{background:color-mix(in srgb, var(--roxy-success,#22c55e) 18%, transparent);color:var(--roxy-success-fg,#15803d);border:1px solid color-mix(in srgb, var(--roxy-success,#22c55e) 40%, transparent)}.quality-Negative{background:color-mix(in srgb, var(--roxy-danger,#ef4444) 18%, transparent);color:var(--roxy-danger-fg,#b91c1c);border:1px solid color-mix(in srgb, var(--roxy-danger,#ef4444) 40%, transparent)}.quality-Both{background:color-mix(in srgb, var(--roxy-warning,#f59e0b) 18%, transparent);color:var(--roxy-warning-fg,#b45309);border:1px solid color-mix(in srgb, var(--roxy-warning,#f59e0b) 40%, transparent)}.description{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);line-height:var(--roxy-leading-normal,1.5);margin:0}details{font-size:var(--roxy-text-sm,.875rem)}details summary{cursor:pointer;color:var(--roxy-accent-ink,#b45309);align-items:center;gap:.4em;padding:.25em 0;font-weight:500;list-style:none;display:flex}details summary:before{content:"+";font-size:1.1em;line-height:1}details[open] summary:before{content:"-"}details .result-body{padding-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a);line-height:var(--roxy-leading-normal,1.5)}.no-results{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);padding:var(--roxy-space-md,1rem) 0;text-align:center}.detail-grid{gap:var(--roxy-space-sm,.5rem);display:grid}`],d([(0,hr.property)({attribute:!1})],Ie.prototype,"data",2),d([(0,hr.state)()],Ie.prototype,"filter",2),Ie=d([(0,hr.customElement)("roxy-yoga-list")],Ie);var lt=[{pascal:"RoxyNatalChart",tag:"roxy-natal-chart",slug:"natal-chart",heading:"Natal chart",description:"Western natal chart wheel for /astrology/natal-chart responses",docsLabel:"Western",endpointLabel:"POST /astrology/natal-chart",docsSummary:"Natal chart wheel with planet glyphs and aspect lines",topic:"Astrology"},{pascal:"RoxySynastryChart",tag:"roxy-synastry-chart",slug:"synastry-chart",heading:"Synastry",description:"Dual-wheel synastry chart with inter-aspects table",docsLabel:"Western",endpointLabel:"POST /astrology/synastry",docsSummary:"Dual-wheel synastry with inter-aspects table",topic:"Astrology"},{pascal:"RoxyWesternPlanetsTable",tag:"roxy-western-planets-table",slug:"western-planets-table",heading:"Western planets",description:"Western planetary positions table with sign, degree, house, and motion plus the chart angles",docsLabel:"Western",endpointLabel:"POST /astrology/natal-chart",docsSummary:"Sign, degree, house, motion columns plus ASC, MC, PoF, Vertex",topic:"Astrology"},{pascal:"RoxyTransitsTable",tag:"roxy-transits-table",slug:"transits-table",heading:"Transits",description:"Live planet positions plus aspects to a natal chart",docsLabel:"Western",endpointLabel:"POST /astrology/transits",docsSummary:"Transit planet positions plus optional aspects to a natal chart",topic:"Astrology"},{pascal:"RoxyMoonPhase",tag:"roxy-moon-phase",slug:"moon-phase",heading:"Moon phase",description:"Moon phase card and calendar",docsLabel:"Western",endpointLabel:"GET /astrology/moon-phase/{current,upcoming,calendar/...}",docsSummary:"Moon phase card and calendar",topic:"Astrology"},{pascal:"RoxyHoroscopeCard",tag:"roxy-horoscope-card",slug:"horoscope-card",heading:"Daily horoscope",description:"Daily, weekly, or monthly horoscope card for /astrology/horoscope/...",docsLabel:"Western",endpointLabel:"GET /astrology/horoscope/{sign}/{daily,weekly,monthly}",docsSummary:"Daily, weekly, or monthly horoscope card",topic:"Astrology"},{pascal:"RoxyCompatibilityCard",tag:"roxy-compatibility-card",slug:"compatibility-card",heading:"Compatibility score",description:"Cross-domain compatibility score card",docsLabel:"Cross",endpointLabel:"POST /astrology/compatibility-score, /numerology/compatibility, /biorhythm/compatibility",docsSummary:"Score card with category breakdown",topic:"Astrology"},{pascal:"RoxyVedicKundli",tag:"roxy-vedic-kundli",slug:"vedic-kundli",heading:"Vedic kundli",description:"South, North, or East Indian Vedic kundli for /vedic-astrology/birth-chart with per-planet degree and nakshatra detail",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/birth-chart",docsSummary:"South, North, or East Indian kundli with degree detail",topic:"Vedic"},{pascal:"RoxyDivisionalChart",tag:"roxy-divisional-chart",slug:"divisional-chart",heading:"Divisional chart",description:"D2 to D60 varga chart wheel with Vargottama markers",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/divisional-chart",docsSummary:"Generic divisional varga wheel from D2 Hora to D60 Shashtiamsa",topic:"Vedic"},{pascal:"RoxyKpChart",tag:"roxy-kp-chart",slug:"kp-chart",heading:"KP chart",description:"Full KP chart with Ascendant, Placidus cusps, and planets in tabbed stellar-hierarchy tables",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/chart",docsSummary:"Ascendant, cusps, and planets with KP stellar hierarchy",topic:"Vedic"},{pascal:"RoxyVedicPlanetsTable",tag:"roxy-vedic-planets-table",slug:"vedic-planets-table",heading:"Vedic planets",description:"Vedic planetary positions table with degree, nakshatra, pada, nakshatra lord, bhava, and avastha",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/birth-chart",docsSummary:"Degree, nakshatra, pada, lord, bhava, avastha columns",topic:"Vedic"},{pascal:"RoxyKpPlanetsTable",tag:"roxy-kp-planets-table",slug:"kp-planets-table",heading:"KP planets",description:"KP planets table with sub-lord and sub-sub-lord columns",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/planets",docsSummary:"Sub-lord and sub-sub-lord columns",topic:"Vedic"},{pascal:"RoxyKpRulingPlanets",tag:"roxy-kp-ruling-planets",slug:"kp-ruling-planets",heading:"KP ruling planets",description:"KP ruling planets with day lord, Moon and Lagna stellar hierarchies, and house significators",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/ruling-planets",docsSummary:"Day lord, Moon/Lagna hierarchies, ruling planets, significators",topic:"Vedic"},{pascal:"RoxyAshtakavargaGrid",tag:"roxy-ashtakavarga-grid",slug:"ashtakavarga-grid",heading:"Ashtakavarga",description:"Sarva and Bhinna ashtakavarga heatmap with bindu scores",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/ashtakavarga",docsSummary:"Sarva, Bhinna, and Shodhya Pinda views in a tabbed heatmap",topic:"Vedic"},{pascal:"RoxyShadbalaTable",tag:"roxy-shadbala-table",slug:"shadbala-table",heading:"Shadbala",description:"Six-fold planetary strength with adequacy badge per planet",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/shadbala",docsSummary:"Six-fold planetary strength bar plus rupas and adequacy badge",topic:"Vedic"},{pascal:"RoxyDashaTimeline",tag:"roxy-dasha-timeline",slug:"dasha-timeline",heading:"Vimshottari dasha",description:"Vimshottari dasha timeline with active mahadasha highlighted",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/dasha/{current,major,sub/...}",docsSummary:"Vimshottari mahadasha + antardasha + pratyantardasha",topic:"Vedic"},{pascal:"RoxyGunaMilan",tag:"roxy-guna-milan",slug:"guna-milan",heading:"Guna milan",description:"36-point Ashtakoota matrimonial compatibility breakdown",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/compatibility",docsSummary:"36-point Ashtakoota with eight sub-scores",topic:"Vedic"},{pascal:"RoxyPanchangTable",tag:"roxy-panchang-table",slug:"panchang-table",heading:"Panchang",description:"Panchang muhurta table with auspicious and inauspicious periods",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/{basic,detailed}",docsSummary:"15+ muhurtas in detailed mode",topic:"Vedic"},{pascal:"RoxyChoghadiyaGrid",tag:"roxy-choghadiya-grid",slug:"choghadiya-grid",heading:"Choghadiya",description:"Day and night Choghadiya muhurta tiles for activity timing",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/choghadiya",docsSummary:"Day and night Choghadiya muhurta tiles colored by effect",topic:"Vedic"},{pascal:"RoxyYogaList",tag:"roxy-yoga-list",slug:"yoga-list",heading:"Yoga catalog",description:"Yoga reference cards from the catalog with optional detail mode",docsLabel:"Vedic",endpointLabel:"GET /vedic-astrology/yoga, /yoga/{id}",docsSummary:"Filterable yoga cards from the 300 plus yoga catalog",topic:"Vedic"},{pascal:"RoxyNakshatraCard",tag:"roxy-nakshatra-card",slug:"nakshatra-card",heading:"Nakshatra",description:"Nakshatra reference card with lord, deity, symbol, characteristics, and remedies",docsLabel:"Vedic",endpointLabel:"GET /vedic-astrology/nakshatras/{id}",docsSummary:"Lord, deity, symbol, characteristics, remedies",topic:"Vedic"},{pascal:"RoxyDoshaCard",tag:"roxy-dosha-card",slug:"dosha-card",heading:"Manglik dosha",description:"Manglik, Kaal Sarp, or Sade Sati presence card",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/dosha/{manglik,kalsarpa,sadhesati}",docsSummary:"Presence, severity, remedies, scoped effects",topic:"Vedic"},{pascal:"RoxyNumerologyCard",tag:"roxy-numerology-card",slug:"numerology-card",heading:"Life path number",description:"Numerology card for life path, expression, personal year, or full chart",docsLabel:"Numerology",endpointLabel:"POST /numerology/{life-path,expression,personal-year,chart}",docsSummary:"Life path, expression, personal year, full chart",topic:"Numerology"},{pascal:"RoxyTarotCard",tag:"roxy-tarot-card",slug:"tarot-card",heading:"Daily tarot card",description:"Single tarot card with upright/reversed flip animation",docsLabel:"Tarot",endpointLabel:"GET /tarot/cards/{id}, POST /tarot/daily",docsSummary:"Single card with upright and reversed flip",topic:"Tarot"},{pascal:"RoxyTarotSpread",tag:"roxy-tarot-spread",slug:"tarot-spread",heading:"Three-card spread",description:"Tarot spread renderer for three-card, Celtic Cross, love, or yes/no",docsLabel:"Tarot",endpointLabel:"POST /tarot/spreads/{three-card,celtic-cross,love}, /tarot/yes-no, /tarot/draw",docsSummary:"Spreads with positions and reading",topic:"Tarot"},{pascal:"RoxyBodygraph",tag:"roxy-bodygraph",slug:"bodygraph",heading:"Bodygraph",description:"Human Design bodygraph with nine centers, channels, and activated gates plus a type, authority, and profile summary",docsLabel:"Human Design",endpointLabel:"POST /human-design/bodygraph",docsSummary:"Nine-center chart with defined and open centers, active channels, gates, and a type and authority summary",topic:"Human Design"},{pascal:"RoxyForecastTimeline",tag:"roxy-forecast-timeline",slug:"forecast-timeline",heading:"Forecast timeline",description:"Cross-domain forecast event strip colored by domain and weighted by significance",docsLabel:"Forecast",endpointLabel:"POST /forecast/timeline",docsSummary:"Date-grouped events across Western, Vedic, and biorhythm domains, weighted by significance",topic:"Forecast"},{pascal:"RoxyBiorhythmChart",tag:"roxy-biorhythm-chart",slug:"biorhythm-chart",heading:"Daily biorhythm",description:"Daily biorhythm bars or multi-day forecast cycle lines",docsLabel:"Biorhythm",endpointLabel:"POST /biorhythm/{daily,forecast,critical-days}",docsSummary:"Daily bars, forecast cycle lines, critical days",topic:"Biorhythm"},{pascal:"RoxyHexagram",tag:"roxy-hexagram",slug:"hexagram",heading:"I Ching hexagram",description:"I Ching hexagram with trigram glyphs, judgment, image, and changing lines",docsLabel:"I Ching",endpointLabel:"GET /iching/hexagrams/{number}, /iching/cast, POST /iching/daily, /iching/daily/cast",docsSummary:"Hexagram with trigrams, judgment, image, changing lines",topic:"I Ching"},{pascal:"RoxyEndpointForm",tag:"roxy-endpoint-form",slug:"endpoint-form",heading:"Schema-driven form",description:"Schema-driven form that emits roxy-submit with a validated payload",docsLabel:"Helper",endpointLabel:"Any endpoint via x-roxy-ui hints",docsSummary:"Schema-driven form, emits roxy-submit",topic:"Helpers",selfFetching:!0},{pascal:"RoxyLocationSearch",tag:"roxy-location-search",slug:"location-search",heading:"City search",description:"City search input with debounced /location/search calls",docsLabel:"Helper",endpointLabel:"GET /location/search",docsSummary:"Debounced city search input, emits roxy-location-select",topic:"Helpers",selfFetching:!0},{pascal:"RoxyData",tag:"roxy-data",slug:"data",heading:"Generic renderer",description:"Generic fallback renderer for any OpenAPI response shape",docsLabel:"Helper",endpointLabel:"Any response shape",docsSummary:"Generic fallback renderer for unknown shapes",topic:"Helpers",selfFetching:!0}];var Yt="0.9.0";var Xa=lt.map(o=>o.slug);
|
|
81
|
+
`}renderSpokes(){let e=this.data?.houses??[];return(e.length===12?e.map(t=>t.longitude):Array.from({length:12},(t,s)=>this.getAscendant()+s*30)).map(t=>{let s=this.toAngle(t),o=B(k,k,Wr,s),i=B(k,k,Ir,s);return u.svg`<line class="wheel-line" x1=${o.x} y1=${o.y} x2=${i.x} y2=${i.y} stroke-width="0.8" />`})}renderSigns(){return te.map((e,r)=>{let t=this.toAngle(r*30+15),s=B(k,k,Fa,t);return u.svg`<text class="sign-glyph" x=${s.x} y=${s.y} text-anchor="middle" dominant-baseline="central">${pe[e]}</text>`})}renderHouseNumbers(){let e=this.data?.houses??[];if(e.length===12)return e.map((t,s)=>{let o=e[(s+1)%12],i=$t(t.longitude,o?o.longitude:t.longitude+30),l=B(k,k,Wr-12,this.toAngle(i));return u.svg`<text class="house-num" x=${l.x} y=${l.y} text-anchor="middle" dominant-baseline="central">${t.number}</text>`});let r=Math.floor(this.getAscendant()/30);return Array.from({length:12},(t,s)=>{let o=this.toAngle(s*30+15),i=B(k,k,Wr-12,o),l=(s-r+12)%12+1;return u.svg`<text class="house-num" x=${i.x} y=${i.y} text-anchor="middle" dominant-baseline="central">${l}</text>`})}renderTicks(){let e=[];for(let r=0;r<360;r+=5){let t=this.toAngle(r),s=r%30===0,o=s?Fa-14:Ir-5,i=B(k,k,o,t),l=B(k,k,Ir,t);e.push(u.svg`<line class=${s?"tick tick-major":"tick"} x1=${i.x} y1=${i.y} x2=${l.x} y2=${l.y} stroke-width=${s?1:.5} />`)}return e}renderCuspDegrees(){let e=this.data?.houses??[];return e.length!==12?u.nothing:e.map(r=>{let t=this.toAngle(r.longitude),s=B(k,k,Wr+9,t),o=Me(r.longitude);return u.svg`<text class="cusp-deg" x=${s.x} y=${s.y} text-anchor="middle" dominant-baseline="central">${o.degree}°${String(o.minute).padStart(2,"0")}'</text>`})}renderPlanets(e){let t=e.filter(o=>Number.isFinite(o.longitude)).map(o=>({p:o,trueLon:Le(o.longitude),displayLon:Le(o.longitude)})).sort((o,i)=>o.trueLon-i.trueLon);for(let o=1;o<t.length;o++){let i=t[o-1],l=t[o];if(!i||!l)continue;let c=i.displayLon+7;l.displayLon<c&&(l.displayLon=c)}let s=t[t.length-1];if(s&&s.displayLon>360){let o=s.displayLon-360;for(let i of t)i.displayLon-=o}return t.map(({p:o,trueLon:i,displayLon:l})=>{let c=this.toAngle(i),p=this.toAngle(l),y=B(k,k,Kr,p),x=B(k,k,Kr-13,p),j=B(k,k,Ir-4,c),b=B(k,k,Kr+8,p),dr=N[h(o.name)]??o.name.slice(0,2),Pe=Me(o.longitude),Vr=o.isRetrograde===!0,Jr=`${Pe.degree}\xB0${String(Pe.minute).padStart(2,"0")}'`,Xr=Math.abs(l-i)>.5;return u.svg`<g>
|
|
82
|
+
${Xr?u.svg`<line class="planet-leader" x1=${j.x} y1=${j.y} x2=${b.x} y2=${b.y} />`:u.nothing}
|
|
83
|
+
<text class="planet-glyph" x=${y.x} y=${y.y} text-anchor="middle" dominant-baseline="central"><title>${o.name}${Vr?" retrograde":""} - ${Jr} ${o.sign??""}</title>${dr}</text>
|
|
84
|
+
<text class="planet-deg" x=${x.x} y=${x.y} text-anchor="middle" dominant-baseline="central">${Jr}${Vr?u.svg`<tspan class="retro"> ℞</tspan>`:u.nothing}</text>
|
|
85
|
+
</g>`})}renderDetails(){let e=this.data?.summary,r=this.data?.aspectsInterpretation;if(!e&&!r)return u.nothing;let t=e?.retrogradePlanets??[];return u.html`<div class="details">${e?.dominantElement||e?.dominantModality?u.html`<div class="pill-row">${e.dominantElement?u.html`<span class="pill">Dominant element: ${e.dominantElement}</span>`:u.nothing} ${e.dominantModality?u.html`<span class="pill">Dominant modality: ${e.dominantModality}</span>`:u.nothing}</div>`:u.nothing} ${r?u.html`<div class="pill-row"><span class="pill pill--success">Harmonious ${r.harmonious}</span> <span class="pill pill--danger">Challenging ${r.challenging}</span> <span class="pill pill--muted">Neutral ${r.neutral}</span></div>`:u.nothing} ${t.length>0?u.html`<div class="pill-row">${t.map(s=>{let o=N[s]??s.slice(0,2);return u.html`<span class="pill pill--muted">${o} ${s} R</span>`})}</div>`:u.nothing} ${r?.summary?u.html`<p class="summary">${r.summary}</p>`:u.nothing} ${this.renderElementModalityGrid()}</div>`}renderElementModalityGrid(){let e=this.getPlanets();if(e.length===0)return u.nothing;let r=["Fire","Earth","Air","Water"],t=["Cardinal","Fixed","Mutable"],s=te,o={};for(let i of r)o[i]={Cardinal:[],Fixed:[],Mutable:[]};for(let i of e){let l=s.indexOf(h(i.sign??""));if(l<0)continue;let c=r[l%4],p=t[l%3],y=N[h(i.name)]??h(i.name).slice(0,2);o[c]?.[p]?.push(y)}return u.html`<table class="em-grid" aria-label="Element and modality distribution"><thead><tr><th></th>${t.map(i=>u.html`<th scope="col">${i.slice(0,3)}</th>`)}<th scope="col">Total</th></tr></thead><tbody>${r.map(i=>{let l=t.reduce((c,p)=>c+(o[i]?.[p]?.length??0),0);return u.html`<tr><th scope="row">${i}</th>${t.map(c=>u.html`<td>${(o[i]?.[c]??[]).join(" ")}</td>`)}<td class="em-total">${l}</td></tr>`})}<tr><th scope="row">Total</th>${t.map(i=>u.html`<td class="em-total">${r.reduce((l,c)=>l+(o[c]?.[i]?.length??0),0)}</td>`)}<td class="em-total">${e.length}</td></tr></tbody></table>`}renderInterpretations(){let e=this.getPlanets().filter(r=>r.interpretation);return e.length===0?u.nothing:u.html`<section class="interpretations"><h3>Planet readings</h3>${e.map((r,t)=>{let s=r.interpretation,o=N[h(r.name)]??"",i=f(r.degree??0,1);return u.html`<details class="interp-card" name="natal-planet-readings" ?open="${t===0}"><summary><span>${o} ${r.name}</span> <span class="interp-aside"><small>${r.sign??""} ${i}</small> ${Re()}</span></summary><div class="interp-body">${s.summary?u.html`<p class="interp-summary">${s.summary}</p>`:u.nothing} ${s.detailed?u.html`<p class="interp-detail">${s.detailed}</p>`:u.nothing} ${s.keywords?.length?u.html`<div class="interp-keywords">${s.keywords.map(l=>u.html`<span class="kw">${l}</span>`)}</div>`:u.nothing}</div></details>`})}</section>`}renderAspects(e,r){let t=new Map;for(let s of e){if(typeof s.longitude!="number")continue;let o=h(s.name);o&&t.set(o,s.longitude)}return r.map(s=>{let o=t.get(h(s.planet1)),i=t.get(h(s.planet2));if(o===void 0||i===void 0)return u.nothing;let l=B(k,k,Kr-18,this.toAngle(o)),c=B(k,k,Kr-18,this.toAngle(i)),p=jr(s),y=gr[p]??"aspect-other",x=f(s.orb,1);return u.svg`<line class=${`aspect ${y}`} x1=${l.x} y1=${l.y} x2=${c.x} y2=${c.y}><title>${s.planet1} ${p||""} ${s.planet2}${x?` (orb ${x}\xB0)`:""}</title></line>`})}};je.styles=[g,Ue,Ke,u.css`.wrap{background:var(--roxy-surface,#fff);width:100%;color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-primary,#0f172a);margin:0}.meta{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}svg{width:100%;max-width:var(--roxy-chart-max-width,560px);aspect-ratio:1;height:auto;margin:0 auto;display:block}.wheel-line{fill:none;stroke:var(--roxy-border,#e4e4e7)}.sign-glyph{fill:var(--roxy-secondary,#475569);font-size:14px;font-family:var(--roxy-font-sans)}.planet-glyph{fill:var(--roxy-accent,#f59e0b);font-size:14px;font-weight:600;font-family:var(--roxy-font-sans)}.planet-deg{fill:var(--roxy-fg,#0a0a0a);font-size:7px;font-family:var(--roxy-font-sans)}@container (width<=480px){.sign-glyph,.planet-glyph{font-size:18px}.planet-deg{font-size:10px}.house-num{font-size:12px}}.planet-deg .retro{fill:var(--roxy-danger,#dc2626)}.planet-leader{stroke:var(--roxy-accent,#f59e0b);stroke-width:.5px;opacity:.55}.house-num{fill:var(--roxy-muted,#71717a);font-size:9px;font-family:var(--roxy-font-sans)}.cusp-deg{fill:var(--roxy-muted,#71717a);font-size:6px;font-family:var(--roxy-font-sans)}.tick{stroke:var(--roxy-border,#e4e4e7)}.tick-major{stroke:var(--roxy-secondary,#475569)}.aspect{stroke-width:.8px;fill:none;opacity:.55}.aspect-trine,.aspect-sextile{stroke:var(--roxy-success,#16a34a)}.aspect-square,.aspect-opposition{stroke:var(--roxy-danger,#dc2626)}.aspect-conjunction{stroke:var(--roxy-accent-ink,#b45309)}.aspect-other{stroke:var(--roxy-muted,#71717a);opacity:.4}.angle-marker{fill:var(--roxy-accent-ink,#b45309);font-size:10px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.04em}.angle-tick{stroke:var(--roxy-accent-ink,#b45309);stroke-width:1.5px}.legend{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.legend-swatch{vertical-align:middle;border-radius:50%;width:8px;height:8px;margin-right:4px;display:inline-block}.grid-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}table.aspect-grid{border-collapse:collapse;font-size:var(--roxy-text-xs,.75rem);margin:0 auto}table.aspect-grid th,table.aspect-grid td{text-align:center;border:1px solid var(--roxy-border,#e4e4e7);width:1.6rem;height:1.6rem;padding:0}table.aspect-grid th{color:var(--roxy-secondary,#475569);font-weight:var(--roxy-weight-bold,600)}table.aspect-grid td.cell{cursor:default}table.aspect-grid td.empty{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 18%, transparent)}table.aspect-grid td .asp{font-size:.95em;line-height:1}table.aspect-grid td.aspect-trine .asp,table.aspect-grid td.aspect-sextile .asp{color:var(--roxy-success,#16a34a)}table.aspect-grid td.aspect-square .asp,table.aspect-grid td.aspect-opposition .asp{color:var(--roxy-danger,#dc2626)}table.aspect-grid td.aspect-conjunction .asp{color:var(--roxy-accent-ink,#b45309)}table.aspect-grid td.aspect-other .asp{color:var(--roxy-muted,#71717a)}.details{margin-top:var(--roxy-space-md,1rem)}.pill-row{gap:var(--roxy-space-xs,.25rem);margin-bottom:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.pill{border-radius:var(--roxy-radius-sm,4px);font-size:var(--roxy-text-xs,.75rem);background:color-mix(in srgb, var(--roxy-fg,#0f172a) 8%, transparent);color:var(--roxy-fg,#0f172a);padding:2px 8px}.pill--success{background:color-mix(in srgb, var(--roxy-success,#16a34a) 15%, transparent);color:var(--roxy-success,#16a34a)}.pill--danger{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 15%, transparent);color:var(--roxy-danger,#dc2626)}.pill--muted{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);color:var(--roxy-fg,#0a0a0a)}.summary{color:var(--roxy-fg,#0f172a);font-size:var(--roxy-text-sm,.875rem);margin:var(--roxy-space-md,1rem) 0}.em-grid{border-collapse:collapse;font-size:var(--roxy-text-xs,.75rem);width:100%}.em-grid th,.em-grid td{border:1px solid var(--roxy-border,#e4e4e7);text-align:center;vertical-align:middle;padding:3px 5px}.em-grid th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.04em}.em-grid th[scope=row]{text-align:left}.em-grid td{color:var(--roxy-accent,#f59e0b);min-width:1.4rem;font-size:.95em;line-height:1.4}.em-grid .em-total{color:var(--roxy-fg,#0a0a0a);font-weight:var(--roxy-weight-bold,600);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 25%, transparent)}.interpretations{margin-top:var(--roxy-space-md,1rem)}.interpretations h3{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0 0 var(--roxy-space-sm,.5rem);font-weight:600}.interp-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-xs,.25rem)}.interp-card summary{cursor:pointer;color:var(--roxy-fg,#0f172a);justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);font-weight:500;display:flex}.interp-aside{align-items:center;gap:.6em;display:inline-flex}.interp-aside small{color:var(--roxy-muted,#71717a);font-weight:400}.interp-body{margin-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0f172a);font-size:var(--roxy-text-sm,.875rem)}.interp-keywords{flex-wrap:wrap;gap:.25rem;margin-top:.5rem;display:flex}.interp-keywords .kw{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px}`],d([(0,_r.property)({type:String,attribute:"house-system",reflect:!0})],je.prototype,"houseSystem",2),d([(0,_r.state)()],je.prototype,"view",2),je=d([(0,_r.customElement)("roxy-natal-chart")],je);var S=require("lit"),Ca=require("lit/decorators.js");var rr=class extends m{constructor(){super(...arguments);this.type="life-path"}renderData(e){let r=Qs[this.type]??this.type;return"coreNumbers"in e?this.renderChart(e,r):"personalDay"in e?this.renderPeriod(r,e.personalDay,e.theme,e.guidance):"personalMonth"in e?this.renderPeriod(r,e.personalMonth,e.theme,e.focus):"personalYear"in e?this.renderPersonalYear(e,r):"dailyMessage"in e?this.renderPeriod(r,e.number,e.meaning?.title,e.dailyMessage):this.renderNumberCard(e,r)}renderPeriod(e,r,t,s){return S.html`<article class="card" aria-label="${e}"><div class="hero">${typeof r=="number"?S.html`<div class="numeral">${r}</div>`:S.nothing}<div><p class="label">${e}</p>${t?S.html`<h2 class="title">${t}</h2>`:S.nothing}</div></div>${s?S.html`<p class="meaning">${s}</p>`:S.nothing}</article>`}renderEmpty(){return S.html`<div class="roxy-empty" role="status">No numerology data</div>`}renderNumberCard(e,r){let t=e.meaning?.keywords??[];return S.html`<article class="card" aria-label="${r}"><div class="hero">${typeof e.number=="number"?S.html`<div class="numeral">${e.number}</div>`:S.nothing}<div><p class="label">${r}</p>${e.meaning?.title?S.html`<h2 class="title">${e.meaning.title}</h2>`:S.nothing}</div></div>${e.meaning?.description?S.html`<p class="meaning">${e.meaning.description}</p>`:S.nothing} ${e.calculation?S.html`<pre class="calc">${e.calculation}</pre>`:S.nothing} ${t.length>0?S.html`<div class="chips">${t.map(s=>S.html`<span>${s}</span>`)}</div>`:S.nothing} ${e.hasKarmicDebt&&e.karmicDebtNumber?S.html`<div class="karmic">Karmic debt ${e.karmicDebtNumber}. ${eo(e.karmicDebtMeaning)}</div>`:S.nothing}</article>`}renderPersonalYear(e,r){return S.html`<article class="card" aria-label="${r}"><div class="hero">${typeof e.personalYear=="number"?S.html`<div class="numeral">${e.personalYear}</div>`:S.nothing}<div><p class="label">${r}</p>${e.theme?S.html`<h2 class="title">${e.theme}</h2>`:S.nothing}</div></div>${e.forecast?S.html`<p class="meaning">${e.forecast}</p>`:S.nothing} ${e.advice?S.html`<p>${e.advice}</p>`:S.nothing}</article>`}renderChart(e,r){let t=Object.entries(e.coreNumbers).filter(([,s])=>s!=null);return S.html`<article class="card" aria-label="${r}"><div><p class="label">${r}</p>${e.profile?.name?S.html`<h2 class="title">${e.profile.name}</h2>`:S.nothing}</div>${t.length>0?S.html`<div class="cores">${t.map(([s,o])=>S.html`<div class="item"><span>${Y(s)}</span> <strong>${o.number??""}</strong></div>`)}</div>`:S.nothing}</article>`}};rr.styles=[g,S.css`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.hero{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.numeral{font-size:4rem;line-height:1;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.meaning{color:var(--roxy-fg,#0a0a0a);margin:0}.calc{font-family:var(--roxy-font-mono);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 30%, transparent);padding:var(--roxy-space-sm,.5rem);border-radius:var(--roxy-radius-sm,4px);white-space:pre-wrap;overflow-wrap:anywhere;margin:0}.chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.cores{gap:var(--roxy-space-sm,.5rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.cores .item{align-items:baseline;gap:var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-sm,.875rem);display:flex}.cores .item span:first-child{color:var(--roxy-muted,#71717a);text-transform:capitalize}.cores .item strong{color:var(--roxy-accent-ink,#b45309);font-variant-numeric:tabular-nums;font-size:var(--roxy-text-base,1rem);font-weight:var(--roxy-weight-bold,600)}.karmic{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);border:1px solid color-mix(in srgb, var(--roxy-warning,#ea580c) 32%, transparent);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-radius:var(--roxy-radius-md,8px);font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-fg,#0a0a0a)}`],d([(0,Ca.property)({type:String,reflect:!0})],rr.prototype,"type",2),rr=d([(0,Ca.customElement)("roxy-numerology-card")],rr);var Qs={"life-path":"Life Path",expression:"Expression","soul-urge":"Soul Urge",personality:"Personality","birth-day":"Birth Day",maturity:"Maturity",daily:"Daily Number","personal-day":"Personal Day","personal-month":"Personal Month","personal-year":"Personal Year",chart:"Numerology chart"};function eo(n){return n?[n.description,n.challenge,n.resolution].filter(Boolean).join(" "):""}var q=require("lit"),Ta=require("lit/decorators.js");var ar=class extends m{constructor(){super(...arguments);this.detail="detailed"}renderEmpty(){return q.html`<div class="roxy-empty" role="status">No panchang data</div>`}renderData(e){let r="sunrise"in e?e:null,t=[["Tithi",this.formatPart(e.tithi)],["Nakshatra",this.formatPart(e.nakshatra)],["Yoga",this.formatPart(e.yoga)],["Karana",this.formatPart(e.karana)]];r&&t.push(["Vara",this.formatPart(r.vara)]);let s=r?[["Moon sign",this.formatRashi(r.moonSign)],["Sun sign",this.formatRashi(r.sunSign)],["Sun nakshatra",this.formatSunNakshatra(r.sunNakshatra)],["Hora",this.formatHora(r.hora)]].filter(y=>!!y[1]):[],o=r?[["Brahma Muhurta",r.brahmaMuhurta],["Abhijit Muhurta",r.abhijitMuhurta],["Vijaya Muhurta",r.vijayaMuhurta],["Godhuli Muhurta",r.godhuliMuhurta],["Nishita Muhurta",r.nishitaMuhurta],["Pratah Sandhya",r.pratahSandhya],["Sayahna Sandhya",r.sayahnaSandhya]]:[],i=r?this.expandWindows("Amrit Kalam",r.amritKalam):[],l=r?[["Rahu Kaal",r.rahuKaal],["Yamaganda",r.yamaganda],["Gulika",r.gulika]]:[],c=r?[...this.expandWindows("Dur Muhurta",r.durMuhurta),...this.expandWindows("Varjyam",r.varjyam)]:[],p=r&&"transitions"in r?r.transitions:void 0;return q.html`<div class="wrap" aria-label="Panchang"><header class="head"><h2 class="title">Panchang</h2><span class="date">${r?Ce(r.date):""}</span></header><table><tbody>${t.map(([y,x])=>q.html`<tr><th>${y}</th><td>${x}</td></tr>`)} ${r?.sunrise?q.html`<tr><th>Sunrise</th><td>${Ne(r.sunrise)}</td></tr>`:q.nothing} ${r?.sunset?q.html`<tr><th>Sunset</th><td>${Ne(r.sunset)}</td></tr>`:q.nothing} ${r?.moonrise?q.html`<tr><th>Moonrise</th><td>${Ne(r.moonrise)}</td></tr>`:q.nothing} ${r?.moonset?q.html`<tr><th>Moonset</th><td>${Ne(r.moonset)}</td></tr>`:q.nothing} ${s.map(([y,x])=>q.html`<tr><th>${y}</th><td>${x}</td></tr>`)}</tbody></table>${p?q.html`<div class="section">Next transitions</div><table><tbody>${this.renderTransitionRow("Tithi",p.tithi)} ${this.renderTransitionRow("Nakshatra",p.nakshatra)} ${this.renderTransitionRow("Yoga",p.yoga)} ${this.renderTransitionRow("Karana",p.karana)}</tbody></table>`:q.nothing} ${this.detail==="detailed"&&(o.some(y=>!!y[1])||i.length>0||l.some(y=>!!y[1])||c.length>0)?q.html`<div class="section">Auspicious muhurtas</div><table><tbody>${this.renderPeriodRows([...o.filter(y=>!!y[1]),...i])}</tbody></table><div class="section">Inauspicious periods</div><table><tbody>${this.renderPeriodRows([...l.filter(y=>!!y[1]),...c])}</tbody></table>`:q.nothing}</div>`}renderPeriodRows(e){return e.map(([r,t])=>{let s=Ga(t);return s?q.html`<tr><th>${r}</th><td>${s}</td></tr>`:q.nothing})}expandWindows(e,r){return!r||r.length===0?[]:r.map((t,s)=>[r.length>1?`${e} ${s+1}`:e,t])}renderTransitionRow(e,r){if(!r?.endsAt)return q.nothing;let t=Ne(r.endsAt),s=r.next?` \u2192 ${r.next}`:"";return q.html`<tr><th>${e}</th><td>ends ${t}${s}</td></tr>`}formatPart(e){if(!e)return"";if(typeof e=="string")return e;if(typeof e=="object"){let r=e;return[r.name,r.paksha?`(${r.paksha} paksha)`:"",r.lord?`\xB7 ${r.lord}`:"",r.phase].filter(Boolean).join(" ")}return String(e)}formatRashi(e){return e?.name?e.sanskritName&&e.sanskritName!==e.name?`${e.name} (${e.sanskritName})`:e.name:""}formatSunNakshatra(e){return e?.name?[e.name,typeof e.pada=="number"?`pada ${e.pada}`:"",e.lord?`\xB7 ${e.lord}`:""].filter(Boolean).join(" "):""}formatHora(e){if(!e?.current)return"";let r=Ga(e);return r?`${e.current} (${r})`:e.current}};ar.styles=[g,q.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);box-shadow:var(--roxy-shadow-sm);overflow:hidden}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);justify-content:space-between;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.date{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}tbody tr:nth-child(odd){background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 24%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;vertical-align:top}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;width:38%}td{color:var(--roxy-fg,#0a0a0a);font-variant-numeric:tabular-nums}.section{border-top:1px solid var(--roxy-border,#e4e4e7);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.06em}`],d([(0,Ta.property)({type:String,reflect:!0})],ar.prototype,"detail",2),ar=d([(0,Ta.customElement)("roxy-panchang-table")],ar);var le=require("lit"),It=require("lit/decorators.js");var Kt=["name","english","title"],ro=new Set(["description","meaning","characteristics","tagline","definedMeaning","undefinedMeaning","motto"]),ao=new Set(["id","symbol","keywords",...Kt]),Nr=class extends m{renderData(a){let e=a,r=this.deriveTitle(e),t=typeof e.symbol=="string"?e.symbol:void 0,s=Array.isArray(e.keywords)?e.keywords.map(String):[],o=[],i=[],l=[];for(let[c,p]of Object.entries(e))if(!(ao.has(c)||p==null))if(Array.isArray(p)){let y=p.filter(x=>x!=null).map(String);y.length>0&&i.push([c,y])}else typeof p=="string"?ro.has(c)||p.length>48?o.push([c,p]):l.push([c,p]):(typeof p=="number"||typeof p=="boolean")&&l.push([c,String(p)]);return le.html`<article class="card" aria-label="${r}"><header class="head">${t?le.html`<span class="symbol" aria-hidden="true">${t}</span>`:le.nothing}<div><p class="label">Reference</p><h2 class="name">${r}</h2></div></header>${s.length>0?le.html`<div class="chips">${s.map(c=>le.html`<span>${c}</span>`)}</div>`:le.nothing} ${o.map(([c,p])=>le.html`<p class="prose"><span class="prose-label">${Y(c)}</span>${p}</p>`)} ${l.length>0?le.html`<div class="facts-wrap"><dl class="facts">${l.map(([c,p])=>le.html`<div class="fact"><dt>${Y(c)}</dt><dd>${p}</dd></div>`)}</dl></div>`:le.nothing} ${i.map(([c,p])=>le.html`<div class="list"><h3>${Y(c)}</h3><div class="chips">${p.map(y=>le.html`<span>${y}</span>`)}</div></div>`)}</article>`}renderEmpty(){return le.html`<div class="roxy-empty" role="status">No reference data</div>`}deriveTitle(a){for(let t of Kt)if(typeof a[t]=="string")return a[t];let e=typeof a.type=="string"?Y(a.type):"",r=a.number;return r!=null?`${e} ${r}`.trim():"Reference"}};Nr.styles=[g,le.css`.card{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{align-items:center;gap:var(--roxy-space-md,1rem);display:flex}.symbol{color:var(--roxy-accent-ink,#b45309);flex:none;font-size:2.5rem;line-height:1}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.prose{margin:0;line-height:1.6}.prose .prose-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.05em;margin-bottom:2px;display:block}.chips{gap:var(--roxy-space-xs,.25rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.list h3,.facts-wrap h3{margin:0 0 var(--roxy-space-xs,.25rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.facts{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fit,minmax(9rem,1fr));margin:0;display:grid}.fact dt{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-xs,.75rem);text-transform:capitalize}.fact dd{font-size:var(--roxy-text-sm,.875rem);margin:0}`],Nr=d([(0,It.customElement)("roxy-reference-card")],Nr);var ke=require("lit"),_t=require("lit/decorators.js");var Va=[{key:"sthanaBala",label:"Sthana",color:"var(--roxy-info, #0284c7)"},{key:"digBala",label:"Dig",color:"var(--roxy-success, #16a34a)"},{key:"kalaBala",label:"Kala",color:"var(--roxy-warning, #ea580c)"},{key:"chestaBala",label:"Chesta",color:"var(--roxy-accent, #f59e0b)"},{key:"naisargikaBala",label:"Naisargika",color:"var(--roxy-secondary, #475569)"},{key:"drikBala",label:"Drik",color:"var(--roxy-danger, #dc2626)"}],Lr=class extends m{renderEmpty(){return ke.html`<div class="roxy-empty" role="status">No shadbala data</div>`}renderData(a){if(!a.planets?.length)return this.renderEmpty();let e=[...a.planets].sort((r,t)=>r.relativeRank-t.relativeRank);return ke.html`<div class="wrap" aria-label="Shadbala planetary strength"><div class="head"><h2 class="title">Shadbala</h2><p class="subtitle">${e.length} planets ranked by strength</p></div><div role="list" aria-label="Planet strength bars">${e.map(r=>this.renderPlanetRow(r))}</div><div class="legend" aria-label="Strength component legend">${Va.map(r=>ke.html`<div class="legend-row"><span class="legend-swatch" style="background:${r.color}" aria-hidden="true"></span> ${r.label}</div>`)}</div></div>`}renderPlanetRow(a){let e=N[h(a.planet)]??"",r=Va.map(c=>Math.max(0,a[c.key])),t=r.reduce((c,p)=>c+p,0),s=typeof a.strengthRatio=="number"&&a.strengthRatio>=1,o=s?"adequacy-badge--adequate":"adequacy-badge--weak",i=s?"adequate":"weak",l=f(a.totalRupas,2)&&f(a.minRequired,2)?`${f(a.totalRupas,2)} / ${f(a.minRequired,2)} R`:"";return ke.html`<div class="planet-row" role="listitem" aria-label="${a.planet} shadbala"><div class="planet-label"><span class="glyph" aria-hidden="true">${e}</span> ${a.planet} <span class="rank-badge" aria-label="rank ${a.relativeRank}">#${a.relativeRank}</span></div><div class="bar-wrap"><div class="bar" role="img" aria-label="Strength components for ${a.planet}">${t>0?Va.map((c,p)=>{let y=r[p];if(y<=0)return ke.nothing;let x=y/t*100;return ke.html`<div class="bar-segment" style="flex-grow:${x};background:${c.color}" title="${c.label}: ${f(y,1)}"></div>`}):ke.nothing}</div></div><div class="pills">${l?ke.html`<span class="rupas-label">${l}</span>`:ke.nothing} <span class="${`adequacy-badge ${o}`}">${i}</span></div></div>`}};Lr.styles=[g,ke.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.planet-row{align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-sm,.5rem) 0;border-bottom:1px solid var(--roxy-border,#e4e4e7);grid-template-columns:8rem 1fr auto;display:grid}.planet-row:last-of-type{border-bottom:none}.planet-label{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);align-items:center;gap:6px;display:flex}.glyph{font-size:1.2em;line-height:1}.bar-wrap{flex-direction:column;gap:4px;display:flex}.bar{border-radius:var(--roxy-radius-sm,4px);background:var(--roxy-border,#e4e4e7);height:12px;display:flex;overflow:hidden}.bar-segment{height:100%;transition:flex-grow var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1))}.pills{flex-direction:column;align-items:flex-end;gap:4px;display:flex}.rupas-label{font-variant-numeric:tabular-nums;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);white-space:nowrap}.adequacy-badge{border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);padding:1px 6px;display:inline-block}.adequacy-badge--adequate{background:color-mix(in srgb, var(--roxy-success,#16a34a) 12%, transparent);color:var(--roxy-success-fg,#166534)}.adequacy-badge--weak{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);color:var(--roxy-danger-fg,#991b1b)}.rank-badge{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-accent-ink,#b45309);font-weight:var(--roxy-weight-bold,600)}.legend{gap:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);border-top:1px solid var(--roxy-border,#e4e4e7);padding-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.legend-row{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);align-items:center;gap:6px;display:flex}.legend-swatch{border-radius:var(--roxy-radius-sm,4px);flex-shrink:0;width:10px;height:10px;display:inline-block}@container (width<=480px){.planet-row{grid-template-rows:auto auto;grid-template-columns:6rem 1fr}.pills{flex-direction:row;grid-column:1/-1;justify-content:flex-start;align-items:center}}`],Lr=d([(0,_t.customElement)("roxy-shadbala-table")],Lr);var w=require("lit"),Ft=require("lit/decorators.js");var Wa=360,V=Wa/2,Ya=170,to=154,Ua=124,Fr=96,Mr=class extends m{renderEmpty(){return w.html`<div class="roxy-empty" role="status">No synastry data</div>`}renderData(a){let{person1:e,person2:r,compatibilityScore:t,analysis:s}=a,o=a.interAspects??[],i=e?.planets??[],l=r?.planets??[],c=typeof t=="number"?Math.round(t):void 0,p=s?.overall,y=s?.strengths??[],x=s?.challenges??[];return i.length>0&&l.length>0?w.html`<div class="wrap" aria-label="Synastry compatibility chart"><div class="head"><h2 class="title">Synastry</h2>${typeof c=="number"?w.html`<span class="score" aria-label="${`Score ${c} of 100`}">${c} / 100</span>`:w.nothing}</div><svg viewBox="0 0 ${Wa} ${Wa}" role="img" aria-label="Dual chart wheel comparing two natal charts"><title>Synastry dual wheel</title><circle class="wheel-line" cx="${V}" cy="${V}" r="${Ya}" stroke-width="1.5"/><circle class="wheel-line" cx="${V}" cy="${V}" r="${Fr+14}" stroke-width="0.8"/><circle class="wheel-line" cx="${V}" cy="${V}" r="${Fr-14}" stroke-width="0.6"/>${this.renderSpokes()} ${this.renderSigns()} ${this.renderInterAspectLines(i,l,o)} ${this.renderRing(i,Ua,"p1",1)} ${this.renderRing(l,Fr,"p2",2)} ${this.renderAscendants(a)}</svg><div class="legend-row"><span><span class="swatch" style="background:var(--roxy-accent)"></span>Person 1</span> <span><span class="swatch" style="background:var(--roxy-info)"></span>Person 2</span> <span><span class="swatch" style="background:var(--roxy-success)"></span>harmonious</span> <span><span class="swatch" style="background:var(--roxy-danger)"></span>challenging</span></div>${p?w.html`<p class="summary">${p}</p>`:w.nothing} ${o.length>0?this.renderAspects(o):w.nothing} ${y.length>0||x.length>0?w.html`<div class="lists">${y.length?w.html`<div><h3>Strengths</h3><ul>${y.map(b=>w.html`<li>${b}</li>`)}</ul></div>`:w.nothing} ${x.length?w.html`<div><h3>Challenges</h3><ul>${x.map(b=>w.html`<li>${b}</li>`)}</ul></div>`:w.nothing}</div>`:w.nothing}</div>`:w.html`<div class="wrap" aria-label="Synastry compatibility chart"><div class="head"><h2 class="title">Synastry</h2>${typeof c=="number"?w.html`<span class="score" aria-label="${`Score ${c} of 100`}">${c} / 100</span>`:w.nothing}</div><div class="missing-planets" role="status">Synastry response missing planet positions. Pass <code>data</code> with <code>person1.planets</code> and <code>person2.planets</code> arrays from the natal-chart endpoint, or use the <code><roxy-data></code> fallback.</div>${p?w.html`<p class="summary">${p}</p>`:w.nothing} ${o.length>0?this.renderAspects(o):w.nothing} ${y.length>0||x.length>0?w.html`<div class="lists">${y.length?w.html`<div><h3>Strengths</h3><ul>${y.map(b=>w.html`<li>${b}</li>`)}</ul></div>`:w.nothing} ${x.length?w.html`<div><h3>Challenges</h3><ul>${x.map(b=>w.html`<li>${b}</li>`)}</ul></div>`:w.nothing}</div>`:w.nothing}</div>`}toAngle(a){return 180-a}renderSpokes(){return Array.from({length:12},(a,e)=>{let r=this.toAngle(e*30),t=B(V,V,Fr-14,r),s=B(V,V,Ya,r);return w.svg`<line class="wheel-line" x1=${t.x} y1=${t.y} x2=${s.x} y2=${s.y} stroke-width="0.6" />`})}renderSigns(){return te.map((a,e)=>{let r=this.toAngle(e*30+15),t=B(V,V,to,r);return w.svg`<text class="sign" x=${t.x} y=${t.y} text-anchor="middle" dominant-baseline="central">${pe[a]}</text>`})}renderRing(a,e,r,t){return a.map(s=>{if(!Number.isFinite(s.longitude))return w.nothing;let o=this.toAngle(s.longitude),i=B(V,V,e,o),c=B(V,V,e+(t===1?-12:-10),o),p=N[h(s.name)]??s.name.slice(0,2),y=Me(s.longitude),x=s.isRetrograde===!0,j=`${y.degree}\xB0${String(y.minute).padStart(2,"0")}'`,b=`${s.name}${x?" retrograde":""} - ${j} ${y.sign}`;return w.svg`<g>
|
|
86
|
+
<text class=${r} x=${i.x} y=${i.y} text-anchor="middle" dominant-baseline="central"><title>${b}</title>${p}<tspan class="person-tag" dy="-0.55em" dx="0.15em">${t}</tspan></text>
|
|
87
|
+
<text class="planet-deg" x=${c.x} y=${c.y} text-anchor="middle" dominant-baseline="central">${y.degree}°${x?w.svg`<tspan class="retro"> ℞</tspan>`:w.nothing}</text>
|
|
88
|
+
</g>`})}renderAscendants(a){let e=[],r=(t,s)=>{if(!t)return;let o=te.findIndex(x=>x.toLowerCase()===t.sign.toLowerCase());if(o===-1)return;let i=o*30+t.degree,l=this.toAngle(i),c=s===1?Ua+14:Fr+14,p=B(V,V,c,l),y=B(V,V,Ya+14,l);e.push(w.svg`<g>
|
|
89
|
+
<line class="asc-tick" x1=${p.x} y1=${p.y} x2=${y.x} y2=${y.y} />
|
|
90
|
+
<text class="asc-label" x=${y.x} y=${y.y} text-anchor="middle" dominant-baseline="central">Asc${s}</text>
|
|
91
|
+
</g>`)};return r(a.person1?.ascendant,1),r(a.person2?.ascendant,2),e}renderInterAspectLines(a,e,r){let t=(s,o)=>{let i=h(o);for(let l of s)if(h(l.name)===i&&typeof l.longitude=="number")return l.longitude};return r.map(s=>{let o=t(a,s.planet1),i=t(e,s.planet2);if(o===void 0||i===void 0)return w.nothing;let l=B(V,V,Ua-12,this.toAngle(o)),c=B(V,V,Fr+8,this.toAngle(i)),p=jr(s),y=gr[p]??"aspect-other",x=f(s.orb,1);return w.svg`<line class=${`aspect ${y}`} x1=${l.x} y1=${l.y} x2=${c.x} y2=${c.y}><title>${s.planet1} ${p} ${s.planet2}${x?` (orb ${x}\xB0)`:""}</title></line>`})}renderAspects(a){return w.html`<table><thead><tr><th>Planet 1</th><th>Planet 2</th><th>Aspect</th><th>Orb</th><th>Strength</th></tr></thead><tbody>${a.slice(0,12).map(e=>w.html`<tr><td>${e.planet1}</td><td>${e.planet2}</td><td>${jr(e)||""}</td><td class="orb">${f(e.orb,1)}</td><td>${so(e.strength)}</td></tr>`)}</tbody></table>`}};Mr.styles=[g,w.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:center;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.score{font-variant-numeric:tabular-nums;font-weight:var(--roxy-weight-bold,600);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xl,1.5rem)}svg{width:100%;max-width:var(--roxy-chart-max-width,560px);aspect-ratio:1;height:auto;margin:0 auto;display:block}.wheel-line{fill:none;stroke:var(--roxy-border,#e4e4e7)}.sign{fill:var(--roxy-secondary,#475569);font-size:14px}.p1{fill:var(--roxy-accent,#f59e0b);font-size:13px;font-weight:600}.p2{fill:var(--roxy-info,#0284c7);font-size:13px;font-weight:600}.person-tag{opacity:.85;font-size:7px;font-weight:700}.planet-deg{fill:var(--roxy-muted,#71717a);font-size:7px;font-family:var(--roxy-font-sans)}.planet-deg .retro{fill:var(--roxy-danger,#dc2626)}.asc-tick{stroke:var(--roxy-accent-ink,#b45309);stroke-width:1px;opacity:.75}.asc-label{fill:var(--roxy-accent-ink,#b45309);font-size:9px;font-weight:700;font-family:var(--roxy-font-sans);letter-spacing:.04em}.aspect{stroke-width:.8px;fill:none;opacity:.5}.aspect-trine,.aspect-sextile{stroke:var(--roxy-success,#16a34a)}.aspect-square,.aspect-opposition{stroke:var(--roxy-danger,#dc2626)}.aspect-conjunction{stroke:var(--roxy-accent-ink,#b45309)}.aspect-other{stroke:var(--roxy-muted,#71717a);opacity:.35}.legend-row{gap:var(--roxy-space-md,1rem);font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);margin-top:calc(var(--roxy-space-xs,.25rem) * -1);flex-wrap:wrap;display:flex}.legend-row .swatch{vertical-align:middle;border-radius:50%;width:8px;height:8px;margin-right:4px;display:inline-block}.summary{color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-base,1rem);margin:0}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}td.orb{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.lists{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(14rem,1fr));display:grid}.lists h3{margin:0 0 var(--roxy-space-xs,.25rem) 0;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em}.lists ul{padding-left:var(--roxy-space-md,1rem);font-size:var(--roxy-text-sm,.875rem);margin:0}.missing-planets{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);line-height:1.5}.missing-planets code{font-family:var(--roxy-font-mono,ui-monospace, SFMono-Regular, Menlo, monospace);background:color-mix(in srgb, var(--roxy-fg,#0a0a0a) 6%, transparent);border-radius:4px;padding:0 4px;font-size:.95em}`],Mr=d([(0,Ft.customElement)("roxy-synastry-chart")],Mr);function so(n){return typeof n=="number"?Math.round(n).toString():""}var A=require("lit"),Ea=require("lit/decorators.js");var tr=class extends m{constructor(){super(...arguments);this.flipped=!1;this.toggleFlip=()=>{this.flipped=!this.flipped}}renderEmpty(){return A.html`<div class="roxy-empty" role="status">No tarot data</div>`}renderData(e){return"card"in e?this.renderDailyCard(e):this.renderFullCard(e)}renderDailyCard(e){let r=e.card,t=this.flipped!==!!r.reversed,s=r.keywords??[];return A.html`<article class="card" aria-label="${r.name??"Tarot card"}"><div class="image-wrap">${r.imageUrl?A.html`<img class="${`image ${t?"reversed":""}`}" src="${r.imageUrl}" alt="${r.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${o=>{(o.key==="Enter"||o.key===" ")&&(o.preventDefault(),this.toggleFlip())}}">`:A.html`<div class="${`image ${t?"reversed":""}`}" style="aspect-ratio:0.6;display:flex;align-items:center;justify-content:center;color:var(--roxy-muted)">${r.name??"?"}</div>`}</div><div><div class="meta">${r.arcana?A.html`${r.arcana} arcana`:A.nothing} ${t?A.html`· reversed`:A.nothing}</div><h2 class="title">${r.name??"Tarot card"}</h2>${e.dailyMessage?A.html`<p class="message">${e.dailyMessage}</p>`:A.nothing} ${r.meaning?A.html`<p>${r.meaning}</p>`:A.nothing} ${s.length>0?A.html`<div class="chips">${s.map(o=>A.html`<span>${o}</span>`)}</div>`:A.nothing} <button class="flip" type="button" @click="${this.toggleFlip}" aria-pressed="${this.flipped?"true":"false"}">Flip card</button></div></article>`}renderFullCard(e){let r=this.flipped,t=r?e.reversed:e.upright,s=r?e.keywords?.reversed??[]:e.keywords?.upright??[];return A.html`<article class="card" aria-label="${e.name??"Tarot card"}"><div class="image-wrap">${e.imageUrl?A.html`<img class="${`image ${r?"reversed":""}`}" src="${e.imageUrl}" alt="${e.name??"Tarot card"}" tabindex="0" @click="${this.toggleFlip}" @keydown="${o=>{(o.key==="Enter"||o.key===" ")&&(o.preventDefault(),this.toggleFlip())}}">`:A.html`<div class="${`image ${r?"reversed":""}`}" style="aspect-ratio:0.6;display:flex;align-items:center;justify-content:center;color:var(--roxy-muted)">${e.name??"?"}</div>`}</div><div><div class="meta">${e.arcana?A.html`${e.arcana} arcana`:A.nothing} ${e.number!==void 0&&e.number!==null?A.html`· ${e.number}`:A.nothing} ${r?A.html`· reversed`:A.nothing}</div><h2 class="title">${e.name??"Tarot card"}</h2>${t?.description?A.html`<p>${t.description}</p>`:A.nothing} ${s.length>0?A.html`<div class="chips">${s.map(o=>A.html`<span>${o}</span>`)}</div>`:A.nothing} <button class="flip" type="button" @click="${this.toggleFlip}" aria-pressed="${this.flipped?"true":"false"}">Flip card</button></div></article>`}};tr.styles=[g,A.css`.card{background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-lg,1.5rem);grid-template-columns:minmax(0,9rem) 1fr;align-items:start;display:grid}@container (width<=480px){.card{grid-template-columns:1fr}}.image-wrap{perspective:800px}.image{border-radius:var(--roxy-radius-md,8px);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);width:100%;height:auto;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));cursor:pointer;display:block}.image.reversed{transform:rotate(180deg)}.image:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:2px}.title{font-size:var(--roxy-text-xl,1.5rem);font-weight:var(--roxy-weight-bold,600);letter-spacing:var(--roxy-tracking-tight);margin:0}.meta{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);text-transform:uppercase;letter-spacing:.06em;margin-bottom:var(--roxy-space-sm,.5rem)}.message{color:var(--roxy-fg,#0a0a0a);margin:var(--roxy-space-sm,.5rem) 0 var(--roxy-space-md,1rem)}.chips{gap:var(--roxy-space-xs,.25rem);margin-top:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.chips span{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);padding:2px 8px}.flip{margin-top:var(--roxy-space-sm,.5rem);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-family:inherit;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-secondary,#475569);cursor:pointer;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1));background:0 0;padding:4px 12px}.flip:hover{transform:scale(1.02)}`],d([(0,Ea.state)()],tr.prototype,"flipped",2),tr=d([(0,Ea.customElement)("roxy-tarot-card")],tr);var or=require("lit"),Da=require("lit/decorators.js");var sr=class extends m{constructor(){super(...arguments);this.heading=""}renderEmpty(){return or.html`<div class="roxy-empty" role="status">No cards</div>`}renderData(e){let r=e.cards??[];if(r.length===0)return this.renderEmpty();let t=this.heading||"Tarot deck",s=typeof e.total=="number"?e.total:r.length;return or.html`<section class="wrap" aria-label="${t}"><header class="head"><h2 class="title">${t}</h2><span class="count">${s} ${s===1?"card":"cards"}</span></header><ul class="grid">${r.map(o=>or.html`<li class="tile">${o.imageUrl?or.html`<img class="art" src="${o.imageUrl}" alt="${o.name??"Tarot card"}" loading="lazy">`:or.html`<div class="art" aria-hidden="true"></div>`}<p class="name">${o.name}</p><p class="meta">${oo(o)}</p></li>`)}</ul></section>`}};sr.styles=[g,or.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.count{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem)}.grid{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fill,minmax(7rem,1fr));margin:0;padding:0;list-style:none;display:grid}.tile{gap:var(--roxy-space-xs,.25rem);background:var(--roxy-surface,#fff);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);box-shadow:var(--roxy-shadow-sm);display:grid}.art{aspect-ratio:2/3;border-radius:var(--roxy-radius-sm,4px);object-fit:cover;background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 35%, transparent);width:100%}.name{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);margin:0}.meta{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);margin:0}`],d([(0,Da.property)({type:String,reflect:!0})],sr.prototype,"heading",2),sr=d([(0,Da.customElement)("roxy-tarot-catalog")],sr);function oo(n){return n.suit?`${h(n.arcana)} \xB7 ${h(n.suit)}`:`${h(n.arcana)} Arcana`}var z=require("lit"),Pa=require("lit/decorators.js");var nr=class extends m{constructor(){super(...arguments);this.spread="three-card"}renderEmpty(){return z.html`<div class="roxy-empty" role="status">No tarot spread</div>`}renderData(e){let r="answer"in e,t="cards"in e&&!("spread"in e),s=t?[]:"positions"in e?e.positions??[]:[],o=t&&"cards"in e?e.cards:[],i=r?e.answer:void 0,l=r?e.strength:void 0,c="spread"in e?e.spread:this.spread.replace(/-/g," "),p="question"in e?e.question:void 0,y="summary"in e?e.summary:void 0,x=r?e.interpretation:void 0,j=i?i.toLowerCase().replace(/[^a-z]/g,""):"";return z.html`<article class="wrap" aria-label="Tarot spread"><header class="head"><h2 class="title">${c}</h2>${p?z.html`<span class="question">"${p}"</span>`:z.nothing}</header>${r?z.html`<div><span class="${`answer ${j}`}">${i}</span> ${l?z.html`<small>· ${l}</small>`:z.nothing}</div>`:z.nothing} ${s.length>0?z.html`<div class="grid">${s.map(b=>z.html`<div class="card"><p class="label">${b.name??""}</p><div class="image">${b.card?.imageUrl?z.html`<img src="${b.card.imageUrl}" alt="${b.card.name??"tarot card"}" class="${b.card.reversed?"reversed":""}">`:z.html`${b.card?.name??"?"}`}</div><p class="name">${b.card?.name??""} ${b.card?.reversed?z.html`<small>(reversed)</small>`:z.nothing}</p>${b.interpretation?z.html`<p class="interp">${b.interpretation}</p>`:z.nothing}</div>`)}</div>`:z.nothing} ${o.length>0?z.html`<div class="grid">${o.map(b=>z.html`<div class="card"><div class="image">${b.imageUrl?z.html`<img src="${b.imageUrl}" alt="${b.name??"tarot card"}" class="${b.reversed?"reversed":""}">`:z.html`${b.name??"?"}`}</div><p class="name">${b.name??""} ${b.reversed?z.html`<small>(reversed)</small>`:z.nothing}</p>${b.meaning?z.html`<p class="interp">${b.meaning}</p>`:z.nothing}</div>`)}</div>`:z.nothing} ${y?z.html`<p class="reading">${y}</p>`:z.nothing} ${x?z.html`<p class="reading">${x}</p>`:z.nothing}</article>`}};nr.styles=[g,z.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;align-items:baseline;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);text-transform:capitalize;margin:0}.question{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);font-style:italic}.answer{border-radius:var(--roxy-radius-full,9999px);font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-base,1rem);text-transform:uppercase;letter-spacing:.06em;padding:4px 14px;display:inline-block}.answer.yes{background:color-mix(in srgb, var(--roxy-success,#16a34a) 16%, transparent);color:var(--roxy-success-fg,#166534)}.answer.no{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 16%, transparent);color:var(--roxy-danger-fg,#991b1b)}.answer.maybe{background:color-mix(in srgb, var(--roxy-warning,#ea580c) 16%, transparent);color:var(--roxy-warning-fg,#9a3412)}.grid{gap:var(--roxy-space-md,1rem);grid-template-columns:repeat(auto-fit,minmax(8rem,1fr));display:grid}.card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem);background:var(--roxy-surface,#fff);gap:var(--roxy-space-xs,.25rem);display:grid}.label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;margin:0}.image{aspect-ratio:.6;background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);border-radius:var(--roxy-radius-sm,4px);width:100%;font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);justify-content:center;align-items:center;display:flex;overflow:hidden}.image img{object-fit:cover;width:100%;height:100%;transition:transform var(--roxy-motion-duration,.2s) var(--roxy-motion-easing,cubic-bezier(.4, 0, .2, 1))}.image img.reversed{transform:rotate(180deg)}.name{font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);margin:0}.interp{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-secondary,#475569);margin:0}.reading{color:var(--roxy-fg,#0a0a0a);margin:0}`],d([(0,Pa.property)({type:String,reflect:!0})],nr.prototype,"spread",2),nr=d([(0,Pa.customElement)("roxy-tarot-spread")],nr);var M=require("lit"),za=require("lit/decorators.js");var ir=class extends m{constructor(){super(...arguments);this.tab="positions"}renderEmpty(){return M.html`<div class="roxy-empty" role="status">No transits data</div>`}renderData(e){if(!e.transitPlanets?.length)return this.renderEmpty();let{transitDate:r,transitTime:t,transitPlanets:s,transitAspects:o,summary:i}=e,l=[Ce(r),Ne(t)].filter(Boolean).join(" "),c=o?.length??0,p=this.tab;return M.html`<div class="wrap" aria-label="Transits"><div class="head"><h2 class="title">Transits</h2>${l?M.html`<p class="subtitle">${l}</p>`:M.nothing}</div>${c>0?M.html`${Br({items:[{id:"positions",label:"Positions"},{id:"aspects",label:`Aspects (${c})`}],active:p,onSelect:y=>{this.tab=y},label:"Transit views",idPrefix:"transits",controls:!0})}<div id="transits-panel-${p}" role="tabpanel" aria-labelledby="transits-tab-${p}">${p==="positions"?M.html`<div class="overflow-scroll">${this.renderPlanetsTable(s)}</div>`:M.html`${i?this.renderSummaryPills(i):M.nothing}<div class="overflow-scroll">${this.renderAspectsList(o??[])}</div>`}</div>`:M.html`<div class="overflow-scroll">${this.renderPlanetsTable(s)}</div>`}</div>`}renderSummaryPills(e){return M.html`<div class="summary-pills" role="region" aria-label="Aspect summary"><span class="pill pill--muted">Total: ${e.totalAspects} </span><span class="pill pill--success">Harmonious: ${e.harmonious} </span><span class="pill pill--danger">Challenging: ${e.challenging} </span><span class="pill pill--muted">Neutral: ${e.neutral}</span></div>`}renderPlanetsTable(e){return M.html`<table class="planets-table"><thead><tr><th scope="col">Planet</th><th scope="col">Sign</th><th scope="col">Degree</th><th scope="col">Speed</th></tr></thead><tbody>${e.map(r=>{let t=N[h(r.name)]??"",s=pe[h(r.sign)]??"",o=r.speed>=0?"\u2191":"\u2193";return M.html`<tr><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${t}</span> ${r.name} ${r.isRetrograde?M.html`<span class="retro-badge" aria-label="retrograde">R</span>`:M.nothing}</div></td><td><div class="planet-cell"><span class="glyph" aria-hidden="true">${s}</span> ${r.sign}</div></td><td class="num">${f(r.degree,2)}</td><td class="speed"><span class="speed-arrow" aria-hidden="true">${o}</span> ${f(Math.abs(r.speed),4)}</td></tr>`})}</tbody></table>`}renderAspectsList(e){return M.html`<div role="list" aria-label="Transit aspects">${e.map((r,t)=>{let s=N[h(r.transitPlanet)]??"",o=N[h(r.natalPlanet)]??"",i=(r.nature??"neutral").toLowerCase(),l=r.interpretation,c=(r.type??"").toLowerCase(),p=r.isApplying?"Applying":"Separating";return M.html`<details class="aspect-card" role="listitem" name="transit-aspects" ?open="${t===0}"><summary><span aria-hidden="true">${s}</span> ${r.transitPlanet} <span class="nature-badge ${i}">${c}</span> <span aria-hidden="true">${o}</span> ${r.natalPlanet} <span class="meta">${p} · orb ${f(r.orb,2)}° · strength ${f(r.strength,1)} </span>${Re()}</summary><div class="interp-body">${l?.summary?M.html`<p>${l.summary}</p>`:M.nothing} ${l?.impact?M.html`<p><strong>Impact:</strong> ${l.impact}</p>`:M.nothing} ${l?.timing?M.html`<p><strong>Timing:</strong> ${l.timing}</p>`:M.nothing} ${l?.guidance?M.html`<p><strong>Guidance:</strong> ${l.guidance}</p>`:M.nothing} ${l?.keywords?.length?M.html`<div class="interp-keywords">${l.keywords.map(y=>M.html`<span class="kw">${y}</span>`)}</div>`:M.nothing}</div></details>`})}</div>`}};ir.styles=[g,Ue,Ke,M.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.summary-pills{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.pill{padding:2px var(--roxy-space-sm,.5rem);border-radius:var(--roxy-radius-full,9999px);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);border:1px solid;align-items:center;gap:4px;display:inline-flex}.pill--muted{color:var(--roxy-fg,#0a0a0a);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent)}.pill--success{color:var(--roxy-success-fg,#166534);background:color-mix(in srgb, var(--roxy-success,#16a34a) 10%, transparent)}.pill--danger{color:var(--roxy-danger-fg,#991b1b);background:color-mix(in srgb, var(--roxy-danger,#dc2626) 10%, transparent)}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}.section-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem) 0}.glyph{margin-right:2px;font-size:1.1em;line-height:1}.planet-cell{white-space:nowrap;align-items:center;gap:4px;display:flex}.retro-badge{border-radius:var(--roxy-radius-sm,4px);background:color-mix(in srgb, var(--roxy-warning,#ea580c) 12%, transparent);color:var(--roxy-warning-fg,#9a3412);font-size:.7em;font-weight:var(--roxy-weight-bold,600);vertical-align:middle;margin-left:2px;padding:1px 4px;display:inline-block}.speed{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a);white-space:nowrap}.speed-arrow{font-size:.85em}td.num{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.overflow-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}.aspect-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);margin-bottom:var(--roxy-space-xs,.25rem)}.aspect-card summary{cursor:pointer;color:var(--roxy-fg,#0a0a0a);flex-wrap:wrap;align-items:center;gap:.5em;font-weight:500;display:flex}.aspect-card summary .meta{color:var(--roxy-muted,#71717a);font-weight:400;font-size:var(--roxy-text-xs,.75rem);font-variant-numeric:tabular-nums;margin-left:auto}.aspect-card .interp-body{margin-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);line-height:1.45}.aspect-card .interp-body p{margin:0 0 var(--roxy-space-xs,.25rem)}.interp-keywords{flex-wrap:wrap;gap:.25rem;margin-top:.5rem;display:flex}.interp-keywords .kw{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-accent-ink,#b45309);font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px}.nature-badge{font-size:var(--roxy-text-xs,.75rem);border-radius:9999px;padding:1px 8px;font-weight:600;display:inline-block}.nature-badge.harmonious{background:color-mix(in srgb, var(--roxy-success,#16a34a) 12%, transparent);color:var(--roxy-success-fg,#166534)}.nature-badge.challenging{background:color-mix(in srgb, var(--roxy-danger,#dc2626) 12%, transparent);color:var(--roxy-danger-fg,#991b1b)}.nature-badge.neutral{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 60%, transparent);color:var(--roxy-fg,#0a0a0a)}`],d([(0,za.state)()],ir.prototype,"tab",2),ir=d([(0,za.customElement)("roxy-transits-table")],ir);var oe=require("lit"),qt=require("lit/decorators.js");var Gr=class extends m{renderEmpty(){return oe.html`<div class="roxy-empty" role="status">No aspect data</div>`}renderData(a){let e=a.aspects??[],r=a.mutualAspects??[];if(e.length===0&&r.length===0)return this.renderEmpty();let t=a.datetime?String(a.datetime).replace("T"," "):"";return oe.html`<div class="wrap" aria-label="Vedic aspects"><div class="head"><h2 class="title">Vedic Aspects</h2>${t?oe.html`<p class="subtitle">${t}</p>`:oe.nothing}</div>${r.length>0?oe.html`<div><p class="section-label">Mutual aspects</p><div class="mutual">${r.map(s=>oe.html`<span class="mutual-pill">${s.planet1} ⟷ ${s.planet2} ${s.aspectType?oe.html`<span class="rel">${s.aspectType}</span>`:oe.nothing}</span>`)}</div></div>`:oe.nothing} ${e.length>0?oe.html`<div class="overflow-scroll"><table><thead><tr><th scope="col">From</th><th scope="col">Aspect</th><th scope="col">To</th><th scope="col">Strength</th><th scope="col">Orb</th></tr></thead><tbody>${e.map(s=>oe.html`<tr><td>${s.aspectingPlanet}</td><td><span class="kind">${s.aspectType}</span></td><td>${s.aspectedPlanet}</td><td>${typeof s.strength=="number"?oe.html`<span class="bar" style="width:${Math.max(4,Math.min(100,s.strength)*.4)}px"></span><span class="num">${f(s.strength,0)}</span>`:oe.nothing}</td><td class="num">${typeof s.orb=="number"?`${f(s.orb,2)}\xB0`:""}</td></tr>`)}</tbody></table></div>`:oe.nothing}</div>`}};Gr.styles=[g,oe.css`.wrap{background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-lg,1.5rem);box-shadow:var(--roxy-shadow-sm);gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-md,1rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.subtitle{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);margin:0}.section-label{font-size:var(--roxy-text-xs,.75rem);color:var(--roxy-muted,#71717a);text-transform:uppercase;letter-spacing:.06em;font-weight:var(--roxy-weight-bold,600);margin:0 0 var(--roxy-space-xs,.25rem) 0}.mutual{gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.mutual-pill{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 14%, transparent);color:var(--roxy-fg,#0a0a0a);font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);align-items:center;gap:.35rem;padding:2px 10px;display:inline-flex}.mutual-pill .rel{font-size:var(--roxy-text-xs,.75rem);font-weight:400}.overflow-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem)}th,td{padding:var(--roxy-space-sm,.5rem);border-bottom:1px solid var(--roxy-border,#e4e4e7);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.06em}tbody tr:last-child td{border-bottom:none}.kind{border-radius:var(--roxy-radius-full,9999px);background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 55%, transparent);font-size:var(--roxy-text-xs,.75rem);padding:1px 8px;font-weight:600;display:inline-block}.num{font-variant-numeric:tabular-nums;color:var(--roxy-muted,#71717a)}.bar{background:var(--roxy-accent,#f59e0b);vertical-align:middle;border-radius:3px;height:6px;margin-right:6px;display:inline-block}`],Gr=d([(0,qt.customElement)("roxy-vedic-aspects")],Gr);var Ja=require("lit"),qr=require("lit/decorators.js");var Ge=class extends m{constructor(){super(...arguments);this.chartStyle="north";this.chartReference="lagna";this.lagnaOverride="";this.setStyle=e=>{this.chartStyle=e}}resolveReference(){if(this.lagnaOverride)return this.lagnaOverride;if(this.chartReference==="moon")return this.data?.meta?.Moon?.rashi}viewModel(){return this.data?.meta?xa(this.data.meta,"D1 Rashi",this.resolveReference()):null}renderEmpty(){return Ja.html`<div class="roxy-empty" role="status">No kundli data</div>`}renderData(e){let r=this.viewModel();if(!r)return this.renderEmpty();let t=this.chartReference==="moon"&&!this.lagnaOverride?"Chandra lagna":"Vedic kundli";return Ja.html`<div class="wrap"><div class="header"><h2 class="title">${t}</h2>${fa(this.chartStyle,this.setStyle)}</div><svg viewBox="0 0 400 400" preserveAspectRatio="xMidYMid meet" role="img" aria-label="Vedic birth chart with twelve sign houses"><title>Vedic kundli</title>${ha(r,this.chartStyle)}</svg></div>`}};Ge.styles=[g,ba,Ue],d([(0,qr.property)({type:String,reflect:!0,attribute:"chart-style"})],Ge.prototype,"chartStyle",2),d([(0,qr.property)({type:String,reflect:!0,attribute:"chart-reference"})],Ge.prototype,"chartReference",2),d([(0,qr.property)({type:String,reflect:!0,attribute:"lagna-override"})],Ge.prototype,"lagnaOverride",2),Ge=d([(0,qr.customElement)("roxy-vedic-kundli")],Ge);var C=require("lit"),Vt=require("lit/decorators.js");var no=["Lagna","Sun","Moon","Mars","Mercury","Jupiter","Venus","Saturn","Rahu","Ketu"],Hr=class extends m{orderedRows(){let a=this.data?.meta??{},e=new Set,r=[];for(let t of no){let s=a[t];s&&(r.push([t,s]),e.add(t))}for(let[t,s]of Object.entries(a))e.has(t)||r.push([t,s]);return r}renderEmpty(){return C.html`<div class="roxy-empty" role="status">No chart data</div>`}renderData(a){if(!a.meta)return this.renderEmpty();let e=this.orderedRows();return C.html`<div class="wrap" aria-label="Vedic planetary positions"><header class="head"><h2 class="title">Planetary positions</h2></header><div class="scroll" tabindex="0"><table role="table"><thead><tr><th scope="col">Graha</th><th scope="col">Rashi</th><th scope="col">Degree</th><th scope="col">Nakshatra</th><th scope="col">Pada</th><th scope="col">Nak. lord</th><th scope="col">House</th><th scope="col">Avastha</th><th scope="col">Retro</th></tr></thead><tbody>${e.map(([r,t])=>{let s=(t.graha??r)==="Lagna",o=N[h(t.graha??r)]??"",i=pe[h(t.rashi??"")]??"";return C.html`<tr class="${s?"lagna":""}"><td class="graha">${o?C.html`<span class="glyph">${o}</span>`:C.nothing}${t.graha??r}</td><td>${i?C.html`<span class="glyph">${i}</span>`:C.nothing}${t.rashi??""}</td><td class="num">${typeof t.longitude=="number"?ya(t.longitude):""}</td><td>${t.nakshatra?.name??""}</td><td class="num">${t.nakshatra?.pada??""}</td><td>${t.nakshatra?.lord??""}</td><td class="num">${typeof t.house=="number"?t.house:""}</td><td>${t.awastha??""}</td><td>${t.isRetrograde?C.html`<span class="retro">R</span>`:C.nothing}</td></tr>`})}</tbody></table></div>${this.renderCombustion()} ${this.renderPlanetaryWar()} ${this.renderInterpretations()} ${this.renderYogas()} ${this.renderHouses()}</div>`}renderCombustion(){let a=this.data?.combustion??[];return a.length===0?C.nothing:C.html`<details class="panel"><summary>Combust grahas<span class="summary-count">${a.length}</span>${Re()}</summary><div class="panel-body">${a.map(e=>{let r=N[h(e.planet)]??"",t=f(e.distanceFromSun,2),s=f(e.orb,1);return C.html`<div class="condition"><span class="planet">${r?`${r} `:""}${e.planet}</span> <span class="detail">${t} deg from Sun, within ${s} deg orb</span></div>`})}</div></details>`}renderPlanetaryWar(){let a=this.data?.planetaryWar??[];return a.length===0?C.nothing:C.html`<details class="panel"><summary>Planetary wars<span class="summary-count">${a.length}</span>${Re()}</summary><div class="panel-body">${a.map(e=>{let r=f(e.distance,2);return C.html`<div class="condition"><span class="planet">${e.planet1} vs ${e.planet2}</span> <span class="detail">${r} deg apart</span> <span class="winner">${e.winner} wins</span></div>`})}</div></details>`}renderInterpretations(){let a=this.data?.interpretations??{},e=this.orderedRows().map(([r,t])=>[t.graha??r,a[t.graha??r]]).filter(([,r])=>r!=null);return e.length===0?C.nothing:C.html`<details class="panel"><summary>Interpretations<span class="summary-count">${e.length}</span>${Re()}</summary><div class="panel-body">${e.map(([r,t])=>{let s=N[h(r)]??"";return C.html`<div class="interp"><span class="planet">${s?`${s} `:""}${r}</span> ${t.rashi?C.html`<p><span class="label">Rashi.</span> ${t.rashi}</p>`:C.nothing} ${t.nakshatra?C.html`<p><span class="label">Nakshatra.</span> ${t.nakshatra}</p>`:C.nothing}</div>`})}</div></details>`}renderHouses(){let a=(this.data?.houses??[]).filter(e=>e.name||e.description);return a.length===0?C.nothing:C.html`<details class="panel"><summary>Bhava significations<span class="summary-count">${a.length}</span>${Re()}</summary><div class="panel-body">${a.map(e=>C.html`<div class="bhava"><span class="name">${e.number}. ${e.name??""}</span> ${e.description?C.html`<p class="desc">${e.description}</p>`:C.nothing}</div>`)}</div></details>`}renderYogas(){let a=(this.data?.yogas??[]).filter(e=>e.present);return a.length===0?C.nothing:C.html`<details class="panel"><summary>Yogas<span class="summary-count">${a.length}</span>${Re()}</summary><div class="panel-body">${a.map(e=>C.html`<div class="bhava"><span class="name">${e.name} ${e.quality?C.html`<span class="quality ${e.quality.toLowerCase()}">${e.quality}</span>`:C.nothing}</span> ${e.result?C.html`<p class="desc">${e.result}</p>`:C.nothing}</div>`)}</div></details>`}};Hr.styles=[g,Ke,C.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);box-shadow:var(--roxy-shadow-sm);overflow:hidden}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7)}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.scroll{overflow-x:auto}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:620px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}tbody tr.lagna{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 10%, transparent)}td.graha{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.glyph{color:var(--roxy-muted,#71717a);margin-right:.4em}tbody tr.lagna .glyph{color:var(--roxy-accent-ink,#b45309)}.retro{color:var(--roxy-warning-fg,#9a3412);font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600)}.num{font-variant-numeric:tabular-nums}details.panel{border-top:1px solid var(--roxy-border,#e4e4e7)}details.panel>summary{justify-content:space-between;align-items:center;gap:var(--roxy-space-sm,.5rem);padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);cursor:pointer;font-size:var(--roxy-text-sm,.875rem);font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a);display:flex}details.panel>summary:focus-visible{outline:2px solid var(--roxy-ring,#f59e0b66);outline-offset:-2px}.summary-count{margin-left:auto;margin-right:var(--roxy-space-xs,.25rem);font-weight:var(--roxy-weight-normal,400);color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.panel-body{padding:0 var(--roxy-space-md,1rem) var(--roxy-space-md,1rem);gap:var(--roxy-space-sm,.5rem);display:grid}.condition{font-size:var(--roxy-text-sm,.875rem);flex-wrap:wrap;align-items:baseline;gap:.4em;display:flex}.condition .planet{font-weight:var(--roxy-weight-bold,600)}.condition .detail{color:var(--roxy-muted,#71717a);font-variant-numeric:tabular-nums}.condition .winner{color:var(--roxy-success-fg,#166534);font-weight:var(--roxy-weight-bold,600)}.interp{gap:.15em;display:grid}.interp .planet{font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem)}.interp p{font-size:var(--roxy-text-sm,.875rem);line-height:var(--roxy-leading-normal,1.5);margin:0}.interp .label{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600)}.bhava{gap:.15em;display:grid}.bhava .name{font-weight:var(--roxy-weight-bold,600);font-size:var(--roxy-text-sm,.875rem)}.bhava .desc{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);line-height:var(--roxy-leading-normal,1.5);margin:0}.quality{font-size:var(--roxy-text-xs,.75rem);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;letter-spacing:.04em}.quality.positive{color:var(--roxy-success-fg,#166534)}.quality.negative{color:var(--roxy-danger-fg,#991b1b)}.quality.both{color:var(--roxy-muted,#71717a)}`],Hr=d([(0,Vt.customElement)("roxy-vedic-planets-table")],Hr);var ye=require("lit"),Yt=require("lit/decorators.js");var Or=class extends m{rows(){let a=this.data;if(!a)return[];let e=(a.planets??[]).map(r=>({name:r.name,sign:r.sign,longitude:r.longitude,house:r.house,speed:r.speed,isRetrograde:r.isRetrograde}));for(let[r,t]of[["Ascendant",a.ascendant],["Midheaven",a.midheaven],["Part of Fortune",a.partOfFortune],["Vertex",a.vertex]])t&&e.push({name:r,sign:t.sign,longitude:t.longitude,isPoint:!0});return e}renderEmpty(){return ye.html`<div class="roxy-empty" role="status">No chart data</div>`}renderData(a){if(!a.planets)return this.renderEmpty();let e=this.rows();return ye.html`<div class="wrap" aria-label="Western planetary positions" tabindex="0"><header class="head"><h2 class="title">Planetary positions</h2></header><table role="table"><thead><tr><th scope="col">Body</th><th scope="col">Sign</th><th scope="col">Degree</th><th scope="col">House</th><th scope="col">Motion</th></tr></thead><tbody>${e.map(r=>{let t=N[h(r.name)]??"",s=pe[h(r.sign??"")]??"",o=typeof r.speed=="number"?f(r.speed,3):"";return ye.html`<tr class="${r.isPoint?"point":""}"><td class="body">${t?ye.html`<span class="glyph">${t}</span>`:ye.nothing}${r.name}</td><td>${s?ye.html`<span class="glyph">${s}</span>`:ye.nothing}${r.sign??""}</td><td class="num">${typeof r.longitude=="number"?ya(r.longitude):""}</td><td class="num">${typeof r.house=="number"?r.house:""}</td><td class="num">${o?ye.html`${o}°/day`:ye.nothing} ${r.isRetrograde?ye.html`<span class="retro">℞</span>`:ye.nothing}</td></tr>`})}</tbody></table></div>`}};Or.styles=[g,ye.css`.wrap{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);box-shadow:var(--roxy-shadow-sm);overflow:auto}.head{padding:var(--roxy-space-md,1rem);border-bottom:1px solid var(--roxy-border,#e4e4e7)}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}table{border-collapse:collapse;width:100%;font-size:var(--roxy-text-sm,.875rem);min-width:460px}thead{background:color-mix(in srgb, var(--roxy-border,#e4e4e7) 20%, transparent)}th,td{padding:var(--roxy-space-sm,.5rem) var(--roxy-space-md,1rem);text-align:left;white-space:nowrap}th{color:var(--roxy-muted,#71717a);font-weight:var(--roxy-weight-bold,600);text-transform:uppercase;font-size:var(--roxy-text-xs,.75rem);letter-spacing:.04em}tbody tr{border-top:1px solid var(--roxy-border,#e4e4e7)}tbody tr.point{background:color-mix(in srgb, var(--roxy-accent,#f59e0b) 8%, transparent)}td.body{font-weight:var(--roxy-weight-bold,600);color:var(--roxy-fg,#0a0a0a)}.glyph{color:var(--roxy-muted,#71717a);margin-right:.4em}.retro{color:var(--roxy-danger,#dc2626);font-weight:var(--roxy-weight-bold,600)}.num{font-variant-numeric:tabular-nums}`],Or=d([(0,Yt.customElement)("roxy-western-planets-table")],Or);var Z=require("lit"),Aa=require("lit/decorators.js");var lr=class extends m{constructor(){super(...arguments);this.filter="";this.handleInput=e=>{this.filter=e.target.value}}renderQualityChip(e){let r=`quality-chip quality-${e}`;return Z.html`<span class="${r}">${e}</span>`}renderDetailCard(e){return Z.html`<div class="detail-card"><p class="detail-name">${e.name} ${e.quality?this.renderQualityChip(e.quality):Z.nothing}</p>${e.description?Z.html`<p class="description">${e.description}</p>`:Z.nothing} ${e.result?Z.html`<details><summary>Effects</summary><div class="result-body">${e.result}</div></details>`:Z.nothing}</div>`}renderEmpty(){return Z.html`<div class="roxy-empty" role="status">No yoga data</div>`}renderData(e){let r=this.filter.toLowerCase();if("description"in e&&typeof e.description=="string"){let t=e;return Z.html`<div class="wrap">${this.renderDetailCard(t)}</div>`}if("yogas"in e&&Array.isArray(e.yogas)){let t=e.yogas;if(t.length>0&&"description"in t[0]){let c=t,p=r?c.filter(x=>x.name.toLowerCase().includes(r)):c,y=e.total;return Z.html`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${y!==void 0?Z.html`<span class="count">${y} total</span>`:Z.nothing}</div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter yoga list by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="detail-grid" role="region" aria-live="polite" aria-label="Yoga results">${p.length>0?p.map(x=>this.renderDetailCard(x)):Z.html`<p class="no-results">No yogas match your search.</p>`}</div></div>`}let o=t,i=r?o.filter(c=>c.name.toLowerCase().includes(r)):o,l=e.total;return Z.html`<div class="wrap"><div class="head"><h2 class="title">Yoga catalog</h2>${l!==void 0?Z.html`<span class="count">${l} total</span>`:Z.nothing}</div><div class="search-wrap"><input class="search" type="search" placeholder="Filter yogas..." aria-label="Filter yoga list by name" .value="${this.filter}" @input="${this.handleInput}"></div><div class="grid" role="region" aria-live="polite" aria-label="Yoga results">${i.length>0?i.map(c=>Z.html`<div class="yoga-chip">${c.name} <span class="yoga-id">${c.id}</span></div>`):Z.html`<p class="no-results">No yogas match your search.</p>`}</div></div>`}return Z.html`<div class="roxy-empty" role="status">No yoga data</div>`}};lr.styles=[g,Z.css`.wrap{gap:var(--roxy-space-md,1rem);display:grid}.head{justify-content:space-between;align-items:baseline;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;display:flex}.title{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);margin:0}.count{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a)}.search-wrap{align-items:center;gap:var(--roxy-space-sm,.5rem);display:flex}.search{width:100%;max-width:280px;font-size:var(--roxy-text-sm,.875rem);font-family:var(--roxy-font-sans);border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);outline:none;padding:.35em .75em}.search::placeholder{color:var(--roxy-fg,#0a0a0a);opacity:.65}.search:focus{border-color:var(--roxy-accent,#f59e0b);box-shadow:0 0 0 2px color-mix(in srgb, var(--roxy-accent,#f59e0b) 30%, transparent)}.grid{gap:var(--roxy-space-sm,.5rem);grid-template-columns:repeat(auto-fill,minmax(180px,1fr));display:grid}.yoga-chip{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);font-size:var(--roxy-text-sm,.875rem);background:var(--roxy-surface,#fff);color:var(--roxy-fg,#0a0a0a);word-break:break-word;padding:.4em .8em}.yoga-chip .yoga-id{color:var(--roxy-fg,#0a0a0a);opacity:.75;margin-top:.15em;font-size:.7em;display:block}.detail-card{border:1px solid var(--roxy-border,#e4e4e7);border-radius:var(--roxy-radius-md,8px);padding:var(--roxy-space-md,1rem);background:var(--roxy-surface,#fff);gap:var(--roxy-space-sm,.5rem);display:grid}.detail-name{font-size:var(--roxy-text-lg,1.125rem);font-weight:var(--roxy-weight-bold,600);align-items:center;gap:var(--roxy-space-sm,.5rem);flex-wrap:wrap;margin:0;display:flex}.quality-chip{font-size:var(--roxy-text-xs,.75rem);border-radius:999px;padding:.15em .6em;font-weight:600;display:inline-block}.quality-Positive{background:color-mix(in srgb, var(--roxy-success,#22c55e) 18%, transparent);color:var(--roxy-success-fg,#15803d);border:1px solid color-mix(in srgb, var(--roxy-success,#22c55e) 40%, transparent)}.quality-Negative{background:color-mix(in srgb, var(--roxy-danger,#ef4444) 18%, transparent);color:var(--roxy-danger-fg,#b91c1c);border:1px solid color-mix(in srgb, var(--roxy-danger,#ef4444) 40%, transparent)}.quality-Both{background:color-mix(in srgb, var(--roxy-warning,#f59e0b) 18%, transparent);color:var(--roxy-warning-fg,#b45309);border:1px solid color-mix(in srgb, var(--roxy-warning,#f59e0b) 40%, transparent)}.description{font-size:var(--roxy-text-sm,.875rem);color:var(--roxy-muted,#71717a);line-height:var(--roxy-leading-normal,1.5);margin:0}details{font-size:var(--roxy-text-sm,.875rem)}details summary{cursor:pointer;color:var(--roxy-accent-ink,#b45309);align-items:center;gap:.4em;padding:.25em 0;font-weight:500;list-style:none;display:flex}details summary:before{content:"+";font-size:1.1em;line-height:1}details[open] summary:before{content:"-"}details .result-body{padding-top:var(--roxy-space-xs,.25rem);color:var(--roxy-fg,#0a0a0a);line-height:var(--roxy-leading-normal,1.5)}.no-results{color:var(--roxy-muted,#71717a);font-size:var(--roxy-text-sm,.875rem);padding:var(--roxy-space-md,1rem) 0;text-align:center}.detail-grid{gap:var(--roxy-space-sm,.5rem);display:grid}`],d([(0,Aa.state)()],lr.prototype,"filter",2),lr=d([(0,Aa.customElement)("roxy-yoga-list")],lr);var Na=[{pascal:"RoxyNatalChart",tag:"roxy-natal-chart",slug:"natal-chart",heading:"Natal chart",description:"Western natal chart wheel for /astrology/natal-chart responses",docsLabel:"Western",endpointLabel:"POST /astrology/natal-chart",docsSummary:"Natal chart wheel with planet glyphs and aspect lines",topic:"Astrology"},{pascal:"RoxySynastryChart",tag:"roxy-synastry-chart",slug:"synastry-chart",heading:"Synastry",description:"Dual-wheel synastry chart with inter-aspects table",docsLabel:"Western",endpointLabel:"POST /astrology/synastry",docsSummary:"Dual-wheel synastry with inter-aspects table",topic:"Astrology"},{pascal:"RoxyWesternPlanetsTable",tag:"roxy-western-planets-table",slug:"western-planets-table",heading:"Western planets",description:"Western planetary positions table with sign, degree, house, and motion plus the chart angles",docsLabel:"Western",endpointLabel:"POST /astrology/natal-chart",docsSummary:"Sign, degree, house, motion columns plus ASC, MC, PoF, Vertex",topic:"Astrology"},{pascal:"RoxyTransitsTable",tag:"roxy-transits-table",slug:"transits-table",heading:"Transits",description:"Live planet positions plus aspects to a natal chart",docsLabel:"Western",endpointLabel:"POST /astrology/transits",docsSummary:"Transit planet positions plus optional aspects to a natal chart",topic:"Astrology"},{pascal:"RoxyAspectsTable",tag:"roxy-aspects-table",slug:"aspects-table",heading:"Aspects",description:"Natal and transit aspect grid with chart-pattern detection (grand trines, t-squares, stelliums, yods)",docsLabel:"Western",endpointLabel:"POST /astrology/aspects, /astrology/transit-aspects, /astrology/aspect-patterns",docsSummary:"Aspect rows coloured by nature with orb and strength, plus detected chart patterns",topic:"Astrology"},{pascal:"RoxyMoonPhase",tag:"roxy-moon-phase",slug:"moon-phase",heading:"Moon phase",description:"Moon phase card and calendar",docsLabel:"Western",endpointLabel:"GET /astrology/moon-phase/{current,upcoming,calendar/...}",docsSummary:"Moon phase card and calendar",topic:"Astrology"},{pascal:"RoxyHoroscopeCard",tag:"roxy-horoscope-card",slug:"horoscope-card",heading:"Daily horoscope",description:"Daily, weekly, or monthly horoscope card for /astrology/horoscope/...",docsLabel:"Western",endpointLabel:"GET /astrology/horoscope/{sign}/{daily,weekly,monthly}",docsSummary:"Daily, weekly, or monthly horoscope card",topic:"Astrology"},{pascal:"RoxyCompatibilityCard",tag:"roxy-compatibility-card",slug:"compatibility-card",heading:"Compatibility score",description:"Cross-domain compatibility score card",docsLabel:"Cross",endpointLabel:"POST /astrology/compatibility-score, /numerology/compatibility, /biorhythm/compatibility",docsSummary:"Score card with category breakdown",topic:"Astrology"},{pascal:"RoxyVedicKundli",tag:"roxy-vedic-kundli",slug:"vedic-kundli",heading:"Vedic kundli",description:"South, North, or East Indian Vedic kundli for /vedic-astrology/birth-chart with per-planet degree and nakshatra detail, plus an optional Chandra Lagna (Moon-as-ascendant) reference view",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/birth-chart",docsSummary:"South, North, or East Indian kundli with degree detail and optional Chandra Lagna view",topic:"Vedic"},{pascal:"RoxyDivisionalChart",tag:"roxy-divisional-chart",slug:"divisional-chart",heading:"Divisional chart",description:"D2 to D60 varga chart wheel with Vargottama markers",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/divisional-chart",docsSummary:"Generic divisional varga wheel from D2 Hora to D60 Shashtiamsa",topic:"Vedic"},{pascal:"RoxyKpChart",tag:"roxy-kp-chart",slug:"kp-chart",heading:"KP chart",description:"Full KP chart with Ascendant, Placidus cusps, and planets in tabbed stellar-hierarchy tables",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/chart",docsSummary:"Ascendant, cusps, and planets with KP stellar hierarchy",topic:"Vedic"},{pascal:"RoxyVedicPlanetsTable",tag:"roxy-vedic-planets-table",slug:"vedic-planets-table",heading:"Vedic planets",description:"Vedic planetary positions table with degree, nakshatra, pada, nakshatra lord, bhava, and avastha",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/birth-chart",docsSummary:"Degree, nakshatra, pada, lord, bhava, avastha columns",topic:"Vedic"},{pascal:"RoxyKpPlanetsTable",tag:"roxy-kp-planets-table",slug:"kp-planets-table",heading:"KP planets",description:"KP planets table with sub-lord and sub-sub-lord columns",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/planets",docsSummary:"Sub-lord and sub-sub-lord columns",topic:"Vedic"},{pascal:"RoxyKpRulingPlanets",tag:"roxy-kp-ruling-planets",slug:"kp-ruling-planets",heading:"KP ruling planets",description:"KP ruling planets with day lord, Moon and Lagna stellar hierarchies, and house significators",docsLabel:"Vedic (KP)",endpointLabel:"POST /vedic-astrology/kp/ruling-planets",docsSummary:"Day lord, Moon/Lagna hierarchies, ruling planets, significators",topic:"Vedic"},{pascal:"RoxyAshtakavargaGrid",tag:"roxy-ashtakavarga-grid",slug:"ashtakavarga-grid",heading:"Ashtakavarga",description:"Sarva and Bhinna ashtakavarga heatmap with bindu scores",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/ashtakavarga",docsSummary:"Sarva, Bhinna, and Shodhya Pinda views in a tabbed heatmap",topic:"Vedic"},{pascal:"RoxyShadbalaTable",tag:"roxy-shadbala-table",slug:"shadbala-table",heading:"Shadbala",description:"Six-fold planetary strength with adequacy badge per planet",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/shadbala",docsSummary:"Six-fold planetary strength bar plus rupas and adequacy badge",topic:"Vedic"},{pascal:"RoxyDashaTimeline",tag:"roxy-dasha-timeline",slug:"dasha-timeline",heading:"Vimshottari dasha",description:"Vimshottari dasha timeline with active mahadasha highlighted",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/dasha/{current,major,sub/...}",docsSummary:"Vimshottari mahadasha + antardasha + pratyantardasha",topic:"Vedic"},{pascal:"RoxyGunaMilan",tag:"roxy-guna-milan",slug:"guna-milan",heading:"Guna milan",description:"36-point Ashtakoota matrimonial compatibility breakdown",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/compatibility",docsSummary:"36-point Ashtakoota with eight sub-scores",topic:"Vedic"},{pascal:"RoxyPanchangTable",tag:"roxy-panchang-table",slug:"panchang-table",heading:"Panchang",description:"Panchang muhurta table with auspicious and inauspicious periods",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/{basic,detailed}",docsSummary:"15+ muhurtas in detailed mode",topic:"Vedic"},{pascal:"RoxyVedicAspects",tag:"roxy-vedic-aspects",slug:"vedic-aspects",heading:"Vedic aspects",description:"Vedic graha drishti table: which planet aspects which, with mutual aspects surfaced first",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/aspects",docsSummary:"Graha drishti rows with aspect type, strength, and orb, plus mutual aspects",topic:"Vedic"},{pascal:"RoxyHoraTable",tag:"roxy-hora-table",slug:"hora-table",heading:"Hora",description:"Vedic Hora (planetary hours) table: 12 day and 12 night horas by ruling planet for electional timing",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/hora",docsSummary:"Day and night planetary hours with ruling planet and window",topic:"Vedic"},{pascal:"RoxyChoghadiyaGrid",tag:"roxy-choghadiya-grid",slug:"choghadiya-grid",heading:"Choghadiya",description:"Day and night Choghadiya muhurta tiles for activity timing",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/panchang/choghadiya",docsSummary:"Day and night Choghadiya muhurta tiles colored by effect",topic:"Vedic"},{pascal:"RoxyYogaList",tag:"roxy-yoga-list",slug:"yoga-list",heading:"Yoga catalog",description:"Yoga reference cards from the catalog with optional detail mode",docsLabel:"Vedic",endpointLabel:"GET /vedic-astrology/yoga, /yoga/{id}",docsSummary:"Filterable yoga cards from the 300 plus yoga catalog",topic:"Vedic"},{pascal:"RoxyNakshatraCard",tag:"roxy-nakshatra-card",slug:"nakshatra-card",heading:"Nakshatra",description:"Nakshatra reference card with lord, deity, symbol, characteristics, and remedies",docsLabel:"Vedic",endpointLabel:"GET /vedic-astrology/nakshatras/{id}",docsSummary:"Lord, deity, symbol, characteristics, remedies",topic:"Vedic"},{pascal:"RoxyDoshaCard",tag:"roxy-dosha-card",slug:"dosha-card",heading:"Manglik dosha",description:"Manglik, Kaal Sarp, or Sade Sati presence card",docsLabel:"Vedic",endpointLabel:"POST /vedic-astrology/dosha/{manglik,kalsarpa,sadhesati}",docsSummary:"Presence, severity, remedies, scoped effects",topic:"Vedic"},{pascal:"RoxyNumerologyCard",tag:"roxy-numerology-card",slug:"numerology-card",heading:"Life path number",description:"Numerology card for life path, expression, soul urge, personality, personal year, or full chart",docsLabel:"Numerology",endpointLabel:"POST /numerology/{life-path,expression,soul-urge,personality,birth-day,maturity,daily,personal-day,personal-month,personal-year,chart}",docsSummary:"Life path, expression, soul urge, personality, personal year, full chart",topic:"Numerology"},{pascal:"RoxyTarotCard",tag:"roxy-tarot-card",slug:"tarot-card",heading:"Daily tarot card",description:"Single tarot card with upright/reversed flip animation",docsLabel:"Tarot",endpointLabel:"GET /tarot/cards/{id}, POST /tarot/daily",docsSummary:"Single card with upright and reversed flip",topic:"Tarot"},{pascal:"RoxyTarotCatalog",tag:"roxy-tarot-catalog",slug:"tarot-catalog",heading:"Tarot deck",description:"Responsive tarot deck gallery with card art, name, and an arcana and suit caption from the tarot catalog response",docsLabel:"Tarot",endpointLabel:"GET /tarot/cards",docsSummary:"Deck gallery tiles with card art, name, and arcana and suit",topic:"Tarot"},{pascal:"RoxyTarotSpread",tag:"roxy-tarot-spread",slug:"tarot-spread",heading:"Three-card spread",description:"Tarot spread renderer for three-card, Celtic Cross, love, or yes/no",docsLabel:"Tarot",endpointLabel:"POST /tarot/spreads/{three-card,celtic-cross,love}, /tarot/yes-no, /tarot/draw",docsSummary:"Spreads with positions and reading",topic:"Tarot"},{pascal:"RoxyBodygraph",tag:"roxy-bodygraph",slug:"bodygraph",heading:"Bodygraph",description:"Human Design bodygraph with nine centers, channels, and activated gates plus a type, authority, and profile summary",docsLabel:"Human Design",endpointLabel:"POST /human-design/bodygraph",docsSummary:"Nine-center chart with defined and open centers, active channels, gates, and a type and authority summary",topic:"Human Design"},{pascal:"RoxyHdConnection",tag:"roxy-hd-connection",slug:"hd-connection",heading:"HD connection",description:"Human Design connection chart: the composite channels two people form, with circuit, dynamic, and which person holds each gate",docsLabel:"Human Design",endpointLabel:"POST /human-design/connection",docsSummary:"Electromagnetic, compromise, and dominance channels between two charts",topic:"Human Design"},{pascal:"RoxyHdPenta",tag:"roxy-hd-penta",slug:"hd-penta",heading:"HD penta",description:"Human Design penta for a 3 to 5 person group: upper and lower triangle channels, defined or open, with core channels and member coverage",docsLabel:"Human Design",endpointLabel:"POST /human-design/penta",docsSummary:"Group penta channels split into upper and lower triangles",topic:"Human Design"},{pascal:"RoxyHdVariables",tag:"roxy-hd-variables",slug:"hd-variables",heading:"HD variables",description:"Human Design variables: the four PHS arrows (determination, environment, perspective, motivation) with left/right direction and color, tone, and base",docsLabel:"Human Design",endpointLabel:"POST /human-design/variables",docsSummary:"The four transformation arrows with direction and PHS labels",topic:"Human Design"},{pascal:"RoxyForecastTimeline",tag:"roxy-forecast-timeline",slug:"forecast-timeline",heading:"Forecast timeline",description:"Cross-domain forecast event strip colored by domain and weighted by significance",docsLabel:"Forecast",endpointLabel:"POST /forecast/timeline",docsSummary:"Date-grouped events across Western, Vedic, and biorhythm domains, weighted by significance",topic:"Forecast"},{pascal:"RoxyForecastDigest",tag:"roxy-forecast-digest",slug:"forecast-digest",heading:"Forecast digest",description:"Rolled-up forecast across the next 24 hours, 7, 30, and 90 days with per-domain breakdown and top events",docsLabel:"Forecast",endpointLabel:"POST /forecast/digest",docsSummary:"Per-window event counts, domain breakdown, and the highest-significance events",topic:"Forecast"},{pascal:"RoxyBiorhythmChart",tag:"roxy-biorhythm-chart",slug:"biorhythm-chart",heading:"Daily biorhythm",description:"Daily biorhythm bars or multi-day forecast cycle lines",docsLabel:"Biorhythm",endpointLabel:"POST /biorhythm/{daily,forecast,critical-days}",docsSummary:"Daily bars, forecast cycle lines, critical days",topic:"Biorhythm"},{pascal:"RoxyHexagram",tag:"roxy-hexagram",slug:"hexagram",heading:"I Ching hexagram",description:"I Ching hexagram with trigram glyphs, judgment, image, and changing lines",docsLabel:"I Ching",endpointLabel:"GET /iching/hexagrams/{number}, /iching/cast, POST /iching/daily, /iching/daily/cast",docsSummary:"Hexagram with trigrams, judgment, image, changing lines",topic:"I Ching"},{pascal:"RoxyCrystalCard",tag:"roxy-crystal-card",slug:"crystal-card",heading:"Crystal detail",description:"Single-crystal detail card with photo, spiritual, emotional, and physical meaning, metaphysical attributes, affirmation, and pairings",docsLabel:"Crystals",endpointLabel:"GET /crystals/{id}",docsSummary:"Photo, meaning sections, chakra, zodiac, element, hardness, keywords, and pairings",topic:"Crystals"},{pascal:"RoxyCrystalGrid",tag:"roxy-crystal-grid",slug:"crystal-grid",heading:"Crystal grid",description:"Responsive crystal gallery with photo, name, and colour swatches from any crystals list response",docsLabel:"Crystals",endpointLabel:"GET /crystals, /crystals/chakra/{chakra}, /crystals/element/{element}, /crystals/zodiac/{sign}, /crystals/birthstone/{month}, /crystals/search",docsSummary:"Crystal gallery tiles with photo, name, and colour swatches",topic:"Crystals"},{pascal:"RoxyDreamCard",tag:"roxy-dream-card",slug:"dream-card",heading:"Dream symbol",description:"Dream symbol card with the symbol name, full interpretation, and dictionary letter",docsLabel:"Dreams",endpointLabel:"GET /dreams/symbols/{id}",docsSummary:"Symbol name, interpretation body, and letter chip",topic:"Dreams"},{pascal:"RoxyDreamSearch",tag:"roxy-dream-search",slug:"dream-search",heading:"Dream search",description:"Dream-symbol search results as selectable tiles; emits roxy-symbol-select to pair with roxy-dream-card",docsLabel:"Dreams",endpointLabel:"GET /dreams/symbols",docsSummary:"Matched dream symbols as selectable tiles with a letter chip",topic:"Dreams"},{pascal:"RoxyAngelNumberCard",tag:"roxy-angel-number-card",slug:"angel-number-card",heading:"Angel number",description:"Angel number card with title, core message, badges, keywords, life-area interpretations, affirmation, and action steps",docsLabel:"Angel Numbers",endpointLabel:"GET /angel-numbers/numbers/{number}",docsSummary:"Number meaning with spiritual, love, career, money, twin flame, biblical, and shadow sections",topic:"Angel Numbers"},{pascal:"RoxyAngelNumberLookup",tag:"roxy-angel-number-lookup",slug:"angel-number-lookup",heading:"Angel number lookup",description:"Angel number sequence analysis with pattern classification, the known meaning when present, and a digit-root fallback for any number",docsLabel:"Angel Numbers",endpointLabel:"GET /angel-numbers/lookup",docsSummary:"Pattern analysis plus known meaning and digit-root fallback",topic:"Angel Numbers"},{pascal:"RoxyReferenceCard",tag:"roxy-reference-card",slug:"reference-card",heading:"Reference card",description:"Glossary entry for any reference lookup: zodiac sign, planet meaning, rashi, I Ching trigram, Human Design gate or center, numerology number or compound number",docsLabel:"Reference",endpointLabel:"GET /astrology/{signs,planet-meanings}/{id}, /vedic-astrology/rashis/{id}, /iching/trigrams/{id}, /human-design/{gates,centers}/{id}, /numerology/{meanings,compound-number}/{number}",docsSummary:"Symbol, name, description, keyword chips, and an attribute grid for any glossary lookup",topic:"Helpers"},{pascal:"RoxyEndpointForm",tag:"roxy-endpoint-form",slug:"endpoint-form",heading:"Schema-driven form",description:"Schema-driven form that emits roxy-submit with a validated payload",docsLabel:"Helper",endpointLabel:"Any endpoint, from the spec",docsSummary:"Schema-driven form, emits roxy-submit",topic:"Helpers",selfFetching:!0},{pascal:"RoxyLocationSearch",tag:"roxy-location-search",slug:"location-search",heading:"City search",description:"City search input with debounced /location/search calls",docsLabel:"Helper",endpointLabel:"GET /location/search",docsSummary:"Debounced city search input, emits roxy-location-select",topic:"Helpers",selfFetching:!0},{pascal:"RoxyData",tag:"roxy-data",slug:"data",heading:"Generic renderer",description:"Generic fallback renderer for any OpenAPI response shape",docsLabel:"Helper",endpointLabel:"Any response shape",docsSummary:"Generic fallback renderer for unknown shapes",topic:"Helpers",selfFetching:!0}];var Ut="0.11.0";var io=Na.map(n=>n.slug);
|
|
92
92
|
//# sourceMappingURL=index.cjs.map
|