made tarot section more mobile friendly
This commit is contained in:
@@ -2882,6 +2882,103 @@
|
||||
gap: 14px;
|
||||
}
|
||||
|
||||
@media (max-width: 900px) {
|
||||
#tarot-house-view {
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
#tarot-house-view .tarot-house-card {
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.tarot-house-card-head {
|
||||
flex-direction: column;
|
||||
align-items: stretch;
|
||||
}
|
||||
|
||||
.tarot-house-card-actions {
|
||||
display: grid;
|
||||
grid-template-columns: minmax(0, 1fr);
|
||||
align-items: stretch;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.tarot-house-toggle,
|
||||
.tarot-house-filter-group,
|
||||
.tarot-house-action-btn {
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.tarot-house-filter-group {
|
||||
justify-content: flex-start;
|
||||
}
|
||||
|
||||
.tarot-house-layout {
|
||||
--tarot-house-card-gap: 2px;
|
||||
--tarot-house-row-gap: 4px;
|
||||
--tarot-house-section-gap: 8px;
|
||||
--tarot-house-card-width: clamp(28px, calc((100vw - 56px) / 11), 42px);
|
||||
--tarot-house-card-height: calc(var(--tarot-house-card-width) * 1.5);
|
||||
width: 100%;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.tarot-house-trumps {
|
||||
overflow-x: visible;
|
||||
}
|
||||
|
||||
.tarot-house-trump-row,
|
||||
.tarot-house-bottom-grid {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.tarot-house-bottom-grid {
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.tarot-house-card-btn.is-selected {
|
||||
transform: scale(1.08);
|
||||
}
|
||||
|
||||
.tarot-house-card-label {
|
||||
left: 2px;
|
||||
right: 2px;
|
||||
bottom: 2px;
|
||||
padding: 2px 3px;
|
||||
font-size: 6.5px;
|
||||
line-height: 1.1;
|
||||
}
|
||||
|
||||
.tarot-house-card-label-secondary {
|
||||
margin-top: 1px;
|
||||
font-size: 6px;
|
||||
}
|
||||
|
||||
.tarot-house-card-text-face {
|
||||
gap: 3px;
|
||||
padding: 5px 4px;
|
||||
}
|
||||
|
||||
.tarot-house-card-text-face.is-dense {
|
||||
gap: 2px;
|
||||
padding: 4px 3px;
|
||||
}
|
||||
|
||||
.tarot-house-card-text-face.is-top-hebrew .tarot-house-card-text-primary {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.tarot-house-card-text-primary {
|
||||
font-size: 8px;
|
||||
}
|
||||
|
||||
.tarot-house-card-text-secondary,
|
||||
.tarot-house-card-fallback {
|
||||
font-size: 6px;
|
||||
}
|
||||
}
|
||||
|
||||
/* ── Tarot Spread View ─────────────────────────────── */
|
||||
#tarot-spread-view {
|
||||
display: flex;
|
||||
|
||||
@@ -46,6 +46,7 @@
|
||||
const config = {
|
||||
resolveTarotCardImage: null,
|
||||
resolveTarotCardThumbnail: null,
|
||||
getActiveDeck: () => "",
|
||||
getDisplayCardName: (card) => card?.name || "",
|
||||
clearChildren: () => {},
|
||||
normalizeTarotCardLookupName: (value) => String(value || "").trim().toLowerCase(),
|
||||
@@ -610,6 +611,34 @@
|
||||
houseImageObserver = null;
|
||||
}
|
||||
|
||||
function isCompactHouseLayout() {
|
||||
if (typeof window === "undefined") {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (typeof window.matchMedia === "function") {
|
||||
return window.matchMedia("(max-width: 900px)").matches;
|
||||
}
|
||||
|
||||
return Number(window.innerWidth) <= 900;
|
||||
}
|
||||
|
||||
function buildHouseCardDeckOptions(card) {
|
||||
const deckId = String(config.getActiveDeck?.() || "").trim();
|
||||
const trumpNumber = card?.arcana === "Major" && Number.isFinite(Number(card?.number))
|
||||
? Number(card.number)
|
||||
: undefined;
|
||||
|
||||
if (!deckId && !Number.isFinite(trumpNumber)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return {
|
||||
...(deckId ? { deckId } : {}),
|
||||
...(Number.isFinite(trumpNumber) ? { trumpNumber } : {})
|
||||
};
|
||||
}
|
||||
|
||||
function hydrateHouseCardImage(image) {
|
||||
if (!(image instanceof HTMLImageElement)) {
|
||||
return;
|
||||
@@ -626,7 +655,7 @@
|
||||
}
|
||||
|
||||
function getHouseImageObserver(elements) {
|
||||
const root = elements?.tarotHouseOfCardsEl?.closest(".tarot-section-house-top") || null;
|
||||
const root = elements?.tarotHouseViewEl || elements?.tarotHouseOfCardsEl?.closest(".tarot-section-house-top") || null;
|
||||
if (!root || typeof IntersectionObserver !== "function") {
|
||||
return null;
|
||||
}
|
||||
@@ -659,6 +688,11 @@
|
||||
return;
|
||||
}
|
||||
|
||||
if (isCompactHouseLayout()) {
|
||||
hydrateHouseCardImage(image);
|
||||
return;
|
||||
}
|
||||
|
||||
const observer = getHouseImageObserver(elements);
|
||||
if (!observer) {
|
||||
hydrateHouseCardImage(image);
|
||||
@@ -685,6 +719,7 @@
|
||||
const cardDisplayName = config.getDisplayCardName(card);
|
||||
const label = buildHouseCardLabel(card);
|
||||
const showImage = isHouseCardImageVisible(card);
|
||||
const deckOptions = buildHouseCardDeckOptions(card);
|
||||
const labelText = label?.secondary
|
||||
? `${label.primary} - ${label.secondary}`
|
||||
: label?.primary || "";
|
||||
@@ -692,8 +727,11 @@
|
||||
button.setAttribute("aria-label", labelText ? `${cardDisplayName || card.name}, ${labelText}` : (cardDisplayName || card.name));
|
||||
button.dataset.houseCardId = card.id;
|
||||
const imageUrl = typeof config.resolveTarotCardThumbnail === "function"
|
||||
? config.resolveTarotCardThumbnail(card.name)
|
||||
: (typeof config.resolveTarotCardImage === "function" ? config.resolveTarotCardImage(card.name) : null);
|
||||
? config.resolveTarotCardThumbnail(card.name, deckOptions || undefined)
|
||||
: (typeof config.resolveTarotCardImage === "function" ? config.resolveTarotCardImage(card.name, deckOptions || undefined) : null);
|
||||
const fullImageUrl = typeof config.resolveTarotCardImage === "function"
|
||||
? config.resolveTarotCardImage(card.name, deckOptions || undefined)
|
||||
: imageUrl;
|
||||
|
||||
if (showImage && imageUrl) {
|
||||
const image = document.createElement("img");
|
||||
@@ -704,11 +742,19 @@
|
||||
image.decoding = "async";
|
||||
image.fetchPriority = config.isHouseFocusMode?.() === true ? "auto" : "low";
|
||||
image.dataset.src = imageUrl;
|
||||
image.dataset.fullSrc = fullImageUrl || imageUrl;
|
||||
image.addEventListener("load", () => {
|
||||
image.classList.remove("is-loading");
|
||||
image.classList.add("is-loaded");
|
||||
}, { once: true });
|
||||
image.addEventListener("error", () => {
|
||||
const fallbackSrc = String(image.dataset.fullSrc || "").trim();
|
||||
if (fallbackSrc && fallbackSrc !== image.currentSrc && image.dataset.fullImageTried !== "true") {
|
||||
image.dataset.fullImageTried = "true";
|
||||
image.dataset.imageHydrated = "true";
|
||||
image.src = fallbackSrc;
|
||||
return;
|
||||
}
|
||||
image.classList.remove("is-loading");
|
||||
image.classList.remove("is-loaded");
|
||||
image.dataset.imageHydrated = "false";
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -293,8 +293,6 @@
|
||||
tarotHouseBottomInfoMonthEl: document.getElementById("tarot-house-bottom-info-month"),
|
||||
tarotHouseBottomInfoRulerEl: document.getElementById("tarot-house-bottom-info-ruler"),
|
||||
tarotHouseBottomInfoDateEl: document.getElementById("tarot-house-bottom-info-date"),
|
||||
tarotHouseFocusToggleEl: document.getElementById("tarot-house-focus-toggle"),
|
||||
tarotHouseExportEl: document.getElementById("tarot-house-export"),
|
||||
tarotHouseExportWebpEl: document.getElementById("tarot-house-export-webp")
|
||||
};
|
||||
}
|
||||
@@ -568,16 +566,6 @@
|
||||
setHouseBottomInfoCheckboxState(elements?.tarotHouseBottomInfoRulerEl, state.houseBottomInfoModes.ruler);
|
||||
setHouseBottomInfoCheckboxState(elements?.tarotHouseBottomInfoDateEl, state.houseBottomInfoModes.date);
|
||||
|
||||
if (elements?.tarotHouseFocusToggleEl) {
|
||||
elements.tarotHouseFocusToggleEl.setAttribute("aria-pressed", state.houseFocusMode ? "true" : "false");
|
||||
elements.tarotHouseFocusToggleEl.textContent = state.houseFocusMode ? "Show Full Tarot" : "Focus House";
|
||||
}
|
||||
|
||||
if (elements?.tarotHouseExportEl) {
|
||||
elements.tarotHouseExportEl.disabled = Boolean(state.houseExportInProgress);
|
||||
elements.tarotHouseExportEl.textContent = state.houseExportInProgress ? "Exporting..." : "Export PNG";
|
||||
}
|
||||
|
||||
if (elements?.tarotHouseExportWebpEl) {
|
||||
const supportsWebp = tarotHouseUi.isExportFormatSupported?.("webp") === true;
|
||||
elements.tarotHouseExportWebpEl.disabled = Boolean(state.houseExportInProgress) || !supportsWebp;
|
||||
@@ -808,6 +796,7 @@
|
||||
tarotHouseUi.init?.({
|
||||
resolveTarotCardImage,
|
||||
resolveTarotCardThumbnail,
|
||||
getActiveDeck,
|
||||
getDisplayCardName,
|
||||
clearChildren,
|
||||
normalizeTarotCardLookupName,
|
||||
@@ -932,13 +921,6 @@
|
||||
});
|
||||
}
|
||||
|
||||
if (elements.tarotHouseFocusToggleEl) {
|
||||
elements.tarotHouseFocusToggleEl.addEventListener("click", () => {
|
||||
state.houseFocusMode = !state.houseFocusMode;
|
||||
syncHouseControls(elements);
|
||||
});
|
||||
}
|
||||
|
||||
if (elements.tarotHouseTopCardsVisibleEl) {
|
||||
elements.tarotHouseTopCardsVisibleEl.addEventListener("change", () => {
|
||||
state.houseTopCardsVisible = Boolean(elements.tarotHouseTopCardsVisibleEl.checked);
|
||||
@@ -989,12 +971,6 @@
|
||||
});
|
||||
});
|
||||
|
||||
if (elements.tarotHouseExportEl) {
|
||||
elements.tarotHouseExportEl.addEventListener("click", () => {
|
||||
exportHouseOfCards(elements, "png");
|
||||
});
|
||||
}
|
||||
|
||||
if (elements.tarotHouseExportWebpEl) {
|
||||
elements.tarotHouseExportWebpEl.addEventListener("click", () => {
|
||||
exportHouseOfCards(elements, "webp");
|
||||
|
||||
Reference in New Issue
Block a user