diff --git a/app/ui-cube-chassis.js b/app/ui-cube-chassis.js index 1b450df..22269fc 100644 --- a/app/ui-cube-chassis.js +++ b/app/ui-cube-chassis.js @@ -22,6 +22,7 @@ getWallFaceLetter, getWallTarotCard, resolveCardImageUrl, + openTarotCardInfo, openTarotCardLightbox, MOTHER_CONNECTORS, formatDirectionName, @@ -48,6 +49,18 @@ svg.setAttribute("role", "img"); svg.setAttribute("aria-label", "Cube of Space interactive chassis"); + function openTarotTarget(cardName, fallbackSrc, fallbackLabel) { + if (typeof openTarotCardInfo === "function" && openTarotCardInfo(cardName) === true) { + return true; + } + + if (typeof openTarotCardLightbox === "function") { + return openTarotCardLightbox(cardName, fallbackSrc, fallbackLabel); + } + + return false; + } + const wallById = new Map(walls.map((wall) => [normalizeId(wall?.id), wall])); const projectedVertices = projectVertices(); const faces = Object.entries(FACE_GEOMETRY) @@ -144,14 +157,14 @@ cardImg.addEventListener("click", (event) => { event.stopPropagation(); selectWall(); - openTarotCardLightbox(wallTarotCard, cardUrl, `${wall?.name || wallId} wall tarot card`); + openTarotTarget(wallTarotCard, cardUrl, `${wall?.name || wallId} wall tarot card`); }); cardImg.addEventListener("keydown", (event) => { if (event.key === "Enter" || event.key === " ") { event.preventDefault(); event.stopPropagation(); selectWall(); - openTarotCardLightbox(wallTarotCard, cardUrl, `${wall?.name || wallId} wall tarot card`); + openTarotTarget(wallTarotCard, cardUrl, `${wall?.name || wallId} wall tarot card`); } }); svg.appendChild(cardImg); @@ -263,14 +276,14 @@ connectorImg.addEventListener("click", (event) => { event.stopPropagation(); selectConnector(); - openTarotCardLightbox(connectorTarotCard, connectorCardUrl, connector?.name || "Mother connector"); + openTarotTarget(connectorTarotCard, connectorCardUrl, connector?.name || "Mother connector"); }); connectorImg.addEventListener("keydown", (event) => { if (event.key === "Enter" || event.key === " ") { event.preventDefault(); event.stopPropagation(); selectConnector(); - openTarotCardLightbox(connectorTarotCard, connectorCardUrl, connector?.name || "Mother connector"); + openTarotTarget(connectorTarotCard, connectorCardUrl, connector?.name || "Mother connector"); } }); group.appendChild(connectorImg); @@ -336,7 +349,7 @@ const selectEdge = () => { state.selectedEdgeId = edgeId; - state.selectedNodeType = "wall"; + state.selectedNodeType = "edge"; state.selectedConnectorId = null; if (!edgeWalls.includes(normalizeId(state.selectedWallId)) && edgeWalls[0]) { state.selectedWallId = edgeWalls[0]; @@ -399,14 +412,14 @@ cardImg.addEventListener("click", (event) => { event.stopPropagation(); selectEdge(); - openTarotCardLightbox(edgeTarotCard, edgeCardUrl, edge?.name || "Cube edge"); + openTarotTarget(edgeTarotCard, edgeCardUrl, edge?.name || "Cube edge"); }); cardImg.addEventListener("keydown", (event) => { if (event.key === "Enter" || event.key === " ") { event.preventDefault(); event.stopPropagation(); selectEdge(); - openTarotCardLightbox(edgeTarotCard, edgeCardUrl, edge?.name || "Cube edge"); + openTarotTarget(edgeTarotCard, edgeCardUrl, edge?.name || "Cube edge"); } }); marker.appendChild(cardImg); @@ -486,7 +499,7 @@ state.selectedNodeType = "center"; state.selectedConnectorId = null; render(getElements()); - openTarotCardLightbox(centerTarotCard, centerCardUrl, "Primal Point"); + openTarotTarget(centerTarotCard, centerCardUrl, "Primal Point"); }); centerImg.addEventListener("keydown", (event) => { if (event.key === "Enter" || event.key === " ") { @@ -495,7 +508,7 @@ state.selectedNodeType = "center"; state.selectedConnectorId = null; render(getElements()); - openTarotCardLightbox(centerTarotCard, centerCardUrl, "Primal Point"); + openTarotTarget(centerTarotCard, centerCardUrl, "Primal Point"); } }); centerMarker.appendChild(centerImg); diff --git a/app/ui-cube-detail.js b/app/ui-cube-detail.js index 0d369fe..9c232de 100644 --- a/app/ui-cube-detail.js +++ b/app/ui-cube-detail.js @@ -520,6 +520,143 @@ renderEdgeCard(context, wall, bodyEl, wallEdgeDirections); } + function renderEdgeDetail(context) { + const { + state, + elements, + normalizeId, + normalizeEdgeId, + formatEdgeName, + getWallById, + getEdgeById, + getEdges, + getEdgeWalls, + getEdgeLetterId, + getEdgeLetter, + getEdgePathEntry, + getEdgeAstrologySymbol, + getHebrewLetterName, + toFiniteNumber, + onSelectWall + } = context; + + const edge = getEdgeById(state.selectedEdgeId) || getEdges()[0] || null; + if (!edge || !elements?.detailNameEl || !elements?.detailSubEl || !elements?.detailBodyEl) { + return false; + } + + const edgeId = normalizeEdgeId(edge.id); + const edgeWalls = getEdgeWalls(edge); + const currentWallId = normalizeId(state.selectedWallId); + const preferredWallId = edgeWalls.includes(currentWallId) + ? currentWallId + : normalizeId(edgeWalls[0]); + + if (preferredWallId) { + state.selectedWallId = preferredWallId; + } + state.selectedEdgeId = edgeId; + + const wallNames = edgeWalls + .map((wallId) => getWallById(wallId)?.name || wallId) + .filter(Boolean) + .join(" ↔ "); + const edgeName = toDisplayText(edge?.name) || formatEdgeName(edgeId); + const edgeLetterId = getEdgeLetterId(edge); + const edgeLetter = getEdgeLetter(edge); + const edgeLetterName = edgeLetterId ? (getHebrewLetterName(edgeLetterId) || edgeLetterId) : ""; + const edgeLetterText = edgeLetterId + ? [edgeLetter, edgeLetterName].filter(Boolean).join(" ") + : ""; + const edgePath = getEdgePathEntry(edge); + const astrologyType = toDisplayText(edgePath?.astrology?.type); + const astrologyName = toDisplayText(edgePath?.astrology?.name); + const astrologySymbol = getEdgeAstrologySymbol(edge); + const astrologyText = astrologySymbol && astrologyName + ? `${astrologySymbol} ${astrologyName}` + : astrologySymbol || astrologyName; + const tarotCard = toDisplayText(edgePath?.tarot?.card); + const tarotTrumpNumber = toFiniteNumber(edgePath?.tarot?.trumpNumber); + const pathNo = toFiniteNumber(edgePath?.pathNumber); + + elements.detailNameEl.textContent = `${edgeName} Edge`; + elements.detailSubEl.textContent = [edgeLetterText, astrologyText].filter(Boolean).join(" · ") || "Cube Edge"; + + const bodyEl = elements.detailBodyEl; + bodyEl.innerHTML = ""; + + const summary = document.createElement("div"); + summary.className = "planet-text"; + summary.innerHTML = ` +