33< head >
44< meta charset ="UTF-8 ">
55< meta name ="viewport " content ="width=device-width, initial-scale=1.0 ">
6- < title > Claurst Session Viewer</ title >
6+ < title > CLAURST · Session</ title >
7+ < link rel ="icon " type ="image/png " href ="/public/Rustle.png ">
8+ < link rel ="preconnect " href ="https://fonts.googleapis.com ">
9+ < link rel ="preconnect " href ="https://fonts.gstatic.com " crossorigin >
10+ < link href ="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@300;400;500;700&display=swap " rel ="stylesheet ">
711< style >
8- : root { color-scheme : dark; }
9- html , body { margin : 0 ; padding : 0 ; height : 100% ; }
12+ : root {
13+ --bg : # 030303 ;
14+ --surface : # 0a0a0a ;
15+ --surface-border : rgba (255 , 255 , 255 , 0.12 );
16+ --crosshair : rgba (255 , 255 , 255 , 0.4 );
17+ --text-primary : # ffffff ;
18+ --text-secondary : # a3a3a3 ;
19+ --text-muted : # 525252 ;
20+ --accent : # e91e63 ;
21+ --accent-shy : rgba (233 , 30 , 99 , 0.2 );
22+ --font-mono : 'JetBrains Mono' , monospace;
23+ color-scheme : dark;
24+ }
25+ * { box-sizing : border-box; margin : 0 ; padding : 0 ; -webkit-font-smoothing : antialiased; -moz-osx-font-smoothing : grayscale; }
26+ html { font-size : 90% ; }
1027 body {
11- background : # 1a1a1f ;
12- color : # e6e6ea ;
13- font-family : -apple-system, BlinkMacSystemFont, "Segoe UI" , system-ui, sans-serif;
28+ background-color : var (--bg );
29+ color : var (--text-primary );
30+ font-family : var (--font-mono );
31+ line-height : 1.6 ;
32+ min-height : 100vh ;
33+ }
34+ ::selection { background-color : var (--accent-shy ); color : var (--text-primary ); }
35+ ::-webkit-scrollbar { width : 3px ; }
36+ ::-webkit-scrollbar-track { background : transparent; }
37+ ::-webkit-scrollbar-thumb { background : var (--accent ); border-radius : 99px ; }
38+ ::-webkit-scrollbar-thumb : hover { background : # ff2a76 ; }
39+ * { scrollbar-width : thin; scrollbar-color : var (--accent ) transparent; }
40+ .bg-grid {
41+ position : fixed; inset : 0 ; z-index : -2 ; pointer-events : none;
42+ background-image :
43+ linear-gradient (to right, rgba (255 , 255 , 255 , 0.02 ) 1px , transparent 1px ),
44+ linear-gradient (to bottom, rgba (255 , 255 , 255 , 0.02 ) 1px , transparent 1px );
45+ background-size : 40px 40px ;
1446 }
15- # status {
47+ .bg-glow {
48+ position : fixed; top : 0vw ; left : 20vw ; width : 60vw ; height : 60vh ;
49+ background : radial-gradient (ellipse at center, var (--accent-shy ) 0% , transparent 70% );
50+ opacity : 0.15 ; z-index : -1 ; pointer-events : none; filter : blur (100px );
51+ }
52+ .shell-wrapper {
53+ min-height : 100vh ;
1654 display : flex;
1755 align-items : center;
1856 justify-content : center;
19- height : 100% ;
20- padding : 24px ;
57+ padding : 1rem ;
58+ }
59+ .shell {
60+ max-width : 720px ;
61+ width : 100% ;
62+ border-left : 1px solid var (--surface-border );
63+ border-right : 1px solid var (--surface-border );
64+ position : relative;
65+ }
66+ .grid-section {
67+ border-bottom : 1px solid var (--surface-border );
68+ position : relative;
69+ }
70+ .grid-section .top-border { border-top : 1px solid var (--surface-border ); }
71+ .grid-section ::after , .grid-section ::before ,
72+ .grid-section .top-border .cross-top-left , .grid-section .top-border .cross-top-right {
73+ content : '' ;
74+ position : absolute;
75+ width : 9px ;
76+ height : 9px ;
77+ background :
78+ linear-gradient (var (--crosshair ), var (--crosshair )) center/1px 100% no-repeat,
79+ linear-gradient (var (--crosshair ), var (--crosshair )) center/100% 1px no-repeat;
80+ z-index : 10 ;
81+ }
82+ .grid-section ::before { bottom : -5px ; left : -5px ; }
83+ .grid-section ::after { bottom : -5px ; right : -5px ; }
84+ .cross-top-left { top : -5px ; left : -5px ; }
85+ .cross-top-right { top : -5px ; right : -5px ; }
86+ nav {
87+ display : flex;
88+ justify-content : space-between;
89+ align-items : center;
90+ padding : 1.5rem 2rem ;
91+ }
92+ .nav-left { display : flex; align-items : center; gap : 0.8rem ; }
93+ .nav-logo { width : 28px ; height : 28px ; }
94+ .nav-brand { font-size : 1.1rem ; font-weight : 700 ; letter-spacing : 0.05em ; }
95+ .nav-tag {
96+ font-size : 0.75rem ;
97+ color : var (--text-muted );
98+ text-transform : uppercase;
99+ letter-spacing : 0.1em ;
100+ }
101+ .status-body {
102+ padding : 3rem 2rem ;
21103 text-align : center;
22- box-sizing : border-box;
23- }
24- # status .inner { max-width : 520px ; }
25- # status h1 { font-size : 18px ; margin : 0 0 8px 0 ; font-weight : 600 ; }
26- # status p { color : # 8a8a96 ; margin : 6px 0 ; line-height : 1.5 ; }
27- # status a , # status code { color : # 6b9bff ; }
28- # status code {
29- background : # 23232b ;
104+ }
105+ .status-title {
106+ font-size : 1rem ;
107+ font-weight : 500 ;
108+ color : var (--text-primary );
109+ margin-bottom : 0.75rem ;
110+ letter-spacing : 0.02em ;
111+ }
112+ .status-detail {
113+ font-size : 0.85rem ;
114+ color : var (--text-secondary );
115+ line-height : 1.6 ;
116+ max-width : 480px ;
117+ margin : 0 auto;
118+ }
119+ .status-detail code {
120+ background : rgba (0 , 0 , 0 , 0.4 );
121+ border : 1px solid var (--surface-border );
30122 padding : 1px 6px ;
31123 border-radius : 3px ;
32- font-family : ui-monospace, "SF Mono" , Menlo, monospace;
33- font-size : 13px ;
124+ color : var (--accent );
125+ font-size : 0.8rem ;
126+ }
127+ .status-detail a { color : var (--accent ); text-decoration : none; }
128+ .status-detail a : hover { color : # ff2a76 ; }
129+ .status-spinner {
130+ width : 14px ;
131+ height : 14px ;
132+ border : 1.5px solid var (--surface-border );
133+ border-top-color : var (--accent );
134+ border-radius : 50% ;
135+ display : inline-block;
136+ vertical-align : -2px ;
137+ margin-right : 8px ;
138+ animation : spin 0.9s linear infinite;
139+ }
140+ @keyframes spin { to { transform : rotate (360deg ); } }
141+ .footer-row {
142+ display : grid;
143+ grid-template-columns : repeat (3 , 1fr );
144+ color : var (--text-muted );
145+ font-size : 0.75rem ;
34146 }
147+ .footer-item {
148+ padding : 1rem 0.6rem ;
149+ text-align : center;
150+ border-right : 1px solid var (--surface-border );
151+ color : var (--text-muted );
152+ text-decoration : none;
153+ transition : background 0.2s , color 0.2s ;
154+ }
155+ .footer-item : last-child { border-right : none; }
156+ a .footer-item : hover { color : # fff ; background : # ff2a76 ; }
35157 iframe # viewer {
36158 display : none;
37159 border : 0 ;
38- width : 100 % ;
160+ width : 100 vw ;
39161 height : 100vh ;
162+ position : fixed;
163+ inset : 0 ;
164+ background : var (--bg );
165+ }
166+ body .viewer-ready .shell-wrapper { display : none; }
167+ body .viewer-ready iframe # viewer { display : block; }
168+ @media (max-width : 640px ) {
169+ nav { padding : 1rem ; }
170+ .status-body { padding : 2rem 1rem ; }
40171 }
41172</ style >
42173</ head >
43174< body >
44- < div id ="status " role ="status " aria-live ="polite ">
45- < div class ="inner ">
46- < h1 id ="status-title "> Loading session…</ h1 >
47- < p id ="status-detail "> Fetching gist contents from GitHub.</ p >
175+ < div class ="bg-grid "> </ div >
176+ < div class ="bg-glow "> </ div >
177+
178+ < div class ="shell-wrapper ">
179+ < div class ="shell ">
180+ < header class ="grid-section top-border ">
181+ < div class ="cross-top-left "> </ div >
182+ < div class ="cross-top-right "> </ div >
183+ < nav >
184+ < div class ="nav-left ">
185+ < img src ="/public/Rustle.png " alt ="Rustle " class ="nav-logo " onerror ="this.style.display='none' ">
186+ < div class ="nav-brand "> CLAURST</ div >
187+ </ div >
188+ < div class ="nav-tag "> Session</ div >
189+ </ nav >
190+ </ header >
191+
192+ < main class ="grid-section " role ="status " aria-live ="polite ">
193+ < div class ="status-body ">
194+ < div class ="status-title " id ="status-title "> < span class ="status-spinner "> </ span > Loading session</ div >
195+ < div class ="status-detail " id ="status-detail "> Fetching gist contents from GitHub…</ div >
196+ </ div >
197+ </ main >
198+
199+ < footer class ="grid-section footer-row ">
200+ < a class ="footer-item " href ="/ "> Home</ a >
201+ < div class ="footer-item "> © 2026 Claurst</ div >
202+ < a class ="footer-item " href ="https://github.com/Kuberwastaken/claurst " target ="_blank " rel ="noopener "> GitHub</ a >
203+ </ footer >
48204 </ div >
49205</ div >
206+
50207< iframe id ="viewer " title ="Claurst session " sandbox ="allow-scripts allow-popups allow-same-origin "> </ iframe >
208+
51209< script >
52210( async function ( ) {
53- var status = document . getElementById ( 'status' ) ;
54211 var titleEl = document . getElementById ( 'status-title' ) ;
55212 var detailEl = document . getElementById ( 'status-detail' ) ;
56213 var viewer = document . getElementById ( 'viewer' ) ;
@@ -84,7 +241,7 @@ <h1 id="status-title">Loading session…</h1>
84241 if ( res . status === 403 ) {
85242 fail (
86243 'Rate-limited by GitHub' ,
87- 'Wait a minute and refresh — anonymous GitHub API calls are rate-limited.'
244+ 'Anonymous GitHub API calls are rate-limited — wait a minute and refresh .'
88245 ) ;
89246 return ;
90247 }
@@ -110,8 +267,7 @@ <h1 id="status-title">Loading session…</h1>
110267 if ( r2 . ok ) content = await r2 . text ( ) ;
111268 }
112269 viewer . srcdoc = content ;
113- viewer . style . display = 'block' ;
114- status . style . display = 'none' ;
270+ document . body . classList . add ( 'viewer-ready' ) ;
115271 } catch ( e ) {
116272 fail ( 'Network error' , String ( e && e . message ? e . message : e ) ) ;
117273 }
0 commit comments