Files
TaskTracker/TaskTracker.Api/Pages/Shared/_Layout.cshtml
2026-03-01 22:28:02 -05:00

85 lines
3.7 KiB
Plaintext

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>TaskTracker</title>
<link rel="stylesheet" href="~/css/site.css" />
</head>
<body class="app">
<header class="app-header">
<div class="header-left">
<a href="/board" class="logo">
<span class="logo-icon">T</span>
<span class="logo-text">TaskTracker</span>
</a>
<nav class="nav">
<a href="/board"
class="nav-link @(ViewContext.HttpContext.Request.Path.StartsWithSegments("/board") ? "nav-link--active" : "")">
Board
</a>
<a href="/analytics"
class="nav-link @(ViewContext.HttpContext.Request.Path.StartsWithSegments("/analytics") ? "nav-link--active" : "")">
Analytics
</a>
<a href="/mappings"
class="nav-link @(ViewContext.HttpContext.Request.Path.StartsWithSegments("/mappings") ? "nav-link--active" : "")">
Mappings
</a>
</nav>
</div>
<div class="header-right">
<button type="button" class="btn btn-search" id="search-trigger" onclick="openSearch()">
<svg class="icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<circle cx="11" cy="11" r="8" />
<line x1="21" y1="21" x2="16.65" y2="16.65" />
</svg>
<span class="btn-search__hint">Ctrl+K</span>
</button>
<button type="button" class="btn btn-primary" id="new-task-trigger">
<svg class="icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<line x1="12" y1="5" x2="12" y2="19" />
<line x1="5" y1="12" x2="19" y2="12" />
</svg>
New Task
</button>
</div>
</header>
<main class="app-main">
@RenderBody()
</main>
<div id="search-modal" class="search-backdrop" onclick="if(event.target===this)closeSearch()">
<div class="search-modal">
<div class="search-input-row">
<svg class="icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="11" cy="11" r="8"/><path d="m21 21-4.35-4.35"/></svg>
<input type="text" id="search-input" class="search-input" placeholder="Search tasks..."
autocomplete="off"
hx-get="/board?handler=Search"
hx-target="#search-results"
hx-swap="innerHTML"
hx-trigger="input changed delay:200ms, search"
hx-include="this"
name="q" />
</div>
<div id="search-results" class="search-results">
<!-- Results loaded via htmx -->
</div>
<div class="search-footer">
<span><kbd>↑↓</kbd> navigate</span>
<span><kbd>↵</kbd> open</span>
<span><kbd>esc</kbd> close</span>
</div>
</div>
</div>
<div id="detail-panel"></div>
<script src="~/lib/htmx.min.js"></script>
<script src="~/lib/Sortable.min.js"></script>
<script src="~/lib/chart.umd.min.js"></script>
<script src="~/js/app.js"></script>
@await RenderSectionAsync("Scripts", required: false)
</body>
</html>