Diff -- /var/www/vhosts/3dshawn.com/ptmatrix.3dshawn.com/TEMPLATES/tf_marketing.html

O Operator
Diff

/var/www/vhosts/3dshawn.com/ptmatrix.3dshawn.com/TEMPLATES/tf_marketing.html

added on local at 2026-07-11 08:17:26

Added
+96
lines
Removed
-0
lines
Context
0
unchanged
Blobs
from
to c5798ae40c9d
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<meta http-equiv="Pragma" content="no-cache">
8<meta http-equiv="Expires" content="0">
9<title>$tvars.title &middot; $tvars.website_title</title>
10$tvars.meta_tags
11<link rel="stylesheet" href="$tvars.assets_css/site.css?v=2026-06-12-fixbrand">
12$tvars.extra_css
13<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='%232c0508' stroke='white' stroke-width='1.5'/><text x='16' y='22' font-family='Arial,Helvetica,sans-serif' font-size='17' font-weight='700' fill='white' text-anchor='middle'>PT</text></svg>">
14</head>
15<body>
16<nav class="marketing-nav">
17 <a href="/" class="brand"><div class="logo">PT</div><div class="brand-name">$tvars.brand_name</div></a>
18 <div class="nav-links">
19 <a href="/features.cgi">Features</a>
20 <a href="/pricing.cgi">Pricing</a>
21 <a href="/about.cgi">About</a>
22 <a href="/contact.cgi">Contact</a>
23 </div>
24 <div class="spacer"></div>
25 <div class="actions">
26 <a href="/login.cgi" class="btn btn-ghost btn-sm">Sign in</a>
27 <a href="/signup.cgi" class="btn btn-primary btn-sm">Start free trial</a>
28 </div>
29</nav>
30$tvars.body
31<footer class="site-footer">
32 <div>&copy; $tvars.year $tvars.brand_name. The project OS for teams that ship. &middot; <a href="/privacy.cgi">Privacy</a> &middot; <a href="/terms.cgi">Terms</a> &middot; <a href="/contact.cgi">Contact</a></div>
33</footer>
34$tvars.extra_js
35<!-- Anonymous path tracker. Only included from the marketing wrapper, so
36 logged-in app pages (which use tf_wrapper.html) never call /t.cgi. -->
37<script>
38(function(){
39 try {
40 var u = new URLSearchParams(location.search);
41 var qs = '?p=' + encodeURIComponent(location.pathname + location.search)
42 + '&r=' + encodeURIComponent(document.referrer || '')
43 + '&us=' + encodeURIComponent(u.get('utm_source') || '')
44 + '&um=' + encodeURIComponent(u.get('utm_medium') || '')
45 + '&uc=' + encodeURIComponent(u.get('utm_campaign') || '');
46 var img = new Image();
47 img.referrerPolicy = 'no-referrer-when-downgrade';
48 img.src = '/t.cgi' + qs;
49 } catch (e) { /* silent */ }
50})();
51</script>
52<!-- Viewer-local timestamp renderer (portfolio-canonical).
53 Server emits `<span class="ts" data-ts="EPOCH" data-fmt="…">FALLBACK</span>`.
54 Formats: datetime | date | date-short | time | relative
55 Original text is the no-JS fallback. Re-run via window.tzLocalize() after AJAX. -->
56<script>
57(function(){
58 function fmt(el){
59 var e = parseInt(el.getAttribute('data-ts'), 10);
60 if (!e) return;
61 var d = new Date(e * 1000);
62 var kind = el.getAttribute('data-fmt') || 'datetime';
63 var out;
64 switch (kind) {
65 case 'date': out = d.toLocaleDateString(undefined, {year:'numeric',month:'short',day:'numeric'}); break;
66 case 'date-short': out = d.toLocaleDateString(undefined, {month:'short',day:'numeric'}); break;
67 case 'time': out = d.toLocaleTimeString(undefined, {hour:'2-digit',minute:'2-digit'}); break;
68 case 'relative': out = rel(e); break;
69 default: out = d.toLocaleDateString(undefined, {year:'numeric',month:'short',day:'numeric'})
70 + ' ' + d.toLocaleTimeString(undefined, {hour:'2-digit',minute:'2-digit'});
71 }
72 el.textContent = out;
73 if (!el.title) el.title = d.toString();
74 }
75 function rel(e){
76 var s = Math.floor(Date.now()/1000) - e, future = s < 0; s = Math.abs(s);
77 var n, u;
78 if (s < 60) { n = s; u = 'second'; }
79 else if (s < 3600) { n = Math.floor(s/60); u = 'minute'; }
80 else if (s < 86400) { n = Math.floor(s/3600); u = 'hour'; }
81 else if (s < 2592000){ n = Math.floor(s/86400); u = 'day'; }
82 else if (s < 31536000){n = Math.floor(s/2592000); u = 'month'; }
83 else { n = Math.floor(s/31536000);u = 'year'; }
84 var p = n === 1 ? '' : 's';
85 return future ? ('in ' + n + ' ' + u + p) : (n + ' ' + u + p + ' ago');
86 }
87 function localize(root){ (root||document).querySelectorAll('span.ts[data-ts], time[data-ts]').forEach(fmt); }
88 window.tzLocalize = localize;
89 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', function(){ localize(); });
90 else localize();
91 window.addEventListener('ts-refresh', function(){ localize(); });
92})();
93</script>
94
95</body>
96</html>