import './landing-video.css'; /** Self-hosted intro video (56 s, 1920×1080 H.264, no audio track). Fetched only when opened. */ export const introVideoUrl = new URL('./assets/pierzainer-intro.mp4', import.meta.url).href; export const introVideoTriggerMarkup = ``; /** Native dialog: Esc/backdrop close, pause + rewind on close, focus returns to the opener. */ export function createIntroVideo(root: HTMLElement, poster: string): { open: () => void; close: (restoreFocus?: boolean) => void } { const trigger = root.querySelector('.landing-video-trigger')!; const dialog = document.createElement('dialog'); dialog.className = 'landing-video'; dialog.id = 'landing-video'; dialog.setAttribute('aria-labelledby', 'landing-video-title'); dialog.innerHTML = `
PRODUCT TOUR / PIER & ABUT

Pierzainer 소개 영상

설계정보 입력부터 3D 모델링, 철근배근, 도면작성, 수량산출까지의 흐름을 1분 동안 소개합니다. (음성 없음)

`; root.append(dialog); const video = dialog.querySelector('video')!; const reducedMotion = window.matchMedia?.('(prefers-reduced-motion: reduce)'); const open = (): void => { if (dialog.open) return; if (!video.currentSrc && !video.querySelector('source')) { const source = document.createElement('source'); source.src = introVideoUrl; source.type = 'video/mp4'; video.append(source); video.load(); } dialog.showModal(); dialog.querySelector('.landing-video-close')!.focus(); if (!reducedMotion?.matches) void video.play().catch(() => undefined); }; const stop = (): void => { video.pause(); if (video.readyState > 0) video.currentTime = 0; }; const close = (restoreFocus = true): void => { if (!dialog.open) return; dialog.close(); if (restoreFocus && trigger.isConnected && !root.hidden) trigger.focus(); }; trigger.addEventListener('click', open); dialog.querySelector('.landing-video-close')!.addEventListener('click', () => close()); dialog.addEventListener('close', stop); dialog.addEventListener('cancel', (event) => { event.preventDefault(); close(); }); // Clicking the backdrop (outside the panel box) closes the dialog. dialog.addEventListener('click', (event) => { if (event.target !== dialog) return; const box = dialog.getBoundingClientRect(); const inside = event.clientX >= box.left && event.clientX <= box.right && event.clientY >= box.top && event.clientY <= box.bottom; if (!inside) close(); }); return { open, close }; }