1713 lines
109 KiB
HTML
1713 lines
109 KiB
HTML
<!doctype html>
|
||
<html lang="en">
|
||
<head>
|
||
<meta charset="utf-8" />
|
||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||
<meta name="theme-color" content="#0b1220" />
|
||
<link rel="manifest" href="manifest.webmanifest" />
|
||
<title>Stackchain Dashboard</title>
|
||
<link rel="stylesheet" href="static/dashboard.css" />
|
||
</head>
|
||
<body>
|
||
<canvas id="bg"></canvas>
|
||
<header>
|
||
<div class="app-brand"><span class="obi"></span><strong>Stackchain</strong><span class="muted">Dashboard</span></div>
|
||
<button class="app-live-status" id="open-live-data-status" type="button" aria-controls="live-data-status-sheet" aria-expanded="false"><span class="dot"></span><span class="small" id="status">Live</span></button>
|
||
<details class="app-menu">
|
||
<summary id="app-menu-toggle" aria-label="Open dashboard menu">Menu</summary>
|
||
<div class="app-menu-panel">
|
||
<button id="open-insights" type="button" aria-controls="insights-sheet">Insights</button>
|
||
<button id="refresh">Refresh</button>
|
||
<button id="open-palette">Command</button>
|
||
<button id="open-device-setup" type="button">Device setup</button>
|
||
<button id="active-devices" type="button">Active devices</button>
|
||
<button id="sign-out" type="button">Sign out & clear this device</button>
|
||
<button id="sign-out-all" type="button">Sign out all devices</button>
|
||
<span class="small muted" id="clock"></span>
|
||
</div>
|
||
</details>
|
||
</header>
|
||
<div id="live-data-status-sheet" class="live-data-status-sheet" hidden>
|
||
<section class="live-data-status-panel" role="dialog" aria-modal="true" aria-labelledby="live-data-status-heading">
|
||
<div class="live-data-status-header">
|
||
<div><h2 id="live-data-status-heading">Live data status</h2><p class="small muted">Check which dashboard feeds are current before acting.</p></div>
|
||
<button id="close-live-data-status" type="button" aria-label="Close live data status">Close</button>
|
||
</div>
|
||
<div id="live-data-status-feeds" class="live-data-status-feeds"></div>
|
||
<p id="live-data-status-retry" class="small muted"></p>
|
||
<div class="live-data-status-actions">
|
||
<button id="refresh-live-data" type="button">Refresh now</button>
|
||
<span id="live-data-status-result" class="small" role="status" aria-live="polite"></span>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
<div class="offline-status" id="offline-status" role="status" aria-live="polite" hidden>
|
||
Offline · live Gitea data is unavailable. Saved drafts remain available on this device.
|
||
</div>
|
||
|
||
<div id="active-devices-sheet" class="active-devices-sheet" hidden>
|
||
<section class="active-devices-panel" role="dialog" aria-modal="true" aria-label="Active devices and passkeys">
|
||
<div class="active-devices-header">
|
||
<div><h2>Security Center</h2><p class="small muted">Investigate activity, remove untrusted access, and verify the result.</p></div>
|
||
<button id="close-active-devices" type="button" aria-label="Close active devices">Close</button>
|
||
</div>
|
||
<nav class="security-section-nav" aria-label="Security Center sections">
|
||
<button id="security-section-activity" type="button">Activity</button>
|
||
<button id="security-section-devices" type="button">Devices</button>
|
||
<button id="security-section-passkeys" type="button">Passkeys</button>
|
||
</nav>
|
||
<section id="security-activity-section" class="security-activity" aria-labelledby="security-activity-title">
|
||
<div class="security-activity-header">
|
||
<h3 id="security-activity-title">Security activity</h3>
|
||
<p class="small muted">Recent sign-ins, device changes, and protected actions.</p>
|
||
</div>
|
||
<div id="security-activity-status" class="small" role="status" aria-live="polite"></div>
|
||
<div id="security-activity-list" class="security-activity-list"></div>
|
||
<button id="load-more-security-activity" type="button" hidden>Load older activity</button>
|
||
</section>
|
||
<section id="security-devices-section" class="security-devices" aria-labelledby="security-devices-title">
|
||
<div class="security-activity-header">
|
||
<h3 id="security-devices-title">Active devices</h3>
|
||
<p class="small muted">Review signed-in devices and remove access you no longer trust.</p>
|
||
</div>
|
||
<div id="active-devices-status" class="small" role="status" aria-live="polite"></div>
|
||
<button id="enroll-passkey" type="button">Add a passkey for this device</button>
|
||
<div id="active-devices-list" class="active-devices-list"></div>
|
||
</section>
|
||
<section id="security-passkeys-section" class="enrolled-passkeys" aria-labelledby="enrolled-passkeys-title">
|
||
<div class="enrolled-passkeys-header">
|
||
<h3 id="enrolled-passkeys-title">Enrolled passkeys</h3>
|
||
<p class="small muted">Passkeys can remain enrolled after a device signs out. Remove credentials you no longer trust.</p>
|
||
<p class="small muted">A recovery token will be required after sign-out if you remove this device’s passkey.</p>
|
||
</div>
|
||
<div id="enrolled-passkeys-status" class="small" role="status" aria-live="polite"></div>
|
||
<div id="enrolled-passkeys-list" class="enrolled-passkeys-list"></div>
|
||
</section>
|
||
</section>
|
||
</div>
|
||
|
||
<div id="device-setup-sheet" class="device-setup-sheet" hidden>
|
||
<section class="device-setup-panel" role="dialog" aria-modal="true" aria-labelledby="device-setup-heading">
|
||
<div class="device-setup-header">
|
||
<div>
|
||
<h2 id="device-setup-heading">Make this device work-ready</h2>
|
||
<p class="small muted">Prepare this phone for fast launch, outages, and new update alerts. Nothing asks for permission until you choose it.</p>
|
||
</div>
|
||
<button id="close-device-setup" type="button" aria-label="Close device setup">Close</button>
|
||
</div>
|
||
<ol class="device-setup-list">
|
||
<li class="device-setup-step">
|
||
<div><strong>Install Stackchain</strong><p class="small" id="device-setup-install-status" role="status"></p></div>
|
||
<button class="device-setup-action" id="device-setup-install" type="button">Install</button>
|
||
</li>
|
||
<li class="device-setup-step">
|
||
<div><strong>Keep work available offline</strong><p class="small" id="device-setup-offline-status" role="status"></p></div>
|
||
<button class="device-setup-action" id="device-setup-offline" type="button">Enable</button>
|
||
</li>
|
||
<li class="device-setup-step">
|
||
<div><strong>Notify me about new updates</strong><p class="small" id="device-setup-push-status" role="status"></p></div>
|
||
<button class="device-setup-action" id="device-setup-push" type="button">Enable</button>
|
||
</li>
|
||
<li class="device-setup-step">
|
||
<div><strong>Remind me about deadlines</strong><p class="small" id="device-setup-deadline-status" role="status"></p></div>
|
||
<div class="device-setup-deadline-controls">
|
||
<label for="device-setup-deadline-hour">Local hour</label>
|
||
<select id="device-setup-deadline-hour" aria-label="Deadline reminder local hour"></select>
|
||
<label for="device-setup-deadline-days">Warn me</label>
|
||
<select id="device-setup-deadline-days" aria-label="Deadline reminder horizon"><option value="0">Due today</option><option value="2" selected>Next 2 days</option><option value="7">Next 7 days</option></select>
|
||
<button class="device-setup-action" id="device-setup-deadline" type="button">Enable</button>
|
||
</div>
|
||
</li>
|
||
</ol>
|
||
<section class="device-storage" aria-labelledby="device-storage-heading">
|
||
<div>
|
||
<h3 id="device-storage-heading">Private device storage</h3>
|
||
<p class="small" id="device-storage-summary" role="status" aria-live="polite">Checking private storage…</p>
|
||
<p class="small muted" id="device-storage-detail"></p>
|
||
</div>
|
||
<div class="device-storage-actions">
|
||
<button id="clear-device-caches" type="button">Clear cached copies</button>
|
||
<button id="clear-private-device-data" type="button">Clear all private data</button>
|
||
</div>
|
||
</section>
|
||
<p id="device-setup-ready-status" class="device-setup-ready" role="status" aria-live="polite"></p>
|
||
</section>
|
||
</div>
|
||
|
||
<main>
|
||
<div id="mobile-pull-refresh" class="mobile-pull-refresh" role="status" aria-live="polite" hidden></div>
|
||
<section class="panel my-work" id="my-work" tabindex="-1">
|
||
<div class="my-work-header">
|
||
<div>
|
||
<h2>My Work</h2>
|
||
<div class="small" id="my-work-status" aria-live="polite">Loading assigned work…</div>
|
||
</div>
|
||
<div class="my-work-actions">
|
||
<button class="plan-today" id="plan-today" type="button">Plan Today</button>
|
||
<button class="today-recap-history-action" id="open-today-recaps" type="button">Recaps</button>
|
||
<button class="start-work-session" id="start-work-session" type="button">Start work</button>
|
||
<button class="resume-today-session" id="resume-today-session" type="button" hidden>Resume Today</button>
|
||
<button class="end-today-session" id="end-today-session" type="button" hidden>End session</button>
|
||
<button class="find-work-action" id="find-work" type="button">Find work</button>
|
||
<button class="new-issue" id="new-issue" type="button">New issue</button>
|
||
</div>
|
||
<details class="work-settings">
|
||
<summary id="work-settings-toggle">Queue & settings · <span id="active-work-queue">All</span></summary>
|
||
<div class="work-settings-panel">
|
||
<div class="work-filters" aria-label="Filter My Work">
|
||
<button class="work-filter" data-work-filter="all" aria-pressed="true">All <span data-work-count="all">0</span></button>
|
||
<button class="work-filter" data-work-filter="today" aria-pressed="false">Today <span data-work-count="today">0</span></button>
|
||
<button class="work-filter" data-work-filter="agenda" aria-pressed="false">Agenda <span data-work-count="agenda">0</span></button>
|
||
<button class="work-filter" data-work-filter="attention" aria-pressed="false">Attention <span data-work-count="attention">0</span></button>
|
||
<button class="work-filter" data-work-filter="filed" aria-pressed="false">Filed <span data-work-count="filed">0</span></button>
|
||
<button class="work-filter" data-work-filter="issue" aria-pressed="false">Issues <span data-work-count="issue">0</span></button>
|
||
<button class="work-filter" data-work-filter="pull" aria-pressed="false">PRs <span data-work-count="pull">0</span></button>
|
||
<button class="work-filter" data-work-filter="review" aria-pressed="false">Reviews <span data-work-count="review">0</span></button>
|
||
<button class="work-filter" data-work-filter="update" aria-pressed="false">Updates <span data-work-count="update">0</span></button>
|
||
<button class="work-filter" data-work-filter="later" aria-pressed="false">Later <span data-work-count="later">0</span></button>
|
||
<button class="work-filter" data-work-filter="draft" aria-pressed="false">Drafts <span data-work-count="draft">0</span></button>
|
||
</div>
|
||
<label class="milestone-lane" for="work-milestone-filter"><span class="small">Release lane</span>
|
||
<select class="work-milestone-filter" id="work-milestone-filter">
|
||
<option value="all">All milestones</option>
|
||
<option value="unplanned">Unplanned</option>
|
||
</select>
|
||
</label>
|
||
<div class="offline-work-controls">
|
||
<label for="keep-work-offline"><input id="keep-work-offline" type="checkbox" /> Keep My Work available offline</label>
|
||
<label for="delivery-receipts"><input id="delivery-receipts" type="checkbox" /> Notify me when queued work finishes</label>
|
||
<label class="push-update-control" for="push-updates"><input id="push-updates" type="checkbox" /> Notify me about new updates</label>
|
||
<span class="small" id="push-update-status" role="status" aria-live="polite"></span>
|
||
<label class="push-update-control" for="push-deadlines"><input id="push-deadlines" type="checkbox" /> Notify me about deadlines</label>
|
||
<label for="push-deadline-hour">Reminder hour <select id="push-deadline-hour" aria-label="Deadline reminder local hour"></select></label>
|
||
<label for="push-deadline-days">Warn me <select id="push-deadline-days" aria-label="Deadline reminder horizon"><option value="0">Due today</option><option value="2" selected>Next 2 days</option><option value="7">Next 7 days</option></select></label>
|
||
<span class="small" id="push-deadline-status" role="status" aria-live="polite"></span>
|
||
<label class="push-update-control" for="today-lock-screen"><input id="today-lock-screen" type="checkbox" /> Show active Today controls on my lock screen</label>
|
||
<span class="small" id="today-lock-screen-status" role="status" aria-live="polite"></span>
|
||
<button id="clear-offline-work" type="button">Clear offline work data</button>
|
||
<button id="retry-offline-storage" type="button" hidden>Retry offline saving</button>
|
||
<span class="small" id="offline-work-status" role="status" aria-live="polite"></span>
|
||
<span class="offline-today-readiness" id="offline-today-readiness" hidden>
|
||
<span class="small" id="offline-today-status" role="status" aria-live="polite"></span>
|
||
<button id="retry-offline-today" type="button" hidden>Retry offline items</button>
|
||
</span>
|
||
<span class="small" id="delivery-receipt-status" role="status" aria-live="polite"></span>
|
||
<div class="install-app-card" id="install-app-card" hidden>
|
||
<p><strong>Install Stackchain</strong><br><span class="small">Keep mobile work one tap away and launch the saved app shell during an outage.</span></p>
|
||
<p class="small" id="install-app-guidance" hidden>On Safari, tap Share, then choose <strong>Add to Home Screen</strong>.</p>
|
||
<button id="install-app" type="button">Install Stackchain</button>
|
||
<button id="dismiss-install-app" type="button">Not now</button>
|
||
</div>
|
||
<span class="small" id="install-app-status" role="status" aria-live="polite"></span>
|
||
</div>
|
||
</div>
|
||
</details>
|
||
</div>
|
||
<aside class="attention-interruption" id="attention-interruption" role="status" aria-live="polite" hidden>
|
||
<span><strong>Today paused</strong> while handling Attention</span>
|
||
<button id="return-to-today" type="button">Return to Today</button>
|
||
</aside>
|
||
<section class="device-readiness-card" id="device-readiness-card" aria-labelledby="device-readiness-heading" hidden>
|
||
<div>
|
||
<strong id="device-readiness-heading">Make this phone work-ready</strong>
|
||
<p class="small muted">Install, save work offline, and enable update alerts.</p>
|
||
<p class="small device-readiness-summary" id="device-readiness-summary" role="status" aria-live="polite"></p>
|
||
</div>
|
||
<div class="device-readiness-actions">
|
||
<button id="finish-device-setup" type="button">Finish setup</button>
|
||
<button id="dismiss-device-readiness" type="button">Not now</button>
|
||
</div>
|
||
</section>
|
||
<div class="update-selection-controls" id="update-selection-controls" hidden>
|
||
<button id="select-work" type="button">Select work</button>
|
||
<button id="cancel-work-selection" type="button" hidden>Cancel selection</button>
|
||
<button id="select-updates" type="button">Select updates</button>
|
||
<button id="cancel-update-selection" type="button" hidden>Cancel selection</button>
|
||
<span class="small" id="update-selection-status" role="status" aria-live="polite"></span>
|
||
</div>
|
||
<div class="selection-scope-actions" id="selection-scope-actions" hidden>
|
||
<button id="select-matching-work" type="button">Select all matches</button>
|
||
<button id="clear-work-selection" type="button">Clear selection</button>
|
||
</div>
|
||
<form class="queue-finder" id="queue-finder" role="search">
|
||
<label for="queue-find-input">Find in <span id="queue-find-label">All</span></label>
|
||
<div class="queue-finder-row">
|
||
<input id="queue-find-input" type="search" autocomplete="off" aria-label="Find in active work queue" placeholder="Repository, #number, or title" />
|
||
<button id="clear-queue-find" type="button" hidden>Clear</button>
|
||
</div>
|
||
<div class="small" id="queue-find-status" role="status" aria-live="polite"></div>
|
||
<button id="search-older-work" type="button" hidden>Search older work</button>
|
||
</form>
|
||
<section class="empty-work-start" id="empty-work-start" aria-labelledby="empty-work-start-heading" hidden>
|
||
<div>
|
||
<strong id="empty-work-start-heading">Ready for something new?</strong>
|
||
<p class="small muted">Find an available issue to own, or create the work that needs doing.</p>
|
||
</div>
|
||
<div class="empty-work-start-actions">
|
||
<button id="empty-work-find" type="button">Find and start work</button>
|
||
<button id="empty-work-create" type="button">Create an issue</button>
|
||
</div>
|
||
</section>
|
||
<section class="agenda-replan" id="agenda-replan" aria-labelledby="agenda-replan-heading" hidden>
|
||
<div class="agenda-replan-launch">
|
||
<div><strong id="agenda-replan-heading">Overdue deadlines</strong><p class="small muted">Make the Agenda credible without leaving the queue.</p></div>
|
||
<button id="start-agenda-replan" type="button">Replan overdue</button>
|
||
</div>
|
||
<div id="agenda-replan-controls" hidden>
|
||
<div class="small" id="agenda-replan-progress" role="status" aria-live="assertive"></div>
|
||
<div class="agenda-replan-actions">
|
||
<button id="agenda-replan-keep" type="button">Keep date & next</button>
|
||
<button id="agenda-replan-tomorrow" type="button">Tomorrow & next</button>
|
||
<label for="agenda-replan-date">Choose a future date</label>
|
||
<input id="agenda-replan-date" type="date" />
|
||
<button id="agenda-replan-choose" type="button">Choose date & next</button>
|
||
<button id="agenda-replan-cancel" type="button">Cancel</button>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
<section class="protect-today" id="protect-today-panel" aria-labelledby="protect-today-heading" hidden>
|
||
<div>
|
||
<strong id="protect-today-heading">Deadlines need a plan</strong>
|
||
<p class="small muted">Put overdue and due-today work first, then review what fits.</p>
|
||
<div class="small" id="protect-today-status" role="status" aria-live="polite"></div>
|
||
</div>
|
||
<button id="protect-today" type="button">Protect Today</button>
|
||
</section>
|
||
<div class="filed-history-tabs" id="filed-history-tabs" role="group" aria-label="Filed outcome view" hidden>
|
||
<button type="button" data-filed-view="needs-review" aria-pressed="true">Needs review <span id="filed-needs-review-count">0</span></button>
|
||
<button type="button" data-filed-view="reviewed" aria-pressed="false">Reviewed <span id="filed-reviewed-count">0</span></button>
|
||
</div>
|
||
<div class="my-work-list" id="my-work-list"></div>
|
||
<div class="small" id="work-page-status" aria-live="polite"></div>
|
||
<button class="load-more-work" id="load-more-work" type="button" hidden>Load older work</button>
|
||
<div class="small" id="notification-page-status" aria-live="polite"></div>
|
||
<button class="load-more-notifications" id="load-more-notifications" type="button" hidden>Load older updates</button>
|
||
<div class="small" id="my-work-action-status" aria-live="assertive"></div>
|
||
<button class="retry-work-route" id="retry-unfiled-draft-sync" type="button" hidden>Retry Draft sync</button>
|
||
<div class="small" id="today-sync-status" aria-live="polite">Today is saved on this device.</div>
|
||
<div class="small" id="today-session-sync-status" role="status" aria-live="polite" hidden></div>
|
||
<div class="small" id="later-sync-status" aria-live="polite">Later is saved on this device.</div>
|
||
<button class="retry-work-route" id="retry-work-route" type="button" hidden>Retry shared work item</button>
|
||
<div class="small" id="work-route-share-status" aria-live="polite"></div>
|
||
<div class="my-work-bulk" id="bulk-mark-read-bar" hidden>
|
||
<div class="my-work-bulk-actions">
|
||
<button id="batch-add-today" type="button" hidden>Add to Today</button>
|
||
<button data-batch-defer="today" type="button" hidden>Later today</button>
|
||
<button data-batch-defer="tomorrow" type="button" hidden>Tomorrow</button>
|
||
<button id="defer-selected-today" data-defer-selected="today" type="button">Later today</button>
|
||
<button id="defer-selected-tomorrow" data-defer-selected="tomorrow" type="button">Tomorrow</button>
|
||
<button id="bulk-mark-read" type="button"></button>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
<section class="insights-shell" id="insights-sheet" aria-labelledby="insights-heading">
|
||
<div class="insights-header">
|
||
<div><h2 id="insights-heading">Insights</h2><p class="small muted">Context, activity, live signals, and workspace tools.</p></div>
|
||
<button id="close-insights" type="button">Close</button>
|
||
</div>
|
||
<aside class="sidebar">
|
||
<details class="panel stack" data-panel-key="context" open>
|
||
<summary><h2>Context & view</h2></summary>
|
||
<div>
|
||
<h2>Context</h2>
|
||
<div class="muted" id="context">Loading…</div>
|
||
</div>
|
||
<div>
|
||
<h2>View</h2>
|
||
<div class="muted" id="view-hint">—</div>
|
||
</div>
|
||
</details>
|
||
<details class="panel stack" data-panel-key="ai-stream" open>
|
||
<summary><h2>AI Stream</h2></summary>
|
||
<div id="ai" class="muted">Loading…</div>
|
||
</details>
|
||
</aside>
|
||
|
||
<section class="stack" id="work">
|
||
<details class="panel" id="issues" data-panel-key="issues" open>
|
||
<summary><h2>Issues</h2></summary>
|
||
<div id="issues-content" class="muted">Loading…</div>
|
||
</details>
|
||
<details class="panel" id="prs" data-panel-key="pull-requests" open>
|
||
<summary><h2>Pull Requests</h2></summary>
|
||
<div id="prs-content" class="muted">Loading…</div>
|
||
</details>
|
||
<details class="panel" data-panel-key="gitea-events" open>
|
||
<summary><h2>Gitea event stream</h2></summary>
|
||
<div id="gitea-events" class="muted" aria-live="polite">Loading…</div>
|
||
<div id="gitea-events-status" class="small" aria-live="polite">Waiting for activity…</div>
|
||
</details>
|
||
<details class="panel" data-panel-key="widgets" open>
|
||
<summary><h2>Live Widgets</h2></summary>
|
||
<div id="widgets" class="stack">
|
||
<div class="widget">
|
||
<h3>Live clock</h3>
|
||
<div class="small" id="widget-clock">—</div>
|
||
</div>
|
||
<div class="widget">
|
||
<h3>Repo mix</h3>
|
||
<div class="small" id="repo-mix">Loading…</div>
|
||
</div>
|
||
</div>
|
||
</details>
|
||
</section>
|
||
|
||
<aside class="sidebar">
|
||
<details class="panel stack" data-panel-key="layout" open>
|
||
<summary><h2>Layout</h2></summary>
|
||
<div class="muted" id="layout-hint">—</div>
|
||
</details>
|
||
<details class="panel stack" data-panel-key="markdown" open>
|
||
<summary><h2>Markdown</h2></summary>
|
||
<textarea id="md-input" placeholder="# Write markdown here...
|
||
- bullet
|
||
- **bold**
|
||
- `code`"></textarea>
|
||
<div id="md-preview" style="margin-top:8px;"></div>
|
||
</details>
|
||
</aside>
|
||
</section>
|
||
</main>
|
||
|
||
<div class="plan-today-sheet" id="plan-today-sheet" role="dialog" aria-modal="true" aria-labelledby="plan-today-title" hidden>
|
||
<section class="plan-today-panel">
|
||
<div class="plan-today-header">
|
||
<div><h2 id="plan-today-title">Plan Today</h2><p class="small muted">Choose and order the work you want to finish next.</p></div>
|
||
<button id="cancel-plan-today" type="button">Cancel</button>
|
||
</div>
|
||
<nav class="mobile-plan-today-nav" aria-label="Plan Today sections">
|
||
<button type="button" data-plan-today-section="fit" aria-current="location">Fit</button>
|
||
<button type="button" data-plan-today-section="today">Today</button>
|
||
<button type="button" data-plan-today-section="available">Available</button>
|
||
</nav>
|
||
<section id="plan-today-fit" aria-label="Fit today's work">
|
||
<div class="plan-today-capacity" id="plan-today-capacity" role="status" aria-live="polite">0 of 5 selected</div>
|
||
<label class="plan-today-available" for="plan-today-available">Available today
|
||
<span><input id="plan-today-available" type="number" inputmode="numeric" min="15" max="1440" step="15" placeholder="Minutes" /> min</span>
|
||
</label>
|
||
<button class="plan-today-build" id="build-today-plan" type="button">Build my Today</button>
|
||
<div class="small plan-today-build-status" id="plan-today-build-status" role="status" aria-live="polite"></div>
|
||
<section class="plan-today-estimates" id="plan-today-estimates" aria-labelledby="plan-today-estimates-heading" hidden>
|
||
<h3 id="plan-today-estimates-heading">Estimate to finish your plan</h3>
|
||
<p class="small muted">Add minutes for ready work and your plan will re-fit immediately.</p>
|
||
<div id="plan-today-estimate-list"></div>
|
||
</section>
|
||
<div class="plan-today-skipped" id="plan-today-skipped"></div>
|
||
<div class="small plan-today-error" id="plan-today-error" role="alert"></div>
|
||
<button class="discard-recap-replan" id="discard-recap-replan" type="button" hidden>Discard recap feedback</button>
|
||
</section>
|
||
<section id="plan-today-selected" aria-labelledby="today-plan-heading">
|
||
<h3 id="today-plan-heading">Today, in order</h3>
|
||
<div class="plan-today-list" id="plan-today-list"></div>
|
||
</section>
|
||
<section id="plan-today-available-work" aria-labelledby="today-candidates-heading">
|
||
<h3 id="today-candidates-heading">Available My Work</h3>
|
||
<div class="plan-today-candidates" id="plan-today-candidates"></div>
|
||
</section>
|
||
<div class="plan-today-actions">
|
||
<button id="save-today-plan" type="button">Save plan</button>
|
||
<button id="save-and-start-today" type="button">Save & start</button>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
|
||
<div class="today-interruption-sheet" id="today-interruption-sheet" role="dialog" aria-modal="true" aria-labelledby="today-interruption-title" hidden>
|
||
<section class="today-interruption-panel">
|
||
<div class="small">Today timer</div>
|
||
<h2 id="today-interruption-title">Were you working while away?</h2>
|
||
<p id="today-interruption-description" class="small"></p>
|
||
<p class="small muted">Choose once before the timer continues. You can include the full interval or remove it from your recap.</p>
|
||
<div class="today-interruption-actions">
|
||
<button type="button" data-today-interruption="count">Count this time</button>
|
||
<button type="button" data-today-interruption="exclude">Exclude this time</button>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
|
||
<div class="today-recap-sheet" id="today-recap-sheet" role="dialog" aria-modal="true" aria-labelledby="today-recap-title" hidden>
|
||
<section class="today-recap-panel">
|
||
<div class="today-recap-header">
|
||
<div><div class="small">Estimate feedback</div><h2 id="today-recap-title">Today recap</h2></div>
|
||
<button id="close-today-recap" type="button">Close</button>
|
||
</div>
|
||
<p class="small muted">Review actual time before saving. Gitea time logging is explicit and unchecked by default.</p>
|
||
<div id="today-recap-status" class="small" role="status" aria-live="polite"></div>
|
||
<div id="today-recap-items" class="today-recap-items"></div>
|
||
<div id="today-recap-totals" class="today-recap-totals"></div>
|
||
<section aria-labelledby="today-recap-history-title">
|
||
<h3 id="today-recap-history-title">Recent recaps</h3>
|
||
<div id="today-recap-history" class="today-recap-history"></div>
|
||
</section>
|
||
<div class="today-recap-actions">
|
||
<button id="save-today-recap" type="button">Save recap & wrap up</button>
|
||
<button id="save-log-today-recap" type="button">Log selected time to Gitea</button>
|
||
<button id="discard-today-recap" type="button">Keep timer & close</button>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
|
||
<dialog class="today-handoff-dialog" id="today-handoff-dialog" aria-labelledby="today-handoff-title">
|
||
<section class="today-handoff-panel">
|
||
<header><div><div class="small">Yesterday’s commitments</div><h2 id="today-handoff-title">Review tomorrow’s plan</h2></div><button id="close-today-handoff" type="button">Not now</button></header>
|
||
<p class="small muted">Choose the work you still intend to do Today. Unchecked work stays safely in My Work.</p>
|
||
<div id="today-handoff-status" class="small" role="status" aria-live="polite"></div>
|
||
<div id="today-handoff-items" class="today-handoff-items"></div>
|
||
<div class="today-handoff-actions"><button id="confirm-today-handoff" type="button">Add selected to Today</button></div>
|
||
</section>
|
||
</dialog>
|
||
|
||
<div class="today-wrap-up-sheet" id="today-wrap-up-sheet" role="dialog" aria-modal="true" aria-labelledby="today-wrap-up-title" hidden>
|
||
<section class="today-wrap-up-panel">
|
||
<div class="today-wrap-up-header">
|
||
<div><div class="small">End your day intentionally</div><h2 id="today-wrap-up-title">Wrap up Today</h2></div>
|
||
<button id="close-today-wrap-up" type="button">Not now</button>
|
||
</div>
|
||
<p class="small muted">Choose unfinished work to schedule for tomorrow at 09:00. Unchecked work stays in Today.</p>
|
||
<div id="today-wrap-up-status" class="small" role="status" aria-live="polite"></div>
|
||
<div id="today-wrap-up-items" class="today-wrap-up-items"></div>
|
||
<div class="today-wrap-up-actions">
|
||
<button id="finish-today-wrap-up" type="button">Finish wrap-up</button>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
|
||
<div class="today-readiness-sheet" id="today-readiness-sheet" role="dialog" aria-modal="true" aria-labelledby="today-readiness-title" hidden>
|
||
<section class="today-readiness-panel">
|
||
<div class="today-readiness-header">
|
||
<div><div class="small">Today readiness</div><h2 id="today-readiness-title">This item is blocked</h2></div>
|
||
<button id="today-readiness-close" type="button">Close</button>
|
||
</div>
|
||
<p id="today-readiness-summary" aria-live="polite"></p>
|
||
<div class="today-readiness-item" id="today-readiness-item"></div>
|
||
<div class="issue-blocker-list" id="today-readiness-blockers"></div>
|
||
<div class="today-readiness-actions">
|
||
<button id="today-readiness-next" type="button">Start next ready</button>
|
||
<button id="today-readiness-anyway" type="button">Work this item anyway</button>
|
||
<button id="today-readiness-retry" type="button">Retry status</button>
|
||
<button id="today-readiness-plan" type="button">Review Today plan</button>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
|
||
<div class="plan-preview-actions" id="plan-preview-actions" hidden>
|
||
<button id="back-to-plan" type="button">Back to plan</button>
|
||
<button id="add-plan-preview" type="button">Add to Today & back</button>
|
||
</div>
|
||
|
||
<div class="issue-filing-receipt" id="issue-filing-receipt" role="dialog" aria-modal="true" aria-labelledby="issue-filing-receipt-heading" hidden>
|
||
<section class="issue-filing-receipt-panel">
|
||
<div class="small">Issue created</div>
|
||
<h2 id="issue-filing-receipt-heading" tabindex="-1">Ready to hand off</h2>
|
||
<div id="issue-filing-receipt-key" class="small"></div>
|
||
<h3 id="issue-filing-receipt-title"></h3>
|
||
<p id="issue-filing-receipt-ownership"></p>
|
||
<p id="issue-filing-receipt-status" class="small" aria-live="polite"></p>
|
||
<div class="issue-filing-receipt-actions">
|
||
<button id="issue-filing-receipt-filed" type="button">View in Filed</button>
|
||
<a id="issue-filing-receipt-open" class="button-link" href="#" target="_blank" rel="noopener noreferrer">Open in Gitea</a>
|
||
<button id="issue-filing-receipt-share" type="button">Share link</button>
|
||
<button id="issue-filing-receipt-related" type="button">File related issue</button>
|
||
<button id="issue-filing-receipt-another" type="button">File another</button>
|
||
<button id="issue-filing-receipt-done" type="button">Done</button>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
|
||
<div id="cmd-palette" role="dialog" aria-label="Command palette">
|
||
<div class="cmd-palette-header">
|
||
<strong>Search work</strong>
|
||
<div class="cmd-palette-header-actions">
|
||
<button id="select-search-results" type="button">Select</button>
|
||
<button id="close-command-palette" type="button">Close</button>
|
||
</div>
|
||
</div>
|
||
<input id="cmd-input" type="text" role="combobox" aria-autocomplete="list" aria-controls="cmd-results" aria-expanded="false" placeholder="Search commands, issues, and pull requests..." />
|
||
<fieldset class="cmd-search-scope">
|
||
<legend>Filter search results</legend>
|
||
<label for="cmd-search-kind">Type</label>
|
||
<select id="cmd-search-kind">
|
||
<option value="all">All work</option>
|
||
<option value="issue">Issues</option>
|
||
<option value="pull">Pull requests</option>
|
||
</select>
|
||
<label for="cmd-search-state">Status</label>
|
||
<select id="cmd-search-state">
|
||
<option value="all">Any status</option>
|
||
<option value="open">Open</option>
|
||
<option value="closed">Closed</option>
|
||
</select>
|
||
<label for="cmd-search-repository">Repository</label>
|
||
<input id="cmd-search-repository" type="search" list="cmd-search-repositories" autocomplete="off" placeholder="All repositories" aria-describedby="cmd-repository-status" />
|
||
<datalist id="cmd-search-repositories"></datalist>
|
||
<span id="cmd-repository-status" class="cmd-repository-status" aria-live="polite"></span>
|
||
</fieldset>
|
||
<section class="saved-searches" aria-labelledby="saved-searches-heading">
|
||
<div class="saved-search-header">
|
||
<strong id="saved-searches-heading">Saved searches</strong>
|
||
<span id="saved-search-status" class="small" aria-live="polite"></span>
|
||
</div>
|
||
<div class="saved-search-create">
|
||
<label for="saved-search-name" class="sr-only">Saved search name</label>
|
||
<input id="saved-search-name" type="text" maxlength="60" autocomplete="off" placeholder="Name this search" />
|
||
<button id="save-current-search" class="saved-search-action" type="button">Save search</button>
|
||
</div>
|
||
<div id="saved-search-list" class="saved-search-list" aria-label="Saved searches"></div>
|
||
</section>
|
||
<div id="cmd-search-action-status" class="small" aria-live="polite"></div>
|
||
<button id="resume-search-batch" class="search-batch-recovery" type="button" hidden>Resume batch</button>
|
||
<div id="cmd-results" class="stack" role="listbox" aria-label="Commands and work search results"></div>
|
||
<button id="cmd-load-more" hidden>More results</button>
|
||
<div class="search-batch-actions" id="search-batch-actions" hidden>
|
||
<span id="search-selection-status" class="small" aria-live="polite">No issues selected.</span>
|
||
<button id="cancel-search-selection" type="button">Cancel</button>
|
||
<button id="defer-selected-search-results" type="button" disabled>Defer</button>
|
||
<button id="plan-selected-search-results" type="button" disabled>Plan release</button>
|
||
<button id="queue-selected-search-results" type="button" disabled>Assign & add to Today</button>
|
||
</div>
|
||
<section class="search-batch-estimate-review" id="search-batch-estimate-review"
|
||
aria-labelledby="search-batch-estimate-heading" hidden>
|
||
<div><strong id="search-batch-estimate-heading">Fit this work into Today</strong>
|
||
<span class="small" id="search-batch-estimate-summary" aria-live="polite"></span></div>
|
||
<div id="search-batch-estimate-list"></div>
|
||
<div class="search-batch-estimate-actions">
|
||
<button id="cancel-search-batch-estimates" type="button">Back</button>
|
||
<button id="confirm-search-batch-estimates" type="button">Confirm & assign</button>
|
||
</div>
|
||
</section>
|
||
<section class="search-release-review" id="search-release-review"
|
||
aria-labelledby="search-release-heading" hidden>
|
||
<div><strong id="search-release-heading">Plan selected issues into a release</strong>
|
||
<span class="small" id="search-release-summary" aria-live="polite"></span></div>
|
||
<label>Open milestone<select id="search-release-milestone" required></select></label>
|
||
<label>Shared due date <span class="small">(optional)</span>
|
||
<input id="search-release-due-date" type="date" /></label>
|
||
<div id="search-release-list"></div>
|
||
<div class="search-release-actions">
|
||
<button id="cancel-search-release" type="button">Back</button>
|
||
<button id="confirm-search-release" type="button">Assign & plan</button>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
|
||
<div class="search-preview" id="search-preview" role="dialog" aria-modal="true" aria-labelledby="search-preview-title">
|
||
<section class="search-preview-panel">
|
||
<div class="search-preview-header">
|
||
<div>
|
||
<div class="small" id="search-preview-key"></div>
|
||
<h3 id="search-preview-title">Work preview</h3>
|
||
</div>
|
||
<button id="close-search-preview" type="button">Back to search</button>
|
||
</div>
|
||
<nav class="mobile-search-preview-nav" aria-label="Search preview sections">
|
||
<button type="button" data-search-preview-section="overview">Overview</button>
|
||
<button type="button" data-search-preview-section="conversation">Conversation</button>
|
||
<button type="button" data-search-preview-section="reply">Reply</button>
|
||
<button type="button" data-search-preview-section="actions">Act</button>
|
||
</nav>
|
||
<section id="search-preview-overview" class="search-preview-overview">
|
||
<div id="search-preview-status" class="small" aria-live="polite">Choose a search result.</div>
|
||
<div id="search-preview-meta" class="row"></div>
|
||
<div id="search-preview-body" class="search-preview-body markdown-content"></div>
|
||
</section>
|
||
<section id="search-preview-conversation" class="search-preview-conversation" aria-labelledby="search-preview-conversation-title">
|
||
<h2 id="search-preview-conversation-title">Current conversation</h2>
|
||
<div id="search-preview-comments"></div>
|
||
<div id="search-preview-conversation-status" class="small" aria-live="polite"></div>
|
||
<button id="retry-search-preview-conversation" type="button" hidden>Retry conversation</button>
|
||
<button id="load-older-search-preview-comments" type="button" hidden>Load older messages</button>
|
||
</section>
|
||
<section class="search-preview-reply" id="search-preview-reply-workspace" aria-labelledby="search-preview-reply-title" hidden>
|
||
<h2 id="search-preview-reply-title">Reply</h2>
|
||
<textarea id="search-preview-reply" maxlength="10000" placeholder="Write a reply"></textarea>
|
||
<section class="voice-conversation" id="voice-search-reply" aria-label="Dictate search result reply" hidden>
|
||
<div class="voice-conversation-controls">
|
||
<button id="start-voice-search-reply" type="button">Dictate reply</button>
|
||
<button id="stop-voice-search-reply" type="button" hidden>Stop listening</button>
|
||
</div>
|
||
<div id="voice-search-reply-status" class="small" aria-live="polite"></div>
|
||
<div class="voice-conversation-review" id="voice-search-reply-review" hidden>
|
||
<label for="voice-search-reply-transcript">Review transcript</label>
|
||
<textarea id="voice-search-reply-transcript" maxlength="10000"></textarea>
|
||
<div class="voice-conversation-review-actions">
|
||
<button id="append-voice-search-reply" type="button">Use transcript</button>
|
||
<button id="replace-with-voice-search-reply" type="button" hidden>Replace draft</button>
|
||
<button id="discard-voice-search-reply" type="button">Discard</button>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
<div class="issue-attachment-controls conversation-photo-actions">
|
||
<label class="issue-attachment-trigger" for="take-search-reply-photo">Take photo</label>
|
||
<input class="visually-hidden" id="take-search-reply-photo" type="file" accept="image/*" capture="environment" />
|
||
<label class="issue-attachment-trigger" for="search-reply-attachment">Choose existing</label>
|
||
<input class="visually-hidden" id="search-reply-attachment" type="file" accept="image/png,image/jpeg,image/webp" multiple />
|
||
</div>
|
||
<div class="issue-attachment-preview conversation-evidence-review" id="search-reply-attachment-preview" hidden>
|
||
<img id="search-reply-attachment-image" alt="Selected reply photo preview" />
|
||
<span class="small" id="search-reply-attachment-meta"></span>
|
||
<div class="issue-evidence-tray" id="search-reply-attachment-tray" role="toolbar" aria-label="Search reply photos" hidden></div>
|
||
<label class="issue-evidence-note" for="search-reply-attachment-note">
|
||
<span id="search-reply-attachment-note-label">Photo caption (optional)</span>
|
||
<textarea id="search-reply-attachment-note" maxlength="240" rows="2" disabled placeholder="What does this photo show?"></textarea>
|
||
</label>
|
||
<div class="issue-evidence-review-actions" aria-label="Reorder selected photo">
|
||
<button id="move-search-reply-attachment-earlier" type="button">Move earlier</button>
|
||
<button id="edit-search-reply-attachment" type="button">Edit photo</button>
|
||
<button id="remove-search-reply-attachment" type="button">Remove selected</button>
|
||
<button id="move-search-reply-attachment-later" type="button">Move later</button>
|
||
</div>
|
||
</div>
|
||
<div id="search-preview-reply-status" class="small" aria-live="polite"></div>
|
||
<div class="search-preview-reply-actions">
|
||
<button id="send-search-preview-reply" type="button">Send</button>
|
||
<button id="send-search-preview-reply-next" type="button">Send & next</button>
|
||
</div>
|
||
</section>
|
||
<div class="search-preview-actions" id="search-preview-actions">
|
||
<nav class="search-preview-navigation" aria-label="Search result navigation" hidden>
|
||
<button id="previous-search-result" type="button">Previous</button>
|
||
<span id="search-preview-position" aria-live="polite"></span>
|
||
<button id="next-search-result" type="button">Next</button>
|
||
</nav>
|
||
<div class="search-preview-primary-actions">
|
||
<button id="claim-search-result" type="button" hidden>Assign to me</button>
|
||
<button id="defer-search-result" type="button" hidden>Assign & defer</button>
|
||
<button id="queue-search-result" type="button" hidden>Assign & add to Today</button>
|
||
<button id="start-search-result" type="button" hidden>Assign & start</button>
|
||
|
||
</div>
|
||
<button id="share-search-result" type="button" disabled>Share result</button>
|
||
<a id="open-search-result-gitea" href="#" target="_blank" rel="noopener noreferrer">Open in Gitea</a>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
|
||
<div id="whiteboard-modal">
|
||
<div class="modal">
|
||
<div class="modal-actions">
|
||
<strong>Whiteboard</strong>
|
||
<div>
|
||
<span class="badge">Click & drag to draw</span>
|
||
<button id="close-whiteboard">Close</button>
|
||
</div>
|
||
</div>
|
||
<canvas id="wb"></canvas>
|
||
<div class="row" style="margin-top:8px;">
|
||
<button id="wb-clear">Clear</button>
|
||
<button id="wb-save">Save PNG</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="issue-sheet" id="issue-sheet" role="dialog" aria-modal="true" aria-labelledby="issue-sheet-title">
|
||
<section class="issue-sheet-panel">
|
||
<div class="issue-sheet-header">
|
||
<div>
|
||
<div class="small" id="issue-sheet-key"></div>
|
||
<h3 id="issue-sheet-title">Assigned issue</h3>
|
||
</div>
|
||
<button id="close-issue-sheet" type="button">Close sheet</button>
|
||
</div>
|
||
<nav class="mobile-issue-detail-nav" aria-label="Issue sections">
|
||
<button type="button" data-issue-section="overview">Overview</button>
|
||
<button type="button" data-issue-section="conversation">Conversation</button>
|
||
<button type="button" data-issue-section="reply">Reply</button>
|
||
<button type="button" data-issue-section="actions">Plan & actions</button>
|
||
</nav>
|
||
<div id="issue-sheet-status" class="small" aria-live="polite">Choose an issue.</div>
|
||
<section class="completed-filed-actions" id="completed-filed-actions" aria-label="Completed Filed review" hidden>
|
||
<span id="completed-filed-progress" role="status" aria-live="polite">Completed Filed issue ready for review.</span>
|
||
<div class="completed-filed-buttons">
|
||
<button id="complete-parent-and-acknowledge" type="button" hidden>Complete parent step & acknowledge</button>
|
||
<button id="acknowledge-completed-filed" type="button">Acknowledge & next</button>
|
||
</div>
|
||
</section>
|
||
<button class="issue-retry" id="retry-issue-load" type="button" hidden>Reload latest issue</button>
|
||
<div class="row"><span id="issue-labels"></span><span class="small" id="issue-assignees"></span></div>
|
||
<div id="issue-overview"><div class="issue-sheet-content markdown-content" id="issue-sheet-body"></div></div>
|
||
<form class="checklist-step-editor" id="checklist-step-editor" aria-label="Manage checklist step" hidden>
|
||
<label for="checklist-step-label">Checklist step</label>
|
||
<input id="checklist-step-label" type="text" maxlength="240" autocomplete="off" />
|
||
<div class="checklist-step-editor-actions">
|
||
<button id="save-checklist-step-edit" type="submit">Rename</button>
|
||
<button id="move-checklist-step-earlier" type="button">Move earlier</button>
|
||
<button id="move-checklist-step-later" type="button">Move later</button>
|
||
<button id="file-checklist-step-related" type="button">File as related issue</button>
|
||
<button id="remove-checklist-step" type="button">Remove</button>
|
||
<button id="cancel-checklist-step-edit" type="button">Cancel</button>
|
||
</div>
|
||
<div id="checklist-step-edit-status" class="small" aria-live="assertive"></div>
|
||
</form>
|
||
<section class="checklist-add" aria-label="Add checklist step">
|
||
<button id="open-add-checklist-step" type="button" disabled>Add step</button>
|
||
<form id="add-checklist-step-form" hidden>
|
||
<label class="visually-hidden" for="add-checklist-step">Checklist step</label>
|
||
<input id="add-checklist-step" type="text" maxlength="240" autocomplete="off" placeholder="New checklist step" />
|
||
<button id="save-checklist-step" type="submit">Add</button>
|
||
<button id="cancel-checklist-step" type="button">Cancel</button>
|
||
</form>
|
||
<div id="add-checklist-step-status" class="small" aria-live="assertive"></div>
|
||
</section>
|
||
<section class="checklist-completion" id="checklist-completion" aria-label="Completed checklist" hidden>
|
||
<span id="checklist-completion-status" role="status" aria-live="polite">Checklist complete</span>
|
||
<button id="complete-checklist-issue" type="button">Close issue</button>
|
||
<button id="keep-checklist-issue-open" type="button">Keep open</button>
|
||
</section>
|
||
<section class="issue-blockers" id="issue-blockers" aria-labelledby="issue-blockers-title" hidden>
|
||
<h2 id="issue-blockers-title">Blocked by</h2>
|
||
<div class="issue-blocker-list" id="issue-blocker-list"></div>
|
||
<div id="issue-blocker-status" class="small" aria-live="polite"></div>
|
||
<button id="manage-issue-blockers" type="button" hidden>Add blocker</button>
|
||
<button id="start-unblocked-issue" type="button" hidden>Start now</button>
|
||
<div class="issue-blocker-manager" id="issue-blocker-manager" hidden>
|
||
<label for="issue-blocker-search">Search open issues</label>
|
||
<input id="issue-blocker-search" type="search" maxlength="100" autocomplete="off"
|
||
role="combobox" aria-controls="issue-blocker-results" aria-expanded="false" />
|
||
<div id="issue-blocker-results" role="listbox" aria-label="Open issue results"></div>
|
||
<div id="issue-blocker-search-status" class="small" aria-live="polite"></div>
|
||
<button id="cancel-issue-blocker" type="button">Cancel</button>
|
||
</div>
|
||
</section>
|
||
<div id="issue-conversation" tabindex="-1"></div>
|
||
<h2>Full conversation</h2>
|
||
<div id="issue-comments"></div>
|
||
<button class="conversation-more" id="load-older-issue-comments" type="button" hidden>Load older messages</button>
|
||
<div id="issue-conversation-status" class="small" aria-live="assertive"></div>
|
||
<button class="conversation-actions-retry" id="retry-issue-comment-actions" type="button" hidden>Retry comment tools</button>
|
||
<section class="issue-comment-composer" aria-labelledby="issue-comment-title">
|
||
<h2 id="issue-comment-title">Add comment</h2>
|
||
<textarea id="issue-comment" maxlength="10000" placeholder="Write a comment"></textarea>
|
||
<section class="voice-conversation" id="voice-issue-comment" aria-label="Dictate issue comment" hidden>
|
||
<div class="voice-conversation-controls">
|
||
<button id="start-voice-issue-comment" type="button">Dictate reply</button>
|
||
<button id="stop-voice-issue-comment" type="button" hidden>Stop listening</button>
|
||
</div>
|
||
<div id="voice-issue-comment-status" class="small" aria-live="polite"></div>
|
||
<div class="voice-conversation-review" id="voice-issue-comment-review" hidden>
|
||
<label for="voice-issue-comment-transcript">Review transcript</label>
|
||
<textarea id="voice-issue-comment-transcript" maxlength="10000"></textarea>
|
||
<div class="voice-conversation-review-actions">
|
||
<button id="append-voice-issue-comment" type="button">Use transcript</button>
|
||
<button id="replace-with-voice-issue-comment" type="button" hidden>Replace draft</button>
|
||
<button id="discard-voice-issue-comment" type="button">Discard</button>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
<div class="mention-options" id="issue-comment-mentions" role="listbox" aria-label="Teammates" hidden></div>
|
||
<div class="mention-status small" id="issue-comment-mention-status" aria-live="polite"></div>
|
||
<div class="issue-attachment-controls conversation-photo-actions">
|
||
<label class="issue-attachment-trigger" for="take-issue-comment-photo">Take photo</label>
|
||
<input class="visually-hidden" id="take-issue-comment-photo" type="file" accept="image/*" capture="environment" />
|
||
<label class="issue-attachment-trigger" for="issue-attachment">Choose existing</label>
|
||
<input class="visually-hidden" id="issue-attachment" type="file" accept="image/png,image/jpeg,image/webp" multiple />
|
||
</div>
|
||
<div class="issue-attachment-preview conversation-evidence-review" id="issue-attachment-preview" hidden>
|
||
<img id="issue-attachment-image" alt="Selected screenshot preview" />
|
||
<span class="small" id="issue-attachment-meta"></span>
|
||
<div class="issue-evidence-tray" id="issue-attachment-tray" role="toolbar" aria-label="Comment photos" hidden></div>
|
||
<label class="issue-evidence-note" for="issue-attachment-note">
|
||
<span id="issue-attachment-note-label">Photo caption (optional)</span>
|
||
<textarea id="issue-attachment-note" maxlength="240" rows="2" disabled placeholder="What does this photo show?"></textarea>
|
||
</label>
|
||
<div class="issue-evidence-review-actions" aria-label="Reorder selected photo">
|
||
<button id="move-issue-attachment-earlier" type="button">Move earlier</button>
|
||
<button id="edit-issue-attachment" type="button">Edit photo</button>
|
||
<button id="remove-issue-attachment" type="button">Remove selected</button>
|
||
<button id="move-issue-attachment-later" type="button">Move later</button>
|
||
</div>
|
||
</div>
|
||
<div class="comment-actions">
|
||
<button id="send-issue-comment" type="button">Post comment</button>
|
||
<button id="send-issue-comment-next" type="button" hidden>Comment & next</button>
|
||
</div>
|
||
<div id="issue-comment-status" class="small" aria-live="assertive"></div>
|
||
</section>
|
||
<section class="issue-content-editor" aria-label="Issue content">
|
||
<button id="edit-issue-content" type="button" disabled>Edit issue</button>
|
||
<form class="issue-edit-form" id="issue-edit-form" hidden>
|
||
<label for="issue-edit-title">Title
|
||
<input id="issue-edit-title" type="text" maxlength="255" required autocomplete="off" />
|
||
</label>
|
||
<label for="issue-edit-body">Description
|
||
<textarea id="issue-edit-body" maxlength="10000"></textarea>
|
||
</label>
|
||
<div class="issue-edit-actions">
|
||
<button id="save-issue-content" type="submit">Save issue</button>
|
||
<button id="cancel-issue-content" type="button">Cancel</button>
|
||
</div>
|
||
<div id="issue-edit-status" class="small" aria-live="assertive"></div>
|
||
</form>
|
||
</section>
|
||
<details class="issue-planning" id="issue-planning">
|
||
<summary>Plan & edit</summary>
|
||
<button class="issue-planning-retry" id="retry-issue-planning" type="button" hidden>Retry planning controls</button>
|
||
<fieldset class="issue-label-editor" id="issue-label-editor" aria-describedby="issue-label-status">
|
||
<legend>Labels</legend>
|
||
<div class="issue-label-list" id="issue-label-list"></div>
|
||
<div class="small" id="issue-label-status" aria-live="polite">Expand planning controls to load labels.</div>
|
||
<button id="save-issue-labels" type="button" disabled>Save labels</button>
|
||
</fieldset>
|
||
<fieldset class="issue-due-editor" aria-describedby="issue-due-status">
|
||
<legend>Due date</legend>
|
||
<label for="issue-due-date" class="small">Schedule this assigned issue</label>
|
||
<input id="issue-due-date" type="date" disabled />
|
||
<div class="issue-due-actions">
|
||
<button id="save-issue-due-date" type="button" disabled>Save due date</button>
|
||
<button id="clear-issue-due-date" type="button" disabled>Clear due date</button>
|
||
</div>
|
||
<div id="issue-due-status" class="small" aria-live="assertive">Load an issue to schedule it.</div>
|
||
</fieldset>
|
||
<fieldset class="issue-milestone-editor" aria-describedby="issue-milestone-status">
|
||
<legend>Milestone</legend>
|
||
<label for="issue-milestone" class="small">Plan this issue into a release</label>
|
||
<select id="issue-milestone" disabled><option value="">No milestone</option></select>
|
||
<button id="save-issue-milestone" type="button" disabled>Save milestone</button>
|
||
<div id="issue-milestone-status" class="small" aria-live="assertive">Expand planning controls to load milestones.</div>
|
||
</fieldset>
|
||
</details>
|
||
<details class="issue-handoff" id="issue-handoff">
|
||
<summary id="issue-handoff-summary">Hand off to teammate</summary>
|
||
<div>
|
||
<button id="load-issue-handoff" type="button">Choose teammate</button>
|
||
<label for="issue-handoff-recipient" class="small">Eligible repository assignee</label>
|
||
<select id="issue-handoff-recipient" disabled><option value="">Select a teammate</option></select>
|
||
<button id="confirm-issue-handoff" type="button" disabled>Confirm handoff</button>
|
||
<div id="issue-handoff-status" class="small" aria-live="assertive">Load teammates to transfer ownership.</div>
|
||
</div>
|
||
</details>
|
||
<section class="filed-claim-actions" id="filed-claim-actions" aria-label="Take ownership of filed issue" hidden>
|
||
<button id="queue-filed-issue" type="button">Queue Today</button>
|
||
<button id="start-filed-issue" type="button">Claim & start</button>
|
||
</section>
|
||
<div class="issue-sheet-actions">
|
||
<button class="share-work-route" type="button">Share</button>
|
||
<button id="release-issue" type="button">Release assignment</button>
|
||
<button id="close-issue" type="button">Close issue</button>
|
||
<a id="open-issue-gitea" href="#" target="_blank" rel="noopener noreferrer">Open in Gitea</a>
|
||
<details class="detail-defer"><summary>Defer</summary><div class="detail-defer-options"><button type="button" data-detail-defer-preset="today" disabled data-planning-disabled>Later today</button><button type="button" data-detail-defer-preset="tomorrow" disabled data-planning-disabled>Tomorrow</button><button type="button" data-detail-defer-custom disabled data-planning-disabled>Choose date & time</button><button type="button" data-detail-defer-cancel>Cancel</button></div></details>
|
||
</div>
|
||
<nav class="work-session-nav" aria-label="Work session" hidden>
|
||
<span class="small" aria-live="polite" data-work-session-progress></span>
|
||
<button type="button" data-work-session-previous>Previous</button>
|
||
<button type="button" data-work-session-timer-toggle>Pause timer</button>
|
||
<button type="button" data-work-session-complete="issue" hidden>Done for Today & next</button>
|
||
<button type="button" data-work-session-next>Next work item</button>
|
||
</nav>
|
||
</section>
|
||
</div>
|
||
|
||
<div class="find-work-sheet" id="find-work-sheet" role="dialog" aria-modal="true" aria-labelledby="find-work-heading">
|
||
<section class="find-work-panel">
|
||
<div class="find-work-header">
|
||
<div><div class="small">Open · unassigned</div><h3 id="find-work-heading">Find work</h3></div>
|
||
<div class="find-work-header-actions"><button id="select-find-work" type="button">Select work</button><button id="close-find-work" type="button">Close</button></div>
|
||
</div>
|
||
<p class="small">Choose available issues, review the batch, then fit it into Today.</p>
|
||
<nav class="mobile-find-work-nav" aria-label="Find Work steps">
|
||
<button type="button" data-find-work-stage="discover">Discover</button>
|
||
<button type="button" data-find-work-stage="review" disabled>Review</button>
|
||
<button type="button" data-find-work-stage="fit" disabled>Fit & assign</button>
|
||
</nav>
|
||
<section class="find-work-stage" id="find-work-discover-stage" tabindex="-1" aria-labelledby="find-work-heading">
|
||
<form class="find-work-search" id="find-work-search-form" role="search">
|
||
<label for="find-work-search">Search repository, #number, or title</label>
|
||
<div><input id="find-work-search" type="search" maxlength="100" autocomplete="off" />
|
||
<button id="clear-find-work-search" type="button" hidden>Clear</button></div>
|
||
<span id="find-work-match-status" class="small" aria-live="polite"></span>
|
||
</form>
|
||
<details class="find-work-filters" id="find-work-filters">
|
||
<summary>Filter work <span id="find-work-filter-count" class="small"></span></summary>
|
||
<div class="find-work-filter-panel" aria-label="Filter available work">
|
||
<fieldset><legend>Repositories</legend><div id="find-work-repository-filters" class="find-work-filter-options"></div></fieldset>
|
||
<fieldset><legend>Labels</legend><div id="find-work-label-filters" class="find-work-filter-options"></div></fieldset>
|
||
<button id="clear-find-work-filters" type="button">Clear filters</button>
|
||
</div>
|
||
</details>
|
||
<button class="fill-find-work-today" id="fill-find-work-today" type="button"
|
||
aria-describedby="find-work-selection-status">Fill remaining Today slots</button>
|
||
<div id="find-work-status" class="small" aria-live="assertive">Open Find Work to load available issues.</div>
|
||
<button class="find-work-batch-recovery" id="resume-find-work-batch" type="button"
|
||
aria-describedby="find-work-status" hidden>Resume assigning & queueing</button>
|
||
<div class="find-work-list" id="find-work-list"></div>
|
||
<button class="find-work-more" id="load-more-available" type="button" hidden>Load more available issues</button>
|
||
<div class="find-work-batch-actions" id="batch-find-work-actions" hidden>
|
||
<span id="find-work-selection-status" class="small" aria-live="polite">No work selected.</span>
|
||
<button id="cancel-find-work-selection" type="button">Cancel</button>
|
||
<button id="claim-selected-work" type="button" disabled>Review selected</button>
|
||
</div>
|
||
</section>
|
||
<section class="find-work-stage find-work-review" id="find-work-review-stage" tabindex="-1" aria-labelledby="find-work-review-heading" hidden>
|
||
<div><strong id="find-work-review-heading">Review selected work</strong>
|
||
<span class="small" id="find-work-review-summary" aria-live="polite"></span></div>
|
||
<div class="find-work-review-list" id="find-work-review-list"></div>
|
||
<div class="find-work-stage-actions">
|
||
<button id="back-find-work-discover" type="button">Back to discover</button>
|
||
<button id="continue-find-work-fit" type="button">Continue</button>
|
||
</div>
|
||
</section>
|
||
<section class="find-work-stage" id="find-work-fit-stage" tabindex="-1" aria-labelledby="find-work-estimate-heading" hidden>
|
||
<div class="find-work-estimate-review" id="find-work-estimate-review">
|
||
<div><strong id="find-work-estimate-heading">Fit this work into Today</strong>
|
||
<span class="small" id="find-work-estimate-summary" aria-live="polite"></span></div>
|
||
<div id="find-work-estimate-list"></div>
|
||
<div class="find-work-estimate-actions">
|
||
<button id="cancel-find-work-estimates" type="button">Back to review</button>
|
||
<button id="confirm-find-work-estimates" type="button">Confirm & assign</button>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
</section>
|
||
</div>
|
||
|
||
<div class="create-issue-sheet" id="create-issue-sheet" role="dialog" aria-modal="true" aria-labelledby="create-issue-heading">
|
||
<section class="create-issue-panel">
|
||
<div class="create-issue-header">
|
||
<h3 id="create-issue-heading">Capture work</h3>
|
||
<button id="cancel-new-issue" type="button">Cancel</button>
|
||
</div>
|
||
<nav class="mobile-create-issue-nav" aria-label="New issue sections">
|
||
<button type="button" data-create-issue-section="describe">Describe</button>
|
||
<button type="button" data-create-issue-section="evidence">Evidence</button>
|
||
<button type="button" data-create-issue-section="file">File</button>
|
||
</nav>
|
||
<aside class="shared-content-conflict" id="shared-content-conflict" aria-live="assertive" hidden>
|
||
<strong>You already have an unfinished issue draft.</strong>
|
||
<span class="small">Resume it, or replace its title and description with the content shared to Stackchain.</span>
|
||
<div class="shared-content-actions">
|
||
<button id="resume-issue-draft" type="button">Resume existing draft</button>
|
||
<button id="use-shared-content" type="button">Use shared content</button>
|
||
</div>
|
||
</aside>
|
||
<form class="create-issue-form" id="create-issue-form">
|
||
<section class="create-issue-describe" id="create-issue-describe">
|
||
<label for="create-issue-title">Title
|
||
<input id="create-issue-title" type="text" maxlength="255" required autocomplete="off" />
|
||
</label>
|
||
<label for="create-issue-body">Note <span class="small">Optional</span>
|
||
<textarea id="create-issue-body" maxlength="10000"></textarea>
|
||
</label>
|
||
<section class="voice-issue-capture" id="voice-issue-capture" aria-labelledby="voice-issue-heading" hidden>
|
||
<div class="voice-issue-heading">
|
||
<strong id="voice-issue-heading">Speak capture</strong>
|
||
<span class="small">Your browser transcribes speech. Stackchain does not retain audio.</span>
|
||
</div>
|
||
<div class="voice-issue-controls">
|
||
<button id="start-voice-issue-capture" type="button">Speak capture</button>
|
||
<button id="stop-voice-issue-capture" type="button" hidden>Stop listening</button>
|
||
</div>
|
||
<div id="voice-issue-status" class="small" aria-live="polite"></div>
|
||
<div class="voice-issue-review" id="voice-issue-review" hidden>
|
||
<label for="voice-issue-transcript">Review transcript
|
||
<textarea id="voice-issue-transcript" maxlength="10255"></textarea>
|
||
</label>
|
||
<div class="voice-issue-review-actions">
|
||
<button id="append-voice-issue-transcript" type="button">Append to draft</button>
|
||
<button id="replace-with-voice-issue-transcript" type="button">Replace draft</button>
|
||
<button id="discard-voice-issue-transcript" type="button" class="secondary">Discard transcript</button>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
<div class="create-issue-capture-actions">
|
||
<button id="save-unfiled-issue" type="button">Save to Drafts</button>
|
||
<button id="file-new-issue" type="button">File now</button>
|
||
</div>
|
||
</section>
|
||
<section class="create-issue-attachment" id="create-issue-evidence" aria-labelledby="create-issue-attachment-label">
|
||
<strong id="create-issue-attachment-label">Photo evidence <span class="small">Optional · Up to 5 · PNG, JPEG, or WebP · 2 MB each</span></strong>
|
||
<div class="issue-attachment-controls photo-evidence-actions">
|
||
<label class="issue-attachment-trigger" for="take-create-issue-photo">Take photo</label>
|
||
<input class="visually-hidden" id="take-create-issue-photo" type="file" accept="image/*" capture="environment" />
|
||
<label class="issue-attachment-trigger" for="create-issue-attachment">Choose existing</label>
|
||
<input class="visually-hidden" id="create-issue-attachment" type="file" accept="image/png,image/jpeg,image/webp" multiple />
|
||
</div>
|
||
<div class="issue-attachment-preview" id="create-issue-attachment-preview" hidden>
|
||
<img id="create-issue-attachment-image" alt="Selected screenshot preview" />
|
||
<span class="small" id="create-issue-attachment-meta"></span>
|
||
<div class="issue-evidence-tray" id="create-issue-evidence-tray" role="toolbar" aria-label="Photo evidence" hidden></div>
|
||
<label class="issue-evidence-note" for="create-issue-evidence-note">
|
||
<span id="create-issue-evidence-note-label">Evidence note (optional)</span>
|
||
<textarea id="create-issue-evidence-note" maxlength="240" rows="2" disabled placeholder="What does this screenshot show?"></textarea>
|
||
</label>
|
||
<div class="issue-evidence-review-actions" aria-label="Reorder selected screenshot">
|
||
<button id="move-create-issue-attachment-earlier" type="button">Move earlier</button>
|
||
<button id="edit-create-issue-attachment" type="button">Edit screenshot</button>
|
||
<button id="remove-create-issue-attachment" type="button">Remove selected</button>
|
||
<button id="move-create-issue-attachment-later" type="button">Move later</button>
|
||
</div>
|
||
</div>
|
||
<div class="small" id="create-issue-attachment-status" aria-live="polite"></div>
|
||
</section>
|
||
<section class="create-issue-filing" id="create-issue-filing" hidden>
|
||
<aside class="draft-filing-session" id="draft-filing-session" aria-live="polite" hidden>
|
||
<strong id="draft-filing-progress"></strong>
|
||
<span class="small" id="draft-filing-remaining"></span>
|
||
<div class="draft-filing-session-actions">
|
||
<button id="previous-draft" type="button">Previous</button>
|
||
<button id="skip-draft" type="button">Skip</button>
|
||
</div>
|
||
</aside>
|
||
<div class="create-issue-repository-picker">
|
||
<label for="create-issue-repository-search">Repository search
|
||
<input id="create-issue-repository-search" type="search" maxlength="80" placeholder="Search accessible repositories" autocomplete="off" />
|
||
</label>
|
||
<div id="create-issue-repository-results" role="listbox" aria-label="Repository search results" hidden></div>
|
||
<label for="create-issue-repository">Selected repository
|
||
<select id="create-issue-repository" required><option value="">Choose repository</option></select>
|
||
</label>
|
||
</div>
|
||
<button class="create-issue-repository-more" id="load-more-issue-repositories" type="button" hidden>Load more repositories</button>
|
||
<div id="create-issue-repository-status" class="small" aria-live="polite"></div>
|
||
<label id="create-issue-template-field" for="create-issue-template" hidden>Issue type
|
||
<select id="create-issue-template" aria-describedby="create-issue-template-status">
|
||
<option value="">Blank issue</option>
|
||
</select>
|
||
<span id="create-issue-template-status" class="small" aria-live="polite">Blank issue selected.</span>
|
||
</label>
|
||
<label class="create-issue-owner" for="create-issue-assignee">Owner
|
||
<select id="create-issue-assignee" aria-describedby="create-issue-assignee-status">
|
||
<option value="">Me</option>
|
||
<option value="__unassigned__">No owner</option>
|
||
</select>
|
||
<span id="create-issue-assignee-status" class="small" aria-live="polite">Open the owner picker to load eligible teammates.</span>
|
||
</label>
|
||
<label for="create-issue-milestone">Milestone <span class="small">Optional</span>
|
||
<select id="create-issue-milestone" aria-describedby="create-issue-milestone-status">
|
||
<option value="">No milestone</option>
|
||
</select>
|
||
<span class="small" id="create-issue-milestone-status" aria-live="polite">Choose a repository to load milestones.</span>
|
||
</label>
|
||
<label for="create-issue-due-date">Due date <span class="small">Optional</span>
|
||
<input id="create-issue-due-date" type="date" />
|
||
</label>
|
||
<section class="create-issue-blockers" aria-labelledby="create-issue-blockers-heading">
|
||
<strong id="create-issue-blockers-heading">Blocked by <span class="small">Optional · Up to 5 open issues</span></strong>
|
||
<label for="create-issue-blocker-search">Search open issues
|
||
<input id="create-issue-blocker-search" type="search" maxlength="80" placeholder="Issue title or key" autocomplete="off" />
|
||
</label>
|
||
<div id="create-issue-blocker-results" role="listbox" aria-label="Open issue blocker results" hidden></div>
|
||
<ul id="create-issue-blocker-selected" aria-label="Selected blockers"></ul>
|
||
<div id="create-issue-blocker-status" class="small" aria-live="polite">No blockers selected.</div>
|
||
</section>
|
||
<fieldset class="create-issue-labels" id="create-issue-labels" aria-describedby="create-issue-label-status">
|
||
<legend>Labels <span class="small">Optional</span></legend>
|
||
<div class="small" id="create-issue-label-status" aria-live="polite">Choose a repository to load labels.</div>
|
||
<div class="create-issue-label-list" id="create-issue-label-list"></div>
|
||
</fieldset>
|
||
<section class="create-issue-duplicates" id="create-issue-duplicates" aria-live="polite" hidden>
|
||
<strong>Possible existing issues</strong>
|
||
<div id="create-issue-duplicate-status" class="small"></div>
|
||
<div id="create-issue-duplicate-list" class="create-issue-duplicate-list"></div>
|
||
<button id="create-issue-anyway" type="button" hidden>Create anyway</button>
|
||
</section>
|
||
<label class="create-issue-estimate" for="create-issue-estimate">Work estimate for Today
|
||
<span><input id="create-issue-estimate" type="number" inputmode="numeric" min="5" max="1440" step="5" placeholder="45" aria-describedby="create-issue-estimate-status" /> min</span>
|
||
<span id="create-issue-estimate-status" class="small" aria-live="polite">Required only for Create & start.</span>
|
||
</label>
|
||
<div class="small">The issue will be assigned to you.</div>
|
||
<div class="create-issue-actions">
|
||
<button id="submit-new-issue" type="submit">Create & assign to me</button>
|
||
<button id="create-follow-up-next" type="submit" hidden>Create follow-up & next</button>
|
||
<button id="create-and-start-issue" type="submit">Create & start</button>
|
||
<div id="create-issue-status" class="small" aria-live="assertive"></div>
|
||
</div>
|
||
</section>
|
||
<div id="create-issue-capture-status" class="small" aria-live="assertive"></div>
|
||
</form>
|
||
</section>
|
||
</div>
|
||
<section class="issue-evidence-editor" id="issue-evidence-editor" role="dialog" aria-modal="true" aria-labelledby="issue-evidence-editor-heading" hidden>
|
||
<div class="issue-evidence-editor-panel">
|
||
<header>
|
||
<div><h3 id="issue-evidence-editor-heading">Edit selected photo</h3><span class="small">Edits stay on this device until you send or file.</span></div>
|
||
<button id="cancel-issue-evidence-edit" type="button">Cancel</button>
|
||
</header>
|
||
<canvas id="issue-evidence-editor-canvas" role="img" aria-label="Screenshot editing canvas. Drag to crop, redact, highlight, or point with an arrow."></canvas>
|
||
<canvas id="issue-evidence-editor-export" hidden></canvas>
|
||
<div class="issue-evidence-editor-tools" role="toolbar" aria-label="Screenshot editing tools">
|
||
<button id="crop-issue-evidence" type="button" aria-pressed="false">Crop</button>
|
||
<button id="redact-issue-evidence" type="button" aria-pressed="true">Redact</button>
|
||
<button id="highlight-issue-evidence" type="button" aria-pressed="false">Highlight</button>
|
||
<button id="arrow-issue-evidence" type="button" aria-pressed="false">Arrow</button>
|
||
<button id="undo-issue-evidence-edit" type="button">Undo</button>
|
||
<button id="reset-issue-evidence-edit" type="button">Reset</button>
|
||
</div>
|
||
<div class="small" id="issue-evidence-editor-status" aria-live="polite">Drag over private information to hide it.</div>
|
||
<button class="issue-evidence-editor-apply" id="apply-issue-evidence-edit" type="button">Apply flattened edit</button>
|
||
</div>
|
||
</section>
|
||
|
||
<section class="issue-filing-review" id="issue-filing-review" role="dialog" aria-modal="true" aria-labelledby="issue-filing-review-heading" hidden>
|
||
<div class="issue-filing-review-panel">
|
||
<header>
|
||
<div>
|
||
<h2 id="issue-filing-review-heading">Review issue before filing</h2>
|
||
<p class="small">Confirm the complete payload that will be saved for delivery.</p>
|
||
</div>
|
||
</header>
|
||
<dl class="issue-filing-review-summary">
|
||
<div><dt>Repository</dt><dd id="issue-filing-review-repository"></dd></div>
|
||
<div><dt>Action</dt><dd id="issue-filing-review-intent"></dd></div>
|
||
<div><dt>Issue type</dt><dd id="issue-filing-review-template"></dd></div>
|
||
<div><dt>Title</dt><dd id="issue-filing-review-title"></dd></div>
|
||
<div><dt>Note</dt><dd id="issue-filing-review-body"></dd></div>
|
||
<div><dt>Planning</dt><dd id="issue-filing-review-metadata"></dd></div>
|
||
<div><dt>Blocked by</dt><dd><ul id="issue-filing-review-blockers"></ul></dd></div>
|
||
</dl>
|
||
<section aria-labelledby="issue-filing-review-evidence-heading">
|
||
<h3 id="issue-filing-review-evidence-heading">Evidence in filing order</h3>
|
||
<p class="small muted" id="issue-filing-review-evidence-empty" hidden>No screenshots will be filed.</p>
|
||
<ol id="issue-filing-review-evidence"></ol>
|
||
<figure class="issue-filing-evidence-preview" id="issue-filing-review-evidence-preview" hidden>
|
||
<img id="issue-filing-review-evidence-image" alt="" />
|
||
<figcaption>
|
||
<span class="small" id="issue-filing-review-evidence-position"></span>
|
||
<strong id="issue-filing-review-evidence-filename"></strong>
|
||
<span class="small" id="issue-filing-review-evidence-note"></span>
|
||
</figcaption>
|
||
</figure>
|
||
</section>
|
||
<div class="issue-filing-review-actions">
|
||
<button id="back-to-issue-edit" type="button">Back to edit</button>
|
||
<button id="confirm-issue-filing" type="button">Confirm filing</button>
|
||
</div>
|
||
<div class="small" id="issue-filing-review-status" aria-live="assertive"></div>
|
||
</div>
|
||
</section>
|
||
|
||
<div class="draft-capacity-sheet" id="draft-capacity-sheet" role="dialog" aria-modal="true" aria-labelledby="draft-capacity-heading" hidden>
|
||
<section class="draft-capacity-panel">
|
||
<h3 id="draft-capacity-heading">Drafts full — nothing was deleted.</h3>
|
||
<p class="small">Review saved work, keep editing, or explicitly replace the oldest Draft.</p>
|
||
<div class="draft-capacity-oldest" id="draft-capacity-oldest"></div>
|
||
<div class="draft-capacity-actions">
|
||
<button id="review-full-drafts" type="button">Review Drafts</button>
|
||
<button id="keep-editing-draft" type="button">Keep editing</button>
|
||
<button id="replace-oldest-draft" type="button">Replace oldest & save</button>
|
||
</div>
|
||
<div id="draft-capacity-status" class="small" aria-live="assertive"></div>
|
||
</section>
|
||
</div>
|
||
|
||
<div class="update-sheet" id="update-sheet" role="dialog" aria-modal="true" aria-labelledby="update-sheet-title">
|
||
<section class="update-sheet-panel" data-triage-gesture="">
|
||
<div class="update-sheet-header">
|
||
<div>
|
||
<div class="small" id="update-sheet-key"></div>
|
||
<h3 id="update-sheet-title">Unread update</h3>
|
||
</div>
|
||
</div>
|
||
<div id="update-triage-progress" class="update-triage-progress small" aria-live="polite" hidden></div>
|
||
<nav class="mobile-update-detail-nav" aria-label="Update sections">
|
||
<button type="button" data-update-section="activity">New activity</button>
|
||
<button type="button" data-update-section="conversation">Conversation</button>
|
||
<button type="button" data-update-section="context">Subject context</button>
|
||
<button type="button" data-update-section="reply">Reply</button>
|
||
</nav>
|
||
<div id="update-gesture-status" class="update-gesture-status small" aria-live="polite">Swipe right to keep unread or left to mark read. Buttons remain available.</div>
|
||
<div id="update-sheet-status" class="small" aria-live="polite">Choose an update.</div>
|
||
<button class="update-retry" id="retry-update-load" type="button" hidden>Retry loading update</button>
|
||
<div class="row">
|
||
<span class="pill" id="update-subject-type">Update</span>
|
||
<span class="pill" id="update-subject-state"></span>
|
||
</div>
|
||
<section id="update-conversation" tabindex="-1">
|
||
<h2>Full conversation</h2>
|
||
<div id="update-comments"></div>
|
||
<button class="update-new-activity-jump" id="jump-update-new-activity" type="button" hidden>Jump to new activity</button>
|
||
<button class="conversation-more" id="load-older-update-comments" type="button" hidden>Load older messages</button>
|
||
<div id="update-conversation-status" class="small" aria-live="assertive"></div>
|
||
<button class="update-retry" id="retry-update-conversation" type="button" hidden>Retry conversation</button>
|
||
<button class="conversation-actions-retry" id="retry-update-comment-actions" type="button" hidden>Retry comment tools</button>
|
||
</section>
|
||
<details id="update-subject-context">
|
||
<summary><h2>Subject context</h2></summary>
|
||
<div class="update-sheet-content muted markdown-content" id="update-subject-body"></div>
|
||
</details>
|
||
<section class="update-reply" id="update-reply-workspace" aria-labelledby="update-reply-title">
|
||
<h2 id="update-reply-title">Reply</h2>
|
||
<label for="update-reply" class="small">Continue this issue or pull-request conversation</label>
|
||
<textarea id="update-reply" maxlength="10000" placeholder="Write a reply"></textarea>
|
||
<section class="voice-conversation" id="voice-update-reply" aria-label="Dictate update reply" hidden>
|
||
<div class="voice-conversation-controls">
|
||
<button id="start-voice-update-reply" type="button">Dictate reply</button>
|
||
<button id="stop-voice-update-reply" type="button" hidden>Stop listening</button>
|
||
</div>
|
||
<div id="voice-update-reply-status" class="small" aria-live="polite"></div>
|
||
<div class="voice-conversation-review" id="voice-update-reply-review" hidden>
|
||
<label for="voice-update-reply-transcript">Review transcript</label>
|
||
<textarea id="voice-update-reply-transcript" maxlength="10000"></textarea>
|
||
<div class="voice-conversation-review-actions">
|
||
<button id="append-voice-update-reply" type="button">Use transcript</button>
|
||
<button id="replace-with-voice-update-reply" type="button" hidden>Replace draft</button>
|
||
<button id="discard-voice-update-reply" type="button">Discard</button>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
<div class="mention-options" id="update-reply-mentions" role="listbox" aria-label="Teammates" hidden></div>
|
||
<div class="mention-status small" id="update-reply-mention-status" aria-live="polite"></div>
|
||
<div class="issue-attachment-controls conversation-photo-actions">
|
||
<label class="issue-attachment-trigger" for="take-update-reply-photo">Take photo</label>
|
||
<input class="visually-hidden" id="take-update-reply-photo" type="file" accept="image/*" capture="environment" />
|
||
<label class="issue-attachment-trigger" for="update-reply-attachment">Choose existing</label>
|
||
<input class="visually-hidden" id="update-reply-attachment" type="file" accept="image/png,image/jpeg,image/webp" multiple />
|
||
</div>
|
||
<div class="issue-attachment-preview conversation-evidence-review" id="update-reply-attachment-preview" hidden>
|
||
<img id="update-reply-attachment-image" alt="Selected screenshot preview" />
|
||
<span class="small" id="update-reply-attachment-meta"></span>
|
||
<div class="issue-evidence-tray" id="update-reply-attachment-tray" role="toolbar" aria-label="Reply photos" hidden></div>
|
||
<label class="issue-evidence-note" for="update-reply-attachment-note">
|
||
<span id="update-reply-attachment-note-label">Photo caption (optional)</span>
|
||
<textarea id="update-reply-attachment-note" maxlength="240" rows="2" disabled placeholder="What does this photo show?"></textarea>
|
||
</label>
|
||
<div class="issue-evidence-review-actions" aria-label="Reorder selected photo">
|
||
<button id="move-update-reply-attachment-earlier" type="button">Move earlier</button>
|
||
<button id="edit-update-reply-attachment" type="button">Edit photo</button>
|
||
<button id="remove-update-reply-attachment" type="button">Remove selected</button>
|
||
<button id="move-update-reply-attachment-later" type="button">Move later</button>
|
||
</div>
|
||
</div>
|
||
<div class="update-reply-actions">
|
||
<button id="send-update-reply" type="button">Send reply</button>
|
||
<button id="send-update-reply-read-next" type="button">Reply, mark read & next</button>
|
||
</div>
|
||
<div id="update-reply-status" class="small" aria-live="assertive"></div>
|
||
</section>
|
||
<details class="update-more-actions">
|
||
<summary>More actions</summary>
|
||
<div class="update-sheet-actions">
|
||
<div class="update-ownership-actions">
|
||
<button id="update-ownership-action" type="button" hidden aria-describedby="update-sheet-status">Take ownership</button>
|
||
<button id="update-ownership-start" type="button" hidden aria-describedby="update-sheet-status">Take ownership & start</button>
|
||
</div>
|
||
<button class="share-work-route" type="button">Share</button>
|
||
<button id="acknowledge-update-next" type="button" hidden aria-label="Acknowledge and open next update">👍 Acknowledge & next</button>
|
||
<button id="mute-update-next" type="button" hidden>Mute future updates & next</button>
|
||
<button id="create-update-follow-up" type="button" hidden>Create follow-up</button>
|
||
<a id="open-update-gitea" href="#" target="_blank" rel="noopener noreferrer">Open in Gitea</a>
|
||
<details class="detail-defer"><summary>Defer</summary><div class="detail-defer-options"><button type="button" data-detail-defer-preset="today" disabled data-planning-disabled>Later today</button><button type="button" data-detail-defer-preset="tomorrow" disabled data-planning-disabled>Tomorrow</button><button type="button" data-detail-defer-custom disabled data-planning-disabled>Choose date & time</button><button type="button" data-detail-defer-cancel>Cancel</button></div></details>
|
||
</div>
|
||
</details>
|
||
<nav class="work-session-nav" aria-label="Work session" hidden>
|
||
<span class="small" aria-live="polite" data-work-session-progress></span>
|
||
<button type="button" data-work-session-previous>Previous</button>
|
||
<button type="button" data-work-session-timer-toggle>Pause timer</button>
|
||
<button type="button" data-work-session-complete="update" hidden>Done for Today & next</button>
|
||
<button type="button" data-work-session-next>Next work item</button>
|
||
</nav>
|
||
<div class="update-decision-bar" aria-label="Update decisions">
|
||
<button id="keep-update-unread" type="button" aria-label="Keep unread and open next update">Keep unread</button>
|
||
<button id="mark-update-read-next" type="button" aria-label="Mark read and open next update">Mark read</button>
|
||
<button id="review-update-now" type="button" hidden>Review now</button>
|
||
<button id="focus-update-reply" type="button">Reply</button>
|
||
<button id="toggle-update-more" type="button" aria-expanded="false">More</button>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
|
||
<div class="notification-undo" id="notification-undo" role="status" aria-live="assertive" hidden>
|
||
<span id="notification-undo-status"></span>
|
||
<button id="undo-notification" type="button" aria-label="Undo marking update read">Undo</button>
|
||
</div>
|
||
|
||
<div class="pull-sheet" id="pull-sheet" role="dialog" aria-modal="true" aria-labelledby="pull-sheet-title">
|
||
<section class="pull-sheet-panel">
|
||
<div class="pull-sheet-header">
|
||
<div><div class="small" id="pull-sheet-key"></div><h3 id="pull-sheet-title">Assigned pull request</h3></div>
|
||
<button id="close-pull-sheet" type="button">Close</button>
|
||
</div>
|
||
<nav class="mobile-detail-nav mobile-pull-detail-nav" aria-label="Pull request sections">
|
||
<button type="button" data-pull-section="overview">Overview</button>
|
||
<button type="button" data-pull-section="conversation">Conversation</button>
|
||
<button type="button" data-pull-section="reply">Reply</button>
|
||
<button type="button" data-pull-section="review">Review & merge</button>
|
||
</nav>
|
||
<div id="pull-overview">
|
||
<div id="pull-sheet-status" class="small" aria-live="polite">Choose a pull request.</div>
|
||
<button class="pull-retry" id="retry-pull-load" type="button" hidden>Retry loading pull request</button>
|
||
<div class="pull-sheet-content markdown-content" id="pull-sheet-body"></div>
|
||
</div>
|
||
<section id="pull-conversation" tabindex="-1">
|
||
<h2>Full conversation</h2><div id="pull-comments"></div>
|
||
<button class="conversation-more" id="load-older-pull-comments" type="button" hidden>Load older messages</button>
|
||
<div id="pull-conversation-status" class="small" aria-live="assertive"></div>
|
||
<button class="conversation-actions-retry" id="retry-pull-comment-actions" type="button" hidden>Retry comment tools</button>
|
||
</section>
|
||
<section class="pull-comment-composer" aria-labelledby="pull-comment-title">
|
||
<h2 id="pull-comment-title">Add comment</h2>
|
||
<textarea id="pull-comment" maxlength="10000" placeholder="Write a comment"></textarea>
|
||
<section class="voice-conversation" id="voice-pull-comment" aria-label="Dictate pull-request comment" hidden>
|
||
<div class="voice-conversation-controls">
|
||
<button id="start-voice-pull-comment" type="button">Dictate reply</button>
|
||
<button id="stop-voice-pull-comment" type="button" hidden>Stop listening</button>
|
||
</div>
|
||
<div id="voice-pull-comment-status" class="small" aria-live="polite"></div>
|
||
<div class="voice-conversation-review" id="voice-pull-comment-review" hidden>
|
||
<label for="voice-pull-comment-transcript">Review transcript</label>
|
||
<textarea id="voice-pull-comment-transcript" maxlength="10000"></textarea>
|
||
<div class="voice-conversation-review-actions">
|
||
<button id="append-voice-pull-comment" type="button">Use transcript</button>
|
||
<button id="replace-with-voice-pull-comment" type="button" hidden>Replace draft</button>
|
||
<button id="discard-voice-pull-comment" type="button">Discard</button>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
<div class="mention-options" id="pull-comment-mentions" role="listbox" aria-label="Teammates" hidden></div>
|
||
<div class="mention-status small" id="pull-comment-mention-status" aria-live="polite"></div>
|
||
<div class="issue-attachment-controls conversation-photo-actions">
|
||
<label class="issue-attachment-trigger" for="take-pull-comment-photo">Take photo</label>
|
||
<input class="visually-hidden" id="take-pull-comment-photo" type="file" accept="image/*" capture="environment" />
|
||
<label class="issue-attachment-trigger" for="pull-attachment">Choose existing</label>
|
||
<input class="visually-hidden" id="pull-attachment" type="file" accept="image/png,image/jpeg,image/webp" multiple />
|
||
</div>
|
||
<div class="issue-attachment-preview conversation-evidence-review" id="pull-attachment-preview" hidden>
|
||
<img id="pull-attachment-image" alt="Selected screenshot preview" />
|
||
<span class="small" id="pull-attachment-meta"></span>
|
||
<div class="issue-evidence-tray" id="pull-attachment-tray" role="toolbar" aria-label="Pull-request comment photos" hidden></div>
|
||
<label class="issue-evidence-note" for="pull-attachment-note">
|
||
<span id="pull-attachment-note-label">Photo caption (optional)</span>
|
||
<textarea id="pull-attachment-note" maxlength="240" rows="2" disabled placeholder="What does this photo show?"></textarea>
|
||
</label>
|
||
<div class="issue-evidence-review-actions" aria-label="Reorder selected photo">
|
||
<button id="move-pull-attachment-earlier" type="button">Move earlier</button>
|
||
<button id="edit-pull-attachment" type="button">Edit photo</button>
|
||
<button id="remove-pull-attachment" type="button">Remove selected</button>
|
||
<button id="move-pull-attachment-later" type="button">Move later</button>
|
||
</div>
|
||
</div>
|
||
<div class="comment-actions">
|
||
<button id="send-pull-comment" type="button">Post comment</button>
|
||
<button id="send-pull-comment-next" type="button" hidden>Comment & next</button>
|
||
</div>
|
||
<div id="pull-comment-status" class="small" aria-live="assertive"></div>
|
||
</section>
|
||
<details class="pull-review" id="pull-review">
|
||
<summary><h2>Review & merge</h2></summary>
|
||
<div id="pull-review-status" class="small" aria-live="polite">Expand to load changed files and merge readiness.</div>
|
||
<button class="pull-retry" id="pull-review-retry" type="button" hidden>Retry review data</button>
|
||
<div class="row"><span class="pill" id="pull-ci-state">CI unknown</span><span class="pill" id="pull-merge-state">Review data not loaded</span></div>
|
||
<details class="ci-checks" id="pull-checks">
|
||
<summary><span>Checks</span><span class="small" id="pull-checks-summary">Not loaded</span></summary>
|
||
<button class="ci-check-refresh" id="refresh-pull-checks" type="button">Refresh checks</button>
|
||
<div class="ci-check-list" id="pull-check-list"></div>
|
||
</details>
|
||
<div class="pull-review-tools"><span id="pull-review-progress" class="small" aria-live="polite">Review progress unavailable.</span><button id="next-unreviewed-pull-file" type="button" disabled>Next unreviewed</button></div>
|
||
<div id="pull-files"></div>
|
||
<button id="merge-pull" type="button" disabled>Merge</button>
|
||
</details>
|
||
<details class="pull-ownership" id="pull-ownership">
|
||
<summary>Ownership</summary>
|
||
<div>
|
||
<button id="load-pull-handoff" type="button">Choose teammate</button>
|
||
<label for="pull-handoff-recipient" class="small">Eligible repository assignee</label>
|
||
<select id="pull-handoff-recipient" disabled><option value="">Select a teammate</option></select>
|
||
<button id="confirm-pull-handoff" type="button" disabled>Confirm handoff</button>
|
||
<div id="pull-handoff-status" class="small" aria-live="assertive">Load teammates to transfer ownership.</div>
|
||
</div>
|
||
</details>
|
||
<div class="pull-sheet-actions">
|
||
<button class="share-work-route" type="button">Share</button>
|
||
<button id="release-pull" type="button">Release assignment</button>
|
||
<a id="open-pull-gitea" href="#" target="_blank" rel="noopener noreferrer">Open in Gitea</a>
|
||
<details class="detail-defer"><summary>Defer</summary><div class="detail-defer-options"><button type="button" data-detail-defer-preset="today" disabled data-planning-disabled>Later today</button><button type="button" data-detail-defer-preset="tomorrow" disabled data-planning-disabled>Tomorrow</button><button type="button" data-detail-defer-custom disabled data-planning-disabled>Choose date & time</button><button type="button" data-detail-defer-cancel>Cancel</button></div></details>
|
||
</div>
|
||
<nav class="work-session-nav" aria-label="Work session" hidden>
|
||
<span class="small" aria-live="polite" data-work-session-progress></span>
|
||
<button type="button" data-work-session-previous>Previous</button>
|
||
<button type="button" data-work-session-timer-toggle>Pause timer</button>
|
||
<button type="button" data-work-session-complete="pull" hidden>Done for Today & next</button>
|
||
<button type="button" data-work-session-next>Next work item</button>
|
||
</nav>
|
||
</section>
|
||
</div>
|
||
|
||
<div class="review-sheet" id="review-sheet" role="dialog" aria-modal="true" aria-labelledby="review-sheet-title">
|
||
<section class="review-sheet-panel">
|
||
<div class="review-sheet-header">
|
||
<div>
|
||
<div class="small" id="review-sheet-key"></div>
|
||
<h3 id="review-sheet-title">Pull request review</h3>
|
||
</div>
|
||
<button class="review-action" id="close-review-sheet">Close</button>
|
||
</div>
|
||
<nav class="mobile-review-detail-nav" aria-label="Review sections">
|
||
<button type="button" data-review-section="overview">Overview</button>
|
||
<button type="button" data-review-section="files">Files</button>
|
||
<button type="button" data-review-section="feedback">Feedback</button>
|
||
<button type="button" data-review-section="history">History</button>
|
||
</nav>
|
||
<section id="review-overview">
|
||
<div id="review-sheet-status" class="small" aria-live="polite">Choose a review request.</div>
|
||
<button class="review-retry" id="retry-review-load" hidden>Retry loading review</button>
|
||
<div class="review-sheet-body markdown-content" id="review-sheet-body"></div>
|
||
<div class="row"><span class="pill" id="review-ci-state">CI unknown</span><button class="share-work-route" type="button">Share</button><a id="open-review-gitea" href="#" target="_blank" rel="noopener noreferrer">Open in Gitea</a></div>
|
||
<details class="ci-checks" id="review-checks">
|
||
<summary><span>Checks</span><span class="small" id="review-checks-summary">Not loaded</span></summary>
|
||
<button class="ci-check-refresh" id="refresh-review-checks" type="button">Refresh checks</button>
|
||
<div class="ci-check-list" id="review-check-list"></div>
|
||
</details>
|
||
</section>
|
||
<section id="review-files-workspace">
|
||
<h2>Changed files</h2>
|
||
<div class="review-display-tools">
|
||
<button id="review-wrap-lines" type="button" aria-pressed="false" aria-controls="review-files">Wrap lines</button>
|
||
<span class="small">Keep long diffs inside the review sheet.</span>
|
||
</div>
|
||
<div id="review-files" class="muted"></div>
|
||
<section class="review-inline-composer" id="review-inline-composer" aria-labelledby="review-inline-title" hidden>
|
||
<strong id="review-inline-title">Comment on changed line</strong>
|
||
<label class="small" id="review-inline-location" for="review-inline-body"></label>
|
||
<textarea id="review-inline-body" maxlength="10000" placeholder="Write a line-specific comment"></textarea>
|
||
<div class="review-inline-actions">
|
||
<button id="save-inline-comment" type="button">Save draft comment</button>
|
||
<button id="delete-inline-comment" type="button">Delete draft</button>
|
||
<button id="cancel-inline-comment" type="button">Cancel</button>
|
||
</div>
|
||
</section>
|
||
<div class="review-progress-actions">
|
||
<span class="small" id="review-progress" aria-live="polite">0 of 0 files reviewed</span>
|
||
<button id="next-unreviewed-review" disabled>Next unreviewed</button>
|
||
</div>
|
||
</section>
|
||
<section class="review-feedback" id="review-feedback" aria-labelledby="review-feedback-title">
|
||
<h2 id="review-feedback-title">Draft feedback</h2>
|
||
<label>Intended decision
|
||
<select id="review-decision">
|
||
<option value="comment">Comment</option>
|
||
<option value="approve">Approve</option>
|
||
<option value="request_changes">Request changes</option>
|
||
</select>
|
||
</label>
|
||
<label>Overall summary
|
||
<textarea id="review-summary" placeholder="Summarize your review"></textarea>
|
||
</label>
|
||
<div class="review-handoff">
|
||
<button id="submit-review">Submit review</button>
|
||
<span class="small" id="review-submit-status" aria-live="assertive"></span>
|
||
<button id="copy-review-feedback">Copy feedback & continue in Gitea</button>
|
||
<span class="small" id="review-handoff-status" aria-live="polite"></span>
|
||
<textarea class="review-copy-fallback" id="review-copy-fallback" readonly hidden aria-label="Feedback to copy manually"></textarea>
|
||
<a class="review-handoff-link" id="review-handoff-link" target="_blank" rel="noopener noreferrer" hidden>Continue to Gitea</a>
|
||
</div>
|
||
<div class="review-merge-continuation">
|
||
<button id="continue-review-to-merge" type="button" hidden>Continue to merge</button>
|
||
</div>
|
||
</section>
|
||
<section id="review-history-workspace">
|
||
<h2>Review history</h2>
|
||
<div id="review-history" class="muted"></div>
|
||
</section>
|
||
<div class="review-sheet-actions"><details class="detail-defer"><summary>Defer</summary><div class="detail-defer-options"><button type="button" data-detail-defer-preset="today" disabled data-planning-disabled>Later today</button><button type="button" data-detail-defer-preset="tomorrow" disabled data-planning-disabled>Tomorrow</button><button type="button" data-detail-defer-custom disabled data-planning-disabled>Choose date & time</button><button type="button" data-detail-defer-cancel>Cancel</button></div></details></div>
|
||
<nav class="work-session-nav" aria-label="Work session" hidden>
|
||
<span class="small" aria-live="polite" data-work-session-progress></span>
|
||
<button type="button" data-work-session-previous>Previous</button>
|
||
<button type="button" data-work-session-timer-toggle>Pause timer</button>
|
||
<button type="button" data-work-session-complete="review" hidden>Done for Today & next</button>
|
||
<button type="button" data-work-session-next>Next work item</button>
|
||
</nav>
|
||
</section>
|
||
</div>
|
||
|
||
<dialog class="later-picker" id="later-picker" role="dialog" aria-modal="true" aria-labelledby="later-picker-heading" hidden>
|
||
<form class="later-picker-panel" id="later-picker-form">
|
||
<div class="later-picker-header"><h2 id="later-picker-heading">Choose return time</h2><button id="cancel-later-picker" type="button">Cancel</button></div>
|
||
<p class="small">The item stays unread and unchanged in Gitea.</p>
|
||
<label for="later-picker-time">Return this work at</label>
|
||
<input id="later-picker-time" type="datetime-local" required />
|
||
<div class="small" id="later-picker-timezone"></div>
|
||
<div class="small later-picker-error" id="later-picker-error" aria-live="assertive"></div>
|
||
<button id="confirm-later-picker" type="submit">Defer until…</button>
|
||
</form>
|
||
</dialog>
|
||
|
||
<section class="today-session-handoff" id="today-session-handoff" aria-live="polite" hidden>
|
||
<div>
|
||
<strong>Today is active on another device</strong>
|
||
<div class="small" id="today-session-handoff-summary"></div>
|
||
</div>
|
||
<button id="continue-today-session" type="button">Continue here</button>
|
||
</section>
|
||
|
||
<section class="mobile-today-hud" data-mobile-today-hud aria-label="Active Today session" hidden>
|
||
<button class="mobile-today-summary" data-mobile-today-open type="button" aria-label="Open current Today item"></button>
|
||
<button data-mobile-today-complete type="button" hidden>Done & next</button>
|
||
<div class="small" data-work-session-progress aria-live="polite"></div>
|
||
<button data-mobile-today-toggle data-work-session-timer-toggle type="button">Pause timer</button>
|
||
<button data-work-session-adjust-plan type="button" hidden>Adjust remaining plan</button>
|
||
</section>
|
||
<dialog class="mobile-queue-sheet" id="mobile-queue-sheet" aria-labelledby="mobile-queue-heading">
|
||
<section class="mobile-queue-panel">
|
||
<header><h2 id="mobile-queue-heading">Work queues</h2><button id="close-mobile-queues" type="button">Close</button></header>
|
||
<div id="mobile-update-outcome" class="mobile-update-outcome" role="status" aria-live="polite" hidden>
|
||
<p id="mobile-update-outcome-summary"></p>
|
||
<button id="review-kept-updates" type="button" hidden>Review kept unread</button>
|
||
</div>
|
||
<p class="small muted">Choose what to work through next.</p>
|
||
<section class="mobile-start-day" aria-labelledby="mobile-start-day-heading">
|
||
<div>
|
||
<h3 id="mobile-start-day-heading">Prepare Today</h3>
|
||
<p id="mobile-start-day-summary" class="small" aria-live="polite">Reviewing urgent queues…</p>
|
||
<p id="mobile-start-day-phases" class="small muted">Checking Agenda, Attention, Updates, and Filed</p>
|
||
</div>
|
||
<button class="mobile-start-day-action" id="mobile-start-day-action" type="button">Prepare Today</button>
|
||
<button class="mobile-start-day-finish" id="finish-mobile-start-day" type="button" hidden>Finish for now</button>
|
||
</section>
|
||
<div class="mobile-queue-list">
|
||
<button data-mobile-queue="today" type="button"><span><strong>Today</strong><small>Planned work</small></span><span data-mobile-queue-count="today">0</span></button>
|
||
<button data-mobile-queue="agenda" type="button"><span><strong>Agenda</strong><small>Upcoming deadlines</small></span><span data-mobile-queue-count="agenda">0</span></button>
|
||
<button data-mobile-queue="delivery" type="button"><span><strong>Delivery</strong><small>Needs recovery</small></span><span data-mobile-queue-count="delivery">0</span></button>
|
||
<button data-mobile-queue="attention" type="button"><span><strong>Attention</strong><small>Needs a response</small></span><span data-mobile-queue-count="attention">0</span></button>
|
||
<button data-mobile-queue="update" type="button" aria-label="Updates, 0 unread conversations"><span><strong>Updates</strong><small>Unread conversations</small></span><span data-mobile-queue-count="update">0</span></button>
|
||
<button data-mobile-queue="filed" type="button"><span><strong>Filed</strong><small>Issues you delegated</small></span><span data-mobile-queue-count="filed">0</span></button>
|
||
<button data-mobile-queue="later" type="button"><span><strong>Later</strong><small>Deferred work</small></span><span data-mobile-queue-count="later">0</span></button>
|
||
<button data-mobile-queue="draft" type="button"><span><strong>Drafts</strong><small>Unfiled captures</small></span><span data-mobile-queue-count="draft">0</span></button>
|
||
<button data-mobile-queue="find" type="button"><span><strong>Find Work</strong><small>Claim something new</small></span></button>
|
||
<button data-mobile-queue="recaps" type="button"><span><strong>Recaps</strong><small>History</small></span></button>
|
||
</div>
|
||
</section>
|
||
</dialog>
|
||
|
||
<dialog id="mobile-delivery-recovery" class="mobile-delivery-recovery" aria-labelledby="mobile-delivery-recovery-title">
|
||
<section class="mobile-delivery-recovery-panel">
|
||
<header>
|
||
<div><p class="small muted" id="mobile-delivery-recovery-progress"></p><h2 id="mobile-delivery-recovery-title">Recover delivery</h2></div>
|
||
<button id="close-mobile-delivery-recovery" type="button">Close</button>
|
||
</header>
|
||
<p id="mobile-delivery-recovery-destination" class="small"></p>
|
||
<p id="mobile-delivery-recovery-reason" class="delivery-recovery-reason"></p>
|
||
<p id="mobile-delivery-recovery-status" class="small" role="status" aria-live="polite"></p>
|
||
<button id="mobile-delivery-recovery-action" type="button">Recover delivery</button>
|
||
<details><summary>Other recovery options</summary><p class="small muted">Close this guide to edit, copy, or discard the saved delivery from Drafts.</p></details>
|
||
</section>
|
||
</dialog>
|
||
|
||
<nav class="mobile-task-dock" id="mobile-task-dock" aria-label="Primary tasks">
|
||
<button class="mobile-task-action" data-mobile-task="work" type="button" aria-current="page"><span id="mobile-work-label">Work</span></button>
|
||
<button class="mobile-task-action" data-mobile-task="find" type="button">Find</button>
|
||
<button class="mobile-task-action" data-mobile-task="new" type="button">New</button>
|
||
<button class="mobile-task-action" data-mobile-task="search" type="button">Search</button>
|
||
<button class="mobile-task-action" data-mobile-task="queues" type="button" aria-label="Queues: no active queues; no upcoming deadlines"><span>Queues <span class="mobile-task-count" id="mobile-queue-count" hidden>0 active</span></span><span class="mobile-task-deadline" id="mobile-deadline-count" hidden>0 due</span></button>
|
||
</nav>
|
||
|
||
<div class="footer">Creative AI-imbued UI • stackchain-dashboard</div>
|
||
|
||
<script src="static/private-data-registry.js"></script>
|
||
<script src="static/session.js"></script>
|
||
<script src="static/feature-loader.js"></script>
|
||
<script src="static/conversation-action-hydrator.js"></script>
|
||
<script src="static/security-center.js"></script>
|
||
<script src="static/markdown.js"></script>
|
||
<script src="static/commands.js"></script>
|
||
<script src="static/saved-searches.js"></script>
|
||
<script src="static/search-preview.js"></script>
|
||
<script src="static/search-reply-draft-store.js"></script>
|
||
<script src="static/conversation-reply-draft-store.js"></script>
|
||
<script src="static/conversation-photo-drafts.js"></script>
|
||
<script src="static/search-defer.js"></script>
|
||
<script src="static/widgets.js"></script>
|
||
<script src="static/drafts.js"></script>
|
||
<script src="static/unfiled-captures.js"></script>
|
||
<script src="static/unfiled-draft-sync.js"></script>
|
||
<script src="static/shared-image-capture.js"></script>
|
||
<script src="static/draft-filing-session.js"></script>
|
||
<script src="static/draft-capacity-dialog.js"></script>
|
||
<script src="static/outbox-coordinator.js"></script>
|
||
<script src="static/background-issue-sync.js"></script>
|
||
<script src="static/issue-outbox.js"></script>
|
||
<script src="static/reconnect-outboxes.js"></script>
|
||
<script src="static/authored-outbox.js"></script>
|
||
<script src="static/offline-issue-close.js"></script>
|
||
<script src="static/offline-issue-blocker.js"></script>
|
||
<script src="static/notification-read-outbox.js"></script>
|
||
<script src="static/offline-work.js"></script>
|
||
<script src="static/offline-today.js"></script>
|
||
<script src="static/my-work.js"></script>
|
||
<script src="static/agenda-replan.js"></script>
|
||
<script src="static/protect-today.js"></script>
|
||
<script src="static/notification-undo.js"></script>
|
||
<script src="static/card-planning.js"></script>
|
||
<script src="static/work-selection.js"></script>
|
||
<script src="static/today-work.js"></script>
|
||
<script src="static/today-timer.js"></script>
|
||
<script src="static/today-lock-screen.js"></script>
|
||
<script src="static/today-session-sync.js"></script>
|
||
<script src="static/today-recap.js"></script>
|
||
<script src="static/today-wrap-up.js"></script>
|
||
<script src="static/today-handoff.js"></script>
|
||
<script src="static/today-completion.js"></script>
|
||
<script src="static/today-readiness.js"></script>
|
||
<script src="static/comment-next.js"></script>
|
||
<script src="static/update-reply-read-next.js"></script>
|
||
<script src="static/plan-today.js"></script>
|
||
<script src="static/plan-today-readiness.js"></script>
|
||
<script src="static/plan-today-preview.js"></script>
|
||
<script src="static/today-sync.js"></script>
|
||
<script src="static/today-rollover.js"></script>
|
||
<script src="static/update-ownership.js"></script>
|
||
<script src="static/update-follow-up.js"></script>
|
||
<script src="static/later-work.js"></script>
|
||
<script src="static/later-sync.js"></script>
|
||
<script src="static/later-and-start.js"></script>
|
||
<script src="static/detail-defer.js"></script>
|
||
<script src="static/later-picker.js"></script>
|
||
<script src="static/pick-work.js"></script>
|
||
<script src="static/batch-find-work.js"></script>
|
||
<script src="static/search-batch-plan.js"></script>
|
||
<script src="static/conversation.js"></script>
|
||
<script src="static/comment-actions.js"></script>
|
||
<script src="static/issue-evidence-review.js"></script>
|
||
<script src="static/issue-evidence-editor.js"></script>
|
||
<script src="static/issue-attachment.js"></script>
|
||
<script src="static/issue-filing-review.js"></script>
|
||
<script src="static/issue-sheet.js"></script>
|
||
<script src="static/voice-transcript-store.js"></script>
|
||
<script src="static/voice-issue-capture.js"></script>
|
||
<script src="static/voice-conversation-capture.js"></script>
|
||
<script src="static/create-issue-sheet.js"></script>
|
||
<script src="static/mobile-create-issue-nav.js"></script>
|
||
<script src="static/create-and-start.js"></script>
|
||
<script src="static/assign-and-start.js"></script>
|
||
<script src="static/filed-claim.js"></script>
|
||
<script src="static/queue-today.js"></script>
|
||
<script src="static/pull-sheet.js"></script>
|
||
<script src="static/review-sheet.js"></script>
|
||
<script src="static/work-route.js"></script>
|
||
<script src="static/task-overlay-history.js"></script>
|
||
<script src="static/context-poller.js"></script>
|
||
<script src="static/live-data-status.js"></script>
|
||
<script src="static/mobile-task-dock.js"></script>
|
||
<script src="static/mobile-pull-refresh.js"></script>
|
||
<script src="static/mobile-work-entry.js"></script>
|
||
<script src="static/mobile-queue-launcher.js"></script>
|
||
<script src="static/mobile-delivery-recovery.js"></script>
|
||
<script src="static/mobile-start-day.js"></script>
|
||
<script src="static/update-triage-session.js"></script>
|
||
<script src="static/update-review-handoff.js"></script>
|
||
<script src="static/update-read-position.js"></script>
|
||
<script src="static/work-detail-position.js"></script>
|
||
<script src="static/update-triage-launcher.js"></script>
|
||
<script src="static/update-triage-gesture.js"></script>
|
||
<script src="static/update-decision-transaction.js"></script>
|
||
<script src="static/agenda-session-launcher.js"></script>
|
||
<script src="static/mobile-launch.js"></script>
|
||
<script src="static/mobile-insights.js"></script>
|
||
<script src="static/mobile-app-shortcuts.js"></script>
|
||
<script src="static/install-app.js"></script>
|
||
<script src="static/private-data-inventory.js"></script>
|
||
<script src="static/private-device-data.js"></script>
|
||
<script src="static/device-storage.js"></script>
|
||
<script src="static/mobile-device-setup.js"></script>
|
||
<script src="static/mobile-search-viewport.js"></script>
|
||
<script src="static/mobile-composer-viewport.js"></script>
|
||
<script src="static/mention-composer.js"></script>
|
||
<script src="static/push-notifications.js"></script>
|
||
<script src="static/issue-filing-receipt.js"></script>
|
||
<script src="static/mobile-issue-detail-nav.js"></script>
|
||
<script src="static/mobile-update-detail-nav.js"></script>
|
||
<script src="static/mobile-review-detail-nav.js"></script>
|
||
<script src="static/mobile-search-preview-nav.js"></script>
|
||
<script src="static/mobile-plan-today-nav.js"></script>
|
||
<script src="static/mobile-find-work-nav.js"></script>
|
||
<script src="static/workspace-bootstrap.js"></script>
|
||
<script src="static/dashboard.js"></script>
|
||
</body>
|
||
</html>
|