-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
110 lines (107 loc) · 4.59 KB
/
Copy pathindex.html
File metadata and controls
110 lines (107 loc) · 4.59 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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>OpenStudbook</title>
<link rel="manifest" href="/manifest.json" />
<meta name="theme-color" content="#059669" />
<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="OpenStudbook" />
<link rel="apple-touch-icon" href="/icon.svg" />
<script src="https://cdn.tailwindcss.com"></script>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY=" crossorigin=""/>
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js" integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo=" crossorigin=""></script>
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
<!-- Quill.js for WYSIWYG Editing -->
<link href="https://cdn.quilljs.com/1.3.6/quill.snow.css" rel="stylesheet">
<script src="https://cdn.quilljs.com/1.3.6/quill.js"></script>
<style>
body { font-family: 'Inter', sans-serif; margin: 0; padding: 0; background: #f8fafc; }
.ql-editor { min-height: 200px; font-family: 'Inter', sans-serif; font-size: 1rem; }
.ql-toolbar { background: white; border-top-left-radius: 0.5rem; border-top-right-radius: 0.5rem; }
.ql-container { background: white; border-bottom-left-radius: 0.5rem; border-bottom-right-radius: 0.5rem; }
input[type="date"]::-webkit-calendar-picker-indicator {
background-image: url('data:image/svg+xml;utf8,%3Csvg xmlns="http://www.w3.org/2000/svg" width="16" height="15" viewBox="0 0 24 24"%3E%3Cpath fill="%23475569" d="M20 3h-1V1h-2v2H7V1H5v2H4c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 18H4V8h16v13z"/%3E%3C/svg%3E');
background-position: center;
background-size: 18px 18px;
background-repeat: no-repeat;
cursor: pointer;
opacity: 0.6;
width: 24px;
height: 24px;
margin-right: 4px;
}
/* Boot Spinner */
#boot-loader {
position: fixed;
inset: 0;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
background: #f8fafc;
z-index: 9999;
}
.spinner {
width: 48px;
height: 48px;
border: 4px solid #e2e8f0;
border-top: 4px solid #059669;
border-radius: 50%;
animation: spin 1s linear infinite;
margin-bottom: 16px;
}
.loader-text {
font-weight: 700;
color: #1e293b;
font-size: 14px;
letter-spacing: 0.05em;
text-transform: uppercase;
font-family: 'Inter', sans-serif;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
</style>
<script type="importmap">
{
"imports": {
"react/": "https://esm.sh/react@^19.2.1/",
"react": "https://esm.sh/react@^19.2.1",
"react-dom/": "https://esm.sh/react-dom@^19.2.1/",
"@google/genai": "https://esm.sh/@google/genai@^1.33.0",
"lucide-react": "https://esm.sh/lucide-react@^0.560.0",
"@vitejs/plugin-react": "https://esm.sh/@vitejs/plugin-react@^5.1.2",
"vite": "https://esm.sh/vite@^7.2.7",
"recharts": "https://esm.sh/recharts@^3.5.1",
"react-router-dom": "https://esm.sh/react-router-dom@^7.10.1",
"express": "https://esm.sh/express@^5.2.1",
"cors": "https://esm.sh/cors@^2.8.5",
"jsonwebtoken": "https://esm.sh/jsonwebtoken@^9.0.3",
"morgan": "https://esm.sh/morgan@^1.10.1",
"dotenv": "https://esm.sh/dotenv@^17.2.3",
"bcryptjs": "https://esm.sh/bcryptjs@^3.0.3",
"nodemailer": "https://esm.sh/nodemailer@^7.0.12",
"path": "https://esm.sh/path@^0.12.7",
"process": "https://esm.sh/process@^0.11.10",
"@supabase/supabase-js": "https://esm.sh/@supabase/supabase-js@^2.89.0",
"mysql2/": "https://esm.sh/mysql2@^3.16.0/"
}
}
</script>
</head>
<body class="bg-slate-50 text-slate-900">
<div id="root">
<div id="boot-loader">
<div class="spinner"></div>
<div class="loader-text">Loading OpenStudbook...</div>
</div>
</div>
<script>if ('serviceWorker' in navigator) navigator.serviceWorker.register('/sw.js');</script>
<script type="module" src="index.tsx"></script>
</body>
</html>