Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 12 additions & 10 deletions css/styles.css
Original file line number Diff line number Diff line change
Expand Up @@ -72,19 +72,21 @@ input,textarea,select{font-family:var(--font)}
#panel-photos{overflow-y:auto;padding:2px 14px 12px;flex:1}
.section-label{font-size:.63rem;font-weight:600;text-transform:uppercase;letter-spacing:.08em;color:var(--muted);margin:8px 0 6px}
.year-group{margin-bottom:4px}
.year-hdr{display:flex;align-items:center;padding:10px 8px;cursor:pointer;user-select:none}
.year-hdr:hover{background:var(--surface2);border-radius:8px}
.year-hdr-arrow{font-size:.7rem;color:var(--muted);transition:transform .15s;width:16px;text-align:center;margin-right:8px}
.year-hdr.collapsed .year-hdr-arrow{transform:rotate(-90deg)}
.year-hdr-label{font-size:.95rem;font-weight:600;color:var(--text)}
.year-hdr-count{font-size:.62rem;color:var(--muted);margin-left:8px}
.year-hdr-line{flex:1;height:1px;background:var(--border);margin-left:8px}.year-body{padding-left:2px;overflow:hidden;transition:max-height .5s ease}
.year-hdr{display:flex;align-items:center;padding:10px 8px;cursor:pointer;user-select:none;border-radius:8px;transition:background .15s}
.year-hdr:hover{background:var(--surface2)}
.year-hdr-label{font-size:.95rem;font-weight:600;color:var(--text);transition:color .15s}
.year-hdr.collapsed .year-hdr-label{color:var(--muted)}
.year-hdr-count{font-size:.6rem;color:var(--muted);margin-left:9px;background:var(--surface2);padding:2px 8px;border-radius:10px;transition:background .15s,color .15s}
.year-hdr.collapsed .year-hdr-count{background:transparent;border:1px solid var(--border)}
.year-hdr:hover .year-hdr-count{background:var(--accent-dim);color:var(--text)}
.year-hdr-line{flex:1;height:1px;background:var(--border);margin-left:8px}.year-body{padding-left:2px;overflow:hidden;transition:max-height .3s ease}
.year-body>.year-group>.year-hdr{padding-left:26px}
.year-body>.year-group>.year-body{padding-left:20px}
.year-hdr.collapsed+.year-body{max-height:0}
.collapse-all-btn{background:none;border:none;color:var(--muted);font-size:.7rem;cursor:pointer;padding:2px 6px;border-radius:4px;transition:transform .15s,background .15s;line-height:1}
.collapse-all-btn:hover{background:var(--surface2)}
.collapse-all-btn.all-collapsed{transform:rotate(-90deg)}
.collapse-all-btn{background:none;border:none;color:var(--muted);font-size:.62rem;cursor:pointer;padding:3px 7px;border-radius:5px;transition:background .15s,color .15s;line-height:1;font-family:var(--font);letter-spacing:.02em}
.collapse-all-btn:hover{background:var(--surface2);color:var(--text)}
.collapse-all-btn::after{content:'Collapse all'}
.collapse-all-btn.all-collapsed::after{content:'Expand all'}
.photo-card{display:flex;align-items:center;gap:9px;padding:6px 8px;border-radius:10px;cursor:pointer;transition:background .15s;margin-bottom:3px;box-sizing:border-box}
.photo-card:hover{background:var(--surface2)}
.photo-card.active{background:var(--accent-dim);outline:1px solid rgba(91,142,240,.3)}
Expand Down
2 changes: 1 addition & 1 deletion index.html
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@
<!-- PHOTOS TAB -->
<div class="tab-panel active" id="tab-photos">
<div id="panel-photos">
<div style="display:flex;align-items:center;justify-content:space-between"><div class="section-label">Your Photos</div><button class="collapse-all-btn all-collapsed" id="photos-collapse-all" onclick="toggleAllYears('photos')" title="Collapse/Expand all">▼</button></div>
<div style="display:flex;align-items:center;justify-content:space-between"><div class="section-label">Your Photos</div><button class="collapse-all-btn all-collapsed" id="photos-collapse-all" onclick="toggleAllYears('photos')"></button></div>
<div id="photos-list">
<div class="empty-state"><div class="big">🌍</div>Add photos to build your travel map</div>
</div>
Expand Down
45 changes: 38 additions & 7 deletions js/photos.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,53 @@ function photoSortKey(p) {
return '9999-99-99T' + String(p.addedAt).padStart(16,'0');
}

// Duration scales with content height so small groups snap and large ones
// don't feel sluggish. Clamped to 180–420ms.
function _animDuration(h) {
return Math.max(180, Math.min(420, 120 + h * 0.25));
}

