update to frame and tarot times

This commit is contained in:
2026-04-04 03:39:29 -07:00
parent cac243f2cf
commit aa4572668e
5 changed files with 3414 additions and 82 deletions

View File

@@ -397,6 +397,7 @@
}
#tarot-frame-section {
height: calc(100vh - 61px);
height: calc(100dvh - 61px);
background: #18181b;
box-sizing: border-box;
overflow: auto;
@@ -957,6 +958,69 @@
line-height: 1.35;
}
.tarot-frame-layout-section-title {
padding: 2px 2px 0;
color: #a5b4fc;
font-size: 11px;
font-weight: 700;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.tarot-frame-layout-save-btn {
width: 100%;
padding: 10px 12px;
border: 1px solid rgba(129, 140, 248, 0.5);
border-radius: 12px;
background: linear-gradient(180deg, rgba(67, 56, 202, 0.92), rgba(49, 46, 129, 0.96));
color: #eef2ff;
cursor: pointer;
font-size: 12px;
font-weight: 700;
letter-spacing: 0.03em;
text-transform: uppercase;
}
.tarot-frame-layout-save-btn:hover {
border-color: rgba(165, 180, 252, 0.9);
background: linear-gradient(180deg, rgba(79, 70, 229, 0.96), rgba(67, 56, 202, 0.98));
}
.tarot-frame-layout-entry {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
gap: 8px;
align-items: stretch;
}
.tarot-frame-layout-delete-btn {
align-self: stretch;
padding: 10px 12px;
border: 1px solid rgba(248, 113, 113, 0.28);
border-radius: 12px;
background: rgba(69, 10, 10, 0.36);
color: #fecaca;
cursor: pointer;
font-size: 12px;
font-weight: 700;
}
.tarot-frame-layout-delete-btn:hover {
border-color: rgba(252, 165, 165, 0.58);
background: rgba(127, 29, 29, 0.5);
color: #fee2e2;
}
.tarot-frame-layout-empty-note {
padding: 10px 12px;
border: 1px dashed rgba(99, 102, 241, 0.28);
border-radius: 12px;
color: #cbd5e1;
font-size: 12px;
line-height: 1.4;
background: rgba(15, 23, 42, 0.28);
}
.tarot-frame-action-btn {
padding: 10px 14px;
border: 1px solid #4c1d95;
@@ -974,6 +1038,13 @@
background: linear-gradient(180deg, #4338ca, #312e81);
}
.tarot-frame-action-btn.is-active {
border-color: #a5b4fc;
background: linear-gradient(180deg, #4f46e5, #3730a3);
color: #f8fafc;
box-shadow: 0 0 0 1px rgba(165, 180, 252, 0.16);
}
.tarot-frame-settings-panel {
position: absolute;
top: calc(100% + 10px);
@@ -1045,6 +1116,22 @@
line-height: 1.45;
}
.tarot-frame-settings-actions {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 10px;
}
.tarot-frame-clear-btn {
border-color: rgba(248, 113, 113, 0.4);
background: linear-gradient(180deg, rgba(127, 29, 29, 0.92), rgba(69, 10, 10, 0.96));
}
.tarot-frame-clear-btn:hover {
border-color: rgba(252, 165, 165, 0.72);
background: linear-gradient(180deg, rgba(153, 27, 27, 0.96), rgba(127, 29, 29, 0.98));
}
.tarot-frame-checkbox-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
@@ -1127,6 +1214,45 @@
min-width: 0;
}
.tarot-frame-overview {
display: grid;
grid-template-columns: minmax(0, 1.45fr) minmax(320px, 0.95fr);
gap: 14px;
align-items: stretch;
}
.tarot-frame-overview-summary,
.tarot-frame-notes-card {
display: grid;
gap: 14px;
padding: 18px;
border: 1px solid #27272a;
border-radius: 22px;
background:
radial-gradient(circle at top, rgba(59, 130, 246, 0.08), transparent 34%),
linear-gradient(180deg, #161622 0%, #0f0f17 100%);
box-shadow: 0 22px 54px rgba(0, 0, 0, 0.2);
min-width: 0;
}
.tarot-frame-overview-head,
.tarot-frame-panel-head {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 12px;
min-width: 0;
flex-wrap: wrap;
}
.tarot-frame-overview-eyebrow {
color: #93c5fd;
font-size: 11px;
font-weight: 700;
letter-spacing: 0.12em;
text-transform: uppercase;
}
.tarot-frame-panel {
--frame-grid-zoom-scale: 1;
--frame-base-cell-width: clamp(32px, 2.6vw, 46px);
@@ -1136,27 +1262,17 @@
--frame-gap: calc(var(--frame-base-gap) * var(--frame-grid-zoom-scale));
display: grid;
grid-template-columns: minmax(0, 1fr);
gap: 14px;
padding: 18px;
gap: 12px;
padding: 14px;
border: 1px solid #27272a;
border-radius: 22px;
background:
radial-gradient(circle at top, rgba(59, 130, 246, 0.08), transparent 34%),
linear-gradient(180deg, #161622 0%, #0f0f17 100%);
box-shadow: 0 22px 54px rgba(0, 0, 0, 0.24);
linear-gradient(180deg, rgba(22, 22, 34, 0.92), rgba(10, 10, 18, 0.98));
box-shadow: 0 20px 48px rgba(0, 0, 0, 0.22);
overflow: hidden;
min-width: 0;
}
.tarot-frame-panel-head {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 12px;
min-width: 0;
flex-wrap: wrap;
}
.tarot-frame-panel-title {
margin: 0;
font-size: 17px;
@@ -1187,11 +1303,129 @@
.tarot-frame-grid-viewport {
width: min(100%, calc(100vw - 52px));
max-width: calc(100vw - 52px);
min-height: clamp(520px, 68dvh, 900px);
max-height: min(84dvh, 1080px);
margin-left: auto;
margin-right: auto;
overflow: auto;
overscroll-behavior: contain;
min-width: 0;
touch-action: pan-x pan-y;
}
.tarot-frame-focus-exit {
display: inline-flex;
align-items: center;
justify-content: center;
justify-self: end;
padding: 10px 14px;
border: 1px solid rgba(191, 219, 254, 0.34);
border-radius: 999px;
background: rgba(15, 23, 42, 0.86);
color: #eff6ff;
cursor: pointer;
font-size: 12px;
font-weight: 700;
letter-spacing: 0.03em;
box-shadow: 0 12px 34px rgba(0, 0, 0, 0.3);
}
.tarot-frame-focus-exit:hover {
border-color: rgba(147, 197, 253, 0.7);
background: rgba(30, 41, 59, 0.94);
}
.tarot-frame-focus-exit[hidden] {
display: none !important;
}
body.is-tarot-frame-focus-lock {
overflow: hidden;
}
#tarot-frame-section.is-grid-focus {
position: fixed;
inset: 61px 0 0 0;
z-index: 88;
overflow: hidden;
background:
radial-gradient(circle at top, rgba(59, 130, 246, 0.14), transparent 30%),
rgba(2, 6, 23, 0.92);
-webkit-backdrop-filter: blur(10px);
backdrop-filter: blur(10px);
}
#tarot-frame-section.is-grid-focus .tarot-frame-view {
display: flex;
flex-direction: column;
height: 100%;
padding: 10px;
overflow: hidden;
}
#tarot-frame-section.is-grid-focus .tarot-frame-shell {
min-height: 100%;
grid-template-rows: auto minmax(0, 1fr);
align-content: stretch;
}
#tarot-frame-section.is-grid-focus .tarot-frame-header,
#tarot-frame-section.is-grid-focus .tarot-frame-overview-host,
#tarot-frame-section.is-grid-focus .tarot-frame-status {
display: none !important;
}
#tarot-frame-section.is-grid-focus .tarot-frame-focus-exit {
display: inline-flex !important;
margin: 0 0 8px auto;
position: relative;
z-index: 90;
}
#tarot-frame-section.is-grid-focus .tarot-frame-board-grid {
height: 100%;
min-height: 0;
position: relative;
z-index: 89;
}
#tarot-frame-section.is-grid-focus .tarot-frame-panel {
height: 100%;
padding: 10px;
border-color: rgba(96, 165, 250, 0.3);
box-shadow: 0 28px 72px rgba(0, 0, 0, 0.42);
}
#tarot-frame-section.is-grid-focus .tarot-frame-grid-viewport {
width: 100%;
max-width: none;
min-height: 0;
max-height: none;
height: 100%;
}
.tarot-frame-grid-viewport.is-pan-enabled {
cursor: grab;
touch-action: none;
-webkit-user-select: none;
user-select: none;
-webkit-touch-callout: none;
}
.tarot-frame-grid-viewport.is-pan-enabled .tarot-frame-card {
cursor: inherit;
}
.tarot-frame-grid-viewport.is-pan-enabled.is-panning {
cursor: grabbing;
}
.tarot-frame-grid-viewport.is-panning {
cursor: grabbing;
}
.tarot-frame-grid-viewport.is-touch-gesture-active {
touch-action: none;
}
.tarot-frame-grid-track {
@@ -1203,7 +1437,7 @@
.tarot-frame-legend {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 10px;
}
@@ -1219,6 +1453,116 @@
line-height: 1.4;
}
.tarot-frame-notes-card {
align-content: start;
}
.tarot-frame-notes-head {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 10px;
flex-wrap: wrap;
}
.tarot-frame-notes-title {
margin: 0;
color: #f8fafc;
font-size: 15px;
line-height: 1.2;
}
.tarot-frame-notes-copy {
margin: 6px 0 0;
color: #94a3b8;
font-size: 12px;
line-height: 1.45;
}
.tarot-frame-notes-badge {
align-self: flex-start;
padding: 6px 10px;
border-radius: 999px;
border: 1px solid rgba(96, 165, 250, 0.28);
background: rgba(15, 23, 42, 0.72);
color: #bfdbfe;
font-size: 11px;
font-weight: 700;
letter-spacing: 0.08em;
text-transform: uppercase;
white-space: nowrap;
}
.tarot-frame-notes-field {
display: grid;
gap: 8px;
color: #e2e8f0;
font-size: 12px;
font-weight: 700;
letter-spacing: 0.04em;
text-transform: uppercase;
}
.tarot-frame-notes-field textarea {
width: 100%;
min-height: 176px;
resize: vertical;
padding: 12px 14px;
border: 1px solid rgba(96, 165, 250, 0.22);
border-radius: 16px;
background: rgba(8, 15, 28, 0.82);
color: #e2e8f0;
font: inherit;
font-size: 13px;
line-height: 1.55;
letter-spacing: 0;
text-transform: none;
box-sizing: border-box;
}
.tarot-frame-notes-field textarea::placeholder {
color: #64748b;
}
.tarot-frame-notes-field textarea:focus {
outline: none;
border-color: rgba(125, 211, 252, 0.66);
box-shadow: 0 0 0 3px rgba(56, 189, 248, 0.12);
}
.tarot-frame-notes-footer {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
flex-wrap: wrap;
color: #94a3b8;
font-size: 12px;
line-height: 1.4;
}
.tarot-frame-notes-clear {
padding: 9px 12px;
border: 1px solid rgba(96, 165, 250, 0.22);
border-radius: 999px;
background: rgba(15, 23, 42, 0.56);
color: #dbeafe;
cursor: pointer;
font-size: 12px;
font-weight: 700;
letter-spacing: 0.03em;
}
.tarot-frame-notes-clear:hover {
border-color: rgba(125, 211, 252, 0.5);
background: rgba(30, 41, 59, 0.82);
}
.tarot-frame-notes-clear:disabled {
cursor: default;
opacity: 0.45;
}
.tarot-frame-legend-item strong {
color: #f8fafc;
font-size: 12px;
@@ -1237,6 +1581,52 @@
min-width: max-content;
}
@media (max-width: 980px) {
.tarot-frame-overview {
grid-template-columns: minmax(0, 1fr);
}
}
@media (max-width: 760px) {
#tarot-frame-section {
height: calc(100svh - 61px);
height: calc(100dvh - 61px);
}
.tarot-frame-view {
padding: 10px;
}
.tarot-frame-shell {
gap: 10px;
}
.tarot-frame-grid-viewport {
min-height: clamp(680px, 84dvh, 1240px);
max-height: min(92dvh, 1320px);
}
.tarot-frame-legend {
grid-template-columns: minmax(0, 1fr);
}
.tarot-frame-notes-field textarea {
min-height: 112px;
}
.tarot-frame-focus-exit {
padding: 9px 12px;
}
#tarot-frame-section.is-grid-focus .tarot-frame-view {
padding: 8px;
}
#tarot-frame-section.is-grid-focus .tarot-frame-focus-exit {
margin-bottom: 6px;
}
}
.tarot-frame-slot {
position: relative;
width: var(--frame-cell-width);
@@ -1249,6 +1639,155 @@
border: 1px dashed rgba(148, 163, 184, 0.4);
}
.tarot-frame-card-picker {
position: fixed;
z-index: 40;
width: min(420px, calc(100vw - 24px));
max-height: min(78vh, 720px);
display: grid;
grid-template-rows: auto auto minmax(0, 1fr);
gap: 12px;
padding: 14px;
border: 1px solid rgba(129, 140, 248, 0.3);
border-radius: 20px;
background:
radial-gradient(circle at top, rgba(99, 102, 241, 0.18), transparent 36%),
linear-gradient(180deg, rgba(15, 23, 42, 0.98), rgba(2, 6, 23, 0.98));
box-shadow: 0 24px 70px rgba(0, 0, 0, 0.42);
overflow: hidden;
}
.tarot-frame-card-picker[hidden] {
display: none !important;
}
.tarot-frame-card-picker-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
}
.tarot-frame-card-picker-title {
color: #f8fafc;
font-size: 15px;
font-weight: 700;
line-height: 1.3;
}
.tarot-frame-card-picker-close {
padding: 8px 12px;
border: 1px solid rgba(148, 163, 184, 0.28);
border-radius: 999px;
background: rgba(15, 23, 42, 0.78);
color: #e2e8f0;
cursor: pointer;
font-size: 12px;
font-weight: 700;
}
.tarot-frame-card-picker-search {
display: grid;
gap: 6px;
color: #cbd5e1;
font-size: 11px;
font-weight: 700;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.tarot-frame-card-picker-search input {
width: 100%;
padding: 10px 12px;
border: 1px solid rgba(129, 140, 248, 0.24);
border-radius: 12px;
background: rgba(15, 23, 42, 0.84);
color: #f8fafc;
font-size: 13px;
}
.tarot-frame-card-picker-sections {
display: grid;
align-content: start;
gap: 14px;
min-height: 0;
overflow: auto;
overscroll-behavior: contain;
padding-right: 2px;
touch-action: pan-y;
}
.tarot-frame-card-picker-section {
display: grid;
gap: 8px;
padding: 12px;
border: 1px solid rgba(71, 85, 105, 0.48);
border-radius: 16px;
background: rgba(15, 23, 42, 0.42);
}
.tarot-frame-card-picker-section-title {
margin: 0;
color: #eef2ff;
font-size: 13px;
font-weight: 700;
letter-spacing: 0.04em;
text-transform: uppercase;
}
.tarot-frame-card-picker-subtitle {
color: #a5b4fc;
font-size: 11px;
font-weight: 700;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.tarot-frame-card-picker-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
gap: 8px;
}
.tarot-frame-card-picker-option {
display: grid;
gap: 4px;
padding: 10px 12px;
border: 1px solid rgba(99, 102, 241, 0.24);
border-radius: 12px;
background: rgba(30, 41, 59, 0.58);
color: #e2e8f0;
text-align: left;
cursor: pointer;
}
.tarot-frame-card-picker-option:hover {
border-color: rgba(165, 180, 252, 0.9);
background: rgba(67, 56, 202, 0.28);
color: #f8fafc;
}
.tarot-frame-card-picker-option strong {
font-size: 12px;
line-height: 1.35;
}
.tarot-frame-card-picker-option span {
color: #94a3b8;
font-size: 11px;
line-height: 1.3;
}
.tarot-frame-card-picker-empty {
padding: 12px;
border: 1px dashed rgba(99, 102, 241, 0.28);
border-radius: 12px;
color: #cbd5e1;
font-size: 12px;
line-height: 1.4;
background: rgba(15, 23, 42, 0.24);
}
.tarot-frame-slot.is-drop-target {
box-shadow: 0 0 0 2px #f59e0b, 0 0 0 6px rgba(245, 158, 11, 0.18);
border-radius: 8px;

View File

@@ -340,7 +340,7 @@
{ title: "Letter", relations: detailRelations.hebrewRelations },
{ title: "Planet / Ruler", relations: detailRelations.planetRelations },
{
title: detailRelations.hasSignWindowRelations ? "Signs" : (detailRelations.hasDecanSummaryRelations ? "Decan" : "Sign / Decan"),
title: detailRelations.hasSignWindowRelations ? "Signs" : (detailRelations.hasDecanSummaryRelations ? "Decans" : "Sign / Decan"),
relations: detailRelations.zodiacRelationsWithRulership
},
{ title: "Element", relations: detailRelations.elementRelations },

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -16,7 +16,7 @@
<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?v=20260402-frame-center-09">
<link rel="stylesheet" href="app/styles.css?v=20260404-frame-gesture-lock-01">
</head>
<body>
<div class="topbar">
@@ -313,9 +313,11 @@
<div class="tarot-frame-header">
<div>
<h2 class="tarot-frame-title">Tarot Frame</h2>
<p class="tarot-frame-copy">Arrange all 78 tarot cards inside one master 14x14 grid, then switch between the Frames and House of Cards presets without leaving the page. Use the shared settings panel to change the grid zoom for any layout.</p>
<p class="tarot-frame-copy">Arrange all 78 tarot cards inside one master 14x14 grid, then switch between the Frames and House of Cards presets without leaving the page. On touch screens, use two fingers to pan around the board; on desktop, trackpad scroll and middle-mouse drag both pan the grid. Use Full Screen when you want an uncluttered board view for panning and placement.</p>
</div>
<div class="tarot-frame-actions">
<button id="tarot-frame-pan-toggle" class="tarot-frame-action-btn" type="button" aria-pressed="false">Pan Grid</button>
<button id="tarot-frame-focus-toggle" class="tarot-frame-action-btn" type="button" aria-pressed="false">Full Screen</button>
<button id="tarot-frame-settings-toggle" class="tarot-frame-action-btn tarot-frame-settings-toggle" type="button" aria-haspopup="dialog" aria-expanded="false" aria-controls="tarot-frame-settings-panel">Settings</button>
<button id="tarot-frame-layout-toggle" class="tarot-frame-action-btn" type="button" aria-haspopup="menu" aria-expanded="false" aria-controls="tarot-frame-layout-panel">Layout: Frames</button>
<div id="tarot-frame-layout-panel" class="tarot-frame-layout-panel" role="menu" aria-label="Tarot Frame layouts" hidden>
@@ -337,6 +339,10 @@
<option value="2">140%</option>
<option value="3">170%</option>
<option value="4">200%</option>
<option value="5">240%</option>
<option value="6">300%</option>
<option value="7">360%</option>
<option value="8">420%</option>
</select>
</label>
<label class="tarot-frame-toggle" for="tarot-frame-show-info">
@@ -372,11 +378,16 @@
<label class="tarot-frame-check" for="tarot-frame-house-bottom-info-date"><input id="tarot-frame-house-bottom-info-date" type="checkbox"><span>Date</span></label>
</div>
</div>
<button id="tarot-frame-export-webp" class="tarot-frame-action-btn tarot-frame-export-btn" type="button">Export WebP</button>
<div class="tarot-frame-settings-actions">
<button id="tarot-frame-clear-grid" class="tarot-frame-action-btn tarot-frame-clear-btn" type="button">Clear Grid</button>
<button id="tarot-frame-export-webp" class="tarot-frame-action-btn tarot-frame-export-btn" type="button">Export WebP</button>
</div>
</div>
</div>
</div>
<div id="tarot-frame-overview" class="tarot-frame-overview-host"></div>
<div id="tarot-frame-status" class="tarot-frame-status" aria-live="polite">Loading tarot cards...</div>
<button id="tarot-frame-focus-exit" class="tarot-frame-focus-exit" type="button" hidden>Exit Full Screen</button>
<div id="tarot-frame-board" class="tarot-frame-board-grid"></div>
</div>
</div>
@@ -1118,7 +1129,7 @@
<script src="app/data-service.js?v=20260319-word-dictionary-01"></script>
<script src="app/calendar-events.js"></script>
<script src="app/card-images.js?v=20260309-gate"></script>
<script src="app/ui-tarot-lightbox.js?v=20260402-lightbox-pinch-zoom-01"></script>
<script src="app/ui-tarot-lightbox.js?v=20260404-lightbox-pinch-01"></script>
<script src="app/ui-tarot-house.js?v=20260401-house-top-date-01"></script>
<script src="app/ui-tarot-relations.js"></script>
<script src="app/ui-now-helpers.js?v=20260314-now-planets-grid-01"></script>
@@ -1136,7 +1147,7 @@
<script src="app/ui-holidays-render.js"></script>
<script src="app/ui-holidays.js"></script>
<script src="app/ui-tarot-card-derivations.js?v=20260307b"></script>
<script src="app/ui-tarot-detail.js?v=20260402-princess-links-01"></script>
<script src="app/ui-tarot-detail.js?v=20260403-court-decans-01"></script>
<script src="app/ui-tarot-relation-display.js?v=20260307b"></script>
<script src="app/ui-tarot.js?v=20260402-frame-lightbox-01"></script>
<script src="app/ui-planets-references.js"></script>
@@ -1178,7 +1189,7 @@
<script src="app/ui-numbers-detail.js"></script>
<script src="app/ui-numbers.js"></script>
<script src="app/ui-tarot-spread.js"></script>
<script src="app/ui-tarot-frame.js?v=20260402-frame-lightbox-01"></script>
<script src="app/ui-tarot-frame.js?v=20260404-frame-gesture-lock-01"></script>
<script src="app/ui-settings.js?v=20260309-gate"></script>
<script src="app/ui-chrome.js?v=20260328-topbar-settings-01"></script>
<script src="app/ui-navigation.js?v=20260401-tarot-frame-01"></script>