Repository navigation
Expand file tree
/
Copy pathindex.html
More file actions
140 lines (121 loc) · 7.75 KB
/
Copy pathindex.html
File metadata and controls
140 lines (121 loc) · 7.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0, user-scalable=yes, viewport-fit=cover" />
<!-- Security Headers -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://www.gstatic.com https://www.googletagmanager.com https://static.zdassets.com https://ekr.zdassets.com https://*.zendesk.com https://v2.zopim.com https://static.cloudflareinsights.com https://*.hsforms.net https://*.hsforms.com https://*.hubspot.com https://*.hubspotusercontent-na2.net https://*.hsappstatic.net https://*.hs-scripts.com https://*.hs-banner.com https://*.hs-analytics.net https://*.hscollectedforms.net https://*.usemessages.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://static.zdassets.com; frame-src 'self' https: https://static.zdassets.com https://*.hubspot.com https://*.hsforms.net https://*.hsforms.com; font-src 'self' data: https://fonts.gstatic.com https://static.zdassets.com; base-uri 'self'; manifest-src 'self'; worker-src 'self' blob:; connect-src 'self' blob: https: wss: https://www.google-analytics.com https://analytics.google.com https://firebaseinstallations.googleapis.com https://ekr.zdassets.com wss://*.zopim.com wss://*.zendesk.com https://*.hsforms.com https://*.hubspot.com https://*.hubapi.com https://*.hs-banner.com https://*.hscollectedforms.net; img-src 'self' data: blob: https: https://www.google-analytics.com https://static.zdassets.com https://v2assets.zopim.io https://*.hsforms.com https://*.hubspot.com; media-src 'self' blob: https:;">
<meta http-equiv="X-Content-Type-Options" content="nosniff">
<meta http-equiv="X-XSS-Protection" content="1; mode=block">
<meta http-equiv="Referrer-Policy" content="strict-origin-when-cross-origin">
<!-- No static canonical here: this shell is served for every SPA route, so a
hardcoded homepage canonical would mark every page as a duplicate of /.
Routes set their own canonical client-side; marketing routes are prerendered
with self-referencing canonicals at build time. -->
<!-- PWA Meta Tags -->
<title>Divine Web - Short-form Looping Videos on Nostr</title>
<meta name="description" content="Watch and share 6-second looping videos on the decentralized Nostr network." />
<meta name="theme-color" content="#27C58B" />
<!-- X-Frame-Options must be set by server headers; remove meta to avoid console error -->
<meta name="mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="default" />
<meta name="apple-mobile-web-app-title" content="Divine" />
<meta name="application-name" content="Divine" />
<meta name="msapplication-TileColor" content="#27C58B" />
<!-- Open Graph / Facebook -->
<meta property="og:type" content="website" />
<meta property="og:url" content="https://divine.video/" />
<meta property="og:title" content="Divine Web - Short-form Looping Videos on Nostr" />
<meta property="og:description" content="Watch and share 6-second looping videos on the decentralized Nostr network." />
<meta property="og:image" content="https://divine.video/og.png" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:image:alt" content="Divine Web - Short-form looping videos on the Nostr network" />
<meta property="og:image:type" content="image/png" />
<!-- Twitter -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="Divine Web - Short-form Looping Videos on Nostr" />
<meta name="twitter:description" content="Watch and share 6-second looping videos on the decentralized Nostr network." />
<meta name="twitter:image" content="https://divine.video/og.png" />
<!-- Icons -->
<link rel="icon" type="image/png" sizes="72x72" href="/favicon.png" />
<link rel="apple-touch-icon" href="/app_icon.png" />
<!-- PWA Manifest -->
<link rel="manifest" href="/manifest.webmanifest">
<!-- Google Fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<!-- Inter Variable is loaded locally via @fontsource-variable/inter (see src/main.tsx).
Bricolage Grotesque stays on Google Fonts for now — there is no @fontsource-variable
build we trust yet. Variable axes (opsz 12..96, wght 400..800) are both requested
so font-optical-sizing: auto and heavier weights work across the display range. -->
<link href="https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..96,400;12..96,500;12..96,600;12..96,700;12..96,800&display=swap" rel="stylesheet">
<!-- Performance: preconnect to divine API and media CDN (critical path) -->
<link rel="dns-prefetch" href="//relay.divine.video" />
<link rel="preconnect" href="https://relay.divine.video" crossorigin />
<link rel="dns-prefetch" href="//media.divine.video" />
<link rel="preconnect" href="https://media.divine.video" crossorigin />
<!-- Performance: preconnect to common video CDN origins -->
<link rel="dns-prefetch" href="//nostr.build" />
<link rel="preconnect" href="https://nostr.build" crossorigin />
<link rel="dns-prefetch" href="//cdn.nostr.build" />
<link rel="preconnect" href="https://cdn.nostr.build" crossorigin />
<link rel="dns-prefetch" href="//api.openvine.co" />
<link rel="preconnect" href="https://api.openvine.co" crossorigin />
<link rel="dns-prefetch" href="//nostrcheck.me" />
<link rel="preconnect" href="https://nostrcheck.me" crossorigin />
<link rel="dns-prefetch" href="//nostrage.com" />
<link rel="preconnect" href="https://nostrage.com" crossorigin />
<link rel="dns-prefetch" href="//cdn.jb55.com" />
<link rel="preconnect" href="https://cdn.jb55.com" crossorigin />
<!-- Prevent FOUC with minimal inline CSS -->
<style>
/* Minimal loading styles to prevent FOUC */
#root, html, body {
min-height: 100vh;
background-color: #F9F7F6; /* Brand off-white */
color: #07241B; /* Brand dark green */
}
/* Dark mode support for FOUC prevention */
.dark #root, .dark html, .dark body {
background-color: #07241B; /* Brand dark green */
color: #F9F7F6; /* Brand off-white */
}
/* Loading spinner for initial load */
.initial-loading {
display: flex;
align-items: center;
justify-content: center;
min-height: 100vh;
font-family: system-ui, -apple-system, sans-serif;
}
.loading-spinner {
width: 32px;
height: 32px;
border: 3px solid #e2e8f0;
border-top: 3px solid #27C58B;
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
/* Hide loading once React takes over */
.app-loaded .initial-loading {
display: none;
}
</style>
</head>
<body>
<div id="root"></div>
<!-- Removes a one-time sign-in code from /app/callback's address before any
other script reads it. Must stay the first module script. -->
<script type="module" src="/src/lib/stripSignInCode.ts"></script>
<!-- HubSpot tracking code & GDPR cookie consent banner. The module keeps
the sim-suppression guard out of inline HTML so CSP lint stays clean. -->
<script type="module" src="/src/lib/hubSpotLoader.ts"></script>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>