Diff -- /var/www/vhosts/3dshawn.com/ptmatrix.3dshawn.com/TEMPLATES/tf_marketing.html
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
to c5798ae40c9d
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 · $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>© $tvars.year $tvars.brand_name. The project OS for teams that ship. · <a href="/privacy.cgi">Privacy</a> · <a href="/terms.cgi">Terms</a> · <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> |