MatteoScript commited on
Commit
2cbe8b1
·
verified ·
1 Parent(s): 8ea1823

Update index.html

Browse files
Files changed (1) hide show
  1. index.html +41 -1148
index.html CHANGED
@@ -3,1173 +3,66 @@
3
  <head>
4
  <meta charset="UTF-8" />
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
6
- <title>Matteo Bergamelli | Innovation Lab Candidate</title>
7
-
8
- <!-- Tailwind CSS -->
9
- <script src="https://cdn.tailwindcss.com"></script>
10
-
11
- <!-- Fonts (Manteniamo i tuoi font originali) -->
12
- <link rel="preconnect" href="https://fonts.googleapis.com">
13
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
14
- <link href="https://fonts.googleapis.com/css2?family=Playfair+Display:wght@400;700&family=Fira+Code:wght@300;400;500;700&display=swap" rel="stylesheet">
15
-
16
- <!-- Three.js -->
17
- <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
18
 
19
- <!-- A-Frame & MindAR -->
20
- <script src="https://aframe.io/releases/1.2.0/aframe.min.js"></script>
21
- <script src="https://cdn.jsdelivr.net/gh/hiukim/mind-ar-js@1.1.5/dist/mindar-image.prod.js"></script>
22
- <script src="https://cdn.jsdelivr.net/gh/hiukim/mind-ar-js@1.1.5/dist/mindar-image-aframe.prod.js"></script>
23
 
24
  <style>
