@roxyapi/ui 0.1.2 → 0.1.3
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/README.md +321 -14
- package/THEMING.md +24 -7
- package/dist/cdn/components/biorhythm-chart.js +15 -22
- package/dist/cdn/components/biorhythm-chart.js.map +3 -3
- package/dist/cdn/components/compatibility-card.js +36 -34
- package/dist/cdn/components/compatibility-card.js.map +4 -4
- package/dist/cdn/components/dasha-timeline.js +35 -39
- package/dist/cdn/components/dasha-timeline.js.map +4 -4
- package/dist/cdn/components/data.js +6 -6
- package/dist/cdn/components/data.js.map +3 -3
- package/dist/cdn/components/dosha-card.js +13 -13
- package/dist/cdn/components/dosha-card.js.map +2 -2
- package/dist/cdn/components/endpoint-form.js +47 -28
- package/dist/cdn/components/endpoint-form.js.map +3 -3
- package/dist/cdn/components/guna-milan.js +18 -18
- package/dist/cdn/components/guna-milan.js.map +4 -4
- package/dist/cdn/components/hexagram.js +26 -26
- package/dist/cdn/components/hexagram.js.map +3 -3
- package/dist/cdn/components/horoscope-card.js +38 -38
- package/dist/cdn/components/horoscope-card.js.map +3 -3
- package/dist/cdn/components/kp-planets-table.js +10 -10
- package/dist/cdn/components/kp-planets-table.js.map +4 -4
- package/dist/cdn/components/location-search.js +6 -6
- package/dist/cdn/components/location-search.js.map +3 -3
- package/dist/cdn/components/moon-phase.js +21 -21
- package/dist/cdn/components/moon-phase.js.map +4 -4
- package/dist/cdn/components/natal-chart.js +61 -19
- package/dist/cdn/components/natal-chart.js.map +4 -4
- package/dist/cdn/components/numerology-card.js +40 -31
- package/dist/cdn/components/numerology-card.js.map +3 -3
- package/dist/cdn/components/panchang-table.js +25 -25
- package/dist/cdn/components/panchang-table.js.map +4 -4
- package/dist/cdn/components/synastry-chart.js +129 -39
- package/dist/cdn/components/synastry-chart.js.map +4 -4
- package/dist/cdn/components/tarot-card.js +49 -20
- package/dist/cdn/components/tarot-card.js.map +3 -3
- package/dist/cdn/components/tarot-spread.js +43 -27
- package/dist/cdn/components/tarot-spread.js.map +3 -3
- package/dist/cdn/components/vedic-kundli.js +23 -9
- package/dist/cdn/components/vedic-kundli.js.map +3 -3
- package/dist/cdn/roxy-ui.js +560 -350
- package/dist/cdn/roxy-ui.js.map +4 -4
- package/dist/components/biorhythm-chart.d.ts +2 -46
- package/dist/components/biorhythm-chart.d.ts.map +1 -1
- package/dist/components/biorhythm-chart.js +24 -23
- package/dist/components/biorhythm-chart.js.map +2 -2
- package/dist/components/compatibility-card.d.ts +2 -27
- package/dist/components/compatibility-card.d.ts.map +1 -1
- package/dist/components/compatibility-card.js +50 -29
- package/dist/components/compatibility-card.js.map +3 -3
- package/dist/components/dasha-timeline.d.ts +2 -31
- package/dist/components/dasha-timeline.d.ts.map +1 -1
- package/dist/components/dasha-timeline.js +32 -30
- package/dist/components/dasha-timeline.js.map +3 -3
- package/dist/components/data.d.ts +6 -0
- package/dist/components/data.d.ts.map +1 -1
- package/dist/components/data.js +9 -1
- package/dist/components/data.js.map +2 -2
- package/dist/components/dosha-card.d.ts +2 -16
- package/dist/components/dosha-card.d.ts.map +1 -1
- package/dist/components/dosha-card.js +12 -13
- package/dist/components/dosha-card.js.map +2 -2
- package/dist/components/endpoint-form.d.ts +2 -0
- package/dist/components/endpoint-form.d.ts.map +1 -1
- package/dist/components/endpoint-form.js +66 -8
- package/dist/components/endpoint-form.js.map +2 -2
- package/dist/components/guna-milan.d.ts +2 -20
- package/dist/components/guna-milan.d.ts.map +1 -1
- package/dist/components/guna-milan.js +22 -12
- package/dist/components/guna-milan.js.map +3 -3
- package/dist/components/hexagram.d.ts +3 -27
- package/dist/components/hexagram.d.ts.map +1 -1
- package/dist/components/hexagram.js +31 -15
- package/dist/components/hexagram.js.map +2 -2
- package/dist/components/horoscope-card.d.ts +2 -20
- package/dist/components/horoscope-card.d.ts.map +1 -1
- package/dist/components/horoscope-card.js +24 -15
- package/dist/components/horoscope-card.js.map +2 -2
- package/dist/components/kp-planets-table.d.ts +2 -21
- package/dist/components/kp-planets-table.d.ts.map +1 -1
- package/dist/components/kp-planets-table.js +10 -4
- package/dist/components/kp-planets-table.js.map +3 -3
- package/dist/components/location-search.d.ts +3 -11
- package/dist/components/location-search.d.ts.map +1 -1
- package/dist/components/location-search.js +45 -5
- package/dist/components/location-search.js.map +2 -2
- package/dist/components/moon-phase.d.ts +4 -21
- package/dist/components/moon-phase.d.ts.map +1 -1
- package/dist/components/moon-phase.js +17 -4
- package/dist/components/moon-phase.js.map +3 -3
- package/dist/components/natal-chart.d.ts +7 -43
- package/dist/components/natal-chart.d.ts.map +1 -1
- package/dist/components/natal-chart.js +130 -70
- package/dist/components/natal-chart.js.map +3 -3
- package/dist/components/numerology-card.d.ts +5 -37
- package/dist/components/numerology-card.d.ts.map +1 -1
- package/dist/components/numerology-card.js +54 -28
- package/dist/components/numerology-card.js.map +2 -2
- package/dist/components/panchang-table.d.ts +3 -62
- package/dist/components/panchang-table.d.ts.map +1 -1
- package/dist/components/panchang-table.js +62 -32
- package/dist/components/panchang-table.js.map +3 -3
- package/dist/components/synastry-chart.d.ts +9 -28
- package/dist/components/synastry-chart.d.ts.map +1 -1
- package/dist/components/synastry-chart.js +178 -38
- package/dist/components/synastry-chart.js.map +3 -3
- package/dist/components/tarot-card.d.ts +5 -29
- package/dist/components/tarot-card.d.ts.map +1 -1
- package/dist/components/tarot-card.js +59 -20
- package/dist/components/tarot-card.js.map +2 -2
- package/dist/components/tarot-spread.d.ts +2 -24
- package/dist/components/tarot-spread.d.ts.map +1 -1
- package/dist/components/tarot-spread.js +39 -13
- package/dist/components/tarot-spread.js.map +2 -2
- package/dist/components/vedic-kundli.d.ts +3 -23
- package/dist/components/vedic-kundli.d.ts.map +1 -1
- package/dist/components/vedic-kundli.js +25 -13
- package/dist/components/vedic-kundli.js.map +2 -2
- package/dist/index.cjs +1149 -358
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +6 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1149 -358
- package/dist/index.js.map +4 -4
- package/dist/manifest.d.ts +49 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.json +1 -1
- package/dist/styles/tokens.css +47 -1
- package/dist/tokens/index.d.ts.map +1 -1
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/types.gen.d.ts +27811 -0
- package/dist/types/types.gen.d.ts.map +1 -0
- package/dist/utils/debounce.d.ts +9 -1
- package/dist/utils/debounce.d.ts.map +1 -1
- package/dist/utils/format.d.ts +15 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/package.json +7 -1
- package/src/components/biorhythm-chart.ts +39 -84
- package/src/components/compatibility-card.ts +85 -52
- package/src/components/dasha-timeline.ts +55 -73
- package/src/components/data.ts +20 -1
- package/src/components/dosha-card.ts +18 -31
- package/src/components/endpoint-form.ts +79 -11
- package/src/components/guna-milan.ts +16 -34
- package/src/components/hexagram.ts +53 -43
- package/src/components/horoscope-card.ts +51 -39
- package/src/components/kp-planets-table.ts +8 -27
- package/src/components/location-search.ts +45 -20
- package/src/components/moon-phase.ts +28 -25
- package/src/components/natal-chart.ts +129 -84
- package/src/components/numerology-card.ts +87 -79
- package/src/components/panchang-table.ts +40 -78
- package/src/components/synastry-chart.ts +220 -78
- package/src/components/tarot-card.ts +76 -62
- package/src/components/tarot-spread.ts +72 -45
- package/src/components/vedic-kundli.ts +42 -51
- package/src/index.ts +14 -24
- package/src/manifest.ts +366 -0
- package/src/styles/tokens.css +47 -1
- package/src/tokens/index.ts +5 -0
- package/src/types/types.gen.ts +1 -1
- package/src/utils/debounce.ts +23 -4
- package/src/utils/format.ts +57 -0
- package/src/version.ts +2 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/components/tarot-card.ts", "../../src/utils/base-styles.ts"],
|
|
4
|
-
"sourcesContent": ["import { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { baseStyles } from '../utils/base-styles.js';\n\ninterface TarotCard {\n\tid?: string;\n\tname?: string;\n\tarcana?: 'major' | 'minor' | string;\n\tnumber?: number | string;\n\tposition?: string;\n\treversed?: boolean;\n\tkeywords?: string[];\n\tmeaning?:\n\t\t| string\n\t\t| {\n\t\t\t\tupright?: string;\n\t\t\t\treversed?: string;\n\t\t\t\tspiritual?: string;\n\t\t\t\temotional?: string;\n\t\t\t\tphysical?: string;\n\t\t };\n\timageUrl?: string;\n\tupright?: { meaning?: string; keywords?: string[] };\n}\n\ninterface TarotData {\n\tdate?: string;\n\tseed?: string;\n\tcard?: TarotCard;\n\tdailyMessage?: string;\n}\n\n/**\n * Tarot card. Renders /tarot/cards/{id} or /tarot/daily. Click to flip\n * between upright and reversed where the data shape supports it.\n */\n@customElement('roxy-tarot-card')\nexport class RoxyTarotCard extends LitElement {\n\tstatic styles = [\n\t\tbaseStyles,\n\t\tcss`\n\t\t\t.card {\n\t\t\t\tbackground: var(--roxy-bg, #fff);\n\t\t\t\tborder: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t\tpadding: var(--roxy-space-lg, 1.5rem);\n\t\t\t\tbox-shadow: var(--roxy-shadow-sm);\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: minmax(0, 9rem) 1fr;\n\t\t\t\tgap: var(--roxy-space-lg, 1.5rem);\n\t\t\t\talign-items: start;\n\t\t\t}\n\n\t\t\t@container (max-width: 480px) {\n\t\t\t\t.card {\n\t\t\t\t\tgrid-template-columns: 1fr;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.image-wrap {\n\t\t\t\tperspective: 800px;\n\t\t\t}\n\t\t\t.image {\n\t\t\t\tdisplay: block;\n\t\t\t\twidth: 100%;\n\t\t\t\theight: auto;\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-border, #e4e4e7) 60%, transparent);\n\t\t\t\ttransition:\n\t\t\t\t\ttransform var(--roxy-motion-duration, 200ms)\n\t\t\t\t\tvar(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1));\n\t\t\t\tcursor: pointer;\n\t\t\t}\n\t\t\t.image.reversed {\n\t\t\t\ttransform: rotate(180deg);\n\t\t\t}\n\t\t\t.image:focus-visible {\n\t\t\t\toutline: 2px solid var(--roxy-ring, rgba(245, 158, 11, 0.4));\n\t\t\t\toutline-offset: 2px;\n\t\t\t}\n\n\t\t\t.title {\n\t\t\t\tmargin: 0;\n\t\t\t\tfont-size: var(--roxy-text-xl, 1.5rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tletter-spacing: var(--roxy-tracking-tight);\n\t\t\t}\n\t\t\t.meta {\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tletter-spacing: 0.06em;\n\t\t\t\tmargin-bottom: var(--roxy-space-sm, 0.5rem);\n\t\t\t}\n\t\t\t.position {\n\t\t\t\tcolor: var(--roxy-info, #0284c7);\n\t\t\t\tmargin-left: var(--roxy-space-xs, 0.25rem);\n\t\t\t\ttext-transform: capitalize;\n\t\t\t}\n\n\t\t\t.message {\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t\tmargin: var(--roxy-space-sm, 0.5rem) 0 var(--roxy-space-md, 1rem);\n\t\t\t}\n\n\t\t\t.chips {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-wrap: wrap;\n\t\t\t\tgap: var(--roxy-space-xs, 0.25rem);\n\t\t\t\tmargin-top: var(--roxy-space-sm, 0.5rem);\n\t\t\t}\n\t\t\t.chips span {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-accent, #f59e0b) 14%, transparent);\n\t\t\t\tpadding: 2px 8px;\n\t\t\t\tborder-radius: var(--roxy-radius-full, 9999px);\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t}\n\n\t\t\t.flip {\n\t\t\t\tmargin-top: var(--roxy-space-sm, 0.5rem);\n\t\t\t\tbackground: transparent;\n\t\t\t\tborder: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t\tpadding: 4px 12px;\n\t\t\t\tfont-family: inherit;\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tcolor: var(--roxy-secondary, #475569);\n\t\t\t\tcursor: pointer;\n\t\t\t\ttransition:\n\t\t\t\t\ttransform var(--roxy-motion-duration, 200ms)\n\t\t\t\t\tvar(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1));\n\t\t\t}\n\t\t\t.flip:hover {\n\t\t\t\ttransform: scale(1.02);\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\tdata: TarotData | TarotCard | null = null;\n\n\t@state()\n\tprivate flipped = false;\n\n\tprivate getCard(): TarotCard | null {\n\t\tif (!this.data) return null;\n\t\tif ('card' in this.data && this.data.card) return this.data.card;\n\t\treturn this.data as TarotCard;\n\t}\n\n\tprivate toggleFlip = () => {\n\t\tthis.flipped = !this.flipped;\n\t};\n\n\trender() {\n\t\tconst card = this.getCard();\n\t\tif (!card)\n\t\t\treturn html`<div class=\"roxy-empty\" role=\"status\">No tarot data</div>`;\n\n\t\tconst isReversed = this.flipped !== Boolean(card.reversed); // start at server-provided orientation, toggle on click\n\t\tconst meaning =\n\t\t\ttypeof card.meaning === 'string'\n\t\t\t\t? card.meaning\n\t\t\t\t: ((isReversed ? card.meaning?.reversed : card.meaning?.upright) ??\n\t\t\t\t\tcard.meaning?.spiritual ??\n\t\t\t\t\tcard.upright?.meaning);\n\t\tconst dailyMessage =\n\t\t\tthis.data && 'dailyMessage' in this.data\n\t\t\t\t? this.data.dailyMessage\n\t\t\t\t: undefined;\n\n\t\treturn html`<article class=\"card\" aria-label=${card.name ?? 'Tarot card'}>\n\t\t\t<div class=\"image-wrap\">\n\t\t\t\t${\n\t\t\t\t\tcard.imageUrl\n\t\t\t\t\t\t? html`<img\n\t\t\t\t\t\t\tclass=${`image ${isReversed ? 'reversed' : ''}`}\n\t\t\t\t\t\t\tsrc=${card.imageUrl}\n\t\t\t\t\t\t\talt=${card.name ?? 'Tarot card'}\n\t\t\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t\t\t\t@click=${this.toggleFlip}\n\t\t\t\t\t\t\t@keydown=${(e: KeyboardEvent) => {\n\t\t\t\t\t\t\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\tthis.toggleFlip();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>`\n\t\t\t\t\t\t: html`<div\n\t\t\t\t\t\t\tclass=${`image ${isReversed ? 'reversed' : ''}`}\n\t\t\t\t\t\t\tstyle=\"aspect-ratio: 0.6; display: flex; align-items: center; justify-content: center; color: var(--roxy-muted)\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t${card.name ?? '?'}\n\t\t\t\t\t\t</div>`\n\t\t\t\t}\n\t\t\t</div>\n\t\t\t<div>\n\t\t\t\t<div class=\"meta\">\n\t\t\t\t\t${card.arcana ? html`${card.arcana} arcana` : nothing}\n\t\t\t\t\t${card.number !== undefined && card.number !== null ? html` \u00B7 ${card.number}` : nothing}\n\t\t\t\t\t${isReversed ? html` \u00B7 reversed` : nothing}\n\t\t\t\t\t${\n\t\t\t\t\t\tcard.position\n\t\t\t\t\t\t\t? html`<span class=\"position\">${card.position}</span>`\n\t\t\t\t\t\t\t: nothing\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t\t<h2 class=\"title\">${card.name ?? 'Tarot card'}</h2>\n\t\t\t\t${dailyMessage ? html`<p class=\"message\">${dailyMessage}</p>` : nothing}\n\t\t\t\t${meaning ? html`<p>${meaning}</p>` : nothing}\n\t\t\t\t${\n\t\t\t\t\tcard.keywords?.length\n\t\t\t\t\t\t? html`<div class=\"chips\">\n\t\t\t\t\t\t\t${card.keywords.map((k) => html`<span>${k}</span>`)}\n\t\t\t\t\t\t</div>`\n\t\t\t\t\t\t: nothing\n\t\t\t\t}\n\t\t\t\t<button\n\t\t\t\t\tclass=\"flip\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t@click=${this.toggleFlip}\n\t\t\t\t\taria-pressed=${this.flipped ? 'true' : 'false'}\n\t\t\t\t>\n\t\t\t\t\tFlip card\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</article>`;\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'roxy-tarot-card': RoxyTarotCard;\n\t}\n}\n", "import { css } from 'lit';\n\n/**\n * Shared host styles every component pulls in. Sets default font, color,\n * container query support, and the entry fade-in.\n */\nexport const baseStyles = css`\n\t:host {\n\t\tdisplay: block;\n\t\tcontainer-type: inline-size;\n\t\tfont-family: var(\n\t\t\t--roxy-font-sans,\n\t\t\tsystem-ui,\n\t\t\t-apple-system,\n\t\t\tBlinkMacSystemFont,\n\t\t\t'Segoe UI',\n\t\t\tRoboto,\n\t\t\tsans-serif\n\t\t);\n\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\tbackground: transparent;\n\t\tfont-size: var(--roxy-text-base, 1rem);\n\t\tline-height: var(--roxy-leading-normal, 1.5);\n\t\tanimation: roxy-fade-in var(--roxy-motion-duration, 200ms)\n\t\t\tvar(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1)) both;\n\t}\n\n\t*,\n\t*::before,\n\t*::after {\n\t\tbox-sizing: border-box;\n\t}\n\n\t@keyframes roxy-fade-in {\n\t\tfrom {\n\t\t\topacity: 0;\n\t\t\ttransform: translateY(2px);\n\t\t}\n\t\tto {\n\t\t\topacity: 1;\n\t\t\ttransform: translateY(0);\n\t\t}\n\t}\n\n\t@media (prefers-reduced-motion: reduce) {\n\t\t:host {\n\t\t\tanimation: none;\n\t\t}\n\t}\n\n\t.roxy-skeleton {\n\t\tbackground: linear-gradient(\n\t\t\t90deg,\n\t\t\tvar(--roxy-border, #e4e4e7) 0%,\n\t\t\tcolor-mix(in srgb, var(--roxy-border, #e4e4e7) 60%, transparent) 50%,\n\t\t\tvar(--roxy-border, #e4e4e7) 100%\n\t\t);\n\t\tbackground-size: 200% 100%;\n\t\tanimation: roxy-shimmer 1.4s ease-in-out infinite;\n\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t}\n\n\t@keyframes roxy-shimmer {\n\t\t0% {\n\t\t\tbackground-position: 200% 0;\n\t\t}\n\t\t100% {\n\t\t\tbackground-position: -200% 0;\n\t\t}\n\t}\n\n\t@media (prefers-reduced-motion: reduce) {\n\t\t.roxy-skeleton {\n\t\t\tanimation: none;\n\t\t}\n\t}\n\n\t.roxy-empty {\n\t\tpadding: var(--roxy-space-lg, 1.5rem);\n\t\tcolor: var(--roxy-muted, #71717a);\n\t\ttext-align: center;\n\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t}\n\n\t:host(:focus-within) .roxy-card {\n\t\toutline: 2px solid var(--roxy-ring, rgba(245, 158, 11, 0.4));\n\t\toutline-offset: 2px;\n\t}\n`;\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;AAAA,SAAS,OAAAA,MAAK,MAAM,YAAY,eAAe;AAC/C,SAAS,eAAe,UAAU,aAAa;;;ACD/C,SAAS,WAAW;AAMb,IAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;
|
|
4
|
+
"sourcesContent": ["import { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport type { GetCardResponse, GetDailyCardResponse } from '../types/index.js';\nimport { baseStyles } from '../utils/base-styles.js';\n\ntype TarotData = GetCardResponse | GetDailyCardResponse;\n\n/**\n * Tarot card. Renders /tarot/cards/{id} or /tarot/daily. Click to flip\n * between upright and reversed where the data shape supports it.\n */\n@customElement('roxy-tarot-card')\nexport class RoxyTarotCard extends LitElement {\n\tstatic styles = [\n\t\tbaseStyles,\n\t\tcss`\n\t\t\t.card {\n\t\t\t\tbackground: var(--roxy-bg, #fff);\n\t\t\t\tborder: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t\tpadding: var(--roxy-space-lg, 1.5rem);\n\t\t\t\tbox-shadow: var(--roxy-shadow-sm);\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: minmax(0, 9rem) 1fr;\n\t\t\t\tgap: var(--roxy-space-lg, 1.5rem);\n\t\t\t\talign-items: start;\n\t\t\t}\n\n\t\t\t@container (max-width: 480px) {\n\t\t\t\t.card {\n\t\t\t\t\tgrid-template-columns: 1fr;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.image-wrap {\n\t\t\t\tperspective: 800px;\n\t\t\t}\n\t\t\t.image {\n\t\t\t\tdisplay: block;\n\t\t\t\twidth: 100%;\n\t\t\t\theight: auto;\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-border, #e4e4e7) 60%, transparent);\n\t\t\t\ttransition:\n\t\t\t\t\ttransform var(--roxy-motion-duration, 200ms)\n\t\t\t\t\tvar(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1));\n\t\t\t\tcursor: pointer;\n\t\t\t}\n\t\t\t.image.reversed {\n\t\t\t\ttransform: rotate(180deg);\n\t\t\t}\n\t\t\t.image:focus-visible {\n\t\t\t\toutline: 2px solid var(--roxy-ring, rgba(245, 158, 11, 0.4));\n\t\t\t\toutline-offset: 2px;\n\t\t\t}\n\n\t\t\t.title {\n\t\t\t\tmargin: 0;\n\t\t\t\tfont-size: var(--roxy-text-xl, 1.5rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tletter-spacing: var(--roxy-tracking-tight);\n\t\t\t}\n\t\t\t.meta {\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tletter-spacing: 0.06em;\n\t\t\t\tmargin-bottom: var(--roxy-space-sm, 0.5rem);\n\t\t\t}\n\n\t\t\t.message {\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t\tmargin: var(--roxy-space-sm, 0.5rem) 0 var(--roxy-space-md, 1rem);\n\t\t\t}\n\n\t\t\t.chips {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-wrap: wrap;\n\t\t\t\tgap: var(--roxy-space-xs, 0.25rem);\n\t\t\t\tmargin-top: var(--roxy-space-sm, 0.5rem);\n\t\t\t}\n\t\t\t.chips span {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-accent, #f59e0b) 14%, transparent);\n\t\t\t\tpadding: 2px 8px;\n\t\t\t\tborder-radius: var(--roxy-radius-full, 9999px);\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t}\n\n\t\t\t.flip {\n\t\t\t\tmargin-top: var(--roxy-space-sm, 0.5rem);\n\t\t\t\tbackground: transparent;\n\t\t\t\tborder: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t\tpadding: 4px 12px;\n\t\t\t\tfont-family: inherit;\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tcolor: var(--roxy-secondary, #475569);\n\t\t\t\tcursor: pointer;\n\t\t\t\ttransition:\n\t\t\t\t\ttransform var(--roxy-motion-duration, 200ms)\n\t\t\t\t\tvar(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1));\n\t\t\t}\n\t\t\t.flip:hover {\n\t\t\t\ttransform: scale(1.02);\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\tdata: TarotData | null = null;\n\n\t@state()\n\tprivate flipped = false;\n\n\tprivate toggleFlip = () => {\n\t\tthis.flipped = !this.flipped;\n\t};\n\n\trender() {\n\t\tconst d = this.data;\n\t\tif (!d)\n\t\t\treturn html`<div class=\"roxy-empty\" role=\"status\">No tarot data</div>`;\n\n\t\tif ('card' in d) return this.renderDailyCard(d);\n\t\treturn this.renderFullCard(d);\n\t}\n\n\tprivate renderDailyCard(d: GetDailyCardResponse) {\n\t\tconst card = d.card;\n\t\tconst isReversed = this.flipped !== Boolean(card.reversed);\n\t\tconst keywords = card.keywords ?? [];\n\n\t\treturn html`<article class=\"card\" aria-label=${card.name ?? 'Tarot card'}>\n\t\t\t<div class=\"image-wrap\">\n\t\t\t\t${\n\t\t\t\t\tcard.imageUrl\n\t\t\t\t\t\t? html`<img\n\t\t\t\t\t\t\tclass=${`image ${isReversed ? 'reversed' : ''}`}\n\t\t\t\t\t\t\tsrc=${card.imageUrl}\n\t\t\t\t\t\t\talt=${card.name ?? 'Tarot card'}\n\t\t\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t\t\t\t@click=${this.toggleFlip}\n\t\t\t\t\t\t\t@keydown=${(e: KeyboardEvent) => {\n\t\t\t\t\t\t\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\tthis.toggleFlip();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>`\n\t\t\t\t\t\t: html`<div\n\t\t\t\t\t\t\tclass=${`image ${isReversed ? 'reversed' : ''}`}\n\t\t\t\t\t\t\tstyle=\"aspect-ratio: 0.6; display: flex; align-items: center; justify-content: center; color: var(--roxy-muted)\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t${card.name ?? '?'}\n\t\t\t\t\t\t</div>`\n\t\t\t\t}\n\t\t\t</div>\n\t\t\t<div>\n\t\t\t\t<div class=\"meta\">\n\t\t\t\t\t${card.arcana ? html`${card.arcana} arcana` : nothing}\n\t\t\t\t\t${isReversed ? html` \u00B7 reversed` : nothing}\n\t\t\t\t</div>\n\t\t\t\t<h2 class=\"title\">${card.name ?? 'Tarot card'}</h2>\n\t\t\t\t${d.dailyMessage ? html`<p class=\"message\">${d.dailyMessage}</p>` : nothing}\n\t\t\t\t${card.meaning ? html`<p>${card.meaning}</p>` : nothing}\n\t\t\t\t${\n\t\t\t\t\tkeywords.length > 0\n\t\t\t\t\t\t? html`<div class=\"chips\">\n\t\t\t\t\t\t\t${keywords.map((k) => html`<span>${k}</span>`)}\n\t\t\t\t\t\t</div>`\n\t\t\t\t\t\t: nothing\n\t\t\t\t}\n\t\t\t\t<button\n\t\t\t\t\tclass=\"flip\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t@click=${this.toggleFlip}\n\t\t\t\t\taria-pressed=${this.flipped ? 'true' : 'false'}\n\t\t\t\t>\n\t\t\t\t\tFlip card\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</article>`;\n\t}\n\n\tprivate renderFullCard(d: GetCardResponse) {\n\t\tconst isReversed = this.flipped;\n\t\tconst orientedMeaning = isReversed ? d.reversed : d.upright;\n\t\tconst keywords = isReversed\n\t\t\t? (d.keywords?.reversed ?? [])\n\t\t\t: (d.keywords?.upright ?? []);\n\n\t\treturn html`<article class=\"card\" aria-label=${d.name ?? 'Tarot card'}>\n\t\t\t<div class=\"image-wrap\">\n\t\t\t\t${\n\t\t\t\t\td.imageUrl\n\t\t\t\t\t\t? html`<img\n\t\t\t\t\t\t\tclass=${`image ${isReversed ? 'reversed' : ''}`}\n\t\t\t\t\t\t\tsrc=${d.imageUrl}\n\t\t\t\t\t\t\talt=${d.name ?? 'Tarot card'}\n\t\t\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t\t\t\t@click=${this.toggleFlip}\n\t\t\t\t\t\t\t@keydown=${(e: KeyboardEvent) => {\n\t\t\t\t\t\t\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\tthis.toggleFlip();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>`\n\t\t\t\t\t\t: html`<div\n\t\t\t\t\t\t\tclass=${`image ${isReversed ? 'reversed' : ''}`}\n\t\t\t\t\t\t\tstyle=\"aspect-ratio: 0.6; display: flex; align-items: center; justify-content: center; color: var(--roxy-muted)\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t${d.name ?? '?'}\n\t\t\t\t\t\t</div>`\n\t\t\t\t}\n\t\t\t</div>\n\t\t\t<div>\n\t\t\t\t<div class=\"meta\">\n\t\t\t\t\t${d.arcana ? html`${d.arcana} arcana` : nothing}\n\t\t\t\t\t${d.number !== undefined && d.number !== null ? html` \u00B7 ${d.number}` : nothing}\n\t\t\t\t\t${isReversed ? html` \u00B7 reversed` : nothing}\n\t\t\t\t</div>\n\t\t\t\t<h2 class=\"title\">${d.name ?? 'Tarot card'}</h2>\n\t\t\t\t${orientedMeaning?.description ? html`<p>${orientedMeaning.description}</p>` : nothing}\n\t\t\t\t${\n\t\t\t\t\tkeywords.length > 0\n\t\t\t\t\t\t? html`<div class=\"chips\">\n\t\t\t\t\t\t\t${keywords.map((k) => html`<span>${k}</span>`)}\n\t\t\t\t\t\t</div>`\n\t\t\t\t\t\t: nothing\n\t\t\t\t}\n\t\t\t\t<button\n\t\t\t\t\tclass=\"flip\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t@click=${this.toggleFlip}\n\t\t\t\t\taria-pressed=${this.flipped ? 'true' : 'false'}\n\t\t\t\t>\n\t\t\t\t\tFlip card\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</article>`;\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'roxy-tarot-card': RoxyTarotCard;\n\t}\n}\n", "import { css } from 'lit';\n\n/**\n * Shared host styles every component pulls in. Sets default font, color,\n * container query support, and the entry fade-in.\n */\nexport const baseStyles = css`\n\t:host {\n\t\tdisplay: block;\n\t\tcontainer-type: inline-size;\n\t\tfont-family: var(\n\t\t\t--roxy-font-sans,\n\t\t\tsystem-ui,\n\t\t\t-apple-system,\n\t\t\tBlinkMacSystemFont,\n\t\t\t'Segoe UI',\n\t\t\tRoboto,\n\t\t\tsans-serif\n\t\t);\n\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\tbackground: transparent;\n\t\tfont-size: var(--roxy-text-base, 1rem);\n\t\tline-height: var(--roxy-leading-normal, 1.5);\n\t\tanimation: roxy-fade-in var(--roxy-motion-duration, 200ms)\n\t\t\tvar(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1)) both;\n\t}\n\n\t*,\n\t*::before,\n\t*::after {\n\t\tbox-sizing: border-box;\n\t}\n\n\t@keyframes roxy-fade-in {\n\t\tfrom {\n\t\t\topacity: 0;\n\t\t\ttransform: translateY(2px);\n\t\t}\n\t\tto {\n\t\t\topacity: 1;\n\t\t\ttransform: translateY(0);\n\t\t}\n\t}\n\n\t@media (prefers-reduced-motion: reduce) {\n\t\t:host {\n\t\t\tanimation: none;\n\t\t}\n\t}\n\n\t.roxy-skeleton {\n\t\tbackground: linear-gradient(\n\t\t\t90deg,\n\t\t\tvar(--roxy-border, #e4e4e7) 0%,\n\t\t\tcolor-mix(in srgb, var(--roxy-border, #e4e4e7) 60%, transparent) 50%,\n\t\t\tvar(--roxy-border, #e4e4e7) 100%\n\t\t);\n\t\tbackground-size: 200% 100%;\n\t\tanimation: roxy-shimmer 1.4s ease-in-out infinite;\n\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t}\n\n\t@keyframes roxy-shimmer {\n\t\t0% {\n\t\t\tbackground-position: 200% 0;\n\t\t}\n\t\t100% {\n\t\t\tbackground-position: -200% 0;\n\t\t}\n\t}\n\n\t@media (prefers-reduced-motion: reduce) {\n\t\t.roxy-skeleton {\n\t\t\tanimation: none;\n\t\t}\n\t}\n\n\t.roxy-empty {\n\t\tpadding: var(--roxy-space-lg, 1.5rem);\n\t\tcolor: var(--roxy-muted, #71717a);\n\t\ttext-align: center;\n\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t}\n\n\t:host(:focus-within) .roxy-card {\n\t\toutline: 2px solid var(--roxy-ring, rgba(245, 158, 11, 0.4));\n\t\toutline-offset: 2px;\n\t}\n`;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["css", "css"]
|
|
7
7
|
}
|
|
@@ -1,28 +1,6 @@
|
|
|
1
1
|
import { LitElement } from 'lit';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
label?: string;
|
|
5
|
-
name?: string;
|
|
6
|
-
position?: string;
|
|
7
|
-
card?: {
|
|
8
|
-
name?: string;
|
|
9
|
-
imageUrl?: string;
|
|
10
|
-
reversed?: boolean;
|
|
11
|
-
keywords?: string[];
|
|
12
|
-
arcana?: string;
|
|
13
|
-
};
|
|
14
|
-
interpretation?: string;
|
|
15
|
-
}
|
|
16
|
-
interface TarotSpreadData {
|
|
17
|
-
spread?: string;
|
|
18
|
-
positions?: TarotPosition[];
|
|
19
|
-
cards?: TarotPosition[];
|
|
20
|
-
reading?: string;
|
|
21
|
-
question?: string;
|
|
22
|
-
answer?: 'Yes' | 'No' | 'Maybe' | string;
|
|
23
|
-
strength?: string;
|
|
24
|
-
interpretation?: string;
|
|
25
|
-
}
|
|
2
|
+
import type { CastCelticCrossResponse, CastLoveSpreadResponse, CastReadingResponse, CastThreeCardResponse, CastYesNoResponse, DrawCardsResponse } from '../types/index.js';
|
|
3
|
+
type TarotSpreadData = CastThreeCardResponse | CastCelticCrossResponse | CastLoveSpreadResponse | CastYesNoResponse | CastReadingResponse | DrawCardsResponse;
|
|
26
4
|
/**
|
|
27
5
|
* Tarot spread card. Renders /tarot/spreads/{three-card,celtic-cross,love},
|
|
28
6
|
* /tarot/yes-no, /tarot/draw responses.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tarot-spread.d.ts","sourceRoot":"","sources":["../../src/components/tarot-spread.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,UAAU,EAAW,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"tarot-spread.d.ts","sourceRoot":"","sources":["../../src/components/tarot-spread.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,UAAU,EAAW,MAAM,KAAK,CAAC;AAErD,OAAO,KAAK,EACX,uBAAuB,EACvB,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EACjB,MAAM,mBAAmB,CAAC;AAG3B,KAAK,eAAe,GACjB,qBAAqB,GACrB,uBAAuB,GACvB,sBAAsB,GACtB,iBAAiB,GACjB,mBAAmB,GACnB,iBAAiB,CAAC;AAErB;;;GAGG;AACH,qBACa,eAAgB,SAAQ,UAAU;IAC9C,MAAM,CAAC,MAAM,4BA6GX;IAGF,IAAI,EAAE,eAAe,GAAG,IAAI,CAAQ;IAGpC,MAAM,EAAE,YAAY,GAAG,cAAc,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CACpD;IAEd,MAAM;CAoGN;AAED,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,qBAAqB;QAC9B,mBAAmB,EAAE,eAAe,CAAC;KACrC;CACD"}
|
|
@@ -110,22 +110,30 @@ var RoxyTarotSpread = class extends LitElement {
|
|
|
110
110
|
const d = this.data;
|
|
111
111
|
if (!d)
|
|
112
112
|
return html`<div class="roxy-empty" role="status">No tarot spread</div>`;
|
|
113
|
-
const
|
|
114
|
-
const
|
|
115
|
-
const
|
|
113
|
+
const isYesNo = "answer" in d;
|
|
114
|
+
const isDrawn = "cards" in d && !("spread" in d);
|
|
115
|
+
const positions = isDrawn ? [] : "positions" in d ? d.positions ?? [] : [];
|
|
116
|
+
const cards = isDrawn && "cards" in d ? d.cards : [];
|
|
117
|
+
const answer = isYesNo ? d.answer : void 0;
|
|
118
|
+
const strength = isYesNo ? d.strength : void 0;
|
|
119
|
+
const spreadLabel = "spread" in d ? d.spread : this.spread.replace(/-/g, " ");
|
|
120
|
+
const question = "question" in d ? d.question : void 0;
|
|
121
|
+
const summary = "summary" in d ? d.summary : void 0;
|
|
122
|
+
const yesNoInterp = isYesNo ? d.interpretation : void 0;
|
|
123
|
+
const answerClass = answer ? answer.toLowerCase().replace(/[^a-z]/g, "") : "";
|
|
116
124
|
return html`<article class="wrap" aria-label="Tarot spread">
|
|
117
125
|
<header class="head">
|
|
118
|
-
<h2 class="title">${
|
|
119
|
-
${
|
|
126
|
+
<h2 class="title">${spreadLabel}</h2>
|
|
127
|
+
${question ? html`<span class="question">"${question}"</span>` : nothing}
|
|
120
128
|
</header>
|
|
121
129
|
${isYesNo ? html`<div>
|
|
122
|
-
<span class=${`answer ${answerClass}`}>${
|
|
123
|
-
${
|
|
130
|
+
<span class=${`answer ${answerClass}`}>${answer}</span>
|
|
131
|
+
${strength ? html`<small> · ${strength}</small>` : nothing}
|
|
124
132
|
</div>` : nothing}
|
|
125
133
|
${positions.length > 0 ? html`<div class="grid">
|
|
126
134
|
${positions.map(
|
|
127
135
|
(p) => html`<div class="card">
|
|
128
|
-
<p class="label">${p.
|
|
136
|
+
<p class="label">${p.name ?? ""}</p>
|
|
129
137
|
<div class="image">
|
|
130
138
|
${p.card?.imageUrl ? html`<img
|
|
131
139
|
src=${p.card.imageUrl}
|
|
@@ -141,8 +149,26 @@ var RoxyTarotSpread = class extends LitElement {
|
|
|
141
149
|
</div>`
|
|
142
150
|
)}
|
|
143
151
|
</div>` : nothing}
|
|
144
|
-
${
|
|
145
|
-
|
|
152
|
+
${cards.length > 0 ? html`<div class="grid">
|
|
153
|
+
${cards.map(
|
|
154
|
+
(c) => html`<div class="card">
|
|
155
|
+
<div class="image">
|
|
156
|
+
${c.imageUrl ? html`<img
|
|
157
|
+
src=${c.imageUrl}
|
|
158
|
+
alt=${c.name ?? "tarot card"}
|
|
159
|
+
class=${c.reversed ? "reversed" : ""}
|
|
160
|
+
/>` : html`${c.name ?? "?"}`}
|
|
161
|
+
</div>
|
|
162
|
+
<p class="name">
|
|
163
|
+
${c.name ?? ""}
|
|
164
|
+
${c.reversed ? html`<small>(reversed)</small>` : nothing}
|
|
165
|
+
</p>
|
|
166
|
+
${c.meaning ? html`<p class="interp">${c.meaning}</p>` : nothing}
|
|
167
|
+
</div>`
|
|
168
|
+
)}
|
|
169
|
+
</div>` : nothing}
|
|
170
|
+
${summary ? html`<p class="reading">${summary}</p>` : nothing}
|
|
171
|
+
${yesNoInterp ? html`<p class="reading">${yesNoInterp}</p>` : nothing}
|
|
146
172
|
</article>`;
|
|
147
173
|
}
|
|
148
174
|
};
|
|
@@ -184,15 +210,15 @@ RoxyTarotSpread.styles = [
|
|
|
184
210
|
}
|
|
185
211
|
.answer.yes {
|
|
186
212
|
background: color-mix(in srgb, var(--roxy-success, #16a34a) 16%, transparent);
|
|
187
|
-
color: var(--roxy-success, #
|
|
213
|
+
color: var(--roxy-success-fg, #166534);
|
|
188
214
|
}
|
|
189
215
|
.answer.no {
|
|
190
216
|
background: color-mix(in srgb, var(--roxy-danger, #dc2626) 16%, transparent);
|
|
191
|
-
color: var(--roxy-danger, #
|
|
217
|
+
color: var(--roxy-danger-fg, #991b1b);
|
|
192
218
|
}
|
|
193
219
|
.answer.maybe {
|
|
194
220
|
background: color-mix(in srgb, var(--roxy-warning, #ea580c) 16%, transparent);
|
|
195
|
-
color: var(--roxy-warning, #
|
|
221
|
+
color: var(--roxy-warning-fg, #9a3412);
|
|
196
222
|
}
|
|
197
223
|
|
|
198
224
|
.grid {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/components/tarot-spread.ts", "../../src/utils/base-styles.ts"],
|
|
4
|
-
"sourcesContent": ["import { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { baseStyles } from '../utils/base-styles.js';\n\ninterface TarotPosition {\n\tnumber?: number;\n\tlabel?: string;\n\tname?: string;\n\tposition?: string;\n\tcard?: {\n\t\tname?: string;\n\t\timageUrl?: string;\n\t\treversed?: boolean;\n\t\tkeywords?: string[];\n\t\tarcana?: string;\n\t};\n\tinterpretation?: string;\n}\n\ninterface TarotSpreadData {\n\tspread?: string;\n\tpositions?: TarotPosition[];\n\tcards?: TarotPosition[];\n\treading?: string;\n\tquestion?: string;\n\tanswer?: 'Yes' | 'No' | 'Maybe' | string;\n\tstrength?: string;\n\tinterpretation?: string;\n}\n\n/**\n * Tarot spread card. Renders /tarot/spreads/{three-card,celtic-cross,love},\n * /tarot/yes-no, /tarot/draw responses.\n */\n@customElement('roxy-tarot-spread')\nexport class RoxyTarotSpread extends LitElement {\n\tstatic styles = [\n\t\tbaseStyles,\n\t\tcss`\n\t\t\t.wrap {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\n\t\t\t.head {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t\tflex-wrap: wrap;\n\t\t\t\talign-items: baseline;\n\t\t\t}\n\t\t\t.title {\n\t\t\t\tmargin: 0;\n\t\t\t\tfont-size: var(--roxy-text-lg, 1.125rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\ttext-transform: capitalize;\n\t\t\t}\n\t\t\t.question {\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tfont-style: italic;\n\t\t\t}\n\n\t\t\t.answer {\n\t\t\t\tdisplay: inline-block;\n\t\t\t\tpadding: 4px 14px;\n\t\t\t\tborder-radius: var(--roxy-radius-full, 9999px);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tfont-size: var(--roxy-text-base, 1rem);\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tletter-spacing: 0.06em;\n\t\t\t}\n\t\t\t.answer.yes {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-success, #16a34a) 16%, transparent);\n\t\t\t\tcolor: var(--roxy-success, #16a34a);\n\t\t\t}\n\t\t\t.answer.no {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-danger, #dc2626) 16%, transparent);\n\t\t\t\tcolor: var(--roxy-danger, #dc2626);\n\t\t\t}\n\t\t\t.answer.maybe {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-warning, #ea580c) 16%, transparent);\n\t\t\t\tcolor: var(--roxy-warning, #ea580c);\n\t\t\t}\n\n\t\t\t.grid {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: repeat(auto-fit, minmax(8rem, 1fr));\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\n\t\t\t.card {\n\t\t\t\tborder: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t\tpadding: var(--roxy-space-sm, 0.5rem);\n\t\t\t\tbackground: var(--roxy-bg, #fff);\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: var(--roxy-space-xs, 0.25rem);\n\t\t\t}\n\t\t\t.label {\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tletter-spacing: 0.06em;\n\t\t\t\tmargin: 0;\n\t\t\t}\n\t\t\t.image {\n\t\t\t\twidth: 100%;\n\t\t\t\taspect-ratio: 0.6;\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-border, #e4e4e7) 60%, transparent);\n\t\t\t\tborder-radius: var(--roxy-radius-sm, 4px);\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\toverflow: hidden;\n\t\t\t}\n\t\t\t.image img {\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 100%;\n\t\t\t\tobject-fit: cover;\n\t\t\t\ttransition:\n\t\t\t\t\ttransform var(--roxy-motion-duration, 200ms)\n\t\t\t\t\tvar(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1));\n\t\t\t}\n\t\t\t.image img.reversed {\n\t\t\t\ttransform: rotate(180deg);\n\t\t\t}\n\t\t\t.name {\n\t\t\t\tmargin: 0;\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t}\n\t\t\t.interp {\n\t\t\t\tmargin: 0;\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tcolor: var(--roxy-secondary, #475569);\n\t\t\t}\n\n\t\t\t.reading {\n\t\t\t\tmargin: 0;\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\tdata: TarotSpreadData | null = null;\n\n\t@property({ type: String, reflect: true })\n\tspread: 'three-card' | 'celtic-cross' | 'love' | 'yes-no' | 'draw' =\n\t\t'three-card';\n\n\trender() {\n\t\tconst d = this.data;\n\t\tif (!d)\n\t\t\treturn html`<div class=\"roxy-empty\" role=\"status\">No tarot spread</div>`;\n\n\t\tconst positions = d.positions ?? d.cards ?? [];\n\t\tconst isYesNo = !!d.answer;\n\t\tconst answerClass = isYesNo\n\t\t\t? (d.answer ?? '').toLowerCase().replace(/[^a-z]/g, '')\n\t\t\t: '';\n\n\t\treturn html`<article class=\"wrap\" aria-label=\"Tarot spread\">\n\t\t\t<header class=\"head\">\n\t\t\t\t<h2 class=\"title\">${d.spread ?? this.spread.replace(/-/g, ' ')}</h2>\n\t\t\t\t${d.question ? html`<span class=\"question\">\"${d.question}\"</span>` : nothing}\n\t\t\t</header>\n\t\t\t${\n\t\t\t\tisYesNo\n\t\t\t\t\t? html`<div>\n\t\t\t\t\t\t<span class=${`answer ${answerClass}`}>${d.answer}</span>\n\t\t\t\t\t\t${d.strength ? html`<small> \u00B7 ${d.strength}</small>` : nothing}\n\t\t\t\t\t</div>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t\t${\n\t\t\t\tpositions.length > 0\n\t\t\t\t\t? html`<div class=\"grid\">\n\t\t\t\t\t\t${positions.map(\n\t\t\t\t\t\t\t(p) => html`<div class=\"card\">\n\t\t\t\t\t\t\t\t<p class=\"label\">${p.label ?? p.name ?? p.position ?? ''}</p>\n\t\t\t\t\t\t\t\t<div class=\"image\">\n\t\t\t\t\t\t\t\t\t${\n\t\t\t\t\t\t\t\t\t\tp.card?.imageUrl\n\t\t\t\t\t\t\t\t\t\t\t? html`<img\n\t\t\t\t\t\t\t\t\t\t\t\tsrc=${p.card.imageUrl}\n\t\t\t\t\t\t\t\t\t\t\t\talt=${p.card.name ?? 'tarot card'}\n\t\t\t\t\t\t\t\t\t\t\t\tclass=${p.card.reversed ? 'reversed' : ''}\n\t\t\t\t\t\t\t\t\t\t\t/>`\n\t\t\t\t\t\t\t\t\t\t\t: html`${p.card?.name ?? '?'}`\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<p class=\"name\">\n\t\t\t\t\t\t\t\t\t${p.card?.name ?? ''}\n\t\t\t\t\t\t\t\t\t${p.card?.reversed ? html`<small>(reversed)</small>` : nothing}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t${\n\t\t\t\t\t\t\t\t\tp.interpretation\n\t\t\t\t\t\t\t\t\t\t? html`<p class=\"interp\">${p.interpretation}</p>`\n\t\t\t\t\t\t\t\t\t\t: nothing\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</div>`,\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t\t${d.reading ? html`<p class=\"reading\">${d.reading}</p>` : nothing}\n\t\t\t${\n\t\t\t\td.interpretation && !d.reading\n\t\t\t\t\t? html`<p class=\"reading\">${d.interpretation}</p>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t</article>`;\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'roxy-tarot-spread': RoxyTarotSpread;\n\t}\n}\n", "import { css } from 'lit';\n\n/**\n * Shared host styles every component pulls in. Sets default font, color,\n * container query support, and the entry fade-in.\n */\nexport const baseStyles = css`\n\t:host {\n\t\tdisplay: block;\n\t\tcontainer-type: inline-size;\n\t\tfont-family: var(\n\t\t\t--roxy-font-sans,\n\t\t\tsystem-ui,\n\t\t\t-apple-system,\n\t\t\tBlinkMacSystemFont,\n\t\t\t'Segoe UI',\n\t\t\tRoboto,\n\t\t\tsans-serif\n\t\t);\n\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\tbackground: transparent;\n\t\tfont-size: var(--roxy-text-base, 1rem);\n\t\tline-height: var(--roxy-leading-normal, 1.5);\n\t\tanimation: roxy-fade-in var(--roxy-motion-duration, 200ms)\n\t\t\tvar(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1)) both;\n\t}\n\n\t*,\n\t*::before,\n\t*::after {\n\t\tbox-sizing: border-box;\n\t}\n\n\t@keyframes roxy-fade-in {\n\t\tfrom {\n\t\t\topacity: 0;\n\t\t\ttransform: translateY(2px);\n\t\t}\n\t\tto {\n\t\t\topacity: 1;\n\t\t\ttransform: translateY(0);\n\t\t}\n\t}\n\n\t@media (prefers-reduced-motion: reduce) {\n\t\t:host {\n\t\t\tanimation: none;\n\t\t}\n\t}\n\n\t.roxy-skeleton {\n\t\tbackground: linear-gradient(\n\t\t\t90deg,\n\t\t\tvar(--roxy-border, #e4e4e7) 0%,\n\t\t\tcolor-mix(in srgb, var(--roxy-border, #e4e4e7) 60%, transparent) 50%,\n\t\t\tvar(--roxy-border, #e4e4e7) 100%\n\t\t);\n\t\tbackground-size: 200% 100%;\n\t\tanimation: roxy-shimmer 1.4s ease-in-out infinite;\n\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t}\n\n\t@keyframes roxy-shimmer {\n\t\t0% {\n\t\t\tbackground-position: 200% 0;\n\t\t}\n\t\t100% {\n\t\t\tbackground-position: -200% 0;\n\t\t}\n\t}\n\n\t@media (prefers-reduced-motion: reduce) {\n\t\t.roxy-skeleton {\n\t\t\tanimation: none;\n\t\t}\n\t}\n\n\t.roxy-empty {\n\t\tpadding: var(--roxy-space-lg, 1.5rem);\n\t\tcolor: var(--roxy-muted, #71717a);\n\t\ttext-align: center;\n\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t}\n\n\t:host(:focus-within) .roxy-card {\n\t\toutline: 2px solid var(--roxy-ring, rgba(245, 158, 11, 0.4));\n\t\toutline-offset: 2px;\n\t}\n`;\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;AAAA,SAAS,OAAAA,MAAK,MAAM,YAAY,eAAe;AAC/C,SAAS,eAAe,gBAAgB;;;ACDxC,SAAS,WAAW;AAMb,IAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;
|
|
4
|
+
"sourcesContent": ["import { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type {\n\tCastCelticCrossResponse,\n\tCastLoveSpreadResponse,\n\tCastReadingResponse,\n\tCastThreeCardResponse,\n\tCastYesNoResponse,\n\tDrawCardsResponse,\n} from '../types/index.js';\nimport { baseStyles } from '../utils/base-styles.js';\n\ntype TarotSpreadData =\n\t| CastThreeCardResponse\n\t| CastCelticCrossResponse\n\t| CastLoveSpreadResponse\n\t| CastYesNoResponse\n\t| CastReadingResponse\n\t| DrawCardsResponse;\n\n/**\n * Tarot spread card. Renders /tarot/spreads/{three-card,celtic-cross,love},\n * /tarot/yes-no, /tarot/draw responses.\n */\n@customElement('roxy-tarot-spread')\nexport class RoxyTarotSpread extends LitElement {\n\tstatic styles = [\n\t\tbaseStyles,\n\t\tcss`\n\t\t\t.wrap {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\n\t\t\t.head {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t\tflex-wrap: wrap;\n\t\t\t\talign-items: baseline;\n\t\t\t}\n\t\t\t.title {\n\t\t\t\tmargin: 0;\n\t\t\t\tfont-size: var(--roxy-text-lg, 1.125rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\ttext-transform: capitalize;\n\t\t\t}\n\t\t\t.question {\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tfont-style: italic;\n\t\t\t}\n\n\t\t\t.answer {\n\t\t\t\tdisplay: inline-block;\n\t\t\t\tpadding: 4px 14px;\n\t\t\t\tborder-radius: var(--roxy-radius-full, 9999px);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tfont-size: var(--roxy-text-base, 1rem);\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tletter-spacing: 0.06em;\n\t\t\t}\n\t\t\t.answer.yes {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-success, #16a34a) 16%, transparent);\n\t\t\t\tcolor: var(--roxy-success-fg, #166534);\n\t\t\t}\n\t\t\t.answer.no {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-danger, #dc2626) 16%, transparent);\n\t\t\t\tcolor: var(--roxy-danger-fg, #991b1b);\n\t\t\t}\n\t\t\t.answer.maybe {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-warning, #ea580c) 16%, transparent);\n\t\t\t\tcolor: var(--roxy-warning-fg, #9a3412);\n\t\t\t}\n\n\t\t\t.grid {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: repeat(auto-fit, minmax(8rem, 1fr));\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\n\t\t\t.card {\n\t\t\t\tborder: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t\tpadding: var(--roxy-space-sm, 0.5rem);\n\t\t\t\tbackground: var(--roxy-bg, #fff);\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: var(--roxy-space-xs, 0.25rem);\n\t\t\t}\n\t\t\t.label {\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tletter-spacing: 0.06em;\n\t\t\t\tmargin: 0;\n\t\t\t}\n\t\t\t.image {\n\t\t\t\twidth: 100%;\n\t\t\t\taspect-ratio: 0.6;\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-border, #e4e4e7) 60%, transparent);\n\t\t\t\tborder-radius: var(--roxy-radius-sm, 4px);\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\toverflow: hidden;\n\t\t\t}\n\t\t\t.image img {\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 100%;\n\t\t\t\tobject-fit: cover;\n\t\t\t\ttransition:\n\t\t\t\t\ttransform var(--roxy-motion-duration, 200ms)\n\t\t\t\t\tvar(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1));\n\t\t\t}\n\t\t\t.image img.reversed {\n\t\t\t\ttransform: rotate(180deg);\n\t\t\t}\n\t\t\t.name {\n\t\t\t\tmargin: 0;\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t}\n\t\t\t.interp {\n\t\t\t\tmargin: 0;\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tcolor: var(--roxy-secondary, #475569);\n\t\t\t}\n\n\t\t\t.reading {\n\t\t\t\tmargin: 0;\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\tdata: TarotSpreadData | null = null;\n\n\t@property({ type: String, reflect: true })\n\tspread: 'three-card' | 'celtic-cross' | 'love' | 'yes-no' | 'draw' =\n\t\t'three-card';\n\n\trender() {\n\t\tconst d = this.data;\n\t\tif (!d)\n\t\t\treturn html`<div class=\"roxy-empty\" role=\"status\">No tarot spread</div>`;\n\n\t\tconst isYesNo = 'answer' in d;\n\t\tconst isDrawn = 'cards' in d && !('spread' in d);\n\t\tconst positions = isDrawn\n\t\t\t? []\n\t\t\t: 'positions' in d\n\t\t\t\t? (d.positions ?? [])\n\t\t\t\t: [];\n\t\tconst cards = isDrawn && 'cards' in d ? (d as DrawCardsResponse).cards : [];\n\t\tconst answer = isYesNo ? (d as CastYesNoResponse).answer : undefined;\n\t\tconst strength = isYesNo ? (d as CastYesNoResponse).strength : undefined;\n\t\tconst spreadLabel =\n\t\t\t'spread' in d\n\t\t\t\t? (d as CastThreeCardResponse).spread\n\t\t\t\t: this.spread.replace(/-/g, ' ');\n\t\tconst question =\n\t\t\t'question' in d ? (d as CastThreeCardResponse).question : undefined;\n\t\tconst summary =\n\t\t\t'summary' in d ? (d as CastThreeCardResponse).summary : undefined;\n\t\tconst yesNoInterp = isYesNo\n\t\t\t? (d as CastYesNoResponse).interpretation\n\t\t\t: undefined;\n\t\tconst answerClass = answer\n\t\t\t? answer.toLowerCase().replace(/[^a-z]/g, '')\n\t\t\t: '';\n\n\t\treturn html`<article class=\"wrap\" aria-label=\"Tarot spread\">\n\t\t\t<header class=\"head\">\n\t\t\t\t<h2 class=\"title\">${spreadLabel}</h2>\n\t\t\t\t${question ? html`<span class=\"question\">\"${question}\"</span>` : nothing}\n\t\t\t</header>\n\t\t\t${\n\t\t\t\tisYesNo\n\t\t\t\t\t? html`<div>\n\t\t\t\t\t\t<span class=${`answer ${answerClass}`}>${answer}</span>\n\t\t\t\t\t\t${strength ? html`<small> \u00B7 ${strength}</small>` : nothing}\n\t\t\t\t\t</div>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t\t${\n\t\t\t\tpositions.length > 0\n\t\t\t\t\t? html`<div class=\"grid\">\n\t\t\t\t\t\t${positions.map(\n\t\t\t\t\t\t\t(p) => html`<div class=\"card\">\n\t\t\t\t\t\t\t\t<p class=\"label\">${p.name ?? ''}</p>\n\t\t\t\t\t\t\t\t<div class=\"image\">\n\t\t\t\t\t\t\t\t\t${\n\t\t\t\t\t\t\t\t\t\tp.card?.imageUrl\n\t\t\t\t\t\t\t\t\t\t\t? html`<img\n\t\t\t\t\t\t\t\t\t\t\t\tsrc=${p.card.imageUrl}\n\t\t\t\t\t\t\t\t\t\t\t\talt=${p.card.name ?? 'tarot card'}\n\t\t\t\t\t\t\t\t\t\t\t\tclass=${p.card.reversed ? 'reversed' : ''}\n\t\t\t\t\t\t\t\t\t\t\t/>`\n\t\t\t\t\t\t\t\t\t\t\t: html`${p.card?.name ?? '?'}`\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<p class=\"name\">\n\t\t\t\t\t\t\t\t\t${p.card?.name ?? ''}\n\t\t\t\t\t\t\t\t\t${p.card?.reversed ? html`<small>(reversed)</small>` : nothing}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t${p.interpretation ? html`<p class=\"interp\">${p.interpretation}</p>` : nothing}\n\t\t\t\t\t\t\t</div>`,\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t\t${\n\t\t\t\tcards.length > 0\n\t\t\t\t\t? html`<div class=\"grid\">\n\t\t\t\t\t\t${cards.map(\n\t\t\t\t\t\t\t(c) => html`<div class=\"card\">\n\t\t\t\t\t\t\t\t<div class=\"image\">\n\t\t\t\t\t\t\t\t\t${\n\t\t\t\t\t\t\t\t\t\tc.imageUrl\n\t\t\t\t\t\t\t\t\t\t\t? html`<img\n\t\t\t\t\t\t\t\t\t\t\t\tsrc=${c.imageUrl}\n\t\t\t\t\t\t\t\t\t\t\t\talt=${c.name ?? 'tarot card'}\n\t\t\t\t\t\t\t\t\t\t\t\tclass=${c.reversed ? 'reversed' : ''}\n\t\t\t\t\t\t\t\t\t\t\t/>`\n\t\t\t\t\t\t\t\t\t\t\t: html`${c.name ?? '?'}`\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<p class=\"name\">\n\t\t\t\t\t\t\t\t\t${c.name ?? ''}\n\t\t\t\t\t\t\t\t\t${c.reversed ? html`<small>(reversed)</small>` : nothing}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t${c.meaning ? html`<p class=\"interp\">${c.meaning}</p>` : nothing}\n\t\t\t\t\t\t\t</div>`,\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t\t${summary ? html`<p class=\"reading\">${summary}</p>` : nothing}\n\t\t\t${yesNoInterp ? html`<p class=\"reading\">${yesNoInterp}</p>` : nothing}\n\t\t</article>`;\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'roxy-tarot-spread': RoxyTarotSpread;\n\t}\n}\n", "import { css } from 'lit';\n\n/**\n * Shared host styles every component pulls in. Sets default font, color,\n * container query support, and the entry fade-in.\n */\nexport const baseStyles = css`\n\t:host {\n\t\tdisplay: block;\n\t\tcontainer-type: inline-size;\n\t\tfont-family: var(\n\t\t\t--roxy-font-sans,\n\t\t\tsystem-ui,\n\t\t\t-apple-system,\n\t\t\tBlinkMacSystemFont,\n\t\t\t'Segoe UI',\n\t\t\tRoboto,\n\t\t\tsans-serif\n\t\t);\n\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\tbackground: transparent;\n\t\tfont-size: var(--roxy-text-base, 1rem);\n\t\tline-height: var(--roxy-leading-normal, 1.5);\n\t\tanimation: roxy-fade-in var(--roxy-motion-duration, 200ms)\n\t\t\tvar(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1)) both;\n\t}\n\n\t*,\n\t*::before,\n\t*::after {\n\t\tbox-sizing: border-box;\n\t}\n\n\t@keyframes roxy-fade-in {\n\t\tfrom {\n\t\t\topacity: 0;\n\t\t\ttransform: translateY(2px);\n\t\t}\n\t\tto {\n\t\t\topacity: 1;\n\t\t\ttransform: translateY(0);\n\t\t}\n\t}\n\n\t@media (prefers-reduced-motion: reduce) {\n\t\t:host {\n\t\t\tanimation: none;\n\t\t}\n\t}\n\n\t.roxy-skeleton {\n\t\tbackground: linear-gradient(\n\t\t\t90deg,\n\t\t\tvar(--roxy-border, #e4e4e7) 0%,\n\t\t\tcolor-mix(in srgb, var(--roxy-border, #e4e4e7) 60%, transparent) 50%,\n\t\t\tvar(--roxy-border, #e4e4e7) 100%\n\t\t);\n\t\tbackground-size: 200% 100%;\n\t\tanimation: roxy-shimmer 1.4s ease-in-out infinite;\n\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t}\n\n\t@keyframes roxy-shimmer {\n\t\t0% {\n\t\t\tbackground-position: 200% 0;\n\t\t}\n\t\t100% {\n\t\t\tbackground-position: -200% 0;\n\t\t}\n\t}\n\n\t@media (prefers-reduced-motion: reduce) {\n\t\t.roxy-skeleton {\n\t\t\tanimation: none;\n\t\t}\n\t}\n\n\t.roxy-empty {\n\t\tpadding: var(--roxy-space-lg, 1.5rem);\n\t\tcolor: var(--roxy-muted, #71717a);\n\t\ttext-align: center;\n\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t}\n\n\t:host(:focus-within) .roxy-card {\n\t\toutline: 2px solid var(--roxy-ring, rgba(245, 158, 11, 0.4));\n\t\toutline-offset: 2px;\n\t}\n`;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["css", "css"]
|
|
7
7
|
}
|
|
@@ -1,25 +1,5 @@
|
|
|
1
1
|
import { LitElement } from 'lit';
|
|
2
|
-
|
|
3
|
-
[planet: string]: {
|
|
4
|
-
graha?: string;
|
|
5
|
-
rashi?: string;
|
|
6
|
-
longitude?: number;
|
|
7
|
-
nakshatra?: string;
|
|
8
|
-
isRetrograde?: boolean;
|
|
9
|
-
};
|
|
10
|
-
}
|
|
11
|
-
interface KundliData {
|
|
12
|
-
meta?: KundliMeta;
|
|
13
|
-
houses?: Array<{
|
|
14
|
-
house?: number;
|
|
15
|
-
number?: number;
|
|
16
|
-
sign?: string;
|
|
17
|
-
planets?: string[];
|
|
18
|
-
}>;
|
|
19
|
-
combustion?: unknown[];
|
|
20
|
-
planetaryWar?: unknown[];
|
|
21
|
-
[rashi: string]: unknown;
|
|
22
|
-
}
|
|
2
|
+
import type { BirthChartResponse } from '../types/index.js';
|
|
23
3
|
/**
|
|
24
4
|
* Vedic kundli (D1 Rashi chart). South Indian style by default. Pass `data`
|
|
25
5
|
* from /vedic-astrology/birth-chart. North Indian style via style="north".
|
|
@@ -30,10 +10,11 @@ interface KundliData {
|
|
|
30
10
|
*/
|
|
31
11
|
export declare class RoxyVedicKundli extends LitElement {
|
|
32
12
|
static styles: import("lit").CSSResult[];
|
|
33
|
-
data:
|
|
13
|
+
data: BirthChartResponse | null;
|
|
34
14
|
chartStyle: 'south' | 'north';
|
|
35
15
|
private buildHouses;
|
|
36
16
|
render(): import("lit").TemplateResult<1>;
|
|
17
|
+
private isLagna;
|
|
37
18
|
private renderHouseGroup;
|
|
38
19
|
}
|
|
39
20
|
declare global {
|
|
@@ -41,5 +22,4 @@ declare global {
|
|
|
41
22
|
'roxy-vedic-kundli': RoxyVedicKundli;
|
|
42
23
|
}
|
|
43
24
|
}
|
|
44
|
-
export {};
|
|
45
25
|
//# sourceMappingURL=vedic-kundli.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vedic-kundli.d.ts","sourceRoot":"","sources":["../../src/components/vedic-kundli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,UAAU,EAAgB,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"vedic-kundli.d.ts","sourceRoot":"","sources":["../../src/components/vedic-kundli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,UAAU,EAAgB,MAAM,KAAK,CAAC;AAG1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AA6E5D;;;;;;;GAOG;AACH,qBACa,eAAgB,SAAQ,UAAU;IAC9C,MAAM,CAAC,MAAM,4BA+CX;IAGF,IAAI,EAAE,kBAAkB,GAAG,IAAI,CAAQ;IAGvC,UAAU,EAAE,OAAO,GAAG,OAAO,CAAW;IAExC,OAAO,CAAC,WAAW;IAiBnB,MAAM;IAiCN,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,gBAAgB;CAmCxB;AAOD,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,qBAAqB;QAC9B,mBAAmB,EAAE,eAAe,CAAC;KACrC;CACD"}
|
|
@@ -196,21 +196,12 @@ var RoxyVedicKundli = class extends LitElement {
|
|
|
196
196
|
}
|
|
197
197
|
buildHouses() {
|
|
198
198
|
if (!this.data) return [];
|
|
199
|
+
const data = this.data;
|
|
199
200
|
const houses = [];
|
|
200
|
-
if (Array.isArray(this.data.houses)) {
|
|
201
|
-
for (const h of this.data.houses) {
|
|
202
|
-
houses.push({
|
|
203
|
-
house: h.house ?? h.number ?? houses.length + 1,
|
|
204
|
-
sign: h.sign ?? "",
|
|
205
|
-
planets: h.planets ?? []
|
|
206
|
-
});
|
|
207
|
-
}
|
|
208
|
-
if (houses.length > 0) return houses;
|
|
209
|
-
}
|
|
210
201
|
for (let i = 0; i < 12; i++) {
|
|
211
202
|
const key = RASHI_KEYS[i];
|
|
212
|
-
const bucket =
|
|
213
|
-
const planets = (bucket?.signs ?? []).map((p) => p.
|
|
203
|
+
const bucket = data[key];
|
|
204
|
+
const planets = (bucket?.signs ?? []).map((p) => p.graha).filter(Boolean);
|
|
214
205
|
houses.push({
|
|
215
206
|
house: i + 1,
|
|
216
207
|
sign: RASHI_TO_SIGN[key] ?? "",
|
|
@@ -250,19 +241,28 @@ var RoxyVedicKundli = class extends LitElement {
|
|
|
250
241
|
</svg>
|
|
251
242
|
</div>`;
|
|
252
243
|
}
|
|
244
|
+
isLagna(h) {
|
|
245
|
+
const ascSign = this.data?.meta?.Lagna?.rashi;
|
|
246
|
+
if (!ascSign) return false;
|
|
247
|
+
return ascSign.toLowerCase() === h.sign.toLowerCase();
|
|
248
|
+
}
|
|
253
249
|
renderHouseGroup(h) {
|
|
254
250
|
const center = SOUTH_HOUSE_CENTERS[h.house];
|
|
255
251
|
const signPos = SOUTH_SIGN_POSITIONS[h.house];
|
|
256
252
|
if (!center || !signPos) return nothing;
|
|
257
253
|
const signAbbr = SIGN_ABBR[h.sign] ?? "";
|
|
258
254
|
const planets = h.planets ?? [];
|
|
255
|
+
const isLagna = this.isLagna(h);
|
|
259
256
|
return svg`
|
|
260
257
|
<g>
|
|
258
|
+
${isLagna ? svg`<rect class="lagna-bg" x=${center.x - 30} y=${center.y - 28} width="60" height="56" rx="6" />` : nothing}
|
|
261
259
|
${signAbbr ? svg`<text class="sign-text" x=${signPos.x} y=${signPos.y} text-anchor="middle" dominant-baseline="central">${signAbbr}</text>` : nothing}
|
|
260
|
+
${isLagna ? svg`<text class="lagna-marker" x=${center.x} y=${center.y - 18} text-anchor="middle" dominant-baseline="central">LAGNA</text>` : nothing}
|
|
262
261
|
${planets.map((planet, j) => {
|
|
263
262
|
const abbr = PLANET_ABBR[capitalize(planet)] ?? planet.slice(0, 2);
|
|
264
263
|
const lineHeight = 13;
|
|
265
|
-
const
|
|
264
|
+
const baseY = isLagna ? center.y + 8 : center.y;
|
|
265
|
+
const startY = baseY - (planets.length - 1) * lineHeight / 2;
|
|
266
266
|
const yPos = startY + j * lineHeight;
|
|
267
267
|
return svg`<text class="planet-text" x=${center.x} y=${yPos} text-anchor="middle" dominant-baseline="central">${abbr}</text>`;
|
|
268
268
|
})}
|
|
@@ -304,6 +304,18 @@ RoxyVedicKundli.styles = [
|
|
|
304
304
|
font-weight: 600;
|
|
305
305
|
font-family: var(--roxy-font-sans);
|
|
306
306
|
}
|
|
307
|
+
.lagna-marker {
|
|
308
|
+
fill: var(--roxy-accent-fg, #b45309);
|
|
309
|
+
font-size: 8px;
|
|
310
|
+
font-weight: 700;
|
|
311
|
+
font-family: var(--roxy-font-sans);
|
|
312
|
+
letter-spacing: 0.05em;
|
|
313
|
+
}
|
|
314
|
+
.lagna-bg {
|
|
315
|
+
fill: color-mix(in srgb, var(--roxy-accent, #f59e0b) 12%, transparent);
|
|
316
|
+
stroke: color-mix(in srgb, var(--roxy-accent, #f59e0b) 45%, transparent);
|
|
317
|
+
stroke-width: 0.8;
|
|
318
|
+
}
|
|
307
319
|
`
|
|
308
320
|
];
|
|
309
321
|
__decorateClass([
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/components/vedic-kundli.ts", "../../src/tokens/index.ts", "../../src/utils/base-styles.ts"],
|
|
4
|
-
"sourcesContent": ["import { css, html, LitElement, nothing, svg } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { PLANET_ABBR, SIGN_ABBR } from '../tokens/index.js';\nimport { baseStyles } from '../utils/base-styles.js';\n\ninterface KundliMeta {\n\t[planet: string]: {\n\t\tgraha?: string;\n\t\trashi?: string;\n\t\tlongitude?: number;\n\t\tnakshatra?: string;\n\t\tisRetrograde?: boolean;\n\t};\n}\n\ninterface RashiBucket {\n\trashi?: string;\n\tsigns?: Array<{\n\t\tplanet?: string;\n\t\tlongitude?: number;\n\t\tisRetrograde?: boolean;\n\t}>;\n}\n\ninterface KundliHouse {\n\thouse: number;\n\tsign: string;\n\tplanets: string[];\n}\n\ninterface KundliData {\n\tmeta?: KundliMeta;\n\thouses?: Array<{\n\t\thouse?: number;\n\t\tnumber?: number;\n\t\tsign?: string;\n\t\tplanets?: string[];\n\t}>;\n\tcombustion?: unknown[];\n\tplanetaryWar?: unknown[];\n\t[rashi: string]: unknown;\n}\n\nconst SOUTH_HOUSE_CENTERS: Record<number, { x: number; y: number }> = {\n\t1: { x: 150, y: 58 },\n\t2: { x: 205, y: 52 },\n\t3: { x: 253, y: 112 },\n\t4: { x: 243, y: 150 },\n\t5: { x: 253, y: 188 },\n\t6: { x: 205, y: 248 },\n\t7: { x: 150, y: 242 },\n\t8: { x: 95, y: 248 },\n\t9: { x: 47, y: 188 },\n\t10: { x: 57, y: 150 },\n\t11: { x: 47, y: 112 },\n\t12: { x: 95, y: 52 },\n};\n\nconst SOUTH_SIGN_POSITIONS: Record<number, { x: number; y: number }> = {\n\t1: { x: 150, y: 35 },\n\t2: { x: 222, y: 40 },\n\t3: { x: 265, y: 100 },\n\t4: { x: 265, y: 150 },\n\t5: { x: 265, y: 200 },\n\t6: { x: 222, y: 260 },\n\t7: { x: 150, y: 265 },\n\t8: { x: 78, y: 260 },\n\t9: { x: 35, y: 200 },\n\t10: { x: 35, y: 150 },\n\t11: { x: 35, y: 100 },\n\t12: { x: 78, y: 40 },\n};\n\nconst RASHI_KEYS = [\n\t'aries',\n\t'taurus',\n\t'gemini',\n\t'cancer',\n\t'leo',\n\t'virgo',\n\t'libra',\n\t'scorpio',\n\t'sagittarius',\n\t'capricorn',\n\t'aquarius',\n\t'pisces',\n] as const;\n\nconst RASHI_TO_SIGN: Record<string, string> = {\n\taries: 'Aries',\n\ttaurus: 'Taurus',\n\tgemini: 'Gemini',\n\tcancer: 'Cancer',\n\tleo: 'Leo',\n\tvirgo: 'Virgo',\n\tlibra: 'Libra',\n\tscorpio: 'Scorpio',\n\tsagittarius: 'Sagittarius',\n\tcapricorn: 'Capricorn',\n\taquarius: 'Aquarius',\n\tpisces: 'Pisces',\n};\n\n/**\n * Vedic kundli (D1 Rashi chart). South Indian style by default. Pass `data`\n * from /vedic-astrology/birth-chart. North Indian style via style=\"north\".\n *\n * Lifted from jyotish-vedic-astrology-app/src/components/birth-chart.tsx,\n * keeping HOUSE_CENTERS + SIGN_POSITIONS + abbreviations, dropping the React\n * DOM color-probing hook in favor of CSS custom properties on :host.\n */\n@customElement('roxy-vedic-kundli')\nexport class RoxyVedicKundli extends LitElement {\n\tstatic styles = [\n\t\tbaseStyles,\n\t\tcss`\n\t\t\t.wrap {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\t\t\t.title {\n\t\t\t\tfont-size: var(--roxy-text-lg, 1.125rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tmargin: 0;\n\t\t\t}\n\t\t\tsvg {\n\t\t\t\tdisplay: block;\n\t\t\t\twidth: 100%;\n\t\t\t\tmax-width: 360px;\n\t\t\t\tmargin: 0 auto;\n\t\t\t}\n\t\t\t.line {\n\t\t\t\tfill: transparent;\n\t\t\t\tstroke: var(--roxy-border, #e4e4e7);\n\t\t\t}\n\t\t\t.sign-text {\n\t\t\t\tfill: var(--roxy-muted, #71717a);\n\t\t\t\tfont-size: 9px;\n\t\t\t\tfont-weight: 500;\n\t\t\t\tfont-family: var(--roxy-font-sans);\n\t\t\t}\n\t\t\t.planet-text {\n\t\t\t\tfill: var(--roxy-fg, #0a0a0a);\n\t\t\t\tfont-size: 11px;\n\t\t\t\tfont-weight: 600;\n\t\t\t\tfont-family: var(--roxy-font-sans);\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\tdata: KundliData | null = null;\n\n\t@property({ type: String, reflect: true, attribute: 'chart-style' })\n\tchartStyle: 'south' | 'north' = 'south';\n\n\tprivate buildHouses(): KundliHouse[] {\n\t\tif (!this.data) return [];\n\t\tconst houses: KundliHouse[] = [];\n\t\t// Prefer normalized .houses array if present\n\t\tif (Array.isArray(this.data.houses)) {\n\t\t\tfor (const h of this.data.houses) {\n\t\t\t\thouses.push({\n\t\t\t\t\thouse: (h.house ?? h.number ?? houses.length + 1) as number,\n\t\t\t\t\tsign: h.sign ?? '',\n\t\t\t\t\tplanets: h.planets ?? [],\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (houses.length > 0) return houses;\n\t\t}\n\t\t// Otherwise read the rashi buckets and project them as houses 1..12\n\t\t// keyed by sign order. Lagna-anchored ordering would require knowing\n\t\t// the ascendant rashi; we render rashi buckets directly which is the\n\t\t// canonical South Indian layout.\n\t\tfor (let i = 0; i < 12; i++) {\n\t\t\tconst key = RASHI_KEYS[i];\n\t\t\tconst bucket = this.data[key] as RashiBucket | undefined;\n\t\t\tconst planets = (bucket?.signs ?? [])\n\t\t\t\t.map((p) => p.planet ?? '')\n\t\t\t\t.filter(Boolean);\n\t\t\thouses.push({\n\t\t\t\thouse: i + 1,\n\t\t\t\tsign: RASHI_TO_SIGN[key] ?? '',\n\t\t\t\tplanets,\n\t\t\t});\n\t\t}\n\t\treturn houses;\n\t}\n\n\trender() {\n\t\tif (!this.data)\n\t\t\treturn html`<div class=\"roxy-empty\" role=\"status\">No kundli data</div>`;\n\t\tconst houses = this.buildHouses();\n\n\t\treturn html`<div class=\"wrap\">\n\t\t\t<h2 class=\"title\">Vedic kundli</h2>\n\t\t\t<svg\n\t\t\t\tviewBox=\"0 0 300 300\"\n\t\t\t\trole=\"img\"\n\t\t\t\taria-label=\"Vedic birth chart with twelve sign houses\"\n\t\t\t>\n\t\t\t\t<title>Vedic kundli</title>\n\t\t\t\t<polygon class=\"line\" points=\"150,10 290,150 150,290 10,150\" stroke-width=\"1.5\" />\n\t\t\t\t<polygon\n\t\t\t\t\tclass=\"line\"\n\t\t\t\t\tpoints=\"220,80 220,220 80,220 80,80\"\n\t\t\t\t\tstroke-width=\"1\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t/>\n\t\t\t\t<line class=\"line\" x1=\"150\" y1=\"10\" x2=\"80\" y2=\"80\" stroke-width=\"1\" />\n\t\t\t\t<line class=\"line\" x1=\"150\" y1=\"10\" x2=\"220\" y2=\"80\" stroke-width=\"1\" />\n\t\t\t\t<line class=\"line\" x1=\"290\" y1=\"150\" x2=\"220\" y2=\"80\" stroke-width=\"1\" />\n\t\t\t\t<line class=\"line\" x1=\"290\" y1=\"150\" x2=\"220\" y2=\"220\" stroke-width=\"1\" />\n\t\t\t\t<line class=\"line\" x1=\"150\" y1=\"290\" x2=\"220\" y2=\"220\" stroke-width=\"1\" />\n\t\t\t\t<line class=\"line\" x1=\"150\" y1=\"290\" x2=\"80\" y2=\"220\" stroke-width=\"1\" />\n\t\t\t\t<line class=\"line\" x1=\"10\" y1=\"150\" x2=\"80\" y2=\"220\" stroke-width=\"1\" />\n\t\t\t\t<line class=\"line\" x1=\"10\" y1=\"150\" x2=\"80\" y2=\"80\" stroke-width=\"1\" />\n\t\t\t\t${houses.map((h) => this.renderHouseGroup(h))}\n\t\t\t</svg>\n\t\t</div>`;\n\t}\n\n\tprivate renderHouseGroup(h: KundliHouse) {\n\t\tconst center = SOUTH_HOUSE_CENTERS[h.house];\n\t\tconst signPos = SOUTH_SIGN_POSITIONS[h.house];\n\t\tif (!center || !signPos) return nothing;\n\t\tconst signAbbr = SIGN_ABBR[h.sign] ?? '';\n\t\tconst planets = h.planets ?? [];\n\t\treturn svg`\n\t\t\t<g>\n\t\t\t\t${\n\t\t\t\t\tsignAbbr\n\t\t\t\t\t\t? svg`<text class=\"sign-text\" x=${signPos.x} y=${signPos.y} text-anchor=\"middle\" dominant-baseline=\"central\">${signAbbr}</text>`\n\t\t\t\t\t\t: nothing\n\t\t\t\t}\n\t\t\t\t${planets.map((planet, j) => {\n\t\t\t\t\tconst abbr = PLANET_ABBR[capitalize(planet)] ?? planet.slice(0, 2);\n\t\t\t\t\tconst lineHeight = 13;\n\t\t\t\t\tconst startY = center.y - ((planets.length - 1) * lineHeight) / 2;\n\t\t\t\t\tconst yPos = startY + j * lineHeight;\n\t\t\t\t\treturn svg`<text class=\"planet-text\" x=${center.x} y=${yPos} text-anchor=\"middle\" dominant-baseline=\"central\">${abbr}</text>`;\n\t\t\t\t})}\n\t\t\t</g>\n\t\t`;\n\t}\n}\n\nfunction capitalize(s: string): string {\n\tif (!s) return '';\n\treturn s.charAt(0).toUpperCase() + s.slice(1).toLowerCase();\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'roxy-vedic-kundli': RoxyVedicKundli;\n\t}\n}\n", "/**\n * Symbol constants used across components. Single source of truth so chart\n * wheels, card headers, hexagram displays, and panchang tables stay visually\n * consistent.\n */\n\nexport const PLANET_GLYPH: Record<string, string> = {\n\tSun: '\u2609',\n\tMoon: '\u263D',\n\tMercury: '\u263F',\n\tVenus: '\u2640',\n\tEarth: '\u2641',\n\tMars: '\u2642',\n\tJupiter: '\u2643',\n\tSaturn: '\u2644',\n\tUranus: '\u2645',\n\tNeptune: '\u2646',\n\tPluto: '\u2647',\n\tRahu: '\u260A',\n\tKetu: '\u260B',\n\tAscendant: 'Asc',\n\tLagna: 'La',\n\tNorthNode: '\u260A',\n\tSouthNode: '\u260B',\n};\n\nexport const PLANET_ABBR: Record<string, string> = {\n\tSun: 'Su',\n\tMoon: 'Mo',\n\tMercury: 'Me',\n\tVenus: 'Ve',\n\tMars: 'Ma',\n\tJupiter: 'Ju',\n\tSaturn: 'Sa',\n\tUranus: 'Ur',\n\tNeptune: 'Ne',\n\tPluto: 'Pl',\n\tRahu: 'Ra',\n\tKetu: 'Ke',\n\tAscendant: 'Asc',\n\tLagna: 'La',\n};\n\nexport const SIGN_GLYPH: Record<string, string> = {\n\tAries: '\u2648',\n\tTaurus: '\u2649',\n\tGemini: '\u264A',\n\tCancer: '\u264B',\n\tLeo: '\u264C',\n\tVirgo: '\u264D',\n\tLibra: '\u264E',\n\tScorpio: '\u264F',\n\tSagittarius: '\u2650',\n\tCapricorn: '\u2651',\n\tAquarius: '\u2652',\n\tPisces: '\u2653',\n};\n\nexport const SIGN_ABBR: Record<string, string> = {\n\tAries: 'Ar',\n\tTaurus: 'Ta',\n\tGemini: 'Ge',\n\tCancer: 'Cn',\n\tLeo: 'Le',\n\tVirgo: 'Vi',\n\tLibra: 'Li',\n\tScorpio: 'Sc',\n\tSagittarius: 'Sg',\n\tCapricorn: 'Cp',\n\tAquarius: 'Aq',\n\tPisces: 'Pi',\n};\n\nexport const SIGNS_ORDER = [\n\t'Aries',\n\t'Taurus',\n\t'Gemini',\n\t'Cancer',\n\t'Leo',\n\t'Virgo',\n\t'Libra',\n\t'Scorpio',\n\t'Sagittarius',\n\t'Capricorn',\n\t'Aquarius',\n\t'Pisces',\n] as const;\n\n/** Aspect symbols. Used by synastry and natal chart aspect tables. */\nexport const ASPECT_SYMBOL: Record<string, string> = {\n\tconjunction: '\u260C',\n\topposition: '\u260D',\n\ttrine: '\u25B3',\n\tsquare: '\u25A1',\n\tsextile: '\u2731',\n\tquincunx: '\u22BB',\n\tsemisextile: '\u22BC',\n};\n\n/** Trigrams used by I Ching hexagrams. Eight trigrams compose 64 hexagrams. */\nexport const TRIGRAM_GLYPH: Record<string, string> = {\n\theaven: '\u2630',\n\tlake: '\u2631',\n\tfire: '\u2632',\n\tthunder: '\u2633',\n\twind: '\u2634',\n\twater: '\u2635',\n\tmountain: '\u2636',\n\tearth: '\u2637',\n\tHeaven: '\u2630',\n\tLake: '\u2631',\n\tFire: '\u2632',\n\tThunder: '\u2633',\n\tWind: '\u2634',\n\tWater: '\u2635',\n\tMountain: '\u2636',\n\tEarth: '\u2637',\n};\n\n/** Moon phase emoji set. Used by moon phase card. */\nexport const MOON_PHASE_EMOJI: Record<string, string> = {\n\t'new moon': '\uD83C\uDF11',\n\t'waxing crescent': '\uD83C\uDF12',\n\t'first quarter': '\uD83C\uDF13',\n\t'waxing gibbous': '\uD83C\uDF14',\n\t'full moon': '\uD83C\uDF15',\n\t'waning gibbous': '\uD83C\uDF16',\n\t'last quarter': '\uD83C\uDF17',\n\t'waning crescent': '\uD83C\uDF18',\n};\n", "import { css } from 'lit';\n\n/**\n * Shared host styles every component pulls in. Sets default font, color,\n * container query support, and the entry fade-in.\n */\nexport const baseStyles = css`\n\t:host {\n\t\tdisplay: block;\n\t\tcontainer-type: inline-size;\n\t\tfont-family: var(\n\t\t\t--roxy-font-sans,\n\t\t\tsystem-ui,\n\t\t\t-apple-system,\n\t\t\tBlinkMacSystemFont,\n\t\t\t'Segoe UI',\n\t\t\tRoboto,\n\t\t\tsans-serif\n\t\t);\n\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\tbackground: transparent;\n\t\tfont-size: var(--roxy-text-base, 1rem);\n\t\tline-height: var(--roxy-leading-normal, 1.5);\n\t\tanimation: roxy-fade-in var(--roxy-motion-duration, 200ms)\n\t\t\tvar(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1)) both;\n\t}\n\n\t*,\n\t*::before,\n\t*::after {\n\t\tbox-sizing: border-box;\n\t}\n\n\t@keyframes roxy-fade-in {\n\t\tfrom {\n\t\t\topacity: 0;\n\t\t\ttransform: translateY(2px);\n\t\t}\n\t\tto {\n\t\t\topacity: 1;\n\t\t\ttransform: translateY(0);\n\t\t}\n\t}\n\n\t@media (prefers-reduced-motion: reduce) {\n\t\t:host {\n\t\t\tanimation: none;\n\t\t}\n\t}\n\n\t.roxy-skeleton {\n\t\tbackground: linear-gradient(\n\t\t\t90deg,\n\t\t\tvar(--roxy-border, #e4e4e7) 0%,\n\t\t\tcolor-mix(in srgb, var(--roxy-border, #e4e4e7) 60%, transparent) 50%,\n\t\t\tvar(--roxy-border, #e4e4e7) 100%\n\t\t);\n\t\tbackground-size: 200% 100%;\n\t\tanimation: roxy-shimmer 1.4s ease-in-out infinite;\n\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t}\n\n\t@keyframes roxy-shimmer {\n\t\t0% {\n\t\t\tbackground-position: 200% 0;\n\t\t}\n\t\t100% {\n\t\t\tbackground-position: -200% 0;\n\t\t}\n\t}\n\n\t@media (prefers-reduced-motion: reduce) {\n\t\t.roxy-skeleton {\n\t\t\tanimation: none;\n\t\t}\n\t}\n\n\t.roxy-empty {\n\t\tpadding: var(--roxy-space-lg, 1.5rem);\n\t\tcolor: var(--roxy-muted, #71717a);\n\t\ttext-align: center;\n\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t}\n\n\t:host(:focus-within) .roxy-card {\n\t\toutline: 2px solid var(--roxy-ring, rgba(245, 158, 11, 0.4));\n\t\toutline-offset: 2px;\n\t}\n`;\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;AAAA,SAAS,OAAAA,MAAK,MAAM,YAAY,SAAS,WAAW;AACpD,SAAS,eAAe,gBAAgB;;;
|
|
4
|
+
"sourcesContent": ["import { css, html, LitElement, nothing, svg } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { PLANET_ABBR, SIGN_ABBR } from '../tokens/index.js';\nimport type { BirthChartResponse } from '../types/index.js';\nimport { baseStyles } from '../utils/base-styles.js';\n\ntype RashiBucket = BirthChartResponse['aries'];\n\n// TODO(spec): BirthChartResponse types only `aries` and `meta`, but the API\n// returns all 12 rashi keys (taurus, gemini, ..., pisces) with the same shape\n// as `aries`. Update the OpenAPI schema so the renderer can index by rashi\n// without casts.\ntype BirthChartByRashi = BirthChartResponse & Record<string, RashiBucket>;\n\ninterface KundliHouse {\n\thouse: number;\n\tsign: string;\n\tplanets: string[];\n}\n\nconst SOUTH_HOUSE_CENTERS: Record<number, { x: number; y: number }> = {\n\t1: { x: 150, y: 58 },\n\t2: { x: 205, y: 52 },\n\t3: { x: 253, y: 112 },\n\t4: { x: 243, y: 150 },\n\t5: { x: 253, y: 188 },\n\t6: { x: 205, y: 248 },\n\t7: { x: 150, y: 242 },\n\t8: { x: 95, y: 248 },\n\t9: { x: 47, y: 188 },\n\t10: { x: 57, y: 150 },\n\t11: { x: 47, y: 112 },\n\t12: { x: 95, y: 52 },\n};\n\nconst SOUTH_SIGN_POSITIONS: Record<number, { x: number; y: number }> = {\n\t1: { x: 150, y: 35 },\n\t2: { x: 222, y: 40 },\n\t3: { x: 265, y: 100 },\n\t4: { x: 265, y: 150 },\n\t5: { x: 265, y: 200 },\n\t6: { x: 222, y: 260 },\n\t7: { x: 150, y: 265 },\n\t8: { x: 78, y: 260 },\n\t9: { x: 35, y: 200 },\n\t10: { x: 35, y: 150 },\n\t11: { x: 35, y: 100 },\n\t12: { x: 78, y: 40 },\n};\n\nconst RASHI_KEYS = [\n\t'aries',\n\t'taurus',\n\t'gemini',\n\t'cancer',\n\t'leo',\n\t'virgo',\n\t'libra',\n\t'scorpio',\n\t'sagittarius',\n\t'capricorn',\n\t'aquarius',\n\t'pisces',\n] as const;\n\nconst RASHI_TO_SIGN: Record<string, string> = {\n\taries: 'Aries',\n\ttaurus: 'Taurus',\n\tgemini: 'Gemini',\n\tcancer: 'Cancer',\n\tleo: 'Leo',\n\tvirgo: 'Virgo',\n\tlibra: 'Libra',\n\tscorpio: 'Scorpio',\n\tsagittarius: 'Sagittarius',\n\tcapricorn: 'Capricorn',\n\taquarius: 'Aquarius',\n\tpisces: 'Pisces',\n};\n\n/**\n * Vedic kundli (D1 Rashi chart). South Indian style by default. Pass `data`\n * from /vedic-astrology/birth-chart. North Indian style via style=\"north\".\n *\n * Lifted from jyotish-vedic-astrology-app/src/components/birth-chart.tsx,\n * keeping HOUSE_CENTERS + SIGN_POSITIONS + abbreviations, dropping the React\n * DOM color-probing hook in favor of CSS custom properties on :host.\n */\n@customElement('roxy-vedic-kundli')\nexport class RoxyVedicKundli extends LitElement {\n\tstatic styles = [\n\t\tbaseStyles,\n\t\tcss`\n\t\t\t.wrap {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: var(--roxy-space-md, 1rem);\n\t\t\t}\n\t\t\t.title {\n\t\t\t\tfont-size: var(--roxy-text-lg, 1.125rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tmargin: 0;\n\t\t\t}\n\t\t\tsvg {\n\t\t\t\tdisplay: block;\n\t\t\t\twidth: 100%;\n\t\t\t\tmax-width: 360px;\n\t\t\t\tmargin: 0 auto;\n\t\t\t}\n\t\t\t.line {\n\t\t\t\tfill: transparent;\n\t\t\t\tstroke: var(--roxy-border, #e4e4e7);\n\t\t\t}\n\t\t\t.sign-text {\n\t\t\t\tfill: var(--roxy-muted, #71717a);\n\t\t\t\tfont-size: 9px;\n\t\t\t\tfont-weight: 500;\n\t\t\t\tfont-family: var(--roxy-font-sans);\n\t\t\t}\n\t\t\t.planet-text {\n\t\t\t\tfill: var(--roxy-fg, #0a0a0a);\n\t\t\t\tfont-size: 11px;\n\t\t\t\tfont-weight: 600;\n\t\t\t\tfont-family: var(--roxy-font-sans);\n\t\t\t}\n\t\t\t.lagna-marker {\n\t\t\t\tfill: var(--roxy-accent-fg, #b45309);\n\t\t\t\tfont-size: 8px;\n\t\t\t\tfont-weight: 700;\n\t\t\t\tfont-family: var(--roxy-font-sans);\n\t\t\t\tletter-spacing: 0.05em;\n\t\t\t}\n\t\t\t.lagna-bg {\n\t\t\t\tfill: color-mix(in srgb, var(--roxy-accent, #f59e0b) 12%, transparent);\n\t\t\t\tstroke: color-mix(in srgb, var(--roxy-accent, #f59e0b) 45%, transparent);\n\t\t\t\tstroke-width: 0.8;\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\tdata: BirthChartResponse | null = null;\n\n\t@property({ type: String, reflect: true, attribute: 'chart-style' })\n\tchartStyle: 'south' | 'north' = 'south';\n\n\tprivate buildHouses(): KundliHouse[] {\n\t\tif (!this.data) return [];\n\t\tconst data = this.data as BirthChartByRashi;\n\t\tconst houses: KundliHouse[] = [];\n\t\tfor (let i = 0; i < 12; i++) {\n\t\t\tconst key = RASHI_KEYS[i];\n\t\t\tconst bucket = data[key];\n\t\t\tconst planets = (bucket?.signs ?? []).map((p) => p.graha).filter(Boolean);\n\t\t\thouses.push({\n\t\t\t\thouse: i + 1,\n\t\t\t\tsign: RASHI_TO_SIGN[key] ?? '',\n\t\t\t\tplanets,\n\t\t\t});\n\t\t}\n\t\treturn houses;\n\t}\n\n\trender() {\n\t\tif (!this.data)\n\t\t\treturn html`<div class=\"roxy-empty\" role=\"status\">No kundli data</div>`;\n\t\tconst houses = this.buildHouses();\n\n\t\treturn html`<div class=\"wrap\">\n\t\t\t<h2 class=\"title\">Vedic kundli</h2>\n\t\t\t<svg\n\t\t\t\tviewBox=\"0 0 300 300\"\n\t\t\t\trole=\"img\"\n\t\t\t\taria-label=\"Vedic birth chart with twelve sign houses\"\n\t\t\t>\n\t\t\t\t<title>Vedic kundli</title>\n\t\t\t\t<polygon class=\"line\" points=\"150,10 290,150 150,290 10,150\" stroke-width=\"1.5\" />\n\t\t\t\t<polygon\n\t\t\t\t\tclass=\"line\"\n\t\t\t\t\tpoints=\"220,80 220,220 80,220 80,80\"\n\t\t\t\t\tstroke-width=\"1\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t/>\n\t\t\t\t<line class=\"line\" x1=\"150\" y1=\"10\" x2=\"80\" y2=\"80\" stroke-width=\"1\" />\n\t\t\t\t<line class=\"line\" x1=\"150\" y1=\"10\" x2=\"220\" y2=\"80\" stroke-width=\"1\" />\n\t\t\t\t<line class=\"line\" x1=\"290\" y1=\"150\" x2=\"220\" y2=\"80\" stroke-width=\"1\" />\n\t\t\t\t<line class=\"line\" x1=\"290\" y1=\"150\" x2=\"220\" y2=\"220\" stroke-width=\"1\" />\n\t\t\t\t<line class=\"line\" x1=\"150\" y1=\"290\" x2=\"220\" y2=\"220\" stroke-width=\"1\" />\n\t\t\t\t<line class=\"line\" x1=\"150\" y1=\"290\" x2=\"80\" y2=\"220\" stroke-width=\"1\" />\n\t\t\t\t<line class=\"line\" x1=\"10\" y1=\"150\" x2=\"80\" y2=\"220\" stroke-width=\"1\" />\n\t\t\t\t<line class=\"line\" x1=\"10\" y1=\"150\" x2=\"80\" y2=\"80\" stroke-width=\"1\" />\n\t\t\t\t${houses.map((h) => this.renderHouseGroup(h))}\n\t\t\t</svg>\n\t\t</div>`;\n\t}\n\n\tprivate isLagna(h: KundliHouse): boolean {\n\t\tconst ascSign = this.data?.meta?.Lagna?.rashi;\n\t\tif (!ascSign) return false;\n\t\treturn ascSign.toLowerCase() === h.sign.toLowerCase();\n\t}\n\n\tprivate renderHouseGroup(h: KundliHouse) {\n\t\tconst center = SOUTH_HOUSE_CENTERS[h.house];\n\t\tconst signPos = SOUTH_SIGN_POSITIONS[h.house];\n\t\tif (!center || !signPos) return nothing;\n\t\tconst signAbbr = SIGN_ABBR[h.sign] ?? '';\n\t\tconst planets = h.planets ?? [];\n\t\tconst isLagna = this.isLagna(h);\n\t\treturn svg`\n\t\t\t<g>\n\t\t\t\t${\n\t\t\t\t\tisLagna\n\t\t\t\t\t\t? svg`<rect class=\"lagna-bg\" x=${center.x - 30} y=${center.y - 28} width=\"60\" height=\"56\" rx=\"6\" />`\n\t\t\t\t\t\t: nothing\n\t\t\t\t}\n\t\t\t\t${\n\t\t\t\t\tsignAbbr\n\t\t\t\t\t\t? svg`<text class=\"sign-text\" x=${signPos.x} y=${signPos.y} text-anchor=\"middle\" dominant-baseline=\"central\">${signAbbr}</text>`\n\t\t\t\t\t\t: nothing\n\t\t\t\t}\n\t\t\t\t${\n\t\t\t\t\tisLagna\n\t\t\t\t\t\t? svg`<text class=\"lagna-marker\" x=${center.x} y=${center.y - 18} text-anchor=\"middle\" dominant-baseline=\"central\">LAGNA</text>`\n\t\t\t\t\t\t: nothing\n\t\t\t\t}\n\t\t\t\t${planets.map((planet, j) => {\n\t\t\t\t\tconst abbr = PLANET_ABBR[capitalize(planet)] ?? planet.slice(0, 2);\n\t\t\t\t\tconst lineHeight = 13;\n\t\t\t\t\tconst baseY = isLagna ? center.y + 8 : center.y;\n\t\t\t\t\tconst startY = baseY - ((planets.length - 1) * lineHeight) / 2;\n\t\t\t\t\tconst yPos = startY + j * lineHeight;\n\t\t\t\t\treturn svg`<text class=\"planet-text\" x=${center.x} y=${yPos} text-anchor=\"middle\" dominant-baseline=\"central\">${abbr}</text>`;\n\t\t\t\t})}\n\t\t\t</g>\n\t\t`;\n\t}\n}\n\nfunction capitalize(s: string): string {\n\tif (!s) return '';\n\treturn s.charAt(0).toUpperCase() + s.slice(1).toLowerCase();\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'roxy-vedic-kundli': RoxyVedicKundli;\n\t}\n}\n", "/**\n * Symbol constants used across components. Single source of truth so chart\n * wheels, card headers, hexagram displays, and panchang tables stay visually\n * consistent.\n */\n\nexport const PLANET_GLYPH: Record<string, string> = {\n\tSun: '\u2609',\n\tMoon: '\u263D',\n\tMercury: '\u263F',\n\tVenus: '\u2640',\n\tEarth: '\u2641',\n\tMars: '\u2642',\n\tJupiter: '\u2643',\n\tSaturn: '\u2644',\n\tUranus: '\u2645',\n\tNeptune: '\u2646',\n\tPluto: '\u2647',\n\tRahu: '\u260A',\n\tKetu: '\u260B',\n\tAscendant: 'Asc',\n\tLagna: 'La',\n\tNorthNode: '\u260A',\n\tSouthNode: '\u260B',\n\t'North node': '\u260A',\n\t'South node': '\u260B',\n\tChiron: '\u26B7',\n\tLilith: '\u26B8',\n\t'Black moon lilith': '\u26B8',\n};\n\nexport const PLANET_ABBR: Record<string, string> = {\n\tSun: 'Su',\n\tMoon: 'Mo',\n\tMercury: 'Me',\n\tVenus: 'Ve',\n\tMars: 'Ma',\n\tJupiter: 'Ju',\n\tSaturn: 'Sa',\n\tUranus: 'Ur',\n\tNeptune: 'Ne',\n\tPluto: 'Pl',\n\tRahu: 'Ra',\n\tKetu: 'Ke',\n\tAscendant: 'Asc',\n\tLagna: 'La',\n};\n\nexport const SIGN_GLYPH: Record<string, string> = {\n\tAries: '\u2648',\n\tTaurus: '\u2649',\n\tGemini: '\u264A',\n\tCancer: '\u264B',\n\tLeo: '\u264C',\n\tVirgo: '\u264D',\n\tLibra: '\u264E',\n\tScorpio: '\u264F',\n\tSagittarius: '\u2650',\n\tCapricorn: '\u2651',\n\tAquarius: '\u2652',\n\tPisces: '\u2653',\n};\n\nexport const SIGN_ABBR: Record<string, string> = {\n\tAries: 'Ar',\n\tTaurus: 'Ta',\n\tGemini: 'Ge',\n\tCancer: 'Cn',\n\tLeo: 'Le',\n\tVirgo: 'Vi',\n\tLibra: 'Li',\n\tScorpio: 'Sc',\n\tSagittarius: 'Sg',\n\tCapricorn: 'Cp',\n\tAquarius: 'Aq',\n\tPisces: 'Pi',\n};\n\nexport const SIGNS_ORDER = [\n\t'Aries',\n\t'Taurus',\n\t'Gemini',\n\t'Cancer',\n\t'Leo',\n\t'Virgo',\n\t'Libra',\n\t'Scorpio',\n\t'Sagittarius',\n\t'Capricorn',\n\t'Aquarius',\n\t'Pisces',\n] as const;\n\n/** Aspect symbols. Used by synastry and natal chart aspect tables. */\nexport const ASPECT_SYMBOL: Record<string, string> = {\n\tconjunction: '\u260C',\n\topposition: '\u260D',\n\ttrine: '\u25B3',\n\tsquare: '\u25A1',\n\tsextile: '\u2731',\n\tquincunx: '\u22BB',\n\tsemisextile: '\u22BC',\n};\n\n/** Trigrams used by I Ching hexagrams. Eight trigrams compose 64 hexagrams. */\nexport const TRIGRAM_GLYPH: Record<string, string> = {\n\theaven: '\u2630',\n\tlake: '\u2631',\n\tfire: '\u2632',\n\tthunder: '\u2633',\n\twind: '\u2634',\n\twater: '\u2635',\n\tmountain: '\u2636',\n\tearth: '\u2637',\n\tHeaven: '\u2630',\n\tLake: '\u2631',\n\tFire: '\u2632',\n\tThunder: '\u2633',\n\tWind: '\u2634',\n\tWater: '\u2635',\n\tMountain: '\u2636',\n\tEarth: '\u2637',\n};\n\n/** Moon phase emoji set. Used by moon phase card. */\nexport const MOON_PHASE_EMOJI: Record<string, string> = {\n\t'new moon': '\uD83C\uDF11',\n\t'waxing crescent': '\uD83C\uDF12',\n\t'first quarter': '\uD83C\uDF13',\n\t'waxing gibbous': '\uD83C\uDF14',\n\t'full moon': '\uD83C\uDF15',\n\t'waning gibbous': '\uD83C\uDF16',\n\t'last quarter': '\uD83C\uDF17',\n\t'waning crescent': '\uD83C\uDF18',\n};\n", "import { css } from 'lit';\n\n/**\n * Shared host styles every component pulls in. Sets default font, color,\n * container query support, and the entry fade-in.\n */\nexport const baseStyles = css`\n\t:host {\n\t\tdisplay: block;\n\t\tcontainer-type: inline-size;\n\t\tfont-family: var(\n\t\t\t--roxy-font-sans,\n\t\t\tsystem-ui,\n\t\t\t-apple-system,\n\t\t\tBlinkMacSystemFont,\n\t\t\t'Segoe UI',\n\t\t\tRoboto,\n\t\t\tsans-serif\n\t\t);\n\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\tbackground: transparent;\n\t\tfont-size: var(--roxy-text-base, 1rem);\n\t\tline-height: var(--roxy-leading-normal, 1.5);\n\t\tanimation: roxy-fade-in var(--roxy-motion-duration, 200ms)\n\t\t\tvar(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1)) both;\n\t}\n\n\t*,\n\t*::before,\n\t*::after {\n\t\tbox-sizing: border-box;\n\t}\n\n\t@keyframes roxy-fade-in {\n\t\tfrom {\n\t\t\topacity: 0;\n\t\t\ttransform: translateY(2px);\n\t\t}\n\t\tto {\n\t\t\topacity: 1;\n\t\t\ttransform: translateY(0);\n\t\t}\n\t}\n\n\t@media (prefers-reduced-motion: reduce) {\n\t\t:host {\n\t\t\tanimation: none;\n\t\t}\n\t}\n\n\t.roxy-skeleton {\n\t\tbackground: linear-gradient(\n\t\t\t90deg,\n\t\t\tvar(--roxy-border, #e4e4e7) 0%,\n\t\t\tcolor-mix(in srgb, var(--roxy-border, #e4e4e7) 60%, transparent) 50%,\n\t\t\tvar(--roxy-border, #e4e4e7) 100%\n\t\t);\n\t\tbackground-size: 200% 100%;\n\t\tanimation: roxy-shimmer 1.4s ease-in-out infinite;\n\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t}\n\n\t@keyframes roxy-shimmer {\n\t\t0% {\n\t\t\tbackground-position: 200% 0;\n\t\t}\n\t\t100% {\n\t\t\tbackground-position: -200% 0;\n\t\t}\n\t}\n\n\t@media (prefers-reduced-motion: reduce) {\n\t\t.roxy-skeleton {\n\t\t\tanimation: none;\n\t\t}\n\t}\n\n\t.roxy-empty {\n\t\tpadding: var(--roxy-space-lg, 1.5rem);\n\t\tcolor: var(--roxy-muted, #71717a);\n\t\ttext-align: center;\n\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t}\n\n\t:host(:focus-within) .roxy-card {\n\t\toutline: 2px solid var(--roxy-ring, rgba(245, 158, 11, 0.4));\n\t\toutline-offset: 2px;\n\t}\n`;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["css", "css"]
|
|
7
7
|
}
|