natus wheel: ASC/MC angles — tooltips, aspect lines, section headers, tooltip polish
- ASC/MC clickable w. DON/DOFF aspect lines (fixed: open w.o. lines; DON/DOFF both work; angles ring handled in _toggleAspects; lines origin at R.planetR) - btn-disabled click-through fix: pointer-events:auto on DON/DOFF; bounding-rect workaround removed - planet tooltip: applying ⇥ left, separating ↦ right; sign shown for angle partners - sign tooltip: Planets + Cusps section headers; ordinal house + domain; em-dash fallback - house tooltip: Planets header; Angular/Succedent/Cadent + phase labels; em-dash fallback - element tooltips: Planets header for Fire/Stone/Air/Water; Stellium/Parade as section-header labels; compact single-stellium Tempo; Parade sign : planets format - tt-ord: no negative margin in .tt-angle-house context Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -819,3 +819,137 @@ describe("NatusWheel — house ring click tooltips", () => {
|
||||
expect(tooltipEl.style.display).toBe("none");
|
||||
});
|
||||
});
|
||||
|
||||
// ── T15 — ASC / MC angle click tooltips + aspect lines ────────────────────────
|
||||
//
|
||||
// ASC and MC labels are clickable groups ([data-angle='ASC'] / [data-angle='MC']).
|
||||
// Clicking shows a tooltip similar to a planet tooltip:
|
||||
// Title: "Ascendant" (ASC) or "Midheaven" (MC)
|
||||
// Degree in sign + sign name, plus the house number the angle defines.
|
||||
// Aspect list for planets within 10° orb of the angle (client-side computed).
|
||||
// Aspect lines drawn to those planets.
|
||||
// Clicking same angle again closes the tooltip.
|
||||
// Planet tooltips include angle aspects in their own aspect lists.
|
||||
// ─────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
describe("NatusWheel — angle (ASC/MC) click tooltips", () => {
|
||||
|
||||
// ASC=0°(Aries): Sun@8° → Conjunction orb 8° ✓; Mars@188° → Opposition orb 8° ✓
|
||||
// MC=90°(Cancer): Moon@97° → Conjunction orb 7° ✓
|
||||
const ANGLE_CHART = {
|
||||
planets: {
|
||||
Sun: { sign: "Aries", degree: 8.0, retrograde: false },
|
||||
Moon: { sign: "Cancer", degree: 97.0, retrograde: false },
|
||||
Mars: { sign: "Libra", degree: 188.0, retrograde: false },
|
||||
},
|
||||
houses: {
|
||||
cusps: [0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330],
|
||||
asc: 0.0,
|
||||
mc: 90.0,
|
||||
},
|
||||
elements: { Fire: 2, Stone: 0, Air: 1, Water: 1, Time: 0, Space: 0 },
|
||||
aspects: [],
|
||||
distinctions: {
|
||||
"1":1,"2":0,"3":0,"4":1,"5":0,"6":0,
|
||||
"7":1,"8":0,"9":0,"10":1,"11":0,"12":0,
|
||||
},
|
||||
house_system: "O",
|
||||
};
|
||||
|
||||
let svgEl, tooltipEl;
|
||||
|
||||
beforeEach(() => {
|
||||
svgEl = document.createElementNS("http://www.w3.org/2000/svg", "svg");
|
||||
svgEl.setAttribute("id", "id_natus_svg");
|
||||
svgEl.setAttribute("width", "400");
|
||||
svgEl.setAttribute("height", "400");
|
||||
svgEl.style.width = "400px";
|
||||
svgEl.style.height = "400px";
|
||||
document.body.appendChild(svgEl);
|
||||
|
||||
tooltipEl = document.createElement("div");
|
||||
tooltipEl.id = "id_natus_tooltip";
|
||||
tooltipEl.className = "tt";
|
||||
tooltipEl.style.display = "none";
|
||||
document.body.appendChild(tooltipEl);
|
||||
|
||||
NatusWheel.draw(svgEl, ANGLE_CHART);
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
NatusWheel.clear();
|
||||
svgEl.remove();
|
||||
tooltipEl.remove();
|
||||
});
|
||||
|
||||
// T15a — ASC label is a clickable group with data-angle='ASC'
|
||||
it("T15a: clicking [data-angle='ASC'] shows tooltip with 'Ascendant' title and house 1", () => {
|
||||
const ascGroup = svgEl.querySelector("[data-angle='ASC']");
|
||||
expect(ascGroup).not.toBeNull("expected [data-angle='ASC'] to exist in the SVG");
|
||||
|
||||
ascGroup.dispatchEvent(new MouseEvent("click", { bubbles: true }));
|
||||
|
||||
expect(tooltipEl.style.display).toBe("block");
|
||||
const text = tooltipEl.textContent;
|
||||
expect(text).toContain("Ascendant");
|
||||
// ASC=0° is the cusp of House 1
|
||||
expect(text).toContain("1");
|
||||
});
|
||||
|
||||
// T15b — MC label is a clickable group with data-angle='MC'
|
||||
it("T15b: clicking [data-angle='MC'] shows tooltip with 'Midheaven' title and house 10", () => {
|
||||
const mcGroup = svgEl.querySelector("[data-angle='MC']");
|
||||
expect(mcGroup).not.toBeNull("expected [data-angle='MC'] to exist in the SVG");
|
||||
|
||||
mcGroup.dispatchEvent(new MouseEvent("click", { bubbles: true }));
|
||||
|
||||
expect(tooltipEl.style.display).toBe("block");
|
||||
const text = tooltipEl.textContent;
|
||||
expect(text).toContain("Midheaven");
|
||||
expect(text).toContain("10");
|
||||
});
|
||||
|
||||
// T15c — ASC tooltip shows degree-in-sign and sign name
|
||||
it("T15c: ASC tooltip shows the in-sign degree and sign of the Ascendant", () => {
|
||||
const ascGroup = svgEl.querySelector("[data-angle='ASC']");
|
||||
ascGroup.dispatchEvent(new MouseEvent("click", { bubbles: true }));
|
||||
|
||||
const text = tooltipEl.textContent;
|
||||
// ASC=0° → 0° Aries
|
||||
expect(text).toContain("Aries");
|
||||
expect(text).toContain("0.0");
|
||||
});
|
||||
|
||||
// T15d — clicking same angle a second time hides the tooltip
|
||||
it("T15d: clicking the same angle again hides the tooltip", () => {
|
||||
const ascGroup = svgEl.querySelector("[data-angle='ASC']");
|
||||
ascGroup.dispatchEvent(new MouseEvent("click", { bubbles: true }));
|
||||
expect(tooltipEl.style.display).toBe("block");
|
||||
|
||||
ascGroup.dispatchEvent(new MouseEvent("click", { bubbles: true }));
|
||||
expect(tooltipEl.style.display).toBe("none");
|
||||
});
|
||||
|
||||
// T15e — ASC tooltip lists planets within 10° orb (client-side computed)
|
||||
it("T15e: ASC tooltip includes aspect rows for planets within 10° orb", () => {
|
||||
const ascGroup = svgEl.querySelector("[data-angle='ASC']");
|
||||
ascGroup.dispatchEvent(new MouseEvent("click", { bubbles: true }));
|
||||
|
||||
const bodyHtml = tooltipEl.querySelector(".nw-tt-body").innerHTML;
|
||||
// Sun at 8° → Conjunction (orb 8°) ✓ — _pSym emits data-planet attr
|
||||
expect(bodyHtml).toContain('data-planet="Sun"');
|
||||
// Mars at 188° → Opposition to ASC (0°), angular distance 172° → orb 8° ✓
|
||||
expect(bodyHtml).toContain('data-planet="Mars"');
|
||||
});
|
||||
|
||||
// T15f — planet tooltip includes ASC in its aspect list when within orb
|
||||
it("T15f: planet tooltip for Sun lists ASC as an aspect partner", () => {
|
||||
const sunGroup = svgEl.querySelector("[data-planet='Sun']");
|
||||
expect(sunGroup).not.toBeNull();
|
||||
|
||||
sunGroup.dispatchEvent(new MouseEvent("click", { bubbles: true }));
|
||||
|
||||
const bodyHtml = tooltipEl.querySelector(".nw-tt-body").innerHTML;
|
||||
expect(bodyHtml).toContain("ASC");
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user