25
- /* --- STILE ORIGINALE --- */
26
- :root {
27
- --neon-green: #00ff41;
28
- --dark-bg: #050505;
29
- --glass: rgba(10, 10, 10, 0.8);
30
- }
31
-
32
- body {
33
- margin: 0;
34
- background-color: var(--dark-bg);
35
- color: #f5f5f5;
36
- font-family: 'Fira Code', monospace;
37
- overflow-x: hidden;
38
- -webkit-font-smoothing: antialiased;
39
- cursor: default;
40
- touch-action: manipulation;
41
- }
42
-
43
- /* Typography */
44
- .font-serif { font-family: 'Playfair Display', serif; }
45
- .font-mono { font-family: 'Fira Code', monospace; }
46
-
47
- /* Selection Style (Nerd touch) */
48
- ::selection {
49
- background: var(--neon-green);
50
- color: #000;
51
- }
52
-
53
- /* Scrollbar */
54
- ::-webkit-scrollbar { width: 8px; }
55
- ::-webkit-scrollbar-track { background: #0a0a0a; }
56
- ::-webkit-scrollbar-thumb { background: #333; border-radius: 4px; }
57
- ::-webkit-scrollbar-thumb:hover { background: var(--neon-green); }
58
-
59
- /* --- FX: SCANLINES & CRT --- */
60
- .scanlines {
61
- background: linear-gradient(
62
- to bottom,
63
- rgba(255,255,255,0),
64
- rgba(255,255,255,0) 50%,
65
- rgba(0,0,0,0.14) 50%, /* Opacità ridotta da 0.2 a 0.14 */
66
- rgba(0,0,0,0.14) /* Opacità ridotta da 0.2 a 0.14 */
67
- );
68
- background-size: 100% 4px;
69
- position: fixed; pointer-events: none; top: 0; left: 0; right: 0; bottom: 0; z-index: 50;
70
- }
71
-
72
- /* --- FX: GLITCH TEXT --- */
73
- .glitch-wrapper { position: relative; display: inline-block; }
74
- .glitch { position: relative; color: inherit; }
75
- .glitch::before, .glitch::after {
76
- content: attr(data-text); position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: var(--dark-bg);
77
- }
78
- .glitch::before {
79
- left: 2px; text-shadow: -1px 0 var(--neon-green); clip: rect(24px, 550px, 90px, 0);
80
- animation: glitch-anim 3s infinite linear alternate-reverse;
81
- }
82
- .glitch::after {
83
- left: -2px; text-shadow: -1px 0 #ff00ff; clip: rect(85px, 550px, 140px, 0);
84
- animation: glitch-anim 2.5s infinite linear alternate-reverse;
85
- }
86
- @keyframes glitch-anim {
87
- 0% { clip: rect(10px, 9999px, 30px, 0); }
88
- 20% { clip: rect(80px, 9999px, 100px, 0); }
89
- 40% { clip: rect(40px, 9999px, 60px, 0); }
90
- 60% { clip: rect(20px, 9999px, 100px, 0); }
91
- 80% { clip: rect(90px, 9999px, 5px, 0); }
92
- 100% { clip: rect(10px, 9999px, 60px, 0); }
93
- }
94
-
95
- /* --- FX: RIPPLE CLICK --- */
96
- .ripple {
97
- position: absolute;
98
- border-radius: 50%;
99
- border: 1px solid var(--neon-green);
100
- transform: scale(0);
101
- animation: ripple-anim 0.6s linear;
102
- pointer-events: none;
103
- z-index: 999;
104
- }
105
- @keyframes ripple-anim {
106
- to { transform: scale(4); opacity: 0; }
107
- }
108
-
109
- /* --- FX: MATRIX RAIN (Easter Egg) --- */
110
- #matrix-canvas {
111
- position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: 40;
112
- opacity: 0; pointer-events: none; transition: opacity 1s;
113
- }
114
- .matrix-active #matrix-canvas { opacity: 0.3; }
115
-
116
- /* --- ANIMATIONS --- */
117
- .reveal-on-scroll {
118
- opacity: 0; transform: translateY(30px); transition: opacity 0.8s ease-out, transform 0.8s ease-out;
119
- }
120
- .reveal-on-scroll.visible { opacity: 1; transform: translateY(0); }
121
-
122
- .blink { animation: blink-anim 1s step-end infinite; }
123
- @keyframes blink-anim { 50% { opacity: 0; } }
124
-
125
- /* AR UI */
126
- #ar-container { display: none; }
127
- .mindar-ui-overlay { z-index: 1000 !important; }
128
  </style>
129
  </head>
130
  <body>
131
 
132
- <!-- EASTER EGG: MATRIX RAIN CANVAS -->
133
- <canvas id="matrix-canvas"></canvas>
134
-
135
- <!-- 1. TERMINAL LOADER -->
136
- <div id="terminal-loader" class="fixed inset-0 z-[100] flex items-center justify-center bg-black transition-opacity duration-500">
137
- <div class="w-full max-w-md p-6 font-mono text-sm md:text-base">
138
- <div id="terminal-lines"></div>
139
- <div class="mt-2">
140
- <span class="text-[#00ff41]">></span> <span class="inline-block w-3 h-5 bg-[#00ff41] align-middle blink"></span>
141
- </div>
142
- </div>
143
- </div>
144
-
145
- <!-- 2. 3D BACKGROUND (Digital Fabric) -->
146
- <div id="canvas-container" class="fixed inset-0 z-0 opacity-0 transition-opacity duration-1000"></div>
147
-
148
- <!-- 3. SCANLINES -->
149
- <div class="scanlines"></div>
150
-
151
- <!-- STATUS BAR (Fixed Top) -->
152
- <div id="status-bar" class="fixed top-0 w-full p-4 z-40 flex justify-between items-center pointer-events-none opacity-0 transition-opacity duration-1000 mix-blend-screen">
153
- <div class="text-[10px] text-[#00ff41] font-mono">SYS.STATUS: ONLINE</div>
154
- <div class="text-[10px] text-[#00ff41] font-mono">JOB_ID: <span id="job-id-scramble">XXXXXXXXX</span></div>
155
- </div>
156
-
157
- <!-- 4. MAIN CONTENT -->
158
- <div id="main-content" class="relative z-10 w-full h-full opacity-0 transition-opacity duration-1000">
159
-
160
- <!-- HERO SECTION -->
161
- <section class="min-h-screen flex flex-col items-center justify-center px-6 py-20 relative">
162
- <div class="max-w-4xl mx-auto text-center z-10">
163
- <div class="mb-8 hover:scale-105 transition-transform duration-500 cursor-default">
164
- <div class="glitch-wrapper font-serif text-5xl md:text-7xl font-bold mb-2 text-white">
165
- <span class="glitch" data-text="Physical Touch,">Physical Touch,</span>
166
- </div>
167
- <br>
168
- <div class="glitch-wrapper font-serif text-5xl md:text-7xl font-bold text-[#00ff41]">
169
- <span class="glitch" data-text="Digital Mind.">Digital Mind.</span>
170
- </div>
171
- </div>
172
-
173
- <p class="text-base md:text-xl leading-relaxed mb-12 max-w-2xl mx-auto font-mono opacity-80 reveal-on-scroll border-l-2 border-[#00ff41] pl-4 text-left md:text-center md:border-l-0 md:pl-0">
174
- Ciao, hai appena trasformato un pezzo di stoffa in un experience digitale.
175
- Questo è il mio concetto di <span class="text-[#00ff41] font-bold relative group cursor-help">
176
- Omnichannel
177
- <span class="absolute bottom-full left-1/2 -translate-x-1/2 mb-2 w-48 bg-black border border-[#00ff41] text-[#00ff41] text-[10px] p-2 opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none">
178
- (Spoiler: È la mia specialità)
179
- </span>
180
- </span>
181
- </p>
182
-
183
- <div class="flex flex-col items-center reveal-on-scroll group" style="transition-delay: 0.2s;">
184
- <div id="profile-pic" class="w-24 h-24 md:w-32 md:h-32 rounded-full border-2 border-[#00ff41] flex items-center justify-center bg-black/50 backdrop-blur-sm mb-4 shadow-[0_0_20px_rgba(0,255,65,0.3)] cursor-pointer transition-all hover:shadow-[0_0_40px_rgba(0,255,65,0.6)] active:scale-95">
185
- <span class="text-3xl font-bold text-[#00ff41] group-hover:animate-pulse">MB</span>
186
- </div>
187
- <h2 class="font-serif text-2xl md:text-3xl font-bold mb-1">Matteo Bergamelli</h2>
188
- <p class="text-[#00ff41] text-xs md:text-sm font-mono tracking-wider mb-2">INNOVATION / AI DEVELOPER</p>
189
- <span class="px-3 py-1 border border-[#00ff41]/50 rounded-full text-[10px] text-[#00ff41] bg-[#00ff41]/10">
190
- 📍 Padenghe sul Garda (BS)
191
- </span>
192
- </div>
193
- </div>
194
- </section>
195
-
196
- <!-- FABRIC DECODER SECTION -->
197
- <section class="px-6 py-24 relative z-10">
198
- <div class="max-w-5xl mx-auto">
199
- <div class="mb-16 text-center reveal-on-scroll">
200
- <div class="inline-flex items-center gap-2 px-3 py-1 rounded border border-[#00ff41]/30 bg-[#00ff41]/5 mb-4 backdrop-blur-sm">
201
- <span class="w-2 h-2 bg-[#00ff41] rounded-full animate-pulse"></span>
202
- <span class="text-[10px] text-[#00ff41] font-mono tracking-widest uppercase">Tecnical Background</span>
203
- </div>
204
-
205
- <h2 class="font-serif text-4xl md:text-5xl font-bold mb-4">
206
- The Fabric <span class="text-[#00ff41]">Decoder</span>
207
- </h2>
208
- <p class="font-mono text-sm opacity-60">
209
- // Tre tessuti. Tre layer tecnologici. Una sola visione.
210
- </p>
211
- </div>
212
-
213
- <div class="grid grid-cols-1 md:grid-cols-3 gap-8">
214
- <div class="fabric-card relative p-8 rounded-xl overflow-hidden group transition-all duration-300 backdrop-blur-md bg-[#0f0f0f]/80 border border-[#333] hover:border-[#00ff41]/50 hover:-translate-y-2 reveal-on-scroll">
215
- <div class="absolute inset-0 bg-gradient-to-r from-transparent via-[#00ff41]/5 to-transparent -translate-x-full group-hover:translate-x-full transition-transform duration-1000 ease-in-out pointer-events-none"></div>
216
-
217
- <div class="mb-6 pt-1">
218
- <div class="p-3 bg-black/50 rounded-lg border border-[#333] group-hover:border-[#00ff41] transition-colors w-min">
219
- <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="#00ff41" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="4" y="4" width="16" height="16" rx="2" ry="2"></rect><rect x="9" y="9" width="6" height="6"></rect><line x1="9" y1="1" x2="9" y2="4"></line><line x1="15" y1="1" x2="15" y2="4"></line><line x1="9" y1="20" x2="9" y2="23"></line><line x1="15" y1="20" x2="15" y2="23"></line></svg>
220
- </div>
221
- </div>
222
-
223
- <h3 class="font-serif text-2xl font-bold mb-2 text-white">STRUCTURAL CORE</h3>
224
- <p class="text-xs text-[#00ff41] mb-4 font-mono tracking-widest">COTONE TWILL / WEAVE</p>
225
-
226
- <p class="text-sm italic opacity-80 mb-6 font-serif border-l-2 border-[#333] pl-4 group-hover:border-[#00ff41] transition-colors">
227
- "Una trama diagonale fitta. Robusto. La spina dorsale su cui tutto si regge."
228
- </p>
229
-
230
- <ul class="space-y-3 mb-6 text-sm font-mono opacity-90">
231
- <li class="flex gap-2"><span class="text-[#00ff41]">→</span> <span><span class="text-[#00ff41] font-bold">13</span> anni di esperienza</span></li>
232
- <li class="flex gap-2"><span class="text-[#00ff41]">→</span> <span>ERP <span class="text-[#00ff41] font-bold">SAP</span> & <span class="text-[#00ff41] font-bold">Zucchetti</span></span></li>
233
- <li class="flex gap-2"><span class="text-[#00ff41]">→</span> <span><span class="text-[#00ff41] font-bold">Hardware</span> & OpcUa Integrator</span></li>
234
- <li class="flex gap-2"><span class="text-[#00ff41]">→</span> <span><span class="text-[#00ff41] font-bold">SQL</span> Server Expert</span></li>
235
- </ul>
236
- </div>
237
-
238
- <div class="fabric-card relative p-8 rounded-xl overflow-hidden group transition-all duration-300 backdrop-blur-md bg-[#0f0f0f]/80 border border-[#333] hover:border-[#00ff41]/50 hover:-translate-y-2 reveal-on-scroll" style="transition-delay: 0.2s;">
239
- <div class="absolute inset-0 bg-gradient-to-r from-transparent via-[#00ff41]/5 to-transparent -translate-x-full group-hover:translate-x-full transition-transform duration-1000 ease-in-out pointer-events-none"></div>
240
-
241
- <div class="mb-6 pt-1">
242
- <div class="p-3 bg-black/50 rounded-lg border border-[#333] group-hover:border-[#00ff41] transition-colors w-min">
243
- <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="#00ff41" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9.5 2A2.5 2.5 0 0 1 12 4.5v15a2.5 2.5 0 0 1-4.96.44 2.5 2.5 0 0 1-2.96-3.08 3 3 0 0 1-.34-5.58 2.5 2.5 0 0 1 1.32-4.24 2.5 2.5 0 0 1 1.98-3A2.5 2.5 0 0 1 9.5 2Z"></path><path d="M14.5 2A2.5 2.5 0 0 0 12 4.5v15a2.5 2.5 0 0 0 4.96.44 2.5 2.5 0 0 0 2.96-3.08 3 3 0 0 0 .34-5.58 2.5 2.5 0 0 0-1.32-4.24 2.5 2.5 0 0 0-1.98-3A2.5 2.5 0 0 0 14.5 2Z"></path></svg>
244
- </div>
245
- </div>
246
-
247
- <h3 class="font-serif text-2xl font-bold mb-2 text-white">FLUID INTELLIGENCE</h3>
248
- <p class="text-xs text-[#00ff41] mb-4 font-mono tracking-widest">NASTRO RASO / FLOW</p>
249
-
250
- <p class="text-sm italic opacity-80 mb-6 font-serif border-l-2 border-[#333] pl-4 group-hover:border-[#00ff41] transition-colors">
251
- "Liscio. Senza attrito. Dati che scorrono veloci come un nastro continuo."
252
- </p>
253
-
254
- <ul class="space-y-3 mb-6 text-sm font-mono opacity-90">
255
- <li class="flex gap-2"><span class="text-[#00ff41]">→</span> <span><span class="text-[#00ff41] font-bold">Python</span> Automation</span></li>
256
- <li class="flex gap-2"><span class="text-[#00ff41]">→</span> <span>Agenti AI <span class="text-[#00ff41] font-bold">multimodali</span></span></li>
257
- <li class="flex gap-2"><span class="text-[#00ff41]">→</span> <span><span class="text-[#00ff41] font-bold">RAG</span> su Knowledge Base</span></li>
258
- <li class="flex gap-2"><span class="text-[#00ff41]">→</span> <span><span class="text-[#00ff41] font-bold">PDF-to-JSON</span> Pipeline</span></li>
259
- </ul>
260
- </div>
261
-
262
- <div class="fabric-card relative p-8 rounded-xl overflow-hidden group transition-all duration-300 backdrop-blur-md bg-gradient-to-br from-[#1a1a1a]/90 to-[#0a0a0a]/90 border border-[#00ff41] hover:-translate-y-2 reveal-on-scroll" style="transition-delay: 0.4s;">
263
- <div class="absolute inset-0 bg-gradient-to-r from-transparent via-[#00ff41]/10 to-transparent -translate-x-full group-hover:translate-x-full transition-transform duration-1000 ease-in-out pointer-events-none"></div>
264
-
265
- <div class="mb-6 pt-1">
266
- <div class="p-3 bg-black/50 rounded-lg border border-[#00ff41] transition-colors w-min">
267
- <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="#00ff41" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M2 12h20"></path><path d="M2 12l5 5"></path><path d="M2 12l5-5"></path><rect x="5" y="2" width="14" height="20" rx="2" ry="2" opacity="0.5"></rect></svg>
268
- </div>
269
- </div>
270
-
271
- <h3 class="font-serif text-2xl font-bold mb-2 text-[#00ff41]">THE OMNICHANNEL</h3>
272
- <p class="text-xs text-[#00ff41] mb-4 font-mono tracking-widest">ORGANZA / SHEER</p>
273
-
274
- <p class="text-sm italic opacity-80 mb-6 font-serif border-l-2 border-[#333] pl-4 group-hover:border-[#00ff41] transition-colors">
275
- "Trasparenza strutturata. Vedere il digitale attraverso il fisico."
276
- </p>
277
-
278
- <ul class="space-y-3 mb-6 text-sm font-mono opacity-90">
279
- <li class="flex gap-2"><span class="text-[#00ff41]">→</span> <span>Middleware <span class="text-[#00ff41] font-bold">SAP con AI</span></span></li>
280
- <li class="flex gap-2"><span class="text-[#00ff41]">→</span> <span><span class="text-[#00ff41] font-bold"></span>HTML5, PoC <span class="text-[#00ff41] font-bold">Angular</span></span></li>
281
- <li class="flex gap-2"><span class="text-[#00ff41]">→</span> <span>Graphic & <span class="text-[#00ff41] font-bold">Meta</span> AR</span></li>
282
- <li class="flex gap-2"><span class="text-[#00ff41]">→</span> <span><span class="text-[#00ff41] font-bold">Physical</span> & <span class="text-[#00ff41] font-bold">Digital</span></span></li>
283
- </ul>
284
- <p class="text-xs mt-4 italic text-[#00ff41] font-bold">"Sposta questo tessuto e guarda cosa c'è sotto"</p>
285
- </div>
286
- </div>
287
- </div>
288
- </section>
289
-
290
-
291
- <section class="relative z-10 py-32 bg-[#030303] overflow-hidden border-t border-[#333]">
292
-
293
- <div class="absolute inset-0 pointer-events-none select-none opacity-20"
294
- style="background-image: url('data:image/svg+xml,%3Csvg width=%2780%27 height=%2780%27 viewBox=%270 0 80 80%27 xmlns=%27http://www.w3.org/2000/svg%27%3E%3Cg fill=%27none%27 fill-rule=%27evenodd%27%3E%3Cpath d=%27M11 11h1v1h-1v-1zm1 2h1v1h-1v-1zm-2 2h1v1h-1v-1zm10 10h1v1h-1v-1zm1 2h1v1h-1v-1zm-2 2h1v1h-1v-1zm10 10h1v1h-1v-1zm1 2h1v1h-1v-1zm-2 2h1v1h-1v-1zM11 51h1v1h-1v-1zm1 2h1v1h-1v-1zm-2 2h1v1h-1v-1zm10 10h1v1h-1v-1zm1 2h1v1h-1v-1zm-2 2h1v1h-1v-1zM51 11h1v1h-1v-1zm1 2h1v1h-1v-1zm-2 2h1v1h-1v-1zm10 10h1v1h-1v-1zm1 2h1v1h-1v-1zm-2 2h1v1h-1v-1zm10 10h1v1h-1v-1zm1 2h1v1h-1v-1zm-2 2h1v1h-1v-1zM51 51h1v1h-1v-1zm1 2h1v1h-1v-1zm-2 2h1v1h-1v-1zm10 10h1v1h-1v-1zm1 2h1v1h-1v-1zm-2 2h1v1h-1v-1z%27 fill=%27%2300ff41%27 fill-opacity=%270.4%27/%3E%3C/g%3E%3C/svg%3E');">
295
- </div>
296
- <div class="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[600px] h-[600px] bg-[#00ff41] rounded-full filter blur-[200px] opacity-5 animate-pulse pointer-events-none"></div>
297
-
298
- <div class="max-w-6xl mx-auto relative z-20 px-6">
299
-
300
- <div class="mb-16 text-center reveal-on-scroll">
301
- <div class="inline-flex items-center gap-2 px-3 py-1 rounded border border-[#00ff41]/30 bg-[#00ff41]/5 mb-4 backdrop-blur-sm">
302
- <span class="w-2 h-2 bg-[#00ff41] rounded-full animate-pulse"></span>
303
- <span class="text-[10px] text-[#00ff41] font-mono tracking-widest uppercase">Research & Development</span>
304
- </div>
305
- <h2 class="font-serif text-3xl md:text-5xl font-bold mb-4 text-white">
306
- Oniverse <span class="text-[#00ff41]">Prototyping</span>
307
- </h2>
308
- <p class="font-mono text-xs md:text-sm opacity-60 max-w-2xl mx-auto">
309
- // Architetture sperimentali per l'ecosistema Phygital.
310
- </p>
311
- </div>
312
-
313
- <div class="grid grid-cols-1 md:grid-cols-3 gap-8 relative">
314
-
315
- <svg class="hidden md:block absolute top-12 left-0 w-full h-full pointer-events-none z-0 opacity-20" xmlns="http://www.w3.org/2000/svg">
316
- <line x1="16%" y1="50%" x2="84%" y2="50%" stroke="#00ff41" stroke-width="1" stroke-dasharray="4,4"/>
317
- </svg>
318
-
319
- <div class="group relative rounded-2xl p-[1px] bg-gradient-to-b from-[#333] via-[#1a1a1a] to-black hover:from-[#00ff41] hover:via-[#00ff41]/50 hover:to-[#003300] transition-all duration-500 overflow-hidden reveal-on-scroll hover:-translate-y-2 hover:shadow-[0_10px_40px_-10px_rgba(0,255,65,0.2)] cursor-pointer active:scale-95">
320
- <div class="relative h-full bg-[#0a0a0a]/90 backdrop-blur-xl rounded-2xl p-8 flex flex-col z-10">
321
- <div class="absolute inset-0 bg-[url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgdmlld0JveD0iMCAwIDIwIDIwIj48cmVjdCB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBmaWxsPSIjMDBmZjQxIiBvcGFjaXR5PSIwLjEiLz48L3N2Zz4=')] opacity-20 pointer-events-none"></div>
322
-
323
- <div class="flex justify-between items-start mb-6">
324
- <div class="p-3 bg-[#00ff41]/10 rounded-xl border border-[#00ff41]/30 text-[#00ff41] group-hover:shadow-[0_0_20px_#00ff41] transition-shadow duration-500">
325
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M12 16v-4"/><path d="M12 8h.01"/></svg>
326
- </div>
327
- <span class="font-mono text-[9px] text-[#00ff41] tracking-widest opacity-60 border border-[#00ff41]/20 px-2 py-1 rounded-full bg-black/50">INITIATIVE: OMNICHANNEL</span>
328
- </div>
329
-
330
- <h3 class="font-serif text-xl font-bold text-white mb-2 group-hover:text-[#00ff41] transition-colors">PROJECT: STYLE_INTELLIGENCE</h3>
331
- <p class="text-gray-400 font-mono text-xs mb-6 leading-relaxed">
332
- Piattaforma di Hyper-Personalization Cross-Brand. Unisce AI armocromatica e Virtual Try-On.
333
- </p>
334
-
335
- <ul class="mt-auto space-y-3 font-mono text-xs text-gray-400">
336
- <li class="flex items-start gap-3 border-b border-[#333] pb-2 last:border-0 group-hover:border-[#00ff41]/30 transition-colors">
337
- <span class="text-[#00ff41] mt-0.5">▹</span>
338
- <div>
339
- <strong class="text-white block mb-0.5">Customer Identity Analysis</strong>
340
- Profilazione automatica (Armocromia) per upselling mirato tra brand (es. Intimissimi/Falconeri).
341
- </div>
342
- </li>
343
- <li class="flex items-start gap-3 border-b border-[#333] pb-2 last:border-0 group-hover:border-[#00ff41]/30 transition-colors">
344
- <span class="text-[#00ff41] mt-0.5">▹</span>
345
- <div>
346
- <strong class="text-white block mb-0.5">Generative Fitting Room</strong>
347
- Virtual Try-On su figura utente per abbattere i resi e aumentare il conversion rate.
348
- </div>
349
- </li>
350
- <li class="flex items-start gap-3 pb-2">
351
- <span class="text-[#00ff41] mt-0.5">▹</span>
352
- <div>
353
- <strong class="text-white block mb-0.5">Store Digital Extension</strong>
354
- Scan-to-Look: Il prodotto fisico in negozio genera contenuti video AI (Sora/Gemini) istantanei.
355
- </div>
356
- </li>
357
- </ul>
358
- </div>
359
- </div>
360
-
361
- <div class="group relative rounded-2xl p-[1px] bg-gradient-to-b from-[#333] via-[#1a1a1a] to-black hover:from-[#00ff41] hover:via-[#00ff41]/50 hover:to-[#003300] transition-all duration-500 overflow-hidden reveal-on-scroll hover:-translate-y-2 hover:shadow-[0_10px_40px_-10px_rgba(0,255,65,0.2)] cursor-pointer active:scale-95" style="transition-delay: 0.2s;">
362
- <div class="relative h-full bg-[#0a0a0a]/90 backdrop-blur-xl rounded-2xl p-8 flex flex-col z-10">
363
- <div class="absolute inset-0 bg-[url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgdmlld0JveD0iMCAwIDIwIDIwIj48cmVjdCB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBmaWxsPSIjMDBmZjQxIiBvcGFjaXR5PSIwLjEiLz48L3N2Zz4=')] opacity-20 pointer-events-none"></div>
364
-
365
- <div class="flex justify-between items-start mb-6">
366
- <div class="p-3 bg-[#00ff41]/10 rounded-xl border border-[#00ff41]/30 text-[#00ff41] group-hover:shadow-[0_0_20px_#00ff41] transition-shadow duration-500">
367
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M2 12h10"/><path d="M9 4v16"/><path d="M3 9l3 3-3 3"/><path d="M12 9l3 3-3 3"/></svg>
368
- </div>
369
- <span class="font-mono text-[9px] text-[#00ff41] tracking-widest opacity-60 border border-[#00ff41]/20 px-2 py-1 rounded-full bg-black/50">INITIATIVE: SUSTAINABILITY</span>
370
- </div>
371
-
372
- <h3 class="font-serif text-xl font-bold text-white mb-2 group-hover:text-[#00ff41] transition-colors">PROJECT: SMART_PRODUCT_LINK</h3>
373
- <p class="text-gray-400 font-mono text-xs mb-6 leading-relaxed">
374
- Trasformazione dell'oggetto fisico (Loyalty) in un touchpoint digitale attivo e sostenibile.
375
- </p>
376
-
377
- <ul class="mt-auto space-y-3 font-mono text-xs text-gray-400">
378
- <li class="flex items-start gap-3 border-b border-[#333] pb-2 last:border-0 group-hover:border-[#00ff41]/30 transition-colors">
379
- <span class="text-[#00ff41] mt-0.5">▹</span>
380
- <div>
381
- <strong class="text-white block mb-0.5">Phygital Gateway</strong>
382
- QR Code su prodotto (padella) che attiva l'assistente AI, aumentando la retention post-acquisto.
383
- </div>
384
- </li>
385
- <li class="flex items-start gap-3 border-b border-[#333] pb-2 last:border-0 group-hover:border-[#00ff41]/30 transition-colors">
386
- <span class="text-[#00ff41] mt-0.5">▹</span>
387
- <div>
388
- <strong class="text-white block mb-0.5">Computer Vision Inventory</strong>
389
- Analisi visiva degli ingredienti per gestione scadenze e riduzione sprechi.
390
- </div>
391
- </li>
392
- <li class="flex items-start gap-3 pb-2">
393
- <span class="text-[#00ff41] mt-0.5">▹</span>
394
- <div>
395
- <strong class="text-white block mb-0.5">Contextual Content (RAG)</strong>
396
- Generazione dinamica di ricette basata su disponibilità reale e preferenze salute.
397
- </div>
398
- </li>
399
- </ul>
400
- </div>
401
- </div>
402
-
403
- <div class="group relative rounded-2xl p-[1px] bg-gradient-to-b from-[#333] via-[#1a1a1a] to-black hover:from-[#00ff41] hover:via-[#00ff41]/50 hover:to-[#003300] transition-all duration-500 overflow-hidden reveal-on-scroll hover:-translate-y-2 hover:shadow-[0_10px_40px_-10px_rgba(0,255,65,0.2)] cursor-pointer active:scale-95" style="transition-delay: 0.4s;">
404
- <div class="relative h-full bg-[#0a0a0a]/90 backdrop-blur-xl rounded-2xl p-8 flex flex-col z-10">
405
- <div class="absolute inset-0 bg-[url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgdmlld0JveD0iMCAwIDIwIDIwIj48cmVjdCB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBmaWxsPSIjMDBmZjQxIiBvcGFjaXR5PSIwLjEiLz48L3N2Zz4=')] opacity-20 pointer-events-none"></div>
406
-
407
- <div class="flex justify-between items-start mb-6">
408
- <div class="p-3 bg-[#00ff41]/10 rounded-xl border border-[#00ff41]/30 text-[#00ff41] group-hover:shadow-[0_0_20px_#00ff41] transition-shadow duration-500">
409
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="3" width="20" height="14" rx="2" ry="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></svg>
410
- </div>
411
- <span class="font-mono text-[9px] text-[#00ff41] tracking-widest opacity-60 border border-[#00ff41]/20 px-2 py-1 rounded-full bg-black/50">INITIATIVE: RETENTION</span>
412
- </div>
413
-
414
- <h3 class="font-serif text-xl font-bold text-white mb-2 group-hover:text-[#00ff41] transition-colors">PROJECT: ENGAGEMENT_ECOSYSTEM</h3>
415
- <p class="text-gray-400 font-mono text-xs mb-6 leading-relaxed">
416
- Strategia di Gamification circolare per massimizzare la frequenza di visita e la Data Collection.
417
- </p>
418
-
419
- <ul class="mt-auto space-y-3 font-mono text-xs text-gray-400">
420
- <li class="flex items-start gap-3 border-b border-[#333] pb-2 last:border-0 group-hover:border-[#00ff41]/30 transition-colors">
421
- <span class="text-[#00ff41] mt-0.5">▹</span>
422
- <div>
423
- <strong class="text-white block mb-0.5">Cross-Brand Journey</strong>
424
- Sistema unificato di Badge/Achievement che guida l'utente attraverso i diversi brand del gruppo.
425
- </div>
426
- </li>
427
- <li class="flex items-start gap-3 border-b border-[#333] pb-2 last:border-0 group-hover:border-[#00ff41]/30 transition-colors">
428
- <span class="text-[#00ff41] mt-0.5">▹</span>
429
- <div>
430
- <strong class="text-white block mb-0.5">Performance Marketing</strong>
431
- Conversione dell'attività ludica in incentivi d'acquisto dinamici (codici sconto targettizzati).
432
- </div>
433
- </li>
434
- <li class="flex items-start gap-3 pb-2">
435
- <span class="text-[#00ff41] mt-0.5">▹</span>
436
- <div>
437
- <strong class="text-white block mb-0.5">Behavioral Insights</strong>
438
- Utilizzo del layer di gioco per profilazione preferenze in modalità non invasiva.
439
- </div>
440
- </li>
441
- </ul>
442
- </div>
443
- </div>
444
- </div>
445
- </div>
446
- </section>
447
 
448
- <style>
449
- /* --- GESTIONE IFRAME GAME --- */
450
- .game-zoom-container {
451
- width: 100%;
452
- height: 100%;
453
- overflow: hidden;
454
- /* Blocca zoom e gesti touch sul contenitore */
455
- touch-action: none;
456
- -ms-touch-action: none;
457
- user-select: none;
458
- -webkit-user-select: none;
459
- }
460
-
461
- .game-zoom-frame {
462
- border: none;
463
- /* DEFAULT (PC/Tablet orizzontale): */
464
- /* Riempie semplicemente il box 11:9 che abbiamo impostato nell'HTML */
465
- width: 100%;
466
- height: 100%;
467
- touch-action: none;
468
- }
469
-
470
- /* --- SOLO MOBILE VERTICALE (Smartphone) --- */
471
- /* Qui manteniamo il tuo zoom out perché gli schermi sono stretti */
472
- @media (max-width: 768px) {
473
- .game-zoom-frame {
474
- width: 182%; /* Allarga la vista */
475
- height: 182%;
476
- transform: scale(0.55); /* Rimpicciolisce tutto per farlo stare nel box */
477
- transform-origin: top left;
478
- }
479
- }
480
- </style>
481
-
482
- <section class="px-6 py-24 relative z-10 bg-black/40 backdrop-blur-sm border-t border-[#333]">
483
- <div class="max-w-5xl mx-auto reveal-on-scroll">
484
-
485
- <div class="text-center mb-8">
486
- <div class="inline-flex items-center gap-2 px-3 py-1 rounded border border-[#00ff41]/30 bg-[#00ff41]/5 mb-4 backdrop-blur-sm">
487
- <span class="w-2 h-2 bg-[#00ff41] rounded-full animate-pulse"></span>
488
- <span class="text-[10px] text-[#00ff41] font-mono tracking-widest uppercase">Gamification</span>
489
- </div>
490
- <h2 class="font-serif text-4xl md:text-5xl font-bold mb-4">
491
- Innovation <span class="text-[#00ff41]">Run</span>
492
- </h2>
493
- <p class="font-mono text-xs md:text-sm opacity-70 max-w-lg mx-auto">
494
- // Mission: Crea un PoC visionario OMNICANALE
495
- </p>
496
- </div>
497
-
498
- <div id="game-monitor" class="relative w-full aspect-[3/4] md:aspect-[11/9] rounded-xl overflow-hidden border-2 border-[#00ff41] shadow-[0_0_40px_rgba(0,255,65,0.15)] bg-black group transition-all hover:shadow-[0_0_60px_rgba(0,255,65,0.25)] mx-auto max-w-sm md:max-w-4xl">
499
- <div class="absolute top-0 left-0 w-full h-8 bg-[#0a0a0a] border-b border-[#00ff41]/50 flex items-center justify-between px-4 z-20 select-none pointer-events-none">
500
- <div class="flex items-center gap-2">
501
- <div class="w-2 h-2 rounded-full bg-[#00ff41] animate-pulse"></div>
502
- <span class="text-[10px] font-mono text-[#00ff41] tracking-wider">LIVE_EXECUTION</span>
503
- </div>
504
- <span class="text-[10px] font-mono text-[#00ff41]/50">./play.html</span>
505
- </div>
506
-
507
- <div id="game-overlay" class="absolute inset-0 z-30 bg-black/80 flex flex-col items-center justify-center cursor-pointer backdrop-blur-sm transition-opacity duration-500" onclick="activateGame()">
508
- <div class="w-16 h-16 rounded-full border-2 border-[#00ff41] flex items-center justify-center mb-4 animate-pulse shadow-[0_0_20px_#00ff41]">
509
- <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="#00ff41" stroke="none"><polygon points="5 3 19 12 5 21 5 3"></polygon></svg>
510
- </div>
511
- <p class="text-[#00ff41] font-mono text-xs md:text-sm tracking-widest uppercase font-bold text-center px-4">
512
- TAP TO INITIALIZE<br>
513
- </p>
514
- </div>
515
-
516
- <div class="game-zoom-container pt-8 bg-black">
517
- <iframe
518
- id="game-iframe"
519
- src="./play.html"
520
- class="game-zoom-frame"
521
- scrolling="no"
522
- loading="lazy"
523
- title="Innovation Run Game">
524
- </iframe>
525
- </div>
526
-
527
- <div class="absolute inset-0 pointer-events-none z-10 bg-[linear-gradient(rgba(18,16,16,0)_50%,rgba(0,0,0,0.1)_50%),linear-gradient(90deg,rgba(255,0,0,0.03),rgba(0,255,0,0.01),rgba(0,0,255,0.03))] bg-[length:100%_2px,3px_100%] opacity-50"></div>
528
- </div>
529
-
530
- <div class="mt-4 flex justify-between items-center px-2 max-w-sm md:max-w-4xl mx-auto">
531
- <p class="text-[10px] text-[#00ff41]/50 font-mono">
532
- [WIDE VIEW ACTIVE]
533
- </p>
534
- <div class="flex gap-4 text-[10px] text-[#00ff41]/50 font-mono">
535
- <span>INPUT: TAP</span>
536
- <span>ZOOM: 55%</span>
537
- </div>
538
- </div>
539
-
540
- </div>
541
- </section>
542
-
543
- <script>
544
- function activateGame() {
545
- const overlay = document.getElementById('game-overlay');
546
- const iframe = document.getElementById('game-iframe');
547
-
548
- overlay.style.opacity = '0';
549
- setTimeout(() => overlay.style.display = 'none', 500);
550
-
551
- iframe.contentWindow.focus();
552
- }
553
- document.addEventListener('DOMContentLoaded', () => {
554
-
555
- // 1. Previene il "Pinch to Zoom" (Pizzico con due dita) su tutto il documento
556
- document.addEventListener('touchmove', function (event) {
557
- if (event.touches.length > 1) {
558
- event.preventDefault(); // Blocca se ci sono più di 1 dito
559
- }
560
- }, { passive: false });
561
-
562
- // 2. Previene il doppio tap veloce (Zoom) su tutto il documento
563
- let lastTouchEnd = 0;
564
- document.addEventListener('touchend', function (event) {
565
- const now = (new Date()).getTime();
566
- if (now - lastTouchEnd <= 300) {
567
- event.preventDefault();
568
- }
569
- lastTouchEnd = now;
570
- }, false);
571
-
572
- // 3. Gestione specifica per il contenitore del gioco (Massima priorità)
573
- const gameContainer = document.querySelector('.game-zoom-container');
574
- if (gameContainer) {
575
- gameContainer.addEventListener('touchmove', function(e) {
576
- // Impedisce qualsiasi movimento della pagina mentre si gioca
577
- e.preventDefault();
578
- }, { passive: false });
579
- }
580
- });
581
- </script>
582
-
583
- <!-- UNLOCK AR LAYER -->
584
- <section class="px-6 py-24 relative z-20 overflow-hidden">
585
- <div class="absolute inset-0 bg-gradient-to-b from-black via-[#0d0d0d] to-black opacity-90"></div>
586
- <div class="absolute inset-0 opacity-20" style="background-image: url('data:image/svg+xml,%3Csvg viewBox=%220 0 200 200%22 xmlns=%22http://www.w3.org/2000/svg%22%3E%3Cfilter id=%22noiseFilter%22%3E%3CfeTurbulence type=%22fractalNoise%22 baseFrequency=%220.65%22 numOctaves=%223%22 stitchTiles=%22stitch%22/%3E%3C/filter%3E%3Crect width=%22100%25%22 height=%22100%25%22 filter=%22url(%23noiseFilter)%22 opacity=%221%22/%3E%3C/svg%3E');"></div>
587
-
588
- <div class="max-w-3xl mx-auto relative text-center reveal-on-scroll">
589
- <div class="mb-8">
590
-
591
- <div class="inline-flex items-center gap-2 px-3 py-1 rounded border border-[#00ff41]/30 bg-[#00ff41]/5 mb-4 backdrop-blur-sm">
592
- <span class="w-2 h-2 bg-[#00ff41] rounded-full animate-pulse"></span>
593
- <span class="text-[10px] text-[#00ff41] font-mono tracking-widest uppercase">Augmented Reality</span>
594
- </div>
595
-
596
- <h2 class="font-serif text-4xl md:text-5xl font-bold mb-4 text-white">
597
- The Hidden <span class="text-[#00ff41] animate-pulse">Layer</span>
598
- </h2>
599
- <p class="font-mono text-xs md:text-sm opacity-70 max-w-lg mx-auto">
600
- // C'è un quarto livello di realtà nascosta. Sblocca il protocollo AR!
601
- </p>
602
- </div>
603
-
604
- <div class="py-8 flex justify-center">
605
- <!-- Slider Component -->
606
- <div id="slider-container" class="relative w-full max-w-xs h-14 bg-black border border-[#333] rounded-full overflow-hidden backdrop-blur-sm shadow-[0_0_15px_rgba(0,0,0,0.5)] select-none touch-none">
607
- <div class="absolute -top-8 left-0 right-0 text-center">
608
- <div class="text-[10px] text-[#00ff41] font-mono tracking-widest uppercase animate-pulse">Secure Connection Available</div>
609
- </div>
610
- <!-- Background Fill -->
611
- <div id="slider-fill" class="absolute inset-0 bg-[#00ff41] opacity-10 transition-opacity" style="width: 0%"></div>
612
- <div class="absolute inset-0 opacity-20 bg-[linear-gradient(90deg,transparent_0%,rgba(0,255,65,0.2)_50%,transparent_100%)] bg-[length:200%_100%] animate-[shimmer_2s_infinite] pointer-events-none"></div>
613
-
614
- <!-- Text -->
615
- <div id="slider-text" class="absolute inset-0 flex items-center justify-center pointer-events-none transition-opacity duration-300">
616
- <span class="font-mono text-xs font-bold text-white tracking-[0.2em] uppercase flex items-center gap-2">
617
- Slide to Decode <span class="animate-bounce">→</span>
618
- </span>
619
- </div>
620
-
621
- <!-- Handle -->
622
- <div id="slider-handle" class="absolute top-1 left-1 bottom-1 w-12 bg-[#0d0d0d] rounded-full border border-[#00ff41] flex items-center justify-center cursor-grab z-20 shadow-[0_0_10px_rgba(0,255,65,0.3)] active:cursor-grabbing hover:scale-105 transition-transform">
623
- <svg id="icon-arrow" xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="animate-pulse"><polyline points="9 18 15 12 9 6"></polyline></svg>
624
- <svg id="icon-lock" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="#00ff41" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="hidden"><rect x="3" y="11" width="18" height="11" rx="2" ry="2"></rect><path d="M7 11V7a5 5 0 0 1 10 0v4"></path></svg>
625
- </div>
626
- </div>
627
- </div>
628
-
629
- <p class="mt-8 text-[10px] text-[#00ff41]/60 font-mono">
630
- // REQUIRES CAMERA PERMISSION
631
- </p>
632
- </div>
633
- </section>
634
-
635
- <!-- MISSING LINK SECTION & CODE BLOCK -->
636
- <section class="px-6 py-24 relative z-10 bg-black/60 backdrop-blur-md border-y border-[#333]">
637
- <div class="max-w-3xl mx-auto reveal-on-scroll">
638
-
639
- <h2 class="font-serif text-4xl md:text-5xl font-bold text-center mb-12">
640
- The <span class="text-[#00ff41]">"Missing Link"</span>
641
- </h2>
642
-
643
- <!-- Code Block Component -->
644
- <div class="relative rounded-lg overflow-hidden bg-[#0d0d0d] border border-[#00ff41] shadow-[0_0_15px_rgba(0,255,65,0.15)] max-w-xl mx-auto transition-transform hover:scale-[1.02] duration-500 group">
645
- <div class="flex items-center justify-between px-4 py-2 bg-[#1a1a1a] border-b border-[#333]">
646
- <div class="flex gap-2">
647
- <div class="w-3 h-3 rounded-full bg-red-500/50"></div>
648
- <div class="w-3 h-3 rounded-full bg-yellow-500/50"></div>
649
- <div class="w-3 h-3 rounded-full bg-green-500/50"></div>
650
- </div>
651
- <span class="text-[10px] text-[#00ff41] font-mono opacity-70">// middleware.js</span>
652
- </div>
653
-
654
- <div class="p-6 font-mono text-xs md:text-sm leading-relaxed overflow-x-auto text-left">
655
- <div class="text-gray-400">
656
- <span class="text-[#c678dd]">const</span> <span class="text-[#61afef]">checkCompatibility</span> = (<span class="text-[#d19a66]">system</span>) = {
657
- </div>
658
- <div class="pl-4">
659
- <span class="text-[#c678dd]">if</span> (
660
- <span class="text-[#e06c75]">Legacy_Systems</span> &&
661
- <span class="text-[#e06c75]">Future_AI</span>
662
- )
663
- </div>
664
- <div class="pl-8 text-[#98c379]">
665
- return <span class="text-[#e06c75]">"Matteo Bergamelli"</span>;
666
- </div>
667
- <div class="pl-4">
668
- <span class="text-[#c678dd]">else</span>
669
- </div>
670
- <div class="pl-8 text-[#98c379]">
671
- return <span class="text-red-400">"Gap Tecnologico"</span>;
672
- </div>
673
- <div class="pl-4"></div>
674
- <div>};</div>
675
- </div>
676
-
677
- <!-- Blink Cursor -->
678
- <div class="absolute bottom-6 right-6 w-2 h-4 bg-[#00ff41] animate-pulse"></div>
679
-
680
- <!-- Easter Egg Copy -->
681
- <button onclick="copyCodeEasterEgg()" class="absolute top-14 right-4 text-[10px] text-[#00ff41] bg-black/80 px-2 py-1 rounded opacity-0 group-hover:opacity-100 transition-opacity border border-[#00ff41]">COPY</button>
682
- </div>
683
 
684
- <p class="text-center text-sm md:text-base leading-relaxed opacity-90 mt-8 font-mono">
685
- La vostra Job Description <span class="text-[#00ff41] font-bold">(ID 247442889)</span> cerca qualcuno che unisca questi mondi.
686
- <br />
687
- <span class="font-serif text-xl md:text-2xl font-bold mt-6 block text-white">
688
- Mi piacerebbe essere quel connettore.
689
- </span>
690
- </p>
691
 
692
- <div class="mt-12 p-6 bg-[#0a0a0a]/80 rounded-lg border border-[#333] backdrop-blur-sm text-center">
693
- <p class="text-xs font-mono opacity-60 mb-4 text-[#00ff41]">// CURRENT STACK</p>
694
- <div class="flex flex-wrap justify-center gap-2">
695
- <span class="px-3 py-1 bg-[#151515] border border-[#00ff41]/40 rounded text-xs font-mono text-[#00ff41] hover:bg-[#00ff41] hover:text-black transition-colors cursor-default">Python</span>
696
- <span class="px-3 py-1 bg-[#151515] border border-[#00ff41]/40 rounded text-xs font-mono text-[#00ff41] hover:bg-[#00ff41] hover:text-black transition-colors cursor-default">SAP B1</span>
697
- <span class="px-3 py-1 bg-[#151515] border border-[#00ff41]/40 rounded text-xs font-mono text-[#00ff41] hover:bg-[#00ff41] hover:text-black transition-colors cursor-default">SQL Server</span>
698
- <span class="px-3 py-1 bg-[#151515] border border-[#00ff41]/40 rounded text-xs font-mono text-[#00ff41] hover:bg-[#00ff41] hover:text-black transition-colors cursor-default">LLM Agents</span>
699
- <span class="px-3 py-1 bg-[#151515] border border-[#00ff41]/40 rounded text-xs font-mono text-[#00ff41] hover:bg-[#00ff41] hover:text-black transition-colors cursor-default">RAG</span>
700
- <span class="px-3 py-1 bg-[#151515] border border-[#00ff41]/40 rounded text-xs font-mono text-[#00ff41] hover:bg-[#00ff41] hover:text-black transition-colors cursor-default">IoT</span>
701
- <span class="px-3 py-1 bg-[#151515] border border-[#00ff41]/40 rounded text-xs font-mono text-[#00ff41] hover:bg-[#00ff41] hover:text-black transition-colors cursor-default">OpcUa</span>
702
- <span class="px-3 py-1 bg-[#151515] border border-[#00ff41]/40 rounded text-xs font-mono text-[#00ff41] hover:bg-[#00ff41] hover:text-black transition-colors cursor-default">Spark AR</span>
703
- <span class="px-3 py-1 bg-[#151515] border border-[#00ff41]/40 rounded text-xs font-mono text-[#00ff41] hover:bg-[#00ff41] hover:text-black transition-colors cursor-default">Angular</span>
704
- </div>
705
- </div>
706
- </div>
707
- </section>
708
 
709
- <!-- FOOTER -->
710
- <section class="px-6 py-20 bg-black relative z-10">
711
- <div class="max-w-2xl mx-auto text-center reveal-on-scroll">
712
- <h2 class="font-serif text-4xl md:text-5xl font-bold mb-12">
713
- Iniziamo a <span class="text-[#00ff41]">Innovare</span>?
714
- </h2>
715
-
716
- <div class="grid grid-cols-1 md:grid-cols-2 gap-4 mb-16">
717
- <a href="./CV.pdf" class="group flex items-center justify-center gap-2 px-6 py-4 bg-[#00ff41] text-black font-mono text-sm font-bold rounded hover:bg-transparent hover:text-[#00ff41] border border-[#00ff41] transition-all">
718
- <span class="group-hover:translate-x-1 transition-transform">📄 CV Tecnico</span>
719
- </a>
720
- <a href="tel:+393428194066" class="flex items-center justify-center gap-2 px-6 py-4 bg-transparent text-[#f5f5f5] font-mono text-sm border border-[#333] rounded hover:border-[#00ff41] hover:text-[#00ff41] transition-all">
721
- <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z"></path></svg>
722
- Telefono
723
- </a>
724
- <a href="mailto:matteo.bergamelli1989@gmail.com" class="flex items-center justify-center gap-2 px-6 py-4 bg-transparent text-[#f5f5f5] font-mono text-sm border border-[#333] rounded hover:border-[#00ff41] hover:text-[#00ff41] transition-all">
725
- <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="20" height="16" x="2" y="4" rx="2"></rect><path d="m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7"></path></svg>
726
- Email
727
- </a>
728
- </div>
729
-
730
- <div class="pt-8 border-t border-[#333] text-left md:text-center">
731
- <p class="font-mono text-[10px] md:text-xs opacity-40 leading-relaxed uppercase tracking-widest">
732
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━<br/>
733
- ONIVERSE PHYGITAL EXPERIENCE<br/>
734
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━<br/><br/>
735
- Printed at: Padenghe s/G<br/>
736
- Cost: 0€<br/>
737
- Value: <span class="text-[#00ff41]">Infinite</span><br/><br/>
738
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━
739
- </p>
740
- </div>
741
- </div>
742
- </section>
743
- </div>
744
  <script>
745
- /* ==========================================
746
- 0. EASTER EGGS & NERD STUFF
747
- ========================================== */
748
-
749
- // A) Console ASCII Art (First place devs look)
750
- console.log(`%c
751
- ███╗ ███╗██████╗
752
- ████╗ ████║██╔══██╗
753
- ██╔████╔██║██████╔╝
754
- ██║╚██╔╝██║██╔══██╗
755
- ██║ ╚═╝ ██║██████╔╝
756
- ╚═╝ ╚═╝╚═════╝
757
- %c> Ciao Dev di Oniverse.
758
- > Se stai leggendo questo, stiamo parlando la stessa lingua.
759
- > Stack: React, Python, AI, AR.
760
- > Status: Ready to deploy.
761
- `, "color: #00ff41; font-weight: bold; font-family: monospace;", "color: #f5f5f5; font-family: monospace;");
762
 
763
- // B) Konami Code (The classic) -> Triggers Matrix Rain
764
- let konamiCode = ['ArrowUp', 'ArrowUp', 'ArrowDown', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'ArrowLeft', 'ArrowRight', 'b', 'a'];
765
- let konamiIndex = 0;
766
-
767
- document.addEventListener('keydown', (e) => {
768
- if (e.key.toLowerCase() === konamiCode[konamiIndex].toLowerCase() || e.key === konamiCode[konamiIndex]) {
769
- konamiIndex++;
770
- if (konamiIndex === konamiCode.length) {
771
- activateMatrixMode();
772
- konamiIndex = 0;
773
- }
774
- } else {
775
- konamiIndex = 0;
776
- }
777
  });
778
 
779
- function activateMatrixMode() {
780
- alert("🔓 GOD MODE ACTIVATED: You found the secret!");
781
- startMatrixRain();
782
- }
783
-
784
- // C) Matrix Rain Canvas Logic
785
- function startMatrixRain() {
786
- const canvas = document.getElementById('matrix-canvas');
787
- const ctx = canvas.getContext('2d');
788
- canvas.width = window.innerWidth;
789
- canvas.height = window.innerHeight;
790
-
791
- canvas.classList.add('matrix-active');
792
-
793
- const chars = "01010101MATTEOBERGAMELLIONIVERSEINNOVATIONLAB";
794
- const fontSize = 14;
795
- const columns = canvas.width / fontSize;
796
- const drops = [];
797
- for(let x = 0; x < columns; x++) drops[x] = 1;
798
-
799
- function draw() {
800
- ctx.fillStyle = "rgba(0, 0, 0, 0.05)";
801
- ctx.fillRect(0, 0, canvas.width, canvas.height);
802
- ctx.fillStyle = "#00ff41";
803
- ctx.font = fontSize + "px monospace";
804
-
805
- for(let i = 0; i < drops.length; i++) {
806
- const text = chars.charAt(Math.floor(Math.random() * chars.length));
807
- ctx.fillText(text, i * fontSize, drops[i] * fontSize);
808
- if(drops[i] * fontSize > canvas.height && Math.random() > 0.975) drops[i] = 0;
809
- drops[i]++;
810
- }
811
- requestAnimationFrame(draw);
812
- }
813
- draw();
814
- }
815
-
816
- // D) Ripple Effect on Click (Physical Touch visual feedback)
817
- document.addEventListener('click', (e) => {
818
- // Don't trigger on interactive elements to avoid confusion
819
- if(e.target.closest('button') || e.target.closest('a') || e.target.closest('#slider-container')) return;
820
-
821
- const ripple = document.createElement('div');
822
- ripple.className = 'ripple';
823
- ripple.style.left = e.clientX + 'px';
824
- ripple.style.top = e.clientY + 'px';
825
- // Size based on viewport
826
- const size = Math.max(window.innerWidth, window.innerHeight) / 10;
827
- ripple.style.width = ripple.style.height = size + 'px';
828
- ripple.style.marginTop = ripple.style.marginLeft = -(size/2) + 'px';
829
- document.body.appendChild(ripple);
830
-
831
- setTimeout(() => ripple.remove(), 600);
832
  });
833
 
834
- // E) Copy Code Easter Egg
835
- window.copyCodeEasterEgg = function() {
836
- navigator.clipboard.writeText("function bridgeLegacyAndAI() { return 'Matteo Bergamelli'; }");
837
- alert("📋 Copied to clipboard: A secret function just for you.");
838
- }
839
-
840
- /* ==========================================
841
- 1. TERMINAL LOADER LOGIC
842
- ========================================== */
843
- const terminalLines = [
844
- "> CONNECTING TO INNOVATION LAB...",
845
- "> ANALYZING STACK: SAP+PYTHON+AI...",
846
- "> DETECTING PHYGITAL ASSETS...",
847
- "> SYNCING NEURAL MESH...",
848
- "> ACCESS GRANTED!"
849
- ];
850
-
851
- const terminalEl = document.getElementById('terminal-lines');
852
- let lineIndex = 0;
853
-
854
- function typeWriter() {
855
- if (lineIndex < terminalLines.length) {
856
- const div = document.createElement('div');
857
- div.className = "mb-2 text-[#00ff41] drop-shadow-[0_0_5px_rgba(0,255,65,0.8)] opacity-0 transition-opacity duration-300";
858
- div.textContent = terminalLines[lineIndex];
859
- terminalEl.appendChild(div);
860
-
861
- void div.offsetWidth; // Reflow
862
- div.style.opacity = "1";
863
-
864
- lineIndex++;
865
- setTimeout(typeWriter, 600);
866
- } else {
867
- // Finished
868
- setTimeout(() => {
869
- document.getElementById('terminal-loader').style.opacity = '0';
870
- document.getElementById('main-content').style.opacity = '1';
871
- document.getElementById('canvas-container').style.opacity = '1';
872
- document.getElementById('status-bar').style.opacity = '1';
873
-
874
- // Decrypt Job ID
875
- scrambleText(document.getElementById('job-id-scramble'), "247442889");
876
-
877
- setTimeout(() => {
878
- document.getElementById('terminal-loader').style.display = 'none';
879
- }, 500);
880
- }, 800);
881
- }
882
- }
883
-
884
- // Text Scrambler Function
885
- function scrambleText(element, finalString) {
886
- let iterations = 0;
887
- const possible = "0123456789XYK@#%";
888
- const interval = setInterval(() => {
889
- element.innerText = finalString
890
- .split("")
891
- .map((letter, index) => {
892
- if (index < iterations) return finalString[index];
893
- return possible[Math.floor(Math.random() * possible.length)];
894
- })
895
- .join("");
896
-
897
- if (iterations >= finalString.length) clearInterval(interval);
898
- iterations += 1/3;
899
- }, 30);
900
- }
901
-
902
- window.addEventListener('load', typeWriter);
903
-
904
-
905
- /* ==========================================
906
- 2. THREE.JS BACKGROUND (Digital Fabric)
907
- ========================================== */
908
- function initThreeJS() {
909
- const container = document.getElementById('canvas-container');
910
- const scene = new THREE.Scene();
911
- const camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 100);
912
- camera.position.set(0, 5, 10);
913
- camera.lookAt(0, 0, 0);
914
-
915
- const renderer = new THREE.WebGLRenderer({ antialias: false, alpha: true });
916
- renderer.setSize(window.innerWidth, window.innerHeight);
917
- renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
918
- container.appendChild(renderer.domElement);
919
-
920
- // Create Particles
921
- const particleCount = 12000;
922
- const geometry = new THREE.BufferGeometry();
923
- const positions = new Float32Array(particleCount * 3);
924
-
925
- const size = 20;
926
- const gap = 0.2;
927
- const rows = Math.sqrt(particleCount);
928
-
929
- for (let i = 0; i < particleCount; i++) {
930
- const row = Math.floor(i / rows);
931
- const col = i % rows;
932
-
933
- const x = (col * gap) - (rows * gap) / 2;
934
- const z = (row * gap) - (rows * gap) / 2;
935
-
936
- positions[i * 3] = x;
937
- positions[i * 3 + 1] = 0;
938
- positions[i * 3 + 2] = z;
939
  }
940
-
941
- geometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));
942
-
943
- const material = new THREE.PointsMaterial({
944
- size: 0.05,
945
- color: 0x00ff41,
946
- transparent: true,
947
- opacity: 0.5,
948
- sizeAttenuation: true,
949
- blending: THREE.AdditiveBlending
950
- });
951
-
952
- const points = new THREE.Points(geometry, material);
953
- scene.add(points);
954
-
955
- // Interaction
956
- let mouseX = 0;
957
- let mouseY = 0;
958
-
959
- document.addEventListener('mousemove', (event) => {
960
- mouseX = (event.clientX / window.innerWidth) * 2 - 1;
961
- mouseY = -(event.clientY / window.innerHeight) * 2 + 1;
962
- });
963
-
964
- // Animation Loop
965
- const clock = new THREE.Clock();
966
-
967
- function animate() {
968
- requestAnimationFrame(animate);
969
-
970
- const time = clock.getElapsedTime();
971
- const positions = points.geometry.attributes.position.array;
972
-
973
- for (let i = 0; i < particleCount; i++) {
974
- const x = positions[i * 3];
975
- const z = positions[i * 3 + 2];
976
-
977
- // Wave equation + Mouse Interaction influence
978
- // (Subtle distortion based on mouse position)
979
- const mouseDist = Math.sqrt((x - mouseX * 5)**2 + (z - mouseY * 5)**2);
980
- const interaction = Math.max(0, 3 - mouseDist) * 0.2;
981
-
982
- const y =
983
- Math.sin(x * 0.5 + time * 0.5) * 1.5 +
984
- Math.sin(z * 0.3 + time * 0.3) * 1.5 +
985
- Math.sin((x + z) * 0.2 + time) * 0.5 +
986
- Math.sin(time * 2 + mouseDist) * interaction; // Interactive ripple
987
-
988
- positions[i * 3 + 1] = y;
989
- }
990
-
991
- points.geometry.attributes.position.needsUpdate = true;
992
- points.rotation.y = time * 0.05;
993
-
994
- renderer.render(scene, camera);
995
- }
996
-
997
- animate();
998
-
999
- window.addEventListener('resize', () => {
1000
- camera.aspect = window.innerWidth / window.innerHeight;
1001
- camera.updateProjectionMatrix();
1002
- renderer.setSize(window.innerWidth, window.innerHeight);
1003
- });
1004
- }
1005
-
1006
- initThreeJS();
1007
-
1008
-
1009
- /* ==========================================
1010
- 3. SCROLL REVEAL ANIMATIONS
1011
- ========================================== */
1012
- const observer = new IntersectionObserver((entries) => {
1013
- entries.forEach(entry => {
1014
- if (entry.isIntersecting) {
1015
- entry.target.classList.add('visible');
1016
- }
1017
- });
1018
- }, { threshold: 0.1 });
1019
-
1020
- document.querySelectorAll('.reveal-on-scroll').forEach(el => observer.observe(el));
1021
-
1022
-
1023
- /* ==========================================
1024
- 4. UNLOCK SLIDER LOGIC
1025
- ========================================== */
1026
- const sliderHandle = document.getElementById('slider-handle');
1027
- const sliderFill = document.getElementById('slider-fill');
1028
- const sliderText = document.getElementById('slider-text');
1029
- const iconArrow = document.getElementById('icon-arrow');
1030
- const iconLock = document.getElementById('icon-lock');
1031
-
1032
- let isDragging = false;
1033
- let startX = 0;
1034
- let currentX = 0;
1035
- const maxDrag = 260;
1036
-
1037
- function playClickSound() {
1038
- // Very short oscillator beep using Web Audio API (no external file needed)
1039
- const AudioContext = window.AudioContext || window.webkitAudioContext;
1040
- if (AudioContext) {
1041
- const audioCtx = new AudioContext();
1042
- const oscillator = audioCtx.createOscillator();
1043
- const gainNode = audioCtx.createGain();
1044
- oscillator.connect(gainNode);
1045
- gainNode.connect(audioCtx.destination);
1046
- oscillator.type = 'sine';
1047
- oscillator.frequency.value = 800;
1048
- gainNode.gain.setValueAtTime(0.05, audioCtx.currentTime);
1049
- gainNode.gain.exponentialRampToValueAtTime(0.001, audioCtx.currentTime + 0.1);
1050
- oscillator.start();
1051
- oscillator.stop(audioCtx.currentTime + 0.1);
1052
- }
1053
- }
1054
-
1055
- sliderHandle.addEventListener('mousedown', startDrag);
1056
- window.addEventListener('mousemove', drag);
1057
- window.addEventListener('mouseup', endDrag);
1058
- sliderHandle.addEventListener('touchstart', (e) => startDrag(e.touches[0]));
1059
- window.addEventListener('touchmove', (e) => drag(e.touches[0]));
1060
- window.addEventListener('touchend', endDrag);
1061
-
1062
- function startDrag(e) {
1063
- isDragging = true;
1064
- startX = e.clientX;
1065
- sliderHandle.style.transition = 'none';
1066
- sliderFill.style.transition = 'none';
1067
- playClickSound();
1068
- }
1069
-
1070
- function drag(e) {
1071
- if (!isDragging) return;
1072
- let x = e.clientX - startX;
1073
- if (x < 0) x = 0;
1074
- if (x > maxDrag) x = maxDrag;
1075
- currentX = x;
1076
- updateSliderUI(x);
1077
- }
1078
-
1079
- function endDrag() {
1080
- if (!isDragging) return;
1081
- isDragging = false;
1082
- if (currentX > maxDrag * 0.85) {
1083
- updateSliderUI(maxDrag);
1084
- unlockSuccess();
1085
- } else {
1086
- sliderHandle.style.transition = 'left 0.3s ease';
1087
- sliderFill.style.transition = 'width 0.3s ease, opacity 0.3s ease';
1088
- updateSliderUI(0);
1089
- }
1090
- }
1091
-
1092
- function updateSliderUI(x) {
1093
- sliderHandle.style.left = `${x}px`;
1094
- const percentage = (x / maxDrag);
1095
- sliderFill.style.width = `${x + 40}px`;
1096
- sliderFill.style.opacity = 0.1 + (percentage * 0.3);
1097
- sliderText.style.opacity = 1 - (percentage * 1.5);
1098
- }
1099
-
1100
- function unlockSuccess() {
1101
- playClickSound();
1102
- iconArrow.classList.add('hidden');
1103
- iconLock.classList.remove('hidden');
1104
- sliderHandle.style.borderColor = '#00ff41';
1105
- sliderHandle.style.backgroundColor = '#00ff41';
1106
- iconLock.style.stroke = 'black';
1107
- // CHANGE: Redirect instead of starting AR
1108
- setTimeout(() => window.location.href = './ar.html', 500);
1109
- }
1110
-
1111
-
1112
- /* ==========================================
1113
- 5. AR EXPERIENCE LOGIC
1114
- ========================================== */
1115
- const arContainer = document.getElementById('ar-container');
1116
- const closeArBtn = document.getElementById('close-ar-btn');
1117
- const arStatusBox = document.getElementById('ar-status-box');
1118
-
1119
- function startAR() {
1120
- arContainer.style.display = 'block';
1121
- const arScene = document.querySelector('a-scene');
1122
- if (arScene && arScene.systems['mindar-image-system']) {
1123
- arScene.systems['mindar-image-system'].start();
1124
- }
1125
-
1126
- const targetEl = document.getElementById('target-entity');
1127
- const arVideo = document.getElementById('ar-video');
1128
-
1129
- if (targetEl) {
1130
- targetEl.addEventListener('targetFound', () => {
1131
- arStatusBox.innerHTML = `
1132
- <span class="relative flex h-3 w-3"><span class="animate-ping absolute inline-flex h-full w-full rounded-full bg-[#00ff41] opacity-75"></span><span class="relative inline-flex rounded-full h-3 w-3 bg-[#00ff41]"></span></span>
1133
- <span class="text-sm font-mono font-bold tracking-widest text-[#00ff41]">SIGNAL LOCKED</span>
1134
- `;
1135
- arStatusBox.classList.add('bg-[#00ff41]/10', 'border-[#00ff41]');
1136
- arStatusBox.classList.remove('bg-black/60', 'text-white/60');
1137
- if(arVideo) arVideo.play();
1138
- });
1139
-
1140
- targetEl.addEventListener('targetLost', () => {
1141
- arStatusBox.innerHTML = `
1142
- <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="animate-pulse"><path d="M3 7V5a2 2 0 0 1 2-2h2"></path><path d="M17 3h2a2 2 0 0 1 2 2v2"></path><path d="M21 17v2a2 2 0 0 1-2 2h-2"></path><path d="M7 21H5a2 2 0 0 1-2-2v-2"></path></svg>
1143
- <span class="text-sm font-mono tracking-widest">SCANNING TARGET...</span>
1144
- `;
1145
- arStatusBox.classList.remove('bg-[#00ff41]/10', 'border-[#00ff41]');
1146
- arStatusBox.classList.add('bg-black/60', 'text-white/60');
1147
- if(arVideo) arVideo.pause();
1148
- });
1149
- }
1150
- }
1151
-
1152
- closeArBtn.addEventListener('click', () => {
1153
- arContainer.style.display = 'none';
1154
- const arScene = document.querySelector('a-scene');
1155
- if (arScene && arScene.systems['mindar-image-system']) {
1156
- arScene.systems['mindar-image-system'].stop();
1157
- }
1158
- const videoFeed = document.querySelector('.mindar-ui-overlay');
1159
- if (videoFeed) videoFeed.remove();
1160
-
1161
- // Reset slider
1162
- isDragging = false;
1163
- currentX = 0;
1164
- iconArrow.classList.remove('hidden');
1165
- iconLock.classList.add('hidden');
1166
- sliderHandle.style.backgroundColor = '#0d0d0d';
1167
- sliderHandle.style.left = '0px';
1168
- sliderFill.style.width = '0px';
1169
- sliderFill.style.opacity = '0.1';
1170
- sliderText.style.opacity = '1';
1171
  });
