881 lines
53 KiB
HTML
881 lines
53 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>
|
||
<div class="app-live-status"><span class="dot"></span><span class="small" id="status">Live</span></div>
|
||
<details class="app-menu">
|
||
<summary id="app-menu-toggle" aria-label="Open dashboard menu">Menu</summary>
|
||
<div class="app-menu-panel">
|
||
<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 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>Active devices</h2><p class="small muted">Review signed-in devices and remove access you no longer trust.</p></div>
|
||
<button id="close-active-devices" type="button" aria-label="Close active devices">Close</button>
|
||
</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 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 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>
|
||
</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>
|
||
</ol>
|
||
<p id="device-setup-ready-status" class="device-setup-ready" role="status" aria-live="polite"></p>
|
||
</section>
|
||
</div>
|
||
|
||
<main>
|
||
<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="attention" aria-pressed="false">Attention <span data-work-count="attention">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>
|
||
<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>
|
||
<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-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="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>
|
||
<div class="small" id="today-sync-status" aria-live="polite">Today is saved on this device.</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>
|
||
<button id="bulk-mark-read" type="button"></button>
|
||
</div>
|
||
</section>
|
||
<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>
|
||
</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>
|
||
<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>
|
||
<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 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 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 & adjust plan</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>
|
||
|
||
<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 id="cmd-palette" role="dialog" aria-label="Command palette">
|
||
<div class="cmd-palette-header">
|
||
<strong>Search work</strong>
|
||
<button id="close-command-palette" type="button">Close</button>
|
||
</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..." />
|
||
<div id="cmd-results" class="stack" role="listbox" aria-label="Commands and work search results"></div>
|
||
</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>
|
||
<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>
|
||
<div class="search-preview-actions">
|
||
<div class="search-preview-primary-actions">
|
||
<button id="claim-search-result" type="button" hidden>Assign to me</button>
|
||
<button id="start-search-result" type="button" hidden>Assign & start</button>
|
||
|
||
</div>
|
||
<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>
|
||
<div id="issue-sheet-status" class="small" aria-live="polite">Choose an issue.</div>
|
||
<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 class="issue-sheet-content markdown-content" id="issue-sheet-body"></div>
|
||
<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>
|
||
<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>
|
||
<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>
|
||
<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">
|
||
<input class="visually-hidden" id="issue-attachment" type="file" accept="image/png,image/jpeg,image/webp" />
|
||
<label class="issue-attachment-trigger" for="issue-attachment">Attach screenshot</label>
|
||
</div>
|
||
<div class="issue-attachment-preview" id="issue-attachment-preview" hidden>
|
||
<img id="issue-attachment-image" alt="Selected screenshot preview" />
|
||
<span class="small" id="issue-attachment-meta"></span>
|
||
<button id="remove-issue-attachment" type="button">Remove screenshot</button>
|
||
</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>
|
||
<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>
|
||
<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>
|
||
<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>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>
|
||
<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>
|
||
<button id="close-find-work" type="button">Close</button>
|
||
</div>
|
||
<p class="small">Claim an available issue and continue it in My Work.</p>
|
||
<div id="find-work-status" class="small" aria-live="assertive">Open Find Work to load available issues.</div>
|
||
<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>
|
||
</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">New issue</h3>
|
||
<button id="cancel-new-issue" type="button">Cancel</button>
|
||
</div>
|
||
<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">
|
||
<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 for="create-issue-title">Title
|
||
<input id="create-issue-title" type="text" maxlength="255" required autocomplete="off" />
|
||
</label>
|
||
<label for="create-issue-body">Description <span class="small">Optional</span>
|
||
<textarea id="create-issue-body" maxlength="10000"></textarea>
|
||
</label>
|
||
<section class="create-issue-attachment" aria-labelledby="create-issue-attachment-label">
|
||
<strong id="create-issue-attachment-label">Screenshot <span class="small">Optional · PNG, JPEG, or WebP · 2 MB max</span></strong>
|
||
<div class="issue-attachment-controls">
|
||
<label class="issue-attachment-trigger" for="create-issue-attachment">Attach screenshot</label>
|
||
<input class="visually-hidden" id="create-issue-attachment" type="file" accept="image/png,image/jpeg,image/webp" />
|
||
</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>
|
||
<button id="remove-create-issue-attachment" type="button">Remove</button>
|
||
</div>
|
||
<div class="small" id="create-issue-attachment-status" aria-live="polite"></div>
|
||
</section>
|
||
<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>
|
||
<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>
|
||
<div class="small">The issue will be assigned to you.</div>
|
||
<div class="create-issue-actions">
|
||
<button id="save-unfiled-issue" type="button">Save for filing</button>
|
||
<button id="submit-new-issue" type="submit">Create & assign to me</button>
|
||
<button id="create-and-start-issue" type="submit">Create & start</button>
|
||
<div id="create-issue-status" class="small" aria-live="assertive"></div>
|
||
</div>
|
||
</form>
|
||
</section>
|
||
</div>
|
||
|
||
<div class="update-sheet" id="update-sheet" role="dialog" aria-modal="true" aria-labelledby="update-sheet-title">
|
||
<section class="update-sheet-panel">
|
||
<div class="update-sheet-header">
|
||
<div>
|
||
<div class="small" id="update-sheet-key"></div>
|
||
<h3 id="update-sheet-title">Unread update</h3>
|
||
</div>
|
||
<button id="keep-update-unread" type="button">Keep unread</button>
|
||
</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>
|
||
<h2>Full conversation</h2>
|
||
<div id="update-comments"></div>
|
||
<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>
|
||
<details>
|
||
<summary><h2>Subject context</h2></summary>
|
||
<div class="update-sheet-content muted markdown-content" id="update-subject-body"></div>
|
||
</details>
|
||
<section class="update-reply" 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>
|
||
<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">
|
||
<input class="visually-hidden" id="update-reply-attachment" type="file" accept="image/png,image/jpeg,image/webp" />
|
||
<label class="issue-attachment-trigger" for="update-reply-attachment">Attach screenshot</label>
|
||
</div>
|
||
<div class="issue-attachment-preview" 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>
|
||
<button id="remove-update-reply-attachment" type="button">Remove screenshot</button>
|
||
</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>
|
||
<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="mark-update-read-next" type="button">Mark read & next</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>
|
||
<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>
|
||
</section>
|
||
</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>
|
||
<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>
|
||
<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>
|
||
<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>
|
||
<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">
|
||
<input class="visually-hidden" id="pull-attachment" type="file" accept="image/png,image/jpeg,image/webp" />
|
||
<label class="issue-attachment-trigger" for="pull-attachment">Attach screenshot</label>
|
||
</div>
|
||
<div class="issue-attachment-preview" id="pull-attachment-preview" hidden>
|
||
<img id="pull-attachment-image" alt="Selected screenshot preview" />
|
||
<span class="small" id="pull-attachment-meta"></span>
|
||
<button id="remove-pull-attachment" type="button">Remove screenshot</button>
|
||
</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>
|
||
<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>
|
||
<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 class="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>
|
||
<h2>Review history</h2>
|
||
<div id="review-history" class="muted"></div>
|
||
<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>
|
||
|
||
<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> <span class="mobile-task-count" id="mobile-attention-count" hidden>0</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="drafts" type="button">Drafts <span class="mobile-task-count" id="mobile-draft-count" aria-label="0 drafts">0</span></button>
|
||
</nav>
|
||
|
||
<div class="footer">Creative AI-imbued UI • stackchain-dashboard</div>
|
||
|
||
<script src="static/session.js"></script>
|
||
<script src="static/feature-loader.js"></script>
|
||
<script src="static/markdown.js"></script>
|
||
<script src="static/commands.js"></script>
|
||
<script src="static/search-preview.js"></script>
|
||
<script src="static/widgets.js"></script>
|
||
<script src="static/drafts.js"></script>
|
||
<script src="static/unfiled-captures.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/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/card-planning.js"></script>
|
||
<script src="static/today-work.js"></script>
|
||
<script src="static/today-timer.js"></script>
|
||
<script src="static/today-recap.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-preview.js"></script>
|
||
<script src="static/today-sync.js"></script>
|
||
<script src="static/update-ownership.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/conversation.js"></script>
|
||
<script src="static/comment-actions.js"></script>
|
||
<script src="static/issue-attachment.js"></script>
|
||
<script src="static/issue-sheet.js"></script>
|
||
<script src="static/create-issue-sheet.js"></script>
|
||
<script src="static/create-and-start.js"></script>
|
||
<script src="static/assign-and-start.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/mobile-task-dock.js"></script>
|
||
<script src="static/mobile-work-entry.js"></script>
|
||
<script src="static/mobile-launch.js"></script>
|
||
<script src="static/install-app.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/dashboard.js"></script>
|
||
</body>
|
||
</html>
|