2025-11-08 09:59:10 -06:00
|
|
|
<!DOCTYPE html>
|
2025-11-08 09:05:40 -06:00
|
|
|
<html lang="en">
|
|
|
|
|
<head>
|
2025-11-08 10:36:21 -06:00
|
|
|
<meta charset="utf-8" />
|
|
|
|
|
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
2025-11-08 09:59:10 -06:00
|
|
|
<title>FoldWithin</title>
|
2025-11-08 09:05:40 -06:00
|
|
|
|
2025-11-08 10:36:21 -06:00
|
|
|
<!-- Tight baseline CSP (CDNs whitelisted via jsDelivr).
|
|
|
|
|
NOTE: Add SRI attributes later to lock these further. -->
|
2025-11-08 09:05:40 -06:00
|
|
|
<meta http-equiv="Content-Security-Policy"
|
|
|
|
|
content="default-src 'self';
|
|
|
|
|
script-src 'self' https://cdn.jsdelivr.net;
|
|
|
|
|
style-src 'self' 'unsafe-inline';
|
|
|
|
|
img-src 'self' data:;
|
2025-11-08 10:36:21 -06:00
|
|
|
frame-src 'self';
|
|
|
|
|
connect-src 'self'">
|
2025-11-08 09:05:40 -06:00
|
|
|
|
2025-11-08 09:59:10 -06:00
|
|
|
<link rel="stylesheet" href="styles.css" />
|
2025-11-08 10:36:21 -06:00
|
|
|
|
|
|
|
|
<!-- TODO: add SRI hashes once pinned -->
|
2025-11-08 09:05:40 -06:00
|
|
|
<script src="https://cdn.jsdelivr.net/npm/marked@14.1.2/marked.min.js" defer></script>
|
|
|
|
|
<script src="https://cdn.jsdelivr.net/npm/dompurify@3.1.6/dist/purify.min.js" defer></script>
|
2025-11-08 09:59:10 -06:00
|
|
|
<script src="app.js" defer></script>
|
2025-11-08 09:05:40 -06:00
|
|
|
</head>
|
2025-11-08 09:59:10 -06:00
|
|
|
|
2025-11-08 09:05:40 -06:00
|
|
|
<body>
|
2025-11-08 09:59:10 -06:00
|
|
|
<button id="navToggle" class="nav-toggle" aria-label="Toggle navigation">☰</button>
|
2025-11-08 10:36:21 -06:00
|
|
|
<div class="overlay" id="backdrop"></div>
|
|
|
|
|
|
2025-11-08 09:05:40 -06:00
|
|
|
<div id="app">
|
2025-11-08 10:36:21 -06:00
|
|
|
<aside class="sidebar" id="sidebar">
|
2025-11-08 09:59:10 -06:00
|
|
|
<h1>FoldWithin</h1>
|
2025-11-08 10:36:21 -06:00
|
|
|
|
2025-11-08 09:59:10 -06:00
|
|
|
<div class="controls">
|
|
|
|
|
<label>Sort:
|
|
|
|
|
<select id="sortSel">
|
|
|
|
|
<option value="new">Date (new → old)</option>
|
|
|
|
|
<option value="old">Date (old → new)</option>
|
|
|
|
|
<option value="alpha">Title (A → Z)</option>
|
|
|
|
|
</select>
|
|
|
|
|
</label>
|
2025-11-08 10:36:21 -06:00
|
|
|
|
2025-11-08 09:59:10 -06:00
|
|
|
<label>Filter:
|
|
|
|
|
<select id="filterSel">
|
|
|
|
|
<option value="all">All</option>
|
|
|
|
|
<option value="pinned">Pinned</option>
|
|
|
|
|
<option value="posts">Posts</option>
|
|
|
|
|
</select>
|
|
|
|
|
</label>
|
2025-11-08 10:36:21 -06:00
|
|
|
|
|
|
|
|
<input id="searchBox" class="search" type="search" placeholder="Search…" />
|
2025-11-08 09:59:10 -06:00
|
|
|
</div>
|
2025-11-08 10:36:21 -06:00
|
|
|
|
|
|
|
|
<nav id="tree" role="tree" aria-label="Document tree"></nav>
|
2025-11-08 09:05:40 -06:00
|
|
|
</aside>
|
|
|
|
|
|
|
|
|
|
<main class="content">
|
|
|
|
|
<div class="viewer">
|
2025-11-08 09:59:10 -06:00
|
|
|
<div id="meta"></div>
|
|
|
|
|
<iframe id="htmlView" sandbox="allow-scripts allow-forms allow-popups allow-modals allow-downloads"></iframe>
|
|
|
|
|
<div id="mdView" class="md"></div>
|
2025-11-08 10:36:21 -06:00
|
|
|
<div id="errorBox" class="error" hidden></div>
|
2025-11-08 09:05:40 -06:00
|
|
|
</div>
|
|
|
|
|
</main>
|
|
|
|
|
</div>
|
|
|
|
|
</body>
|
|
|
|
|
</html>
|