1172
-
1173
  </script>
1174
  </body>
1175
  </html>
 
3
  <head>
4
  <meta charset="UTF-8" />
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
6
+ <title>AR Video Simple</title>
 
 
 
 
 
 
 
 
 
 
 
7
 
8
+ <script src="https://aframe.io/releases/1.4.2/aframe.min.js"></script>
9
+ <script src="https://cdn.jsdelivr.net/npm/mind-ar@1.2.2/dist/mindar-image.prod.js"></script>
10
+ <script src="https://cdn.jsdelivr.net/npm/mind-ar@1.2.2/dist/mindar-image-aframe.prod.js"></script>
 
11
 
12
  <style>
13
+ body { margin: 0; overflow: hidden; }
14
+ /* Nasconde il video sorgente dalla vista standard */
15
+ #vid { position: absolute; top: 0; left: 0; opacity: 0; z-index: -1; pointer-events: none; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  </style>
17
  </head>
18
  <body>
19
 
20
+ <a-scene
21
+ mindar-image="imageTargetSrc: img/targets.mind; filterMinCF:0.0001; filterBeta: 0.01; uiLoading: no; uiScanning: no;"
22
+ color-space="sRGB"
23
+ renderer="colorManagement: true, physicallyCorrectLights"
24
+ vr-mode-ui="enabled: false"
25
+ device-orientation-permission-ui="enabled: false">
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
 
