(function () { "use strict"; const { getTarotCardSearchAliases } = window.TarotCardImages || {}; const CLASSICAL_ELEMENT_IDS = ["fire", "water", "air", "earth"]; const ACE_BY_ELEMENT_ID = { water: "Ace of Cups", fire: "Ace of Wands", air: "Ace of Swords", earth: "Ace of Disks" }; const HEBREW_LETTER_NAME_BY_ELEMENT_ID = { fire: "Yod", water: "Heh", air: "Vav", earth: "Heh" }; const HEBREW_LETTER_CHAR_BY_ELEMENT_ID = { fire: "י", water: "ה", air: "ו", earth: "ה" }; const COURT_RANK_BY_ELEMENT_ID = { fire: "Knight", water: "Queen", air: "Prince", earth: "Princess" }; const COURT_SUITS = ["Wands", "Cups", "Swords", "Disks"]; const SUIT_BY_ELEMENT_ID = { fire: "Wands", water: "Cups", air: "Swords", earth: "Disks" }; const SMALL_CARD_GROUPS = [ { label: "2–4", modality: "Cardinal", numbers: [2, 3, 4] }, { label: "5–7", modality: "Fixed", numbers: [5, 6, 7] }, { label: "8–10", modality: "Mutable", numbers: [8, 9, 10] } ]; const SIGN_BY_ELEMENT_AND_MODALITY = { fire: { cardinal: "aries", fixed: "leo", mutable: "sagittarius" }, water: { cardinal: "cancer", fixed: "scorpio", mutable: "pisces" }, air: { cardinal: "libra", fixed: "aquarius", mutable: "gemini" }, earth: { cardinal: "capricorn", fixed: "taurus", mutable: "virgo" } }; const state = { initialized: false, entries: [], filteredEntries: [], selectedId: "", searchQuery: "" }; function getElements() { return { listEl: document.getElementById("elements-list"), countEl: document.getElementById("elements-count"), searchEl: document.getElementById("elements-search-input"), searchClearEl: document.getElementById("elements-search-clear"), detailNameEl: document.getElementById("elements-detail-name"), detailSubEl: document.getElementById("elements-detail-sub"), detailBodyEl: document.getElementById("elements-detail-body") }; } function normalize(value) { return String(value || "") .trim() .toLowerCase() .replace(/\s+/g, " "); } function titleCase(value) { return String(value || "") .split(" ") .filter(Boolean) .map((part) => part.charAt(0).toUpperCase() + part.slice(1)) .join(" "); } function buildTarotAliasText(cardNames) { if (typeof getTarotCardSearchAliases !== "function") { return Array.isArray(cardNames) ? cardNames.join(" ") : ""; } const aliases = new Set(); (Array.isArray(cardNames) ? cardNames : []).forEach((cardName) => { getTarotCardSearchAliases(cardName).forEach((alias) => aliases.add(alias)); }); return Array.from(aliases).join(" "); } function buildSmallCardGroupsForElement(elementId) { const suit = SUIT_BY_ELEMENT_ID[elementId] || ""; const signByModality = SIGN_BY_ELEMENT_AND_MODALITY[elementId] || {}; return SMALL_CARD_GROUPS.map((group) => { const signId = String(signByModality[String(group.modality || "").toLowerCase()] || "").trim(); const signName = titleCase(signId); const cardNames = group.numbers.map((number) => `${number} of ${suit}`); return { rangeLabel: group.label, modality: group.modality, signId, signName, cardNames }; }); } function buildEntries(magickDataset) { const source = magickDataset?.grouped?.alchemy?.elements; if (!source || typeof source !== "object") { return []; } return CLASSICAL_ELEMENT_IDS .map((id) => { const item = source[id]; if (!item || typeof item !== "object") { return null; } const name = String(item?.name?.en || item?.name || titleCase(id)).trim() || titleCase(id); const symbol = String(item?.symbol || "").trim(); const aceCardName = ACE_BY_ELEMENT_ID[id] || ""; const hebrewLetter = HEBREW_LETTER_CHAR_BY_ELEMENT_ID[id] || ""; const hebrewLetterName = HEBREW_LETTER_NAME_BY_ELEMENT_ID[id] || ""; const courtRank = COURT_RANK_BY_ELEMENT_ID[id] || ""; const courtCardNames = courtRank ? COURT_SUITS.map((suit) => `${courtRank} of ${suit}`) : []; const smallCardGroups = buildSmallCardGroupsForElement(id); const smallCardNames = smallCardGroups.flatMap((group) => group.cardNames || []); const tarotAliasText = buildTarotAliasText([aceCardName, ...courtCardNames, ...smallCardNames]); return { id, name, symbol, elementalId: String(item?.elementalId || "").trim(), aceCardName, hebrewLetter, hebrewLetterName, courtRank, courtCardNames, smallCardGroups, searchText: normalize(`${id} ${name} ${symbol} ${aceCardName} ${hebrewLetter} ${hebrewLetterName} ${courtRank} ${courtCardNames.join(" ")} ${smallCardGroups.map((group) => `${group.modality} ${group.signName} ${group.cardNames.join(" ")}`).join(" ")} ${tarotAliasText}`) }; }) .filter(Boolean); } function findEntryById(id) { const normalizedId = normalize(id); return state.entries.find((entry) => entry.id === normalizedId) || null; } function renderList(elements) { if (!elements?.listEl) { return; } elements.listEl.replaceChildren(); state.filteredEntries.forEach((entry) => { const button = document.createElement("button"); button.type = "button"; button.className = "planet-list-item"; button.dataset.elementId = entry.id; button.setAttribute("role", "option"); const isSelected = entry.id === state.selectedId; button.classList.toggle("is-selected", isSelected); button.setAttribute("aria-selected", isSelected ? "true" : "false"); const name = document.createElement("span"); name.className = "planet-list-name"; name.textContent = `${entry.symbol} ${entry.name}`.trim(); const meta = document.createElement("span"); meta.className = "planet-list-meta"; meta.textContent = `Letter: ${entry.hebrewLetter || "--"} · Ace: ${entry.aceCardName || "--"} · Court: ${entry.courtRank || "--"}`; button.append(name, meta); elements.listEl.appendChild(button); }); if (elements.countEl) { elements.countEl.textContent = `${state.filteredEntries.length} elements`; } if (!state.filteredEntries.length) { const empty = document.createElement("div"); empty.className = "planet-text"; empty.style.padding = "16px"; empty.style.color = "#71717a"; empty.textContent = "No elements match your search."; elements.listEl.appendChild(empty); } } function renderDetail(elements) { if (!elements?.detailNameEl || !elements.detailSubEl || !elements.detailBodyEl) { return; } const entry = findEntryById(state.selectedId); elements.detailBodyEl.replaceChildren(); if (!entry) { elements.detailNameEl.textContent = "--"; elements.detailSubEl.textContent = "Select an element to explore"; return; } elements.detailNameEl.textContent = `${entry.symbol} ${entry.name}`.trim(); elements.detailSubEl.textContent = "Classical Element"; const grid = document.createElement("div"); grid.className = "planet-meta-grid"; const detailsCard = document.createElement("div"); detailsCard.className = "planet-meta-card"; detailsCard.innerHTML = ` Element Details