Suriyong commited on
Commit
dcb16aa
·
verified ·
1 Parent(s): 6540399

Upload index.html

Browse files
Files changed (1) hide show
  1. index.html +22 -228
index.html CHANGED
@@ -8,234 +8,28 @@
8
  <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+Thai:wght@300;400;500;600;700&family=Noto+Serif+Thai:wght@500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
9
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
10
  <style>
11
- /* ═══════════════════════════════════════
12
- TLCC CareChurch OS v8.0 — Unified Design System
13
- Glassmorphism + Dark SaaS + Role-Based UI
14
- ═══════════════════════════════════════ */
15
- :root{
16
- /* Core */
17
- --bg:#0a0d10;--bg-elev:#11151a;--surface:rgba(24,28,35,0.8);
18
- --glass:rgba(24,28,35,0.6);--glass-border:rgba(255,255,255,0.06);
19
- /* Accent — Neon Green (TLCC) + Cyan (CareChurch) */
20
- --neon:#00FF88;--neon-dim:rgba(0,255,136,0.12);--neon-glow:rgba(0,255,136,0.3);
21
- --cyan:#00E0FF;--cyan-dim:rgba(0,224,255,0.12);--cyan-glow:rgba(0,224,255,0.2);
22
- --amber:#FFB340;--amber-dim:rgba(255,179,64,0.12);
23
- --pink:#FF7AAE;--pink-dim:rgba(255,122,174,0.12);
24
- --red:#FF5252;--red-dim:rgba(255,82,82,0.12);
25
- --purple:#B388FF;
26
- /* Text */
27
- --text:#F0F2F5;--text-sec:rgba(240,242,245,0.65);--muted:#7A8194;
28
- /* Depth */
29
- --border:rgba(255,255,255,0.06);--shadow-sm:0 2px 8px rgba(0,0,0,0.3);
30
- --shadow-md:0 8px 32px rgba(0,0,0,0.4);--shadow-glow:0 0 40px rgba(0,255,136,0.15);
31
- /* Typography */
32
- --fh:'Noto Serif Thai',Georgia,serif;--fb:'Noto Sans Thai',system-ui,sans-serif;
33
- --fm:'JetBrains Mono',monospace;
34
- /* Motion */
35
- --ease-out:cubic-bezier(0.16,1,0.3,1);--ease-spring:cubic-bezier(0.34,1.56,0.64,1);
36
- --dur-fast:0.2s;--dur-normal:0.35s;--dur-slow:0.6s;
37
- }
38
- *{margin:0;padding:0;box-sizing:border-box;-webkit-tap-highlight-color:transparent}
39
- html{font-size:16px;overflow:hidden}body{font-family:var(--fb);background:var(--bg);color:var(--text);overflow:hidden;height:100vh;display:flex;flex-direction:column;accent-color:var(--neon)}
40
- ::-webkit-scrollbar{width:3px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--muted);border-radius:4px}
41
-
42
- /* ── Animation Keyframes ── */
43
- @keyframes fadeSlideUp{from{opacity:0;transform:translateY(20px) scale(0.98)}to{opacity:1;transform:translateY(0) scale(1)}}
44
- @keyframes fadeScale{from{opacity:0;transform:scale(0.92)}to{opacity:1;transform:scale(1)}}
45
- @keyframes slideInRight{from{opacity:0;transform:translateX(30px)}to{opacity:1;transform:translateX(0)}}
46
- @keyframes slideInLeft{from{opacity:0;transform:translateX(-30px)}to{opacity:1;transform:translateX(0)}}
47
- @keyframes pulseGlow{0%,100%{box-shadow:0 0 0 0 rgba(0,255,136,0.3)}50%{box-shadow:0 0 20px 6px rgba(0,255,136,0)}}
48
- @keyframes float{0%,100%{transform:translateY(0)}50%{transform:translateY(-6px)}}
49
- @keyframes spinSlow{from{transform:rotate(0)}to{transform:rotate(360deg)}}
50
- @keyframes shimmer{0%{background-position:-200% 0}100%{background-position:200% 0}}
51
- @keyframes toastIn{from{transform:translateY(60px);opacity:0}to{transform:translateY(0);opacity:1}}
52
- @keyframes rippleAnim{to{transform:scale(3);opacity:0}}
53
- @keyframes barBounce{0%,100%{height:3px}50%{height:16px}}
54
- @keyframes livePulse{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.4;transform:scale(1.3)}}
55
-
56
- /* ── Prototype Chrome ── */
57
- .proto-bar{background:var(--glass);backdrop-filter:blur(20px) saturate(1.3);border-bottom:1px solid var(--glass-border);padding:.45rem 1rem;display:flex;align-items:center;gap:1rem;z-index:9999;flex-shrink:0}
58
- .proto-title{font-family:var(--fm);font-size:.65rem;color:var(--neon);letter-spacing:2px;text-transform:uppercase}
59
- .proto-screens{display:flex;gap:.3rem;flex-wrap:wrap}
60
- .proto-btn{background:var(--bg);border:1px solid var(--border);color:var(--muted);padding:.25rem .65rem;border-radius:20px;font-size:.62rem;cursor:pointer;font-family:var(--fb);transition:all var(--dur-fast) var(--ease-out);white-space:nowrap}
61
- .proto-btn:hover{color:var(--neon);border-color:var(--neon-dim)}
62
- .proto-btn.active{background:rgba(0,255,136,0.1);color:var(--neon);border-color:rgba(0,255,136,0.25);box-shadow:0 0 8px rgba(0,255,136,.1)}
63
- .proto-device{margin-left:auto;display:flex;align-items:center;gap:.3rem}
64
- .device-btn{background:none;border:1px solid var(--border);color:var(--muted);padding:.2rem .5rem;border-radius:6px;cursor:pointer;font-size:.65rem;transition:all var(--dur-fast)}
65
- .device-btn:hover,.device-btn.active{color:var(--neon);border-color:var(--neon)}
66
- .proto-badge{font-family:var(--fm);font-size:.55rem;color:var(--muted);padding:.1rem .4rem;background:var(--bg);border-radius:6px;border:1px solid var(--border)}
67
- .role-badge{font-size:.55rem;padding:.12rem .5rem;border-radius:12px;font-weight:600;margin-left:auto}
68
- .role-pastor{background:rgba(0,255,136,.15);color:var(--neon);border:1px solid rgba(0,255,136,.25)}
69
- .role-leader{background:rgba(0,224,255,.15);color:var(--cyan);border:1px solid rgba(0,224,255,.25)}
70
- .role-member{background:rgba(255,179,64,.15);color:var(--amber);border:1px solid rgba(255,179,64,.25)}
71
- .role-visitor{background:var(--surface);color:var(--muted);border:1px solid var(--border)}
72
-
73
- /* ── Viewport & Device ── */
74
- .viewport{flex:1;display:flex;align-items:center;justify-content:center;overflow:hidden;background:radial-gradient(ellipse at 30% 20%,rgba(0,255,136,.02) 0%,transparent 50%),radial-gradient(ellipse at 70% 80%,rgba(0,224,255,.015) 0%,transparent 50%),var(--bg);position:relative}
75
- .device{position:relative;transition:all var(--dur-slow) var(--ease-out);display:flex;flex-direction:column}
76
- .device.mobile{width:390px;height:844px;border-radius:48px;border:10px solid #07080a;box-shadow:0 0 0 1px rgba(42,46,55,.8),0 48px 96px rgba(0,0,0,.7),inset 0 0 0 1px rgba(26,29,35,.8),0 0 60px rgba(0,255,136,.05)}
77
- .device.tablet{width:768px;height:720px;border-radius:28px;border:8px solid #07080a;box-shadow:0 0 0 1px rgba(42,46,55,.8),0 48px 96px rgba(0,0,0,.7)}
78
- .device.desktop{width:1100px;height:720px;border-radius:16px;border:6px solid #07080a;box-shadow:0 0 0 1px rgba(42,46,55,.8),0 48px 96px rgba(0,0,0,.7)}
79
- .device.mobile::before{content:'';position:absolute;top:0;left:50%;transform:translateX(-50%);width:130px;height:32px;background:#07080a;border-radius:0 0 22px 22px;z-index:100}
80
- .screen{flex:1;background:var(--bg-elev);overflow-y:auto;overflow-x:hidden;position:relative;scrollbar-width:thin;scrollbar-color:var(--muted) transparent}
81
- .device.mobile .screen{border-radius:38px;padding-top:42px}
82
- .device.tablet .screen{border-radius:20px}
83
- .device.desktop .screen{border-radius:10px}
84
-
85
- /* ── Screens ── */
86
- .s{display:none;flex-direction:column;min-height:100%}
87
- .s.show{display:flex;animation:fadeSlideUp .45s var(--ease-out)}
88
- .s.show.splash-anim{animation:fadeScale .6s var(--ease-out)}
89
-
90
- /* ── Glass Cards ── */
91
- .glass{background:var(--glass);backdrop-filter:blur(16px) saturate(1.2);border:1px solid var(--glass-border);border-radius:18px;box-shadow:var(--shadow-sm);transition:all var(--dur-fast) var(--ease-out);position:relative;overflow:hidden}
92
- .glass:hover{transform:translateY(-2px);box-shadow:var(--shadow-md)}
93
- .glass::before{content:'';position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,rgba(255,255,255,.08),transparent)}
94
-
95
- /* ── Buttons ── */
96
- .btn{display:inline-flex;align-items:center;justify-content:center;gap:.4rem;padding:.75rem 1.5rem;border-radius:50px;font-family:var(--fb);font-weight:600;font-size:.85rem;cursor:pointer;transition:all var(--dur-fast) var(--ease-out);border:none;text-decoration:none;position:relative;overflow:hidden}
97
- .btn::after{content:'';position:absolute;inset:0;border-radius:50px;opacity:0;transition:opacity var(--dur-fast);background:radial-gradient(circle at var(--x,50%) var(--y,50%),rgba(255,255,255,.12) 0%,transparent 60%)}
98
- .btn:hover::after{opacity:1}
99
- .btn:active{transform:scale(0.96)}
100
- .btn-primary{background:linear-gradient(135deg,var(--neon) 0%,#00D470 100%);color:#08090C;box-shadow:0 4px 16px rgba(0,255,136,.25),inset 0 1px 0 rgba(255,255,255,.2)}
101
- .btn-primary:hover{box-shadow:0 6px 24px rgba(0,255,136,.35)}
102
- .btn-glass{background:var(--glass);backdrop-filter:blur(10px);color:var(--text);border:1px solid var(--glass-border);box-shadow:var(--shadow-sm)}
103
- .btn-glass:hover{border-color:rgba(0,255,136,.2);color:var(--neon)}
104
- .btn-icon{width:38px;height:38px;padding:0;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:.85rem}
105
-
106
- /* ── Ripple ── */
107
- .ripple{position:relative;overflow:hidden}
108
- .ripple-circle{position:absolute;border-radius:50%;background:rgba(255,255,255,.2);transform:scale(0);animation:rippleAnim .5s linear;pointer-events:none}
109
-
110
- /* ── Bottom Nav ── */
111
- .bot-nav{position:fixed;bottom:0;left:0;right:0;background:var(--glass);backdrop-filter:blur(20px) saturate(1.3);border-top:1px solid var(--glass-border);display:flex;z-index:500;padding-bottom:env(safe-area-inset-bottom,0);box-shadow:0 -6px 24px rgba(0,0,0,.25)}
112
- .device .bot-nav{position:sticky;bottom:0;margin-top:auto}
113
- .nav-item{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:.55rem .15rem;cursor:pointer;gap:.15rem;border:none;background:none;color:var(--muted);position:relative;transition:all var(--dur-fast)}
114
- .nav-item i{font-size:1.05rem;transition:all var(--dur-fast)}
115
- .nav-item span{font-size:.55rem;letter-spacing:.2px;font-weight:500}
116
- .nav-item.active{color:var(--neon)}
117
- .nav-item.active i{filter:drop-shadow(0 0 6px rgba(0,255,136,.4));transform:translateY(-2px)}
118
- .nav-item.active span{font-weight:600}
119
- .nav-item::after{content:'';position:absolute;bottom:0;width:0;height:2px;border-radius:2px;background:var(--neon);transition:width var(--dur-normal) var(--ease-spring);box-shadow:0 0 6px var(--neon-glow)}
120
- .nav-item.active::after{width:20px}
121
- .nav-badge{position:absolute;top:0;right:calc(50% - 12px);width:6px;height:6px;border-radius:50%;background:var(--red);border:2px solid var(--bg-elev);animation:pulseGlow 2s infinite}
122
-
123
- /* ── Section Title ── */
124
- .sec-title{padding:.5rem 1rem .3rem;font-size:.62rem;color:var(--muted);letter-spacing:2px;text-transform:uppercase;font-family:var(--fm);font-weight:500;animation:fadeSlideUp .3s var(--ease-out) both}
125
-
126
- /* ── Status Chips ── */
127
- .chip{display:inline-flex;align-items:center;gap:.3rem;padding:.18rem .55rem;border-radius:10px;font-size:.58rem;font-weight:600}
128
- .chip-visitor{background:var(--amber-dim);color:var(--amber);border:1px solid rgba(255,179,64,.15)}
129
- .chip-believer{background:rgba(0,255,136,.1);color:var(--neon);border:1px solid rgba(0,255,136,.15)}
130
- .chip-leader{background:var(--cyan-dim);color:var(--cyan);border:1px solid rgba(0,224,255,.15)}
131
- .chip-inactive{background:rgba(122,129,148,.1);color:var(--muted);border:1px solid rgba(122,129,148,.15)}
132
- .chip-urgent{background:var(--red-dim);color:var(--red);border:1px solid rgba(255,82,82,.15)}
133
-
134
- /* ── AI Suggestion Card ── */
135
- .ai-card{margin:0 1rem .75rem;border-radius:16px;padding:1rem;position:relative;overflow:hidden;background:linear-gradient(135deg,rgba(0,255,136,.05) 0%,rgba(0,224,255,.03) 100%);border:1px solid rgba(0,255,136,.1);animation:fadeSlideUp .45s var(--ease-out) both}
136
- .ai-card::before{content:'';position:absolute;top:0;left:0;width:2px;height:100%;background:var(--neon);border-radius:2px;box-shadow:0 0 10px var(--neon-glow)}
137
- .ai-icon{width:28px;height:28px;border-radius:8px;background:rgba(0,255,136,.08);display:flex;align-items:center;justify-content:center;color:var(--neon);font-size:.8rem;margin-right:.6rem;flex-shrink:0}
138
- .ai-title{font-size:.82rem;font-weight:600;margin-bottom:.15rem}
139
- .ai-text{font-size:.68rem;color:var(--text-sec);line-height:1.5}
140
- .ai-action{margin-top:.6rem;font-size:.65rem;color:var(--neon);font-weight:600;cursor:pointer;display:inline-flex;align-items:center;gap:.3rem}
141
- .ai-action:hover{text-decoration:underline}
142
-
143
- /* ── Member Card ── */
144
- .mem-card{display:flex;align-items:center;gap:.75rem;padding:.9rem 1rem;margin:0 1rem .5rem;border-radius:16px;background:var(--glass);backdrop-filter:blur(10px);border:1px solid var(--glass-border);cursor:pointer;transition:all var(--dur-fast);box-shadow:var(--shadow-sm);animation:fadeSlideUp .4s var(--ease-out) both}
145
- .mem-card:hover{transform:translateX(3px);border-color:rgba(255,255,255,.08);box-shadow:var(--shadow-md)}
146
- .mem-avatar{width:42px;height:42px;border-radius:50%;background:var(--bg);border:1px solid var(--border);display:flex;align-items:center;justify-content:center;color:var(--muted);font-size:.9rem;flex-shrink:0;position:relative}
147
- .mem-avatar .status-dot{position:absolute;bottom:1px;right:1px;width:10px;height:10px;border-radius:50%;border:2px solid var(--bg-elev)}
148
- .mem-avatar .status-dot.online{background:var(--neon)}
149
- .mem-avatar .status-dot.away{background:var(--amber)}
150
- .mem-avatar .status-dot.offline{background:var(--muted)}
151
- .mem-info{flex:1;min-width:0}
152
- .mem-name{font-size:.82rem;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
153
- .mem-meta{font-size:.6rem;color:var(--text-sec);margin-top:.1rem;display:flex;align-items:center;gap:.4rem}
154
- .mem-stage{font-size:.55rem;padding:.1rem .4rem;border-radius:6px;background:rgba(0,224,255,.1);color:var(--cyan);font-weight:500}
155
-
156
- /* ── Journey Timeline ── */
157
- .journey-line{position:relative;padding-left:1.5rem;margin:0 1rem}
158
- .journey-line::before{content:'';position:absolute;left:.45rem;top:0;bottom:0;width:2px;background:linear-gradient(to bottom,var(--neon),var(--cyan),transparent);border-radius:1px}
159
- .j-node{position:relative;margin-bottom:1rem;animation:slideInRight .4s var(--ease-out) both}
160
- .j-dot{position:absolute;left:-1.12rem;top:.3rem;width:10px;height:10px;border-radius:50%;background:var(--neon);border:2px solid var(--bg-elev);box-shadow:0 0 8px var(--neon-glow)}
161
- .j-dot.done{background:var(--neon)}
162
- .j-dot.current{background:var(--cyan);animation:pulseGlow 2s infinite}
163
- .j-dot.pending{background:var(--border)}
164
- .j-card{padding:.75rem 1rem;border-radius:14px;background:var(--glass);border:1px solid var(--glass-border);margin-left:.3rem}
165
- .j-title{font-size:.78rem;font-weight:600;margin-bottom:.1rem}
166
- .j-date{font-size:.58rem;color:var(--muted);font-family:var(--fm)}
167
-
168
- /* ── Attendance Tracker ── */
169
- .att-track{display:flex;align-items:center;gap:.5rem;padding:.75rem 1rem;margin:0 1rem .5rem;border-radius:16px;background:var(--glass);border:1px solid var(--glass-border)}
170
- .att-circle{width:44px;height:44px;border-radius:50%;background:var(--bg);border:2px solid var(--border);display:flex;align-items:center;justify-content:center;flex-direction:column;position:relative}
171
- .att-circle.present{border-color:var(--neon);background:rgba(0,255,136,.08)}
172
- .att-circle.absent{border-color:var(--red);background:var(--red-dim)}
173
- .att-circle.excused{border-color:var(--amber);background:var(--amber-dim)}
174
- .att-day{font-size:.55rem;color:var(--muted);font-family:var(--fm)}
175
- .att-check{font-size:1rem;color:var(--neon)}
176
- .att-info{flex:1}
177
- .att-name{font-size:.82rem;font-weight:600}
178
- .att-rate{font-size:.6rem;color:var(--text-sec)}
179
- .att-bar{height:4px;background:var(--bg);border-radius:2px;margin-top:.3rem;overflow:hidden;border:1px solid var(--border)}
180
- .att-fill{height:100%;background:linear-gradient(90deg,var(--neon),var(--cyan));border-radius:2px;transition:width .5s var(--ease-out)}
181
-
182
- /* ── Stats Grid ── */
183
- .stats-row{display:grid;grid-template-columns:1fr 1fr;gap:.6rem;padding:0 1rem .75rem}
184
- .stat-card{padding:.9rem;border-radius:16px;background:var(--glass);border:1px solid var(--glass-border);position:relative;overflow:hidden;animation:fadeSlideUp .4s var(--ease-out) both}
185
- .stat-card::before{content:'';position:absolute;top:0;left:0;width:2px;height:100%}
186
- .stat-card.s-neon::before{background:var(--neon);box-shadow:0 0 8px var(--neon-glow)}
187
- .stat-card.s-cyan::before{background:var(--cyan);box-shadow:0 0 8px var(--cyan-glow)}
188
- .stat-card.s-amber::before{background:var(--amber)}
189
- .stat-card.s-pink::before{background:var(--pink)}
190
- .stat-num{font-family:var(--fm);font-size:1.6rem;font-weight:700;line-height:1}
191
- .stat-card.s-neon .stat-num{color:var(--neon)}
192
- .stat-card.s-cyan .stat-num{color:var(--cyan)}
193
- .stat-card.s-amber .stat-num{color:var(--amber)}
194
- .stat-card.s-pink .stat-num{color:var(--pink)}
195
- .stat-label{font-size:.6rem;color:var(--muted);margin-top:.2rem;text-transform:uppercase;letter-spacing:.5px}
196
-
197
- /* ── Toast ── */
198
- .toast-container{position:fixed;bottom:80px;left:50%;transform:translateX(-50%);z-index:9999;display:flex;flex-direction:column;gap:.4rem;pointer-events:none}
199
- .toast{background:var(--glass);backdrop-filter:blur(16px);border:1px solid var(--glass-border);border-radius:14px;padding:.7rem 1rem;color:var(--text);font-size:.78rem;display:flex;align-items:center;gap:.5rem;box-shadow:var(--shadow-md);animation:toastIn .35s var(--ease-out);pointer-events:auto}
200
- .toast i{color:var(--neon);font-size:.85rem}
201
-
202
- /* ── Skeleton ── */
203
- .skeleton{background:linear-gradient(90deg,var(--bg-elev) 25%,rgba(255,255,255,.03) 50%,var(--bg-elev) 75%);background-size:200% 100%;animation:shimmer 1.6s infinite;border-radius:6px}
204
-
205
- /* ── Modal ── */
206
- .modal-overlay{position:absolute;inset:0;background:rgba(0,0,0,.55);backdrop-filter:blur(8px);z-index:900;display:none;align-items:flex-end;justify-content:center}
207
- .modal-overlay.open{display:flex;animation:fadeSlideUp .3s var(--ease-out)}
208
- .modal-sheet{background:var(--glass);backdrop-filter:blur(24px) saturate(1.3);border:1px solid var(--glass-border);border-radius:28px 28px 0 0;width:100%;max-width:500px;max-height:85vh;overflow-y:auto;padding:1.4rem;box-shadow:0 -12px 40px rgba(0,0,0,.4)}
209
- .modal-handle{width:40px;height:3px;background:var(--border);border-radius:2px;margin:0 auto 1.1rem}
210
-
211
- /* ── Form Fields ── */
212
- .fld-label{font-size:.62rem;color:var(--muted);margin-bottom:.3rem;display:block;padding-left:.25rem;font-weight:500;letter-spacing:.5px}
213
- .fld-input{width:100%;background:var(--bg);border:1px solid var(--border);border-radius:12px;padding:.75rem .9rem;color:var(--text);font-family:var(--fb);font-size:.82rem;transition:all var(--dur-fast);outline:none;margin-bottom:.6rem}
214
- .fld-input:focus{border-color:rgba(0,255,136,.2);box-shadow:0 0 0 3px var(--neon-dim),0 0 12px rgba(0,255,136,.08)}
215
- .fld-input::placeholder{color:var(--muted)}
216
-
217
- /* ── Login Overlay (Role Selector) ── */
218
- .login-overlay{position:absolute;inset:0;background:var(--bg-elev);z-index:800;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem;text-align:center}
219
- .login-overlay.hidden{display:none}
220
- .role-grid{display:grid;grid-template-columns:1fr 1fr;gap:.6rem;width:100%;max-width:280px;margin-top:1.2rem}
221
- .role-btn{padding:1rem;border-radius:16px;background:var(--glass);border:1px solid var(--glass-border);cursor:pointer;transition:all var(--dur-fast);display:flex;flex-direction:column;align-items:center;gap:.4rem}
222
- .role-btn:hover{border-color:rgba(0,255,136,.15);transform:translateY(-2px)}
223
- .role-btn.active{border-color:var(--neon);background:rgba(0,255,136,.08);box-shadow:0 0 16px rgba(0,255,136,.1)}
224
- .role-btn i{font-size:1.3rem;color:var(--muted);transition:color var(--dur-fast)}
225
- .role-btn.active i{color:var(--neon)}
226
- .role-btn span{font-size:.65rem;color:var(--text-sec);font-weight:500}
227
- .role-btn.active span{color:var(--text)}
228
-
229
- /* ── Page Transitions ── */
230
- .page-enter{animation:fadeSlideUp .4s var(--ease-out)}
231
- .page-enter-right{animation:slideInRight .4s var(--ease-out)}
232
- .page-enter-left{animation:slideInLeft .4s var(--ease-out)}
233
-
234
- /* ── Responsive font sizing for desktop ── */
235
- .device.desktop .screen{font-size:1.05rem}
236
- .device.desktop .nav-item span{font-size:.65rem}
237
- .device.desktop .sec-title{font-size:.68rem}
238
- .device.desktop .btn{font-size:.9rem;padding:.85rem 1.8rem}
239
  </style>
240
  </head>
241
  <body>
 
8
  <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+Thai:wght@300;400;500;600;700&family=Noto+Serif+Thai:wght@500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
9
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
10
  <style>
11
+ :root{--bg:#0a0d10;--bg-elev:#11151a;--surface:rgba(24,28,35,0.8);--glass:rgba(24,28,35,0.6);--glass-border:rgba(255,255,255,0.06);--neon:#00FF88;--neon-dim:rgba(0,255,136,0.12);--neon-glow:rgba(0,255,136,0.3);--cyan:#00E0FF;--cyan-dim:rgba(0,224,255,0.12);--amber:#FFB340;--amber-dim:rgba(255,179,64,0.12);--pink:#FF7AAE;--pink-dim:rgba(255,122,174,0.12);--red:#FF5252;--red-dim:rgba(255,82,82,0.12);--purple:#B388FF;--text:#F0F2F5;--text-sec:rgba(240,242,245,0.65);--muted:#7A8194;--border:rgba(255,255,255,0.06);--shadow-sm:0 2px 8px rgba(0,0,0,0.3);--shadow-md:0 8px 32px rgba(0,0,0,0.4);--shadow-glow:0 0 40px rgba(0,255,136,0.15);--fh:'Noto Serif Thai',Georgia,serif;--fb:'Noto Sans Thai',system-ui,sans-serif;--fm:'JetBrains Mono',monospace;--ease-out:cubic-bezier(0.16,1,0.3,1);--ease-spring:cubic-bezier(0.34,1.56,0.64,1);--dur-fast:0.2s;--dur-normal:0.35s;--dur-slow:0.6s}
12
+ *{margin:0;padding:0;box-sizing:border-box;-webkit-tap-highlight-color:transparent}html{font-size:16px;overflow:hidden}body{font-family:var(--fb);background:var(--bg);color:var(--text);overflow:hidden;height:100vh;display:flex;flex-direction:column;accent-color:var(--neon)}::-webkit-scrollbar{width:3px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--muted);border-radius:4px}
13
+ @keyframes f{from{opacity:0;transform:translateY(20px) scale(0.98)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes fs{from{opacity:0;transform:scale(0.92)}to{opacity:1;transform:scale(1)}}@keyframes sr{from{opacity:0;transform:translateX(30px)}to{opacity:1;transform:translateX(0)}}@keyframes sl{from{opacity:0;transform:translateX(-30px)}to{opacity:1;transform:translateX(0)}}@keyframes pg{0%,100%{box-shadow:0 0 0 0 rgba(0,255,136,0.3)}50%{box-shadow:0 0 20px 6px rgba(0,255,136,0)}}@keyframes fl{0%,100%{transform:translateY(0)}50%{transform:translateY(-6px)}}@keyframes sp{from{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes sh{0%{background-position:-200% 0}100%{background-position:200% 0}}@keyframes ti{from{transform:translateY(60px);opacity:0}to{transform:translateY(0);opacity:1}}@keyframes rp{to{transform:scale(3);opacity:0}}@keyframes bb{0%,100%{height:3px}50%{height:16px}}@keyframes lp{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.4;transform:scale(1.3)}}
14
+ .p{background:var(--glass);backdrop-filter:blur(20px) saturate(1.3);border-bottom:1px solid var(--glass-border);padding:.45rem 1rem;display:flex;align-items:center;gap:1rem;z-index:9999;flex-shrink:0}.pt{font-family:var(--fm);font-size:.65rem;color:var(--neon);letter-spacing:2px;text-transform:uppercase}.ps{display:flex;gap:.3rem;flex-wrap:wrap}.pb{background:var(--bg);border:1px solid var(--border);color:var(--muted);padding:.25rem .65rem;border-radius:20px;font-size:.62rem;cursor:pointer;font-family:var(--fb);transition:all var(--dur-fast) var(--ease-out);white-space:nowrap}.pb:hover{color:var(--neon);border-color:var(--neon-dim)}.pb.ac{background:rgba(0,255,136,0.1);color:var(--neon);border-color:rgba(0,255,136,0.25);box-shadow:0 0 8px rgba(0,255,136,.1)}.pd{margin-left:auto;display:flex;align-items:center;gap:.3rem}.db{background:none;border:1px solid var(--border);color:var(--muted);padding:.2rem .5rem;border-radius:6px;cursor:pointer;font-size:.65rem;transition:all var(--dur-fast)}.db:hover,.db.ac{color:var(--neon);border-color:var(--neon)}.bd{font-family:var(--fm);font-size:.55rem;color:var(--muted);padding:.1rem .4rem;background:var(--bg);border-radius:6px;border:1px solid var(--border)}.rb{font-size:.55rem;padding:.12rem .5rem;border-radius:12px;font-weight:600;margin-left:auto}.rpst{background:rgba(0,255,136,.15);color:var(--neon);border:1px solid rgba(0,255,136,.25)}.rldr{background:rgba(0,224,255,.15);color:var(--cyan);border:1px solid rgba(0,224,255,.25)}.rmb{background:rgba(255,179,64,.15);color:var(--amber);border:1px solid rgba(255,179,64,.25)}.rv{background:var(--surface);color:var(--muted);border:1px solid var(--border)}
15
+ .v{flex:1;display:flex;align-items:center;justify-content:center;overflow:hidden;background:radial-gradient(ellipse at 30% 20%,rgba(0,255,136,.02) 0%,transparent 50%),radial-gradient(ellipse at 70% 80%,rgba(0,224,255,.015) 0%,transparent 50%),var(--bg);position:relative}.d{position:relative;transition:all var(--dur-slow) var(--ease-out);display:flex;flex-direction:column}.d.m{width:390px;height:844px;border-radius:48px;border:10px solid #07080a;box-shadow:0 0 0 1px rgba(42,46,55,.8),0 48px 96px rgba(0,0,0,.7),inset 0 0 0 1px rgba(26,29,35,.8),0 0 60px rgba(0,255,136,.05)}.d.t{width:768px;height:720px;border-radius:28px;border:8px solid #07080a;box-shadow:0 0 0 1px rgba(42,46,55,.8),0 48px 96px rgba(0,0,0,.7)}.d.x{width:1100px;height:720px;border-radius:16px;border:6px solid #07080a;box-shadow:0 0 0 1px rgba(42,46,55,.8),0 48px 96px rgba(0,0,0,.7)}.d.m::before{content:'';position:absolute;top:0;left:50%;transform:translateX(-50%);width:130px;height:32px;background:#07080a;border-radius:0 0 22px 22px;z-index:100}.sc{flex:1;background:var(--bg-elev);overflow-y:auto;overflow-x:hidden;position:relative;scrollbar-width:thin;scrollbar-color:var(--muted) transparent}.d.m .sc{border-radius:38px;padding-top:42px}.d.t .sc{border-radius:20px}.d.x .sc{border-radius:10px}
16
+ .s{display:none;flex-direction:column;min-height:100%}.s.sh{display:flex;animation:f .45s var(--ease-out)}.s.sa{animation:fs .6s var(--ease-out)}
17
+ .g{background:var(--glass);backdrop-filter:blur(16px) saturate(1.2);border:1px solid var(--glass-border);border-radius:18px;box-shadow:var(--shadow-sm);transition:all var(--dur-fast) var(--ease-out);position:relative;overflow:hidden}.g:hover{transform:translateY(-2px);box-shadow:var(--shadow-md)}.g::before{content:'';position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,rgba(255,255,255,.08),transparent)}
18
+ .b{display:inline-flex;align-items:center;justify-content:center;gap:.4rem;padding:.75rem 1.5rem;border-radius:50px;font-family:var(--fb);font-weight:600;font-size:.85rem;cursor:pointer;transition:all var(--dur-fast) var(--ease-out);border:none;position:relative;overflow:hidden}.b::after{content:'';position:absolute;inset:0;border-radius:50px;opacity:0;transition:opacity var(--dur-fast);background:radial-gradient(circle at var(--x,50%) var(--y,50%),rgba(255,255,255,.12) 0%,transparent 60%)}.b:hover::after{opacity:1}.b:active{transform:scale(0.96)}.bp{background:linear-gradient(135deg,var(--neon) 0%,#00D470 100%);color:#08090C;box-shadow:0 4px 16px rgba(0,255,136,.25),inset 0 1px 0 rgba(255,255,255,.2)}.bp:hover{box-shadow:0 6px 24px rgba(0,255,136,.35)}.bg{background:var(--glass);backdrop-filter:blur(10px);color:var(--text);border:1px solid var(--glass-border);box-shadow:var(--shadow-sm)}.bg:hover{border-color:rgba(0,255,136,.2);color:var(--neon)}.bi{width:38px;height:38px;padding:0;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:.85rem}
19
+ .rp{position:relative;overflow:hidden}.rpc{position:absolute;border-radius:50%;background:rgba(255,255,255,.2);transform:scale(0);animation:rp .5s linear;pointer-events:none}
20
+ .bn{position:fixed;bottom:0;left:0;right:0;background:var(--glass);backdrop-filter:blur(20px) saturate(1.3);border-top:1px solid var(--glass-border);display:flex;z-index:500;padding-bottom:env(safe-area-inset-bottom,0);box-shadow:0 -6px 24px rgba(0,0,0,.25)}.d .bn{position:sticky;bottom:0;margin-top:auto}.ni{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:.55rem .15rem;cursor:pointer;gap:.15rem;border:none;background:none;color:var(--muted);position:relative;transition:all var(--dur-fast)}.ni i{font-size:1.05rem;transition:all var(--dur-fast)}.ni span{font-size:.55rem;letter-spacing:.2px;font-weight:500}.ni.ac{color:var(--neon)}.ni.ac i{filter:drop-shadow(0 0 6px rgba(0,255,136,.4));transform:translateY(-2px)}.ni.ac span{font-weight:600}.ni::after{content:'';position:absolute;bottom:0;width:0;height:2px;border-radius:2px;background:var(--neon);transition:width var(--dur-normal) var(--ease-spring);box-shadow:0 0 6px var(--neon-glow)}.ni.ac::after{width:20px}.nb{position:absolute;top:0;right:calc(50% - 12px);width:6px;height:6px;border-radius:50%;background:var(--red);border:2px solid var(--bg-elev);animation:pg 2s infinite}
21
+ .st{padding:.5rem 1rem .3rem;font-size:.62rem;color:var(--muted);letter-spacing:2px;text-transform:uppercase;font-family:var(--fm);font-weight:500;animation:f .3s var(--ease-out) both}
22
+ .ch{display:inline-flex;align-items:center;gap:.3rem;padding:.18rem .55rem;border-radius:10px;font-size:.58rem;font-weight:600}.cv{background:var(--amber-dim);color:var(--amber);border:1px solid rgba(255,179,64,.15)}.cb{background:rgba(0,255,136,.1);color:var(--neon);border:1px solid rgba(0,255,136,.15)}.cl{background:var(--cyan-dim);color:var(--cyan);border:1px solid rgba(0,224,255,.15)}.ci{background:rgba(122,129,148,.1);color:var(--muted);border:1px solid rgba(122,129,148,.15)}.cu{background:var(--red-dim);color:var(--red);border:1px solid rgba(255,82,82,.15)}
23
+ .ai{margin:0 1rem .75rem;border-radius:16px;padding:1rem;position:relative;overflow:hidden;background:linear-gradient(135deg,rgba(0,255,136,.05) 0%,rgba(0,224,255,.03) 100%);border:1px solid rgba(0,255,136,.1);animation:f .45s var(--ease-out) both}.ai::before{content:'';position:absolute;top:0;left:0;width:2px;height:100%;background:var(--neon);border-radius:2px;box-shadow:0 0 10px var(--neon-glow)}.aii{width:28px;height:28px;border-radius:8px;background:rgba(0,255,136,.08);display:flex;align-items:center;justify-content:center;color:var(--neon);font-size:.8rem;margin-right:.6rem;flex-shrink:0}.ait{font-size:.82rem;font-weight:600;margin-bottom:.15rem}.aix{font-size:.68rem;color:var(--text-sec);line-height:1.5}.aia{margin-top:.6rem;font-size:.65rem;color:var(--neon);font-weight:600;cursor:pointer;display:inline-flex;align-items:center;gap:.3rem}
24
+ .mc{display:flex;align-items:center;gap:.75rem;padding:.9rem 1rem;margin:0 1rem .5rem;border-radius:16px;background:var(--glass);backdrop-filter:blur(10px);border:1px solid var(--glass-border);cursor:pointer;transition:all var(--dur-fast);box-shadow:var(--shadow-sm);animation:f .4s var(--ease-out) both}.mc:hover{transform:translateX(3px);border-color:rgba(255,255,255,.08);box-shadow:var(--shadow-md)}.ma{width:42px;height:42px;border-radius:50%;background:var(--bg);border:1px solid var(--border);display:flex;align-items:center;justify-content:center;color:var(--muted);font-size:.9rem;flex-shrink:0;position:relative}.ma .sd{position:absolute;bottom:1px;right:1px;width:10px;height:10px;border-radius:50%;border:2px solid var(--bg-elev)}.ma .sd.on{background:var(--neon)}.ma .sd.aw{background:var(--amber)}.ma .sd.of{background:var(--muted)}.mn{font-size:.82rem;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mm{font-size:.6rem;color:var(--text-sec);margin-top:.1rem;display:flex;align-items:center;gap:.4rem}.ms{font-size:.55rem;padding:.1rem .4rem;border-radius:6px;background:rgba(0,224,255,.1);color:var(--cyan);font-weight:500}
25
+ .jl{position:relative;padding-left:1.5rem;margin:0 1rem}.jl::before{content:'';position:absolute;left:.45rem;top:0;bottom:0;width:2px;background:linear-gradient(to bottom,var(--neon),var(--cyan),transparent);border-radius:1px}.jn{position:relative;margin-bottom:1rem;animation:sr .4s var(--ease-out) both}.jd{position:absolute;left:-1.12rem;top:.3rem;width:10px;height:10px;border-radius:50%;background:var(--neon);border:2px solid var(--bg-elev);box-shadow:0 0 8px var(--neon-glow)}.jd.dn{background:var(--neon)}.jd.cr{background:var(--cyan);animation:pg 2s infinite}.jd.pd{background:var(--border)}.jc{padding:.75rem 1rem;border-radius:14px;background:var(--glass);border:1px solid var(--glass-border);margin-left:.3rem}.jt{font-size:.78rem;font-weight:600;margin-bottom:.1rem}.jdt{font-size:.58rem;color:var(--muted);font-family:var(--fm)}
26
+ .at{display:flex;align-items:center;gap:.5rem;padding:.75rem 1rem;margin:0 1rem .5rem;border-radius:16px;background:var(--glass);border:1px solid var(--glass-border)}.ac{width:44px;height:44px;border-radius:50%;background:var(--bg);border:2px solid var(--border);display:flex;align-items:center;justify-content:center;flex-direction:column;position:relative}.ac.pr{border-color:var(--neon);background:rgba(0,255,136,.08)}.ac.ab{border-color:var(--red);background:var(--red-dim)}.ac.ex{border-color:var(--amber);background:var(--amber-dim)}.ad{font-size:.55rem;color:var(--muted);font-family:var(--fm)}.ai2{flex:1}.an{font-size:.82rem;font-weight:600}.ar{font-size:.6rem;color:var(--text-sec)}.ab2{height:4px;background:var(--bg);border-radius:2px;margin-top:.3rem;overflow:hidden;border:1px solid var(--border)}.af{height:100%;background:linear-gradient(90deg,var(--neon),var(--cyan));border-radius:2px;transition:width .5s var(--ease-out)}
27
+ .sg{display:grid;grid-template-columns:1fr 1fr;gap:.6rem;padding:0 1rem .75rem}.sc2{padding:.9rem;border-radius:16px;background:var(--glass);border:1px solid var(--glass-border);position:relative;overflow:hidden;animation:f .4s var(--ease-out) both}.sc2::before{content:'';position:absolute;top:0;left:0;width:2px;height:100%}.sc2.sn::before{background:var(--neon);box-shadow:0 0 8px var(--neon-glow)}.sc2.sc::before{background:var(--cyan);box-shadow:0 0 8px var(--cyan-glow)}.sc2.sa::before{background:var(--amber)}.sc2.sp::before{background:var(--pink)}.sn2{font-family:var(--fm);font-size:1.6rem;font-weight:700;line-height:1}.sc2.sn .sn2{color:var(--neon)}.sc2.sc .sn2{color:var(--cyan)}.sc2.sa .sn2{color:var(--amber)}.sc2.sp .sn2{color:var(--pink)}.sl{font-size:.6rem;color:var(--muted);margin-top:.2rem;text-transform:uppercase;letter-spacing:.5px}
28
+ .tc{position:fixed;bottom:80px;left:50%;transform:translateX(-50%);z-index:9999;display:flex;flex-direction:column;gap:.4rem;pointer-events:none}.t{background:var(--glass);backdrop-filter:blur(16px);border:1px solid var(--glass-border);border-radius:14px;padding:.7rem 1rem;color:var(--text);font-size:.78rem;display:flex;align-items:center;gap:.5rem;box-shadow:var(--shadow-md);animation:ti .35s var(--ease-out);pointer-events:auto}.t i{color:var(--neon);font-size:.85rem}.sk{background:linear-gradient(90deg,var(--bg-elev) 25%,rgba(255,255,255,.03) 50%,var(--bg-elev) 75%);background-size:200% 100%;animation:sh 1.6s infinite;border-radius:6px}
29
+ .mo{position:absolute;inset:0;background:rgba(0,0,0,.55);backdrop-filter:blur(8px);z-index:900;display:none;align-items:flex-end;justify-content:center}.mo.op{display:flex;animation:f .3s var(--ease-out)}.ms2{background:var(--glass);backdrop-filter:blur(24px) saturate(1.3);border:1px solid var(--glass-border);border-radius:28px 28px 0 0;width:100%;max-width:500px;max-height:85vh;overflow-y:auto;padding:1.4rem;box-shadow:0 -12px 40px rgba(0,0,0,.4)}.mh{width:40px;height:3px;background:var(--border);border-radius:2px;margin:0 auto 1.1rem}
30
+ .fl{font-size:.62rem;color:var(--muted);margin-bottom:.3rem;display:block;padding-left:.25rem;font-weight:500;letter-spacing:.5px}.fi{width:100%;background:var(--bg);border:1px solid var(--border);border-radius:12px;padding:.75rem .9rem;color:var(--text);font-family:var(--fb);font-size:.82rem;transition:all var(--dur-fast);outline:none;margin-bottom:.6rem}.fi:focus{border-color:rgba(0,255,136,.2);box-shadow:0 0 0 3px var(--neon-dim),0 0 12px rgba(0,255,136,.08)}.fi::placeholder{color:var(--muted)}
31
+ .lo{position:absolute;inset:0;background:var(--bg-elev);z-index:800;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem;text-align:center}.lo.hd{display:none}.rg{display:grid;grid-template-columns:1fr 1fr;gap:.6rem;width:100%;max-width:280px;margin-top:1.2rem}.rbtn{padding:1rem;border-radius:16px;background:var(--glass);border:1px solid var(--glass-border);cursor:pointer;transition:all var(--dur-fast);display:flex;flex-direction:column;align-items:center;gap:.4rem}.rbtn:hover{border-color:rgba(0,255,136,.15);transform:translateY(-2px)}.rbtn.ac{border-color:var(--neon);background:rgba(0,255,136,.08);box-shadow:0 0 16px rgba(0,255,136,.1)}.rbtn i{font-size:1.3rem;color:var(--muted);transition:color var(--dur-fast)}.rbtn.ac i{color:var(--neon)}.rbtn span{font-size:.65rem;color:var(--text-sec);font-weight:500}.rbtn.ac span{color:var(--text)}
32
+ .d.x .sc{font-size:1.05rem}.d.x .ni span{font-size:.65rem}.d.x .st{font-size:.68rem}.d.x .b{font-size:.9rem;padding:.85rem 1.8rem}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
  </style>
34
  </head>
35
  <body>