(function () { "use strict"; function computeDigitalRoot(value) { let current = Math.abs(Math.trunc(Number(value))); if (!Number.isFinite(current)) { return null; } while (current >= 10) { current = String(current) .split("") .reduce((sum, digit) => sum + Number(digit), 0); } return current; } function describeDigitalRootReduction(value, digitalRoot) { const normalized = Math.abs(Math.trunc(Number(value))); if (!Number.isFinite(normalized) || !Number.isFinite(digitalRoot)) { return ""; } if (normalized < 10) { return String(normalized); } return `${String(normalized).split("").join(" + ")} = ${digitalRoot}`; } function hasTarotAccess() { return window.TarotAppConfig?.hasTarotAccess?.() === true; } function renderPositionDigitalRootCard(letter, alphabet, context, orderLabel) { const index = Number(letter?.index); if (!Number.isFinite(index)) { return ""; } const position = Math.trunc(index); if (position <= 0) { return ""; } const digitalRoot = computeDigitalRoot(position); if (!Number.isFinite(digitalRoot)) { return ""; } const entries = Array.isArray(context.alphabets?.[alphabet]) ? context.alphabets[alphabet] : []; const countText = entries.length ? ` of ${entries.length}` : ""; const orderText = orderLabel ? ` (${orderLabel})` : ""; const reductionText = describeDigitalRootReduction(position, digitalRoot); const openNumberBtn = context.inlineNavBtn(`${digitalRoot}`, "nav:number", { value: digitalRoot }); return context.card("Position Digital Root", `
Position
#${position}${countText}${orderText}
Digital Root
${openNumberBtn}${reductionText ? ` (${reductionText})` : ""}
`); } function monthRefsForLetter(letter, context) { const hebrewLetterId = context.normalizeId(letter?.hebrewLetterId); if (!hebrewLetterId) { return []; } return context.monthRefsByHebrewId.get(hebrewLetterId) || []; } function calendarMonthsCard(monthRefs, titleLabel, context) { if (!monthRefs.length) { return ""; } const monthButtons = monthRefs .map((month) => context.inlineNavBtn(month.label || month.name, "nav:calendar-month", { "month-id": month.id })) .join(", "); return context.card("Calendar Months", `
${titleLabel} ${monthButtons}
`); } function renderAstrologyCard(astrology, context) { if (!astrology) return ""; const { type, name } = astrology; const id = (name || "").toLowerCase(); if (type === "planet") { const sym = context.PLANET_SYMBOLS[id] || ""; const cubePlacement = context.getCubePlacementForPlanet(id); const cubeBtn = context.cubePlacementInlineBtn(cubePlacement, { "planet-id": id }); return context.card("Astrology", `
Type
Planet
Ruler
${sym} ${context.inlineNavBtn(context.cap(id), "nav:planet", { "planet-id": id })}
${cubeBtn ? `
Cube placement ${cubeBtn}
` : ""} `); } if (type === "zodiac") { const sym = context.ZODIAC_SYMBOLS[id] || ""; const cubePlacement = context.getCubePlacementForSign(id); const cubeBtn = context.cubePlacementInlineBtn(cubePlacement, { "sign-id": id }); return context.card("Astrology", `
Type
Zodiac Sign
Sign
${sym} ${context.inlineNavBtn(context.cap(id), "nav:zodiac", { "sign-id": id })}
${cubeBtn ? `
Cube placement ${cubeBtn}
` : ""} `); } if (type === "element") { const elemEmoji = { air: "💨", water: "💧", fire: "🔥", earth: "🌍" }; return context.card("Astrology", `
Type
Element
Element
${elemEmoji[id] || ""} ${context.inlineNavBtn(context.cap(id), "nav:elements", { "element-id": id })}
`); } return context.card("Astrology", `
Type
${context.cap(type)}
Name
${context.cap(name)}
`); } function renderElementOrPlanetValue(value, context) { const token = context.normalizeId(value); if (!token) { return "—"; } if (context.PLANET_SYMBOLS[token]) { return `${context.PLANET_SYMBOLS[token]} ${context.inlineNavBtn(context.cap(token), "nav:planet", { "planet-id": token })}`; } if (["air", "water", "fire", "earth"].includes(token)) { return context.inlineNavBtn(context.cap(token), "nav:elements", { "element-id": token }); } return value || "—"; } function renderTarotValue(value, context) { if (!hasTarotAccess()) { return ""; } const label = String(value || "").trim(); if (!label) { return "—"; } return context.inlineNavBtn(label, "nav:tarot-trump", { "card-name": label }); } function renderHebrewDualityCard(letter, context) { const duality = context.HEBREW_DOUBLE_DUALITY[context.normalizeId(letter?.hebrewLetterId)]; if (!duality) { return ""; } return context.card("Duality", `
Polarity
${duality.left} / ${duality.right}
`); } function renderHebrewFourWorldsCard(letter, context) { const letterId = context.normalizeLetterId(letter?.hebrewLetterId || letter?.transliteration || letter?.char); if (!letterId) { return ""; } const rows = (Array.isArray(context.fourWorldLayers) ? context.fourWorldLayers : []) .filter((entry) => entry?.hebrewLetterId === letterId); if (!rows.length) { return ""; } const body = rows.map((entry) => { const pathBtn = Number.isFinite(Number(entry?.pathNumber)) ? context.inlineNavBtn(`Path ${entry.pathNumber}`, "nav:kabbalah-path", { "path-no": Number(entry.pathNumber) }) : ""; return `
${entry.slot}: ${entry.letterChar} — ${entry.world} ${entry.soulLayer}
${entry.worldLayer}${entry.worldDescription ? ` · ${entry.worldDescription}` : ""}
${entry.soulLayer}${entry.soulTitle ? ` — ${entry.soulTitle}` : ""}${entry.soulDescription ? `: ${entry.soulDescription}` : ""}
${pathBtn ? `
Linked path ${pathBtn}
` : ""}
`; }).join(""); return context.card("Qabalistic Worlds & Soul Layers", `
${body}
`); } function normalizeLatinLetter(value) { return String(value || "") .trim() .toUpperCase() .replace(/[^A-Z]/g, ""); } const GREEK_NATIVE_NAMES = { alpha: { classical: "ἄλφα", koine: "άλφα" }, beta: { classical: "βῆτα", koine: "βήτα" }, gamma: { classical: "γάμμα", koine: "γάμμα" }, delta: { classical: "δέλτα", koine: "δέλτα" }, epsilon: { classical: "ἒ ψιλόν", koine: "έψιλον" }, zeta: { classical: "ζῆτα", koine: "ζήτα" }, eta: { classical: "ἦτα", koine: "ήτα" }, theta: { classical: "θῆτα", koine: "θήτα" }, iota: { classical: "ἰῶτα", koine: "ιώτα" }, kappa: { classical: "κάππα", koine: "κάππα" }, lambda: { classical: "λάμβδα", koine: "λάμδα" }, mu: { classical: "μῦ", koine: "μι" }, nu: { classical: "νῦ", koine: "νι" }, xi: { classical: "ξῖ", koine: "ξι" }, omicron: { classical: "ὂ μικρόν", koine: "όμικρον" }, pi: { classical: "πῖ", koine: "πι" }, rho: { classical: "ῥῶ", koine: "ρω" }, sigma: { classical: "σῖγμα", koine: "σίγμα" }, tau: { classical: "ταῦ", koine: "ταυ" }, upsilon: { classical: "ὖ ψιλόν", koine: "ύψιλον" }, phi: { classical: "φῖ", koine: "φι" }, chi: { classical: "χῖ", koine: "χι" }, psi: { classical: "ψῖ", koine: "ψι" }, omega: { classical: "ὦ μέγα", koine: "ωμέγα" }, digamma: { classical: "δίγαμμα", koine: "δίγαμμα" }, qoppa: { classical: "κόππα", koine: "κόππα" }, sampi: { classical: "σαμπί", koine: "σαμπί" } }; const GREEK_TRANSLITERATIONS = { alpha: { classical: "A", koine: "A" }, beta: { classical: "B", koine: "V" }, gamma: { classical: "G", koine: "G" }, delta: { classical: "D", koine: "Th" }, epsilon: { classical: "E", koine: "E" }, zeta: { classical: "Z", koine: "Z" }, eta: { classical: "E", koine: "I" }, theta: { classical: "Th", koine: "Th" }, iota: { classical: "I", koine: "I" }, kappa: { classical: "K", koine: "K" }, lambda: { classical: "L", koine: "L" }, mu: { classical: "M", koine: "M" }, nu: { classical: "N", koine: "N" }, xi: { classical: "X", koine: "X" }, omicron: { classical: "O", koine: "O" }, pi: { classical: "P", koine: "P" }, rho: { classical: "R", koine: "R" }, sigma: { classical: "S", koine: "S" }, tau: { classical: "T", koine: "T" }, upsilon: { classical: "U/Y", koine: "I" }, phi: { classical: "Ph", koine: "F" }, chi: { classical: "Kh/Ch", koine: "Ch" }, psi: { classical: "Ps", koine: "Ps" }, omega: { classical: "O", koine: "O" }, digamma: { classical: "W", koine: "V" }, qoppa: { classical: "Q", koine: "Q" }, sampi: { classical: "Ss/Ts", koine: "Ss/Ts" } }; const HEBREW_NATIVE_NAMES = { alef: "אלף", bet: "בית", gimel: "גימל", dalet: "דלת", he: "הא", vav: "וו", zayin: "זין", het: "חית", tet: "טית", yod: "יוד", kaf: "כף", lamed: "למד", mem: "מם", nun: "נון", samekh: "סמך", ayin: "עין", pe: "פה", tsadi: "צדי", qof: "קוף", resh: "ריש", shin: "שין", tav: "תו" }; function greekNativeNamesByLetter(letter) { const key = String(letter?.name || "").trim().toLowerCase(); const names = GREEK_NATIVE_NAMES[key]; if (!names) { return { classical: "", koine: "" }; } return { classical: String(names.classical || "").trim(), koine: String(names.koine || "").trim() }; } function formatGreekNativeNamesByLetter(letter) { const names = greekNativeNamesByLetter(letter); if (names.classical && names.koine && names.classical !== names.koine) { return `${names.classical} / ${names.koine}`; } return names.classical || names.koine || ""; } function toGreekUppercase(value) { return String(value || "") .normalize("NFD") .replace(/[\u0300-\u036f]/g, "") .toUpperCase(); } function formatGreekNativeUppercaseByLetter(letter) { const names = greekNativeNamesByLetter(letter); const classicalName = toGreekUppercase(names.classical); const koineName = toGreekUppercase(names.koine); if (classicalName && koineName && classicalName !== koineName) { return `${classicalName} / ${koineName}`; } return classicalName || koineName || ""; } function greekTransliterationVariantsByLetter(letter) { const key = String(letter?.name || "").trim().toLowerCase(); const variants = GREEK_TRANSLITERATIONS[key]; if (!variants) { const fallback = String(letter?.transliteration || "").trim(); return { classical: fallback, koine: fallback }; } return { classical: String(variants.classical || "").trim(), koine: String(variants.koine || "").trim() }; } function formatGreekTransliterationByLetter(letter) { const variants = greekTransliterationVariantsByLetter(letter); if (variants.classical && variants.koine && variants.classical !== variants.koine) { return `${variants.classical} / ${variants.koine}`; } return variants.classical || variants.koine || String(letter?.transliteration || "").trim(); } function greekPlaceValueByIndex(index) { const value = Number(index); if (!Number.isFinite(value)) { return null; } const position = Math.trunc(value); if (position <= 0) { return null; } if (position <= 9) { return position; } if (position <= 18) { return (position - 9) * 10; } return (position - 18) * 100; } function buildGreekGematriaMap(alphabets, mode = "orderly") { const map = new Map(); const greekClassical = Array.isArray(alphabets?.greek) ? alphabets.greek : []; const greekArchaic = Array.isArray(alphabets?.greekArchaic) ? alphabets.greekArchaic : []; [...greekClassical, ...greekArchaic].forEach((entry) => { const usePlaceValue = mode === "place-value"; const value = usePlaceValue && !entry?.archaic ? greekPlaceValueByIndex(entry?.index) : Number(entry?.numerology); if (!Number.isFinite(value)) { return; } [entry?.char, entry?.charLower, entry?.charFinal].forEach((glyph) => { const key = String(glyph || "").trim(); if (!key) { return; } map.set(key, Math.trunc(value)); }); }); if (!map.has("ς") && map.has("σ")) { map.set("ς", map.get("σ")); } return map; } function buildHebrewGematriaMap(alphabets) { const map = new Map(); const hebrewLetters = Array.isArray(alphabets?.hebrew) ? alphabets.hebrew : []; hebrewLetters.forEach((entry) => { const value = Number(entry?.numerology); const glyph = String(entry?.char || "").trim(); if (!glyph || !Number.isFinite(value)) { return; } map.set(glyph, Math.trunc(value)); }); const finals = { ך: "כ", ם: "מ", ן: "נ", ף: "פ", ץ: "צ" }; Object.entries(finals).forEach(([finalForm, baseForm]) => { if (!map.has(finalForm) && map.has(baseForm)) { map.set(finalForm, map.get(baseForm)); } }); return map; } function computeNameGematria(name, valueMap, options = {}) { if (!(valueMap instanceof Map) || valueMap.size === 0) { return null; } const normalizeGreek = options?.normalizeGreek === true; const normalized = normalizeGreek ? String(name || "").normalize("NFD").replace(/[\u0300-\u036f]/g, "") : String(name || ""); let sum = 0; let matched = 0; for (const glyph of normalized) { const key = String(glyph || "").trim(); if (!key) { continue; } const value = valueMap.get(key); if (!Number.isFinite(value)) { continue; } sum += value; matched += 1; } if (!matched) { return null; } return sum; } function computeNameGematriaWithBreakdown(name, valueMap, options = {}) { if (!(valueMap instanceof Map) || valueMap.size === 0) { return null; } const normalizeGreek = options?.normalizeGreek === true; const normalized = normalizeGreek ? String(name || "").normalize("NFD").replace(/[\u0300-\u036f]/g, "") : String(name || ""); let total = 0; const parts = []; for (const glyph of normalized) { const key = String(glyph || "").trim(); if (!key) { continue; } const value = valueMap.get(key); if (!Number.isFinite(value)) { continue; } const numericValue = Math.trunc(value); total += numericValue; parts.push(`${key}(${numericValue})`); } if (!parts.length) { return null; } return { total, breakdown: `${parts.join(" + ")} = ${total}` }; } function hebrewNativeNameByLetter(letter) { const key = String(letter?.hebrewLetterId || "").trim().toLowerCase(); return HEBREW_NATIVE_NAMES[key] || ""; } function findGreekEquivalentForHebrew(letter, greekLetters) { const greekEquivalentKey = String(letter?.greekEquivalent || "").trim().toLowerCase(); if (greekEquivalentKey) { return greekLetters.find((entry) => String(entry?.name || "").trim().toLowerCase() === greekEquivalentKey) || null; } const hebrewId = String(letter?.hebrewLetterId || "").trim().toLowerCase(); if (!hebrewId) { return null; } return greekLetters.find((entry) => String(entry?.hebrewLetterId || "").trim().toLowerCase() === hebrewId) || null; } function extractEnglishLetterRefs(value) { if (Array.isArray(value)) { return [...new Set(value.map((entry) => normalizeLatinLetter(entry)).filter(Boolean))]; } return [...new Set( String(value || "") .split(/[\s,;|\/]+/) .map((entry) => normalizeLatinLetter(entry)) .filter(Boolean) )]; } function renderAlphabetEquivalentCard(activeAlphabet, letter, context) { const hebrewLetters = Array.isArray(context.alphabets?.hebrew) ? context.alphabets.hebrew : []; const greekClassicalLetters = Array.isArray(context.alphabets?.greek) ? context.alphabets.greek : []; const greekArchaicLetters = Array.isArray(context.alphabets?.greekArchaic) ? context.alphabets.greekArchaic : []; const greekLetters = [...greekClassicalLetters, ...greekArchaicLetters]; const englishLetters = Array.isArray(context.alphabets?.english) ? context.alphabets.english : []; const arabicLetters = Array.isArray(context.alphabets?.arabic) ? context.alphabets.arabic : []; const enochianLetters = Array.isArray(context.alphabets?.enochian) ? context.alphabets.enochian : []; const linkedHebrewIds = new Set(); const linkedEnglishLetters = new Set(); const buttons = []; function addHebrewId(value) { const id = context.normalizeId(value); if (id) { linkedHebrewIds.add(id); } } function addEnglishLetter(value) { const code = normalizeLatinLetter(value); if (!code) { return; } linkedEnglishLetters.add(code); englishLetters .filter((entry) => normalizeLatinLetter(entry?.letter) === code) .forEach((entry) => addHebrewId(entry?.hebrewLetterId)); } if (activeAlphabet === "hebrew") { addHebrewId(letter?.hebrewLetterId); } else if (activeAlphabet === "greek" || activeAlphabet === "greekArchaic") { addHebrewId(letter?.hebrewLetterId); englishLetters .filter((entry) => context.normalizeId(entry?.greekEquivalent) === context.normalizeId(letter?.name)) .forEach((entry) => addEnglishLetter(entry?.letter)); } else if (activeAlphabet === "english") { addEnglishLetter(letter?.letter); addHebrewId(letter?.hebrewLetterId); } else if (activeAlphabet === "arabic") { addHebrewId(letter?.hebrewLetterId); } else if (activeAlphabet === "enochian") { extractEnglishLetterRefs(letter?.englishLetters).forEach((code) => addEnglishLetter(code)); addHebrewId(letter?.hebrewLetterId); } if (!linkedHebrewIds.size && !linkedEnglishLetters.size) { return ""; } const activeHebrewKey = context.normalizeId(letter?.hebrewLetterId); const activeGreekKey = context.normalizeId(letter?.name); const activeEnglishKey = normalizeLatinLetter(letter?.letter); const activeArabicKey = context.normalizeId(letter?.name); const activeEnochianKey = context.normalizeId(letter?.id || letter?.char || letter?.title); hebrewLetters.forEach((heb) => { const key = context.normalizeId(heb?.hebrewLetterId); if (!key || !linkedHebrewIds.has(key)) { return; } if (activeAlphabet === "hebrew" && key === activeHebrewKey) { return; } buttons.push(``); }); greekLetters.forEach((grk) => { const key = context.normalizeId(grk?.name); const viaHebrew = linkedHebrewIds.has(context.normalizeId(grk?.hebrewLetterId)); const viaEnglish = englishLetters.some((eng) => ( linkedEnglishLetters.has(normalizeLatinLetter(eng?.letter)) && context.normalizeId(eng?.greekEquivalent) === key )); if (!(viaHebrew || viaEnglish)) { return; } const greekAlphabet = grk?.archaic ? "greekArchaic" : "greek"; if ((activeAlphabet === "greek" || activeAlphabet === "greekArchaic") && key === activeGreekKey) { return; } buttons.push(``); }); englishLetters.forEach((eng) => { const key = normalizeLatinLetter(eng?.letter); const viaLetter = linkedEnglishLetters.has(key); const viaHebrew = linkedHebrewIds.has(context.normalizeId(eng?.hebrewLetterId)); if (!(viaLetter || viaHebrew)) { return; } if (activeAlphabet === "english" && key === activeEnglishKey) { return; } buttons.push(``); }); arabicLetters.forEach((arb) => { const key = context.normalizeId(arb?.name); if (!linkedHebrewIds.has(context.normalizeId(arb?.hebrewLetterId))) { return; } if (activeAlphabet === "arabic" && key === activeArabicKey) { return; } buttons.push(``); }); enochianLetters.forEach((eno) => { const key = context.normalizeId(eno?.id || eno?.char || eno?.title); const englishRefs = extractEnglishLetterRefs(eno?.englishLetters); const viaHebrew = linkedHebrewIds.has(context.normalizeId(eno?.hebrewLetterId)); const viaEnglish = englishRefs.some((code) => linkedEnglishLetters.has(code)); if (!(viaHebrew || viaEnglish)) { return; } if (activeAlphabet === "enochian" && key === activeEnochianKey) { return; } buttons.push(``); }); if (!buttons.length) { return ""; } return context.card("ALPHABET EQUIVALENT", `
${buttons.join("")}
`); } function renderHebrewDetail(context) { const { letter, detailSubEl, detailBodyEl } = context; const greekClassicalLetters = Array.isArray(context.alphabets?.greek) ? context.alphabets.greek : []; const greekArchaicLetters = Array.isArray(context.alphabets?.greekArchaic) ? context.alphabets.greekArchaic : []; const greekLetters = [...greekClassicalLetters, ...greekArchaicLetters]; const greekEquivalent = findGreekEquivalentForHebrew(letter, greekLetters); const greekEquivalentNativeName = formatGreekNativeNamesByLetter(greekEquivalent); const hebrewNativeName = hebrewNativeNameByLetter(letter); const hebrewNameGematria = computeNameGematriaWithBreakdown(hebrewNativeName, buildHebrewGematriaMap(context.alphabets)); detailSubEl.textContent = `${letter.name} — ${letter.transliteration}`; detailBodyEl.innerHTML = ""; const sections = []; sections.push(context.card("Letter Details", `
Character
${letter.char}
Name (English)
${letter.name}
Name (Hebrew)
${hebrewNativeName || "—"}
Name Gematria (Hebrew)
${Number.isFinite(hebrewNameGematria?.total) ? hebrewNameGematria.total : "—"}
Name Gematria Breakdown (Hebrew)
${hebrewNameGematria?.breakdown || "—"}
Transliteration
${letter.transliteration}
Greek Equivalent
${greekEquivalent ? `${greekEquivalent.char} ${greekEquivalent.displayName}${greekEquivalentNativeName ? ` (${greekEquivalentNativeName})` : ""}` : "—"}
Meaning
${letter.meaning}
Gematria Value
${letter.numerology}
Letter Type
${letter.letterType}
Position
#${letter.index} of 22
`)); const positionRootCard = renderPositionDigitalRootCard(letter, "hebrew", context); if (positionRootCard) { sections.push(positionRootCard); } if (letter.letterType === "double") { const dualityCard = renderHebrewDualityCard(letter, context); if (dualityCard) { sections.push(dualityCard); } } const fourWorldsCard = renderHebrewFourWorldsCard(letter, context); if (fourWorldsCard) { sections.push(fourWorldsCard); } if (letter.astrology) { sections.push(renderAstrologyCard(letter.astrology, context)); } if (letter.kabbalahPathNumber) { const tarotAccessEnabled = hasTarotAccess(); const kabBtn = context.inlineNavBtn(`Path ${letter.kabbalahPathNumber}`, "tarot:view-kab-path", { "path-number": letter.kabbalahPathNumber }); const tarotBtn = tarotAccessEnabled && letter.tarot ? context.inlineNavBtn(letter.tarot.card, "kab:view-trump", { "trump-number": letter.tarot.trumpNumber }) : ""; const cubePlacement = context.getCubePlacementForHebrewLetter(letter.hebrewLetterId, letter.kabbalahPathNumber); const cubeBtn = context.cubePlacementInlineBtn(cubePlacement, { "hebrew-letter-id": letter.hebrewLetterId, "path-no": letter.kabbalahPathNumber }); sections.push(context.card(tarotAccessEnabled ? "Kabbalah & Tarot" : "Kabbalah", `
Path Number
${kabBtn}
${tarotAccessEnabled && letter.tarot ? `
Tarot Card
${tarotBtn} (Trump ${letter.tarot.trumpNumber})
` : ""}
${cubeBtn ? `
Cube placement ${cubeBtn}
` : ""} `)); } const monthRefs = monthRefsForLetter(letter, context); const monthCard = calendarMonthsCard(monthRefs, `Calendar correspondences linked to ${letter.name}.`, context); if (monthCard) { sections.push(monthCard); } const equivalentsCard = renderAlphabetEquivalentCard("hebrew", letter, context); if (equivalentsCard) { sections.push(equivalentsCard); } detailBodyEl.innerHTML = sections.join(""); context.attachDetailListeners(); } function renderGreekDetail(context, alphabetKey = "greek") { const { letter, detailSubEl, detailBodyEl } = context; const archaicBadge = letter.archaic ? ' archaic' : ""; const setLabel = alphabetKey === "greekArchaic" ? "Archaic" : "Classical/Koine"; const greekNativeNames = greekNativeNamesByLetter(letter); const greekNativeNameCombined = formatGreekNativeNamesByLetter(letter); const greekNativeUppercase = formatGreekNativeUppercaseByLetter(letter); const greekClassicalUppercase = toGreekUppercase(greekNativeNames.classical); const greekKoineUppercase = toGreekUppercase(greekNativeNames.koine); const greekTranslit = greekTransliterationVariantsByLetter(letter); const greekTranslitCombined = formatGreekTransliterationByLetter(letter); const greekOrderlyMap = buildGreekGematriaMap(context.alphabets, "orderly"); const greekPlaceValueMap = buildGreekGematriaMap(context.alphabets, "place-value"); const greekClassicalNameGematriaOrderly = computeNameGematriaWithBreakdown(greekNativeNames.classical, greekOrderlyMap, { normalizeGreek: true }); const greekClassicalNameGematriaPlace = computeNameGematriaWithBreakdown(greekNativeNames.classical, greekPlaceValueMap, { normalizeGreek: true }); const greekKoineNameGematriaOrderly = computeNameGematriaWithBreakdown(greekNativeNames.koine, greekOrderlyMap, { normalizeGreek: true }); const greekKoineNameGematriaPlace = computeNameGematriaWithBreakdown(greekNativeNames.koine, greekPlaceValueMap, { normalizeGreek: true }); const orderlyLetterValue = Number.isFinite(Number(letter?.numerology)) ? Math.trunc(Number(letter.numerology)) : null; const placeLetterValue = letter?.archaic ? orderlyLetterValue : greekPlaceValueByIndex(letter?.index); detailSubEl.textContent = `${letter.displayName}${letter.archaic ? " (archaic)" : ""} — ${greekTranslitCombined} · ${setLabel}`; detailBodyEl.innerHTML = ""; const sections = []; const charRow = letter.charFinal ? `
Form (final)
${letter.charFinal}
` : ""; sections.push(context.card("Letter Details", `
Uppercase
${letter.char}
Lowercase
${letter.charLower || "—"}
${charRow}
Name (English)
${letter.displayName}${archaicBadge}
Name (Greek)
${greekNativeNameCombined || "—"}
Name (Greek Uppercase)
${greekNativeUppercase || "—"}
Name (Greek Classical)
${greekNativeNames.classical || "—"}
Name (Greek Classical Uppercase)
${greekClassicalUppercase || "—"}
Name (Greek Koine)
${greekNativeNames.koine || "—"}
Name (Greek Koine Uppercase)
${greekKoineUppercase || "—"}
Transliteration
${greekTranslitCombined || "—"}
Transliteration (Classical)
${greekTranslit.classical || "—"}
Transliteration (Koine)
${greekTranslit.koine || "—"}
IPA
${letter.ipa || "—"}
Isopsephy Value (Orderly)
${Number.isFinite(orderlyLetterValue) ? orderlyLetterValue : "—"}
Isopsephy Value (1-10-100)
${Number.isFinite(placeLetterValue) ? placeLetterValue : "—"}
Name Gematria (Greek Classical)
orderly ${Number.isFinite(greekClassicalNameGematriaOrderly?.total) ? greekClassicalNameGematriaOrderly.total : "—"} · 1-10-100 ${Number.isFinite(greekClassicalNameGematriaPlace?.total) ? greekClassicalNameGematriaPlace.total : "—"}
Name Breakdown (Greek Classical)
orderly: ${greekClassicalNameGematriaOrderly?.breakdown || "—"} · 1-10-100: ${greekClassicalNameGematriaPlace?.breakdown || "—"}
Name Gematria (Greek Koine)
orderly ${Number.isFinite(greekKoineNameGematriaOrderly?.total) ? greekKoineNameGematriaOrderly.total : "—"} · 1-10-100 ${Number.isFinite(greekKoineNameGematriaPlace?.total) ? greekKoineNameGematriaPlace.total : "—"}
Name Breakdown (Greek Koine)
orderly: ${greekKoineNameGematriaOrderly?.breakdown || "—"} · 1-10-100: ${greekKoineNameGematriaPlace?.breakdown || "—"}
Meaning / Origin
${letter.meaning || "—"}
`)); const positionRootCard = renderPositionDigitalRootCard(letter, alphabetKey, context); if (positionRootCard) { sections.push(positionRootCard); } const equivalentsCard = renderAlphabetEquivalentCard(alphabetKey, letter, context); if (equivalentsCard) { sections.push(equivalentsCard); } const monthRefs = monthRefsForLetter(letter, context); const monthCard = calendarMonthsCard(monthRefs, `Calendar correspondences inherited via ${letter.displayName}'s Hebrew origin.`, context); if (monthCard) { sections.push(monthCard); } detailBodyEl.innerHTML = sections.join(""); context.attachDetailListeners(); } function renderEnglishDetail(context) { const { letter, detailSubEl, detailBodyEl } = context; detailSubEl.textContent = `Letter ${letter.letter} · position #${letter.index}`; detailBodyEl.innerHTML = ""; const sections = []; sections.push(context.card("Letter Details", `
Letter
${letter.letter}
Position
#${letter.index} of 26
IPA
${letter.ipa || "—"}
Pythagorean Value
${letter.pythagorean}
`)); const positionRootCard = renderPositionDigitalRootCard(letter, "english", context); if (positionRootCard) { sections.push(positionRootCard); } const equivalentsCard = renderAlphabetEquivalentCard("english", letter, context); if (equivalentsCard) { sections.push(equivalentsCard); } const monthRefs = monthRefsForLetter(letter, context); const monthCard = calendarMonthsCard(monthRefs, "Calendar correspondences linked through this letter's Hebrew correspondence.", context); if (monthCard) { sections.push(monthCard); } detailBodyEl.innerHTML = sections.join(""); context.attachDetailListeners(); } function renderArabicDetail(context) { const { letter, detailSubEl, detailBodyEl } = context; detailSubEl.textContent = `${context.arabicDisplayName(letter)} — ${letter.transliteration}`; detailBodyEl.innerHTML = ""; const sections = []; const forms = letter.forms || {}; const formParts = [ forms.isolated ? `${forms.isolated}
isolated
` : "", forms.final ? `${forms.final}
final
` : "", forms.medial ? `${forms.medial}
medial
` : "", forms.initial ? `${forms.initial}
initial
` : "" ].filter(Boolean); sections.push(context.card("Letter Details", `
Arabic Name
${letter.nameArabic}
Transliteration
${letter.transliteration}
IPA
${letter.ipa || "—"}
Abjad Value
${letter.abjad}
Meaning
${letter.meaning || "—"}
Category
${letter.category}
Position
#${letter.index} of 28 (Abjad order)
`)); const positionRootCard = renderPositionDigitalRootCard(letter, "arabic", context, "Abjad order"); if (positionRootCard) { sections.push(positionRootCard); } if (formParts.length) { sections.push(context.card("Letter Forms", `
${formParts.join("")}
`)); } const equivalentsCard = renderAlphabetEquivalentCard("arabic", letter, context); if (equivalentsCard) { sections.push(equivalentsCard); } detailBodyEl.innerHTML = sections.join(""); context.attachDetailListeners(); } function renderEnochianDetail(context) { const { letter, detailSubEl, detailBodyEl } = context; const englishRefs = extractEnglishLetterRefs(letter?.englishLetters); detailSubEl.textContent = `${letter.title} — ${letter.transliteration}`; detailBodyEl.innerHTML = ""; const sections = []; sections.push(context.card("Letter Details", `
Character
${context.enochianGlyphImageHtml(letter, "alpha-enochian-glyph-img alpha-enochian-glyph-img--detail-row")}
Name
${letter.title}
English Letters
${englishRefs.join(" / ") || "—"}
Transliteration
${letter.transliteration || "—"}
Element / Planet
${renderElementOrPlanetValue(letter.elementOrPlanet, context)}
${hasTarotAccess() ? `
Tarot
${renderTarotValue(letter.tarot, context)}
` : ""}
Numerology
${letter.numerology || "—"}
Glyph Source
API asset: img/enochian (sourced from dCode set)
Position
#${letter.index} of 21
`)); const positionRootCard = renderPositionDigitalRootCard(letter, "enochian", context); if (positionRootCard) { sections.push(positionRootCard); } const equivalentsCard = renderAlphabetEquivalentCard("enochian", letter, context); if (equivalentsCard) { sections.push(equivalentsCard); } const monthRefs = monthRefsForLetter(letter, context); const monthCard = calendarMonthsCard(monthRefs, "Calendar correspondences linked through this letter's Hebrew correspondence.", context); if (monthCard) { sections.push(monthCard); } detailBodyEl.innerHTML = sections.join(""); context.attachDetailListeners(); } function renderDetail(context) { const alphabet = context.alphabet; if (alphabet === "hebrew") { renderHebrewDetail(context); } else if (alphabet === "greek" || alphabet === "greekArchaic") { renderGreekDetail(context, alphabet); } else if (alphabet === "english") { renderEnglishDetail(context); } else if (alphabet === "arabic") { renderArabicDetail(context); } else if (alphabet === "enochian") { renderEnochianDetail(context); } } window.AlphabetDetailUi = { renderDetail }; })();