IT SECURITY

Инициализация AR

Загрузка ассетов…
Наведите на визитку
Powered by IT SECURITY

Камера недоступна

Разрешите доступ к камере и откройте страницу в Safari или Chrome. Сайт должен работать по HTTPS.

ПЕРЕД этим скриптом — он подхватится автоматом. ============================================================ */ const DEFAULT_CONFIG = { slug: 'it-security-main', active: true, brand: { name: 'IT SECURITY', tagline: '// Безопасность. Технологии. Решения.', primary: '#d4af37', accent: '#00e5ff' }, assets: { target: './assets/targets.mind', logo: './assets/logo.png' }, contacts: { phone: '+998 90 000 00 00', website: 'https://it-security.uz', telegram: 'https://t.me/itsecurity_uz', email: 'info@it-security.uz' }, vcard: { name: 'IT SECURITY', org: 'IT SECURITY LLC', title: 'Безопасность. Технологии. Решения.', phone: '+998900000000', email: 'info@it-security.uz', url: 'https://it-security.uz', address: 'г. Самарканд, Узбекистан' }, analytics_endpoint: null // STAGE 2: '/api/cards/{slug}/event' }; const CONFIG = window.CARD_CONFIG || DEFAULT_CONFIG; const sceneEl = document.querySelector('#scene'); const loader = document.getElementById('loader'); const hud = document.getElementById('hud'); const errorEl = document.getElementById('error'); const target = document.getElementById('target'); if (!CONFIG.active) { loader.classList.add('hidden'); document.getElementById('err-title').textContent = 'Карта неактивна'; document.getElementById('err-msg').textContent = 'Срок действия AR-визитки истёк. Свяжитесь с владельцем для продления.'; errorEl.classList.add('show'); } else { bootAR(); } function bootAR() { document.getElementById('loader-name').textContent = CONFIG.brand.name; document.getElementById('brand-name').textContent = CONFIG.brand.name; document.getElementById('logoImg').src = CONFIG.assets.logo; sceneEl.setAttribute('mindar-image', `imageTargetSrc: ${CONFIG.assets.target}; autoStart: false; uiLoading: no; uiError: no; uiScanning: no; maxTrack: 1; filterMinCF: 0.0001; filterBeta: 0.01;`); sceneEl.addEventListener('loaded', () => { document.getElementById('brandText').setAttribute('value', CONFIG.brand.name); document.getElementById('brandText').setAttribute('color', CONFIG.brand.primary); document.getElementById('taglineText').setAttribute('value', CONFIG.brand.tagline); document.getElementById('taglineText').setAttribute('color', CONFIG.brand.accent); const arSystem = sceneEl.systems['mindar-image-system']; arSystem.start().catch(() => { loader.classList.add('hidden'); errorEl.classList.add('show'); }); }); sceneEl.addEventListener('arReady', () => { document.getElementById('loader-status').textContent = 'Готово. Наведите камеру.'; setTimeout(() => loader.classList.add('hidden'), 400); }); sceneEl.addEventListener('arError', () => { loader.classList.add('hidden'); errorEl.classList.add('show'); }); target.addEventListener('targetFound', () => { hud.classList.add('hidden'); track('target_found'); }); target.addEventListener('targetLost', () => { hud.classList.remove('hidden'); }); } document.querySelectorAll('.clickable').forEach(btn => { btn.addEventListener('click', () => { const action = btn.dataset.action; btn.setAttribute('animation__tap', 'property: scale; from: 1 1 1; to: 1.15 1.15 1.15; dir: alternate; dur: 120; loop: 1'); track('button_' + action); if (action === 'call') window.location.href = 'tel:' + CONFIG.contacts.phone.replace(/\s/g,''); if (action === 'website') window.open(CONFIG.contacts.website, '_blank'); if (action === 'telegram') window.open(CONFIG.contacts.telegram, '_blank'); if (action === 'vcard') downloadVCard(); }); }); function downloadVCard() { const v = CONFIG.vcard; const data = [ 'BEGIN:VCARD','VERSION:3.0', `FN:${v.name}`, `ORG:${v.org}`, `TITLE:${v.title}`, `TEL;TYPE=WORK,VOICE:${v.phone}`, `EMAIL:${v.email}`, `URL:${v.url}`, `ADR;TYPE=WORK:;;${v.address};;;;`, 'END:VCARD' ].join('\n'); const blob = new Blob([data], { type: 'text/vcard' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `${v.name.replace(/\s/g,'_')}.vcf`; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); } function track(event) { if (!CONFIG.analytics_endpoint) return; try { navigator.sendBeacon( CONFIG.analytics_endpoint, JSON.stringify({ slug: CONFIG.slug, event, ts: Date.now() }) ); } catch(e) {} }