From 6630577bb92236364c6dd24496c46fe4905a986e Mon Sep 17 00:00:00 2001 From: laptran Date: Sat, 13 Jun 2026 17:52:35 -0400 Subject: [PATCH] Convert task detail panel to centered modal --- .../core/__pycache__/board.cpython-314.pyc | Bin 8904 -> 0 bytes automaton/dashboard/html/dashboard.js | 7 +++--- automaton/dashboard/html/index.html | 16 +++++++------ automaton/dashboard/html/styles.css | 22 +++++++++++------- .../ui/__pycache__/app.cpython-314.pyc | Bin 14151 -> 20996 bytes 5 files changed, 27 insertions(+), 18 deletions(-) delete mode 100644 automaton/dashboard/core/__pycache__/board.cpython-314.pyc diff --git a/automaton/dashboard/core/__pycache__/board.cpython-314.pyc b/automaton/dashboard/core/__pycache__/board.cpython-314.pyc deleted file mode 100644 index 00d5e1e30c3155bb433528770d0b02172e438155..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8904 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 diff --git a/automaton/dashboard/html/dashboard.js b/automaton/dashboard/html/dashboard.js index 1e2842b..b146206 100644 --- a/automaton/dashboard/html/dashboard.js +++ b/automaton/dashboard/html/dashboard.js @@ -180,10 +180,10 @@ function renderTaskCard(task) { } function renderDetail(task) { - const detail = document.getElementById('detail-panel'); + const overlay = document.getElementById('detail-overlay'); const title = document.getElementById('detail-title'); const content = document.getElementById('detail-content'); - detail.classList.add('open'); + overlay.classList.add('open'); const statusClass = task.state === 'done' ? 'done' : task.state === 'blocked' ? 'blocked' : 'in_progress'; const statusText = task.state === 'done' ? '✅ PASS' : task.state === 'blocked' ? '❌ BLOCKED' : '🔄 IN PROGRESS'; const phaseGroup = getPhaseGroupForState(task.state); @@ -222,7 +222,7 @@ function renderDetail(task) { } function closeDetail() { - document.getElementById('detail-panel').classList.remove('open'); + document.getElementById('detail-overlay').classList.remove('open'); state.selectedTask = null; } @@ -431,6 +431,7 @@ function setupUI() { document.getElementById('btn-help').addEventListener('click', () => { document.getElementById('help-modal').classList.toggle('open'); }); document.getElementById('btn-close-help').addEventListener('click', () => { document.getElementById('help-modal').classList.remove('open'); }); document.getElementById('btn-close-detail').addEventListener('click', closeDetail); + document.getElementById('detail-overlay').addEventListener('click', (e) => { if (e.target === e.currentTarget) closeDetail(); }); document.getElementById('filter-phase').addEventListener('change', (e) => { state.filterPhase = e.target.value; renderCurrentView(); }); document.getElementById('filter-review').addEventListener('change', (e) => { state.filterReview = e.target.value; renderCurrentView(); }); document.getElementById('filter-wave').addEventListener('change', (e) => { state.filterWave = e.target.value; renderCurrentView(); }); diff --git a/automaton/dashboard/html/index.html b/automaton/dashboard/html/index.html index f1ba43d..81018dc 100644 --- a/automaton/dashboard/html/index.html +++ b/automaton/dashboard/html/index.html @@ -84,13 +84,15 @@ -
-
-

Select a task

- -
-
-

Click on a task to view details

+ diff --git a/automaton/dashboard/html/styles.css b/automaton/dashboard/html/styles.css index 84685e4..b3b9914 100644 --- a/automaton/dashboard/html/styles.css +++ b/automaton/dashboard/html/styles.css @@ -137,15 +137,21 @@ body { .subtask-status.pass { color: var(--success); } .subtask-status.fail { color: var(--error); } .subtask-status.incomplete { color: var(--text-muted); } -.detail-panel { - position: fixed; right: 0; top: 0; bottom: 0; width: 380px; - background: var(--bg-secondary); border-left: 1px solid var(--border-color); - z-index: 100; display: none; flex-direction: column; overflow-y: auto; +.modal-overlay { + position: fixed; inset: 0; background: rgba(0,0,0,0.6); + z-index: 100; display: none; align-items: center; justify-content: center; + backdrop-filter: blur(2px); } -.detail-panel.open { display: flex; } -.detail-header { display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; border-bottom: 1px solid var(--border-color); } -.detail-header h3 { font-size: 14px; font-weight: 600; color: var(--text-primary); } -.detail-content { padding: 12px 16px; flex: 1; } +.modal-overlay.open { display: flex; } +.modal-panel { + background: var(--bg-secondary); border: 1px solid var(--border-color); + border-radius: 12px; width: 90%; max-width: 720px; max-height: 85vh; + display: flex; flex-direction: column; overflow: hidden; + box-shadow: 0 20px 60px rgba(0,0,0,0.3); +} +.detail-header { display: flex; justify-content: space-between; align-items: center; padding: 16px 20px; border-bottom: 1px solid var(--border-color); flex-shrink: 0; } +.detail-header h3 { font-size: 16px; font-weight: 600; color: var(--text-primary); } +.detail-content { padding: 16px 20px; overflow-y: auto; flex: 1; } .detail-empty { text-align: center; padding: 40px; color: var(--text-muted); font-size: 13px; } .detail-section { margin-bottom: 16px; } .detail-section h4 { font-size: 11px; font-weight: 600; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 6px; } diff --git a/automaton/dashboard/ui/__pycache__/app.cpython-314.pyc b/automaton/dashboard/ui/__pycache__/app.cpython-314.pyc index a87c70fec925cd2f2f8dd52289337a968eb34ac5..2dc6896519e3503030a99d039f81828ec24e1e7b 100644 GIT binary patch delta 7891 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 KrvvZz< zN;R#uCM{91Q_X`VtG z(pzw9o#RaFD!39X(+*=6#q^}}RFmRrM&1R2}y?o*CzsZq^pCG|u$pON9bZEvKls8+-`Dn(N2 zuGN96m9*+q2KwX&`AhJ;e7?uo@xC*1)fsvA@HOXci!yV0-gic?I-}Q|@ntsui?*U< z{^wI1{GRRn6ddvlTf-Q!h{Fq>oF|5&PVcFgixnXh0oOgJtqC#+L(QAF_LJBLZ+a7a zo_~m1DCCx z@JyhCx51Z^e)wI$&7JV)!1-W4;}$aQZztSMI7AqSbKUEPzeeIcgu{e;3HK51N9c~0 z&&O4zo{? z9QCez>_RJ*9Qf7NTu{C|l*qXw3w{sE3%6x+UGca4ag_hycI1Nab_h0=&@`Vh3mZPg zB;gJODvVR7Sy4r(c*ZOhj|(FMJs3idRh?2Am4{$1yn(0Z{}B$Gc>zqZO-5*98*GpH zBU@>GoIt5H4mD$2-5MIP0I$I#u{Eu8iNd8=hJS1R@3F_Y+l%J-N_qLTiLnxg4?|t> zVcIqSQg4sRlC?E#a3rUZmkiTd4MoMC=xz*%Q54uS8K)aQW$4_ z5LfCJYB5o!O)50D)3{hJ;e!e^H61s8tz7iN<>4SSQnK|qoKr(^I`yBSMPHlG@rZq~ z`)0Y=ugQHYO%Ds*Z&XUCU3H@MLL!md=zS}Y&E4UjzjxbOequdp|J_k)G-}l;>};i; zrJ5E)s1_R#`HQmHMS~n+lyE0uH$u0NtuB>kXBw(*t<bt{(13j98fXBE5qSdnQXy$drg-Zd^9}4)39r2 zvi~F+UA$Sdx^-F+GbK&8l*CcBmHX5h%>AP~2g1KcOI1RgWgo~+kw!^8j>u77*WY^%mSe&YrRJB~i&M&GQ=Z9PI zc9SWA7OInQb!2d(OX_V#Gt!3UI1fnK=6aKKlsDy&w5_?>FD06T5>B;Sq!E6@$tBk! zLx?mey9UloENEswQ&@p(mV$Gf4e^3Gz-n^Ag6ybqO)_+np|g@s!`lz7Y=%ZQG&VzH zH#B&WqK#Z=)9mSL+&P`vS%JBE?AA?!&I5NoTQGs@E0#T2zWf_**V)dYi#YE{hq=eC4X|Ra*1| z!Vd{0LKWPjfoOun&rYir)TQu;NzIKWX{Y0(qqx)D= zkC7&`n62v_wJz3GWb|C%i!TKH}C^ewmbn1qNFVY>pe(2#qtb)^-n*!48CO zQdF@K;K1oI!!@dqR;?6i)>5mgcu}3GJfyZh97cX23i}x7Z c_tnRGCQRIQC6N7?k#J)~O7rA0Ll|rR3)gFUod5s;