Initial commit
2
.gitattributes
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
asset/tarot deck/** filter=lfs diff=lfs merge=lfs -text
|
||||||
|
asset/tarot[[:space:]]deck/** filter=lfs diff=lfs merge=lfs -text
|
||||||
3
.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
node_modules/
|
||||||
|
asset/tarot deck/*
|
||||||
|
asset\tarot deck\*
|
||||||
163
app/astro-calcs.js
Normal file
@@ -0,0 +1,163 @@
|
|||||||
|
(function () {
|
||||||
|
const DAY_IN_MS = 24 * 60 * 60 * 1000;
|
||||||
|
const START = ["sol", "luna", "mars", "mercury", "jupiter", "venus", "saturn"];
|
||||||
|
const CHALDEAN = ["saturn", "jupiter", "mars", "sol", "venus", "mercury", "luna"];
|
||||||
|
|
||||||
|
function toTitleCase(value) {
|
||||||
|
if (!value) return "";
|
||||||
|
return value.charAt(0).toUpperCase() + value.slice(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getDateKey(date) {
|
||||||
|
const year = date.getFullYear();
|
||||||
|
const month = String(date.getMonth() + 1).padStart(2, "0");
|
||||||
|
const day = String(date.getDate()).padStart(2, "0");
|
||||||
|
return `${year}-${month}-${day}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getCenteredWeekStartDay(date) {
|
||||||
|
return (date.getDay() + 4) % 7;
|
||||||
|
}
|
||||||
|
|
||||||
|
function minutesBetween(a, b) {
|
||||||
|
return (a.getTime() - b.getTime()) / 60000;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getMoonPhaseName(phase) {
|
||||||
|
if (phase < 0.03 || phase > 0.97) return "New Moon";
|
||||||
|
if (phase < 0.22) return "Waxing Crescent";
|
||||||
|
if (phase < 0.28) return "First Quarter";
|
||||||
|
if (phase < 0.47) return "Waxing Gibbous";
|
||||||
|
if (phase < 0.53) return "Full Moon";
|
||||||
|
if (phase < 0.72) return "Waning Gibbous";
|
||||||
|
if (phase < 0.78) return "Last Quarter";
|
||||||
|
return "Waning Crescent";
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseMonthDay(monthDay) {
|
||||||
|
const [month, day] = monthDay.split("-").map(Number);
|
||||||
|
return { month, day };
|
||||||
|
}
|
||||||
|
|
||||||
|
function isDateInSign(date, sign) {
|
||||||
|
const { month: startMonth, day: startDay } = parseMonthDay(sign.start);
|
||||||
|
const { month: endMonth, day: endDay } = parseMonthDay(sign.end);
|
||||||
|
const month = date.getMonth() + 1;
|
||||||
|
const day = date.getDate();
|
||||||
|
const wrapsYear = startMonth > endMonth;
|
||||||
|
|
||||||
|
if (!wrapsYear) {
|
||||||
|
const afterStart = month > startMonth || (month === startMonth && day >= startDay);
|
||||||
|
const beforeEnd = month < endMonth || (month === endMonth && day <= endDay);
|
||||||
|
return afterStart && beforeEnd;
|
||||||
|
}
|
||||||
|
|
||||||
|
const afterStart = month > startMonth || (month === startMonth && day >= startDay);
|
||||||
|
const beforeEnd = month < endMonth || (month === endMonth && day <= endDay);
|
||||||
|
return afterStart || beforeEnd;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSignStartDate(date, sign) {
|
||||||
|
const { month: startMonth, day: startDay } = parseMonthDay(sign.start);
|
||||||
|
const month = date.getMonth() + 1;
|
||||||
|
const day = date.getDate();
|
||||||
|
const wrapsYear = startMonth > parseMonthDay(sign.end).month;
|
||||||
|
|
||||||
|
let year = date.getFullYear();
|
||||||
|
if (wrapsYear && (month < startMonth || (month === startMonth && day < startDay))) {
|
||||||
|
year -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Date(year, startMonth - 1, startDay);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSignForDate(date, signs) {
|
||||||
|
return signs.find((sign) => isDateInSign(date, sign)) || null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function groupDecansBySign(decans) {
|
||||||
|
const map = {};
|
||||||
|
for (const decan of decans) {
|
||||||
|
if (!map[decan.signId]) {
|
||||||
|
map[decan.signId] = [];
|
||||||
|
}
|
||||||
|
map[decan.signId].push(decan);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const signId of Object.keys(map)) {
|
||||||
|
map[signId].sort((a, b) => a.index - b.index);
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getDecanForDate(date, signs, decansBySign) {
|
||||||
|
const sign = getSignForDate(date, signs);
|
||||||
|
if (!sign) return null;
|
||||||
|
|
||||||
|
const signDecans = decansBySign[sign.id] || [];
|
||||||
|
if (!signDecans.length) {
|
||||||
|
return { sign, decan: null };
|
||||||
|
}
|
||||||
|
|
||||||
|
const signStartDate = getSignStartDate(date, sign);
|
||||||
|
const daysSinceSignStart = Math.floor((date.getTime() - signStartDate.getTime()) / DAY_IN_MS);
|
||||||
|
let index = Math.floor(daysSinceSignStart / 10) + 1;
|
||||||
|
if (index < 1) index = 1;
|
||||||
|
if (index > 3) index = 3;
|
||||||
|
|
||||||
|
const decan = signDecans.find((entry) => entry.index === index) || signDecans[0];
|
||||||
|
return { sign, decan };
|
||||||
|
}
|
||||||
|
|
||||||
|
function calcPlanetaryHoursForDayAndLocation(date, geo) {
|
||||||
|
const sunCalc = window.SunCalc;
|
||||||
|
if (!sunCalc) {
|
||||||
|
throw new Error("SunCalc library is not loaded.");
|
||||||
|
}
|
||||||
|
|
||||||
|
const solar = sunCalc.getTimes(date, geo.latitude, geo.longitude);
|
||||||
|
const nextDay = new Date(date.getTime() + DAY_IN_MS);
|
||||||
|
const solarNext = sunCalc.getTimes(nextDay, geo.latitude, geo.longitude);
|
||||||
|
const dayOfWeek = date.getDay();
|
||||||
|
const chaldeanStartPos = CHALDEAN.indexOf(START[dayOfWeek]);
|
||||||
|
|
||||||
|
const dayHourInMinutes = minutesBetween(solar.sunset, solar.sunrise) / 12;
|
||||||
|
const nightHourInMinutes = minutesBetween(solarNext.sunrise, solar.sunset) / 12;
|
||||||
|
|
||||||
|
const hours = [];
|
||||||
|
for (let hour = 0; hour < 12; hour += 1) {
|
||||||
|
const start = new Date(solar.sunrise.getTime() + dayHourInMinutes * hour * 60_000);
|
||||||
|
const end = new Date(start.getTime() + dayHourInMinutes * 60_000);
|
||||||
|
hours.push({
|
||||||
|
start,
|
||||||
|
end,
|
||||||
|
planetId: CHALDEAN[(chaldeanStartPos + hour) % 7],
|
||||||
|
isDaylight: true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let hour = 12; hour < 24; hour += 1) {
|
||||||
|
const start = new Date(solar.sunset.getTime() + nightHourInMinutes * (hour - 12) * 60_000);
|
||||||
|
const end = new Date(start.getTime() + nightHourInMinutes * 60_000);
|
||||||
|
hours.push({
|
||||||
|
start,
|
||||||
|
end,
|
||||||
|
planetId: CHALDEAN[(chaldeanStartPos + hour) % 7],
|
||||||
|
isDaylight: false
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return hours;
|
||||||
|
}
|
||||||
|
|
||||||
|
window.TarotCalc = {
|
||||||
|
DAY_IN_MS,
|
||||||
|
toTitleCase,
|
||||||
|
getDateKey,
|
||||||
|
getCenteredWeekStartDay,
|
||||||
|
getMoonPhaseName,
|
||||||
|
groupDecansBySign,
|
||||||
|
getDecanForDate,
|
||||||
|
calcPlanetaryHoursForDayAndLocation
|
||||||
|
};
|
||||||
|
})();
|
||||||
96
app/calendar-events.js
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
(function () {
|
||||||
|
const {
|
||||||
|
DAY_IN_MS,
|
||||||
|
toTitleCase,
|
||||||
|
getMoonPhaseName,
|
||||||
|
getDecanForDate,
|
||||||
|
calcPlanetaryHoursForDayAndLocation
|
||||||
|
} = window.TarotCalc;
|
||||||
|
|
||||||
|
const PLANET_CALENDAR_IDS = new Set(["saturn", "jupiter", "mars", "sol", "venus", "mercury", "luna"]);
|
||||||
|
const BACKFILL_DAYS = 4;
|
||||||
|
const FORECAST_DAYS = 7;
|
||||||
|
|
||||||
|
function buildWeekEvents(geo, referenceData, anchorDate) {
|
||||||
|
const baseDate = anchorDate || new Date();
|
||||||
|
const events = [];
|
||||||
|
let runningId = 1;
|
||||||
|
|
||||||
|
for (let offset = -BACKFILL_DAYS; offset <= FORECAST_DAYS; offset += 1) {
|
||||||
|
const date = new Date(baseDate.getTime() + offset * DAY_IN_MS);
|
||||||
|
const hours = calcPlanetaryHoursForDayAndLocation(date, geo);
|
||||||
|
const moonIllum = window.SunCalc.getMoonIllumination(date);
|
||||||
|
const moonPhase = getMoonPhaseName(moonIllum.phase);
|
||||||
|
const sunInfo = getDecanForDate(date, referenceData.signs, referenceData.decansBySign);
|
||||||
|
|
||||||
|
const moonTarot = referenceData.planets.luna?.tarot?.majorArcana || "The High Priestess";
|
||||||
|
events.push({
|
||||||
|
id: `moon-${offset}`,
|
||||||
|
calendarId: "astrology",
|
||||||
|
category: "allday",
|
||||||
|
title: `Moon: ${moonPhase} (${Math.round(moonIllum.fraction * 100)}%) · ${moonTarot}`,
|
||||||
|
start: new Date(date.getFullYear(), date.getMonth(), date.getDate()),
|
||||||
|
end: new Date(date.getFullYear(), date.getMonth(), date.getDate(), 23, 59, 59),
|
||||||
|
isReadOnly: true
|
||||||
|
});
|
||||||
|
|
||||||
|
if (sunInfo?.sign) {
|
||||||
|
const rulerPlanet = referenceData.planets[sunInfo.sign.rulingPlanetId];
|
||||||
|
const bodyParts = [
|
||||||
|
`${sunInfo.sign.symbol} ${toTitleCase(sunInfo.sign.element)} ${toTitleCase(sunInfo.sign.modality)}`,
|
||||||
|
rulerPlanet ? `Sign ruler: ${rulerPlanet.symbol} ${rulerPlanet.name}` : `Sign ruler: ${sunInfo.sign.rulingPlanetId}`
|
||||||
|
];
|
||||||
|
|
||||||
|
if (sunInfo.decan) {
|
||||||
|
const decanRuler = referenceData.planets[sunInfo.decan.rulerPlanetId];
|
||||||
|
const decanText = decanRuler
|
||||||
|
? `Decan ${sunInfo.decan.index}: ${sunInfo.decan.tarotMinorArcana} (${decanRuler.symbol} ${decanRuler.name})`
|
||||||
|
: `Decan ${sunInfo.decan.index}: ${sunInfo.decan.tarotMinorArcana}`;
|
||||||
|
bodyParts.unshift(decanText);
|
||||||
|
}
|
||||||
|
|
||||||
|
events.push({
|
||||||
|
id: `sun-${offset}`,
|
||||||
|
calendarId: "astrology",
|
||||||
|
category: "allday",
|
||||||
|
title: `Sun in ${sunInfo.sign.name} · ${sunInfo.sign.tarot.majorArcana}`,
|
||||||
|
body: bodyParts.join("\n"),
|
||||||
|
start: new Date(date.getFullYear(), date.getMonth(), date.getDate()),
|
||||||
|
end: new Date(date.getFullYear(), date.getMonth(), date.getDate(), 23, 59, 59),
|
||||||
|
isReadOnly: true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const hour of hours) {
|
||||||
|
const planet = referenceData.planets[hour.planetId];
|
||||||
|
if (!planet) continue;
|
||||||
|
|
||||||
|
const calendarId = PLANET_CALENDAR_IDS.has(hour.planetId)
|
||||||
|
? `planet-${hour.planetId}`
|
||||||
|
: "planetary";
|
||||||
|
|
||||||
|
events.push({
|
||||||
|
id: `ph-${runningId++}`,
|
||||||
|
calendarId,
|
||||||
|
category: "time",
|
||||||
|
title: `${planet.symbol} ${planet.name} · ${planet.tarot.majorArcana}`,
|
||||||
|
body: `${planet.weekday} current · ${hour.isDaylight ? "Day" : "Night"} hour\n${planet.magickTypes}`,
|
||||||
|
raw: {
|
||||||
|
planetSymbol: planet.symbol,
|
||||||
|
planetName: planet.name,
|
||||||
|
tarotName: planet.tarot.majorArcana
|
||||||
|
},
|
||||||
|
start: hour.start,
|
||||||
|
end: hour.end,
|
||||||
|
isReadOnly: true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return events;
|
||||||
|
}
|
||||||
|
|
||||||
|
window.TarotEventBuilder = {
|
||||||
|
buildWeekEvents
|
||||||
|
};
|
||||||
|
})();
|
||||||
654
app/card-images.js
Normal file
@@ -0,0 +1,654 @@
|
|||||||
|
(function () {
|
||||||
|
const DEFAULT_DECK_ID = "ceremonial-magick";
|
||||||
|
|
||||||
|
const trumpNumberByCanonicalName = {
|
||||||
|
fool: 0,
|
||||||
|
magus: 1,
|
||||||
|
magician: 1,
|
||||||
|
"high priestess": 2,
|
||||||
|
empress: 3,
|
||||||
|
emperor: 4,
|
||||||
|
hierophant: 5,
|
||||||
|
lovers: 6,
|
||||||
|
chariot: 7,
|
||||||
|
lust: 8,
|
||||||
|
strength: 8,
|
||||||
|
hermit: 9,
|
||||||
|
fortune: 10,
|
||||||
|
"wheel of fortune": 10,
|
||||||
|
justice: 11,
|
||||||
|
"hanged man": 12,
|
||||||
|
death: 13,
|
||||||
|
art: 14,
|
||||||
|
temperance: 14,
|
||||||
|
devil: 15,
|
||||||
|
tower: 16,
|
||||||
|
star: 17,
|
||||||
|
moon: 18,
|
||||||
|
sun: 19,
|
||||||
|
aeon: 20,
|
||||||
|
judgement: 20,
|
||||||
|
judgment: 20,
|
||||||
|
universe: 21,
|
||||||
|
world: 21
|
||||||
|
};
|
||||||
|
|
||||||
|
const pipValueByToken = {
|
||||||
|
ace: 1,
|
||||||
|
two: 2,
|
||||||
|
three: 3,
|
||||||
|
four: 4,
|
||||||
|
five: 5,
|
||||||
|
six: 6,
|
||||||
|
seven: 7,
|
||||||
|
eight: 8,
|
||||||
|
nine: 9,
|
||||||
|
ten: 10,
|
||||||
|
"2": 2,
|
||||||
|
"3": 3,
|
||||||
|
"4": 4,
|
||||||
|
"5": 5,
|
||||||
|
"6": 6,
|
||||||
|
"7": 7,
|
||||||
|
"8": 8,
|
||||||
|
"9": 9,
|
||||||
|
"10": 10
|
||||||
|
};
|
||||||
|
|
||||||
|
const rankWordByPipValue = {
|
||||||
|
1: "Ace",
|
||||||
|
2: "Two",
|
||||||
|
3: "Three",
|
||||||
|
4: "Four",
|
||||||
|
5: "Five",
|
||||||
|
6: "Six",
|
||||||
|
7: "Seven",
|
||||||
|
8: "Eight",
|
||||||
|
9: "Nine",
|
||||||
|
10: "Ten"
|
||||||
|
};
|
||||||
|
|
||||||
|
const trumpRomanToNumber = {
|
||||||
|
I: 1,
|
||||||
|
II: 2,
|
||||||
|
III: 3,
|
||||||
|
IV: 4,
|
||||||
|
V: 5,
|
||||||
|
VI: 6,
|
||||||
|
VII: 7,
|
||||||
|
VIII: 8,
|
||||||
|
IX: 9,
|
||||||
|
X: 10,
|
||||||
|
XI: 11,
|
||||||
|
XII: 12,
|
||||||
|
XIII: 13,
|
||||||
|
XIV: 14,
|
||||||
|
XV: 15,
|
||||||
|
XVI: 16,
|
||||||
|
XVII: 17,
|
||||||
|
XVIII: 18,
|
||||||
|
XIX: 19,
|
||||||
|
XX: 20,
|
||||||
|
XXI: 21
|
||||||
|
};
|
||||||
|
|
||||||
|
const suitSearchAliasesById = {
|
||||||
|
wands: ["wands"],
|
||||||
|
cups: ["cups"],
|
||||||
|
swords: ["swords"],
|
||||||
|
disks: ["disks", "pentacles", "coins"]
|
||||||
|
};
|
||||||
|
|
||||||
|
const DECK_REGISTRY_PATH = "asset/tarot deck/decks.json";
|
||||||
|
|
||||||
|
const deckManifestSources = buildDeckManifestSources();
|
||||||
|
|
||||||
|
const manifestCache = new Map();
|
||||||
|
let activeDeckId = DEFAULT_DECK_ID;
|
||||||
|
|
||||||
|
function canonicalMajorName(cardName) {
|
||||||
|
return String(cardName || "")
|
||||||
|
.trim()
|
||||||
|
.toLowerCase()
|
||||||
|
.replace(/^the\s+/, "")
|
||||||
|
.replace(/\s+/g, " ");
|
||||||
|
}
|
||||||
|
|
||||||
|
function canonicalMinorName(cardName) {
|
||||||
|
const parsedMinor = parseMinorCard(cardName);
|
||||||
|
if (!parsedMinor) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
return `${String(parsedMinor.rankKey || "").trim().toLowerCase()} of ${parsedMinor.suitId}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
function toTitleCase(value) {
|
||||||
|
const normalized = String(value || "").trim().toLowerCase();
|
||||||
|
if (!normalized) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
return normalized.charAt(0).toUpperCase() + normalized.slice(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
function normalizeDeckId(deckId) {
|
||||||
|
const normalized = String(deckId || "").trim().toLowerCase();
|
||||||
|
if (deckManifestSources[normalized]) {
|
||||||
|
return normalized;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (deckManifestSources[DEFAULT_DECK_ID]) {
|
||||||
|
return DEFAULT_DECK_ID;
|
||||||
|
}
|
||||||
|
|
||||||
|
const fallbackId = Object.keys(deckManifestSources)[0];
|
||||||
|
return fallbackId || DEFAULT_DECK_ID;
|
||||||
|
}
|
||||||
|
|
||||||
|
function normalizeTrumpNumber(value) {
|
||||||
|
const parsed = Number(value);
|
||||||
|
if (!Number.isInteger(parsed) || parsed < 0 || parsed > 21) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return parsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseTrumpNumberKey(value) {
|
||||||
|
const normalized = String(value || "").trim().toUpperCase();
|
||||||
|
if (!normalized) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (/^\d+$/.test(normalized)) {
|
||||||
|
return normalizeTrumpNumber(Number(normalized));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Object.prototype.hasOwnProperty.call(trumpRomanToNumber, normalized)) {
|
||||||
|
return normalizeTrumpNumber(trumpRomanToNumber[normalized]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function normalizeSuitId(suitInput) {
|
||||||
|
const suit = String(suitInput || "").trim().toLowerCase();
|
||||||
|
if (suit === "pentacles") {
|
||||||
|
return "disks";
|
||||||
|
}
|
||||||
|
return suit;
|
||||||
|
}
|
||||||
|
|
||||||
|
function resolveDeckOptions(optionsOrDeckId) {
|
||||||
|
let resolvedDeckId = activeDeckId;
|
||||||
|
let trumpNumber = null;
|
||||||
|
|
||||||
|
if (typeof optionsOrDeckId === "string") {
|
||||||
|
resolvedDeckId = normalizeDeckId(optionsOrDeckId);
|
||||||
|
} else if (optionsOrDeckId && typeof optionsOrDeckId === "object") {
|
||||||
|
if (optionsOrDeckId.deckId) {
|
||||||
|
resolvedDeckId = normalizeDeckId(optionsOrDeckId.deckId);
|
||||||
|
}
|
||||||
|
trumpNumber = normalizeTrumpNumber(optionsOrDeckId.trumpNumber);
|
||||||
|
}
|
||||||
|
|
||||||
|
return { resolvedDeckId, trumpNumber };
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseMinorCard(cardName) {
|
||||||
|
const match = String(cardName || "")
|
||||||
|
.trim()
|
||||||
|
.match(/^(ace|two|three|four|five|six|seven|eight|nine|ten|knight|queen|prince|princess|king|page|[2-9]|10)\s+of\s+(cups|wands|swords|pentacles|disks)$/i);
|
||||||
|
|
||||||
|
if (!match) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const rankToken = String(match[1] || "").toLowerCase();
|
||||||
|
const suitId = normalizeSuitId(match[2]);
|
||||||
|
const pipValue = pipValueByToken[rankToken] ?? null;
|
||||||
|
|
||||||
|
if (Number.isFinite(pipValue)) {
|
||||||
|
const rankWord = rankWordByPipValue[pipValue] || "";
|
||||||
|
return {
|
||||||
|
suitId,
|
||||||
|
pipValue,
|
||||||
|
court: "",
|
||||||
|
rankWord,
|
||||||
|
rankKey: rankWord.toLowerCase()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const courtWord = toTitleCase(rankToken);
|
||||||
|
if (!courtWord) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
suitId,
|
||||||
|
pipValue: null,
|
||||||
|
court: rankToken,
|
||||||
|
rankWord: courtWord,
|
||||||
|
rankKey: rankToken
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function applyTemplate(template, variables) {
|
||||||
|
return String(template || "")
|
||||||
|
.replace(/\{([a-zA-Z0-9_]+)\}/g, (_, token) => {
|
||||||
|
const value = variables[token];
|
||||||
|
return value == null ? "" : String(value);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function readManifestJsonSync(path) {
|
||||||
|
try {
|
||||||
|
const request = new XMLHttpRequest();
|
||||||
|
request.open("GET", encodeURI(path), false);
|
||||||
|
request.send(null);
|
||||||
|
|
||||||
|
const okStatus = (request.status >= 200 && request.status < 300) || request.status === 0;
|
||||||
|
if (!okStatus || !request.responseText) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return JSON.parse(request.responseText);
|
||||||
|
} catch {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function toDeckSourceMap(sourceList) {
|
||||||
|
const sourceMap = {};
|
||||||
|
if (!Array.isArray(sourceList)) {
|
||||||
|
return sourceMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
sourceList.forEach((entry) => {
|
||||||
|
const id = String(entry?.id || "").trim().toLowerCase();
|
||||||
|
const basePath = String(entry?.basePath || "").trim().replace(/\/$/, "");
|
||||||
|
const manifestPath = String(entry?.manifestPath || "").trim();
|
||||||
|
if (!id || !basePath || !manifestPath) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sourceMap[id] = {
|
||||||
|
id,
|
||||||
|
label: String(entry?.label || id),
|
||||||
|
basePath,
|
||||||
|
manifestPath
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
return sourceMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildDeckManifestSources() {
|
||||||
|
const registry = readManifestJsonSync(DECK_REGISTRY_PATH);
|
||||||
|
const registryDecks = Array.isArray(registry)
|
||||||
|
? registry
|
||||||
|
: (Array.isArray(registry?.decks) ? registry.decks : null);
|
||||||
|
|
||||||
|
return toDeckSourceMap(registryDecks);
|
||||||
|
}
|
||||||
|
|
||||||
|
function normalizeDeckManifest(source, rawManifest) {
|
||||||
|
if (!rawManifest || typeof rawManifest !== "object") {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const rawNameOverrides = rawManifest.nameOverrides;
|
||||||
|
const nameOverrides = {};
|
||||||
|
if (rawNameOverrides && typeof rawNameOverrides === "object") {
|
||||||
|
Object.entries(rawNameOverrides).forEach(([rawKey, rawValue]) => {
|
||||||
|
const key = canonicalMajorName(rawKey);
|
||||||
|
const value = String(rawValue || "").trim();
|
||||||
|
if (key && value) {
|
||||||
|
nameOverrides[key] = value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const rawMajorNameOverridesByTrump = rawManifest.majorNameOverridesByTrump;
|
||||||
|
const majorNameOverridesByTrump = {};
|
||||||
|
if (rawMajorNameOverridesByTrump && typeof rawMajorNameOverridesByTrump === "object") {
|
||||||
|
Object.entries(rawMajorNameOverridesByTrump).forEach(([rawKey, rawValue]) => {
|
||||||
|
const trumpNumber = parseTrumpNumberKey(rawKey);
|
||||||
|
const value = String(rawValue || "").trim();
|
||||||
|
if (Number.isInteger(trumpNumber) && value) {
|
||||||
|
majorNameOverridesByTrump[trumpNumber] = value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const rawMinorNameOverrides = rawManifest.minorNameOverrides;
|
||||||
|
const minorNameOverrides = {};
|
||||||
|
if (rawMinorNameOverrides && typeof rawMinorNameOverrides === "object") {
|
||||||
|
Object.entries(rawMinorNameOverrides).forEach(([rawKey, rawValue]) => {
|
||||||
|
const key = canonicalMinorName(rawKey);
|
||||||
|
const value = String(rawValue || "").trim();
|
||||||
|
if (key && value) {
|
||||||
|
minorNameOverrides[key] = value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
id: source.id,
|
||||||
|
label: String(rawManifest.label || source.label || source.id),
|
||||||
|
basePath: String(source.basePath || "").replace(/\/$/, ""),
|
||||||
|
majors: rawManifest.majors || {},
|
||||||
|
minors: rawManifest.minors || {},
|
||||||
|
nameOverrides,
|
||||||
|
minorNameOverrides,
|
||||||
|
majorNameOverridesByTrump
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function getDeckManifest(deckId) {
|
||||||
|
const normalizedDeckId = normalizeDeckId(deckId);
|
||||||
|
if (manifestCache.has(normalizedDeckId)) {
|
||||||
|
return manifestCache.get(normalizedDeckId);
|
||||||
|
}
|
||||||
|
|
||||||
|
const source = deckManifestSources[normalizedDeckId];
|
||||||
|
if (!source) {
|
||||||
|
manifestCache.set(normalizedDeckId, null);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const rawManifest = readManifestJsonSync(source.manifestPath);
|
||||||
|
const normalizedManifest = normalizeDeckManifest(source, rawManifest);
|
||||||
|
manifestCache.set(normalizedDeckId, normalizedManifest);
|
||||||
|
return normalizedManifest;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getRankIndex(minorRule, parsedMinor) {
|
||||||
|
if (!minorRule || !parsedMinor) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const lowerRankWord = String(parsedMinor.rankWord || "").toLowerCase();
|
||||||
|
const lowerRankKey = String(parsedMinor.rankKey || "").toLowerCase();
|
||||||
|
|
||||||
|
const indexByKey = minorRule.rankIndexByKey;
|
||||||
|
if (indexByKey && typeof indexByKey === "object") {
|
||||||
|
const mapped = Number(indexByKey[lowerRankKey]);
|
||||||
|
if (Number.isInteger(mapped) && mapped >= 0) {
|
||||||
|
return mapped;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const rankOrder = Array.isArray(minorRule.rankOrder) ? minorRule.rankOrder : [];
|
||||||
|
for (let i = 0; i < rankOrder.length; i += 1) {
|
||||||
|
const candidate = String(rankOrder[i] || "").toLowerCase();
|
||||||
|
if (candidate && (candidate === lowerRankWord || candidate === lowerRankKey)) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function resolveMajorFile(manifest, canonicalName) {
|
||||||
|
const majorRule = manifest?.majors;
|
||||||
|
if (!majorRule || typeof majorRule !== "object") {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (majorRule.mode === "canonical-map") {
|
||||||
|
const cards = majorRule.cards || {};
|
||||||
|
const fileName = cards[canonicalName];
|
||||||
|
return typeof fileName === "string" && fileName ? fileName : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const trumpNo = trumpNumberByCanonicalName[canonicalName];
|
||||||
|
if (!Number.isInteger(trumpNo) || trumpNo < 0 || trumpNo > 21) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (majorRule.mode === "trump-map") {
|
||||||
|
const cards = majorRule.cards || {};
|
||||||
|
const fileName = cards[String(trumpNo)] ?? cards[trumpNo];
|
||||||
|
return typeof fileName === "string" && fileName ? fileName : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (majorRule.mode === "trump-template") {
|
||||||
|
const numberPad = Number.isInteger(majorRule.numberPad) ? majorRule.numberPad : 2;
|
||||||
|
const template = String(majorRule.template || "{number}.png");
|
||||||
|
const number = String(trumpNo).padStart(numberPad, "0");
|
||||||
|
return applyTemplate(template, {
|
||||||
|
trump: trumpNo,
|
||||||
|
number
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function resolveMinorFile(manifest, parsedMinor) {
|
||||||
|
const minorRule = manifest?.minors;
|
||||||
|
if (!minorRule || typeof minorRule !== "object") {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const rankIndex = getRankIndex(minorRule, parsedMinor);
|
||||||
|
if (!Number.isInteger(rankIndex) || rankIndex < 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (minorRule.mode === "suit-base-and-rank-order") {
|
||||||
|
const suitBaseRaw = Number(minorRule?.suitBase?.[parsedMinor.suitId]);
|
||||||
|
if (!Number.isFinite(suitBaseRaw)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const numberPad = Number.isInteger(minorRule.numberPad) ? minorRule.numberPad : 2;
|
||||||
|
const cardNumber = String(suitBaseRaw + rankIndex).padStart(numberPad, "0");
|
||||||
|
const suitWord = String(minorRule?.suitLabel?.[parsedMinor.suitId] || toTitleCase(parsedMinor.suitId));
|
||||||
|
const template = String(minorRule.template || "{number}_{rank} {suit}.webp");
|
||||||
|
|
||||||
|
return applyTemplate(template, {
|
||||||
|
number: cardNumber,
|
||||||
|
rank: parsedMinor.rankWord,
|
||||||
|
rankKey: parsedMinor.rankKey,
|
||||||
|
suit: suitWord,
|
||||||
|
suitId: parsedMinor.suitId,
|
||||||
|
index: rankIndex + 1
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (minorRule.mode === "suit-prefix-and-rank-order") {
|
||||||
|
const suitPrefix = minorRule?.suitPrefix?.[parsedMinor.suitId];
|
||||||
|
if (!suitPrefix) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const indexStart = Number.isInteger(minorRule.indexStart) ? minorRule.indexStart : 1;
|
||||||
|
const indexPad = Number.isInteger(minorRule.indexPad) ? minorRule.indexPad : 2;
|
||||||
|
const suitIndex = String(indexStart + rankIndex).padStart(indexPad, "0");
|
||||||
|
const template = String(minorRule.template || "{suit}{index}.png");
|
||||||
|
|
||||||
|
return applyTemplate(template, {
|
||||||
|
suit: suitPrefix,
|
||||||
|
suitId: parsedMinor.suitId,
|
||||||
|
index: suitIndex,
|
||||||
|
rank: parsedMinor.rankWord,
|
||||||
|
rankKey: parsedMinor.rankKey
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (minorRule.mode === "suit-base-number-template") {
|
||||||
|
const suitBaseRaw = Number(minorRule?.suitBase?.[parsedMinor.suitId]);
|
||||||
|
if (!Number.isFinite(suitBaseRaw)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const numberPad = Number.isInteger(minorRule.numberPad) ? minorRule.numberPad : 2;
|
||||||
|
const cardNumber = String(suitBaseRaw + rankIndex).padStart(numberPad, "0");
|
||||||
|
const template = String(minorRule.template || "{number}.png");
|
||||||
|
|
||||||
|
return applyTemplate(template, {
|
||||||
|
number: cardNumber,
|
||||||
|
suitId: parsedMinor.suitId,
|
||||||
|
rank: parsedMinor.rankWord,
|
||||||
|
rankKey: parsedMinor.rankKey,
|
||||||
|
index: rankIndex
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function resolveWithDeck(deckId, cardName) {
|
||||||
|
const manifest = getDeckManifest(deckId);
|
||||||
|
if (!manifest) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const canonical = canonicalMajorName(cardName);
|
||||||
|
const majorFile = resolveMajorFile(manifest, canonical);
|
||||||
|
if (majorFile) {
|
||||||
|
return `${manifest.basePath}/${majorFile}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
const parsedMinor = parseMinorCard(cardName);
|
||||||
|
if (!parsedMinor) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const minorFile = resolveMinorFile(manifest, parsedMinor);
|
||||||
|
if (!minorFile) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return `${manifest.basePath}/${minorFile}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
function resolveTarotCardImage(cardName) {
|
||||||
|
const activePath = resolveWithDeck(activeDeckId, cardName);
|
||||||
|
if (activePath) {
|
||||||
|
return encodeURI(activePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (activeDeckId !== DEFAULT_DECK_ID) {
|
||||||
|
const fallbackPath = resolveWithDeck(DEFAULT_DECK_ID, cardName);
|
||||||
|
if (fallbackPath) {
|
||||||
|
return encodeURI(fallbackPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function resolveDisplayNameWithDeck(deckId, cardName, trumpNumber) {
|
||||||
|
const manifest = getDeckManifest(deckId);
|
||||||
|
const fallbackName = String(cardName || "").trim();
|
||||||
|
if (!manifest) {
|
||||||
|
return fallbackName;
|
||||||
|
}
|
||||||
|
|
||||||
|
let resolvedTrumpNumber = normalizeTrumpNumber(trumpNumber);
|
||||||
|
if (!Number.isInteger(resolvedTrumpNumber)) {
|
||||||
|
const canonical = canonicalMajorName(cardName);
|
||||||
|
resolvedTrumpNumber = normalizeTrumpNumber(trumpNumberByCanonicalName[canonical]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Number.isInteger(resolvedTrumpNumber)) {
|
||||||
|
const byTrump = manifest?.majorNameOverridesByTrump?.[resolvedTrumpNumber];
|
||||||
|
if (byTrump) {
|
||||||
|
return byTrump;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const canonical = canonicalMajorName(cardName);
|
||||||
|
const override = manifest?.nameOverrides?.[canonical];
|
||||||
|
if (override) {
|
||||||
|
return override;
|
||||||
|
}
|
||||||
|
|
||||||
|
const minorKey = canonicalMinorName(cardName);
|
||||||
|
const minorOverride = manifest?.minorNameOverrides?.[minorKey];
|
||||||
|
if (minorOverride) {
|
||||||
|
return minorOverride;
|
||||||
|
}
|
||||||
|
|
||||||
|
return fallbackName;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTarotCardSearchAliases(cardName, optionsOrDeckId) {
|
||||||
|
const fallbackName = String(cardName || "").trim();
|
||||||
|
if (!fallbackName) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
const { resolvedDeckId, trumpNumber } = resolveDeckOptions(optionsOrDeckId);
|
||||||
|
const aliases = new Set();
|
||||||
|
aliases.add(fallbackName);
|
||||||
|
|
||||||
|
const displayName = String(resolveDisplayNameWithDeck(resolvedDeckId, fallbackName, trumpNumber) || "").trim();
|
||||||
|
if (displayName) {
|
||||||
|
aliases.add(displayName);
|
||||||
|
}
|
||||||
|
|
||||||
|
const canonicalMajor = canonicalMajorName(fallbackName);
|
||||||
|
const resolvedTrumpNumber = Number.isInteger(normalizeTrumpNumber(trumpNumber))
|
||||||
|
? normalizeTrumpNumber(trumpNumber)
|
||||||
|
: normalizeTrumpNumber(trumpNumberByCanonicalName[canonicalMajor]);
|
||||||
|
|
||||||
|
if (Number.isInteger(resolvedTrumpNumber)) {
|
||||||
|
aliases.add(canonicalMajor);
|
||||||
|
aliases.add(`the ${canonicalMajor}`);
|
||||||
|
aliases.add(`trump ${resolvedTrumpNumber}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const parsedMinor = parseMinorCard(fallbackName);
|
||||||
|
if (parsedMinor) {
|
||||||
|
const suitAliases = suitSearchAliasesById[parsedMinor.suitId] || [parsedMinor.suitId];
|
||||||
|
suitAliases.forEach((suitAlias) => {
|
||||||
|
aliases.add(`${parsedMinor.rankKey} of ${suitAlias}`);
|
||||||
|
if (Number.isInteger(parsedMinor.pipValue)) {
|
||||||
|
aliases.add(`${parsedMinor.pipValue} of ${suitAlias}`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return Array.from(aliases);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTarotCardDisplayName(cardName, optionsOrDeckId) {
|
||||||
|
const { resolvedDeckId, trumpNumber } = resolveDeckOptions(optionsOrDeckId);
|
||||||
|
|
||||||
|
return resolveDisplayNameWithDeck(resolvedDeckId, cardName, trumpNumber);
|
||||||
|
}
|
||||||
|
|
||||||
|
function setActiveDeck(deckId) {
|
||||||
|
activeDeckId = normalizeDeckId(deckId);
|
||||||
|
getDeckManifest(activeDeckId);
|
||||||
|
return activeDeckId;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getDeckOptions() {
|
||||||
|
return Object.values(deckManifestSources).map((source) => {
|
||||||
|
const manifest = getDeckManifest(source.id);
|
||||||
|
return {
|
||||||
|
id: source.id,
|
||||||
|
label: manifest?.label || source.label
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
document.addEventListener("settings:updated", (event) => {
|
||||||
|
const nextDeck = event?.detail?.settings?.tarotDeck;
|
||||||
|
setActiveDeck(nextDeck);
|
||||||
|
});
|
||||||
|
|
||||||
|
window.TarotCardImages = {
|
||||||
|
resolveTarotCardImage,
|
||||||
|
getTarotCardDisplayName,
|
||||||
|
getTarotCardSearchAliases,
|
||||||
|
setActiveDeck,
|
||||||
|
getDeckOptions,
|
||||||
|
getActiveDeck: () => activeDeckId
|
||||||
|
};
|
||||||
|
})();
|
||||||
372
app/data-service.js
Normal file
@@ -0,0 +1,372 @@
|
|||||||
|
(function () {
|
||||||
|
let magickManifestCache = null;
|
||||||
|
let magickDataCache = null;
|
||||||
|
|
||||||
|
const DATA_ROOT = "data";
|
||||||
|
const MAGICK_ROOT = DATA_ROOT;
|
||||||
|
|
||||||
|
const TAROT_TRUMP_NUMBER_BY_NAME = {
|
||||||
|
"the fool": 0,
|
||||||
|
fool: 0,
|
||||||
|
"the magus": 1,
|
||||||
|
magus: 1,
|
||||||
|
magician: 1,
|
||||||
|
"the high priestess": 2,
|
||||||
|
"high priestess": 2,
|
||||||
|
"the empress": 3,
|
||||||
|
empress: 3,
|
||||||
|
"the emperor": 4,
|
||||||
|
emperor: 4,
|
||||||
|
"the hierophant": 5,
|
||||||
|
hierophant: 5,
|
||||||
|
"the lovers": 6,
|
||||||
|
lovers: 6,
|
||||||
|
"the chariot": 7,
|
||||||
|
chariot: 7,
|
||||||
|
strength: 8,
|
||||||
|
lust: 8,
|
||||||
|
"the hermit": 9,
|
||||||
|
hermit: 9,
|
||||||
|
fortune: 10,
|
||||||
|
"wheel of fortune": 10,
|
||||||
|
justice: 11,
|
||||||
|
"the hanged man": 12,
|
||||||
|
"hanged man": 12,
|
||||||
|
death: 13,
|
||||||
|
temperance: 14,
|
||||||
|
art: 14,
|
||||||
|
"the devil": 15,
|
||||||
|
devil: 15,
|
||||||
|
"the tower": 16,
|
||||||
|
tower: 16,
|
||||||
|
"the star": 17,
|
||||||
|
star: 17,
|
||||||
|
"the moon": 18,
|
||||||
|
moon: 18,
|
||||||
|
"the sun": 19,
|
||||||
|
sun: 19,
|
||||||
|
aeon: 20,
|
||||||
|
judgement: 20,
|
||||||
|
judgment: 20,
|
||||||
|
universe: 21,
|
||||||
|
world: 21,
|
||||||
|
"the world": 21
|
||||||
|
};
|
||||||
|
|
||||||
|
const HEBREW_BY_TRUMP_NUMBER = {
|
||||||
|
0: { hebrewLetterId: "alef", kabbalahPathNumber: 11 },
|
||||||
|
1: { hebrewLetterId: "bet", kabbalahPathNumber: 12 },
|
||||||
|
2: { hebrewLetterId: "gimel", kabbalahPathNumber: 13 },
|
||||||
|
3: { hebrewLetterId: "dalet", kabbalahPathNumber: 14 },
|
||||||
|
4: { hebrewLetterId: "he", kabbalahPathNumber: 15 },
|
||||||
|
5: { hebrewLetterId: "vav", kabbalahPathNumber: 16 },
|
||||||
|
6: { hebrewLetterId: "zayin", kabbalahPathNumber: 17 },
|
||||||
|
7: { hebrewLetterId: "het", kabbalahPathNumber: 18 },
|
||||||
|
8: { hebrewLetterId: "tet", kabbalahPathNumber: 19 },
|
||||||
|
9: { hebrewLetterId: "yod", kabbalahPathNumber: 20 },
|
||||||
|
10: { hebrewLetterId: "kaf", kabbalahPathNumber: 21 },
|
||||||
|
11: { hebrewLetterId: "lamed", kabbalahPathNumber: 22 },
|
||||||
|
12: { hebrewLetterId: "mem", kabbalahPathNumber: 23 },
|
||||||
|
13: { hebrewLetterId: "nun", kabbalahPathNumber: 24 },
|
||||||
|
14: { hebrewLetterId: "samekh", kabbalahPathNumber: 25 },
|
||||||
|
15: { hebrewLetterId: "ayin", kabbalahPathNumber: 26 },
|
||||||
|
16: { hebrewLetterId: "pe", kabbalahPathNumber: 27 },
|
||||||
|
17: { hebrewLetterId: "tsadi", kabbalahPathNumber: 28 },
|
||||||
|
18: { hebrewLetterId: "qof", kabbalahPathNumber: 29 },
|
||||||
|
19: { hebrewLetterId: "resh", kabbalahPathNumber: 30 },
|
||||||
|
20: { hebrewLetterId: "shin", kabbalahPathNumber: 31 },
|
||||||
|
21: { hebrewLetterId: "tav", kabbalahPathNumber: 32 }
|
||||||
|
};
|
||||||
|
|
||||||
|
const ICHING_PLANET_BY_PLANET_ID = {
|
||||||
|
sol: "Sun",
|
||||||
|
luna: "Moon",
|
||||||
|
mercury: "Mercury",
|
||||||
|
venus: "Venus",
|
||||||
|
mars: "Mars",
|
||||||
|
jupiter: "Jupiter",
|
||||||
|
saturn: "Saturn",
|
||||||
|
earth: "Earth",
|
||||||
|
uranus: "Uranus",
|
||||||
|
neptune: "Neptune",
|
||||||
|
pluto: "Pluto"
|
||||||
|
};
|
||||||
|
|
||||||
|
async function fetchJson(path) {
|
||||||
|
const response = await fetch(path);
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error(`Failed to load ${path} (${response.status})`);
|
||||||
|
}
|
||||||
|
return response.json();
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildObjectPath(target, pathParts, value) {
|
||||||
|
let cursor = target;
|
||||||
|
for (let index = 0; index < pathParts.length - 1; index += 1) {
|
||||||
|
const part = pathParts[index];
|
||||||
|
if (!cursor[part] || typeof cursor[part] !== "object") {
|
||||||
|
cursor[part] = {};
|
||||||
|
}
|
||||||
|
cursor = cursor[part];
|
||||||
|
}
|
||||||
|
cursor[pathParts[pathParts.length - 1]] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
function normalizeTarotName(value) {
|
||||||
|
return String(value || "")
|
||||||
|
.trim()
|
||||||
|
.toLowerCase()
|
||||||
|
.replace(/\s+/g, " ");
|
||||||
|
}
|
||||||
|
|
||||||
|
function resolveTarotTrumpNumber(cardName) {
|
||||||
|
const key = normalizeTarotName(cardName);
|
||||||
|
if (!key) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (Object.prototype.hasOwnProperty.call(TAROT_TRUMP_NUMBER_BY_NAME, key)) {
|
||||||
|
return TAROT_TRUMP_NUMBER_BY_NAME[key];
|
||||||
|
}
|
||||||
|
|
||||||
|
const withoutLeadingThe = key.replace(/^the\s+/, "");
|
||||||
|
if (Object.prototype.hasOwnProperty.call(TAROT_TRUMP_NUMBER_BY_NAME, withoutLeadingThe)) {
|
||||||
|
return TAROT_TRUMP_NUMBER_BY_NAME[withoutLeadingThe];
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function enrichAssociation(associations) {
|
||||||
|
if (!associations || typeof associations !== "object") {
|
||||||
|
return associations;
|
||||||
|
}
|
||||||
|
|
||||||
|
const next = { ...associations };
|
||||||
|
|
||||||
|
if (next.tarotCard) {
|
||||||
|
const trumpNumber = resolveTarotTrumpNumber(next.tarotCard);
|
||||||
|
if (trumpNumber != null) {
|
||||||
|
if (!Number.isFinite(Number(next.tarotTrumpNumber))) {
|
||||||
|
next.tarotTrumpNumber = trumpNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
const hebrew = HEBREW_BY_TRUMP_NUMBER[trumpNumber];
|
||||||
|
if (hebrew) {
|
||||||
|
if (!next.hebrewLetterId) {
|
||||||
|
next.hebrewLetterId = hebrew.hebrewLetterId;
|
||||||
|
}
|
||||||
|
if (!Number.isFinite(Number(next.kabbalahPathNumber))) {
|
||||||
|
next.kabbalahPathNumber = hebrew.kabbalahPathNumber;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const planetId = String(next.planetId || "").trim().toLowerCase();
|
||||||
|
if (!next.iChingPlanetaryInfluence && planetId) {
|
||||||
|
const influence = ICHING_PLANET_BY_PLANET_ID[planetId];
|
||||||
|
if (influence) {
|
||||||
|
next.iChingPlanetaryInfluence = influence;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return next;
|
||||||
|
}
|
||||||
|
|
||||||
|
function enrichCalendarMonth(month) {
|
||||||
|
const events = Array.isArray(month?.events)
|
||||||
|
? month.events.map((event) => ({
|
||||||
|
...event,
|
||||||
|
associations: enrichAssociation(event?.associations)
|
||||||
|
}))
|
||||||
|
: [];
|
||||||
|
|
||||||
|
return {
|
||||||
|
...month,
|
||||||
|
associations: enrichAssociation(month?.associations),
|
||||||
|
events
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function enrichCelestialHoliday(holiday) {
|
||||||
|
return {
|
||||||
|
...holiday,
|
||||||
|
associations: enrichAssociation(holiday?.associations)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function enrichCalendarHoliday(holiday) {
|
||||||
|
return {
|
||||||
|
...holiday,
|
||||||
|
associations: enrichAssociation(holiday?.associations)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
async function loadMagickManifest() {
|
||||||
|
if (magickManifestCache) {
|
||||||
|
return magickManifestCache;
|
||||||
|
}
|
||||||
|
|
||||||
|
magickManifestCache = await fetchJson(`${MAGICK_ROOT}/MANIFEST.json`);
|
||||||
|
return magickManifestCache;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function loadMagickDataset() {
|
||||||
|
if (magickDataCache) {
|
||||||
|
return magickDataCache;
|
||||||
|
}
|
||||||
|
|
||||||
|
const manifest = await loadMagickManifest();
|
||||||
|
const files = Array.isArray(manifest?.files) ? manifest.files : [];
|
||||||
|
const jsonFiles = files.filter((file) => file.endsWith(".json"));
|
||||||
|
|
||||||
|
const entries = await Promise.all(
|
||||||
|
jsonFiles.map(async (relativePath) => {
|
||||||
|
const data = await fetchJson(`${MAGICK_ROOT}/${relativePath}`);
|
||||||
|
return [relativePath, data];
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
const grouped = {};
|
||||||
|
entries.forEach(([relativePath, data]) => {
|
||||||
|
const noExtensionPath = relativePath.replace(/\.json$/i, "");
|
||||||
|
const pathParts = noExtensionPath.split("/").filter(Boolean);
|
||||||
|
if (!pathParts.length) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
buildObjectPath(grouped, pathParts, data);
|
||||||
|
});
|
||||||
|
|
||||||
|
magickDataCache = {
|
||||||
|
manifest,
|
||||||
|
grouped,
|
||||||
|
files: Object.fromEntries(entries)
|
||||||
|
};
|
||||||
|
|
||||||
|
return magickDataCache;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function loadReferenceData() {
|
||||||
|
const { groupDecansBySign } = window.TarotCalc;
|
||||||
|
const [
|
||||||
|
planetsJson,
|
||||||
|
signsJson,
|
||||||
|
decansJson,
|
||||||
|
sabianJson,
|
||||||
|
planetScienceJson,
|
||||||
|
iChingJson,
|
||||||
|
calendarMonthsJson,
|
||||||
|
celestialHolidaysJson,
|
||||||
|
calendarHolidaysJson,
|
||||||
|
astronomyCyclesJson,
|
||||||
|
tarotDatabaseJson,
|
||||||
|
hebrewCalendarJson,
|
||||||
|
islamicCalendarJson,
|
||||||
|
wheelOfYearJson
|
||||||
|
] = await Promise.all([
|
||||||
|
fetchJson(`${DATA_ROOT}/planetary-correspondences.json`),
|
||||||
|
fetchJson(`${DATA_ROOT}/signs.json`),
|
||||||
|
fetchJson(`${DATA_ROOT}/decans.json`),
|
||||||
|
fetchJson(`${DATA_ROOT}/sabian-symbols.json`),
|
||||||
|
fetchJson(`${DATA_ROOT}/planet-science.json`),
|
||||||
|
fetchJson(`${DATA_ROOT}/i-ching.json`),
|
||||||
|
fetchJson(`${DATA_ROOT}/calendar-months.json`),
|
||||||
|
fetchJson(`${DATA_ROOT}/celestial-holidays.json`),
|
||||||
|
fetchJson(`${DATA_ROOT}/calendar-holidays.json`).catch(() => ({})),
|
||||||
|
fetchJson(`${DATA_ROOT}/astronomy-cycles.json`).catch(() => ({})),
|
||||||
|
fetchJson(`${DATA_ROOT}/tarot-database.json`).catch(() => ({})),
|
||||||
|
fetchJson(`${DATA_ROOT}/hebrew-calendar.json`).catch(() => ({})),
|
||||||
|
fetchJson(`${DATA_ROOT}/islamic-calendar.json`).catch(() => ({})),
|
||||||
|
fetchJson(`${DATA_ROOT}/wheel-of-year.json`).catch(() => ({}))
|
||||||
|
]);
|
||||||
|
|
||||||
|
const planets = planetsJson.planets || {};
|
||||||
|
const signs = signsJson.signs || [];
|
||||||
|
const decans = decansJson.decans || [];
|
||||||
|
const sabianSymbols = Array.isArray(sabianJson?.symbols) ? sabianJson.symbols : [];
|
||||||
|
const planetScience = Array.isArray(planetScienceJson?.planets)
|
||||||
|
? planetScienceJson.planets
|
||||||
|
: [];
|
||||||
|
const iChing = {
|
||||||
|
trigrams: Array.isArray(iChingJson?.trigrams) ? iChingJson.trigrams : [],
|
||||||
|
hexagrams: Array.isArray(iChingJson?.hexagrams) ? iChingJson.hexagrams : [],
|
||||||
|
correspondences: {
|
||||||
|
meta: iChingJson?.correspondences?.meta && typeof iChingJson.correspondences.meta === "object"
|
||||||
|
? iChingJson.correspondences.meta
|
||||||
|
: {},
|
||||||
|
tarotToTrigram: Array.isArray(iChingJson?.correspondences?.tarotToTrigram)
|
||||||
|
? iChingJson.correspondences.tarotToTrigram
|
||||||
|
: []
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const calendarMonths = Array.isArray(calendarMonthsJson?.months)
|
||||||
|
? calendarMonthsJson.months.map((month) => enrichCalendarMonth(month))
|
||||||
|
: [];
|
||||||
|
|
||||||
|
const celestialHolidays = Array.isArray(celestialHolidaysJson?.holidays)
|
||||||
|
? celestialHolidaysJson.holidays.map((holiday) => enrichCelestialHoliday(holiday))
|
||||||
|
: [];
|
||||||
|
|
||||||
|
const calendarHolidays = Array.isArray(calendarHolidaysJson?.holidays)
|
||||||
|
? calendarHolidaysJson.holidays.map((holiday) => enrichCalendarHoliday(holiday))
|
||||||
|
: [];
|
||||||
|
|
||||||
|
const astronomyCycles = astronomyCyclesJson && typeof astronomyCyclesJson === "object"
|
||||||
|
? astronomyCyclesJson
|
||||||
|
: {};
|
||||||
|
|
||||||
|
const tarotDatabase = tarotDatabaseJson && typeof tarotDatabaseJson === "object"
|
||||||
|
? tarotDatabaseJson
|
||||||
|
: {};
|
||||||
|
|
||||||
|
const sourceMeanings = tarotDatabase.meanings && typeof tarotDatabase.meanings === "object"
|
||||||
|
? tarotDatabase.meanings
|
||||||
|
: {};
|
||||||
|
|
||||||
|
if (!sourceMeanings.majorByTrumpNumber || typeof sourceMeanings.majorByTrumpNumber !== "object") {
|
||||||
|
sourceMeanings.majorByTrumpNumber = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
const existingByCardName = sourceMeanings.byCardName && typeof sourceMeanings.byCardName === "object"
|
||||||
|
? sourceMeanings.byCardName
|
||||||
|
: {};
|
||||||
|
|
||||||
|
sourceMeanings.byCardName = existingByCardName;
|
||||||
|
|
||||||
|
tarotDatabase.meanings = sourceMeanings;
|
||||||
|
|
||||||
|
const hebrewCalendar = hebrewCalendarJson && typeof hebrewCalendarJson === "object"
|
||||||
|
? hebrewCalendarJson
|
||||||
|
: {};
|
||||||
|
const islamicCalendar = islamicCalendarJson && typeof islamicCalendarJson === "object"
|
||||||
|
? islamicCalendarJson
|
||||||
|
: {};
|
||||||
|
const wheelOfYear = wheelOfYearJson && typeof wheelOfYearJson === "object"
|
||||||
|
? wheelOfYearJson
|
||||||
|
: {};
|
||||||
|
|
||||||
|
return {
|
||||||
|
planets,
|
||||||
|
signs,
|
||||||
|
decansBySign: groupDecansBySign(decans),
|
||||||
|
sabianSymbols,
|
||||||
|
planetScience,
|
||||||
|
iChing,
|
||||||
|
calendarMonths,
|
||||||
|
celestialHolidays,
|
||||||
|
calendarHolidays,
|
||||||
|
astronomyCycles,
|
||||||
|
tarotDatabase,
|
||||||
|
hebrewCalendar,
|
||||||
|
islamicCalendar,
|
||||||
|
wheelOfYear
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
window.TarotDataService = {
|
||||||
|
loadReferenceData,
|
||||||
|
loadMagickManifest,
|
||||||
|
loadMagickDataset
|
||||||
|
};
|
||||||
|
})();
|
||||||
511
app/quiz-calendars.js
Normal file
@@ -0,0 +1,511 @@
|
|||||||
|
/* quiz-calendars.js — Dynamic quiz category plugin for calendar systems */
|
||||||
|
/* Registers Hebrew, Islamic, and Wheel of the Year quiz categories with the quiz engine */
|
||||||
|
(function () {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
// ----- shared utilities (mirrored from ui-quiz.js since they aren't exported) -----
|
||||||
|
|
||||||
|
function normalizeOption(value) {
|
||||||
|
return String(value || "").trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
function normalizeKey(value) {
|
||||||
|
return normalizeOption(value).toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
function toUniqueOptionList(values) {
|
||||||
|
const seen = new Set();
|
||||||
|
const unique = [];
|
||||||
|
(values || []).forEach((value) => {
|
||||||
|
const formatted = normalizeOption(value);
|
||||||
|
if (!formatted) return;
|
||||||
|
const key = normalizeKey(formatted);
|
||||||
|
if (seen.has(key)) return;
|
||||||
|
seen.add(key);
|
||||||
|
unique.push(formatted);
|
||||||
|
});
|
||||||
|
return unique;
|
||||||
|
}
|
||||||
|
|
||||||
|
function shuffle(list) {
|
||||||
|
const clone = list.slice();
|
||||||
|
for (let i = clone.length - 1; i > 0; i -= 1) {
|
||||||
|
const j = Math.floor(Math.random() * (i + 1));
|
||||||
|
[clone[i], clone[j]] = [clone[j], clone[i]];
|
||||||
|
}
|
||||||
|
return clone;
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildOptions(correctValue, poolValues) {
|
||||||
|
const correct = normalizeOption(correctValue);
|
||||||
|
if (!correct) return null;
|
||||||
|
const uniquePool = toUniqueOptionList(poolValues || []);
|
||||||
|
if (!uniquePool.some((v) => normalizeKey(v) === normalizeKey(correct))) {
|
||||||
|
uniquePool.push(correct);
|
||||||
|
}
|
||||||
|
const distractors = uniquePool.filter((v) => normalizeKey(v) !== normalizeKey(correct));
|
||||||
|
if (distractors.length < 3) return null;
|
||||||
|
const selected = shuffle(distractors).slice(0, 3);
|
||||||
|
const options = shuffle([correct, ...selected]);
|
||||||
|
const correctIndex = options.findIndex((v) => normalizeKey(v) === normalizeKey(correct));
|
||||||
|
if (correctIndex < 0 || options.length < 4) return null;
|
||||||
|
return { options, correctIndex };
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build a validated quiz question template.
|
||||||
|
* Returns null if there aren't enough distractors for a 4-choice question.
|
||||||
|
*/
|
||||||
|
function makeTemplate(key, categoryId, category, prompt, answer, pool) {
|
||||||
|
const correctStr = normalizeOption(answer);
|
||||||
|
const promptStr = normalizeOption(prompt);
|
||||||
|
if (!key || !categoryId || !promptStr || !correctStr) return null;
|
||||||
|
|
||||||
|
const uniquePool = toUniqueOptionList(pool || []);
|
||||||
|
if (!uniquePool.some((v) => normalizeKey(v) === normalizeKey(correctStr))) {
|
||||||
|
uniquePool.push(correctStr);
|
||||||
|
}
|
||||||
|
const distractorCount = uniquePool.filter((v) => normalizeKey(v) !== normalizeKey(correctStr)).length;
|
||||||
|
if (distractorCount < 3) return null;
|
||||||
|
|
||||||
|
return {
|
||||||
|
key,
|
||||||
|
categoryId,
|
||||||
|
category,
|
||||||
|
promptByDifficulty: promptStr,
|
||||||
|
answerByDifficulty: correctStr,
|
||||||
|
poolByDifficulty: uniquePool
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function ordinal(n) {
|
||||||
|
const num = Number(n);
|
||||||
|
if (!Number.isFinite(num)) return String(n);
|
||||||
|
const s = ["th", "st", "nd", "rd"];
|
||||||
|
const v = num % 100;
|
||||||
|
return num + (s[(v - 20) % 10] || s[v] || s[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getCalendarHolidayEntries(referenceData, calendarId) {
|
||||||
|
const all = Array.isArray(referenceData?.calendarHolidays) ? referenceData.calendarHolidays : [];
|
||||||
|
const target = String(calendarId || "").trim().toLowerCase();
|
||||||
|
return all.filter((holiday) => String(holiday?.calendarId || "").trim().toLowerCase() === target);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---- Hebrew Calendar Quiz --------------------------------------------------------
|
||||||
|
|
||||||
|
function buildHebrewCalendarQuiz(referenceData) {
|
||||||
|
const months = Array.isArray(referenceData?.hebrewCalendar?.months)
|
||||||
|
? referenceData.hebrewCalendar.months
|
||||||
|
: [];
|
||||||
|
|
||||||
|
if (months.length < 4) return [];
|
||||||
|
|
||||||
|
const bank = [];
|
||||||
|
const categoryId = "hebrew-calendar-months";
|
||||||
|
const category = "Hebrew Calendar";
|
||||||
|
|
||||||
|
const regularMonths = months.filter((m) => !m.leapYearOnly);
|
||||||
|
|
||||||
|
const namePool = toUniqueOptionList(regularMonths.map((m) => m.name));
|
||||||
|
const orderPool = toUniqueOptionList(regularMonths.map((m) => ordinal(m.order)));
|
||||||
|
const nativeNamePool = toUniqueOptionList(regularMonths.map((m) => m.nativeName).filter(Boolean));
|
||||||
|
const zodiacPool = toUniqueOptionList(
|
||||||
|
regularMonths.map((m) => m.zodiacSign ? m.zodiacSign.charAt(0).toUpperCase() + m.zodiacSign.slice(1) : "").filter(Boolean)
|
||||||
|
);
|
||||||
|
const tribePool = toUniqueOptionList(regularMonths.map((m) => m.tribe).filter(Boolean));
|
||||||
|
const sensePool = toUniqueOptionList(regularMonths.map((m) => m.sense).filter(Boolean));
|
||||||
|
|
||||||
|
regularMonths.forEach((month) => {
|
||||||
|
const name = month.name;
|
||||||
|
const orderStr = ordinal(month.order);
|
||||||
|
const nativeName = month.nativeName;
|
||||||
|
const zodiac = month.zodiacSign
|
||||||
|
? month.zodiacSign.charAt(0).toUpperCase() + month.zodiacSign.slice(1)
|
||||||
|
: null;
|
||||||
|
|
||||||
|
// "Which month is Nisan in the Hebrew calendar?" → "1st"
|
||||||
|
if (namePool.length >= 4 && orderPool.length >= 4) {
|
||||||
|
const t = makeTemplate(
|
||||||
|
`hebrew-month-order:${month.id}`,
|
||||||
|
categoryId,
|
||||||
|
category,
|
||||||
|
`${name} is the ___ month of the Hebrew religious year`,
|
||||||
|
orderStr,
|
||||||
|
orderPool
|
||||||
|
);
|
||||||
|
if (t) bank.push(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
// "The 1st month of the Hebrew calendar is" → "Nisan"
|
||||||
|
if (namePool.length >= 4 && orderPool.length >= 4) {
|
||||||
|
const t = makeTemplate(
|
||||||
|
`hebrew-order-to-name:${month.id}`,
|
||||||
|
categoryId,
|
||||||
|
category,
|
||||||
|
`The ${orderStr} month of the Hebrew religious year is`,
|
||||||
|
name,
|
||||||
|
namePool
|
||||||
|
);
|
||||||
|
if (t) bank.push(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Native name → month name
|
||||||
|
if (nativeName && nativeNamePool.length >= 4) {
|
||||||
|
const t = makeTemplate(
|
||||||
|
`hebrew-native-name:${month.id}`,
|
||||||
|
categoryId,
|
||||||
|
category,
|
||||||
|
`The Hebrew month written as "${nativeName}" is`,
|
||||||
|
name,
|
||||||
|
namePool
|
||||||
|
);
|
||||||
|
if (t) bank.push(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Zodiac association
|
||||||
|
if (zodiac && zodiacPool.length >= 4) {
|
||||||
|
const t = makeTemplate(
|
||||||
|
`hebrew-month-zodiac:${month.id}`,
|
||||||
|
categoryId,
|
||||||
|
category,
|
||||||
|
`The Hebrew month of ${name} corresponds to the zodiac sign`,
|
||||||
|
zodiac,
|
||||||
|
zodiacPool
|
||||||
|
);
|
||||||
|
if (t) bank.push(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tribe of Israel
|
||||||
|
if (month.tribe && tribePool.length >= 4) {
|
||||||
|
const t = makeTemplate(
|
||||||
|
`hebrew-month-tribe:${month.id}`,
|
||||||
|
categoryId,
|
||||||
|
category,
|
||||||
|
`The Hebrew month of ${name} is associated with the tribe of`,
|
||||||
|
month.tribe,
|
||||||
|
tribePool
|
||||||
|
);
|
||||||
|
if (t) bank.push(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sense
|
||||||
|
if (month.sense && sensePool.length >= 4) {
|
||||||
|
const t = makeTemplate(
|
||||||
|
`hebrew-month-sense:${month.id}`,
|
||||||
|
categoryId,
|
||||||
|
category,
|
||||||
|
`The sense associated with the Hebrew month of ${name} is`,
|
||||||
|
month.sense,
|
||||||
|
sensePool
|
||||||
|
);
|
||||||
|
if (t) bank.push(t);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Holiday repository-based questions (which month does X fall in?)
|
||||||
|
const monthNameById = new Map(regularMonths.map((month) => [String(month.id), month.name]));
|
||||||
|
const allObservances = getCalendarHolidayEntries(referenceData, "hebrew")
|
||||||
|
.map((holiday) => {
|
||||||
|
const monthName = monthNameById.get(String(holiday?.monthId || ""));
|
||||||
|
const obsName = String(holiday?.name || "").trim();
|
||||||
|
if (!monthName || !obsName) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return { obsName, monthName };
|
||||||
|
})
|
||||||
|
.filter(Boolean);
|
||||||
|
|
||||||
|
if (namePool.length >= 4) {
|
||||||
|
allObservances.forEach(({ obsName, monthName }) => {
|
||||||
|
const t = makeTemplate(
|
||||||
|
`hebrew-obs-month:${obsName.toLowerCase().replace(/\s+/g, "-").replace(/[^a-z0-9-]/g, "")}`,
|
||||||
|
categoryId,
|
||||||
|
category,
|
||||||
|
`${obsName} occurs in which Hebrew month`,
|
||||||
|
monthName,
|
||||||
|
namePool
|
||||||
|
);
|
||||||
|
if (t) bank.push(t);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return bank;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---- Islamic Calendar Quiz -------------------------------------------------------
|
||||||
|
|
||||||
|
function buildIslamicCalendarQuiz(referenceData) {
|
||||||
|
const months = Array.isArray(referenceData?.islamicCalendar?.months)
|
||||||
|
? referenceData.islamicCalendar.months
|
||||||
|
: [];
|
||||||
|
|
||||||
|
if (months.length < 4) return [];
|
||||||
|
|
||||||
|
const bank = [];
|
||||||
|
const categoryId = "islamic-calendar-months";
|
||||||
|
const category = "Islamic Calendar";
|
||||||
|
|
||||||
|
const namePool = toUniqueOptionList(months.map((m) => m.name));
|
||||||
|
const orderPool = toUniqueOptionList(months.map((m) => ordinal(m.order)));
|
||||||
|
const meaningPool = toUniqueOptionList(months.map((m) => m.meaning).filter(Boolean));
|
||||||
|
|
||||||
|
months.forEach((month) => {
|
||||||
|
const name = month.name;
|
||||||
|
const orderStr = ordinal(month.order);
|
||||||
|
|
||||||
|
// Order → name
|
||||||
|
const t1 = makeTemplate(
|
||||||
|
`islamic-order-to-name:${month.id}`,
|
||||||
|
categoryId,
|
||||||
|
category,
|
||||||
|
`The ${orderStr} month of the Islamic calendar is`,
|
||||||
|
name,
|
||||||
|
namePool
|
||||||
|
);
|
||||||
|
if (t1) bank.push(t1);
|
||||||
|
|
||||||
|
// Name → order
|
||||||
|
const t2 = makeTemplate(
|
||||||
|
`islamic-month-order:${month.id}`,
|
||||||
|
categoryId,
|
||||||
|
category,
|
||||||
|
`${name} is the ___ month of the Islamic calendar`,
|
||||||
|
orderStr,
|
||||||
|
orderPool
|
||||||
|
);
|
||||||
|
if (t2) bank.push(t2);
|
||||||
|
|
||||||
|
// Meaning of name
|
||||||
|
if (month.meaning && meaningPool.length >= 4) {
|
||||||
|
const t3 = makeTemplate(
|
||||||
|
`islamic-month-meaning:${month.id}`,
|
||||||
|
categoryId,
|
||||||
|
category,
|
||||||
|
`The name "${name}" in Arabic means`,
|
||||||
|
month.meaning,
|
||||||
|
meaningPool
|
||||||
|
);
|
||||||
|
if (t3) bank.push(t3);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sacred month identification
|
||||||
|
if (month.sacred) {
|
||||||
|
const yesNoPool = ["Yes — warfare prohibited", "No", "Partially sacred", "Conditionally sacred"];
|
||||||
|
const t4 = makeTemplate(
|
||||||
|
`islamic-sacred-${month.id}`,
|
||||||
|
categoryId,
|
||||||
|
category,
|
||||||
|
`Is ${name} one of the four sacred months (Al-Ashhur Al-Hurum)?`,
|
||||||
|
"Yes — warfare prohibited",
|
||||||
|
yesNoPool
|
||||||
|
);
|
||||||
|
if (t4) bank.push(t4);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Observance-based: "Ramadan is the Islamic month of ___" type
|
||||||
|
const observanceFacts = [
|
||||||
|
{ q: "The Islamic month of obligatory fasting (Sawm) is", a: "Ramadan" },
|
||||||
|
{ q: "Eid al-Fitr is celebrated in which Islamic month", a: "Shawwal" },
|
||||||
|
{ q: "Eid al-Adha falls in which Islamic month", a: "Dhu al-Hijja" },
|
||||||
|
{ q: "The Hajj pilgrimage takes place in which month", a: "Dhu al-Hijja" },
|
||||||
|
{ q: "The Prophet Muhammad's birth (Mawlid al-Nabi) is in", a: "Rabi' al-Awwal" },
|
||||||
|
{ q: "Ashura falls in which Islamic month", a: "Muharram" },
|
||||||
|
{ q: "Laylat al-Mi'raj (Night of Ascension) is in which month", a: "Rajab" },
|
||||||
|
{ q: "The Islamic New Year (Hijri New Year) begins in", a: "Muharram" }
|
||||||
|
];
|
||||||
|
|
||||||
|
observanceFacts.forEach(({ q, a }) => {
|
||||||
|
if (namePool.some((n) => normalizeKey(n) === normalizeKey(a))) {
|
||||||
|
const t = makeTemplate(
|
||||||
|
`islamic-fact:${q.slice(0, 30).toLowerCase().replace(/\s+/g, "-").replace(/[^a-z0-9-]/g, "")}`,
|
||||||
|
categoryId,
|
||||||
|
category,
|
||||||
|
q,
|
||||||
|
a,
|
||||||
|
namePool
|
||||||
|
);
|
||||||
|
if (t) bank.push(t);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return bank;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---- Wheel of the Year Quiz ------------------------------------------------------
|
||||||
|
|
||||||
|
function buildWheelOfYearQuiz(referenceData) {
|
||||||
|
const months = Array.isArray(referenceData?.wheelOfYear?.months)
|
||||||
|
? referenceData.wheelOfYear.months
|
||||||
|
: [];
|
||||||
|
|
||||||
|
if (months.length < 4) return [];
|
||||||
|
|
||||||
|
const bank = [];
|
||||||
|
const categoryId = "wheel-of-year";
|
||||||
|
const category = "Wheel of the Year";
|
||||||
|
|
||||||
|
const namePool = toUniqueOptionList(months.map((m) => m.name));
|
||||||
|
const typePool = toUniqueOptionList(months.map((m) => m.type ? m.type.charAt(0).toUpperCase() + m.type.slice(1) : "").filter(Boolean));
|
||||||
|
const elementPool = toUniqueOptionList(
|
||||||
|
months.map((m) => m.element || (m.associations && m.associations.element) || "").filter(Boolean)
|
||||||
|
);
|
||||||
|
const datePool = toUniqueOptionList(months.map((m) => m.date).filter(Boolean));
|
||||||
|
|
||||||
|
months.forEach((month) => {
|
||||||
|
const name = month.name;
|
||||||
|
const date = month.date;
|
||||||
|
const element = month.element || "";
|
||||||
|
const direction = month.associations?.direction || "";
|
||||||
|
const directionPool = toUniqueOptionList(months.map((m) => m.associations?.direction || "").filter(Boolean));
|
||||||
|
|
||||||
|
// Date → Sabbat name
|
||||||
|
if (date && datePool.length >= 4) {
|
||||||
|
const t1 = makeTemplate(
|
||||||
|
`wheel-date-name:${month.id}`,
|
||||||
|
categoryId,
|
||||||
|
category,
|
||||||
|
`The Sabbat on ${date} is`,
|
||||||
|
name,
|
||||||
|
namePool
|
||||||
|
);
|
||||||
|
if (t1) bank.push(t1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sabbat name → date
|
||||||
|
if (date && datePool.length >= 4) {
|
||||||
|
const t2 = makeTemplate(
|
||||||
|
`wheel-name-date:${month.id}`,
|
||||||
|
categoryId,
|
||||||
|
category,
|
||||||
|
`${name} falls on`,
|
||||||
|
date,
|
||||||
|
datePool
|
||||||
|
);
|
||||||
|
if (t2) bank.push(t2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Festival type (solar / cross-quarter)
|
||||||
|
if (month.type && typePool.length >= 2) {
|
||||||
|
const capType = month.type.charAt(0).toUpperCase() + month.type.slice(1);
|
||||||
|
const t3 = makeTemplate(
|
||||||
|
`wheel-type:${month.id}`,
|
||||||
|
categoryId,
|
||||||
|
category,
|
||||||
|
`${name} is a ___ festival`,
|
||||||
|
capType,
|
||||||
|
typePool
|
||||||
|
);
|
||||||
|
if (t3) bank.push(t3);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Element association
|
||||||
|
if (element && elementPool.length >= 4) {
|
||||||
|
const t4 = makeTemplate(
|
||||||
|
`wheel-element:${month.id}`,
|
||||||
|
categoryId,
|
||||||
|
category,
|
||||||
|
`The primary element associated with ${name} is`,
|
||||||
|
element,
|
||||||
|
elementPool
|
||||||
|
);
|
||||||
|
if (t4) bank.push(t4);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Direction
|
||||||
|
if (direction && directionPool.length >= 4) {
|
||||||
|
const t5 = makeTemplate(
|
||||||
|
`wheel-direction:${month.id}`,
|
||||||
|
categoryId,
|
||||||
|
category,
|
||||||
|
`The direction associated with ${name} is`,
|
||||||
|
direction,
|
||||||
|
directionPool
|
||||||
|
);
|
||||||
|
if (t5) bank.push(t5);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deities pool question
|
||||||
|
const deities = Array.isArray(month.associations?.deities) ? month.associations.deities : [];
|
||||||
|
const allDeities = toUniqueOptionList(
|
||||||
|
months.flatMap((m) => Array.isArray(m.associations?.deities) ? m.associations.deities : [])
|
||||||
|
);
|
||||||
|
if (deities.length > 0 && allDeities.length >= 4) {
|
||||||
|
const mainDeity = deities[0];
|
||||||
|
const t6 = makeTemplate(
|
||||||
|
`wheel-deity:${month.id}`,
|
||||||
|
categoryId,
|
||||||
|
category,
|
||||||
|
`${mainDeity} is primarily associated with which Sabbat`,
|
||||||
|
name,
|
||||||
|
namePool
|
||||||
|
);
|
||||||
|
if (t6) bank.push(t6);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Fixed knowledge questions
|
||||||
|
const wheelFacts = [
|
||||||
|
{ q: "The Celtic New Year Sabbat is", a: "Samhain" },
|
||||||
|
{ q: "Which Sabbat marks the longest night of the year", a: "Yule (Winter Solstice)" },
|
||||||
|
{ q: "The Spring Equinox Sabbat is called", a: "Ostara (Spring Equinox)" },
|
||||||
|
{ q: "The Summer Solstice Sabbat is called", a: "Litha (Summer Solstice)" },
|
||||||
|
{ q: "Which Sabbat is the first harvest festival", a: "Lughnasadh" },
|
||||||
|
{ q: "The Autumn Equinox Sabbat is called", a: "Mabon (Autumn Equinox)" },
|
||||||
|
{ q: "Which Sabbat is associated with the goddess Brigid", a: "Imbolc" },
|
||||||
|
{ q: "Beltane celebrates the beginning of which season", a: "Summer" }
|
||||||
|
];
|
||||||
|
|
||||||
|
wheelFacts.forEach(({ q, a }, index) => {
|
||||||
|
const pool = index < 7 ? namePool : toUniqueOptionList(["Spring", "Summer", "Autumn / Fall", "Winter"]);
|
||||||
|
if (pool.some((p) => normalizeKey(p) === normalizeKey(a))) {
|
||||||
|
const t = makeTemplate(
|
||||||
|
`wheel-fact-${index}`,
|
||||||
|
categoryId,
|
||||||
|
category,
|
||||||
|
q,
|
||||||
|
a,
|
||||||
|
pool
|
||||||
|
);
|
||||||
|
if (t) bank.push(t);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return bank;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---- Registration ----------------------------------------------------------------
|
||||||
|
|
||||||
|
function registerCalendarQuizCategories() {
|
||||||
|
const { registerQuizCategory } = window.QuizSectionUi || {};
|
||||||
|
if (typeof registerQuizCategory !== "function") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
registerQuizCategory(
|
||||||
|
"hebrew-calendar-months",
|
||||||
|
"Hebrew Calendar",
|
||||||
|
(referenceData) => buildHebrewCalendarQuiz(referenceData)
|
||||||
|
);
|
||||||
|
|
||||||
|
registerQuizCategory(
|
||||||
|
"islamic-calendar-months",
|
||||||
|
"Islamic Calendar",
|
||||||
|
(referenceData) => buildIslamicCalendarQuiz(referenceData)
|
||||||
|
);
|
||||||
|
|
||||||
|
registerQuizCategory(
|
||||||
|
"wheel-of-year",
|
||||||
|
"Wheel of the Year",
|
||||||
|
(referenceData) => buildWheelOfYearQuiz(referenceData)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Register immediately — ui-quiz.js loads before this file
|
||||||
|
registerCalendarQuizCategories();
|
||||||
|
|
||||||
|
window.QuizCalendarsPlugin = {
|
||||||
|
registerCalendarQuizCategories
|
||||||
|
};
|
||||||
|
})();
|
||||||
3560
app/styles.css
Normal file
1341
app/tarot-database.js
Normal file
2081
app/ui-alphabet.js
Normal file
2528
app/ui-calendar.js
Normal file
1901
app/ui-cube.js
Normal file
350
app/ui-cycles.js
Normal file
@@ -0,0 +1,350 @@
|
|||||||
|
// app/ui-cycles.js
|
||||||
|
(function () {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
const state = {
|
||||||
|
initialized: false,
|
||||||
|
referenceData: null,
|
||||||
|
entries: [],
|
||||||
|
filteredEntries: [],
|
||||||
|
searchQuery: "",
|
||||||
|
selectedId: ""
|
||||||
|
};
|
||||||
|
|
||||||
|
function getElements() {
|
||||||
|
return {
|
||||||
|
searchInputEl: document.getElementById("cycles-search-input"),
|
||||||
|
searchClearEl: document.getElementById("cycles-search-clear"),
|
||||||
|
countEl: document.getElementById("cycles-count"),
|
||||||
|
listEl: document.getElementById("cycles-list"),
|
||||||
|
detailNameEl: document.getElementById("cycles-detail-name"),
|
||||||
|
detailTypeEl: document.getElementById("cycles-detail-type"),
|
||||||
|
detailSummaryEl: document.getElementById("cycles-detail-summary"),
|
||||||
|
detailBodyEl: document.getElementById("cycles-detail-body")
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function normalizeSearchValue(value) {
|
||||||
|
return String(value || "").trim().toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
function normalizeLookupToken(value) {
|
||||||
|
return String(value || "")
|
||||||
|
.trim()
|
||||||
|
.toLowerCase()
|
||||||
|
.replace(/[^a-z0-9]+/g, " ")
|
||||||
|
.trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
function normalizeCycle(raw, index) {
|
||||||
|
const name = String(raw?.name || "").trim();
|
||||||
|
if (!name) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const id = String(raw?.id || `cycle-${index + 1}`).trim();
|
||||||
|
const category = String(raw?.category || "Uncategorized").trim();
|
||||||
|
const period = String(raw?.period || "").trim();
|
||||||
|
const description = String(raw?.description || "").trim();
|
||||||
|
const significance = String(raw?.significance || "").trim();
|
||||||
|
const related = Array.isArray(raw?.related)
|
||||||
|
? raw.related.map((item) => String(item || "").trim()).filter(Boolean)
|
||||||
|
: [];
|
||||||
|
const periodDaysRaw = Number(raw?.periodDays);
|
||||||
|
const periodDays = Number.isFinite(periodDaysRaw) ? periodDaysRaw : null;
|
||||||
|
|
||||||
|
const searchText = normalizeSearchValue([
|
||||||
|
name,
|
||||||
|
category,
|
||||||
|
period,
|
||||||
|
description,
|
||||||
|
significance,
|
||||||
|
related.join(" ")
|
||||||
|
].join(" "));
|
||||||
|
|
||||||
|
return {
|
||||||
|
id,
|
||||||
|
name,
|
||||||
|
category,
|
||||||
|
period,
|
||||||
|
periodDays,
|
||||||
|
description,
|
||||||
|
significance,
|
||||||
|
related,
|
||||||
|
searchText
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildEntries(referenceData) {
|
||||||
|
const rows = Array.isArray(referenceData?.astronomyCycles?.cycles)
|
||||||
|
? referenceData.astronomyCycles.cycles
|
||||||
|
: [];
|
||||||
|
|
||||||
|
return rows
|
||||||
|
.map((row, index) => normalizeCycle(row, index))
|
||||||
|
.filter(Boolean)
|
||||||
|
.sort((left, right) => left.name.localeCompare(right.name));
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatDays(value) {
|
||||||
|
if (!Number.isFinite(value)) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
return value >= 1000
|
||||||
|
? Math.round(value).toLocaleString()
|
||||||
|
: value.toFixed(3).replace(/\.0+$/, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
function escapeHtml(value) {
|
||||||
|
return String(value || "")
|
||||||
|
.replaceAll("&", "&")
|
||||||
|
.replaceAll("<", "<")
|
||||||
|
.replaceAll(">", ">")
|
||||||
|
.replaceAll('"', """)
|
||||||
|
.replaceAll("'", "'");
|
||||||
|
}
|
||||||
|
|
||||||
|
function escapeAttr(value) {
|
||||||
|
return escapeHtml(value).replaceAll("`", "`");
|
||||||
|
}
|
||||||
|
|
||||||
|
function cssEscape(value) {
|
||||||
|
if (typeof CSS !== "undefined" && typeof CSS.escape === "function") {
|
||||||
|
return CSS.escape(value);
|
||||||
|
}
|
||||||
|
return String(value || "").replace(/[^a-zA-Z0-9_\-]/g, "\\$&");
|
||||||
|
}
|
||||||
|
|
||||||
|
function setSelectedCycle(nextId) {
|
||||||
|
const normalized = String(nextId || "").trim();
|
||||||
|
if (normalized && state.entries.some((entry) => entry.id === normalized)) {
|
||||||
|
state.selectedId = normalized;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
state.selectedId = state.filteredEntries[0]?.id || state.entries[0]?.id || "";
|
||||||
|
}
|
||||||
|
|
||||||
|
function selectedEntry() {
|
||||||
|
return state.filteredEntries.find((entry) => entry.id === state.selectedId)
|
||||||
|
|| state.entries.find((entry) => entry.id === state.selectedId)
|
||||||
|
|| state.filteredEntries[0]
|
||||||
|
|| state.entries[0]
|
||||||
|
|| null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function findEntryByReference(reference) {
|
||||||
|
const token = normalizeLookupToken(reference);
|
||||||
|
if (!token) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return state.entries.find((entry) => {
|
||||||
|
const idToken = normalizeLookupToken(entry.id);
|
||||||
|
const nameToken = normalizeLookupToken(entry.name);
|
||||||
|
return token === idToken || token === nameToken;
|
||||||
|
}) || null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function applyFilter() {
|
||||||
|
const query = state.searchQuery;
|
||||||
|
if (!query) {
|
||||||
|
state.filteredEntries = state.entries.slice();
|
||||||
|
} else {
|
||||||
|
state.filteredEntries = state.entries.filter((entry) => entry.searchText.includes(query));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!state.filteredEntries.some((entry) => entry.id === state.selectedId)) {
|
||||||
|
state.selectedId = state.filteredEntries[0]?.id || "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function syncControls(elements) {
|
||||||
|
const { searchInputEl, searchClearEl } = elements;
|
||||||
|
if (searchInputEl) {
|
||||||
|
searchInputEl.value = state.searchQuery;
|
||||||
|
}
|
||||||
|
if (searchClearEl) {
|
||||||
|
searchClearEl.disabled = !state.searchQuery;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderList(elements) {
|
||||||
|
const { listEl, countEl } = elements;
|
||||||
|
if (!(listEl instanceof HTMLElement)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (countEl) {
|
||||||
|
countEl.textContent = state.searchQuery
|
||||||
|
? `${state.filteredEntries.length} of ${state.entries.length}`
|
||||||
|
: `${state.entries.length}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!state.filteredEntries.length) {
|
||||||
|
listEl.innerHTML = '<div class="empty">No cycles match your search.</div>';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
listEl.innerHTML = "";
|
||||||
|
|
||||||
|
state.filteredEntries.forEach((entry) => {
|
||||||
|
const itemEl = document.createElement("div");
|
||||||
|
const isSelected = entry.id === state.selectedId;
|
||||||
|
itemEl.className = `planet-list-item${isSelected ? " is-selected" : ""}`;
|
||||||
|
itemEl.setAttribute("role", "option");
|
||||||
|
itemEl.setAttribute("aria-selected", isSelected ? "true" : "false");
|
||||||
|
itemEl.dataset.cycleId = entry.id;
|
||||||
|
|
||||||
|
const periodMeta = entry.period ? ` · ${escapeHtml(entry.period)}` : "";
|
||||||
|
itemEl.innerHTML = [
|
||||||
|
`<div class="planet-list-name">${escapeHtml(entry.name)}</div>`,
|
||||||
|
`<div class="planet-list-meta">${escapeHtml(entry.category)}${periodMeta}</div>`
|
||||||
|
].join("\n");
|
||||||
|
|
||||||
|
itemEl.addEventListener("click", () => {
|
||||||
|
setSelectedCycle(entry.id);
|
||||||
|
renderAll();
|
||||||
|
});
|
||||||
|
|
||||||
|
listEl.appendChild(itemEl);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderDetail(elements) {
|
||||||
|
const {
|
||||||
|
detailNameEl,
|
||||||
|
detailTypeEl,
|
||||||
|
detailSummaryEl,
|
||||||
|
detailBodyEl
|
||||||
|
} = elements;
|
||||||
|
|
||||||
|
const entry = selectedEntry();
|
||||||
|
|
||||||
|
if (!entry) {
|
||||||
|
if (detailNameEl) detailNameEl.textContent = "No cycle selected";
|
||||||
|
if (detailTypeEl) detailTypeEl.textContent = "";
|
||||||
|
if (detailSummaryEl) detailSummaryEl.textContent = "Select a cycle from the list.";
|
||||||
|
if (detailBodyEl) detailBodyEl.innerHTML = "";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (detailNameEl) detailNameEl.textContent = entry.name;
|
||||||
|
if (detailTypeEl) detailTypeEl.textContent = entry.category;
|
||||||
|
if (detailSummaryEl) detailSummaryEl.textContent = entry.description || "No description available.";
|
||||||
|
|
||||||
|
const body = [];
|
||||||
|
|
||||||
|
if (entry.period) {
|
||||||
|
body.push(`<p><strong>Period:</strong> ${escapeHtml(entry.period)}</p>`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Number.isFinite(entry.periodDays)) {
|
||||||
|
body.push(`<p><strong>Approx days:</strong> ${escapeHtml(formatDays(entry.periodDays))}</p>`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (entry.significance) {
|
||||||
|
body.push(`<p><strong>Significance:</strong> ${escapeHtml(entry.significance)}</p>`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (entry.related.length) {
|
||||||
|
const relatedButtons = entry.related
|
||||||
|
.map((label) => {
|
||||||
|
const relatedEntry = findEntryByReference(label);
|
||||||
|
if (!relatedEntry) {
|
||||||
|
return `<span class="planet-list-meta">${escapeHtml(label)}</span>`;
|
||||||
|
}
|
||||||
|
return `<button class="alpha-nav-btn" type="button" data-related-cycle-id="${escapeAttr(relatedEntry.id)}">${escapeHtml(relatedEntry.name)} ↗</button>`;
|
||||||
|
})
|
||||||
|
.join("");
|
||||||
|
|
||||||
|
body.push([
|
||||||
|
"<div>",
|
||||||
|
" <strong>Related:</strong>",
|
||||||
|
` <div class="alpha-nav-btns">${relatedButtons}</div>`,
|
||||||
|
"</div>"
|
||||||
|
].join("\n"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (detailBodyEl) {
|
||||||
|
detailBodyEl.innerHTML = body.join("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderAll() {
|
||||||
|
const elements = getElements();
|
||||||
|
syncControls(elements);
|
||||||
|
renderList(elements);
|
||||||
|
renderDetail(elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleSearchInput() {
|
||||||
|
const { searchInputEl } = getElements();
|
||||||
|
state.searchQuery = normalizeSearchValue(searchInputEl?.value);
|
||||||
|
applyFilter();
|
||||||
|
renderAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleSearchClear() {
|
||||||
|
const { searchInputEl } = getElements();
|
||||||
|
if (searchInputEl) {
|
||||||
|
searchInputEl.value = "";
|
||||||
|
searchInputEl.focus();
|
||||||
|
}
|
||||||
|
state.searchQuery = "";
|
||||||
|
applyFilter();
|
||||||
|
renderAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleRelatedClick(event) {
|
||||||
|
const target = event.target instanceof Element
|
||||||
|
? event.target.closest("[data-related-cycle-id]")
|
||||||
|
: null;
|
||||||
|
if (!(target instanceof HTMLElement)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const nextId = target.getAttribute("data-related-cycle-id");
|
||||||
|
setSelectedCycle(nextId);
|
||||||
|
renderAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
function bindEvents() {
|
||||||
|
const { searchInputEl, searchClearEl, detailBodyEl } = getElements();
|
||||||
|
|
||||||
|
if (searchInputEl) {
|
||||||
|
searchInputEl.addEventListener("input", handleSearchInput);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (searchClearEl) {
|
||||||
|
searchClearEl.addEventListener("click", handleSearchClear);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (detailBodyEl) {
|
||||||
|
detailBodyEl.addEventListener("click", handleRelatedClick);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function ensureCyclesSection(referenceData) {
|
||||||
|
state.referenceData = referenceData || {};
|
||||||
|
state.entries = buildEntries(state.referenceData);
|
||||||
|
applyFilter();
|
||||||
|
|
||||||
|
if (!state.initialized) {
|
||||||
|
bindEvents();
|
||||||
|
state.initialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
setSelectedCycle(state.selectedId);
|
||||||
|
renderAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
function selectCycleById(cycleId) {
|
||||||
|
setSelectedCycle(cycleId);
|
||||||
|
renderAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
window.CyclesSectionUi = {
|
||||||
|
ensureCyclesSection,
|
||||||
|
selectCycleById
|
||||||
|
};
|
||||||
|
})();
|
||||||
454
app/ui-elements.js
Normal file
@@ -0,0 +1,454 @@
|
|||||||
|
(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 = `
|
||||||
|
<strong>Element Details</strong>
|
||||||
|
<dl class="alpha-dl">
|
||||||
|
<dt>Name</dt><dd>${entry.name}</dd>
|
||||||
|
<dt>Symbol</dt><dd>${entry.symbol || "--"}</dd>
|
||||||
|
<dt>Hebrew Letter</dt><dd>${entry.hebrewLetter || "--"}</dd>
|
||||||
|
<dt>Court Rank</dt><dd>${entry.courtRank || "--"}</dd>
|
||||||
|
<dt>ID</dt><dd>${entry.id}</dd>
|
||||||
|
</dl>
|
||||||
|
`;
|
||||||
|
|
||||||
|
const tarotCard = document.createElement("div");
|
||||||
|
tarotCard.className = "planet-meta-card";
|
||||||
|
|
||||||
|
const tarotTitle = document.createElement("strong");
|
||||||
|
tarotTitle.textContent = "Tarot Correspondence";
|
||||||
|
|
||||||
|
const tarotText = document.createElement("div");
|
||||||
|
tarotText.className = "planet-text";
|
||||||
|
tarotText.textContent = [
|
||||||
|
entry.aceCardName ? `Ace: ${entry.aceCardName}` : "",
|
||||||
|
entry.courtRank ? `Court Rank: ${entry.courtRank} (all suits)` : ""
|
||||||
|
].filter(Boolean).join(" · ") || "--";
|
||||||
|
|
||||||
|
tarotCard.append(tarotTitle, tarotText);
|
||||||
|
|
||||||
|
if (entry.aceCardName || entry.courtCardNames.length) {
|
||||||
|
const navWrap = document.createElement("div");
|
||||||
|
navWrap.className = "alpha-nav-btns";
|
||||||
|
|
||||||
|
if (entry.aceCardName) {
|
||||||
|
const tarotBtn = document.createElement("button");
|
||||||
|
tarotBtn.type = "button";
|
||||||
|
tarotBtn.className = "alpha-nav-btn";
|
||||||
|
tarotBtn.textContent = `Open ${entry.aceCardName} ↗`;
|
||||||
|
tarotBtn.addEventListener("click", () => {
|
||||||
|
document.dispatchEvent(new CustomEvent("nav:tarot-trump", {
|
||||||
|
detail: { cardName: entry.aceCardName }
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
|
||||||
|
navWrap.appendChild(tarotBtn);
|
||||||
|
}
|
||||||
|
|
||||||
|
entry.courtCardNames.forEach((cardName) => {
|
||||||
|
const courtBtn = document.createElement("button");
|
||||||
|
courtBtn.type = "button";
|
||||||
|
courtBtn.className = "alpha-nav-btn";
|
||||||
|
courtBtn.textContent = `Open ${cardName} ↗`;
|
||||||
|
courtBtn.addEventListener("click", () => {
|
||||||
|
document.dispatchEvent(new CustomEvent("nav:tarot-trump", {
|
||||||
|
detail: { cardName }
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
navWrap.appendChild(courtBtn);
|
||||||
|
});
|
||||||
|
|
||||||
|
tarotCard.appendChild(navWrap);
|
||||||
|
}
|
||||||
|
|
||||||
|
const smallCardCard = document.createElement("div");
|
||||||
|
smallCardCard.className = "planet-meta-card";
|
||||||
|
|
||||||
|
const smallCardTitle = document.createElement("strong");
|
||||||
|
smallCardTitle.textContent = "Small Card Sign Types";
|
||||||
|
smallCardCard.appendChild(smallCardTitle);
|
||||||
|
|
||||||
|
const smallCardStack = document.createElement("div");
|
||||||
|
smallCardStack.className = "cal-item-stack";
|
||||||
|
|
||||||
|
(entry.smallCardGroups || []).forEach((group) => {
|
||||||
|
const row = document.createElement("div");
|
||||||
|
row.className = "cal-item-row";
|
||||||
|
|
||||||
|
const head = document.createElement("div");
|
||||||
|
head.className = "cal-item-head";
|
||||||
|
head.innerHTML = `
|
||||||
|
<span class="cal-item-name">${group.rangeLabel} · ${group.modality}</span>
|
||||||
|
<span class="planet-list-meta">${group.signName || "--"}</span>
|
||||||
|
`;
|
||||||
|
row.appendChild(head);
|
||||||
|
|
||||||
|
const navWrap = document.createElement("div");
|
||||||
|
navWrap.className = "alpha-nav-btns";
|
||||||
|
|
||||||
|
if (group.signId) {
|
||||||
|
const signBtn = document.createElement("button");
|
||||||
|
signBtn.type = "button";
|
||||||
|
signBtn.className = "alpha-nav-btn";
|
||||||
|
signBtn.textContent = `Open ${group.signName} ↗`;
|
||||||
|
signBtn.addEventListener("click", () => {
|
||||||
|
document.dispatchEvent(new CustomEvent("nav:zodiac", {
|
||||||
|
detail: { signId: group.signId }
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
navWrap.appendChild(signBtn);
|
||||||
|
}
|
||||||
|
|
||||||
|
(group.cardNames || []).forEach((cardName) => {
|
||||||
|
const cardBtn = document.createElement("button");
|
||||||
|
cardBtn.type = "button";
|
||||||
|
cardBtn.className = "alpha-nav-btn";
|
||||||
|
cardBtn.textContent = `Open ${cardName} ↗`;
|
||||||
|
cardBtn.addEventListener("click", () => {
|
||||||
|
document.dispatchEvent(new CustomEvent("nav:tarot-trump", {
|
||||||
|
detail: { cardName }
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
navWrap.appendChild(cardBtn);
|
||||||
|
});
|
||||||
|
|
||||||
|
row.appendChild(navWrap);
|
||||||
|
smallCardStack.appendChild(row);
|
||||||
|
});
|
||||||
|
|
||||||
|
smallCardCard.appendChild(smallCardStack);
|
||||||
|
|
||||||
|
grid.append(detailsCard, tarotCard, smallCardCard);
|
||||||
|
elements.detailBodyEl.appendChild(grid);
|
||||||
|
}
|
||||||
|
|
||||||
|
function applyFilter(elements) {
|
||||||
|
const query = normalize(state.searchQuery);
|
||||||
|
state.filteredEntries = query
|
||||||
|
? state.entries.filter((entry) => entry.searchText.includes(query))
|
||||||
|
: [...state.entries];
|
||||||
|
|
||||||
|
if (elements?.searchClearEl) {
|
||||||
|
elements.searchClearEl.disabled = !query;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!state.filteredEntries.some((entry) => entry.id === state.selectedId)) {
|
||||||
|
state.selectedId = state.filteredEntries[0]?.id || "";
|
||||||
|
}
|
||||||
|
|
||||||
|
renderList(elements);
|
||||||
|
renderDetail(elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
function selectByElementId(elementId) {
|
||||||
|
const target = findEntryById(elementId);
|
||||||
|
if (!target) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const elements = getElements();
|
||||||
|
state.selectedId = target.id;
|
||||||
|
renderList(elements);
|
||||||
|
renderDetail(elements);
|
||||||
|
|
||||||
|
const listItem = elements.listEl?.querySelector(`[data-element-id="${target.id}"]`);
|
||||||
|
listItem?.scrollIntoView({ block: "nearest" });
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function ensureElementsSection(magickDataset) {
|
||||||
|
const elements = getElements();
|
||||||
|
if (!elements.listEl || !elements.detailBodyEl) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
state.entries = buildEntries(magickDataset);
|
||||||
|
|
||||||
|
if (!state.selectedId && state.entries.length) {
|
||||||
|
state.selectedId = state.entries[0].id;
|
||||||
|
}
|
||||||
|
|
||||||
|
applyFilter(elements);
|
||||||
|
|
||||||
|
if (state.initialized) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
elements.listEl.addEventListener("click", (event) => {
|
||||||
|
const target = event.target instanceof Element
|
||||||
|
? event.target.closest(".planet-list-item")
|
||||||
|
: null;
|
||||||
|
|
||||||
|
if (!(target instanceof HTMLButtonElement)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const elementId = target.dataset.elementId;
|
||||||
|
if (!elementId) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
state.selectedId = elementId;
|
||||||
|
renderList(elements);
|
||||||
|
renderDetail(elements);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (elements.searchEl) {
|
||||||
|
elements.searchEl.addEventListener("input", () => {
|
||||||
|
state.searchQuery = elements.searchEl.value || "";
|
||||||
|
applyFilter(elements);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elements.searchClearEl && elements.searchEl) {
|
||||||
|
elements.searchClearEl.addEventListener("click", () => {
|
||||||
|
state.searchQuery = "";
|
||||||
|
elements.searchEl.value = "";
|
||||||
|
applyFilter(elements);
|
||||||
|
elements.searchEl.focus();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
state.initialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
window.ElementsSectionUi = {
|
||||||
|
ensureElementsSection,
|
||||||
|
selectByElementId
|
||||||
|
};
|
||||||
|
})();
|
||||||
459
app/ui-enochian.js
Normal file
@@ -0,0 +1,459 @@
|
|||||||
|
(function () {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
const TABLET_META = {
|
||||||
|
union: { label: "Enochian Tablet of Union", element: "Spirit", order: 0 },
|
||||||
|
spirit: { label: "Enochian Tablet of Union", element: "Spirit", order: 0 },
|
||||||
|
earth: { label: "Enochian Tablet of Earth", element: "Earth", order: 1 },
|
||||||
|
air: { label: "Enochian Tablet of Air", element: "Air", order: 2 },
|
||||||
|
water: { label: "Enochian Tablet of Water", element: "Water", order: 3 },
|
||||||
|
fire: { label: "Enochian Tablet of Fire", element: "Fire", order: 4 }
|
||||||
|
};
|
||||||
|
|
||||||
|
const TAROT_NAME_ALIASES = {
|
||||||
|
juggler: "magus",
|
||||||
|
magician: "magus",
|
||||||
|
strength: "lust",
|
||||||
|
temperance: "art",
|
||||||
|
judgement: "aeon",
|
||||||
|
judgment: "aeon",
|
||||||
|
charit: "chariot"
|
||||||
|
};
|
||||||
|
|
||||||
|
const state = {
|
||||||
|
initialized: false,
|
||||||
|
entries: [],
|
||||||
|
filteredEntries: [],
|
||||||
|
selectedId: "",
|
||||||
|
selectedCell: null,
|
||||||
|
searchQuery: "",
|
||||||
|
lettersById: new Map()
|
||||||
|
};
|
||||||
|
|
||||||
|
function getElements() {
|
||||||
|
return {
|
||||||
|
listEl: document.getElementById("enochian-list"),
|
||||||
|
countEl: document.getElementById("enochian-count"),
|
||||||
|
searchEl: document.getElementById("enochian-search-input"),
|
||||||
|
searchClearEl: document.getElementById("enochian-search-clear"),
|
||||||
|
detailNameEl: document.getElementById("enochian-detail-name"),
|
||||||
|
detailSubEl: document.getElementById("enochian-detail-sub"),
|
||||||
|
detailBodyEl: document.getElementById("enochian-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 getTabletMeta(id) {
|
||||||
|
const normalizedId = normalize(id);
|
||||||
|
return TABLET_META[normalizedId] || {
|
||||||
|
label: `Enochian Tablet of ${titleCase(normalizedId || "Unknown")}`,
|
||||||
|
element: titleCase(normalizedId || "Unknown"),
|
||||||
|
order: 99
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildSearchText(entry) {
|
||||||
|
return normalize([
|
||||||
|
entry.id,
|
||||||
|
entry.label,
|
||||||
|
entry.element,
|
||||||
|
entry.rowCount,
|
||||||
|
entry.colCount,
|
||||||
|
...entry.uniqueLetters
|
||||||
|
].join(" "));
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildEntries(magickDataset) {
|
||||||
|
const tablets = magickDataset?.grouped?.enochian?.tablets;
|
||||||
|
if (!tablets || typeof tablets !== "object") {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
return Object.entries(tablets)
|
||||||
|
.map(([key, value]) => {
|
||||||
|
const id = normalize(value?.id || key);
|
||||||
|
const grid = Array.isArray(value?.grid)
|
||||||
|
? value.grid.map((row) => (Array.isArray(row)
|
||||||
|
? row.map((cell) => String(cell || "").trim())
|
||||||
|
: []))
|
||||||
|
: [];
|
||||||
|
|
||||||
|
const rowCount = grid.length;
|
||||||
|
const colCount = grid.reduce((max, row) => Math.max(max, row.length), 0);
|
||||||
|
const uniqueLetters = [...new Set(
|
||||||
|
grid
|
||||||
|
.flat()
|
||||||
|
.map((cell) => String(cell || "").trim().toUpperCase())
|
||||||
|
.filter(Boolean)
|
||||||
|
)].sort((left, right) => left.localeCompare(right));
|
||||||
|
|
||||||
|
const meta = getTabletMeta(id);
|
||||||
|
|
||||||
|
return {
|
||||||
|
id,
|
||||||
|
grid,
|
||||||
|
rowCount,
|
||||||
|
colCount,
|
||||||
|
uniqueLetters,
|
||||||
|
element: meta.element,
|
||||||
|
label: meta.label,
|
||||||
|
order: Number(meta.order)
|
||||||
|
};
|
||||||
|
})
|
||||||
|
.sort((left, right) => left.order - right.order || left.label.localeCompare(right.label));
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildLetterMap(magickDataset) {
|
||||||
|
const letters = magickDataset?.grouped?.enochian?.letters;
|
||||||
|
if (!letters || typeof letters !== "object") {
|
||||||
|
return new Map();
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Map(
|
||||||
|
Object.entries(letters)
|
||||||
|
.map(([key, value]) => [String(key || "").trim().toUpperCase(), value])
|
||||||
|
.filter(([key]) => Boolean(key))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function findEntryById(id) {
|
||||||
|
return state.entries.find((entry) => entry.id === id) || null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getDefaultCell(entry) {
|
||||||
|
if (!entry || !Array.isArray(entry.grid)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let rowIndex = 0; rowIndex < entry.grid.length; rowIndex += 1) {
|
||||||
|
const row = entry.grid[rowIndex];
|
||||||
|
for (let colIndex = 0; colIndex < row.length; colIndex += 1) {
|
||||||
|
const value = String(row[colIndex] || "").trim();
|
||||||
|
if (value) {
|
||||||
|
return { rowIndex, colIndex, value };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 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 = "enoch-list-item";
|
||||||
|
button.dataset.tabletId = 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 = "enoch-list-name";
|
||||||
|
name.textContent = entry.label;
|
||||||
|
|
||||||
|
const meta = document.createElement("span");
|
||||||
|
meta.className = "enoch-list-meta";
|
||||||
|
meta.textContent = `${entry.element} · ${entry.rowCount}×${entry.colCount} · ${entry.uniqueLetters.length} letters`;
|
||||||
|
|
||||||
|
button.append(name, meta);
|
||||||
|
elements.listEl.appendChild(button);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (elements.countEl) {
|
||||||
|
elements.countEl.textContent = `${state.filteredEntries.length} tablets`;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!state.filteredEntries.length) {
|
||||||
|
const empty = document.createElement("div");
|
||||||
|
empty.className = "planet-text";
|
||||||
|
empty.style.padding = "16px";
|
||||||
|
empty.style.color = "#71717a";
|
||||||
|
empty.textContent = "No Enochian tablets match your search.";
|
||||||
|
elements.listEl.appendChild(empty);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function resolveTarotCardName(value) {
|
||||||
|
const normalized = normalize(value);
|
||||||
|
if (!normalized) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
return TAROT_NAME_ALIASES[normalized] || normalized;
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderDetail(elements) {
|
||||||
|
if (!elements?.detailBodyEl || !elements.detailNameEl || !elements.detailSubEl) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const entry = findEntryById(state.selectedId);
|
||||||
|
elements.detailBodyEl.replaceChildren();
|
||||||
|
|
||||||
|
if (!entry) {
|
||||||
|
elements.detailNameEl.textContent = "--";
|
||||||
|
elements.detailSubEl.textContent = "Select a tablet to explore";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
elements.detailNameEl.textContent = entry.label;
|
||||||
|
elements.detailSubEl.textContent = `${entry.element} Tablet · ${entry.rowCount} rows × ${entry.colCount} columns`;
|
||||||
|
|
||||||
|
if (!state.selectedCell) {
|
||||||
|
state.selectedCell = getDefaultCell(entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
const detailGrid = document.createElement("div");
|
||||||
|
detailGrid.className = "planet-meta-grid";
|
||||||
|
|
||||||
|
const summaryCard = document.createElement("div");
|
||||||
|
summaryCard.className = "planet-meta-card";
|
||||||
|
summaryCard.innerHTML = `
|
||||||
|
<strong>Tablet Overview</strong>
|
||||||
|
<div class="enoch-letter-meta">
|
||||||
|
<div>${entry.label}</div>
|
||||||
|
<div>${entry.rowCount} rows × ${entry.colCount} columns</div>
|
||||||
|
<div>Unique letters: ${entry.uniqueLetters.length}</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
|
||||||
|
const gridCard = document.createElement("div");
|
||||||
|
gridCard.className = "planet-meta-card";
|
||||||
|
const gridTitle = document.createElement("strong");
|
||||||
|
gridTitle.textContent = "Tablet Grid";
|
||||||
|
const gridEl = document.createElement("div");
|
||||||
|
gridEl.className = "enoch-grid";
|
||||||
|
|
||||||
|
entry.grid.forEach((row, rowIndex) => {
|
||||||
|
const rowEl = document.createElement("div");
|
||||||
|
rowEl.className = "enoch-grid-row";
|
||||||
|
row.forEach((cell, colIndex) => {
|
||||||
|
const value = String(cell || "").trim();
|
||||||
|
const cellBtn = document.createElement("button");
|
||||||
|
cellBtn.type = "button";
|
||||||
|
cellBtn.className = "enoch-grid-cell";
|
||||||
|
cellBtn.textContent = value || "·";
|
||||||
|
|
||||||
|
const isSelectedCell = state.selectedCell
|
||||||
|
&& state.selectedCell.rowIndex === rowIndex
|
||||||
|
&& state.selectedCell.colIndex === colIndex;
|
||||||
|
cellBtn.classList.toggle("is-selected", Boolean(isSelectedCell));
|
||||||
|
|
||||||
|
cellBtn.addEventListener("click", () => {
|
||||||
|
state.selectedCell = { rowIndex, colIndex, value };
|
||||||
|
renderDetail(elements);
|
||||||
|
});
|
||||||
|
|
||||||
|
rowEl.appendChild(cellBtn);
|
||||||
|
});
|
||||||
|
gridEl.appendChild(rowEl);
|
||||||
|
});
|
||||||
|
|
||||||
|
gridCard.append(gridTitle, gridEl);
|
||||||
|
|
||||||
|
const letterCard = document.createElement("div");
|
||||||
|
letterCard.className = "planet-meta-card";
|
||||||
|
const letterTitle = document.createElement("strong");
|
||||||
|
letterTitle.textContent = "Selected Letter";
|
||||||
|
|
||||||
|
const selectedLetter = String(state.selectedCell?.value || "").trim().toUpperCase();
|
||||||
|
const letterData = selectedLetter ? state.lettersById.get(selectedLetter) : null;
|
||||||
|
|
||||||
|
const letterContent = document.createElement("div");
|
||||||
|
letterContent.className = "enoch-letter-meta";
|
||||||
|
|
||||||
|
if (!selectedLetter) {
|
||||||
|
letterContent.textContent = "Select any grid cell to inspect its correspondence data.";
|
||||||
|
} else {
|
||||||
|
const firstRow = document.createElement("div");
|
||||||
|
firstRow.className = "enoch-letter-row";
|
||||||
|
const chip = document.createElement("span");
|
||||||
|
chip.className = "enoch-letter-chip";
|
||||||
|
chip.textContent = selectedLetter;
|
||||||
|
firstRow.appendChild(chip);
|
||||||
|
|
||||||
|
const title = document.createElement("span");
|
||||||
|
title.textContent = letterData?.title
|
||||||
|
? `${letterData.title}${letterData.english ? ` · ${letterData.english}` : ""}`
|
||||||
|
: "No letter metadata yet";
|
||||||
|
firstRow.appendChild(title);
|
||||||
|
letterContent.appendChild(firstRow);
|
||||||
|
|
||||||
|
if (letterData) {
|
||||||
|
const detailRows = [
|
||||||
|
["Pronunciation", letterData.pronounciation],
|
||||||
|
["Planet / Element", letterData["planet/element"]],
|
||||||
|
["Tarot", letterData.tarot],
|
||||||
|
["Gematria", letterData.gematria]
|
||||||
|
];
|
||||||
|
|
||||||
|
detailRows.forEach(([label, value]) => {
|
||||||
|
if (value === undefined || value === null || String(value).trim() === "") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const row = document.createElement("div");
|
||||||
|
row.className = "enoch-letter-row";
|
||||||
|
row.innerHTML = `<span style="color:#a1a1aa">${label}:</span><span>${value}</span>`;
|
||||||
|
letterContent.appendChild(row);
|
||||||
|
});
|
||||||
|
|
||||||
|
const navRow = document.createElement("div");
|
||||||
|
navRow.className = "enoch-letter-row";
|
||||||
|
|
||||||
|
const tarotCardName = resolveTarotCardName(letterData.tarot);
|
||||||
|
if (tarotCardName) {
|
||||||
|
const tarotBtn = document.createElement("button");
|
||||||
|
tarotBtn.type = "button";
|
||||||
|
tarotBtn.className = "enoch-nav-btn";
|
||||||
|
tarotBtn.textContent = `Open Tarot (${titleCase(tarotCardName)}) ↗`;
|
||||||
|
tarotBtn.addEventListener("click", () => {
|
||||||
|
document.dispatchEvent(new CustomEvent("nav:tarot-trump", {
|
||||||
|
detail: { cardName: tarotCardName }
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
navRow.appendChild(tarotBtn);
|
||||||
|
}
|
||||||
|
|
||||||
|
const alphabetBtn = document.createElement("button");
|
||||||
|
alphabetBtn.type = "button";
|
||||||
|
alphabetBtn.className = "enoch-nav-btn";
|
||||||
|
alphabetBtn.textContent = "Open Alphabet ↗";
|
||||||
|
alphabetBtn.addEventListener("click", () => {
|
||||||
|
document.dispatchEvent(new CustomEvent("nav:alphabet", {
|
||||||
|
detail: {
|
||||||
|
alphabet: "english",
|
||||||
|
englishLetter: selectedLetter
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
navRow.appendChild(alphabetBtn);
|
||||||
|
|
||||||
|
letterContent.appendChild(navRow);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
letterCard.append(letterTitle, letterContent);
|
||||||
|
|
||||||
|
detailGrid.append(summaryCard, letterCard, gridCard);
|
||||||
|
elements.detailBodyEl.appendChild(detailGrid);
|
||||||
|
}
|
||||||
|
|
||||||
|
function applyFilter(elements) {
|
||||||
|
const query = normalize(state.searchQuery);
|
||||||
|
state.filteredEntries = query
|
||||||
|
? state.entries.filter((entry) => buildSearchText(entry).includes(query))
|
||||||
|
: [...state.entries];
|
||||||
|
|
||||||
|
if (elements?.searchClearEl) {
|
||||||
|
elements.searchClearEl.disabled = !query;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!state.filteredEntries.some((entry) => entry.id === state.selectedId)) {
|
||||||
|
state.selectedId = state.filteredEntries[0]?.id || "";
|
||||||
|
state.selectedCell = state.selectedId ? getDefaultCell(findEntryById(state.selectedId)) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
renderList(elements);
|
||||||
|
renderDetail(elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
function selectByTabletId(tabletId) {
|
||||||
|
const elements = getElements();
|
||||||
|
const target = findEntryById(normalize(tabletId));
|
||||||
|
if (!target) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
state.selectedId = target.id;
|
||||||
|
state.selectedCell = getDefaultCell(target);
|
||||||
|
renderList(elements);
|
||||||
|
renderDetail(elements);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function ensureEnochianSection(magickDataset) {
|
||||||
|
const elements = getElements();
|
||||||
|
if (!elements.listEl || !elements.detailBodyEl) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
state.entries = buildEntries(magickDataset);
|
||||||
|
state.lettersById = buildLetterMap(magickDataset);
|
||||||
|
|
||||||
|
if (!state.selectedId && state.entries.length) {
|
||||||
|
state.selectedId = state.entries[0].id;
|
||||||
|
state.selectedCell = getDefaultCell(state.entries[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
applyFilter(elements);
|
||||||
|
|
||||||
|
if (state.initialized) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
elements.listEl.addEventListener("click", (event) => {
|
||||||
|
const target = event.target instanceof Element
|
||||||
|
? event.target.closest(".enoch-list-item")
|
||||||
|
: null;
|
||||||
|
if (!(target instanceof HTMLButtonElement)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const tabletId = target.dataset.tabletId;
|
||||||
|
if (!tabletId) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
state.selectedId = tabletId;
|
||||||
|
state.selectedCell = getDefaultCell(findEntryById(tabletId));
|
||||||
|
renderList(elements);
|
||||||
|
renderDetail(elements);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (elements.searchEl) {
|
||||||
|
elements.searchEl.addEventListener("input", () => {
|
||||||
|
state.searchQuery = elements.searchEl.value || "";
|
||||||
|
applyFilter(elements);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elements.searchClearEl && elements.searchEl) {
|
||||||
|
elements.searchClearEl.addEventListener("click", () => {
|
||||||
|
state.searchQuery = "";
|
||||||
|
elements.searchEl.value = "";
|
||||||
|
applyFilter(elements);
|
||||||
|
elements.searchEl.focus();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
state.initialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
window.EnochianSectionUi = {
|
||||||
|
ensureEnochianSection,
|
||||||
|
selectByTabletId
|
||||||
|
};
|
||||||
|
})();
|
||||||
618
app/ui-gods.js
Normal file
@@ -0,0 +1,618 @@
|
|||||||
|
/* ui-gods.js — Divine Pantheons section
|
||||||
|
* Individual deity browser: Greek, Roman, Egyptian, Hebrew divine names, Archangels.
|
||||||
|
* Kabbalah paths are shown only as a reference at the bottom of each detail view.
|
||||||
|
*/
|
||||||
|
(() => {
|
||||||
|
// ── State ──────────────────────────────────────────────────────────────────
|
||||||
|
const state = {
|
||||||
|
initialized: false,
|
||||||
|
gods: [],
|
||||||
|
godsByName: new Map(),
|
||||||
|
monthRefsByGodId: new Map(),
|
||||||
|
filteredGods: [],
|
||||||
|
selectedId: null,
|
||||||
|
activeTab: "greek",
|
||||||
|
searchQuery: ""
|
||||||
|
};
|
||||||
|
|
||||||
|
let listEl, detailNameEl, detailSubEl, detailBodyEl, countEl,
|
||||||
|
searchInputEl, searchClearEl;
|
||||||
|
|
||||||
|
// ── Tab definitions ────────────────────────────────────────────────────────
|
||||||
|
const TABS = [
|
||||||
|
{ id: "greek", label: "Greek", emoji: "🏛️" },
|
||||||
|
{ id: "roman", label: "Roman", emoji: "🦅" },
|
||||||
|
{ id: "egyptian", label: "Egyptian", emoji: "𓂀" },
|
||||||
|
{ id: "hebrew", label: "God Names", emoji: "✡️" },
|
||||||
|
{ id: "archangel", label: "Archangels", emoji: "☀️" },
|
||||||
|
{ id: "all", label: "All", emoji: "∞" },
|
||||||
|
];
|
||||||
|
|
||||||
|
const PANTHEON_LABEL = {
|
||||||
|
greek: "Greek", roman: "Roman", egyptian: "Egyptian",
|
||||||
|
hebrew: "God Names", archangel: "Archangel"
|
||||||
|
};
|
||||||
|
|
||||||
|
function normalizeName(value) {
|
||||||
|
return String(value || "")
|
||||||
|
.normalize("NFD")
|
||||||
|
.replace(/[\u0300-\u036f]/g, "")
|
||||||
|
.toLowerCase()
|
||||||
|
.replace(/[^a-z0-9]+/g, " ")
|
||||||
|
.trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
function tokenizeEquivalent(value) {
|
||||||
|
return String(value || "")
|
||||||
|
.replace(/\([^)]*\)/g, " ")
|
||||||
|
.split(/\/|,|;|\bor\b|\band\b|·|—|–/i)
|
||||||
|
.map((token) => token.trim())
|
||||||
|
.filter(Boolean);
|
||||||
|
}
|
||||||
|
|
||||||
|
function findEquivalentTarget(equivalent, currentGodId) {
|
||||||
|
const tokens = tokenizeEquivalent(equivalent);
|
||||||
|
for (const token of tokens) {
|
||||||
|
const matches = state.godsByName.get(normalizeName(token));
|
||||||
|
if (!matches?.length) continue;
|
||||||
|
const target = matches.find((x) => x.id !== currentGodId);
|
||||||
|
if (target) return target;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildMonthReferencesByGod(referenceData) {
|
||||||
|
const map = new Map();
|
||||||
|
const months = Array.isArray(referenceData?.calendarMonths) ? referenceData.calendarMonths : [];
|
||||||
|
const holidays = Array.isArray(referenceData?.celestialHolidays) ? referenceData.celestialHolidays : [];
|
||||||
|
const monthById = new Map(months.map((month) => [month.id, month]));
|
||||||
|
|
||||||
|
function parseMonthDayToken(value) {
|
||||||
|
const text = String(value || "").trim();
|
||||||
|
const match = text.match(/^(\d{1,2})-(\d{1,2})$/);
|
||||||
|
if (!match) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const monthNo = Number(match[1]);
|
||||||
|
const dayNo = Number(match[2]);
|
||||||
|
if (!Number.isInteger(monthNo) || !Number.isInteger(dayNo) || monthNo < 1 || monthNo > 12 || dayNo < 1 || dayNo > 31) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return { month: monthNo, day: dayNo };
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseMonthDayTokensFromText(value) {
|
||||||
|
const text = String(value || "");
|
||||||
|
const matches = [...text.matchAll(/(\d{1,2})-(\d{1,2})/g)];
|
||||||
|
return matches
|
||||||
|
.map((match) => ({ month: Number(match[1]), day: Number(match[2]) }))
|
||||||
|
.filter((token) => Number.isInteger(token.month) && Number.isInteger(token.day) && token.month >= 1 && token.month <= 12 && token.day >= 1 && token.day <= 31);
|
||||||
|
}
|
||||||
|
|
||||||
|
function toDateToken(token, year) {
|
||||||
|
if (!token) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return new Date(year, token.month - 1, token.day, 12, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
function splitMonthDayRangeByMonth(startToken, endToken) {
|
||||||
|
const startDate = toDateToken(startToken, 2025);
|
||||||
|
const endBase = toDateToken(endToken, 2025);
|
||||||
|
if (!startDate || !endBase) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
const wrapsYear = endBase.getTime() < startDate.getTime();
|
||||||
|
const endDate = wrapsYear ? toDateToken(endToken, 2026) : endBase;
|
||||||
|
if (!endDate) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
const segments = [];
|
||||||
|
let cursor = new Date(startDate);
|
||||||
|
while (cursor.getTime() <= endDate.getTime()) {
|
||||||
|
const monthEnd = new Date(cursor.getFullYear(), cursor.getMonth() + 1, 0, 12, 0, 0, 0);
|
||||||
|
const segmentEnd = monthEnd.getTime() < endDate.getTime() ? monthEnd : endDate;
|
||||||
|
|
||||||
|
segments.push({
|
||||||
|
monthNo: cursor.getMonth() + 1,
|
||||||
|
startDay: cursor.getDate(),
|
||||||
|
endDay: segmentEnd.getDate()
|
||||||
|
});
|
||||||
|
|
||||||
|
cursor = new Date(segmentEnd.getFullYear(), segmentEnd.getMonth(), segmentEnd.getDate() + 1, 12, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return segments;
|
||||||
|
}
|
||||||
|
|
||||||
|
function tokenToString(monthNo, dayNo) {
|
||||||
|
return `${String(monthNo).padStart(2, "0")}-${String(dayNo).padStart(2, "0")}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatRangeLabel(monthName, startDay, endDay) {
|
||||||
|
if (!Number.isFinite(startDay) || !Number.isFinite(endDay)) {
|
||||||
|
return monthName;
|
||||||
|
}
|
||||||
|
if (startDay === endDay) {
|
||||||
|
return `${monthName} ${startDay}`;
|
||||||
|
}
|
||||||
|
return `${monthName} ${startDay}-${endDay}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
function resolveRangeForMonth(month, options = {}) {
|
||||||
|
const monthOrder = Number(month?.order);
|
||||||
|
const monthStart = parseMonthDayToken(month?.start);
|
||||||
|
const monthEnd = parseMonthDayToken(month?.end);
|
||||||
|
if (!Number.isFinite(monthOrder) || !monthStart || !monthEnd) {
|
||||||
|
return {
|
||||||
|
startToken: String(month?.start || "").trim() || null,
|
||||||
|
endToken: String(month?.end || "").trim() || null,
|
||||||
|
label: month?.name || month?.id || "",
|
||||||
|
isFullMonth: true
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
let startToken = parseMonthDayToken(options.startToken);
|
||||||
|
let endToken = parseMonthDayToken(options.endToken);
|
||||||
|
|
||||||
|
if (!startToken || !endToken) {
|
||||||
|
const tokens = parseMonthDayTokensFromText(options.rawDateText);
|
||||||
|
if (tokens.length >= 2) {
|
||||||
|
startToken = tokens[0];
|
||||||
|
endToken = tokens[1];
|
||||||
|
} else if (tokens.length === 1) {
|
||||||
|
startToken = tokens[0];
|
||||||
|
endToken = tokens[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!startToken || !endToken) {
|
||||||
|
startToken = monthStart;
|
||||||
|
endToken = monthEnd;
|
||||||
|
}
|
||||||
|
|
||||||
|
const segments = splitMonthDayRangeByMonth(startToken, endToken);
|
||||||
|
const segment = segments.find((entry) => entry.monthNo === monthOrder) || null;
|
||||||
|
|
||||||
|
const useStart = segment ? { month: monthOrder, day: segment.startDay } : startToken;
|
||||||
|
const useEnd = segment ? { month: monthOrder, day: segment.endDay } : endToken;
|
||||||
|
const startText = tokenToString(useStart.month, useStart.day);
|
||||||
|
const endText = tokenToString(useEnd.month, useEnd.day);
|
||||||
|
const isFullMonth = startText === month.start && endText === month.end;
|
||||||
|
|
||||||
|
return {
|
||||||
|
startToken: startText,
|
||||||
|
endToken: endText,
|
||||||
|
label: isFullMonth
|
||||||
|
? (month.name || month.id)
|
||||||
|
: formatRangeLabel(month.name || month.id, useStart.day, useEnd.day),
|
||||||
|
isFullMonth
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function pushRef(godId, month, options = {}) {
|
||||||
|
if (!godId || !month?.id) return;
|
||||||
|
const key = String(godId).trim().toLowerCase();
|
||||||
|
if (!key) return;
|
||||||
|
|
||||||
|
if (!map.has(key)) {
|
||||||
|
map.set(key, []);
|
||||||
|
}
|
||||||
|
|
||||||
|
const rows = map.get(key);
|
||||||
|
const range = resolveRangeForMonth(month, options);
|
||||||
|
const rowKey = `${month.id}|${range.startToken || ""}|${range.endToken || ""}`;
|
||||||
|
if (rows.some((entry) => entry.key === rowKey)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
rows.push({
|
||||||
|
id: month.id,
|
||||||
|
name: month.name || month.id,
|
||||||
|
order: Number.isFinite(Number(month.order)) ? Number(month.order) : 999,
|
||||||
|
label: range.label,
|
||||||
|
startToken: range.startToken,
|
||||||
|
endToken: range.endToken,
|
||||||
|
isFullMonth: range.isFullMonth,
|
||||||
|
key: rowKey
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
months.forEach((month) => {
|
||||||
|
pushRef(month?.associations?.godId, month);
|
||||||
|
|
||||||
|
const events = Array.isArray(month?.events) ? month.events : [];
|
||||||
|
events.forEach((event) => {
|
||||||
|
pushRef(event?.associations?.godId, month, {
|
||||||
|
rawDateText: event?.dateRange || event?.date || ""
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
holidays.forEach((holiday) => {
|
||||||
|
const month = monthById.get(holiday?.monthId);
|
||||||
|
if (month) {
|
||||||
|
pushRef(holiday?.associations?.godId, month, {
|
||||||
|
rawDateText: holiday?.dateRange || holiday?.date || ""
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
map.forEach((rows, key) => {
|
||||||
|
const preciseMonthIds = new Set(
|
||||||
|
rows
|
||||||
|
.filter((entry) => !entry.isFullMonth)
|
||||||
|
.map((entry) => entry.id)
|
||||||
|
);
|
||||||
|
|
||||||
|
const filtered = rows.filter((entry) => {
|
||||||
|
if (!entry.isFullMonth) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return !preciseMonthIds.has(entry.id);
|
||||||
|
});
|
||||||
|
|
||||||
|
filtered.sort((left, right) => {
|
||||||
|
if (left.order !== right.order) {
|
||||||
|
return left.order - right.order;
|
||||||
|
}
|
||||||
|
|
||||||
|
const startLeft = parseMonthDayToken(left.startToken);
|
||||||
|
const startRight = parseMonthDayToken(right.startToken);
|
||||||
|
const dayLeft = startLeft ? startLeft.day : 999;
|
||||||
|
const dayRight = startRight ? startRight.day : 999;
|
||||||
|
if (dayLeft !== dayRight) {
|
||||||
|
return dayLeft - dayRight;
|
||||||
|
}
|
||||||
|
|
||||||
|
return String(left.label || left.name || "").localeCompare(String(right.label || right.name || ""));
|
||||||
|
});
|
||||||
|
|
||||||
|
map.set(key, filtered);
|
||||||
|
});
|
||||||
|
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Filter ─────────────────────────────────────────────────────────────────
|
||||||
|
function applyFilter() {
|
||||||
|
const q = state.searchQuery.toLowerCase();
|
||||||
|
const tab = state.activeTab;
|
||||||
|
|
||||||
|
state.filteredGods = state.gods.filter((g) => {
|
||||||
|
if (tab !== "all" && g.pantheon !== tab) return false;
|
||||||
|
if (!q) return true;
|
||||||
|
const hay = [
|
||||||
|
g.name, g.epithet, g.role,
|
||||||
|
...(g.domains || []),
|
||||||
|
...(g.parents || []),
|
||||||
|
...(g.siblings || []),
|
||||||
|
...(g.children || []),
|
||||||
|
...(g.symbols || []),
|
||||||
|
...(g.equivalents || []),
|
||||||
|
g.meaning, g.description, g.myth,
|
||||||
|
].filter(Boolean).join(" ").toLowerCase();
|
||||||
|
return hay.includes(q);
|
||||||
|
});
|
||||||
|
|
||||||
|
const hasSelected = state.filteredGods.some((g) => g.id === state.selectedId);
|
||||||
|
if (!hasSelected) {
|
||||||
|
state.selectedId = state.filteredGods[0]?.id || null;
|
||||||
|
}
|
||||||
|
|
||||||
|
renderList();
|
||||||
|
renderDetail(state.selectedId);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── List ───────────────────────────────────────────────────────────────────
|
||||||
|
function renderList() {
|
||||||
|
if (!listEl) return;
|
||||||
|
if (countEl) countEl.textContent = `${state.filteredGods.length} deities`;
|
||||||
|
|
||||||
|
if (!state.filteredGods.length) {
|
||||||
|
listEl.innerHTML = `<div style="padding:20px;color:#71717a;font-size:13px;text-align:center">No matches</div>`;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
listEl.innerHTML = state.filteredGods.map((g) => {
|
||||||
|
const isActive = state.selectedId === g.id;
|
||||||
|
const tag = PANTHEON_LABEL[g.pantheon] || g.pantheon;
|
||||||
|
return `<div class="gods-list-item${isActive ? " gods-list-active" : ""}" data-id="${g.id}" role="option" tabindex="0" aria-selected="${isActive}">
|
||||||
|
<div class="gods-list-main">
|
||||||
|
<span class="gods-list-label">${g.name}</span>
|
||||||
|
<span class="gods-list-tag">${tag}</span>
|
||||||
|
</div>
|
||||||
|
<div class="gods-list-sub">${g.role || g.epithet || "—"}</div>
|
||||||
|
</div>`;
|
||||||
|
}).join("");
|
||||||
|
|
||||||
|
listEl.querySelectorAll(".gods-list-item").forEach((el) => {
|
||||||
|
el.addEventListener("click", () => selectGod(el.dataset.id));
|
||||||
|
el.addEventListener("keydown", (e) => {
|
||||||
|
if (e.key === "Enter" || e.key === " ") selectGod(el.dataset.id);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Detail ─────────────────────────────────────────────────────────────────
|
||||||
|
function renderDetail(id) {
|
||||||
|
if (!detailNameEl) return;
|
||||||
|
const g = state.gods.find((x) => x.id === id);
|
||||||
|
if (!g) {
|
||||||
|
detailNameEl.textContent = "—";
|
||||||
|
detailSubEl.textContent = "Select a deity to explore";
|
||||||
|
detailBodyEl.innerHTML = "";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
detailNameEl.textContent = g.name;
|
||||||
|
detailSubEl.textContent = g.epithet || g.role || "";
|
||||||
|
|
||||||
|
const cards = [];
|
||||||
|
|
||||||
|
// ── Role & Domains ──
|
||||||
|
if (g.role || g.domains?.length) {
|
||||||
|
const domHtml = g.domains?.length
|
||||||
|
? `<div class="gods-domain-row">${g.domains.map(d => `<span class="gods-domain-tag">${d}</span>`).join("")}</div>`
|
||||||
|
: "";
|
||||||
|
cards.push(`<div class="gods-card">
|
||||||
|
<div class="gods-card-title">⚡ Role & Domains</div>
|
||||||
|
${g.role ? `<div class="gods-card-body">${g.role}</div>` : ""}
|
||||||
|
${domHtml}
|
||||||
|
</div>`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Family ──
|
||||||
|
const hasFamily = [g.parents, g.siblings, g.consorts, g.children].some(a => a?.length);
|
||||||
|
if (hasFamily) {
|
||||||
|
const rows = [
|
||||||
|
g.parents?.length ? `<div class="gods-card-row"><span class="gods-field-label">Parents</span>${g.parents.join(", ")}</div>` : "",
|
||||||
|
g.siblings?.length ? `<div class="gods-card-row"><span class="gods-field-label">Siblings</span>${g.siblings.join(", ")}</div>` : "",
|
||||||
|
g.consorts?.length ? `<div class="gods-card-row"><span class="gods-field-label">Consort(s)</span>${g.consorts.join(", ")}</div>` : "",
|
||||||
|
g.children?.length ? `<div class="gods-card-row"><span class="gods-field-label">Children</span>${g.children.join(", ")}</div>` : "",
|
||||||
|
].filter(Boolean).join("");
|
||||||
|
cards.push(`<div class="gods-card">
|
||||||
|
<div class="gods-card-title">👨👩👧 Family</div>
|
||||||
|
${rows}
|
||||||
|
</div>`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Symbols & Sacred ──
|
||||||
|
if (g.symbols?.length || g.sacredAnimals?.length || g.sacredPlaces?.length) {
|
||||||
|
const rows = [
|
||||||
|
g.symbols?.length ? `<div class="gods-card-row"><span class="gods-field-label">Symbols</span>${g.symbols.join(", ")}</div>` : "",
|
||||||
|
g.sacredAnimals?.length ? `<div class="gods-card-row"><span class="gods-field-label">Sacred animals</span>${g.sacredAnimals.join(", ")}</div>` : "",
|
||||||
|
g.sacredPlaces?.length ? `<div class="gods-card-row"><span class="gods-field-label">Sacred places</span>${g.sacredPlaces.join(", ")}</div>` : "",
|
||||||
|
].filter(Boolean).join("");
|
||||||
|
cards.push(`<div class="gods-card">
|
||||||
|
<div class="gods-card-title">🔱 Sacred & Symbols</div>
|
||||||
|
${rows}
|
||||||
|
</div>`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Hebrew Name (divine names / archangels) ──
|
||||||
|
if (g.hebrew) {
|
||||||
|
const title = g.pantheon === "archangel" ? "☀️ Angelic Name" : "✡️ Hebrew Name";
|
||||||
|
cards.push(`<div class="gods-card gods-card--elohim">
|
||||||
|
<div class="gods-card-title">${title}</div>
|
||||||
|
<div class="gods-card-row" style="align-items:baseline;gap:10px;flex-wrap:wrap">
|
||||||
|
<span class="gods-hebrew">${g.hebrew}</span>
|
||||||
|
<span class="gods-transliteration">${g.name}</span>
|
||||||
|
</div>
|
||||||
|
${g.meaning ? `<div class="gods-card-row" style="color:#a1a1aa;font-size:12px">${g.meaning}</div>` : ""}
|
||||||
|
${g.sephirah ? `<div class="gods-card-row" style="color:#a1a1aa;font-size:12px">Governs Sephirah ${g.sephirah}</div>` : ""}
|
||||||
|
</div>`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Equivalents ──
|
||||||
|
if (g.equivalents?.length) {
|
||||||
|
const equivalentHtml = g.equivalents.map((equivalent) => {
|
||||||
|
const target = findEquivalentTarget(equivalent, g.id);
|
||||||
|
if (target) {
|
||||||
|
return `<button type="button" class="gods-equivalent-link" data-god-id="${target.id}">${equivalent} ↗</button>`;
|
||||||
|
}
|
||||||
|
return `<span class="gods-equivalent-text">${equivalent}</span>`;
|
||||||
|
}).join("");
|
||||||
|
|
||||||
|
cards.push(`<div class="gods-card">
|
||||||
|
<div class="gods-card-title">⟺ Equivalents</div>
|
||||||
|
<div class="gods-equivalent-row">${equivalentHtml}</div>
|
||||||
|
</div>`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const monthRefs = state.monthRefsByGodId.get(String(g.id || "").toLowerCase()) || [];
|
||||||
|
if (monthRefs.length) {
|
||||||
|
const monthButtons = monthRefs.map((month) =>
|
||||||
|
`<button class="gods-nav-btn" data-event="nav:calendar-month" data-month-id="${month.id}">${month.label || month.name} ↗</button>`
|
||||||
|
).join("");
|
||||||
|
|
||||||
|
cards.push(`<div class="gods-card gods-card--kab">
|
||||||
|
<div class="gods-card-title">📅 Calendar Months</div>
|
||||||
|
<div class="gods-card-row" style="color:#a1a1aa;font-size:12px">Linked month correspondences for ${g.name}</div>
|
||||||
|
<div class="gods-nav-row">${monthButtons}</div>
|
||||||
|
</div>`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Description ──
|
||||||
|
if (g.description) {
|
||||||
|
cards.push(`<div class="gods-card gods-card--wide">
|
||||||
|
<div class="gods-card-title">📖 Description</div>
|
||||||
|
<div class="gods-card-body" style="white-space:pre-line">${g.description}</div>
|
||||||
|
</div>`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Myth ──
|
||||||
|
if (g.myth) {
|
||||||
|
cards.push(`<div class="gods-card gods-card--wide">
|
||||||
|
<div class="gods-card-title">📜 Myth</div>
|
||||||
|
<div class="gods-card-body" style="white-space:pre-line">${g.myth}</div>
|
||||||
|
</div>`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Poem ──
|
||||||
|
if (g.poem) {
|
||||||
|
cards.push(`<div class="gods-card gods-card--wide">
|
||||||
|
<div class="gods-card-title">✍️ Poem</div>
|
||||||
|
<div class="gods-card-body" style="white-space:pre-line;font-style:italic">${g.poem}</div>
|
||||||
|
</div>`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Kabbalah reference (small, at bottom) ──
|
||||||
|
if (g.kabbalahPaths?.length) {
|
||||||
|
const btnHtml = g.kabbalahPaths.map(p =>
|
||||||
|
`<button class="gods-nav-btn" data-event="nav:kabbalah-path" data-path-no="${p}">Path / Sephirah ${p} ↗</button>`
|
||||||
|
).join("");
|
||||||
|
cards.push(`<div class="gods-card gods-card--kab">
|
||||||
|
<div class="gods-card-title">🌳 Kabbalah Reference</div>
|
||||||
|
<div class="gods-card-row" style="color:#a1a1aa;font-size:12px">Paths: ${g.kabbalahPaths.join(", ")}</div>
|
||||||
|
<div class="gods-nav-row">${btnHtml}</div>
|
||||||
|
</div>`);
|
||||||
|
}
|
||||||
|
|
||||||
|
detailBodyEl.innerHTML = `<div class="gods-detail-grid">${cards.join("")}</div>`;
|
||||||
|
|
||||||
|
// Attach nav button listeners
|
||||||
|
detailBodyEl.querySelectorAll(".gods-nav-btn[data-event]").forEach((btn) => {
|
||||||
|
btn.addEventListener("click", () => {
|
||||||
|
const evtName = btn.dataset.event;
|
||||||
|
const detail = {};
|
||||||
|
Object.entries(btn.dataset).forEach(([key, val]) => {
|
||||||
|
if (key === "event") return;
|
||||||
|
const camel = key.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
|
||||||
|
detail[camel] = isNaN(Number(val)) || val === "" ? val : Number(val);
|
||||||
|
});
|
||||||
|
document.dispatchEvent(new CustomEvent(evtName, { detail }));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
detailBodyEl.querySelectorAll(".gods-equivalent-link[data-god-id]").forEach((btn) => {
|
||||||
|
btn.addEventListener("click", () => {
|
||||||
|
const godId = btn.dataset.godId;
|
||||||
|
if (godId) selectGod(godId);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Tabs ───────────────────────────────────────────────────────────────────
|
||||||
|
function renderTabs() {
|
||||||
|
const tabsEl = document.getElementById("gods-tabs");
|
||||||
|
if (!tabsEl) return;
|
||||||
|
tabsEl.innerHTML = TABS.map((t) =>
|
||||||
|
`<button class="gods-tab-btn${state.activeTab === t.id ? " gods-tab-active" : ""}" data-tab="${t.id}">${t.emoji} ${t.label}</button>`
|
||||||
|
).join("");
|
||||||
|
tabsEl.querySelectorAll(".gods-tab-btn").forEach((btn) => {
|
||||||
|
btn.addEventListener("click", () => {
|
||||||
|
state.activeTab = btn.dataset.tab;
|
||||||
|
renderTabs();
|
||||||
|
applyFilter();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Public: select god by id ───────────────────────────────────────────────
|
||||||
|
function selectGod(id) {
|
||||||
|
const g = state.gods.find((x) => x.id === id);
|
||||||
|
if (!g) return false;
|
||||||
|
if (g && state.activeTab !== "all" && g.pantheon !== state.activeTab) {
|
||||||
|
state.activeTab = "all";
|
||||||
|
renderTabs();
|
||||||
|
}
|
||||||
|
state.selectedId = id;
|
||||||
|
applyFilter();
|
||||||
|
requestAnimationFrame(() => {
|
||||||
|
const item = listEl?.querySelector(`[data-id="${id}"]`);
|
||||||
|
if (item) item.scrollIntoView({ block: "nearest", behavior: "smooth" });
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function selectById(godId) {
|
||||||
|
return selectGod(godId);
|
||||||
|
}
|
||||||
|
|
||||||
|
function selectByName(name) {
|
||||||
|
const tokens = tokenizeEquivalent(name);
|
||||||
|
for (const token of tokens) {
|
||||||
|
const matches = state.godsByName.get(normalizeName(token));
|
||||||
|
const target = matches?.[0];
|
||||||
|
if (target?.id) {
|
||||||
|
return selectGod(target.id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Public: navigate here from kabbalah (find first god on that path) ──────
|
||||||
|
function selectByPathNo(pathNo) {
|
||||||
|
const no = Number(pathNo);
|
||||||
|
const g = state.gods.find((x) => x.kabbalahPaths?.includes(no));
|
||||||
|
if (g) return selectGod(g.id);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Init ───────────────────────────────────────────────────────────────────
|
||||||
|
function ensureGodsSection(magickDataset, referenceData = null) {
|
||||||
|
if (referenceData) {
|
||||||
|
state.monthRefsByGodId = buildMonthReferencesByGod(referenceData);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state.initialized) {
|
||||||
|
if (state.selectedId) {
|
||||||
|
renderDetail(state.selectedId);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
state.initialized = true;
|
||||||
|
|
||||||
|
listEl = document.getElementById("gods-list");
|
||||||
|
detailNameEl = document.getElementById("gods-detail-name");
|
||||||
|
detailSubEl = document.getElementById("gods-detail-sub");
|
||||||
|
detailBodyEl = document.getElementById("gods-detail-body");
|
||||||
|
countEl = document.getElementById("gods-count");
|
||||||
|
searchInputEl = document.getElementById("gods-search-input");
|
||||||
|
searchClearEl = document.getElementById("gods-search-clear");
|
||||||
|
|
||||||
|
const godsData = magickDataset?.grouped?.["gods"];
|
||||||
|
if (!godsData?.gods?.length) {
|
||||||
|
if (listEl) listEl.innerHTML = `<div style="padding:20px;color:#ef4444">Failed to load gods data.</div>`;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
state.gods = godsData.gods;
|
||||||
|
state.godsByName = state.gods.reduce((map, god) => {
|
||||||
|
const key = normalizeName(god.name);
|
||||||
|
const row = map.get(key) || [];
|
||||||
|
row.push(god);
|
||||||
|
map.set(key, row);
|
||||||
|
return map;
|
||||||
|
}, new Map());
|
||||||
|
|
||||||
|
if (searchInputEl) {
|
||||||
|
searchInputEl.addEventListener("input", () => {
|
||||||
|
state.searchQuery = searchInputEl.value;
|
||||||
|
if (searchClearEl) searchClearEl.disabled = !state.searchQuery;
|
||||||
|
applyFilter();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (searchClearEl) {
|
||||||
|
searchClearEl.disabled = true;
|
||||||
|
searchClearEl.addEventListener("click", () => {
|
||||||
|
state.searchQuery = "";
|
||||||
|
if (searchInputEl) searchInputEl.value = "";
|
||||||
|
searchClearEl.disabled = true;
|
||||||
|
applyFilter();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
renderTabs();
|
||||||
|
applyFilter();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Expose public API ──────────────────────────────────────────────────────
|
||||||
|
window.GodsSectionUi = { ensureGodsSection, selectByPathNo, selectById, selectByName };
|
||||||
|
})();
|
||||||
|
|
||||||
1107
app/ui-holidays.js
Normal file
882
app/ui-iching.js
Normal file
@@ -0,0 +1,882 @@
|
|||||||
|
(function () {
|
||||||
|
const { getTarotCardSearchAliases } = window.TarotCardImages || {};
|
||||||
|
|
||||||
|
const state = {
|
||||||
|
initialized: false,
|
||||||
|
hexagrams: [],
|
||||||
|
filteredHexagrams: [],
|
||||||
|
trigramsByName: {},
|
||||||
|
tarotByTrigramName: {},
|
||||||
|
monthRefsByHexagramNumber: new Map(),
|
||||||
|
searchQuery: "",
|
||||||
|
selectedNumber: null
|
||||||
|
};
|
||||||
|
|
||||||
|
const ICHING_PLANET_BY_PLANET_ID = {
|
||||||
|
sol: "Sun",
|
||||||
|
luna: "Moon",
|
||||||
|
mercury: "Mercury",
|
||||||
|
venus: "Venus",
|
||||||
|
mars: "Mars",
|
||||||
|
jupiter: "Jupiter",
|
||||||
|
saturn: "Saturn",
|
||||||
|
earth: "Earth",
|
||||||
|
uranus: "Uranus",
|
||||||
|
neptune: "Neptune",
|
||||||
|
pluto: "Pluto"
|
||||||
|
};
|
||||||
|
|
||||||
|
function getElements() {
|
||||||
|
return {
|
||||||
|
ichingCardListEl: document.getElementById("iching-card-list"),
|
||||||
|
ichingSearchInputEl: document.getElementById("iching-search-input"),
|
||||||
|
ichingSearchClearEl: document.getElementById("iching-search-clear"),
|
||||||
|
ichingCountEl: document.getElementById("iching-card-count"),
|
||||||
|
ichingDetailNameEl: document.getElementById("iching-detail-name"),
|
||||||
|
ichingDetailTypeEl: document.getElementById("iching-detail-type"),
|
||||||
|
ichingDetailSummaryEl: document.getElementById("iching-detail-summary"),
|
||||||
|
ichingDetailJudgementEl: document.getElementById("iching-detail-judgement"),
|
||||||
|
ichingDetailImageEl: document.getElementById("iching-detail-image"),
|
||||||
|
ichingDetailBinaryEl: document.getElementById("iching-detail-binary"),
|
||||||
|
ichingDetailLineEl: document.getElementById("iching-detail-line"),
|
||||||
|
ichingDetailKeywordsEl: document.getElementById("iching-detail-keywords"),
|
||||||
|
ichingDetailTrigramsEl: document.getElementById("iching-detail-trigrams"),
|
||||||
|
ichingDetailPlanetEl: document.getElementById("iching-detail-planet"),
|
||||||
|
ichingDetailTarotEl: document.getElementById("iching-detail-tarot"),
|
||||||
|
ichingDetailCalendarEl: document.getElementById("iching-detail-calendar")
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function normalizeSearchValue(value) {
|
||||||
|
return String(value || "").trim().toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
function clearChildren(element) {
|
||||||
|
if (element) {
|
||||||
|
element.replaceChildren();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTrigramByName(name) {
|
||||||
|
const key = normalizeSearchValue(name);
|
||||||
|
return key ? state.trigramsByName[key] || null : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function normalizePlanetInfluence(value) {
|
||||||
|
return String(value || "")
|
||||||
|
.trim()
|
||||||
|
.toLowerCase()
|
||||||
|
.replace(/[^a-z]/g, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
function resolveAssociationPlanetInfluence(associations) {
|
||||||
|
if (!associations || typeof associations !== "object") {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
const explicit = normalizePlanetInfluence(associations.iChingPlanetaryInfluence || associations.planetaryInfluence);
|
||||||
|
if (explicit) {
|
||||||
|
return explicit;
|
||||||
|
}
|
||||||
|
|
||||||
|
const planetId = normalizePlanetInfluence(associations.planetId);
|
||||||
|
if (!planetId) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
return normalizePlanetInfluence(ICHING_PLANET_BY_PLANET_ID[planetId]);
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildMonthReferencesByHexagram(referenceData, hexagrams) {
|
||||||
|
const map = new Map();
|
||||||
|
const months = Array.isArray(referenceData?.calendarMonths) ? referenceData.calendarMonths : [];
|
||||||
|
const holidays = Array.isArray(referenceData?.celestialHolidays) ? referenceData.celestialHolidays : [];
|
||||||
|
const monthById = new Map(months.map((month) => [month.id, month]));
|
||||||
|
|
||||||
|
function parseMonthDayToken(value) {
|
||||||
|
const text = String(value || "").trim();
|
||||||
|
const match = text.match(/^(\d{1,2})-(\d{1,2})$/);
|
||||||
|
if (!match) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const monthNo = Number(match[1]);
|
||||||
|
const dayNo = Number(match[2]);
|
||||||
|
if (!Number.isInteger(monthNo) || !Number.isInteger(dayNo) || monthNo < 1 || monthNo > 12 || dayNo < 1 || dayNo > 31) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return { month: monthNo, day: dayNo };
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseMonthDayTokensFromText(value) {
|
||||||
|
const text = String(value || "");
|
||||||
|
const matches = [...text.matchAll(/(\d{1,2})-(\d{1,2})/g)];
|
||||||
|
return matches
|
||||||
|
.map((match) => ({ month: Number(match[1]), day: Number(match[2]) }))
|
||||||
|
.filter((token) => Number.isInteger(token.month) && Number.isInteger(token.day) && token.month >= 1 && token.month <= 12 && token.day >= 1 && token.day <= 31);
|
||||||
|
}
|
||||||
|
|
||||||
|
function toDateToken(token, year) {
|
||||||
|
if (!token) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return new Date(year, token.month - 1, token.day, 12, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
function splitMonthDayRangeByMonth(startToken, endToken) {
|
||||||
|
const startDate = toDateToken(startToken, 2025);
|
||||||
|
const endBase = toDateToken(endToken, 2025);
|
||||||
|
if (!startDate || !endBase) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
const wrapsYear = endBase.getTime() < startDate.getTime();
|
||||||
|
const endDate = wrapsYear ? toDateToken(endToken, 2026) : endBase;
|
||||||
|
if (!endDate) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
const segments = [];
|
||||||
|
let cursor = new Date(startDate);
|
||||||
|
while (cursor.getTime() <= endDate.getTime()) {
|
||||||
|
const monthEnd = new Date(cursor.getFullYear(), cursor.getMonth() + 1, 0, 12, 0, 0, 0);
|
||||||
|
const segmentEnd = monthEnd.getTime() < endDate.getTime() ? monthEnd : endDate;
|
||||||
|
|
||||||
|
segments.push({
|
||||||
|
monthNo: cursor.getMonth() + 1,
|
||||||
|
startDay: cursor.getDate(),
|
||||||
|
endDay: segmentEnd.getDate()
|
||||||
|
});
|
||||||
|
|
||||||
|
cursor = new Date(segmentEnd.getFullYear(), segmentEnd.getMonth(), segmentEnd.getDate() + 1, 12, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return segments;
|
||||||
|
}
|
||||||
|
|
||||||
|
function tokenToString(monthNo, dayNo) {
|
||||||
|
return `${String(monthNo).padStart(2, "0")}-${String(dayNo).padStart(2, "0")}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatRangeLabel(monthName, startDay, endDay) {
|
||||||
|
if (!Number.isFinite(startDay) || !Number.isFinite(endDay)) {
|
||||||
|
return monthName;
|
||||||
|
}
|
||||||
|
if (startDay === endDay) {
|
||||||
|
return `${monthName} ${startDay}`;
|
||||||
|
}
|
||||||
|
return `${monthName} ${startDay}-${endDay}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
function resolveRangeForMonth(month, options = {}) {
|
||||||
|
const monthOrder = Number(month?.order);
|
||||||
|
const monthStart = parseMonthDayToken(month?.start);
|
||||||
|
const monthEnd = parseMonthDayToken(month?.end);
|
||||||
|
if (!Number.isFinite(monthOrder) || !monthStart || !monthEnd) {
|
||||||
|
return {
|
||||||
|
startToken: String(month?.start || "").trim() || null,
|
||||||
|
endToken: String(month?.end || "").trim() || null,
|
||||||
|
label: month?.name || month?.id || "",
|
||||||
|
isFullMonth: true
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
let startToken = parseMonthDayToken(options.startToken);
|
||||||
|
let endToken = parseMonthDayToken(options.endToken);
|
||||||
|
|
||||||
|
if (!startToken || !endToken) {
|
||||||
|
const tokens = parseMonthDayTokensFromText(options.rawDateText);
|
||||||
|
if (tokens.length >= 2) {
|
||||||
|
startToken = tokens[0];
|
||||||
|
endToken = tokens[1];
|
||||||
|
} else if (tokens.length === 1) {
|
||||||
|
startToken = tokens[0];
|
||||||
|
endToken = tokens[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!startToken || !endToken) {
|
||||||
|
startToken = monthStart;
|
||||||
|
endToken = monthEnd;
|
||||||
|
}
|
||||||
|
|
||||||
|
const segments = splitMonthDayRangeByMonth(startToken, endToken);
|
||||||
|
const segment = segments.find((entry) => entry.monthNo === monthOrder) || null;
|
||||||
|
|
||||||
|
const useStart = segment ? { month: monthOrder, day: segment.startDay } : startToken;
|
||||||
|
const useEnd = segment ? { month: monthOrder, day: segment.endDay } : endToken;
|
||||||
|
const startText = tokenToString(useStart.month, useStart.day);
|
||||||
|
const endText = tokenToString(useEnd.month, useEnd.day);
|
||||||
|
const isFullMonth = startText === month.start && endText === month.end;
|
||||||
|
|
||||||
|
return {
|
||||||
|
startToken: startText,
|
||||||
|
endToken: endText,
|
||||||
|
label: isFullMonth
|
||||||
|
? (month.name || month.id)
|
||||||
|
: formatRangeLabel(month.name || month.id, useStart.day, useEnd.day),
|
||||||
|
isFullMonth
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function pushRef(hexagramNumber, month, options = {}) {
|
||||||
|
if (!Number.isFinite(hexagramNumber) || !month?.id) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!map.has(hexagramNumber)) {
|
||||||
|
map.set(hexagramNumber, []);
|
||||||
|
}
|
||||||
|
|
||||||
|
const rows = map.get(hexagramNumber);
|
||||||
|
const range = resolveRangeForMonth(month, options);
|
||||||
|
const rowKey = `${month.id}|${range.startToken || ""}|${range.endToken || ""}`;
|
||||||
|
if (rows.some((entry) => entry.key === rowKey)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
rows.push({
|
||||||
|
id: month.id,
|
||||||
|
name: month.name || month.id,
|
||||||
|
order: Number.isFinite(Number(month.order)) ? Number(month.order) : 999,
|
||||||
|
label: range.label,
|
||||||
|
startToken: range.startToken,
|
||||||
|
endToken: range.endToken,
|
||||||
|
isFullMonth: range.isFullMonth,
|
||||||
|
key: rowKey
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function collectRefs(associations, month, options = {}) {
|
||||||
|
const associationInfluence = resolveAssociationPlanetInfluence(associations);
|
||||||
|
if (!associationInfluence) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
hexagrams.forEach((hexagram) => {
|
||||||
|
const hexagramInfluence = normalizePlanetInfluence(hexagram?.planetaryInfluence);
|
||||||
|
if (hexagramInfluence && hexagramInfluence === associationInfluence) {
|
||||||
|
pushRef(hexagram.number, month, options);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
months.forEach((month) => {
|
||||||
|
collectRefs(month?.associations, month);
|
||||||
|
const events = Array.isArray(month?.events) ? month.events : [];
|
||||||
|
events.forEach((event) => {
|
||||||
|
collectRefs(event?.associations, month, {
|
||||||
|
rawDateText: event?.dateRange || event?.date || ""
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
holidays.forEach((holiday) => {
|
||||||
|
const month = monthById.get(holiday?.monthId);
|
||||||
|
if (!month) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
collectRefs(holiday?.associations, month, {
|
||||||
|
rawDateText: holiday?.dateRange || holiday?.date || ""
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
map.forEach((rows, key) => {
|
||||||
|
const preciseMonthIds = new Set(
|
||||||
|
rows
|
||||||
|
.filter((entry) => !entry.isFullMonth)
|
||||||
|
.map((entry) => entry.id)
|
||||||
|
);
|
||||||
|
|
||||||
|
const filtered = rows.filter((entry) => {
|
||||||
|
if (!entry.isFullMonth) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return !preciseMonthIds.has(entry.id);
|
||||||
|
});
|
||||||
|
|
||||||
|
filtered.sort((left, right) => {
|
||||||
|
if (left.order !== right.order) {
|
||||||
|
return left.order - right.order;
|
||||||
|
}
|
||||||
|
|
||||||
|
const startLeft = parseMonthDayToken(left.startToken);
|
||||||
|
const startRight = parseMonthDayToken(right.startToken);
|
||||||
|
const dayLeft = startLeft ? startLeft.day : 999;
|
||||||
|
const dayRight = startRight ? startRight.day : 999;
|
||||||
|
if (dayLeft !== dayRight) {
|
||||||
|
return dayLeft - dayRight;
|
||||||
|
}
|
||||||
|
|
||||||
|
return String(left.label || left.name || "").localeCompare(String(right.label || right.name || ""));
|
||||||
|
});
|
||||||
|
|
||||||
|
map.set(key, filtered);
|
||||||
|
});
|
||||||
|
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getBinaryPattern(value, expectedLength = 0) {
|
||||||
|
const raw = String(value || "").trim();
|
||||||
|
if (!raw) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (/^[01]+$/.test(raw)) {
|
||||||
|
if (!expectedLength || raw.length === expectedLength) {
|
||||||
|
return raw;
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (/^[|:]+$/.test(raw)) {
|
||||||
|
const mapped = raw
|
||||||
|
.split("")
|
||||||
|
.map((char) => (char === "|" ? "1" : "0"))
|
||||||
|
.join("");
|
||||||
|
if (!expectedLength || mapped.length === expectedLength) {
|
||||||
|
return mapped;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
function createLineStack(binaryPattern, variant = "trigram") {
|
||||||
|
const container = document.createElement("div");
|
||||||
|
container.className = `iching-lines iching-lines-${variant}`;
|
||||||
|
|
||||||
|
binaryPattern.split("").forEach((bit) => {
|
||||||
|
const line = document.createElement("div");
|
||||||
|
line.className = bit === "1" ? "iching-line is-yang" : "iching-line is-yin";
|
||||||
|
container.appendChild(line);
|
||||||
|
});
|
||||||
|
|
||||||
|
return container;
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildHexagramSearchText(entry) {
|
||||||
|
const upper = getTrigramByName(entry?.upperTrigram);
|
||||||
|
const lower = getTrigramByName(entry?.lowerTrigram);
|
||||||
|
const upperCards = upper ? state.tarotByTrigramName[normalizeSearchValue(upper.name)] || [] : [];
|
||||||
|
const lowerCards = lower ? state.tarotByTrigramName[normalizeSearchValue(lower.name)] || [] : [];
|
||||||
|
const tarotAliasText = typeof getTarotCardSearchAliases === "function"
|
||||||
|
? [...upperCards, ...lowerCards]
|
||||||
|
.flatMap((cardName) => getTarotCardSearchAliases(cardName))
|
||||||
|
.join(" ")
|
||||||
|
: [...upperCards, ...lowerCards].join(" ");
|
||||||
|
const parts = [
|
||||||
|
entry?.number,
|
||||||
|
entry?.name,
|
||||||
|
entry?.chineseName,
|
||||||
|
entry?.pinyin,
|
||||||
|
entry?.judgement,
|
||||||
|
entry?.image,
|
||||||
|
entry?.upperTrigram,
|
||||||
|
entry?.lowerTrigram,
|
||||||
|
entry?.planetaryInfluence,
|
||||||
|
entry?.binary,
|
||||||
|
entry?.lineDiagram,
|
||||||
|
...(Array.isArray(entry?.keywords) ? entry.keywords : []),
|
||||||
|
upper?.name,
|
||||||
|
upper?.chineseName,
|
||||||
|
upper?.pinyin,
|
||||||
|
upper?.element,
|
||||||
|
upper?.attribute,
|
||||||
|
upper?.binary,
|
||||||
|
upper?.description,
|
||||||
|
lower?.name,
|
||||||
|
lower?.chineseName,
|
||||||
|
lower?.pinyin,
|
||||||
|
lower?.element,
|
||||||
|
lower?.attribute,
|
||||||
|
lower?.binary,
|
||||||
|
lower?.description,
|
||||||
|
upperCards.join(" "),
|
||||||
|
lowerCards.join(" "),
|
||||||
|
tarotAliasText
|
||||||
|
];
|
||||||
|
|
||||||
|
return normalizeSearchValue(parts.filter((part) => part !== null && part !== undefined).join(" "));
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateSelection(elements) {
|
||||||
|
if (!elements?.ichingCardListEl) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const buttons = elements.ichingCardListEl.querySelectorAll(".planet-list-item");
|
||||||
|
buttons.forEach((button) => {
|
||||||
|
const isSelected = Number(button.dataset.hexagramNumber) === state.selectedNumber;
|
||||||
|
button.classList.toggle("is-selected", isSelected);
|
||||||
|
button.setAttribute("aria-selected", isSelected ? "true" : "false");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderEmptyDetail(elements, detailName = "No hexagrams found") {
|
||||||
|
if (!elements) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elements.ichingDetailNameEl) {
|
||||||
|
elements.ichingDetailNameEl.textContent = detailName;
|
||||||
|
}
|
||||||
|
if (elements.ichingDetailTypeEl) {
|
||||||
|
elements.ichingDetailTypeEl.textContent = "--";
|
||||||
|
}
|
||||||
|
if (elements.ichingDetailSummaryEl) {
|
||||||
|
elements.ichingDetailSummaryEl.textContent = "--";
|
||||||
|
}
|
||||||
|
if (elements.ichingDetailJudgementEl) {
|
||||||
|
elements.ichingDetailJudgementEl.textContent = "--";
|
||||||
|
}
|
||||||
|
if (elements.ichingDetailImageEl) {
|
||||||
|
elements.ichingDetailImageEl.textContent = "--";
|
||||||
|
}
|
||||||
|
if (elements.ichingDetailBinaryEl) {
|
||||||
|
elements.ichingDetailBinaryEl.textContent = "--";
|
||||||
|
}
|
||||||
|
if (elements.ichingDetailLineEl) {
|
||||||
|
clearChildren(elements.ichingDetailLineEl);
|
||||||
|
elements.ichingDetailLineEl.textContent = "--";
|
||||||
|
}
|
||||||
|
if (elements.ichingDetailPlanetEl) {
|
||||||
|
elements.ichingDetailPlanetEl.textContent = "--";
|
||||||
|
}
|
||||||
|
if (elements.ichingDetailTarotEl) {
|
||||||
|
elements.ichingDetailTarotEl.textContent = "--";
|
||||||
|
}
|
||||||
|
if (elements.ichingDetailCalendarEl) {
|
||||||
|
clearChildren(elements.ichingDetailCalendarEl);
|
||||||
|
elements.ichingDetailCalendarEl.textContent = "--";
|
||||||
|
}
|
||||||
|
|
||||||
|
clearChildren(elements.ichingDetailKeywordsEl);
|
||||||
|
clearChildren(elements.ichingDetailTrigramsEl);
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderKeywords(entry, elements) {
|
||||||
|
clearChildren(elements.ichingDetailKeywordsEl);
|
||||||
|
const keywords = Array.isArray(entry?.keywords) ? entry.keywords : [];
|
||||||
|
|
||||||
|
if (!keywords.length) {
|
||||||
|
if (elements.ichingDetailKeywordsEl) {
|
||||||
|
elements.ichingDetailKeywordsEl.textContent = "--";
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
keywords.forEach((keyword) => {
|
||||||
|
const chip = document.createElement("span");
|
||||||
|
chip.className = "tarot-keyword-chip";
|
||||||
|
chip.textContent = keyword;
|
||||||
|
elements.ichingDetailKeywordsEl?.appendChild(chip);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function createTrigramCard(label, trigram) {
|
||||||
|
const card = document.createElement("div");
|
||||||
|
card.className = "iching-trigram-card";
|
||||||
|
|
||||||
|
if (!trigram) {
|
||||||
|
card.textContent = `${label}: --`;
|
||||||
|
return card;
|
||||||
|
}
|
||||||
|
|
||||||
|
const title = document.createElement("div");
|
||||||
|
title.className = "iching-trigram-title";
|
||||||
|
const chinese = trigram.chineseName ? ` (${trigram.chineseName})` : "";
|
||||||
|
title.textContent = `${label}: ${trigram.name || "--"}${chinese}`;
|
||||||
|
|
||||||
|
const meta = document.createElement("div");
|
||||||
|
meta.className = "iching-trigram-meta";
|
||||||
|
const attribute = trigram.attribute || "--";
|
||||||
|
const element = trigram.element || "--";
|
||||||
|
meta.textContent = `${attribute} · ${element}`;
|
||||||
|
|
||||||
|
const diagram = document.createElement("div");
|
||||||
|
diagram.className = "iching-trigram-diagram";
|
||||||
|
const binaryPattern = getBinaryPattern(trigram.binary || trigram.lineDiagram, 3);
|
||||||
|
|
||||||
|
if (binaryPattern) {
|
||||||
|
const binaryLabel = document.createElement("div");
|
||||||
|
binaryLabel.className = "iching-line-label";
|
||||||
|
binaryLabel.textContent = binaryPattern;
|
||||||
|
diagram.append(binaryLabel, createLineStack(binaryPattern, "trigram"));
|
||||||
|
} else {
|
||||||
|
diagram.textContent = "--";
|
||||||
|
}
|
||||||
|
|
||||||
|
card.append(title, meta, diagram);
|
||||||
|
|
||||||
|
if (trigram.description) {
|
||||||
|
const description = document.createElement("div");
|
||||||
|
description.className = "planet-text";
|
||||||
|
description.textContent = trigram.description;
|
||||||
|
card.appendChild(description);
|
||||||
|
}
|
||||||
|
|
||||||
|
return card;
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderTrigrams(entry, elements) {
|
||||||
|
clearChildren(elements.ichingDetailTrigramsEl);
|
||||||
|
|
||||||
|
const upper = getTrigramByName(entry?.upperTrigram);
|
||||||
|
const lower = getTrigramByName(entry?.lowerTrigram);
|
||||||
|
|
||||||
|
elements.ichingDetailTrigramsEl?.append(
|
||||||
|
createTrigramCard("Upper", upper),
|
||||||
|
createTrigramCard("Lower", lower)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderTarotCorrespondences(entry, elements) {
|
||||||
|
if (!elements?.ichingDetailTarotEl) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const upperKey = normalizeSearchValue(entry?.upperTrigram);
|
||||||
|
const lowerKey = normalizeSearchValue(entry?.lowerTrigram);
|
||||||
|
const upperCards = upperKey ? state.tarotByTrigramName[upperKey] || [] : [];
|
||||||
|
const lowerCards = lowerKey ? state.tarotByTrigramName[lowerKey] || [] : [];
|
||||||
|
|
||||||
|
const upperTrigram = upperKey ? state.trigramsByName[upperKey] : null;
|
||||||
|
const lowerTrigram = lowerKey ? state.trigramsByName[lowerKey] : null;
|
||||||
|
const upperLabel = upperTrigram?.element || entry?.upperTrigram || "--";
|
||||||
|
const lowerLabel = lowerTrigram?.element || entry?.lowerTrigram || "--";
|
||||||
|
|
||||||
|
const lines = [];
|
||||||
|
if (upperKey) {
|
||||||
|
lines.push(`Upper (${upperLabel}): ${upperCards.length ? upperCards.join(", ") : "--"}`);
|
||||||
|
}
|
||||||
|
if (lowerKey) {
|
||||||
|
lines.push(`Lower (${lowerLabel}): ${lowerCards.length ? lowerCards.join(", ") : "--"}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
elements.ichingDetailTarotEl.textContent = lines.length ? lines.join("\n\n") : "--";
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderCalendarMonths(entry, elements) {
|
||||||
|
if (!elements?.ichingDetailCalendarEl) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
clearChildren(elements.ichingDetailCalendarEl);
|
||||||
|
const rows = state.monthRefsByHexagramNumber.get(entry?.number) || [];
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
elements.ichingDetailCalendarEl.textContent = "--";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
rows.forEach((month) => {
|
||||||
|
const button = document.createElement("button");
|
||||||
|
button.type = "button";
|
||||||
|
button.className = "alpha-nav-btn";
|
||||||
|
button.textContent = `${month.label || month.name} ↗`;
|
||||||
|
button.addEventListener("click", () => {
|
||||||
|
document.dispatchEvent(new CustomEvent("nav:calendar-month", {
|
||||||
|
detail: { monthId: month.id }
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
elements.ichingDetailCalendarEl.appendChild(button);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderDetail(entry, elements) {
|
||||||
|
if (!entry || !elements) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const number = Number.isFinite(entry.number) ? entry.number : "--";
|
||||||
|
if (elements.ichingDetailNameEl) {
|
||||||
|
elements.ichingDetailNameEl.textContent = `${number} · ${entry.name || "--"}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elements.ichingDetailTypeEl) {
|
||||||
|
const chinese = entry.chineseName || "--";
|
||||||
|
const pinyin = entry.pinyin || "--";
|
||||||
|
const upper = entry.upperTrigram || "--";
|
||||||
|
const lower = entry.lowerTrigram || "--";
|
||||||
|
elements.ichingDetailTypeEl.textContent = `Hexagram · ${chinese} · ${pinyin} · ${upper}/${lower}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elements.ichingDetailSummaryEl) {
|
||||||
|
elements.ichingDetailSummaryEl.textContent = entry.judgement || "--";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elements.ichingDetailJudgementEl) {
|
||||||
|
elements.ichingDetailJudgementEl.textContent = entry.judgement || "--";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elements.ichingDetailImageEl) {
|
||||||
|
elements.ichingDetailImageEl.textContent = entry.image || "--";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elements.ichingDetailBinaryEl) {
|
||||||
|
const binary = entry.binary || "--";
|
||||||
|
elements.ichingDetailBinaryEl.textContent = `Binary: ${binary}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elements.ichingDetailLineEl) {
|
||||||
|
clearChildren(elements.ichingDetailLineEl);
|
||||||
|
const linePattern = getBinaryPattern(entry.binary, 6) || getBinaryPattern(entry.lineDiagram, 6);
|
||||||
|
if (linePattern) {
|
||||||
|
elements.ichingDetailLineEl.appendChild(createLineStack(linePattern, "hexagram"));
|
||||||
|
} else {
|
||||||
|
elements.ichingDetailLineEl.textContent = "--";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elements.ichingDetailPlanetEl) {
|
||||||
|
elements.ichingDetailPlanetEl.textContent = entry.planetaryInfluence || "--";
|
||||||
|
}
|
||||||
|
|
||||||
|
renderKeywords(entry, elements);
|
||||||
|
renderTrigrams(entry, elements);
|
||||||
|
renderTarotCorrespondences(entry, elements);
|
||||||
|
renderCalendarMonths(entry, elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
function selectByNumber(number, elements) {
|
||||||
|
const numeric = Number(number);
|
||||||
|
if (!Number.isFinite(numeric)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const entry = state.hexagrams.find((hexagram) => hexagram.number === numeric);
|
||||||
|
if (!entry) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
state.selectedNumber = entry.number;
|
||||||
|
updateSelection(elements);
|
||||||
|
renderDetail(entry, elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderList(elements) {
|
||||||
|
if (!elements?.ichingCardListEl) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
clearChildren(elements.ichingCardListEl);
|
||||||
|
|
||||||
|
state.filteredHexagrams.forEach((entry) => {
|
||||||
|
const button = document.createElement("button");
|
||||||
|
button.type = "button";
|
||||||
|
button.className = "planet-list-item";
|
||||||
|
button.dataset.hexagramNumber = String(entry.number);
|
||||||
|
button.setAttribute("role", "option");
|
||||||
|
|
||||||
|
const nameEl = document.createElement("span");
|
||||||
|
nameEl.className = "planet-list-name";
|
||||||
|
const number = Number.isFinite(entry.number) ? `#${entry.number} ` : "";
|
||||||
|
nameEl.textContent = `${number}${entry.name || "--"}`;
|
||||||
|
|
||||||
|
const metaEl = document.createElement("span");
|
||||||
|
metaEl.className = "planet-list-meta";
|
||||||
|
const upper = entry.upperTrigram || "--";
|
||||||
|
const lower = entry.lowerTrigram || "--";
|
||||||
|
metaEl.textContent = `${upper}/${lower} · ${entry.planetaryInfluence || "--"}`;
|
||||||
|
|
||||||
|
button.append(nameEl, metaEl);
|
||||||
|
elements.ichingCardListEl.appendChild(button);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (elements.ichingCountEl) {
|
||||||
|
elements.ichingCountEl.textContent = state.searchQuery
|
||||||
|
? `${state.filteredHexagrams.length} of ${state.hexagrams.length} hexagrams`
|
||||||
|
: `${state.hexagrams.length} hexagrams`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function applySearchFilter(elements) {
|
||||||
|
const query = normalizeSearchValue(state.searchQuery);
|
||||||
|
state.filteredHexagrams = query
|
||||||
|
? state.hexagrams.filter((entry) => buildHexagramSearchText(entry).includes(query))
|
||||||
|
: [...state.hexagrams];
|
||||||
|
|
||||||
|
if (elements?.ichingSearchClearEl) {
|
||||||
|
elements.ichingSearchClearEl.disabled = !query;
|
||||||
|
}
|
||||||
|
|
||||||
|
renderList(elements);
|
||||||
|
|
||||||
|
if (!state.filteredHexagrams.some((entry) => entry.number === state.selectedNumber)) {
|
||||||
|
if (state.filteredHexagrams.length > 0) {
|
||||||
|
selectByNumber(state.filteredHexagrams[0].number, elements);
|
||||||
|
} else {
|
||||||
|
state.selectedNumber = null;
|
||||||
|
updateSelection(elements);
|
||||||
|
renderEmptyDetail(elements);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
updateSelection(elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
function ensureIChingSection(referenceData) {
|
||||||
|
const elements = getElements();
|
||||||
|
|
||||||
|
if (state.initialized) {
|
||||||
|
state.monthRefsByHexagramNumber = buildMonthReferencesByHexagram(referenceData, state.hexagrams);
|
||||||
|
const selected = state.hexagrams.find((hexagram) => hexagram.number === state.selectedNumber);
|
||||||
|
if (selected) {
|
||||||
|
renderDetail(selected, elements);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!elements.ichingCardListEl || !elements.ichingDetailNameEl) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const iChing = referenceData?.iChing;
|
||||||
|
const trigrams = Array.isArray(iChing?.trigrams) ? iChing.trigrams : [];
|
||||||
|
const hexagrams = Array.isArray(iChing?.hexagrams) ? iChing.hexagrams : [];
|
||||||
|
const correspondences = iChing?.correspondences;
|
||||||
|
|
||||||
|
if (!hexagrams.length) {
|
||||||
|
renderEmptyDetail(elements, "I Ching data unavailable");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
state.trigramsByName = trigrams.reduce((acc, trigram) => {
|
||||||
|
const key = normalizeSearchValue(trigram?.name);
|
||||||
|
if (key) {
|
||||||
|
acc[key] = trigram;
|
||||||
|
}
|
||||||
|
return acc;
|
||||||
|
}, {});
|
||||||
|
|
||||||
|
const tarotToTrigram = Array.isArray(correspondences?.tarotToTrigram)
|
||||||
|
? correspondences.tarotToTrigram
|
||||||
|
: [];
|
||||||
|
|
||||||
|
state.tarotByTrigramName = tarotToTrigram.reduce((acc, row) => {
|
||||||
|
const key = normalizeSearchValue(row?.trigram);
|
||||||
|
const tarotCard = String(row?.tarot || "").trim();
|
||||||
|
if (!key || !tarotCard) {
|
||||||
|
return acc;
|
||||||
|
}
|
||||||
|
if (!Array.isArray(acc[key])) {
|
||||||
|
acc[key] = [];
|
||||||
|
}
|
||||||
|
if (!acc[key].includes(tarotCard)) {
|
||||||
|
acc[key].push(tarotCard);
|
||||||
|
}
|
||||||
|
return acc;
|
||||||
|
}, {});
|
||||||
|
|
||||||
|
state.hexagrams = [...hexagrams]
|
||||||
|
.map((entry) => ({
|
||||||
|
...entry,
|
||||||
|
number: Number(entry?.number)
|
||||||
|
}))
|
||||||
|
.filter((entry) => Number.isFinite(entry.number))
|
||||||
|
.sort((a, b) => a.number - b.number);
|
||||||
|
|
||||||
|
state.monthRefsByHexagramNumber = buildMonthReferencesByHexagram(referenceData, state.hexagrams);
|
||||||
|
|
||||||
|
state.filteredHexagrams = [...state.hexagrams];
|
||||||
|
renderList(elements);
|
||||||
|
|
||||||
|
if (state.hexagrams.length > 0) {
|
||||||
|
selectByNumber(state.hexagrams[0].number, elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
elements.ichingCardListEl.addEventListener("click", (event) => {
|
||||||
|
const target = event.target;
|
||||||
|
if (!(target instanceof Node)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const button = target instanceof Element
|
||||||
|
? target.closest(".planet-list-item")
|
||||||
|
: null;
|
||||||
|
|
||||||
|
if (!(button instanceof HTMLButtonElement)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const selectedNumber = button.dataset.hexagramNumber;
|
||||||
|
if (!selectedNumber) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
selectByNumber(selectedNumber, elements);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (elements.ichingSearchInputEl) {
|
||||||
|
elements.ichingSearchInputEl.addEventListener("input", () => {
|
||||||
|
state.searchQuery = elements.ichingSearchInputEl.value || "";
|
||||||
|
applySearchFilter(elements);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elements.ichingSearchClearEl && elements.ichingSearchInputEl) {
|
||||||
|
elements.ichingSearchClearEl.addEventListener("click", () => {
|
||||||
|
elements.ichingSearchInputEl.value = "";
|
||||||
|
state.searchQuery = "";
|
||||||
|
applySearchFilter(elements);
|
||||||
|
elements.ichingSearchInputEl.focus();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
state.initialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function selectByHexagramNumber(number) {
|
||||||
|
if (!state.initialized) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const elements = getElements();
|
||||||
|
const numeric = Number(number);
|
||||||
|
if (!Number.isFinite(numeric)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const entry = state.hexagrams.find((hexagram) => hexagram.number === numeric);
|
||||||
|
if (!entry) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
selectByNumber(entry.number, elements);
|
||||||
|
elements.ichingCardListEl
|
||||||
|
?.querySelector(`[data-hexagram-number="${entry.number}"]`)
|
||||||
|
?.scrollIntoView({ block: "nearest" });
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function selectByPlanetaryInfluence(planetaryInfluence) {
|
||||||
|
if (!state.initialized) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const targetInfluence = normalizePlanetInfluence(planetaryInfluence);
|
||||||
|
if (!targetInfluence) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const entry = state.hexagrams.find((hexagram) =>
|
||||||
|
normalizePlanetInfluence(hexagram?.planetaryInfluence) === targetInfluence
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!entry) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return selectByHexagramNumber(entry.number);
|
||||||
|
}
|
||||||
|
|
||||||
|
window.IChingSectionUi = {
|
||||||
|
ensureIChingSection,
|
||||||
|
selectByHexagramNumber,
|
||||||
|
selectByPlanetaryInfluence
|
||||||
|
};
|
||||||
|
})();
|
||||||
1153
app/ui-kabbalah.js
Normal file
185
app/ui-natal.js
Normal file
@@ -0,0 +1,185 @@
|
|||||||
|
(function () {
|
||||||
|
const DAY_IN_MS = 24 * 60 * 60 * 1000;
|
||||||
|
|
||||||
|
let referenceDataCache = null;
|
||||||
|
let natalSummaryEl = null;
|
||||||
|
|
||||||
|
function getNatalSummaryEl() {
|
||||||
|
if (!natalSummaryEl) {
|
||||||
|
natalSummaryEl = document.getElementById("natal-chart-summary")
|
||||||
|
|| document.getElementById("now-natal-summary");
|
||||||
|
}
|
||||||
|
return natalSummaryEl;
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseMonthDay(monthDay) {
|
||||||
|
const [month, day] = String(monthDay || "").split("-").map(Number);
|
||||||
|
if (!Number.isFinite(month) || !Number.isFinite(day)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return { month, day };
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseBirthDateAsLocalNoon(isoDate) {
|
||||||
|
const [year, month, day] = String(isoDate || "").split("-").map(Number);
|
||||||
|
if (!year || !month || !day) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return new Date(year, month - 1, day, 12, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
function isDateInSign(date, sign) {
|
||||||
|
const start = parseMonthDay(sign?.start);
|
||||||
|
const end = parseMonthDay(sign?.end);
|
||||||
|
if (!start || !end) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const month = date.getMonth() + 1;
|
||||||
|
const day = date.getDate();
|
||||||
|
const wrapsYear = start.month > end.month;
|
||||||
|
|
||||||
|
if (!wrapsYear) {
|
||||||
|
const afterStart = month > start.month || (month === start.month && day >= start.day);
|
||||||
|
const beforeEnd = month < end.month || (month === end.month && day <= end.day);
|
||||||
|
return afterStart && beforeEnd;
|
||||||
|
}
|
||||||
|
|
||||||
|
const afterStart = month > start.month || (month === start.month && day >= start.day);
|
||||||
|
const beforeEnd = month < end.month || (month === end.month && day <= end.day);
|
||||||
|
return afterStart || beforeEnd;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSignStartDate(date, sign) {
|
||||||
|
const start = parseMonthDay(sign?.start);
|
||||||
|
const end = parseMonthDay(sign?.end);
|
||||||
|
if (!start || !end) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const wrapsYear = start.month > end.month;
|
||||||
|
const month = date.getMonth() + 1;
|
||||||
|
const day = date.getDate();
|
||||||
|
let year = date.getFullYear();
|
||||||
|
|
||||||
|
if (wrapsYear && (month < start.month || (month === start.month && day < start.day))) {
|
||||||
|
year -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Date(year, start.month - 1, start.day, 12, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSunSignAnchor(referenceData, birthDate) {
|
||||||
|
const signs = Array.isArray(referenceData?.signs) ? referenceData.signs : [];
|
||||||
|
if (!signs.length || !birthDate) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const sign = signs.find((candidate) => isDateInSign(birthDate, candidate)) || null;
|
||||||
|
if (!sign) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
id: sign.id,
|
||||||
|
name: sign.name,
|
||||||
|
symbol: sign.symbol || "",
|
||||||
|
tarotMajorArcana: sign?.tarot?.majorArcana || ""
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSunDecanAnchor(referenceData, signId, birthDate) {
|
||||||
|
if (!signId || !birthDate) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const sign = (referenceData?.signs || []).find((entry) => entry.id === signId) || null;
|
||||||
|
if (!sign) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const signStartDate = getSignStartDate(birthDate, sign);
|
||||||
|
if (!signStartDate) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const daysSinceSignStart = Math.max(0, Math.floor((birthDate.getTime() - signStartDate.getTime()) / DAY_IN_MS));
|
||||||
|
const decanIndex = Math.max(1, Math.min(3, Math.floor(daysSinceSignStart / 10) + 1));
|
||||||
|
|
||||||
|
const decans = referenceData?.decansBySign?.[signId] || [];
|
||||||
|
const decan = decans.find((entry) => Number(entry.index) === decanIndex) || null;
|
||||||
|
|
||||||
|
return {
|
||||||
|
index: decanIndex,
|
||||||
|
tarotMinorArcana: decan?.tarotMinorArcana || ""
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildNatalScaffoldSummary() {
|
||||||
|
const context = window.TarotNatal?.getContext?.() || null;
|
||||||
|
if (!context) {
|
||||||
|
return "Natal Chart Scaffold: unavailable";
|
||||||
|
}
|
||||||
|
|
||||||
|
const birthDate = context.birthDateParts?.isoDate
|
||||||
|
? parseBirthDateAsLocalNoon(context.birthDateParts.isoDate)
|
||||||
|
: null;
|
||||||
|
|
||||||
|
if (!birthDate) {
|
||||||
|
return [
|
||||||
|
"Natal Chart Scaffold",
|
||||||
|
"Birth Date: --",
|
||||||
|
`Geo Anchor: ${context.latitude.toFixed(4)}, ${context.longitude.toFixed(4)}`,
|
||||||
|
"Sun Sign Anchor: --",
|
||||||
|
"Sun Decan Anchor: --",
|
||||||
|
"House Scaffold: 12 houses ready (Equal House placeholder), Ascendant/cusps pending birth time"
|
||||||
|
].join("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
const sunSign = getSunSignAnchor(referenceDataCache, birthDate);
|
||||||
|
const sunDecan = getSunDecanAnchor(referenceDataCache, sunSign?.id, birthDate);
|
||||||
|
|
||||||
|
const signLabel = sunSign
|
||||||
|
? `${sunSign.symbol} ${sunSign.name}${sunSign.tarotMajorArcana ? ` · ${sunSign.tarotMajorArcana}` : ""}`
|
||||||
|
: "--";
|
||||||
|
|
||||||
|
const decanLabel = sunDecan
|
||||||
|
? `Decan ${sunDecan.index}${sunDecan.tarotMinorArcana ? ` · ${sunDecan.tarotMinorArcana}` : ""}`
|
||||||
|
: "--";
|
||||||
|
|
||||||
|
return [
|
||||||
|
"Natal Chart Scaffold",
|
||||||
|
`Birth Date: ${context.birthDateParts.isoDate} (${context.timeZone})`,
|
||||||
|
`Geo Anchor: ${context.latitude.toFixed(4)}, ${context.longitude.toFixed(4)}`,
|
||||||
|
`Sun Sign Anchor: ${signLabel}`,
|
||||||
|
`Sun Decan Anchor: ${decanLabel}`,
|
||||||
|
"House Scaffold: 12 houses ready (Equal House placeholder), Ascendant/cusps pending birth time"
|
||||||
|
].join("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderNatalSummary() {
|
||||||
|
const outputEl = getNatalSummaryEl();
|
||||||
|
if (!outputEl) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
outputEl.textContent = buildNatalScaffoldSummary();
|
||||||
|
}
|
||||||
|
|
||||||
|
function ensureNatalPanel(referenceData) {
|
||||||
|
if (referenceData && typeof referenceData === "object") {
|
||||||
|
referenceDataCache = referenceData;
|
||||||
|
}
|
||||||
|
|
||||||
|
renderNatalSummary();
|
||||||
|
}
|
||||||
|
|
||||||
|
document.addEventListener("settings:updated", () => {
|
||||||
|
renderNatalSummary();
|
||||||
|
});
|
||||||
|
|
||||||
|
window.TarotNatalUi = {
|
||||||
|
ensureNatalPanel,
|
||||||
|
renderNatalSummary
|
||||||
|
};
|
||||||
|
})();
|
||||||
686
app/ui-now.js
Normal file
@@ -0,0 +1,686 @@
|
|||||||
|
(function () {
|
||||||
|
const {
|
||||||
|
DAY_IN_MS,
|
||||||
|
getDateKey,
|
||||||
|
getMoonPhaseName,
|
||||||
|
getDecanForDate,
|
||||||
|
calcPlanetaryHoursForDayAndLocation
|
||||||
|
} = window.TarotCalc;
|
||||||
|
const { resolveTarotCardImage, getTarotCardDisplayName } = window.TarotCardImages || {};
|
||||||
|
|
||||||
|
let moonCountdownCache = null;
|
||||||
|
let decanCountdownCache = null;
|
||||||
|
let nowLightboxOverlayEl = null;
|
||||||
|
let nowLightboxImageEl = null;
|
||||||
|
let nowLightboxZoomed = false;
|
||||||
|
|
||||||
|
const LIGHTBOX_ZOOM_SCALE = 6.66;
|
||||||
|
|
||||||
|
const PLANETARY_BODIES = [
|
||||||
|
{ id: "sol", astronomyBody: "Sun", fallbackName: "Sun", fallbackSymbol: "☉︎" },
|
||||||
|
{ id: "luna", astronomyBody: "Moon", fallbackName: "Moon", fallbackSymbol: "☾︎" },
|
||||||
|
{ id: "mercury", astronomyBody: "Mercury", fallbackName: "Mercury", fallbackSymbol: "☿︎" },
|
||||||
|
{ id: "venus", astronomyBody: "Venus", fallbackName: "Venus", fallbackSymbol: "♀︎" },
|
||||||
|
{ id: "mars", astronomyBody: "Mars", fallbackName: "Mars", fallbackSymbol: "♂︎" },
|
||||||
|
{ id: "jupiter", astronomyBody: "Jupiter", fallbackName: "Jupiter", fallbackSymbol: "♃︎" },
|
||||||
|
{ id: "saturn", astronomyBody: "Saturn", fallbackName: "Saturn", fallbackSymbol: "♄︎" },
|
||||||
|
{ id: "uranus", astronomyBody: "Uranus", fallbackName: "Uranus", fallbackSymbol: "♅︎" },
|
||||||
|
{ id: "neptune", astronomyBody: "Neptune", fallbackName: "Neptune", fallbackSymbol: "♆︎" },
|
||||||
|
{ id: "pluto", astronomyBody: "Pluto", fallbackName: "Pluto", fallbackSymbol: "♇︎" }
|
||||||
|
];
|
||||||
|
|
||||||
|
function resetNowLightboxZoom() {
|
||||||
|
if (!nowLightboxImageEl) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
nowLightboxZoomed = false;
|
||||||
|
nowLightboxImageEl.style.transform = "scale(1)";
|
||||||
|
nowLightboxImageEl.style.transformOrigin = "center center";
|
||||||
|
nowLightboxImageEl.style.cursor = "zoom-in";
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateNowLightboxZoomOrigin(clientX, clientY) {
|
||||||
|
if (!nowLightboxZoomed || !nowLightboxImageEl) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const rect = nowLightboxImageEl.getBoundingClientRect();
|
||||||
|
if (!rect.width || !rect.height) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const x = Math.min(100, Math.max(0, ((clientX - rect.left) / rect.width) * 100));
|
||||||
|
const y = Math.min(100, Math.max(0, ((clientY - rect.top) / rect.height) * 100));
|
||||||
|
nowLightboxImageEl.style.transformOrigin = `${x}% ${y}%`;
|
||||||
|
}
|
||||||
|
|
||||||
|
function isNowLightboxPointOnCard(clientX, clientY) {
|
||||||
|
if (!nowLightboxImageEl) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const rect = nowLightboxImageEl.getBoundingClientRect();
|
||||||
|
const naturalWidth = nowLightboxImageEl.naturalWidth;
|
||||||
|
const naturalHeight = nowLightboxImageEl.naturalHeight;
|
||||||
|
|
||||||
|
if (!rect.width || !rect.height || !naturalWidth || !naturalHeight) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const frameAspect = rect.width / rect.height;
|
||||||
|
const imageAspect = naturalWidth / naturalHeight;
|
||||||
|
|
||||||
|
let renderWidth = rect.width;
|
||||||
|
let renderHeight = rect.height;
|
||||||
|
if (imageAspect > frameAspect) {
|
||||||
|
renderHeight = rect.width / imageAspect;
|
||||||
|
} else {
|
||||||
|
renderWidth = rect.height * imageAspect;
|
||||||
|
}
|
||||||
|
|
||||||
|
const left = rect.left + (rect.width - renderWidth) / 2;
|
||||||
|
const top = rect.top + (rect.height - renderHeight) / 2;
|
||||||
|
const right = left + renderWidth;
|
||||||
|
const bottom = top + renderHeight;
|
||||||
|
|
||||||
|
return clientX >= left && clientX <= right && clientY >= top && clientY <= bottom;
|
||||||
|
}
|
||||||
|
|
||||||
|
function ensureNowImageLightbox() {
|
||||||
|
if (nowLightboxOverlayEl && nowLightboxImageEl) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
nowLightboxOverlayEl = document.createElement("div");
|
||||||
|
nowLightboxOverlayEl.setAttribute("aria-hidden", "true");
|
||||||
|
nowLightboxOverlayEl.style.position = "fixed";
|
||||||
|
nowLightboxOverlayEl.style.inset = "0";
|
||||||
|
nowLightboxOverlayEl.style.background = "rgba(0, 0, 0, 0.82)";
|
||||||
|
nowLightboxOverlayEl.style.display = "none";
|
||||||
|
nowLightboxOverlayEl.style.alignItems = "center";
|
||||||
|
nowLightboxOverlayEl.style.justifyContent = "center";
|
||||||
|
nowLightboxOverlayEl.style.zIndex = "9999";
|
||||||
|
nowLightboxOverlayEl.style.padding = "0";
|
||||||
|
|
||||||
|
const image = document.createElement("img");
|
||||||
|
image.alt = "Now card enlarged image";
|
||||||
|
image.style.maxWidth = "100vw";
|
||||||
|
image.style.maxHeight = "100vh";
|
||||||
|
image.style.width = "100vw";
|
||||||
|
image.style.height = "100vh";
|
||||||
|
image.style.objectFit = "contain";
|
||||||
|
image.style.borderRadius = "0";
|
||||||
|
image.style.boxShadow = "none";
|
||||||
|
image.style.border = "none";
|
||||||
|
image.style.cursor = "zoom-in";
|
||||||
|
image.style.transform = "scale(1)";
|
||||||
|
image.style.transformOrigin = "center center";
|
||||||
|
image.style.transition = "transform 120ms ease-out";
|
||||||
|
image.style.userSelect = "none";
|
||||||
|
|
||||||
|
nowLightboxImageEl = image;
|
||||||
|
nowLightboxOverlayEl.appendChild(image);
|
||||||
|
|
||||||
|
const closeLightbox = () => {
|
||||||
|
if (!nowLightboxOverlayEl || !nowLightboxImageEl) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
nowLightboxOverlayEl.style.display = "none";
|
||||||
|
nowLightboxOverlayEl.setAttribute("aria-hidden", "true");
|
||||||
|
nowLightboxImageEl.removeAttribute("src");
|
||||||
|
resetNowLightboxZoom();
|
||||||
|
};
|
||||||
|
|
||||||
|
nowLightboxOverlayEl.addEventListener("click", (event) => {
|
||||||
|
if (event.target === nowLightboxOverlayEl) {
|
||||||
|
closeLightbox();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
nowLightboxImageEl.addEventListener("click", (event) => {
|
||||||
|
event.stopPropagation();
|
||||||
|
if (!isNowLightboxPointOnCard(event.clientX, event.clientY)) {
|
||||||
|
closeLightbox();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!nowLightboxZoomed) {
|
||||||
|
nowLightboxZoomed = true;
|
||||||
|
nowLightboxImageEl.style.transform = `scale(${LIGHTBOX_ZOOM_SCALE})`;
|
||||||
|
nowLightboxImageEl.style.cursor = "zoom-out";
|
||||||
|
updateNowLightboxZoomOrigin(event.clientX, event.clientY);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
resetNowLightboxZoom();
|
||||||
|
});
|
||||||
|
|
||||||
|
nowLightboxImageEl.addEventListener("mousemove", (event) => {
|
||||||
|
updateNowLightboxZoomOrigin(event.clientX, event.clientY);
|
||||||
|
});
|
||||||
|
|
||||||
|
nowLightboxImageEl.addEventListener("mouseleave", () => {
|
||||||
|
if (nowLightboxZoomed) {
|
||||||
|
nowLightboxImageEl.style.transformOrigin = "center center";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
document.addEventListener("keydown", (event) => {
|
||||||
|
if (event.key === "Escape") {
|
||||||
|
closeLightbox();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
document.body.appendChild(nowLightboxOverlayEl);
|
||||||
|
}
|
||||||
|
|
||||||
|
function openNowImageLightbox(src, altText) {
|
||||||
|
if (!src) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ensureNowImageLightbox();
|
||||||
|
if (!nowLightboxOverlayEl || !nowLightboxImageEl) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
nowLightboxImageEl.src = src;
|
||||||
|
nowLightboxImageEl.alt = altText || "Now card enlarged image";
|
||||||
|
resetNowLightboxZoom();
|
||||||
|
nowLightboxOverlayEl.style.display = "flex";
|
||||||
|
nowLightboxOverlayEl.setAttribute("aria-hidden", "false");
|
||||||
|
}
|
||||||
|
|
||||||
|
function getDisplayTarotName(cardName, trumpNumber) {
|
||||||
|
if (!cardName) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
if (typeof getTarotCardDisplayName !== "function") {
|
||||||
|
return cardName;
|
||||||
|
}
|
||||||
|
if (Number.isFinite(Number(trumpNumber))) {
|
||||||
|
return getTarotCardDisplayName(cardName, { trumpNumber: Number(trumpNumber) }) || cardName;
|
||||||
|
}
|
||||||
|
return getTarotCardDisplayName(cardName) || cardName;
|
||||||
|
}
|
||||||
|
|
||||||
|
function bindNowCardLightbox(imageEl) {
|
||||||
|
if (!(imageEl instanceof HTMLImageElement) || imageEl.dataset.lightboxBound === "true") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
imageEl.dataset.lightboxBound = "true";
|
||||||
|
imageEl.style.cursor = "zoom-in";
|
||||||
|
imageEl.title = "Click to enlarge";
|
||||||
|
imageEl.addEventListener("click", () => {
|
||||||
|
const src = imageEl.getAttribute("src");
|
||||||
|
if (!src || imageEl.style.display === "none") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
openNowImageLightbox(src, imageEl.alt || "Now card enlarged image");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function normalizeLongitude(value) {
|
||||||
|
const numeric = Number(value);
|
||||||
|
if (!Number.isFinite(numeric)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ((numeric % 360) + 360) % 360;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSortedSigns(signs) {
|
||||||
|
if (!Array.isArray(signs)) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
return [...signs].sort((a, b) => (a.order || 0) - (b.order || 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSignForLongitude(longitude, signs) {
|
||||||
|
const normalized = normalizeLongitude(longitude);
|
||||||
|
if (normalized === null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const sortedSigns = getSortedSigns(signs);
|
||||||
|
if (!sortedSigns.length) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const signIndex = Math.min(sortedSigns.length - 1, Math.floor(normalized / 30));
|
||||||
|
const sign = sortedSigns[signIndex] || null;
|
||||||
|
if (!sign) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
sign,
|
||||||
|
degreeInSign: normalized - signIndex * 30,
|
||||||
|
absoluteLongitude: normalized
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSabianSymbolForLongitude(longitude, sabianSymbols) {
|
||||||
|
const normalized = normalizeLongitude(longitude);
|
||||||
|
if (normalized === null || !Array.isArray(sabianSymbols) || !sabianSymbols.length) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const absoluteDegree = Math.floor(normalized) + 1;
|
||||||
|
return sabianSymbols.find((entry) => Number(entry?.absoluteDegree) === absoluteDegree) || null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function calculatePlanetPositions(referenceData, now) {
|
||||||
|
if (!window.Astronomy || !referenceData) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
const positions = [];
|
||||||
|
|
||||||
|
PLANETARY_BODIES.forEach((body) => {
|
||||||
|
try {
|
||||||
|
const geoVector = window.Astronomy.GeoVector(body.astronomyBody, now, true);
|
||||||
|
const ecliptic = window.Astronomy.Ecliptic(geoVector);
|
||||||
|
const signInfo = getSignForLongitude(ecliptic?.elon, referenceData.signs);
|
||||||
|
if (!signInfo?.sign) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const planetInfo = referenceData.planets?.[body.id] || null;
|
||||||
|
const symbol = planetInfo?.symbol || body.fallbackSymbol;
|
||||||
|
const name = planetInfo?.name || body.fallbackName;
|
||||||
|
|
||||||
|
positions.push({
|
||||||
|
id: body.id,
|
||||||
|
symbol,
|
||||||
|
name,
|
||||||
|
longitude: signInfo.absoluteLongitude,
|
||||||
|
sign: signInfo.sign,
|
||||||
|
degreeInSign: signInfo.degreeInSign,
|
||||||
|
label: `${symbol} ${name}: ${signInfo.sign.symbol} ${signInfo.sign.name} ${signInfo.degreeInSign.toFixed(1)}°`
|
||||||
|
});
|
||||||
|
} catch {
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return positions;
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateNowStats(referenceData, elements, now) {
|
||||||
|
const planetPositions = calculatePlanetPositions(referenceData, now);
|
||||||
|
|
||||||
|
if (elements.nowStatsPlanetsEl) {
|
||||||
|
elements.nowStatsPlanetsEl.replaceChildren();
|
||||||
|
|
||||||
|
if (!planetPositions.length) {
|
||||||
|
elements.nowStatsPlanetsEl.textContent = "--";
|
||||||
|
} else {
|
||||||
|
planetPositions.forEach((position) => {
|
||||||
|
const item = document.createElement("div");
|
||||||
|
item.className = "now-stats-planet";
|
||||||
|
item.textContent = position.label;
|
||||||
|
elements.nowStatsPlanetsEl.appendChild(item);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elements.nowStatsSabianEl) {
|
||||||
|
const sunPosition = planetPositions.find((entry) => entry.id === "sol") || null;
|
||||||
|
const moonPosition = planetPositions.find((entry) => entry.id === "luna") || null;
|
||||||
|
const sunSabianSymbol = sunPosition
|
||||||
|
? getSabianSymbolForLongitude(sunPosition.longitude, referenceData.sabianSymbols)
|
||||||
|
: null;
|
||||||
|
const moonSabianSymbol = moonPosition
|
||||||
|
? getSabianSymbolForLongitude(moonPosition.longitude, referenceData.sabianSymbols)
|
||||||
|
: null;
|
||||||
|
|
||||||
|
const sunLine = sunSabianSymbol?.phrase
|
||||||
|
? `Sun Sabian ${sunSabianSymbol.absoluteDegree}: ${sunSabianSymbol.phrase}`
|
||||||
|
: "Sun Sabian: --";
|
||||||
|
const moonLine = moonSabianSymbol?.phrase
|
||||||
|
? `Moon Sabian ${moonSabianSymbol.absoluteDegree}: ${moonSabianSymbol.phrase}`
|
||||||
|
: "Moon Sabian: --";
|
||||||
|
|
||||||
|
elements.nowStatsSabianEl.textContent = `${sunLine}\n${moonLine}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatCountdown(ms, mode) {
|
||||||
|
if (!Number.isFinite(ms) || ms <= 0) {
|
||||||
|
if (mode === "hours") {
|
||||||
|
return "0.0 hours";
|
||||||
|
}
|
||||||
|
if (mode === "seconds") {
|
||||||
|
return "0s";
|
||||||
|
}
|
||||||
|
return "0m";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mode === "hours") {
|
||||||
|
return `${(ms / 3600000).toFixed(1)} hours`;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mode === "seconds") {
|
||||||
|
return `${Math.floor(ms / 1000)}s`;
|
||||||
|
}
|
||||||
|
|
||||||
|
return `${Math.floor(ms / 60000)}m`;
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseMonthDay(monthDay) {
|
||||||
|
const [month, day] = String(monthDay || "").split("-").map(Number);
|
||||||
|
return { month, day };
|
||||||
|
}
|
||||||
|
|
||||||
|
function getCurrentPhaseName(date) {
|
||||||
|
return getMoonPhaseName(window.SunCalc.getMoonIllumination(date).phase);
|
||||||
|
}
|
||||||
|
|
||||||
|
function findNextMoonPhaseTransition(now) {
|
||||||
|
const currentPhase = getCurrentPhaseName(now);
|
||||||
|
const stepMs = 15 * 60 * 1000;
|
||||||
|
const maxMs = 40 * DAY_IN_MS;
|
||||||
|
|
||||||
|
let previousTime = now.getTime();
|
||||||
|
let previousPhase = currentPhase;
|
||||||
|
|
||||||
|
for (let t = previousTime + stepMs; t <= previousTime + maxMs; t += stepMs) {
|
||||||
|
const phaseName = getCurrentPhaseName(new Date(t));
|
||||||
|
if (phaseName !== previousPhase) {
|
||||||
|
let low = previousTime;
|
||||||
|
let high = t;
|
||||||
|
while (high - low > 1000) {
|
||||||
|
const mid = Math.floor((low + high) / 2);
|
||||||
|
const midPhase = getCurrentPhaseName(new Date(mid));
|
||||||
|
if (midPhase === currentPhase) {
|
||||||
|
low = mid;
|
||||||
|
} else {
|
||||||
|
high = mid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const transitionAt = new Date(high);
|
||||||
|
const nextPhase = getCurrentPhaseName(new Date(high + 1000));
|
||||||
|
return {
|
||||||
|
fromPhase: currentPhase,
|
||||||
|
nextPhase,
|
||||||
|
changeAt: transitionAt
|
||||||
|
};
|
||||||
|
}
|
||||||
|
previousTime = t;
|
||||||
|
previousPhase = phaseName;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSignStartDate(now, sign) {
|
||||||
|
const { month: startMonth, day: startDay } = parseMonthDay(sign.start);
|
||||||
|
const { month: endMonth } = parseMonthDay(sign.end);
|
||||||
|
const wrapsYear = startMonth > endMonth;
|
||||||
|
|
||||||
|
let year = now.getFullYear();
|
||||||
|
const nowMonth = now.getMonth() + 1;
|
||||||
|
const nowDay = now.getDate();
|
||||||
|
|
||||||
|
if (wrapsYear && (nowMonth < startMonth || (nowMonth === startMonth && nowDay < startDay))) {
|
||||||
|
year -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Date(year, startMonth - 1, startDay);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getNextSign(signs, currentSign) {
|
||||||
|
const sorted = [...signs].sort((a, b) => (a.order || 0) - (b.order || 0));
|
||||||
|
const index = sorted.findIndex((entry) => entry.id === currentSign.id);
|
||||||
|
if (index < 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return sorted[(index + 1) % sorted.length] || null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getDecanByIndex(decansBySign, signId, index) {
|
||||||
|
const signDecans = decansBySign[signId] || [];
|
||||||
|
return signDecans.find((entry) => entry.index === index) || null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function findNextDecanTransition(now, signs, decansBySign) {
|
||||||
|
const currentInfo = getDecanForDate(now, signs, decansBySign);
|
||||||
|
if (!currentInfo?.sign) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const currentIndex = currentInfo.decan?.index || 1;
|
||||||
|
const signStart = getSignStartDate(now, currentInfo.sign);
|
||||||
|
|
||||||
|
if (currentIndex < 3) {
|
||||||
|
const changeAt = new Date(signStart.getTime() + currentIndex * 10 * DAY_IN_MS);
|
||||||
|
const nextDecan = getDecanByIndex(decansBySign, currentInfo.sign.id, currentIndex + 1);
|
||||||
|
const nextLabel = nextDecan?.tarotMinorArcana || `${currentInfo.sign.name} Decan ${currentIndex + 1}`;
|
||||||
|
|
||||||
|
return {
|
||||||
|
key: `${currentInfo.sign.id}-${currentIndex}`,
|
||||||
|
changeAt,
|
||||||
|
nextLabel
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const nextSign = getNextSign(signs, currentInfo.sign);
|
||||||
|
if (!nextSign) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const { month: nextMonth, day: nextDay } = parseMonthDay(nextSign.start);
|
||||||
|
let year = now.getFullYear();
|
||||||
|
let changeAt = new Date(year, nextMonth - 1, nextDay);
|
||||||
|
if (changeAt.getTime() <= now.getTime()) {
|
||||||
|
changeAt = new Date(year + 1, nextMonth - 1, nextDay);
|
||||||
|
}
|
||||||
|
|
||||||
|
const nextDecan = getDecanByIndex(decansBySign, nextSign.id, 1);
|
||||||
|
|
||||||
|
return {
|
||||||
|
key: `${currentInfo.sign.id}-${currentIndex}`,
|
||||||
|
changeAt,
|
||||||
|
nextLabel: nextDecan?.tarotMinorArcana || `${nextSign.name} Decan 1`
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function setNowCardImage(imageEl, cardName, fallbackLabel, trumpNumber) {
|
||||||
|
if (!imageEl) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bindNowCardLightbox(imageEl);
|
||||||
|
|
||||||
|
if (!cardName || typeof resolveTarotCardImage !== "function") {
|
||||||
|
imageEl.style.display = "none";
|
||||||
|
imageEl.removeAttribute("src");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const src = resolveTarotCardImage(cardName);
|
||||||
|
if (!src) {
|
||||||
|
imageEl.style.display = "none";
|
||||||
|
imageEl.removeAttribute("src");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
imageEl.src = src;
|
||||||
|
const displayName = getDisplayTarotName(cardName, trumpNumber);
|
||||||
|
imageEl.alt = `${fallbackLabel}: ${displayName}`;
|
||||||
|
imageEl.style.display = "block";
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateNowPanel(referenceData, geo, elements, timeFormat = "minutes") {
|
||||||
|
if (!referenceData || !geo || !elements) {
|
||||||
|
return { dayKey: getDateKey(new Date()), skyRefreshKey: "" };
|
||||||
|
}
|
||||||
|
|
||||||
|
const now = new Date();
|
||||||
|
const dayKey = getDateKey(now);
|
||||||
|
|
||||||
|
const todayHours = calcPlanetaryHoursForDayAndLocation(now, geo);
|
||||||
|
const yesterday = new Date(now.getTime() - DAY_IN_MS);
|
||||||
|
const yesterdayHours = calcPlanetaryHoursForDayAndLocation(yesterday, geo);
|
||||||
|
const tomorrow = new Date(now.getTime() + DAY_IN_MS);
|
||||||
|
const tomorrowHours = calcPlanetaryHoursForDayAndLocation(tomorrow, geo);
|
||||||
|
const allHours = [...yesterdayHours, ...todayHours, ...tomorrowHours].sort(
|
||||||
|
(a, b) => a.start.getTime() - b.start.getTime()
|
||||||
|
);
|
||||||
|
const currentHour = allHours.find((entry) => now >= entry.start && now < entry.end);
|
||||||
|
const currentHourSkyKey = currentHour
|
||||||
|
? `${currentHour.planetId}-${currentHour.start.toISOString()}`
|
||||||
|
: "no-hour";
|
||||||
|
|
||||||
|
if (currentHour) {
|
||||||
|
const planet = referenceData.planets[currentHour.planetId];
|
||||||
|
elements.nowHourEl.textContent = planet
|
||||||
|
? `${planet.symbol} ${planet.name}`
|
||||||
|
: currentHour.planetId;
|
||||||
|
if (elements.nowHourTarotEl) {
|
||||||
|
const hourCardName = planet?.tarot?.majorArcana || "";
|
||||||
|
const hourTrumpNumber = planet?.tarot?.number;
|
||||||
|
elements.nowHourTarotEl.textContent = hourCardName
|
||||||
|
? getDisplayTarotName(hourCardName, hourTrumpNumber)
|
||||||
|
: "--";
|
||||||
|
}
|
||||||
|
|
||||||
|
const msLeft = Math.max(0, currentHour.end.getTime() - now.getTime());
|
||||||
|
elements.nowCountdownEl.textContent = formatCountdown(msLeft, timeFormat);
|
||||||
|
|
||||||
|
if (elements.nowHourNextEl) {
|
||||||
|
const nextHour = allHours.find(
|
||||||
|
(entry) => entry.start.getTime() >= currentHour.end.getTime() - 1000
|
||||||
|
);
|
||||||
|
if (nextHour) {
|
||||||
|
const nextPlanet = referenceData.planets[nextHour.planetId];
|
||||||
|
elements.nowHourNextEl.textContent = nextPlanet
|
||||||
|
? `> ${nextPlanet.name}`
|
||||||
|
: `> ${nextHour.planetId}`;
|
||||||
|
} else {
|
||||||
|
elements.nowHourNextEl.textContent = "> --";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
setNowCardImage(
|
||||||
|
elements.nowHourCardEl,
|
||||||
|
planet?.tarot?.majorArcana,
|
||||||
|
"Current planetary hour card",
|
||||||
|
planet?.tarot?.number
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
elements.nowHourEl.textContent = "--";
|
||||||
|
elements.nowCountdownEl.textContent = "--";
|
||||||
|
if (elements.nowHourTarotEl) {
|
||||||
|
elements.nowHourTarotEl.textContent = "--";
|
||||||
|
}
|
||||||
|
if (elements.nowHourNextEl) {
|
||||||
|
elements.nowHourNextEl.textContent = "> --";
|
||||||
|
}
|
||||||
|
setNowCardImage(elements.nowHourCardEl, null, "Current planetary hour card");
|
||||||
|
}
|
||||||
|
|
||||||
|
const moonIllum = window.SunCalc.getMoonIllumination(now);
|
||||||
|
const moonPhase = getMoonPhaseName(moonIllum.phase);
|
||||||
|
const moonTarot = referenceData.planets.luna?.tarot?.majorArcana || "The High Priestess";
|
||||||
|
elements.nowMoonEl.textContent = `${moonPhase} (${Math.round(moonIllum.fraction * 100)}%)`;
|
||||||
|
elements.nowMoonTarotEl.textContent = getDisplayTarotName(moonTarot, referenceData.planets.luna?.tarot?.number);
|
||||||
|
setNowCardImage(
|
||||||
|
elements.nowMoonCardEl,
|
||||||
|
moonTarot,
|
||||||
|
"Current moon phase card",
|
||||||
|
referenceData.planets.luna?.tarot?.number
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!moonCountdownCache || moonCountdownCache.fromPhase !== moonPhase || now >= moonCountdownCache.changeAt) {
|
||||||
|
moonCountdownCache = findNextMoonPhaseTransition(now);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elements.nowMoonCountdownEl) {
|
||||||
|
if (moonCountdownCache?.changeAt) {
|
||||||
|
const remaining = moonCountdownCache.changeAt.getTime() - now.getTime();
|
||||||
|
elements.nowMoonCountdownEl.textContent = formatCountdown(remaining, timeFormat);
|
||||||
|
if (elements.nowMoonNextEl) {
|
||||||
|
elements.nowMoonNextEl.textContent = `> ${moonCountdownCache.nextPhase}`;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
elements.nowMoonCountdownEl.textContent = "--";
|
||||||
|
if (elements.nowMoonNextEl) {
|
||||||
|
elements.nowMoonNextEl.textContent = "> --";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const sunInfo = getDecanForDate(now, referenceData.signs, referenceData.decansBySign);
|
||||||
|
const decanSkyKey = sunInfo?.sign
|
||||||
|
? `${sunInfo.sign.id}-${sunInfo.decan?.index || 1}`
|
||||||
|
: "no-decan";
|
||||||
|
if (sunInfo?.sign) {
|
||||||
|
const signStartDate = getSignStartDate(now, sunInfo.sign);
|
||||||
|
const daysSinceSignStart = (now.getTime() - signStartDate.getTime()) / DAY_IN_MS;
|
||||||
|
const signDegree = Math.min(29.9, Math.max(0, daysSinceSignStart));
|
||||||
|
const signMajorName = getDisplayTarotName(sunInfo.sign.tarot.majorArcana, sunInfo.sign.tarot.trumpNumber);
|
||||||
|
elements.nowDecanEl.textContent = `${sunInfo.sign.symbol} ${sunInfo.sign.name} · ${signMajorName} (${signDegree.toFixed(1)}°)`;
|
||||||
|
|
||||||
|
const currentDecanKey = `${sunInfo.sign.id}-${sunInfo.decan?.index || 1}`;
|
||||||
|
if (!decanCountdownCache || decanCountdownCache.key !== currentDecanKey || now >= decanCountdownCache.changeAt) {
|
||||||
|
decanCountdownCache = findNextDecanTransition(now, referenceData.signs, referenceData.decansBySign);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sunInfo.decan) {
|
||||||
|
const decanCardName = sunInfo.decan.tarotMinorArcana;
|
||||||
|
elements.nowDecanTarotEl.textContent = getDisplayTarotName(decanCardName);
|
||||||
|
setNowCardImage(elements.nowDecanCardEl, sunInfo.decan.tarotMinorArcana, "Current decan card");
|
||||||
|
} else {
|
||||||
|
const signTarotName = sunInfo.sign.tarot?.majorArcana || "--";
|
||||||
|
elements.nowDecanTarotEl.textContent = signTarotName === "--"
|
||||||
|
? "--"
|
||||||
|
: getDisplayTarotName(signTarotName, sunInfo.sign.tarot?.trumpNumber);
|
||||||
|
setNowCardImage(
|
||||||
|
elements.nowDecanCardEl,
|
||||||
|
sunInfo.sign.tarot?.majorArcana,
|
||||||
|
"Current decan card",
|
||||||
|
sunInfo.sign.tarot?.trumpNumber
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elements.nowDecanCountdownEl) {
|
||||||
|
if (decanCountdownCache?.changeAt) {
|
||||||
|
const remaining = decanCountdownCache.changeAt.getTime() - now.getTime();
|
||||||
|
elements.nowDecanCountdownEl.textContent = formatCountdown(remaining, timeFormat);
|
||||||
|
if (elements.nowDecanNextEl) {
|
||||||
|
elements.nowDecanNextEl.textContent = `> ${getDisplayTarotName(decanCountdownCache.nextLabel)}`;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
elements.nowDecanCountdownEl.textContent = "--";
|
||||||
|
if (elements.nowDecanNextEl) {
|
||||||
|
elements.nowDecanNextEl.textContent = "> --";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
elements.nowDecanEl.textContent = "--";
|
||||||
|
elements.nowDecanTarotEl.textContent = "--";
|
||||||
|
setNowCardImage(elements.nowDecanCardEl, null, "Current decan card");
|
||||||
|
if (elements.nowDecanCountdownEl) {
|
||||||
|
elements.nowDecanCountdownEl.textContent = "--";
|
||||||
|
}
|
||||||
|
if (elements.nowDecanNextEl) {
|
||||||
|
elements.nowDecanNextEl.textContent = "> --";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
updateNowStats(referenceData, elements, now);
|
||||||
|
|
||||||
|
return {
|
||||||
|
dayKey,
|
||||||
|
skyRefreshKey: `${currentHourSkyKey}|${decanSkyKey}|${moonPhase}`
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
window.TarotNowUi = {
|
||||||
|
updateNowPanel
|
||||||
|
};
|
||||||
|
})();
|
||||||
898
app/ui-planets.js
Normal file
@@ -0,0 +1,898 @@
|
|||||||
|
(function () {
|
||||||
|
const { getTarotCardDisplayName, getTarotCardSearchAliases } = window.TarotCardImages || {};
|
||||||
|
|
||||||
|
const state = {
|
||||||
|
initialized: false,
|
||||||
|
entries: [],
|
||||||
|
filteredEntries: [],
|
||||||
|
searchQuery: "",
|
||||||
|
selectedId: "",
|
||||||
|
kabbalahTargetsByPlanetId: {},
|
||||||
|
monthRefsByPlanetId: new Map(),
|
||||||
|
cubePlacementsByPlanetId: new Map()
|
||||||
|
};
|
||||||
|
|
||||||
|
function normalizePlanetToken(value) {
|
||||||
|
return String(value || "")
|
||||||
|
.trim()
|
||||||
|
.toLowerCase()
|
||||||
|
.replace(/[^a-z]/g, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
function toPlanetId(value) {
|
||||||
|
const token = normalizePlanetToken(value);
|
||||||
|
if (!token) return null;
|
||||||
|
|
||||||
|
if (token === "sun") return "sol";
|
||||||
|
if (token === "moon") return "luna";
|
||||||
|
if (["saturn", "jupiter", "mars", "sol", "venus", "mercury", "luna"].includes(token)) {
|
||||||
|
return token;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function appendKabbalahTarget(map, planetId, target) {
|
||||||
|
if (!planetId || !target) return;
|
||||||
|
if (!map[planetId]) map[planetId] = [];
|
||||||
|
const key = `${target.kind}:${target.number}`;
|
||||||
|
if (map[planetId].some((entry) => `${entry.kind}:${entry.number}` === key)) return;
|
||||||
|
map[planetId].push(target);
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildKabbalahTargetsByPlanet(magickDataset) {
|
||||||
|
const tree = magickDataset?.grouped?.kabbalah?.["kabbalah-tree"];
|
||||||
|
const map = {};
|
||||||
|
if (!tree) return map;
|
||||||
|
|
||||||
|
(tree.sephiroth || []).forEach((seph) => {
|
||||||
|
const planetId = toPlanetId(seph?.planet);
|
||||||
|
if (!planetId) return;
|
||||||
|
appendKabbalahTarget(map, planetId, {
|
||||||
|
kind: "sephirah",
|
||||||
|
number: seph.number,
|
||||||
|
label: `Sephirah ${seph.number} · ${seph.name}`
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
(tree.paths || []).forEach((path) => {
|
||||||
|
if (path?.astrology?.type !== "planet") return;
|
||||||
|
const planetId = toPlanetId(path?.astrology?.name);
|
||||||
|
if (!planetId) return;
|
||||||
|
appendKabbalahTarget(map, planetId, {
|
||||||
|
kind: "path",
|
||||||
|
number: path.pathNumber,
|
||||||
|
label: `Path ${path.pathNumber} · ${path?.tarot?.card || path?.hebrewLetter?.transliteration || ""}`.trim()
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildMonthReferencesByPlanet(referenceData) {
|
||||||
|
const map = new Map();
|
||||||
|
const months = Array.isArray(referenceData?.calendarMonths) ? referenceData.calendarMonths : [];
|
||||||
|
const holidays = Array.isArray(referenceData?.celestialHolidays) ? referenceData.celestialHolidays : [];
|
||||||
|
const monthById = new Map(months.map((month) => [month.id, month]));
|
||||||
|
|
||||||
|
function parseMonthDayToken(value) {
|
||||||
|
const text = String(value || "").trim();
|
||||||
|
const match = text.match(/^(\d{1,2})-(\d{1,2})$/);
|
||||||
|
if (!match) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const monthNo = Number(match[1]);
|
||||||
|
const dayNo = Number(match[2]);
|
||||||
|
if (!Number.isInteger(monthNo) || !Number.isInteger(dayNo) || monthNo < 1 || monthNo > 12 || dayNo < 1 || dayNo > 31) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return { month: monthNo, day: dayNo };
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseMonthDayTokensFromText(value) {
|
||||||
|
const text = String(value || "");
|
||||||
|
const matches = [...text.matchAll(/(\d{1,2})-(\d{1,2})/g)];
|
||||||
|
return matches
|
||||||
|
.map((match) => ({ month: Number(match[1]), day: Number(match[2]) }))
|
||||||
|
.filter((token) => Number.isInteger(token.month) && Number.isInteger(token.day) && token.month >= 1 && token.month <= 12 && token.day >= 1 && token.day <= 31);
|
||||||
|
}
|
||||||
|
|
||||||
|
function toDateToken(token, year) {
|
||||||
|
if (!token) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return new Date(year, token.month - 1, token.day, 12, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
function splitMonthDayRangeByMonth(startToken, endToken) {
|
||||||
|
const startDate = toDateToken(startToken, 2025);
|
||||||
|
const endBase = toDateToken(endToken, 2025);
|
||||||
|
if (!startDate || !endBase) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
const wrapsYear = endBase.getTime() < startDate.getTime();
|
||||||
|
const endDate = wrapsYear ? toDateToken(endToken, 2026) : endBase;
|
||||||
|
if (!endDate) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
const segments = [];
|
||||||
|
let cursor = new Date(startDate);
|
||||||
|
while (cursor.getTime() <= endDate.getTime()) {
|
||||||
|
const monthEnd = new Date(cursor.getFullYear(), cursor.getMonth() + 1, 0, 12, 0, 0, 0);
|
||||||
|
const segmentEnd = monthEnd.getTime() < endDate.getTime() ? monthEnd : endDate;
|
||||||
|
|
||||||
|
segments.push({
|
||||||
|
monthNo: cursor.getMonth() + 1,
|
||||||
|
startDay: cursor.getDate(),
|
||||||
|
endDay: segmentEnd.getDate()
|
||||||
|
});
|
||||||
|
|
||||||
|
cursor = new Date(segmentEnd.getFullYear(), segmentEnd.getMonth(), segmentEnd.getDate() + 1, 12, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return segments;
|
||||||
|
}
|
||||||
|
|
||||||
|
function tokenToString(monthNo, dayNo) {
|
||||||
|
return `${String(monthNo).padStart(2, "0")}-${String(dayNo).padStart(2, "0")}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatRangeLabel(monthName, startDay, endDay) {
|
||||||
|
if (!Number.isFinite(startDay) || !Number.isFinite(endDay)) {
|
||||||
|
return monthName;
|
||||||
|
}
|
||||||
|
if (startDay === endDay) {
|
||||||
|
return `${monthName} ${startDay}`;
|
||||||
|
}
|
||||||
|
return `${monthName} ${startDay}-${endDay}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
function resolveRangeForMonth(month, options = {}) {
|
||||||
|
const monthOrder = Number(month?.order);
|
||||||
|
const monthStart = parseMonthDayToken(month?.start);
|
||||||
|
const monthEnd = parseMonthDayToken(month?.end);
|
||||||
|
if (!Number.isFinite(monthOrder) || !monthStart || !monthEnd) {
|
||||||
|
return {
|
||||||
|
startToken: String(month?.start || "").trim() || null,
|
||||||
|
endToken: String(month?.end || "").trim() || null,
|
||||||
|
label: month?.name || month?.id || "",
|
||||||
|
isFullMonth: true
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
let startToken = parseMonthDayToken(options.startToken);
|
||||||
|
let endToken = parseMonthDayToken(options.endToken);
|
||||||
|
|
||||||
|
if (!startToken || !endToken) {
|
||||||
|
const tokens = parseMonthDayTokensFromText(options.rawDateText);
|
||||||
|
if (tokens.length >= 2) {
|
||||||
|
startToken = tokens[0];
|
||||||
|
endToken = tokens[1];
|
||||||
|
} else if (tokens.length === 1) {
|
||||||
|
startToken = tokens[0];
|
||||||
|
endToken = tokens[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!startToken || !endToken) {
|
||||||
|
startToken = monthStart;
|
||||||
|
endToken = monthEnd;
|
||||||
|
}
|
||||||
|
|
||||||
|
const segments = splitMonthDayRangeByMonth(startToken, endToken);
|
||||||
|
const segment = segments.find((entry) => entry.monthNo === monthOrder) || null;
|
||||||
|
|
||||||
|
const useStart = segment ? { month: monthOrder, day: segment.startDay } : startToken;
|
||||||
|
const useEnd = segment ? { month: monthOrder, day: segment.endDay } : endToken;
|
||||||
|
const startText = tokenToString(useStart.month, useStart.day);
|
||||||
|
const endText = tokenToString(useEnd.month, useEnd.day);
|
||||||
|
const isFullMonth = startText === month.start && endText === month.end;
|
||||||
|
|
||||||
|
return {
|
||||||
|
startToken: startText,
|
||||||
|
endToken: endText,
|
||||||
|
label: isFullMonth
|
||||||
|
? (month.name || month.id)
|
||||||
|
: formatRangeLabel(month.name || month.id, useStart.day, useEnd.day),
|
||||||
|
isFullMonth
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function pushRef(planetToken, month, options = {}) {
|
||||||
|
const planetId = toPlanetId(planetToken) || normalizePlanetToken(planetToken);
|
||||||
|
if (!planetId || !month?.id) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!map.has(planetId)) {
|
||||||
|
map.set(planetId, []);
|
||||||
|
}
|
||||||
|
|
||||||
|
const rows = map.get(planetId);
|
||||||
|
const range = resolveRangeForMonth(month, options);
|
||||||
|
const key = `${month.id}|${range.startToken || ""}|${range.endToken || ""}`;
|
||||||
|
if (rows.some((entry) => entry.key === key)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
rows.push({
|
||||||
|
id: month.id,
|
||||||
|
name: month.name || month.id,
|
||||||
|
order: Number.isFinite(Number(month.order)) ? Number(month.order) : 999,
|
||||||
|
label: range.label,
|
||||||
|
startToken: range.startToken,
|
||||||
|
endToken: range.endToken,
|
||||||
|
isFullMonth: range.isFullMonth,
|
||||||
|
key
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
months.forEach((month) => {
|
||||||
|
pushRef(month?.associations?.planetId, month);
|
||||||
|
const events = Array.isArray(month?.events) ? month.events : [];
|
||||||
|
events.forEach((event) => {
|
||||||
|
pushRef(event?.associations?.planetId, month, {
|
||||||
|
rawDateText: event?.dateRange || event?.date || ""
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
holidays.forEach((holiday) => {
|
||||||
|
const month = monthById.get(holiday?.monthId);
|
||||||
|
if (!month) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pushRef(holiday?.associations?.planetId, month, {
|
||||||
|
rawDateText: holiday?.dateRange || holiday?.date || ""
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
map.forEach((rows, key) => {
|
||||||
|
const preciseMonthIds = new Set(
|
||||||
|
rows
|
||||||
|
.filter((entry) => !entry.isFullMonth)
|
||||||
|
.map((entry) => entry.id)
|
||||||
|
);
|
||||||
|
|
||||||
|
const filtered = rows.filter((entry) => {
|
||||||
|
if (!entry.isFullMonth) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return !preciseMonthIds.has(entry.id);
|
||||||
|
});
|
||||||
|
|
||||||
|
filtered.sort((left, right) => {
|
||||||
|
if (left.order !== right.order) {
|
||||||
|
return left.order - right.order;
|
||||||
|
}
|
||||||
|
|
||||||
|
const startLeft = parseMonthDayToken(left.startToken);
|
||||||
|
const startRight = parseMonthDayToken(right.startToken);
|
||||||
|
const dayLeft = startLeft ? startLeft.day : 999;
|
||||||
|
const dayRight = startRight ? startRight.day : 999;
|
||||||
|
if (dayLeft !== dayRight) {
|
||||||
|
return dayLeft - dayRight;
|
||||||
|
}
|
||||||
|
|
||||||
|
return String(left.label || left.name || "").localeCompare(String(right.label || right.name || ""));
|
||||||
|
});
|
||||||
|
|
||||||
|
map.set(key, filtered);
|
||||||
|
});
|
||||||
|
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildCubePlacementsByPlanet(magickDataset) {
|
||||||
|
const map = new Map();
|
||||||
|
const cube = magickDataset?.grouped?.kabbalah?.cube || {};
|
||||||
|
const walls = Array.isArray(cube?.walls)
|
||||||
|
? cube.walls
|
||||||
|
: [];
|
||||||
|
const edges = Array.isArray(cube?.edges)
|
||||||
|
? cube.edges
|
||||||
|
: [];
|
||||||
|
|
||||||
|
function edgeWalls(edge) {
|
||||||
|
const explicitWalls = Array.isArray(edge?.walls)
|
||||||
|
? edge.walls.map((wallId) => String(wallId || "").trim().toLowerCase()).filter(Boolean)
|
||||||
|
: [];
|
||||||
|
|
||||||
|
if (explicitWalls.length >= 2) {
|
||||||
|
return explicitWalls.slice(0, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
return String(edge?.id || "")
|
||||||
|
.trim()
|
||||||
|
.toLowerCase()
|
||||||
|
.split("-")
|
||||||
|
.map((wallId) => wallId.trim())
|
||||||
|
.filter(Boolean)
|
||||||
|
.slice(0, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
function edgeLabel(edge) {
|
||||||
|
const explicitName = String(edge?.name || "").trim();
|
||||||
|
if (explicitName) {
|
||||||
|
return explicitName;
|
||||||
|
}
|
||||||
|
return edgeWalls(edge)
|
||||||
|
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
|
||||||
|
.join(" ");
|
||||||
|
}
|
||||||
|
|
||||||
|
function resolveCubeDirectionLabel(wallId, edge) {
|
||||||
|
const normalizedWallId = String(wallId || "").trim().toLowerCase();
|
||||||
|
const edgeId = String(edge?.id || "").trim().toLowerCase();
|
||||||
|
if (!normalizedWallId || !edgeId) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
const cubeUi = window.CubeSectionUi;
|
||||||
|
if (cubeUi && typeof cubeUi.getEdgeDirectionLabelForWall === "function") {
|
||||||
|
const directionLabel = String(cubeUi.getEdgeDirectionLabelForWall(normalizedWallId, edgeId) || "").trim();
|
||||||
|
if (directionLabel) {
|
||||||
|
return directionLabel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return edgeLabel(edge);
|
||||||
|
}
|
||||||
|
|
||||||
|
const firstEdgeByWallId = new Map();
|
||||||
|
edges.forEach((edge) => {
|
||||||
|
edgeWalls(edge).forEach((wallId) => {
|
||||||
|
if (!firstEdgeByWallId.has(wallId)) {
|
||||||
|
firstEdgeByWallId.set(wallId, edge);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
function pushPlacement(planetId, placement) {
|
||||||
|
if (!planetId || !placement?.wallId || !placement?.edgeId) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!map.has(planetId)) {
|
||||||
|
map.set(planetId, []);
|
||||||
|
}
|
||||||
|
|
||||||
|
const rows = map.get(planetId);
|
||||||
|
const key = `${placement.wallId}:${placement.edgeId}`;
|
||||||
|
if (rows.some((row) => `${row.wallId}:${row.edgeId}` === key)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
rows.push(placement);
|
||||||
|
}
|
||||||
|
|
||||||
|
walls.forEach((wall) => {
|
||||||
|
const planetId = toPlanetId(wall?.associations?.planetId || wall?.planet);
|
||||||
|
if (!planetId) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const wallId = String(wall?.id || "").trim().toLowerCase();
|
||||||
|
const edge = firstEdgeByWallId.get(wallId) || null;
|
||||||
|
|
||||||
|
pushPlacement(planetId, {
|
||||||
|
wallId,
|
||||||
|
edgeId: String(edge?.id || "").trim().toLowerCase(),
|
||||||
|
label: `Cube: ${wall?.name || "Wall"} Wall - ${resolveCubeDirectionLabel(wallId, edge) || "Direction"}`
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getElements() {
|
||||||
|
return {
|
||||||
|
planetCardListEl: document.getElementById("planet-card-list"),
|
||||||
|
planetSearchInputEl: document.getElementById("planet-search-input"),
|
||||||
|
planetSearchClearEl: document.getElementById("planet-search-clear"),
|
||||||
|
planetCountEl: document.getElementById("planet-card-count"),
|
||||||
|
planetDetailNameEl: document.getElementById("planet-detail-name"),
|
||||||
|
planetDetailTypeEl: document.getElementById("planet-detail-type"),
|
||||||
|
planetDetailSummaryEl: document.getElementById("planet-detail-summary"),
|
||||||
|
planetDetailFactsEl: document.getElementById("planet-detail-facts"),
|
||||||
|
planetDetailAtmosphereEl: document.getElementById("planet-detail-atmosphere"),
|
||||||
|
planetDetailNotableEl: document.getElementById("planet-detail-notable"),
|
||||||
|
planetDetailCorrespondenceEl: document.getElementById("planet-detail-correspondence")
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function normalizeSearchValue(value) {
|
||||||
|
return String(value || "").trim().toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildPlanetSearchText(entry) {
|
||||||
|
const correspondence = entry?.correspondence || {};
|
||||||
|
const factValues = buildFactRows(entry).map(([, value]) => String(value || ""));
|
||||||
|
const tarotAliases = correspondence?.tarot?.majorArcana && typeof getTarotCardSearchAliases === "function"
|
||||||
|
? getTarotCardSearchAliases(correspondence.tarot.majorArcana)
|
||||||
|
: [];
|
||||||
|
const rawNumbers = [
|
||||||
|
entry?.meanDistanceFromSun?.kmMillions,
|
||||||
|
entry?.meanDistanceFromSun?.au,
|
||||||
|
entry?.orbitalPeriod?.days,
|
||||||
|
entry?.orbitalPeriod?.years,
|
||||||
|
entry?.rotationPeriodHours,
|
||||||
|
entry?.radiusKm,
|
||||||
|
entry?.diameterKm,
|
||||||
|
entry?.massKg,
|
||||||
|
entry?.gravityMs2,
|
||||||
|
entry?.escapeVelocityKms,
|
||||||
|
entry?.axialTiltDeg,
|
||||||
|
entry?.averageTempC,
|
||||||
|
entry?.moons
|
||||||
|
]
|
||||||
|
.filter((value) => Number.isFinite(value))
|
||||||
|
.map((value) => String(value));
|
||||||
|
|
||||||
|
const parts = [
|
||||||
|
entry?.name,
|
||||||
|
entry?.symbol,
|
||||||
|
entry?.classification,
|
||||||
|
entry?.summary,
|
||||||
|
entry?.atmosphere,
|
||||||
|
...(Array.isArray(entry?.notableFacts) ? entry.notableFacts : []),
|
||||||
|
...factValues,
|
||||||
|
...rawNumbers,
|
||||||
|
correspondence?.name,
|
||||||
|
correspondence?.symbol,
|
||||||
|
correspondence?.weekday,
|
||||||
|
correspondence?.tarot?.majorArcana,
|
||||||
|
...tarotAliases
|
||||||
|
];
|
||||||
|
|
||||||
|
return normalizeSearchValue(parts.filter(Boolean).join(" "));
|
||||||
|
}
|
||||||
|
|
||||||
|
function applySearchFilter(elements) {
|
||||||
|
const query = normalizeSearchValue(state.searchQuery);
|
||||||
|
state.filteredEntries = query
|
||||||
|
? state.entries.filter((entry) => buildPlanetSearchText(entry).includes(query))
|
||||||
|
: [...state.entries];
|
||||||
|
|
||||||
|
if (elements?.planetSearchClearEl) {
|
||||||
|
elements.planetSearchClearEl.disabled = !query;
|
||||||
|
}
|
||||||
|
|
||||||
|
renderList(elements);
|
||||||
|
|
||||||
|
if (!state.filteredEntries.some((entry) => entry.id === state.selectedId)) {
|
||||||
|
if (state.filteredEntries.length > 0) {
|
||||||
|
selectById(state.filteredEntries[0].id, elements);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
updateSelection(elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
function clearChildren(element) {
|
||||||
|
if (element) {
|
||||||
|
element.replaceChildren();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function toNumber(value) {
|
||||||
|
return Number.isFinite(value) ? value : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatNumber(value, maximumFractionDigits = 2) {
|
||||||
|
if (!Number.isFinite(value)) {
|
||||||
|
return "--";
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Intl.NumberFormat(undefined, {
|
||||||
|
maximumFractionDigits,
|
||||||
|
minimumFractionDigits: 0
|
||||||
|
}).format(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatSignedHours(value) {
|
||||||
|
if (!Number.isFinite(value)) {
|
||||||
|
return "--";
|
||||||
|
}
|
||||||
|
|
||||||
|
const absValue = Math.abs(value);
|
||||||
|
const formatted = `${formatNumber(absValue, 2)} h`;
|
||||||
|
return value < 0 ? `${formatted} (retrograde)` : formatted;
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatMass(value) {
|
||||||
|
if (!Number.isFinite(value)) {
|
||||||
|
return "--";
|
||||||
|
}
|
||||||
|
|
||||||
|
return value.toExponential(3).replace("e+", " × 10^") + " kg";
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildFactRows(entry) {
|
||||||
|
return [
|
||||||
|
["Mean distance from Sun", Number.isFinite(entry?.meanDistanceFromSun?.kmMillions) && Number.isFinite(entry?.meanDistanceFromSun?.au)
|
||||||
|
? `${formatNumber(entry.meanDistanceFromSun.kmMillions, 1)} million km (${formatNumber(entry.meanDistanceFromSun.au, 3)} AU)`
|
||||||
|
: "--"],
|
||||||
|
["Orbital period", Number.isFinite(entry?.orbitalPeriod?.days) && Number.isFinite(entry?.orbitalPeriod?.years)
|
||||||
|
? `${formatNumber(entry.orbitalPeriod.days, 2)} days (${formatNumber(entry.orbitalPeriod.years, 3)} years)`
|
||||||
|
: "--"],
|
||||||
|
["Rotation period", formatSignedHours(toNumber(entry?.rotationPeriodHours))],
|
||||||
|
["Radius", Number.isFinite(entry?.radiusKm) ? `${formatNumber(entry.radiusKm, 1)} km` : "--"],
|
||||||
|
["Diameter", Number.isFinite(entry?.diameterKm) ? `${formatNumber(entry.diameterKm, 1)} km` : "--"],
|
||||||
|
["Mass", formatMass(toNumber(entry?.massKg))],
|
||||||
|
["Surface gravity", Number.isFinite(entry?.gravityMs2) ? `${formatNumber(entry.gravityMs2, 3)} m/s²` : "--"],
|
||||||
|
["Escape velocity", Number.isFinite(entry?.escapeVelocityKms) ? `${formatNumber(entry.escapeVelocityKms, 2)} km/s` : "--"],
|
||||||
|
["Axial tilt", Number.isFinite(entry?.axialTiltDeg) ? `${formatNumber(entry.axialTiltDeg, 2)}°` : "--"],
|
||||||
|
["Average temperature", Number.isFinite(entry?.averageTempC) ? `${formatNumber(entry.averageTempC, 0)} °C` : "--"],
|
||||||
|
["Moons", Number.isFinite(entry?.moons) ? formatNumber(entry.moons, 0) : "--"]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
function getDisplayTarotName(cardName, trumpNumber) {
|
||||||
|
if (!cardName) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof getTarotCardDisplayName !== "function") {
|
||||||
|
return cardName;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Number.isFinite(Number(trumpNumber))) {
|
||||||
|
return getTarotCardDisplayName(cardName, { trumpNumber: Number(trumpNumber) }) || cardName;
|
||||||
|
}
|
||||||
|
|
||||||
|
return getTarotCardDisplayName(cardName) || cardName;
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderCorrespondence(entry, containerEl) {
|
||||||
|
if (!containerEl) return;
|
||||||
|
containerEl.innerHTML = "";
|
||||||
|
|
||||||
|
const correspondence = entry?.correspondence;
|
||||||
|
|
||||||
|
if (!correspondence || typeof correspondence !== "object") {
|
||||||
|
const fallback = document.createElement("span");
|
||||||
|
fallback.className = "planet-text";
|
||||||
|
fallback.textContent = "No tarot/day correspondence in current local dataset.";
|
||||||
|
containerEl.appendChild(fallback);
|
||||||
|
}
|
||||||
|
|
||||||
|
const symbol = correspondence?.symbol || "";
|
||||||
|
const weekday = correspondence?.weekday || "";
|
||||||
|
const arcana = correspondence?.tarot?.majorArcana || "";
|
||||||
|
const trumpNo = correspondence?.tarot?.number;
|
||||||
|
const arcanaLabel = getDisplayTarotName(arcana, trumpNo);
|
||||||
|
|
||||||
|
// Symbol + weekday line
|
||||||
|
if (symbol || weekday) {
|
||||||
|
const line = document.createElement("span");
|
||||||
|
line.className = "planet-text";
|
||||||
|
line.textContent = [symbol, weekday].filter(Boolean).join(" \u00b7 ");
|
||||||
|
containerEl.appendChild(line);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tarot card link
|
||||||
|
if (arcana) {
|
||||||
|
const btn = document.createElement("button");
|
||||||
|
btn.type = "button";
|
||||||
|
btn.className = "kab-tarot-link";
|
||||||
|
btn.style.marginTop = "8px";
|
||||||
|
btn.textContent = trumpNo != null ? `${arcanaLabel} \u00b7 Trump ${trumpNo}` : arcanaLabel;
|
||||||
|
btn.title = "Open in Tarot section";
|
||||||
|
btn.addEventListener("click", () => {
|
||||||
|
document.dispatchEvent(new CustomEvent("nav:tarot-trump", {
|
||||||
|
detail: { trumpNumber: trumpNo ?? null, cardName: arcana }
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
containerEl.appendChild(btn);
|
||||||
|
}
|
||||||
|
|
||||||
|
const planetId = toPlanetId(correspondence?.id || entry?.id || entry?.name) ||
|
||||||
|
normalizePlanetToken(correspondence?.id || entry?.id || entry?.name);
|
||||||
|
const kabbalahTargets = state.kabbalahTargetsByPlanetId[planetId] || [];
|
||||||
|
if (kabbalahTargets.length) {
|
||||||
|
const row = document.createElement("div");
|
||||||
|
row.className = "kab-god-links";
|
||||||
|
row.style.marginTop = "8px";
|
||||||
|
|
||||||
|
kabbalahTargets.forEach((target) => {
|
||||||
|
const btn = document.createElement("button");
|
||||||
|
btn.type = "button";
|
||||||
|
btn.className = "kab-god-link";
|
||||||
|
btn.textContent = `View ${target.label} ↗`;
|
||||||
|
btn.addEventListener("click", () => {
|
||||||
|
document.dispatchEvent(new CustomEvent("nav:kabbalah-path", {
|
||||||
|
detail: { pathNo: Number(target.number) }
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
row.appendChild(btn);
|
||||||
|
});
|
||||||
|
|
||||||
|
containerEl.appendChild(row);
|
||||||
|
}
|
||||||
|
|
||||||
|
const monthRefs = state.monthRefsByPlanetId.get(planetId) || [];
|
||||||
|
if (monthRefs.length) {
|
||||||
|
const meta = document.createElement("div");
|
||||||
|
meta.className = "kab-god-meta";
|
||||||
|
meta.textContent = "Calendar month correspondences";
|
||||||
|
containerEl.appendChild(meta);
|
||||||
|
|
||||||
|
const row = document.createElement("div");
|
||||||
|
row.className = "kab-god-links";
|
||||||
|
monthRefs.forEach((month) => {
|
||||||
|
const btn = document.createElement("button");
|
||||||
|
btn.type = "button";
|
||||||
|
btn.className = "kab-god-link";
|
||||||
|
btn.textContent = `${month.label || month.name} ↗`;
|
||||||
|
btn.addEventListener("click", () => {
|
||||||
|
document.dispatchEvent(new CustomEvent("nav:calendar-month", {
|
||||||
|
detail: { monthId: month.id }
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
row.appendChild(btn);
|
||||||
|
});
|
||||||
|
containerEl.appendChild(row);
|
||||||
|
}
|
||||||
|
|
||||||
|
const cubePlacements = state.cubePlacementsByPlanetId.get(planetId) || [];
|
||||||
|
if (cubePlacements.length) {
|
||||||
|
const meta = document.createElement("div");
|
||||||
|
meta.className = "kab-god-meta";
|
||||||
|
meta.textContent = "Cube placements";
|
||||||
|
containerEl.appendChild(meta);
|
||||||
|
|
||||||
|
const row = document.createElement("div");
|
||||||
|
row.className = "kab-god-links";
|
||||||
|
cubePlacements.forEach((placement) => {
|
||||||
|
const btn = document.createElement("button");
|
||||||
|
btn.type = "button";
|
||||||
|
btn.className = "kab-god-link";
|
||||||
|
btn.textContent = `${placement.label} ↗`;
|
||||||
|
btn.addEventListener("click", () => {
|
||||||
|
document.dispatchEvent(new CustomEvent("nav:cube", {
|
||||||
|
detail: {
|
||||||
|
planetId,
|
||||||
|
wallId: placement.wallId,
|
||||||
|
edgeId: placement.edgeId
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
row.appendChild(btn);
|
||||||
|
});
|
||||||
|
containerEl.appendChild(row);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderDetail(entry, elements) {
|
||||||
|
if (!entry || !elements) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elements.planetDetailNameEl) {
|
||||||
|
const symbol = entry.symbol ? `${entry.symbol} ` : "";
|
||||||
|
elements.planetDetailNameEl.textContent = `${symbol}${entry.name || "--"}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elements.planetDetailTypeEl) {
|
||||||
|
elements.planetDetailTypeEl.textContent = entry.classification || "--";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elements.planetDetailSummaryEl) {
|
||||||
|
elements.planetDetailSummaryEl.textContent = entry.summary || "--";
|
||||||
|
}
|
||||||
|
|
||||||
|
clearChildren(elements.planetDetailFactsEl);
|
||||||
|
buildFactRows(entry).forEach(([label, value]) => {
|
||||||
|
const row = document.createElement("div");
|
||||||
|
row.className = "planet-fact-row";
|
||||||
|
|
||||||
|
const labelEl = document.createElement("span");
|
||||||
|
labelEl.className = "planet-fact-label";
|
||||||
|
labelEl.textContent = label;
|
||||||
|
|
||||||
|
const valueEl = document.createElement("span");
|
||||||
|
valueEl.className = "planet-fact-value";
|
||||||
|
valueEl.textContent = value;
|
||||||
|
|
||||||
|
row.append(labelEl, valueEl);
|
||||||
|
elements.planetDetailFactsEl?.appendChild(row);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (elements.planetDetailAtmosphereEl) {
|
||||||
|
elements.planetDetailAtmosphereEl.textContent = entry.atmosphere || "--";
|
||||||
|
}
|
||||||
|
|
||||||
|
clearChildren(elements.planetDetailNotableEl);
|
||||||
|
const notableFacts = Array.isArray(entry.notableFacts) ? entry.notableFacts : [];
|
||||||
|
notableFacts.forEach((fact) => {
|
||||||
|
const item = document.createElement("li");
|
||||||
|
item.textContent = fact;
|
||||||
|
elements.planetDetailNotableEl?.appendChild(item);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (elements.planetDetailCorrespondenceEl) {
|
||||||
|
renderCorrespondence(entry, elements.planetDetailCorrespondenceEl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateSelection(elements) {
|
||||||
|
if (!elements?.planetCardListEl) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const buttons = elements.planetCardListEl.querySelectorAll(".planet-list-item");
|
||||||
|
buttons.forEach((button) => {
|
||||||
|
const isSelected = button.dataset.planetId === state.selectedId;
|
||||||
|
button.classList.toggle("is-selected", isSelected);
|
||||||
|
button.setAttribute("aria-selected", isSelected ? "true" : "false");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function selectById(id, elements) {
|
||||||
|
const entry = state.entries.find((planet) => planet.id === id);
|
||||||
|
if (!entry) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
state.selectedId = entry.id;
|
||||||
|
updateSelection(elements);
|
||||||
|
renderDetail(entry, elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderList(elements) {
|
||||||
|
if (!elements?.planetCardListEl) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
clearChildren(elements.planetCardListEl);
|
||||||
|
|
||||||
|
state.filteredEntries.forEach((entry) => {
|
||||||
|
const button = document.createElement("button");
|
||||||
|
button.type = "button";
|
||||||
|
button.className = "planet-list-item";
|
||||||
|
button.dataset.planetId = entry.id;
|
||||||
|
button.setAttribute("role", "option");
|
||||||
|
|
||||||
|
const nameEl = document.createElement("span");
|
||||||
|
nameEl.className = "planet-list-name";
|
||||||
|
const symbol = entry.symbol ? `${entry.symbol} ` : "";
|
||||||
|
nameEl.textContent = `${symbol}${entry.name || "--"}`;
|
||||||
|
|
||||||
|
const metaEl = document.createElement("span");
|
||||||
|
metaEl.className = "planet-list-meta";
|
||||||
|
metaEl.textContent = entry.classification || "--";
|
||||||
|
|
||||||
|
button.append(nameEl, metaEl);
|
||||||
|
elements.planetCardListEl.appendChild(button);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (elements.planetCountEl) {
|
||||||
|
elements.planetCountEl.textContent = state.searchQuery
|
||||||
|
? `${state.filteredEntries.length} of ${state.entries.length} bodies`
|
||||||
|
: `${state.entries.length} bodies`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function ensurePlanetSection(referenceData, magickDataset = null) {
|
||||||
|
if (state.initialized) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const elements = getElements();
|
||||||
|
if (!elements.planetCardListEl || !elements.planetDetailNameEl) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const baseList = Array.isArray(referenceData?.planetScience)
|
||||||
|
? referenceData.planetScience
|
||||||
|
: [];
|
||||||
|
|
||||||
|
if (baseList.length === 0) {
|
||||||
|
if (elements.planetDetailNameEl) {
|
||||||
|
elements.planetDetailNameEl.textContent = "Planet data unavailable";
|
||||||
|
}
|
||||||
|
if (elements.planetDetailSummaryEl) {
|
||||||
|
elements.planetDetailSummaryEl.textContent = "Could not load local science facts dataset.";
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const correspondences = referenceData?.planets && typeof referenceData.planets === "object"
|
||||||
|
? referenceData.planets
|
||||||
|
: {};
|
||||||
|
|
||||||
|
const correspondenceByName = Object.values(correspondences).reduce((acc, value) => {
|
||||||
|
const key = String(value?.name || "").trim().toLowerCase();
|
||||||
|
if (key) {
|
||||||
|
acc[key] = value;
|
||||||
|
}
|
||||||
|
return acc;
|
||||||
|
}, {});
|
||||||
|
|
||||||
|
state.kabbalahTargetsByPlanetId = buildKabbalahTargetsByPlanet(magickDataset);
|
||||||
|
state.monthRefsByPlanetId = buildMonthReferencesByPlanet(referenceData);
|
||||||
|
state.cubePlacementsByPlanetId = buildCubePlacementsByPlanet(magickDataset);
|
||||||
|
|
||||||
|
state.entries = baseList.map((entry) => {
|
||||||
|
const byId = correspondences[entry.id] || null;
|
||||||
|
const byName = correspondenceByName[String(entry?.name || "").trim().toLowerCase()] || null;
|
||||||
|
return {
|
||||||
|
...entry,
|
||||||
|
correspondence: byId || byName || null
|
||||||
|
};
|
||||||
|
});
|
||||||
|
state.filteredEntries = [...state.entries];
|
||||||
|
|
||||||
|
renderList(elements);
|
||||||
|
|
||||||
|
if (state.entries.length > 0) {
|
||||||
|
selectById(state.entries[0].id, elements);
|
||||||
|
}
|
||||||
|
|
||||||
|
elements.planetCardListEl.addEventListener("click", (event) => {
|
||||||
|
const target = event.target;
|
||||||
|
if (!(target instanceof Node)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const button = target instanceof Element
|
||||||
|
? target.closest(".planet-list-item")
|
||||||
|
: null;
|
||||||
|
|
||||||
|
if (!(button instanceof HTMLButtonElement)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const selectedId = button.dataset.planetId;
|
||||||
|
if (!selectedId) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
selectById(selectedId, elements);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (elements.planetSearchInputEl) {
|
||||||
|
elements.planetSearchInputEl.addEventListener("input", () => {
|
||||||
|
state.searchQuery = elements.planetSearchInputEl.value || "";
|
||||||
|
applySearchFilter(elements);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elements.planetSearchClearEl && elements.planetSearchInputEl) {
|
||||||
|
elements.planetSearchClearEl.addEventListener("click", () => {
|
||||||
|
elements.planetSearchInputEl.value = "";
|
||||||
|
state.searchQuery = "";
|
||||||
|
applySearchFilter(elements);
|
||||||
|
elements.planetSearchInputEl.focus();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
state.initialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function selectByPlanetId(planetId) {
|
||||||
|
if (!state.initialized) return;
|
||||||
|
const el = getElements();
|
||||||
|
const needle = String(planetId || "").toLowerCase();
|
||||||
|
const entry = state.entries.find(e =>
|
||||||
|
String(e.id || "").toLowerCase() === needle ||
|
||||||
|
String(e.correspondence?.id || "").toLowerCase() === needle ||
|
||||||
|
String(e.name || "").toLowerCase() === needle
|
||||||
|
);
|
||||||
|
if (!entry) return;
|
||||||
|
selectById(entry.id, el);
|
||||||
|
el.planetCardListEl
|
||||||
|
?.querySelector(`[data-planet-id="${entry.id}"]`)
|
||||||
|
?.scrollIntoView({ block: "nearest" });
|
||||||
|
}
|
||||||
|
|
||||||
|
window.PlanetSectionUi = {
|
||||||
|
ensurePlanetSection,
|
||||||
|
selectByPlanetId
|
||||||
|
};
|
||||||
|
})();
|
||||||
1484
app/ui-quiz.js
Normal file
2314
app/ui-tarot.js
Normal file
590
app/ui-zodiac.js
Normal file
@@ -0,0 +1,590 @@
|
|||||||
|
/* ui-zodiac.js — Zodiac sign browser section */
|
||||||
|
(function () {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
const ELEMENT_STYLE = {
|
||||||
|
fire: { emoji: "🔥", badge: "zod-badge--fire", label: "Fire" },
|
||||||
|
earth: { emoji: "🌍", badge: "zod-badge--earth", label: "Earth" },
|
||||||
|
air: { emoji: "💨", badge: "zod-badge--air", label: "Air" },
|
||||||
|
water: { emoji: "💧", badge: "zod-badge--water", label: "Water" }
|
||||||
|
};
|
||||||
|
|
||||||
|
const PLANET_SYMBOLS = {
|
||||||
|
saturn: "♄︎", jupiter: "♃︎", mars: "♂︎", sol: "☉︎",
|
||||||
|
venus: "♀︎", mercury: "☿︎", luna: "☾︎"
|
||||||
|
};
|
||||||
|
|
||||||
|
const MONTH_NAMES = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
|
||||||
|
|
||||||
|
const state = {
|
||||||
|
initialized: false,
|
||||||
|
entries: [],
|
||||||
|
filteredEntries: [],
|
||||||
|
selectedId: null,
|
||||||
|
searchQuery: "",
|
||||||
|
kabPaths: [],
|
||||||
|
decansBySign: {},
|
||||||
|
monthRefsBySignId: new Map(),
|
||||||
|
cubePlacementBySignId: new Map()
|
||||||
|
};
|
||||||
|
|
||||||
|
// ── Elements ──────────────────────────────────────────────────────────
|
||||||
|
function getElements() {
|
||||||
|
return {
|
||||||
|
listEl: document.getElementById("zodiac-sign-list"),
|
||||||
|
countEl: document.getElementById("zodiac-sign-count"),
|
||||||
|
searchEl: document.getElementById("zodiac-search-input"),
|
||||||
|
searchClearEl: document.getElementById("zodiac-search-clear"),
|
||||||
|
detailNameEl: document.getElementById("zodiac-detail-name"),
|
||||||
|
detailSubEl: document.getElementById("zodiac-detail-sub"),
|
||||||
|
detailBodyEl: document.getElementById("zodiac-detail-body")
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Normalise ─────────────────────────────────────────────────────────
|
||||||
|
function norm(s) {
|
||||||
|
return String(s || "").toLowerCase().replace(/[^a-z0-9 ]/g, "").trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
function cap(s) {
|
||||||
|
return String(s || "").charAt(0).toUpperCase() + String(s || "").slice(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildSearchText(sign) {
|
||||||
|
return norm([
|
||||||
|
sign.name?.en, sign.meaning?.en, sign.elementId, sign.quadruplicity,
|
||||||
|
sign.planetId, sign.id
|
||||||
|
].join(" "));
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatDateRange(rulesFrom) {
|
||||||
|
if (!Array.isArray(rulesFrom) || rulesFrom.length < 2) return "—";
|
||||||
|
const [from, to] = rulesFrom;
|
||||||
|
const fMonth = MONTH_NAMES[(from[0] || 1) - 1];
|
||||||
|
const tMonth = MONTH_NAMES[(to[0] || 1) - 1];
|
||||||
|
return `${fMonth} ${from[1]} – ${tMonth} ${to[1]}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildMonthReferencesBySign(referenceData) {
|
||||||
|
const map = new Map();
|
||||||
|
const months = Array.isArray(referenceData?.calendarMonths) ? referenceData.calendarMonths : [];
|
||||||
|
const holidays = Array.isArray(referenceData?.celestialHolidays) ? referenceData.celestialHolidays : [];
|
||||||
|
const signs = Array.isArray(referenceData?.signs) ? referenceData.signs : [];
|
||||||
|
const monthById = new Map(months.map((month) => [month.id, month]));
|
||||||
|
const monthByOrder = new Map(
|
||||||
|
months
|
||||||
|
.filter((month) => Number.isFinite(Number(month?.order)))
|
||||||
|
.map((month) => [Number(month.order), month])
|
||||||
|
);
|
||||||
|
|
||||||
|
function parseMonthDay(value) {
|
||||||
|
const [month, day] = String(value || "").split("-").map((part) => Number(part));
|
||||||
|
if (!Number.isFinite(month) || !Number.isFinite(day)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return { month, day };
|
||||||
|
}
|
||||||
|
|
||||||
|
function monthOrdersInRange(startMonth, endMonth) {
|
||||||
|
const orders = [];
|
||||||
|
let cursor = startMonth;
|
||||||
|
let guard = 0;
|
||||||
|
|
||||||
|
while (guard < 13) {
|
||||||
|
orders.push(cursor);
|
||||||
|
if (cursor === endMonth) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
cursor = cursor === 12 ? 1 : cursor + 1;
|
||||||
|
guard += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return orders;
|
||||||
|
}
|
||||||
|
|
||||||
|
function pushRef(signId, month) {
|
||||||
|
const key = String(signId || "").trim().toLowerCase();
|
||||||
|
if (!key || !month?.id) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!map.has(key)) {
|
||||||
|
map.set(key, []);
|
||||||
|
}
|
||||||
|
|
||||||
|
const rows = map.get(key);
|
||||||
|
if (rows.some((entry) => entry.id === month.id)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
rows.push({
|
||||||
|
id: month.id,
|
||||||
|
name: month.name || month.id,
|
||||||
|
order: Number.isFinite(Number(month.order)) ? Number(month.order) : 999
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
months.forEach((month) => {
|
||||||
|
pushRef(month?.associations?.zodiacSignId, month);
|
||||||
|
const events = Array.isArray(month?.events) ? month.events : [];
|
||||||
|
events.forEach((event) => {
|
||||||
|
pushRef(event?.associations?.zodiacSignId, month);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
holidays.forEach((holiday) => {
|
||||||
|
const month = monthById.get(holiday?.monthId);
|
||||||
|
if (!month) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pushRef(holiday?.associations?.zodiacSignId, month);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Structural month coverage from sign date ranges (e.g., Scorpio spans Oct+Nov).
|
||||||
|
signs.forEach((sign) => {
|
||||||
|
const start = parseMonthDay(sign?.start);
|
||||||
|
const end = parseMonthDay(sign?.end);
|
||||||
|
if (!start || !end || !sign?.id) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
monthOrdersInRange(start.month, end.month).forEach((monthOrder) => {
|
||||||
|
const month = monthByOrder.get(monthOrder);
|
||||||
|
if (month) {
|
||||||
|
pushRef(sign.id, month);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
map.forEach((rows, key) => {
|
||||||
|
rows.sort((left, right) => left.order - right.order || left.name.localeCompare(right.name));
|
||||||
|
map.set(key, rows);
|
||||||
|
});
|
||||||
|
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildCubeSignPlacements(magickDataset) {
|
||||||
|
const placements = new Map();
|
||||||
|
const cube = magickDataset?.grouped?.kabbalah?.cube || {};
|
||||||
|
const walls = Array.isArray(cube?.walls)
|
||||||
|
? cube.walls
|
||||||
|
: [];
|
||||||
|
const edges = Array.isArray(cube?.edges)
|
||||||
|
? cube.edges
|
||||||
|
: [];
|
||||||
|
const paths = Array.isArray(magickDataset?.grouped?.kabbalah?.["kabbalah-tree"]?.paths)
|
||||||
|
? magickDataset.grouped.kabbalah["kabbalah-tree"].paths
|
||||||
|
: [];
|
||||||
|
|
||||||
|
function normalizeLetterId(value) {
|
||||||
|
const key = String(value || "").toLowerCase().replace(/[^a-z]/g, "").trim();
|
||||||
|
const aliases = {
|
||||||
|
aleph: "alef",
|
||||||
|
beth: "bet",
|
||||||
|
zain: "zayin",
|
||||||
|
cheth: "het",
|
||||||
|
chet: "het",
|
||||||
|
daleth: "dalet",
|
||||||
|
teth: "tet",
|
||||||
|
peh: "pe",
|
||||||
|
tzaddi: "tsadi",
|
||||||
|
tzadi: "tsadi",
|
||||||
|
tzade: "tsadi",
|
||||||
|
tsaddi: "tsadi",
|
||||||
|
qoph: "qof",
|
||||||
|
taw: "tav",
|
||||||
|
tau: "tav"
|
||||||
|
};
|
||||||
|
return aliases[key] || key;
|
||||||
|
}
|
||||||
|
|
||||||
|
function edgeWalls(edge) {
|
||||||
|
const explicitWalls = Array.isArray(edge?.walls)
|
||||||
|
? edge.walls.map((wallId) => String(wallId || "").trim().toLowerCase()).filter(Boolean)
|
||||||
|
: [];
|
||||||
|
|
||||||
|
if (explicitWalls.length >= 2) {
|
||||||
|
return explicitWalls.slice(0, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
return String(edge?.id || "")
|
||||||
|
.trim()
|
||||||
|
.toLowerCase()
|
||||||
|
.split("-")
|
||||||
|
.map((wallId) => wallId.trim())
|
||||||
|
.filter(Boolean)
|
||||||
|
.slice(0, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
function edgeLabel(edge) {
|
||||||
|
const explicitName = String(edge?.name || "").trim();
|
||||||
|
if (explicitName) {
|
||||||
|
return explicitName;
|
||||||
|
}
|
||||||
|
return edgeWalls(edge)
|
||||||
|
.map((part) => cap(part))
|
||||||
|
.join(" ");
|
||||||
|
}
|
||||||
|
|
||||||
|
function resolveCubeDirectionLabel(wallId, edge) {
|
||||||
|
const normalizedWallId = String(wallId || "").trim().toLowerCase();
|
||||||
|
const edgeId = String(edge?.id || "").trim().toLowerCase();
|
||||||
|
if (!normalizedWallId || !edgeId) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
const cubeUi = window.CubeSectionUi;
|
||||||
|
if (cubeUi && typeof cubeUi.getEdgeDirectionLabelForWall === "function") {
|
||||||
|
const directionLabel = String(cubeUi.getEdgeDirectionLabelForWall(normalizedWallId, edgeId) || "").trim();
|
||||||
|
if (directionLabel) {
|
||||||
|
return directionLabel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return edgeLabel(edge);
|
||||||
|
}
|
||||||
|
|
||||||
|
const wallById = new Map(
|
||||||
|
walls.map((wall) => [String(wall?.id || "").trim().toLowerCase(), wall])
|
||||||
|
);
|
||||||
|
|
||||||
|
const pathByLetterId = new Map(
|
||||||
|
paths
|
||||||
|
.map((path) => [normalizeLetterId(path?.hebrewLetter?.transliteration), path])
|
||||||
|
.filter(([letterId]) => Boolean(letterId))
|
||||||
|
);
|
||||||
|
|
||||||
|
edges.forEach((edge) => {
|
||||||
|
const letterId = normalizeLetterId(edge?.hebrewLetterId || edge?.associations?.hebrewLetterId);
|
||||||
|
const path = pathByLetterId.get(letterId) || null;
|
||||||
|
const signId = path?.astrology?.type === "zodiac"
|
||||||
|
? String(path?.astrology?.name || "").trim().toLowerCase()
|
||||||
|
: "";
|
||||||
|
|
||||||
|
if (!signId || placements.has(signId)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const wallsForEdge = edgeWalls(edge);
|
||||||
|
const primaryWallId = wallsForEdge[0] || "";
|
||||||
|
const primaryWall = wallById.get(primaryWallId);
|
||||||
|
|
||||||
|
placements.set(signId, {
|
||||||
|
wallId: primaryWallId,
|
||||||
|
edgeId: String(edge?.id || "").trim().toLowerCase(),
|
||||||
|
wallName: primaryWall?.name || cap(primaryWallId || "wall"),
|
||||||
|
edgeName: resolveCubeDirectionLabel(primaryWallId, edge)
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
return placements;
|
||||||
|
}
|
||||||
|
|
||||||
|
function cubePlacementLabel(placement) {
|
||||||
|
const wallName = placement?.wallName || "Wall";
|
||||||
|
const edgeName = placement?.edgeName || "Direction";
|
||||||
|
return `Cube: ${wallName} Wall - ${edgeName}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── List ──────────────────────────────────────────────────────────────
|
||||||
|
function applyFilter() {
|
||||||
|
const q = norm(state.searchQuery);
|
||||||
|
state.filteredEntries = q
|
||||||
|
? state.entries.filter((s) => buildSearchText(s).includes(q))
|
||||||
|
: [...state.entries];
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderList(els) {
|
||||||
|
if (!els.listEl) return;
|
||||||
|
els.listEl.innerHTML = "";
|
||||||
|
state.filteredEntries.forEach((sign) => {
|
||||||
|
const active = sign.id === state.selectedId;
|
||||||
|
const el = document.createElement("div");
|
||||||
|
el.className = "planet-list-item" + (active ? " is-selected" : "");
|
||||||
|
el.setAttribute("role", "option");
|
||||||
|
el.setAttribute("aria-selected", active ? "true" : "false");
|
||||||
|
el.dataset.id = sign.id;
|
||||||
|
|
||||||
|
const elemStyle = ELEMENT_STYLE[sign.elementId] || {};
|
||||||
|
el.innerHTML = `
|
||||||
|
<div class="zod-list-row">
|
||||||
|
<span class="zod-list-symbol">${sign.symbol || "?"}</span>
|
||||||
|
<span class="planet-list-name">${sign.name?.en || sign.id}</span>
|
||||||
|
<span class="zod-list-elem ${elemStyle.badge || ""}">${elemStyle.emoji || ""}</span>
|
||||||
|
</div>
|
||||||
|
<div class="planet-list-meta">${cap(sign.elementId)} · ${cap(sign.quadruplicity)} · ${cap(sign.planetId)}</div>
|
||||||
|
`;
|
||||||
|
el.addEventListener("click", () => { selectById(sign.id, els); });
|
||||||
|
els.listEl.appendChild(el);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (els.countEl) {
|
||||||
|
els.countEl.textContent = state.searchQuery
|
||||||
|
? `${state.filteredEntries.length} of ${state.entries.length} signs`
|
||||||
|
: `${state.entries.length} signs`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Detail ────────────────────────────────────────────────────────────
|
||||||
|
function renderDetail(sign, els) {
|
||||||
|
if (!els.detailNameEl) return;
|
||||||
|
|
||||||
|
const elemStyle = ELEMENT_STYLE[sign.elementId] || {};
|
||||||
|
const polarity = ["fire", "air"].includes(sign.elementId) ? "Masculine / Positive" : "Feminine / Negative";
|
||||||
|
const kabPath = state.kabPaths.find(
|
||||||
|
(p) => p.astrology?.type === "zodiac" &&
|
||||||
|
p.astrology?.name?.toLowerCase() === sign.id
|
||||||
|
);
|
||||||
|
const decans = state.decansBySign[sign.id] || [];
|
||||||
|
const monthRefs = state.monthRefsBySignId.get(String(sign.id || "").toLowerCase()) || [];
|
||||||
|
const cubePlacement = state.cubePlacementBySignId.get(String(sign.id || "").toLowerCase()) || null;
|
||||||
|
|
||||||
|
// Heading
|
||||||
|
els.detailNameEl.textContent = sign.symbol || sign.id;
|
||||||
|
els.detailSubEl.textContent = `${sign.name?.en || ""} — ${sign.meaning?.en || ""}`;
|
||||||
|
|
||||||
|
const sections = [];
|
||||||
|
|
||||||
|
// ── Sign Details ──────────────────────────────────────────────────
|
||||||
|
const elemBadge = `<span class="zod-badge ${elemStyle.badge || ""}">${elemStyle.emoji || ""} ${cap(sign.elementId)}</span>`;
|
||||||
|
const quadBadge = `<span class="zod-badge zod-badge--quad">${cap(sign.quadruplicity)}</span>`;
|
||||||
|
sections.push(`<div class="planet-meta-card">
|
||||||
|
<strong>Sign Details</strong>
|
||||||
|
<div class="planet-text">
|
||||||
|
<dl class="alpha-dl">
|
||||||
|
<dt>Symbol</dt><dd>${sign.symbol || "—"}</dd>
|
||||||
|
<dt>Meaning</dt><dd>${sign.meaning?.en || "—"}</dd>
|
||||||
|
<dt>Element</dt><dd>${elemBadge}</dd>
|
||||||
|
<dt>Modality</dt><dd>${quadBadge}</dd>
|
||||||
|
<dt>Polarity</dt><dd>${polarity}</dd>
|
||||||
|
<dt>Dates</dt><dd>${formatDateRange(sign.rulesFrom)}</dd>
|
||||||
|
<dt>Position</dt><dd>#${sign.no} of 12</dd>
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
|
</div>`);
|
||||||
|
|
||||||
|
// ── Ruling Planet ─────────────────────────────────────────────────
|
||||||
|
const planetSym = PLANET_SYMBOLS[sign.planetId] || "";
|
||||||
|
sections.push(`<div class="planet-meta-card">
|
||||||
|
<strong>Ruling Planet</strong>
|
||||||
|
<div class="planet-text">
|
||||||
|
<p style="font-size:22px;margin:0 0 6px">${planetSym} ${cap(sign.planetId)}</p>
|
||||||
|
<button class="alpha-nav-btn" data-nav="planet" data-planet-id="${sign.planetId}">
|
||||||
|
View ${cap(sign.planetId)} ↗
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>`);
|
||||||
|
|
||||||
|
if (cubePlacement) {
|
||||||
|
sections.push(`<div class="planet-meta-card">
|
||||||
|
<strong>Cube of Space</strong>
|
||||||
|
<div class="planet-text">This sign appears in Cube edge correspondences.</div>
|
||||||
|
<div class="alpha-nav-btns">
|
||||||
|
<button class="alpha-nav-btn" data-nav="cube-sign" data-sign-id="${sign.id}" data-wall-id="${cubePlacement.wallId}" data-edge-id="${cubePlacement.edgeId}">
|
||||||
|
${cubePlacementLabel(cubePlacement)} ↗
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Kabbalah Path + Trump ─────────────────────────────────────────
|
||||||
|
if (kabPath) {
|
||||||
|
const hl = kabPath.hebrewLetter || {};
|
||||||
|
sections.push(`<div class="planet-meta-card">
|
||||||
|
<strong>Kabbalah & Major Arcana</strong>
|
||||||
|
<div class="planet-text">
|
||||||
|
<div style="display:flex;align-items:center;gap:12px;margin-bottom:8px">
|
||||||
|
<span class="zod-hebrew-glyph">${hl.char || ""}</span>
|
||||||
|
<div>
|
||||||
|
<div style="font-weight:600">${hl.transliteration || ""} (${hl.meaning || ""})</div>
|
||||||
|
<div class="planet-list-meta">${cap(hl.letterType || "")} letter · Path ${kabPath.pathNumber}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<dl class="alpha-dl" style="margin-bottom:8px">
|
||||||
|
<dt>Trump Card</dt><dd>${kabPath.tarot?.card || "—"}</dd>
|
||||||
|
<dt>Intelligence</dt><dd>${kabPath.intelligence || "—"}</dd>
|
||||||
|
</dl>
|
||||||
|
<div class="alpha-nav-btns">
|
||||||
|
<button class="alpha-nav-btn" data-nav="kab-path" data-path-number="${kabPath.pathNumber}">
|
||||||
|
Kabbalah Path ${kabPath.pathNumber} ↗
|
||||||
|
</button>
|
||||||
|
<button class="alpha-nav-btn" data-nav="trump" data-trump-number="${kabPath.tarot?.trumpNumber}">
|
||||||
|
${kabPath.tarot?.card || "Tarot Card"} ↗
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Decans & Minor Arcana ─────────────────────────────────────────
|
||||||
|
if (decans.length) {
|
||||||
|
const decanRows = decans.map((d) => {
|
||||||
|
const ord = ["1st","2nd","3rd"][d.index - 1] || d.index;
|
||||||
|
const sym = PLANET_SYMBOLS[d.rulerPlanetId] || "";
|
||||||
|
return `<div class="zod-decan-row">
|
||||||
|
<span class="zod-decan-ord">${ord}</span>
|
||||||
|
<span class="zod-decan-planet">${sym} ${cap(d.rulerPlanetId)}</span>
|
||||||
|
<button class="zod-decan-card-btn" data-nav="tarot-card" data-card-name="${d.tarotMinorArcana}">
|
||||||
|
${d.tarotMinorArcana} ↗
|
||||||
|
</button>
|
||||||
|
</div>`;
|
||||||
|
}).join("");
|
||||||
|
sections.push(`<div class="planet-meta-card">
|
||||||
|
<strong>Decans & Minor Arcana</strong>
|
||||||
|
<div class="planet-text">${decanRows}</div>
|
||||||
|
</div>`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (monthRefs.length) {
|
||||||
|
const monthButtons = monthRefs.map((month) =>
|
||||||
|
`<button class="alpha-nav-btn" data-nav="calendar-month" data-month-id="${month.id}">${month.name} ↗</button>`
|
||||||
|
).join("");
|
||||||
|
|
||||||
|
sections.push(`<div class="planet-meta-card">
|
||||||
|
<strong>Calendar Months</strong>
|
||||||
|
<div class="planet-text">Month correspondences linked to ${sign.name?.en || sign.id}.</div>
|
||||||
|
<div class="alpha-nav-btns">${monthButtons}</div>
|
||||||
|
</div>`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Kabbalah extras ───────────────────────────────────────────────
|
||||||
|
if (sign.tribeOfIsraelId || sign.tetragrammatonPermutation) {
|
||||||
|
sections.push(`<div class="planet-meta-card">
|
||||||
|
<strong>Kabbalah Correspondences</strong>
|
||||||
|
<div class="planet-text">
|
||||||
|
<dl class="alpha-dl">
|
||||||
|
${sign.tribeOfIsraelId ? `<dt>Tribe of Israel</dt><dd>${cap(sign.tribeOfIsraelId)}</dd>` : ""}
|
||||||
|
${sign.tetragrammatonPermutation ? `<dt>Tetragrammaton</dt><dd class="zod-tetra">${sign.tetragrammatonPermutation}</dd>` : ""}
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
|
</div>`);
|
||||||
|
}
|
||||||
|
|
||||||
|
els.detailBodyEl.innerHTML = `<div class="planet-meta-grid">${sections.join("")}</div>`;
|
||||||
|
|
||||||
|
// Attach button listeners
|
||||||
|
els.detailBodyEl.querySelectorAll("[data-nav]").forEach((btn) => {
|
||||||
|
btn.addEventListener("click", () => {
|
||||||
|
const nav = btn.dataset.nav;
|
||||||
|
if (nav === "planet") {
|
||||||
|
document.dispatchEvent(new CustomEvent("nav:planet", {
|
||||||
|
detail: { planetId: btn.dataset.planetId }
|
||||||
|
}));
|
||||||
|
} else if (nav === "kab-path") {
|
||||||
|
document.dispatchEvent(new CustomEvent("tarot:view-kab-path", {
|
||||||
|
detail: { pathNumber: Number(btn.dataset.pathNumber) }
|
||||||
|
}));
|
||||||
|
} else if (nav === "trump") {
|
||||||
|
document.dispatchEvent(new CustomEvent("kab:view-trump", {
|
||||||
|
detail: { trumpNumber: Number(btn.dataset.trumpNumber) }
|
||||||
|
}));
|
||||||
|
} else if (nav === "tarot-card") {
|
||||||
|
document.dispatchEvent(new CustomEvent("nav:tarot-trump", {
|
||||||
|
detail: { cardName: btn.dataset.cardName }
|
||||||
|
}));
|
||||||
|
} else if (nav === "calendar-month") {
|
||||||
|
document.dispatchEvent(new CustomEvent("nav:calendar-month", {
|
||||||
|
detail: { monthId: btn.dataset.monthId }
|
||||||
|
}));
|
||||||
|
} else if (nav === "cube-sign") {
|
||||||
|
document.dispatchEvent(new CustomEvent("nav:cube", {
|
||||||
|
detail: {
|
||||||
|
signId: btn.dataset.signId,
|
||||||
|
wallId: btn.dataset.wallId,
|
||||||
|
edgeId: btn.dataset.edgeId
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function resetDetail(els) {
|
||||||
|
if (els.detailNameEl) els.detailNameEl.textContent = "--";
|
||||||
|
if (els.detailSubEl) els.detailSubEl.textContent = "Select a sign to explore";
|
||||||
|
if (els.detailBodyEl) els.detailBodyEl.innerHTML = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Selection ─────────────────────────────────────────────────────────
|
||||||
|
function selectById(id, els) {
|
||||||
|
const sign = state.entries.find((s) => s.id === id);
|
||||||
|
if (!sign) return;
|
||||||
|
state.selectedId = id;
|
||||||
|
renderList(els);
|
||||||
|
renderDetail(sign, els);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Public select (for incoming navigation) ───────────────────────────
|
||||||
|
function selectBySignId(signId) {
|
||||||
|
const els = getElements();
|
||||||
|
if (!state.initialized) return;
|
||||||
|
const sign = state.entries.find((s) => s.id === signId);
|
||||||
|
if (sign) selectById(signId, els);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Init ───────────────────────────────────────────────────────────────
|
||||||
|
function ensureZodiacSection(referenceData, magickDataset) {
|
||||||
|
state.monthRefsBySignId = buildMonthReferencesBySign(referenceData);
|
||||||
|
state.cubePlacementBySignId = buildCubeSignPlacements(magickDataset);
|
||||||
|
|
||||||
|
if (state.initialized) {
|
||||||
|
const els = getElements();
|
||||||
|
const current = state.entries.find((entry) => entry.id === state.selectedId);
|
||||||
|
if (current) {
|
||||||
|
renderDetail(current, els);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
state.initialized = true;
|
||||||
|
|
||||||
|
const zodiacObj = magickDataset?.grouped?.astrology?.zodiac || {};
|
||||||
|
state.entries = Object.values(zodiacObj).sort((a, b) => (a.no || 0) - (b.no || 0));
|
||||||
|
|
||||||
|
const kabTree = magickDataset?.grouped?.kabbalah?.["kabbalah-tree"];
|
||||||
|
state.kabPaths = Array.isArray(kabTree?.paths) ? kabTree.paths : [];
|
||||||
|
|
||||||
|
state.decansBySign = referenceData?.decansBySign || {};
|
||||||
|
|
||||||
|
const els = getElements();
|
||||||
|
applyFilter();
|
||||||
|
renderList(els);
|
||||||
|
|
||||||
|
if (state.entries.length > 0) {
|
||||||
|
selectById(state.entries[0].id, els);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Search
|
||||||
|
if (els.searchEl) {
|
||||||
|
els.searchEl.addEventListener("input", () => {
|
||||||
|
state.searchQuery = els.searchEl.value;
|
||||||
|
if (els.searchClearEl) els.searchClearEl.disabled = !state.searchQuery;
|
||||||
|
applyFilter();
|
||||||
|
renderList(els);
|
||||||
|
if (!state.filteredEntries.some((s) => s.id === state.selectedId)) {
|
||||||
|
if (state.filteredEntries.length > 0) {
|
||||||
|
selectById(state.filteredEntries[0].id, els);
|
||||||
|
} else {
|
||||||
|
state.selectedId = null;
|
||||||
|
resetDetail(els);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (els.searchClearEl) {
|
||||||
|
els.searchClearEl.addEventListener("click", () => {
|
||||||
|
state.searchQuery = "";
|
||||||
|
if (els.searchEl) els.searchEl.value = "";
|
||||||
|
els.searchClearEl.disabled = true;
|
||||||
|
applyFilter();
|
||||||
|
renderList(els);
|
||||||
|
if (state.entries.length > 0) selectById(state.entries[0].id, els);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
window.ZodiacSectionUi = {
|
||||||
|
ensureZodiacSection,
|
||||||
|
selectBySignId
|
||||||
|
};
|
||||||
|
})();
|
||||||
BIN
asset/img/enochian/char(65).png
Normal file
|
After Width: | Height: | Size: 562 B |
BIN
asset/img/enochian/char(66).png
Normal file
|
After Width: | Height: | Size: 770 B |
BIN
asset/img/enochian/char(67).png
Normal file
|
After Width: | Height: | Size: 717 B |
BIN
asset/img/enochian/char(68).png
Normal file
|
After Width: | Height: | Size: 642 B |
BIN
asset/img/enochian/char(69).png
Normal file
|
After Width: | Height: | Size: 395 B |
BIN
asset/img/enochian/char(70).png
Normal file
|
After Width: | Height: | Size: 547 B |
BIN
asset/img/enochian/char(71).png
Normal file
|
After Width: | Height: | Size: 652 B |
BIN
asset/img/enochian/char(72).png
Normal file
|
After Width: | Height: | Size: 796 B |
BIN
asset/img/enochian/char(73).png
Normal file
|
After Width: | Height: | Size: 361 B |
BIN
asset/img/enochian/char(76).png
Normal file
|
After Width: | Height: | Size: 594 B |
BIN
asset/img/enochian/char(77).png
Normal file
|
After Width: | Height: | Size: 554 B |
BIN
asset/img/enochian/char(78).png
Normal file
|
After Width: | Height: | Size: 604 B |
BIN
asset/img/enochian/char(79).png
Normal file
|
After Width: | Height: | Size: 552 B |
BIN
asset/img/enochian/char(80).png
Normal file
|
After Width: | Height: | Size: 662 B |
BIN
asset/img/enochian/char(81).png
Normal file
|
After Width: | Height: | Size: 430 B |
BIN
asset/img/enochian/char(82).png
Normal file
|
After Width: | Height: | Size: 679 B |
BIN
asset/img/enochian/char(83).png
Normal file
|
After Width: | Height: | Size: 502 B |
BIN
asset/img/enochian/char(84).png
Normal file
|
After Width: | Height: | Size: 431 B |
BIN
asset/img/enochian/char(85).png
Normal file
|
After Width: | Height: | Size: 639 B |
BIN
asset/img/enochian/char(86).png
Normal file
|
After Width: | Height: | Size: 639 B |
BIN
asset/img/enochian/char(88).png
Normal file
|
After Width: | Height: | Size: 381 B |
BIN
asset/img/enochian/char(90).png
Normal file
|
After Width: | Height: | Size: 587 B |
50
data/MANIFEST.json
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
{
|
||||||
|
"generatedAt": "2026-02-22T03:40:25.496Z",
|
||||||
|
"source": "data",
|
||||||
|
"output": "data",
|
||||||
|
"totals": {
|
||||||
|
"json": 37,
|
||||||
|
"assets": 1,
|
||||||
|
"files": 38
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"alphabets.json",
|
||||||
|
"gods.json",
|
||||||
|
"numbers.json",
|
||||||
|
"playing-cards-52.json",
|
||||||
|
"alchemy/elementals.json",
|
||||||
|
"alchemy/elements.json",
|
||||||
|
"alchemy/symbols.json",
|
||||||
|
"alchemy/terms.json",
|
||||||
|
"astrology/houses.json",
|
||||||
|
"astrology/planets.json",
|
||||||
|
"astrology/retrograde.json",
|
||||||
|
"astrology/zodiac.json",
|
||||||
|
"chakras.json",
|
||||||
|
"enochian/dictionary.json",
|
||||||
|
"enochian/letters.json",
|
||||||
|
"enochian/tablets.json",
|
||||||
|
"gd/degrees.json",
|
||||||
|
"gd/grades.json",
|
||||||
|
"geomancy/houses.json",
|
||||||
|
"geomancy/tetragrams.json",
|
||||||
|
"hebrewLetters.json",
|
||||||
|
"kabbalah/angelicOrders.json",
|
||||||
|
"kabbalah/archangels.json",
|
||||||
|
"kabbalah/cube.json",
|
||||||
|
"kabbalah/fourWorlds.json",
|
||||||
|
"kabbalah/godNames.json",
|
||||||
|
"kabbalah/kerubim.json",
|
||||||
|
"kabbalah/kabbalah-tree.json",
|
||||||
|
"kabbalah/paths.json",
|
||||||
|
"kabbalah/sephirot.json",
|
||||||
|
"kabbalah/seventyTwoAngels.json",
|
||||||
|
"kabbalah/souls.json",
|
||||||
|
"kabbalah/tribesOfIsrael.json",
|
||||||
|
"hebrew-calendar.json",
|
||||||
|
"islamic-calendar.json",
|
||||||
|
"calendar-holidays.json",
|
||||||
|
"wheel-of-year.json",
|
||||||
|
"pentagram.svg"
|
||||||
|
]
|
||||||
|
}
|
||||||
54
data/alchemy/elementals.json
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"gnome": {
|
||||||
|
"id": "gnome",
|
||||||
|
"name": {
|
||||||
|
"en": "Gnome"
|
||||||
|
},
|
||||||
|
"namePlural": {
|
||||||
|
"en": "Gnomes"
|
||||||
|
},
|
||||||
|
"title": {
|
||||||
|
"en": "Spirits of Earth"
|
||||||
|
},
|
||||||
|
"elementId": "earth"
|
||||||
|
},
|
||||||
|
"sylph": {
|
||||||
|
"id": "sylph",
|
||||||
|
"name": {
|
||||||
|
"en": "Sylph"
|
||||||
|
},
|
||||||
|
"namePlural": {
|
||||||
|
"en": "Sylphs"
|
||||||
|
},
|
||||||
|
"title": {
|
||||||
|
"en": "Spirits of Air"
|
||||||
|
},
|
||||||
|
"elementId": "air"
|
||||||
|
},
|
||||||
|
"undine": {
|
||||||
|
"id": "undine",
|
||||||
|
"name": {
|
||||||
|
"en": "Undine"
|
||||||
|
},
|
||||||
|
"namePlural": {
|
||||||
|
"en": "Undines"
|
||||||
|
},
|
||||||
|
"title": {
|
||||||
|
"en": "Spirits of Water"
|
||||||
|
},
|
||||||
|
"elementId": "water"
|
||||||
|
},
|
||||||
|
"salamander": {
|
||||||
|
"id": "salamander",
|
||||||
|
"name": {
|
||||||
|
"en": "Salamander"
|
||||||
|
},
|
||||||
|
"namePlural": {
|
||||||
|
"en": "Salamanders"
|
||||||
|
},
|
||||||
|
"title": {
|
||||||
|
"en": "Spirits of Fire"
|
||||||
|
},
|
||||||
|
"elementId": "fire"
|
||||||
|
}
|
||||||
|
}
|
||||||
42
data/alchemy/elements.json
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
{
|
||||||
|
"earth": {
|
||||||
|
"id": "earth",
|
||||||
|
"symbol": "🜃",
|
||||||
|
"name": {
|
||||||
|
"en": "Earth"
|
||||||
|
},
|
||||||
|
"elementalId": "gnome"
|
||||||
|
},
|
||||||
|
"air": {
|
||||||
|
"id": "air",
|
||||||
|
"symbol": "🜁",
|
||||||
|
"name": {
|
||||||
|
"en": "Air"
|
||||||
|
},
|
||||||
|
"elementalId": "sylph"
|
||||||
|
},
|
||||||
|
"water": {
|
||||||
|
"id": "water",
|
||||||
|
"symbol": "🜄",
|
||||||
|
"name": {
|
||||||
|
"en": "Water"
|
||||||
|
},
|
||||||
|
"elementalId": "undine"
|
||||||
|
},
|
||||||
|
"fire": {
|
||||||
|
"id": "fire",
|
||||||
|
"symbol": "🜂",
|
||||||
|
"name": {
|
||||||
|
"en": "Fire"
|
||||||
|
},
|
||||||
|
"elementalId": "salamander"
|
||||||
|
},
|
||||||
|
"spirit": {
|
||||||
|
"id": "spirit",
|
||||||
|
"symbol": "☸",
|
||||||
|
"name": {
|
||||||
|
"en": "Spirit"
|
||||||
|
},
|
||||||
|
"elementalId": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
109
data/alchemy/symbols.json
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
{
|
||||||
|
"sulphur": {
|
||||||
|
"id": "sulphur",
|
||||||
|
"symbol": "🜍",
|
||||||
|
"altSymbol": "🜍",
|
||||||
|
"name": {
|
||||||
|
"en": "Sulphur"
|
||||||
|
},
|
||||||
|
"category": "principles",
|
||||||
|
"gdGrade": 1
|
||||||
|
},
|
||||||
|
"mercury": {
|
||||||
|
"id": "mercury",
|
||||||
|
"symbol": "☿︎",
|
||||||
|
"altSymbol": "☿︎",
|
||||||
|
"name": {
|
||||||
|
"en": "Mercury"
|
||||||
|
},
|
||||||
|
"category": "principles",
|
||||||
|
"gdGrade": 1
|
||||||
|
},
|
||||||
|
"salt": {
|
||||||
|
"id": "salt",
|
||||||
|
"symbol": "🜔",
|
||||||
|
"altSymbol": "🜔",
|
||||||
|
"name": {
|
||||||
|
"en": "Salt"
|
||||||
|
},
|
||||||
|
"category": "principles",
|
||||||
|
"gdGrade": 1
|
||||||
|
},
|
||||||
|
"lead": {
|
||||||
|
"id": "lead",
|
||||||
|
"symbol": "🜪",
|
||||||
|
"altSymbol": "♄︎",
|
||||||
|
"name": {
|
||||||
|
"en": "Lead"
|
||||||
|
},
|
||||||
|
"category": "planets",
|
||||||
|
"planetId": "saturn",
|
||||||
|
"gdGrade": 1
|
||||||
|
},
|
||||||
|
"tin": {
|
||||||
|
"id": "tin",
|
||||||
|
"symbol": "🜩",
|
||||||
|
"altSymbol": "♃︎",
|
||||||
|
"name": {
|
||||||
|
"en": "Tin"
|
||||||
|
},
|
||||||
|
"category": "planets",
|
||||||
|
"planetId": "jupiter",
|
||||||
|
"gdGrade": 1
|
||||||
|
},
|
||||||
|
"iron": {
|
||||||
|
"id": "iron",
|
||||||
|
"symbol": "🜜",
|
||||||
|
"altSymbol": "♂︎",
|
||||||
|
"name": {
|
||||||
|
"en": "Iron"
|
||||||
|
},
|
||||||
|
"category": "planets",
|
||||||
|
"planetId": "mars",
|
||||||
|
"gdGrade": 1
|
||||||
|
},
|
||||||
|
"gold": {
|
||||||
|
"id": "gold",
|
||||||
|
"symbol": "🜚",
|
||||||
|
"altSymbol": "☉︎",
|
||||||
|
"name": {
|
||||||
|
"en": "Gold"
|
||||||
|
},
|
||||||
|
"category": "planets",
|
||||||
|
"planetId": "sol",
|
||||||
|
"gdGrade": 1
|
||||||
|
},
|
||||||
|
"copper": {
|
||||||
|
"id": "copper",
|
||||||
|
"symbol": "🜠",
|
||||||
|
"altSymbol": "♀︎",
|
||||||
|
"name": {
|
||||||
|
"en": "Copper / Brass"
|
||||||
|
},
|
||||||
|
"category": "planets",
|
||||||
|
"planetId": "venus",
|
||||||
|
"gdGrade": 1
|
||||||
|
},
|
||||||
|
"quicksilver": {
|
||||||
|
"id": "quicksilver",
|
||||||
|
"symbol": "☿︎",
|
||||||
|
"altSymbol": "☿︎",
|
||||||
|
"name": {
|
||||||
|
"en": "Quicksilver"
|
||||||
|
},
|
||||||
|
"category": "planets",
|
||||||
|
"planetId": "mercury",
|
||||||
|
"gdGrade": 1
|
||||||
|
},
|
||||||
|
"silver": {
|
||||||
|
"id": "silver",
|
||||||
|
"symbol": "🜛",
|
||||||
|
"altSymbol": "☽︎",
|
||||||
|
"name": {
|
||||||
|
"en": "Silver"
|
||||||
|
},
|
||||||
|
"category": "planets",
|
||||||
|
"planetId": "luna",
|
||||||
|
"gdGrade": 1
|
||||||
|
}
|
||||||
|
}
|
||||||
78
data/alchemy/terms.json
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
{
|
||||||
|
"sol-philosophorum": {
|
||||||
|
"id": "sol-philosophorum",
|
||||||
|
"name": {
|
||||||
|
"en": "Sol Philosophorum"
|
||||||
|
},
|
||||||
|
"terms": {
|
||||||
|
"en": [
|
||||||
|
"Pure living Alchemical Spirit of Gold",
|
||||||
|
"Refined Essence of Heat & Dryness"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"gdGrade": 1
|
||||||
|
},
|
||||||
|
"luna-philosophorum": {
|
||||||
|
"id": "luna-philosophorum",
|
||||||
|
"name": {
|
||||||
|
"en": "Luna Philosophorum"
|
||||||
|
},
|
||||||
|
"terms": {
|
||||||
|
"en": [
|
||||||
|
"Pure living Alchemical Spirit of Silver",
|
||||||
|
"Refined Essence of Heat & Moisture"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"gdGrade": 1
|
||||||
|
},
|
||||||
|
"green-lion": {
|
||||||
|
"id": "green-lion",
|
||||||
|
"name": {
|
||||||
|
"en": "Green Lion"
|
||||||
|
},
|
||||||
|
"terms": {
|
||||||
|
"en": [
|
||||||
|
"Stem and Root of Radical Essence of Metals"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"gdGrade": 1
|
||||||
|
},
|
||||||
|
"black-dragon": {
|
||||||
|
"id": "black-dragon",
|
||||||
|
"name": {
|
||||||
|
"en": "Black Dragon"
|
||||||
|
},
|
||||||
|
"terms": {
|
||||||
|
"en": [
|
||||||
|
"Death - Putrafaction - Decay"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"gdGrade": 1
|
||||||
|
},
|
||||||
|
"king": {
|
||||||
|
"id": "king",
|
||||||
|
"name": {
|
||||||
|
"en": "The King"
|
||||||
|
},
|
||||||
|
"terms": {
|
||||||
|
"en": [
|
||||||
|
"Red - Qabalistic Microprosopus",
|
||||||
|
"Tiphareth - Analogous to Gold and the Sun"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"gdGrade": 1
|
||||||
|
},
|
||||||
|
"queen": {
|
||||||
|
"id": "queen",
|
||||||
|
"name": {
|
||||||
|
"en": "The Queen"
|
||||||
|
},
|
||||||
|
"terms": {
|
||||||
|
"en": [
|
||||||
|
"White - Qabalistic Bride of Microprosopus",
|
||||||
|
"Malkah - Analogous to Silver and the Moon"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"gdGrade": 1
|
||||||
|
}
|
||||||
|
}
|
||||||
755
data/alphabets.json
Normal file
@@ -0,0 +1,755 @@
|
|||||||
|
{
|
||||||
|
"meta": {
|
||||||
|
"description": "Cross-alphabet reference: English (26), Hebrew (22 kabbalah letters), and Greek (24 modern + 3 archaic numerals). Hebrew entries cross-reference hebrewLetters.json and kabbalah-tree.json; Greek entries trace Phoenician/Hebrew origins via hebrewLetterId FK.",
|
||||||
|
"sources": [
|
||||||
|
"Sefer Yetzirah",
|
||||||
|
"Liber 777 — Aleister Crowley",
|
||||||
|
"Ancient Greek Alphabet & Isopsephy tradition",
|
||||||
|
"ISO 15924",
|
||||||
|
"Pythagorean numerology"
|
||||||
|
],
|
||||||
|
"notes": "Hebrew kabbalahPathNumber is a FK to kabbalah-tree.json paths[].pathNumber. hebrewLetterId is a FK to hebrewLetters.json. Greek archaic letters (Digamma, Qoppa, Sampi) are marked archaic:true and used only in isopsephy; they are not part of the modern 24-letter Greek alphabet."
|
||||||
|
},
|
||||||
|
"hebrew": [
|
||||||
|
{
|
||||||
|
"index": 1,
|
||||||
|
"hebrewLetterId": "alef",
|
||||||
|
"char": "א",
|
||||||
|
"name": "Aleph",
|
||||||
|
"transliteration": "A",
|
||||||
|
"numerology": 1,
|
||||||
|
"meaning": "ox",
|
||||||
|
"letterType": "mother",
|
||||||
|
"astrology": { "type": "element", "name": "Air" },
|
||||||
|
"kabbalahPathNumber": 11,
|
||||||
|
"tarot": { "card": "The Fool", "trumpNumber": 0 },
|
||||||
|
"greekEquivalent": "alpha"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 2,
|
||||||
|
"hebrewLetterId": "bet",
|
||||||
|
"char": "ב",
|
||||||
|
"name": "Beth",
|
||||||
|
"transliteration": "B",
|
||||||
|
"numerology": 2,
|
||||||
|
"meaning": "house",
|
||||||
|
"letterType": "double",
|
||||||
|
"astrology": { "type": "planet", "name": "Mercury" },
|
||||||
|
"kabbalahPathNumber": 12,
|
||||||
|
"tarot": { "card": "The Magician", "trumpNumber": 1 },
|
||||||
|
"greekEquivalent": "beta"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 3,
|
||||||
|
"hebrewLetterId": "gimel",
|
||||||
|
"char": "ג",
|
||||||
|
"name": "Gimel",
|
||||||
|
"transliteration": "G",
|
||||||
|
"numerology": 3,
|
||||||
|
"meaning": "camel",
|
||||||
|
"letterType": "double",
|
||||||
|
"astrology": { "type": "planet", "name": "Luna" },
|
||||||
|
"kabbalahPathNumber": 13,
|
||||||
|
"tarot": { "card": "The High Priestess", "trumpNumber": 2 },
|
||||||
|
"greekEquivalent": "gamma"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 4,
|
||||||
|
"hebrewLetterId": "dalet",
|
||||||
|
"char": "ד",
|
||||||
|
"name": "Daleth",
|
||||||
|
"transliteration": "D",
|
||||||
|
"numerology": 4,
|
||||||
|
"meaning": "door",
|
||||||
|
"letterType": "double",
|
||||||
|
"astrology": { "type": "planet", "name": "Venus" },
|
||||||
|
"kabbalahPathNumber": 14,
|
||||||
|
"tarot": { "card": "The Empress", "trumpNumber": 3 },
|
||||||
|
"greekEquivalent": "delta"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 5,
|
||||||
|
"hebrewLetterId": "he",
|
||||||
|
"char": "ה",
|
||||||
|
"name": "Heh",
|
||||||
|
"transliteration": "H",
|
||||||
|
"numerology": 5,
|
||||||
|
"meaning": "window",
|
||||||
|
"letterType": "simple",
|
||||||
|
"astrology": { "type": "zodiac", "name": "Aries" },
|
||||||
|
"kabbalahPathNumber": 15,
|
||||||
|
"tarot": { "card": "The Emperor", "trumpNumber": 4 },
|
||||||
|
"greekEquivalent": "epsilon"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 6,
|
||||||
|
"hebrewLetterId": "vav",
|
||||||
|
"char": "ו",
|
||||||
|
"name": "Vav",
|
||||||
|
"transliteration": "V",
|
||||||
|
"numerology": 6,
|
||||||
|
"meaning": "peg, nail, hook",
|
||||||
|
"letterType": "simple",
|
||||||
|
"astrology": { "type": "zodiac", "name": "Taurus" },
|
||||||
|
"kabbalahPathNumber": 16,
|
||||||
|
"tarot": { "card": "The Hierophant", "trumpNumber": 5 },
|
||||||
|
"greekEquivalent": "digamma"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 7,
|
||||||
|
"hebrewLetterId": "zayin",
|
||||||
|
"char": "ז",
|
||||||
|
"name": "Zayin",
|
||||||
|
"transliteration": "Z",
|
||||||
|
"numerology": 7,
|
||||||
|
"meaning": "sword, weapon",
|
||||||
|
"letterType": "simple",
|
||||||
|
"astrology": { "type": "zodiac", "name": "Gemini" },
|
||||||
|
"kabbalahPathNumber": 17,
|
||||||
|
"tarot": { "card": "The Lovers", "trumpNumber": 6 },
|
||||||
|
"greekEquivalent": "zeta"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 8,
|
||||||
|
"hebrewLetterId": "het",
|
||||||
|
"char": "ח",
|
||||||
|
"name": "Cheth",
|
||||||
|
"transliteration": "Ch",
|
||||||
|
"numerology": 8,
|
||||||
|
"meaning": "enclosure, fence",
|
||||||
|
"letterType": "simple",
|
||||||
|
"astrology": { "type": "zodiac", "name": "Cancer" },
|
||||||
|
"kabbalahPathNumber": 18,
|
||||||
|
"tarot": { "card": "The Chariot", "trumpNumber": 7 },
|
||||||
|
"greekEquivalent": "eta"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 9,
|
||||||
|
"hebrewLetterId": "tet",
|
||||||
|
"char": "ט",
|
||||||
|
"name": "Teth",
|
||||||
|
"transliteration": "T",
|
||||||
|
"numerology": 9,
|
||||||
|
"meaning": "serpent",
|
||||||
|
"letterType": "simple",
|
||||||
|
"astrology": { "type": "zodiac", "name": "Leo" },
|
||||||
|
"kabbalahPathNumber": 19,
|
||||||
|
"tarot": { "card": "Strength", "trumpNumber": 8 },
|
||||||
|
"greekEquivalent": "theta"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 10,
|
||||||
|
"hebrewLetterId": "yod",
|
||||||
|
"char": "י",
|
||||||
|
"name": "Yod",
|
||||||
|
"transliteration": "I",
|
||||||
|
"numerology": 10,
|
||||||
|
"meaning": "hand",
|
||||||
|
"letterType": "simple",
|
||||||
|
"astrology": { "type": "zodiac", "name": "Virgo" },
|
||||||
|
"kabbalahPathNumber": 20,
|
||||||
|
"tarot": { "card": "The Hermit", "trumpNumber": 9 },
|
||||||
|
"greekEquivalent": "iota"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 11,
|
||||||
|
"hebrewLetterId": "kaf",
|
||||||
|
"char": "כ",
|
||||||
|
"name": "Kaph",
|
||||||
|
"transliteration": "K",
|
||||||
|
"numerology": 20,
|
||||||
|
"meaning": "palm of hand",
|
||||||
|
"letterType": "double",
|
||||||
|
"astrology": { "type": "planet", "name": "Jupiter" },
|
||||||
|
"kabbalahPathNumber": 21,
|
||||||
|
"tarot": { "card": "Wheel of Fortune", "trumpNumber": 10 },
|
||||||
|
"greekEquivalent": "kappa"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 12,
|
||||||
|
"hebrewLetterId": "lamed",
|
||||||
|
"char": "ל",
|
||||||
|
"name": "Lamed",
|
||||||
|
"transliteration": "L",
|
||||||
|
"numerology": 30,
|
||||||
|
"meaning": "ox-goad",
|
||||||
|
"letterType": "simple",
|
||||||
|
"astrology": { "type": "zodiac", "name": "Libra" },
|
||||||
|
"kabbalahPathNumber": 22,
|
||||||
|
"tarot": { "card": "Justice", "trumpNumber": 11 },
|
||||||
|
"greekEquivalent": "lambda"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 13,
|
||||||
|
"hebrewLetterId": "mem",
|
||||||
|
"char": "מ",
|
||||||
|
"name": "Mem",
|
||||||
|
"transliteration": "M",
|
||||||
|
"numerology": 40,
|
||||||
|
"meaning": "water",
|
||||||
|
"letterType": "mother",
|
||||||
|
"astrology": { "type": "element", "name": "Water" },
|
||||||
|
"kabbalahPathNumber": 23,
|
||||||
|
"tarot": { "card": "The Hanged Man", "trumpNumber": 12 },
|
||||||
|
"greekEquivalent": "mu"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 14,
|
||||||
|
"hebrewLetterId": "nun",
|
||||||
|
"char": "נ",
|
||||||
|
"name": "Nun",
|
||||||
|
"transliteration": "N",
|
||||||
|
"numerology": 50,
|
||||||
|
"meaning": "fish",
|
||||||
|
"letterType": "simple",
|
||||||
|
"astrology": { "type": "zodiac", "name": "Scorpio" },
|
||||||
|
"kabbalahPathNumber": 24,
|
||||||
|
"tarot": { "card": "Death", "trumpNumber": 13 },
|
||||||
|
"greekEquivalent": "nu"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 15,
|
||||||
|
"hebrewLetterId": "samekh",
|
||||||
|
"char": "ס",
|
||||||
|
"name": "Samekh",
|
||||||
|
"transliteration": "S",
|
||||||
|
"numerology": 60,
|
||||||
|
"meaning": "prop, support",
|
||||||
|
"letterType": "simple",
|
||||||
|
"astrology": { "type": "zodiac", "name": "Sagittarius" },
|
||||||
|
"kabbalahPathNumber": 25,
|
||||||
|
"tarot": { "card": "Temperance", "trumpNumber": 14 },
|
||||||
|
"greekEquivalent": "xi"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 16,
|
||||||
|
"hebrewLetterId": "ayin",
|
||||||
|
"char": "ע",
|
||||||
|
"name": "Ayin",
|
||||||
|
"transliteration": "O",
|
||||||
|
"numerology": 70,
|
||||||
|
"meaning": "eye",
|
||||||
|
"letterType": "simple",
|
||||||
|
"astrology": { "type": "zodiac", "name": "Capricorn" },
|
||||||
|
"kabbalahPathNumber": 26,
|
||||||
|
"tarot": { "card": "The Devil", "trumpNumber": 15 },
|
||||||
|
"greekEquivalent": "omicron"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 17,
|
||||||
|
"hebrewLetterId": "pe",
|
||||||
|
"char": "פ",
|
||||||
|
"name": "Pe",
|
||||||
|
"transliteration": "P",
|
||||||
|
"numerology": 80,
|
||||||
|
"meaning": "mouth",
|
||||||
|
"letterType": "double",
|
||||||
|
"astrology": { "type": "planet", "name": "Mars" },
|
||||||
|
"kabbalahPathNumber": 27,
|
||||||
|
"tarot": { "card": "The Tower", "trumpNumber": 16 },
|
||||||
|
"greekEquivalent": "pi"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 18,
|
||||||
|
"hebrewLetterId": "tsadi",
|
||||||
|
"char": "צ",
|
||||||
|
"name": "Tzaddi",
|
||||||
|
"transliteration": "Tz",
|
||||||
|
"numerology": 90,
|
||||||
|
"meaning": "fishhook",
|
||||||
|
"letterType": "simple",
|
||||||
|
"astrology": { "type": "zodiac", "name": "Aquarius" },
|
||||||
|
"kabbalahPathNumber": 28,
|
||||||
|
"tarot": { "card": "The Star", "trumpNumber": 17 },
|
||||||
|
"greekEquivalent": "qoppa"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 19,
|
||||||
|
"hebrewLetterId": "qof",
|
||||||
|
"char": "ק",
|
||||||
|
"name": "Qoph",
|
||||||
|
"transliteration": "Q",
|
||||||
|
"numerology": 100,
|
||||||
|
"meaning": "back of the head",
|
||||||
|
"letterType": "simple",
|
||||||
|
"astrology": { "type": "zodiac", "name": "Pisces" },
|
||||||
|
"kabbalahPathNumber": 29,
|
||||||
|
"tarot": { "card": "The Moon", "trumpNumber": 18 }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 20,
|
||||||
|
"hebrewLetterId": "resh",
|
||||||
|
"char": "ר",
|
||||||
|
"name": "Resh",
|
||||||
|
"transliteration": "R",
|
||||||
|
"numerology": 200,
|
||||||
|
"meaning": "head",
|
||||||
|
"letterType": "double",
|
||||||
|
"astrology": { "type": "planet", "name": "Sol" },
|
||||||
|
"kabbalahPathNumber": 30,
|
||||||
|
"tarot": { "card": "The Sun", "trumpNumber": 19 },
|
||||||
|
"greekEquivalent": "rho"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 21,
|
||||||
|
"hebrewLetterId": "shin",
|
||||||
|
"char": "ש",
|
||||||
|
"name": "Shin",
|
||||||
|
"transliteration": "Sh",
|
||||||
|
"numerology": 300,
|
||||||
|
"meaning": "tooth",
|
||||||
|
"letterType": "mother",
|
||||||
|
"astrology": { "type": "element", "name": "Fire" },
|
||||||
|
"kabbalahPathNumber": 31,
|
||||||
|
"tarot": { "card": "Judgement", "trumpNumber": 20 },
|
||||||
|
"greekEquivalent": "sigma"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 22,
|
||||||
|
"hebrewLetterId": "tav",
|
||||||
|
"char": "ת",
|
||||||
|
"name": "Tav",
|
||||||
|
"transliteration": "Th",
|
||||||
|
"numerology": 400,
|
||||||
|
"meaning": "cross, mark",
|
||||||
|
"letterType": "double",
|
||||||
|
"astrology": { "type": "planet", "name": "Saturn" },
|
||||||
|
"kabbalahPathNumber": 32,
|
||||||
|
"tarot": { "card": "The Universe", "trumpNumber": 21 },
|
||||||
|
"greekEquivalent": "tau"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"greek": [
|
||||||
|
{
|
||||||
|
"name": "alpha",
|
||||||
|
"index": 1,
|
||||||
|
"char": "Α",
|
||||||
|
"charLower": "α",
|
||||||
|
"displayName": "Alpha",
|
||||||
|
"transliteration": "A",
|
||||||
|
"ipa": "/a/, /aː/",
|
||||||
|
"numerology": 1,
|
||||||
|
"meaning": "ox (from Phoenician aleph)",
|
||||||
|
"hebrewLetterId": "alef",
|
||||||
|
"archaic": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "beta",
|
||||||
|
"index": 2,
|
||||||
|
"char": "Β",
|
||||||
|
"charLower": "β",
|
||||||
|
"displayName": "Beta",
|
||||||
|
"transliteration": "B",
|
||||||
|
"ipa": "/b/",
|
||||||
|
"numerology": 2,
|
||||||
|
"meaning": "house (from Phoenician beth)",
|
||||||
|
"hebrewLetterId": "bet",
|
||||||
|
"archaic": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "gamma",
|
||||||
|
"index": 3,
|
||||||
|
"char": "Γ",
|
||||||
|
"charLower": "γ",
|
||||||
|
"displayName": "Gamma",
|
||||||
|
"transliteration": "G",
|
||||||
|
"ipa": "/ɡ/",
|
||||||
|
"numerology": 3,
|
||||||
|
"meaning": "camel (from Phoenician gimel)",
|
||||||
|
"hebrewLetterId": "gimel",
|
||||||
|
"archaic": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "delta",
|
||||||
|
"index": 4,
|
||||||
|
"char": "Δ",
|
||||||
|
"charLower": "δ",
|
||||||
|
"displayName": "Delta",
|
||||||
|
"transliteration": "D",
|
||||||
|
"ipa": "/d/",
|
||||||
|
"numerology": 4,
|
||||||
|
"meaning": "door (from Phoenician daleth)",
|
||||||
|
"hebrewLetterId": "dalet",
|
||||||
|
"archaic": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "epsilon",
|
||||||
|
"index": 5,
|
||||||
|
"char": "Ε",
|
||||||
|
"charLower": "ε",
|
||||||
|
"displayName": "Epsilon",
|
||||||
|
"transliteration": "E",
|
||||||
|
"ipa": "/e/",
|
||||||
|
"numerology": 5,
|
||||||
|
"meaning": "bare / simple e (adapted from Phoenician he)",
|
||||||
|
"hebrewLetterId": "he",
|
||||||
|
"archaic": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "digamma",
|
||||||
|
"index": 6,
|
||||||
|
"char": "Ϝ",
|
||||||
|
"charLower": "ϝ",
|
||||||
|
"displayName": "Digamma",
|
||||||
|
"transliteration": "W/V",
|
||||||
|
"ipa": "/w/",
|
||||||
|
"numerology": 6,
|
||||||
|
"meaning": "double-gamma; from Phoenician waw (same root as Hebrew Vav)",
|
||||||
|
"hebrewLetterId": "vav",
|
||||||
|
"archaic": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "zeta",
|
||||||
|
"index": 7,
|
||||||
|
"char": "Ζ",
|
||||||
|
"charLower": "ζ",
|
||||||
|
"displayName": "Zeta",
|
||||||
|
"transliteration": "Z",
|
||||||
|
"ipa": "/dz/ or /z/",
|
||||||
|
"numerology": 7,
|
||||||
|
"meaning": "weapon (from Phoenician zayin)",
|
||||||
|
"hebrewLetterId": "zayin",
|
||||||
|
"archaic": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "eta",
|
||||||
|
"index": 8,
|
||||||
|
"char": "Η",
|
||||||
|
"charLower": "η",
|
||||||
|
"displayName": "Eta",
|
||||||
|
"transliteration": "E / H",
|
||||||
|
"ipa": "/eː/",
|
||||||
|
"numerology": 8,
|
||||||
|
"meaning": "fence, enclosure (from Phoenician heth)",
|
||||||
|
"hebrewLetterId": "het",
|
||||||
|
"archaic": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "theta",
|
||||||
|
"index": 9,
|
||||||
|
"char": "Θ",
|
||||||
|
"charLower": "θ",
|
||||||
|
"displayName": "Theta",
|
||||||
|
"transliteration": "Th",
|
||||||
|
"ipa": "/tʰ/, /θ/",
|
||||||
|
"numerology": 9,
|
||||||
|
"meaning": "wheel; from Phoenician teth (serpent)",
|
||||||
|
"hebrewLetterId": "tet",
|
||||||
|
"archaic": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "iota",
|
||||||
|
"index": 10,
|
||||||
|
"char": "Ι",
|
||||||
|
"charLower": "ι",
|
||||||
|
"displayName": "Iota",
|
||||||
|
"transliteration": "I",
|
||||||
|
"ipa": "/i/, /iː/",
|
||||||
|
"numerology": 10,
|
||||||
|
"meaning": "hand (from Phoenician yod)",
|
||||||
|
"hebrewLetterId": "yod",
|
||||||
|
"archaic": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "kappa",
|
||||||
|
"index": 11,
|
||||||
|
"char": "Κ",
|
||||||
|
"charLower": "κ",
|
||||||
|
"displayName": "Kappa",
|
||||||
|
"transliteration": "K",
|
||||||
|
"ipa": "/k/",
|
||||||
|
"numerology": 20,
|
||||||
|
"meaning": "palm of hand (from Phoenician kaph)",
|
||||||
|
"hebrewLetterId": "kaf",
|
||||||
|
"archaic": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "lambda",
|
||||||
|
"index": 12,
|
||||||
|
"char": "Λ",
|
||||||
|
"charLower": "λ",
|
||||||
|
"displayName": "Lambda",
|
||||||
|
"transliteration": "L",
|
||||||
|
"ipa": "/l/",
|
||||||
|
"numerology": 30,
|
||||||
|
"meaning": "ox-goad (from Phoenician lamed)",
|
||||||
|
"hebrewLetterId": "lamed",
|
||||||
|
"archaic": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mu",
|
||||||
|
"index": 13,
|
||||||
|
"char": "Μ",
|
||||||
|
"charLower": "μ",
|
||||||
|
"displayName": "Mu",
|
||||||
|
"transliteration": "M",
|
||||||
|
"ipa": "/m/",
|
||||||
|
"numerology": 40,
|
||||||
|
"meaning": "water (from Phoenician mem)",
|
||||||
|
"hebrewLetterId": "mem",
|
||||||
|
"archaic": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "nu",
|
||||||
|
"index": 14,
|
||||||
|
"char": "Ν",
|
||||||
|
"charLower": "ν",
|
||||||
|
"displayName": "Nu",
|
||||||
|
"transliteration": "N",
|
||||||
|
"ipa": "/n/",
|
||||||
|
"numerology": 50,
|
||||||
|
"meaning": "fish (from Phoenician nun)",
|
||||||
|
"hebrewLetterId": "nun",
|
||||||
|
"archaic": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "xi",
|
||||||
|
"index": 15,
|
||||||
|
"char": "Ξ",
|
||||||
|
"charLower": "ξ",
|
||||||
|
"displayName": "Xi",
|
||||||
|
"transliteration": "X",
|
||||||
|
"ipa": "/ks/",
|
||||||
|
"numerology": 60,
|
||||||
|
"meaning": "prop/support (from Phoenician samekh)",
|
||||||
|
"hebrewLetterId": "samekh",
|
||||||
|
"archaic": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "omicron",
|
||||||
|
"index": 16,
|
||||||
|
"char": "Ο",
|
||||||
|
"charLower": "ο",
|
||||||
|
"displayName": "Omicron",
|
||||||
|
"transliteration": "O",
|
||||||
|
"ipa": "/o/",
|
||||||
|
"numerology": 70,
|
||||||
|
"meaning": "small o; eye (from Phoenician ayin)",
|
||||||
|
"hebrewLetterId": "ayin",
|
||||||
|
"archaic": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "pi",
|
||||||
|
"index": 17,
|
||||||
|
"char": "Π",
|
||||||
|
"charLower": "π",
|
||||||
|
"displayName": "Pi",
|
||||||
|
"transliteration": "P",
|
||||||
|
"ipa": "/p/",
|
||||||
|
"numerology": 80,
|
||||||
|
"meaning": "mouth (from Phoenician pe)",
|
||||||
|
"hebrewLetterId": "pe",
|
||||||
|
"archaic": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "qoppa",
|
||||||
|
"index": 18,
|
||||||
|
"char": "Ϟ",
|
||||||
|
"charLower": "ϟ",
|
||||||
|
"displayName": "Qoppa",
|
||||||
|
"transliteration": "Q",
|
||||||
|
"ipa": "/kʷ/",
|
||||||
|
"numerology": 90,
|
||||||
|
"meaning": "back of head (from Phoenician qoph)",
|
||||||
|
"hebrewLetterId": "qof",
|
||||||
|
"archaic": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "rho",
|
||||||
|
"index": 19,
|
||||||
|
"char": "Ρ",
|
||||||
|
"charLower": "ρ",
|
||||||
|
"displayName": "Rho",
|
||||||
|
"transliteration": "R",
|
||||||
|
"ipa": "/r/",
|
||||||
|
"numerology": 100,
|
||||||
|
"meaning": "head (from Phoenician resh)",
|
||||||
|
"hebrewLetterId": "resh",
|
||||||
|
"archaic": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "sigma",
|
||||||
|
"index": 20,
|
||||||
|
"char": "Σ",
|
||||||
|
"charLower": "σ",
|
||||||
|
"charFinal": "ς",
|
||||||
|
"displayName": "Sigma",
|
||||||
|
"transliteration": "S",
|
||||||
|
"ipa": "/s/",
|
||||||
|
"numerology": 200,
|
||||||
|
"meaning": "tooth (from Phoenician shin)",
|
||||||
|
"hebrewLetterId": "shin",
|
||||||
|
"archaic": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "tau",
|
||||||
|
"index": 21,
|
||||||
|
"char": "Τ",
|
||||||
|
"charLower": "τ",
|
||||||
|
"displayName": "Tau",
|
||||||
|
"transliteration": "T",
|
||||||
|
"ipa": "/t/",
|
||||||
|
"numerology": 300,
|
||||||
|
"meaning": "cross, mark (from Phoenician tav)",
|
||||||
|
"hebrewLetterId": "tav",
|
||||||
|
"archaic": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "upsilon",
|
||||||
|
"index": 22,
|
||||||
|
"char": "Υ",
|
||||||
|
"charLower": "υ",
|
||||||
|
"displayName": "Upsilon",
|
||||||
|
"transliteration": "U/Y",
|
||||||
|
"ipa": "/y/, /u/",
|
||||||
|
"numerology": 400,
|
||||||
|
"meaning": "simple upsilon; from Phoenician waw (also root of Vav, W, U, V, F)",
|
||||||
|
"hebrewLetterId": "vav",
|
||||||
|
"archaic": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "phi",
|
||||||
|
"index": 23,
|
||||||
|
"char": "Φ",
|
||||||
|
"charLower": "φ",
|
||||||
|
"displayName": "Phi",
|
||||||
|
"transliteration": "Ph/F",
|
||||||
|
"ipa": "/pʰ/, /f/",
|
||||||
|
"numerology": 500,
|
||||||
|
"meaning": "light; late Phoenician pe secondary derivative",
|
||||||
|
"archaic": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "chi",
|
||||||
|
"index": 24,
|
||||||
|
"char": "Χ",
|
||||||
|
"charLower": "χ",
|
||||||
|
"displayName": "Chi",
|
||||||
|
"transliteration": "Ch/Kh",
|
||||||
|
"ipa": "/kʰ/, /x/",
|
||||||
|
"numerology": 600,
|
||||||
|
"meaning": "cross-variant; possible relation to Phoenician heth or teth",
|
||||||
|
"archaic": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "psi",
|
||||||
|
"index": 25,
|
||||||
|
"char": "Ψ",
|
||||||
|
"charLower": "ψ",
|
||||||
|
"displayName": "Psi",
|
||||||
|
"transliteration": "Ps",
|
||||||
|
"ipa": "/ps/",
|
||||||
|
"numerology": 700,
|
||||||
|
"meaning": "soul, trident; some scholars link to Phoenician tsade",
|
||||||
|
"hebrewLetterId": "tsadi",
|
||||||
|
"archaic": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "omega",
|
||||||
|
"index": 26,
|
||||||
|
"char": "Ω",
|
||||||
|
"charLower": "ω",
|
||||||
|
"displayName": "Omega",
|
||||||
|
"transliteration": "O",
|
||||||
|
"ipa": "/oː/",
|
||||||
|
"numerology": 800,
|
||||||
|
"meaning": "great o; from ayin (eye) family, contrasted with omicron",
|
||||||
|
"hebrewLetterId": "ayin",
|
||||||
|
"archaic": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "sampi",
|
||||||
|
"index": 27,
|
||||||
|
"char": "Ϡ",
|
||||||
|
"charLower": "ϡ",
|
||||||
|
"displayName": "Sampi",
|
||||||
|
"transliteration": "Ss/Ts",
|
||||||
|
"ipa": "/ss/ or /ts/",
|
||||||
|
"numerology": 900,
|
||||||
|
"meaning": "like pi (variant); Phoenician tsade origin",
|
||||||
|
"hebrewLetterId": "tsadi",
|
||||||
|
"archaic": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"english": [
|
||||||
|
{ "index": 1, "letter": "A", "ipa": "/eɪ/", "pythagorean": 1, "hebrewLetterId": "alef", "greekEquivalent": "alpha" },
|
||||||
|
{ "index": 2, "letter": "B", "ipa": "/biː/", "pythagorean": 2, "hebrewLetterId": "bet", "greekEquivalent": "beta" },
|
||||||
|
{ "index": 3, "letter": "C", "ipa": "/siː/", "pythagorean": 3, "hebrewLetterId": "gimel", "greekEquivalent": "gamma" },
|
||||||
|
{ "index": 4, "letter": "D", "ipa": "/diː/", "pythagorean": 4, "hebrewLetterId": "dalet", "greekEquivalent": "delta" },
|
||||||
|
{ "index": 5, "letter": "E", "ipa": "/iː/", "pythagorean": 5, "hebrewLetterId": "he", "greekEquivalent": "epsilon" },
|
||||||
|
{ "index": 6, "letter": "F", "ipa": "/ɛf/", "pythagorean": 6, "hebrewLetterId": "vav", "greekEquivalent": "digamma" },
|
||||||
|
{ "index": 7, "letter": "G", "ipa": "/dʒiː/","pythagorean": 7, "hebrewLetterId": "gimel", "greekEquivalent": "gamma" },
|
||||||
|
{ "index": 8, "letter": "H", "ipa": "/eɪtʃ/","pythagorean": 8, "hebrewLetterId": "he", "greekEquivalent": "eta" },
|
||||||
|
{ "index": 9, "letter": "I", "ipa": "/aɪ/", "pythagorean": 9, "hebrewLetterId": "yod", "greekEquivalent": "iota" },
|
||||||
|
{ "index": 10, "letter": "J", "ipa": "/dʒeɪ/","pythagorean": 1, "hebrewLetterId": "yod", "greekEquivalent": "iota" },
|
||||||
|
{ "index": 11, "letter": "K", "ipa": "/keɪ/", "pythagorean": 2, "hebrewLetterId": "kaf", "greekEquivalent": "kappa" },
|
||||||
|
{ "index": 12, "letter": "L", "ipa": "/ɛl/", "pythagorean": 3, "hebrewLetterId": "lamed", "greekEquivalent": "lambda" },
|
||||||
|
{ "index": 13, "letter": "M", "ipa": "/ɛm/", "pythagorean": 4, "hebrewLetterId": "mem", "greekEquivalent": "mu" },
|
||||||
|
{ "index": 14, "letter": "N", "ipa": "/ɛn/", "pythagorean": 5, "hebrewLetterId": "nun", "greekEquivalent": "nu" },
|
||||||
|
{ "index": 15, "letter": "O", "ipa": "/oʊ/", "pythagorean": 6, "hebrewLetterId": "ayin", "greekEquivalent": "omicron" },
|
||||||
|
{ "index": 16, "letter": "P", "ipa": "/piː/", "pythagorean": 7, "hebrewLetterId": "pe", "greekEquivalent": "pi" },
|
||||||
|
{ "index": 17, "letter": "Q", "ipa": "/kjuː/","pythagorean": 8, "hebrewLetterId": "qof", "greekEquivalent": "qoppa" },
|
||||||
|
{ "index": 18, "letter": "R", "ipa": "/ɑːr/", "pythagorean": 9, "hebrewLetterId": "resh", "greekEquivalent": "rho" },
|
||||||
|
{ "index": 19, "letter": "S", "ipa": "/ɛs/", "pythagorean": 1, "hebrewLetterId": "samekh", "greekEquivalent": "sigma" },
|
||||||
|
{ "index": 20, "letter": "T", "ipa": "/tiː/", "pythagorean": 2, "hebrewLetterId": "tav", "greekEquivalent": "tau" },
|
||||||
|
{ "index": 21, "letter": "U", "ipa": "/juː/", "pythagorean": 3, "hebrewLetterId": "vav", "greekEquivalent": "upsilon" },
|
||||||
|
{ "index": 22, "letter": "V", "ipa": "/viː/", "pythagorean": 4, "hebrewLetterId": "vav", "greekEquivalent": "upsilon" },
|
||||||
|
{ "index": 23, "letter": "W", "ipa": "/ˈdʌbljuː/", "pythagorean": 5, "hebrewLetterId": "vav", "greekEquivalent": "digamma" },
|
||||||
|
{ "index": 24, "letter": "X", "ipa": "/ɛks/", "pythagorean": 6, "hebrewLetterId": "samekh", "greekEquivalent": "xi" },
|
||||||
|
{ "index": 25, "letter": "Y", "ipa": "/waɪ/", "pythagorean": 7, "hebrewLetterId": "yod", "greekEquivalent": "upsilon" },
|
||||||
|
{ "index": 26, "letter": "Z", "ipa": "/zɛd/", "pythagorean": 8, "hebrewLetterId": "zayin", "greekEquivalent": "zeta" }
|
||||||
|
],
|
||||||
|
"arabic": [
|
||||||
|
{ "index": 1, "name": "alif", "char": "ا", "nameArabic": "أَلِف", "transliteration": "ā / ʾ", "ipa": "/ʔ/, /aː/", "abjad": 1, "meaning": "ox; breath; onset", "category": "solar", "hebrewLetterId": "alef", "forms": { "isolated": "ا", "final": "ـا" } },
|
||||||
|
{ "index": 2, "name": "ba", "char": "ب", "nameArabic": "بَاء", "transliteration": "b", "ipa": "/b/", "abjad": 2, "meaning": "house", "category": "lunar", "hebrewLetterId": "bet", "forms": { "isolated": "ب", "initial": "بـ", "medial": "ـبـ", "final": "ـب" } },
|
||||||
|
{ "index": 3, "name": "jeem", "char": "ج", "nameArabic": "جِيم", "transliteration": "j", "ipa": "/d͡ʒ/", "abjad": 3, "meaning": "camel; beauty", "category": "lunar", "hebrewLetterId": "gimel", "forms": { "isolated": "ج", "initial": "جـ", "medial": "ـجـ", "final": "ـج" } },
|
||||||
|
{ "index": 4, "name": "dal", "char": "د", "nameArabic": "دَال", "transliteration": "d", "ipa": "/d/", "abjad": 4, "meaning": "door", "category": "solar", "hebrewLetterId": "dalet", "forms": { "isolated": "د", "final": "ـد" } },
|
||||||
|
{ "index": 5, "name": "ha", "char": "ه", "nameArabic": "هَاء", "transliteration": "h", "ipa": "/h/", "abjad": 5, "meaning": "window; breath; exclamation", "category": "lunar", "hebrewLetterId": "he", "forms": { "isolated": "ه", "initial": "هـ", "medial": "ـهـ", "final": "ـه" } },
|
||||||
|
{ "index": 6, "name": "waw", "char": "و", "nameArabic": "وَاو", "transliteration": "w / ū", "ipa": "/w/, /uː/", "abjad": 6, "meaning": "hook; peg; and", "category": "solar", "hebrewLetterId": "vav", "forms": { "isolated": "و", "final": "ـو" } },
|
||||||
|
{ "index": 7, "name": "zayn", "char": "ز", "nameArabic": "زَاي", "transliteration": "z", "ipa": "/z/", "abjad": 7, "meaning": "adornment; weapon", "category": "solar", "hebrewLetterId": "zayin", "forms": { "isolated": "ز", "final": "ـز" } },
|
||||||
|
{ "index": 8, "name": "ha_khaa", "char": "ح", "nameArabic": "حَاء", "transliteration": "ḥ", "ipa": "/ħ/", "abjad": 8, "meaning": "fence; enclosed courtyard; breath","category": "lunar", "hebrewLetterId": "het", "forms": { "isolated": "ح", "initial": "حـ", "medial": "ـحـ", "final": "ـح" } },
|
||||||
|
{ "index": 9, "name": "ta_tay", "char": "ط", "nameArabic": "طَاء", "transliteration": "ṭ", "ipa": "/tˤ/", "abjad": 9, "meaning": "serpent; goodness", "category": "solar", "hebrewLetterId": "tet", "forms": { "isolated": "ط", "initial": "طـ", "medial": "ـطـ", "final": "ـط" } },
|
||||||
|
{ "index": 10, "name": "ya", "char": "ي", "nameArabic": "يَاء", "transliteration": "y / ī", "ipa": "/j/, /iː/", "abjad": 10, "meaning": "hand", "category": "solar", "hebrewLetterId": "yod", "forms": { "isolated": "ي", "initial": "يـ", "medial": "ـيـ", "final": "ـي" } },
|
||||||
|
{ "index": 11, "name": "kaf", "char": "ك", "nameArabic": "كَاف", "transliteration": "k", "ipa": "/k/", "abjad": 20, "meaning": "palm of hand; like", "category": "solar", "hebrewLetterId": "kaf", "forms": { "isolated": "ك", "initial": "كـ", "medial": "ـكـ", "final": "ـك" } },
|
||||||
|
{ "index": 12, "name": "lam", "char": "ل", "nameArabic": "لَام", "transliteration": "l", "ipa": "/l/", "abjad": 30, "meaning": "ox-goad; for/to", "category": "solar", "hebrewLetterId": "lamed", "forms": { "isolated": "ل", "initial": "لـ", "medial": "ـلـ", "final": "ـل" } },
|
||||||
|
{ "index": 13, "name": "meem", "char": "م", "nameArabic": "مِيم", "transliteration": "m", "ipa": "/m/", "abjad": 40, "meaning": "water", "category": "lunar", "hebrewLetterId": "mem", "forms": { "isolated": "م", "initial": "مـ", "medial": "ـمـ", "final": "ـم" } },
|
||||||
|
{ "index": 14, "name": "nun", "char": "ن", "nameArabic": "نُون", "transliteration": "n", "ipa": "/n/", "abjad": 50, "meaning": "fish; inkwell", "category": "solar", "hebrewLetterId": "nun", "forms": { "isolated": "ن", "initial": "نـ", "medial": "ـنـ", "final": "ـن" } },
|
||||||
|
{ "index": 15, "name": "seen", "char": "س", "nameArabic": "سِين", "transliteration": "s", "ipa": "/s/", "abjad": 60, "meaning": "tooth; prop; support", "category": "solar", "hebrewLetterId": "samekh", "forms": { "isolated": "س", "initial": "سـ", "medial": "ـسـ", "final": "ـس" } },
|
||||||
|
{ "index": 16, "name": "ayn", "char": "ع", "nameArabic": "عَيْن", "transliteration": "ʿ", "ipa": "/ʕ/", "abjad": 70, "meaning": "eye; spring of water", "category": "lunar", "hebrewLetterId": "ayin", "forms": { "isolated": "ع", "initial": "عـ", "medial": "ـعـ", "final": "ـع" } },
|
||||||
|
{ "index": 17, "name": "fa", "char": "ف", "nameArabic": "فَاء", "transliteration": "f", "ipa": "/f/", "abjad": 80, "meaning": "mouth", "category": "lunar", "hebrewLetterId": "pe", "forms": { "isolated": "ف", "initial": "فـ", "medial": "ـفـ", "final": "ـف" } },
|
||||||
|
{ "index": 18, "name": "sad", "char": "ص", "nameArabic": "صَاد", "transliteration": "ṣ", "ipa": "/sˤ/", "abjad": 90, "meaning": "twisted; fishhook", "category": "solar", "hebrewLetterId": "tsadi", "forms": { "isolated": "ص", "initial": "صـ", "medial": "ـصـ", "final": "ـص" } },
|
||||||
|
{ "index": 19, "name": "qaf", "char": "ق", "nameArabic": "قَاف", "transliteration": "q", "ipa": "/q/", "abjad": 100, "meaning": "back of neck; ape", "category": "lunar", "hebrewLetterId": "qof", "forms": { "isolated": "ق", "initial": "قـ", "medial": "ـقـ", "final": "ـق" } },
|
||||||
|
{ "index": 20, "name": "ra", "char": "ر", "nameArabic": "رَاء", "transliteration": "r", "ipa": "/r/", "abjad": 200, "meaning": "head", "category": "solar", "hebrewLetterId": "resh", "forms": { "isolated": "ر", "final": "ـر" } },
|
||||||
|
{ "index": 21, "name": "sheen", "char": "ش", "nameArabic": "شِين", "transliteration": "sh", "ipa": "/ʃ/", "abjad": 300, "meaning": "tooth; composite; sun", "category": "solar", "hebrewLetterId": "shin", "forms": { "isolated": "ش", "initial": "شـ", "medial": "ـشـ", "final": "ـش" } },
|
||||||
|
{ "index": 22, "name": "ta", "char": "ت", "nameArabic": "تَاء", "transliteration": "t", "ipa": "/t/", "abjad": 400, "meaning": "mark; sign; covenant", "category": "solar", "hebrewLetterId": "tav", "forms": { "isolated": "ت", "initial": "تـ", "medial": "ـتـ", "final": "ـت" } },
|
||||||
|
{ "index": 23, "name": "tha", "char": "ث", "nameArabic": "ثَاء", "transliteration": "th", "ipa": "/θ/", "abjad": 500, "meaning": "thorny; fixed", "category": "solar", "hebrewLetterId": null, "forms": { "isolated": "ث", "initial": "ثـ", "medial": "ـثـ", "final": "ـث" } },
|
||||||
|
{ "index": 24, "name": "kha", "char": "خ", "nameArabic": "خَاء", "transliteration": "kh", "ipa": "/x/", "abjad": 600, "meaning": "penetrating; veiled", "category": "lunar", "hebrewLetterId": null, "forms": { "isolated": "خ", "initial": "خـ", "medial": "ـخـ", "final": "ـخ" } },
|
||||||
|
{ "index": 25, "name": "dhal", "char": "ذ", "nameArabic": "ذَال", "transliteration": "dh", "ipa": "/ð/", "abjad": 700, "meaning": "this; possessor of", "category": "solar", "hebrewLetterId": null, "forms": { "isolated": "ذ", "final": "ـذ" } },
|
||||||
|
{ "index": 26, "name": "dad", "char": "ض", "nameArabic": "ضَاد", "transliteration": "ḍ", "ipa": "/dˤ/", "abjad": 800, "meaning": "ribs; darkness; unique letter", "category": "solar", "hebrewLetterId": null, "forms": { "isolated": "ض", "initial": "ضـ", "medial": "ـضـ", "final": "ـض" } },
|
||||||
|
{ "index": 27, "name": "dha", "char": "ظ", "nameArabic": "ظَاء", "transliteration": "ẓ", "ipa": "/ðˤ/", "abjad": 900, "meaning": "shadow; manifest; back", "category": "solar", "hebrewLetterId": null, "forms": { "isolated": "ظ", "initial": "ظـ", "medial": "ـظـ", "final": "ـظ" } },
|
||||||
|
{ "index": 28, "name": "ghayn", "char": "غ", "nameArabic": "غَيْن", "transliteration": "gh", "ipa": "/ɣ/", "abjad": 1000, "meaning": "absence; obscured eye; rain", "category": "lunar", "hebrewLetterId": null, "forms": { "isolated": "غ", "initial": "غـ", "medial": "ـغـ", "final": "ـغ" } }
|
||||||
|
],
|
||||||
|
"enochian": [
|
||||||
|
{ "index": 1, "id": "A", "char": "A", "title": "Un", "englishLetters": ["A"], "transliteration": "ah", "elementOrPlanet": "taurus", "tarot": "hierophant", "numerology": 6, "hebrewLetterId": "alef" },
|
||||||
|
{ "index": 2, "id": "B", "char": "B", "title": "Pe", "englishLetters": ["B"], "transliteration": "beh", "elementOrPlanet": "aries", "tarot": "star", "numerology": 5, "hebrewLetterId": "bet" },
|
||||||
|
{ "index": 3, "id": "C", "char": "C", "title": "Veh", "englishLetters": ["C", "K"], "transliteration": "co", "elementOrPlanet": "fire", "tarot": "judgement", "numerology": 300, "hebrewLetterId": null },
|
||||||
|
{ "index": 4, "id": "D", "char": "D", "title": "Gal", "englishLetters": ["D"], "transliteration": "deh", "elementOrPlanet": "spirit", "tarot": "empress", "numerology": 4, "hebrewLetterId": "dalet" },
|
||||||
|
{ "index": 5, "id": "E", "char": "E", "title": "Graph", "englishLetters": ["E"], "transliteration": "ee", "elementOrPlanet": "virgo", "tarot": "hermit", "numerology": 10, "hebrewLetterId": "he" },
|
||||||
|
{ "index": 6, "id": "F", "char": "F", "title": "Orth", "englishLetters": ["F"], "transliteration": "eff", "elementOrPlanet": "Cauda Draonis", "tarot": "juggler", "numerology": 3, "hebrewLetterId": "vav" },
|
||||||
|
{ "index": 7, "id": "G", "char": "G", "title": "Ged", "englishLetters": ["G"], "transliteration": "gee", "elementOrPlanet": "cancer", "tarot": "chariot", "numerology": 8, "hebrewLetterId": "gimel" },
|
||||||
|
{ "index": 8, "id": "H", "char": "H", "title": "Na-hath", "englishLetters": ["H"], "transliteration": "heh", "elementOrPlanet": "air", "tarot": "fool", "numerology": 1, "hebrewLetterId": "he" },
|
||||||
|
{ "index": 9, "id": "I", "char": "I", "title": "Gon", "englishLetters": ["I", "Y", "J"], "transliteration": "ee", "elementOrPlanet": "sagittarius", "tarot": "temperance", "numerology": 60, "hebrewLetterId": "yod" },
|
||||||
|
{ "index": 10, "id": "L", "char": "L", "title": "Ur", "englishLetters": ["L"], "transliteration": "el, leh", "elementOrPlanet": "cancer", "tarot": "charit", "numerology": 8, "hebrewLetterId": "lamed" },
|
||||||
|
{ "index": 11, "id": "M", "char": "M", "title": "Tal", "englishLetters": ["M"], "transliteration": "em", "elementOrPlanet": "aquarius", "tarot": "emperor", "numerology": 90, "hebrewLetterId": "mem" },
|
||||||
|
{ "index": 12, "id": "N", "char": "N", "title": "Drun", "englishLetters": ["N"], "transliteration": "en", "elementOrPlanet": "scorpio", "tarot": "death", "numerology": 50, "hebrewLetterId": "nun" },
|
||||||
|
{ "index": 13, "id": "O", "char": "O", "title": "Med", "englishLetters": ["O"], "transliteration": "oh", "elementOrPlanet": "libra", "tarot": "justice", "numerology": 30, "hebrewLetterId": "ayin" },
|
||||||
|
{ "index": 14, "id": "P", "char": "P", "title": "Mals", "englishLetters": ["P"], "transliteration": "peh", "elementOrPlanet": "leo", "tarot": "strength", "numerology": 9, "hebrewLetterId": "pe" },
|
||||||
|
{ "index": 15, "id": "Q", "char": "Q", "title": "Ger", "englishLetters": ["Q"], "transliteration": "quo", "elementOrPlanet": "water", "tarot": "hanged man", "numerology": 40, "hebrewLetterId": "qof" },
|
||||||
|
{ "index": 16, "id": "R", "char": "R", "title": "Don", "englishLetters": ["R"], "transliteration": "reh, ar", "elementOrPlanet": "pesces", "tarot": "moon", "numerology": 100, "hebrewLetterId": "resh" },
|
||||||
|
{ "index": 17, "id": "S", "char": "S", "title": "Fam", "englishLetters": ["S"], "transliteration": "she, ess", "elementOrPlanet": "gemini", "tarot": "lovers", "numerology": 7, "hebrewLetterId": "samekh" },
|
||||||
|
{ "index": 18, "id": "T", "char": "T", "title": "Gisa", "englishLetters": ["T"], "transliteration": "teh", "elementOrPlanet": "leo", "tarot": "strength", "numerology": 9, "hebrewLetterId": "tav" },
|
||||||
|
{ "index": 19, "id": "V", "char": "V", "title": "Vau", "englishLetters": ["U", "V", "W"], "transliteration": "vaa", "elementOrPlanet": "capricorn", "tarot": "devil", "numerology": 70, "hebrewLetterId": "vav" },
|
||||||
|
{ "index": 20, "id": "X", "char": "X", "title": "Pal", "englishLetters": ["X"], "transliteration": "s, tz", "elementOrPlanet": "earth", "tarot": "universe", "numerology": 400, "hebrewLetterId": "samekh" },
|
||||||
|
{ "index": 21, "id": "Z", "char": "Z", "title": "Ceph", "englishLetters": ["Z"], "transliteration": "zod, zee", "elementOrPlanet": "leo", "tarot": "strength", "numerology": 9, "hebrewLetterId": "zayin" }
|
||||||
|
]
|
||||||
|
}
|
||||||
170
data/astrology/houses.json
Normal file
@@ -0,0 +1,170 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"index": 1,
|
||||||
|
"zodiacId": "aries",
|
||||||
|
"motto": {
|
||||||
|
"la": "Vita",
|
||||||
|
"en": "Life"
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"en": "House of Self"
|
||||||
|
},
|
||||||
|
"interpretation": {
|
||||||
|
"en": "Physical appearance, identity and characteristics. Resourcefulness. Outlook and impressions. Ego/personality. Goals. Determination. Beginnings and initiatives."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 2,
|
||||||
|
"zodiacId": "taurus",
|
||||||
|
"motto": {
|
||||||
|
"la": "Lucrum",
|
||||||
|
"en": "Gain"
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"en": "House of Value"
|
||||||
|
},
|
||||||
|
"interpretation": {
|
||||||
|
"en": "Material and immaterial things of certain value. Money. Possessions and acquisitions. Cultivation. Perseverance. Substance. Self-worth."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 3,
|
||||||
|
"zodiacId": "gemini",
|
||||||
|
"motto": {
|
||||||
|
"la": "Fratres",
|
||||||
|
"en": "Order"
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"en": "House of Sharing"
|
||||||
|
},
|
||||||
|
"interpretation": {
|
||||||
|
"en": "Communication. Distribution/generosity. Intelligence/development. Siblings, cousins. Locomotion and transportation. Ephemera."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 4,
|
||||||
|
"zodiacId": "cancer",
|
||||||
|
"motto": {
|
||||||
|
"la": "Genitor",
|
||||||
|
"en": "Parent"
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"en": "House of Home and Family"
|
||||||
|
},
|
||||||
|
"interpretation": {
|
||||||
|
"en": "Ancestry, heritage, roots. Foundation and environment. Mother or caretaker. Housing and the household. Neighborhood matters. Comfort, security/safety. Tidiness. Pets."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 5,
|
||||||
|
"zodiacId": "leo",
|
||||||
|
"motto": {
|
||||||
|
"la": "Nati",
|
||||||
|
"en": "Children"
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"en": "House of Pleasure"
|
||||||
|
},
|
||||||
|
"interpretation": {
|
||||||
|
"en": "Recreational and leisure activities. Things which make for enjoyment and entertainment. Games/gambling/risk. Romance and limerence. Children/fertility. Self-expression. Courage."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 6,
|
||||||
|
"zodiacId": "virgo",
|
||||||
|
"motto": {
|
||||||
|
"la": "Valetudo",
|
||||||
|
"en": "Health"
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"en": "House of Health"
|
||||||
|
},
|
||||||
|
"interpretation": {
|
||||||
|
"en": "Routine tasks and duties. Skills or training acquired. Employment (job). Service and being served. Strength, vitality. Wellness and healthcare."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 7,
|
||||||
|
"zodiacId": "libra",
|
||||||
|
"motto": {
|
||||||
|
"la": "Uxor",
|
||||||
|
"en": "Spouse"
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"en": "House of Balance"
|
||||||
|
},
|
||||||
|
"interpretation": {
|
||||||
|
"en": "Partnerships. Marriage and business matters. Diplomacy. Agreements, contracts and all things official. Equilibrium."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 8,
|
||||||
|
"zodiacId": "scorpio",
|
||||||
|
"motto": {
|
||||||
|
"la": "Mors",
|
||||||
|
"en": "Death"
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"en": "House of Transformation"
|
||||||
|
},
|
||||||
|
"interpretation": {
|
||||||
|
"en": "Cycles of deaths and rebirth. Sexual relationships and commitments of all kinds. Joint funds, finances. Other person's resource. Karma and debt (judgment). Regeneration. Self-transformation."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 9,
|
||||||
|
"zodiacId": "sagittarius",
|
||||||
|
"motto": {
|
||||||
|
"la": "Iter",
|
||||||
|
"en": "Passage"
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"en": "House of Purpose"
|
||||||
|
},
|
||||||
|
"interpretation": {
|
||||||
|
"en": "Travel and foreign affairs. Culture. Expansion. Law and ethics. Education/learning/knowledge. Philosophical interests, belief systems. Experience through exploration. Things long-term."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 10,
|
||||||
|
"zodiacId": "capricorn",
|
||||||
|
"motto": {
|
||||||
|
"la": "Regnum",
|
||||||
|
"en": "Kingdom"
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"en": "House of Enterprise"
|
||||||
|
},
|
||||||
|
"interpretation": {
|
||||||
|
"en": "Ambitions. Motivations. Career, achievements. Society and government. Father or authority. Notoriety. Advantage."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 11,
|
||||||
|
"zodiacId": "aquarius",
|
||||||
|
"motto": {
|
||||||
|
"la": "Benefacta",
|
||||||
|
"en": "Support"
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"en": "House of Blessings"
|
||||||
|
},
|
||||||
|
"interpretation": {
|
||||||
|
"en": "Benefits from effort. Friends and acquaintances of like-minded attitudes. Belonging. Groups, communities, and associations. Charity. Connectedness/networking. Love. Wish fulfillment. Wealth."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 12,
|
||||||
|
"zodiacId": "pisces",
|
||||||
|
"motto": {
|
||||||
|
"la": "Carcer",
|
||||||
|
"en": "Rehabilitation"
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"en": "House of Sacrifice"
|
||||||
|
},
|
||||||
|
"interpretation": {
|
||||||
|
"en": "Privacy, refuge; seclusion and retreating. Creativity. Clandestiny↔Revelation. Intuition. Extremes/abundance, but also addictions. Luck, miracles. Releasing/relinquishing, healing/cleansing/rejuvenation, forgiveness, and peacefulness. Finality/completion/conclusion."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
233
data/astrology/planets.json
Normal file
@@ -0,0 +1,233 @@
|
|||||||
|
{
|
||||||
|
"primum-mobile": {
|
||||||
|
"id": "primum-mobile",
|
||||||
|
"name": {
|
||||||
|
"en": {
|
||||||
|
"en": "Primum Mobile"
|
||||||
|
},
|
||||||
|
"he": {
|
||||||
|
"he": "ראשית הגלגולים",
|
||||||
|
"roman": "Roshit HaGilgulim"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"zodiac": {
|
||||||
|
"id": "zodiac",
|
||||||
|
"name": {
|
||||||
|
"en": {
|
||||||
|
"en": "Zodiac"
|
||||||
|
},
|
||||||
|
"he": {
|
||||||
|
"he": "מזלות",
|
||||||
|
"roman": "Mazalot"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"olam-yesodot": {
|
||||||
|
"id": "olam-yesodot",
|
||||||
|
"name": {
|
||||||
|
"en": {
|
||||||
|
"en": "World of Foundations"
|
||||||
|
},
|
||||||
|
"he": {
|
||||||
|
"he": "עולם היסודות",
|
||||||
|
"roman": "Olam haYesodot"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"sol": {
|
||||||
|
"id": "sol",
|
||||||
|
"symbol": "☉︎",
|
||||||
|
"hebrewLetterId": "resh",
|
||||||
|
"name": {
|
||||||
|
"en": {
|
||||||
|
"en": "Sol"
|
||||||
|
},
|
||||||
|
"he": {
|
||||||
|
"he": "שמש",
|
||||||
|
"roman": "Shemesh",
|
||||||
|
"en": "Sun"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"godNameId": "yhvh-eloha-vedaat",
|
||||||
|
"archangelId": "michael",
|
||||||
|
"intelligenceId": "nakhiel",
|
||||||
|
"spiritId": "sorath",
|
||||||
|
"magickTypes": {
|
||||||
|
"en": "Career success and progression, establishing harmony, healing and improving health, leadership skills, acquiring money and resources, promotion, strengthening willpower"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mercury": {
|
||||||
|
"id": "mercury",
|
||||||
|
"symbol": "☿︎",
|
||||||
|
"hebrewLetterId": "bet",
|
||||||
|
"name": {
|
||||||
|
"en": {
|
||||||
|
"en": "Mercury"
|
||||||
|
},
|
||||||
|
"he": {
|
||||||
|
"he": "כוכב",
|
||||||
|
"roman": "Kochav"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"godNameId": "elohim-tzvaot",
|
||||||
|
"archangelId": "raphael",
|
||||||
|
"intelligenceId": "tiriel",
|
||||||
|
"spiritId": "taphthartharath",
|
||||||
|
"magickTypes": {
|
||||||
|
"en": "Business success, improving communication skills, developing knowledge and memory, diplomacy, exam success, divination, developing influence, protection when traveling by air and land, learning music"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"venus": {
|
||||||
|
"id": "venus",
|
||||||
|
"symbol": "♀︎",
|
||||||
|
"hebrewLetterId": "dalet",
|
||||||
|
"name": {
|
||||||
|
"en": {
|
||||||
|
"en": "Venus"
|
||||||
|
},
|
||||||
|
"he": {
|
||||||
|
"he": "נגה",
|
||||||
|
"roman": "Noga"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"godNameId": "yhvh-tzvaot",
|
||||||
|
"archangelId": "anael",
|
||||||
|
"intelligenceId": "hagiel",
|
||||||
|
"spiritId": "kedemel",
|
||||||
|
"magickTypes": {
|
||||||
|
"en": "Increasing attractiveness and self-confidence, beauty and passion, enhancing creativity, improving fertility, developing friendships, obtaining love"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"earth": {
|
||||||
|
"id": "earth",
|
||||||
|
"symbol": "♁︎",
|
||||||
|
"name": {
|
||||||
|
"en": {
|
||||||
|
"en": "Earth"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"luna": {
|
||||||
|
"id": "luna",
|
||||||
|
"symbol": "☾︎",
|
||||||
|
"hebrewLetterId": "gimel",
|
||||||
|
"name": {
|
||||||
|
"en": {
|
||||||
|
"en": "Luna"
|
||||||
|
},
|
||||||
|
"he": {
|
||||||
|
"he": "לבנה",
|
||||||
|
"roman": "Levanah",
|
||||||
|
"en": "White"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"godNameId": "shaddai-el-chai",
|
||||||
|
"archangelId": "gabriel",
|
||||||
|
"intelligenceId": "shelachel",
|
||||||
|
"spiritId": "chasmodai",
|
||||||
|
"magickTypes": {
|
||||||
|
"en": "Developing clairvoyance and other psychic skills, ensuring safe childbirth, divination, glamour and illusions, lucid dreaming, protection when traveling by sea"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mars": {
|
||||||
|
"id": "mars",
|
||||||
|
"symbol": "♂︎",
|
||||||
|
"hebrewLetterId": "pe",
|
||||||
|
"name": {
|
||||||
|
"en": {
|
||||||
|
"en": "Mars"
|
||||||
|
},
|
||||||
|
"he": {
|
||||||
|
"he": "מאדים",
|
||||||
|
"roman": "Ma'adim"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"godNameId": "elohim-gibor",
|
||||||
|
"archangelId": "zamael",
|
||||||
|
"intelligenceId": "graphiel",
|
||||||
|
"spiritId": "bartzabel",
|
||||||
|
"magickTypes": {
|
||||||
|
"en": "Controlling anger, increasing courage, enhancing energy and passion, increasing vigour and sex drive"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"jupiter": {
|
||||||
|
"id": "jupiter",
|
||||||
|
"symbol": "♃︎",
|
||||||
|
"hebrewLetterId": "kaf",
|
||||||
|
"name": {
|
||||||
|
"en": {
|
||||||
|
"en": "Jupiter"
|
||||||
|
},
|
||||||
|
"he": {
|
||||||
|
"he": "צדק",
|
||||||
|
"roman": "Tzedek",
|
||||||
|
"en": "Justice"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"godNameId": "el",
|
||||||
|
"archangelId": "sachiel",
|
||||||
|
"intelligenceId": "iophiel",
|
||||||
|
"spiritId": "hismael",
|
||||||
|
"magickTypes": {
|
||||||
|
"en": "Career success, developing ambition and enthusiasm, improving fortune and luck, general health, acquiring honour, improving sense of humour, legal matters and dealing with the establishment, developing leadership skills"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"saturn": {
|
||||||
|
"id": "saturn",
|
||||||
|
"symbol": "♄︎",
|
||||||
|
"name": {
|
||||||
|
"en": {
|
||||||
|
"en": "Saturn"
|
||||||
|
},
|
||||||
|
"he": {
|
||||||
|
"he": "שַׁבְּתַאי",
|
||||||
|
"roman": "Shabbathai"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"hebrewLetterId": "tav",
|
||||||
|
"godNameId": "yhvh-elohim",
|
||||||
|
"archangelId": "cassiel",
|
||||||
|
"intelligenceId": "agiel",
|
||||||
|
"spiritId": "zazel",
|
||||||
|
"magickTypes": {
|
||||||
|
"en": "Performing duty, establishing balance and equilibrium, dispelling illusions, protecting the home, legal matters, developing patience and self-discipline"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"uranus": {
|
||||||
|
"id": "uranus",
|
||||||
|
"symbol": "⛢︎",
|
||||||
|
"name": {
|
||||||
|
"en": {
|
||||||
|
"en": "Uranus"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"neptune": {
|
||||||
|
"id": "neptune",
|
||||||
|
"symbol": "♆︎",
|
||||||
|
"name": {
|
||||||
|
"en": {
|
||||||
|
"en": "Neptune"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"rahu": {
|
||||||
|
"id": "rahu",
|
||||||
|
"symbol": "☊︎",
|
||||||
|
"name": {
|
||||||
|
"en": {
|
||||||
|
"en": "Caput Draconis"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ketu": {
|
||||||
|
"id": "ketu",
|
||||||
|
"symbol": "☋︎",
|
||||||
|
"name": {
|
||||||
|
"en": {
|
||||||
|
"en": "Cauda Draconic"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
244
data/astrology/retrograde.json
Normal file
@@ -0,0 +1,244 @@
|
|||||||
|
{
|
||||||
|
"mercury": [
|
||||||
|
[
|
||||||
|
[
|
||||||
|
2020,
|
||||||
|
10,
|
||||||
|
13
|
||||||
|
],
|
||||||
|
[
|
||||||
|
2020,
|
||||||
|
11,
|
||||||
|
3
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
2021,
|
||||||
|
1,
|
||||||
|
30
|
||||||
|
],
|
||||||
|
[
|
||||||
|
2021,
|
||||||
|
2,
|
||||||
|
20
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
2021,
|
||||||
|
5,
|
||||||
|
29
|
||||||
|
],
|
||||||
|
[
|
||||||
|
2021,
|
||||||
|
6,
|
||||||
|
22
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
2021,
|
||||||
|
9,
|
||||||
|
27
|
||||||
|
],
|
||||||
|
[
|
||||||
|
2021,
|
||||||
|
10,
|
||||||
|
18
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
2022,
|
||||||
|
1,
|
||||||
|
14
|
||||||
|
],
|
||||||
|
[
|
||||||
|
2022,
|
||||||
|
2,
|
||||||
|
3
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
2022,
|
||||||
|
5,
|
||||||
|
10
|
||||||
|
],
|
||||||
|
[
|
||||||
|
2022,
|
||||||
|
6,
|
||||||
|
2
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
2022,
|
||||||
|
9,
|
||||||
|
9
|
||||||
|
],
|
||||||
|
[
|
||||||
|
2022,
|
||||||
|
10,
|
||||||
|
2
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
2022,
|
||||||
|
12,
|
||||||
|
29
|
||||||
|
],
|
||||||
|
[
|
||||||
|
2023,
|
||||||
|
1,
|
||||||
|
18
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
2023,
|
||||||
|
4,
|
||||||
|
21
|
||||||
|
],
|
||||||
|
[
|
||||||
|
2023,
|
||||||
|
5,
|
||||||
|
14
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
2023,
|
||||||
|
8,
|
||||||
|
23
|
||||||
|
],
|
||||||
|
[
|
||||||
|
2023,
|
||||||
|
9,
|
||||||
|
15
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
2023,
|
||||||
|
12,
|
||||||
|
13
|
||||||
|
],
|
||||||
|
[
|
||||||
|
2024,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
2024,
|
||||||
|
4,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
[
|
||||||
|
2024,
|
||||||
|
4,
|
||||||
|
25
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
2024,
|
||||||
|
8,
|
||||||
|
4
|
||||||
|
],
|
||||||
|
[
|
||||||
|
2024,
|
||||||
|
8,
|
||||||
|
28
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
2024,
|
||||||
|
11,
|
||||||
|
25
|
||||||
|
],
|
||||||
|
[
|
||||||
|
2024,
|
||||||
|
12,
|
||||||
|
15
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
2025,
|
||||||
|
3,
|
||||||
|
14
|
||||||
|
],
|
||||||
|
[
|
||||||
|
2025,
|
||||||
|
4,
|
||||||
|
7
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
2025,
|
||||||
|
7,
|
||||||
|
17
|
||||||
|
],
|
||||||
|
[
|
||||||
|
2025,
|
||||||
|
8,
|
||||||
|
11
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
2025,
|
||||||
|
11,
|
||||||
|
9
|
||||||
|
],
|
||||||
|
[
|
||||||
|
2025,
|
||||||
|
11,
|
||||||
|
29
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
2026,
|
||||||
|
2,
|
||||||
|
25
|
||||||
|
],
|
||||||
|
[
|
||||||
|
2026,
|
||||||
|
3,
|
||||||
|
20
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
2026,
|
||||||
|
6,
|
||||||
|
29
|
||||||
|
],
|
||||||
|
[
|
||||||
|
2026,
|
||||||
|
7,
|
||||||
|
23
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
[
|
||||||
|
2026,
|
||||||
|
10,
|
||||||
|
24
|
||||||
|
],
|
||||||
|
[
|
||||||
|
2026,
|
||||||
|
11,
|
||||||
|
13
|
||||||
|
]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
326
data/astrology/zodiac.json
Normal file
@@ -0,0 +1,326 @@
|
|||||||
|
{
|
||||||
|
"aries": {
|
||||||
|
"id": "aries",
|
||||||
|
"no": 1,
|
||||||
|
"symbol": "♈︎",
|
||||||
|
"emoji": "♈️",
|
||||||
|
"name": {
|
||||||
|
"en": "Aries"
|
||||||
|
},
|
||||||
|
"meaning": {
|
||||||
|
"en": "Ram"
|
||||||
|
},
|
||||||
|
"rulesFrom": [
|
||||||
|
[
|
||||||
|
3,
|
||||||
|
21
|
||||||
|
],
|
||||||
|
[
|
||||||
|
4,
|
||||||
|
19
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"planetId": "mars",
|
||||||
|
"elementId": "fire",
|
||||||
|
"quadruplicity": "cardinal",
|
||||||
|
"tribeOfIsraelId": "gad",
|
||||||
|
"tetragrammatonPermutation": "yhvH"
|
||||||
|
},
|
||||||
|
"taurus": {
|
||||||
|
"id": "taurus",
|
||||||
|
"no": 2,
|
||||||
|
"symbol": "♉︎",
|
||||||
|
"emoji": "♉",
|
||||||
|
"name": {
|
||||||
|
"en": "Taurus"
|
||||||
|
},
|
||||||
|
"meaning": {
|
||||||
|
"en": "Bullm"
|
||||||
|
},
|
||||||
|
"rulesFrom": [
|
||||||
|
[
|
||||||
|
4,
|
||||||
|
20
|
||||||
|
],
|
||||||
|
[
|
||||||
|
5,
|
||||||
|
20
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"planetId": "venus",
|
||||||
|
"elementId": "earth",
|
||||||
|
"quadruplicity": "kerubic",
|
||||||
|
"tribeOfIsraelId": "ephraim",
|
||||||
|
"tetragrammatonPermutation": "yhHv"
|
||||||
|
},
|
||||||
|
"gemini": {
|
||||||
|
"id": "gemini",
|
||||||
|
"no": 3,
|
||||||
|
"symbol": "♊︎",
|
||||||
|
"emoji": "♊",
|
||||||
|
"name": {
|
||||||
|
"en": "Gemini"
|
||||||
|
},
|
||||||
|
"meaning": {
|
||||||
|
"en": "Twins"
|
||||||
|
},
|
||||||
|
"rulesFrom": [
|
||||||
|
[
|
||||||
|
5,
|
||||||
|
21
|
||||||
|
],
|
||||||
|
[
|
||||||
|
6,
|
||||||
|
20
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"planetId": "mercury",
|
||||||
|
"elementId": "air",
|
||||||
|
"quadruplicity": "mutable",
|
||||||
|
"tribeOfIsraelId": "manasseh",
|
||||||
|
"tetragrammatonPermutation": "yvhH"
|
||||||
|
},
|
||||||
|
"cancer": {
|
||||||
|
"id": "cancer",
|
||||||
|
"no": 4,
|
||||||
|
"symbol": "♋︎",
|
||||||
|
"emoji": "♋",
|
||||||
|
"name": {
|
||||||
|
"en": "Cancer"
|
||||||
|
},
|
||||||
|
"meaning": {
|
||||||
|
"en": "Crab"
|
||||||
|
},
|
||||||
|
"rulesFrom": [
|
||||||
|
[
|
||||||
|
6,
|
||||||
|
21
|
||||||
|
],
|
||||||
|
[
|
||||||
|
7,
|
||||||
|
22
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"planetId": "sol",
|
||||||
|
"elementId": "water",
|
||||||
|
"quadruplicity": "cardinal",
|
||||||
|
"tribeOfIsraelId": "issachar",
|
||||||
|
"tetragrammatonPermutation": "hvyH"
|
||||||
|
},
|
||||||
|
"leo": {
|
||||||
|
"id": "leo",
|
||||||
|
"no": 5,
|
||||||
|
"symbol": "♌︎",
|
||||||
|
"emoji": "♌",
|
||||||
|
"name": {
|
||||||
|
"en": "Leo"
|
||||||
|
},
|
||||||
|
"meaning": {
|
||||||
|
"en": "Lion"
|
||||||
|
},
|
||||||
|
"rulesFrom": [
|
||||||
|
[
|
||||||
|
7,
|
||||||
|
23
|
||||||
|
],
|
||||||
|
[
|
||||||
|
8,
|
||||||
|
22
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"planetId": "sol",
|
||||||
|
"elementId": "fire",
|
||||||
|
"quadruplicity": "kerubic",
|
||||||
|
"tribeOfIsraelId": "judah",
|
||||||
|
"tetragrammatonPermutation": "hvyH"
|
||||||
|
},
|
||||||
|
"virgo": {
|
||||||
|
"id": "virgo",
|
||||||
|
"no": 6,
|
||||||
|
"symbol": "♍︎",
|
||||||
|
"emoji": "♍",
|
||||||
|
"name": {
|
||||||
|
"en": "Virgo"
|
||||||
|
},
|
||||||
|
"meaning": {
|
||||||
|
"en": "Virgin"
|
||||||
|
},
|
||||||
|
"rulesFrom": [
|
||||||
|
[
|
||||||
|
8,
|
||||||
|
23
|
||||||
|
],
|
||||||
|
[
|
||||||
|
9,
|
||||||
|
22
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"planetId": "mercury",
|
||||||
|
"elementId": "earth",
|
||||||
|
"quadruplicity": "mutable",
|
||||||
|
"tribeOfIsraelId": "naphtali",
|
||||||
|
"tetragrammatonPermutation": "hHvy"
|
||||||
|
},
|
||||||
|
"libra": {
|
||||||
|
"id": "libra",
|
||||||
|
"no": 7,
|
||||||
|
"symbol": "♎︎",
|
||||||
|
"emoji": "♎",
|
||||||
|
"name": {
|
||||||
|
"en": "Libra"
|
||||||
|
},
|
||||||
|
"meaning": {
|
||||||
|
"en": "Scales"
|
||||||
|
},
|
||||||
|
"rulesFrom": [
|
||||||
|
[
|
||||||
|
9,
|
||||||
|
23
|
||||||
|
],
|
||||||
|
[
|
||||||
|
10,
|
||||||
|
22
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"planetId": "venus",
|
||||||
|
"elementId": "air",
|
||||||
|
"quadruplicity": "cardinal",
|
||||||
|
"tribeOfIsraelId": "asher",
|
||||||
|
"tetragrammatonPermutation": "vHyh"
|
||||||
|
},
|
||||||
|
"scorpio": {
|
||||||
|
"id": "scorpio",
|
||||||
|
"no": 8,
|
||||||
|
"symbol": "♏︎",
|
||||||
|
"emoji": "♏",
|
||||||
|
"name": {
|
||||||
|
"en": "Scorpio"
|
||||||
|
},
|
||||||
|
"meaning": {
|
||||||
|
"en": "Scorpion"
|
||||||
|
},
|
||||||
|
"rulesFrom": [
|
||||||
|
[
|
||||||
|
10,
|
||||||
|
23
|
||||||
|
],
|
||||||
|
[
|
||||||
|
11,
|
||||||
|
21
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"planetId": "jupiter",
|
||||||
|
"elementId": "water",
|
||||||
|
"quadruplicity": "kerubic",
|
||||||
|
"tribeOfIsraelId": "dan",
|
||||||
|
"tetragrammatonPermutation": "vHhy"
|
||||||
|
},
|
||||||
|
"sagittarius": {
|
||||||
|
"id": "sagittarius",
|
||||||
|
"no": 9,
|
||||||
|
"symbol": "♐︎",
|
||||||
|
"emoji": "♐",
|
||||||
|
"name": {
|
||||||
|
"en": "Sagittarius"
|
||||||
|
},
|
||||||
|
"meaning": {
|
||||||
|
"en": "Archer"
|
||||||
|
},
|
||||||
|
"rulesFrom": [
|
||||||
|
[
|
||||||
|
11,
|
||||||
|
22
|
||||||
|
],
|
||||||
|
[
|
||||||
|
12,
|
||||||
|
21
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"planetId": "jupiter",
|
||||||
|
"elementId": "fire",
|
||||||
|
"quadruplicity": "mutable",
|
||||||
|
"tribeOfIsraelId": "benjamin",
|
||||||
|
"tetragrammatonPermutation": "Hyhv"
|
||||||
|
},
|
||||||
|
"capricorn": {
|
||||||
|
"id": "capricorn",
|
||||||
|
"no": 10,
|
||||||
|
"symbol": "♑︎",
|
||||||
|
"emoji": "♑",
|
||||||
|
"name": {
|
||||||
|
"en": "Capricorn"
|
||||||
|
},
|
||||||
|
"meaning": {
|
||||||
|
"en": "Sea-goat"
|
||||||
|
},
|
||||||
|
"rulesFrom": [
|
||||||
|
[
|
||||||
|
12,
|
||||||
|
22
|
||||||
|
],
|
||||||
|
[
|
||||||
|
1,
|
||||||
|
19
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"planetId": "saturn",
|
||||||
|
"elementId": "earth",
|
||||||
|
"quadruplicity": "cardinal",
|
||||||
|
"tribeOfIsraelId": "zebulun",
|
||||||
|
"tetragrammatonPermutation": "Hyhv"
|
||||||
|
},
|
||||||
|
"aquarius": {
|
||||||
|
"id": "aquarius",
|
||||||
|
"no": 11,
|
||||||
|
"symbol": "♒︎",
|
||||||
|
"emoji": "♒",
|
||||||
|
"name": {
|
||||||
|
"en": "Aquarius"
|
||||||
|
},
|
||||||
|
"meaning": {
|
||||||
|
"en": "Water-bearer"
|
||||||
|
},
|
||||||
|
"rulesFrom": [
|
||||||
|
[
|
||||||
|
1,
|
||||||
|
20
|
||||||
|
],
|
||||||
|
[
|
||||||
|
2,
|
||||||
|
18
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"planetId": "saturn",
|
||||||
|
"elementId": "air",
|
||||||
|
"quadruplicity": "kerubic",
|
||||||
|
"tribeOfIsraelId": "reuben",
|
||||||
|
"tetragrammatonPermutation": "Hyvh"
|
||||||
|
},
|
||||||
|
"pisces": {
|
||||||
|
"id": "pisces",
|
||||||
|
"no": 12,
|
||||||
|
"symbol": "♓︎",
|
||||||
|
"emoji": "♓",
|
||||||
|
"name": {
|
||||||
|
"en": "Pisces"
|
||||||
|
},
|
||||||
|
"meaning": {
|
||||||
|
"en": "Fish"
|
||||||
|
},
|
||||||
|
"rulesFrom": [
|
||||||
|
[
|
||||||
|
2,
|
||||||
|
19
|
||||||
|
],
|
||||||
|
[
|
||||||
|
3,
|
||||||
|
20
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"planetId": "jupiter",
|
||||||
|
"elementId": "water",
|
||||||
|
"quadruplicity": "mutable",
|
||||||
|
"tribeOfIsraelId": "simeon",
|
||||||
|
"tetragrammatonPermutation": "Hhyv"
|
||||||
|
}
|
||||||
|
}
|
||||||
228
data/astronomy-cycles.json
Normal file
@@ -0,0 +1,228 @@
|
|||||||
|
{
|
||||||
|
"meta": {
|
||||||
|
"version": 1,
|
||||||
|
"notes": "Core astronomical and calendrical cycles used in astronomy, chronology, and long-term sky modeling."
|
||||||
|
},
|
||||||
|
"cycles": [
|
||||||
|
{
|
||||||
|
"id": "metonic-cycle",
|
||||||
|
"name": "Metonic Cycle",
|
||||||
|
"category": "Luni-solar Calendar",
|
||||||
|
"period": "19 years",
|
||||||
|
"periodDays": 6939.69,
|
||||||
|
"description": "19 tropical years are approximately equal to 235 synodic lunar months.",
|
||||||
|
"significance": "Foundation for lunisolar calendar reconciliation.",
|
||||||
|
"related": ["Callippic Cycle", "Synodic Month"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "callippic-cycle",
|
||||||
|
"name": "Callippic Cycle",
|
||||||
|
"category": "Luni-solar Calendar",
|
||||||
|
"period": "76 years",
|
||||||
|
"periodDays": 27758.76,
|
||||||
|
"description": "Refinement of four Metonic cycles with leap-day correction.",
|
||||||
|
"significance": "Improves long-term lunisolar alignment.",
|
||||||
|
"related": ["Metonic Cycle"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "hipparchic-cycle",
|
||||||
|
"name": "Hipparchic Cycle",
|
||||||
|
"category": "Luni-solar Calendar",
|
||||||
|
"period": "304 years",
|
||||||
|
"periodDays": 111035.04,
|
||||||
|
"description": "Four Callippic cycles used as a higher-order correction block.",
|
||||||
|
"significance": "Historical long-cycle refinement in ancient astronomy.",
|
||||||
|
"related": ["Callippic Cycle"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "synodic-month",
|
||||||
|
"name": "Synodic Month",
|
||||||
|
"category": "Lunar",
|
||||||
|
"period": "29.53059 days",
|
||||||
|
"periodDays": 29.53059,
|
||||||
|
"description": "Average interval between identical lunar phases, such as full moon to full moon.",
|
||||||
|
"significance": "Primary month unit in lunar and lunisolar systems.",
|
||||||
|
"related": ["Metonic Cycle"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "draconic-month",
|
||||||
|
"name": "Draconic Month",
|
||||||
|
"category": "Lunar",
|
||||||
|
"period": "27.21222 days",
|
||||||
|
"periodDays": 27.21222,
|
||||||
|
"description": "Moon's node-to-node period relative to the ecliptic.",
|
||||||
|
"significance": "Important for eclipse timing models.",
|
||||||
|
"related": ["Saros Cycle", "Eclipse Season"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "anomalistic-month",
|
||||||
|
"name": "Anomalistic Month",
|
||||||
|
"category": "Lunar",
|
||||||
|
"period": "27.55455 days",
|
||||||
|
"periodDays": 27.55455,
|
||||||
|
"description": "Perigee-to-perigee period of the Moon.",
|
||||||
|
"significance": "Affects supermoon timing and lunar distance patterns.",
|
||||||
|
"related": ["Saros Cycle"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "eclipse-season",
|
||||||
|
"name": "Eclipse Season",
|
||||||
|
"category": "Eclipse",
|
||||||
|
"period": "173.31 days",
|
||||||
|
"periodDays": 173.31,
|
||||||
|
"description": "Interval between windows when the Sun is near a lunar node.",
|
||||||
|
"significance": "Predicts clusters of solar/lunar eclipses.",
|
||||||
|
"related": ["Draconic Month", "Saros Cycle"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "saros-cycle",
|
||||||
|
"name": "Saros Cycle",
|
||||||
|
"category": "Eclipse",
|
||||||
|
"period": "18 years 11 days 8 hours",
|
||||||
|
"periodDays": 6585.321,
|
||||||
|
"description": "Near-repeat interval for similar eclipses from geometry recurrence.",
|
||||||
|
"significance": "Classic eclipse prediction cycle.",
|
||||||
|
"related": ["Draconic Month", "Anomalistic Month", "Eclipse Season"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "inex-cycle",
|
||||||
|
"name": "Inex Cycle",
|
||||||
|
"category": "Eclipse",
|
||||||
|
"period": "29 years minus about 20 days",
|
||||||
|
"periodDays": 10571.95,
|
||||||
|
"description": "Longer eclipse recurrence interval connecting different saros families.",
|
||||||
|
"significance": "Useful for classifying eclipse series transitions.",
|
||||||
|
"related": ["Saros Cycle"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "solar-sunspot-cycle",
|
||||||
|
"name": "Solar Sunspot Cycle",
|
||||||
|
"category": "Solar",
|
||||||
|
"period": "~11 years",
|
||||||
|
"periodDays": 4017.75,
|
||||||
|
"description": "Average magnetic activity cycle of the Sun seen in sunspot counts.",
|
||||||
|
"significance": "Drives space weather and auroral activity trends.",
|
||||||
|
"related": ["Hale Magnetic Cycle"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "hale-magnetic-cycle",
|
||||||
|
"name": "Hale Magnetic Cycle",
|
||||||
|
"category": "Solar",
|
||||||
|
"period": "~22 years",
|
||||||
|
"periodDays": 8035.5,
|
||||||
|
"description": "Two sunspot cycles required for solar magnetic polarity to return.",
|
||||||
|
"significance": "Long-form solar dynamo period.",
|
||||||
|
"related": ["Solar Sunspot Cycle"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "jupiter-saturn-great-conjunction",
|
||||||
|
"name": "Jupiter-Saturn Great Conjunction",
|
||||||
|
"category": "Planetary",
|
||||||
|
"period": "~19.86 years",
|
||||||
|
"periodDays": 7255.0,
|
||||||
|
"description": "Mean interval between conjunctions of Jupiter and Saturn.",
|
||||||
|
"significance": "Major marker in historical chronology and sky cycles.",
|
||||||
|
"related": ["Great Trigon"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "great-trigon",
|
||||||
|
"name": "Great Trigon",
|
||||||
|
"category": "Planetary",
|
||||||
|
"period": "~240 years",
|
||||||
|
"periodDays": 87658.0,
|
||||||
|
"description": "Successive great conjunctions cycle through similar elemental triplicity patterns over centuries.",
|
||||||
|
"significance": "Long-cycle structure derived from Jupiter-Saturn conjunction drift.",
|
||||||
|
"related": ["Jupiter-Saturn Great Conjunction"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "venus-pentagram-cycle",
|
||||||
|
"name": "Venus Pentagram Cycle",
|
||||||
|
"category": "Planetary",
|
||||||
|
"period": "8 years",
|
||||||
|
"periodDays": 2921.94,
|
||||||
|
"description": "Five synodic Venus cycles align closely with eight Earth years, tracing a pentagram-like pattern.",
|
||||||
|
"significance": "Famous resonance in naked-eye planetary astronomy.",
|
||||||
|
"related": ["Synodic Venus Cycle"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "synodic-venus-cycle",
|
||||||
|
"name": "Synodic Venus Cycle",
|
||||||
|
"category": "Planetary",
|
||||||
|
"period": "583.92 days",
|
||||||
|
"periodDays": 583.92,
|
||||||
|
"description": "Mean interval between consecutive inferior conjunctions of Venus.",
|
||||||
|
"significance": "Basis of Venus visibility phases and cycle work.",
|
||||||
|
"related": ["Venus Pentagram Cycle"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "halley-comet-cycle",
|
||||||
|
"name": "Halley Comet Cycle",
|
||||||
|
"category": "Comet",
|
||||||
|
"period": "~75-76 years",
|
||||||
|
"periodDays": 27759.0,
|
||||||
|
"description": "Orbital return interval of 1P/Halley, varying by perturbations.",
|
||||||
|
"significance": "Most recognized periodic comet cycle.",
|
||||||
|
"related": ["Comet Period Classes"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "encke-comet-cycle",
|
||||||
|
"name": "Encke Comet Cycle",
|
||||||
|
"category": "Comet",
|
||||||
|
"period": "~3.30 years",
|
||||||
|
"periodDays": 1205.0,
|
||||||
|
"description": "Orbital return interval of Comet 2P/Encke.",
|
||||||
|
"significance": "Classic short-period comet benchmark.",
|
||||||
|
"related": ["Comet Period Classes"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "precession-of-equinoxes",
|
||||||
|
"name": "Precession of the Equinoxes",
|
||||||
|
"category": "Axial",
|
||||||
|
"period": "~25,772 years",
|
||||||
|
"periodDays": 9413478.0,
|
||||||
|
"description": "Slow conical motion of Earth's rotation axis relative to fixed stars.",
|
||||||
|
"significance": "Shifts equinox positions through zodiacal constellations over millennia.",
|
||||||
|
"related": ["Great Year (Platonic)"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "great-year-platonic",
|
||||||
|
"name": "Great Year (Platonic)",
|
||||||
|
"category": "Axial",
|
||||||
|
"period": "~25,772 years",
|
||||||
|
"periodDays": 9413478.0,
|
||||||
|
"description": "Traditional term for one full precessional cycle of the equinoxes.",
|
||||||
|
"significance": "Long-duration epochal framing in astronomy and chronology traditions.",
|
||||||
|
"related": ["Precession of the Equinoxes"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "milankovitch-obliquity",
|
||||||
|
"name": "Milankovitch Obliquity Cycle",
|
||||||
|
"category": "Climate-Astronomy",
|
||||||
|
"period": "~41,000 years",
|
||||||
|
"periodDays": 14975775.0,
|
||||||
|
"description": "Variation in Earth's axial tilt angle over tens of millennia.",
|
||||||
|
"significance": "Major pacing component in glacial-interglacial climate structure.",
|
||||||
|
"related": ["Milankovitch Precession", "Milankovitch Eccentricity"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "milankovitch-precession",
|
||||||
|
"name": "Milankovitch Precession Cycle",
|
||||||
|
"category": "Climate-Astronomy",
|
||||||
|
"period": "~19,000 to 23,000 years",
|
||||||
|
"periodDays": 7665000.0,
|
||||||
|
"description": "Seasonal timing shift from axial precession interacting with orbital geometry.",
|
||||||
|
"significance": "Controls seasonal insolation pacing over geologic time.",
|
||||||
|
"related": ["Precession of the Equinoxes", "Milankovitch Obliquity"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "milankovitch-eccentricity",
|
||||||
|
"name": "Milankovitch Eccentricity Cycle",
|
||||||
|
"category": "Climate-Astronomy",
|
||||||
|
"period": "~100,000 years (plus ~405,000-year mode)",
|
||||||
|
"periodDays": 36524250.0,
|
||||||
|
"description": "Long-term change in orbital ellipse shape from near-circular to more elliptical.",
|
||||||
|
"significance": "Dominant long pacing in Quaternary paleoclimate archives.",
|
||||||
|
"related": ["Milankovitch Obliquity", "Milankovitch Precession"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
1673
data/calendar-holidays.json
Normal file
379
data/calendar-months.json
Normal file
@@ -0,0 +1,379 @@
|
|||||||
|
{
|
||||||
|
"meta": {
|
||||||
|
"version": 1,
|
||||||
|
"notes": "Month-level correspondences and observances for the Calendar section.",
|
||||||
|
"links": "holidayIds map to entries in celestial-holidays.json"
|
||||||
|
},
|
||||||
|
"months": [
|
||||||
|
{
|
||||||
|
"id": "january",
|
||||||
|
"order": 1,
|
||||||
|
"name": "January",
|
||||||
|
"start": "01-01",
|
||||||
|
"end": "01-31",
|
||||||
|
"seasonNorth": "Winter",
|
||||||
|
"seasonSouth": "Summer",
|
||||||
|
"coreTheme": "Beginnings, thresholds, planning",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "saturn",
|
||||||
|
"zodiacSignId": "capricorn",
|
||||||
|
"tarotCard": "The Devil",
|
||||||
|
"godId": "janus"
|
||||||
|
},
|
||||||
|
"events": [
|
||||||
|
{
|
||||||
|
"id": "january-threshold-rite",
|
||||||
|
"name": "Threshold Rite",
|
||||||
|
"date": "01-01",
|
||||||
|
"description": "Set year intentions and define a boundary/structure for one major goal.",
|
||||||
|
"associations": {
|
||||||
|
"godId": "janus",
|
||||||
|
"planetId": "saturn",
|
||||||
|
"tarotCard": "The Fool"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"holidayIds": ["perihelion"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "february",
|
||||||
|
"order": 2,
|
||||||
|
"name": "February",
|
||||||
|
"start": "02-01",
|
||||||
|
"end": "02-28",
|
||||||
|
"seasonNorth": "Winter",
|
||||||
|
"seasonSouth": "Summer",
|
||||||
|
"coreTheme": "Purification, preparation, hidden momentum",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "saturn",
|
||||||
|
"zodiacSignId": "aquarius",
|
||||||
|
"tarotCard": "The Star",
|
||||||
|
"godId": "uranus"
|
||||||
|
},
|
||||||
|
"events": [
|
||||||
|
{
|
||||||
|
"id": "february-clearing-work",
|
||||||
|
"name": "Cleansing & Clearing",
|
||||||
|
"date": "02-11",
|
||||||
|
"description": "Remove one recurring distraction and reset practical systems.",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "saturn",
|
||||||
|
"tarotCard": "The Star",
|
||||||
|
"godId": "maat"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"holidayIds": ["imbolc-cross-quarter"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "march",
|
||||||
|
"order": 3,
|
||||||
|
"name": "March",
|
||||||
|
"start": "03-01",
|
||||||
|
"end": "03-31",
|
||||||
|
"seasonNorth": "Spring",
|
||||||
|
"seasonSouth": "Autumn",
|
||||||
|
"coreTheme": "Initiation, momentum, first fire",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "mars",
|
||||||
|
"zodiacSignId": "aries",
|
||||||
|
"tarotCard": "The Emperor",
|
||||||
|
"godId": "ares"
|
||||||
|
},
|
||||||
|
"events": [
|
||||||
|
{
|
||||||
|
"id": "march-action-cycle",
|
||||||
|
"name": "Action Cycle Start",
|
||||||
|
"date": "03-21",
|
||||||
|
"description": "Launch a focused 30-day push with daily effort tracking.",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "mars",
|
||||||
|
"zodiacSignId": "aries",
|
||||||
|
"tarotCard": "The Emperor",
|
||||||
|
"godId": "ares"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"holidayIds": ["march-equinox", "spring-eclipse-window"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "april",
|
||||||
|
"order": 4,
|
||||||
|
"name": "April",
|
||||||
|
"start": "04-01",
|
||||||
|
"end": "04-30",
|
||||||
|
"seasonNorth": "Spring",
|
||||||
|
"seasonSouth": "Autumn",
|
||||||
|
"coreTheme": "Grounding growth, material cultivation",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "venus",
|
||||||
|
"zodiacSignId": "taurus",
|
||||||
|
"tarotCard": "The Hierophant",
|
||||||
|
"godId": "aphrodite"
|
||||||
|
},
|
||||||
|
"events": [
|
||||||
|
{
|
||||||
|
"id": "april-earth-offering",
|
||||||
|
"name": "Earth Offering",
|
||||||
|
"date": "04-18",
|
||||||
|
"description": "Dedicate one practical act to long-term stability and abundance.",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "venus",
|
||||||
|
"zodiacSignId": "taurus",
|
||||||
|
"tarotCard": "The Hierophant",
|
||||||
|
"godId": "demeter"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"holidayIds": ["spring-eclipse-window"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "may",
|
||||||
|
"order": 5,
|
||||||
|
"name": "May",
|
||||||
|
"start": "05-01",
|
||||||
|
"end": "05-31",
|
||||||
|
"seasonNorth": "Spring",
|
||||||
|
"seasonSouth": "Autumn",
|
||||||
|
"coreTheme": "Connection, exchange, and curiosity",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "mercury",
|
||||||
|
"zodiacSignId": "gemini",
|
||||||
|
"tarotCard": "The Lovers",
|
||||||
|
"godId": "hermes"
|
||||||
|
},
|
||||||
|
"events": [
|
||||||
|
{
|
||||||
|
"id": "may-message-working",
|
||||||
|
"name": "Message Working",
|
||||||
|
"date": "05-14",
|
||||||
|
"description": "Refine communication in one key relationship or collaboration.",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "mercury",
|
||||||
|
"zodiacSignId": "gemini",
|
||||||
|
"tarotCard": "The Lovers",
|
||||||
|
"godId": "hermes"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"holidayIds": ["beltane-cross-quarter"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "june",
|
||||||
|
"order": 6,
|
||||||
|
"name": "June",
|
||||||
|
"start": "06-01",
|
||||||
|
"end": "06-30",
|
||||||
|
"seasonNorth": "Summer",
|
||||||
|
"seasonSouth": "Winter",
|
||||||
|
"coreTheme": "Nourishment, protection, emotional coherence",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "luna",
|
||||||
|
"zodiacSignId": "cancer",
|
||||||
|
"tarotCard": "The Chariot",
|
||||||
|
"godId": "artemis"
|
||||||
|
},
|
||||||
|
"events": [
|
||||||
|
{
|
||||||
|
"id": "june-hearth-vow",
|
||||||
|
"name": "Hearth Vow",
|
||||||
|
"date": "06-20",
|
||||||
|
"description": "Commit to one practice that protects your inner and outer home.",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "luna",
|
||||||
|
"zodiacSignId": "cancer",
|
||||||
|
"tarotCard": "The Chariot",
|
||||||
|
"godId": "isis"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"holidayIds": ["june-solstice"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "july",
|
||||||
|
"order": 7,
|
||||||
|
"name": "July",
|
||||||
|
"start": "07-01",
|
||||||
|
"end": "07-31",
|
||||||
|
"seasonNorth": "Summer",
|
||||||
|
"seasonSouth": "Winter",
|
||||||
|
"coreTheme": "Radiance, leadership, visibility",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "sol",
|
||||||
|
"zodiacSignId": "leo",
|
||||||
|
"tarotCard": "Strength",
|
||||||
|
"godId": "ra"
|
||||||
|
},
|
||||||
|
"events": [
|
||||||
|
{
|
||||||
|
"id": "july-solar-crowning",
|
||||||
|
"name": "Solar Crowning",
|
||||||
|
"date": "07-19",
|
||||||
|
"description": "Present one visible work publicly and receive clear feedback.",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "sol",
|
||||||
|
"zodiacSignId": "leo",
|
||||||
|
"tarotCard": "Strength",
|
||||||
|
"godId": "ra"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"holidayIds": ["sirius-rising-window"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "august",
|
||||||
|
"order": 8,
|
||||||
|
"name": "August",
|
||||||
|
"start": "08-01",
|
||||||
|
"end": "08-31",
|
||||||
|
"seasonNorth": "Summer",
|
||||||
|
"seasonSouth": "Winter",
|
||||||
|
"coreTheme": "Refinement, discipline, service",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "mercury",
|
||||||
|
"zodiacSignId": "virgo",
|
||||||
|
"tarotCard": "The Hermit",
|
||||||
|
"godId": "thoth"
|
||||||
|
},
|
||||||
|
"events": [
|
||||||
|
{
|
||||||
|
"id": "august-harvest-ledger",
|
||||||
|
"name": "Harvest Ledger",
|
||||||
|
"date": "08-12",
|
||||||
|
"description": "Audit progress and simplify tools before the autumn cycle.",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "mercury",
|
||||||
|
"zodiacSignId": "virgo",
|
||||||
|
"tarotCard": "The Hermit",
|
||||||
|
"godId": "thoth"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"holidayIds": ["sirius-rising-window", "lughnasadh-cross-quarter"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "september",
|
||||||
|
"order": 9,
|
||||||
|
"name": "September",
|
||||||
|
"start": "09-01",
|
||||||
|
"end": "09-30",
|
||||||
|
"seasonNorth": "Autumn",
|
||||||
|
"seasonSouth": "Spring",
|
||||||
|
"coreTheme": "Balance, agreements, calibration",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "venus",
|
||||||
|
"zodiacSignId": "libra",
|
||||||
|
"tarotCard": "Justice",
|
||||||
|
"godId": "maat"
|
||||||
|
},
|
||||||
|
"events": [
|
||||||
|
{
|
||||||
|
"id": "september-balance-work",
|
||||||
|
"name": "Balance Working",
|
||||||
|
"date": "09-23",
|
||||||
|
"description": "Rebalance effort across work, body, and relationships.",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "venus",
|
||||||
|
"zodiacSignId": "libra",
|
||||||
|
"tarotCard": "Justice",
|
||||||
|
"godId": "maat"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"holidayIds": ["september-equinox", "autumn-eclipse-window"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "october",
|
||||||
|
"order": 10,
|
||||||
|
"name": "October",
|
||||||
|
"start": "10-01",
|
||||||
|
"end": "10-31",
|
||||||
|
"seasonNorth": "Autumn",
|
||||||
|
"seasonSouth": "Spring",
|
||||||
|
"coreTheme": "Depth work, release, transformation",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "mars",
|
||||||
|
"zodiacSignId": "scorpio",
|
||||||
|
"tarotCard": "Death",
|
||||||
|
"godId": "hades"
|
||||||
|
},
|
||||||
|
"events": [
|
||||||
|
{
|
||||||
|
"id": "october-shadow-ledger",
|
||||||
|
"name": "Shadow Ledger",
|
||||||
|
"date": "10-27",
|
||||||
|
"description": "Name one pattern to end and one to transmute.",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "mars",
|
||||||
|
"zodiacSignId": "scorpio",
|
||||||
|
"tarotCard": "Death",
|
||||||
|
"godId": "hades"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"holidayIds": ["autumn-eclipse-window", "samhain-cross-quarter"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "november",
|
||||||
|
"order": 11,
|
||||||
|
"name": "November",
|
||||||
|
"start": "11-01",
|
||||||
|
"end": "11-30",
|
||||||
|
"seasonNorth": "Autumn",
|
||||||
|
"seasonSouth": "Spring",
|
||||||
|
"coreTheme": "Meaning, direction, vision",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "jupiter",
|
||||||
|
"zodiacSignId": "sagittarius",
|
||||||
|
"tarotCard": "Temperance",
|
||||||
|
"godId": "zeus"
|
||||||
|
},
|
||||||
|
"events": [
|
||||||
|
{
|
||||||
|
"id": "november-vision-arrow",
|
||||||
|
"name": "Vision Arrow",
|
||||||
|
"date": "11-22",
|
||||||
|
"description": "Choose one long-range objective and align this week to it.",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "jupiter",
|
||||||
|
"zodiacSignId": "sagittarius",
|
||||||
|
"tarotCard": "Temperance",
|
||||||
|
"godId": "zeus"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"holidayIds": ["samhain-cross-quarter", "leonids-peak"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "december",
|
||||||
|
"order": 12,
|
||||||
|
"name": "December",
|
||||||
|
"start": "12-01",
|
||||||
|
"end": "12-31",
|
||||||
|
"seasonNorth": "Winter",
|
||||||
|
"seasonSouth": "Summer",
|
||||||
|
"coreTheme": "Closure, stillness, and renewal",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "saturn",
|
||||||
|
"zodiacSignId": "capricorn",
|
||||||
|
"tarotCard": "The Devil",
|
||||||
|
"godId": "kronos"
|
||||||
|
},
|
||||||
|
"events": [
|
||||||
|
{
|
||||||
|
"id": "december-year-seal",
|
||||||
|
"name": "Year Seal",
|
||||||
|
"date": "12-31",
|
||||||
|
"description": "Consolidate lessons, close open loops, and define the next threshold.",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "saturn",
|
||||||
|
"zodiacSignId": "capricorn",
|
||||||
|
"tarotCard": "The World",
|
||||||
|
"godId": "saturn"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"holidayIds": ["december-solstice", "geminids-peak"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
203
data/celestial-holidays.json
Normal file
@@ -0,0 +1,203 @@
|
|||||||
|
{
|
||||||
|
"meta": {
|
||||||
|
"version": 1,
|
||||||
|
"notes": "Special celestial observances (solstices, equinoxes, eclipse windows, and notable sky events)."
|
||||||
|
},
|
||||||
|
"holidays": [
|
||||||
|
{
|
||||||
|
"id": "perihelion",
|
||||||
|
"name": "Earth Perihelion",
|
||||||
|
"kind": "solar-point",
|
||||||
|
"monthId": "january",
|
||||||
|
"date": "01-03",
|
||||||
|
"description": "Earth reaches its closest orbital point to the Sun.",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "sol",
|
||||||
|
"tarotCard": "The Sun",
|
||||||
|
"godId": "ra"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "imbolc-cross-quarter",
|
||||||
|
"name": "Imbolc Cross-Quarter",
|
||||||
|
"kind": "cross-quarter",
|
||||||
|
"monthId": "february",
|
||||||
|
"dateRange": "02-01 to 02-02",
|
||||||
|
"description": "Seasonal threshold between winter solstice and spring equinox.",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "luna",
|
||||||
|
"zodiacSignId": "aquarius",
|
||||||
|
"tarotCard": "The Star",
|
||||||
|
"godId": "hecate"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "march-equinox",
|
||||||
|
"name": "March Equinox",
|
||||||
|
"kind": "equinox",
|
||||||
|
"monthId": "march",
|
||||||
|
"date": "03-20",
|
||||||
|
"description": "Equal day and night; marks spring in the north and autumn in the south.",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "sol",
|
||||||
|
"zodiacSignId": "aries",
|
||||||
|
"tarotCard": "The Emperor",
|
||||||
|
"godId": "maat"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "spring-eclipse-window",
|
||||||
|
"name": "Spring Eclipse Window",
|
||||||
|
"kind": "eclipse-window",
|
||||||
|
"monthId": "march",
|
||||||
|
"dateRange": "03-15 to 04-15",
|
||||||
|
"description": "Typical annual window for paired solar/lunar eclipses near nodal alignments.",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "luna",
|
||||||
|
"zodiacSignId": "aries",
|
||||||
|
"tarotCard": "The Moon",
|
||||||
|
"godId": "thoth"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "beltane-cross-quarter",
|
||||||
|
"name": "Beltane Cross-Quarter",
|
||||||
|
"kind": "cross-quarter",
|
||||||
|
"monthId": "may",
|
||||||
|
"dateRange": "05-01 to 05-02",
|
||||||
|
"description": "Fertility and fire threshold between equinox and solstice.",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "venus",
|
||||||
|
"zodiacSignId": "taurus",
|
||||||
|
"tarotCard": "The Empress",
|
||||||
|
"godId": "aphrodite"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "june-solstice",
|
||||||
|
"name": "June Solstice",
|
||||||
|
"kind": "solstice",
|
||||||
|
"monthId": "june",
|
||||||
|
"date": "06-21",
|
||||||
|
"description": "Longest day in the northern hemisphere; shortest in the southern hemisphere.",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "sol",
|
||||||
|
"zodiacSignId": "cancer",
|
||||||
|
"tarotCard": "The Sun",
|
||||||
|
"godId": "ra"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "sirius-rising-window",
|
||||||
|
"name": "Sirius Rising Window",
|
||||||
|
"kind": "stellar-observance",
|
||||||
|
"monthId": "july",
|
||||||
|
"dateRange": "07-20 to 08-12",
|
||||||
|
"description": "Heliacal rising period of Sirius in many northern latitudes.",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "sol",
|
||||||
|
"zodiacSignId": "leo",
|
||||||
|
"tarotCard": "Strength",
|
||||||
|
"godId": "isis"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "lughnasadh-cross-quarter",
|
||||||
|
"name": "Lughnasadh Cross-Quarter",
|
||||||
|
"kind": "cross-quarter",
|
||||||
|
"monthId": "august",
|
||||||
|
"dateRange": "08-01 to 08-02",
|
||||||
|
"description": "Harvest threshold between solstice and equinox.",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "mercury",
|
||||||
|
"zodiacSignId": "leo",
|
||||||
|
"tarotCard": "The Hermit",
|
||||||
|
"godId": "thoth"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "september-equinox",
|
||||||
|
"name": "September Equinox",
|
||||||
|
"kind": "equinox",
|
||||||
|
"monthId": "september",
|
||||||
|
"date": "09-22",
|
||||||
|
"description": "Equal day and night; marks autumn in the north and spring in the south.",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "sol",
|
||||||
|
"zodiacSignId": "libra",
|
||||||
|
"tarotCard": "Justice",
|
||||||
|
"godId": "maat"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "autumn-eclipse-window",
|
||||||
|
"name": "Autumn Eclipse Window",
|
||||||
|
"kind": "eclipse-window",
|
||||||
|
"monthId": "september",
|
||||||
|
"dateRange": "09-15 to 10-15",
|
||||||
|
"description": "Typical annual window for eclipse pairings near opposite nodal season.",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "luna",
|
||||||
|
"zodiacSignId": "libra",
|
||||||
|
"tarotCard": "The Moon",
|
||||||
|
"godId": "anubis"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "samhain-cross-quarter",
|
||||||
|
"name": "Samhain Cross-Quarter",
|
||||||
|
"kind": "cross-quarter",
|
||||||
|
"monthId": "october",
|
||||||
|
"dateRange": "10-31 to 11-01",
|
||||||
|
"description": "Threshold of deep autumn and ancestral observance in many traditions.",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "saturn",
|
||||||
|
"zodiacSignId": "scorpio",
|
||||||
|
"tarotCard": "Death",
|
||||||
|
"godId": "hades"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "leonids-peak",
|
||||||
|
"name": "Leonids Meteor Peak",
|
||||||
|
"kind": "meteor-shower",
|
||||||
|
"monthId": "november",
|
||||||
|
"date": "11-17",
|
||||||
|
"description": "Peak of the Leonids meteor shower under dark skies.",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "jupiter",
|
||||||
|
"zodiacSignId": "sagittarius",
|
||||||
|
"tarotCard": "Temperance",
|
||||||
|
"godId": "zeus"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "december-solstice",
|
||||||
|
"name": "December Solstice",
|
||||||
|
"kind": "solstice",
|
||||||
|
"monthId": "december",
|
||||||
|
"date": "12-21",
|
||||||
|
"description": "Shortest day in the northern hemisphere; longest in the southern hemisphere.",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "sol",
|
||||||
|
"zodiacSignId": "capricorn",
|
||||||
|
"tarotCard": "The World",
|
||||||
|
"godId": "saturn"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "geminids-peak",
|
||||||
|
"name": "Geminids Meteor Peak",
|
||||||
|
"kind": "meteor-shower",
|
||||||
|
"monthId": "december",
|
||||||
|
"date": "12-14",
|
||||||
|
"description": "Peak activity of the Geminids meteor shower.",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "mercury",
|
||||||
|
"zodiacSignId": "gemini",
|
||||||
|
"tarotCard": "The Lovers",
|
||||||
|
"godId": "hermes"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
120
data/chakras.json
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
{
|
||||||
|
"root": {
|
||||||
|
"id": "root",
|
||||||
|
"name": {
|
||||||
|
"en": "Root",
|
||||||
|
"sa": "मूलाधार",
|
||||||
|
"roman": "Muladhara"
|
||||||
|
},
|
||||||
|
"meaning": {
|
||||||
|
"en": "Root"
|
||||||
|
},
|
||||||
|
"location": "base-of-spine",
|
||||||
|
"petals": 4,
|
||||||
|
"color": "red",
|
||||||
|
"seed": "Lam",
|
||||||
|
"seedMeaning": {
|
||||||
|
"en": "earth"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"sacral": {
|
||||||
|
"id": "sacral",
|
||||||
|
"name": {
|
||||||
|
"en": "Sacral",
|
||||||
|
"sa": "स्वाधिष्ठान",
|
||||||
|
"roman": "Svadhishthana"
|
||||||
|
},
|
||||||
|
"meaning": {
|
||||||
|
"en": "Where the self is established"
|
||||||
|
},
|
||||||
|
"location": "genitals",
|
||||||
|
"petals": 6,
|
||||||
|
"color": "orange",
|
||||||
|
"seed": "Vam",
|
||||||
|
"seedMeaning": {
|
||||||
|
"en": "water"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"solar-plexus": {
|
||||||
|
"id": "solar-plexus",
|
||||||
|
"name": {
|
||||||
|
"en": "Solar Plexus",
|
||||||
|
"sa": "मणिपूर",
|
||||||
|
"roman": "Manipura"
|
||||||
|
},
|
||||||
|
"meaning": {
|
||||||
|
"en": "Jewel city"
|
||||||
|
},
|
||||||
|
"location": "navel",
|
||||||
|
"petals": 10,
|
||||||
|
"color": "yellow",
|
||||||
|
"seed": "Ram",
|
||||||
|
"seedMeaning": {
|
||||||
|
"en": "fire"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"heart": {
|
||||||
|
"id": "heart",
|
||||||
|
"name": {
|
||||||
|
"en": "Heart",
|
||||||
|
"sa": "अनाहत",
|
||||||
|
"roman": "Anahata"
|
||||||
|
},
|
||||||
|
"meaning": {
|
||||||
|
"en": "Unstruck"
|
||||||
|
},
|
||||||
|
"location": "heart",
|
||||||
|
"petals": 12,
|
||||||
|
"color": "green",
|
||||||
|
"seed": "Yam",
|
||||||
|
"seedMeaning": {
|
||||||
|
"en": "air"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"throat": {
|
||||||
|
"id": "throat",
|
||||||
|
"name": {
|
||||||
|
"en": "Throat",
|
||||||
|
"sa": "विशुद्ध",
|
||||||
|
"roman": "Vishuddha"
|
||||||
|
},
|
||||||
|
"meaning": {
|
||||||
|
"en": "Purest"
|
||||||
|
},
|
||||||
|
"location": "throat",
|
||||||
|
"petals": 16,
|
||||||
|
"color": "blue",
|
||||||
|
"seed": "Ham",
|
||||||
|
"seedMeaning": {
|
||||||
|
"en": "space"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"third-eye": {
|
||||||
|
"id": "third-eye",
|
||||||
|
"name": {
|
||||||
|
"en": "Third Eye",
|
||||||
|
"sa": "आज्ञा",
|
||||||
|
"roman": "Ajna"
|
||||||
|
},
|
||||||
|
"meaning": {
|
||||||
|
"en": "Command"
|
||||||
|
},
|
||||||
|
"location": "third-eye",
|
||||||
|
"petals": 2,
|
||||||
|
"color": "indigo"
|
||||||
|
},
|
||||||
|
"crown": {
|
||||||
|
"id": "crown",
|
||||||
|
"name": {
|
||||||
|
"en": "Crown",
|
||||||
|
"sa": "सहस्रार",
|
||||||
|
"roman": "Sahasrara"
|
||||||
|
},
|
||||||
|
"meaning": {
|
||||||
|
"en": "Thousand-petaled"
|
||||||
|
},
|
||||||
|
"location": "crown",
|
||||||
|
"petals": 1000,
|
||||||
|
"color": "violet"
|
||||||
|
}
|
||||||
|
}
|
||||||
54
data/decans.json
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"meta": {
|
||||||
|
"notes": "Decans reference sign IDs from signs.json to avoid duplicated sign metadata."
|
||||||
|
},
|
||||||
|
"decans": [
|
||||||
|
{ "id": "aries-1", "signId": "aries", "index": 1, "rulerPlanetId": "mars", "tarotMinorArcana": "2 of Wands" },
|
||||||
|
{ "id": "aries-2", "signId": "aries", "index": 2, "rulerPlanetId": "sol", "tarotMinorArcana": "3 of Wands" },
|
||||||
|
{ "id": "aries-3", "signId": "aries", "index": 3, "rulerPlanetId": "venus", "tarotMinorArcana": "4 of Wands" },
|
||||||
|
|
||||||
|
{ "id": "taurus-1", "signId": "taurus", "index": 1, "rulerPlanetId": "mercury", "tarotMinorArcana": "5 of Pentacles" },
|
||||||
|
{ "id": "taurus-2", "signId": "taurus", "index": 2, "rulerPlanetId": "luna", "tarotMinorArcana": "6 of Pentacles" },
|
||||||
|
{ "id": "taurus-3", "signId": "taurus", "index": 3, "rulerPlanetId": "saturn", "tarotMinorArcana": "7 of Pentacles" },
|
||||||
|
|
||||||
|
{ "id": "gemini-1", "signId": "gemini", "index": 1, "rulerPlanetId": "jupiter", "tarotMinorArcana": "8 of Swords" },
|
||||||
|
{ "id": "gemini-2", "signId": "gemini", "index": 2, "rulerPlanetId": "mars", "tarotMinorArcana": "9 of Swords" },
|
||||||
|
{ "id": "gemini-3", "signId": "gemini", "index": 3, "rulerPlanetId": "sol", "tarotMinorArcana": "10 of Swords" },
|
||||||
|
|
||||||
|
{ "id": "cancer-1", "signId": "cancer", "index": 1, "rulerPlanetId": "venus", "tarotMinorArcana": "2 of Cups" },
|
||||||
|
{ "id": "cancer-2", "signId": "cancer", "index": 2, "rulerPlanetId": "mercury", "tarotMinorArcana": "3 of Cups" },
|
||||||
|
{ "id": "cancer-3", "signId": "cancer", "index": 3, "rulerPlanetId": "luna", "tarotMinorArcana": "4 of Cups" },
|
||||||
|
|
||||||
|
{ "id": "leo-1", "signId": "leo", "index": 1, "rulerPlanetId": "saturn", "tarotMinorArcana": "5 of Wands" },
|
||||||
|
{ "id": "leo-2", "signId": "leo", "index": 2, "rulerPlanetId": "jupiter", "tarotMinorArcana": "6 of Wands" },
|
||||||
|
{ "id": "leo-3", "signId": "leo", "index": 3, "rulerPlanetId": "mars", "tarotMinorArcana": "7 of Wands" },
|
||||||
|
|
||||||
|
{ "id": "virgo-1", "signId": "virgo", "index": 1, "rulerPlanetId": "sol", "tarotMinorArcana": "8 of Pentacles" },
|
||||||
|
{ "id": "virgo-2", "signId": "virgo", "index": 2, "rulerPlanetId": "venus", "tarotMinorArcana": "9 of Pentacles" },
|
||||||
|
{ "id": "virgo-3", "signId": "virgo", "index": 3, "rulerPlanetId": "mercury", "tarotMinorArcana": "10 of Pentacles" },
|
||||||
|
|
||||||
|
{ "id": "libra-1", "signId": "libra", "index": 1, "rulerPlanetId": "luna", "tarotMinorArcana": "2 of Swords" },
|
||||||
|
{ "id": "libra-2", "signId": "libra", "index": 2, "rulerPlanetId": "saturn", "tarotMinorArcana": "3 of Swords" },
|
||||||
|
{ "id": "libra-3", "signId": "libra", "index": 3, "rulerPlanetId": "jupiter", "tarotMinorArcana": "4 of Swords" },
|
||||||
|
|
||||||
|
{ "id": "scorpio-1", "signId": "scorpio", "index": 1, "rulerPlanetId": "mars", "tarotMinorArcana": "5 of Cups" },
|
||||||
|
{ "id": "scorpio-2", "signId": "scorpio", "index": 2, "rulerPlanetId": "sol", "tarotMinorArcana": "6 of Cups" },
|
||||||
|
{ "id": "scorpio-3", "signId": "scorpio", "index": 3, "rulerPlanetId": "venus", "tarotMinorArcana": "7 of Cups" },
|
||||||
|
|
||||||
|
{ "id": "sagittarius-1", "signId": "sagittarius", "index": 1, "rulerPlanetId": "mercury", "tarotMinorArcana": "8 of Wands" },
|
||||||
|
{ "id": "sagittarius-2", "signId": "sagittarius", "index": 2, "rulerPlanetId": "luna", "tarotMinorArcana": "9 of Wands" },
|
||||||
|
{ "id": "sagittarius-3", "signId": "sagittarius", "index": 3, "rulerPlanetId": "saturn", "tarotMinorArcana": "10 of Wands" },
|
||||||
|
|
||||||
|
{ "id": "capricorn-1", "signId": "capricorn", "index": 1, "rulerPlanetId": "jupiter", "tarotMinorArcana": "2 of Pentacles" },
|
||||||
|
{ "id": "capricorn-2", "signId": "capricorn", "index": 2, "rulerPlanetId": "mars", "tarotMinorArcana": "3 of Pentacles" },
|
||||||
|
{ "id": "capricorn-3", "signId": "capricorn", "index": 3, "rulerPlanetId": "sol", "tarotMinorArcana": "4 of Pentacles" },
|
||||||
|
|
||||||
|
{ "id": "aquarius-1", "signId": "aquarius", "index": 1, "rulerPlanetId": "venus", "tarotMinorArcana": "5 of Swords" },
|
||||||
|
{ "id": "aquarius-2", "signId": "aquarius", "index": 2, "rulerPlanetId": "mercury", "tarotMinorArcana": "6 of Swords" },
|
||||||
|
{ "id": "aquarius-3", "signId": "aquarius", "index": 3, "rulerPlanetId": "luna", "tarotMinorArcana": "7 of Swords" },
|
||||||
|
|
||||||
|
{ "id": "pisces-1", "signId": "pisces", "index": 1, "rulerPlanetId": "saturn", "tarotMinorArcana": "8 of Cups" },
|
||||||
|
{ "id": "pisces-2", "signId": "pisces", "index": 2, "rulerPlanetId": "jupiter", "tarotMinorArcana": "9 of Cups" },
|
||||||
|
{ "id": "pisces-3", "signId": "pisces", "index": 3, "rulerPlanetId": "mars", "tarotMinorArcana": "10 of Cups" }
|
||||||
|
]
|
||||||
|
}
|
||||||
22640
data/enochian/dictionary.json
Normal file
212
data/enochian/letters.json
Normal file
@@ -0,0 +1,212 @@
|
|||||||
|
{
|
||||||
|
"A": {
|
||||||
|
"id": "A",
|
||||||
|
"enochian": "A",
|
||||||
|
"title": "Un",
|
||||||
|
"english": "A",
|
||||||
|
"pronounciation": "ah",
|
||||||
|
"planet/element": "taurus",
|
||||||
|
"tarot": "hierophant",
|
||||||
|
"gematria": 6
|
||||||
|
},
|
||||||
|
"B": {
|
||||||
|
"id": "B",
|
||||||
|
"enochian": "B",
|
||||||
|
"title": "Pe",
|
||||||
|
"english": "B",
|
||||||
|
"pronounciation": "beh",
|
||||||
|
"planet/element": "aries",
|
||||||
|
"tarot": "star",
|
||||||
|
"gematria": 5
|
||||||
|
},
|
||||||
|
"C": {
|
||||||
|
"id": "C",
|
||||||
|
"enochian": "C",
|
||||||
|
"title": "Veh",
|
||||||
|
"english": "C,K",
|
||||||
|
"pronounciation": "co",
|
||||||
|
"planet/element": "fire",
|
||||||
|
"tarot": "judgement",
|
||||||
|
"gematria": 300
|
||||||
|
},
|
||||||
|
"D": {
|
||||||
|
"id": "D",
|
||||||
|
"enochian": "D",
|
||||||
|
"title": "Gal",
|
||||||
|
"english": "D",
|
||||||
|
"pronounciation": "deh",
|
||||||
|
"planet/element": "spirit",
|
||||||
|
"tarot": "empress",
|
||||||
|
"gematria": 4
|
||||||
|
},
|
||||||
|
"E": {
|
||||||
|
"id": "E",
|
||||||
|
"enochian": "E",
|
||||||
|
"title": "Graph",
|
||||||
|
"english": "E",
|
||||||
|
"pronounciation": "ee",
|
||||||
|
"planet/element": "virgo",
|
||||||
|
"tarot": "hermit",
|
||||||
|
"gematria": 10
|
||||||
|
},
|
||||||
|
"F": {
|
||||||
|
"id": "F",
|
||||||
|
"enochian": "F",
|
||||||
|
"title": "Orth",
|
||||||
|
"english": "F",
|
||||||
|
"pronounciation": "eff",
|
||||||
|
"planet/element": "Cauda Draonis",
|
||||||
|
"tarot": "juggler",
|
||||||
|
"gematria": 3
|
||||||
|
},
|
||||||
|
"G": {
|
||||||
|
"id": "G",
|
||||||
|
"enochian": "G",
|
||||||
|
"title": "Ged",
|
||||||
|
"english": "G",
|
||||||
|
"pronounciation": "gee",
|
||||||
|
"planet/element": "cancer",
|
||||||
|
"tarot": "chariot",
|
||||||
|
"gematria": 8
|
||||||
|
},
|
||||||
|
"H": {
|
||||||
|
"id": "H",
|
||||||
|
"enochian": "H",
|
||||||
|
"title": "Na-hath",
|
||||||
|
"english": "H",
|
||||||
|
"pronounciation": "heh",
|
||||||
|
"planet/element": "air",
|
||||||
|
"tarot": "fool",
|
||||||
|
"gematria": 1
|
||||||
|
},
|
||||||
|
"I": {
|
||||||
|
"id": "I",
|
||||||
|
"enochian": "I",
|
||||||
|
"title": "Gon",
|
||||||
|
"english": "I,Y,J",
|
||||||
|
"pronounciation": "ee",
|
||||||
|
"planet/element": "sagittarius",
|
||||||
|
"tarot": "temperance",
|
||||||
|
"gematria": 60
|
||||||
|
},
|
||||||
|
"L": {
|
||||||
|
"id": "L",
|
||||||
|
"enochian": "L",
|
||||||
|
"title": "Ur",
|
||||||
|
"english": "L",
|
||||||
|
"pronounciation": "el, leh",
|
||||||
|
"planet/element": "cancer",
|
||||||
|
"tarot": "charit",
|
||||||
|
"gematria": 8
|
||||||
|
},
|
||||||
|
"M": {
|
||||||
|
"id": "M",
|
||||||
|
"enochian": "M",
|
||||||
|
"title": "Tal",
|
||||||
|
"english": "M",
|
||||||
|
"pronounciation": "em",
|
||||||
|
"planet/element": "aquarius",
|
||||||
|
"tarot": "emperor",
|
||||||
|
"gematria": 90
|
||||||
|
},
|
||||||
|
"N": {
|
||||||
|
"id": "N",
|
||||||
|
"enochian": "N",
|
||||||
|
"title": "Drun",
|
||||||
|
"english": "N",
|
||||||
|
"pronounciation": "en",
|
||||||
|
"planet/element": "scorpio",
|
||||||
|
"tarot": "death",
|
||||||
|
"gematria": 50
|
||||||
|
},
|
||||||
|
"O": {
|
||||||
|
"id": "O",
|
||||||
|
"enochian": "O",
|
||||||
|
"title": "Med",
|
||||||
|
"english": "O",
|
||||||
|
"pronounciation": "oh",
|
||||||
|
"planet/element": "libra",
|
||||||
|
"tarot": "justice",
|
||||||
|
"gematria": 30
|
||||||
|
},
|
||||||
|
"P": {
|
||||||
|
"id": "P",
|
||||||
|
"enochian": "P",
|
||||||
|
"title": "Mals",
|
||||||
|
"english": "P",
|
||||||
|
"pronounciation": "peh",
|
||||||
|
"planet/element": "leo",
|
||||||
|
"tarot": "strength",
|
||||||
|
"gematria": 9
|
||||||
|
},
|
||||||
|
"Q": {
|
||||||
|
"id": "Q",
|
||||||
|
"enochian": "Q",
|
||||||
|
"title": "Ger",
|
||||||
|
"english": "Q",
|
||||||
|
"pronounciation": "quo",
|
||||||
|
"planet/element": "water",
|
||||||
|
"tarot": "hanged man",
|
||||||
|
"gematria": 40
|
||||||
|
},
|
||||||
|
"R": {
|
||||||
|
"id": "R",
|
||||||
|
"enochian": "R",
|
||||||
|
"title": "Don",
|
||||||
|
"english": "R",
|
||||||
|
"pronounciation": "reh, ar",
|
||||||
|
"planet/element": "pesces",
|
||||||
|
"tarot": "moon",
|
||||||
|
"gematria": 100
|
||||||
|
},
|
||||||
|
"S": {
|
||||||
|
"id": "S",
|
||||||
|
"enochian": "S",
|
||||||
|
"title": "Fam",
|
||||||
|
"english": "S",
|
||||||
|
"pronounciation": "she, ess",
|
||||||
|
"planet/element": "gemini",
|
||||||
|
"tarot": "lovers",
|
||||||
|
"gematria": 7
|
||||||
|
},
|
||||||
|
"T": {
|
||||||
|
"id": "T",
|
||||||
|
"enochian": "T",
|
||||||
|
"title": "Gisa",
|
||||||
|
"english": "T",
|
||||||
|
"pronounciation": "teh",
|
||||||
|
"planet/element": "leo",
|
||||||
|
"tarot": "strength",
|
||||||
|
"gematria": 9
|
||||||
|
},
|
||||||
|
"V": {
|
||||||
|
"id": "V",
|
||||||
|
"enochian": "V",
|
||||||
|
"title": "Vau",
|
||||||
|
"english": "U,V,W",
|
||||||
|
"pronounciation": "vaa",
|
||||||
|
"planet/element": "capricorn",
|
||||||
|
"tarot": "devil",
|
||||||
|
"gematria": 70
|
||||||
|
},
|
||||||
|
"X": {
|
||||||
|
"id": "X",
|
||||||
|
"enochian": "X",
|
||||||
|
"title": "Pal",
|
||||||
|
"english": "X",
|
||||||
|
"pronounciation": "s, tz",
|
||||||
|
"planet/element": "earth",
|
||||||
|
"tarot": "universe",
|
||||||
|
"gematria": 400
|
||||||
|
},
|
||||||
|
"Z": {
|
||||||
|
"id": "Z",
|
||||||
|
"enochian": "Z",
|
||||||
|
"title": "Ceph",
|
||||||
|
"english": "Z",
|
||||||
|
"pronounciation": "zod, zee",
|
||||||
|
"planet/element": "leo",
|
||||||
|
"tarot": "strength",
|
||||||
|
"gematria": 9
|
||||||
|
}
|
||||||
|
}
|
||||||
376
data/enochian/tablets.json
Normal file
@@ -0,0 +1,376 @@
|
|||||||
|
{
|
||||||
|
"earth": {
|
||||||
|
"id": "earth",
|
||||||
|
"grid": [
|
||||||
|
[
|
||||||
|
"b",
|
||||||
|
"O",
|
||||||
|
"a",
|
||||||
|
"Z",
|
||||||
|
"a",
|
||||||
|
"R",
|
||||||
|
"o",
|
||||||
|
"P",
|
||||||
|
"h",
|
||||||
|
"a",
|
||||||
|
"R",
|
||||||
|
"a"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"v",
|
||||||
|
"N",
|
||||||
|
"n",
|
||||||
|
"a",
|
||||||
|
"x",
|
||||||
|
"o",
|
||||||
|
"P",
|
||||||
|
"S",
|
||||||
|
"o",
|
||||||
|
"n",
|
||||||
|
"d",
|
||||||
|
"n"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"a",
|
||||||
|
"i",
|
||||||
|
"g",
|
||||||
|
"r",
|
||||||
|
"a",
|
||||||
|
"n",
|
||||||
|
"o",
|
||||||
|
"o",
|
||||||
|
"m",
|
||||||
|
"a",
|
||||||
|
"g",
|
||||||
|
"g"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"o",
|
||||||
|
"r",
|
||||||
|
"P",
|
||||||
|
"m",
|
||||||
|
"n",
|
||||||
|
"i",
|
||||||
|
"n",
|
||||||
|
"g",
|
||||||
|
"b",
|
||||||
|
"e",
|
||||||
|
"a",
|
||||||
|
"l"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"r",
|
||||||
|
"s",
|
||||||
|
"O",
|
||||||
|
"n",
|
||||||
|
"i",
|
||||||
|
"z",
|
||||||
|
"i",
|
||||||
|
"r",
|
||||||
|
"l",
|
||||||
|
"e",
|
||||||
|
"m",
|
||||||
|
"v"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"i",
|
||||||
|
"z",
|
||||||
|
"i",
|
||||||
|
"n",
|
||||||
|
"r",
|
||||||
|
"C",
|
||||||
|
"z",
|
||||||
|
"i",
|
||||||
|
"a",
|
||||||
|
"M",
|
||||||
|
"h",
|
||||||
|
"l"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"M",
|
||||||
|
"O",
|
||||||
|
"r",
|
||||||
|
"d",
|
||||||
|
"i",
|
||||||
|
"a",
|
||||||
|
"l",
|
||||||
|
"h",
|
||||||
|
"C",
|
||||||
|
"t",
|
||||||
|
"G",
|
||||||
|
"a"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"O",
|
||||||
|
"C",
|
||||||
|
"a",
|
||||||
|
"n",
|
||||||
|
"c",
|
||||||
|
"h",
|
||||||
|
"i",
|
||||||
|
"a",
|
||||||
|
"s",
|
||||||
|
"o",
|
||||||
|
"m",
|
||||||
|
"t"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"A",
|
||||||
|
"r",
|
||||||
|
"b",
|
||||||
|
"i",
|
||||||
|
"z",
|
||||||
|
"m",
|
||||||
|
"i",
|
||||||
|
"i",
|
||||||
|
"l",
|
||||||
|
"P",
|
||||||
|
"i",
|
||||||
|
"z"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"O",
|
||||||
|
"P",
|
||||||
|
"a",
|
||||||
|
"n",
|
||||||
|
"a",
|
||||||
|
"L",
|
||||||
|
"a",
|
||||||
|
"m",
|
||||||
|
"S",
|
||||||
|
"m",
|
||||||
|
"a",
|
||||||
|
"P"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"d",
|
||||||
|
"O",
|
||||||
|
"l",
|
||||||
|
"o",
|
||||||
|
"P",
|
||||||
|
"i",
|
||||||
|
"n",
|
||||||
|
"i",
|
||||||
|
"a",
|
||||||
|
"n",
|
||||||
|
"b",
|
||||||
|
"a"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"r",
|
||||||
|
"x",
|
||||||
|
"P",
|
||||||
|
"a",
|
||||||
|
"o",
|
||||||
|
"c",
|
||||||
|
"s",
|
||||||
|
"i",
|
||||||
|
"z",
|
||||||
|
"i",
|
||||||
|
"x",
|
||||||
|
"P"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"a",
|
||||||
|
"x",
|
||||||
|
"t",
|
||||||
|
"i",
|
||||||
|
"r",
|
||||||
|
"V",
|
||||||
|
"a",
|
||||||
|
"s",
|
||||||
|
"t",
|
||||||
|
"r",
|
||||||
|
"i",
|
||||||
|
"m"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"air": {
|
||||||
|
"id": "air",
|
||||||
|
"grid": [
|
||||||
|
[
|
||||||
|
"r",
|
||||||
|
"Z",
|
||||||
|
"i",
|
||||||
|
"l",
|
||||||
|
"a",
|
||||||
|
"f",
|
||||||
|
"A",
|
||||||
|
"Y",
|
||||||
|
"t",
|
||||||
|
"l",
|
||||||
|
"P",
|
||||||
|
"a"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"a",
|
||||||
|
"r",
|
||||||
|
"d",
|
||||||
|
"Z",
|
||||||
|
"a",
|
||||||
|
"i",
|
||||||
|
"d",
|
||||||
|
"P",
|
||||||
|
"a",
|
||||||
|
"L",
|
||||||
|
"a",
|
||||||
|
"m"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"c",
|
||||||
|
"z",
|
||||||
|
"o",
|
||||||
|
"n",
|
||||||
|
"s",
|
||||||
|
"a",
|
||||||
|
"r",
|
||||||
|
"o",
|
||||||
|
"Y",
|
||||||
|
"a",
|
||||||
|
"v",
|
||||||
|
"b"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"T",
|
||||||
|
"o",
|
||||||
|
"i",
|
||||||
|
"T",
|
||||||
|
"t",
|
||||||
|
"z",
|
||||||
|
"o",
|
||||||
|
"P",
|
||||||
|
"a",
|
||||||
|
"c",
|
||||||
|
"o",
|
||||||
|
"C"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"S",
|
||||||
|
"i",
|
||||||
|
"g",
|
||||||
|
"a",
|
||||||
|
"s",
|
||||||
|
"o",
|
||||||
|
"m",
|
||||||
|
"r",
|
||||||
|
"b",
|
||||||
|
"z",
|
||||||
|
"n",
|
||||||
|
"h"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"f",
|
||||||
|
"m",
|
||||||
|
"o",
|
||||||
|
"n",
|
||||||
|
"d",
|
||||||
|
"a",
|
||||||
|
"T",
|
||||||
|
"d",
|
||||||
|
"i",
|
||||||
|
"a",
|
||||||
|
"r",
|
||||||
|
"i"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"o",
|
||||||
|
"r",
|
||||||
|
"o",
|
||||||
|
"i",
|
||||||
|
"b",
|
||||||
|
"A",
|
||||||
|
"h",
|
||||||
|
"a",
|
||||||
|
"o",
|
||||||
|
"z",
|
||||||
|
"P",
|
||||||
|
"i"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"t",
|
||||||
|
"N",
|
||||||
|
"a",
|
||||||
|
"b",
|
||||||
|
"r",
|
||||||
|
"V",
|
||||||
|
"i",
|
||||||
|
"x",
|
||||||
|
"g",
|
||||||
|
"a",
|
||||||
|
"s",
|
||||||
|
"d"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"O",
|
||||||
|
"i",
|
||||||
|
"i",
|
||||||
|
"i",
|
||||||
|
"t",
|
||||||
|
"T",
|
||||||
|
"P",
|
||||||
|
"a",
|
||||||
|
"l",
|
||||||
|
"O",
|
||||||
|
"a",
|
||||||
|
"i"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"A",
|
||||||
|
"b",
|
||||||
|
"a",
|
||||||
|
"m",
|
||||||
|
"o",
|
||||||
|
"o",
|
||||||
|
"o",
|
||||||
|
"a",
|
||||||
|
"C",
|
||||||
|
"v",
|
||||||
|
"c",
|
||||||
|
"a"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"N",
|
||||||
|
"a",
|
||||||
|
"o",
|
||||||
|
"c",
|
||||||
|
"O",
|
||||||
|
"T",
|
||||||
|
"t",
|
||||||
|
"n",
|
||||||
|
"P",
|
||||||
|
"r",
|
||||||
|
"n",
|
||||||
|
"T"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"o",
|
||||||
|
"c",
|
||||||
|
"a",
|
||||||
|
"n",
|
||||||
|
"m",
|
||||||
|
"a",
|
||||||
|
"g",
|
||||||
|
"o",
|
||||||
|
"t",
|
||||||
|
"r",
|
||||||
|
"o",
|
||||||
|
"i"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"S",
|
||||||
|
"h",
|
||||||
|
"i",
|
||||||
|
"a",
|
||||||
|
"l",
|
||||||
|
"r",
|
||||||
|
"a",
|
||||||
|
"P",
|
||||||
|
"m",
|
||||||
|
"z",
|
||||||
|
"o",
|
||||||
|
"x"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
14
data/gd/degrees.json
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"1st": {
|
||||||
|
"id": "1st",
|
||||||
|
"pillarId": "severity"
|
||||||
|
},
|
||||||
|
"2nd": {
|
||||||
|
"id": "2nd",
|
||||||
|
"pillarId": "mercy"
|
||||||
|
},
|
||||||
|
"3rd": {
|
||||||
|
"id": "3rd",
|
||||||
|
"pillarId": "middle"
|
||||||
|
}
|
||||||
|
}
|
||||||
115
data/gd/grades.json
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
{
|
||||||
|
"0=0": {
|
||||||
|
"id": "0=0",
|
||||||
|
"name": "Neophyte",
|
||||||
|
"orderId": "1st",
|
||||||
|
"degreeId": "1st",
|
||||||
|
"next": "1=10"
|
||||||
|
},
|
||||||
|
"1=10": {
|
||||||
|
"id": "1=10",
|
||||||
|
"name": "Zelator",
|
||||||
|
"elementId": "earth",
|
||||||
|
"planetId": "earth",
|
||||||
|
"orderId": "1st",
|
||||||
|
"degreeId": "1st",
|
||||||
|
"sephirahId": "malchut",
|
||||||
|
"prev": "0=0",
|
||||||
|
"next": "2=9"
|
||||||
|
},
|
||||||
|
"2=9": {
|
||||||
|
"id": "2=9",
|
||||||
|
"name": "Theoricus",
|
||||||
|
"elementId": "air",
|
||||||
|
"planetId": "luna",
|
||||||
|
"orderId": "1st",
|
||||||
|
"degreeId": "1st",
|
||||||
|
"sephirahId": "yesod",
|
||||||
|
"prev": "1=10",
|
||||||
|
"next": "3=8"
|
||||||
|
},
|
||||||
|
"3=8": {
|
||||||
|
"id": "3=8",
|
||||||
|
"name": "Practicus",
|
||||||
|
"elementId": "water",
|
||||||
|
"planetId": "mercury",
|
||||||
|
"orderId": "1st",
|
||||||
|
"degreeId": "1st",
|
||||||
|
"sephirahId": "hod",
|
||||||
|
"prev": "2=9",
|
||||||
|
"next": "4=7"
|
||||||
|
},
|
||||||
|
"4=7": {
|
||||||
|
"id": "4=7",
|
||||||
|
"name": "Philosophus",
|
||||||
|
"elementId": "fire",
|
||||||
|
"planetId": "venus",
|
||||||
|
"orderId": "1st",
|
||||||
|
"degreeId": "1st",
|
||||||
|
"sephirahId": "netzach",
|
||||||
|
"prev": "3=8",
|
||||||
|
"next": "portal"
|
||||||
|
},
|
||||||
|
"portal": {
|
||||||
|
"id": "portal",
|
||||||
|
"name": "Portal",
|
||||||
|
"elementId": "spirit",
|
||||||
|
"degreeId": "2nd",
|
||||||
|
"prev": "4=7",
|
||||||
|
"next": "5=6"
|
||||||
|
},
|
||||||
|
"5=6": {
|
||||||
|
"id": "5=6",
|
||||||
|
"name": "Adeptus Minor",
|
||||||
|
"planetId": "sol",
|
||||||
|
"orderId": "2nd",
|
||||||
|
"degreeId": "3rd",
|
||||||
|
"sephirahId": "tiferet",
|
||||||
|
"prev": "portal",
|
||||||
|
"next": "6=5"
|
||||||
|
},
|
||||||
|
"6=5": {
|
||||||
|
"id": "6=5",
|
||||||
|
"name": "Adeptus Major",
|
||||||
|
"planetId": "mars",
|
||||||
|
"orderId": "2nd",
|
||||||
|
"degreeId": "3rd",
|
||||||
|
"sephirahId": "gevurah",
|
||||||
|
"prev": "5=6",
|
||||||
|
"next": "7=4"
|
||||||
|
},
|
||||||
|
"7=4": {
|
||||||
|
"id": "7=4",
|
||||||
|
"name": "Adeptus Exemptus",
|
||||||
|
"planetId": "jupiter",
|
||||||
|
"orderId": "2nd",
|
||||||
|
"degreeId": "3rd",
|
||||||
|
"sephirahId": "hesed",
|
||||||
|
"prev": "6=5",
|
||||||
|
"next": "8=3"
|
||||||
|
},
|
||||||
|
"8=3": {
|
||||||
|
"id": "8=3",
|
||||||
|
"name": "Magister Templi",
|
||||||
|
"planetId": "saturn",
|
||||||
|
"orderId": "3rd",
|
||||||
|
"sephirahId": "binah",
|
||||||
|
"prev": "7=4",
|
||||||
|
"next": "9=2"
|
||||||
|
},
|
||||||
|
"9=2": {
|
||||||
|
"id": "9=2",
|
||||||
|
"name": "Magus",
|
||||||
|
"orderId": "3rd",
|
||||||
|
"sephirahId": "chochmah",
|
||||||
|
"prev": "8=3",
|
||||||
|
"next": "10=1"
|
||||||
|
},
|
||||||
|
"10=1": {
|
||||||
|
"id": "10=1",
|
||||||
|
"name": "Ipsissimus",
|
||||||
|
"orderId": "3rd",
|
||||||
|
"sephirahId": "keter",
|
||||||
|
"prev": "9=2"
|
||||||
|
}
|
||||||
|
}
|
||||||
33
data/gematria-ciphers.json
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
{
|
||||||
|
"meta": {
|
||||||
|
"description": "Positional gematria ciphers based on a single universal alphabet.",
|
||||||
|
"notes": "All ciphers map A-Z positions (1-26) to numeric values."
|
||||||
|
},
|
||||||
|
"baseAlphabet": "abcdefghijklmnopqrstuvwxyz",
|
||||||
|
"ciphers": [
|
||||||
|
{
|
||||||
|
"id": "simple-ordinal",
|
||||||
|
"name": "Simple Ordinal",
|
||||||
|
"description": "A=1 ... Z=26",
|
||||||
|
"values": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "full-reduction",
|
||||||
|
"name": "Full Reduction",
|
||||||
|
"description": "A=1 ... I=9, J=1 ... Z=8",
|
||||||
|
"values": [1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "reverse-ordinal",
|
||||||
|
"name": "Reverse Ordinal",
|
||||||
|
"description": "A=26 ... Z=1",
|
||||||
|
"values": [26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "ordinal-plus-9",
|
||||||
|
"name": "Ordinal +9",
|
||||||
|
"description": "A=10 ... Z=35 (e.g. 11th position = 20)",
|
||||||
|
"values": [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
75
data/geomancy/houses.json
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
[
|
||||||
|
{},
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"meaning": {
|
||||||
|
"en": "Personality of the Querent, his life, health, habits, behavior and other personal characteristics."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"meaning": {
|
||||||
|
"en": "Money, property, finances, possible theft through negligence or loss."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 3,
|
||||||
|
"meaning": {
|
||||||
|
"en": "Communication, relatives by blood, letters, news, short journeys, writing, other pursuits associated with Mercury."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 4,
|
||||||
|
"meaning": {
|
||||||
|
"en": "Home, inheritance, possessions, hidden treasure, environment, retirement, the conclusion of any matter. Information about theft or thieves."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 5,
|
||||||
|
"meaning": {
|
||||||
|
"en": "Women, luxury, drinking, procreation, creation, artistic work. Gambling and speculation."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 6,
|
||||||
|
"meaning": {
|
||||||
|
"en": "Employees, sickness, which body parts are most likely to suffer illness or injury. Domestic animals and close relatives other than immediate family."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 7,
|
||||||
|
"meaning": {
|
||||||
|
"en": "Love, marriage, prostitution, partnerships. Public enemies, lawsuits, war opponents, thieves and dishonor."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 8,
|
||||||
|
"meaning": {
|
||||||
|
"en": "Death, Wills, legacies. Poverty."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 9,
|
||||||
|
"meaning": {
|
||||||
|
"en": "Long journeys, relationships with foreigners, science, the church, art, religion dreams and divinations."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 10,
|
||||||
|
"meaning": {
|
||||||
|
"en": "Fame, reputation, honor, mother, trade authority."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 11,
|
||||||
|
"meaning": {
|
||||||
|
"en": "Friends, social contacts, altruistic organizations."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 12,
|
||||||
|
"meaning": {
|
||||||
|
"en": "Sorrow, hospitals, intrigue, prisons, restrictions, unseen dangers, fears."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
990
data/geomancy/tetragrams.json
Normal file
@@ -0,0 +1,990 @@
|
|||||||
|
{
|
||||||
|
"acquisitio": {
|
||||||
|
"id": "acquisitio",
|
||||||
|
"rows": [
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"title": {
|
||||||
|
"en": "Acquisitio"
|
||||||
|
},
|
||||||
|
"translation": {
|
||||||
|
"en": "gain"
|
||||||
|
},
|
||||||
|
"meaning": {
|
||||||
|
"en": "Generally good for profit and gain."
|
||||||
|
},
|
||||||
|
"meanings": [
|
||||||
|
{},
|
||||||
|
{
|
||||||
|
"en": "Happy, success in all things."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Very prosperous."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Favor and riches."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good fortune and success."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good success."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good - especially if it agrees with the 5th."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Reasonably good."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Rather good, but not very. The sick shall die."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good in all demands."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good in suits."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good in all."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable, pain and loss."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"zodiacId": "sagittarius",
|
||||||
|
"elementId": "fire",
|
||||||
|
"planetId": "jupiter",
|
||||||
|
"rulerId": "hismael"
|
||||||
|
},
|
||||||
|
"albus": {
|
||||||
|
"id": "albus",
|
||||||
|
"rows": [
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"title": {
|
||||||
|
"en": "Albus"
|
||||||
|
},
|
||||||
|
"translation": {
|
||||||
|
"en": "white"
|
||||||
|
},
|
||||||
|
"meaning": {
|
||||||
|
"en": "Good for profit and for entering into a place or undertaking."
|
||||||
|
},
|
||||||
|
"meanings": [
|
||||||
|
{},
|
||||||
|
{
|
||||||
|
"en": "Good for marriage. Mercurial. Peace."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good in all."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Very good."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Very good except in War."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good in all things."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good except in all things."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "A messenger brings a letter."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Excellent in all."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Very good."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Marvelously good."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"zodiacId": "gemini",
|
||||||
|
"elementId": "air",
|
||||||
|
"planetId": "mercury",
|
||||||
|
"rulerId": "taphtatharath"
|
||||||
|
},
|
||||||
|
"amissio": {
|
||||||
|
"id": "amissio",
|
||||||
|
"title": {
|
||||||
|
"en": "Amissio"
|
||||||
|
},
|
||||||
|
"rows": [
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"translation": {
|
||||||
|
"en": "loss"
|
||||||
|
},
|
||||||
|
"meaning": {
|
||||||
|
"en": "Good for loss of substance and sometimes for love; but very bad for gain."
|
||||||
|
},
|
||||||
|
"meanings": [
|
||||||
|
{},
|
||||||
|
{
|
||||||
|
"en": "Ill in all things but for prisoners."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Very Ill for money, but good for love."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Ill end-except for quarrels."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Ill in all."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable except for agriculture."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Rather unfavourable for love."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Very good for love, otherwise unfavourable."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Excellent in all questions."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable in all things."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable except for favor with women."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good for love, otherwise bad."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable in all things."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"zodiacId": "taurus",
|
||||||
|
"elementId": "earth",
|
||||||
|
"planetId": "venus",
|
||||||
|
"rulerId": "kedemel"
|
||||||
|
},
|
||||||
|
"caput_draconis": {
|
||||||
|
"id": "caput_draconis",
|
||||||
|
"rows": [
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"title": {
|
||||||
|
"en": "Caput Draconis"
|
||||||
|
},
|
||||||
|
"translation": {
|
||||||
|
"en": "dragon's head"
|
||||||
|
},
|
||||||
|
"meaning": {
|
||||||
|
"en": "Good with good; evil with evil. Gives good issue for gain."
|
||||||
|
},
|
||||||
|
"meanings": [
|
||||||
|
{},
|
||||||
|
{
|
||||||
|
"en": "Good in all things."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Very good."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good save in war."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Very good."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good for immorality only."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good especially for peace."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Very good."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good in all."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good for the church and ecclesiastical gain."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Not very good."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"zodiacId": null,
|
||||||
|
"elementId": "earth",
|
||||||
|
"planetId": [
|
||||||
|
"venus",
|
||||||
|
"jupiter"
|
||||||
|
],
|
||||||
|
"rulerId": [
|
||||||
|
"kedemel",
|
||||||
|
"hismael"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"carcer": {
|
||||||
|
"id": "carcer",
|
||||||
|
"rows": [
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"title": {
|
||||||
|
"en": "Carcer"
|
||||||
|
},
|
||||||
|
"translation": {
|
||||||
|
"en": "prison"
|
||||||
|
},
|
||||||
|
"meaning": {
|
||||||
|
"en": "Generally unfavourable. Delay, binding, bar, restriction."
|
||||||
|
},
|
||||||
|
"meanings": [
|
||||||
|
{},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable except to fortify a place."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good in Saturnine questions; else unfavourable."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good only for melancholy."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Receive a letter within three days. Unfavourable."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Very unfavourable."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Very unfavourable."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable in all."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable save in hldden treasure."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Much anxiety."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Rather good."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"zodiacId": "capricorn",
|
||||||
|
"elementId": "earth",
|
||||||
|
"planetId": "saturn",
|
||||||
|
"rulerId": "zazel"
|
||||||
|
},
|
||||||
|
"cauda_draconis": {
|
||||||
|
"id": "cauda_draconis",
|
||||||
|
"title": {
|
||||||
|
"en": "Cauda Draconis"
|
||||||
|
},
|
||||||
|
"rows": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"translation": {
|
||||||
|
"en": "dragon's tail"
|
||||||
|
},
|
||||||
|
"meaning": {
|
||||||
|
"en": "Good with evil, and evil with good. Good for loss, and for passing out of an affair."
|
||||||
|
},
|
||||||
|
"meanings": [
|
||||||
|
{},
|
||||||
|
{
|
||||||
|
"en": "Destroy figure if it falls here! Makes judgment worthless."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Very unfavourable."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable in all."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good especially for conclusion of the matter."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Very unfavourable."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Rather good."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable, war, and fire."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "No good, except for magic."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good for science only. Bad for journeys. Robbery."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable save in works of fire."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable save for favors."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Rather good."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"zodiacId": null,
|
||||||
|
"elementId": "fire",
|
||||||
|
"planetId": [
|
||||||
|
"saturn",
|
||||||
|
"mars"
|
||||||
|
],
|
||||||
|
"rulerId": [
|
||||||
|
"zazel",
|
||||||
|
"bartzabel"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"conjunctio": {
|
||||||
|
"id": "conjunctio",
|
||||||
|
"rows": [
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"title": {
|
||||||
|
"en": "Conjunctio"
|
||||||
|
},
|
||||||
|
"translation": {
|
||||||
|
"en": "conjunction"
|
||||||
|
},
|
||||||
|
"meaning": {
|
||||||
|
"en": "Good with good, or evil with evil. Recovery from things lost."
|
||||||
|
},
|
||||||
|
"meanings": [
|
||||||
|
{},
|
||||||
|
{
|
||||||
|
"en": "Good with good, evil with evil."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Commonly good."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good fortune."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good save for health; see the eighth."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Medium."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good for immorality only."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Rather good."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable, death."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Medium good."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "For love, good. For sickness, unfavourable."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good in all."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Medium. Bad for prisoners"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"zodiacId": "virgo",
|
||||||
|
"elementId": "earth",
|
||||||
|
"planetId": "mercury",
|
||||||
|
"rulerId": "taphthartharath"
|
||||||
|
},
|
||||||
|
"fortuna_major": {
|
||||||
|
"id": "fortuna_major",
|
||||||
|
"rows": [
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"title": {
|
||||||
|
"en": "Fortuna Major"
|
||||||
|
},
|
||||||
|
"translation": {
|
||||||
|
"en": "greater fortune"
|
||||||
|
},
|
||||||
|
"meaning": {
|
||||||
|
"en": "Good for gain in all things where a person has hopes to win."
|
||||||
|
},
|
||||||
|
"meanings": [
|
||||||
|
{},
|
||||||
|
{
|
||||||
|
"en": "Good save in secrecy."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good except in sad things."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good in all."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good in all, but melancholy."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Very good in all things."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Very good except for debauchery."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good in all."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Moderately good."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Very good."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Exceedingly good. Go to superiors."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Very good."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good in all."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"zodiacId": "leo",
|
||||||
|
"elementId": "fire",
|
||||||
|
"planetId": "sol",
|
||||||
|
"rulerId": "sorath"
|
||||||
|
},
|
||||||
|
"fortuna_minor": {
|
||||||
|
"id": "fortuna_minor",
|
||||||
|
"rows": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"title": {
|
||||||
|
"en": "Fortuna Minor"
|
||||||
|
},
|
||||||
|
"translation": {
|
||||||
|
"en": "lesser fortune"
|
||||||
|
},
|
||||||
|
"meaning": {
|
||||||
|
"en": "Good in any manner in which a person wishes to proceed quickly."
|
||||||
|
},
|
||||||
|
"meanings": [
|
||||||
|
{},
|
||||||
|
{
|
||||||
|
"en": "Speed in victory and in love, but choleric."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Very good."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good - but wrathful."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Haste; rather unfavourable except for peace."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good in all things."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Medium in all."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable except for war or love."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable generally."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good, but choleric."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good, except for peace."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good, especially for love."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good, except for alternation, or for serving another."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"zodiacId": "leo",
|
||||||
|
"elementId": "fire",
|
||||||
|
"planetId": "sol",
|
||||||
|
"rulerId": "sorath"
|
||||||
|
},
|
||||||
|
"laetitia": {
|
||||||
|
"id": "laetitia",
|
||||||
|
"rows": [
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"title": {
|
||||||
|
"en": "Laetitia"
|
||||||
|
},
|
||||||
|
"translation": {
|
||||||
|
"en": "joy"
|
||||||
|
},
|
||||||
|
"meaning": {
|
||||||
|
"en": "Good for joy, present or to come."
|
||||||
|
},
|
||||||
|
"meanings": [
|
||||||
|
{},
|
||||||
|
{
|
||||||
|
"en": "Good, except in war."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Sickly."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Ill."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Mainly good."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Excellently good."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable generally."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Indifferent."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable generally."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Very good."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good, rather in war than in peace."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good in all."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable generally."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"zodiacId": "pisces",
|
||||||
|
"elementId": "water",
|
||||||
|
"planetId": "jupiter",
|
||||||
|
"rulerId": "hismael"
|
||||||
|
},
|
||||||
|
"populus": {
|
||||||
|
"id": "populus",
|
||||||
|
"rows": [
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"title": {
|
||||||
|
"en": "Populus"
|
||||||
|
},
|
||||||
|
"translation": {
|
||||||
|
"en": "people"
|
||||||
|
},
|
||||||
|
"meaning": {
|
||||||
|
"en": "Sometimes good and sometimes bad; good with good, and evil with evil."
|
||||||
|
},
|
||||||
|
"meanings": [
|
||||||
|
{},
|
||||||
|
{
|
||||||
|
"en": "Good in marriages."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Medium good."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Rather good than bad."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good in all but love."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good in most things."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "In war good; else medium."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Look for letters."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good in all."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Very unfavourable."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"zodiacId": "cancer",
|
||||||
|
"elementId": "water",
|
||||||
|
"rulerId": "chasmodai",
|
||||||
|
"planetId": "luna"
|
||||||
|
},
|
||||||
|
"puella": {
|
||||||
|
"id": "puella",
|
||||||
|
"rows": [
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"title": {
|
||||||
|
"en": "Puella"
|
||||||
|
},
|
||||||
|
"translation": {
|
||||||
|
"en": "girl"
|
||||||
|
},
|
||||||
|
"meaning": {
|
||||||
|
"en": "Good in all demands, especially in those relating to women."
|
||||||
|
},
|
||||||
|
"meanings": [
|
||||||
|
{},
|
||||||
|
{
|
||||||
|
"en": "Good except in war."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Very good."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Indifferent."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Very good, but notice the aspects."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good, but especially for debauchery."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good except for war."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good for music. Otherwise only medium."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good for peace."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good, and love ofladies."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good in all."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"zodiacId": "libra",
|
||||||
|
"elementId": "air",
|
||||||
|
"planetId": "venus",
|
||||||
|
"rulerId": "kedemel"
|
||||||
|
},
|
||||||
|
"puer": {
|
||||||
|
"id": "puer",
|
||||||
|
"rows": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"title": {
|
||||||
|
"en": "Puer"
|
||||||
|
},
|
||||||
|
"translation": {
|
||||||
|
"en": "boy"
|
||||||
|
},
|
||||||
|
"meaning": {
|
||||||
|
"en": "Unfavourable in most demands, except in those relating to War or Love."
|
||||||
|
},
|
||||||
|
"meanings": [
|
||||||
|
{},
|
||||||
|
{
|
||||||
|
"en": "Indifferent. Best in War."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good, but with trouble"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good fortune."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable, except in war and love."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Medium good."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Medium."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable, save in War."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable, save for love."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable except for War."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Rather unfavourable. But good for love and War. Most other things medium."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Medium; good favor."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Very good in all."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"elementId": "fire",
|
||||||
|
"zodiacId": "aries",
|
||||||
|
"planetId": "mars",
|
||||||
|
"rulerId": "bartzabel"
|
||||||
|
},
|
||||||
|
"rubeus": {
|
||||||
|
"id": "rubeus",
|
||||||
|
"rows": [
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"title": {
|
||||||
|
"en": "Rubeus"
|
||||||
|
},
|
||||||
|
"translation": {
|
||||||
|
"en": "red"
|
||||||
|
},
|
||||||
|
"meaning": {
|
||||||
|
"en": "Unfavourable in all that is good and Good in all that is Unfavourable."
|
||||||
|
},
|
||||||
|
"meanings": [
|
||||||
|
{},
|
||||||
|
{
|
||||||
|
"en": "Destroy the figure if it falls here! It makes the judgment worthless."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable in all demands."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable except to let blood."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable except in War and Fire."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable save for love, and sowing seed."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable except for bloodletting."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable except for war and fire."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Very Unfavourable."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Dissolute. Love, fire."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable, except to let blood."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable in all things."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"zodiacId": "scorpio",
|
||||||
|
"elementId": "water",
|
||||||
|
"planetId": "mars",
|
||||||
|
"rulerId": "bartzabel"
|
||||||
|
},
|
||||||
|
"tristitia": {
|
||||||
|
"id": "tristitia",
|
||||||
|
"rows": [
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"title": {
|
||||||
|
"en": "Tristitia"
|
||||||
|
},
|
||||||
|
"translation": {
|
||||||
|
"en": "sorrow"
|
||||||
|
},
|
||||||
|
"meaning": {
|
||||||
|
"en": "Unfavourable in almost all things."
|
||||||
|
},
|
||||||
|
"meanings": [
|
||||||
|
{},
|
||||||
|
{
|
||||||
|
"en": "Medium, but good for treasure and fortifying."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Medium, but good to fortify."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable in all."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable in all."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Very Unfavourable."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable, except for debauchery."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable for inheritance and magic only."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable, but in secrecy good."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable except for magic."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable except for fortifications."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable in all."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable. But good for magic and treasure."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"zodiacId": "aquarius",
|
||||||
|
"elementId": "air",
|
||||||
|
"planetId": "saturn",
|
||||||
|
"rulerId": "zazel"
|
||||||
|
},
|
||||||
|
"via": {
|
||||||
|
"id": "via",
|
||||||
|
"rows": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"title": {
|
||||||
|
"en": "Via"
|
||||||
|
},
|
||||||
|
"translation": {
|
||||||
|
"en": "way"
|
||||||
|
},
|
||||||
|
"meaning": {
|
||||||
|
"en": "Injurious to the goodness of other figures generally, but good for journeys and voyages."
|
||||||
|
},
|
||||||
|
"meanings": [
|
||||||
|
{},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable except for prison."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Indifferent."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Very good in all."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good in all save love."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Voyages good."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Rather good, especially for voyages."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Unfavourable."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Indifferent. good for journeys."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Good."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Very good."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"en": "Excellent."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"zodiacId": "cancer",
|
||||||
|
"elementId": "water",
|
||||||
|
"planetId": "luna",
|
||||||
|
"rulerId": "chasmodai"
|
||||||
|
}
|
||||||
|
}
|
||||||
578
data/gods.json
Normal file
@@ -0,0 +1,578 @@
|
|||||||
|
{
|
||||||
|
"source": "Liber 777 by Aleister Crowley / adamblvck/open_777 dataset",
|
||||||
|
"description": "Divine correspondences mapped to the 32 paths of the Kabbalistic Tree of Life. Rows 1–10 are the ten Sephiroth; rows 11–32 are the 22 Hebrew letter paths. Row 0 is Ain Soph Aur (the limitless light beyond the Tree).",
|
||||||
|
"pantheons": [
|
||||||
|
{ "id": "greek", "label": "Greek Gods", "emoji": "🏛️", "source": "Liber 777, Col. XXXIV" },
|
||||||
|
{ "id": "roman", "label": "Roman Gods", "emoji": "🦅", "source": "Liber 777, Col. XXXV" },
|
||||||
|
{ "id": "egyptian", "label": "Egyptian Gods", "emoji": "𓂀", "source": "Liber 777, Cols. XIX (Selection) & XX (Practical)" },
|
||||||
|
{ "id": "elohim", "label": "God Names", "emoji": "✡️", "source": "Liber 777, Col. V — God Names in Assiah (Sephiroth)" },
|
||||||
|
{ "id": "archangels", "label": "Archangels", "emoji": "☀️", "source": "Liber 777, Col. XCIX — Archangels of Assiah (Sephiroth)" },
|
||||||
|
{ "id": "angelicOrders", "label": "Angelic Orders", "emoji": "✨", "source": "Liber 777, Col. C — Angels of Assiah (Sephiroth)" }
|
||||||
|
],
|
||||||
|
"byPath": {
|
||||||
|
"0": {
|
||||||
|
"type": "special",
|
||||||
|
"label": "Ain Soph Aur",
|
||||||
|
"description": "The Limitless Light — three veils of negative existence beyond the Tree of Life",
|
||||||
|
"greek": "Pan",
|
||||||
|
"roman": null,
|
||||||
|
"egyptian": "Harpocrates, Amoun, Nuith",
|
||||||
|
"egyptianPractical": "Heru-pa-Kraath",
|
||||||
|
"hindu": "AUM",
|
||||||
|
"elohim": null,
|
||||||
|
"archangel": null,
|
||||||
|
"angelicOrder": null
|
||||||
|
},
|
||||||
|
"1": {
|
||||||
|
"type": "sephirah",
|
||||||
|
"no": 1,
|
||||||
|
"name": "Kether",
|
||||||
|
"meaning": "The Crown",
|
||||||
|
"greek": "Zeus, Ikarus",
|
||||||
|
"roman": "Jupiter",
|
||||||
|
"egyptian": "Ptah, Asar un Nefer, Hadith",
|
||||||
|
"egyptianPractical": "Ptah",
|
||||||
|
"scandinavian": "Wotan",
|
||||||
|
"hindu": "Parabrahm",
|
||||||
|
"elohim": { "hebrew": "אהיה", "transliteration": "Eheieh", "meaning": "I Am / Being" },
|
||||||
|
"archangel": { "hebrew": "מטטרון", "transliteration": "Metatron" },
|
||||||
|
"angelicOrder": { "hebrew": "חיות הקדש", "transliteration": "Chaioth ha-Qodesh", "meaning": "Holy Living Creatures" }
|
||||||
|
},
|
||||||
|
"2": {
|
||||||
|
"type": "sephirah",
|
||||||
|
"no": 2,
|
||||||
|
"name": "Chokmah",
|
||||||
|
"meaning": "Wisdom",
|
||||||
|
"greek": "Athena, Uranus",
|
||||||
|
"roman": "Janus",
|
||||||
|
"egyptian": "Amoun, Thoth, Nuith",
|
||||||
|
"egyptianPractical": "Isis (as Wisdom)",
|
||||||
|
"scandinavian": "Odin",
|
||||||
|
"hindu": "Shiva, Vishnu, Akasa, Lingam",
|
||||||
|
"elohim": { "hebrew": "יה", "transliteration": "Yah", "meaning": "The Lord" },
|
||||||
|
"archangel": { "hebrew": "רציאל", "transliteration": "Ratziel" },
|
||||||
|
"angelicOrder": { "hebrew": "אופנים", "transliteration": "Auphanim", "meaning": "Wheels" }
|
||||||
|
},
|
||||||
|
"3": {
|
||||||
|
"type": "sephirah",
|
||||||
|
"no": 3,
|
||||||
|
"name": "Binah",
|
||||||
|
"meaning": "Understanding",
|
||||||
|
"greek": "Cybele, Demeter, Rhea, Heré, Kronos, Psyché",
|
||||||
|
"roman": "Juno, Cybele, Hecate",
|
||||||
|
"egyptian": "Maut, Isis, Nephthys",
|
||||||
|
"egyptianPractical": "Nephthys",
|
||||||
|
"scandinavian": "Frigga",
|
||||||
|
"hindu": "Bhavani, Prana, Yoni",
|
||||||
|
"elohim": { "hebrew": "יהוה אלהים", "transliteration": "YHVH Elohim", "meaning": "The Lord God" },
|
||||||
|
"archangel": { "hebrew": "צאפקיאל", "transliteration": "Tzaphkiel" },
|
||||||
|
"angelicOrder": { "hebrew": "אראלים", "transliteration": "Aralim", "meaning": "Strong and Mighty Ones / Thrones" }
|
||||||
|
},
|
||||||
|
"4": {
|
||||||
|
"type": "sephirah",
|
||||||
|
"no": 4,
|
||||||
|
"name": "Chesed",
|
||||||
|
"meaning": "Mercy",
|
||||||
|
"greek": "Poseidon, Zeus",
|
||||||
|
"roman": "Jupiter",
|
||||||
|
"egyptian": "Amoun, Isis",
|
||||||
|
"egyptianPractical": "Amoun",
|
||||||
|
"scandinavian": "Wotan",
|
||||||
|
"hindu": "Indra, Brahma",
|
||||||
|
"elohim": { "hebrew": "אל", "transliteration": "El", "meaning": "God (the Strong)" },
|
||||||
|
"archangel": { "hebrew": "צדקיאל", "transliteration": "Tzadkiel" },
|
||||||
|
"angelicOrder": { "hebrew": "חשמלים", "transliteration": "Chashmalim", "meaning": "Brilliant / Shining Ones" }
|
||||||
|
},
|
||||||
|
"5": {
|
||||||
|
"type": "sephirah",
|
||||||
|
"no": 5,
|
||||||
|
"name": "Geburah",
|
||||||
|
"meaning": "Strength / Severity",
|
||||||
|
"greek": "Ares, Hades",
|
||||||
|
"roman": "Mars",
|
||||||
|
"egyptian": "Horus, Nephthys",
|
||||||
|
"egyptianPractical": "Horus",
|
||||||
|
"scandinavian": "Thor",
|
||||||
|
"hindu": "Vishnu, Varruna-Avatar",
|
||||||
|
"elohim": { "hebrew": "אלהים גבור", "transliteration": "Elohim Gibor", "meaning": "Almighty God" },
|
||||||
|
"archangel": { "hebrew": "כמאל", "transliteration": "Kamael" },
|
||||||
|
"angelicOrder": { "hebrew": "שרפים", "transliteration": "Seraphim", "meaning": "Fiery Serpents" }
|
||||||
|
},
|
||||||
|
"6": {
|
||||||
|
"type": "sephirah",
|
||||||
|
"no": 6,
|
||||||
|
"name": "Tiphareth",
|
||||||
|
"meaning": "Beauty",
|
||||||
|
"greek": "Ikarus, Apollo, Adonis, Dionysis, Bacchus",
|
||||||
|
"roman": "Apollo, Bacchus, Aurora",
|
||||||
|
"egyptian": "Asar, Ra",
|
||||||
|
"egyptianPractical": "Ra",
|
||||||
|
"scandinavian": null,
|
||||||
|
"hindu": "Vishnu-Hari-Krishna-Rama",
|
||||||
|
"elohim": { "hebrew": "יהוה אלוה ודעת", "transliteration": "YHVH Eloah ve-Daath", "meaning": "God manifest in the Sphere of the Mind" },
|
||||||
|
"archangel": { "hebrew": "רפאל", "transliteration": "Raphael" },
|
||||||
|
"angelicOrder": { "hebrew": "מלכים", "transliteration": "Malakim", "meaning": "Kings" }
|
||||||
|
},
|
||||||
|
"7": {
|
||||||
|
"type": "sephirah",
|
||||||
|
"no": 7,
|
||||||
|
"name": "Netzach",
|
||||||
|
"meaning": "Victory",
|
||||||
|
"greek": "Aphrodite, Nike",
|
||||||
|
"roman": "Venus",
|
||||||
|
"egyptian": "Hathoor",
|
||||||
|
"egyptianPractical": "Hathoor",
|
||||||
|
"scandinavian": "Freya",
|
||||||
|
"hindu": "Bhavani (etc.)",
|
||||||
|
"elohim": { "hebrew": "יהוה צבאות", "transliteration": "YHVH Tzabaoth", "meaning": "The Lord of Hosts" },
|
||||||
|
"archangel": { "hebrew": "חאניאל", "transliteration": "Haniel" },
|
||||||
|
"angelicOrder": { "hebrew": "אלהים", "transliteration": "Elohim", "meaning": "Gods" }
|
||||||
|
},
|
||||||
|
"8": {
|
||||||
|
"type": "sephirah",
|
||||||
|
"no": 8,
|
||||||
|
"name": "Hod",
|
||||||
|
"meaning": "Splendour",
|
||||||
|
"greek": "Hermes",
|
||||||
|
"roman": "Mercury",
|
||||||
|
"egyptian": "Anubis",
|
||||||
|
"egyptianPractical": "Thoth",
|
||||||
|
"scandinavian": "Odin, Loki",
|
||||||
|
"hindu": "Hanuman",
|
||||||
|
"elohim": { "hebrew": "אלהים צבאות", "transliteration": "Elohim Tzabaoth", "meaning": "God of Hosts" },
|
||||||
|
"archangel": { "hebrew": "מיכאל", "transliteration": "Michael" },
|
||||||
|
"angelicOrder": { "hebrew": "בני אלהים", "transliteration": "Beni Elohim", "meaning": "Sons of God" }
|
||||||
|
},
|
||||||
|
"9": {
|
||||||
|
"type": "sephirah",
|
||||||
|
"no": 9,
|
||||||
|
"name": "Yesod",
|
||||||
|
"meaning": "Foundation",
|
||||||
|
"greek": "Zeus (as Air), Diana of Ephesus, Eros",
|
||||||
|
"roman": "Diana (as Water), Terminus, Jupiter",
|
||||||
|
"egyptian": "Shu, Hermanubis",
|
||||||
|
"egyptianPractical": "Shu",
|
||||||
|
"scandinavian": null,
|
||||||
|
"hindu": "Ganesha, Vishnu (Kurm Avatar)",
|
||||||
|
"elohim": { "hebrew": "שדי אל חי", "transliteration": "Shaddai El Chai", "meaning": "Almighty Living God" },
|
||||||
|
"archangel": { "hebrew": "גבריאל", "transliteration": "Gabriel" },
|
||||||
|
"angelicOrder": { "hebrew": "כרובים", "transliteration": "Kerubim", "meaning": "Angels of the Elements" }
|
||||||
|
},
|
||||||
|
"10": {
|
||||||
|
"type": "sephirah",
|
||||||
|
"no": 10,
|
||||||
|
"name": "Malkuth",
|
||||||
|
"meaning": "The Kingdom",
|
||||||
|
"greek": "Persephone, Adonis, Psyche",
|
||||||
|
"roman": "Ceres",
|
||||||
|
"egyptian": "Seb, Isis and Nephthys",
|
||||||
|
"egyptianPractical": "Osiris",
|
||||||
|
"scandinavian": null,
|
||||||
|
"hindu": "Lakshmi",
|
||||||
|
"elohim": { "hebrew": "אדני מלך", "transliteration": "Adonai Melek", "meaning": "Lord and King" },
|
||||||
|
"archangel": { "hebrew": "סנדלפון", "transliteration": "Sandalphon" },
|
||||||
|
"angelicOrder": { "hebrew": "אשים", "transliteration": "Ashim", "meaning": "Flames / Souls of Fire" }
|
||||||
|
},
|
||||||
|
"11": {
|
||||||
|
"type": "path",
|
||||||
|
"no": 11,
|
||||||
|
"hebrewLetter": "Aleph",
|
||||||
|
"hebrewChar": "א",
|
||||||
|
"tarot": "The Fool",
|
||||||
|
"attribute": "Air",
|
||||||
|
"greek": "Zeus",
|
||||||
|
"roman": "Jupiter, Juno, Æolus",
|
||||||
|
"egyptian": "Nu, Hoor-pa-kraat",
|
||||||
|
"egyptianPractical": "Mout",
|
||||||
|
"elohim": { "hebrew": "יהוה", "transliteration": "YHVH" },
|
||||||
|
"archangel": null,
|
||||||
|
"angelicOrder": null
|
||||||
|
},
|
||||||
|
"12": {
|
||||||
|
"type": "path",
|
||||||
|
"no": 12,
|
||||||
|
"hebrewLetter": "Beth",
|
||||||
|
"hebrewChar": "ב",
|
||||||
|
"tarot": "The Magician",
|
||||||
|
"attribute": "Mercury",
|
||||||
|
"greek": "Hermes",
|
||||||
|
"roman": "Mercury",
|
||||||
|
"egyptian": "Thoth and Cynocephalus",
|
||||||
|
"egyptianPractical": "Thoth",
|
||||||
|
"elohim": null,
|
||||||
|
"archangel": null,
|
||||||
|
"angelicOrder": null
|
||||||
|
},
|
||||||
|
"13": {
|
||||||
|
"type": "path",
|
||||||
|
"no": 13,
|
||||||
|
"hebrewLetter": "Gimel",
|
||||||
|
"hebrewChar": "ג",
|
||||||
|
"tarot": "The High Priestess",
|
||||||
|
"attribute": "Luna",
|
||||||
|
"greek": "Artemis, Hekate",
|
||||||
|
"roman": "Diana (as Water), Terminus, Jupiter",
|
||||||
|
"egyptian": "Chomse",
|
||||||
|
"egyptianPractical": "Chomse",
|
||||||
|
"elohim": null,
|
||||||
|
"archangel": null,
|
||||||
|
"angelicOrder": null
|
||||||
|
},
|
||||||
|
"14": {
|
||||||
|
"type": "path",
|
||||||
|
"no": 14,
|
||||||
|
"hebrewLetter": "Daleth",
|
||||||
|
"hebrewChar": "ד",
|
||||||
|
"tarot": "The Empress",
|
||||||
|
"attribute": "Venus",
|
||||||
|
"greek": "Aphrodite",
|
||||||
|
"roman": "Venus",
|
||||||
|
"egyptian": "Hathor",
|
||||||
|
"egyptianPractical": "Hathoor",
|
||||||
|
"elohim": null,
|
||||||
|
"archangel": null,
|
||||||
|
"angelicOrder": null
|
||||||
|
},
|
||||||
|
"15": {
|
||||||
|
"type": "path",
|
||||||
|
"no": 15,
|
||||||
|
"hebrewLetter": "Heh",
|
||||||
|
"hebrewChar": "ה",
|
||||||
|
"tarot": "The Emperor",
|
||||||
|
"attribute": "Aries",
|
||||||
|
"greek": "Athena",
|
||||||
|
"roman": "Mars, Minerva",
|
||||||
|
"egyptian": "Men Thu",
|
||||||
|
"egyptianPractical": "Isis",
|
||||||
|
"elohim": null,
|
||||||
|
"archangel": null,
|
||||||
|
"angelicOrder": null
|
||||||
|
},
|
||||||
|
"16": {
|
||||||
|
"type": "path",
|
||||||
|
"no": 16,
|
||||||
|
"hebrewLetter": "Vav",
|
||||||
|
"hebrewChar": "ו",
|
||||||
|
"tarot": "The Hierophant",
|
||||||
|
"attribute": "Taurus",
|
||||||
|
"greek": "Heré",
|
||||||
|
"roman": "Venus, Hymen",
|
||||||
|
"egyptian": "Asar, Ameshet, Apis",
|
||||||
|
"egyptianPractical": "Osiris",
|
||||||
|
"elohim": null,
|
||||||
|
"archangel": null,
|
||||||
|
"angelicOrder": null
|
||||||
|
},
|
||||||
|
"17": {
|
||||||
|
"type": "path",
|
||||||
|
"no": 17,
|
||||||
|
"hebrewLetter": "Zayin",
|
||||||
|
"hebrewChar": "ז",
|
||||||
|
"tarot": "The Lovers",
|
||||||
|
"attribute": "Gemini",
|
||||||
|
"greek": "Castor and Pollux, Apollo the Diviner, Eros",
|
||||||
|
"roman": "Castor and Pollux, Janus, Hymen",
|
||||||
|
"egyptian": "Twin Deities, Rekht, Merti",
|
||||||
|
"egyptianPractical": "The Twin Merti",
|
||||||
|
"elohim": null,
|
||||||
|
"archangel": null,
|
||||||
|
"angelicOrder": null
|
||||||
|
},
|
||||||
|
"18": {
|
||||||
|
"type": "path",
|
||||||
|
"no": 18,
|
||||||
|
"hebrewLetter": "Cheth",
|
||||||
|
"hebrewChar": "ח",
|
||||||
|
"tarot": "The Chariot",
|
||||||
|
"attribute": "Cancer",
|
||||||
|
"greek": "Apollo The Charioteer",
|
||||||
|
"roman": "Mercury, Lares and Penates",
|
||||||
|
"egyptian": "Khephra",
|
||||||
|
"egyptianPractical": "Hormakhu",
|
||||||
|
"elohim": null,
|
||||||
|
"archangel": null,
|
||||||
|
"angelicOrder": null
|
||||||
|
},
|
||||||
|
"19": {
|
||||||
|
"type": "path",
|
||||||
|
"no": 19,
|
||||||
|
"hebrewLetter": "Teth",
|
||||||
|
"hebrewChar": "ט",
|
||||||
|
"tarot": "Strength",
|
||||||
|
"attribute": "Leo",
|
||||||
|
"greek": "Demeter",
|
||||||
|
"roman": "Venus (Repressing Fire of Vulcan)",
|
||||||
|
"egyptian": "Ra-Hoor-Khuit, Pasht, Sekhet, Mau",
|
||||||
|
"egyptianPractical": "Horus",
|
||||||
|
"elohim": null,
|
||||||
|
"archangel": null,
|
||||||
|
"angelicOrder": null
|
||||||
|
},
|
||||||
|
"20": {
|
||||||
|
"type": "path",
|
||||||
|
"no": 20,
|
||||||
|
"hebrewLetter": "Yod",
|
||||||
|
"hebrewChar": "י",
|
||||||
|
"tarot": "The Hermit",
|
||||||
|
"attribute": "Virgo",
|
||||||
|
"greek": "Attis",
|
||||||
|
"roman": "Attis, Ceres, Adonis, Vesta, Flora",
|
||||||
|
"egyptian": "Isis (as Virgin)",
|
||||||
|
"egyptianPractical": "Heru-pa-Kraath",
|
||||||
|
"elohim": null,
|
||||||
|
"archangel": null,
|
||||||
|
"angelicOrder": null
|
||||||
|
},
|
||||||
|
"21": {
|
||||||
|
"type": "path",
|
||||||
|
"no": 21,
|
||||||
|
"hebrewLetter": "Kaph",
|
||||||
|
"hebrewChar": "כ",
|
||||||
|
"tarot": "Wheel of Fortune",
|
||||||
|
"attribute": "Jupiter",
|
||||||
|
"greek": "Zeus",
|
||||||
|
"roman": "Jupiter, Pluto",
|
||||||
|
"egyptian": "Amoun-Ra",
|
||||||
|
"egyptianPractical": "Amoun-Ra",
|
||||||
|
"elohim": { "hebrew": "אבא, אל אב", "transliteration": "Abba, El Ab", "meaning": "Father, God the Father" },
|
||||||
|
"archangel": null,
|
||||||
|
"angelicOrder": null
|
||||||
|
},
|
||||||
|
"22": {
|
||||||
|
"type": "path",
|
||||||
|
"no": 22,
|
||||||
|
"hebrewLetter": "Lamed",
|
||||||
|
"hebrewChar": "ל",
|
||||||
|
"tarot": "Justice",
|
||||||
|
"attribute": "Libra",
|
||||||
|
"greek": "Themis, Minos, Aecus and Rhadamanthus",
|
||||||
|
"roman": "Vulcan, Venus, Nemesis",
|
||||||
|
"egyptian": "Ma (Maat)",
|
||||||
|
"egyptianPractical": "Maat",
|
||||||
|
"elohim": null,
|
||||||
|
"archangel": null,
|
||||||
|
"angelicOrder": null
|
||||||
|
},
|
||||||
|
"23": {
|
||||||
|
"type": "path",
|
||||||
|
"no": 23,
|
||||||
|
"hebrewLetter": "Mem",
|
||||||
|
"hebrewChar": "מ",
|
||||||
|
"tarot": "The Hanged Man",
|
||||||
|
"attribute": "Water",
|
||||||
|
"greek": "Poseidon",
|
||||||
|
"roman": "Neptune, Rhea",
|
||||||
|
"egyptian": "Tum, Ptah, Auramoth, Asar, Hekar, Isis",
|
||||||
|
"egyptianPractical": null,
|
||||||
|
"elohim": { "hebrew": "אל", "transliteration": "El", "meaning": "God (the Strong)" },
|
||||||
|
"archangel": null,
|
||||||
|
"angelicOrder": null
|
||||||
|
},
|
||||||
|
"24": {
|
||||||
|
"type": "path",
|
||||||
|
"no": 24,
|
||||||
|
"hebrewLetter": "Nun",
|
||||||
|
"hebrewChar": "נ",
|
||||||
|
"tarot": "Death",
|
||||||
|
"attribute": "Scorpio",
|
||||||
|
"greek": "Ares, Apollo the Pythean, Thanatos",
|
||||||
|
"roman": "Mars, Mors",
|
||||||
|
"egyptian": "Merti Goddesses, Typhon, Apep, Khephra",
|
||||||
|
"egyptianPractical": "Hammemit",
|
||||||
|
"elohim": null,
|
||||||
|
"archangel": null,
|
||||||
|
"angelicOrder": null
|
||||||
|
},
|
||||||
|
"25": {
|
||||||
|
"type": "path",
|
||||||
|
"no": 25,
|
||||||
|
"hebrewLetter": "Samekh",
|
||||||
|
"hebrewChar": "ס",
|
||||||
|
"tarot": "Temperance",
|
||||||
|
"attribute": "Sagittarius",
|
||||||
|
"greek": "Apollo, Artemis (hunters)",
|
||||||
|
"roman": "Diana (Archer), Iris",
|
||||||
|
"egyptian": "Nephthys",
|
||||||
|
"egyptianPractical": null,
|
||||||
|
"elohim": null,
|
||||||
|
"archangel": null,
|
||||||
|
"angelicOrder": null
|
||||||
|
},
|
||||||
|
"26": {
|
||||||
|
"type": "path",
|
||||||
|
"no": 26,
|
||||||
|
"hebrewLetter": "Ayin",
|
||||||
|
"hebrewChar": "ע",
|
||||||
|
"tarot": "The Devil",
|
||||||
|
"attribute": "Capricorn",
|
||||||
|
"greek": "Pan, Priapus",
|
||||||
|
"roman": "Pan, Vesta, Bacchus",
|
||||||
|
"egyptian": "Khem, Set",
|
||||||
|
"egyptianPractical": "Set",
|
||||||
|
"elohim": null,
|
||||||
|
"archangel": null,
|
||||||
|
"angelicOrder": null
|
||||||
|
},
|
||||||
|
"27": {
|
||||||
|
"type": "path",
|
||||||
|
"no": 27,
|
||||||
|
"hebrewLetter": "Pe",
|
||||||
|
"hebrewChar": "פ",
|
||||||
|
"tarot": "The Tower",
|
||||||
|
"attribute": "Mars",
|
||||||
|
"greek": "Ares, Athena",
|
||||||
|
"roman": "Mars",
|
||||||
|
"egyptian": "Horus",
|
||||||
|
"egyptianPractical": "Mentu",
|
||||||
|
"elohim": { "hebrew": "אדני", "transliteration": "Adonai", "meaning": "My Lord" },
|
||||||
|
"archangel": null,
|
||||||
|
"angelicOrder": null
|
||||||
|
},
|
||||||
|
"28": {
|
||||||
|
"type": "path",
|
||||||
|
"no": 28,
|
||||||
|
"hebrewLetter": "Tzaddi",
|
||||||
|
"hebrewChar": "צ",
|
||||||
|
"tarot": "The Star",
|
||||||
|
"attribute": "Aquarius",
|
||||||
|
"greek": "Athena, Ganymede",
|
||||||
|
"roman": "Juno, Æolus",
|
||||||
|
"egyptian": "Ahepi, Aroueris",
|
||||||
|
"egyptianPractical": "Nuit",
|
||||||
|
"elohim": null,
|
||||||
|
"archangel": null,
|
||||||
|
"angelicOrder": null
|
||||||
|
},
|
||||||
|
"29": {
|
||||||
|
"type": "path",
|
||||||
|
"no": 29,
|
||||||
|
"hebrewLetter": "Qoph",
|
||||||
|
"hebrewChar": "ק",
|
||||||
|
"tarot": "The Moon",
|
||||||
|
"attribute": "Pisces",
|
||||||
|
"greek": "Poseidon, Hermes Psychopompus",
|
||||||
|
"roman": "Neptune",
|
||||||
|
"egyptian": "Khephra (as Scarab)",
|
||||||
|
"egyptianPractical": "Anubi",
|
||||||
|
"elohim": null,
|
||||||
|
"archangel": null,
|
||||||
|
"angelicOrder": null
|
||||||
|
},
|
||||||
|
"30": {
|
||||||
|
"type": "path",
|
||||||
|
"no": 30,
|
||||||
|
"hebrewLetter": "Resh",
|
||||||
|
"hebrewChar": "ר",
|
||||||
|
"tarot": "The Sun",
|
||||||
|
"attribute": "Sol",
|
||||||
|
"greek": "Helios, Apollo",
|
||||||
|
"roman": "Apollo, Ops",
|
||||||
|
"egyptian": "Ra",
|
||||||
|
"egyptianPractical": "Ra",
|
||||||
|
"elohim": { "hebrew": "אלה", "transliteration": "Elah", "meaning": "God" },
|
||||||
|
"archangel": null,
|
||||||
|
"angelicOrder": null
|
||||||
|
},
|
||||||
|
"31": {
|
||||||
|
"type": "path",
|
||||||
|
"no": 31,
|
||||||
|
"hebrewLetter": "Shin",
|
||||||
|
"hebrewChar": "ש",
|
||||||
|
"tarot": "The Aeon / Judgement",
|
||||||
|
"attribute": "Fire",
|
||||||
|
"greek": "Hades",
|
||||||
|
"roman": "Vulcan, Pluto",
|
||||||
|
"egyptian": "Thoum-Aesh-Neith, Mau, Kabeshunt, Horus, Tarpesheth",
|
||||||
|
"egyptianPractical": "Mau",
|
||||||
|
"elohim": { "hebrew": "אלהים", "transliteration": "Elohim", "meaning": "Gods (plural)" },
|
||||||
|
"archangel": null,
|
||||||
|
"angelicOrder": null
|
||||||
|
},
|
||||||
|
"32": {
|
||||||
|
"type": "path",
|
||||||
|
"no": 32,
|
||||||
|
"hebrewLetter": "Tav",
|
||||||
|
"hebrewChar": "ת",
|
||||||
|
"tarot": "The Universe",
|
||||||
|
"attribute": "Saturn",
|
||||||
|
"greek": "Athena",
|
||||||
|
"roman": "Saturn, Terminus, Astræa",
|
||||||
|
"egyptian": "Sebek, Mako",
|
||||||
|
"egyptianPractical": null,
|
||||||
|
"elohim": { "hebrew": "אב יה", "transliteration": "Ab Yah", "meaning": "Father, The Lord" },
|
||||||
|
"archangel": null,
|
||||||
|
"angelicOrder": null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"gods": [
|
||||||
|
{"id":"zeus","name":"Zeus","pantheon":"greek","epithet":"King of the Gods · Cloud-Gatherer · Father of Men","role":"King of the Olympian Gods; ruler of sky, thunder, and divine law","domains":["sky","thunder","lightning","law","justice","kingship","hospitality"],"parents":["Kronos (Titan)","Rhea (Titaness)"],"siblings":["Hestia","Demeter","Hera","Hades","Poseidon"],"consorts":["Hera","Metis","Themis","Mnemosyne","Demeter","Leto","many others"],"children":["Athena","Apollo","Artemis","Hermes","Ares","Hephaestus","Dionysus","Persephone","Perseus","Heracles","Minos"],"symbols":["thunderbolt","eagle","oak tree","scales","sceptre"],"sacredAnimals":["eagle","bull","swan","cuckoo"],"sacredPlaces":["Mount Olympus","Dodona","Olympia"],"equivalents":["Jupiter (Roman)"],"kabbalahPaths":[1,4,9,11,21],"description":"Zeus was the youngest son of Kronos and Rhea, hidden from his father's devouring hunger and raised in secret on Crete. After overthrowing the Titans he drew lots with his brothers: the sky fell to Zeus, the sea to Poseidon, and the underworld to Hades. His rule is based on cosmic law (themis) rather than brute force, though both are available to him.","myth":"","poem":""},
|
||||||
|
{"id":"hera","name":"Hera","pantheon":"greek","epithet":"Queen of the Gods · Queen of Heaven · Lady of Olympus","role":"Queen of the Olympians; goddess of marriage, women, childbirth, and the loyalty of oaths","domains":["marriage","women","childbirth","royalty","sky","oaths"],"parents":["Kronos","Rhea"],"siblings":["Zeus","Poseidon","Demeter","Hestia","Hades"],"consorts":["Zeus"],"children":["Ares","Hephaestus","Hebe","Eileithyia","Enyo"],"symbols":["peacock","lily","diadem","sceptre","pomegranate","cuckoo"],"sacredAnimals":["peacock","cow","cuckoo"],"equivalents":["Juno (Roman)"],"kabbalahPaths":[3,16],"description":"Hera was swallowed at birth by Kronos like her siblings, and liberated when Zeus forced him to disgorge them. She is the eternal principle of sacred marriage and the dignity of wifely commitment. Her jealous pursuit of Zeus's lovers and illegitimate children reflects the cosmic tension between order and creative excess.","myth":"","poem":""},
|
||||||
|
{"id":"poseidon","name":"Poseidon","pantheon":"greek","epithet":"Earth-Shaker · Lord of the Deep · Brother of Zeus","role":"God of the sea, earthquakes, storms, and horses","domains":["sea","earthquakes","storms","horses","fresh water"],"parents":["Kronos","Rhea"],"siblings":["Zeus","Hera","Demeter","Hestia","Hades"],"consorts":["Amphitrite","Demeter","Medusa","many others"],"children":["Triton","Theseus","Polyphemus","Pegasus","Chrysaor"],"symbols":["trident","horse","dolphin","bull","fish"],"sacredAnimals":["horse","dolphin","bull"],"sacredPlaces":["Corinth","Cape Sounion","Aegean Sea"],"equivalents":["Neptune (Roman)"],"kabbalahPaths":[4,23,29],"description":"Poseidon drew the sea when the universe was divided by lot. He is the great mover — earthquakes are his footsteps, storms his breath. He created the horse by striking the earth with his trident during the contest for Athens. Though he lost that contest to Athena, he remained a god respected and feared by all seafarers.","myth":"","poem":""},
|
||||||
|
{"id":"demeter","name":"Demeter","pantheon":"greek","epithet":"Great Mother · Goddess of the Grain · Giver of Laws","role":"Goddess of the harvest, agriculture, fertility of the earth, and the sacred mysteries","domains":["harvest","grain","agriculture","fertility","seasons","sacred law","the mysteries"],"parents":["Kronos","Rhea"],"siblings":["Zeus","Hera","Poseidon","Hestia","Hades"],"consorts":["Zeus","Poseidon","Iasion"],"children":["Persephone","Arion","Plutos","Despoina"],"symbols":["sheaf of wheat","torch","cornucopia","poppy","serpent"],"sacredAnimals":["snake","pig","gecko"],"sacredPlaces":["Eleusis"],"equivalents":["Ceres (Roman)"],"kabbalahPaths":[3,10,19],"description":"Demeter governed the cycle of life and death through her daughter Persephone's abduction. When Hades took Persephone, Demeter wandered the earth in grief and nothing grew. The Eleusinian Mysteries — the most sacred rites of the ancient world — reenacted her search and reunification with Persephone, promising initiates a blessed afterlife.","myth":"","poem":""},
|
||||||
|
{"id":"athena","name":"Athena","pantheon":"greek","epithet":"Grey-Eyed Goddess · Lady of Athens · Pallas Athena","role":"Goddess of wisdom, craft, and strategic warfare; patron of Athens and civilised life","domains":["wisdom","warfare (strategic)","crafts","weaving","justice","civilization","arts"],"parents":["Zeus","Metis (swallowed by Zeus before birth)"],"siblings":["Apollo","Artemis","Ares","Hermes","Hephaestus","Dionysus"],"consorts":[],"children":["Erichthonius (adoptive)"],"symbols":["owl","olive tree","aegis","spear","helmet","shield (Gorgoneion)"],"sacredAnimals":["owl","serpent","rooster"],"sacredPlaces":["Athens (Parthenon)","Troy","Pergamon"],"equivalents":["Minerva (Roman)"],"kabbalahPaths":[2,15,27,28,32],"description":"Born fully armoured from Zeus's forehead after he swallowed her pregnant mother Metis, Athena represents the intellect's victory over instinct. She guided heroes like Odysseus and Perseus with divine cunning rather than brute force. Her rival Poseidon struck the Acropolis to produce a salt spring; she struck it to grow an olive tree — and Athens chose her gift.","myth":"","poem":""},
|
||||||
|
{"id":"apollo","name":"Apollo","pantheon":"greek","epithet":"Phoebus · The Far-Shooter · God of Light","role":"God of the sun, music, poetry, prophecy, healing, archery, and truth","domains":["sun","light","music","poetry","prophecy","healing","archery","truth","plague"],"parents":["Zeus","Leto (Titaness)"],"siblings":["Artemis (twin)"],"consorts":["Coronis","Cassandra (unrequited)","Hyacinthus","many others"],"children":["Asclepius","Orpheus","Ion","Aristaeus"],"symbols":["lyre","silver bow and arrows","laurel wreath","raven","python","sun disk"],"sacredAnimals":["raven","swan","dolphin","mouse","wolf"],"sacredPlaces":["Delphi","Delos"],"equivalents":["Apollo (Roman, same name)","Helios (solar aspect)"],"kabbalahPaths":[6,18,24,25,30],"description":"Apollo is the ideal of the kouros — the perfect, radiant male youth. As god of Delphi he delivered the most famous oracle in the ancient world: 'Know thyself.' His twin Artemis governs the moon while Apollo governs the sun. He also brought plague — his arrows, like the rays of the sun, could kill at a distance.","myth":"","poem":""},
|
||||||
|
{"id":"artemis","name":"Artemis","pantheon":"greek","epithet":"Lady of the Hunt · Mistress of Animals · Phoebe","role":"Goddess of the hunt, wilderness, the moon, chastity, and the protection of young women","domains":["hunt","wilderness","moon","chastity","childbirth","protection of youth","wild nature"],"parents":["Zeus","Leto"],"siblings":["Apollo (twin)"],"consorts":[],"children":[],"symbols":["silver bow","quiver of arrows","crescent moon","torch","deer"],"sacredAnimals":["deer","bear","dogs","boar","guinea fowl"],"sacredPlaces":["Ephesus (great temple)","Brauron","Delos"],"equivalents":["Diana (Roman)"],"kabbalahPaths":[9,13,25],"description":"Artemis was the first-born twin, immediately helping her mother deliver Apollo. She demanded absolute chastity from herself and her nymphs, punishing any violation with fierce transformation — Actaeon was turned into a stag for seeing her bathing. Her great temple at Ephesus was one of the Seven Wonders of the ancient world.","myth":"","poem":""},
|
||||||
|
{"id":"ares","name":"Ares","pantheon":"greek","epithet":"The Bloodied · Bane of Mortals · Unsated in War","role":"God of war, violence, bloodshed, and the raw courage of battle","domains":["war","violence","bloodshed","courage","civil order (through fear)"],"parents":["Zeus","Hera"],"siblings":["Hephaestus","Hebe","Eileithyia"],"consorts":["Aphrodite"],"children":["Phobos (Fear)","Deimos (Terror)","Harmonia","Anteros","Eros (some traditions)"],"symbols":["spear","shield","helmet","sword","boar","vulture"],"sacredAnimals":["dog","vulture","boar","snake","woodpecker"],"sacredPlaces":["Thrace"],"equivalents":["Mars (Roman)"],"kabbalahPaths":[5,24,27],"description":"Unlike Athena who represents strategic wisdom in war, Ares is the raw, unthinking force of conflict — violent, passionate, and bloodthirsty. He was despised by both his father Zeus and nearly all the gods for cruelty. Yet the Romans, as a martial people, honoured his equivalent Mars as one of their greatest gods and as the divine father of Romulus.","myth":"","poem":""},
|
||||||
|
{"id":"aphrodite","name":"Aphrodite","pantheon":"greek","epithet":"Foam-Born · Golden Aphrodite · Lady of Cyprus","role":"Goddess of love, beauty, pleasure, desire, and procreation","domains":["love","beauty","desire","pleasure","fertility","procreation","the sea (born from it)"],"parents":["Born from sea-foam where Uranos's severed genitals fell, or Zeus and Dione"],"siblings":[],"consorts":["Hephaestus (husband)","Ares (lover)","Anchises","Adonis"],"children":["Eros","Anteros","Phobos","Deimos","Harmonia","Aeneas"],"symbols":["dove","sparrow","rose","myrtle","girdle","apple","mirror"],"sacredAnimals":["dove","sparrow","swan","goose","bee"],"sacredPlaces":["Cyprus (Paphos)","Cythera","Corinth"],"equivalents":["Venus (Roman)"],"kabbalahPaths":[7,14],"description":"Rising from the sea near Cyprus, Aphrodite embodies eros as a cosmic force older than the Olympians — desire that moves all creation. Her girdle could inspire desire in any being, mortal or immortal. The Trojan War began with her promise to Paris: in exchange for the golden apple of discord, she gave him the love of the most beautiful mortal woman, Helen.","myth":"","poem":""},
|
||||||
|
{"id":"hermes","name":"Hermes","pantheon":"greek","epithet":"Psychopomp · Divine Messenger · Master Thief · Trickster","role":"Messenger of the gods; guide of souls to Hades; god of commerce, language, and boundaries","domains":["communication","travel","trade","thieves","language","boundaries","sleep","guide of souls"],"parents":["Zeus","Maia (Pleiad nymph)"],"siblings":["Apollo","Artemis","Ares","Athena","Hephaestus","Dionysus"],"consorts":["Aphrodite","Dryope","many others"],"children":["Pan","Hermaphroditus","Autolycus"],"symbols":["caduceus","winged sandals","traveller's hat (petasos)","tortoise-shell lyre","purse"],"sacredAnimals":["tortoise","rooster","ram","hawk"],"sacredPlaces":["Mount Cyllene (birthplace)"],"equivalents":["Mercury (Roman)","Thoth (Egyptian)"],"kabbalahPaths":[8,12,29],"description":"The only Olympian who moves freely between the worlds of gods, mortals, and the dead. On his first day of life he invented the lyre, stole Apollo's cattle, and negotiated his way to a position of honour among the gods. As psychopomp he guides souls to Hades. He was the patron of Hermeticism, whose practice of inner alchemy traces back to his identification with the Egyptian Thoth.","myth":"","poem":""},
|
||||||
|
{"id":"dionysus","name":"Dionysus","pantheon":"greek","epithet":"Twice-Born · The Liberator · Bringer of Joy","role":"God of wine, ecstasy, ritual madness, theatre, and the mystery of rebirth","domains":["wine","ecstasy","theatre","ritual madness","fertility","rebirth","vegetation","mystery"],"parents":["Zeus","Semele (mortal princess of Thebes)"],"siblings":["Apollo","Hermes","Ares","Athena"],"consorts":["Ariadne"],"children":["Thoas","Staphylus","Oenopion","Phthonus"],"symbols":["thyrsos (fennel staff topped with pinecone)","grapevine","ivy","leopard skin","cup","mask"],"sacredAnimals":["bull","panther","leopard","goat","serpent","donkey"],"sacredPlaces":["Delphi (shared with Apollo)","Thebes","Naxos"],"equivalents":["Bacchus (Roman)","Osiris (Egyptian mystery parallel)"],"kabbalahPaths":[6],"description":"Born twice — first from Semele who was incinerated by Zeus's divine glory, then stitched into Zeus's thigh to gestate — Dionysus embodies the paradox of life through death and the dissolution of individual self in collective ecstasy. His journey to retrieve his mother from the underworld mirrors the initiatory death-and-rebirth pattern central to all mystery cults.","myth":"","poem":""},
|
||||||
|
{"id":"persephone","name":"Persephone","pantheon":"greek","epithet":"Queen of the Underworld · Kore (The Maiden) · The Dread Goddess","role":"Queen of the Underworld; goddess of spring growth and the mysteries of death and rebirth","domains":["underworld","spring","vegetation","grain","death","mysteries","pomegranates"],"parents":["Zeus","Demeter"],"siblings":[],"consorts":["Hades"],"children":["Zagreus (by Zeus, in Orphic tradition)","Melinoe","Plutus (some traditions)"],"symbols":["pomegranate","narcissus","wheat","torch","flowers","bat"],"sacredAnimals":["bat","ram","parrot"],"sacredPlaces":["Eleusis (mysteries)","The Underworld itself"],"equivalents":["Proserpina (Roman)"],"kabbalahPaths":[9,10],"description":"Abducted to the Underworld by Hades while picking flowers in the meadow, Persephone ate six pomegranate seeds, binding her to spend half the year below. Her annual descent brings winter; her return brings spring. The Eleusinian Mysteries dramatised her story as a metaphor for the soul's descent, death, and triumphant ascent.","myth":"","poem":""},
|
||||||
|
{"id":"hades","name":"Hades","pantheon":"greek","epithet":"The Unseen One · Lord of the Dead · Wealthy One","role":"God of the underworld and its mineral riches; impartial ruler of all the dead","domains":["underworld","death","wealth (metals in the earth)","the dead","invisibility"],"parents":["Kronos","Rhea"],"siblings":["Zeus","Poseidon","Hera","Demeter","Hestia"],"consorts":["Persephone"],"children":["Macaria","Melinoe","Zagreus (some traditions)"],"symbols":["Cerberus","key","bident","helmet of invisibility","narcissus","cypress","black poplar"],"sacredAnimals":["Cerberus (three-headed dog)","screech owl","serpent"],"sacredPlaces":["The Underworld","Alcyonian Lake","mouth of Avernus"],"equivalents":["Pluto (Roman)"],"kabbalahPaths":[5,31],"description":"Hades drew the underworld when he and his brothers divided creation by lot. Unlike Thanatos (death personified), Hades administers the realm of the dead — neutral and inevitable, rarely actively malevolent. The Greeks avoided speaking his name, preferring euphemisms like Plouton (Wealth-Giver) for the mineral riches that rise from the earth's depths.","myth":"","poem":""},
|
||||||
|
{"id":"hecate","name":"Hecate","pantheon":"greek","epithet":"Triple Goddess · Mistress of Witchcraft · Queen of the Night","role":"Goddess of magic, witchcraft, crossroads, necromancy, and the liminal spaces between worlds","domains":["magic","witchcraft","crossroads","necromancy","ghosts","moon","herbs","night","liminal spaces"],"parents":["Perses (Titan)","Asteria (Titaness of Falling Stars)"],"siblings":[],"consorts":[],"children":["Scylla (some traditions)"],"symbols":["twin torches","key","dagger","rope","serpents","polecat","dogs"],"sacredAnimals":["dog","polecat","red mullet","serpent","owl"],"sacredPlaces":["crossroads (trivia)","Samothrace","Eleusis"],"equivalents":["Diana Trivia (Roman)","partial: Isis (Egyptian)"],"kabbalahPaths":[9,13],"description":"A triple goddess spanning heaven (moon), earth (nature magic), and the underworld (necromancy). She stands at crossroads — liminal spaces where worlds meet — and was propitiated at midnight with offerings left at three-way intersections. She alone heard Persephone's cries as Hades took her, and carried torches to light Demeter's search.","myth":"","poem":""},
|
||||||
|
{"id":"pan","name":"Pan","pantheon":"greek","epithet":"All · Lord of the Wild · Panic-Bringer","role":"God of the wild, shepherds, flocks, rustic music, and natural fertility","domains":["wilderness","shepherds","flocks","nature","rustic music","fertility","hunting"],"parents":["Hermes (most common tradition)","Zeus","Kronos (various traditions)"],"siblings":[],"consorts":["many nymphs (Syrinx, Echo, Luna, Pitys)"],"children":["Silenus (some traditions)"],"symbols":["pan pipes (syrinx)","goat legs and horns","pine wreath","shepherd's staff"],"sacredAnimals":["goat","tortoise"],"sacredPlaces":["Arcadia","cave of Mount Parthenion"],"equivalents":["Faunus (Roman)"],"kabbalahPaths":[0,9,26],"description":"Pan's name means 'All' — he represents the totality of wild nature, simultaneously animalistic and divine. His sudden appearance causes 'panic' (from his name). In Liber 777 he corresponds to Ain Soph Aur — the Limitless All beyond the Tree — because he encompasses everything. In later tradition he became the horned archetype of the Devil.","myth":"","poem":""},
|
||||||
|
{"id":"eros","name":"Eros","pantheon":"greek","epithet":"Primordial Love · The Wing'd One · Desire Before Form","role":"God of love, attraction, desire, and the generative force binding all creation","domains":["love","desire","attraction","procreation","beauty","the bonds between things"],"parents":["Chaos (primordial), or Aphrodite and Ares, or Nyx and Erebus (various traditions)"],"siblings":["Anteros","Phobos","Deimos","Harmonia"],"consorts":["Psyche"],"children":["Hedone (Pleasure)"],"symbols":["bow and golden/leaden arrows","wings","torch","lyre","roses"],"sacredAnimals":["hare","rooster"],"equivalents":["Cupid / Amor (Roman)"],"kabbalahPaths":[7,17],"description":"In the oldest cosmogonies, Eros is primordial — one of the first forces to emerge from Chaos, the attractive power that draws matter together into form. In later mythology he became the son of Aphrodite and Ares, the mischievous archer who ignites love without regard for consequence. His marriage to Psyche is one of the greatest love stories of antiquity.","myth":"","poem":""},
|
||||||
|
{"id":"helios","name":"Helios","pantheon":"greek","epithet":"The Sun · Lord of the Light · The Seeing God","role":"Titan god of the sun; personification of the solar orb; all-seeing witness of oaths","domains":["sun","sight","light","oaths","time (as measured by solar movement)","cattle"],"parents":["Hyperion (Titan of Light)","Theia (Titaness of Sight)"],"siblings":["Selene (Moon)","Eos (Dawn)"],"consorts":["Rhode","Perse","Clymene"],"children":["Aeetes","Circe","Phaethon","Pasiphae","the Heliades (transformed into amber-weeping poplars)"],"symbols":["golden chariot of four fire-breathing horses","crown of solar rays","globe of light"],"equivalents":["Apollo (later absorbed solar functions)","Ra (Egyptian)","Sol (Roman)"],"kabbalahPaths":[30],"description":"Helios drives his golden chariot of four fire-breathing horses across the sky each day from east to west, descending into the Ocean at night and sailing beneath the earth to rise again in the east. As the all-seeing eye of heaven, he witnessed Hades' abduction of Persephone and told Demeter. His son Phaethon's disastrous attempt to drive the solar chariot scorched the earth and was struck down by Zeus.","myth":"","poem":""},
|
||||||
|
{"id":"ikarus","name":"Ikarus","pantheon":"greek","epithet":"Winged Youth · The Overreacher · Son of Daidalos","role":"Mythic youth whose flight toward the sun became the archetype of ambition, ecstasy, and tragic excess","domains":["flight","ambition","initiation through risk","hubris","ecstatic ascent","tragic fall"],"parents":["Daidalos (Daedalus)","Naukrate (in some traditions)"],"siblings":[],"consorts":[],"children":[],"symbols":["wax wings","feathers","sun","sea"],"sacredAnimals":["gull"],"sacredPlaces":["Crete","Ikarian Sea","Sicily"],"equivalents":["Phaethon (mythic parallel of overreaching ascent)"],"kabbalahPaths":[1,6],"description":"Ikarus escaped imprisonment with his father Daidalos by means of crafted wings of feathers and wax. Ignoring the middle path between sea-damp and sun-heat, he flew too high; the wax melted and he fell into the sea that now bears his name. In esoteric interpretation he signifies the danger and necessity of aspiration: ascent is required, but unbalanced ecstasy without measure becomes ruin.","myth":"","poem":""},
|
||||||
|
{"id":"kronos","name":"Kronos","pantheon":"greek","epithet":"Lord of Time · Harvest Titan · The Reaper","role":"Titan king; god of time, the harvest, and agricultural abundance; ruler of the Golden Age","domains":["time","harvest","agriculture","fate","the Golden Age","history"],"parents":["Uranus (Sky)","Gaia (Earth)"],"siblings":["Rhea (wife)","Oceanus","Tethys","Hyperion","Theia","Mnemosyne","Themis","others"],"consorts":["Rhea"],"children":["Zeus","Hera","Poseidon","Demeter","Hestia","Hades"],"symbols":["scythe / sickle / harpe","grain","serpent eating its tail (ouroboros)"],"equivalents":["Saturn (Roman)"],"kabbalahPaths":[3,32],"description":"Kronos castrated his father Uranus with an adamantine sickle to free his siblings from Uranus's oppression, then ruled the Golden Age of ease and plenty. But fearing a prophecy that his own children would overthrow him, he swallowed each at birth. Overthrown by Zeus after Rhea tricked him with a stone bundled as a baby, he was imprisoned in Tartarus — or in other traditions, exiled to the Isles of the Blessed to rule a realm of the heroic dead.","myth":"","poem":""},
|
||||||
|
{"id":"uranus","name":"Uranus","pantheon":"greek","epithet":"Father Sky · The Heavens · First King","role":"Primordial god of the sky; first ruler of the cosmos; father of the Titans","domains":["sky","heaven","stars","cosmos","fate (through stars)"],"parents":["Gaia (self-born, or emerged from Chaos)"],"siblings":[],"consorts":["Gaia"],"children":["Titans (12)","Cyclopes (3: Brontes, Steropes, Arges)","Hecatoncheires (3: hundred-handed giants)","Aphrodite (born from his severed genitals)"],"symbols":["vault of the sky","stars","night sky"],"equivalents":["Caelus (Roman)"],"kabbalahPaths":[2],"description":"Uranus covered Gaia (Earth) as a lid covers a pot, and their union produced the Titans. He was so horrified by the monstrous Cyclopes and Hecatoncheires that he thrust them back into Gaia's womb, causing her tremendous suffering. Gaia persuaded her son Kronos to castrate Uranus with an adamantine sickle — from his blood the Erinyes and Giants were born, from his severed genitals thrown into the sea, Aphrodite arose.","myth":"","poem":""},
|
||||||
|
{"id":"rhea","name":"Rhea","pantheon":"greek","epithet":"Mother of the Gods · Lady of the Wild Beasts · Great Mother","role":"Titaness of motherhood, fertility, the passage of generations, and mountain wilds","domains":["motherhood","fertility","generations","mountains","wild animals","protection of children"],"parents":["Uranus","Gaia"],"siblings":["Kronos (husband)","Oceanus","Themis","Mnemosyne","other Titans"],"consorts":["Kronos"],"children":["Zeus","Hera","Poseidon","Demeter","Hestia","Hades"],"symbols":["lions","turreted crown","drum (tympanum)","key"],"sacredAnimals":["lion","eagle"],"equivalents":["Cybele (Phrygian Great Mother)","Ops (Roman)"],"kabbalahPaths":[3,10,23],"description":"When Kronos swallowed her children one by one, Rhea hid the infant Zeus in a cave on Crete, guarded by the Curetes whose loud bronze clashing masked the child's cries. She gave Kronos a stone wrapped in swaddling cloths, which he swallowed. She represents the eternal mother who preserves life through cunning when brute power fails.","myth":"","poem":""},
|
||||||
|
{"id":"themis","name":"Themis","pantheon":"greek","epithet":"Lady of Good Counsel · Divine Law · She Who Brought the Gods Together","role":"Titaness of divine law, order, natural law, and the oracular voice","domains":["divine law","order","custom","the oracle","justice","seasons (via her daughters)","fate (via Moirai)"],"parents":["Uranus","Gaia"],"siblings":["Kronos","Rhea","other Titans"],"consorts":["Zeus (second wife, before Hera)"],"children":["The Horae (Seasons: Eunomia, Dike, Eirene)","The Moirai (Fates: Clotho, Lachesis, Atropos)","Nemesis (some traditions)"],"symbols":["scales of justice","sword","blindfold (later addition)","cornucopia"],"equivalents":["Iustitia (Roman)"],"kabbalahPaths":[22],"description":"Themis was the second consort of Zeus after Metis. She convened the gods to assembly and maintained the cosmic order through law rather than through force. Her daughters the Moirai spun the thread of fate for every mortal, measuring and cutting it — even Zeus could not override their decree.","myth":"","poem":""},
|
||||||
|
{"id":"nike","name":"Nike","pantheon":"greek","epithet":"Winged Victory · Daughter of the River Styx","role":"Goddess of victory, speed, and the glory that comes from achievement","domains":["victory","speed","strength","fame","success"],"parents":["Pallas (Titan)","Styx (river of the underworld)"],"siblings":["Kratos (Strength)","Bia (Force)","Zelus (Rivalry)"],"consorts":[],"children":[],"symbols":["wings","laurel wreath","palm branch","victory trophy"],"equivalents":["Victoria (Roman)"],"kabbalahPaths":[7],"description":"Nike sided with Zeus in the Titan War as her family all did, because Styx (their mother) swore her children's loyalty. Nike became the constant companion of Zeus and Athena, and was often depicted hovering over victorious athletes and armies. The winged logo of the athletic brand bears her name.","myth":"","poem":""},
|
||||||
|
{"id":"jupiter","name":"Jupiter","pantheon":"roman","epithet":"Optimus Maximus · Best and Greatest · Father of the State","role":"King of the Roman gods; god of sky, thunder, lightning, law, and the Roman state itself","domains":["sky","thunder","lightning","justice","law","the Roman state","oaths"],"parents":["Saturn","Ops"],"siblings":["Juno","Neptune","Ceres","Pluto","Vesta"],"consorts":["Juno"],"children":["Minerva","Mars","Vulcan","Mercury","Bacchus","Diana"],"symbols":["eagle","thunderbolt","oak tree","sceptre","white bulls (his sacrifices)"],"sacredAnimals":["eagle","bull"],"sacredPlaces":["Capitoline Hill (Rome)","Mons Albanus"],"equivalents":["Zeus (Greek)"],"kabbalahPaths":[1,4,11,21],"description":"Jupiter was the supreme deity of Rome, his great temple on the Capitoline Hill the centre of Roman religion and statecraft. Generals who celebrated a triumph wore his purple robes and rode in his chariot. He protected the state through his thunderbolts and preserved the sanctity of oaths — perjury was punished directly by him.","myth":"","poem":""},
|
||||||
|
{"id":"juno","name":"Juno","pantheon":"roman","epithet":"Regina · Queen of the Gods · Protectress of Rome","role":"Queen of the gods; goddess of marriage, women, childbirth, and the genius of the Roman state","domains":["marriage","women","the Roman state","childbirth","sky","the civic community"],"parents":["Saturn","Ops"],"siblings":["Jupiter","Neptune","Ceres","Pluto","Vesta"],"consorts":["Jupiter"],"children":["Mars","Vulcan","Juventas"],"symbols":["peacock","diadem","sceptre","pomegranate"],"sacredAnimals":["peacock","cow","cuckoo"],"equivalents":["Hera (Greek)"],"kabbalahPaths":[3,11,28],"description":"Juno Regina (Queen Juno) was the special protectress of Rome. The month of June is named for her. The sacred geese in her temple on the Capitoline Hill warned Rome of the Gallic attack in 390 BCE, saving the city. She represented the foundational importance of the institution of marriage and civic community in Roman life.","myth":"","poem":""},
|
||||||
|
{"id":"mars","name":"Mars","pantheon":"roman","epithet":"Gradivus · Pater Martius · Divine Father of Rome","role":"God of war and agriculture; divine father of Romulus, legendary founder of Rome","domains":["war","military power","agriculture (original domain)","spring","youth","the Roman legion"],"parents":["Jupiter","Juno"],"siblings":["Vulcan","Juventas"],"consorts":["Rhea Silvia (Vestal Virgin he visited in the sacred grove)"],"children":["Romulus","Remus"],"symbols":["spear","shield (Ancile)","wolf","woodpecker","armor","oak"],"sacredAnimals":["wolf","woodpecker","horse"],"equivalents":["Ares (Greek)"],"kabbalahPaths":[5,24,27],"description":"Unlike the despised Ares, Mars was Rome's second-most-important god. As father of Romulus, he was the divine ancestor of the Roman people. The month of March (Martius) is named for him, as is Tuesday (from the Germanic Tiw, identified with Mars: Old French Mardi). Originally an agricultural deity who protected crops and cattle from blight, he became primarily martial as Rome expanded.","myth":"","poem":""},
|
||||||
|
{"id":"venus","name":"Venus","pantheon":"roman","epithet":"Genetrix · Mother of the Roman People · Golden One","role":"Goddess of love, beauty, sex, fertility, prosperity, and the divine ancestor of Rome","domains":["love","beauty","fertility","prosperity","desire","victory","grace","+the sea (born from it)"],"parents":["born from sea-foam (as Aphrodite)"],"siblings":[],"consorts":["Vulcan (husband)","Mars (lover)","Anchises"],"children":["Cupid","Aeneas (by Anchises, Trojan hero and ancestor of Romans)"],"symbols":["dove","rose","myrtle","mirror","apple","shell"],"sacredAnimals":["dove","sparrow","swan","goose"],"sacredPlaces":["Cyprus","Eryx (Sicily)","Forum of Caesar (Rome)"],"equivalents":["Aphrodite (Greek)"],"kabbalahPaths":[7,14,16,22],"description":"Through Aeneas (son of Venus and the Trojan prince Anchises) the Romans traced their divine lineage to the gods. Julius Caesar and Augustus claimed descent from Venus. The planet Venus bears her name; the day Vendredi/Friday honours her. She was at once the universal generative force and the ancestor of the Roman imperial family.","myth":"","poem":""},
|
||||||
|
{"id":"mercury","name":"Mercury","pantheon":"roman","epithet":"Messenger of the Gods · Lord of Commerce · Guide of Souls","role":"God of commerce, communication, thieves, travellers, eloquence, and the guide of souls to the underworld","domains":["commerce","communication","travel","thieves","messages","eloquence","psychopomp (guide of souls)"],"parents":["Jupiter","Maia"],"siblings":["Minerva","Mars","Vulcan"],"consorts":[],"children":["Cupid (some traditions)"],"symbols":["caduceus (two serpents on a staff)","winged hat (petasus)","winged sandals (talaria)","purse"],"equivalents":["Hermes (Greek)","Thoth (Egyptian parallel)"],"kabbalahPaths":[8,12],"description":"The fleet-footed messenger of the gods who escorted souls to the underworld. The Romans particularly stressed his role as god of merchants and commercial success. The planet Mercury, the metal mercury (quicksilver), and Wednesday (Mercredi in French, Mercury's day) bear his name. The caduceus — his staff of intertwined serpents — became the symbol of medicine (through confusion with Asclepius's rod).","myth":"","poem":""},
|
||||||
|
{"id":"saturn","name":"Saturn","pantheon":"roman","epithet":"Lord of Time · God of the Golden Age · Father of Jupiter","role":"God of time, generation, wealth, dissolution, agriculture, and the memory of the Golden Age","domains":["time","generation","dissolution","wealth","agriculture","the Golden Age","the depths of earth"],"parents":["Caelus (Uranus/Sky)","Terra (Gaia/Earth)"],"siblings":["Ops (wife)","Titan equivalents"],"consorts":["Ops"],"children":["Jupiter","Juno","Neptune","Ceres","Pluto","Vesta"],"symbols":["scythe","sickle","harpe","grain","serpent eating its tail","hourglass"],"equivalents":["Kronos (Greek)"],"kabbalahPaths":[3,32],"description":"Saturn ruled the Golden Age of abundance and equality before Jupiter overthrew him. The Saturnalia festivals (December 17–23) — Rome's greatest holiday — honoured this primordial age by temporarily reversing social hierarchies: masters served slaves, gambling was legal, and gifts were exchanged. The planet Saturn, Saturday, and the metal lead bear his name.","myth":"","poem":""},
|
||||||
|
{"id":"neptune","name":"Neptune","pantheon":"roman","epithet":"Earth-Shaker · Lord of the Seas · God of Freshwater","role":"God of the sea, storms, earthquakes, horses, and all waters","domains":["sea","freshwater","storms","earthquakes","horses"],"parents":["Saturn","Ops"],"siblings":["Jupiter","Juno","Ceres","Pluto","Vesta"],"consorts":["Amphitrite","Salacia"],"children":["Triton","Polyphemus","Proteus"],"symbols":["trident","dolphin","horse","bull","sea-green robes"],"equivalents":["Poseidon (Greek)"],"kabbalahPaths":[23,29],"description":"Neptune was originally a god of freshwater before absorbing Poseidon's marine domain. His Neptunalia festival was held in late July, when water was scarce — water was drunk from springs and arbors were built in the open air. The planet Neptune bears his name.","myth":"","poem":""},
|
||||||
|
{"id":"diana","name":"Diana","pantheon":"roman","epithet":"Lady of Three Forms · Diana Trivia · Goddess of the Hunt","role":"Goddess of the hunt, the moon, childbirth, wilderness, and the crossroads","domains":["hunt","moon","childbirth","wilderness","chastity","crossroads","the night"],"parents":["Jupiter","Latona (Leto)"],"siblings":["Apollo (twin)"],"consorts":[],"children":[],"symbols":["crescent moon","quiver and bow","hunting dogs","torch","deer"],"equivalents":["Artemis (Greek)","triple goddess fusion with Luna and Hecate"],"kabbalahPaths":[9,13,25],"description":"Diana was a triple goddess: Diana (huntress on earth), Luna (moon in heaven), and Hecate/Trivia (crossroads/underworld). Her most ancient sanctuary was the grove at Aricia in the Alban Hills, where her priest-king won his position by killing his predecessor in single combat — a rite that fascinated the anthropologist Frazer in The Golden Bough and shaped modern comparative mythology.","myth":"","poem":""},
|
||||||
|
{"id":"vulcan","name":"Vulcan","pantheon":"roman","epithet":"Lord of Fire · Divine Smith · God Below","role":"God of fire, metalworking, volcanoes, craft, and the power of transformation through heat","domains":["fire","forge","metalworking","volcanoes","destruction (purifying)","craft"],"parents":["Jupiter","Juno"],"siblings":["Mars","Juventas"],"consorts":["Venus"],"children":["Caeculus (some traditions)","the Cyclopes (his workers)"],"symbols":["hammer","anvil","tongs","forge","pileus (felt workman's cap)"],"equivalents":["Hephaestus (Greek)"],"kabbalahPaths":[22,31],"description":"Vulcan's forge is located beneath Mount Etna (or on the Aeolian Islands). He crafted Jupiter's thunderbolts, Achilles's divine armour, the unbreakable chains that held Prometheus, and the net in which he entrapped his adulterous wife Venus with Mars. Volcanoes bear his name. His Vulcanalia festival was held in August when fires most threatened granaries.","myth":"","poem":""},
|
||||||
|
{"id":"janus","name":"Janus","pantheon":"roman","epithet":"God of Beginnings · Doorkeeper of Heaven · Two-Faced One","role":"God of beginnings, passages, doorways, time, duality, and all transitions","domains":["beginnings","endings","doorways","passages","time","duality","transitions","gates","bridges"],"parents":["uniquely Roman: often listed as son of Caelus or self-born from Chaos"],"siblings":[],"consorts":["Juturna (water nymph)"],"children":["Tiberinus (river god of the Tiber)","Canens","Fontus"],"symbols":["two faces (one looking forward, one back)","key","sceptre","door","staff"],"equivalents":["No Greek equivalent — uniquely Roman"],"kabbalahPaths":[2],"description":"Janus has no Greek equivalent, making him one of the most distinctively Roman gods. He looks to past and future simultaneously because he stands at every threshold. The month of January (Ianuarius) bears his name as the gateway of the year. His temple in the Roman Forum had two gates: both gates open signified Rome was at war; both closed (a rare occurrence) that peace reigned throughout the empire.","myth":"","poem":""},
|
||||||
|
{"id":"pluto","name":"Pluto","pantheon":"roman","epithet":"The Wealthy · Rich One · God Below","role":"God of the underworld, wealth from the earth, and the dead; ruler of the realm below","domains":["underworld","wealth (minerals from earth)","the dead","dark places","seeds buried in earth"],"parents":["Saturn","Ops"],"siblings":["Jupiter","Juno","Neptune","Ceres","Vesta"],"consorts":["Proserpina"],"children":[],"symbols":["bident","helmet of darkness","Cerberus","cornucopia (from below)","keys"],"equivalents":["Hades (Greek)"],"kabbalahPaths":[21,31],"description":"Pluto (Plouton, 'the Wealthy') is the Latin name for the underworld god, emphasising the riches that come from below — metals, gems, and the fertility that seeds develop when buried. Unlike the feared Hades of the Greeks, Pluto was seen in a slightly more benign light, associated with the abundant treasure hidden underground.","myth":"","poem":""},
|
||||||
|
{"id":"ceres","name":"Ceres","pantheon":"roman","epithet":"Mother of Crops · The Nourisher · Grain Mother","role":"Goddess of grain, agriculture, fertility, and the laws governing human civilization","domains":["grain","agriculture","fertility","the harvest","civilization","laws","motherhood"],"parents":["Saturn","Ops"],"siblings":["Jupiter","Juno","Neptune","Pluto","Vesta"],"consorts":["Jupiter"],"children":["Proserpina"],"symbols":["sheaf of grain","torch","poppy","sow (pig)","serpent","cornucopia"],"sacredAnimals":["pig","snake"],"equivalents":["Demeter (Greek)"],"kabbalahPaths":[10,20],"description":"Ceres was worshipped on the Aventine Hill in Rome alongside Liber (Dionysus) and Libera (Persephone). The Latin word 'cereal' derives from her name. The Cerealia festival each April celebrated the return of grain. Her daughter Proserpina's abduction by Pluto mirrored Demeter's search for Persephone in the Eleusinian mysteries.","myth":"","poem":""},
|
||||||
|
{"id":"ra","name":"Ra","pantheon":"egyptian","epithet":"Lord of All · He Who Made Himself · The Great Cat · Lord of Maat","role":"Solar god and creator deity; king of the gods; the power of the sun that sustains all life","domains":["sun","creation","kingship","light","warmth","growth","the solar barque","ordering chaos"],"parents":["self-created (in most traditions)","or born from the primordial Nun (waters of chaos)"],"siblings":[],"consorts":["Hathor","Mut (in some forms)"],"children":["Shu (air) and Tefnut (moisture) in some traditions","Thoth","Hathor","Maat"],"symbols":["solar disk","sun barque","falcon head","uraeus serpent","ankh","was sceptre"],"sacredAnimals":["scarab (as Khepri at dawn)","falcon (as Ra-Horakhty at noon)","cat (battles Apophis)","Bennu bird (phoenix)"],"sacredPlaces":["Heliopolis (On)","Karnak (merged with Amun)"],"equivalents":["Apollo/Helios (Greek-Roman)"],"kabbalahPaths":[6,30],"description":"Ra traverses the sky in his solar barque by day — accompanied by his divine crew including Thoth, Maat, and Horus — and through the Duat (underworld) by night, battling the chaos-serpent Apophis to rise again each dawn. His union with Osiris in the Underworld (Ra-Osiris) represents the joining of the living sun with the regenerating power of death.","myth":"","poem":""},
|
||||||
|
{"id":"osiris","name":"Osiris","pantheon":"egyptian","epithet":"Foremost of the Westerners · Lord of the Afterlife · The Green God","role":"God of the afterlife, resurrection, judgment, agriculture, and the cyclical renewal of life","domains":["afterlife","resurrection","judgment of souls","agriculture","fertility","vegetation","the Nile inundation"],"parents":["Geb (earth god)","Nut (sky goddess)"],"siblings":["Isis (wife)","Set (brother who killed him)","Nephthys","Horus the Elder"],"consorts":["Isis"],"children":["Horus the Younger"],"symbols":["crook and flail","white Atef crown","djed pillar","green or black skin","mummy wrappings","red throne"],"sacredAnimals":["bull (Apis)","ram","Bennu bird","Djed fish"],"sacredPlaces":["Abydos","Busiris","Philae"],"equivalents":["Dionysus (Greek mystery parallel)","Christ (resurrection parallel noted by Church Fathers)"],"kabbalahPaths":[6,10,16,23],"description":"Osiris was the first king of Egypt, the giver of agriculture and civilisation. His brother Set murdered and dismembered him out of jealousy, scattering the pieces across Egypt. Isis reassembled his body and Thoth restored it; Anubis performed the first embalming rites. Osiris was resurrected to become ruler of the dead, while his posthumously conceived son Horus inherited the throne. Every pharaoh was Horus in life and Osiris in death.","myth":"","poem":""},
|
||||||
|
{"id":"isis","name":"Isis","pantheon":"egyptian","epithet":"Great of Magic · Lady of Ten Thousand Names · Seat of the Pharaoh","role":"Goddess of magic, healing, motherhood, fertility, the throne, and the binding force of all life","domains":["magic","healing","motherhood","fertility","the throne","wind","resurrection","nature","knowledge"],"parents":["Geb","Nut"],"siblings":["Osiris (husband)","Set","Nephthys","Horus the Elder"],"consorts":["Osiris"],"children":["Horus the Younger"],"symbols":["throne headdress","wings","ankh","sistrum","knot of Isis (tyet)","star Sirius (heralds Nile flood)"],"sacredAnimals":["cow","swallow","scorpion","kite","cobra"],"sacredPlaces":["Philae","Dendera","Behbeit el-Hagar"],"equivalents":["Demeter (maternal grief myth)","Aphrodite (love and beauty)","Athena (wisdom and magic)","later Virgin Mary (mother/son imagery)"],"kabbalahPaths":[2,3,10,15,20,23],"description":"Isis is the greatest magician in the Egyptian pantheon. She collected the scattered pieces of Osiris's body, restored him with her magic, and conceived Horus posthumously. Her cult spread throughout the Roman Empire and profoundly influenced early Christianity — the madonna-and-child iconography of Isis nursing the infant Horus shaped Christian depictions of Mary and Jesus. She was worshipped in Rome, Greece, and as far north as Britain.","myth":"","poem":""},
|
||||||
|
{"id":"horus","name":"Horus","pantheon":"egyptian","epithet":"He Who Is Above · Falcon Lord of the Sky · Eye of Light","role":"Sky god; god of kingship and the living pharaoh; avenger of his father Osiris","domains":["sky","kingship","the pharaoh","war","protection","sun (right eye) and moon (left eye)","the horizon"],"parents":["Osiris","Isis"],"siblings":[],"consorts":["Hathor"],"children":["The Four Sons of Horus (Imsety, Hapy, Duamutef, Qebehsenuef)"],"symbols":["falcon","Eye of Horus (Wedjat/Udjat)","double crown (Pschent)","ankh","solar disk on falcon head"],"sacredAnimals":["falcon"],"sacredPlaces":["Edfu","Kom Ombo","Behdet","Hierakonpolis"],"equivalents":["Apollo (solar youth aspect)","the Christ (the son who conquers death)"],"kabbalahPaths":[5,19,27,31],"description":"Horus fought the chaos-god Set for 80 years in a series of contests to avenge his father Osiris and reclaim the throne of Egypt. In some battles his eye was torn out by Set and ground into pieces; Thoth (or Hathor) restored it — making the Eye of Horus the most potent protective symbol in all Egyptian magic. The living pharaoh was Horus incarnate; at death he became Osiris.","myth":"","poem":""},
|
||||||
|
{"id":"set","name":"Set","pantheon":"egyptian","epithet":"Lord of Chaos · Red One · Great of Strength · The Outcast","role":"God of chaos, storms, war, deserts, foreigners, and the creative/destructive force; guardian of Ra's solar barque","domains":["chaos","storms","deserts","war","foreigners","strength","darkness","creative destruction"],"parents":["Geb","Nut"],"siblings":["Osiris (who he killed)","Isis","Nephthys (wife)","Horus the Elder"],"consorts":["Nephthys","Anat","Astarte"],"children":["Anubis (by Nephthys, in some traditions)","Upuaut (some traditions)"],"symbols":["Set-animal (a fictional creature — pointed snout, square-tipped tail, ears like a donkey)","was sceptre","red crown","red animals"],"sacredAnimals":["Set animal","ass/donkey","hippopotamus","crocodile","red animals generally","pigs","scorpions"],"sacredPlaces":["Ombos","Sepermeru","Avaris (capital of Hyksos who honored him)","the Red Land (desert)"],"equivalents":["Ares (Greek, in violence aspect)","Typhon (Greek chaos-monster)"],"kabbalahPaths":[26],"description":"Set murdered and dismembered Osiris out of jealousy for his brother's popularity and kingship. Yet Set also stood at the prow of Ra's solar barque each night, using his great strength to hold off the chaos-serpent Apophis and ensure the sun could rise. He embodies necessary creative/destructive chaos — without the desert, the fertile Nile valley could not be defined.","myth":"","poem":""},
|
||||||
|
{"id":"nephthys","name":"Nephthys","pantheon":"egyptian","epithet":"Mistress of the House · Lady of Death · Friend of the Dead","role":"Goddess of death, mourning, night, transitions, and the service of the dead","domains":["death","mourning","night","service of the dead","protection of the dead","transitions","the horizon"],"parents":["Geb","Nut"],"siblings":["Osiris","Isis","Set","Horus the Elder"],"consorts":["Set"],"children":["Anubis (by Osiris, in some traditions)"],"symbols":["house + basket glyph on head","wings","kite (funeral bird)"],"sacredAnimals":["kite","crow","phoenix (in her mourning role)"],"equivalents":["Hecate (Greek liminal aspect)"],"kabbalahPaths":[3,5,10,25],"description":"Though married to Set, Nephthys mourned Osiris and helped Isis collect and reassemble his body. She and Isis were depicted as paired mourning birds (kites) on coffins, their outstretched wings protecting the dead. She guards the Abydos mystery plays that reenacted Osiris's death and resurrection. Her name means 'Lady of the House' — the House being the metaphorical temple-mansion of the gods.","myth":"","poem":""},
|
||||||
|
{"id":"thoth","name":"Thoth","pantheon":"egyptian","epithet":"Ibis-Headed · Lord of Moon, Magic, and Writing · Thrice-Great","role":"God of the moon, wisdom, writing, magic, judgment, mediation, and the measurement of time","domains":["moon","wisdom","writing","magic","science","judgment of souls","mediation","time measurement","language"],"parents":["Ra (in most traditions)","self-created (in Hermopolitan tradition)"],"siblings":[],"consorts":["Ma'at","Seshat (scribal goddess)"],"children":["Seshat"],"symbols":["ibis head","crescent moon","papyrus scroll and writing palette","ankh","caduceus (as Hermes)"],"sacredAnimals":["ibis","baboon"],"sacredPlaces":["Hermopolis (Khemenu)","Tell el-Amarna"],"equivalents":["Hermes (Greek)","Mercury (Roman)","the synthesis creating Hermes Trismegistus, 'Thrice-Great', patron of Hermeticism and Western alchemy"],"kabbalahPaths":[2,8,12],"description":"Thoth invented writing, language, mathematics, astronomy, and magic. He recorded the weighing of the heart against Ma'at's feather in the Hall of Two Truths. Greek philosophy identified him with Hermes, producing Hermes Trismegistus — the legendary author of the Hermetic texts, the Corpus Hermeticum, which shaped Neoplatonism, alchemy, Kabbalah, and the Western magical tradition.","myth":"","poem":""},
|
||||||
|
{"id":"hathor","name":"Hathor","pantheon":"egyptian","epithet":"House of Horus · Golden One · Mistress of Love · Eye of Ra","role":"Goddess of love, beauty, music, dance, fertility, the sky, and the joyful aspect of feminine divinity","domains":["love","beauty","music","dance","fertility","sky","women","the dead","drunkenness","foreign lands","gold","turquoise"],"parents":["Ra"],"siblings":[],"consorts":["Horus"],"children":["Ihy (god of music and sistrum)"],"symbols":["cow horns encircling solar disk","sistrum (rattle)","mirror","menat necklace","turquoise"],"sacredAnimals":["cow","falcon","lioness (when she becomes the Eye of Ra in her wrathful aspect, Sekhmet)"],"sacredPlaces":["Dendera","Deir el-Bahari","Serabit el-Khadim (Sinai)"],"equivalents":["Aphrodite/Venus","Isis (overlapping functions)"],"kabbalahPaths":[7,14],"description":"Hathor embodies the feminine principle in its most joyous aspect — music, dance, love, fragrance, and beauty. She also received the dead in the west and offered them bread and beer. At Dendera her cult provided medical therapies alongside ritual. When Ra sent her as Sekhmet to destroy humanity, she was stopped by being given red-dyed beer to drink, which she mistook for blood.","myth":"","poem":""},
|
||||||
|
{"id":"anubis","name":"Anubis","pantheon":"egyptian","epithet":"Lord of the Sacred Land · He Upon His Mountain · Guardian of the Scales","role":"God of embalming, mummification, cemeteries, and the weighing of souls at judgment","domains":["embalming","mummification","the dead","cemeteries","judgment of souls","protection of graves","the Western horizon"],"parents":["Nephthys and Osiris (most common)","Set and Nephthys","Ra and Nephthys"],"siblings":["Wepwawet (Wolf-path opener)"],"consorts":["Anput"],"children":["Kebechet (purification)"],"symbols":["jackal or dog head","flail","scales (for weighing hearts)","mummy wrappings","embalming tools"],"sacredAnimals":["jackal","dog"],"sacredPlaces":["Cynopolis","the embalming tents of all Egypt"],"equivalents":["Hermes Psychopomp (Greek — the later Greeks called him Hermanubis, fusing both guides of souls)"],"kabbalahPaths":[8,29],"description":"Anubis guided souls through the Duat (underworld) and oversaw the most critical rite of Egyptian religion: the weighing of the heart against the feather of Ma'at. If the heart was heavier than the feather, the demon Ammit devoured it; if balanced, the soul entered paradise. He invented embalming when he cared for Osiris's murdered body. His sharp jackal senses could detect spiritual impurity.","myth":"","poem":""},
|
||||||
|
{"id":"maat","name":"Ma'at","pantheon":"egyptian","epithet":"Lady of Truth · The Feather · Daughter of Ra","role":"Goddess and personification of cosmic truth, justice, balance, order, and the harmony on which all existence depends","domains":["truth","justice","balance","cosmic order","law","morality","the weighing of souls","the seasons","stars in their courses"],"parents":["Ra"],"siblings":["Thoth (consort)"],"consorts":["Thoth"],"children":[],"symbols":["ostrich feather","scales","ankh","sceptre","outstretched wings"],"equivalents":["Themis (Greek)","Astraea (Roman)","Iustitia (Roman)"],"kabbalahPaths":[22],"description":"Ma'at's single feather was the counterweight against which the heart of every deceased person was weighed. The heart (containing all one's deeds and character) had to balance precisely with the feather of truth to enter paradise. All pharaohs ruled 'in ma'at' — in truth and cosmic order. The opposite of ma'at was isfet: chaos, injustice, disorder. The entire project of Egyptian civilization was to maintain ma'at against the encroachment of isfet.","myth":"","poem":""},
|
||||||
|
{"id":"ptah","name":"Ptah","pantheon":"egyptian","epithet":"The Beautiful Face · Lord of Truth · Father of Beginnings","role":"Creator god of Memphis; patron of craftsmen, architects, and the arts; creator through thought and logos","domains":["creation","craftsmanship","architecture","thought","speech (logos)","the arts","the Underworld's stability (as Sokar-Osiris-Ptah)"],"parents":["self-created (no parents in Memphite theology)"],"siblings":[],"consorts":["Sekhmet (lioness goddess)","Bast (cat goddess, some traditions)"],"children":["Nefertum (lotus god)","Imhotep (deified as his son)"],"symbols":["mummy wrappings (but standing upright)","was sceptre","djed pillar","straight false beard"],"sacredAnimals":["Apis bull (lived in his Memphis temple)"],"sacredPlaces":["Memphis (Hikuptah, 'temple of the ka of Ptah' — giving Egypt its name in Greek)"],"equivalents":["Hephaestus/Vulcan (craft)","the Logos principle (philosophical creation through speech)"],"kabbalahPaths":[1,23],"description":"The Memphite theology of Ptah is perhaps the most philosophically sophisticated of all ancient religious texts: Ptah created the world through his heart (thought) and tongue (speech) — a doctrine of creation by logos that anticipates both the Greek Logos concept of Plato and the opening of the Gospel of John. The name Egypt derives from the Greek corruption of 'Hikuptah' — the temple of Ptah's ka in Memphis.","myth":"","poem":""},
|
||||||
|
{"id":"amoun","name":"Amoun (Amun)","pantheon":"egyptian","epithet":"The Hidden One · King of the Gods · Lord of the Thrones of the Two Lands","role":"King of the gods and the national deity of Egypt; god of the hidden creative force, wind, and fertility","domains":["hidden things","wind","fertility","kingship","the sun (as Amun-Ra the composite deity)","air","creation"],"parents":["self-created (primordial god of the Ogdoad of Hermopolis)"],"siblings":["Amunet (his female counterpart)"],"consorts":["Mut"],"children":["Khonsu (moon god)"],"symbols":["double plumed crown","ram horns","blue skin (the colour of invisibility)","ankh and sceptre"],"sacredAnimals":["ram","goose"],"sacredPlaces":["Karnak (Thebes) — the largest temple complex ever built","Siwa Oasis (Oracle of Amun, consulted by Alexander the Great)"],"equivalents":["Zeus/Jupiter (king of gods aspect)","identification with Ramesses II who called himself 'son of Amun'"],"kabbalahPaths":[0,2,4,21],"description":"Amun means 'the hidden one' — the creative breath behind all manifestation that cannot be seen or named directly. As Amun-Ra he united primordial hiddenness with solar radiance, becoming the most powerful god of the New Kingdom. The Oracle of Amun at Siwa was the most famous oracle in the ancient world: Alexander the Great made a legendary journey through the desert to hear it, and was told he was the son of Amun.","myth":"","poem":""},
|
||||||
|
{"id":"khephra","name":"Khephra","pantheon":"egyptian","epithet":"The Becoming · He Who Transforms · Dawn Scarab","role":"God of the sunrise, self-transformation, self-creation, and the daily resurrection of the sun","domains":["sunrise","transformation","self-creation","resurrection","dawn","the becoming","potential"],"parents":["Ra (as dawn-aspect of the same solar deity)"],"siblings":["Ra (noon)","Atum (sunset/evening)"],"consorts":[],"children":[],"symbols":["scarab beetle rolling a ball of dung (= the sun)","solar disk above scarab","ouroboros"],"sacredAnimals":["scarab beetle (Scarabaeus sacer)"],"equivalents":["Helios (Greek dawn aspect)"],"kabbalahPaths":[18,24,29],"description":"Khephra is Ra at the moment of dawn — the scarab beetle who rolls the solar disc over the horizon just as dung beetles roll their balls of dung. The Egyptian word for 'scarab' (kheper) means 'to come into being, to become' — making Khephra the god of perpetual becoming and transformation rather than static being. Scarab amulets were the most common protective charm in ancient Egypt, placed over the heart in mummies.","myth":"","poem":""},
|
||||||
|
{"id":"nuit","name":"Nuit","pantheon":"egyptian","epithet":"Lady of the Stars · She Who Holds a Thousand Souls · Infinite Space","role":"Goddess of the sky, night, stars, and the cosmic vault of heaven who swallows and rebirths the sun","domains":["sky","stars","night","the cosmos","afterlife (she swallows and rebirths the sun)","infinity","space"],"parents":["Shu (god of air)","Tefnut (goddess of moisture)"],"siblings":["Geb (earth god, her husband)"],"consorts":["Geb","Ra"],"children":["Osiris","Isis","Set","Nephthys","Horus the Elder"],"symbols":["star-covered body arching over the earth","blue or black skin covered with stars","pot (meaning 'sky')","coffin lids"],"equivalents":["Ouranos/Caelus (sky)","in Thelema: infinite space and the body of the goddess"],"kabbalahPaths":[0,2,28],"description":"Nuit arches her body over the earth (Geb), and the stars adorn her skin. She swallows the sun each evening and gives birth to it each morning. In the Thelemic system of Aleister Crowley (whose work inspired Liber 777), Nuit became a central cosmic deity representing infinite space, the totality of all possibilities, the night sky as the body of the goddess. Her first words in the Book of the Law: 'Every man and every woman is a star.'","myth":"","poem":""},
|
||||||
|
{"id":"eheieh","name":"Eheieh","pantheon":"hebrew","epithet":"I Am · Pure Being · That Which Was, Is, and Will Be · Ain Soph Aur made manifest","role":"Divine Name of Kether; the first and purest emanation of existence itself; pure being without attributes","domains":["pure being","the Crown","the source","the unmoved mover","unity","the point before creation"],"hebrew":"אהיה","meaning":"I Am / I Will Be (from the root HYH, 'to be')","sephirah":1,"kabbalahPaths":[1],"description":"Eheieh (אהיה) is the divine name given to Moses at the Burning Bush — 'Eheieh asher Eheieh' (I am that I am / I will be what I will be). In Kabbalah it is the name of pure undifferentiated existence at the Crown of the Tree. It has no attributes or qualities — only the simple, inexhaustible fact of being. To vibrate this name in meditation is to touch the ground of existence itself.","myth":"","poem":""},
|
||||||
|
{"id":"yah","name":"Yah","pantheon":"hebrew","epithet":"The Contracted Name · The Father · The Primordial Wisdom","role":"Divine Name of Chokmah; the first two letters of the Tetragrammaton; pure creative wisdom","domains":["wisdom","the Father principle","the creative impulse","the word before manifestation","the starry cosmos"],"hebrew":"יה","meaning":"The Lord (contracted form of YHVH, the first two letters Yod-Heh)","sephirah":2,"kabbalahPaths":[2],"description":"Yah is the most contracted form of the ineffable name. As the divine name of Chokmah (Wisdom), it represents the point of pure wisdom before it unfolds into understanding. Yah appears repeatedly in Psalms ('Hallelujah' = 'Praise Yah'). In Kabbalistic meditation, Yah is the name associated with the primordial Father and the cosmic seed of all creation.","myth":"","poem":""},
|
||||||
|
{"id":"yhvh-elohim","name":"YHVH Elohim","pantheon":"hebrew","epithet":"The Lord God · Father-Mother · The Understanding","role":"Divine Name of Binah; the Lord God of Understanding; the union of the masculine name with the feminine plural","domains":["understanding","the Great Sea","the womb of creation","time","structure","the cosmic mother","sorrow and joy"],"hebrew":"יהוה אלהים","meaning":"The Lord God (masculine singular name + feminine plural noun with singular verb = grammatical paradox of divine unity in duality)","sephirah":3,"kabbalahPaths":[3],"description":"The combination of the Tetragrammaton (YHVH) with Elohim (a grammatically feminine plural used with masculine singular verbs) represents the paradoxical union of masculine and feminine in Binah, the Great Sea of Understanding. Binah is the dark womb that gives all forms to the pure wisdom of Chokmah — the primal matter that receives and shapes the divine seed.","myth":"","poem":""},
|
||||||
|
{"id":"el","name":"El","pantheon":"hebrew","epithet":"God the Strong · The Mighty One · Ancient of Days","role":"Divine Name of Chesed; the all-powerful, all-merciful expression of divine strength turned toward blessing","domains":["mercy","strength","benevolence","grace","abundance","divine power (turned to healing not destruction)"],"hebrew":"אל","meaning":"God / The Strong One (identical root with Arabic 'Allah' and Akkadian 'Ilu')","sephirah":4,"kabbalahPaths":[4,23],"description":"El is the most ancient Semitic word for God, with cognates in every Semitic language including Arabic 'Allah.' In Kabbalah, El governs Chesed — divine mercy, boundless abundance, and the benevolent expression of power. The divine name El is the root of many angelic names: Micha-El, Gabri-El, Rapha-El, all meaning '[attribute] of God.'","myth":"","poem":""},
|
||||||
|
{"id":"elohim-gibor","name":"Elohim Gibor","pantheon":"hebrew","epithet":"Almighty God · God of Armies · The Severe One","role":"Divine Name of Geburah; the all-powerful God who executes justice, removes what is corrupt, and tests with fire","domains":["strength","severity","justice","war","divine wrath","purification","the surgeon's knife"],"hebrew":"אלהים גבור","meaning":"Almighty God / The Mighty Gods (Elohim = plural of majesty; Gibor = mighty, hero)","sephirah":5,"kabbalahPaths":[5],"description":"Elohim Gibor represents the severe and just dimension of God — not cruelty, but the absolute necessity of cutting away what does not serve divine purpose. Geburah is the sphere of Mars, of divine warriors, of judgment that cannot be swayed by sentiment. In traditional Kabbalah, an unbalanced Geburah (too much severity) descends into cruelty; an unbalanced Chesed (too much mercy) descends into weakness.","myth":"","poem":""},
|
||||||
|
{"id":"yhvh-eloah","name":"YHVH Eloah ve-Daath","pantheon":"hebrew","epithet":"God Manifest in Knowledge · Lord of Beauty · The Solar Heart","role":"Divine Name of Tiphareth; God made knowable; the heart of the Tree; the solar-sacrifice principle","domains":["beauty","the heart","solar consciousness","sacrifice","the son/sun","healing","harmony","the redeemed self"],"hebrew":"יהוה אלוה ודעת","meaning":"God (YHVH) manifest as Eloah (singular) in/through Da'ath (Knowledge)","sephirah":6,"kabbalahPaths":[6],"description":"This divine name speaks of God becoming personally knowable — the abstract descending into a form that conscious beings can encounter directly. Tiphareth is the solar heart of the Tree, associated with all the solar-sacrifice figures across traditions: Osiris, Dionysus, Adonis, and the Christ. At Tiphareth the initiate experiences the Knowledge and Conversation of the Holy Guardian Angel — the higher self.","myth":"","poem":""},
|
||||||
|
{"id":"yhvh-tzabaoth","name":"YHVH Tzabaoth","pantheon":"hebrew","epithet":"Lord of Hosts · Lord of Armies · Victorious God","role":"Divine Name of Netzach; God as commander of the armies of nature, of passion, and of creative force","domains":["victory","natural forces","the passions","emotion","creativity","instinct","the armies of the divine"],"hebrew":"יהוה צבאות","meaning":"The Lord of Hosts / Armies (Tzabaoth = multitudes, hosts, armies)","sephirah":7,"kabbalahPaths":[7],"description":"Netzach represents the natural, instinctual energies — the force of desire, creativity, and natural beauty. YHVH Tzabaoth is God as the commander of all these forces. In magical work, Netzach corresponds to nature spirits, the elemental powers of creativity, and the raw material that intellect (Hod) works upon. The tension between nature (Netzach) and mind (Hod) is one of the fundamental polarities of psychological and magical work.","myth":"","poem":""},
|
||||||
|
{"id":"elohim-tzabaoth","name":"Elohim Tzabaoth","pantheon":"hebrew","epithet":"God of Hosts · God of Splendour · Lord of the Divine Mind","role":"Divine Name of Hod; God as the source of intellect, language, magical symbolism, and divine splendour","domains":["splendour","intellect","communication","magic","the divine mind","language","symbolic thought"],"hebrew":"אלהים צבאות","meaning":"God of Hosts / God of Armies (with Elohim's grammatical feminine-plural paradox)","sephirah":8,"kabbalahPaths":[8],"description":"Hod (Splendour) governs the abstract mind, language, and magic — Hermes, Mercury, Thoth are its planetary rulers. Elohim Tzabaoth reflects Hod's diversity: the plural Elohim represents the many forms through which divine mind manifests in language, mathematics, and magical correspondence. The Hermetic arts — astrology, alchemy, ritual magic — all operate within the sphere of Hod.","myth":"","poem":""},
|
||||||
|
{"id":"shaddai-el-chai","name":"Shaddai El Chai","pantheon":"hebrew","epithet":"Almighty Living God · The Eternal Life · Foundation of All","role":"Divine Name of Yesod; the living generative force of creation; the etheric current beneath the physical world","domains":["the living force","the etheric substratum","sexuality","the Foundation","the moon","dreams","the astral plane","fertility"],"hebrew":"שדי אל חי","meaning":"Almighty Living God (Shaddai = the Almighty, from 'breast/nourisher'; El = God; Chai = Living/Life)","sephirah":9,"kabbalahPaths":[9],"description":"Yesod is the Foundation — the invisible etheric substratum that underlies and supports material existence. Shaddai El Chai is the Living God as the perpetual creative life-force flowing through all matter. The moon governs Yesod; dreams, visions, and the astral plane are its territory. The divine name Shaddai is found on mezuzot and amulets as a protective word at every threshold.","myth":"","poem":""},
|
||||||
|
{"id":"adonai-melek","name":"Adonai Melek","pantheon":"hebrew","epithet":"Lord and King · God of Earth · The Immanent One","role":"Divine Name of Malkuth; God as present, immanent, and incarnate in the material world itself","domains":["the Kingdom","earth","the physical world","nature","the body","the Shekinah (divine presence in the world)"],"hebrew":"אדני מלך","meaning":"Lord and King (Adonai = My Lord, used in place of YHVH in prayer; Melek = King)","sephirah":10,"kabbalahPaths":[10],"description":"Malkuth is the culmination of all the higher sephiroth made physical in matter. Adonai Melek is God present and immanent — the divine spark within physical matter, the Shekinah (the indwelling female presence of God in the world). The mystical tradition holds that the goal of the Kabbalistic path is not to escape the material world but to raise Malkuth — to reveal the Kingdom in all its divine splendour.","myth":"","poem":""},
|
||||||
|
{"id":"metatron","name":"Metatron","pantheon":"archangel","epithet":"Chancellor of Heaven · Prince of the Divine Countenance · The Recording Angel","role":"Highest archangel; scribe of God; guardian of Kether; sometimes identified as the transformed prophet Enoch","domains":["the Crown","the divine throne","heavenly scribe who records all deeds","the angelic hierarchy","divine mysteries","transmutation of human to angelic"],"hebrew":"מטטרון","sephirah":1,"kabbalahPaths":[1],"description":"Metatron holds a unique position among angels — he was once the prophet Enoch ('he walked with God and was not, for God took him,' Genesis 5:24), transformed into the highest archangel. He is the celestial scribe who records all human deeds in the Book of Life, and is the being closest to the divine throne. Some texts describe him as so exalted that another angel mistook him for God and was corrected.","myth":"","poem":""},
|
||||||
|
{"id":"ratziel","name":"Ratziel","pantheon":"archangel","epithet":"Herald of God · Angel of Mysteries · Keeper of Divine Secrets","role":"Archangel of Chokmah; keeper of the mysteries of divine wisdom and cosmic law","domains":["divine mysteries","cosmic law","wisdom","heavenly secrets","the stars","astrology","the primordial Torah"],"hebrew":"רציאל","sephirah":2,"kabbalahPaths":[2],"description":"Ratziel (Raziel, 'Secret of God') is said to have written the Sefer Raziel — a compendium of divine secrets overheard standing beside the throne of God. He reportedly gave this book to Adam after the Fall, warning him of the consequences of sin. Later Noah received it before the flood. The Sefer Raziel ha-Malakh is an actual medieval Kabbalistic text of angelic magic attributed to him.","myth":"","poem":""},
|
||||||
|
{"id":"tzaphkiel","name":"Tzaphkiel","pantheon":"archangel","epithet":"Contemplation of God · The Watcher · Angel of the Abyss","role":"Archangel of Binah; the divine contemplator; angel of grief, time, structure, and profound understanding","domains":["understanding","contemplation","sorrow","time","structure","the Abyss","the nature of limitation"],"hebrew":"צאפקיאל","sephirah":3,"kabbalahPaths":[3],"description":"Tzaphkiel (Zaphkiel/Jophiel in some traditions) governs Binah — the Great Sea of Understanding, the sphere of Saturn and the divine mother. Binah is associated with sorrow not because it is negative, but because Understanding necessarily involves limitation: to understand something is to give it form and boundary, which means accepting what it is not. Tzaphkiel embodies the contemplative stillness required for this deepest kind of knowing.","myth":"","poem":""},
|
||||||
|
{"id":"tzadkiel","name":"Tzadkiel","pantheon":"archangel","epithet":"Righteousness of God · Angel of Mercy · Interceding Angel","role":"Archangel of Chesed; divine mercy and benevolence; the angel who stayed Abraham's hand at Mount Moriah","domains":["mercy","benevolence","abundance","grace","justice turned to compassion","the virtue of charity","the planet Jupiter"],"hebrew":"צדקיאל","sephirah":4,"kabbalahPaths":[4],"description":"Tzadkiel (Zadkiel, 'Righteousness of God') governs Chesed — mercy, abundance, and expansion. He is the angel who stayed Abraham's hand before the sacrifice of Isaac, replacing the boy with a ram. He is invoked for mercy, forgiveness, and for dissolving rigid patterns with the warmth of divine love. In magical tradition he is the angel of Jupiter, associated with all forms of increase and blessing.","myth":"","poem":""},
|
||||||
|
{"id":"kamael","name":"Kamael","pantheon":"archangel","epithet":"Strength of God · The Burning One · Angel of Divine Wrath","role":"Archangel of Geburah; the divine warrior; angel of strength, courage, justice, and the purifying fire","domains":["strength","courage","severity","divine justice","war","the removal of impurity","the planet Mars","the Seraphim"],"hebrew":"כמאל","sephirah":5,"kabbalahPaths":[5],"description":"Kamael (Camael, Chamuel — 'Strength of God') is the archangel of Geburah — divine severity and martial power. He is the warrior who executes divine justice, cuts away spiritual corruption, and governs the Seraphim (the Fiery Serpents). In some traditions he is the angel who wrestled with Jacob at the ford of Jabbok. His fire purifies what cannot be healed any other way.","myth":"","poem":""},
|
||||||
|
{"id":"raphael","name":"Raphael","pantheon":"archangel","epithet":"God Has Healed · The Divine Physician · Angel of Healing and Travel","role":"Archangel of Tiphareth; healer of God; guide of travellers; regent of the solar heart","domains":["healing","the sun","beauty","travel","sight","the planet Mercury (in some attributions)","Tiphareth's solar warmth"],"hebrew":"רפאל","sephirah":6,"kabbalahPaths":[6],"description":"Raphael ('God Heals') is named explicitly in the Book of Tobit, where he accompanies the young Tobias disguised as a human companion, heals Tobias's blind father with fish gall, and defeats the demon Asmodeus. In the Book of Enoch he is set over all diseases and wounds. His name teaches that genuine healing is a divine act, a restoration of wholeness in alignment with the divine image.","myth":"","poem":""},
|
||||||
|
{"id":"haniel","name":"Haniel","pantheon":"archangel","epithet":"Grace of God · Glory of God · Angel of Love and Beauty","role":"Archangel of Netzach; angel of love, beauty, the arts, natural instinct, and the planet Venus","domains":["love","beauty","joy","natural forces","the arts","desire","the planet Venus","the emotions"],"hebrew":"חאניאל","sephirah":7,"kabbalahPaths":[7],"description":"Haniel ('Grace of God') governs Netzach — the sphere of natural beauty, desire, and creative instinct. He is invoked in magical work related to love, art, and the healing of emotional wounds. In some traditions he escorted Enoch to heaven. His domain is the gap between natural desire (Netzach) and its refining by the mind (Hod) — the raw material of all art and spiritual longing.","myth":"","poem":""},
|
||||||
|
{"id":"michael","name":"Michael","pantheon":"archangel","epithet":"Who Is Like God? · Prince of Light · Champion of Heaven","role":"Archangel of Hod; greatest of archangels; divine champion who cast Lucifer from heaven; protector against evil","domains":["protection","justice","war against evil","the angelic armies","communication","the planet Mercury","spiritual warfare","the weighing of souls (with Gabriel)"],"hebrew":"מיכאל","sephirah":8,"kabbalahPaths":[8],"description":"Michael ('Who is like God?' — the question implies: no one) is the greatest archangel in Jewish, Christian, and Islamic traditions (as Mika'il). He cast Lucifer from heaven, guarded the gate of Eden, fought with the archangel for Moses's body, and will lead the heavenly armies at the Last Battle. In Christianity he is the patron of knights, police, and the military; in Islam he brings rain and thunder. He will weigh souls at the Last Judgment.","myth":"","poem":""},
|
||||||
|
{"id":"gabriel","name":"Gabriel","pantheon":"archangel","epithet":"God Is My Strength · The Divine Herald · Angel of Revelation","role":"Archangel of Yesod; divine messenger par excellence; angel of annunciation, prophecy, and the moon's etheric current","domains":["messages","revelation","prophecy","dreams","the moon","water","the etheric body","the Foundation","the unconscious"],"hebrew":"גבריאל","sephirah":9,"kabbalahPaths":[9],"description":"Gabriel ('God is my Strength') announced the birth of Christ to Mary (the Annunciation), revealed the Quran to Muhammad over 23 years, and explained Daniel's apocalyptic visions. He governs Yesod — the etheric substratum where dreams, visions, and psychic current flow. In the Talmud he is the angel who turned Sodom to ash. He stands at the West in elemental magic, governing Water and the psychic unconscious.","myth":"","poem":""},
|
||||||
|
{"id":"sandalphon","name":"Sandalphon","pantheon":"archangel","epithet":"The Twin Brother · Guardian of Earth · Weaver of Prayers","role":"Archangel of Malkuth; guardian of the material earth and physical world; twin of Metatron; weaver of human prayers into garlands before the divine throne","domains":["earth","the Kingdom","physical manifestation","prayers ascending to God","the material world's sanctity","the body as temple"],"hebrew":"סנדלפון","sephirah":10,"kabbalahPaths":[10],"description":"Sandalphon corresponds to Malkuth — the physical earth — and stands as the twin polarity of Metatron at Kether. One governs the Crown, the other the Kingdom; between them stretches the entire Tree. Ancient texts describe Sandalphon as so immeasurably tall that his feet touch the earth while his head reaches into heaven — a perfect symbol of Malkuth as both the lowest and the most fully present sphere. He is said to gather all human prayers and weave them into garlands for God's crown.","myth":"","poem":""}
|
||||||
|
]
|
||||||
|
}
|
||||||
239
data/hebrew-calendar.json
Normal file
@@ -0,0 +1,239 @@
|
|||||||
|
{
|
||||||
|
"meta": {
|
||||||
|
"version": 1,
|
||||||
|
"notes": "Hebrew (Jewish) lunisolar calendar months with traditional associations. Holiday records are centralized in calendar-holidays.json."
|
||||||
|
},
|
||||||
|
"calendar": {
|
||||||
|
"id": "hebrew",
|
||||||
|
"label": "Hebrew Calendar",
|
||||||
|
"type": "lunisolar",
|
||||||
|
"script": "Hebrew",
|
||||||
|
"description": "The Hebrew calendar is a lunisolar calendar used for Jewish religious observances. The religious year begins with Nisan (month of Passover); the civil year begins with Tishrei. A leap year adds a second Adar (Adar II), making 13 months."
|
||||||
|
},
|
||||||
|
"months": [
|
||||||
|
{
|
||||||
|
"id": "nisan",
|
||||||
|
"order": 1,
|
||||||
|
"name": "Nisan",
|
||||||
|
"nativeName": "נִיסָן",
|
||||||
|
"days": 30,
|
||||||
|
"season": "Spring",
|
||||||
|
"zodiacSign": "aries",
|
||||||
|
"tribe": "Judah",
|
||||||
|
"sense": "Speech",
|
||||||
|
"hebrewLetter": "He (ה)",
|
||||||
|
"associations": {
|
||||||
|
"zodiacSignId": "aries",
|
||||||
|
"hebrewLetterId": "he"
|
||||||
|
},
|
||||||
|
"description": "The first month of the religious year. Called the 'month of redemption.' Passover (Pesach) commemorates the Exodus from Egypt."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "iyar",
|
||||||
|
"order": 2,
|
||||||
|
"name": "Iyar",
|
||||||
|
"nativeName": "אִיָּר",
|
||||||
|
"days": 29,
|
||||||
|
"season": "Spring",
|
||||||
|
"zodiacSign": "taurus",
|
||||||
|
"tribe": "Issachar",
|
||||||
|
"sense": "Thought",
|
||||||
|
"hebrewLetter": "Vav (ו)",
|
||||||
|
"associations": {
|
||||||
|
"zodiacSignId": "taurus",
|
||||||
|
"hebrewLetterId": "vav"
|
||||||
|
},
|
||||||
|
"description": "A month of counting and transition between Passover and Shavuot. Yom HaShoah and Yom Ha'atzmaut fall here."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "sivan",
|
||||||
|
"order": 3,
|
||||||
|
"name": "Sivan",
|
||||||
|
"nativeName": "סִיוָן",
|
||||||
|
"days": 30,
|
||||||
|
"season": "Late Spring",
|
||||||
|
"zodiacSign": "gemini",
|
||||||
|
"tribe": "Zebulun",
|
||||||
|
"sense": "Walking",
|
||||||
|
"hebrewLetter": "Zayin (ז)",
|
||||||
|
"associations": {
|
||||||
|
"zodiacSignId": "gemini",
|
||||||
|
"hebrewLetterId": "zayin"
|
||||||
|
},
|
||||||
|
"description": "Month of the giving of the Torah at Sinai. Shavuot (Festival of Weeks) falls on the 6th."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tammuz",
|
||||||
|
"order": 4,
|
||||||
|
"name": "Tammuz",
|
||||||
|
"nativeName": "תַּמּוּז",
|
||||||
|
"days": 29,
|
||||||
|
"season": "Summer",
|
||||||
|
"zodiacSign": "cancer",
|
||||||
|
"tribe": "Reuben",
|
||||||
|
"sense": "Sight",
|
||||||
|
"hebrewLetter": "Het (ח)",
|
||||||
|
"associations": {
|
||||||
|
"zodiacSignId": "cancer",
|
||||||
|
"hebrewLetterId": "het"
|
||||||
|
},
|
||||||
|
"description": "A month associated with mourning. The Golden Calf was made and the Tablets were broken on the 17th."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "av",
|
||||||
|
"order": 5,
|
||||||
|
"name": "Av",
|
||||||
|
"nativeName": "אָב",
|
||||||
|
"days": 30,
|
||||||
|
"season": "Summer",
|
||||||
|
"zodiacSign": "leo",
|
||||||
|
"tribe": "Simeon",
|
||||||
|
"sense": "Hearing",
|
||||||
|
"hebrewLetter": "Tet (ט)",
|
||||||
|
"associations": {
|
||||||
|
"zodiacSignId": "leo",
|
||||||
|
"hebrewLetterId": "tet"
|
||||||
|
},
|
||||||
|
"description": "A month of mourning that ends with celebration. Tisha B'Av commemorates the destruction of both Temples."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "elul",
|
||||||
|
"order": 6,
|
||||||
|
"name": "Elul",
|
||||||
|
"nativeName": "אֱלוּל",
|
||||||
|
"days": 29,
|
||||||
|
"season": "Late Summer",
|
||||||
|
"zodiacSign": "virgo",
|
||||||
|
"tribe": "Gad",
|
||||||
|
"sense": "Action",
|
||||||
|
"hebrewLetter": "Yod (י)",
|
||||||
|
"associations": {
|
||||||
|
"zodiacSignId": "virgo",
|
||||||
|
"hebrewLetterId": "yod"
|
||||||
|
},
|
||||||
|
"description": "A month of preparation and teshuva (repentance) before the High Holy Days. The shofar is blown daily."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tishrei",
|
||||||
|
"order": 7,
|
||||||
|
"name": "Tishrei",
|
||||||
|
"nativeName": "תִּשְׁרֵי",
|
||||||
|
"days": 30,
|
||||||
|
"season": "Autumn",
|
||||||
|
"zodiacSign": "libra",
|
||||||
|
"tribe": "Ephraim",
|
||||||
|
"sense": "Coition",
|
||||||
|
"hebrewLetter": "Lamed (ל)",
|
||||||
|
"associations": {
|
||||||
|
"zodiacSignId": "libra",
|
||||||
|
"hebrewLetterId": "lamed"
|
||||||
|
},
|
||||||
|
"description": "The holiest month of the year. Contains Rosh Hashanah (New Year), Yom Kippur (Day of Atonement), and Sukkot."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "cheshvan",
|
||||||
|
"order": 8,
|
||||||
|
"name": "Cheshvan",
|
||||||
|
"nativeName": "חֶשְׁוָן",
|
||||||
|
"days": 29,
|
||||||
|
"daysVariant": 30,
|
||||||
|
"season": "Autumn",
|
||||||
|
"zodiacSign": "scorpio",
|
||||||
|
"tribe": "Manasseh",
|
||||||
|
"sense": "Smell",
|
||||||
|
"hebrewLetter": "Nun (נ)",
|
||||||
|
"associations": {
|
||||||
|
"zodiacSignId": "scorpio",
|
||||||
|
"hebrewLetterId": "nun"
|
||||||
|
},
|
||||||
|
"description": "Also called Marcheshvan. The only month with no Jewish holidays. Day count varies between 29–30 in different years."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "kislev",
|
||||||
|
"order": 9,
|
||||||
|
"name": "Kislev",
|
||||||
|
"nativeName": "כִּסְלֵו",
|
||||||
|
"days": 30,
|
||||||
|
"daysVariant": 29,
|
||||||
|
"season": "Early Winter",
|
||||||
|
"zodiacSign": "sagittarius",
|
||||||
|
"tribe": "Benjamin",
|
||||||
|
"sense": "Sleep",
|
||||||
|
"hebrewLetter": "Samekh (ס)",
|
||||||
|
"associations": {
|
||||||
|
"zodiacSignId": "sagittarius",
|
||||||
|
"hebrewLetterId": "samekh"
|
||||||
|
},
|
||||||
|
"description": "Month of Hanukkah (Festival of Lights), which begins on the 25th. Day count varies 29–30."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "tevet",
|
||||||
|
"order": 10,
|
||||||
|
"name": "Tevet",
|
||||||
|
"nativeName": "טֵבֵת",
|
||||||
|
"days": 29,
|
||||||
|
"season": "Winter",
|
||||||
|
"zodiacSign": "capricorn",
|
||||||
|
"tribe": "Dan",
|
||||||
|
"sense": "Anger",
|
||||||
|
"hebrewLetter": "Ayin (ע)",
|
||||||
|
"associations": {
|
||||||
|
"zodiacSignId": "capricorn",
|
||||||
|
"hebrewLetterId": "ayin"
|
||||||
|
},
|
||||||
|
"description": "Hanukkah continues into the early days of Tevet. The 10th is a fast day marking the siege of Jerusalem."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "shvat",
|
||||||
|
"order": 11,
|
||||||
|
"name": "Shvat",
|
||||||
|
"nativeName": "שְׁבָט",
|
||||||
|
"days": 30,
|
||||||
|
"season": "Late Winter",
|
||||||
|
"zodiacSign": "aquarius",
|
||||||
|
"tribe": "Asher",
|
||||||
|
"sense": "Taste",
|
||||||
|
"hebrewLetter": "Tzaddi (צ)",
|
||||||
|
"associations": {
|
||||||
|
"zodiacSignId": "aquarius",
|
||||||
|
"hebrewLetterId": "tsadi"
|
||||||
|
},
|
||||||
|
"description": "The month of Tu B'Shvat, the 'New Year for Trees.' Trees begin to wake in the Land of Israel."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "adar",
|
||||||
|
"order": 12,
|
||||||
|
"name": "Adar (Adar I)",
|
||||||
|
"nativeName": "אֲדָר",
|
||||||
|
"days": 29,
|
||||||
|
"season": "Late Winter / Early Spring",
|
||||||
|
"zodiacSign": "pisces",
|
||||||
|
"tribe": "Naphtali",
|
||||||
|
"sense": "Laughter",
|
||||||
|
"hebrewLetter": "Qof (ק)",
|
||||||
|
"associations": {
|
||||||
|
"zodiacSignId": "pisces",
|
||||||
|
"hebrewLetterId": "qof"
|
||||||
|
},
|
||||||
|
"description": "A month of joy. Purim falls on the 14th. In a leap year this becomes Adar I and Purim is celebrated in Adar II."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "adar-ii",
|
||||||
|
"order": 13,
|
||||||
|
"name": "Adar II",
|
||||||
|
"nativeName": "אֲדָר ב",
|
||||||
|
"days": 29,
|
||||||
|
"leapYearOnly": true,
|
||||||
|
"season": "Early Spring",
|
||||||
|
"zodiacSign": "pisces",
|
||||||
|
"tribe": "Naphtali",
|
||||||
|
"sense": "Laughter",
|
||||||
|
"hebrewLetter": "Qof (ק)",
|
||||||
|
"associations": {
|
||||||
|
"zodiacSignId": "pisces",
|
||||||
|
"hebrewLetterId": "qof"
|
||||||
|
},
|
||||||
|
"description": "Added in a Hebrew leap year (7 times in every 19-year Metonic cycle). Purim is celebrated in Adar II in leap years."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
353
data/hebrewLetters.json
Normal file
@@ -0,0 +1,353 @@
|
|||||||
|
{
|
||||||
|
"alef": {
|
||||||
|
"id": "alef",
|
||||||
|
"letter": {
|
||||||
|
"he": "א",
|
||||||
|
"name": "Aleph",
|
||||||
|
"latin": "A"
|
||||||
|
},
|
||||||
|
"index": 1,
|
||||||
|
"value": 1,
|
||||||
|
"meaning": {
|
||||||
|
"en": "ox"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"bet": {
|
||||||
|
"id": "bet",
|
||||||
|
"letter": {
|
||||||
|
"he": "ב",
|
||||||
|
"name": "Bet",
|
||||||
|
"latin": "B"
|
||||||
|
},
|
||||||
|
"index": 2,
|
||||||
|
"value": 2,
|
||||||
|
"meaning": {
|
||||||
|
"en": "house"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"gimel": {
|
||||||
|
"id": "gimel",
|
||||||
|
"letter": {
|
||||||
|
"he": "ג",
|
||||||
|
"name": "Gimel",
|
||||||
|
"latin": "G"
|
||||||
|
},
|
||||||
|
"index": 3,
|
||||||
|
"value": 3,
|
||||||
|
"meaning": {
|
||||||
|
"en": "camel"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"dalet": {
|
||||||
|
"id": "dalet",
|
||||||
|
"letter": {
|
||||||
|
"he": "ד",
|
||||||
|
"name": "Dalet",
|
||||||
|
"latin": "D"
|
||||||
|
},
|
||||||
|
"index": 4,
|
||||||
|
"value": 4,
|
||||||
|
"meaning": {
|
||||||
|
"en": "door"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"he": {
|
||||||
|
"id": "he",
|
||||||
|
"letter": {
|
||||||
|
"he": "ה",
|
||||||
|
"name": "He",
|
||||||
|
"latin": "H"
|
||||||
|
},
|
||||||
|
"index": 5,
|
||||||
|
"value": 5,
|
||||||
|
"meaning": {
|
||||||
|
"en": "window"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"vav": {
|
||||||
|
"id": "vav",
|
||||||
|
"letter": {
|
||||||
|
"he": "ו",
|
||||||
|
"name": "Vav",
|
||||||
|
"latin": "V"
|
||||||
|
},
|
||||||
|
"index": 6,
|
||||||
|
"value": 6,
|
||||||
|
"meaning": {
|
||||||
|
"en": "peg, nail, pin, hook"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"zayin": {
|
||||||
|
"id": "zayin",
|
||||||
|
"letter": {
|
||||||
|
"he": "ז",
|
||||||
|
"name": "Zayin",
|
||||||
|
"latin": "Z"
|
||||||
|
},
|
||||||
|
"index": 7,
|
||||||
|
"value": 7,
|
||||||
|
"meaning": {
|
||||||
|
"en": "sword, armor, weapon"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"het": {
|
||||||
|
"id": "het",
|
||||||
|
"letter": {
|
||||||
|
"he": "ח",
|
||||||
|
"name": "Het",
|
||||||
|
"latin": "Ch"
|
||||||
|
},
|
||||||
|
"index": 8,
|
||||||
|
"value": 8,
|
||||||
|
"meaning": {
|
||||||
|
"en": "enclosure, fence"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tet": {
|
||||||
|
"id": "tet",
|
||||||
|
"letter": {
|
||||||
|
"he": "ט",
|
||||||
|
"name": "Tet",
|
||||||
|
"latin": "T"
|
||||||
|
},
|
||||||
|
"index": 9,
|
||||||
|
"value": 9,
|
||||||
|
"meaning": {
|
||||||
|
"en": "serpent"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"yod": {
|
||||||
|
"id": "yod",
|
||||||
|
"letter": {
|
||||||
|
"he": "י",
|
||||||
|
"name": "Yod",
|
||||||
|
"latin": "I"
|
||||||
|
},
|
||||||
|
"index": 10,
|
||||||
|
"value": 10,
|
||||||
|
"meaning": {
|
||||||
|
"en": "hand"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"kaf": {
|
||||||
|
"id": "kaf",
|
||||||
|
"letter": {
|
||||||
|
"he": "כ",
|
||||||
|
"name": "Kaf",
|
||||||
|
"latin": "K"
|
||||||
|
},
|
||||||
|
"index": 11,
|
||||||
|
"value": 20,
|
||||||
|
"meaning": {
|
||||||
|
"en": "palm of hand"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"kaf-sofit": {
|
||||||
|
"id": "kaf-sofit",
|
||||||
|
"letter": {
|
||||||
|
"he": "ך",
|
||||||
|
"name": "Kaf-Sofit",
|
||||||
|
"latin": "K(f)"
|
||||||
|
},
|
||||||
|
"index": 11,
|
||||||
|
"value": 500,
|
||||||
|
"meaning": {
|
||||||
|
"en": "palm of hand"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"lamed": {
|
||||||
|
"id": "lamed",
|
||||||
|
"letter": {
|
||||||
|
"he": "ל",
|
||||||
|
"name": "Lamed",
|
||||||
|
"latin": "L"
|
||||||
|
},
|
||||||
|
"index": 12,
|
||||||
|
"value": 30,
|
||||||
|
"meaning": {
|
||||||
|
"en": "ox-goad"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mem": {
|
||||||
|
"id": "mem",
|
||||||
|
"letter": {
|
||||||
|
"he": "מ",
|
||||||
|
"name": "Mem",
|
||||||
|
"latin": "M"
|
||||||
|
},
|
||||||
|
"index": 13,
|
||||||
|
"value": 40,
|
||||||
|
"meaning": {
|
||||||
|
"en": "water"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mem-sofit": {
|
||||||
|
"id": "mem-sofit",
|
||||||
|
"letter": {
|
||||||
|
"he": "ם",
|
||||||
|
"name": "Mem-Sofit",
|
||||||
|
"latin": "M(f)"
|
||||||
|
},
|
||||||
|
"index": 13,
|
||||||
|
"value": 600,
|
||||||
|
"meaning": {
|
||||||
|
"en": "water"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nun": {
|
||||||
|
"id": "nun",
|
||||||
|
"letter": {
|
||||||
|
"he": "נ",
|
||||||
|
"name": "Nun",
|
||||||
|
"latin": "N"
|
||||||
|
},
|
||||||
|
"index": 14,
|
||||||
|
"value": 50,
|
||||||
|
"meaning": {
|
||||||
|
"en": "fish"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nun-sofit": {
|
||||||
|
"id": "nun-sofit",
|
||||||
|
"letter": {
|
||||||
|
"he": "ן",
|
||||||
|
"name": "Nun-Sofit",
|
||||||
|
"latin": "N(f)"
|
||||||
|
},
|
||||||
|
"index": 14,
|
||||||
|
"value": 700,
|
||||||
|
"meaning": {
|
||||||
|
"en": "fish"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"samekh": {
|
||||||
|
"id": "samekh",
|
||||||
|
"letter": {
|
||||||
|
"he": "ס",
|
||||||
|
"name": "Samekh",
|
||||||
|
"latin": "S"
|
||||||
|
},
|
||||||
|
"index": 15,
|
||||||
|
"value": 60,
|
||||||
|
"meaning": {
|
||||||
|
"en": "prop, support"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ayin": {
|
||||||
|
"id": "ayin",
|
||||||
|
"letter": {
|
||||||
|
"he": "ע",
|
||||||
|
"name": "Ayin",
|
||||||
|
"latin": "O"
|
||||||
|
},
|
||||||
|
"index": 16,
|
||||||
|
"value": 70,
|
||||||
|
"meaning": {
|
||||||
|
"en": "eye"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"pe": {
|
||||||
|
"id": "pe",
|
||||||
|
"letter": {
|
||||||
|
"he": "פ",
|
||||||
|
"name": "Pe",
|
||||||
|
"latin": "P"
|
||||||
|
},
|
||||||
|
"index": 17,
|
||||||
|
"value": 80,
|
||||||
|
"meaning": {
|
||||||
|
"en": "mouth"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"pe-sofit": {
|
||||||
|
"id": "pe-sofit",
|
||||||
|
"letter": {
|
||||||
|
"he": "ף",
|
||||||
|
"name": "Pe-Sofit",
|
||||||
|
"latin": "P(f)"
|
||||||
|
},
|
||||||
|
"index": 17,
|
||||||
|
"value": 800,
|
||||||
|
"meaning": {
|
||||||
|
"en": "mouth"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tsadi": {
|
||||||
|
"id": "tsadi",
|
||||||
|
"letter": {
|
||||||
|
"he": "צ",
|
||||||
|
"name": "Tsadi",
|
||||||
|
"latin": "Tz"
|
||||||
|
},
|
||||||
|
"index": 18,
|
||||||
|
"value": 90,
|
||||||
|
"meaning": {
|
||||||
|
"en": "fishhook"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tsadi-sofit": {
|
||||||
|
"id": "tsadi-sofit",
|
||||||
|
"letter": {
|
||||||
|
"he": "ץ",
|
||||||
|
"name": "Tsadi-Sofit",
|
||||||
|
"latin": "Tz(f)"
|
||||||
|
},
|
||||||
|
"index": 18,
|
||||||
|
"value": 900,
|
||||||
|
"meaning": {
|
||||||
|
"en": "fishhook"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"qof": {
|
||||||
|
"id": "qof",
|
||||||
|
"letter": {
|
||||||
|
"he": "ק",
|
||||||
|
"name": "Qof",
|
||||||
|
"latin": "Q"
|
||||||
|
},
|
||||||
|
"index": 19,
|
||||||
|
"value": 100,
|
||||||
|
"meaning": {
|
||||||
|
"en": "back of the head, ear"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"resh": {
|
||||||
|
"id": "resh",
|
||||||
|
"letter": {
|
||||||
|
"he": "ר",
|
||||||
|
"name": "Resh",
|
||||||
|
"latin": "R"
|
||||||
|
},
|
||||||
|
"index": 20,
|
||||||
|
"value": 200,
|
||||||
|
"meaning": {
|
||||||
|
"en": "head"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"shin": {
|
||||||
|
"id": "shin",
|
||||||
|
"letter": {
|
||||||
|
"he": "ש",
|
||||||
|
"name": "Shin",
|
||||||
|
"latin": "Sh"
|
||||||
|
},
|
||||||
|
"index": 21,
|
||||||
|
"value": 300,
|
||||||
|
"meaning": {
|
||||||
|
"en": "tooth"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tav": {
|
||||||
|
"id": "tav",
|
||||||
|
"letter": {
|
||||||
|
"he": "ת",
|
||||||
|
"name": "Tav",
|
||||||
|
"latin": "Th"
|
||||||
|
},
|
||||||
|
"index": 22,
|
||||||
|
"value": 400,
|
||||||
|
"meaning": {
|
||||||
|
"en": "cross"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
1581
data/i-ching.json
Normal file
136
data/islamic-calendar.json
Normal file
@@ -0,0 +1,136 @@
|
|||||||
|
{
|
||||||
|
"meta": {
|
||||||
|
"version": 1,
|
||||||
|
"notes": "Islamic (Hijri) lunar calendar months with traditional associations and major observances. Holiday records are centralized in calendar-holidays.json."
|
||||||
|
},
|
||||||
|
"calendar": {
|
||||||
|
"id": "islamic",
|
||||||
|
"label": "Islamic Calendar",
|
||||||
|
"type": "lunar",
|
||||||
|
"script": "Arabic",
|
||||||
|
"description": "The Islamic calendar (Hijri/AH) is a purely lunar calendar of 12 months in a year of 354 or 355 days. It began with the Prophet Muhammad's migration (Hijra) from Mecca to Medina in 622 CE. Four months are considered sacred (Al-Ashhur Al-Hurum): Muharram, Rajab, Dhu al-Qada, and Dhu al-Hijja."
|
||||||
|
},
|
||||||
|
"months": [
|
||||||
|
{
|
||||||
|
"id": "muharram",
|
||||||
|
"order": 1,
|
||||||
|
"name": "Muharram",
|
||||||
|
"nativeName": "مُحَرَّم",
|
||||||
|
"meaning": "Forbidden / Sacred",
|
||||||
|
"days": 30,
|
||||||
|
"sacred": true,
|
||||||
|
"description": "The first month of the Islamic year and one of the four sacred months in which warfare is prohibited. Islamic New Year (Hijri New Year) begins on the 1st. Ashura falls on the 10th."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "safar",
|
||||||
|
"order": 2,
|
||||||
|
"name": "Safar",
|
||||||
|
"nativeName": "صَفَر",
|
||||||
|
"meaning": "Empty / Yellow",
|
||||||
|
"days": 29,
|
||||||
|
"sacred": false,
|
||||||
|
"description": "Traditionally a month associated with misfortune in pre-Islamic Arab belief; Islam discouraged such superstition. No major holidays."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "rabi-al-awwal",
|
||||||
|
"order": 3,
|
||||||
|
"name": "Rabi' al-Awwal",
|
||||||
|
"nativeName": "رَبِيع الأَوَّل",
|
||||||
|
"meaning": "First Spring",
|
||||||
|
"days": 30,
|
||||||
|
"sacred": false,
|
||||||
|
"description": "The month of the Prophet Muhammad's birth (Mawlid al-Nabi) and his migration to Medina. A month of celebration in many Muslim communities."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "rabi-al-akhir",
|
||||||
|
"order": 4,
|
||||||
|
"name": "Rabi' al-Akhir",
|
||||||
|
"nativeName": "رَبِيع الآخِر",
|
||||||
|
"meaning": "Second Spring / Last Spring",
|
||||||
|
"days": 29,
|
||||||
|
"sacred": false,
|
||||||
|
"description": "Also called Rabi' al-Thani (Second Spring). No major holidays."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "jumada-al-awwal",
|
||||||
|
"order": 5,
|
||||||
|
"name": "Jumada al-Awwal",
|
||||||
|
"nativeName": "جُمَادَى الأُولَى",
|
||||||
|
"meaning": "First of Parched Land",
|
||||||
|
"days": 30,
|
||||||
|
"sacred": false,
|
||||||
|
"description": "The fifth month. No major holidays. The name reflects an ancient season of early drought."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "jumada-al-akhir",
|
||||||
|
"order": 6,
|
||||||
|
"name": "Jumada al-Akhir",
|
||||||
|
"nativeName": "جُمَادَى الآخِرَة",
|
||||||
|
"meaning": "Last of Parched Land",
|
||||||
|
"days": 29,
|
||||||
|
"sacred": false,
|
||||||
|
"description": "Also called Jumada al-Thani. Concludes the first half of the Islamic year."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "rajab",
|
||||||
|
"order": 7,
|
||||||
|
"name": "Rajab",
|
||||||
|
"nativeName": "رَجَب",
|
||||||
|
"meaning": "To Respect",
|
||||||
|
"days": 30,
|
||||||
|
"sacred": true,
|
||||||
|
"description": "One of the four sacred months. Warfare was forbidden. Contains Laylat al-Mi'raj (Night of Ascension)."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "shaban",
|
||||||
|
"order": 8,
|
||||||
|
"name": "Sha'ban",
|
||||||
|
"nativeName": "شَعْبَان",
|
||||||
|
"meaning": "To be Scattered / Dispersed",
|
||||||
|
"days": 29,
|
||||||
|
"sacred": false,
|
||||||
|
"description": "The month between Rajab and Ramadan. A time of spiritual preparation for fasting. Contains the Night of Records (Laylat al-Bara'at)."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "ramadan",
|
||||||
|
"order": 9,
|
||||||
|
"name": "Ramadan",
|
||||||
|
"nativeName": "رَمَضَان",
|
||||||
|
"meaning": "Scorching Heat",
|
||||||
|
"days": 30,
|
||||||
|
"sacred": false,
|
||||||
|
"description": "The holiest month of the Islamic year. Fasting (Sawm) from dawn to sunset is obligatory for adult Muslims — one of the Five Pillars of Islam. The Quran was revealed in this month. Ends with Eid al-Fitr."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "shawwal",
|
||||||
|
"order": 10,
|
||||||
|
"name": "Shawwal",
|
||||||
|
"nativeName": "شَوَّال",
|
||||||
|
"meaning": "Raised / Lifted",
|
||||||
|
"days": 29,
|
||||||
|
"sacred": false,
|
||||||
|
"description": "The month following Ramadan. Begins with Eid al-Fitr. Voluntary six-day fast (Shawwal fast) is recommended."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "dhu-al-qada",
|
||||||
|
"order": 11,
|
||||||
|
"name": "Dhu al-Qada",
|
||||||
|
"nativeName": "ذُو الْقَعْدَة",
|
||||||
|
"meaning": "Possessor of Truce / Sitting",
|
||||||
|
"days": 30,
|
||||||
|
"sacred": true,
|
||||||
|
"description": "One of the four sacred months. Pilgrims begin gathering for Hajj. Warfare was traditionally prohibited."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "dhu-al-hijja",
|
||||||
|
"order": 12,
|
||||||
|
"name": "Dhu al-Hijja",
|
||||||
|
"nativeName": "ذُو الْحِجَّة",
|
||||||
|
"meaning": "Possessor of the Pilgrimage",
|
||||||
|
"days": 29,
|
||||||
|
"daysVariant": 30,
|
||||||
|
"sacred": true,
|
||||||
|
"description": "The month of Hajj pilgrimage — the fifth Pillar of Islam. Contains Eid al-Adha, one of the two major Islamic festivals. The first ten days are especially sacred."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
79
data/kabbalah/angelicOrders.json
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
{
|
||||||
|
"chayot-hakodesh": {
|
||||||
|
"name": {
|
||||||
|
"he": "חיות הקודש",
|
||||||
|
"en": "Holy Living Creatures",
|
||||||
|
"roman": "Chayot Hakodesh"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"auphanim": {
|
||||||
|
"name": {
|
||||||
|
"he": "אופנים",
|
||||||
|
"en": "Wheels",
|
||||||
|
"roman": "Auphaneem"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"aralim": {
|
||||||
|
"name": {
|
||||||
|
"he": "אראלים",
|
||||||
|
"en": "Thrones",
|
||||||
|
"roman": "Ar'aleem"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"chashmalim": {
|
||||||
|
"name": {
|
||||||
|
"he": "חשמלים",
|
||||||
|
"en": "Shining Ones",
|
||||||
|
"roman": "Chashmaleem"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"seraphim": {
|
||||||
|
"name": {
|
||||||
|
"he": "שרפים",
|
||||||
|
"en": "Flaming Ones",
|
||||||
|
"roman": "Seraphim"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"malachim": {
|
||||||
|
"name": {
|
||||||
|
"he": "מלאכים",
|
||||||
|
"en": "Messengers",
|
||||||
|
"roman": "Malecheem"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"elohim": {
|
||||||
|
"name": {
|
||||||
|
"he": "אלוהים",
|
||||||
|
"en": "Gods & Goddesses",
|
||||||
|
"roman": "Eloheem"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"bnei-elohim": {
|
||||||
|
"name": {
|
||||||
|
"he": "בני אלוהים",
|
||||||
|
"en": "Children of the Gods",
|
||||||
|
"roman": "Bnei Eloheem"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"kerubim": {
|
||||||
|
"name": {
|
||||||
|
"he": "כרובים",
|
||||||
|
"en": "Strong Ones",
|
||||||
|
"roman": "Kerubeem"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ishim": {
|
||||||
|
"name": {
|
||||||
|
"he": "אישים",
|
||||||
|
"en": "Souls of Fire",
|
||||||
|
"roman": "Isheem"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"": {
|
||||||
|
"name": {
|
||||||
|
"he": "",
|
||||||
|
"en": "",
|
||||||
|
"roman": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
101
data/kabbalah/archangels.json
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
{
|
||||||
|
"cassiel": {
|
||||||
|
"id": "cassiel",
|
||||||
|
"name": {
|
||||||
|
"he": "כסיאל",
|
||||||
|
"roman": "Kassiel"
|
||||||
|
},
|
||||||
|
"planetId": "saturn"
|
||||||
|
},
|
||||||
|
"sachiel": {
|
||||||
|
"id": "sachiel",
|
||||||
|
"name": {
|
||||||
|
"he": "סחיאל",
|
||||||
|
"roman": "Sachiel"
|
||||||
|
},
|
||||||
|
"planetId": "jupiter"
|
||||||
|
},
|
||||||
|
"zamael": {
|
||||||
|
"id": "zamael",
|
||||||
|
"name": {
|
||||||
|
"he": "זמאל",
|
||||||
|
"roman": "Zamael"
|
||||||
|
},
|
||||||
|
"planetId": "mars"
|
||||||
|
},
|
||||||
|
"michael": {
|
||||||
|
"id": "michael",
|
||||||
|
"name": {
|
||||||
|
"he": "מיכאל",
|
||||||
|
"roman": "Michael"
|
||||||
|
},
|
||||||
|
"planetId": "sol",
|
||||||
|
"sephirahId": "hod"
|
||||||
|
},
|
||||||
|
"anael": {
|
||||||
|
"id": "anael",
|
||||||
|
"name": {
|
||||||
|
"he": "אנאל",
|
||||||
|
"roman": "Anael"
|
||||||
|
},
|
||||||
|
"planetId": "venus"
|
||||||
|
},
|
||||||
|
"raphael": {
|
||||||
|
"id": "raphael",
|
||||||
|
"name": {
|
||||||
|
"he": "רפאל",
|
||||||
|
"roman": "Raphael"
|
||||||
|
},
|
||||||
|
"planetId": "mercury",
|
||||||
|
"sephirahId": "raphael"
|
||||||
|
},
|
||||||
|
"gabriel": {
|
||||||
|
"id": "gabriel",
|
||||||
|
"name": {
|
||||||
|
"he": "גבריאל",
|
||||||
|
"roman": "Gavriel",
|
||||||
|
"en": "Gabriel"
|
||||||
|
},
|
||||||
|
"planetId": "luna",
|
||||||
|
"sephirahId": "yesod"
|
||||||
|
},
|
||||||
|
"uriel": {
|
||||||
|
"id": "uriel",
|
||||||
|
"name": {
|
||||||
|
"he": "אוריאל",
|
||||||
|
"roman": "Uriel"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tzaphkiel": {
|
||||||
|
"id": "tzaphkiel",
|
||||||
|
"name": {
|
||||||
|
"he": "צַפְקִיאֵל",
|
||||||
|
"roman": "Tzaphkiel"
|
||||||
|
},
|
||||||
|
"sephirahId": "binah"
|
||||||
|
},
|
||||||
|
"khamael": {
|
||||||
|
"id": "khamael",
|
||||||
|
"name": {
|
||||||
|
"he": "חמאל",
|
||||||
|
"roman": "Khamael"
|
||||||
|
},
|
||||||
|
"sephirahId": "gevurah"
|
||||||
|
},
|
||||||
|
"tzadkiel": {
|
||||||
|
"id": "tzadkiel",
|
||||||
|
"name": {
|
||||||
|
"he": "צדקיאל",
|
||||||
|
"roman": "Tzadkiel"
|
||||||
|
},
|
||||||
|
"sephirahId": "chesed"
|
||||||
|
},
|
||||||
|
"haniel": {
|
||||||
|
"id": "haniel",
|
||||||
|
"name": {
|
||||||
|
"he": "הניאל",
|
||||||
|
"roman": "Haniel"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"sephirahId": "netzach"
|
||||||
|
}
|
||||||
230
data/kabbalah/cube.json
Normal file
@@ -0,0 +1,230 @@
|
|||||||
|
{
|
||||||
|
"meta": {
|
||||||
|
"description": "Cube of Space wall and edge correspondences adapted from the cube Python module.",
|
||||||
|
"sources": [
|
||||||
|
"cube/attributes.py",
|
||||||
|
"Hermetic Qabalah"
|
||||||
|
],
|
||||||
|
"notes": "The twelve simple letters map to the 12 edges of the Cube of Space. Walls retain elemental and planetary correspondences."
|
||||||
|
},
|
||||||
|
"center": {
|
||||||
|
"name": "Primal Point",
|
||||||
|
"letter": "Tav",
|
||||||
|
"hebrewLetterId": "tav",
|
||||||
|
"element": "Spirit",
|
||||||
|
"keywords": [
|
||||||
|
"Unity",
|
||||||
|
"Source",
|
||||||
|
"All"
|
||||||
|
],
|
||||||
|
"description": "Primal point at the center of the Cube of Space - synthesis of all forces",
|
||||||
|
"associations": {
|
||||||
|
"hebrewLetterId": "tav",
|
||||||
|
"kabbalahPathNumber": 32,
|
||||||
|
"tarotCard": "The World",
|
||||||
|
"tarotTrumpNumber": 21
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"edges": [
|
||||||
|
{
|
||||||
|
"id": "north-east",
|
||||||
|
"name": "North East",
|
||||||
|
"walls": ["north", "east"],
|
||||||
|
"hebrewLetterId": "he"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "south-east",
|
||||||
|
"name": "South East",
|
||||||
|
"walls": ["south", "east"],
|
||||||
|
"hebrewLetterId": "vav"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "east-above",
|
||||||
|
"name": "East Above",
|
||||||
|
"walls": ["east", "above"],
|
||||||
|
"hebrewLetterId": "zayin"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "east-below",
|
||||||
|
"name": "East Below",
|
||||||
|
"walls": ["east", "below"],
|
||||||
|
"hebrewLetterId": "het"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "north-above",
|
||||||
|
"name": "North Above",
|
||||||
|
"walls": ["north", "above"],
|
||||||
|
"hebrewLetterId": "tet"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "north-below",
|
||||||
|
"name": "North Below",
|
||||||
|
"walls": ["north", "below"],
|
||||||
|
"hebrewLetterId": "yod"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "north-west",
|
||||||
|
"name": "North West",
|
||||||
|
"walls": ["north", "west"],
|
||||||
|
"hebrewLetterId": "lamed"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "south-west",
|
||||||
|
"name": "South West",
|
||||||
|
"walls": ["south", "west"],
|
||||||
|
"hebrewLetterId": "nun"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "west-above",
|
||||||
|
"name": "West Above",
|
||||||
|
"walls": ["west", "above"],
|
||||||
|
"hebrewLetterId": "samekh"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "west-below",
|
||||||
|
"name": "West Below",
|
||||||
|
"walls": ["west", "below"],
|
||||||
|
"hebrewLetterId": "ayin"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "south-above",
|
||||||
|
"name": "South Above",
|
||||||
|
"walls": ["south", "above"],
|
||||||
|
"hebrewLetterId": "tsadi"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "south-below",
|
||||||
|
"name": "South Below",
|
||||||
|
"walls": ["south", "below"],
|
||||||
|
"hebrewLetterId": "qof"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"walls": [
|
||||||
|
{
|
||||||
|
"id": "north",
|
||||||
|
"name": "North",
|
||||||
|
"hebrewLetterId": "pe",
|
||||||
|
"side": "north",
|
||||||
|
"opposite": "South",
|
||||||
|
"oppositeWallId": "south",
|
||||||
|
"element": "Air",
|
||||||
|
"planet": "Mars",
|
||||||
|
"archangel": "Samael",
|
||||||
|
"keywords": ["Thought", "Communication", "Intellect"],
|
||||||
|
"description": "Northern Wall - Air element, Mars correspondence",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "mars",
|
||||||
|
"godName": "Samael",
|
||||||
|
"hebrewLetterId": "pe",
|
||||||
|
"kabbalahPathNumber": 27,
|
||||||
|
"tarotCard": "The Tower",
|
||||||
|
"tarotTrumpNumber": 16
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "south",
|
||||||
|
"name": "South",
|
||||||
|
"hebrewLetterId": "resh",
|
||||||
|
"side": "south",
|
||||||
|
"opposite": "North",
|
||||||
|
"oppositeWallId": "north",
|
||||||
|
"element": "Fire",
|
||||||
|
"planet": "Sun",
|
||||||
|
"archangel": "Michael",
|
||||||
|
"keywords": ["Will", "Action", "Passion"],
|
||||||
|
"description": "Southern Wall - Fire element, Sun correspondence",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "sol",
|
||||||
|
"godName": "Michael",
|
||||||
|
"hebrewLetterId": "resh",
|
||||||
|
"kabbalahPathNumber": 30,
|
||||||
|
"tarotCard": "The Sun",
|
||||||
|
"tarotTrumpNumber": 19
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "east",
|
||||||
|
"name": "East",
|
||||||
|
"hebrewLetterId": "dalet",
|
||||||
|
"side": "east",
|
||||||
|
"opposite": "West",
|
||||||
|
"oppositeWallId": "west",
|
||||||
|
"element": "Air",
|
||||||
|
"planet": "Venus",
|
||||||
|
"archangel": "Haniel",
|
||||||
|
"keywords": ["Dawn", "Beginning", "Ascent"],
|
||||||
|
"description": "Eastern Wall - Air element, new beginnings",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "venus",
|
||||||
|
"godName": "Haniel",
|
||||||
|
"hebrewLetterId": "dalet",
|
||||||
|
"kabbalahPathNumber": 14,
|
||||||
|
"tarotCard": "The Empress",
|
||||||
|
"tarotTrumpNumber": 3
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "west",
|
||||||
|
"name": "West",
|
||||||
|
"hebrewLetterId": "kaf",
|
||||||
|
"side": "west",
|
||||||
|
"opposite": "East",
|
||||||
|
"oppositeWallId": "east",
|
||||||
|
"element": "Water",
|
||||||
|
"planet": "Jupiter",
|
||||||
|
"archangel": "Tzadkiel",
|
||||||
|
"keywords": ["Emotion", "Decline", "Closure"],
|
||||||
|
"description": "Western Wall - Water element, Jupiter correspondence",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "jupiter",
|
||||||
|
"godName": "Tzadkiel",
|
||||||
|
"hebrewLetterId": "kaf",
|
||||||
|
"kabbalahPathNumber": 21,
|
||||||
|
"tarotCard": "Wheel of Fortune",
|
||||||
|
"tarotTrumpNumber": 10
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "above",
|
||||||
|
"name": "Above",
|
||||||
|
"hebrewLetterId": "bet",
|
||||||
|
"side": "above",
|
||||||
|
"opposite": "Below",
|
||||||
|
"oppositeWallId": "below",
|
||||||
|
"element": "Fire",
|
||||||
|
"planet": "Mercury",
|
||||||
|
"archangel": "Raphael",
|
||||||
|
"keywords": ["Heaven", "Spirit", "Light"],
|
||||||
|
"description": "Upper Wall - Fire element, Mercury correspondence",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "mercury",
|
||||||
|
"godName": "Raphael",
|
||||||
|
"hebrewLetterId": "bet",
|
||||||
|
"kabbalahPathNumber": 12,
|
||||||
|
"tarotCard": "The Magician",
|
||||||
|
"tarotTrumpNumber": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "below",
|
||||||
|
"name": "Below",
|
||||||
|
"hebrewLetterId": "gimel",
|
||||||
|
"side": "below",
|
||||||
|
"opposite": "Above",
|
||||||
|
"oppositeWallId": "above",
|
||||||
|
"element": "Earth",
|
||||||
|
"planet": "Luna",
|
||||||
|
"archangel": "Gabriel",
|
||||||
|
"keywords": ["Matter", "Foundation", "Manifestation"],
|
||||||
|
"description": "Lower Wall - Earth element, Luna correspondence",
|
||||||
|
"associations": {
|
||||||
|
"planetId": "luna",
|
||||||
|
"godName": "Gabriel",
|
||||||
|
"hebrewLetterId": "gimel",
|
||||||
|
"kabbalahPathNumber": 13,
|
||||||
|
"tarotCard": "The High Priestess",
|
||||||
|
"tarotTrumpNumber": 2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
112
data/kabbalah/fourWorlds.json
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
{
|
||||||
|
"atzilut": {
|
||||||
|
"id": "atzilut",
|
||||||
|
"name": {
|
||||||
|
"en": "Nobility",
|
||||||
|
"roman": "Atziluth",
|
||||||
|
"he": "אצילות"
|
||||||
|
},
|
||||||
|
"desc": {
|
||||||
|
"en": "Archetypal"
|
||||||
|
},
|
||||||
|
"residentsTitle": {
|
||||||
|
"en": "Pure Deity"
|
||||||
|
},
|
||||||
|
"tetragrammaton": {
|
||||||
|
"slot": "Yod",
|
||||||
|
"letterChar": "י",
|
||||||
|
"hebrewLetterId": "yod",
|
||||||
|
"position": 1
|
||||||
|
},
|
||||||
|
"worldLayer": {
|
||||||
|
"en": "Archetypal World (God's Will)"
|
||||||
|
},
|
||||||
|
"worldDescription": {
|
||||||
|
"en": "World of gods or specific facets or divine qualities."
|
||||||
|
},
|
||||||
|
"soulId": "chaya"
|
||||||
|
},
|
||||||
|
"briah": {
|
||||||
|
"id": "briah",
|
||||||
|
"name": {
|
||||||
|
"en": "Creation",
|
||||||
|
"roman": "Briah",
|
||||||
|
"he": "בריאה"
|
||||||
|
},
|
||||||
|
"desc": {
|
||||||
|
"en": "Creative"
|
||||||
|
},
|
||||||
|
"residentsTitle": {
|
||||||
|
"en": "Archangelic"
|
||||||
|
},
|
||||||
|
"tetragrammaton": {
|
||||||
|
"slot": "Heh",
|
||||||
|
"letterChar": "ה",
|
||||||
|
"hebrewLetterId": "he",
|
||||||
|
"position": 2,
|
||||||
|
"isFinal": false
|
||||||
|
},
|
||||||
|
"worldLayer": {
|
||||||
|
"en": "Creative World (God's Love)"
|
||||||
|
},
|
||||||
|
"worldDescription": {
|
||||||
|
"en": "World of archangels, executors of divine qualities."
|
||||||
|
},
|
||||||
|
"soulId": "neshama"
|
||||||
|
},
|
||||||
|
"yetzirah": {
|
||||||
|
"id": "yetzirah",
|
||||||
|
"name": {
|
||||||
|
"en": "Formation",
|
||||||
|
"roman": "Yetzirah",
|
||||||
|
"he": "יצירה"
|
||||||
|
},
|
||||||
|
"desc": {
|
||||||
|
"en": "Formative"
|
||||||
|
},
|
||||||
|
"residentsTitle": {
|
||||||
|
"en": "Angelic"
|
||||||
|
},
|
||||||
|
"tetragrammaton": {
|
||||||
|
"slot": "Vav",
|
||||||
|
"letterChar": "ו",
|
||||||
|
"hebrewLetterId": "vav",
|
||||||
|
"position": 3
|
||||||
|
},
|
||||||
|
"worldLayer": {
|
||||||
|
"en": "Formative World (God's Mind)"
|
||||||
|
},
|
||||||
|
"worldDescription": {
|
||||||
|
"en": "World of angels, who work under the direction of archangels."
|
||||||
|
},
|
||||||
|
"soulId": "ruach"
|
||||||
|
},
|
||||||
|
"assiah": {
|
||||||
|
"id": "assiah",
|
||||||
|
"name": {
|
||||||
|
"en": "Doing",
|
||||||
|
"roman": "Assiah",
|
||||||
|
"he": "עשייה"
|
||||||
|
},
|
||||||
|
"desc": {
|
||||||
|
"en": "Action"
|
||||||
|
},
|
||||||
|
"residentsTitle": {
|
||||||
|
"en": "Man, Matter, Shells, Demons"
|
||||||
|
},
|
||||||
|
"tetragrammaton": {
|
||||||
|
"slot": "Heh",
|
||||||
|
"letterChar": "ה",
|
||||||
|
"hebrewLetterId": "he",
|
||||||
|
"position": 4,
|
||||||
|
"isFinal": true
|
||||||
|
},
|
||||||
|
"worldLayer": {
|
||||||
|
"en": "Material World (God's Creation)"
|
||||||
|
},
|
||||||
|
"worldDescription": {
|
||||||
|
"en": "World of spirits, who focus the specialized duties of their ruling angel to infuse matter and energy."
|
||||||
|
},
|
||||||
|
"soulId": "nephesh"
|
||||||
|
}
|
||||||
|
}
|
||||||
72
data/kabbalah/godNames.json
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
{
|
||||||
|
"ehiyeh": {
|
||||||
|
"name": {
|
||||||
|
"he": "אהיה",
|
||||||
|
"roman": "Ehiyeh",
|
||||||
|
"en": "I am"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"yah": {
|
||||||
|
"name": {
|
||||||
|
"he": "יה",
|
||||||
|
"roman": "Yah",
|
||||||
|
"en": "Lord"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"yhvh-elohim": {
|
||||||
|
"name": {
|
||||||
|
"he": "יהוה אלוהים",
|
||||||
|
"roman": "YHVH Elohim",
|
||||||
|
"en": "The Lord God"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"el": {
|
||||||
|
"name": {
|
||||||
|
"he": "אל",
|
||||||
|
"roman": "El",
|
||||||
|
"en": "God"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"elohim-gibor": {
|
||||||
|
"name": {
|
||||||
|
"he": "אלוהים גיבור",
|
||||||
|
"roman": "Elohim Gibor",
|
||||||
|
"en": "God of Power"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"yhvh-eloha-vedaat": {
|
||||||
|
"name": {
|
||||||
|
"he": "יהוה אלוה ודעת",
|
||||||
|
"roman": "YHVH Eloah Ve-da'at",
|
||||||
|
"en": "Lord God of Knowledge"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"yhvh-tzvaot": {
|
||||||
|
"name": {
|
||||||
|
"he": "יהוה צבעות",
|
||||||
|
"roman": "YHVH Tzva-oht",
|
||||||
|
"en": "Lord of Armies"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"elohim-tzvaot": {
|
||||||
|
"name": {
|
||||||
|
"he": "אלוהים צבעות",
|
||||||
|
"roman": "Elohim Tzvaot",
|
||||||
|
"en": "God of Armies"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"shadai-el-chai": {
|
||||||
|
"name": {
|
||||||
|
"he": "שדאי אל חי",
|
||||||
|
"roman": "Shaddai El Chai",
|
||||||
|
"en": "Almighty Living God"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"adonai-haaretz": {
|
||||||
|
"name": {
|
||||||
|
"he": "אדוני הארץ",
|
||||||
|
"roman": "Adonai Ha'aretz",
|
||||||
|
"en": "Lord of Earth"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
500
data/kabbalah/kabbalah-tree.json
Normal file
@@ -0,0 +1,500 @@
|
|||||||
|
{
|
||||||
|
"meta": {
|
||||||
|
"description": "Kabbalah Tree of Life — unified 32-path dataset. Paths 1–10 are the Sephiroth; paths 11–32 are the 22 Hebrew letter paths. Foreign keys reference sephirot.json (sephiraId) and hebrewLetters.json (letterTransliteration). Tarot and astrological correspondences follow the Hermetic / Golden Dawn tradition (Liber 777).",
|
||||||
|
"sources": [
|
||||||
|
"Sefer Yetzirah",
|
||||||
|
"Liber 777 — Aleister Crowley",
|
||||||
|
"open_777 paths dataset — adamblvck (github.com/adamblvck/open_777)"
|
||||||
|
],
|
||||||
|
"tradition": "Hermetic Qabalah / Golden Dawn",
|
||||||
|
"notes": "The 22 letter paths use the Hermetic GD attribution (Tzaddi = Aquarius / The Star, He = Aries / The Emperor)."
|
||||||
|
},
|
||||||
|
"sephiroth": [
|
||||||
|
{
|
||||||
|
"number": 1,
|
||||||
|
"sephiraId": "keter",
|
||||||
|
"name": "Kether",
|
||||||
|
"nameHebrew": "כתר",
|
||||||
|
"translation": "Crown",
|
||||||
|
"planet": "Primum Mobile",
|
||||||
|
"intelligence": "The Admirable or Hidden Intelligence",
|
||||||
|
"tarot": "The 4 Aces",
|
||||||
|
"description": "The first path is called the Great or Hidden Intelligence (Supreme Crown). It is the light that expresses the first principle without a source, and is the primordial glory, that nothing created can attain its essence."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"number": 2,
|
||||||
|
"sephiraId": "chochmah",
|
||||||
|
"name": "Chokmah",
|
||||||
|
"nameHebrew": "חכמה",
|
||||||
|
"translation": "Wisdom",
|
||||||
|
"planet": "Zodiac",
|
||||||
|
"intelligence": "The Illuminating Intelligence",
|
||||||
|
"tarot": "The 4 Twos — Kings / Knights",
|
||||||
|
"description": "The second path is the path of the enlightened intellect, the crown of creation, the light of its equal unity, exalted above all like the head, which the Kabbalists call the Second Glory."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"number": 3,
|
||||||
|
"sephiraId": "binah",
|
||||||
|
"name": "Binah",
|
||||||
|
"nameHebrew": "בינה",
|
||||||
|
"translation": "Understanding",
|
||||||
|
"planet": "Saturn",
|
||||||
|
"intelligence": "The Sanctifying Intelligence",
|
||||||
|
"tarot": "The 4 Threes — Queens",
|
||||||
|
"description": "The third way is the sanctifying intelligence, the foundation of primordial wisdom, which is called the giver of faith and its root. It is the parent of faith, from which faith comes."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"number": 4,
|
||||||
|
"sephiraId": "hesed",
|
||||||
|
"name": "Chesed",
|
||||||
|
"nameHebrew": "חסד",
|
||||||
|
"translation": "Mercy",
|
||||||
|
"planet": "Jupiter",
|
||||||
|
"intelligence": "The Measuring, Cohesive, or Receptacular Intelligence",
|
||||||
|
"tarot": "The 4 Fours",
|
||||||
|
"description": "The fourth path is called Measure, or Cohesion, or Container, so called because it contains all the divine powers, and from it all the spiritual virtues of the highest beings emerge. The virtues are radiated from each other by the primordial radiant force."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"number": 5,
|
||||||
|
"sephiraId": "gevurah",
|
||||||
|
"name": "Geburah",
|
||||||
|
"nameHebrew": "גבורה",
|
||||||
|
"translation": "Strength",
|
||||||
|
"planet": "Mars",
|
||||||
|
"intelligence": "The Radical Intelligence",
|
||||||
|
"tarot": "The 4 Fives",
|
||||||
|
"description": "The Fifth Path is called the Radical Intelligence, which itself is the Equal Essence of the Oneness, and considers itself Wisdom, or Binah, or Intelligence, radiating from the primordial depths of Hochmah."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"number": 6,
|
||||||
|
"sephiraId": "tiferet",
|
||||||
|
"name": "Tiphareth",
|
||||||
|
"nameHebrew": "תפארת",
|
||||||
|
"translation": "Beauty",
|
||||||
|
"planet": "Sol",
|
||||||
|
"intelligence": "The Intelligence of the Mediating Influence",
|
||||||
|
"tarot": "The 4 Sixes — Princes",
|
||||||
|
"description": "The Sixth Path is called the Intelligence of Mediating Influence, for within it the influx of Emitters increases. For it causes an influx that flows into all the reservoirs of blessing, which become one with them."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"number": 7,
|
||||||
|
"sephiraId": "netzach",
|
||||||
|
"name": "Netzach",
|
||||||
|
"nameHebrew": "נצח",
|
||||||
|
"translation": "Victory",
|
||||||
|
"planet": "Venus",
|
||||||
|
"intelligence": "The Occult or Hidden Intelligence",
|
||||||
|
"tarot": "The 4 Sevens",
|
||||||
|
"description": "The Seventh Path is the Hidden Intelligence, which is the radiance of all the intellectual virtues recognized by the eyes of the intellect and the contemplation of faith."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"number": 8,
|
||||||
|
"sephiraId": "hod",
|
||||||
|
"name": "Hod",
|
||||||
|
"nameHebrew": "הוד",
|
||||||
|
"translation": "Splendour",
|
||||||
|
"planet": "Mercury",
|
||||||
|
"intelligence": "The Absolute or Perfect Intelligence",
|
||||||
|
"tarot": "The 4 Eights",
|
||||||
|
"description": "The Eighth Path is called the Absolute Path, or the Perfect Path, because it is the means of the First. The first has no root to cling to or depend on but the Gedulah from its own nature, the hidden places of its majesty."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"number": 9,
|
||||||
|
"sephiraId": "yesod",
|
||||||
|
"name": "Yesod",
|
||||||
|
"nameHebrew": "יסוד",
|
||||||
|
"translation": "Foundation",
|
||||||
|
"planet": "Luna",
|
||||||
|
"intelligence": "The Pure or Clear Intelligence",
|
||||||
|
"tarot": "The 4 Nines",
|
||||||
|
"description": "The Ninth Path is pure intelligence, so called because it purifies the counting laws, substantiates and corrects the conception of their explanations, and apportions their unity. They are united to that unity without diminution or division."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"number": 10,
|
||||||
|
"sephiraId": "malchut",
|
||||||
|
"name": "Malkuth",
|
||||||
|
"nameHebrew": "מלכות",
|
||||||
|
"translation": "Kingdom",
|
||||||
|
"planet": "Earth / Sphere of Elements",
|
||||||
|
"intelligence": "The Resplendent Intelligence",
|
||||||
|
"tarot": "The 4 Tens — Princesses",
|
||||||
|
"description": "The tenth path is the brilliant intelligence, for it is exalted above all heads and sits on the throne of Binah (the intelligence spoken of in the third path). It illuminates the radiance of all light, and causes the supply of influence to radiate from the King of Faces."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"paths": [
|
||||||
|
{
|
||||||
|
"pathNumber": 11,
|
||||||
|
"connectKey": "1_2",
|
||||||
|
"connects": { "from": 1, "to": 2 },
|
||||||
|
"connectIds": { "from": "keter", "to": "chochmah" },
|
||||||
|
"pillar": "horizontal-supernal",
|
||||||
|
"hebrewLetter": {
|
||||||
|
"char": "א",
|
||||||
|
"transliteration": "Aleph",
|
||||||
|
"letterType": "mother",
|
||||||
|
"meaning": "Ox"
|
||||||
|
},
|
||||||
|
"astrology": { "type": "element", "name": "Air" },
|
||||||
|
"tarot": { "card": "The Fool", "trumpNumber": 0, "tarotId": "0" },
|
||||||
|
"intelligence": "Scintillating Intelligence",
|
||||||
|
"description": "The Eleventh Path is the sparkling intelligence, for it is the nature of the veil placed close to the order of arrangement, and it is the special dignity given to it that it may stand before the face of the cause of causes.\n\nThis path is the essence of the 'veil' (ordained by this system). Path number 11 represents the relationship between paths, and it is here that we stand in the face of the 'Cause of Causes'."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pathNumber": 12,
|
||||||
|
"connectKey": "1_3",
|
||||||
|
"connects": { "from": 1, "to": 3 },
|
||||||
|
"connectIds": { "from": "keter", "to": "binah" },
|
||||||
|
"pillar": "left-supernal",
|
||||||
|
"hebrewLetter": {
|
||||||
|
"char": "ב",
|
||||||
|
"transliteration": "Beth",
|
||||||
|
"letterType": "double",
|
||||||
|
"meaning": "House"
|
||||||
|
},
|
||||||
|
"astrology": { "type": "planet", "name": "Mercury" },
|
||||||
|
"tarot": { "card": "The Magician", "trumpNumber": 1, "tarotId": "1" },
|
||||||
|
"intelligence": "Intelligence of Transparency",
|
||||||
|
"description": "The Twelfth Path is the intellect of invisibility, for it is a kind of magnificence called Chazchazit. Khazkhajit is called the place from which visions of those who see in visions (i.e. prophecies received by prophets in visions) come from.\n\nThis path is the essence of the 'Ophan-wheel' of 'Greatness'. This is called 'the one who realizes in front of his eyes (Visualizer)', and 'Those who can see (Seers)' see what is realized here as 'vision'."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pathNumber": 13,
|
||||||
|
"connectKey": "1_6",
|
||||||
|
"connects": { "from": 1, "to": 6 },
|
||||||
|
"connectIds": { "from": "keter", "to": "tiferet" },
|
||||||
|
"pillar": "middle",
|
||||||
|
"hebrewLetter": {
|
||||||
|
"char": "ג",
|
||||||
|
"transliteration": "Gimel",
|
||||||
|
"letterType": "double",
|
||||||
|
"meaning": "Camel"
|
||||||
|
},
|
||||||
|
"astrology": { "type": "planet", "name": "Luna" },
|
||||||
|
"tarot": { "card": "The High Priestess", "trumpNumber": 2, "tarotId": "2" },
|
||||||
|
"intelligence": "Uniting Intelligence",
|
||||||
|
"description": "The thirteenth path is the unifying intelligence, so called because it is itself the essence of glory. It is the perfection of the truth of individual spiritual beings.\n\nThis path is the essence of 'Glory'. It represents the achievement of true essence by united spirit beings.\n\nThe Thirteenth Path, as Gimel, has been called 'the dark night of the soul'. This thirteenth path crosses the abyss leading directly to Kether. The letter Gimel means 'camel' — a medium that crosses the seemingly infinite abyss desert alone. Gimel is the ultimate source of water and expresses the primordial essence of consciousness.\n\nTogether with Temperance (Samekh) and the Universe (Tav), these paths constitute the middle pillar in the tree of life. Walking the thirteenth path unites the human incarnation with the eternal self, and when safely crossing the abyss, the greatest initiation is bestowed. This path connects Tiphareth (the divine incarnation) with Kether, the highest source."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pathNumber": 14,
|
||||||
|
"connectKey": "2_3",
|
||||||
|
"connects": { "from": 2, "to": 3 },
|
||||||
|
"connectIds": { "from": "chochmah", "to": "binah" },
|
||||||
|
"pillar": "horizontal-supernal",
|
||||||
|
"hebrewLetter": {
|
||||||
|
"char": "ד",
|
||||||
|
"transliteration": "Daleth",
|
||||||
|
"letterType": "double",
|
||||||
|
"meaning": "Door"
|
||||||
|
},
|
||||||
|
"astrology": { "type": "planet", "name": "Venus" },
|
||||||
|
"tarot": { "card": "The Empress", "trumpNumber": 3, "tarotId": "3" },
|
||||||
|
"intelligence": "Illuminating Intelligence",
|
||||||
|
"description": "The fourteenth path is the enlightening intelligence, so called because it is itself that Chashmal. Kashmal is the founder of the hidden fundamental concept of holiness and its preparatory stages.\n\nThis path is the essence of 'Speaking of Silence'. On this path one obtains esoteric teachings about the sacred secrets and their structures."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pathNumber": 15,
|
||||||
|
"connectKey": "2_6",
|
||||||
|
"connects": { "from": 2, "to": 6 },
|
||||||
|
"connectIds": { "from": "chochmah", "to": "tiferet" },
|
||||||
|
"pillar": "right",
|
||||||
|
"hebrewLetter": {
|
||||||
|
"char": "ה",
|
||||||
|
"transliteration": "Heh",
|
||||||
|
"letterType": "simple",
|
||||||
|
"meaning": "Window"
|
||||||
|
},
|
||||||
|
"astrology": { "type": "zodiac", "name": "Aries" },
|
||||||
|
"tarot": { "card": "The Emperor", "trumpNumber": 4, "tarotId": "4" },
|
||||||
|
"intelligence": "Constituting Intelligence",
|
||||||
|
"description": "The fifteenth path is the constructive intelligence, so called because it constitutes the reality of creation in pure darkness. People have spoken of these meditations as 'the darkness that the Bible speaks of as the thick darkness that is the belt around it' (Job 38:9).\n\nThis path is a state of consolidation of the essence of creation in the 'Glooms of Purity'."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pathNumber": 16,
|
||||||
|
"connectKey": "2_4",
|
||||||
|
"connects": { "from": 2, "to": 4 },
|
||||||
|
"connectIds": { "from": "chochmah", "to": "hesed" },
|
||||||
|
"pillar": "right",
|
||||||
|
"hebrewLetter": {
|
||||||
|
"char": "ו",
|
||||||
|
"transliteration": "Vav",
|
||||||
|
"letterType": "simple",
|
||||||
|
"meaning": "Nail"
|
||||||
|
},
|
||||||
|
"astrology": { "type": "zodiac", "name": "Taurus" },
|
||||||
|
"tarot": { "card": "The Hierophant", "trumpNumber": 5, "tarotId": "5" },
|
||||||
|
"intelligence": "Eternal Intelligence",
|
||||||
|
"description": "The sixteenth path is the victorious or eternal intelligence, so called because it is the joy of glory. Beyond it there is no other glory like it. It is also called the paradise prepared for the righteous.\n\nThis path is 'the Delight of the Glory'. Therefore, it is the lowest state of 'glory'. This is called the Garden of Eden, and it is a place prepared (as a reward) for the saint."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pathNumber": 17,
|
||||||
|
"connectKey": "3_6",
|
||||||
|
"connects": { "from": 3, "to": 6 },
|
||||||
|
"connectIds": { "from": "binah", "to": "tiferet" },
|
||||||
|
"pillar": "left",
|
||||||
|
"hebrewLetter": {
|
||||||
|
"char": "ז",
|
||||||
|
"transliteration": "Zayin",
|
||||||
|
"letterType": "simple",
|
||||||
|
"meaning": "Sword"
|
||||||
|
},
|
||||||
|
"astrology": { "type": "zodiac", "name": "Gemini" },
|
||||||
|
"tarot": { "card": "The Lovers", "trumpNumber": 6, "tarotId": "6" },
|
||||||
|
"intelligence": "Disposing Intelligence",
|
||||||
|
"description": "The seventeenth path is the disposing intelligence, which gives faith to the righteous, by which they are clothed with the Holy Spirit, and which is called the fountain of virtue in the state of higher beings.\n\nThis path is reserved for faithful saints, and saints are sanctified here. It belongs to the supernal Entities, and it is called 'the foundation of beauty'."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pathNumber": 18,
|
||||||
|
"connectKey": "3_5",
|
||||||
|
"connects": { "from": 3, "to": 5 },
|
||||||
|
"connectIds": { "from": "binah", "to": "gevurah" },
|
||||||
|
"pillar": "left",
|
||||||
|
"hebrewLetter": {
|
||||||
|
"char": "ח",
|
||||||
|
"transliteration": "Cheth",
|
||||||
|
"letterType": "simple",
|
||||||
|
"meaning": "Fence"
|
||||||
|
},
|
||||||
|
"astrology": { "type": "zodiac", "name": "Cancer" },
|
||||||
|
"tarot": { "card": "The Chariot", "trumpNumber": 7, "tarotId": "7" },
|
||||||
|
"intelligence": "House of Influence",
|
||||||
|
"description": "The Eighteenth Path is called the House of Influence (the flow of good things to created beings is increased by the greatness of its abundance), and from the midst of the search are drawn secrets and hidden meanings, which are the cause of all causes. It comes from the cause, dwells in its shadow, and clings to it.\n\nIn exploring this path, those who dwell in the shadow of the 'cause of causes' are handed over hidden mysteries and hints, and vow to thoroughly dig out the material that has flowed in from 'the cause of causes'."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pathNumber": 19,
|
||||||
|
"connectKey": "4_5",
|
||||||
|
"connects": { "from": 4, "to": 5 },
|
||||||
|
"connectIds": { "from": "hesed", "to": "gevurah" },
|
||||||
|
"pillar": "horizontal-middle",
|
||||||
|
"hebrewLetter": {
|
||||||
|
"char": "ט",
|
||||||
|
"transliteration": "Teth",
|
||||||
|
"letterType": "simple",
|
||||||
|
"meaning": "Serpent"
|
||||||
|
},
|
||||||
|
"astrology": { "type": "zodiac", "name": "Leo" },
|
||||||
|
"tarot": { "card": "Strength", "trumpNumber": 8, "tarotId": "8" },
|
||||||
|
"intelligence": "Intelligence of the Secret of Spiritual Activities",
|
||||||
|
"description": "The Nineteenth Path is the intelligence of all the deeds of spiritual beings, so called because of the abundance spread by it from the highest blessings and the most exalted and sublime glory.\n\nThis path points to an influx from the 'Supreme Blessing' and the 'Glory of the Most High'."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pathNumber": 20,
|
||||||
|
"connectKey": "4_6",
|
||||||
|
"connects": { "from": 4, "to": 6 },
|
||||||
|
"connectIds": { "from": "hesed", "to": "tiferet" },
|
||||||
|
"pillar": "right",
|
||||||
|
"hebrewLetter": {
|
||||||
|
"char": "י",
|
||||||
|
"transliteration": "Yod",
|
||||||
|
"letterType": "simple",
|
||||||
|
"meaning": "Hand"
|
||||||
|
},
|
||||||
|
"astrology": { "type": "zodiac", "name": "Virgo" },
|
||||||
|
"tarot": { "card": "The Hermit", "trumpNumber": 9, "tarotId": "9" },
|
||||||
|
"intelligence": "Intelligence of the Will",
|
||||||
|
"description": "The Twentieth Path is the intelligence of the will, so called because it is the means of preparing all and each of created beings. By this intellect the existence of primordial wisdom becomes known.\n\nThis path is the structure of all that is formed. Through this state of consciousness, we can know the nature of 'Original Wisdom'."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pathNumber": 21,
|
||||||
|
"connectKey": "4_7",
|
||||||
|
"connects": { "from": 4, "to": 7 },
|
||||||
|
"connectIds": { "from": "hesed", "to": "netzach" },
|
||||||
|
"pillar": "right",
|
||||||
|
"hebrewLetter": {
|
||||||
|
"char": "כ",
|
||||||
|
"transliteration": "Kaph",
|
||||||
|
"letterType": "double",
|
||||||
|
"meaning": "Palm"
|
||||||
|
},
|
||||||
|
"astrology": { "type": "planet", "name": "Jupiter" },
|
||||||
|
"tarot": { "card": "Wheel of Fortune", "trumpNumber": 10, "tarotId": "10" },
|
||||||
|
"intelligence": "Intelligence of Conciliation",
|
||||||
|
"description": "The Twenty-first Path is the Intelligence of Reconciliation, so called because it receives the influence of God flowing into it from the blessings bestowed on all beings and each being.\n\nThis path is the state of receiving the influx of divinity, through which all beings receive the blessings of the gods.\n\nThe 21st path connects Netzach and Chesed, and directly reflects the power of Jupiter — benevolent king. The alphabetic attribute is the letter Kaph, which in its general form represents a cupped hand for receptivity. The letter Kaph means 'palm' as well as 'closed and clenched hands' and has the numeric value 100. Kaph is layered with mystical meanings closely linked to prophecy and vision.\n\nFundamental to the mysticism of this key is the cyclical nature of life — the regularity of the seasons, the repetitive actions of mankind and astronomical movements in the sky. Kabbalah teaches that the secret to mastering the environment is to be found through enlightenment, and that the center of the wheel is the only resting place."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pathNumber": 22,
|
||||||
|
"connectKey": "5_6",
|
||||||
|
"connects": { "from": 5, "to": 6 },
|
||||||
|
"connectIds": { "from": "gevurah", "to": "tiferet" },
|
||||||
|
"pillar": "left",
|
||||||
|
"hebrewLetter": {
|
||||||
|
"char": "ל",
|
||||||
|
"transliteration": "Lamed",
|
||||||
|
"letterType": "simple",
|
||||||
|
"meaning": "Ox Goad"
|
||||||
|
},
|
||||||
|
"astrology": { "type": "zodiac", "name": "Libra" },
|
||||||
|
"tarot": { "card": "Justice", "trumpNumber": 11, "tarotId": "11" },
|
||||||
|
"intelligence": "Faithful Intelligence",
|
||||||
|
"description": "The Twenty-Second Path is the Faithful Intelligence, so called because by it spiritual virtues are increased and almost all the inhabitants of the earth are under its shadow.\n\nA state of enhanced spiritual power, through which all beings 'dwelling in the shadows' can be approached."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pathNumber": 23,
|
||||||
|
"connectKey": "5_8",
|
||||||
|
"connects": { "from": 5, "to": 8 },
|
||||||
|
"connectIds": { "from": "gevurah", "to": "hod" },
|
||||||
|
"pillar": "horizontal-middle",
|
||||||
|
"hebrewLetter": {
|
||||||
|
"char": "מ",
|
||||||
|
"transliteration": "Mem",
|
||||||
|
"letterType": "mother",
|
||||||
|
"meaning": "Water"
|
||||||
|
},
|
||||||
|
"astrology": { "type": "element", "name": "Water" },
|
||||||
|
"tarot": { "card": "The Hanged Man", "trumpNumber": 12, "tarotId": "12" },
|
||||||
|
"intelligence": "Stable Intelligence",
|
||||||
|
"description": "The Twenty-Third Path is the Stable Intelligence, so called because it possesses the virtue of unity in all ranks.\n\nThis path is the power that sustains all Sephiroth. The 23rd Path runs between Hod and Geburah and is governed by the water element. The Hebrew letter Mem means 'waters' or sea. Water is considered the first principle in alchemy, the most stable and fundamental of the elements.\n\nThe Hanged Man depicts this stable intelligence because he cannot separate it from the Unity that water expresses. The most implicit symbolic system is the symbolic system of reversal or suspension of general consciousness, symbolizing immersion in superconsciousness and the absolute surrender of the individual will. The mythological concept of sacrifice — the dying god — is cosmic and cross-cultural: Odin hung on the world tree, Osiris in Egypt, Dionysus in Greece. The main image of a dying god is that of complete liberation, restoring the Creator back to the throne."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pathNumber": 24,
|
||||||
|
"connectKey": "6_7",
|
||||||
|
"connects": { "from": 6, "to": 7 },
|
||||||
|
"connectIds": { "from": "tiferet", "to": "netzach" },
|
||||||
|
"pillar": "right",
|
||||||
|
"hebrewLetter": {
|
||||||
|
"char": "נ",
|
||||||
|
"transliteration": "Nun",
|
||||||
|
"letterType": "simple",
|
||||||
|
"meaning": "Fish"
|
||||||
|
},
|
||||||
|
"astrology": { "type": "zodiac", "name": "Scorpio" },
|
||||||
|
"tarot": { "card": "Death", "trumpNumber": 13, "tarotId": "13" },
|
||||||
|
"intelligence": "Imaginative Intelligence",
|
||||||
|
"description": "The twenty-fourth path is the intellect of the imagination, so called because it gives its harmonious elegance and likeness to all likenesses created in like ways.\n\nIn this path, all the illusions created appear in a form appropriate to their status."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pathNumber": 25,
|
||||||
|
"connectKey": "6_9",
|
||||||
|
"connects": { "from": 6, "to": 9 },
|
||||||
|
"connectIds": { "from": "tiferet", "to": "yesod" },
|
||||||
|
"pillar": "middle",
|
||||||
|
"hebrewLetter": {
|
||||||
|
"char": "ס",
|
||||||
|
"transliteration": "Samekh",
|
||||||
|
"letterType": "simple",
|
||||||
|
"meaning": "Prop"
|
||||||
|
},
|
||||||
|
"astrology": { "type": "zodiac", "name": "Sagittarius" },
|
||||||
|
"tarot": { "card": "Temperance", "trumpNumber": 14, "tarotId": "14" },
|
||||||
|
"intelligence": "Intelligence of Temptation and Trial",
|
||||||
|
"description": "The twenty-fifth path is the intelligence of testing or trial, so called because it is the first temptation by which the Creator tests all righteous men.\n\nGod causes the called ones to undergo a fundamental test here. Together with the High Priestess (Gimel) and the Universe (Tav), Samekh (Temperance) constitutes the middle pillar in the tree of life. Both Samekh and Gimel have been called 'the dark night of the soul', because both cross an abyss — Samekh crosses the lesser abyss on its journey to Tiphareth."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pathNumber": 26,
|
||||||
|
"connectKey": "6_8",
|
||||||
|
"connects": { "from": 6, "to": 8 },
|
||||||
|
"connectIds": { "from": "tiferet", "to": "hod" },
|
||||||
|
"pillar": "left",
|
||||||
|
"hebrewLetter": {
|
||||||
|
"char": "ע",
|
||||||
|
"transliteration": "Ayin",
|
||||||
|
"letterType": "simple",
|
||||||
|
"meaning": "Eye"
|
||||||
|
},
|
||||||
|
"astrology": { "type": "zodiac", "name": "Capricorn" },
|
||||||
|
"tarot": { "card": "The Devil", "trumpNumber": 15, "tarotId": "15" },
|
||||||
|
"intelligence": "Renovating Intelligence",
|
||||||
|
"description": "The twenty-sixth path is called the Renovating Intelligence, because the Holy God by it renews all the changing things that are renewed by the creation of the world.\n\nThe 26th Path is called the 'Resurrecting Intelligence'. Ayin is said to harbor many mysteries; Gematria equates Ayin to 70 and also the word for 'secret' (SVD). The Ayin, or eye, is the organ of vision — it sees the exterior and appearance of things. In Qabalah, the world of appearances is an illusion arising from our own perception. At Ayin, we learn to use the intelligent eyes of Hod to see anew in the light of beauty illuminated by Tiphareth. Ascension on this path is the process of transferring consciousness from the concrete mind (ego) to the abstract mind (Higher Self)."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pathNumber": 27,
|
||||||
|
"connectKey": "7_8",
|
||||||
|
"connects": { "from": 7, "to": 8 },
|
||||||
|
"connectIds": { "from": "netzach", "to": "hod" },
|
||||||
|
"pillar": "horizontal-lower",
|
||||||
|
"hebrewLetter": {
|
||||||
|
"char": "פ",
|
||||||
|
"transliteration": "Pe",
|
||||||
|
"letterType": "double",
|
||||||
|
"meaning": "Mouth"
|
||||||
|
},
|
||||||
|
"astrology": { "type": "planet", "name": "Mars" },
|
||||||
|
"tarot": { "card": "The Tower", "trumpNumber": 16, "tarotId": "16" },
|
||||||
|
"intelligence": "Exciting Intelligence",
|
||||||
|
"description": "The Twenty-seventh Path is the Exciting Intelligence, so called because by it the intelligence of all created beings and their stimuli or motions under the highest heavens was created.\n\nAll creatures created in the higher dimensions — including their sentience — were created through this path."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pathNumber": 28,
|
||||||
|
"connectKey": "7_9",
|
||||||
|
"connects": { "from": 7, "to": 9 },
|
||||||
|
"connectIds": { "from": "netzach", "to": "yesod" },
|
||||||
|
"pillar": "right",
|
||||||
|
"hebrewLetter": {
|
||||||
|
"char": "צ",
|
||||||
|
"transliteration": "Tzaddi",
|
||||||
|
"letterType": "simple",
|
||||||
|
"meaning": "Fish-hook"
|
||||||
|
},
|
||||||
|
"astrology": { "type": "zodiac", "name": "Aquarius" },
|
||||||
|
"tarot": { "card": "The Star", "trumpNumber": 17, "tarotId": "17" },
|
||||||
|
"intelligence": "Natural Intelligence",
|
||||||
|
"description": "The twenty-eighth path is the natural intelligence, so called because the characteristics of all beings under the solar sphere are perfected and established through it.\n\nThe nature of everything that exists under the sun (belonging to the realm of the sun) is established through this consciousness."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pathNumber": 29,
|
||||||
|
"connectKey": "7_10",
|
||||||
|
"connects": { "from": 7, "to": 10 },
|
||||||
|
"connectIds": { "from": "netzach", "to": "malchut" },
|
||||||
|
"pillar": "right",
|
||||||
|
"hebrewLetter": {
|
||||||
|
"char": "ק",
|
||||||
|
"transliteration": "Qoph",
|
||||||
|
"letterType": "simple",
|
||||||
|
"meaning": "Back of Head"
|
||||||
|
},
|
||||||
|
"astrology": { "type": "zodiac", "name": "Pisces" },
|
||||||
|
"tarot": { "card": "The Moon", "trumpNumber": 18, "tarotId": "18" },
|
||||||
|
"intelligence": "Corporeal Intelligence",
|
||||||
|
"description": "The twenty-ninth path is the bodily intelligence, so called because it gives form to all the worlds and all bodies formed under their multiplication.\n\nThis path describes the development of the materialized according to the systems of each domain.\n\nThe 29th route is another route that threatens the traveler with the risk of disintegration. Since this path leads to Netzach it can cause mental disruption — what is indicated is the renunciation of individuality. The journey from Malkuth to Netzach is a confluence of physical and emotional natures. All paths leading towards Netzach are Orphic paths, similar to Orpheus who enchanted nature with the gift of song.\n\nThe letter Qoph has a value of 100 and also translates as 'awakening'. Called physical intelligence, this is truly the pathway to body consciousness. One of the most important lessons of this path is that it is not to our advantage to try to separate the 'higher state of mind' from the 'lower coarse' form of the body."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pathNumber": 30,
|
||||||
|
"connectKey": "8_9",
|
||||||
|
"connects": { "from": 8, "to": 9 },
|
||||||
|
"connectIds": { "from": "hod", "to": "yesod" },
|
||||||
|
"pillar": "horizontal-lower",
|
||||||
|
"hebrewLetter": {
|
||||||
|
"char": "ר",
|
||||||
|
"transliteration": "Resh",
|
||||||
|
"letterType": "double",
|
||||||
|
"meaning": "Head"
|
||||||
|
},
|
||||||
|
"astrology": { "type": "planet", "name": "Sol" },
|
||||||
|
"tarot": { "card": "The Sun", "trumpNumber": 19, "tarotId": "19" },
|
||||||
|
"intelligence": "Collecting Intelligence",
|
||||||
|
"description": "The Thirtieth Path is the Gathering Intelligence, so called because the astrologers infer from it the judgments of the stars and celestial signs, and the perfection of their learning, according to the laws of their revolutions.\n\nThrough this path, 'the one who spreads the heavens' increases control over the stars and constellations while establishing the knowledge of the chariot wheels in each realm.\n\nThis 30th route runs between Yesod and Hod. This path leads from the realm of the moon to the realm of reason, and although it is gloomy and cold, it is the coolness of the creative imagination by the power of the intellect. However, the full power of the sun shines there. The Hebrew letter Resh means 'head', and its spelling equals 510 or 15 — the same numeric value as Hod (HVD = 15). This path is a balance between mind and body, standing at the heart of the relationship between intellect and intuition. It is often described as a point of profound encounter with the inner master."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pathNumber": 31,
|
||||||
|
"connectKey": "8_10",
|
||||||
|
"connects": { "from": 8, "to": 10 },
|
||||||
|
"connectIds": { "from": "hod", "to": "malchut" },
|
||||||
|
"pillar": "left",
|
||||||
|
"hebrewLetter": {
|
||||||
|
"char": "ש",
|
||||||
|
"transliteration": "Shin",
|
||||||
|
"letterType": "mother",
|
||||||
|
"meaning": "Tooth"
|
||||||
|
},
|
||||||
|
"astrology": { "type": "element", "name": "Fire" },
|
||||||
|
"tarot": { "card": "Judgement", "trumpNumber": 20, "tarotId": "20" },
|
||||||
|
"intelligence": "Perpetual Intelligence",
|
||||||
|
"description": "The Thirty-First Path is the Enduring Intelligence, so why is it called that? For it regulates the motions of the sun and moon in their own order, each in its own proper orbit.\n\nThis path manages the path of the sun and moon so that they maintain their respective optimal orbits according to the laws of nature."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"pathNumber": 32,
|
||||||
|
"connectKey": "9_10",
|
||||||
|
"connects": { "from": 9, "to": 10 },
|
||||||
|
"connectIds": { "from": "yesod", "to": "malchut" },
|
||||||
|
"pillar": "middle",
|
||||||
|
"hebrewLetter": {
|
||||||
|
"char": "ת",
|
||||||
|
"transliteration": "Tav",
|
||||||
|
"letterType": "double",
|
||||||
|
"meaning": "Cross (Tau)"
|
||||||
|
},
|
||||||
|
"astrology": { "type": "planet", "name": "Saturn" },
|
||||||
|
"tarot": { "card": "The Universe", "trumpNumber": 21, "tarotId": "21" },
|
||||||
|
"intelligence": "Administrative Intelligence",
|
||||||
|
"description": "The Thirty-Second Path is the Administrative Intelligence, so called because it directs and unites the seven planets in all their operations and even all of them in their proper course.\n\nThis path is given this name because it is the path that governs the passage between the formative world and the material world. The Universe card on this path is called 'The Door to the Inner Plane'."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
54
data/kabbalah/kerubim.json
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"earth": {
|
||||||
|
"id": "earth",
|
||||||
|
"title": {
|
||||||
|
"en": "Kerub of Earth"
|
||||||
|
},
|
||||||
|
"face": {
|
||||||
|
"en": "Bull",
|
||||||
|
"he": "שור",
|
||||||
|
"roman": "Shor"
|
||||||
|
},
|
||||||
|
"zodiacId": "taurus",
|
||||||
|
"elementId": "earth"
|
||||||
|
},
|
||||||
|
"air": {
|
||||||
|
"id": "air",
|
||||||
|
"title": {
|
||||||
|
"en": "Kerub of Air"
|
||||||
|
},
|
||||||
|
"face": {
|
||||||
|
"en": "Man",
|
||||||
|
"he": "אדם",
|
||||||
|
"roman": "Adam"
|
||||||
|
},
|
||||||
|
"zodiacId": "aquarius",
|
||||||
|
"elementId": "air"
|
||||||
|
},
|
||||||
|
"water": {
|
||||||
|
"id": "water",
|
||||||
|
"title": {
|
||||||
|
"en": "Kerub of Water"
|
||||||
|
},
|
||||||
|
"face": {
|
||||||
|
"en": "Eagle",
|
||||||
|
"he": "נשר",
|
||||||
|
"roman": "Nesher"
|
||||||
|
},
|
||||||
|
"zodiacId": "scorpio",
|
||||||
|
"elementId": "water"
|
||||||
|
},
|
||||||
|
"fire": {
|
||||||
|
"id": "fire",
|
||||||
|
"title": {
|
||||||
|
"en": "Kerub of Fire"
|
||||||
|
},
|
||||||
|
"face": {
|
||||||
|
"en": "Lion",
|
||||||
|
"he": "אריה",
|
||||||
|
"roman": "Aryeh"
|
||||||
|
},
|
||||||
|
"zodiacId": "leo",
|
||||||
|
"elementId": "fire"
|
||||||
|
}
|
||||||
|
}
|
||||||
250
data/kabbalah/paths.json
Normal file
@@ -0,0 +1,250 @@
|
|||||||
|
{
|
||||||
|
"1_2": {
|
||||||
|
"id": "1_2",
|
||||||
|
"hermetic": {
|
||||||
|
"hebrewLetterId": "alef",
|
||||||
|
"pathNo": 11,
|
||||||
|
"tarotId": "0"
|
||||||
|
},
|
||||||
|
"hebrew": {
|
||||||
|
"hebrewLetterId": "he"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"1_3": {
|
||||||
|
"id": "1_3",
|
||||||
|
"hermetic": {
|
||||||
|
"hebrewLetterId": "bet",
|
||||||
|
"pathNo": 12,
|
||||||
|
"tarotId": "1"
|
||||||
|
},
|
||||||
|
"hebrew": {
|
||||||
|
"hebrewLetterId": "vav"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"1_6": {
|
||||||
|
"id": "1_6",
|
||||||
|
"hermetic": {
|
||||||
|
"hebrewLetterId": "gimel",
|
||||||
|
"pathNo": 13,
|
||||||
|
"tarotId": "2"
|
||||||
|
},
|
||||||
|
"hebrew": {
|
||||||
|
"hebrewLetterId": "dalet"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"2_3": {
|
||||||
|
"id": "2_3",
|
||||||
|
"hermetic": {
|
||||||
|
"hebrewLetterId": "dalet",
|
||||||
|
"pathNo": 14,
|
||||||
|
"tarotId": "3"
|
||||||
|
},
|
||||||
|
"hebrew": {
|
||||||
|
"hebrewLetterId": "shin"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"2_4": {
|
||||||
|
"id": "2_4",
|
||||||
|
"hermetic": {
|
||||||
|
"hebrewLetterId": "vav",
|
||||||
|
"pathNo": 16,
|
||||||
|
"tarotId": "5"
|
||||||
|
},
|
||||||
|
"hebrew": {
|
||||||
|
"hebrewLetterId": "bet"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"2_5": {
|
||||||
|
"id": "2_5",
|
||||||
|
"hebrew": {
|
||||||
|
"hebrewLetterId": "zayin"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"2_6": {
|
||||||
|
"id": "2_6",
|
||||||
|
"hermetic": {
|
||||||
|
"hebrewLetterId": "he",
|
||||||
|
"pathNo": 15,
|
||||||
|
"tarotId": "4"
|
||||||
|
},
|
||||||
|
"hebrew": {
|
||||||
|
"hebrewLetterId": "tet"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"3_4": {
|
||||||
|
"id": "3_4",
|
||||||
|
"hebrew": {
|
||||||
|
"hebrewLetterId": "qof"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"3_5": {
|
||||||
|
"id": "3_5",
|
||||||
|
"hermetic": {
|
||||||
|
"hebrewLetterId": "het",
|
||||||
|
"pathNo": 18,
|
||||||
|
"tarotId": "7"
|
||||||
|
},
|
||||||
|
"hebrew": {
|
||||||
|
"hebrewLetterId": "gimel"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"3_6": {
|
||||||
|
"id": "3_6",
|
||||||
|
"hermetic": {
|
||||||
|
"hebrewLetterId": "zayin",
|
||||||
|
"pathNo": 17,
|
||||||
|
"tarotId": "6"
|
||||||
|
},
|
||||||
|
"hebrew": {
|
||||||
|
"hebrewLetterId": "ayin"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"4_5": {
|
||||||
|
"id": "4_5",
|
||||||
|
"hermetic": {
|
||||||
|
"hebrewLetterId": "tet",
|
||||||
|
"pathNo": 19,
|
||||||
|
"tarotId": "8"
|
||||||
|
},
|
||||||
|
"hebrew": {
|
||||||
|
"hebrewLetterId": "alef"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"4_6": {
|
||||||
|
"id": "4_6",
|
||||||
|
"hermetic": {
|
||||||
|
"hebrewLetterId": "yod",
|
||||||
|
"pathNo": 20,
|
||||||
|
"tarotId": "9"
|
||||||
|
},
|
||||||
|
"hebrew": {
|
||||||
|
"hebrewLetterId": "het"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"4_7": {
|
||||||
|
"id": "4_7",
|
||||||
|
"hermetic": {
|
||||||
|
"hebrewLetterId": "kaf",
|
||||||
|
"pathNo": 21,
|
||||||
|
"tarotId": "10"
|
||||||
|
},
|
||||||
|
"hebrew": {
|
||||||
|
"hebrewLetterId": "kaf"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"5_6": {
|
||||||
|
"id": "5_6",
|
||||||
|
"hermetic": {
|
||||||
|
"hebrewLetterId": "lamed",
|
||||||
|
"pathNo": 22,
|
||||||
|
"tarotId": "11"
|
||||||
|
},
|
||||||
|
"hebrew": {
|
||||||
|
"hebrewLetterId": "tsadi"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"5_8": {
|
||||||
|
"id": "5_8",
|
||||||
|
"hermetic": {
|
||||||
|
"hebrewLetterId": "mem",
|
||||||
|
"pathNo": 23,
|
||||||
|
"tarotId": "12"
|
||||||
|
},
|
||||||
|
"hebrew": {
|
||||||
|
"hebrewLetterId": "pe"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"6_7": {
|
||||||
|
"id": "6_7",
|
||||||
|
"hermetic": {
|
||||||
|
"hebrewLetterId": "nun",
|
||||||
|
"pathNo": 24,
|
||||||
|
"tarotId": "13"
|
||||||
|
},
|
||||||
|
"hebrew": {
|
||||||
|
"hebrewLetterId": "yod"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"6_8": {
|
||||||
|
"id": "6_8",
|
||||||
|
"hermetic": {
|
||||||
|
"hebrewLetterId": "ayin",
|
||||||
|
"pathNo": 26,
|
||||||
|
"tarotId": "15"
|
||||||
|
},
|
||||||
|
"hebrew": {
|
||||||
|
"hebrewLetterId": "samekh"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"6_9": {
|
||||||
|
"id": "6_9",
|
||||||
|
"hermetic": {
|
||||||
|
"hebrewLetterId": "samekh",
|
||||||
|
"pathNo": 25,
|
||||||
|
"tarotId": "14"
|
||||||
|
},
|
||||||
|
"hebrew": {
|
||||||
|
"hebrewLetterId": "resh"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"7_8": {
|
||||||
|
"id": "7_8",
|
||||||
|
"hermetic": {
|
||||||
|
"hebrewLetterId": "pe",
|
||||||
|
"pathNo": 27,
|
||||||
|
"tarotId": "16"
|
||||||
|
},
|
||||||
|
"hebrew": {
|
||||||
|
"hebrewLetterId": "mem"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"7_9": {
|
||||||
|
"id": "7_9",
|
||||||
|
"hermetic": {
|
||||||
|
"hebrewLetterId": "tsadi",
|
||||||
|
"pathNo": 28,
|
||||||
|
"tarotId": "17"
|
||||||
|
},
|
||||||
|
"hebrew": {
|
||||||
|
"hebrewLetterId": "nun"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"7_10": {
|
||||||
|
"id": "7_10",
|
||||||
|
"hermetic": {
|
||||||
|
"hebrewLetterId": "qof",
|
||||||
|
"pathNo": 29,
|
||||||
|
"tarotId": "18"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"8_9": {
|
||||||
|
"id": "8_9",
|
||||||
|
"hermetic": {
|
||||||
|
"hebrewLetterId": "resh",
|
||||||
|
"pathNo": 30,
|
||||||
|
"tarotId": "19"
|
||||||
|
},
|
||||||
|
"hebrew": {
|
||||||
|
"hebrewLetterId": "lamed"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"8_10": {
|
||||||
|
"id": "8_10",
|
||||||
|
"hermetic": {
|
||||||
|
"hebrewLetterId": "shin",
|
||||||
|
"pathNo": 31,
|
||||||
|
"tarotId": "20"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"9_10": {
|
||||||
|
"id": "9_10",
|
||||||
|
"hermetic": {
|
||||||
|
"hebrewLetterId": "tav",
|
||||||
|
"pathNo": 32,
|
||||||
|
"tarotId": "21"
|
||||||
|
},
|
||||||
|
"hebrew": {
|
||||||
|
"hebrewLetterId": "tav"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
324
data/kabbalah/sephirot.json
Normal file
@@ -0,0 +1,324 @@
|
|||||||
|
{
|
||||||
|
"keter": {
|
||||||
|
"index": 1,
|
||||||
|
"id": "keter",
|
||||||
|
"name": {
|
||||||
|
"he": "כתר",
|
||||||
|
"roman": "Keter",
|
||||||
|
"en": "Crown"
|
||||||
|
},
|
||||||
|
"color": {
|
||||||
|
"king": "brillliance",
|
||||||
|
"kingWeb": "white",
|
||||||
|
"queen": "white",
|
||||||
|
"queenWeb": "white"
|
||||||
|
},
|
||||||
|
"chakraId": "crown",
|
||||||
|
"godNameId": "ehiyeh",
|
||||||
|
"scent": "ambergris",
|
||||||
|
"body": "cranium",
|
||||||
|
"bodyPos": "above-head",
|
||||||
|
"planetId": "primum-mobile",
|
||||||
|
"tenHeavens": {
|
||||||
|
"en": "1st Swirlings / Primum Mobile",
|
||||||
|
"he": "ראשית הגלגולים",
|
||||||
|
"roman": "Roshit haGilgulim"
|
||||||
|
},
|
||||||
|
"stone": "diamond",
|
||||||
|
"archangelIdId": "metatron",
|
||||||
|
"soulId": "yechidah",
|
||||||
|
"angelicOrderId": "chayot-hakodesh",
|
||||||
|
"gdGradeId": "10=1",
|
||||||
|
"next": "chochmah"
|
||||||
|
},
|
||||||
|
"chochmah": {
|
||||||
|
"index": 2,
|
||||||
|
"id": "chochmah",
|
||||||
|
"name": {
|
||||||
|
"he": "חכמה",
|
||||||
|
"en": "Wisdom",
|
||||||
|
"roman": "Chochmah"
|
||||||
|
},
|
||||||
|
"color": {
|
||||||
|
"king": "soft-blue",
|
||||||
|
"kingWeb": "SkyBlue",
|
||||||
|
"queen": "gray",
|
||||||
|
"queenWeb": "gray"
|
||||||
|
},
|
||||||
|
"scent": "musk",
|
||||||
|
"chakraId": "third-eye",
|
||||||
|
"godNameId": "yah",
|
||||||
|
"body": "left-face",
|
||||||
|
"bodyPos": "left-temple",
|
||||||
|
"planetId": "zodiac",
|
||||||
|
"tenHeavens": {
|
||||||
|
"en": "The Zodiac",
|
||||||
|
"roman": "Mazalot",
|
||||||
|
"he": "מזלות"
|
||||||
|
},
|
||||||
|
"stone": "Star Ruby; Turquoise",
|
||||||
|
"archangelId": "raziel",
|
||||||
|
"soulId": "chaya",
|
||||||
|
"angelicOrderId": "auphanim",
|
||||||
|
"gdGradeId": "9=2",
|
||||||
|
"prev": "keter",
|
||||||
|
"next": "binah"
|
||||||
|
},
|
||||||
|
"binah": {
|
||||||
|
"index": 3,
|
||||||
|
"id": "binah",
|
||||||
|
"name": {
|
||||||
|
"he": "בינה",
|
||||||
|
"en": "Understanding",
|
||||||
|
"roman": "Binah"
|
||||||
|
},
|
||||||
|
"color": {
|
||||||
|
"king": "deep-red-violet",
|
||||||
|
"kingWeb": "#c0448f",
|
||||||
|
"queen": "black",
|
||||||
|
"queenWeb": "#222",
|
||||||
|
"queenWebText": "#ccc"
|
||||||
|
},
|
||||||
|
"chakraId": "third-eye",
|
||||||
|
"godNameId": "yhvh-elohim",
|
||||||
|
"scent": "myrrh; civet",
|
||||||
|
"body": "right-face",
|
||||||
|
"bodyPos": "right-temple",
|
||||||
|
"planetId": "saturn",
|
||||||
|
"stone": "pearl; star sapphire",
|
||||||
|
"archangelId": "tzaphkiel",
|
||||||
|
"soulId": "neshama",
|
||||||
|
"angelicOrderId": "aralim",
|
||||||
|
"gdGradeId": "8=3",
|
||||||
|
"prev": "chochmah",
|
||||||
|
"next": "hesed"
|
||||||
|
},
|
||||||
|
"hesed": {
|
||||||
|
"index": 4,
|
||||||
|
"id": "hesed",
|
||||||
|
"name": {
|
||||||
|
"he": "חסד",
|
||||||
|
"en": "Mercy",
|
||||||
|
"roman": "Chesed"
|
||||||
|
},
|
||||||
|
"color": {
|
||||||
|
"king": "deep-violet",
|
||||||
|
"kingWeb": "#330066",
|
||||||
|
"kingWebText": "#ccc",
|
||||||
|
"queen": "blue",
|
||||||
|
"queenWeb": "#0066ff"
|
||||||
|
},
|
||||||
|
"chakraId": "throat",
|
||||||
|
"godNameId": "el",
|
||||||
|
"scent": "cedar",
|
||||||
|
"body": "left-arm",
|
||||||
|
"bodyPos": "left-shoulder",
|
||||||
|
"planetId": "jupiter",
|
||||||
|
"stone": "saphire; amethyst",
|
||||||
|
"archangelId": "tzadkiel",
|
||||||
|
"soulId": null,
|
||||||
|
"angelicOrderId": "chashmalim",
|
||||||
|
"gdGradeId": "7=4",
|
||||||
|
"prev": "binah",
|
||||||
|
"next": "gevurah"
|
||||||
|
},
|
||||||
|
"gevurah": {
|
||||||
|
"index": 5,
|
||||||
|
"id": "gevurah",
|
||||||
|
"name": {
|
||||||
|
"he": "גבורה",
|
||||||
|
"en": "Strength",
|
||||||
|
"roman": "Gevurah"
|
||||||
|
},
|
||||||
|
"color": {
|
||||||
|
"king": "orange",
|
||||||
|
"kingWeb": "orange",
|
||||||
|
"queen": "scarlet",
|
||||||
|
"queenWeb": "#ff2400"
|
||||||
|
},
|
||||||
|
"chakraId": "throat",
|
||||||
|
"godNameId": "elohim-gibor",
|
||||||
|
"scent": "tobacco",
|
||||||
|
"body": "right-arm",
|
||||||
|
"bodyPos": "right-shoulder",
|
||||||
|
"planetId": "mars",
|
||||||
|
"stone": "ruby",
|
||||||
|
"archangelId": "khamael",
|
||||||
|
"soulId": null,
|
||||||
|
"angelicOrderId": "seraphim",
|
||||||
|
"gdGradeId": "6=5",
|
||||||
|
"prev": "hesed",
|
||||||
|
"next": "tiferet"
|
||||||
|
},
|
||||||
|
"tiferet": {
|
||||||
|
"index": 6,
|
||||||
|
"id": "tiferet",
|
||||||
|
"name": {
|
||||||
|
"he": "תפארת",
|
||||||
|
"en": "Beauty",
|
||||||
|
"roman": "Tiferet"
|
||||||
|
},
|
||||||
|
"color": {
|
||||||
|
"king": "rose-pink",
|
||||||
|
"kingWeb": "#f7cac1",
|
||||||
|
"queen": "gold",
|
||||||
|
"queenWeb": "gold"
|
||||||
|
},
|
||||||
|
"chakraId": "heart",
|
||||||
|
"godNameId": "yhvh-eloha-vedaat",
|
||||||
|
"scent": "olibanum",
|
||||||
|
"body": "breast",
|
||||||
|
"bodyPos": "heart",
|
||||||
|
"planetId": "sol",
|
||||||
|
"stone": "topaz",
|
||||||
|
"archangelId": "raphael",
|
||||||
|
"soulId": "ruach",
|
||||||
|
"angelicOrderId": "malachim",
|
||||||
|
"gdGradeId": "5=6",
|
||||||
|
"prev": "gevurah",
|
||||||
|
"next": "netzach"
|
||||||
|
},
|
||||||
|
"netzach": {
|
||||||
|
"index": 7,
|
||||||
|
"id": "netzach",
|
||||||
|
"name": {
|
||||||
|
"he": "נצח",
|
||||||
|
"en": "Victory",
|
||||||
|
"roman": "Netzach"
|
||||||
|
},
|
||||||
|
"color": {
|
||||||
|
"king": "yellow-orange",
|
||||||
|
"kingWeb": "#ffae42",
|
||||||
|
"queen": "emerald",
|
||||||
|
"queenWeb": "#50C878"
|
||||||
|
},
|
||||||
|
"chakraId": "solar-plexus",
|
||||||
|
"godNameId": "yhvh-tzvaot",
|
||||||
|
"scent": "rose, red sandal",
|
||||||
|
"body": "loins; hips",
|
||||||
|
"bodyPos": "left-hip",
|
||||||
|
"planetId": "venus",
|
||||||
|
"stone": "emerald",
|
||||||
|
"archangelId": "haniel",
|
||||||
|
"soulId": null,
|
||||||
|
"angelicOrderId": "elohim",
|
||||||
|
"gdGradeId": "4=7",
|
||||||
|
"prev": "tiferet",
|
||||||
|
"next": "hod"
|
||||||
|
},
|
||||||
|
"hod": {
|
||||||
|
"index": 8,
|
||||||
|
"id": "hod",
|
||||||
|
"name": {
|
||||||
|
"he": "הוד",
|
||||||
|
"en": "Splendor",
|
||||||
|
"roman": "Hod"
|
||||||
|
},
|
||||||
|
"color": {
|
||||||
|
"king": "violet",
|
||||||
|
"kingWeb": "#ee82ee",
|
||||||
|
"queen": "orange",
|
||||||
|
"queenWeb": "orange"
|
||||||
|
},
|
||||||
|
"chakraId": "solar-plexus",
|
||||||
|
"godNameId": "elohim-tzvaot",
|
||||||
|
"scent": "storax",
|
||||||
|
"body": "loins; legs",
|
||||||
|
"bodyPos": "right-hip",
|
||||||
|
"planetId": "mercury",
|
||||||
|
"stone": "quartz",
|
||||||
|
"archangelId": "michael",
|
||||||
|
"soulId": null,
|
||||||
|
"angelicOrderId": "bnei-elohim",
|
||||||
|
"gdGradeId": "3=8",
|
||||||
|
"prev": "netzach",
|
||||||
|
"next": "yesod"
|
||||||
|
},
|
||||||
|
"yesod": {
|
||||||
|
"index": 9,
|
||||||
|
"id": "yesod",
|
||||||
|
"name": {
|
||||||
|
"he": "יסוד",
|
||||||
|
"en": "Foundation",
|
||||||
|
"roman": "Yesod"
|
||||||
|
},
|
||||||
|
"color": {
|
||||||
|
"king": "blue-violet",
|
||||||
|
"kingWeb": "#2014d4",
|
||||||
|
"kingWebText": "#aaa",
|
||||||
|
"queen": "violet",
|
||||||
|
"queenWeb": "violet"
|
||||||
|
},
|
||||||
|
"chakraId": "sacral",
|
||||||
|
"godNameId": "shadai-el-chai",
|
||||||
|
"scent": "jasmine",
|
||||||
|
"body": "genitals",
|
||||||
|
"bodyPos": "genitals",
|
||||||
|
"planetId": "luna",
|
||||||
|
"stone": "quartz",
|
||||||
|
"archangelId": "gabriel",
|
||||||
|
"soulId": "nephesh",
|
||||||
|
"angelicOrderId": "kerubim",
|
||||||
|
"gdGradeId": "2=9",
|
||||||
|
"prev": "hod",
|
||||||
|
"next": "malchut"
|
||||||
|
},
|
||||||
|
"malchut": {
|
||||||
|
"index": 10,
|
||||||
|
"id": "malchut",
|
||||||
|
"name": {
|
||||||
|
"he": "מלכות",
|
||||||
|
"en": "Kingdom",
|
||||||
|
"roman": "Malchut"
|
||||||
|
},
|
||||||
|
"color": {
|
||||||
|
"king": "yellow",
|
||||||
|
"kingWeb": "yellow",
|
||||||
|
"queen": "russet,citrine,olive,black",
|
||||||
|
"queenWeb": "#80461B,#ba0,#880,#000000",
|
||||||
|
"queenWebText": "#eee"
|
||||||
|
},
|
||||||
|
"chakraId": "root",
|
||||||
|
"godNameId": "adonai-haaretz",
|
||||||
|
"scent": "",
|
||||||
|
"body": "feet",
|
||||||
|
"bodyPos": "feet",
|
||||||
|
"planetId": "olam-yesodot",
|
||||||
|
"tenHeavens": {
|
||||||
|
"en": "Sphere of the Elements",
|
||||||
|
"he": "עולם יסודות",
|
||||||
|
"roman": "Olam Yesodoth"
|
||||||
|
},
|
||||||
|
"stone": "rock crystal",
|
||||||
|
"archangelId": "sandalphon",
|
||||||
|
"soulId": "guph",
|
||||||
|
"angelicOrderId": "ishim",
|
||||||
|
"gdGradeId": "1=10",
|
||||||
|
"prev": "yesod"
|
||||||
|
},
|
||||||
|
"daat": {
|
||||||
|
"index": 11,
|
||||||
|
"id": "daat",
|
||||||
|
"name": {
|
||||||
|
"he": "דעת",
|
||||||
|
"en": "Knowledge",
|
||||||
|
"roman": "Da'at"
|
||||||
|
},
|
||||||
|
"color": {
|
||||||
|
"queen": "lavendar",
|
||||||
|
"queenWeb": "#E6E6FAEE",
|
||||||
|
"queenWebText": "#000",
|
||||||
|
"strokeDasharray": 2,
|
||||||
|
"strokeColor": "#000000AA"
|
||||||
|
},
|
||||||
|
"chakraId": "",
|
||||||
|
"godNameId": "yhvh-elohim",
|
||||||
|
"scent": "",
|
||||||
|
"body": "throat",
|
||||||
|
"bodyPos": "throat",
|
||||||
|
"stone": "",
|
||||||
|
"archangelId": "",
|
||||||
|
"soulId": "",
|
||||||
|
"angelicOrderId": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
107
data/kabbalah/seventyTwoAngels.json
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"name": {
|
||||||
|
"he": "והויה",
|
||||||
|
"en": "Vehuiah"
|
||||||
|
},
|
||||||
|
"attribute": {
|
||||||
|
"en": "God is High and Exalted above all things."
|
||||||
|
},
|
||||||
|
"godName": "Jehovah",
|
||||||
|
"angelicOrderId": "seraphim",
|
||||||
|
"presidesOver": [
|
||||||
|
[
|
||||||
|
3,
|
||||||
|
20
|
||||||
|
],
|
||||||
|
[
|
||||||
|
4,
|
||||||
|
30
|
||||||
|
],
|
||||||
|
[
|
||||||
|
8,
|
||||||
|
11
|
||||||
|
],
|
||||||
|
[
|
||||||
|
10,
|
||||||
|
22
|
||||||
|
],
|
||||||
|
[
|
||||||
|
1,
|
||||||
|
2
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"text": {
|
||||||
|
"en": "I'r, genius, Vehuiah והויה. Its attribute is interpreted (God high and “exalted above all things). He does-mine on the Hebrews. The name of God, according to this language, is named Jehovah. He governs the first ray of the East in the spring season, that is to say the five first degrees of, the sphere which begin on March 20 at midnight until the 24th, inclusive, corresponding to the first decade of the sacred calendar, and at the first genius, named Chontaré, under the influence of Mars: this genius, and those which follow, up to the 8th, belong to the first order of angels that the Orthodox call the choir of seraphim. He lives in the region of fire; his sign is the ram, and he presides over the following five days: March 20, April 31, August II, October 22 and January 2; the invocation is made towards the Orient, from precisely midnight until 20 minutes past midnight, to get lights. It is by virtue of these names divine that one becomes illuminated with the spirit of God; we must pronounce them at midnight precisely until midnight 20 mid-nut:s, reciting 16 third verse of the 3rd psalm. (And you Domine susceplor meus et gloria mea 61 exallans caput meum). You must have your talisman prepared according to the principles principles of cabalistic art. (See chapter 8 on this subject.) The person who is born under the influence of this genius has the took subtle; she is gifted with great sagacity, passion- born for the sciences and the arts, capable of undertaking and to perform the most difficult things; she will love the state military, because of the influence of Mars; she will have burst of energy being damaged by fire. The evil genius influences turbulent men; he quickness and anger dominate.\n(1) See the book entitled Tbrezcze, or the only Way of Divine and human sciences, edition of year 7, page 226."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": {
|
||||||
|
"he": "יליאל",
|
||||||
|
"en": "Jeliel"
|
||||||
|
},
|
||||||
|
"attribute": {
|
||||||
|
"en": "Helpful God"
|
||||||
|
},
|
||||||
|
"godName": "Aydy",
|
||||||
|
"presidesOver": [
|
||||||
|
[
|
||||||
|
3,
|
||||||
|
21
|
||||||
|
],
|
||||||
|
[
|
||||||
|
6,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
[
|
||||||
|
8,
|
||||||
|
12
|
||||||
|
],
|
||||||
|
[
|
||||||
|
10,
|
||||||
|
23
|
||||||
|
],
|
||||||
|
[
|
||||||
|
1,
|
||||||
|
3
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"text": {
|
||||||
|
"en": "2° Jeliel יליאל. His attribute (helpful God). 11 do- sure mine Turkey (these people give God the name Aydy). Its radius starts from 16 6* degree up to . 10%, inclusive, corresponding to the influence of genius . named Asican (see the sacred calendar), and at the first first decade. He presides over the following 165 days: March 21, June 1, August 12, October 23, January 3*. \nThis genius is invoked to appease popular seditions. laries, and to obtain victory against those who attack you attack unfairly. The request must be pronounced with the name of the genius, and recite 16 20° verse of Psalm 21. (Tu autem Domine ne eldngaveris auxillum tuum a me ad defenseem meam conspice). The favorable hour includes starts from midnight 20 minutes until midnight 40. \nThis genius dominates over kings and princes; he maintains their subjects in obedience; it influences the generation of all 165 beings that exist in 16 animal kingdoms; he restores peace among spouses and marital fidelity. Those who are born under this influence have a cheerful spirit, ma- pleasant and gallant manners; they will be passionate about it sex.\nThe contrary genius dominates everything that is harmful to animated beings; he likes to separate spouses by pushing them aside . 06 their duties; he inspires a taste for celibacy and the bad ‘good morals."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": {
|
||||||
|
"en": "Sitael",
|
||||||
|
"he": "סיטאל"
|
||||||
|
},
|
||||||
|
"attribute": {
|
||||||
|
"en": "God, the hope of all creatures."
|
||||||
|
},
|
||||||
|
"presidesOver": [
|
||||||
|
[
|
||||||
|
3,
|
||||||
|
22
|
||||||
|
],
|
||||||
|
[
|
||||||
|
6,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
[
|
||||||
|
8,
|
||||||
|
13
|
||||||
|
],
|
||||||
|
[
|
||||||
|
10,
|
||||||
|
24
|
||||||
|
],
|
||||||
|
[
|
||||||
|
1,
|
||||||
|
4
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"text": {
|
||||||
|
"en": "Sitael סיטאל. His attribute (God, the hope all creatures.) Its radius starts from 16 5 degree of .1 500616 up to 15°., inclusively corres- laying in the second decade and the genius named Chon- stained, under the influence of the sun; he presides over the following days: March 22, June 2, August 13, October 24, January 4. We invoke this genius against 165 adversities; we pronounce the request with the divine names and the 2nd verse of the psalm 90. (Dicet Domino: suceblor meus es tu et refugium meum: Deus meus, sperabo in eum.) The favorable hour starts from midnight 40 minutes until one o'clock. He dominates over nobility, magnanimity and great em- plows; it protects against weapons and ferocious beasts. There no one born under this influence loves the truth; she will keep her word, and she will be happy to oblige those who will need its services. The contrary genius dominates hypocrisy, ingratitude and perjury."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
88
data/kabbalah/souls.json
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
{
|
||||||
|
"yechidah": {
|
||||||
|
"id": "yechidah",
|
||||||
|
"name": {
|
||||||
|
"en": "unity",
|
||||||
|
"he": "יחידה",
|
||||||
|
"roman": "yechida"
|
||||||
|
},
|
||||||
|
"title": {
|
||||||
|
"en": "Unity"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"chaya": {
|
||||||
|
"id": "chaya",
|
||||||
|
"aliases": [
|
||||||
|
"chiah"
|
||||||
|
],
|
||||||
|
"name": {
|
||||||
|
"en": "life force",
|
||||||
|
"he": "חיה",
|
||||||
|
"roman": "chiah",
|
||||||
|
"altRoman": "chaya"
|
||||||
|
},
|
||||||
|
"title": {
|
||||||
|
"en": "Life Force"
|
||||||
|
},
|
||||||
|
"desc": {
|
||||||
|
"en": "The Chiah is the Life Force itself. It is our true identity, ultimately a pure reflection of the Supreme Consciousness of deity."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"neshama": {
|
||||||
|
"id": "neshama",
|
||||||
|
"aliases": [
|
||||||
|
"neshamah"
|
||||||
|
],
|
||||||
|
"name": {
|
||||||
|
"en": "soul-intuition",
|
||||||
|
"he": "נשמה",
|
||||||
|
"roman": "neshamah",
|
||||||
|
"altRoman": "neshama"
|
||||||
|
},
|
||||||
|
"title": {
|
||||||
|
"en": "Soul-Intuition"
|
||||||
|
},
|
||||||
|
"desc": {
|
||||||
|
"en": "The Neshamah is the part of our soul that transcends our thinking processes."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ruach": {
|
||||||
|
"id": "ruach",
|
||||||
|
"name": {
|
||||||
|
"en": "intellect",
|
||||||
|
"he": "רוח",
|
||||||
|
"roman": "ruach"
|
||||||
|
},
|
||||||
|
"title": {
|
||||||
|
"en": "Intellect"
|
||||||
|
},
|
||||||
|
"desc": {
|
||||||
|
"en": "The Ruach is the part of our soul that monopolizes attention to such a degree that we identify with the thinking process."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nephesh": {
|
||||||
|
"id": "nephesh",
|
||||||
|
"name": {
|
||||||
|
"en": "animal soul",
|
||||||
|
"he": "נפש",
|
||||||
|
"roman": "nephesh"
|
||||||
|
},
|
||||||
|
"title": {
|
||||||
|
"en": "Animal Soul"
|
||||||
|
},
|
||||||
|
"desc": {
|
||||||
|
"en": "The Nephesh is primitive consciousness shared with animal, plant, and mineral kingdoms, expressed through instincts, appetite, emotion, sex drive, and survival mechanisms."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"guph": {
|
||||||
|
"id": "guph",
|
||||||
|
"name": {
|
||||||
|
"en": "body",
|
||||||
|
"he": "גוף",
|
||||||
|
"roman": "guph"
|
||||||
|
},
|
||||||
|
"title": {
|
||||||
|
"en": "Body"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
100
data/kabbalah/tribesOfIsrael.json
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
{
|
||||||
|
"reuben": {
|
||||||
|
"id": "reuben",
|
||||||
|
"name": {
|
||||||
|
"en": "Reuben",
|
||||||
|
"he": "ראובן"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"simeon": {
|
||||||
|
"id": "simeon",
|
||||||
|
"name": {
|
||||||
|
"en": "Simeon",
|
||||||
|
"he": "שמעון"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"levi": {
|
||||||
|
"id": "levi",
|
||||||
|
"name": {
|
||||||
|
"en": "Levi",
|
||||||
|
"he": "לוי"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"judah": {
|
||||||
|
"id": "judah",
|
||||||
|
"name": {
|
||||||
|
"en": "Judah",
|
||||||
|
"he": "יהודה"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"dan": {
|
||||||
|
"id": "dan",
|
||||||
|
"name": {
|
||||||
|
"en": "Dan",
|
||||||
|
"he": "דן"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"naphtali": {
|
||||||
|
"id": "naphtali",
|
||||||
|
"name": {
|
||||||
|
"en": "Naphtali",
|
||||||
|
"he": "נפתלי"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"gad": {
|
||||||
|
"id": "gad",
|
||||||
|
"name": {
|
||||||
|
"en": "Gad",
|
||||||
|
"he": "גד"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"asher": {
|
||||||
|
"id": "asher",
|
||||||
|
"name": {
|
||||||
|
"en": "Asher",
|
||||||
|
"he": "אשר"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"issachar": {
|
||||||
|
"id": "issachar",
|
||||||
|
"name": {
|
||||||
|
"en": "Issachar",
|
||||||
|
"he": "יששכר"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"zebulun": {
|
||||||
|
"id": "zebulun",
|
||||||
|
"name": {
|
||||||
|
"en": "Zebulun",
|
||||||
|
"he": "זבולון"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"joseph": {
|
||||||
|
"id": "joseph",
|
||||||
|
"name": {
|
||||||
|
"en": "Joseph",
|
||||||
|
"he": "יוסף"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"benjamin": {
|
||||||
|
"id": "benjamin",
|
||||||
|
"name": {
|
||||||
|
"en": "Benjamin",
|
||||||
|
"he": "בנימין"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ephraim": {
|
||||||
|
"id": "ephraim",
|
||||||
|
"name": {
|
||||||
|
"en": "Ephraim",
|
||||||
|
"he": "אפרים"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"manasseh": {
|
||||||
|
"id": "manasseh",
|
||||||
|
"name": {
|
||||||
|
"en": "Menasseh",
|
||||||
|
"he": "בנימין"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
120
data/numbers.json
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
{
|
||||||
|
"meta": {
|
||||||
|
"description": "Digital root number correspondences for values 0 through 9, including arithmetic opposites that sum to 9.",
|
||||||
|
"notes": "Use this dataset to attach future number meanings, keywords, tarot links, and kabbalah links without changing UI code.",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
"entries": [
|
||||||
|
{
|
||||||
|
"value": 0,
|
||||||
|
"label": "Zero",
|
||||||
|
"opposite": 9,
|
||||||
|
"digitalRoot": 0,
|
||||||
|
"summary": "Potential, void, and the unmanifest source before form.",
|
||||||
|
"keywords": [],
|
||||||
|
"associations": {
|
||||||
|
"kabbalahNode": 10,
|
||||||
|
"tarotTrumpNumbers": [0]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": 1,
|
||||||
|
"label": "One",
|
||||||
|
"opposite": 8,
|
||||||
|
"digitalRoot": 1,
|
||||||
|
"summary": "Initiation, identity, and singular will.",
|
||||||
|
"keywords": [],
|
||||||
|
"associations": {
|
||||||
|
"kabbalahNode": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": 2,
|
||||||
|
"label": "Two",
|
||||||
|
"opposite": 7,
|
||||||
|
"digitalRoot": 2,
|
||||||
|
"summary": "Polarity, reflection, and relationship.",
|
||||||
|
"keywords": [],
|
||||||
|
"associations": {
|
||||||
|
"kabbalahNode": 2
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": 3,
|
||||||
|
"label": "Three",
|
||||||
|
"opposite": 6,
|
||||||
|
"digitalRoot": 3,
|
||||||
|
"summary": "Formation, synthesis, and creative expression.",
|
||||||
|
"keywords": [],
|
||||||
|
"associations": {
|
||||||
|
"kabbalahNode": 3
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": 4,
|
||||||
|
"label": "Four",
|
||||||
|
"opposite": 5,
|
||||||
|
"digitalRoot": 4,
|
||||||
|
"summary": "Order, structure, and stable foundation.",
|
||||||
|
"keywords": [],
|
||||||
|
"associations": {
|
||||||
|
"kabbalahNode": 4
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": 5,
|
||||||
|
"label": "Five",
|
||||||
|
"opposite": 4,
|
||||||
|
"digitalRoot": 5,
|
||||||
|
"summary": "Motion, adaptation, and dynamic change.",
|
||||||
|
"keywords": [],
|
||||||
|
"associations": {
|
||||||
|
"kabbalahNode": 5
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": 6,
|
||||||
|
"label": "Six",
|
||||||
|
"opposite": 3,
|
||||||
|
"digitalRoot": 6,
|
||||||
|
"summary": "Balance, harmony, and reciprocal flow.",
|
||||||
|
"keywords": [],
|
||||||
|
"associations": {
|
||||||
|
"kabbalahNode": 6
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": 7,
|
||||||
|
"label": "Seven",
|
||||||
|
"opposite": 2,
|
||||||
|
"digitalRoot": 7,
|
||||||
|
"summary": "Insight, analysis, and inner seeking.",
|
||||||
|
"keywords": [],
|
||||||
|
"associations": {
|
||||||
|
"kabbalahNode": 7
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": 8,
|
||||||
|
"label": "Eight",
|
||||||
|
"opposite": 1,
|
||||||
|
"digitalRoot": 8,
|
||||||
|
"summary": "Power, momentum, and cyclical force.",
|
||||||
|
"keywords": [],
|
||||||
|
"associations": {
|
||||||
|
"kabbalahNode": 8
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": 9,
|
||||||
|
"label": "Nine",
|
||||||
|
"opposite": 0,
|
||||||
|
"digitalRoot": 9,
|
||||||
|
"summary": "Completion, integration, and return.",
|
||||||
|
"keywords": [],
|
||||||
|
"associations": {
|
||||||
|
"kabbalahNode": 9
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
155
data/pentagram.svg
Normal file
@@ -0,0 +1,155 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||||
|
sodipodi:docname="pentagram.svg"
|
||||||
|
id="svg8"
|
||||||
|
version="1.1"
|
||||||
|
viewBox="0 0 210 297"
|
||||||
|
height="297mm"
|
||||||
|
width="210mm">
|
||||||
|
<defs
|
||||||
|
id="defs2">
|
||||||
|
<filter
|
||||||
|
id="filter1536"
|
||||||
|
style="color-interpolation-filters:sRGB;"
|
||||||
|
x="-0.5"
|
||||||
|
width="2"
|
||||||
|
y="-0.5"
|
||||||
|
height="2"
|
||||||
|
inkscape:menu-tooltip="Gel Ridge metallized at its top"
|
||||||
|
inkscape:menu="Ridges"
|
||||||
|
inkscape:label="Metallized Ridge">
|
||||||
|
<feGaussianBlur
|
||||||
|
id="feGaussianBlur1512"
|
||||||
|
result="result1"
|
||||||
|
stdDeviation="1" />
|
||||||
|
<feGaussianBlur
|
||||||
|
id="feGaussianBlur1514"
|
||||||
|
in="result1"
|
||||||
|
result="result6"
|
||||||
|
stdDeviation="8" />
|
||||||
|
<feComposite
|
||||||
|
id="feComposite1516"
|
||||||
|
result="result8"
|
||||||
|
in2="result1"
|
||||||
|
in="result6"
|
||||||
|
operator="atop" />
|
||||||
|
<feComposite
|
||||||
|
id="feComposite1518"
|
||||||
|
in2="result8"
|
||||||
|
in="result6"
|
||||||
|
result="fbSourceGraphic"
|
||||||
|
operator="xor" />
|
||||||
|
<feColorMatrix
|
||||||
|
id="feColorMatrix1520"
|
||||||
|
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 2 0 "
|
||||||
|
in="fbSourceGraphic"
|
||||||
|
result="fbSourceGraphicAlpha" />
|
||||||
|
<feGaussianBlur
|
||||||
|
id="feGaussianBlur1522"
|
||||||
|
stdDeviation="2.5"
|
||||||
|
in="fbSourceGraphicAlpha"
|
||||||
|
result="result0" />
|
||||||
|
<feSpecularLighting
|
||||||
|
id="feSpecularLighting1526"
|
||||||
|
in="result0"
|
||||||
|
result="result1"
|
||||||
|
lighting-color="rgb(255,255,255)"
|
||||||
|
surfaceScale="4"
|
||||||
|
specularConstant="1"
|
||||||
|
specularExponent="35">
|
||||||
|
<fePointLight
|
||||||
|
id="fePointLight1524"
|
||||||
|
x="-5000"
|
||||||
|
y="-10000"
|
||||||
|
z="20000" />
|
||||||
|
</feSpecularLighting>
|
||||||
|
<feComposite
|
||||||
|
id="feComposite1528"
|
||||||
|
in2="fbSourceGraphicAlpha"
|
||||||
|
in="result1"
|
||||||
|
result="result2"
|
||||||
|
operator="in" />
|
||||||
|
<feComposite
|
||||||
|
id="feComposite1530"
|
||||||
|
in2="result2"
|
||||||
|
in="fbSourceGraphic"
|
||||||
|
result="result4"
|
||||||
|
operator="arithmetic"
|
||||||
|
k2="1"
|
||||||
|
k3="1" />
|
||||||
|
<feComposite
|
||||||
|
id="feComposite1532"
|
||||||
|
result="result91"
|
||||||
|
in2="result4"
|
||||||
|
in="result9"
|
||||||
|
operator="atop" />
|
||||||
|
<feBlend
|
||||||
|
id="feBlend1534"
|
||||||
|
in2="result91"
|
||||||
|
mode="multiply" />
|
||||||
|
</filter>
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-height="1013"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:document-rotation="0"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
inkscape:document-units="mm"
|
||||||
|
inkscape:cy="496.57452"
|
||||||
|
inkscape:cx="442.01907"
|
||||||
|
inkscape:zoom="0.7"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
borderopacity="1.0"
|
||||||
|
bordercolor="#666666"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
id="base" />
|
||||||
|
<metadata
|
||||||
|
id="metadata5">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
id="layer1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
inkscape:label="Layer 1">
|
||||||
|
<g
|
||||||
|
inkscape:export-ydpi="86.660004"
|
||||||
|
inkscape:export-xdpi="86.660004"
|
||||||
|
inkscape:export-filename="/home/dragon/pentagram.png"
|
||||||
|
style="filter:url(#filter1536)"
|
||||||
|
id="g1456">
|
||||||
|
<circle
|
||||||
|
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:0.572165;fill-rule:nonzero;stroke:#000080;stroke-width:3.315;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal;enable-background:accumulate"
|
||||||
|
id="path833"
|
||||||
|
cx="105.227"
|
||||||
|
cy="96.346657"
|
||||||
|
r="51.29203" />
|
||||||
|
<path
|
||||||
|
id="path838"
|
||||||
|
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:0.572165;fill-rule:nonzero;stroke:#000080;stroke-width:3.31511;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal;enable-background:accumulate"
|
||||||
|
inkscape:transform-center-x="-0.065531874"
|
||||||
|
inkscape:transform-center-y="-4.6880333"
|
||||||
|
d="M 75.639665,136.13259 105.26351,46.265158 134.12007,136.3819 57.805333,80.437381 152.42861,80.84077 Z"
|
||||||
|
sodipodi:nodetypes="cccccc" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 5.0 KiB |
269
data/planet-science.json
Normal file
@@ -0,0 +1,269 @@
|
|||||||
|
{
|
||||||
|
"meta": {
|
||||||
|
"source": "NASA Planetary Fact Sheet (selected values, rounded)",
|
||||||
|
"notes": "Core physical/orbital values are approximate and intended for educational UI display."
|
||||||
|
},
|
||||||
|
"planets": [
|
||||||
|
{
|
||||||
|
"id": "mercury",
|
||||||
|
"name": "Mercury",
|
||||||
|
"symbol": "☿︎",
|
||||||
|
"classification": "Terrestrial planet",
|
||||||
|
"summary": "The smallest planet and closest to the Sun, with extreme day/night temperature swings.",
|
||||||
|
"meanDistanceFromSun": {
|
||||||
|
"kmMillions": 57.9,
|
||||||
|
"au": 0.387
|
||||||
|
},
|
||||||
|
"orbitalPeriod": {
|
||||||
|
"days": 87.969,
|
||||||
|
"years": 0.241
|
||||||
|
},
|
||||||
|
"rotationPeriodHours": 1407.6,
|
||||||
|
"radiusKm": 2439.7,
|
||||||
|
"diameterKm": 4879.4,
|
||||||
|
"massKg": 3.3011e23,
|
||||||
|
"gravityMs2": 3.7,
|
||||||
|
"escapeVelocityKms": 4.25,
|
||||||
|
"axialTiltDeg": 0.03,
|
||||||
|
"averageTempC": 167,
|
||||||
|
"moons": 0,
|
||||||
|
"atmosphere": "Extremely thin exosphere (oxygen, sodium, hydrogen, helium, potassium).",
|
||||||
|
"notableFacts": [
|
||||||
|
"A solar day lasts about 176 Earth days.",
|
||||||
|
"Its surface is heavily cratered like Earth’s Moon."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "venus",
|
||||||
|
"name": "Venus",
|
||||||
|
"symbol": "♀︎",
|
||||||
|
"classification": "Terrestrial planet",
|
||||||
|
"summary": "Earth-sized but shrouded in dense clouds, with a runaway greenhouse effect.",
|
||||||
|
"meanDistanceFromSun": {
|
||||||
|
"kmMillions": 108.2,
|
||||||
|
"au": 0.723
|
||||||
|
},
|
||||||
|
"orbitalPeriod": {
|
||||||
|
"days": 224.701,
|
||||||
|
"years": 0.615
|
||||||
|
},
|
||||||
|
"rotationPeriodHours": -5832.5,
|
||||||
|
"radiusKm": 6051.8,
|
||||||
|
"diameterKm": 12103.6,
|
||||||
|
"massKg": 4.8675e24,
|
||||||
|
"gravityMs2": 8.87,
|
||||||
|
"escapeVelocityKms": 10.36,
|
||||||
|
"axialTiltDeg": 177.36,
|
||||||
|
"averageTempC": 464,
|
||||||
|
"moons": 0,
|
||||||
|
"atmosphere": "Very dense carbon dioxide with sulfuric acid clouds.",
|
||||||
|
"notableFacts": [
|
||||||
|
"Hottest planetary surface in the Solar System.",
|
||||||
|
"Rotates retrograde (east-to-west)."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "earth",
|
||||||
|
"name": "Earth",
|
||||||
|
"symbol": "⊕",
|
||||||
|
"classification": "Terrestrial planet",
|
||||||
|
"summary": "The only known world with stable liquid water oceans and life.",
|
||||||
|
"meanDistanceFromSun": {
|
||||||
|
"kmMillions": 149.6,
|
||||||
|
"au": 1.0
|
||||||
|
},
|
||||||
|
"orbitalPeriod": {
|
||||||
|
"days": 365.256,
|
||||||
|
"years": 1.0
|
||||||
|
},
|
||||||
|
"rotationPeriodHours": 23.934,
|
||||||
|
"radiusKm": 6371,
|
||||||
|
"diameterKm": 12742,
|
||||||
|
"massKg": 5.97237e24,
|
||||||
|
"gravityMs2": 9.807,
|
||||||
|
"escapeVelocityKms": 11.186,
|
||||||
|
"axialTiltDeg": 23.44,
|
||||||
|
"averageTempC": 15,
|
||||||
|
"moons": 1,
|
||||||
|
"atmosphere": "Mostly nitrogen and oxygen.",
|
||||||
|
"notableFacts": [
|
||||||
|
"About 71% of the surface is covered by water.",
|
||||||
|
"Plate tectonics helps regulate long-term climate."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "mars",
|
||||||
|
"name": "Mars",
|
||||||
|
"symbol": "♂︎",
|
||||||
|
"classification": "Terrestrial planet",
|
||||||
|
"summary": "A cold desert planet with the largest volcano and canyon in the Solar System.",
|
||||||
|
"meanDistanceFromSun": {
|
||||||
|
"kmMillions": 227.9,
|
||||||
|
"au": 1.524
|
||||||
|
},
|
||||||
|
"orbitalPeriod": {
|
||||||
|
"days": 686.98,
|
||||||
|
"years": 1.881
|
||||||
|
},
|
||||||
|
"rotationPeriodHours": 24.623,
|
||||||
|
"radiusKm": 3389.5,
|
||||||
|
"diameterKm": 6779,
|
||||||
|
"massKg": 6.4171e23,
|
||||||
|
"gravityMs2": 3.721,
|
||||||
|
"escapeVelocityKms": 5.03,
|
||||||
|
"axialTiltDeg": 25.19,
|
||||||
|
"averageTempC": -63,
|
||||||
|
"moons": 2,
|
||||||
|
"atmosphere": "Thin carbon dioxide atmosphere.",
|
||||||
|
"notableFacts": [
|
||||||
|
"Home to Olympus Mons and Valles Marineris.",
|
||||||
|
"Evidence suggests ancient liquid water on its surface."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "jupiter",
|
||||||
|
"name": "Jupiter",
|
||||||
|
"symbol": "♃︎",
|
||||||
|
"classification": "Gas giant",
|
||||||
|
"summary": "The largest planet, with powerful storms and a deep atmosphere of hydrogen and helium.",
|
||||||
|
"meanDistanceFromSun": {
|
||||||
|
"kmMillions": 778.6,
|
||||||
|
"au": 5.203
|
||||||
|
},
|
||||||
|
"orbitalPeriod": {
|
||||||
|
"days": 4332.59,
|
||||||
|
"years": 11.86
|
||||||
|
},
|
||||||
|
"rotationPeriodHours": 9.925,
|
||||||
|
"radiusKm": 69911,
|
||||||
|
"diameterKm": 139822,
|
||||||
|
"massKg": 1.8982e27,
|
||||||
|
"gravityMs2": 24.79,
|
||||||
|
"escapeVelocityKms": 59.5,
|
||||||
|
"axialTiltDeg": 3.13,
|
||||||
|
"averageTempC": -110,
|
||||||
|
"moons": 95,
|
||||||
|
"atmosphere": "Mostly hydrogen and helium.",
|
||||||
|
"notableFacts": [
|
||||||
|
"The Great Red Spot is a centuries-old storm.",
|
||||||
|
"Its magnetic field is the strongest of any planet."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "saturn",
|
||||||
|
"name": "Saturn",
|
||||||
|
"symbol": "♄︎",
|
||||||
|
"classification": "Gas giant",
|
||||||
|
"summary": "Known for its bright ring system made largely of ice particles.",
|
||||||
|
"meanDistanceFromSun": {
|
||||||
|
"kmMillions": 1433.5,
|
||||||
|
"au": 9.537
|
||||||
|
},
|
||||||
|
"orbitalPeriod": {
|
||||||
|
"days": 10759.22,
|
||||||
|
"years": 29.45
|
||||||
|
},
|
||||||
|
"rotationPeriodHours": 10.656,
|
||||||
|
"radiusKm": 58232,
|
||||||
|
"diameterKm": 116464,
|
||||||
|
"massKg": 5.6834e26,
|
||||||
|
"gravityMs2": 10.44,
|
||||||
|
"escapeVelocityKms": 35.5,
|
||||||
|
"axialTiltDeg": 26.73,
|
||||||
|
"averageTempC": -140,
|
||||||
|
"moons": 146,
|
||||||
|
"atmosphere": "Mostly hydrogen and helium.",
|
||||||
|
"notableFacts": [
|
||||||
|
"Its average density is lower than water.",
|
||||||
|
"Rings are broad but extremely thin."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "uranus",
|
||||||
|
"name": "Uranus",
|
||||||
|
"symbol": "♅︎",
|
||||||
|
"classification": "Ice giant",
|
||||||
|
"summary": "An ice giant that rotates on its side relative to its orbital plane.",
|
||||||
|
"meanDistanceFromSun": {
|
||||||
|
"kmMillions": 2872.5,
|
||||||
|
"au": 19.191
|
||||||
|
},
|
||||||
|
"orbitalPeriod": {
|
||||||
|
"days": 30688.5,
|
||||||
|
"years": 84.02
|
||||||
|
},
|
||||||
|
"rotationPeriodHours": -17.24,
|
||||||
|
"radiusKm": 25362,
|
||||||
|
"diameterKm": 50724,
|
||||||
|
"massKg": 8.681e25,
|
||||||
|
"gravityMs2": 8.69,
|
||||||
|
"escapeVelocityKms": 21.3,
|
||||||
|
"axialTiltDeg": 97.77,
|
||||||
|
"averageTempC": -195,
|
||||||
|
"moons": 28,
|
||||||
|
"atmosphere": "Hydrogen, helium, methane.",
|
||||||
|
"notableFacts": [
|
||||||
|
"Its sideways tilt likely comes from an ancient giant impact.",
|
||||||
|
"Methane in the atmosphere gives it a blue-green color."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "neptune",
|
||||||
|
"name": "Neptune",
|
||||||
|
"symbol": "♆︎",
|
||||||
|
"classification": "Ice giant",
|
||||||
|
"summary": "A distant, dynamic world with supersonic winds and dark storm systems.",
|
||||||
|
"meanDistanceFromSun": {
|
||||||
|
"kmMillions": 4495.1,
|
||||||
|
"au": 30.07
|
||||||
|
},
|
||||||
|
"orbitalPeriod": {
|
||||||
|
"days": 60182,
|
||||||
|
"years": 164.8
|
||||||
|
},
|
||||||
|
"rotationPeriodHours": 16.11,
|
||||||
|
"radiusKm": 24622,
|
||||||
|
"diameterKm": 49244,
|
||||||
|
"massKg": 1.02413e26,
|
||||||
|
"gravityMs2": 11.15,
|
||||||
|
"escapeVelocityKms": 23.5,
|
||||||
|
"axialTiltDeg": 28.32,
|
||||||
|
"averageTempC": -200,
|
||||||
|
"moons": 16,
|
||||||
|
"atmosphere": "Hydrogen, helium, methane.",
|
||||||
|
"notableFacts": [
|
||||||
|
"Fastest sustained winds measured on any planet.",
|
||||||
|
"Triton, its largest moon, orbits in retrograde."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pluto",
|
||||||
|
"name": "Pluto",
|
||||||
|
"symbol": "♇︎",
|
||||||
|
"classification": "Dwarf planet",
|
||||||
|
"summary": "A Kuiper Belt dwarf planet with nitrogen ice plains and a complex seasonal cycle.",
|
||||||
|
"meanDistanceFromSun": {
|
||||||
|
"kmMillions": 5906.4,
|
||||||
|
"au": 39.48
|
||||||
|
},
|
||||||
|
"orbitalPeriod": {
|
||||||
|
"days": 90560,
|
||||||
|
"years": 248.0
|
||||||
|
},
|
||||||
|
"rotationPeriodHours": -153.3,
|
||||||
|
"radiusKm": 1188.3,
|
||||||
|
"diameterKm": 2376.6,
|
||||||
|
"massKg": 1.303e22,
|
||||||
|
"gravityMs2": 0.62,
|
||||||
|
"escapeVelocityKms": 1.21,
|
||||||
|
"axialTiltDeg": 122.53,
|
||||||
|
"averageTempC": -225,
|
||||||
|
"moons": 5,
|
||||||
|
"atmosphere": "Thin, variable nitrogen atmosphere with methane and carbon monoxide.",
|
||||||
|
"notableFacts": [
|
||||||
|
"Charon is large enough that Pluto-Charon is often described as a binary system.",
|
||||||
|
"First close-up images were captured by New Horizons in 2015."
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
86
data/planetary-correspondences.json
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
{
|
||||||
|
"meta": {
|
||||||
|
"source": "https://github.com/gadicc/magick.ly/tree/master/data",
|
||||||
|
"derivedFrom": "data/astrology/planets.json5",
|
||||||
|
"notes": "Planet names/symbols/magick types are adapted from magick.ly; tarot correspondences are Golden Dawn style defaults."
|
||||||
|
},
|
||||||
|
"planets": {
|
||||||
|
"saturn": {
|
||||||
|
"id": "saturn",
|
||||||
|
"name": "Saturn",
|
||||||
|
"symbol": "♄︎",
|
||||||
|
"weekday": "Saturday",
|
||||||
|
"tarot": {
|
||||||
|
"majorArcana": "The World",
|
||||||
|
"number": 21
|
||||||
|
},
|
||||||
|
"magickTypes": "Performing duty, establishing balance and equilibrium, dispelling illusions, protecting the home, legal matters, developing patience and self-discipline"
|
||||||
|
},
|
||||||
|
"jupiter": {
|
||||||
|
"id": "jupiter",
|
||||||
|
"name": "Jupiter",
|
||||||
|
"symbol": "♃︎",
|
||||||
|
"weekday": "Thursday",
|
||||||
|
"tarot": {
|
||||||
|
"majorArcana": "Wheel of Fortune",
|
||||||
|
"number": 10
|
||||||
|
},
|
||||||
|
"magickTypes": "Career success, developing ambition and enthusiasm, improving fortune and luck, general health, acquiring honour, improving sense of humour, legal matters and dealing with the establishment, developing leadership skills"
|
||||||
|
},
|
||||||
|
"mars": {
|
||||||
|
"id": "mars",
|
||||||
|
"name": "Mars",
|
||||||
|
"symbol": "♂︎",
|
||||||
|
"weekday": "Tuesday",
|
||||||
|
"tarot": {
|
||||||
|
"majorArcana": "The Tower",
|
||||||
|
"number": 16
|
||||||
|
},
|
||||||
|
"magickTypes": "Controlling anger, increasing courage, enhancing energy and passion, increasing vigour and sex drive"
|
||||||
|
},
|
||||||
|
"sol": {
|
||||||
|
"id": "sol",
|
||||||
|
"name": "Sol",
|
||||||
|
"symbol": "☉︎",
|
||||||
|
"weekday": "Sunday",
|
||||||
|
"tarot": {
|
||||||
|
"majorArcana": "The Sun",
|
||||||
|
"number": 19
|
||||||
|
},
|
||||||
|
"magickTypes": "Career success and progression, establishing harmony, healing and improving health, leadership skills, acquiring money and resources, promotion, strengthening willpower"
|
||||||
|
},
|
||||||
|
"venus": {
|
||||||
|
"id": "venus",
|
||||||
|
"name": "Venus",
|
||||||
|
"symbol": "♀︎",
|
||||||
|
"weekday": "Friday",
|
||||||
|
"tarot": {
|
||||||
|
"majorArcana": "The Empress",
|
||||||
|
"number": 3
|
||||||
|
},
|
||||||
|
"magickTypes": "Increasing attractiveness and self-confidence, beauty and passion, enhancing creativity, improving fertility, developing friendships, obtaining love"
|
||||||
|
},
|
||||||
|
"mercury": {
|
||||||
|
"id": "mercury",
|
||||||
|
"name": "Mercury",
|
||||||
|
"symbol": "☿︎",
|
||||||
|
"weekday": "Wednesday",
|
||||||
|
"tarot": {
|
||||||
|
"majorArcana": "The Magician",
|
||||||
|
"number": 1
|
||||||
|
},
|
||||||
|
"magickTypes": "Business success, improving communication skills, developing knowledge and memory, diplomacy, exam success, divination, developing influence, protection when traveling by air and land, learning music"
|
||||||
|
},
|
||||||
|
"luna": {
|
||||||
|
"id": "luna",
|
||||||
|
"name": "Luna",
|
||||||
|
"symbol": "☾︎",
|
||||||
|
"weekday": "Monday",
|
||||||
|
"tarot": {
|
||||||
|
"majorArcana": "The High Priestess",
|
||||||
|
"number": 2
|
||||||
|
},
|
||||||
|
"magickTypes": "Developing clairvoyance and other psychic skills, ensuring safe childbirth, divination, glamour and illusions, lucid dreaming, protection when traveling by sea"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
65
data/playing-cards-52.json
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
{
|
||||||
|
"meta": {
|
||||||
|
"description": "Standard 52-card playing deck mapped to tarot suits and minor tarot card names.",
|
||||||
|
"notes": "Suit mapping: Hearts→Cups, Diamonds→Pentacles, Clubs→Wands, Spades→Swords. Ace→Ace, King→Knight, Queen→Queen, Jack→Prince, 10→Princess.",
|
||||||
|
"version": 1,
|
||||||
|
"count": 52
|
||||||
|
},
|
||||||
|
"entries": [
|
||||||
|
{ "id": "AH", "suit": "hearts", "suitLabel": "Hearts", "suitSymbol": "♥", "rank": "A", "rankLabel": "Ace", "rankValue": 1, "digitalRoot": 1, "tarotSuit": "Cups", "tarotCard": "Ace of Cups" },
|
||||||
|
{ "id": "2H", "suit": "hearts", "suitLabel": "Hearts", "suitSymbol": "♥", "rank": "2", "rankLabel": "Two", "rankValue": 2, "digitalRoot": 2, "tarotSuit": "Cups", "tarotCard": "Two of Cups" },
|
||||||
|
{ "id": "3H", "suit": "hearts", "suitLabel": "Hearts", "suitSymbol": "♥", "rank": "3", "rankLabel": "Three", "rankValue": 3, "digitalRoot": 3, "tarotSuit": "Cups", "tarotCard": "Three of Cups" },
|
||||||
|
{ "id": "4H", "suit": "hearts", "suitLabel": "Hearts", "suitSymbol": "♥", "rank": "4", "rankLabel": "Four", "rankValue": 4, "digitalRoot": 4, "tarotSuit": "Cups", "tarotCard": "Four of Cups" },
|
||||||
|
{ "id": "5H", "suit": "hearts", "suitLabel": "Hearts", "suitSymbol": "♥", "rank": "5", "rankLabel": "Five", "rankValue": 5, "digitalRoot": 5, "tarotSuit": "Cups", "tarotCard": "Five of Cups" },
|
||||||
|
{ "id": "6H", "suit": "hearts", "suitLabel": "Hearts", "suitSymbol": "♥", "rank": "6", "rankLabel": "Six", "rankValue": 6, "digitalRoot": 6, "tarotSuit": "Cups", "tarotCard": "Six of Cups" },
|
||||||
|
{ "id": "7H", "suit": "hearts", "suitLabel": "Hearts", "suitSymbol": "♥", "rank": "7", "rankLabel": "Seven", "rankValue": 7, "digitalRoot": 7, "tarotSuit": "Cups", "tarotCard": "Seven of Cups" },
|
||||||
|
{ "id": "8H", "suit": "hearts", "suitLabel": "Hearts", "suitSymbol": "♥", "rank": "8", "rankLabel": "Eight", "rankValue": 8, "digitalRoot": 8, "tarotSuit": "Cups", "tarotCard": "Eight of Cups" },
|
||||||
|
{ "id": "9H", "suit": "hearts", "suitLabel": "Hearts", "suitSymbol": "♥", "rank": "9", "rankLabel": "Nine", "rankValue": 9, "digitalRoot": 9, "tarotSuit": "Cups", "tarotCard": "Nine of Cups" },
|
||||||
|
{ "id": "10H", "suit": "hearts", "suitLabel": "Hearts", "suitSymbol": "♥", "rank": "10", "rankLabel": "Ten", "rankValue": 10, "digitalRoot": 1, "tarotSuit": "Cups", "tarotCard": "Princess of Cups" },
|
||||||
|
{ "id": "JH", "suit": "hearts", "suitLabel": "Hearts", "suitSymbol": "♥", "rank": "J", "rankLabel": "Jack", "rankValue": null, "digitalRoot": null, "tarotSuit": "Cups", "tarotCard": "Prince of Cups" },
|
||||||
|
{ "id": "QH", "suit": "hearts", "suitLabel": "Hearts", "suitSymbol": "♥", "rank": "Q", "rankLabel": "Queen", "rankValue": null, "digitalRoot": null, "tarotSuit": "Cups", "tarotCard": "Queen of Cups" },
|
||||||
|
{ "id": "KH", "suit": "hearts", "suitLabel": "Hearts", "suitSymbol": "♥", "rank": "K", "rankLabel": "King", "rankValue": null, "digitalRoot": null, "tarotSuit": "Cups", "tarotCard": "Knight of Cups" },
|
||||||
|
|
||||||
|
{ "id": "AD", "suit": "diamonds", "suitLabel": "Diamonds", "suitSymbol": "♦", "rank": "A", "rankLabel": "Ace", "rankValue": 1, "digitalRoot": 1, "tarotSuit": "Pentacles", "tarotCard": "Ace of Pentacles" },
|
||||||
|
{ "id": "2D", "suit": "diamonds", "suitLabel": "Diamonds", "suitSymbol": "♦", "rank": "2", "rankLabel": "Two", "rankValue": 2, "digitalRoot": 2, "tarotSuit": "Pentacles", "tarotCard": "Two of Pentacles" },
|
||||||
|
{ "id": "3D", "suit": "diamonds", "suitLabel": "Diamonds", "suitSymbol": "♦", "rank": "3", "rankLabel": "Three", "rankValue": 3, "digitalRoot": 3, "tarotSuit": "Pentacles", "tarotCard": "Three of Pentacles" },
|
||||||
|
{ "id": "4D", "suit": "diamonds", "suitLabel": "Diamonds", "suitSymbol": "♦", "rank": "4", "rankLabel": "Four", "rankValue": 4, "digitalRoot": 4, "tarotSuit": "Pentacles", "tarotCard": "Four of Pentacles" },
|
||||||
|
{ "id": "5D", "suit": "diamonds", "suitLabel": "Diamonds", "suitSymbol": "♦", "rank": "5", "rankLabel": "Five", "rankValue": 5, "digitalRoot": 5, "tarotSuit": "Pentacles", "tarotCard": "Five of Pentacles" },
|
||||||
|
{ "id": "6D", "suit": "diamonds", "suitLabel": "Diamonds", "suitSymbol": "♦", "rank": "6", "rankLabel": "Six", "rankValue": 6, "digitalRoot": 6, "tarotSuit": "Pentacles", "tarotCard": "Six of Pentacles" },
|
||||||
|
{ "id": "7D", "suit": "diamonds", "suitLabel": "Diamonds", "suitSymbol": "♦", "rank": "7", "rankLabel": "Seven", "rankValue": 7, "digitalRoot": 7, "tarotSuit": "Pentacles", "tarotCard": "Seven of Pentacles" },
|
||||||
|
{ "id": "8D", "suit": "diamonds", "suitLabel": "Diamonds", "suitSymbol": "♦", "rank": "8", "rankLabel": "Eight", "rankValue": 8, "digitalRoot": 8, "tarotSuit": "Pentacles", "tarotCard": "Eight of Pentacles" },
|
||||||
|
{ "id": "9D", "suit": "diamonds", "suitLabel": "Diamonds", "suitSymbol": "♦", "rank": "9", "rankLabel": "Nine", "rankValue": 9, "digitalRoot": 9, "tarotSuit": "Pentacles", "tarotCard": "Nine of Pentacles" },
|
||||||
|
{ "id": "10D", "suit": "diamonds", "suitLabel": "Diamonds", "suitSymbol": "♦", "rank": "10", "rankLabel": "Ten", "rankValue": 10, "digitalRoot": 1, "tarotSuit": "Pentacles", "tarotCard": "Princess of Pentacles" },
|
||||||
|
{ "id": "JD", "suit": "diamonds", "suitLabel": "Diamonds", "suitSymbol": "♦", "rank": "J", "rankLabel": "Jack", "rankValue": null, "digitalRoot": null, "tarotSuit": "Pentacles", "tarotCard": "Prince of Pentacles" },
|
||||||
|
{ "id": "QD", "suit": "diamonds", "suitLabel": "Diamonds", "suitSymbol": "♦", "rank": "Q", "rankLabel": "Queen", "rankValue": null, "digitalRoot": null, "tarotSuit": "Pentacles", "tarotCard": "Queen of Pentacles" },
|
||||||
|
{ "id": "KD", "suit": "diamonds", "suitLabel": "Diamonds", "suitSymbol": "♦", "rank": "K", "rankLabel": "King", "rankValue": null, "digitalRoot": null, "tarotSuit": "Pentacles", "tarotCard": "Knight of Pentacles" },
|
||||||
|
|
||||||
|
{ "id": "AC", "suit": "clubs", "suitLabel": "Clubs", "suitSymbol": "♣", "rank": "A", "rankLabel": "Ace", "rankValue": 1, "digitalRoot": 1, "tarotSuit": "Wands", "tarotCard": "Ace of Wands" },
|
||||||
|
{ "id": "2C", "suit": "clubs", "suitLabel": "Clubs", "suitSymbol": "♣", "rank": "2", "rankLabel": "Two", "rankValue": 2, "digitalRoot": 2, "tarotSuit": "Wands", "tarotCard": "Two of Wands" },
|
||||||
|
{ "id": "3C", "suit": "clubs", "suitLabel": "Clubs", "suitSymbol": "♣", "rank": "3", "rankLabel": "Three", "rankValue": 3, "digitalRoot": 3, "tarotSuit": "Wands", "tarotCard": "Three of Wands" },
|
||||||
|
{ "id": "4C", "suit": "clubs", "suitLabel": "Clubs", "suitSymbol": "♣", "rank": "4", "rankLabel": "Four", "rankValue": 4, "digitalRoot": 4, "tarotSuit": "Wands", "tarotCard": "Four of Wands" },
|
||||||
|
{ "id": "5C", "suit": "clubs", "suitLabel": "Clubs", "suitSymbol": "♣", "rank": "5", "rankLabel": "Five", "rankValue": 5, "digitalRoot": 5, "tarotSuit": "Wands", "tarotCard": "Five of Wands" },
|
||||||
|
{ "id": "6C", "suit": "clubs", "suitLabel": "Clubs", "suitSymbol": "♣", "rank": "6", "rankLabel": "Six", "rankValue": 6, "digitalRoot": 6, "tarotSuit": "Wands", "tarotCard": "Six of Wands" },
|
||||||
|
{ "id": "7C", "suit": "clubs", "suitLabel": "Clubs", "suitSymbol": "♣", "rank": "7", "rankLabel": "Seven", "rankValue": 7, "digitalRoot": 7, "tarotSuit": "Wands", "tarotCard": "Seven of Wands" },
|
||||||
|
{ "id": "8C", "suit": "clubs", "suitLabel": "Clubs", "suitSymbol": "♣", "rank": "8", "rankLabel": "Eight", "rankValue": 8, "digitalRoot": 8, "tarotSuit": "Wands", "tarotCard": "Eight of Wands" },
|
||||||
|
{ "id": "9C", "suit": "clubs", "suitLabel": "Clubs", "suitSymbol": "♣", "rank": "9", "rankLabel": "Nine", "rankValue": 9, "digitalRoot": 9, "tarotSuit": "Wands", "tarotCard": "Nine of Wands" },
|
||||||
|
{ "id": "10C", "suit": "clubs", "suitLabel": "Clubs", "suitSymbol": "♣", "rank": "10", "rankLabel": "Ten", "rankValue": 10, "digitalRoot": 1, "tarotSuit": "Wands", "tarotCard": "Princess of Wands" },
|
||||||
|
{ "id": "JC", "suit": "clubs", "suitLabel": "Clubs", "suitSymbol": "♣", "rank": "J", "rankLabel": "Jack", "rankValue": null, "digitalRoot": null, "tarotSuit": "Wands", "tarotCard": "Prince of Wands" },
|
||||||
|
{ "id": "QC", "suit": "clubs", "suitLabel": "Clubs", "suitSymbol": "♣", "rank": "Q", "rankLabel": "Queen", "rankValue": null, "digitalRoot": null, "tarotSuit": "Wands", "tarotCard": "Queen of Wands" },
|
||||||
|
{ "id": "KC", "suit": "clubs", "suitLabel": "Clubs", "suitSymbol": "♣", "rank": "K", "rankLabel": "King", "rankValue": null, "digitalRoot": null, "tarotSuit": "Wands", "tarotCard": "Knight of Wands" },
|
||||||
|
|
||||||
|
{ "id": "AS", "suit": "spades", "suitLabel": "Spades", "suitSymbol": "♠", "rank": "A", "rankLabel": "Ace", "rankValue": 1, "digitalRoot": 1, "tarotSuit": "Swords", "tarotCard": "Ace of Swords" },
|
||||||
|
{ "id": "2S", "suit": "spades", "suitLabel": "Spades", "suitSymbol": "♠", "rank": "2", "rankLabel": "Two", "rankValue": 2, "digitalRoot": 2, "tarotSuit": "Swords", "tarotCard": "Two of Swords" },
|
||||||
|
{ "id": "3S", "suit": "spades", "suitLabel": "Spades", "suitSymbol": "♠", "rank": "3", "rankLabel": "Three", "rankValue": 3, "digitalRoot": 3, "tarotSuit": "Swords", "tarotCard": "Three of Swords" },
|
||||||
|
{ "id": "4S", "suit": "spades", "suitLabel": "Spades", "suitSymbol": "♠", "rank": "4", "rankLabel": "Four", "rankValue": 4, "digitalRoot": 4, "tarotSuit": "Swords", "tarotCard": "Four of Swords" },
|
||||||
|
{ "id": "5S", "suit": "spades", "suitLabel": "Spades", "suitSymbol": "♠", "rank": "5", "rankLabel": "Five", "rankValue": 5, "digitalRoot": 5, "tarotSuit": "Swords", "tarotCard": "Five of Swords" },
|
||||||
|
{ "id": "6S", "suit": "spades", "suitLabel": "Spades", "suitSymbol": "♠", "rank": "6", "rankLabel": "Six", "rankValue": 6, "digitalRoot": 6, "tarotSuit": "Swords", "tarotCard": "Six of Swords" },
|
||||||
|
{ "id": "7S", "suit": "spades", "suitLabel": "Spades", "suitSymbol": "♠", "rank": "7", "rankLabel": "Seven", "rankValue": 7, "digitalRoot": 7, "tarotSuit": "Swords", "tarotCard": "Seven of Swords" },
|
||||||
|
{ "id": "8S", "suit": "spades", "suitLabel": "Spades", "suitSymbol": "♠", "rank": "8", "rankLabel": "Eight", "rankValue": 8, "digitalRoot": 8, "tarotSuit": "Swords", "tarotCard": "Eight of Swords" },
|
||||||
|
{ "id": "9S", "suit": "spades", "suitLabel": "Spades", "suitSymbol": "♠", "rank": "9", "rankLabel": "Nine", "rankValue": 9, "digitalRoot": 9, "tarotSuit": "Swords", "tarotCard": "Nine of Swords" },
|
||||||
|
{ "id": "10S", "suit": "spades", "suitLabel": "Spades", "suitSymbol": "♠", "rank": "10", "rankLabel": "Ten", "rankValue": 10, "digitalRoot": 1, "tarotSuit": "Swords", "tarotCard": "Princess of Swords" },
|
||||||
|
{ "id": "JS", "suit": "spades", "suitLabel": "Spades", "suitSymbol": "♠", "rank": "J", "rankLabel": "Jack", "rankValue": null, "digitalRoot": null, "tarotSuit": "Swords", "tarotCard": "Prince of Swords" },
|
||||||
|
{ "id": "QS", "suit": "spades", "suitLabel": "Spades", "suitSymbol": "♠", "rank": "Q", "rankLabel": "Queen", "rankValue": null, "digitalRoot": null, "tarotSuit": "Swords", "tarotCard": "Queen of Swords" },
|
||||||
|
{ "id": "KS", "suit": "spades", "suitLabel": "Spades", "suitSymbol": "♠", "rank": "K", "rankLabel": "King", "rankValue": null, "digitalRoot": null, "tarotSuit": "Swords", "tarotCard": "Knight of Swords" }
|
||||||
|
]
|
||||||
|
}
|
||||||
2166
data/sabian-symbols.json
Normal file
164
data/signs.json
Normal file
@@ -0,0 +1,164 @@
|
|||||||
|
{
|
||||||
|
"meta": {
|
||||||
|
"source": "https://github.com/gadicc/magick.ly/blob/master/data/astrology/zodiac.json5",
|
||||||
|
"notes": "Sign timing/ordering/elements/modality are adapted from magick.ly; tarot major arcana correspondences are organized here to avoid UI hardcoding."
|
||||||
|
},
|
||||||
|
"signs": [
|
||||||
|
{
|
||||||
|
"id": "aries",
|
||||||
|
"order": 1,
|
||||||
|
"name": "Aries",
|
||||||
|
"symbol": "♈︎",
|
||||||
|
"start": "03-21",
|
||||||
|
"end": "04-19",
|
||||||
|
"element": "fire",
|
||||||
|
"modality": "cardinal",
|
||||||
|
"sourceQuadruplicity": "cardinal",
|
||||||
|
"rulingPlanetId": "mars",
|
||||||
|
"tarot": { "majorArcana": "The Emperor", "number": 4 }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "taurus",
|
||||||
|
"order": 2,
|
||||||
|
"name": "Taurus",
|
||||||
|
"symbol": "♉︎",
|
||||||
|
"start": "04-20",
|
||||||
|
"end": "05-20",
|
||||||
|
"element": "earth",
|
||||||
|
"modality": "fixed",
|
||||||
|
"sourceQuadruplicity": "kerubic",
|
||||||
|
"rulingPlanetId": "venus",
|
||||||
|
"tarot": { "majorArcana": "The Hierophant", "number": 5 }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "gemini",
|
||||||
|
"order": 3,
|
||||||
|
"name": "Gemini",
|
||||||
|
"symbol": "♊︎",
|
||||||
|
"start": "05-21",
|
||||||
|
"end": "06-20",
|
||||||
|
"element": "air",
|
||||||
|
"modality": "mutable",
|
||||||
|
"sourceQuadruplicity": "mutable",
|
||||||
|
"rulingPlanetId": "mercury",
|
||||||
|
"tarot": { "majorArcana": "The Lovers", "number": 6 }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "cancer",
|
||||||
|
"order": 4,
|
||||||
|
"name": "Cancer",
|
||||||
|
"symbol": "♋︎",
|
||||||
|
"start": "06-21",
|
||||||
|
"end": "07-22",
|
||||||
|
"element": "water",
|
||||||
|
"modality": "cardinal",
|
||||||
|
"sourceQuadruplicity": "cardinal",
|
||||||
|
"rulingPlanetId": "sol",
|
||||||
|
"tarot": { "majorArcana": "The Chariot", "number": 7 }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "leo",
|
||||||
|
"order": 5,
|
||||||
|
"name": "Leo",
|
||||||
|
"symbol": "♌︎",
|
||||||
|
"start": "07-23",
|
||||||
|
"end": "08-22",
|
||||||
|
"element": "fire",
|
||||||
|
"modality": "fixed",
|
||||||
|
"sourceQuadruplicity": "kerubic",
|
||||||
|
"rulingPlanetId": "sol",
|
||||||
|
"tarot": { "majorArcana": "Strength", "number": 8 }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "virgo",
|
||||||
|
"order": 6,
|
||||||
|
"name": "Virgo",
|
||||||
|
"symbol": "♍︎",
|
||||||
|
"start": "08-23",
|
||||||
|
"end": "09-22",
|
||||||
|
"element": "earth",
|
||||||
|
"modality": "mutable",
|
||||||
|
"sourceQuadruplicity": "mutable",
|
||||||
|
"rulingPlanetId": "mercury",
|
||||||
|
"tarot": { "majorArcana": "The Hermit", "number": 9 }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "libra",
|
||||||
|
"order": 7,
|
||||||
|
"name": "Libra",
|
||||||
|
"symbol": "♎︎",
|
||||||
|
"start": "09-23",
|
||||||
|
"end": "10-22",
|
||||||
|
"element": "air",
|
||||||
|
"modality": "cardinal",
|
||||||
|
"sourceQuadruplicity": "cardinal",
|
||||||
|
"rulingPlanetId": "venus",
|
||||||
|
"tarot": { "majorArcana": "Justice", "number": 11 }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "scorpio",
|
||||||
|
"order": 8,
|
||||||
|
"name": "Scorpio",
|
||||||
|
"symbol": "♏︎",
|
||||||
|
"start": "10-23",
|
||||||
|
"end": "11-21",
|
||||||
|
"element": "water",
|
||||||
|
"modality": "fixed",
|
||||||
|
"sourceQuadruplicity": "kerubic",
|
||||||
|
"rulingPlanetId": "jupiter",
|
||||||
|
"tarot": { "majorArcana": "Death", "number": 13 }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "sagittarius",
|
||||||
|
"order": 9,
|
||||||
|
"name": "Sagittarius",
|
||||||
|
"symbol": "♐︎",
|
||||||
|
"start": "11-22",
|
||||||
|
"end": "12-21",
|
||||||
|
"element": "fire",
|
||||||
|
"modality": "mutable",
|
||||||
|
"sourceQuadruplicity": "mutable",
|
||||||
|
"rulingPlanetId": "jupiter",
|
||||||
|
"tarot": { "majorArcana": "Temperance", "number": 14 }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "capricorn",
|
||||||
|
"order": 10,
|
||||||
|
"name": "Capricorn",
|
||||||
|
"symbol": "♑︎",
|
||||||
|
"start": "12-22",
|
||||||
|
"end": "01-19",
|
||||||
|
"element": "earth",
|
||||||
|
"modality": "cardinal",
|
||||||
|
"sourceQuadruplicity": "cardinal",
|
||||||
|
"rulingPlanetId": "saturn",
|
||||||
|
"tarot": { "majorArcana": "The Devil", "number": 15 }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "aquarius",
|
||||||
|
"order": 11,
|
||||||
|
"name": "Aquarius",
|
||||||
|
"symbol": "♒︎",
|
||||||
|
"start": "01-20",
|
||||||
|
"end": "02-18",
|
||||||
|
"element": "air",
|
||||||
|
"modality": "fixed",
|
||||||
|
"sourceQuadruplicity": "kerubic",
|
||||||
|
"rulingPlanetId": "saturn",
|
||||||
|
"tarot": { "majorArcana": "The Star", "number": 17 }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "pisces",
|
||||||
|
"order": 12,
|
||||||
|
"name": "Pisces",
|
||||||
|
"symbol": "♓︎",
|
||||||
|
"start": "02-19",
|
||||||
|
"end": "03-20",
|
||||||
|
"element": "water",
|
||||||
|
"modality": "mutable",
|
||||||
|
"sourceQuadruplicity": "mutable",
|
||||||
|
"rulingPlanetId": "jupiter",
|
||||||
|
"tarot": { "majorArcana": "The Moon", "number": 18 }
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
756
data/tarot-database.json
Normal file
@@ -0,0 +1,756 @@
|
|||||||
|
{
|
||||||
|
"majorCards": [
|
||||||
|
{
|
||||||
|
"number": 0,
|
||||||
|
"name": "The Fool",
|
||||||
|
"summary": "Open-hearted beginnings, leap of faith, and the sacred unknown.",
|
||||||
|
"upright": "Fresh starts, trust in the path, and inspired spontaneity.",
|
||||||
|
"reversed": "Recklessness, fear of risk, or resistance to a needed new beginning.",
|
||||||
|
"keywords": [
|
||||||
|
"beginnings",
|
||||||
|
"faith",
|
||||||
|
"innocence",
|
||||||
|
"freedom",
|
||||||
|
"journey"
|
||||||
|
],
|
||||||
|
"relations": [
|
||||||
|
"Element: Air",
|
||||||
|
"Hebrew Letter: Aleph"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"number": 1,
|
||||||
|
"name": "The Magus",
|
||||||
|
"summary": "Focused will and conscious manifestation through aligned tools.",
|
||||||
|
"upright": "Skill, initiative, concentration, and transforming intent into action.",
|
||||||
|
"reversed": "Scattered power, manipulation, or blocked self-belief.",
|
||||||
|
"keywords": [
|
||||||
|
"will",
|
||||||
|
"manifestation",
|
||||||
|
"focus",
|
||||||
|
"skill",
|
||||||
|
"agency"
|
||||||
|
],
|
||||||
|
"relations": [
|
||||||
|
"Planet: Mercury",
|
||||||
|
"Hebrew Letter: Beth"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"number": 2,
|
||||||
|
"name": "The High Priestess",
|
||||||
|
"summary": "Inner knowing, sacred silence, and intuitive perception.",
|
||||||
|
"upright": "Intuition, subtle insight, patience, and hidden wisdom.",
|
||||||
|
"reversed": "Disconnection from inner voice or confusion around truth.",
|
||||||
|
"keywords": [
|
||||||
|
"intuition",
|
||||||
|
"mystery",
|
||||||
|
"stillness",
|
||||||
|
"inner-voice",
|
||||||
|
"receptivity"
|
||||||
|
],
|
||||||
|
"relations": [
|
||||||
|
"Planet: Luna",
|
||||||
|
"Hebrew Letter: Gimel"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"number": 3,
|
||||||
|
"name": "The Empress",
|
||||||
|
"summary": "Creative abundance, nurture, and embodied growth.",
|
||||||
|
"upright": "Fertility, care, beauty, comfort, and creative flourishing.",
|
||||||
|
"reversed": "Creative drought, overgiving, or neglecting self-nourishment.",
|
||||||
|
"keywords": [
|
||||||
|
"abundance",
|
||||||
|
"creation",
|
||||||
|
"nurture",
|
||||||
|
"beauty",
|
||||||
|
"growth"
|
||||||
|
],
|
||||||
|
"relations": [
|
||||||
|
"Planet: Venus",
|
||||||
|
"Hebrew Letter: Daleth"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"number": 4,
|
||||||
|
"name": "The Emperor",
|
||||||
|
"summary": "Structure, authority, and stable leadership.",
|
||||||
|
"upright": "Order, discipline, protection, and strategic direction.",
|
||||||
|
"reversed": "Rigidity, domination, or weak boundaries.",
|
||||||
|
"keywords": [
|
||||||
|
"structure",
|
||||||
|
"authority",
|
||||||
|
"stability",
|
||||||
|
"leadership",
|
||||||
|
"boundaries"
|
||||||
|
],
|
||||||
|
"relations": [
|
||||||
|
"Zodiac: Aries",
|
||||||
|
"Hebrew Letter: He"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"number": 5,
|
||||||
|
"name": "The Hierophant",
|
||||||
|
"summary": "Tradition, spiritual instruction, and shared values.",
|
||||||
|
"upright": "Learning from lineage, ritual, ethics, and mentorship.",
|
||||||
|
"reversed": "Dogma, rebellion without grounding, or spiritual stagnation.",
|
||||||
|
"keywords": [
|
||||||
|
"tradition",
|
||||||
|
"teaching",
|
||||||
|
"ritual",
|
||||||
|
"ethics",
|
||||||
|
"lineage"
|
||||||
|
],
|
||||||
|
"relations": [
|
||||||
|
"Zodiac: Taurus",
|
||||||
|
"Hebrew Letter: Vav"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"number": 6,
|
||||||
|
"name": "The Lovers",
|
||||||
|
"summary": "Union, alignment, and value-centered choices.",
|
||||||
|
"upright": "Harmony, connection, and conscious commitment.",
|
||||||
|
"reversed": "Misalignment, indecision, or disconnection in relationship.",
|
||||||
|
"keywords": [
|
||||||
|
"union",
|
||||||
|
"choice",
|
||||||
|
"alignment",
|
||||||
|
"connection",
|
||||||
|
"values"
|
||||||
|
],
|
||||||
|
"relations": [
|
||||||
|
"Zodiac: Gemini",
|
||||||
|
"Hebrew Letter: Zayin"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"number": 7,
|
||||||
|
"name": "The Chariot",
|
||||||
|
"summary": "Directed momentum and mastery through discipline.",
|
||||||
|
"upright": "Determination, movement, and victory through control.",
|
||||||
|
"reversed": "Loss of direction, conflict of will, or stalled progress.",
|
||||||
|
"keywords": [
|
||||||
|
"drive",
|
||||||
|
"control",
|
||||||
|
"momentum",
|
||||||
|
"victory",
|
||||||
|
"direction"
|
||||||
|
],
|
||||||
|
"relations": [
|
||||||
|
"Zodiac: Cancer",
|
||||||
|
"Hebrew Letter: Cheth"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"number": 8,
|
||||||
|
"name": "Lust",
|
||||||
|
"summary": "Courageous life-force, passionate integrity, and heart-led power.",
|
||||||
|
"upright": "Vitality, confidence, and wholehearted creative expression.",
|
||||||
|
"reversed": "Self-doubt, depletion, or misdirected desire.",
|
||||||
|
"keywords": [
|
||||||
|
"vitality",
|
||||||
|
"passion",
|
||||||
|
"courage",
|
||||||
|
"magnetism",
|
||||||
|
"heart-power"
|
||||||
|
],
|
||||||
|
"relations": [
|
||||||
|
"Zodiac: Leo",
|
||||||
|
"Hebrew Letter: Teth"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"number": 9,
|
||||||
|
"name": "The Hermit",
|
||||||
|
"summary": "Inner pilgrimage, discernment, and sacred solitude.",
|
||||||
|
"upright": "Reflection, guidance, and deepening wisdom.",
|
||||||
|
"reversed": "Isolation, avoidance, or overanalysis.",
|
||||||
|
"keywords": [
|
||||||
|
"solitude",
|
||||||
|
"wisdom",
|
||||||
|
"search",
|
||||||
|
"reflection",
|
||||||
|
"discernment"
|
||||||
|
],
|
||||||
|
"relations": [
|
||||||
|
"Zodiac: Virgo",
|
||||||
|
"Hebrew Letter: Yod"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"number": 10,
|
||||||
|
"name": "Fortune",
|
||||||
|
"summary": "Cycles, timing, and turning points guided by greater rhythms.",
|
||||||
|
"upright": "Opportunity, momentum, and fated change.",
|
||||||
|
"reversed": "Resistance to cycles, delay, or repeating old patterns.",
|
||||||
|
"keywords": [
|
||||||
|
"cycles",
|
||||||
|
"timing",
|
||||||
|
"change",
|
||||||
|
"destiny",
|
||||||
|
"turning-point"
|
||||||
|
],
|
||||||
|
"relations": [
|
||||||
|
"Planet: Jupiter",
|
||||||
|
"Hebrew Letter: Kaph"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"number": 11,
|
||||||
|
"name": "Justice",
|
||||||
|
"summary": "Balance, accountability, and clear consequence.",
|
||||||
|
"upright": "Fairness, truth, and ethical alignment.",
|
||||||
|
"reversed": "Bias, denial, or avoidance of responsibility.",
|
||||||
|
"keywords": [
|
||||||
|
"balance",
|
||||||
|
"truth",
|
||||||
|
"accountability",
|
||||||
|
"law",
|
||||||
|
"clarity"
|
||||||
|
],
|
||||||
|
"relations": [
|
||||||
|
"Zodiac: Libra",
|
||||||
|
"Hebrew Letter: Lamed"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"number": 12,
|
||||||
|
"name": "The Hanged Man",
|
||||||
|
"summary": "Sacred pause, surrender, and transformed perspective.",
|
||||||
|
"upright": "Release, contemplation, and spiritual reframing.",
|
||||||
|
"reversed": "Stagnation, martyrdom, or refusing to let go.",
|
||||||
|
"keywords": [
|
||||||
|
"surrender",
|
||||||
|
"pause",
|
||||||
|
"perspective",
|
||||||
|
"suspension",
|
||||||
|
"release"
|
||||||
|
],
|
||||||
|
"relations": [
|
||||||
|
"Element: Water",
|
||||||
|
"Hebrew Letter: Mem"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"number": 13,
|
||||||
|
"name": "Death",
|
||||||
|
"summary": "Endings that clear space for rebirth and renewal.",
|
||||||
|
"upright": "Transformation, completion, and deep release.",
|
||||||
|
"reversed": "Clinging, fear of change, or prolonged transition.",
|
||||||
|
"keywords": [
|
||||||
|
"transformation",
|
||||||
|
"ending",
|
||||||
|
"renewal",
|
||||||
|
"release",
|
||||||
|
"rebirth"
|
||||||
|
],
|
||||||
|
"relations": [
|
||||||
|
"Zodiac: Scorpio",
|
||||||
|
"Hebrew Letter: Nun"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"number": 14,
|
||||||
|
"name": "Art",
|
||||||
|
"summary": "Alchemy, integration, and harmonizing opposites.",
|
||||||
|
"upright": "Balance through blending, refinement, and patience.",
|
||||||
|
"reversed": "Imbalance, excess, or fragmented energies.",
|
||||||
|
"keywords": [
|
||||||
|
"alchemy",
|
||||||
|
"integration",
|
||||||
|
"balance",
|
||||||
|
"blending",
|
||||||
|
"refinement"
|
||||||
|
],
|
||||||
|
"relations": [
|
||||||
|
"Zodiac: Sagittarius",
|
||||||
|
"Hebrew Letter: Samekh"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"number": 15,
|
||||||
|
"name": "The Devil",
|
||||||
|
"summary": "Attachment, shadow desire, and material entanglement.",
|
||||||
|
"upright": "Confronting bondage, ambition, and raw instinct.",
|
||||||
|
"reversed": "Liberation, breaking chains, or denial of shadow.",
|
||||||
|
"keywords": [
|
||||||
|
"attachment",
|
||||||
|
"shadow",
|
||||||
|
"instinct",
|
||||||
|
"temptation",
|
||||||
|
"bondage"
|
||||||
|
],
|
||||||
|
"relations": [
|
||||||
|
"Zodiac: Capricorn",
|
||||||
|
"Hebrew Letter: Ayin"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"number": 16,
|
||||||
|
"name": "The Tower",
|
||||||
|
"summary": "Sudden revelation that dismantles false structures.",
|
||||||
|
"upright": "Shock, breakthrough, and necessary collapse.",
|
||||||
|
"reversed": "Delayed upheaval, denial, or internal crisis.",
|
||||||
|
"keywords": [
|
||||||
|
"upheaval",
|
||||||
|
"revelation",
|
||||||
|
"breakthrough",
|
||||||
|
"collapse",
|
||||||
|
"truth"
|
||||||
|
],
|
||||||
|
"relations": [
|
||||||
|
"Planet: Mars",
|
||||||
|
"Hebrew Letter: Pe"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"number": 17,
|
||||||
|
"name": "The Star",
|
||||||
|
"summary": "Healing hope, guidance, and spiritual renewal.",
|
||||||
|
"upright": "Inspiration, serenity, and trust in the future.",
|
||||||
|
"reversed": "Discouragement, doubt, or loss of faith.",
|
||||||
|
"keywords": [
|
||||||
|
"hope",
|
||||||
|
"healing",
|
||||||
|
"guidance",
|
||||||
|
"renewal",
|
||||||
|
"faith"
|
||||||
|
],
|
||||||
|
"relations": [
|
||||||
|
"Zodiac: Aquarius",
|
||||||
|
"Hebrew Letter: Tzaddi"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"number": 18,
|
||||||
|
"name": "The Moon",
|
||||||
|
"summary": "Dream, uncertainty, and passage through the subconscious.",
|
||||||
|
"upright": "Intuition, mystery, and emotional depth.",
|
||||||
|
"reversed": "Confusion clearing, projection, or fear illusions.",
|
||||||
|
"keywords": [
|
||||||
|
"dream",
|
||||||
|
"mystery",
|
||||||
|
"intuition",
|
||||||
|
"subconscious",
|
||||||
|
"illusion"
|
||||||
|
],
|
||||||
|
"relations": [
|
||||||
|
"Zodiac: Pisces",
|
||||||
|
"Hebrew Letter: Qoph"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"number": 19,
|
||||||
|
"name": "The Sun",
|
||||||
|
"summary": "Radiance, confidence, and vital life affirmation.",
|
||||||
|
"upright": "Joy, clarity, success, and openness.",
|
||||||
|
"reversed": "Temporary clouding, ego glare, or delayed confidence.",
|
||||||
|
"keywords": [
|
||||||
|
"joy",
|
||||||
|
"clarity",
|
||||||
|
"vitality",
|
||||||
|
"success",
|
||||||
|
"radiance"
|
||||||
|
],
|
||||||
|
"relations": [
|
||||||
|
"Planet: Sol",
|
||||||
|
"Hebrew Letter: Resh"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"number": 20,
|
||||||
|
"name": "Aeon",
|
||||||
|
"summary": "Awakening call, reckoning, and soul-level renewal.",
|
||||||
|
"upright": "Judgment, liberation, and answering purpose.",
|
||||||
|
"reversed": "Self-judgment, hesitation, or resistance to calling.",
|
||||||
|
"keywords": [
|
||||||
|
"awakening",
|
||||||
|
"reckoning",
|
||||||
|
"calling",
|
||||||
|
"renewal",
|
||||||
|
"release"
|
||||||
|
],
|
||||||
|
"relations": [
|
||||||
|
"Element: Fire",
|
||||||
|
"Hebrew Letter: Shin"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"number": 21,
|
||||||
|
"name": "Universe",
|
||||||
|
"summary": "Completion, integration, and embodied wholeness.",
|
||||||
|
"upright": "Fulfillment, mastery, and successful closure.",
|
||||||
|
"reversed": "Incomplete cycle, loose ends, or delayed completion.",
|
||||||
|
"keywords": [
|
||||||
|
"completion",
|
||||||
|
"wholeness",
|
||||||
|
"integration",
|
||||||
|
"mastery",
|
||||||
|
"closure"
|
||||||
|
],
|
||||||
|
"relations": [
|
||||||
|
"Planet: Saturn",
|
||||||
|
"Hebrew Letter: Tav"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"suits": [
|
||||||
|
"Cups",
|
||||||
|
"Wands",
|
||||||
|
"Swords",
|
||||||
|
"Disks"
|
||||||
|
],
|
||||||
|
"numberRanks": [
|
||||||
|
"Ace",
|
||||||
|
"Two",
|
||||||
|
"Three",
|
||||||
|
"Four",
|
||||||
|
"Five",
|
||||||
|
"Six",
|
||||||
|
"Seven",
|
||||||
|
"Eight",
|
||||||
|
"Nine",
|
||||||
|
"Ten"
|
||||||
|
],
|
||||||
|
"courtRanks": [
|
||||||
|
"Knight",
|
||||||
|
"Queen",
|
||||||
|
"Prince",
|
||||||
|
"Princess"
|
||||||
|
],
|
||||||
|
"suitInfo": {
|
||||||
|
"cups": {
|
||||||
|
"element": "Water",
|
||||||
|
"domain": "emotion, intuition, relationship",
|
||||||
|
"keywords": [
|
||||||
|
"emotion",
|
||||||
|
"intuition",
|
||||||
|
"connection"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"wands": {
|
||||||
|
"element": "Fire",
|
||||||
|
"domain": "will, creativity, drive",
|
||||||
|
"keywords": [
|
||||||
|
"will",
|
||||||
|
"drive",
|
||||||
|
"inspiration"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"swords": {
|
||||||
|
"element": "Air",
|
||||||
|
"domain": "mind, truth, communication",
|
||||||
|
"keywords": [
|
||||||
|
"mind",
|
||||||
|
"truth",
|
||||||
|
"clarity"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"disks": {
|
||||||
|
"element": "Earth",
|
||||||
|
"domain": "body, craft, material life",
|
||||||
|
"keywords": [
|
||||||
|
"resources",
|
||||||
|
"craft",
|
||||||
|
"stability"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"rankInfo": {
|
||||||
|
"ace": {
|
||||||
|
"number": 1,
|
||||||
|
"upright": "Seed-force, pure potential, and concentrated essence.",
|
||||||
|
"reversed": "Blocked potential, delay, or difficulty beginning.",
|
||||||
|
"keywords": [
|
||||||
|
"seed",
|
||||||
|
"potential",
|
||||||
|
"spark"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"two": {
|
||||||
|
"number": 2,
|
||||||
|
"upright": "Polarity seeking balance, exchange, and response.",
|
||||||
|
"reversed": "Imbalance, friction, or uncertain choices.",
|
||||||
|
"keywords": [
|
||||||
|
"duality",
|
||||||
|
"balance",
|
||||||
|
"exchange"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"three": {
|
||||||
|
"number": 3,
|
||||||
|
"upright": "Initial growth, expansion, and expression.",
|
||||||
|
"reversed": "Scattered growth or stalled development.",
|
||||||
|
"keywords": [
|
||||||
|
"growth",
|
||||||
|
"expansion",
|
||||||
|
"expression"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"four": {
|
||||||
|
"number": 4,
|
||||||
|
"upright": "Structure, boundaries, and stabilizing form.",
|
||||||
|
"reversed": "Rigidity, inertia, or unstable foundations.",
|
||||||
|
"keywords": [
|
||||||
|
"structure",
|
||||||
|
"stability",
|
||||||
|
"foundation"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"five": {
|
||||||
|
"number": 5,
|
||||||
|
"upright": "Challenge, disruption, and catalytic conflict.",
|
||||||
|
"reversed": "Lingering tension or fear of needed change.",
|
||||||
|
"keywords": [
|
||||||
|
"challenge",
|
||||||
|
"conflict",
|
||||||
|
"change"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"six": {
|
||||||
|
"number": 6,
|
||||||
|
"upright": "Rebalancing, harmony, and restorative flow.",
|
||||||
|
"reversed": "Partial recovery or unresolved imbalance.",
|
||||||
|
"keywords": [
|
||||||
|
"harmony",
|
||||||
|
"repair",
|
||||||
|
"flow"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"seven": {
|
||||||
|
"number": 7,
|
||||||
|
"upright": "Testing, strategy, and spiritual/mental refinement.",
|
||||||
|
"reversed": "Doubt, overdefense, or poor strategy.",
|
||||||
|
"keywords": [
|
||||||
|
"test",
|
||||||
|
"strategy",
|
||||||
|
"refinement"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"eight": {
|
||||||
|
"number": 8,
|
||||||
|
"upright": "Adjustment, movement, and disciplined power.",
|
||||||
|
"reversed": "Restriction, frustration, or scattered effort.",
|
||||||
|
"keywords": [
|
||||||
|
"movement",
|
||||||
|
"discipline",
|
||||||
|
"adjustment"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"nine": {
|
||||||
|
"number": 9,
|
||||||
|
"upright": "Intensity, culmination, and mature force.",
|
||||||
|
"reversed": "Excess, overload, or unresolved pressure.",
|
||||||
|
"keywords": [
|
||||||
|
"culmination",
|
||||||
|
"intensity",
|
||||||
|
"maturity"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"ten": {
|
||||||
|
"number": 10,
|
||||||
|
"upright": "Completion, overflow, and transition into a new cycle.",
|
||||||
|
"reversed": "Overextension, depletion, or difficulty releasing.",
|
||||||
|
"keywords": [
|
||||||
|
"completion",
|
||||||
|
"threshold",
|
||||||
|
"transition"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"courtInfo": {
|
||||||
|
"knight": {
|
||||||
|
"role": "active catalyst and questing force",
|
||||||
|
"elementalFace": "Fire of",
|
||||||
|
"upright": "Bold pursuit, direct action, and forward momentum.",
|
||||||
|
"reversed": "Impulsiveness, burnout, or unfocused drive.",
|
||||||
|
"keywords": [
|
||||||
|
"action",
|
||||||
|
"drive",
|
||||||
|
"initiative"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"queen": {
|
||||||
|
"role": "magnetic vessel and emotional intelligence",
|
||||||
|
"elementalFace": "Water of",
|
||||||
|
"upright": "Receptive mastery, mature feeling, and embodied wisdom.",
|
||||||
|
"reversed": "Withholding, moodiness, or passive control.",
|
||||||
|
"keywords": [
|
||||||
|
"receptivity",
|
||||||
|
"maturity",
|
||||||
|
"depth"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"prince": {
|
||||||
|
"role": "strategic mediator and organizing mind",
|
||||||
|
"elementalFace": "Air of",
|
||||||
|
"upright": "Insight, communication, and adaptive coordination.",
|
||||||
|
"reversed": "Overthinking, detachment, or mixed signals.",
|
||||||
|
"keywords": [
|
||||||
|
"strategy",
|
||||||
|
"communication",
|
||||||
|
"adaptability"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"princess": {
|
||||||
|
"role": "manifesting ground and practical seed-force",
|
||||||
|
"elementalFace": "Earth of",
|
||||||
|
"upright": "Practical growth, devotion, and tangible follow-through.",
|
||||||
|
"reversed": "Stagnation, timidity, or blocked growth.",
|
||||||
|
"keywords": [
|
||||||
|
"manifestation",
|
||||||
|
"grounding",
|
||||||
|
"devotion"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"courtDecanWindows": {
|
||||||
|
"Knight of Wands": [
|
||||||
|
"scorpio-3",
|
||||||
|
"sagittarius-1",
|
||||||
|
"sagittarius-2"
|
||||||
|
],
|
||||||
|
"Queen of Disks": [
|
||||||
|
"sagittarius-3",
|
||||||
|
"capricorn-1",
|
||||||
|
"capricorn-2"
|
||||||
|
],
|
||||||
|
"Prince of Swords": [
|
||||||
|
"capricorn-3",
|
||||||
|
"aquarius-1",
|
||||||
|
"aquarius-2"
|
||||||
|
],
|
||||||
|
"Knight of Cups": [
|
||||||
|
"aquarius-3",
|
||||||
|
"pisces-1",
|
||||||
|
"pisces-2"
|
||||||
|
],
|
||||||
|
"Queen of Wands": [
|
||||||
|
"pisces-3",
|
||||||
|
"aries-1",
|
||||||
|
"aries-2"
|
||||||
|
],
|
||||||
|
"Prince of Disks": [
|
||||||
|
"aries-3",
|
||||||
|
"taurus-1",
|
||||||
|
"taurus-2"
|
||||||
|
],
|
||||||
|
"Knight of Swords": [
|
||||||
|
"taurus-3",
|
||||||
|
"gemini-1",
|
||||||
|
"gemini-2"
|
||||||
|
],
|
||||||
|
"Queen of Cups": [
|
||||||
|
"gemini-3",
|
||||||
|
"cancer-1",
|
||||||
|
"cancer-2"
|
||||||
|
],
|
||||||
|
"Prince of Wands": [
|
||||||
|
"cancer-3",
|
||||||
|
"leo-1",
|
||||||
|
"leo-2"
|
||||||
|
],
|
||||||
|
"Knight of Disks": [
|
||||||
|
"leo-3",
|
||||||
|
"virgo-1",
|
||||||
|
"virgo-2"
|
||||||
|
],
|
||||||
|
"Queen of Swords": [
|
||||||
|
"virgo-3",
|
||||||
|
"libra-1",
|
||||||
|
"libra-2"
|
||||||
|
],
|
||||||
|
"Prince of Cups": [
|
||||||
|
"libra-3",
|
||||||
|
"scorpio-1",
|
||||||
|
"scorpio-2"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"meanings": {
|
||||||
|
"majorByTrumpNumber": {
|
||||||
|
"0": "Beginning of the Great Work, innocence; a fool for love; divine madness. Reason is transcended. Take the leap. Gain or loss through foolish actions.",
|
||||||
|
"1": "Communication; Conscious Will; the process of continuous creation; ambiguity; deception. Things may not be as they appear. Concentration; meditation; mind used to direct the Will. Manipulation; crafty maneuverings.",
|
||||||
|
"2": "Symbol of highest initiation; link between the Archetypal and Formative Worlds. An initiatrix. Wooing by enchantment. Possibility. The Idea behind the Form. Fluctuation. Time may not be right for a decision concerning mundane matters.",
|
||||||
|
"3": "The Holy Grail. Love unites the Will. Love; beauty; friendship; success; passive balance. The feminine point of view. The door is open. Disregard the details and concentrate on the big picture.",
|
||||||
|
"4": "Creative wisdom radiating upon the organized man and woman. Domination after conquest; quarrelsomeness; paternal love; ambition. Thought ruled by creative, masculine, fiery energy. Stubbornness; war; authority; energy in its most temporal form. Swift impermanent action over confidence.",
|
||||||
|
"5": "The Holy Guardian Angel. The uniting of that which is above with that which is below. Love is indicated, but the nature of that love is not yet to be revealed. Inspiration; teaching; organization; discipline; strength; endurance; toil; help from superiors.",
|
||||||
|
"6": "Intuition. Be open to your own inner voice. A well-intended, arranged marriage. An artificial union; analysis followed by synthesis; indecision; instability; superficiality.",
|
||||||
|
"7": "Light in the darkness. The burden you carry may be the Holy Grail. Faithfulness; hope; obedience; a protective relationship; firm, even violent adherence to dogma or tradition. Glory; riches; enlightened civilization; victory; triumph; chain of command.",
|
||||||
|
"8": "Equilibrium; karmic law; the dance of life; all possibilities. The woman satisfied. Balance; weigh each thought against its opposite. Lawsuits; treaties. Pause and look before you leap.",
|
||||||
|
"9": "Divine seed of all things. By silence comes inspiration and wisdom. Wandering alone; temporary solitude; creative contemplation; a virgin. Retirement from involvement in current events.",
|
||||||
|
"10": "Continual change. In the midst of revolving phenomena, reach joyously the motionless center. Carefree love; wanton pleasure; amusement; fun; change of fortune, usually good.",
|
||||||
|
"11": "Understanding; the Will of the New Aeon; passion; sense smitten with ecstasy. Let love devour all. Energy independent of reason. Strength; courage; utilization of magical power.",
|
||||||
|
"12": "Redemption, sacrifice, annihilation in the beloved; martyrdom; loss; torment; suspension; death; suffering.",
|
||||||
|
"13": "End of a cycle; transformation; raw sexuality. Sex is death. Stress becomes intolerable. Any change is welcome. Time; age; unexpected change; death.",
|
||||||
|
"14": "Transmutation through union of opposites. A perfect marriage exalts and transforms each partner. The scientific method. Success follows complex maneuvers.",
|
||||||
|
"15": "“Thou hast no right but to do thy will.” Obsession; temptation; ecstasy found in every phenomenon; creative action, yet sublimely careless of result; unscrupulous ambition; strength.",
|
||||||
|
"16": "Escape from the prison of organized life; renunciation of love; quarreling. Plans are destroyed. War; danger; sudden death.",
|
||||||
|
"17": "Clairvoyance; visions; dreams; hope; love; yearning; realization of inexhaustible possibilities; dreaminess; unexpected help; renewal.",
|
||||||
|
"18": "The Dark Night of the Soul; deception; falsehood; illusion; madness; the threshold of significant change.",
|
||||||
|
"19": "Lord of the New Aeon. Spiritual emancipation. Pleasure; shamelessness; vanity; frankness. Freedom brings sanity. Glory; riches; enlightened civilization.",
|
||||||
|
"20": "Let every act be an act of Worship; let every act be an act of Love. Final decision; judgement. Learn from the past. Prepare for the future.",
|
||||||
|
"21": "Completion of the Great Work; patience; perseverance; stubbornness; serious meditation. Work accomplished."
|
||||||
|
},
|
||||||
|
"byCardName": {
|
||||||
|
"ace of wands": "Primordial energy as yet unmanifest. Seed of the Will. Masculine archetype. Natural force.",
|
||||||
|
"knight of wands": "He is active, generous, fierce, sudden, impetuous. If ill-dignified, he is evil-minded, cruel, bigoted, brutal.",
|
||||||
|
"queen of wands": "Adaptability, steady force applied to an object, steady rule, great attractive power, power of command, yet liked. Kind and generous when not opposed. If ill-dignified, obstinate, revengeful, domineering, tyrannical, and apt to turn against another without a cause.",
|
||||||
|
"prince of wands": "Swift, strong, hasty; rather violent, yet just and generous; noble and scorning meanness. If ill-dignified, cruel, intolerant, prejudiced, and ill-natured.",
|
||||||
|
"princess of wands": "Brilliance, courage, beauty, force, sudden in anger or love, desire of power, enthusiasm, revenge. If ill dignified, she is superficial, theatrical, cruel, unstable, domineering.",
|
||||||
|
"two of wands": "Dominion. First manifestation of Fire. Ideal will, independent and creative. Control over circumstances.",
|
||||||
|
"three of wands": "Pride, arrogance, self-assertion. Established force, strength, realization of hope. Completion of labor. Success after struggle. Pride, nobility, wealth, power, conceit. Rude self-assumption and insolence. Generosity, obstinacy, etc.",
|
||||||
|
"four of wands": "Settlement, arrangement, completion. Perfection or completion of a thing built up with trouble and labor. Rest after labor, subtlety, cleverness, beauty, mirth, success in completion. Reasoning faculty, conclusions drawnfrom previous knowledge. Unreadiness, unreliable and unsteady through overanxiety and hurriedness of action. Graceful in manner, at times insincere, etc.",
|
||||||
|
"five of wands": "Quarreling and fighting. Violent strife and boldness, rashness, cruelty, violence, lust, desire, prodigality and generosity, depending on whether the card is well- or ill-dignified.",
|
||||||
|
"six of wands": "Gain. Victory after strife. Love; pleasure gained by labor; carefulness, sociability and avoiding of strife, yet victory therein; also insolence and pride of riches and success, etc. The whole is dependent on the dignity.",
|
||||||
|
"seven of wands": "Opposition, yet courage. Possible victory, depending on the energy and courage exercised; valor; opposition, obstacles and difficulties, yet courage to meet them; quarreling, ignorance, pretense, wrangling, and threatening; also victory in small and unimportant things and influence upon subordinates.",
|
||||||
|
"eight of wands": "Hasty communications and messages; swiftness. Too much force applied too suddenly. Very rapid rush, but quickly passed and expended. Violent, but not lasting. Swiftness, rapidity, courage, boldness, confidence, freedom, warfare, violence; love of open air, field sports, gardens, and meadows. Generous, subtle, eloquent, yet somewhat untrustworthy; rapacious, insolent, oppressive. Theft and robbery. According to dignity.",
|
||||||
|
"nine of wands": "Strength, power, health, recovery from sickness. Tremendous and steady force that cannot be shaken. Herculean strength, yet sometimes scientifically applied. Great success, but with strife and energy. Victory, preceded by apprehension and fear. Health good, and recovery not in doubt. Generous, questioning and curious; fond of external appearances; intractable, obstinate.",
|
||||||
|
"ten of wands": "Cruelty, malice, revenge, injustice. Cruel and overbearing force and energy, but applied only to material and selfish ends. Sometimes shows failure in a matter and the opposition too strong to be controlled, arising from the person’s too great selfishness at the beginning. Ill will, levity, lying, malice, slander, envy, obstinacy; swiftness in evil and deceit, if ill-dignified. Also generosity, disinterestedness, and self-sacrifice, when well dignified. CUPS",
|
||||||
|
"ace of cups": "It symbolizes fertility—productiveness, beauty, pleasure, happiness, etc.",
|
||||||
|
"knight of cups": "Graceful, poetic, Venusian, indolent, but enthusiastic if roused. Ill-dignified, he is sensual, idle, and untruthful.",
|
||||||
|
"queen of cups": "She is imaginative, poetic, kind, yet not willing to take much trouble for another. Coquettish, good-natured, and underneath a dreamy appearance. Imagination stronger than feeling. Very much affected by other influences, and therefore more dependent upon dignity than most symbols.",
|
||||||
|
"prince of cups": "He is subtle, violent, crafty and artistic; a fierce nature with calm exterior. Powerful for good or evil but more attracted by the evil if allied with apparent Power or Wisdom. If ill-dignified, he is intensely evil and merciless.",
|
||||||
|
"princess of cups": "Sweetness, poetry, gentleness, and kindness. Imaginative, dreamy, at times indolent, yet courageous if roused. When ill-dignified, she is selfish and luxurious.",
|
||||||
|
"two of cups": "Marriage, love, pleasure. Harmony of masculine and feminine united. Harmony, pleasure, mirth, subtlety; but if",
|
||||||
|
"three of cups": "Plenty, hospitality, eating and drinking, pleasure, dancing, new clothes, merriment. Abundance, plenty, success, pleasure, sensuality, passive success, good luck and fortune; love, gladness, kindness, liberality.",
|
||||||
|
"four of cups": "Receiving pleasure or kindness from others, but some discomfort therewith. Success or pleasure approaching their end. A stationary period in happiness, which may, or may not, continue. It does not mean love and marriage so much as the previous symbol. It is too passive a symbol to represent perfectly completehappiness. Swiftness, hunting and pursuing. Acquisition by contention; injustice sometimes; some drawbacks to pleasure implied.",
|
||||||
|
"five of cups": "Disappointment in love, marriage broken off, unkindness of a friend; loss of friendship. Death, or end of pleasure; disappointment, sorrow, and loss in those things from which pleasure is expected. Sadness, treachery, deceit; ill will, detraction; charity and kindness ill-requited; all kinds of anxieties and troubles from unsuspected and unexpected sources.",
|
||||||
|
"six of cups": "Beginning of wish, happiness, success, or enjoyment. Commencement of steady increase, gain and pleasure; but commencement only. Also affront, detection, knowledge, and in some instances contention and strife arising from unwarranted self-assertion and vanity. Sometimes thankless and presumptuous; sometimes amiable and patient. According to dignity as usual.",
|
||||||
|
"seven of cups": "Lying, promises unfulfilled; illusion, deception, error; slight success at outset, not retained. Possible victory, but neutralized by the supineness of the person: illusionary success, deception in the moment of apparent victory. Lying, error, promises unfulfilled. Drunkenness, wrath, vanity. Lust, fornication, violence against women, selfish dissipation, deception in love and friendship. Often success gained, but not followed up. Modified as usual by dignity.",
|
||||||
|
"eight of cups": "Success abandoned; decline of interest. Temporary success, but without further results. Thing thrown aside as soon as gained. Not lasting, even in the matter in hand. Indolence in success. Journeying from place to place. Misery and repining without cause. Seeking after riches. Instability.",
|
||||||
|
"nine of cups": "Complete success, pleasure and happiness, wishes fulfilled. Complete and perfect realization of pleasure and happiness, almost perfect; self-praise, vanity, conceit, much talking of self, yet kind and lovable, and may be self-denying therewith. High-minded, not easily satisfied with small and limited ideas. Apt to be maligned through too much self-assumption. A good and generous, but sometimes foolish nature.",
|
||||||
|
"ten of cups": "Matter settled; complete good fortune. Permanent and lasting success and happiness, because inspired from above. Not so sensual as “Lord of Material Happiness,” yet almost more truly happy. Pleasure, dissipation,debauchery, quietness, peacemaking. Kindness, pity, generosity, wantonness, waste, etc., according to dignity.",
|
||||||
|
"ace of swords": "It symbolizes “invoked,” as contrasted with natural force: for it is the Invocation of the Sword. Raised upward, it invokes the divine crown of spiritual brightness, but reversed it is the invocation of demonic force and becomes a fearfully evil symbol. It represents, therefore, very great power for good or evil, but invoked; and it also represents whirling force and strength through trouble. It is the affirmation of Justice upholding divine authority; and it may become the Sword of Wrath, Punishment, and Affliction.",
|
||||||
|
"knight of swords": "He is active, clever, subtle, fierce, delicate, courageous, skillful, but inclined to domineer. Also to overvalue small things, unless well-dignified. If ill-dignified, deceitful, tyrannical, and crafty.",
|
||||||
|
"queen of swords": "Intensely perceptive, keen observation, subtle, quick and confident; often persevering, accurate in superficial things, graceful, fond of dancing and balancing. If ill-dignified, cruel, sly, deceitful, unreliable, though with a good exterior.",
|
||||||
|
"prince of swords": "Full of ideas and thoughts and designs, distrustful, suspicious, firm in friendship and enmity; careful, observant, slow, overcautious. Symbolizes Alpha and Omega; he slays as fast as he creates. If ill-dignified: harsh, malicious, plotting; obstinate, yet hesitating; unreliable.",
|
||||||
|
"princess of swords": "Wisdom, strength, acuteness; subtlety in material things; grace and dexterity. If ill-dignified, she is frivolous and cunning.",
|
||||||
|
"two of swords": "Quarrel made up, yet still some tension in relations: actions sometimes selfish, sometimes unselfish. Contradictory characters in the same nature; strength through suffering, pleasure after pain. Sacrifice and trouble, yet strength arising therefrom, symbolized by the position of the rose, as though the pain itself had brought forth beauty. Arrangement, peace restored; truce; truth and untruth; sorrow and sympathy. Aid to the weak; justice; unselfishness; also a tendency to repetition of affronts on being pardoned; injury when meaning well; given to petitions; also a want of tact and asking questions of little moment; talkative.",
|
||||||
|
"three of swords": "Unhappiness, sorrow, and tears. Disruption, interruption, separation, quarreling; sowing of discord and strife, mischief-making, sorrow and tears; yet mirth in platonic pleasures; singing, faithfulness in promises, honesty in money transactions, selfish and dissipated, yet sometimes generous; deceitful in words and repetitions; the whole according to dignity.",
|
||||||
|
"four of swords": "Convalescence, recovery from sickness; change for the better. Rest from sorrow, yet after and through it. Peace from and after war. Relaxation of anxiety. Quietness, rest, ease and plenty, yet after struggle. Goods of this life; abundance; modified by dignity as usual.",
|
||||||
|
"five of swords": "Defeat, loss, malice, spite, slander, evil-speaking. Contest finished and decided against the person; failure, defeat, anxiety, trouble, poverty, avarice, grieving after gain; laborious, unresting; loss and vileness of nature; malicious, slanderous, lying, spiteful and tale-bearing. A busybody and separator of friends, hating to see peace and love between others. Cruel, yet cowardly, thankless and unreliable. Clever and quick in thought and speech. Feelings of pity easily roused, but unenduring.",
|
||||||
|
"six of swords": "Labor, work, journey by water. Success after anxiety and trouble; self-esteem, beauty, conceit, but sometimes modesty therewith; dominance, patience, labor, etc.",
|
||||||
|
"seven of swords": "Journey by land; in character untrustworthy. Partial success. Yielding when victory is within grasp, as if the last reserves of strength were used up. Inclination to lose when on the point of gaining through not continuing the effort. Love of abundance; fascinated by display; given to compliments, affronts, and insolences and to spy upon others. Inclined to betray confidences, not always intentionally. Rather vacillatory and unreliable.",
|
||||||
|
"eight of swords": "Narrow, restricted, petty, a prison. Too much force applied to small things; too much attention to detail at the expense of the principal and more important points. When ill-dignified, these qualities produce malice, pettiness, and domineering characteristics. Patience in detail of study; great care in some things, counterbalanced by equal disorder in others. Impulsive; equally fond of giving or receiving money or presents; generous, clever, acute, selfish and without strong feeling of affection. Admires wisdom, yet applies it to small and unworthy objects.",
|
||||||
|
"nine of swords": "Illness, suffering, malice, cruelty, pain. Despair, cruelty, pitilessness, malice, suffering, want, loss, misery. Burden, oppression, labor; subtlety and craft, dishonesty, lying and slander. Yet also obedience, faithfulness, patience, unselfishness, etc., according to dignity.",
|
||||||
|
"ten of swords": "Ruin, death, defeat, disruption. Almost a worse symbol than the Nine of Swords. Undisciplined, warring force, complete disruption and failure. Ruin of all plans and projects. Disdain, insolence, and impertinence, yet mirth and jollity therewith. A marplot, loving to overthrow the happiness of others; a repeater of things; given to much unprofitable speech, and of many words. Yet clever, eloquent, etc., according to dignity.",
|
||||||
|
"ace of disks": "It represents materiality in all senses, good and evil, and is, therefore, in a sense, illusionary. It shows material gain, labor, power, wealth, etc.",
|
||||||
|
"knight of disks": "Unless very well-dignified he is heavy, dull, and material. Laborious, clever, and patient in material matters. If",
|
||||||
|
"queen of disks": "She is impetuous, kind, timid, rather charming, greathearted, intelligent, melancholy, truthful, yet of many moods. If ill-dignified, she is undecided, capricious, changeable, foolish.",
|
||||||
|
"prince of disks": "Increase of matter. Increases good or evil, solidifies; practically applies things. Steady, reliable. If ill-dignified, he is selfish, animal and material, stupid. In either case slow to anger, but furious if roused.",
|
||||||
|
"princess of disks": "She is generous, kind, diligent, benevolent, careful, courageous, persevering, pitiful. If ill-dignified, she is wasteful and prodigal.",
|
||||||
|
"two of disks": "Pleasant change; visit to friends. The harmony of change; alternation of gain and loss, weakness and strength; ever-changing occupation; wandering, discontented with any fixed condition of things; now elated, then melancholy; industrious, yet unreliable; fortunate through prudence of management, yet sometimes unaccountably foolish; alternatively talkative and suspicious. Kind, yet wavering and inconsistent. Fortunate in journeying. Argumentative.",
|
||||||
|
"three of disks": "Business, paid employment, commercial transaction. Working and constructive force, building up, creation, erection; realization and increase of material things; gain in commercial transactions, rank; increase of substance, influence, cleverness in business, selfishness. Commencement of matters to be established later. Narrow and prejudiced. Keen in matters of gain; sometimes given to seeking after impossibilities.",
|
||||||
|
"four of disks": "Gain of money or influence; a present. Assured material gain: success, rank, dominion, earthy power, completed but leading to nothing beyond. Prejudicial, covetous, suspicious, careful and orderly, but discontented. Little enterprise or originality. According to dignity as usual.",
|
||||||
|
"five of disks": "Loss of profession; loss of money; monetary anxiety. Loss of money or position. Trouble about material things. Labor, toil, land cultivation; building, knowledge and acuteness of earthly things; poverty; carefulness, kindness; sometimes money regained after severe toil and labor. Unimaginative, harsh, stern, determined, obstinate.",
|
||||||
|
"six of disks": "Success in material things, prosperity in business. Success and gain in material undertakings. Power, influence, rank, nobility, rule over the people. Fortunate, successful, liberal, and just. If ill-dignified, may be purse-proud, insolent from excess, or prodigal.",
|
||||||
|
"seven of disks": "Unprofitable speculations and employments; little gain for much labor. Promises of success unfulfilled (shown, as it were, by the fact that the rosebuds do not come to anything). Loss of apparently promising fortune. Hopes deceived and crushed. Disappointment, misery, slavery, necessity, and baseness. A cultivator of land, yet a loser thereby. Sometimes it denotes slight and isolated gains with no fruits resulting therefrom, and of no further account, though seeming to promise well.",
|
||||||
|
"eight of disks": "Skill; prudence; cunning. Overcareful in small things at the expense of great. Penny wise and pound foolish. Gain of ready money in small sums; mean, avaricious; industrious; cultivation of land; hoarding; lacking in enterprise.",
|
||||||
|
"nine of disks": "Inheritance; much increase of goods. Complete realization of material gain, good, riches; inheritance; covetous, treasuring of goods, and sometimes theft and knavery. The whole according to dignity.",
|
||||||
|
"ten of disks": "Riches and wealth. Completion of material gain and fortune; but nothing beyond; as it were, at the very pinnacle of success. Old age, slothfulness; great wealth, yet sometimes loss in part; heaviness; dullness of mind, yet clever and prosperous in money transactions."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
338
data/wheel-of-year.json
Normal file
@@ -0,0 +1,338 @@
|
|||||||
|
{
|
||||||
|
"meta": {
|
||||||
|
"version": 1,
|
||||||
|
"notes": "Celtic / Pagan Wheel of the Year — eight seasonal festivals (Sabbats) with astronomical and agricultural associations. Holiday records are centralized in calendar-holidays.json."
|
||||||
|
},
|
||||||
|
"calendar": {
|
||||||
|
"id": "wheel-of-year",
|
||||||
|
"label": "Wheel of the Year",
|
||||||
|
"type": "solar-cycle",
|
||||||
|
"script": "Latin",
|
||||||
|
"description": "The Wheel of the Year is an annual cycle of eight seasonal festivals (Sabbats) observed in Wicca, Druidry, and many modern Pagan traditions. Four are 'cross-quarter' fire festivals tied to agricultural seasons; four are solar festivals at the solstices and equinoxes."
|
||||||
|
},
|
||||||
|
"months": [
|
||||||
|
{
|
||||||
|
"id": "samhain",
|
||||||
|
"order": 1,
|
||||||
|
"name": "Samhain",
|
||||||
|
"nativeName": "Samhain",
|
||||||
|
"pronounce": "SOW-in",
|
||||||
|
"date": "October 31 / November 1",
|
||||||
|
"type": "cross-quarter",
|
||||||
|
"season": "Autumn cross-quarter",
|
||||||
|
"element": "Earth",
|
||||||
|
"description": "The Celtic New Year and the beginning of the dark half of the year. The boundary between the living and the dead is thinnest. Ancestors are honored; divination is practiced.",
|
||||||
|
"associations": {
|
||||||
|
"direction": "North / Northwest",
|
||||||
|
"themes": [
|
||||||
|
"death and rebirth",
|
||||||
|
"ancestors",
|
||||||
|
"the veil",
|
||||||
|
"divination",
|
||||||
|
"endings"
|
||||||
|
],
|
||||||
|
"deities": [
|
||||||
|
"The Crone",
|
||||||
|
"Hecate",
|
||||||
|
"The Morrigan",
|
||||||
|
"Hades",
|
||||||
|
"Osiris"
|
||||||
|
],
|
||||||
|
"colors": [
|
||||||
|
"black",
|
||||||
|
"orange",
|
||||||
|
"deep red",
|
||||||
|
"purple"
|
||||||
|
],
|
||||||
|
"herbs": [
|
||||||
|
"mugwort",
|
||||||
|
"wormwood",
|
||||||
|
"dittany of Crete",
|
||||||
|
"nightshade"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "yule",
|
||||||
|
"order": 2,
|
||||||
|
"name": "Yule (Winter Solstice)",
|
||||||
|
"nativeName": "Yule / Alban Arthan",
|
||||||
|
"date": "~December 21",
|
||||||
|
"type": "solar",
|
||||||
|
"season": "Winter solstice",
|
||||||
|
"element": "Earth",
|
||||||
|
"description": "The longest night and the rebirth of the Sun. The Oak King defeats the Holly King to begin the light's return. Log-burning, evergreen decoration, and candlelight vigils mark this Solar festival.",
|
||||||
|
"associations": {
|
||||||
|
"direction": "North",
|
||||||
|
"themes": [
|
||||||
|
"rebirth of the sun",
|
||||||
|
"hope",
|
||||||
|
"inner light",
|
||||||
|
"return of warmth",
|
||||||
|
"solstice"
|
||||||
|
],
|
||||||
|
"deities": [
|
||||||
|
"The Oak King",
|
||||||
|
"Sol Invictus",
|
||||||
|
"Mithras",
|
||||||
|
"Odin / Father Christmas"
|
||||||
|
],
|
||||||
|
"colors": [
|
||||||
|
"red",
|
||||||
|
"green",
|
||||||
|
"gold",
|
||||||
|
"white"
|
||||||
|
],
|
||||||
|
"herbs": [
|
||||||
|
"holly",
|
||||||
|
"ivy",
|
||||||
|
"mistletoe",
|
||||||
|
"pine",
|
||||||
|
"frankincense"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "imbolc",
|
||||||
|
"order": 3,
|
||||||
|
"name": "Imbolc",
|
||||||
|
"nativeName": "Imbolc / Oimelc",
|
||||||
|
"date": "February 1–2",
|
||||||
|
"type": "cross-quarter",
|
||||||
|
"season": "Late winter cross-quarter",
|
||||||
|
"element": "Fire / Earth",
|
||||||
|
"description": "The first stirrings of spring. A festival of the returning light, purification, and the goddess Brigid. Corresponds to Candlemas in Christian tradition.",
|
||||||
|
"associations": {
|
||||||
|
"direction": "Northeast",
|
||||||
|
"themes": [
|
||||||
|
"new beginnings",
|
||||||
|
"purification",
|
||||||
|
"inspiration",
|
||||||
|
"hearth",
|
||||||
|
"healing"
|
||||||
|
],
|
||||||
|
"deities": [
|
||||||
|
"Brigid / Bride",
|
||||||
|
"St. Brigid",
|
||||||
|
"The Maiden"
|
||||||
|
],
|
||||||
|
"colors": [
|
||||||
|
"white",
|
||||||
|
"silver",
|
||||||
|
"pale yellow",
|
||||||
|
"pink"
|
||||||
|
],
|
||||||
|
"herbs": [
|
||||||
|
"snowdrop",
|
||||||
|
"rosemary",
|
||||||
|
"angelica",
|
||||||
|
"basil"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "ostara",
|
||||||
|
"order": 4,
|
||||||
|
"name": "Ostara (Spring Equinox)",
|
||||||
|
"nativeName": "Ostara / Alban Eilir",
|
||||||
|
"date": "~March 20–21",
|
||||||
|
"type": "solar",
|
||||||
|
"season": "Spring equinox",
|
||||||
|
"element": "Air",
|
||||||
|
"description": "The Spring Equinox; equal day and night, balance of light and dark. Seeds of spring are planted, hares and eggs symbolize fertility. Named for the Germanic dawn goddess Ēostre.",
|
||||||
|
"associations": {
|
||||||
|
"direction": "East",
|
||||||
|
"themes": [
|
||||||
|
"balance",
|
||||||
|
"rebirth",
|
||||||
|
"fertility",
|
||||||
|
"dawn",
|
||||||
|
"new beginnings"
|
||||||
|
],
|
||||||
|
"deities": [
|
||||||
|
"Ēostre",
|
||||||
|
"Persephone",
|
||||||
|
"The Maiden",
|
||||||
|
"Green Man"
|
||||||
|
],
|
||||||
|
"colors": [
|
||||||
|
"pale green",
|
||||||
|
"yellow",
|
||||||
|
"lilac",
|
||||||
|
"pastel"
|
||||||
|
],
|
||||||
|
"herbs": [
|
||||||
|
"violet",
|
||||||
|
"jasmine",
|
||||||
|
"daffodil",
|
||||||
|
"lavender"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "beltane",
|
||||||
|
"order": 5,
|
||||||
|
"name": "Beltane",
|
||||||
|
"nativeName": "Beltane / Bealtainn",
|
||||||
|
"date": "May 1",
|
||||||
|
"type": "cross-quarter",
|
||||||
|
"season": "Spring cross-quarter",
|
||||||
|
"element": "Fire",
|
||||||
|
"description": "The great Celtic fire festival celebrating the peak of spring and the beginning of summer. Union of the God and Goddess. Maypole dancing, bonfires, and the gathering of hawthorn (may) blossom.",
|
||||||
|
"associations": {
|
||||||
|
"direction": "Southeast",
|
||||||
|
"themes": [
|
||||||
|
"fertility",
|
||||||
|
"passion",
|
||||||
|
"union",
|
||||||
|
"abundance",
|
||||||
|
"sexuality",
|
||||||
|
"vitality"
|
||||||
|
],
|
||||||
|
"deities": [
|
||||||
|
"The Green Man",
|
||||||
|
"Flora",
|
||||||
|
"Cernunnos",
|
||||||
|
"Aphrodite",
|
||||||
|
"Beltane Fire"
|
||||||
|
],
|
||||||
|
"colors": [
|
||||||
|
"red",
|
||||||
|
"white",
|
||||||
|
"green",
|
||||||
|
"gold"
|
||||||
|
],
|
||||||
|
"herbs": [
|
||||||
|
"hawthorn",
|
||||||
|
"rose",
|
||||||
|
"rowan",
|
||||||
|
"meadowsweet",
|
||||||
|
"woodruff"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "litha",
|
||||||
|
"order": 6,
|
||||||
|
"name": "Litha (Summer Solstice)",
|
||||||
|
"nativeName": "Litha / Alban Hefin / Midsummer",
|
||||||
|
"date": "~June 21",
|
||||||
|
"type": "solar",
|
||||||
|
"season": "Summer solstice",
|
||||||
|
"element": "Fire",
|
||||||
|
"description": "The longest day; the sun is at its zenith. The Holly King begins to reclaim power from the Oak King. A time of peak solar energy, magic, and celebration. Corresponds to Midsummer (Shakespeare's A Midsummer Night's Dream).",
|
||||||
|
"associations": {
|
||||||
|
"direction": "South",
|
||||||
|
"themes": [
|
||||||
|
"peak power",
|
||||||
|
"fullness",
|
||||||
|
"solar magic",
|
||||||
|
"fae",
|
||||||
|
"courage",
|
||||||
|
"strength"
|
||||||
|
],
|
||||||
|
"deities": [
|
||||||
|
"Sol / Sun God",
|
||||||
|
"Lugh (early)",
|
||||||
|
"Ra",
|
||||||
|
"Apollo"
|
||||||
|
],
|
||||||
|
"colors": [
|
||||||
|
"gold",
|
||||||
|
"yellow",
|
||||||
|
"orange",
|
||||||
|
"blue"
|
||||||
|
],
|
||||||
|
"herbs": [
|
||||||
|
"St. John's Wort",
|
||||||
|
"lavender",
|
||||||
|
"chamomile",
|
||||||
|
"elderflower",
|
||||||
|
"fern seed"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "lughnasadh",
|
||||||
|
"order": 7,
|
||||||
|
"name": "Lughnasadh",
|
||||||
|
"nativeName": "Lughnasadh / Lammas",
|
||||||
|
"date": "August 1",
|
||||||
|
"type": "cross-quarter",
|
||||||
|
"season": "Autumn cross-quarter (first harvest)",
|
||||||
|
"element": "Earth / Fire",
|
||||||
|
"description": "The first harvest festival, celebrating grain and abundance. Named for the Celtic sun god Lugh, who ordained funeral games for his foster-mother Tailtiu. The first loaf of bread is baked from the new grain.",
|
||||||
|
"associations": {
|
||||||
|
"direction": "West / Southwest",
|
||||||
|
"themes": [
|
||||||
|
"first harvest",
|
||||||
|
"grain",
|
||||||
|
"sacrifice",
|
||||||
|
"abundance",
|
||||||
|
"skill",
|
||||||
|
"games"
|
||||||
|
],
|
||||||
|
"deities": [
|
||||||
|
"Lugh",
|
||||||
|
"The Corn King",
|
||||||
|
"John Barleycorn",
|
||||||
|
"Demeter"
|
||||||
|
],
|
||||||
|
"colors": [
|
||||||
|
"gold",
|
||||||
|
"orange",
|
||||||
|
"brown",
|
||||||
|
"yellow"
|
||||||
|
],
|
||||||
|
"herbs": [
|
||||||
|
"wheat",
|
||||||
|
"sunflower",
|
||||||
|
"corn",
|
||||||
|
"calendula",
|
||||||
|
"nasturtium"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "mabon",
|
||||||
|
"order": 8,
|
||||||
|
"name": "Mabon (Autumn Equinox)",
|
||||||
|
"nativeName": "Mabon / Alban Elfed",
|
||||||
|
"date": "~September 22–23",
|
||||||
|
"type": "solar",
|
||||||
|
"season": "Autumn equinox",
|
||||||
|
"element": "Earth / Water",
|
||||||
|
"description": "The Autumn Equinox and second harvest. A time of balance and thanksgiving; day and night are equal. The God begins his descent into the Underworld. Grapes, corn, and root vegetables are harvested.",
|
||||||
|
"associations": {
|
||||||
|
"direction": "West",
|
||||||
|
"themes": [
|
||||||
|
"harvest",
|
||||||
|
"balance",
|
||||||
|
"gratitude",
|
||||||
|
"preparation for darkness",
|
||||||
|
"completion"
|
||||||
|
],
|
||||||
|
"deities": [
|
||||||
|
"Mabon ap Modron",
|
||||||
|
"Persephone descending",
|
||||||
|
"The Morrigan",
|
||||||
|
"Dionysus"
|
||||||
|
],
|
||||||
|
"colors": [
|
||||||
|
"deep red",
|
||||||
|
"brown",
|
||||||
|
"russet",
|
||||||
|
"purple",
|
||||||
|
"gold"
|
||||||
|
],
|
||||||
|
"herbs": [
|
||||||
|
"ivy",
|
||||||
|
"oak",
|
||||||
|
"blackberry",
|
||||||
|
"rosehip",
|
||||||
|
"sage"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
781
index.html
Normal file
@@ -0,0 +1,781 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<title>Tarot Time!</title>
|
||||||
|
<link rel="icon" href="data:,">
|
||||||
|
<link rel="stylesheet" href="node_modules/@toast-ui/calendar/dist/toastui-calendar.min.css">
|
||||||
|
<link rel="stylesheet" href="node_modules/@fontsource/noto-sans-hebrew/hebrew-400.css">
|
||||||
|
<link rel="stylesheet" href="node_modules/@fontsource/noto-sans-hebrew/hebrew-700.css">
|
||||||
|
<link rel="stylesheet" href="node_modules/@fontsource/noto-serif/greek-400.css">
|
||||||
|
<link rel="stylesheet" href="node_modules/@fontsource/noto-serif/greek-700.css">
|
||||||
|
<link rel="stylesheet" href="node_modules/@fontsource/noto-serif/greek-ext-400.css">
|
||||||
|
<link rel="stylesheet" href="node_modules/@fontsource/noto-serif/greek-ext-700.css">
|
||||||
|
<link rel="stylesheet" href="node_modules/@fontsource/noto-sans-phoenician/phoenician-400.css">
|
||||||
|
<link rel="stylesheet" href="node_modules/@fontsource/amiri/arabic-400.css">
|
||||||
|
<link rel="stylesheet" href="node_modules/@fontsource/amiri/arabic-700.css">
|
||||||
|
<link rel="stylesheet" href="node_modules/@fontsource/noto-naskh-arabic/arabic-400.css">
|
||||||
|
<link rel="stylesheet" href="app/styles.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="topbar">
|
||||||
|
<strong>Tarot Time!</strong>
|
||||||
|
<div class="topbar-actions">
|
||||||
|
<div class="topbar-dropdown" aria-label="Calendar menu">
|
||||||
|
<button id="open-calendar" class="settings-trigger" type="button" aria-pressed="false" aria-haspopup="menu" aria-controls="calendar-subpages" aria-expanded="false">Calendar ▾</button>
|
||||||
|
<div id="calendar-subpages" class="topbar-dropdown-menu" role="menu" aria-label="Calendar subpages">
|
||||||
|
<button id="open-calendar-months" class="settings-trigger topbar-sub-trigger" type="button" role="menuitem">Months</button>
|
||||||
|
<button id="open-holidays" class="settings-trigger topbar-sub-trigger" type="button" role="menuitem">Holidays</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="topbar-dropdown" aria-label="Tarot menu">
|
||||||
|
<button id="open-tarot" class="settings-trigger" type="button" aria-pressed="false" aria-haspopup="menu" aria-controls="tarot-subpages" aria-expanded="false">Tarot ▾</button>
|
||||||
|
<div id="tarot-subpages" class="topbar-dropdown-menu" role="menu" aria-label="Tarot subpages">
|
||||||
|
<button id="open-tarot-cards" class="settings-trigger topbar-sub-trigger" type="button" role="menuitem">Cards</button>
|
||||||
|
<button id="open-tarot-spread" class="settings-trigger topbar-sub-trigger" type="button" role="menuitem">Draw Spread</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="topbar-dropdown" aria-label="Astronomy menu">
|
||||||
|
<button id="open-astronomy" class="settings-trigger" type="button" aria-pressed="false" aria-haspopup="menu" aria-controls="astronomy-subpages" aria-expanded="false">Astronomy ▾</button>
|
||||||
|
<div id="astronomy-subpages" class="topbar-dropdown-menu" role="menu" aria-label="Astronomy subpages">
|
||||||
|
<button id="open-planets" class="settings-trigger topbar-sub-trigger" type="button" role="menuitem">Planet</button>
|
||||||
|
<button id="open-cycles" class="settings-trigger topbar-sub-trigger" type="button" role="menuitem">Cycles</button>
|
||||||
|
<button id="open-zodiac" class="settings-trigger topbar-sub-trigger" type="button" role="menuitem">Zodiac</button>
|
||||||
|
<button id="open-natal" class="settings-trigger topbar-sub-trigger" type="button" role="menuitem">Natal Chart</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<button id="open-elements" class="settings-trigger" type="button" aria-pressed="false">Elements</button>
|
||||||
|
<button id="open-iching" class="settings-trigger" type="button" aria-pressed="false">I Ching</button>
|
||||||
|
<div class="topbar-dropdown" aria-label="Kabbalah menu">
|
||||||
|
<button id="open-kabbalah" class="settings-trigger" type="button" aria-pressed="false" aria-haspopup="menu" aria-controls="kabbalah-subpages" aria-expanded="false">Kabbalah ▾</button>
|
||||||
|
<div id="kabbalah-subpages" class="topbar-dropdown-menu" role="menu" aria-label="Kabbalah subpages">
|
||||||
|
<button id="open-kabbalah-tree" class="settings-trigger topbar-sub-trigger" type="button" role="menuitem">Tree</button>
|
||||||
|
<button id="open-kabbalah-cube" class="settings-trigger topbar-sub-trigger" type="button" role="menuitem">Cube</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<button id="open-alphabet" class="settings-trigger" type="button" aria-pressed="false">Alphabet</button>
|
||||||
|
<button id="open-numbers" class="settings-trigger" type="button" aria-pressed="false">Numbers</button>
|
||||||
|
<button id="open-quiz" class="settings-trigger" type="button" aria-pressed="false">Quiz</button>
|
||||||
|
<button id="open-gods" class="settings-trigger" type="button" aria-pressed="false">Gods</button>
|
||||||
|
<button id="open-enochian" class="settings-trigger" type="button" aria-pressed="false">Enochian</button>
|
||||||
|
<button id="open-settings" class="settings-trigger" type="button" aria-haspopup="dialog" aria-expanded="false">Settings</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="settings-popup" class="settings-popup" hidden>
|
||||||
|
<div id="settings-popup-card" class="settings-popup-card" role="dialog" aria-modal="false" aria-label="Calendar Settings">
|
||||||
|
<div class="settings-popup-header">
|
||||||
|
<strong>Settings</strong>
|
||||||
|
<button id="close-settings" type="button">Close</button>
|
||||||
|
</div>
|
||||||
|
<div class="settings-grid">
|
||||||
|
<label class="settings-field">Latitude
|
||||||
|
<input id="lat" type="number" step="0.0001" value="51.5074">
|
||||||
|
</label>
|
||||||
|
<label class="settings-field">Longitude
|
||||||
|
<input id="lng" type="number" step="0.0001" value="-0.1278">
|
||||||
|
</label>
|
||||||
|
<label class="settings-field settings-field-full">Time Format
|
||||||
|
<select id="time-format">
|
||||||
|
<option value="minutes" selected>Minutes (default)</option>
|
||||||
|
<option value="hours">Hours</option>
|
||||||
|
<option value="seconds">Seconds</option>
|
||||||
|
</select>
|
||||||
|
</label>
|
||||||
|
<label class="settings-field settings-field-full">Birth Date
|
||||||
|
<input id="birth-date" type="date">
|
||||||
|
</label>
|
||||||
|
<label class="settings-field settings-field-full">Tarot Deck
|
||||||
|
<select id="tarot-deck">
|
||||||
|
<option value="ceremonial-magick" selected>Loading deck manifests...</option>
|
||||||
|
</select>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="settings-actions">
|
||||||
|
<button id="use-location" type="button">Use My Location</button>
|
||||||
|
<button id="save-settings" type="button">Save Settings</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<section id="calendar-section" hidden>
|
||||||
|
<div class="planet-layout">
|
||||||
|
<aside class="planet-list-panel">
|
||||||
|
<div class="planet-list-header">
|
||||||
|
<strong id="calendar-list-title">Calendar > Months</strong>
|
||||||
|
<span id="calendar-month-count" class="planet-list-count">--</span>
|
||||||
|
</div>
|
||||||
|
<div class="dataset-search-wrap" id="calendar-type-wrap">
|
||||||
|
<label for="calendar-type-select">Calendar System</label>
|
||||||
|
<select id="calendar-type-select" class="quiz-category-select" aria-label="Select calendar system">
|
||||||
|
<option value="gregorian">Gregorian Calendar</option>
|
||||||
|
<option value="hebrew">Hebrew Calendar</option>
|
||||||
|
<option value="islamic">Islamic Calendar</option>
|
||||||
|
<option value="wheel-of-year">Wheel of the Year</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="dataset-search-wrap calendar-year-control" id="calendar-year-wrap">
|
||||||
|
<label for="calendar-year-input">Year for month facts</label>
|
||||||
|
<input id="calendar-year-input" type="number" min="1900" max="2500" step="1" value="2026">
|
||||||
|
</div>
|
||||||
|
<div class="dataset-search-wrap">
|
||||||
|
<input id="calendar-search-input" class="dataset-search-input" type="search" placeholder="Search months and events" aria-label="Search calendar months and events">
|
||||||
|
<button id="calendar-search-clear" class="dataset-search-clear" type="button" aria-label="Clear calendar search" disabled>×</button>
|
||||||
|
</div>
|
||||||
|
<div id="calendar-month-list" class="planet-card-list" role="listbox" aria-label="Calendar months"></div>
|
||||||
|
</aside>
|
||||||
|
<section class="planet-detail-panel" aria-live="polite">
|
||||||
|
<div class="planet-detail-heading">
|
||||||
|
<h2 id="calendar-detail-name">--</h2>
|
||||||
|
<div id="calendar-detail-sub" class="planet-detail-type">Select a month to explore</div>
|
||||||
|
</div>
|
||||||
|
<div id="calendar-detail-body"></div>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section id="holiday-section" hidden>
|
||||||
|
<div class="planet-layout">
|
||||||
|
<aside class="planet-list-panel">
|
||||||
|
<div class="planet-list-header">
|
||||||
|
<strong>Holiday Repository</strong>
|
||||||
|
<span id="holiday-count" class="planet-list-count">--</span>
|
||||||
|
</div>
|
||||||
|
<div class="dataset-search-wrap calendar-holiday-filter">
|
||||||
|
<label for="holiday-source-select">Holiday Source</label>
|
||||||
|
<select id="holiday-source-select" class="quiz-category-select" aria-label="Filter holidays by source calendar">
|
||||||
|
<option value="all">All Calendars</option>
|
||||||
|
<option value="gregorian">Gregorian</option>
|
||||||
|
<option value="hebrew">Hebrew</option>
|
||||||
|
<option value="islamic">Islamic</option>
|
||||||
|
<option value="wheel-of-year">Wheel of the Year</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="dataset-search-wrap calendar-year-control">
|
||||||
|
<label for="holiday-year-input">Reference Year</label>
|
||||||
|
<input id="holiday-year-input" type="number" min="1900" max="2500" step="1" value="2026">
|
||||||
|
</div>
|
||||||
|
<div class="dataset-search-wrap">
|
||||||
|
<input id="holiday-search-input" class="dataset-search-input" type="search" placeholder="Search holidays, calendars, date equivalents" aria-label="Search holiday repository">
|
||||||
|
<button id="holiday-search-clear" class="dataset-search-clear" type="button" aria-label="Clear holiday search" disabled>×</button>
|
||||||
|
</div>
|
||||||
|
<div id="holiday-list" class="planet-card-list" role="listbox" aria-label="Holidays"></div>
|
||||||
|
</aside>
|
||||||
|
<section class="planet-detail-panel" aria-live="polite">
|
||||||
|
<div class="planet-detail-heading">
|
||||||
|
<h2 id="holiday-detail-name">--</h2>
|
||||||
|
<div id="holiday-detail-sub" class="planet-detail-type">Select a holiday to explore</div>
|
||||||
|
</div>
|
||||||
|
<div id="holiday-detail-body"></div>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section id="tarot-section" hidden>
|
||||||
|
<div id="tarot-browse-view">
|
||||||
|
<section class="tarot-misc-section tarot-section-house-top" aria-label="Tarot misc">
|
||||||
|
<div class="tarot-meta-card tarot-house-card">
|
||||||
|
<strong>House of Cards</strong>
|
||||||
|
<div id="tarot-house-of-cards" class="tarot-house-layout" aria-live="polite"></div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<div class="tarot-layout">
|
||||||
|
<aside class="tarot-list-panel">
|
||||||
|
<div class="tarot-list-header">
|
||||||
|
<strong>Tarot Database</strong>
|
||||||
|
<span id="tarot-card-count" class="tarot-list-count">--</span>
|
||||||
|
</div>
|
||||||
|
<div class="dataset-search-wrap">
|
||||||
|
<input id="tarot-search-input" class="dataset-search-input" type="search" placeholder="Search cards, keywords, relations" aria-label="Search tarot cards">
|
||||||
|
<button id="tarot-search-clear" class="dataset-search-clear" type="button" aria-label="Clear tarot search" disabled>×</button>
|
||||||
|
</div>
|
||||||
|
<div id="tarot-card-list" class="tarot-card-list" role="listbox" aria-label="Tarot cards"></div>
|
||||||
|
</aside>
|
||||||
|
<section class="tarot-detail-panel" aria-live="polite">
|
||||||
|
<div class="tarot-detail-top">
|
||||||
|
<img id="tarot-detail-image" class="tarot-detail-image" alt="Tarot card image" />
|
||||||
|
<div class="tarot-detail-heading">
|
||||||
|
<h2 id="tarot-detail-name">--</h2>
|
||||||
|
<div id="tarot-detail-type" class="tarot-detail-type">--</div>
|
||||||
|
<div id="tarot-detail-summary" class="tarot-detail-summary">--</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="tarot-meanings">
|
||||||
|
<div class="tarot-meaning-card">
|
||||||
|
<strong>Upright</strong>
|
||||||
|
<div id="tarot-detail-upright">--</div>
|
||||||
|
</div>
|
||||||
|
<div class="tarot-meaning-card">
|
||||||
|
<strong>Reversed</strong>
|
||||||
|
<div id="tarot-detail-reversed">--</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="tarot-meta-grid">
|
||||||
|
<div id="tarot-meta-meaning-card" class="tarot-meta-card" hidden>
|
||||||
|
<strong>Traditional Meaning</strong>
|
||||||
|
<div id="tarot-detail-meaning" class="planet-text">--</div>
|
||||||
|
</div>
|
||||||
|
<div class="tarot-meta-card">
|
||||||
|
<strong>Keywords</strong>
|
||||||
|
<div id="tarot-detail-keywords" class="tarot-keywords"></div>
|
||||||
|
</div>
|
||||||
|
<div id="tarot-meta-planet-card" class="tarot-meta-card" hidden>
|
||||||
|
<strong>Planet</strong>
|
||||||
|
<ul id="tarot-detail-planet" class="tarot-relations"></ul>
|
||||||
|
</div>
|
||||||
|
<div id="tarot-meta-element-card" class="tarot-meta-card" hidden>
|
||||||
|
<strong>Element</strong>
|
||||||
|
<ul id="tarot-detail-element" class="tarot-relations"></ul>
|
||||||
|
</div>
|
||||||
|
<div id="tarot-meta-tetragrammaton-card" class="tarot-meta-card" hidden>
|
||||||
|
<strong>Tetragrammaton</strong>
|
||||||
|
<ul id="tarot-detail-tetragrammaton" class="tarot-relations"></ul>
|
||||||
|
</div>
|
||||||
|
<div id="tarot-meta-zodiac-card" class="tarot-meta-card" hidden>
|
||||||
|
<strong>Zodiac</strong>
|
||||||
|
<ul id="tarot-detail-zodiac" class="tarot-relations"></ul>
|
||||||
|
</div>
|
||||||
|
<div id="tarot-meta-courtdate-card" class="tarot-meta-card" hidden>
|
||||||
|
<strong>Court Date Window</strong>
|
||||||
|
<ul id="tarot-detail-courtdate" class="tarot-relations"></ul>
|
||||||
|
</div>
|
||||||
|
<div id="tarot-meta-hebrew-card" class="tarot-meta-card" hidden>
|
||||||
|
<strong>Hebrew Letter</strong>
|
||||||
|
<ul id="tarot-detail-hebrew" class="tarot-relations"></ul>
|
||||||
|
</div>
|
||||||
|
<div id="tarot-meta-cube-card" class="tarot-meta-card" hidden>
|
||||||
|
<strong>Cube of Space</strong>
|
||||||
|
<ul id="tarot-detail-cube" class="tarot-relations"></ul>
|
||||||
|
</div>
|
||||||
|
<div id="tarot-meta-calendar-card" class="tarot-meta-card" hidden>
|
||||||
|
<strong>Calendar Months</strong>
|
||||||
|
<ul id="tarot-detail-calendar" class="tarot-relations"></ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="tarot-kab-path" class="tarot-kab-path-card" hidden></div>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="tarot-spread-view" hidden>
|
||||||
|
<div class="tarot-spread-toolbar">
|
||||||
|
<button id="tarot-spread-back" class="tarot-spread-back-btn" type="button">← Card Browser</button>
|
||||||
|
<div class="tarot-spread-type-controls" role="group" aria-label="Spread type">
|
||||||
|
<button id="tarot-spread-btn-three" class="tarot-spread-type-btn" type="button">3 Card</button>
|
||||||
|
<button id="tarot-spread-btn-celtic" class="tarot-spread-type-btn" type="button">Celtic Cross</button>
|
||||||
|
</div>
|
||||||
|
<button id="tarot-spread-redraw" class="tarot-spread-redraw-btn" type="button">⟳ Redraw</button>
|
||||||
|
</div>
|
||||||
|
<div id="tarot-spread-meanings" class="tarot-spread-meanings" aria-live="polite"></div>
|
||||||
|
<div id="tarot-spread-board" class="tarot-spread-board" aria-live="polite"></div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section id="planet-section" hidden>
|
||||||
|
<div class="planet-layout">
|
||||||
|
<aside class="planet-list-panel">
|
||||||
|
<div class="planet-list-header">
|
||||||
|
<strong>Planet Database</strong>
|
||||||
|
<span id="planet-card-count" class="planet-list-count">--</span>
|
||||||
|
</div>
|
||||||
|
<div class="dataset-search-wrap">
|
||||||
|
<input id="planet-search-input" class="dataset-search-input" type="search" placeholder="Search planets, class, correspondence" aria-label="Search planets">
|
||||||
|
<button id="planet-search-clear" class="dataset-search-clear" type="button" aria-label="Clear planet search" disabled>×</button>
|
||||||
|
</div>
|
||||||
|
<div id="planet-card-list" class="planet-card-list" role="listbox" aria-label="Planets"></div>
|
||||||
|
</aside>
|
||||||
|
<section class="planet-detail-panel" aria-live="polite">
|
||||||
|
<div class="planet-detail-heading">
|
||||||
|
<h2 id="planet-detail-name">--</h2>
|
||||||
|
<div id="planet-detail-type" class="planet-detail-type">--</div>
|
||||||
|
<div id="planet-detail-summary" class="planet-detail-summary">--</div>
|
||||||
|
</div>
|
||||||
|
<div class="planet-meta-grid">
|
||||||
|
<div class="planet-meta-card">
|
||||||
|
<strong>Science Facts</strong>
|
||||||
|
<div id="planet-detail-facts" class="planet-facts-list"></div>
|
||||||
|
</div>
|
||||||
|
<div class="planet-meta-card">
|
||||||
|
<strong>Atmosphere</strong>
|
||||||
|
<p id="planet-detail-atmosphere" class="planet-text">--</p>
|
||||||
|
</div>
|
||||||
|
<div class="planet-meta-card">
|
||||||
|
<strong>Notable Facts</strong>
|
||||||
|
<ul id="planet-detail-notable" class="planet-notes"></ul>
|
||||||
|
</div>
|
||||||
|
<div class="planet-meta-card">
|
||||||
|
<strong>Tarot / Weekday Relation</strong>
|
||||||
|
<div id="planet-detail-correspondence" class="planet-text">--</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section id="cycles-section" hidden>
|
||||||
|
<div class="planet-layout">
|
||||||
|
<aside class="planet-list-panel">
|
||||||
|
<div class="planet-list-header">
|
||||||
|
<strong>Cycles Dataset</strong>
|
||||||
|
<span id="cycles-count" class="planet-list-count">--</span>
|
||||||
|
</div>
|
||||||
|
<div class="dataset-search-wrap">
|
||||||
|
<input id="cycles-search-input" class="dataset-search-input" type="search" placeholder="Search cycles, periods, categories" aria-label="Search astronomy cycles">
|
||||||
|
<button id="cycles-search-clear" class="dataset-search-clear" type="button" aria-label="Clear cycles search" disabled>×</button>
|
||||||
|
</div>
|
||||||
|
<div id="cycles-list" class="planet-card-list" role="listbox" aria-label="Astronomy cycles"></div>
|
||||||
|
</aside>
|
||||||
|
<section class="planet-detail-panel" aria-live="polite">
|
||||||
|
<div class="planet-detail-heading">
|
||||||
|
<h2 id="cycles-detail-name">--</h2>
|
||||||
|
<div id="cycles-detail-type" class="planet-detail-type">Select a cycle to explore</div>
|
||||||
|
<div id="cycles-detail-summary" class="planet-detail-summary">--</div>
|
||||||
|
</div>
|
||||||
|
<div id="cycles-detail-body" class="planet-meta-grid"></div>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section id="elements-section" hidden>
|
||||||
|
<div class="planet-layout">
|
||||||
|
<aside class="planet-list-panel">
|
||||||
|
<div class="planet-list-header">
|
||||||
|
<strong>Classical Elements</strong>
|
||||||
|
<span id="elements-count" class="planet-list-count">--</span>
|
||||||
|
</div>
|
||||||
|
<div class="dataset-search-wrap">
|
||||||
|
<input id="elements-search-input" class="dataset-search-input" type="search" placeholder="Search elements, symbols, tarot ace" aria-label="Search classical elements">
|
||||||
|
<button id="elements-search-clear" class="dataset-search-clear" type="button" aria-label="Clear elements search" disabled>×</button>
|
||||||
|
</div>
|
||||||
|
<div id="elements-list" class="planet-card-list" role="listbox" aria-label="Classical elements"></div>
|
||||||
|
</aside>
|
||||||
|
<section class="planet-detail-panel" aria-live="polite">
|
||||||
|
<div class="planet-detail-heading">
|
||||||
|
<h2 id="elements-detail-name">--</h2>
|
||||||
|
<div id="elements-detail-sub" class="planet-detail-type">Select an element to explore</div>
|
||||||
|
</div>
|
||||||
|
<div id="elements-detail-body"></div>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section id="iching-section" hidden>
|
||||||
|
<div class="planet-layout">
|
||||||
|
<aside class="planet-list-panel">
|
||||||
|
<div class="planet-list-header">
|
||||||
|
<strong>I Ching Database</strong>
|
||||||
|
<span id="iching-card-count" class="planet-list-count">--</span>
|
||||||
|
</div>
|
||||||
|
<div class="dataset-search-wrap">
|
||||||
|
<input id="iching-search-input" class="dataset-search-input" type="search" placeholder="Search hexagrams, trigrams, keywords" aria-label="Search I Ching hexagrams">
|
||||||
|
<button id="iching-search-clear" class="dataset-search-clear" type="button" aria-label="Clear I Ching search" disabled>×</button>
|
||||||
|
</div>
|
||||||
|
<div id="iching-card-list" class="planet-card-list" role="listbox" aria-label="I Ching hexagrams"></div>
|
||||||
|
</aside>
|
||||||
|
<section class="planet-detail-panel" aria-live="polite">
|
||||||
|
<div class="planet-detail-heading">
|
||||||
|
<h2 id="iching-detail-name">--</h2>
|
||||||
|
<div id="iching-detail-type" class="planet-detail-type">--</div>
|
||||||
|
<div id="iching-detail-summary" class="planet-detail-summary">--</div>
|
||||||
|
</div>
|
||||||
|
<div class="planet-meta-grid">
|
||||||
|
<div class="planet-meta-card">
|
||||||
|
<strong>Oracle Text</strong>
|
||||||
|
<p id="iching-detail-judgement" class="planet-text">--</p>
|
||||||
|
<p id="iching-detail-image" class="planet-text">--</p>
|
||||||
|
</div>
|
||||||
|
<div class="planet-meta-card">
|
||||||
|
<strong>Binary Pattern</strong>
|
||||||
|
<p id="iching-detail-binary" class="planet-text">--</p>
|
||||||
|
<div id="iching-detail-line" class="iching-diagram">--</div>
|
||||||
|
</div>
|
||||||
|
<div class="planet-meta-card">
|
||||||
|
<strong>Keywords</strong>
|
||||||
|
<div id="iching-detail-keywords" class="tarot-keywords"></div>
|
||||||
|
</div>
|
||||||
|
<div class="planet-meta-card">
|
||||||
|
<strong>Planetary Influence</strong>
|
||||||
|
<p id="iching-detail-planet" class="planet-text">--</p>
|
||||||
|
</div>
|
||||||
|
<div class="planet-meta-card">
|
||||||
|
<strong>Tarot Correspondences</strong>
|
||||||
|
<p id="iching-detail-tarot" class="planet-text iching-tarot-text">--</p>
|
||||||
|
</div>
|
||||||
|
<div class="planet-meta-card">
|
||||||
|
<strong>Calendar Months</strong>
|
||||||
|
<div id="iching-detail-calendar" class="alpha-nav-btns"></div>
|
||||||
|
</div>
|
||||||
|
<div class="planet-meta-card">
|
||||||
|
<strong>Trigrams</strong>
|
||||||
|
<div id="iching-detail-trigrams" class="iching-trigram-grid"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="astronomy-section" hidden>
|
||||||
|
<div class="kabbalah-placeholder">
|
||||||
|
<div class="kabbalah-placeholder-card">
|
||||||
|
<strong>Astronomy</strong>
|
||||||
|
<div class="planet-text">This Astronomy landing page is intentionally blank for now. Use the Astronomy menu to open Planet, Zodiac, or Natal Chart.</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="natal-section" hidden>
|
||||||
|
<div class="kabbalah-placeholder">
|
||||||
|
<div class="kabbalah-placeholder-card">
|
||||||
|
<strong>Natal Chart</strong>
|
||||||
|
<div class="planet-text">Natal chart scaffolding and anchor summary.</div>
|
||||||
|
<pre id="natal-chart-summary" class="planet-text natal-chart-summary">Natal Chart Scaffold: --</pre>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="quiz-section" hidden>
|
||||||
|
<div class="quiz-layout">
|
||||||
|
<div class="quiz-card">
|
||||||
|
<div class="planet-detail-heading">
|
||||||
|
<h2>Correspondence Quiz</h2>
|
||||||
|
<div class="planet-detail-type">Random correspondence questions with real-value options only</div>
|
||||||
|
</div>
|
||||||
|
<div class="quiz-toolbar">
|
||||||
|
<label class="quiz-category-label" for="quiz-category">Category</label>
|
||||||
|
<select id="quiz-category" class="quiz-category-select" aria-label="Quiz category">
|
||||||
|
<option value="random">Random</option>
|
||||||
|
<option value="all">All</option>
|
||||||
|
</select>
|
||||||
|
<label class="quiz-difficulty-label" for="quiz-difficulty">Difficulty</label>
|
||||||
|
<select id="quiz-difficulty" class="quiz-difficulty-select" aria-label="Quiz difficulty">
|
||||||
|
<option value="easy">Easy</option>
|
||||||
|
<option value="normal" selected>Normal</option>
|
||||||
|
<option value="hard">Hard</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="quiz-score-grid" aria-live="polite">
|
||||||
|
<div class="quiz-score-item">
|
||||||
|
<div class="quiz-score-label">Correct</div>
|
||||||
|
<div id="quiz-score-correct" class="quiz-score-value">0</div>
|
||||||
|
</div>
|
||||||
|
<div class="quiz-score-item">
|
||||||
|
<div class="quiz-score-label">Answered</div>
|
||||||
|
<div id="quiz-score-answered" class="quiz-score-value">0</div>
|
||||||
|
</div>
|
||||||
|
<div class="quiz-score-item">
|
||||||
|
<div class="quiz-score-label">Accuracy</div>
|
||||||
|
<div id="quiz-score-accuracy" class="quiz-score-value">0%</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="quiz-card" aria-live="polite">
|
||||||
|
<div id="quiz-question-type" class="planet-detail-type">--</div>
|
||||||
|
<p id="quiz-question" class="quiz-question">Loading question…</p>
|
||||||
|
<div id="quiz-options" class="quiz-options"></div>
|
||||||
|
<div id="quiz-feedback" class="planet-text">Choose the best answer.</div>
|
||||||
|
<div class="quiz-actions">
|
||||||
|
<button id="quiz-reset" class="settings-trigger" type="button">Reset Score</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="kabbalah-section" hidden>
|
||||||
|
<div class="kabbalah-placeholder">
|
||||||
|
<div class="kabbalah-placeholder-card">
|
||||||
|
<strong>Kabbalah</strong>
|
||||||
|
<div class="planet-text">This Kabbalah landing page is intentionally blank for now. Use the Kabbalah menu to open Tree or Cube.</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="kabbalah-tree-section" hidden>
|
||||||
|
<div class="kab-layout">
|
||||||
|
<aside class="kab-tree-panel">
|
||||||
|
<div class="planet-list-header">
|
||||||
|
<strong>Tree of Life</strong>
|
||||||
|
<span class="planet-list-count">32 Paths</span>
|
||||||
|
</div>
|
||||||
|
<div class="kab-path-toggle-wrap">
|
||||||
|
<label class="kab-path-toggle-control" for="kab-path-letter-toggle">
|
||||||
|
<input id="kab-path-letter-toggle" type="checkbox" checked>
|
||||||
|
<span>Show path letters</span>
|
||||||
|
</label>
|
||||||
|
<label class="kab-path-toggle-control" for="kab-path-number-toggle">
|
||||||
|
<input id="kab-path-number-toggle" type="checkbox" checked>
|
||||||
|
<span>Show path numbers</span>
|
||||||
|
</label>
|
||||||
|
<label class="kab-path-toggle-control" for="kab-path-tarot-toggle">
|
||||||
|
<input id="kab-path-tarot-toggle" type="checkbox">
|
||||||
|
<span>Show Tarot cards on paths</span>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div id="kab-tree-container" class="kab-tree-container"></div>
|
||||||
|
</aside>
|
||||||
|
<section class="kab-detail-panel" aria-live="polite">
|
||||||
|
<div class="planet-detail-heading">
|
||||||
|
<h2 id="kab-detail-name">Kabbalah Tree of Life</h2>
|
||||||
|
<div id="kab-detail-sub" class="planet-detail-type">Select a sephira or path to explore</div>
|
||||||
|
</div>
|
||||||
|
<div id="kab-detail-body" class="planet-meta-grid"></div>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="alphabet-section" hidden>
|
||||||
|
<section class="alpha-special-top" aria-label="Alphabet special tools">
|
||||||
|
<div class="planet-meta-card alpha-gematria-card">
|
||||||
|
<strong>Gematria Calculator</strong>
|
||||||
|
<div class="alpha-gematria-controls">
|
||||||
|
<label class="alpha-gematria-field" for="alpha-gematria-cipher">
|
||||||
|
<span>Cipher</span>
|
||||||
|
<select id="alpha-gematria-cipher" class="alpha-gematria-cipher" aria-label="Gematria cipher"></select>
|
||||||
|
</label>
|
||||||
|
<label class="alpha-gematria-field" for="alpha-gematria-input">
|
||||||
|
<span>Text</span>
|
||||||
|
<textarea id="alpha-gematria-input" class="alpha-gematria-input" placeholder="Type or paste text"></textarea>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div id="alpha-gematria-result" class="alpha-gematria-result">Total: --</div>
|
||||||
|
<div id="alpha-gematria-breakdown" class="alpha-gematria-breakdown">Type text to calculate.</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<div class="planet-layout">
|
||||||
|
<aside class="planet-list-panel">
|
||||||
|
<div class="planet-list-header">
|
||||||
|
<strong>Alphabet Database</strong>
|
||||||
|
<span id="alpha-letter-count" class="planet-list-count">--</span>
|
||||||
|
</div>
|
||||||
|
<div class="alpha-tabs">
|
||||||
|
<button id="alpha-tab-all" class="alpha-tab-btn alpha-tab-active" data-alpha="all">All</button>
|
||||||
|
<button id="alpha-tab-hebrew" class="alpha-tab-btn" data-alpha="hebrew">Hebrew</button>
|
||||||
|
<button id="alpha-tab-greek" class="alpha-tab-btn" data-alpha="greek">Greek</button>
|
||||||
|
<button id="alpha-tab-english" class="alpha-tab-btn" data-alpha="english">English</button>
|
||||||
|
<button id="alpha-tab-arabic" class="alpha-tab-btn" data-alpha="arabic">Arabic</button>
|
||||||
|
<button id="alpha-tab-enochian" class="alpha-tab-btn" data-alpha="enochian">Enochian</button>
|
||||||
|
</div>
|
||||||
|
<div class="dataset-search-wrap alpha-filter-search-wrap">
|
||||||
|
<input id="alpha-search-input" class="dataset-search-input" type="search" placeholder="Search letters, meanings, transliteration, or position (e.g., 13)" aria-label="Search alphabet letters">
|
||||||
|
<button id="alpha-search-clear" class="dataset-search-clear" type="button" aria-label="Clear alphabet search" disabled>×</button>
|
||||||
|
</div>
|
||||||
|
<div class="alpha-filter-type-wrap">
|
||||||
|
<label for="alpha-type-filter">Class</label>
|
||||||
|
<select id="alpha-type-filter" class="alpha-type-filter" aria-label="Filter by letter class">
|
||||||
|
<option value="">All</option>
|
||||||
|
<option value="mother">Mother</option>
|
||||||
|
<option value="double">Double</option>
|
||||||
|
<option value="simple">Simple</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div id="alpha-letter-list" class="planet-card-list" role="listbox" aria-label="Letters"></div>
|
||||||
|
</aside>
|
||||||
|
<section class="planet-detail-panel" aria-live="polite">
|
||||||
|
<div class="planet-detail-heading">
|
||||||
|
<h2 id="alpha-detail-name">--</h2>
|
||||||
|
<div id="alpha-detail-sub" class="planet-detail-type">Select a letter to explore</div>
|
||||||
|
</div>
|
||||||
|
<div id="alpha-detail-body" class="planet-meta-grid"></div>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="cube-section" hidden>
|
||||||
|
<div class="kab-layout">
|
||||||
|
<aside class="kab-tree-panel">
|
||||||
|
<div class="planet-list-header">
|
||||||
|
<strong>Cube of Space</strong>
|
||||||
|
<span class="planet-list-count">6 Walls · 12 Edges</span>
|
||||||
|
</div>
|
||||||
|
<div id="cube-rotation-controls" class="cube-rotation-controls" aria-label="Rotate cube">
|
||||||
|
<button id="cube-rotate-left" class="cube-rotation-btn" type="button" title="Rotate left">←</button>
|
||||||
|
<button id="cube-rotate-right" class="cube-rotation-btn" type="button" title="Rotate right">→</button>
|
||||||
|
<button id="cube-rotate-up" class="cube-rotation-btn" type="button" title="Rotate up">↑</button>
|
||||||
|
<button id="cube-rotate-down" class="cube-rotation-btn" type="button" title="Rotate down">↓</button>
|
||||||
|
<button id="cube-rotate-reset" class="cube-rotation-btn" type="button" title="Reset rotation">Reset</button>
|
||||||
|
<div class="cube-marker-mode-control">
|
||||||
|
<label for="cube-marker-mode" class="cube-marker-mode-label">Marker display</label>
|
||||||
|
<select id="cube-marker-mode" class="cube-marker-mode-select" aria-label="Cube marker display mode">
|
||||||
|
<option value="both" selected>Letter + Astrology</option>
|
||||||
|
<option value="letter">Letter only</option>
|
||||||
|
<option value="astro">Astrology only</option>
|
||||||
|
<option value="tarot">Tarot Cards</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<label class="cube-connector-toggle-control" for="cube-connector-toggle">
|
||||||
|
<input id="cube-connector-toggle" type="checkbox" checked>
|
||||||
|
<span>Show mother connector lines</span>
|
||||||
|
</label>
|
||||||
|
<label class="cube-primal-toggle-control" for="cube-primal-toggle">
|
||||||
|
<input id="cube-primal-toggle" type="checkbox" checked>
|
||||||
|
<span>Show primal point</span>
|
||||||
|
</label>
|
||||||
|
<div id="cube-rotation-readout" class="cube-rotation-readout">X 0° · Y 0°</div>
|
||||||
|
</div>
|
||||||
|
<div id="cube-view-container" class="kab-tree-container"></div>
|
||||||
|
</aside>
|
||||||
|
<section class="kab-detail-panel" aria-live="polite">
|
||||||
|
<div class="planet-detail-heading">
|
||||||
|
<h2 id="cube-detail-name">Cube of Space</h2>
|
||||||
|
<div id="cube-detail-sub" class="planet-detail-type">Select a wall or edge to explore</div>
|
||||||
|
</div>
|
||||||
|
<div id="cube-detail-body" class="planet-meta-grid"></div>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="zodiac-section" hidden>
|
||||||
|
<div class="planet-layout">
|
||||||
|
<aside class="planet-list-panel">
|
||||||
|
<div class="planet-list-header">
|
||||||
|
<strong>Zodiac Signs</strong>
|
||||||
|
<span id="zodiac-sign-count" class="planet-list-count">--</span>
|
||||||
|
</div>
|
||||||
|
<div class="dataset-search-wrap">
|
||||||
|
<input id="zodiac-search-input" class="dataset-search-input" type="search" placeholder="Search signs, element, modality" aria-label="Search zodiac signs">
|
||||||
|
<button id="zodiac-search-clear" class="dataset-search-clear" type="button" aria-label="Clear zodiac search" disabled>×</button>
|
||||||
|
</div>
|
||||||
|
<div id="zodiac-sign-list" class="planet-card-list" role="listbox" aria-label="Zodiac signs"></div>
|
||||||
|
</aside>
|
||||||
|
<section class="planet-detail-panel" aria-live="polite">
|
||||||
|
<div class="planet-detail-heading">
|
||||||
|
<h2 id="zodiac-detail-name" class="zod-detail-name">--</h2>
|
||||||
|
<div id="zodiac-detail-sub" class="planet-detail-type">Select a sign to explore</div>
|
||||||
|
</div>
|
||||||
|
<div id="zodiac-detail-body"></div>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="gods-section" hidden>
|
||||||
|
<div class="planet-layout">
|
||||||
|
<aside class="planet-list-panel">
|
||||||
|
<div class="planet-list-header">
|
||||||
|
<strong>Divine Pantheons</strong>
|
||||||
|
<span id="gods-count" class="planet-list-count">--</span>
|
||||||
|
</div>
|
||||||
|
<div id="gods-tabs" class="gods-tabs"></div>
|
||||||
|
<div class="dataset-search-wrap">
|
||||||
|
<input id="gods-search-input" class="dataset-search-input" type="search" placeholder="Search gods, sephiroth, paths…" aria-label="Search divine names">
|
||||||
|
<button id="gods-search-clear" class="dataset-search-clear" type="button" aria-label="Clear search" disabled>×</button>
|
||||||
|
</div>
|
||||||
|
<div id="gods-list" class="planet-card-list" role="listbox" aria-label="Divine correspondences"></div>
|
||||||
|
</aside>
|
||||||
|
<section class="planet-detail-panel" aria-live="polite">
|
||||||
|
<div class="planet-detail-heading">
|
||||||
|
<h2 id="gods-detail-name">--</h2>
|
||||||
|
<div id="gods-detail-sub" class="planet-detail-type">Select a deity to explore</div>
|
||||||
|
</div>
|
||||||
|
<div id="gods-detail-body"></div>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="enochian-section" hidden>
|
||||||
|
<div class="planet-layout">
|
||||||
|
<aside class="planet-list-panel">
|
||||||
|
<div class="planet-list-header">
|
||||||
|
<strong>Enochian Tablets</strong>
|
||||||
|
<span id="enochian-count" class="planet-list-count">--</span>
|
||||||
|
</div>
|
||||||
|
<div class="dataset-search-wrap">
|
||||||
|
<input id="enochian-search-input" class="dataset-search-input" type="search" placeholder="Search tablets, elements, letters" aria-label="Search Enochian tablets">
|
||||||
|
<button id="enochian-search-clear" class="dataset-search-clear" type="button" aria-label="Clear Enochian search" disabled>×</button>
|
||||||
|
</div>
|
||||||
|
<div id="enochian-list" class="planet-card-list" role="listbox" aria-label="Enochian tablets"></div>
|
||||||
|
</aside>
|
||||||
|
<section class="planet-detail-panel" aria-live="polite">
|
||||||
|
<div class="planet-detail-heading">
|
||||||
|
<h2 id="enochian-detail-name">--</h2>
|
||||||
|
<div id="enochian-detail-sub" class="planet-detail-type">Select a tablet to explore</div>
|
||||||
|
</div>
|
||||||
|
<div id="enochian-detail-body"></div>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="numbers-section" hidden>
|
||||||
|
<div class="kab-layout numbers-layout">
|
||||||
|
<aside id="numbers-special-panel" class="numbers-special-panel" aria-label="4 card arrangement"></aside>
|
||||||
|
<div class="planet-layout numbers-main-layout">
|
||||||
|
<aside class="planet-list-panel">
|
||||||
|
<div class="planet-list-header">
|
||||||
|
<strong>Numbers (Digital Root)</strong>
|
||||||
|
<span id="numbers-count" class="planet-list-count">--</span>
|
||||||
|
</div>
|
||||||
|
<div id="numbers-list" class="planet-card-list" role="listbox" aria-label="Numbers 0 through 9"></div>
|
||||||
|
</aside>
|
||||||
|
<section class="planet-detail-panel" aria-live="polite">
|
||||||
|
<div class="planet-detail-heading">
|
||||||
|
<h2 id="numbers-detail-name">--</h2>
|
||||||
|
<div id="numbers-detail-type" class="planet-detail-type">--</div>
|
||||||
|
<div id="numbers-detail-summary" class="planet-detail-summary">--</div>
|
||||||
|
</div>
|
||||||
|
<div id="numbers-detail-body" class="numbers-detail-body"></div>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<div id="now-panel">
|
||||||
|
<iframe id="now-sky-layer" aria-hidden="true" scrolling="no" allow="geolocation"></iframe>
|
||||||
|
<div class="now-section">
|
||||||
|
<div class="now-title">Current Planetary Hour</div>
|
||||||
|
<img id="now-hour-card" class="now-card" alt="Current planetary hour card" />
|
||||||
|
<div id="now-hour" class="now-primary now-primary-hour">--</div>
|
||||||
|
<div id="now-hour-tarot" class="now-tarot">--</div>
|
||||||
|
<div class="now-countdown-row">
|
||||||
|
<span id="now-countdown" class="now-countdown-value">--</span>
|
||||||
|
<span id="now-hour-next" class="now-countdown-next">> --</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="now-section">
|
||||||
|
<div class="now-title">Moon Phase</div>
|
||||||
|
<img id="now-moon-card" class="now-card" alt="Current moon phase card" />
|
||||||
|
<div id="now-moon" class="now-primary now-primary-moon">--</div>
|
||||||
|
<div id="now-moon-tarot" class="now-tarot">--</div>
|
||||||
|
<div class="now-countdown-row">
|
||||||
|
<span id="now-moon-countdown" class="now-countdown-value">--</span>
|
||||||
|
<span id="now-moon-next" class="now-countdown-next">> --</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="now-section">
|
||||||
|
<div class="now-title">Current Decan (Sun)</div>
|
||||||
|
<img id="now-decan-card" class="now-card" alt="Current decan card" />
|
||||||
|
<div id="now-decan" class="now-primary now-primary-decan">--</div>
|
||||||
|
<div id="now-decan-tarot" class="now-tarot">--</div>
|
||||||
|
<div class="now-countdown-row">
|
||||||
|
<span id="now-decan-countdown" class="now-countdown-value">--</span>
|
||||||
|
<span id="now-decan-next" class="now-countdown-next">> --</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="now-stats-section">
|
||||||
|
<div class="now-stats-title">Current Planet Positions & Sabian Symbol</div>
|
||||||
|
<div id="now-stats-sabian" class="now-stats-sabian">--</div>
|
||||||
|
<div id="now-stats-planets" class="now-stats-planets">--</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="month-strip" aria-hidden="true"></div>
|
||||||
|
<div id="calendar"></div>
|
||||||
|
<script src="node_modules/@toast-ui/calendar/dist/toastui-calendar.min.js"></script>
|
||||||
|
<script src="node_modules/suncalc/suncalc.js"></script>
|
||||||
|
<script src="node_modules/astronomy-engine/astronomy.browser.min.js"></script>
|
||||||
|
<script src="app/astro-calcs.js"></script>
|
||||||
|
<script src="app/data-service.js"></script>
|
||||||
|
<script src="app/calendar-events.js"></script>
|
||||||
|
<script src="app/card-images.js"></script>
|
||||||
|
<script src="app/ui-now.js"></script>
|
||||||
|
<script src="app/ui-natal.js"></script>
|
||||||
|
<script src="app/tarot-database.js"></script>
|
||||||
|
<script src="app/ui-calendar.js"></script>
|
||||||
|
<script src="app/ui-holidays.js"></script>
|
||||||
|
<script src="app/ui-tarot.js"></script>
|
||||||
|
<script src="app/ui-planets.js"></script>
|
||||||
|
<script src="app/ui-cycles.js"></script>
|
||||||
|
<script src="app/ui-elements.js"></script>
|
||||||
|
<script src="app/ui-iching.js"></script>
|
||||||
|
<script src="app/ui-kabbalah.js"></script>
|
||||||
|
<script src="app/ui-cube.js"></script>
|
||||||
|
<script src="app/ui-alphabet.js"></script>
|
||||||
|
<script src="app/ui-zodiac.js"></script>
|
||||||
|
<script src="app/ui-quiz.js"></script>
|
||||||
|
<script src="app/quiz-calendars.js"></script>
|
||||||
|
<script src="app/ui-gods.js"></script>
|
||||||
|
<script src="app/ui-enochian.js"></script>
|
||||||
|
<script src="app.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||