| 100 |
100 |
|
<main id="main-content" class="main-content">
|
| 101 |
101 |
|
<!-- Work Tab Group -->
|
| 102 |
102 |
|
<div id="work-view" class="view tab-group">
|
| 103 |
|
- |
<div class="pill-nav" role="tablist" aria-label="Work views">
|
| 104 |
|
- |
<button class="pill active" data-subview="tasks">Tasks</button>
|
| 105 |
|
- |
<button class="pill" data-subview="projects">Projects</button>
|
| 106 |
|
- |
<button class="pill" data-subview="problems" title="Candidates from wam and audit runs, ranked by painhours">Problems <span id="problems-count" class="pill-count hidden"></span></button>
|
| 107 |
|
- |
<button class="pill" data-subview="task-graph" title="The blocking graph: what waits on what">Graph</button>
|
|
103 |
+ |
<!-- The strip and the toolbar that shares its row: one flex run,
|
|
104 |
+ |
every member in flow. See makeover-layout's Fallback. -->
|
|
105 |
+ |
<div class="run run-menu">
|
|
106 |
+ |
<div class="pill-nav" role="tablist" aria-label="Work views">
|
|
107 |
+ |
<button class="pill active" data-subview="tasks">Tasks</button>
|
|
108 |
+ |
<button class="pill" data-subview="projects">Projects</button>
|
|
109 |
+ |
<button class="pill" data-subview="problems" title="Candidates from wam and audit runs, ranked by painhours">Problems <span id="problems-count" class="pill-count hidden"></span></button>
|
|
110 |
+ |
<button class="pill" data-subview="task-graph" title="The blocking graph: what waits on what">Graph</button>
|
|
111 |
+ |
</div>
|
|
112 |
+ |
<div class="page-header subview-head" data-for="tasks">
|
|
113 |
+ |
<h2 class="page-title">Tasks</h2>
|
|
114 |
+ |
<div class="row-flex row-flex-section">
|
|
115 |
+ |
<div class="view-toggle" id="task-view-toggle">
|
|
116 |
+ |
<button class="view-toggle-btn active" data-mode="list" data-act="tasks.setViewMode" data-a1="list">List</button>
|
|
117 |
+ |
<button class="view-toggle-btn" data-mode="board" data-act="tasks.setViewMode" data-a1="board">Board</button>
|
|
118 |
+ |
</div>
|
|
119 |
+ |
<button class="button button--secondary mobile-hide" data-act="keyboard.openQuickAddModal" title="Quick add (q)">Quick Add</button>
|
|
120 |
+ |
<button class="button button--primary" data-act="tasks.openNew" title="New task (n)">+ New Task <kbd class="kbd-hint">n</kbd></button>
|
|
121 |
+ |
</div>
|
|
122 |
+ |
</div>
|
|
123 |
+ |
<div class="page-header subview-head hidden" data-for="projects">
|
|
124 |
+ |
<h2 class="page-title">Projects</h2>
|
|
125 |
+ |
<div class="row-flex row-flex-peer">
|
|
126 |
+ |
<span id="projects-filter-slot"></span>
|
|
127 |
+ |
<button class="button button--primary" data-act="projects.openNew" title="New project (n)">+ New Project <kbd class="kbd-hint">n</kbd></button>
|
|
128 |
+ |
</div>
|
|
129 |
+ |
</div>
|
|
130 |
+ |
<div class="page-header subview-head hidden" data-for="problems">
|
|
131 |
+ |
<h2 class="page-title">Problems</h2>
|
|
132 |
+ |
<div class="row-flex row-flex-peer">
|
|
133 |
+ |
<select id="problems-source-filter" class="field field--compact" aria-label="Filter by source" data-change="problems.setSourceFilter">
|
|
134 |
+ |
<option value="">All sources</option>
|
|
135 |
+ |
</select>
|
|
136 |
+ |
<select id="problems-status-filter" class="field field--compact" aria-label="Filter by status" data-change="problems.setStatusFilter">
|
|
137 |
+ |
<option value="Open" selected>Open</option>
|
|
138 |
+ |
<option value="Promoted">Promoted</option>
|
|
139 |
+ |
<option value="Dismissed">Dismissed</option>
|
|
140 |
+ |
<option value="Resolved">Resolved</option>
|
|
141 |
+ |
<option value="all">All</option>
|
|
142 |
+ |
</select>
|
|
143 |
+ |
<button class="button button--secondary" id="problems-refresh" data-act="problems.pull" title="Pull the latest from every configured source">Refresh</button>
|
|
144 |
+ |
<button class="button button--secondary" data-act="problems.configure" title="Configure the wam endpoint">Sources</button>
|
|
145 |
+ |
</div>
|
|
146 |
+ |
</div>
|
|
147 |
+ |
<div class="page-header subview-head hidden" data-for="task-graph">
|
|
148 |
+ |
<h2 class="page-title">Graph</h2>
|
|
149 |
+ |
<div class="row-flex row-flex-peer">
|
|
150 |
+ |
<select id="task-graph-project" class="field field--compact" aria-label="Scope the graph to a project" data-change="taskGraph.setProject">
|
|
151 |
+ |
<option value="">All projects</option>
|
|
152 |
+ |
</select>
|
|
153 |
+ |
<button class="button button--secondary" data-act="taskGraph.load" title="Reload the graph">Refresh</button>
|
|
154 |
+ |
</div>
|
|
155 |
+ |
</div>
|
|
156 |
+ |
<div class="page-header subview-head hidden" data-for="task-overview">
|
|
157 |
+ |
<div class="row-flex row-flex-section">
|
|
158 |
+ |
<button class="button button--secondary" data-act="taskOverview.close">← Back</button>
|
|
159 |
+ |
<h2 class="page-title" id="task-overview-title">Task Overview</h2>
|
|
160 |
+ |
</div>
|
|
161 |
+ |
<div id="task-overview-actions"></div>
|
|
162 |
+ |
</div>
|
| 108 |
163 |
|
</div>
|
| 109 |
164 |
|
|
| 110 |
165 |
|
<!-- Tasks Sub-View -->
|
| 111 |
166 |
|
<div id="tasks-view" class="subview">
|
| 112 |
|
- |
<div class="page-header">
|
| 113 |
|
- |
<h2 class="page-title">Tasks</h2>
|
| 114 |
|
- |
<div class="row-flex row-flex-section">
|
| 115 |
|
- |
<div class="view-toggle" id="task-view-toggle">
|
| 116 |
|
- |
<button class="view-toggle-btn active" data-mode="list" data-act="tasks.setViewMode" data-a1="list">List</button>
|
| 117 |
|
- |
<button class="view-toggle-btn" data-mode="board" data-act="tasks.setViewMode" data-a1="board">Board</button>
|
| 118 |
|
- |
</div>
|
| 119 |
|
- |
<button class="button button--secondary mobile-hide" data-act="keyboard.openQuickAddModal" title="Quick add (q)">Quick Add</button>
|
| 120 |
|
- |
<button class="button button--primary" data-act="tasks.openNew" title="New task (n)">+ New Task <kbd class="kbd-hint">n</kbd></button>
|
| 121 |
|
- |
</div>
|
| 122 |
|
- |
</div>
|
|
167 |
+ |
|
| 123 |
168 |
|
<div id="task-bulk-actions" class="bulk-actions-bar hidden" role="toolbar" aria-label="Bulk task actions">
|
| 124 |
169 |
|
<span id="task-bulk-count" class="bulk-count">0 selected</span>
|
| 125 |
170 |
|
<button class="button button--sm" data-act="bulk.completeTasks">Complete</button>
|
| 204 |
249 |
|
|
| 205 |
250 |
|
<!-- Projects Sub-View -->
|
| 206 |
251 |
|
<div id="projects-view" class="subview hidden" role="tabpanel" aria-labelledby="projects-tab">
|
| 207 |
|
- |
<div class="page-header">
|
| 208 |
|
- |
<h2 class="page-title">Projects</h2>
|
| 209 |
|
- |
<div class="row-flex row-flex-peer">
|
| 210 |
|
- |
<span id="projects-filter-slot"></span>
|
| 211 |
|
- |
<button class="button button--primary" data-act="projects.openNew" title="New project (n)">+ New Project <kbd class="kbd-hint">n</kbd></button>
|
| 212 |
|
- |
</div>
|
| 213 |
|
- |
</div>
|
|
252 |
+ |
|
| 214 |
253 |
|
<div class="cards-grid" id="projects-grid">
|
| 215 |
254 |
|
<div class="skeleton-shimmer" aria-label="Loading projects">
|
| 216 |
255 |
|
<div class="skeleton-row"><div class="skeleton-avatar"></div><div class="skeleton-lines"><div class="skeleton-line long"></div><div class="skeleton-line medium"></div></div></div>
|
| 222 |
261 |
|
|
| 223 |
262 |
|
<!-- Problems Sub-View -->
|
| 224 |
263 |
|
<div id="problems-view" class="subview hidden" role="tabpanel" aria-labelledby="problems-tab">
|
| 225 |
|
- |
<div class="page-header">
|
| 226 |
|
- |
<h2 class="page-title">Problems</h2>
|
| 227 |
|
- |
<div class="row-flex row-flex-peer">
|
| 228 |
|
- |
<select id="problems-source-filter" class="field field--compact" aria-label="Filter by source" data-change="problems.setSourceFilter">
|
| 229 |
|
- |
<option value="">All sources</option>
|
| 230 |
|
- |
</select>
|
| 231 |
|
- |
<select id="problems-status-filter" class="field field--compact" aria-label="Filter by status" data-change="problems.setStatusFilter">
|
| 232 |
|
- |
<option value="Open" selected>Open</option>
|
| 233 |
|
- |
<option value="Promoted">Promoted</option>
|
| 234 |
|
- |
<option value="Dismissed">Dismissed</option>
|
| 235 |
|
- |
<option value="Resolved">Resolved</option>
|
| 236 |
|
- |
<option value="all">All</option>
|
| 237 |
|
- |
</select>
|
| 238 |
|
- |
<button class="button button--secondary" id="problems-refresh" data-act="problems.pull" title="Pull the latest from every configured source">Refresh</button>
|
| 239 |
|
- |
<button class="button button--secondary" data-act="problems.configure" title="Configure the wam endpoint">Sources</button>
|
| 240 |
|
- |
</div>
|
| 241 |
|
- |
</div>
|
|
264 |
+ |
|
| 242 |
265 |
|
<p class="view-hint">Candidates, not work. Ranked by painhours, so anything left untriaged climbs on its own. Promote the ones worth doing.</p>
|
| 243 |
266 |
|
<div id="problems-list" class="stack stack-peer">
|
| 244 |
267 |
|
<div class="skeleton-shimmer" aria-label="Loading problems">
|
| 249 |
272 |
|
</div>
|
| 250 |
273 |
|
|
| 251 |
274 |
|
<div id="task-graph-view" class="subview hidden" role="tabpanel" aria-labelledby="task-graph-tab">
|
| 252 |
|
- |
<div class="page-header">
|
| 253 |
|
- |
<h2 class="page-title">Graph</h2>
|
| 254 |
|
- |
<div class="row-flex row-flex-peer">
|
| 255 |
|
- |
<select id="task-graph-project" class="field field--compact" aria-label="Scope the graph to a project" data-change="taskGraph.setProject">
|
| 256 |
|
- |
<option value="">All projects</option>
|
| 257 |
|
- |
</select>
|
| 258 |
|
- |
<button class="button button--secondary" data-act="taskGraph.load" title="Reload the graph">Refresh</button>
|
| 259 |
|
- |
</div>
|
| 260 |
|
- |
</div>
|
|
275 |
+ |
|
| 261 |
276 |
|
<p class="view-hint">What waits on what. An arrow runs from a blocker to the task it holds up, and each column is one more completion away from being startable. Tasks with no dependencies either way are not drawn.</p>
|
| 262 |
277 |
|
<div id="task-graph-legend" class="task-graph-legend" aria-hidden="true"></div>
|
| 263 |
278 |
|
<div id="task-graph-canvas" class="task-graph-canvas">
|
| 319 |
334 |
|
</div>
|
| 320 |
335 |
|
<!-- Task Overview Sub-View -->
|
| 321 |
336 |
|
<div id="task-overview-view" class="subview hidden">
|
| 322 |
|
- |
<div class="page-header">
|
| 323 |
|
- |
<div class="row-flex row-flex-section">
|
| 324 |
|
- |
<button class="button button--secondary" data-act="taskOverview.close">← Back</button>
|
| 325 |
|
- |
<h2 class="page-title" id="task-overview-title">Task Overview</h2>
|
| 326 |
|
- |
</div>
|
| 327 |
|
- |
<div id="task-overview-actions"></div>
|
| 328 |
|
- |
</div>
|
|
337 |
+ |
|
| 329 |
338 |
|
<div id="task-overview-content">
|
| 330 |
339 |
|
<div class="skeleton-shimmer" aria-label="Loading task overview">
|
| 331 |
340 |
|
<div class="skeleton-row"><div class="skeleton-lines"><div class="skeleton-line long"></div><div class="skeleton-line medium"></div></div></div>
|
| 338 |
347 |
|
|
| 339 |
348 |
|
<!-- Time Tab Group -->
|
| 340 |
349 |
|
<div id="time-view" class="view tab-group hidden">
|
| 341 |
|
- |
<div class="pill-nav" role="tablist" aria-label="Time views">
|
| 342 |
|
- |
<button class="pill active" data-subview="day-plan">Day</button>
|
| 343 |
|
- |
<button class="pill" data-subview="weekly-review">Week</button>
|
| 344 |
|
- |
<button class="pill" data-subview="monthly-review">Month</button>
|
| 345 |
|
- |
<button class="pill" data-subview="timer" title="Pomodoro-style focus sessions">Timer</button>
|
| 346 |
|
- |
<button class="pill" data-subview="events">Events</button>
|
|
350 |
+ |
<!-- The strip and the toolbar that shares its row: one flex run,
|
|
351 |
+ |
every member in flow. See makeover-layout's Fallback. -->
|
|
352 |
+ |
<div class="run run-menu">
|
|
353 |
+ |
<div class="pill-nav" role="tablist" aria-label="Time views">
|
|
354 |
+ |
<button class="pill active" data-subview="day-plan">Day</button>
|
|
355 |
+ |
<button class="pill" data-subview="weekly-review">Week</button>
|
|
356 |
+ |
<button class="pill" data-subview="monthly-review">Month</button>
|
|
357 |
+ |
<button class="pill" data-subview="timer" title="Pomodoro-style focus sessions">Timer</button>
|
|
358 |
+ |
<button class="pill" data-subview="events">Events</button>
|
|
359 |
+ |
</div>
|
|
360 |
+ |
<div class="page-header subview-head hidden" data-for="weekly-review">
|
|
361 |
+ |
<h2 class="page-title">Weekly Review</h2>
|
|
362 |
+ |
</div>
|
|
363 |
+ |
<div class="page-header subview-head hidden" data-for="monthly-review">
|
|
364 |
+ |
<div class="monthly-review-nav">
|
|
365 |
+ |
<button class="button button--secondary" data-act="monthlyReview.previousMonth" title="Previous month">←</button>
|
|
366 |
+ |
<button class="button button--secondary" data-act="monthlyReview.goToCurrentMonth">This Month</button>
|
|
367 |
+ |
<button class="button button--secondary" data-act="monthlyReview.nextMonth" title="Next month">→</button>
|
|
368 |
+ |
<span id="monthly-review-month-display" class="monthly-review-month-display"></span>
|
|
369 |
+ |
</div>
|
|
370 |
+ |
<span id="month-review-status-badge" class="review-status hidden"></span>
|
|
371 |
+ |
</div>
|
|
372 |
+ |
<div class="page-header subview-head hidden" data-for="timer">
|
|
373 |
+ |
<h2 class="page-title">Timer</h2>
|
|
374 |
+ |
</div>
|
|
375 |
+ |
<div class="page-header subview-head hidden" data-for="events">
|
|
376 |
+ |
<h2 class="page-title">Events</h2>
|
|
377 |
+ |
<button class="button button--primary" data-act="events.openNew" title="New event (n)">+ New Event <kbd class="kbd-hint">n</kbd></button>
|
|
378 |
+ |
</div>
|
| 347 |
379 |
|
</div>
|
| 348 |
380 |
|
|
| 349 |
381 |
|
<!-- Day Plan Sub-View -->
|
| 395 |
427 |
|
|
| 396 |
428 |
|
<!-- Weekly Review Sub-View -->
|
| 397 |
429 |
|
<div id="weekly-review-view" class="subview hidden" role="tabpanel" aria-labelledby="weekly-review-tab">
|
| 398 |
|
- |
<div class="page-header">
|
| 399 |
|
- |
<h2 class="page-title">Weekly Review</h2>
|
| 400 |
|
- |
</div>
|
|
430 |
+ |
|
| 401 |
431 |
|
<div id="weekly-review-content" class="weekly-review-content">
|
| 402 |
432 |
|
<div class="skeleton-shimmer" aria-label="Loading weekly review">
|
| 403 |
433 |
|
<div class="skeleton-row"><div class="skeleton-lines"><div class="skeleton-line long"></div><div class="skeleton-line medium"></div></div></div>
|
| 409 |
439 |
|
|
| 410 |
440 |
|
<!-- Monthly Review Sub-View -->
|
| 411 |
441 |
|
<div id="monthly-review-view" class="subview hidden" role="tabpanel" aria-labelledby="monthly-review-tab">
|
| 412 |
|
- |
<div class="page-header">
|
| 413 |
|
- |
<div class="monthly-review-nav">
|
| 414 |
|
- |
<button class="button button--secondary" data-act="monthlyReview.previousMonth" title="Previous month">←</button>
|
| 415 |
|
- |
<button class="button button--secondary" data-act="monthlyReview.goToCurrentMonth">This Month</button>
|
| 416 |
|
- |
<button class="button button--secondary" data-act="monthlyReview.nextMonth" title="Next month">→</button>
|
| 417 |
|
- |
<span id="monthly-review-month-display" class="monthly-review-month-display"></span>
|
| 418 |
|
- |
</div>
|
| 419 |
|
- |
<span id="month-review-status-badge" class="review-status hidden"></span>
|
| 420 |
|
- |
</div>
|
|
442 |
+ |
|
| 421 |
443 |
|
<div id="monthly-review-content" class="monthly-review-content">
|
| 422 |
444 |
|
<div class="skeleton-shimmer" aria-label="Loading monthly review">
|
| 423 |
445 |
|
<div class="skeleton-row"><div class="skeleton-lines"><div class="skeleton-line long"></div><div class="skeleton-line medium"></div></div></div>
|
| 428 |
450 |
|
|
| 429 |
451 |
|
<!-- Timer Sub-View -->
|
| 430 |
452 |
|
<div id="timer-view" class="subview hidden" role="tabpanel">
|
| 431 |
|
- |
<div class="page-header">
|
| 432 |
|
- |
<h2 class="page-title">Timer</h2>
|
| 433 |
|
- |
</div>
|
|
453 |
+ |
|
| 434 |
454 |
|
<div id="timer-subview-content">
|
| 435 |
455 |
|
<!-- Rendered by time-tracking.js -->
|
| 436 |
456 |
|
</div>
|
| 438 |
458 |
|
|
| 439 |
459 |
|
<!-- Events Sub-View (accessible via keyboard/URL, not shown in pill nav) -->
|
| 440 |
460 |
|
<div id="events-view" class="subview hidden" role="tabpanel" aria-labelledby="events-tab">
|
| 441 |
|
- |
<div class="page-header">
|
| 442 |
|
- |
<h2 class="page-title">Events</h2>
|
| 443 |
|
- |
<button class="button button--primary" data-act="events.openNew" title="New event (n)">+ New Event <kbd class="kbd-hint">n</kbd></button>
|
| 444 |
|
- |
</div>
|
|
461 |
+ |
|
| 445 |
462 |
|
<div class="raised filter-bar" id="events-filter-bar">
|
| 446 |
463 |
|
<label class="filter-checkbox" title="Include events hidden until a later date">
|
| 447 |
464 |
|
<input type="checkbox" id="filter-events-snoozed" data-change="events.onFilterChange">
|
| 511 |
528 |
|
|
| 512 |
529 |
|
<!-- Messages Tab Group -->
|
| 513 |
530 |
|
<div id="messages-view" class="view tab-group hidden">
|
| 514 |
|
- |
<div class="pill-nav" role="tablist" aria-label="Messages views">
|
| 515 |
|
- |
<button class="pill active" data-subview="emails">Email</button>
|
| 516 |
|
- |
<button class="pill" data-subview="contacts">Contacts</button>
|
|
531 |
+ |
<!-- The strip and the toolbar that shares its row: one flex run,
|
|
532 |
+ |
every member in flow. See makeover-layout's Fallback. -->
|
|
533 |
+ |
<div class="run run-menu">
|
|
534 |
+ |
<div class="pill-nav" role="tablist" aria-label="Messages views">
|
|
535 |
+ |
<button class="pill active" data-subview="emails">Email</button>
|
|
536 |
+ |
<button class="pill" data-subview="contacts">Contacts</button>
|
|
537 |
+ |
</div>
|
|
538 |
+ |
<div class="page-header subview-head" data-for="emails">
|
|
539 |
+ |
<h2 class="page-title">Emails</h2>
|
|
540 |
+ |
<div class="row-flex row-flex-peer">
|
|
541 |
+ |
<button class="button button--secondary mobile-hide" data-act="emails.openDrafts">Drafts</button>
|
|
542 |
+ |
<button class="button button--primary" data-act="emails.openCompose" title="Compose email (n)">+ Compose</button>
|
|
543 |
+ |
</div>
|
|
544 |
+ |
</div>
|
|
545 |
+ |
<div class="page-header subview-head hidden" data-for="contacts">
|
|
546 |
+ |
<h2 class="page-title">Contacts</h2>
|
|
547 |
+ |
<div class="contacts-filter-row">
|
|
548 |
+ |
<input type="text" class="field" id="contacts-search" placeholder="Search contacts..." data-input="contacts.filterBySearch">
|
|
549 |
+ |
<select class="filter-select" id="contacts-tag-filter" data-change="contacts.filterByTag">
|
|
550 |
+ |
<option value="">All Tags</option>
|
|
551 |
+ |
</select>
|
|
552 |
+ |
<button class="button button--primary" data-act="contacts.openNew" title="New contact (n)">+ New Contact <kbd class="kbd-hint">n</kbd></button>
|
|
553 |
+ |
</div>
|
|
554 |
+ |
</div>
|
|
555 |
+ |
<div class="page-header subview-head hidden" data-for="contact-dashboard">
|
|
556 |
+ |
<div class="row-flex row-flex-section">
|
|
557 |
+ |
<button class="button button--secondary" data-act="contactDashboard.close">← Back</button>
|
|
558 |
+ |
<h2 class="page-title" id="contact-dashboard-title">Contact</h2>
|
|
559 |
+ |
</div>
|
|
560 |
+ |
<div id="contact-dashboard-actions"></div>
|
|
561 |
+ |
</div>
|
| 517 |
562 |
|
</div>
|
| 518 |
563 |
|
|
| 519 |
564 |
|
<!-- Emails Sub-View -->
|
| 520 |
565 |
|
<div id="emails-view" class="subview" role="tabpanel" aria-labelledby="emails-tab">
|
| 521 |
|
- |
<div class="page-header">
|
| 522 |
|
- |
<h2 class="page-title">Emails</h2>
|
| 523 |
|
- |
<div class="row-flex row-flex-peer">
|
| 524 |
|
- |
<button class="button button--secondary mobile-hide" data-act="emails.openDrafts">Drafts</button>
|
| 525 |
|
- |
<button class="button button--primary" data-act="emails.openCompose" title="Compose email (n)">+ Compose</button>
|
| 526 |
|
- |
</div>
|
| 527 |
|
- |
</div>
|
|
566 |
+ |
|
| 528 |
567 |
|
<div class="email-filter-row mb-peer">
|
| 529 |
568 |
|
<input type="text" class="field" id="email-search" placeholder="Search emails..." data-input="emails.search">
|
| 530 |
569 |
|
<select class="field" id="email-folder-filter" data-change="emails.filterByFolder">
|
| 564 |
603 |
|
|
| 565 |
604 |
|
<!-- Contacts Sub-View -->
|
| 566 |
605 |
|
<div id="contacts-view" class="subview hidden" role="tabpanel" aria-labelledby="contacts-tab">
|
| 567 |
|
- |
<div class="page-header">
|
| 568 |
|
- |
<h2 class="page-title">Contacts</h2>
|
| 569 |
|
- |
<div class="contacts-filter-row">
|
| 570 |
|
- |
<input type="text" class="field" id="contacts-search" placeholder="Search contacts..." data-input="contacts.filterBySearch">
|
| 571 |
|
- |
<select class="filter-select" id="contacts-tag-filter" data-change="contacts.filterByTag">
|
| 572 |
|
- |
<option value="">All Tags</option>
|
| 573 |
|
- |
</select>
|
| 574 |
|
- |
<button class="button button--primary" data-act="contacts.openNew" title="New contact (n)">+ New Contact <kbd class="kbd-hint">n</kbd></button>
|
| 575 |
|
- |
</div>
|
| 576 |
|
- |
</div>
|
|
606 |
+ |
|
| 577 |
607 |
|
<div id="contacts-bulk-bar" class="bulk-actions-bar hidden">
|
| 578 |
608 |
|
<span class="bulk-count">0 selected</span>
|
| 579 |
609 |
|
<button class="button button--sm" data-act="contacts.selectAll">Select All</button>
|
| 591 |
621 |
|
</div>
|
| 592 |
622 |
|
<!-- Contact Dashboard Sub-View -->
|
| 593 |
623 |
|
<div id="contact-dashboard-view" class="subview hidden">
|
| 594 |
|
- |
<div class="page-header">
|
| 595 |
|
- |
<div class="row-flex row-flex-section">
|
| 596 |
|
- |
<button class="button button--secondary" data-act="contactDashboard.close">← Back</button>
|
| 597 |
|
- |
<h2 class="page-title" id="contact-dashboard-title">Contact</h2>
|
| 598 |
|
- |
</div>
|
| 599 |
|
- |
<div id="contact-dashboard-actions"></div>
|
| 600 |
|
- |
</div>
|
|
624 |
+ |
|
| 601 |
625 |
|
<div id="contact-dashboard-content">
|
| 602 |
626 |
|
<div class="skeleton-shimmer" aria-label="Loading contact">
|
| 603 |
627 |
|
<div class="skeleton-row"><div class="skeleton-avatar"></div><div class="skeleton-lines"><div class="skeleton-line long"></div><div class="skeleton-line medium"></div></div></div>
|