natus wheel: unified PRV/NXT cycle merging planets & angles; drop degree from classic element contribs; tt-planet-sym larger; tt-sign-type italic — TDD

- _chartItems merges _planetItems + _angleItems sorted by degree desc;
  _stepCycle dispatches to _activatePlanet or _activateAngle via unified list
- T15g/h/i: angle↔planet boundary navigation & wrap; T9n/T9w updated for merged cycle
- classic element contrib rows: removed @ deg° (pdata/inDeg lookup dropped)
- .tt-planet-sym 1.2→1.8rem; .tt-house-of/.tt-house-type 0.6em→0.7rem;
  .tt-sign-type added alongside .tt-house-type selector, font-style: italic

Code architected by Disco DeDisco <discodedisco@outlook.com>
Git commit message Co-Authored-By:
Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Disco DeDisco
2026-04-26 18:42:47 -04:00
parent 5655342d9f
commit c78ecb61bf
4 changed files with 141 additions and 35 deletions

View File

@@ -232,8 +232,10 @@ describe("NatusWheel — tick lines, raise, and cycle navigation", () => {
});
// ── T9n ── PRV cycles counterclockwise (to higher ecliptic degree) ────────
// CONJUNCTION_CHART merged sorted desc: ASC(180)→Mars(132)→MC(90)→Sun(66.7)→Venus(63.3)
// PRV from Sun (pos 3) → MC (pos 2, 90°) — angles and planets share the cycle.
it("T9n: clicking PRV from Sun shows Mars (previous planet counterclockwise = higher degree)", () => {
it("T9n: clicking PRV from Sun shows MC (next higher ecliptic degree in merged cycle)", () => {
const sun = svgEl2.querySelector("[data-planet='Sun']");
expect(sun).not.toBeNull("expected [data-planet='Sun']");
@@ -242,24 +244,25 @@ describe("NatusWheel — tick lines, raise, and cycle navigation", () => {
const prvBtn = tooltipEl.querySelector(".nw-tt-prv");
prvBtn.dispatchEvent(new MouseEvent("click", { bubbles: true }));
expect(tooltipEl.textContent).toContain("Mars");
const mars = svgEl2.querySelector("[data-planet='Mars']");
expect(mars.classList.contains("nw-planet--active")).toBe(true);
expect(tooltipEl.textContent).toContain("Midheaven");
const mc = svgEl2.querySelector("[data-angle='MC']");
expect(mc.classList.contains("nw-angle--active")).toBe(true);
expect(sun.classList.contains("nw-planet--active")).toBe(false);
});
// ── T9w ── NXT wraps clockwise from the last (lowest-degree) planet ───────
// ── T9w ── NXT wraps clockwise from the lowest-degree item ───────────────
// Venus(63.3°) is lowest; NXT wraps to ASC(180°) — the highest-degree item.
it("T9w: cycling NXT from Venus (lowest degree) wraps clockwise to Mars (highest degree)", () => {
// Venus is idx 2 (lowest degree = furthest clockwise); NXT wraps to idx 0 = Mars
it("T9w: cycling NXT from Venus (lowest degree) wraps clockwise to ASC (highest degree)", () => {
const venus = svgEl2.querySelector("[data-planet='Venus']");
venus.dispatchEvent(new MouseEvent("click", { bubbles: true }));
const nxtBtn = tooltipEl.querySelector(".nw-tt-nxt");
nxtBtn.dispatchEvent(new MouseEvent("click", { bubbles: true }));
expect(tooltipEl.textContent).toContain("Mars");
const mars = svgEl2.querySelector("[data-planet='Mars']");
expect(mars.classList.contains("nw-planet--active")).toBe(true);
expect(tooltipEl.textContent).toContain("Ascendant");
const asc = svgEl2.querySelector("[data-angle='ASC']");
expect(asc.classList.contains("nw-angle--active")).toBe(true);
});
});
@@ -952,4 +955,47 @@ describe("NatusWheel — angle (ASC/MC) click tooltips", () => {
const bodyHtml = tooltipEl.querySelector(".nw-tt-body").innerHTML;
expect(bodyHtml).toContain("ASC");
});
// T15g — NXT from a planet steps into an angle when angle is next by degree
// ANGLE_CHART sorted descending: Mars(188)→Moon(97)→MC(90)→Sun(8)→ASC(0)
// Moon is idx 1; NXT steps to MC (idx 2).
it("T15g: clicking NXT from Moon (97°) activates MC (90°, next clockwise)", () => {
const moonGroup = svgEl.querySelector("[data-planet='Moon']");
expect(moonGroup).not.toBeNull("expected [data-planet='Moon']");
moonGroup.dispatchEvent(new MouseEvent("click", { bubbles: true }));
const nxtBtn = tooltipEl.querySelector(".nw-tt-nxt");
nxtBtn.dispatchEvent(new MouseEvent("click", { bubbles: true }));
expect(tooltipEl.textContent).toContain("Midheaven");
const mcGroup = svgEl.querySelector("[data-angle='MC']");
expect(mcGroup.classList.contains("nw-angle--active")).toBe(true);
expect(moonGroup.classList.contains("nw-planet--active")).toBe(false);
});
// T15h — PRV from an angle steps back into a planet
it("T15h: clicking PRV from MC (90°) activates Moon (97°, previous counterclockwise)", () => {
const mcGroup = svgEl.querySelector("[data-angle='MC']");
mcGroup.dispatchEvent(new MouseEvent("click", { bubbles: true }));
const prvBtn = tooltipEl.querySelector(".nw-tt-prv");
prvBtn.dispatchEvent(new MouseEvent("click", { bubbles: true }));
const moonGroup = svgEl.querySelector("[data-planet='Moon']");
expect(moonGroup.classList.contains("nw-planet--active")).toBe(true);
expect(mcGroup.classList.contains("nw-angle--active")).toBe(false);
});
// T15i — NXT from ASC (lowest degree, 0°) wraps to Mars (highest degree, 188°)
it("T15i: NXT from ASC (0°, lowest) wraps clockwise to Mars (188°, highest)", () => {
const ascGroup = svgEl.querySelector("[data-angle='ASC']");
ascGroup.dispatchEvent(new MouseEvent("click", { bubbles: true }));
const nxtBtn = tooltipEl.querySelector(".nw-tt-nxt");
nxtBtn.dispatchEvent(new MouseEvent("click", { bubbles: true }));
expect(tooltipEl.textContent).toContain("Mars");
const marsGroup = svgEl.querySelector("[data-planet='Mars']");
expect(marsGroup.classList.contains("nw-planet--active")).toBe(true);
});
});