From 812a69942fd977b4b7f47354b54dfcbf8857b8da Mon Sep 17 00:00:00 2001 From: Me Here Date: Sun, 7 Jun 2026 09:32:28 -0500 Subject: [PATCH] =?UTF-8?q?pm-mobile:=20sessions=20page=20=E2=80=94=20per-?= =?UTF-8?q?track=20comparison=20+=20collapsible=20sessions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Top section aggregates the CURRENT track across all sessions (track picker defaults to the metronome's current track, persisted via metronome.curtrack): total time / plays / bpm range, plus a per-session comparison table so you can watch a single track progress across days. - Each session is now a collapsible
: the summary shows a friendly timestamp ("Fri Jun 16 at 2:46 PM") with total/practiced/track-count; the note + per-track aggregate table + delete live in the expanded body. Co-Authored-By: Claude Opus 4.8 (1M context) --- mobile-sessions.html | 134 ++++++++++++++++++++++++++++++++----------- mobile.html | 2 + 2 files changed, 104 insertions(+), 32 deletions(-) diff --git a/mobile-sessions.html b/mobile-sessions.html index 0a0fe00..f01c3f1 100644 --- a/mobile-sessions.html +++ b/mobile-sessions.html @@ -43,22 +43,39 @@ .icon{ flex:0 0 auto; width:40px; height:40px; border-radius:50%; display:flex; align-items:center; justify-content:center; font-size:17px; cursor:pointer; color:var(--txt); background:rgba(127,139,154,.14); border:1px solid var(--panel-bd); } - .summary{ color:var(--muted); font-size:13px; margin:2px 2px 14px; } .card{ background:var(--panel-bg); border:1px solid var(--panel-bd); border-radius:14px; padding:14px; margin-bottom:14px; } - .chead{ display:flex; align-items:baseline; justify-content:space-between; gap:10px; flex-wrap:wrap; } - .chead .when{ font-size:15px; font-weight:600; } - .chead .del{ background:transparent; border:1px solid var(--panel-bd); color:var(--muted); border-radius:9px; padding:6px 11px; font-size:12px; cursor:pointer; } - .chead .del:hover{ color:#ff7a7a; border-color:#ff7a7a; } + .seclabel{ font-size:11px; letter-spacing:.1em; text-transform:uppercase; color:var(--muted); margin:6px 2px 8px; } + + /* current-track aggregate (compare across sessions) */ + #trackAgg .ta-head{ display:flex; align-items:center; gap:10px; flex-wrap:wrap; margin-bottom:4px; } + #taSel{ flex:1 1 auto; min-width:0; background:var(--field-bg); color:var(--txt); border:1px solid var(--field-bd); + border-radius:10px; padding:9px 8px; font-size:16px; font-weight:600; } .stat{ font-size:13px; color:var(--muted); margin:4px 0 12px; } .stat b{ color:var(--txt); } - textarea.note{ width:100%; background:var(--field-bg); color:var(--txt); border:1px solid var(--field-bd); border-radius:10px; - padding:10px; font-family:inherit; font-size:14px; resize:vertical; min-height:46px; margin-bottom:12px; } + table{ width:100%; border-collapse:collapse; font-size:14px; } th,td{ text-align:left; padding:8px 8px; border-bottom:1px solid var(--panel-bd); } th{ font-size:11px; letter-spacing:.08em; text-transform:uppercase; color:var(--muted); font-weight:600; } td.num,th.num{ text-align:right; font-variant-numeric:tabular-nums; } tr:nth-child(even) td{ background:var(--row); } tfoot td{ font-weight:700; border-top:2px solid var(--panel-bd); border-bottom:none; } + + /* session list — collapsible */ + details.sess{ background:var(--panel-bg); border:1px solid var(--panel-bd); border-radius:14px; margin-bottom:12px; overflow:hidden; } + details.sess > summary{ list-style:none; cursor:pointer; padding:13px 14px; display:flex; flex-direction:column; gap:3px; } + details.sess > summary::-webkit-details-marker{ display:none; } + summary .when{ font-size:15px; font-weight:600; display:flex; align-items:center; gap:9px; } + summary .when::before{ content:"▸"; color:var(--muted); font-size:13px; transition:transform .15s; } + details[open] > summary .when::before{ transform:rotate(90deg); } + summary .sstat{ font-size:12px; color:var(--muted); padding-left:22px; } + summary .sstat b{ color:var(--txt); } + .sbody{ padding:2px 14px 14px; } + .sbody .brow{ display:flex; justify-content:flex-end; margin-bottom:10px; } + .del{ background:transparent; border:1px solid var(--panel-bd); color:var(--muted); border-radius:9px; padding:6px 11px; font-size:12px; cursor:pointer; } + .del:hover{ color:#ff7a7a; border-color:#ff7a7a; } + textarea.note{ width:100%; background:var(--field-bg); color:var(--txt); border:1px solid var(--field-bd); border-radius:10px; + padding:10px; font-family:inherit; font-size:14px; resize:vertical; min-height:46px; margin-bottom:12px; } + .empty{ text-align:center; color:var(--muted); padding:60px 16px; } .empty .big{ font-size:46px; opacity:.5; } .foot{ text-align:center; color:var(--muted); font-size:12px; margin-top:24px; } @@ -73,8 +90,17 @@

Practice sessions

-
+ + + +
+
VARASYSVARASYS  PolyMeter @@ -84,51 +110,93 @@ diff --git a/mobile.html b/mobile.html index a871ef6..4f6e873 100644 --- a/mobile.html +++ b/mobile.html @@ -382,9 +382,11 @@ function buildDetail(){ if(ramp.on) add("ramp "+ramp.startBpm+"→ +"+ramp.amount+"/"+ramp.everyBars+"bar","r"); if(trainer.on) add("gap "+trainer.playBars+"/"+trainer.muteBars+" play/mute","g"); } +let lastCur=null; function renderInfo(){ if(!editingBpm) $("bpm").textContent=state.bpm; const ts=$("trkSel"); if(ts && ts.value!==String(idx)) ts.value=String(idx); + const nm=currentName(); if(nm!==lastCur){ lastCur=nm; lsSet("metronome.curtrack",nm); } // sessions page reads this buildDetail(); updateStatus(); } function updateStatus(){