Diff -- /var/www/vhosts/3dshawn.com/site1/TEMPLATES/page_wrapper.html
Diff

/var/www/vhosts/3dshawn.com/site1/TEMPLATES/page_wrapper.html

added on local at 2026-07-13 16:46:18

Added
+221
lines
Removed
-0
lines
Context
0
unchanged
Blobs
from
to 8ea347049a20
Restore this content →
Unified diff
Naive LCS-based line diff. Additions in emerald, deletions in rose. Both sides decompressed live from BLOB_STORE.
1<!doctype html>
2<html lang="en">
3<head>
4 <meta charset="utf-8">
5 <meta name="viewport" content="width=device-width, initial-scale=1">
6 <meta http-equiv="Cache-Control" content="no-store, no-cache, must-revalidate, max-age=0">
7 <title>$page_title -- $brand_name</title>
8 <link rel="stylesheet" href="/assets/styles/drift_sense.css?v=$asset_version">
9 <link rel="stylesheet" href="/assets/styles/help_tips.css?v=$asset_version">
10 <link rel="icon" type="image/svg+xml" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><rect x='0.75' y='0.75' width='30.5' height='30.5' rx='7.5' fill='%230a1220' stroke='%2314b8a6' stroke-width='1.5'/><text x='16' y='22' font-family='Arial,Helvetica,sans-serif' font-size='14' font-weight='700' fill='%232dd4bf' text-anchor='middle'>DS</text></svg>">
11</head>
12<body>
13<div class="app-shell app">
14
15 <aside class="sidebar">
16 <a class="sidebar-brand" href="[url:dashboard]">
17 <div class="logo">DS</div>
18 <div class="brand-text">
19 <div class="brand-name">Drift<span class="accent">Sense</span></div>
20 <div class="brand-sub">$brand_tagline</div>
21 </div>
22 </a>
23
24 <div class="sidebar-section-label">Monitor</div>
25 <a href="[url:dashboard]" class="sidebar-link[if:$active_dashboard] active[/if]">
26 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="7" height="9"/><rect x="14" y="3" width="7" height="5"/><rect x="14" y="12" width="7" height="9"/><rect x="3" y="16" width="7" height="5"/></svg>
27 <span>Dashboard</span>
28 </a>
29 <a href="/sites.cgi" class="sidebar-link[if:$active_sites] active[/if]">
30 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="7" height="7" rx="1"/><rect x="14" y="3" width="7" height="7" rx="1"/><rect x="3" y="14" width="7" height="7" rx="1"/><rect x="14" y="14" width="7" height="7" rx="1"/></svg>
31 <span>Sites ($sites_ct)</span>
32 </a>
33 <a href="[url:file_changes]" class="sidebar-link[if:$active_file_changes] active[/if]">
34 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/><line x1="16" y1="13" x2="8" y2="13"/><line x1="16" y1="17" x2="8" y2="17"/></svg>
35 <span>File changes</span>
36 </a>
37 <a href="/search.cgi" class="sidebar-link[if:$active_search] active[/if]">
38 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>
39 <span>Search captures</span>
40 </a>
41 <a href="/portfolio_drift.cgi" class="sidebar-link[if:$active_portfolio_drift] active[/if]">
42 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="22 12 18 12 15 21 9 3 6 12 2 12"/></svg>
43 <span>Portfolio drift</span>
44 </a>
45 <a href="/broadcast.cgi" class="sidebar-link[if:$active_broadcast] active[/if]">
46 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 11a9 9 0 0 1 9 9"/><path d="M4 4a16 16 0 0 1 16 16"/><circle cx="5" cy="19" r="1"/></svg>
47 <span>Broadcast</span>
48 </a>
49 <a href="/watchlist.cgi" class="sidebar-link[if:$active_watchlist] active[/if]">
50 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polygon points="12 2 15 8.5 22 9.3 17 14 18.2 21 12 17.8 5.8 21 7 14 2 9.3 9 8.5 12 2"/></svg>
51 <span>Watch-list</span>
52 </a>
53 <a href="/file_bio.cgi" class="sidebar-link[if:$active_file_bio] active[/if]">
54 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg>
55 <span>File biography</span>
56 </a>
57 <a href="[url:schema_changes]" class="sidebar-link[if:$active_schema_changes] active[/if]">
58 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><ellipse cx="12" cy="5" rx="9" ry="3"/><path d="M3 5v6c0 1.7 4 3 9 3s9-1.3 9-3V5"/><path d="M3 11v6c0 1.7 4 3 9 3s9-1.3 9-3v-6"/></svg>
59 <span>Schema changes</span>
60 </a>
61 <a href="[url:table_locks]" class="sidebar-link[if:$active_table_locks] active[/if]">
62 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="11" width="18" height="11" rx="2"/><path d="M7 11V7a5 5 0 0 1 10 0v4"/></svg>
63 <span>Table locks</span>
64 </a>
65 <a href="[url:named_releases]" class="sidebar-link[if:$active_named_releases] active[/if]">
66 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M20 13V7a2 2 0 0 0-2-2h-4l-2-3H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h5"/><path d="M14 19l2 2 4-4"/></svg>
67 <span>Named releases</span>
68 </a>
69 <a href="/release_diff.cgi" class="sidebar-link[if:$active_release_diff] active[/if]">
70 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="8 3 4 7 8 11"/><polyline points="16 21 20 17 16 13"/><line x1="4" y1="7" x2="20" y2="7"/><line x1="4" y1="17" x2="20" y2="17"/></svg>
71 <span>Release diff</span>
72 </a>
73
74 [if:$has_stables]
75 <div class="sidebar-section-label">Stable versions</div>
76 [loop:@stable_releases]
77 <a href="$restore_url" class="sidebar-link ds-stable-link" title="Restore all pinned to this stable version">
78 <span class="ds-stable-tag">v</span>
79 <span>$label</span>
80 </a>
81 [/loop]
82 [/if]
83
84 <div class="sidebar-section-label">Notify &amp; export</div>
85 <a href="/alerts.cgi" class="sidebar-link[if:$active_alerts] active[/if]">
86 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9"/><path d="M13.73 21a2 2 0 0 1-3.46 0"/></svg>
87 <span>Alerts</span>
88 </a>
89 <a href="/export.cgi" class="sidebar-link[if:$active_export] active[/if]">
90 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></svg>
91 <span>Compliance export</span>
92 </a>
93 <a href="/purge_log.cgi" class="sidebar-link[if:$active_purge_log] active[/if]">
94 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="3 6 5 6 21 6"/><path d="M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6"/><line x1="10" y1="11" x2="10" y2="17"/><line x1="14" y1="11" x2="14" y2="17"/></svg>
95 <span>Purge log</span>
96 </a>
97 <a href="/orphan_blobs.cgi" class="sidebar-link[if:$active_orphan_blobs] active[/if]">
98 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="9"/><line x1="7" y1="7" x2="17" y2="17"/></svg>
99 <span>Orphan blobs</span>
100 </a>
101
102 <div class="sidebar-section-label">Configuration</div>
103 <a href="[url:databases]" class="sidebar-link[if:$active_databases] active[/if]">
104 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><ellipse cx="12" cy="5" rx="9" ry="3"/><path d="M21 12c0 1.7-4 3-9 3s-9-1.3-9-3"/><path d="M3 5v14c0 1.7 4 3 9 3s9-1.3 9-3V5"/></svg>
105 <span>Databases</span>
106 </a>
107 <a href="[url:file_monitors]" class="sidebar-link[if:$active_file_monitors] active[/if]">
108 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"/></svg>
109 <span>File monitors</span>
110 </a>
111 <a href="[url:servers]" class="sidebar-link[if:$active_servers] active[/if]">
112 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="2" width="20" height="8" rx="2"/><rect x="2" y="14" width="20" height="8" rx="2"/><line x1="6" y1="6" x2="6.01" y2="6"/><line x1="6" y1="18" x2="6.01" y2="18"/></svg>
113 <span>Servers &amp; agents</span>
114 </a>
115 <a href="[url:containers]" class="sidebar-link[if:$active_containers] active[/if]">
116 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/><polyline points="7.5 4.21 12 6.81 16.5 4.21"/><polyline points="7.5 19.79 7.5 14.6 3 12"/><polyline points="21 12 16.5 14.6 16.5 19.79"/></svg>
117 <span>Containers</span>
118 </a>
119 <a href="[url:settings]" class="sidebar-link[if:$active_settings] active[/if]">
120 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="3"/><path d="M12 1v6m0 10v6M4.22 4.22l4.24 4.24m7.08 7.08l4.24 4.24M1 12h6m10 0h6M4.22 19.78l4.24-4.24m7.08-7.08l4.24-4.24"/></svg>
121 <span>Settings</span>
122 </a>
123
124 <div class="sidebar-section-label">Account</div>
125 <a href="/reset.cgi" class="sidebar-link[if:$active_reset] active[/if]" style="color:var(--accent-danger-hi)" title="Danger zone — wipe captured data and start fresh">
126 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg>
127 <span>Start fresh</span>
128 </a>
129 <a href="/logout.cgi" class="sidebar-link sidebar-link-logout">
130 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"/><polyline points="16 17 21 12 16 7"/><line x1="21" y1="12" x2="9" y2="12"/></svg>
131 <span>Sign out</span>
132 </a>
133 </aside>
134
135 <div class="app-main">
136 <header class="topbar">
137 <button type="button" class="topbar-iconbtn" id="sidebarToggle" title="Collapse sidebar">
138 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="3" y1="6" x2="21" y2="6"/><line x1="3" y1="12" x2="21" y2="12"/><line x1="3" y1="18" x2="21" y2="18"/></svg>
139 </button>
140 <div class="topbar-title">$page_title</div>
141 <div class="topbar-spacer"></div>
142 <form class="topbar-search" method="GET" action="/search.cgi">
143 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="11" cy="11" r="7"/><line x1="20" y1="20" x2="16.65" y2="16.65"/></svg>
144 <input type="text" name="q" placeholder="Search captures..." autocomplete="off">
145 </form>
146 <div class="topbar-actions">
147 <a href="/alerts.cgi" class="topbar-iconbtn" title="Alerts">
148 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9"/><path d="M13.73 21a2 2 0 0 1-3.46 0"/></svg>
149 </a>
150 <div class="profile-dropdown" id="profileDropdown">
151 <button type="button" class="profile-btn" onclick="document.getElementById('profileMenu').classList.toggle('open');">
152 <div class="avatar">$user_initials</div>
153 <div style="text-align:left;line-height:1.2">
154 <div style="font-size:13px;font-weight:600">$user_name</div>
155 <div style="font-size:11px;color:var(--text-dim)">Watchtower Console</div>
156 </div>
157 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" width="14" height="14"><polyline points="6 9 12 15 18 9"/></svg>
158 </button>
159 <div class="profile-dropdown-menu" id="profileMenu">
160 <div style="padding:12px 12px 10px;border-bottom:1px solid var(--border);margin-bottom:6px">
161 <div style="font-weight:600;font-size:13.5px">$user_name</div>
162 <div style="font-size:11.5px;color:var(--text-muted)">$user_email</div>
163 <div style="margin-top:6px;display:flex;gap:6px"><span class="badge primary" style="background:linear-gradient(135deg,var(--accent),var(--accent-deep));color:#030710;font-size:10.5px;font-weight:700;padding:2px 8px;border-radius:6px">Operator</span></div>
164 </div>
165 <div class="profile-dropdown-section">Monitor</div>
166 <a href="/dashboard.cgi"><span class="dropdown-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" width="14" height="14"><rect x="3" y="3" width="7" height="9"/><rect x="14" y="3" width="7" height="5"/><rect x="14" y="12" width="7" height="9"/><rect x="3" y="16" width="7" height="5"/></svg></span> Dashboard</a>
167 <a href="/file_changes.cgi"><span class="dropdown-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" width="14" height="14"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/></svg></span> File changes</a>
168 <a href="/search.cgi"><span class="dropdown-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" width="14" height="14"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg></span> Search captures</a>
169 <a href="/portfolio_drift.cgi"><span class="dropdown-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" width="14" height="14"><polyline points="22 12 18 12 15 21 9 3 6 12 2 12"/></svg></span> Portfolio drift</a>
170 <a href="/named_releases.cgi"><span class="dropdown-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" width="14" height="14"><path d="M20 13V7a2 2 0 0 0-2-2h-4l-2-3H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h5"/><path d="M14 19l2 2 4-4"/></svg></span> Named releases</a>
171 <a href="/sites.cgi"><span class="dropdown-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" width="14" height="14"><rect x="3" y="3" width="7" height="7"/><rect x="14" y="3" width="7" height="7"/><rect x="3" y="14" width="7" height="7"/><rect x="14" y="14" width="7" height="7"/></svg></span> Sites ($sites_ct)</a>
172
173 <div class="profile-dropdown-divider"></div>
174 <div class="profile-dropdown-section">Notify &amp; export</div>
175 <a href="/alerts.cgi"><span class="dropdown-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" width="14" height="14"><path d="M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9"/></svg></span> Alerts</a>
176 <a href="/export.cgi"><span class="dropdown-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" width="14" height="14"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></svg></span> Compliance export</a>
177 <a href="/purge_log.cgi"><span class="dropdown-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" width="14" height="14"><polyline points="3 6 5 6 21 6"/><path d="M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6"/></svg></span> Purge log</a>
178
179 <div class="profile-dropdown-divider"></div>
180 <div class="profile-dropdown-section">Configuration</div>
181 <a href="/databases.cgi"><span class="dropdown-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" width="14" height="14"><ellipse cx="12" cy="5" rx="9" ry="3"/><path d="M21 12c0 1.7-4 3-9 3s-9-1.3-9-3"/><path d="M3 5v14c0 1.7 4 3 9 3s9-1.3 9-3V5"/></svg></span> Databases</a>
182 <a href="/file_monitors.cgi"><span class="dropdown-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" width="14" height="14"><path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"/></svg></span> File monitors</a>
183 <a href="/servers.cgi"><span class="dropdown-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" width="14" height="14"><rect x="2" y="2" width="20" height="8" rx="2"/><rect x="2" y="14" width="20" height="8" rx="2"/></svg></span> Servers &amp; agents</a>
184 <a href="/settings.cgi"><span class="dropdown-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" width="14" height="14"><circle cx="12" cy="12" r="3"/><path d="M12 1v6m0 10v6"/></svg></span> Settings</a>
185
186 <div class="profile-dropdown-divider"></div>
187 <div class="profile-dropdown-section">Account</div>
188 <a href="/logout.cgi"><span class="dropdown-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" width="14" height="14"><path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"/><polyline points="16 17 21 12 16 7"/><line x1="21" y1="12" x2="9" y2="12"/></svg></span> Sign out</a>
189 </div>
190 </div>
191 </div>
192 </header>
193 <div class="app-content">
194$page_body
195 </div>
196 </div>
197
198</div>
199<script src="/assets/js/tz_localize.js?v=$asset_version"></script>
200<script src="/assets/js/ds_charts.js?v=$asset_version"></script>
201<script src="/assets/js/ds_help.js?v=$asset_version"></script>
202<script>
203(function(){
204 // Sidebar collapse toggle (icons-only) persisted in localStorage
205 var btn = document.getElementById('sidebarToggle');
206 var KEY = 'ds-sidebar-collapsed';
207 try { if (localStorage.getItem(KEY) === '1') document.documentElement.classList.add('sidebar-collapsed'); } catch(e){}
208 if (btn) btn.addEventListener('click', function(){
209 document.documentElement.classList.toggle('sidebar-collapsed');
210 try { localStorage.setItem(KEY, document.documentElement.classList.contains('sidebar-collapsed') ? '1' : '0'); } catch(e){}
211 });
212 // Close profile dropdown on outside click
213 document.addEventListener('click', function(e){
214 var m = document.getElementById('profileMenu');
215 var d = document.getElementById('profileDropdown');
216 if (m && d && !d.contains(e.target)) m.classList.remove('open');
217 });
218})();
219</script>
220</body>
221</html>
Keyboard: j next diff k previous diff g top G bottom r restore c compile-check ? help