27
+ <a-assets>
28
+ <video id="vid" src="./img/video.mp4" loop muted playsinline webkit-playsinline crossorigin="anonymous"></video>
29
+ </a-assets>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
 
31
+ <a-camera position="0 0 0" look-controls="enabled: false"></a-camera>
 
 
 
 
 
 
32
 
33
+ <a-entity id="example-target" mindar-image-target="targetIndex: 0">
34
+ <a-entity id="ar-video-plane"
35
+ geometry="primitive: plane; width: 1.25; height: 1"
36
+ material="src: #vid; shader: flat; transparent: true; opacity: 1"
37
+ position="0 0 0">
38
+ </a-entity>
39
+ </a-entity>
40
+ </a-scene>
 
 
 
 
 
 
 
 
41
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
  <script>
43
+ const video = document.querySelector("#vid");
44
+ const target = document.querySelector("#example-target");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
45
 
46
+ // Quando il target viene trovato -> Play Video
47
+ target.addEventListener("targetFound", () => {
48
+ console.log("Target trovato: Play video");
49
+ video.play();
 
 
 
 
 
 
 
 
 
 
50
  });
51
 
52
+ // Quando il target viene perso -> Pause Video
53
+ target.addEventListener("targetLost", () => {
54
+ console.log("Target perso: Pause video");
55
+ video.pause();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
56
  });
57
 
58
+ // FIX AUDIO: I browser moderni bloccano l'audio senza interazione utente.
59
+ // Cliccando ovunque sullo schermo, sblocchiamo l'audio del video.
60
+ document.body.addEventListener('click', () => {
61
+ if(video.muted) {
62
+ video.muted = false;
63
+ console.log("Audio attivato tramite tocco utente");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65
  });
 
66
  </script>
67
  </body>
68
  </html>