algorembrant commited on
Commit
d579b78
·
verified ·
1 Parent(s): 4c01ca3

Upload 2 files

Browse files
Files changed (2) hide show
  1. TicketUI_general.txt +1254 -0
  2. TicketUI_small.txt +0 -0
TicketUI_general.txt ADDED
@@ -0,0 +1,1254 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { useState, useEffect, useRef } from "react";
2
+
3
+ /* ============================================================
4
+ TICKETPUNCH UI — Complete Cyberpunk Design System
5
+ Font: IBM Plex Mono | Palette: Dark / White / Gold / Red / Peach
6
+ ============================================================ */
7
+
8
+ const FontInjector = () => (
9
+ <style>{`
10
+ @import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap');
11
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
12
+ :root {
13
+ /* ── DARK ── */
14
+ --d-900: #060606;
15
+ --d-800: #0A0A0A;
16
+ --d-700: #0f0f0f;
17
+ --d-600: #1e1e1e;
18
+ --d-500: #2a2a2a;
19
+
20
+ /* ── WHITE ── */
21
+ --w-100: #FFFFFF;
22
+ --w-200: #EFEFEF;
23
+ --w-300: #CDCDCD;
24
+ --w-400: #AAAAAA;
25
+ --w-500: #888888;
26
+
27
+ /* ── GOLD ── */
28
+ --g-100: #FFF4CC;
29
+ --g-300: #FFD700;
30
+ --g-500: #C8960C;
31
+ --g-700: #7A5800;
32
+ --g-900: #3D2C00;
33
+
34
+ /* ── RED ── */
35
+ --r-100: #FFE5E5;
36
+ --r-300: #FF6666;
37
+ --r-500: #FF3333;
38
+ --r-700: #CC0000;
39
+ --r-900: #550000;
40
+
41
+ /* ── PEACH ── */
42
+ --p-100: #FFF0EB;
43
+ --p-300: #FFBFA8;
44
+ --p-500: #FF8C69;
45
+ --p-700: #C45A35;
46
+ --p-900: #5C2010;
47
+
48
+ /* ── SEMANTIC ALIASES ── */
49
+ --bg: var(--d-900);
50
+ --surface: var(--d-800);
51
+ --header: var(--d-700);
52
+ --border-1: var(--d-600);
53
+ --border-2: var(--d-500);
54
+ --text-primary: var(--w-100);
55
+ --text-6: #383838;
56
+
57
+ --font: 'IBM Plex Mono', monospace;
58
+ --tooth: 9px;
59
+ }
60
+ body { background: var(--bg); color: var(--text-primary); font-family: var(--font); }
61
+ ::-webkit-scrollbar { width: 4px; }
62
+ ::-webkit-scrollbar-track { background: var(--bg); }
63
+ ::-webkit-scrollbar-thumb { background: var(--border-2); }
64
+
65
+ @keyframes pulse-dot { 0%,100%{opacity:1} 50%{opacity:0.2} }
66
+ @keyframes scroll-up { 0%{transform:translateY(0)} 100%{transform:translateY(-50%)} }
67
+ @keyframes spin-slow { from{transform:rotate(0deg)} to{transform:rotate(360deg)} }
68
+ @keyframes progress-fill { from{width:0} to{width:var(--fill)} }
69
+ @keyframes toast-in { from{transform:translateX(120%);opacity:0} to{transform:translateX(0);opacity:1} }
70
+
71
+ .pulse-anim { animation: pulse-dot 1400ms ease-in-out infinite; }
72
+ .scroll-anim { animation: scroll-up 12s linear infinite; }
73
+ .spin-slow { animation: spin-slow 8s linear infinite; }
74
+ .toast-anim { animation: toast-in 0.3s ease forwards; }
75
+
76
+ .punched-frame { position: relative; }
77
+ .punched-frame::before,
78
+ .punched-frame::after {
79
+ content: '';
80
+ position: absolute;
81
+ left: 0; right: 0;
82
+ height: var(--tooth);
83
+ z-index: 20;
84
+ pointer-events: none;
85
+ background: repeating-linear-gradient(
86
+ 90deg,
87
+ transparent 0px, transparent 8px,
88
+ var(--bg) 8px, var(--bg) 18px
89
+ );
90
+ }
91
+ .punched-frame::before { top: 0; }
92
+ .punched-frame::after { bottom: 0; }
93
+ `}</style>
94
+ );
95
+
96
+ const GrainOverlay = ({ strength = 0.18 }) => {
97
+ const canvasRef = useRef(null);
98
+ useEffect(() => {
99
+ const canvas = canvasRef.current;
100
+ if (!canvas) return;
101
+ const ctx = canvas.getContext("2d");
102
+ const W = 256, H = 256;
103
+ canvas.width = W; canvas.height = H;
104
+ const imageData = ctx.createImageData(W, H);
105
+ const data = imageData.data;
106
+ for (let i = 0; i < data.length; i += 4) {
107
+ const v = (Math.random() * 255) | 0;
108
+ data[i] = data[i+1] = data[i+2] = v;
109
+ data[i+3] = (strength * 255) | 0;
110
+ }
111
+ ctx.putImageData(imageData, 0, 0);
112
+ }, [strength]);
113
+ return (
114
+ <canvas ref={canvasRef} style={{
115
+ position:"absolute", inset:0, width:"100%", height:"100%",
116
+ pointerEvents:"none", mixBlendMode:"overlay", opacity:0.9, zIndex:5
117
+ }}/>
118
+ );
119
+ };
120
+
121
+ const GeometricOverlay = () => (
122
+ <svg style={{ position:"absolute", inset:0, width:"100%", height:"100%", pointerEvents:"none", zIndex:4, opacity:0.07 }} preserveAspectRatio="xMidYMid slice">
123
+ <defs>
124
+ <pattern id="lattice" width="32" height="32" patternUnits="userSpaceOnUse">
125
+ <path d="M 32 0 L 0 0 0 32" fill="none" stroke="white" strokeWidth="0.5"/>
126
+ <circle cx="0" cy="0" r="1" fill="white" opacity="0.5"/>
127
+ </pattern>
128
+ </defs>
129
+ <rect width="100%" height="100%" fill="url(#lattice)"/>
130
+ <circle cx="50%" cy="50%" r="80" fill="none" stroke="white" strokeWidth="0.5"/>
131
+ <circle cx="50%" cy="50%" r="140" fill="none" stroke="white" strokeWidth="0.3"/>
132
+ <line x1="50%" y1="0" x2="50%" y2="100%" stroke="white" strokeWidth="0.3"/>
133
+ <line x1="0" y1="50%" x2="100%" y2="50%" stroke="white" strokeWidth="0.3"/>
134
+ <polygon points="50%,10% 90%,90% 10%,90%" fill="none" stroke="white" strokeWidth="0.4" opacity="0.5"/>
135
+ </svg>
136
+ );
137
+
138
+ const PunchHoles = () => (
139
+ <>
140
+ {[{top:"3px",left:"4px"},{top:"3px",right:"4px"},{bottom:"3px",left:"4px"},{bottom:"3px",right:"4px"}].map((pos,i) => (
141
+ <div key={i} style={{
142
+ position:"absolute", ...pos, width:9, height:9, borderRadius:"50%",
143
+ background:"radial-gradient(circle, var(--bg) 4px, transparent 4px)",
144
+ border:"1px solid var(--d-500)", zIndex:25, pointerEvents:"none",
145
+ }}/>
146
+ ))}
147
+ </>
148
+ );
149
+
150
+ const Punched = ({ children, style={}, className="" }) => (
151
+ <div className={`punched-frame ${className}`} style={{ position:"relative", ...style }}>
152
+ <PunchHoles/>
153
+ {children}
154
+ </div>
155
+ );
156
+
157
+ const TicketShell = ({ children, stubHeight=60, style={} }) => (
158
+ <Punched style={style}>
159
+ <div style={{ background:"var(--surface)", border:"1px solid var(--border-1)",
160
+ boxShadow:"0 40px 100px rgba(0,0,0,0.95)", position:"relative", overflow:"hidden" }}>
161
+ <svg style={{ position:"absolute", inset:0, width:"100%", height:"100%", pointerEvents:"none", zIndex:6 }}>
162
+ <rect x="8" y="8" width="calc(100% - 16px)" height="calc(100% - 16px)"
163
+ fill="none" stroke="var(--d-500)" strokeWidth="1" strokeDasharray="4 3"/>
164
+ </svg>
165
+ <GrainOverlay/>
166
+ <GeometricOverlay/>
167
+ {stubHeight > 0 && (
168
+ <div style={{ position:"absolute", bottom:stubHeight, left:0, right:0, zIndex:8,
169
+ borderTop:"1px dashed var(--border-2)", display:"flex", alignItems:"center", justifyContent:"center" }}>
170
+ <span style={{ background:"var(--surface)", padding:"0 8px", fontSize:7, color:"var(--w-500)",
171
+ letterSpacing:"0.2em", fontFamily:"var(--font)" }}>✂ TEAR</span>
172
+ </div>
173
+ )}
174
+ {children}
175
+ </div>
176
+ </Punched>
177
+ );
178
+
179
+ const Barcode = ({ value="OMEGA-7749-XX", width=120, height=28 }) => {
180
+ const bars = [];
181
+ for (let i = 0; i < 48; i++)
182
+ bars.push({ x: i*(width/48), w: Math.random()>0.5?1.5:0.8, o: 0.4+Math.random()*0.6 });
183
+ return (
184
+ <div style={{ display:"flex", flexDirection:"column", alignItems:"center", gap:2 }}>
185
+ <svg width={width} height={height} style={{ display:"block" }}>
186
+ {bars.map((b,i) => <rect key={i} x={b.x} y={0} width={b.w} height={height} fill="var(--w-300)" opacity={b.o}/>)}
187
+ </svg>
188
+ <span style={{ fontSize:6, letterSpacing:"0.28em", color:"var(--w-500)", fontFamily:"var(--font)", textTransform:"uppercase" }}>{value}</span>
189
+ </div>
190
+ );
191
+ };
192
+
193
+ const StatusPill = ({ status="active", label, pulse=true }) => {
194
+ const colors = {
195
+ active: "var(--g-300)",
196
+ inactive: "var(--w-500)",
197
+ warning: "var(--p-500)",
198
+ danger: "var(--r-500)",
199
+ pending: "var(--g-100)",
200
+ };
201
+ const color = colors[status] || colors.active;
202
+ return (
203
+ <div style={{ display:"inline-flex", alignItems:"center", gap:6, padding:"3px 8px",
204
+ border:`1px solid ${color}33`, background:`${color}0d`, borderRadius:2 }}>
205
+ <div className={pulse?"pulse-anim":""} style={{ width:5, height:5, borderRadius:"50%",
206
+ background:color, boxShadow:`0 0 6px ${color}` }}/>
207
+ <span style={{ fontSize:8, letterSpacing:"0.28em", color, fontFamily:"var(--font)", textTransform:"uppercase" }}>
208
+ {label || status}
209
+ </span>
210
+ </div>
211
+ );
212
+ };
213
+
214
+ const TerminalMask = ({ lines=[], size=120 }) => {
215
+ const defaultLines = [
216
+ "CLASSIFIED // OMEGA PROTOCOL","ACCESS GRANTED — NEXUS-7","THREAT LEVEL: CRITICAL",
217
+ "SYNC: 99.7% COMPLETE","FIREWALL: ACTIVE","ENCRYPTION: AES-512",
218
+ "NODE: 192.168.0.77","UPTIME: 847:22:11","AGENT: SPECTRE-9","STATUS: OPERATIONAL",...lines
219
+ ];
220
+ const doubled = [...defaultLines, ...defaultLines];
221
+ return (
222
+ <div style={{ width:size, height:size, borderRadius:"50%", overflow:"hidden", position:"relative",
223
+ border:"1px solid var(--d-500)", background:"var(--bg)",
224
+ boxShadow:"inset 0 0 20px rgba(0,0,0,0.8), 0 0 20px rgba(0,0,0,0.6)" }}>
225
+ <div className="scroll-anim" style={{ position:"absolute", width:"100%", paddingTop:8 }}>
226
+ {doubled.map((line,i) => (
227
+ <div key={i} style={{ padding:"1.5px 8px", fontSize:6.5, letterSpacing:"0.18em",
228
+ color: i%3===0 ? "var(--g-300)" : "var(--w-500)",
229
+ fontFamily:"var(--font)", textTransform:"uppercase", whiteSpace:"nowrap", overflow:"hidden" }}>{line}</div>
230
+ ))}
231
+ </div>
232
+ <div style={{ position:"absolute", inset:0, borderRadius:"50%",
233
+ background:"radial-gradient(circle, transparent 40%, var(--bg) 80%)", pointerEvents:"none" }}/>
234
+ </div>
235
+ );
236
+ };
237
+
238
+ const Divider = ({ label }) => (
239
+ <div style={{ display:"flex", alignItems:"center", gap:10, padding:"4px 0" }}>
240
+ <div style={{ flex:1, height:1, background:"var(--border-1)" }}/>
241
+ {label
242
+ ? <span style={{ fontSize:7, letterSpacing:"0.28em", color:"var(--w-500)", textTransform:"uppercase", fontFamily:"var(--font)" }}>{label}</span>
243
+ : <svg width="8" height="8"><polygon points="4,0 8,4 4,8 0,4" fill="var(--d-500)"/></svg>
244
+ }
245
+ <div style={{ flex:1, height:1, background:"var(--border-1)" }}/>
246
+ </div>
247
+ );
248
+
249
+ const SectionLabel = ({ children, sub }) => (
250
+ <div style={{ marginBottom:20 }}>
251
+ <div style={{ display:"flex", alignItems:"center", gap:8 }}>
252
+ <div style={{ width:2, height:14, background:"var(--g-300)" }}/>
253
+ <span style={{ fontSize:9.5, fontWeight:700, letterSpacing:"0.34em", textTransform:"uppercase",
254
+ fontFamily:"var(--font)", color:"var(--w-100)" }}>{children}</span>
255
+ </div>
256
+ {sub && <div style={{ marginTop:4, marginLeft:10, fontSize:7, letterSpacing:"0.2em",
257
+ color:"var(--g-700)", textTransform:"uppercase", fontFamily:"var(--font)" }}>{sub}</div>}
258
+ </div>
259
+ );
260
+
261
+ const Micro = ({ children, color="var(--text-6)" }) => (
262
+ <span style={{ fontSize:7, letterSpacing:"0.28em", color, fontFamily:"var(--font)", textTransform:"uppercase" }}>{children}</span>
263
+ );
264
+
265
+ // ── 1. HEADER ──────────────────────────────────────────────────
266
+ const Header = ({ activeTab, setActiveTab }) => {
267
+ const navItems = ["DASHBOARD","INTEL","ASSETS","COMMS","SYSTEM"];
268
+ return (
269
+ <Punched style={{ zIndex:100 }}>
270
+ <div style={{ position:"relative", background:"var(--header)", borderBottom:"1px solid var(--border-1)",
271
+ height:52, display:"flex", alignItems:"center", padding:"0 24px", gap:24, overflow:"hidden" }}>
272
+ <GrainOverlay strength={0.1}/>
273
+ <div style={{ display:"flex", alignItems:"center", gap:10, zIndex:7 }}>
274
+ <svg width="18" height="18" viewBox="0 0 18 18">
275
+ <polygon points="9,1 17,5 17,13 9,17 1,13 1,5" fill="none" stroke="var(--g-300)" strokeWidth="1.5"/>
276
+ <polygon points="9,5 13,7 13,11 9,13 5,11 5,7" fill="var(--g-500)" opacity="0.3"/>
277
+ <circle cx="9" cy="9" r="2" fill="var(--g-300)"/>
278
+ </svg>
279
+ <div>
280
+ <div style={{ fontSize:11, fontWeight:700, letterSpacing:"0.22em", textTransform:"uppercase",
281
+ fontFamily:"var(--font)", color:"var(--w-100)" }}>NEXUS</div>
282
+ <div style={{ fontSize:6.5, letterSpacing:"0.34em", color:"var(--g-500)", textTransform:"uppercase", fontFamily:"var(--font)" }}>OMEGA PROTOCOL</div>
283
+ </div>
284
+ </div>
285
+ <div style={{ width:1, height:28, background:"var(--border-1)", zIndex:7 }}/>
286
+ <div style={{ display:"flex", gap:2, zIndex:7 }}>
287
+ {navItems.map(item => (
288
+ <button key={item} onClick={() => setActiveTab(item)} style={{
289
+ background: activeTab===item ? "rgba(255,215,0,0.06)" : "transparent",
290
+ border: activeTab===item ? "1px solid var(--g-700)" : "1px solid transparent",
291
+ color: activeTab===item ? "var(--g-300)" : "var(--w-500)",
292
+ padding:"5px 12px", cursor:"pointer", fontFamily:"var(--font)",
293
+ fontSize:8, letterSpacing:"0.22em", textTransform:"uppercase", transition:"all 0.2s"
294
+ }}>
295
+ {item}
296
+ {activeTab===item && <div style={{ width:"100%", height:1, background:"var(--g-300)", marginTop:2 }}/>}
297
+ </button>
298
+ ))}
299
+ </div>
300
+ <div style={{ flex:1 }}/>
301
+ <div style={{ display:"flex", alignItems:"center", gap:14, zIndex:7 }}>
302
+ <StatusPill status="active" label="SYS ONLINE"/>
303
+ <div style={{ textAlign:"right" }}>
304
+ <div style={{ fontSize:8, letterSpacing:"0.2em", color:"var(--w-300)", textTransform:"uppercase", fontFamily:"var(--font)" }}>AGT-09</div>
305
+ <div style={{ fontSize:6.5, letterSpacing:"0.18em", color:"var(--g-500)", textTransform:"uppercase", fontFamily:"var(--font)" }}>CLEARANCE: OMEGA</div>
306
+ </div>
307
+ <div style={{ width:28, height:28, borderRadius:"50%", border:"1px solid var(--g-700)",
308
+ background:"var(--surface)", display:"flex", alignItems:"center", justifyContent:"center",
309
+ fontSize:9, color:"var(--g-300)", fontFamily:"var(--font)" }}>Ω</div>
310
+ </div>
311
+ </div>
312
+ </Punched>
313
+ );
314
+ };
315
+
316
+ // ── 2. BUTTON ──────────────────────────────────────────────────
317
+ const Button = ({ variant="primary", children, icon, size="md", disabled, onClick }) => {
318
+ const sizes = { sm:"4px 10px", md:"7px 16px", lg:"10px 22px" };
319
+ const fontSizes = { sm:7.5, md:8.5, lg:9.5 };
320
+ const bases = {
321
+ primary: { bg:"var(--g-300)", color:"var(--d-900)", border:"1px solid var(--g-300)" },
322
+ secondary: { bg:"rgba(255,215,0,0.06)", color:"var(--g-300)", border:"1px solid var(--g-700)" },
323
+ outline: { bg:"transparent", color:"var(--w-100)", border:"1px solid var(--w-300)" },
324
+ ghost: { bg:"transparent", color:"var(--w-500)", border:"1px solid transparent" },
325
+ danger: { bg:"rgba(255,51,51,0.10)", color:"var(--r-500)", border:"1px solid var(--r-700)" },
326
+ success: { bg:"rgba(255,215,0,0.08)", color:"var(--g-300)", border:"1px solid var(--g-700)" },
327
+ };
328
+ const s = bases[variant] || bases.primary;
329
+ return (
330
+ <button onClick={onClick} disabled={disabled} style={{
331
+ background:s.bg, color:s.color, border:s.border,
332
+ padding:sizes[size], fontFamily:"var(--font)",
333
+ fontSize:fontSizes[size], letterSpacing:"0.22em", textTransform:"uppercase",
334
+ cursor:disabled?"not-allowed":"pointer", opacity:disabled?0.4:1,
335
+ display:"inline-flex", alignItems:"center", gap:6,
336
+ position:"relative", overflow:"hidden", transition:"all 0.2s", outline:"none",
337
+ }}>
338
+ {["top:2px;left:2px","top:2px;right:2px","bottom:2px;left:2px","bottom:2px;right:2px"].map((pos,i) => {
339
+ const st = pos.split(";").reduce((a,p)=>{ const [k,v]=p.split(":"); a[k]=v; return a; },{});
340
+ return <div key={i} style={{ position:"absolute", ...st, width:2, height:2, background:s.color, opacity:0.5 }}/>;
341
+ })}
342
+ {icon && <span style={{ fontSize:fontSizes[size]*1.1 }}>{icon}</span>}
343
+ {children}
344
+ </button>
345
+ );
346
+ };
347
+
348
+ // ── 3. INPUT ───────────────────────────────────────────────────
349
+ const Input = ({ placeholder, label, type="text", value, onChange, prefix, suffix, hint }) => (
350
+ <div style={{ display:"flex", flexDirection:"column", gap:5 }}>
351
+ {label && <label style={{ fontSize:7.5, letterSpacing:"0.28em", color:"var(--g-500)", textTransform:"uppercase", fontFamily:"var(--font)" }}>{label}</label>}
352
+ <div style={{ position:"relative", background:"var(--surface)", border:"1px solid var(--border-1)",
353
+ display:"flex", alignItems:"center", overflow:"hidden" }}>
354
+ {prefix && <span style={{ padding:"0 8px", fontSize:8, color:"var(--g-500)", fontFamily:"var(--font)", borderRight:"1px solid var(--border-1)" }}>{prefix}</span>}
355
+ <input type={type} placeholder={placeholder} value={value} onChange={onChange} style={{
356
+ flex:1, background:"transparent", border:"none", outline:"none",
357
+ color:"var(--w-100)", fontFamily:"var(--font)", fontSize:9, letterSpacing:"0.14em", padding:"9px 12px",
358
+ }}/>
359
+ {suffix && <span style={{ padding:"0 8px", fontSize:8, color:"var(--g-500)", fontFamily:"var(--font)", borderLeft:"1px solid var(--border-1)" }}>{suffix}</span>}
360
+ <div style={{ position:"absolute", inset:2, border:"1px dashed var(--border-1)", pointerEvents:"none" }}/>
361
+ </div>
362
+ {hint && <div style={{ fontSize:7, letterSpacing:"0.18em", color:"var(--g-700)", fontFamily:"var(--font)", textTransform:"uppercase" }}>{hint}</div>}
363
+ </div>
364
+ );
365
+
366
+ // ── 4. CARD ────────────────────────────────────────────────────
367
+ const Card = ({ children, title, sub, tag, style={} }) => (
368
+ <Punched style={style}>
369
+ <div style={{ position:"relative", background:"var(--surface)", border:"1px solid var(--border-1)", overflow:"hidden" }}>
370
+ <GrainOverlay strength={0.12}/>
371
+ {["top:0;left:0","top:0;right:0","bottom:0;left:0","bottom:0;right:0"].map((pos,i) => {
372
+ const st = pos.split(";").reduce((a,p)=>{ const [k,v]=p.split(":"); a[k]=v; return a; },{});
373
+ return (
374
+ <div key={i} style={{ position:"absolute", ...st, width:12, height:12, zIndex:7,
375
+ borderTop: i<2 ? "1px solid var(--g-700)" : "none",
376
+ borderBottom: i>=2 ? "1px solid var(--g-700)" : "none",
377
+ borderLeft: (i===0||i===2) ? "1px solid var(--g-700)" : "none",
378
+ borderRight: (i===1||i===3) ? "1px solid var(--g-700)" : "none",
379
+ }}/>
380
+ );
381
+ })}
382
+ {(title||sub||tag) && (
383
+ <div style={{ padding:"10px 14px 8px", borderBottom:"1px solid var(--border-1)", position:"relative", zIndex:7 }}>
384
+ <div style={{ display:"flex", justifyContent:"space-between", alignItems:"flex-start" }}>
385
+ <div>
386
+ {title && <div style={{ fontSize:9.5, fontWeight:600, letterSpacing:"0.22em", textTransform:"uppercase",
387
+ fontFamily:"var(--font)", color:"var(--w-100)" }}>{title}</div>}
388
+ {sub && <div style={{ fontSize:7, letterSpacing:"0.18em", color:"var(--g-500)", textTransform:"uppercase",
389
+ fontFamily:"var(--font)", marginTop:3 }}>{sub}</div>}
390
+ </div>
391
+ {tag && <div style={{ fontSize:7, padding:"2px 7px", border:"1px solid var(--g-700)", color:"var(--g-500)",
392
+ letterSpacing:"0.2em", textTransform:"uppercase", fontFamily:"var(--font)" }}>{tag}</div>}
393
+ </div>
394
+ </div>
395
+ )}
396
+ <div style={{ padding:14, position:"relative", zIndex:7 }}>{children}</div>
397
+ </div>
398
+ </Punched>
399
+ );
400
+
401
+ // ── 5. BADGE ───────────────────��───────────────────────────────
402
+ const Badge = ({ children, variant="default" }) => {
403
+ const vars = {
404
+ default: { bg:"var(--surface)", color:"var(--w-400)", border:"1px solid var(--border-2)" },
405
+ active: { bg:"rgba(255,215,0,0.08)", color:"var(--g-300)", border:"1px solid var(--g-700)" },
406
+ danger: { bg:"rgba(255,51,51,0.08)", color:"var(--r-500)", border:"1px solid var(--r-700)" },
407
+ warning: { bg:"rgba(255,140,105,0.08)", color:"var(--p-500)", border:"1px solid var(--p-700)" },
408
+ omega: { bg:"rgba(255,244,204,0.05)", color:"var(--g-100)", border:"1px solid var(--g-700)" },
409
+ };
410
+ const v = vars[variant] || vars.default;
411
+ return (
412
+ <span style={{ ...v, display:"inline-block", padding:"2px 7px", fontSize:7,
413
+ letterSpacing:"0.22em", textTransform:"uppercase", fontFamily:"var(--font)" }}>{children}</span>
414
+ );
415
+ };
416
+
417
+ // ── 6. PROGRESS BAR ────────────────────────────────────────────
418
+ const ProgressBar = ({ value=65, label, color="var(--g-300)" }) => (
419
+ <div style={{ display:"flex", flexDirection:"column", gap:4 }}>
420
+ {label && (
421
+ <div style={{ display:"flex", justifyContent:"space-between" }}>
422
+ <Micro color="var(--w-500)">{label}</Micro>
423
+ <Micro color="var(--g-500)">{value}%</Micro>
424
+ </div>
425
+ )}
426
+ <div style={{ height:3, background:"var(--border-1)", position:"relative", overflow:"hidden" }}>
427
+ <div style={{ "--fill":`${value}%`, width:`${value}%`, height:"100%", background:color,
428
+ animation:"progress-fill 1.5s ease forwards", boxShadow:`0 0 8px ${color}` }}/>
429
+ {[25,50,75].map(t => (
430
+ <div key={t} style={{ position:"absolute", top:0, left:`${t}%`, width:1, height:"100%", background:"var(--border-2)" }}/>
431
+ ))}
432
+ </div>
433
+ </div>
434
+ );
435
+
436
+ // ── 7. SPINNER ─────────────────────────────────────────────────
437
+ const Spinner = ({ size=32 }) => (
438
+ <div style={{ position:"relative", width:size, height:size }}>
439
+ <div className="spin-slow" style={{ width:"100%", height:"100%",
440
+ border:"1px solid var(--border-2)", borderTop:"1px solid var(--g-300)", borderRadius:"50%" }}/>
441
+ <div style={{ position:"absolute", inset:4, border:"1px dashed var(--g-700)", borderRadius:"50%" }}/>
442
+ <div style={{ position:"absolute", inset:"50%", transform:"translate(-50%,-50%)",
443
+ width:4, height:4, background:"var(--g-300)", borderRadius:"50%" }}/>
444
+ </div>
445
+ );
446
+
447
+ // ── 8. TABS ────────────────────────────────────────────────────
448
+ const Tabs = ({ tabs, active, onSelect }) => (
449
+ <div style={{ borderBottom:"1px solid var(--border-1)", display:"flex", gap:0 }}>
450
+ {tabs.map((tab,i) => (
451
+ <button key={i} onClick={() => onSelect(i)} style={{
452
+ background: active===i ? "rgba(255,215,0,0.04)" : "transparent",
453
+ border:"none", borderBottom: active===i ? "1px solid var(--g-300)" : "1px solid transparent",
454
+ color: active===i ? "var(--g-300)" : "var(--w-500)",
455
+ padding:"8px 16px", cursor:"pointer", fontFamily:"var(--font)",
456
+ fontSize:8, letterSpacing:"0.22em", textTransform:"uppercase", position:"relative", marginBottom:-1,
457
+ }}>
458
+ {active===i && <div style={{ position:"absolute", top:0, left:0, right:0, height:1, background:"var(--g-700)" }}/>}
459
+ {tab}
460
+ </button>
461
+ ))}
462
+ </div>
463
+ );
464
+
465
+ // ── 9. ACCORDION ───────────────────────────────────────────────
466
+ const AccordionItem = ({ title, children }) => {
467
+ const [open, setOpen] = useState(false);
468
+ return (
469
+ <div style={{ borderBottom:"1px solid var(--border-1)" }}>
470
+ <button onClick={() => setOpen(!open)} style={{
471
+ width:"100%", background:"transparent", border:"none", padding:"10px 14px",
472
+ display:"flex", justifyContent:"space-between", alignItems:"center",
473
+ cursor:"pointer", color:"var(--w-300)", fontFamily:"var(--font)",
474
+ fontSize:8.5, letterSpacing:"0.22em", textTransform:"uppercase",
475
+ }}>
476
+ <span>{title}</span>
477
+ <svg width="10" height="10" style={{ transform:open?"rotate(180deg)":"rotate(0deg)", transition:"transform 0.2s" }}>
478
+ <polygon points="5,7 0,0 10,0" fill="var(--g-500)"/>
479
+ </svg>
480
+ </button>
481
+ {open && (
482
+ <div style={{ padding:"8px 14px 12px", color:"var(--w-500)", fontSize:8.5, lineHeight:1.7,
483
+ fontFamily:"var(--font)", letterSpacing:"0.1em", borderTop:"1px dashed var(--border-1)" }}>
484
+ {children}
485
+ </div>
486
+ )}
487
+ </div>
488
+ );
489
+ };
490
+
491
+ // ── 10. TOOLTIP ───────────────────���────────────────────────────
492
+ const Tooltip = ({ label, children }) => {
493
+ const [show, setShow] = useState(false);
494
+ return (
495
+ <div style={{ position:"relative", display:"inline-block" }}
496
+ onMouseEnter={() => setShow(true)} onMouseLeave={() => setShow(false)}>
497
+ {children}
498
+ {show && (
499
+ <div style={{ position:"absolute", bottom:"calc(100% + 6px)", left:"50%", transform:"translateX(-50%)",
500
+ background:"var(--header)", border:"1px solid var(--g-700)", padding:"5px 10px",
501
+ whiteSpace:"nowrap", zIndex:200, pointerEvents:"none" }}>
502
+ <span style={{ fontSize:7.5, letterSpacing:"0.18em", color:"var(--g-300)",
503
+ fontFamily:"var(--font)", textTransform:"uppercase" }}>{label}</span>
504
+ <div style={{ position:"absolute", bottom:-4, left:"50%", transform:"translateX(-50%)", width:6, height:4,
505
+ background:"var(--header)", borderRight:"1px solid var(--g-700)", borderBottom:"1px solid var(--g-700)",
506
+ transformOrigin:"center", rotate:"45deg" }}/>
507
+ </div>
508
+ )}
509
+ </div>
510
+ );
511
+ };
512
+
513
+ // ── 11. DATA TABLE ─────────────────────────────────────────────
514
+ const DataTable = ({ columns, rows }) => (
515
+ <Punched>
516
+ <div style={{ border:"1px solid var(--border-1)", overflow:"hidden", position:"relative" }}>
517
+ <GrainOverlay strength={0.08}/>
518
+ <div style={{ display:"grid", gridTemplateColumns:`repeat(${columns.length}, 1fr)`,
519
+ borderBottom:"1px solid var(--border-2)", background:"var(--header)", position:"relative", zIndex:7 }}>
520
+ {columns.map((col,i) => (
521
+ <div key={i} style={{ padding:"8px 12px", fontSize:7.5, letterSpacing:"0.22em",
522
+ textTransform:"uppercase", color:"var(--g-500)", fontFamily:"var(--font)",
523
+ borderRight: i<columns.length-1 ? "1px solid var(--border-1)" : "none" }}>
524
+ {col}
525
+ </div>
526
+ ))}
527
+ </div>
528
+ {rows.map((row,ri) => (
529
+ <div key={ri} style={{ display:"grid", gridTemplateColumns:`repeat(${columns.length}, 1fr)`,
530
+ borderBottom: ri<rows.length-1 ? "1px solid var(--border-1)" : "none",
531
+ background: ri%2===0 ? "transparent" : "rgba(255,215,0,0.01)", position:"relative", zIndex:7 }}>
532
+ {row.map((cell,ci) => (
533
+ <div key={ci} style={{ padding:"7px 12px", fontSize:8, letterSpacing:"0.12em",
534
+ color: ci===0 ? "var(--w-200)" : "var(--w-500)", fontFamily:"var(--font)",
535
+ borderRight: ci<row.length-1 ? "1px solid var(--border-1)" : "none" }}>
536
+ {cell}
537
+ </div>
538
+ ))}
539
+ </div>
540
+ ))}
541
+ </div>
542
+ </Punched>
543
+ );
544
+
545
+ // ── 12. TOGGLE ─────────────────────────────────────────────────
546
+ const Toggle = ({ checked, onChange, label }) => (
547
+ <div style={{ display:"flex", alignItems:"center", gap:10 }}>
548
+ <div onClick={onChange} style={{ cursor:"pointer", width:40, height:16, position:"relative",
549
+ background: checked ? "rgba(255,215,0,0.1)" : "var(--surface)",
550
+ border:`1px solid ${checked ? "var(--g-700)" : "var(--border-1)"}` }}>
551
+ {[...Array(8)].map((_,i) => (
552
+ <div key={i} style={{ position:"absolute", top:2, bottom:2, left:4+i*4, width:1,
553
+ background:"var(--border-2)", opacity:checked?1:0.4 }}/>
554
+ ))}
555
+ <div style={{ position:"absolute", top:1, width:12, height:12,
556
+ background: checked ? "var(--g-300)" : "var(--border-2)",
557
+ left: checked ? "calc(100% - 14px)" : 1,
558
+ transition:"all 0.2s", boxShadow: checked ? "0 0 8px var(--g-500)" : "none",
559
+ display:"flex", alignItems:"center", justifyContent:"center",
560
+ fontSize:5, color: checked ? "var(--d-900)" : "transparent" }}>■</div>
561
+ </div>
562
+ {label && <span style={{ fontSize:8, letterSpacing:"0.18em", color:"var(--w-400)",
563
+ fontFamily:"var(--font)", textTransform:"uppercase" }}>{label}</span>}
564
+ </div>
565
+ );
566
+
567
+ // ── 13. ALERT ──────────────────────────────────────────────────
568
+ const Alert = ({ type="info", title, message, onClose }) => {
569
+ const types = {
570
+ info: { color:"var(--w-300)", border:"var(--border-2)", icon:"◈" },
571
+ success: { color:"var(--g-300)", border:"var(--g-700)", icon:"✓" },
572
+ warning: { color:"var(--p-500)", border:"var(--p-700)", icon:"⚠" },
573
+ danger: { color:"var(--r-500)", border:"var(--r-700)", icon:"✕" },
574
+ };
575
+ const t = types[type] || types.info;
576
+ return (
577
+ <Punched>
578
+ <div className="toast-anim" style={{ background:"var(--surface)", border:`1px solid ${t.border}`,
579
+ padding:"10px 14px", position:"relative", overflow:"hidden", display:"flex", gap:10, alignItems:"flex-start" }}>
580
+ <GrainOverlay strength={0.1}/>
581
+ <span style={{ fontSize:14, color:t.color, zIndex:7 }}>{t.icon}</span>
582
+ <div style={{ flex:1, zIndex:7 }}>
583
+ {title && <div style={{ fontSize:9, fontWeight:600, letterSpacing:"0.2em", color:t.color,
584
+ textTransform:"uppercase", fontFamily:"var(--font)", marginBottom:3 }}>{title}</div>}
585
+ <div style={{ fontSize:8, letterSpacing:"0.14em", color:"var(--w-500)", fontFamily:"var(--font)" }}>{message}</div>
586
+ </div>
587
+ {onClose && <button onClick={onClose} style={{ background:"none", border:"none",
588
+ color:"var(--w-500)", cursor:"pointer", fontSize:10, zIndex:7 }}>×</button>}
589
+ </div>
590
+ </Punched>
591
+ );
592
+ };
593
+
594
+ // ── 14. BREADCRUMBS ────────────────────────────────────────────
595
+ const Breadcrumbs = ({ items }) => (
596
+ <div style={{ display:"flex", alignItems:"center", gap:6 }}>
597
+ {items.map((item,i) => (
598
+ <div key={i} style={{ display:"flex", alignItems:"center", gap:6 }}>
599
+ <span style={{ fontSize:8, letterSpacing:"0.18em",
600
+ color: i===items.length-1 ? "var(--g-300)" : "var(--w-500)",
601
+ textTransform:"uppercase", fontFamily:"var(--font)", cursor:i<items.length-1?"pointer":"default" }}>
602
+ {item}
603
+ </span>
604
+ {i<items.length-1 && (
605
+ <svg width="6" height="6"><polygon points="3,0 6,3 3,6 0,3" fill="var(--g-700)"/></svg>
606
+ )}
607
+ </div>
608
+ ))}
609
+ </div>
610
+ );
611
+
612
+ // ── 15. STEPPER ────────────────────────────────────────────────
613
+ const Stepper = ({ steps, current }) => (
614
+ <div style={{ display:"flex", alignItems:"center" }}>
615
+ {steps.map((step,i) => (
616
+ <div key={i} style={{ display:"flex", alignItems:"center", flex:i<steps.length-1?1:"none" }}>
617
+ <div style={{ display:"flex", flexDirection:"column", alignItems:"center", gap:4 }}>
618
+ <div style={{ width:24, height:24,
619
+ border:`1px solid ${i<=current ? "var(--g-300)" : "var(--border-2)"}`,
620
+ background: i<current ? "var(--g-300)" : i===current ? "rgba(255,215,0,0.1)" : "transparent",
621
+ display:"flex", alignItems:"center", justifyContent:"center",
622
+ fontSize:7.5, color: i<current ? "var(--d-900)" : i===current ? "var(--g-300)" : "var(--w-500)",
623
+ fontFamily:"var(--font)", fontWeight:700, letterSpacing:"0.1em" }}>
624
+ {i<current ? "✓" : i+1}
625
+ </div>
626
+ <span style={{ fontSize:7, letterSpacing:"0.16em",
627
+ color: i<=current ? "var(--g-300)" : "var(--w-500)",
628
+ textTransform:"uppercase", fontFamily:"var(--font)", whiteSpace:"nowrap" }}>{step}</span>
629
+ </div>
630
+ {i<steps.length-1 && (
631
+ <div style={{ flex:1, height:1, background: i<current ? "var(--g-500)" : "var(--border-1)",
632
+ margin:"0 8px", marginBottom:14 }}/>
633
+ )}
634
+ </div>
635
+ ))}
636
+ </div>
637
+ );
638
+
639
+ // ── 16. SELECT ─────────────────────────────────────────────────
640
+ const Select = ({ label, options, value, onChange }) => {
641
+ const [open, setOpen] = useState(false);
642
+ return (
643
+ <div style={{ position:"relative", display:"flex", flexDirection:"column", gap:5 }}>
644
+ {label && <label style={{ fontSize:7.5, letterSpacing:"0.28em", color:"var(--g-500)",
645
+ textTransform:"uppercase", fontFamily:"var(--font)" }}>{label}</label>}
646
+ <div onClick={() => setOpen(!open)} style={{ background:"var(--surface)", border:"1px solid var(--border-1)",
647
+ padding:"9px 12px", cursor:"pointer", display:"flex", justifyContent:"space-between",
648
+ alignItems:"center", position:"relative" }}>
649
+ <span style={{ fontSize:9, letterSpacing:"0.14em", fontFamily:"var(--font)",
650
+ color: value ? "var(--w-100)" : "var(--w-500)" }}>
651
+ {value || "— SELECT OPTION —"}
652
+ </span>
653
+ <svg width="8" height="8" style={{ transform:open?"rotate(180deg)":"none", transition:"transform 0.2s" }}>
654
+ <polygon points="4,6 0,0 8,0" fill="var(--g-500)"/>
655
+ </svg>
656
+ <div style={{ position:"absolute", inset:2, border:"1px dashed var(--border-1)", pointerEvents:"none" }}/>
657
+ </div>
658
+ {open && (
659
+ <div style={{ position:"absolute", top:"calc(100% + 2px)", left:0, right:0, background:"var(--header)",
660
+ border:"1px solid var(--g-700)", zIndex:100, overflow:"hidden" }}>
661
+ {options.map((opt,i) => (
662
+ <div key={i} onClick={() => { onChange(opt); setOpen(false); }} style={{
663
+ padding:"8px 12px", cursor:"pointer", fontSize:8.5, letterSpacing:"0.14em",
664
+ fontFamily:"var(--font)", color:"var(--w-400)", textTransform:"uppercase",
665
+ borderBottom: i<options.length-1 ? "1px solid var(--border-1)" : "none", transition:"background 0.1s",
666
+ }}
667
+ onMouseEnter={e => e.currentTarget.style.background="rgba(255,215,0,0.05)"}
668
+ onMouseLeave={e => e.currentTarget.style.background="transparent"}>
669
+ <div style={{ display:"flex", alignItems:"center", gap:8 }}>
670
+ <div style={{ width:3, height:3, background:"var(--g-500)" }}/>{opt}
671
+ </div>
672
+ </div>
673
+ ))}
674
+ </div>
675
+ )}
676
+ </div>
677
+ );
678
+ };
679
+
680
+ // ── 17. MODAL ──────────────────────────────────────────────────
681
+ const Modal = ({ open, onClose, title, children }) => {
682
+ if (!open) return null;
683
+ return (
684
+ <div style={{ position:"fixed", inset:0, background:"rgba(0,0,0,0.85)", zIndex:1000,
685
+ display:"flex", alignItems:"center", justifyContent:"center", backdropFilter:"blur(4px)" }}>
686
+ <div style={{ position:"relative", maxWidth:480, width:"90%", maxHeight:"80vh", overflow:"hidden" }}>
687
+ <TicketShell stubHeight={0}>
688
+ <div style={{ padding:"20px 20px 16px", position:"relative", zIndex:8 }}>
689
+ <div style={{ display:"flex", justifyContent:"space-between", alignItems:"center", marginBottom:16 }}>
690
+ <div>
691
+ <div style={{ fontSize:7, letterSpacing:"0.28em", color:"var(--g-700)",
692
+ fontFamily:"var(--font)", textTransform:"uppercase", marginBottom:4 }}>// CLASSIFIED DIALOGUE</div>
693
+ <div style={{ fontSize:11, fontWeight:700, letterSpacing:"0.22em", textTransform:"uppercase",
694
+ fontFamily:"var(--font)", color:"var(--g-300)" }}>{title}</div>
695
+ </div>
696
+ <button onClick={onClose} style={{ background:"transparent", border:"1px solid var(--g-700)",
697
+ color:"var(--g-500)", width:24, height:24, cursor:"pointer", fontFamily:"var(--font)", fontSize:10,
698
+ display:"flex", alignItems:"center", justifyContent:"center" }}>×</button>
699
+ </div>
700
+ <Divider/>
701
+ <div style={{ marginTop:14, color:"var(--w-400)", fontSize:8.5, lineHeight:1.7,
702
+ letterSpacing:"0.12em", fontFamily:"var(--font)" }}>{children}</div>
703
+ <div style={{ marginTop:18, display:"flex", gap:8, justifyContent:"flex-end" }}>
704
+ <Button variant="ghost" onClick={onClose}>CANCEL</Button>
705
+ <Button variant="primary" onClick={onClose}>CONFIRM</Button>
706
+ </div>
707
+ </div>
708
+ </TicketShell>
709
+ </div>
710
+ </div>
711
+ );
712
+ };
713
+
714
+ // ── 18. AVATAR ─────────────────────────────────────────────────
715
+ const Avatar = ({ initials="Ω", status }) => (
716
+ <div style={{ position:"relative", width:40, height:40 }}>
717
+ <div style={{ width:"100%", height:"100%", borderRadius:"50%", background:"var(--surface)",
718
+ border:"1px solid var(--g-700)", display:"flex", alignItems:"center", justifyContent:"center",
719
+ overflow:"hidden", position:"relative" }}>
720
+ <GeometricOverlay/>
721
+ <span style={{ fontSize:13, color:"var(--g-300)", fontFamily:"var(--font)", zIndex:7 }}>{initials}</span>
722
+ </div>
723
+ {status && (
724
+ <div className="pulse-anim" style={{ position:"absolute", bottom:1, right:1, width:7, height:7,
725
+ borderRadius:"50%", background:"var(--g-300)", border:"1px solid var(--bg)",
726
+ boxShadow:"0 0 6px var(--g-500)" }}/>
727
+ )}
728
+ </div>
729
+ );
730
+
731
+ // ── 19. FIELDSET ───────────────────────────────────────────────
732
+ const Fieldset = ({ legend, children }) => (
733
+ <div style={{ border:"1px solid var(--border-1)", padding:"14px 16px", position:"relative", marginTop:8 }}>
734
+ <div style={{ position:"absolute", top:-7, left:12, background:"var(--bg)", padding:"0 6px",
735
+ fontSize:7, letterSpacing:"0.28em", color:"var(--g-500)", textTransform:"uppercase", fontFamily:"var(--font)" }}>
736
+ {legend}
737
+ </div>
738
+ <div style={{ display:"flex", flexDirection:"column", gap:14 }}>{children}</div>
739
+ </div>
740
+ );
741
+
742
+ // ── 20. STAT CARD ──────────────────────────────────────────────
743
+ const StatCard = ({ label, value, unit, change, trend }) => (
744
+ <Punched>
745
+ <div style={{ position:"relative", background:"var(--surface)", border:"1px solid var(--border-1)",
746
+ padding:"14px 16px", overflow:"hidden" }}>
747
+ <GrainOverlay strength={0.1}/>
748
+ <div style={{ position:"relative", zIndex:7 }}>
749
+ <div style={{ fontSize:7, letterSpacing:"0.28em", color:"var(--g-700)", textTransform:"uppercase",
750
+ fontFamily:"var(--font)", marginBottom:8 }}>{label}</div>
751
+ <div style={{ display:"flex", alignItems:"baseline", gap:4 }}>
752
+ <span style={{ fontSize:26, fontWeight:700, letterSpacing:"0.04em",
753
+ fontFamily:"var(--font)", lineHeight:1, color:"var(--w-100)" }}>{value}</span>
754
+ {unit && <span style={{ fontSize:9, color:"var(--g-500)", fontFamily:"var(--font)", letterSpacing:"0.14em" }}>{unit}</span>}
755
+ </div>
756
+ {change !== undefined && (
757
+ <div style={{ marginTop:6, fontSize:7.5, letterSpacing:"0.18em", fontFamily:"var(--font)",
758
+ color: trend==="up" ? "var(--g-300)" : trend==="down" ? "var(--r-500)" : "var(--w-500)" }}>
759
+ {trend==="up" ? "▲" : trend==="down" ? "▼" : "—"} {change}
760
+ </div>
761
+ )}
762
+ </div>
763
+ <div style={{ position:"absolute", bottom:-20, right:-20, width:60, height:60,
764
+ borderRadius:"50%", background:"rgba(255,215,0,0.03)", pointerEvents:"none" }}/>
765
+ </div>
766
+ </Punched>
767
+ );
768
+
769
+ // ── 21. SIDEBAR ────────────────────────────────────────────────
770
+ const Sidebar = ({ activeItem, setActiveItem }) => {
771
+ const items = [
772
+ { icon:"◈", label:"DASHBOARD", sub:"OVERVIEW" },
773
+ { icon:"◉", label:"INTEL", sub:"CLASSIFIED" },
774
+ { icon:"▣", label:"ASSETS", sub:"INVENTORY" },
775
+ { icon:"◆", label:"COMMS", sub:"ENCRYPTED" },
776
+ { icon:"⬡", label:"ANALYTICS", sub:"METRICS" },
777
+ { icon:"⊕", label:"SETTINGS", sub:"CONFIG" },
778
+ ];
779
+ return (
780
+ <Punched style={{ width:160 }}>
781
+ <div style={{ background:"var(--header)", borderRight:"1px solid var(--border-1)",
782
+ display:"flex", flexDirection:"column", position:"relative", overflow:"hidden", height:"100%" }}>
783
+ <GrainOverlay strength={0.13}/>
784
+ <div style={{ position:"absolute", right:0, top:0, bottom:0, width:8,
785
+ background:"repeating-linear-gradient(180deg, transparent 0px, transparent 8px, var(--bg) 8px, var(--bg) 18px)",
786
+ zIndex:10 }}/>
787
+ <div style={{ padding:"12px 0", flex:1, position:"relative", zIndex:7 }}>
788
+ {items.map((item,i) => (
789
+ <button key={i} onClick={() => setActiveItem(item.label)} style={{
790
+ width:"100%", background: activeItem===item.label ? "rgba(255,215,0,0.05)" : "transparent",
791
+ border:"none", borderLeft: activeItem===item.label ? "2px solid var(--g-300)" : "2px solid transparent",
792
+ borderRight:"none", padding:"10px 14px", cursor:"pointer", textAlign:"left",
793
+ borderBottom: i<items.length-1 ? "1px solid var(--border-1)" : "none",
794
+ }}>
795
+ <div style={{ display:"flex", gap:8, alignItems:"center" }}>
796
+ <span style={{ fontSize:11, color: activeItem===item.label ? "var(--g-300)" : "var(--w-500)" }}>{item.icon}</span>
797
+ <div>
798
+ <div style={{ fontSize:8, fontWeight:600, letterSpacing:"0.18em", textTransform:"uppercase",
799
+ color: activeItem===item.label ? "var(--g-300)" : "var(--w-400)", fontFamily:"var(--font)" }}>{item.label}</div>
800
+ <div style={{ fontSize:6, letterSpacing:"0.2em", color:"var(--g-700)", textTransform:"uppercase", fontFamily:"var(--font)" }}>{item.sub}</div>
801
+ </div>
802
+ </div>
803
+ </button>
804
+ ))}
805
+ </div>
806
+ <div style={{ padding:"12px 14px", borderTop:"1px solid var(--border-1)", position:"relative", zIndex:7 }}>
807
+ <Barcode value="AGT-09-NEXUS" width={120} height={16}/>
808
+ </div>
809
+ </div>
810
+ </Punched>
811
+ );
812
+ };
813
+
814
+ // ── 22. FOOTER ─────────────────────────────────────────────────
815
+ const Footer = () => (
816
+ <Punched style={{ marginTop:8 }}>
817
+ <div style={{ position:"relative", background:"var(--header)", borderTop:"1px solid var(--border-1)",
818
+ padding:"12px 24px", display:"flex", justifyContent:"space-between", alignItems:"center", overflow:"hidden" }}>
819
+ <GrainOverlay strength={0.1}/>
820
+ <div style={{ position:"relative", zIndex:7 }}>
821
+ <Micro color="var(--g-700)">© NEXUS PROTOCOL — OMEGA DIVISION — CLEARANCE REQUIRED</Micro>
822
+ </div>
823
+ <div style={{ position:"relative", zIndex:7 }}>
824
+ <Barcode value="NEXUS-FOOTER-SYS" width={100} height={14}/>
825
+ </div>
826
+ <div style={{ position:"relative", zIndex:7, display:"flex", gap:12 }}>
827
+ <Micro color="var(--g-500)">v4.7.2</Micro>
828
+ <Micro color="var(--g-700)">BUILD-20470312</Micro>
829
+ </div>
830
+ </div>
831
+ </Punched>
832
+ );
833
+
834
+ // ══════════════════════════════════════════════════════════════
835
+ // DEMO PAGE
836
+ // ══════════════════════════════════════════════════════════════
837
+ export default function TicketPunchUIDemo() {
838
+ const [activeNavTab, setActiveNavTab] = useState("DASHBOARD");
839
+ const [activeSideItem, setActiveSideItem] = useState("DASHBOARD");
840
+ const [activeTab, setActiveTab] = useState(0);
841
+ const [toggleA, setToggleA] = useState(true);
842
+ const [toggleB, setToggleB] = useState(false);
843
+ const [modalOpen, setModalOpen] = useState(false);
844
+ const [selectVal, setSelectVal] = useState("");
845
+ const [inputVal, setInputVal] = useState("");
846
+
847
+ return (
848
+ <div style={{ fontFamily:"var(--font)", background:"var(--bg)", minHeight:"100vh",
849
+ color:"var(--text-primary)", position:"relative" }}>
850
+ <FontInjector/>
851
+
852
+ {/* Ambient gold glow */}
853
+ <div style={{ position:"fixed", top:"30%", left:"50%", transform:"translate(-50%,-50%)",
854
+ width:600, height:600, borderRadius:"50%",
855
+ background:"radial-gradient(circle, rgba(255,215,0,0.025) 0%, transparent 70%)",
856
+ pointerEvents:"none", zIndex:0 }}/>
857
+
858
+ <div style={{ display:"flex", flexDirection:"column", height:"100vh", overflow:"hidden" }}>
859
+ <Header activeTab={activeNavTab} setActiveTab={setActiveNavTab}/>
860
+ <div style={{ display:"flex", flex:1, overflow:"hidden" }}>
861
+ <Sidebar activeItem={activeSideItem} setActiveItem={setActiveSideItem}/>
862
+
863
+ <div style={{ flex:1, overflow:"auto", padding:24 }}>
864
+
865
+ {/* Page Header */}
866
+ <div style={{ marginBottom:28, display:"flex", justifyContent:"space-between", alignItems:"flex-start" }}>
867
+ <div>
868
+ <Breadcrumbs items={["NEXUS","DASHBOARD","COMPONENT LAB"]}/>
869
+ <h1 style={{ fontSize:22, fontWeight:700, letterSpacing:"0.18em", textTransform:"uppercase",
870
+ fontFamily:"var(--font)", marginTop:8, lineHeight:1, color:"var(--w-100)" }}>TICKETPUNCH UI</h1>
871
+ <div style={{ fontSize:8, letterSpacing:"0.28em", color:"var(--g-700)", textTransform:"uppercase",
872
+ fontFamily:"var(--font)", marginTop:6 }}>
873
+ DESIGN SYSTEM — OMEGA CLASSIFICATION — BUILD 2047.03.12
874
+ </div>
875
+ </div>
876
+ <div style={{ display:"flex", gap:8, alignItems:"center" }}>
877
+ <StatusPill status="active" label="ALL SYSTEMS GO"/>
878
+ <Button variant="outline" size="sm">EXPORT</Button>
879
+ </div>
880
+ </div>
881
+
882
+ {/* STAT CARDS */}
883
+ <SectionLabel sub="// REAL-TIME METRICS — CLASSIFIED">SYSTEM OVERVIEW</SectionLabel>
884
+ <div style={{ display:"grid", gridTemplateColumns:"repeat(4, 1fr)", gap:12, marginBottom:28 }}>
885
+ <StatCard label="ACTIVE NODES" value="847" change="+12 TODAY" trend="up"/>
886
+ <StatCard label="THREAT LEVEL" value="2.7" unit="%" change="-0.4 DELTA" trend="down"/>
887
+ <StatCard label="DATA STREAMS" value="1.4" unit="TB" change="+0.2 TB" trend="up"/>
888
+ <StatCard label="UPTIME" value="99.9" unit="%" change="NOMINAL" trend="neutral"/>
889
+ </div>
890
+
891
+ {/* MAIN TICKET CARD */}
892
+ <SectionLabel sub="// TICKET SHELL — PRIMARY CONTAINER">CLASSIFIED INTEL BRIEF</SectionLabel>
893
+ <div style={{ marginBottom:28 }}>
894
+ <TicketShell stubHeight={68}>
895
+ <div style={{ padding:"28px 24px 80px", position:"relative", zIndex:8 }}>
896
+ <div style={{ display:"flex", gap:20, alignItems:"flex-start" }}>
897
+ <TerminalMask size={100}/>
898
+ <div style={{ flex:1 }}>
899
+ <div style={{ fontSize:7, letterSpacing:"0.34em", color:"var(--g-700)",
900
+ textTransform:"uppercase", fontFamily:"var(--font)", marginBottom:6 }}>
901
+ // OMEGA-NEXUS // DIRECTIVE 7749 // CLASSIFIED
902
+ </div>
903
+ <h2 style={{ fontSize:18, fontWeight:700, letterSpacing:"0.18em", textTransform:"uppercase",
904
+ fontFamily:"var(--font)", marginBottom:10, lineHeight:1.2, color:"var(--g-300)" }}>
905
+ OPERATION<br/>BLACKOUT
906
+ </h2>
907
+ <p style={{ fontSize:8.5, color:"var(--w-500)", lineHeight:1.8,
908
+ letterSpacing:"0.12em", fontFamily:"var(--font)", maxWidth:420 }}>
909
+ AUTHORIZED PERSONNEL ONLY. MISSION PARAMETERS LOCKED PENDING CLEARANCE VERIFICATION.
910
+ ALL COMMUNICATION ENCRYPTED VIA NEXUS-PROTOCOL AES-512.
911
+ </p>
912
+ <div style={{ marginTop:14, display:"flex", gap:8, flexWrap:"wrap" }}>
913
+ <Badge variant="omega">OMEGA-7</Badge>
914
+ <Badge variant="danger">TOP SECRET</Badge>
915
+ <Badge variant="warning">ACTIVE</Badge>
916
+ <Badge>NEXUS-PROTOCOL</Badge>
917
+ </div>
918
+ </div>
919
+ <div style={{ display:"flex", flexDirection:"column", gap:10, alignItems:"flex-end" }}>
920
+ <Barcode value="OP-7749-BX-OMEGA" width={130} height={36}/>
921
+ <Micro color="var(--g-700)">ISSUED: 2047.03.12</Micro>
922
+ </div>
923
+ </div>
924
+ </div>
925
+ <div style={{ position:"absolute", bottom:0, left:0, right:0, height:68, padding:"0 24px",
926
+ display:"flex", alignItems:"center", justifyContent:"space-between", zIndex:8 }}>
927
+ <Micro color="var(--g-700)">REF: NEXUS-OP-7749</Micro>
928
+ <div style={{ display:"flex", gap:16 }}>
929
+ <StatusPill status="active" label="MISSION ACTIVE"/>
930
+ <StatusPill status="warning" label="HIGH RISK"/>
931
+ </div>
932
+ </div>
933
+ </TicketShell>
934
+ </div>
935
+
936
+ {/* TABS + TABLE */}
937
+ <SectionLabel sub="// DATA MANAGEMENT INTERFACE">INTEL DATABASE</SectionLabel>
938
+ <div style={{ marginBottom:28 }}>
939
+ <Card>
940
+ <Tabs tabs={["AGENTS","MISSIONS","ASSETS","THREATS"]} active={activeTab} onSelect={setActiveTab}/>
941
+ <div style={{ marginTop:16 }}>
942
+ <DataTable
943
+ columns={["AGENT ID","STATUS","CLEARANCE","ASSIGNMENT","LAST ACTIVE"]}
944
+ rows={[
945
+ ["AGT-001 SPECTRE", <Badge variant="active">ACTIVE</Badge>, "OMEGA", "OP-7749", "0:04:22 AGO"],
946
+ ["AGT-002 PHANTOM", <Badge variant="warning">STANDBY</Badge>, "DELTA", "OP-7700", "2:14:07 AGO"],
947
+ ["AGT-003 WRAITH", <Badge variant="danger">COMPROMISED</Badge>, "GAMMA", "—", "6:55:13 AGO"],
948
+ ["AGT-004 NEXUS", <Badge>OFFLINE</Badge>, "ALPHA", "OP-7801", "1D 04H AGO"],
949
+ ]}
950
+ />
951
+ </div>
952
+ </Card>
953
+ </div>
954
+
955
+ {/* BUTTONS */}
956
+ <SectionLabel sub="// INTERACTION PRIMITIVES">BUTTON SYSTEM</SectionLabel>
957
+ <div style={{ marginBottom:28 }}>
958
+ <Card title="BUTTON VARIANTS" sub="ALL STATES + SIZES">
959
+ <div style={{ display:"flex", flexWrap:"wrap", gap:8, marginBottom:16 }}>
960
+ <Button variant="primary">EXECUTE</Button>
961
+ <Button variant="secondary">STANDBY</Button>
962
+ <Button variant="outline">CONFIRM</Button>
963
+ <Button variant="ghost">DISMISS</Button>
964
+ <Button variant="danger">ABORT</Button>
965
+ <Button variant="success">SECURE</Button>
966
+ <Button variant="primary" disabled>LOCKED</Button>
967
+ <Button variant="outline" size="sm">SMALL</Button>
968
+ <Button variant="primary" size="lg">LAUNCH SEQUENCE</Button>
969
+ <Tooltip label="OMEGA CLASSIFIED FUNCTION">
970
+ <Button variant="secondary" icon="◈">WITH ICON</Button>
971
+ </Tooltip>
972
+ </div>
973
+ <Divider label="ICON VARIANTS"/>
974
+ <div style={{ display:"flex", gap:8, marginTop:12 }}>
975
+ {["◈","◉","▣","◆","⊕"].map((icon,i) => (
976
+ <Button key={i} variant="secondary" size="sm" icon={icon}>{icon==="⊕"?"ADD":""}</Button>
977
+ ))}
978
+ </div>
979
+ </Card>
980
+ </div>
981
+
982
+ {/* FORM ELEMENTS */}
983
+ <SectionLabel sub="// DATA ENTRY SYSTEM">FORM ELEMENTS</SectionLabel>
984
+ <div style={{ display:"grid", gridTemplateColumns:"1fr 1fr", gap:16, marginBottom:28 }}>
985
+ <Card title="TEXT INPUTS" sub="TERMINAL STYLE">
986
+ <div style={{ display:"flex", flexDirection:"column", gap:14 }}>
987
+ <Input label="AGENT ID" placeholder="ENTER AGENT IDENTIFIER"
988
+ value={inputVal} onChange={e => setInputVal(e.target.value)} hint="FORMAT: AGT-XXX-CLEARANCE"/>
989
+ <Input label="AUTHORIZATION CODE" placeholder="••••••••" type="password"/>
990
+ <Input label="COORDINATES" placeholder="00.000000, 00.000000" prefix="GEO" suffix="WGS84"/>
991
+ <Fieldset legend="COMMS CHANNEL">
992
+ <Input label="FREQUENCY" placeholder="XXX.XXXXX MHZ" prefix="RF"/>
993
+ <Toggle checked={toggleA} onChange={() => setToggleA(!toggleA)} label="ENCRYPTION ENABLED"/>
994
+ </Fieldset>
995
+ </div>
996
+ </Card>
997
+ <Card title="SELECTORS + TOGGLES" sub="CONTROL ELEMENTS">
998
+ <div style={{ display:"flex", flexDirection:"column", gap:14 }}>
999
+ <Select label="CLEARANCE LEVEL" options={["ALPHA","BETA","GAMMA","DELTA","OMEGA"]}
1000
+ value={selectVal} onChange={setSelectVal}/>
1001
+ <Select label="MISSION STATUS" options={["ACTIVE","STANDBY","COMPLETED","ABORT","CLASSIFIED"]}
1002
+ value="" onChange={() => {}}/>
1003
+ <Divider label="TOGGLES"/>
1004
+ <Toggle checked={toggleA} onChange={() => setToggleA(!toggleA)} label="ACTIVE SURVEILLANCE"/>
1005
+ <Toggle checked={toggleB} onChange={() => setToggleB(!toggleB)} label="STEALTH MODE"/>
1006
+ <Toggle checked={true} onChange={() => {}} label="ENCRYPTION LAYER"/>
1007
+ <Divider/>
1008
+ <div>
1009
+ <Micro color="var(--g-500)">PROGRESS INDICATORS</Micro>
1010
+ <div style={{ marginTop:10, display:"flex", flexDirection:"column", gap:10 }}>
1011
+ <ProgressBar value={87} label="UPLINK SYNC" color="var(--g-300)"/>
1012
+ <ProgressBar value={44} label="THREAT SCAN" color="var(--p-500)"/>
1013
+ <ProgressBar value={12} label="BREACH RISK" color="var(--r-500)"/>
1014
+ </div>
1015
+ </div>
1016
+ </div>
1017
+ </Card>
1018
+ </div>
1019
+
1020
+ {/* STATUS + BADGES */}
1021
+ <SectionLabel sub="// CLASSIFICATION LABELS">STATUS SYSTEM</SectionLabel>
1022
+ <div style={{ marginBottom:28 }}>
1023
+ <Card title="BADGES + STATUS PILLS" sub="ALL VARIANTS">
1024
+ <div style={{ display:"flex", flexWrap:"wrap", gap:8, marginBottom:16 }}>
1025
+ <StatusPill status="active"/>
1026
+ <StatusPill status="inactive" label="OFFLINE"/>
1027
+ <StatusPill status="warning" label="STANDBY"/>
1028
+ <StatusPill status="danger" label="BREACH"/>
1029
+ <StatusPill status="pending" label="SYNCING"/>
1030
+ </div>
1031
+ <Divider label="BADGES"/>
1032
+ <div style={{ display:"flex", flexWrap:"wrap", gap:6, marginTop:12 }}>
1033
+ <Badge variant="omega">OMEGA</Badge>
1034
+ <Badge variant="active">ACTIVE</Badge>
1035
+ <Badge variant="danger">COMPROMISED</Badge>
1036
+ <Badge variant="warning">ALERT</Badge>
1037
+ <Badge>DEFAULT</Badge>
1038
+ <Badge>CLASSIFIED</Badge>
1039
+ <Badge>NEXUS</Badge>
1040
+ </div>
1041
+ </Card>
1042
+ </div>
1043
+
1044
+ {/* ACCORDION + STEPPER */}
1045
+ <div style={{ display:"grid", gridTemplateColumns:"1fr 1fr", gap:16, marginBottom:28 }}>
1046
+ <div>
1047
+ <SectionLabel sub="// COLLAPSIBLE SECTIONS">ACCORDION</SectionLabel>
1048
+ <Card>
1049
+ <AccordionItem title="MISSION PARAMETERS">
1050
+ PRIMARY OBJECTIVE: INFILTRATE NEXUS SIGMA NODE. SECONDARY: EXTRACT DATA PACKAGE DELTA-7.
1051
+ ABORT CODE: 4419-OMEGA. DURATION: 72H MAX.
1052
+ </AccordionItem>
1053
+ <AccordionItem title="AGENT DOSSIER">
1054
+ AGENT: SPECTRE-9 // RANK: SENIOR OPERATIVE // CLEARANCE: OMEGA //
1055
+ STATUS: FIELD ACTIVE // DEPLOYMENTS: 47 COMPLETED.
1056
+ </AccordionItem>
1057
+ <AccordionItem title="CLASSIFIED INTEL">
1058
+ [REDACTED — CLEARANCE LEVEL OMEGA REQUIRED. CONTACT DIVISION COMMANDER FOR ACCESS CREDENTIALS.]
1059
+ </AccordionItem>
1060
+ </Card>
1061
+ </div>
1062
+ <div>
1063
+ <SectionLabel sub="// MISSION PROGRESS WIZARD">STEPPER</SectionLabel>
1064
+ <Card>
1065
+ <Stepper steps={["BRIEF","DEPLOY","ACTIVE","EXTRACT","DEBRIEF"]} current={2}/>
1066
+ <div style={{ marginTop:20 }}>
1067
+ <Divider label="CURRENT PHASE"/>
1068
+ <div style={{ marginTop:12, padding:"12px", border:"1px solid var(--g-900)", position:"relative" }}>
1069
+ <div style={{ fontSize:7, letterSpacing:"0.28em", color:"var(--g-300)",
1070
+ fontFamily:"var(--font)", textTransform:"uppercase", marginBottom:6 }}>▶ PHASE 3: ACTIVE DEPLOYMENT</div>
1071
+ <div style={{ fontSize:8, color:"var(--w-500)", lineHeight:1.7, letterSpacing:"0.12em", fontFamily:"var(--font)" }}>
1072
+ AGENT SPECTRE-9 IS CURRENTLY ACTIVE IN THE FIELD. ALL VITALS NOMINAL.
1073
+ COMMS ENCRYPTED. ETA TO OBJECTIVE: 04:22:11.
1074
+ </div>
1075
+ </div>
1076
+ </div>
1077
+ </Card>
1078
+ </div>
1079
+ </div>
1080
+
1081
+ {/* ALERTS + LOADER */}
1082
+ <SectionLabel sub="// SYSTEM NOTIFICATIONS">ALERTS + LOADERS</SectionLabel>
1083
+ <div style={{ display:"grid", gridTemplateColumns:"1fr 1fr", gap:16, marginBottom:28 }}>
1084
+ <div style={{ display:"flex", flexDirection:"column", gap:8 }}>
1085
+ <Alert type="success" title="OPERATION SECURED"
1086
+ message="NEXUS NODE ALPHA SECURED. ALL OBJECTIVES COMPLETE. EXTRACTION CONFIRMED."/>
1087
+ <Alert type="warning" title="SIGNAL INTERFERENCE"
1088
+ message="COMMS DEGRADED ON CHANNEL 7. SWITCHING TO BACKUP FREQUENCY 449.7750 MHZ."/>
1089
+ <Alert type="danger" title="BREACH DETECTED"
1090
+ message="UNAUTHORIZED ACCESS ATTEMPT — NODE SIGMA. LOCKDOWN INITIATED. STANDBY." onClose={() => {}}/>
1091
+ <Alert type="info" title="ROUTINE SCAN COMPLETE"
1092
+ message="ALL SYSTEMS NOMINAL. NEXT SCHEDULED SWEEP IN 04:00:00."/>
1093
+ </div>
1094
+ <Card title="SYSTEM STATES" sub="LOADING INDICATORS">
1095
+ <div style={{ display:"flex", gap:20, alignItems:"center", justifyContent:"center", padding:20 }}>
1096
+ {[["SMALL",28],["MEDIUM",44],["LARGE",64]].map(([lbl,sz]) => (
1097
+ <div key={lbl} style={{ display:"flex", flexDirection:"column", alignItems:"center", gap:8 }}>
1098
+ <Spinner size={sz}/><Micro color="var(--g-500)">{lbl}</Micro>
1099
+ </div>
1100
+ ))}
1101
+ </div>
1102
+ <Divider label="AVATARS"/>
1103
+ <div style={{ display:"flex", gap:10, marginTop:12, alignItems:"center" }}>
1104
+ <Avatar initials="Ω" status="active"/>
1105
+ <Avatar initials="Σ" status="active"/>
1106
+ <Avatar initials="Δ"/>
1107
+ <Avatar initials="Γ"/>
1108
+ <div style={{ flex:1 }}>
1109
+ <div style={{ fontSize:8.5, letterSpacing:"0.16em", fontFamily:"var(--font)", color:"var(--g-300)" }}>OMEGA TEAM</div>
1110
+ <div style={{ fontSize:7, letterSpacing:"0.18em", color:"var(--g-700)", fontFamily:"var(--font)",
1111
+ textTransform:"uppercase", marginTop:2 }}>4 AGENTS // 2 ACTIVE</div>
1112
+ </div>
1113
+ </div>
1114
+ </Card>
1115
+ </div>
1116
+
1117
+ {/* MODAL TRIGGER */}
1118
+ <SectionLabel sub="// OVERLAY SYSTEM">MODAL SYSTEM</SectionLabel>
1119
+ <div style={{ marginBottom:28 }}>
1120
+ <Card title="MODAL TRIGGER" sub="TICKET-SHELL OVERLAY">
1121
+ <div style={{ display:"flex", gap:8, alignItems:"center" }}>
1122
+ <Button variant="outline" onClick={() => setModalOpen(true)}>OPEN CLASSIFIED BRIEF</Button>
1123
+ <Tooltip label="OPENS A FULL TICKET-SHELL MODAL">
1124
+ <Button variant="ghost" icon="◈"/>
1125
+ </Tooltip>
1126
+ </div>
1127
+ </Card>
1128
+ </div>
1129
+
1130
+ {/* TYPOGRAPHY */}
1131
+ <SectionLabel sub="// IBM PLEX MONO TYPE SYSTEM">TYPOGRAPHY</SectionLabel>
1132
+ <div style={{ marginBottom:28 }}>
1133
+ <Card title="TYPE SCALE + WEIGHTS">
1134
+ <div style={{ display:"flex", flexDirection:"column", gap:6 }}>
1135
+ {[
1136
+ { size:22, weight:700, text:"DISPLAY — OMEGA PROTOCOL", color:"var(--g-300)" },
1137
+ { size:16, weight:700, text:"H1 — CLASSIFIED DIRECTIVE", color:"var(--w-100)" },
1138
+ { size:13, weight:600, text:"H2 — NEXUS SYSTEM HEADER", color:"var(--w-200)" },
1139
+ { size:11, weight:600, text:"H3 — OPERATION BRIEFING", color:"var(--w-300)" },
1140
+ { size:9.5, weight:500, text:"H4 — SUBHEADING ALPHA", color:"var(--w-300)" },
1141
+ { size:8.5, weight:400, text:"BODY — STANDARD INTEL REPORT BODY TEXT FOR EXTENDED BRIEFINGS", color:"var(--w-400)" },
1142
+ { size:7.5, weight:400, text:"SMALL — SECONDARY SUPPORT LABELS AND DESCRIPTORS", color:"var(--w-500)" },
1143
+ { size:7, weight:400, text:"MICRO — OMEGA-7749 // COPYRIGHT NEXUS DIVISION // CLEARANCE REQUIRED", color:"var(--g-700)" },
1144
+ ].map((t,i) => (
1145
+ <div key={i} style={{ display:"flex", alignItems:"baseline", gap:16,
1146
+ borderBottom: i<7 ? "1px solid var(--border-1)" : "none", paddingBottom:6 }}>
1147
+ <span style={{ fontSize:7, color:"var(--g-700)", width:28, fontFamily:"var(--font)", letterSpacing:"0.1em" }}>{t.size}PX</span>
1148
+ <span style={{ fontSize:t.size, fontWeight:t.weight, letterSpacing:"0.14em",
1149
+ textTransform:"uppercase", fontFamily:"var(--font)", color:t.color }}>{t.text}</span>
1150
+ </div>
1151
+ ))}
1152
+ </div>
1153
+ </Card>
1154
+ </div>
1155
+
1156
+ {/* COLOR PALETTE */}
1157
+ <SectionLabel sub="// DESIGN TOKENS — COLOR SYSTEM">COLOR PALETTE</SectionLabel>
1158
+ <div style={{ marginBottom:28 }}>
1159
+ <Card title="TOKEN PALETTE" sub="TICKETPUNCH DESIGN LANGUAGE">
1160
+ <div style={{ display:"grid", gridTemplateColumns:"repeat(5, 1fr)", gap:8 }}>
1161
+ {[
1162
+ { scheme:"DARK", name:"D-900", val:"#060606" },
1163
+ { scheme:"DARK", name:"D-800", val:"#0A0A0A" },
1164
+ { scheme:"DARK", name:"D-700", val:"#0f0f0f" },
1165
+ { scheme:"DARK", name:"D-600", val:"#1e1e1e" },
1166
+ { scheme:"DARK", name:"D-500", val:"#2a2a2a" },
1167
+ { scheme:"WHITE", name:"W-100", val:"#FFFFFF" },
1168
+ { scheme:"WHITE", name:"W-200", val:"#EFEFEF" },
1169
+ { scheme:"WHITE", name:"W-300", val:"#CDCDCD" },
1170
+ { scheme:"WHITE", name:"W-400", val:"#AAAAAA" },
1171
+ { scheme:"WHITE", name:"W-500", val:"#888888" },
1172
+ { scheme:"GOLD", name:"G-100", val:"#FFF4CC" },
1173
+ { scheme:"GOLD", name:"G-300", val:"#FFD700" },
1174
+ { scheme:"GOLD", name:"G-500", val:"#C8960C" },
1175
+ { scheme:"GOLD", name:"G-700", val:"#7A5800" },
1176
+ { scheme:"GOLD", name:"G-900", val:"#3D2C00" },
1177
+ { scheme:"RED", name:"R-100", val:"#FFE5E5" },
1178
+ { scheme:"RED", name:"R-300", val:"#FF6666" },
1179
+ { scheme:"RED", name:"R-500", val:"#FF3333" },
1180
+ { scheme:"RED", name:"R-700", val:"#CC0000" },
1181
+ { scheme:"RED", name:"R-900", val:"#550000" },
1182
+ { scheme:"PEACH", name:"P-100", val:"#FFF0EB" },
1183
+ { scheme:"PEACH", name:"P-300", val:"#FFBFA8" },
1184
+ { scheme:"PEACH", name:"P-500", val:"#FF8C69" },
1185
+ { scheme:"PEACH", name:"P-700", val:"#C45A35" },
1186
+ { scheme:"PEACH", name:"P-900", val:"#5C2010" },
1187
+ ].map((c,i) => (
1188
+ <div key={i} style={{ display:"flex", flexDirection:"column", gap:4 }}>
1189
+ {i%5===0 && (
1190
+ <div style={{ fontSize:6.5, letterSpacing:"0.22em", color:"var(--w-400)",
1191
+ fontFamily:"var(--font)", textTransform:"uppercase", marginBottom:2, fontWeight:600 }}>{c.scheme}</div>
1192
+ )}
1193
+ {i%5!==0 && <div style={{ height:15 }}/>}
1194
+ <div style={{ height:32, background:c.val, border:"1px solid var(--border-1)",
1195
+ boxShadow:["GOLD","RED","PEACH"].includes(c.scheme) ? `0 0 10px ${c.val}55` : "none" }}/>
1196
+ <div style={{ fontSize:6.5, letterSpacing:"0.18em", color:"var(--w-500)",
1197
+ fontFamily:"var(--font)", textTransform:"uppercase" }}>{c.name}</div>
1198
+ <div style={{ fontSize:6, letterSpacing:"0.12em", color:"var(--g-700)", fontFamily:"var(--font)" }}>{c.val}</div>
1199
+ </div>
1200
+ ))}
1201
+ </div>
1202
+ </Card>
1203
+ </div>
1204
+
1205
+ {/* PRIMITIVES */}
1206
+ <SectionLabel sub="// CORE VISUAL PRIMITIVES">DESIGN PRIMITIVES</SectionLabel>
1207
+ <div style={{ display:"grid", gridTemplateColumns:"repeat(3, 1fr)", gap:16, marginBottom:28 }}>
1208
+ <Card title="GRAIN OVERLAY" sub="STATIC NOISE TEXTURE" style={{ minHeight:120 }}>
1209
+ <div style={{ display:"flex", flexDirection:"column", gap:6 }}>
1210
+ {[0.08,0.18,0.28].map((s,i) => (
1211
+ <div key={i} style={{ position:"relative", height:28, background:"var(--header)", border:"1px solid var(--border-1)" }}>
1212
+ <GrainOverlay strength={s}/>
1213
+ <div style={{ position:"absolute", inset:0, display:"flex", alignItems:"center", justifyContent:"center", zIndex:7 }}>
1214
+ <Micro color="var(--g-500)">{(s*100).toFixed(0)}% STRENGTH</Micro>
1215
+ </div>
1216
+ </div>
1217
+ ))}
1218
+ </div>
1219
+ </Card>
1220
+ <Card title="BARCODES" sub="GENERATIVE PATTERN">
1221
+ <div style={{ display:"flex", flexDirection:"column", gap:10 }}>
1222
+ <Barcode value="OMEGA-7749-XX" width={160} height={32}/>
1223
+ <Barcode value="NEXUS-ALPHA-01" width={160} height={20}/>
1224
+ <Barcode value="CLASSIFIED" width={160} height={14}/>
1225
+ </div>
1226
+ </Card>
1227
+ <Card title="TERMINAL MASK" sub="SCROLLING INTEL FEED">
1228
+ <div style={{ display:"flex", gap:12, justifyContent:"center" }}>
1229
+ <TerminalMask size={90}/><TerminalMask size={70}/>
1230
+ </div>
1231
+ </Card>
1232
+ </div>
1233
+
1234
+ <Footer/>
1235
+ </div>
1236
+ </div>
1237
+ </div>
1238
+
1239
+ <Modal open={modalOpen} onClose={() => setModalOpen(false)} title="CLASSIFIED DIRECTIVE">
1240
+ <p style={{ marginBottom:12 }}>
1241
+ THIS DOCUMENT CONTAINS INFORMATION OF THE HIGHEST CLASSIFICATION.
1242
+ UNAUTHORIZED DISCLOSURE IS A VIOLATION OF NEXUS PROTOCOL ARTICLE 7-OMEGA.
1243
+ </p>
1244
+ <p>
1245
+ OPERATION BLACKOUT IS AUTHORIZED BY DIVISION COMMANDER NEXUS-1.
1246
+ ALL AGENTS MUST CONFIRM RECEIPT VIA SECURE CHANNEL BEFORE DEPLOYMENT.
1247
+ </p>
1248
+ <div style={{ marginTop:16 }}>
1249
+ <Barcode value="DIRECTIVE-4419-OMEGA" width={160} height={24}/>
1250
+ </div>
1251
+ </Modal>
1252
+ </div>
1253
+ );
1254
+ }
TicketUI_small.txt ADDED
File without changes