2026-03-07 05:17:50 -08:00
|
|
|
(function () {
|
|
|
|
|
"use strict";
|
|
|
|
|
|
|
|
|
|
const VALID_SECTIONS = new Set([
|
|
|
|
|
"home",
|
2026-03-09 03:07:02 -07:00
|
|
|
"timeline",
|
2026-03-07 05:17:50 -08:00
|
|
|
"calendar",
|
|
|
|
|
"holidays",
|
|
|
|
|
"tarot",
|
|
|
|
|
"astronomy",
|
|
|
|
|
"planets",
|
|
|
|
|
"cycles",
|
|
|
|
|
"natal",
|
|
|
|
|
"elements",
|
|
|
|
|
"iching",
|
|
|
|
|
"kabbalah",
|
|
|
|
|
"kabbalah-tree",
|
|
|
|
|
"cube",
|
|
|
|
|
"alphabet",
|
2026-03-09 03:07:02 -07:00
|
|
|
"alphabet-letters",
|
2026-03-09 23:27:03 -07:00
|
|
|
"alphabet-text",
|
2026-03-07 05:17:50 -08:00
|
|
|
"numbers",
|
|
|
|
|
"zodiac",
|
|
|
|
|
"quiz",
|
|
|
|
|
"gods",
|
|
|
|
|
"enochian"
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
let activeSection = "home";
|
|
|
|
|
let config = {
|
|
|
|
|
elements: {},
|
|
|
|
|
ensure: {},
|
|
|
|
|
getReferenceData: () => null,
|
|
|
|
|
getMagickDataset: () => null,
|
|
|
|
|
calendarVisualsUi: null,
|
|
|
|
|
tarotSpreadUi: null,
|
|
|
|
|
settingsUi: null,
|
|
|
|
|
homeUi: null,
|
|
|
|
|
calendar: null
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
function setHidden(element, hidden) {
|
|
|
|
|
if (element) {
|
|
|
|
|
element.hidden = hidden;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function setPressed(element, pressed) {
|
|
|
|
|
if (element) {
|
|
|
|
|
element.setAttribute("aria-pressed", pressed ? "true" : "false");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function toggleActive(element, active) {
|
|
|
|
|
if (element) {
|
|
|
|
|
element.classList.toggle("is-active", active);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function getReferenceData() {
|
|
|
|
|
return config.getReferenceData?.() || null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function getMagickDataset() {
|
|
|
|
|
return config.getMagickDataset?.() || null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function renderHomeFallback() {
|
|
|
|
|
requestAnimationFrame(() => {
|
|
|
|
|
config.calendar?.render?.();
|
|
|
|
|
config.calendarVisualsUi?.updateMonthStrip?.();
|
|
|
|
|
config.homeUi?.syncNowPanelTheme?.(new Date());
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function setActiveSection(nextSection) {
|
|
|
|
|
const normalized = VALID_SECTIONS.has(nextSection) ? nextSection : "home";
|
|
|
|
|
activeSection = normalized;
|
|
|
|
|
|
|
|
|
|
const elements = config.elements || {};
|
|
|
|
|
const ensure = config.ensure || {};
|
|
|
|
|
const referenceData = getReferenceData();
|
|
|
|
|
const magickDataset = getMagickDataset();
|
|
|
|
|
|
|
|
|
|
const isHomeOpen = activeSection === "home";
|
2026-03-09 03:07:02 -07:00
|
|
|
const isTimelineOpen = activeSection === "timeline";
|
2026-03-07 05:17:50 -08:00
|
|
|
const isCalendarOpen = activeSection === "calendar";
|
|
|
|
|
const isHolidaysOpen = activeSection === "holidays";
|
2026-03-09 03:07:02 -07:00
|
|
|
const isCalendarMenuOpen = isTimelineOpen || isCalendarOpen || isHolidaysOpen;
|
2026-03-07 05:17:50 -08:00
|
|
|
const isTarotOpen = activeSection === "tarot";
|
|
|
|
|
const isAstronomyOpen = activeSection === "astronomy";
|
|
|
|
|
const isPlanetOpen = activeSection === "planets";
|
|
|
|
|
const isCyclesOpen = activeSection === "cycles";
|
|
|
|
|
const isNatalOpen = activeSection === "natal";
|
|
|
|
|
const isZodiacOpen = activeSection === "zodiac";
|
|
|
|
|
const isAstronomyMenuOpen = isAstronomyOpen || isPlanetOpen || isCyclesOpen || isZodiacOpen || isNatalOpen;
|
|
|
|
|
const isElementsOpen = activeSection === "elements";
|
|
|
|
|
const isIChingOpen = activeSection === "iching";
|
|
|
|
|
const isKabbalahOpen = activeSection === "kabbalah";
|
|
|
|
|
const isKabbalahTreeOpen = activeSection === "kabbalah-tree";
|
|
|
|
|
const isCubeOpen = activeSection === "cube";
|
|
|
|
|
const isKabbalahMenuOpen = isKabbalahOpen || isKabbalahTreeOpen || isCubeOpen;
|
|
|
|
|
const isAlphabetOpen = activeSection === "alphabet";
|
2026-03-09 03:07:02 -07:00
|
|
|
const isAlphabetLettersOpen = activeSection === "alphabet-letters";
|
2026-03-09 23:27:03 -07:00
|
|
|
const isAlphabetTextOpen = activeSection === "alphabet-text";
|
|
|
|
|
const isAlphabetMenuOpen = isAlphabetOpen || isAlphabetLettersOpen || isAlphabetTextOpen;
|
2026-03-07 05:17:50 -08:00
|
|
|
const isNumbersOpen = activeSection === "numbers";
|
|
|
|
|
const isQuizOpen = activeSection === "quiz";
|
|
|
|
|
const isGodsOpen = activeSection === "gods";
|
|
|
|
|
const isEnochianOpen = activeSection === "enochian";
|
|
|
|
|
|
2026-03-09 03:07:02 -07:00
|
|
|
setHidden(elements.timelineSectionEl, !isTimelineOpen);
|
2026-03-07 05:17:50 -08:00
|
|
|
setHidden(elements.calendarSectionEl, !isCalendarOpen);
|
|
|
|
|
setHidden(elements.holidaySectionEl, !isHolidaysOpen);
|
|
|
|
|
setHidden(elements.tarotSectionEl, !isTarotOpen);
|
|
|
|
|
setHidden(elements.astronomySectionEl, !isAstronomyOpen);
|
|
|
|
|
setHidden(elements.planetSectionEl, !isPlanetOpen);
|
|
|
|
|
setHidden(elements.cyclesSectionEl, !isCyclesOpen);
|
|
|
|
|
setHidden(elements.natalSectionEl, !isNatalOpen);
|
|
|
|
|
setHidden(elements.elementsSectionEl, !isElementsOpen);
|
|
|
|
|
setHidden(elements.ichingSectionEl, !isIChingOpen);
|
|
|
|
|
setHidden(elements.kabbalahSectionEl, !isKabbalahOpen);
|
|
|
|
|
setHidden(elements.kabbalahTreeSectionEl, !isKabbalahTreeOpen);
|
|
|
|
|
setHidden(elements.cubeSectionEl, !isCubeOpen);
|
|
|
|
|
setHidden(elements.alphabetSectionEl, !isAlphabetOpen);
|
2026-03-09 03:07:02 -07:00
|
|
|
setHidden(elements.alphabetLettersSectionEl, !isAlphabetLettersOpen);
|
2026-03-09 23:27:03 -07:00
|
|
|
setHidden(elements.alphabetTextSectionEl, !isAlphabetTextOpen);
|
2026-03-07 05:17:50 -08:00
|
|
|
setHidden(elements.numbersSectionEl, !isNumbersOpen);
|
|
|
|
|
setHidden(elements.zodiacSectionEl, !isZodiacOpen);
|
|
|
|
|
setHidden(elements.quizSectionEl, !isQuizOpen);
|
|
|
|
|
setHidden(elements.godsSectionEl, !isGodsOpen);
|
|
|
|
|
setHidden(elements.enochianSectionEl, !isEnochianOpen);
|
|
|
|
|
setHidden(elements.nowPanelEl, !isHomeOpen);
|
|
|
|
|
|
2026-03-09 03:07:02 -07:00
|
|
|
setPressed(elements.openHomeEl, isHomeOpen);
|
2026-03-07 05:17:50 -08:00
|
|
|
setPressed(elements.openCalendarEl, isCalendarMenuOpen);
|
2026-03-09 03:07:02 -07:00
|
|
|
toggleActive(elements.openCalendarTimelineEl, isTimelineOpen);
|
2026-03-07 05:17:50 -08:00
|
|
|
toggleActive(elements.openCalendarMonthsEl, isCalendarOpen);
|
|
|
|
|
toggleActive(elements.openHolidaysEl, isHolidaysOpen);
|
|
|
|
|
setPressed(elements.openTarotEl, isTarotOpen);
|
|
|
|
|
config.tarotSpreadUi?.applyViewState?.();
|
|
|
|
|
setPressed(elements.openAstronomyEl, isAstronomyMenuOpen);
|
|
|
|
|
toggleActive(elements.openPlanetsEl, isPlanetOpen);
|
|
|
|
|
toggleActive(elements.openCyclesEl, isCyclesOpen);
|
|
|
|
|
setPressed(elements.openElementsEl, isElementsOpen);
|
|
|
|
|
setPressed(elements.openIChingEl, isIChingOpen);
|
|
|
|
|
setPressed(elements.openKabbalahEl, isKabbalahMenuOpen);
|
|
|
|
|
toggleActive(elements.openKabbalahTreeEl, isKabbalahTreeOpen);
|
|
|
|
|
toggleActive(elements.openKabbalahCubeEl, isCubeOpen);
|
2026-03-09 03:07:02 -07:00
|
|
|
setPressed(elements.openAlphabetEl, isAlphabetMenuOpen);
|
|
|
|
|
toggleActive(elements.openAlphabetLettersEl, isAlphabetLettersOpen);
|
2026-03-09 23:27:03 -07:00
|
|
|
toggleActive(elements.openAlphabetTextEl, isAlphabetTextOpen);
|
2026-03-07 05:17:50 -08:00
|
|
|
setPressed(elements.openNumbersEl, isNumbersOpen);
|
|
|
|
|
toggleActive(elements.openZodiacEl, isZodiacOpen);
|
|
|
|
|
toggleActive(elements.openNatalEl, isNatalOpen);
|
|
|
|
|
setPressed(elements.openQuizEl, isQuizOpen);
|
|
|
|
|
setPressed(elements.openGodsEl, isGodsOpen);
|
|
|
|
|
setPressed(elements.openEnochianEl, isEnochianOpen);
|
|
|
|
|
|
|
|
|
|
if (!isHomeOpen) {
|
|
|
|
|
config.settingsUi?.closeSettingsPopup?.();
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-09 03:07:02 -07:00
|
|
|
if (isTimelineOpen) {
|
|
|
|
|
renderHomeFallback();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-07 05:17:50 -08:00
|
|
|
if (isCalendarOpen) {
|
|
|
|
|
ensure.ensureCalendarSection?.(referenceData, magickDataset);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (isHolidaysOpen) {
|
|
|
|
|
ensure.ensureHolidaySection?.(referenceData, magickDataset);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (isTarotOpen) {
|
|
|
|
|
if (typeof config.tarotSpreadUi?.handleSectionActivated === "function") {
|
|
|
|
|
config.tarotSpreadUi.handleSectionActivated();
|
|
|
|
|
} else {
|
|
|
|
|
ensure.ensureTarotSection?.(referenceData, magickDataset);
|
|
|
|
|
}
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (isPlanetOpen) {
|
|
|
|
|
ensure.ensurePlanetSection?.(referenceData, magickDataset);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (isCyclesOpen) {
|
|
|
|
|
ensure.ensureCyclesSection?.(referenceData);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (isElementsOpen) {
|
|
|
|
|
ensure.ensureElementsSection?.(magickDataset);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (isIChingOpen) {
|
|
|
|
|
ensure.ensureIChingSection?.(referenceData);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (isKabbalahOpen || isKabbalahTreeOpen) {
|
|
|
|
|
ensure.ensureKabbalahSection?.(magickDataset);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (isCubeOpen) {
|
|
|
|
|
ensure.ensureCubeSection?.(magickDataset, referenceData);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-09 03:07:02 -07:00
|
|
|
if (isAlphabetOpen || isAlphabetLettersOpen) {
|
2026-03-07 05:17:50 -08:00
|
|
|
ensure.ensureAlphabetSection?.(magickDataset, referenceData);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-09 23:27:03 -07:00
|
|
|
if (isAlphabetTextOpen) {
|
|
|
|
|
ensure.ensureAlphabetTextSection?.();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-07 05:17:50 -08:00
|
|
|
if (isNumbersOpen) {
|
|
|
|
|
ensure.ensureNumbersSection?.();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (isZodiacOpen) {
|
|
|
|
|
ensure.ensureZodiacSection?.(referenceData, magickDataset);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (isNatalOpen) {
|
|
|
|
|
ensure.ensureNatalPanel?.(referenceData);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (isQuizOpen) {
|
|
|
|
|
ensure.ensureQuizSection?.(referenceData, magickDataset);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (isGodsOpen) {
|
|
|
|
|
ensure.ensureGodsSection?.(magickDataset, referenceData);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (isEnochianOpen) {
|
|
|
|
|
ensure.ensureEnochianSection?.(magickDataset, referenceData);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-09 03:07:02 -07:00
|
|
|
config.homeUi?.syncNowPanelTheme?.(new Date());
|
2026-03-07 05:17:50 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function getActiveSection() {
|
|
|
|
|
return activeSection;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function init(nextConfig = {}) {
|
|
|
|
|
config = {
|
|
|
|
|
...config,
|
|
|
|
|
...nextConfig,
|
|
|
|
|
elements: {
|
|
|
|
|
...(config.elements || {}),
|
|
|
|
|
...(nextConfig.elements || {})
|
|
|
|
|
},
|
|
|
|
|
ensure: {
|
|
|
|
|
...(config.ensure || {}),
|
|
|
|
|
...(nextConfig.ensure || {})
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
window.TarotSectionStateUi = {
|
|
|
|
|
...(window.TarotSectionStateUi || {}),
|
|
|
|
|
init,
|
|
|
|
|
getActiveSection,
|
|
|
|
|
setActiveSection
|
|
|
|
|
};
|
|
|
|
|
})();
|