function _animateBody(hdr, body, expand) {
const prev = body._animEnd;
if (prev) { body.removeEventListener('transitionend', prev); body._animEnd = null; }

// Respect the user's reduced-motion preference — toggle instantly.
if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
hdr.classList.toggle('collapsed', !expand);
body.style.maxHeight = '';
return;
}

if (expand) {
body.style.maxHeight = '';
const h = body.scrollHeight;
body.style.transitionDuration = _animDuration(h) + 'ms';
body.style.maxHeight = '0';
void body.scrollHeight;
body.style.maxHeight = h + 'px';
hdr.classList.remove('collapsed');
const onEnd = () => { body.style.maxHeight = ''; body.removeEventListener('transitionend', onEnd); body._animEnd = null; };
// Clear inline overrides on completion so nested groups can grow later.
const onEnd = () => {
body.style.maxHeight = '';
body.style.transitionDuration = '';
body.removeEventListener('transitionend', onEnd);
body._animEnd = null;
};
body._animEnd = onEnd;
body.addEventListener('transitionend', onEnd);
} else {
body.style.maxHeight = body.scrollHeight + 'px';
requestAnimationFrame(() => { hdr.classList.add('collapsed'); body.style.maxHeight = ''; });
const h = body.scrollHeight;
body.style.transitionDuration = _animDuration(h) + 'ms';
body.style.maxHeight = h + 'px';
void body.scrollHeight;
requestAnimationFrame(() => { hdr.classList.add('collapsed'); body.style.maxHeight = '0'; });
const onEnd = () => {
body.style.transitionDuration = '';
body.removeEventListener('transitionend', onEnd);
body._animEnd = null;
};
body._animEnd = onEnd;
body.addEventListener('transitionend', onEnd);
}
}

Expand Down Expand Up @@ -133,7 +164,7 @@ function rebuildPhotoList() {

const decadeHdr = document.createElement('div');
decadeHdr.className = _expandedDecades.has(dk) ? 'year-hdr' : 'year-hdr collapsed';
decadeHdr.innerHTML = `<span class="year-hdr-arrow">▼</span><span class="year-hdr-label">${decadeLabel}</span><span class="year-hdr-count">${totalCount}</span><span class="year-hdr-line"></span>`;
decadeHdr.innerHTML = `<span class="year-hdr-label">${decadeLabel}</span><span class="year-hdr-count">${totalCount}</span><span class="year-hdr-line"></span>`;
decadeGroup.appendChild(decadeHdr);

const decadeBody = document.createElement('div');
Expand All @@ -147,7 +178,7 @@ function rebuildPhotoList() {

const yearHdr = document.createElement('div');
yearHdr.className = _expandedYears.has(yr) ? 'year-hdr' : 'year-hdr collapsed';
yearHdr.innerHTML = `<span class="year-hdr-arrow">▼</span><span class="year-hdr-label">${yr}</span><span class="year-hdr-count">${byDecade[dk][yr].length}</span><span class="year-hdr-line"></span>`;
yearHdr.innerHTML = `<span class="year-hdr-label">${yr}</span><span class="year-hdr-count">${byDecade[dk][yr].length}</span><span class="year-hdr-line"></span>`;
yearGroup.appendChild(yearHdr);

const yearBody = document.createElement('div');
Expand Down Expand Up @@ -296,15 +327,15 @@ function buildTimeline() {
const frag = document.createDocumentFragment();
const tlHdr = document.createElement('div');
tlHdr.style.cssText = 'display:flex;align-items:center;justify-content:space-between';
tlHdr.innerHTML = `<div class="section-label">Timeline</div><button class="collapse-all-btn" id="tl-collapse-all" onclick="toggleAllYears('timeline')" title="Collapse/Expand all">▼</button>`;
tlHdr.innerHTML = `<div class="section-label">Timeline</div><button class="collapse-all-btn" id="tl-collapse-all" onclick="toggleAllYears('timeline')"></button>`;
frag.appendChild(tlHdr);
Object.keys(byYear).sort().forEach(yr=>{
const group = document.createElement('div');
group.className = 'year-group';
const collapsed = _tlCollapsedYears.has(yr);
const hdr = document.createElement('div');
hdr.className = collapsed ? 'year-hdr collapsed' : 'year-hdr';
hdr.innerHTML = `<span class="year-hdr-arrow">▼</span><span class="year-hdr-label">${yr}</span><span class="year-hdr-count">${yearCounts[yr]}</span><span class="year-hdr-line"></span>`;
hdr.innerHTML = `<span class="year-hdr-label">${yr}</span><span class="year-hdr-count">${yearCounts[yr]}</span><span class="year-hdr-line"></span>`;
group.appendChild(hdr);

const body = document.createElement('div');
Expand Down