${this.t('No planets to grid')}
`; return html`| ${bodies.slice(0, -1).map((b) => { const g = planetGlyph(b.name) ?? b.label; return html` | ${g} | `; })}||
|---|---|---|---|
| ${rowGlyph} | ${bodies.slice(0, ri + 1).map((col) => { const a = byPair.get(pairKey(row.name, col.name)); if (!a) return html``; const name = normalizeAspect(a); // Every aspect the API returns has a glyph, and a miss falls // back to the full aspect NAME. Never to initials or a slice: // an invented two-letter code in a one-glyph cell reads as a // deliberate abbreviation, which is how `sesquiquadrate` // once shipped rendering as the literal text `ses`. const sym = aspectSymbol(name) ?? display(a, 'type', formatAspectName(a)); const cls = ASPECT_CLASS[name] ?? 'aspect-other'; const orb = formatNumber(this.effectiveLang(), a.orb, 1); return html` | ${sym} | `; })} ${bodies.slice(ri + 1, -1).map(() => html``)} |
${ai.summary}
` : nothing } ${this.renderElementModalityGrid()}| ${MODALITIES.map( (m) => html` | ${MODALITY_LABEL[m]?.abbr ?? m} | `, )}${this.t('Total')} |
|---|---|---|
| ${ELEMENT_LABEL[el] ?? el} | ${MODALITIES.map( (m) => html`${(cells[el]?.[m] ?? []).join(' ')} | `, )}${rowTotal} |
| ${this.t('Total')} | ${MODALITIES.map( (m) => html`${colTotal(m)} | `, )}${placed} |
${p.interpretation}
` : nothing }${detail}
` : nothing} ${renderKeywordChips(interp.keywords)}`, }; }); return this.renderInterpretation( sections, 'natal-planet-readings', 'Planet readings', ); } private renderAspects(planets: PlanetEntry[], aspects: AspectEntry[]) { // Keyed on the canonical English name at BOTH ends, because this map is how // an aspect finds the two longitudes its line is drawn between. The localized // names go in the `