leechard / static /index.html
nenae18's picture
Restore latest code (multi-code) after rollback isolation test
5bf61fe verified
Raw
History Blame Contribute Delete
20.6 kB
<!doctype html>
<html lang="ko">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>LeeChard</title>
<!-- installable PWA: 'ํ™ˆ ํ™”๋ฉด์— ์ถ”๊ฐ€' -> runs fullscreen like a native tablet app -->
<link rel="manifest" href="/static/manifest.webmanifest" />
<meta name="theme-color" content="#0b0907" />
<meta name="mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<link rel="apple-touch-icon" href="/static/icons/icon-192.png" />
<link rel="icon" type="image/png" href="/static/icons/icon-192.png" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Playfair+Display:wght@500;600;700&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css" />
<link rel="stylesheet" href="/static/css/styles.css?v=21" />
</head>
<body>
<main class="app">
<div class="bg-waves" aria-hidden="true">
<svg viewBox="0 0 1200 900" preserveAspectRatio="xMidYMid slice" xmlns="http://www.w3.org/2000/svg">
<g fill="none" stroke-width="1.3">
<g stroke="#e2bf73">
<path d="M-300 230 q75 -40 150 0 q75 40 150 0 q75 -40 150 0 q75 40 150 0 q75 -40 150 0 q75 40 150 0 q75 -40 150 0 q75 40 150 0 q75 -40 150 0 q75 40 150 0 q75 -40 150 0 q75 40 150 0" transform="translate(0 -9)" stroke-opacity="0.28"/>
<path d="M-300 230 q75 -40 150 0 q75 40 150 0 q75 -40 150 0 q75 40 150 0 q75 -40 150 0 q75 40 150 0 q75 -40 150 0 q75 40 150 0 q75 -40 150 0 q75 40 150 0 q75 -40 150 0 q75 40 150 0" transform="translate(0 -3)" stroke-opacity="0.5"/>
<path d="M-300 230 q75 -40 150 0 q75 40 150 0 q75 -40 150 0 q75 40 150 0 q75 -40 150 0 q75 40 150 0 q75 -40 150 0 q75 40 150 0 q75 -40 150 0 q75 40 150 0 q75 -40 150 0 q75 40 150 0" transform="translate(0 3)" stroke-opacity="0.5"/>
<path d="M-300 230 q75 -40 150 0 q75 40 150 0 q75 -40 150 0 q75 40 150 0 q75 -40 150 0 q75 40 150 0 q75 -40 150 0 q75 40 150 0 q75 -40 150 0 q75 40 150 0 q75 -40 150 0 q75 40 150 0" transform="translate(0 9)" stroke-opacity="0.28"/>
<animateTransform attributeName="transform" type="translate" values="-300 0;0 0" dur="9s" repeatCount="indefinite"/>
</g>
<g stroke="#d8b15e">
<path d="M-360 470 q90 -54 180 0 q90 54 180 0 q90 -54 180 0 q90 54 180 0 q90 -54 180 0 q90 54 180 0 q90 -54 180 0 q90 54 180 0 q90 -54 180 0 q90 54 180 0 q90 -54 180 0 q90 54 180 0" transform="translate(0 -10)" stroke-opacity="0.2"/>
<path d="M-360 470 q90 -54 180 0 q90 54 180 0 q90 -54 180 0 q90 54 180 0 q90 -54 180 0 q90 54 180 0 q90 -54 180 0 q90 54 180 0 q90 -54 180 0 q90 54 180 0 q90 -54 180 0 q90 54 180 0" transform="translate(0 -3)" stroke-opacity="0.4"/>
<path d="M-360 470 q90 -54 180 0 q90 54 180 0 q90 -54 180 0 q90 54 180 0 q90 -54 180 0 q90 54 180 0 q90 -54 180 0 q90 54 180 0 q90 -54 180 0 q90 54 180 0 q90 -54 180 0 q90 54 180 0" transform="translate(0 4)" stroke-opacity="0.4"/>
<path d="M-360 470 q90 -54 180 0 q90 54 180 0 q90 -54 180 0 q90 54 180 0 q90 -54 180 0 q90 54 180 0 q90 -54 180 0 q90 54 180 0 q90 -54 180 0 q90 54 180 0 q90 -54 180 0 q90 54 180 0" transform="translate(0 11)" stroke-opacity="0.2"/>
<animateTransform attributeName="transform" type="translate" values="-360 0;0 0" dur="14s" repeatCount="indefinite"/>
</g>
<g stroke="#e8c87a">
<path d="M-300 700 q75 -34 150 0 q75 34 150 0 q75 -34 150 0 q75 34 150 0 q75 -34 150 0 q75 34 150 0 q75 -34 150 0 q75 34 150 0 q75 -34 150 0 q75 34 150 0 q75 -34 150 0 q75 34 150 0" transform="translate(0 -8)" stroke-opacity="0.24"/>
<path d="M-300 700 q75 -34 150 0 q75 34 150 0 q75 -34 150 0 q75 34 150 0 q75 -34 150 0 q75 34 150 0 q75 -34 150 0 q75 34 150 0 q75 -34 150 0 q75 34 150 0 q75 -34 150 0 q75 34 150 0" transform="translate(0 -2)" stroke-opacity="0.44"/>
<path d="M-300 700 q75 -34 150 0 q75 34 150 0 q75 -34 150 0 q75 34 150 0 q75 -34 150 0 q75 34 150 0 q75 -34 150 0 q75 34 150 0 q75 -34 150 0 q75 34 150 0 q75 -34 150 0 q75 34 150 0" transform="translate(0 4)" stroke-opacity="0.44"/>
<path d="M-300 700 q75 -34 150 0 q75 34 150 0 q75 -34 150 0 q75 34 150 0 q75 -34 150 0 q75 34 150 0 q75 -34 150 0 q75 34 150 0 q75 -34 150 0 q75 34 150 0 q75 -34 150 0 q75 34 150 0" transform="translate(0 10)" stroke-opacity="0.24"/>
<animateTransform attributeName="transform" type="translate" values="-300 0;0 0" dur="12s" repeatCount="indefinite"/>
</g>
</g>
<g>
<circle cx="180" cy="150" r="2" fill="#f3dd9e"><animate attributeName="opacity" values="0.15;0.85;0.15" dur="3.2s" repeatCount="indefinite"/></circle>
<circle cx="520" cy="300" r="1.6" fill="#e8c87a"><animate attributeName="opacity" values="0.1;0.7;0.1" dur="2.6s" begin="0.6s" repeatCount="indefinite"/></circle>
<circle cx="900" cy="210" r="2.4" fill="#ffffff"><animate attributeName="opacity" values="0.1;0.55;0.1" dur="3.8s" begin="1.1s" repeatCount="indefinite"/></circle>
<circle cx="1040" cy="540" r="1.8" fill="#f3dd9e"><animate attributeName="opacity" values="0.12;0.75;0.12" dur="3s" begin="0.3s" repeatCount="indefinite"/></circle>
<circle cx="300" cy="650" r="1.6" fill="#e8c87a"><animate attributeName="opacity" values="0.1;0.7;0.1" dur="2.9s" begin="1.4s" repeatCount="indefinite"/></circle>
<circle cx="760" cy="775" r="2" fill="#ffffff"><animate attributeName="opacity" values="0.1;0.5;0.1" dur="4.2s" begin="0.9s" repeatCount="indefinite"/></circle>
</g>
</svg>
</div>
<div class="stepbar" id="stepbar" aria-hidden="true"></div>
<!-- 1/7 LANDING -->
<section class="screen active" id="screen-landing" data-step="0">
<div class="hero">
<div class="hero-overlay"></div>
<div class="hero-content">
<p class="brand-logo">LeeChard</p>
<p class="slogan">๋‹น์‹ ์„, ๋” ๋น›๋‚˜๊ฒŒ.</p>
<span class="hero-rule"></span>
<p class="brand-sub">๋ฏธ์šฉ์‹ค ์ „์šฉ AI ํฌํŠธ๋ ˆ์ดํŠธ</p>
</div>
</div>
<div class="screen-foot">
<button class="btn btn-primary" data-go="consent">์‹œ์ž‘ํ•˜๊ธฐ</button>
<button class="btn btn-text" id="btn-recent">๐Ÿ“ ์ž‘์—… ๋‚ด์—ญ ๋ณด๊ธฐ</button>
<p class="fineprint">AI ์ƒ์„ฑ ์ด๋ฏธ์ง€ ยท ์›๋ณธ์€ ์ €์žฅ/๊ณต์œ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค</p>
</div>
</section>
<!-- 2/7 CONSENT -->
<section class="screen" id="screen-consent" data-step="1">
<header class="topbar"><button class="icon-btn" data-go="landing" aria-label="๋’ค๋กœ">โ€น</button><span class="topbar-title">์ด์šฉ ๋™์˜</span><span class="icon-btn ghost"></span></header>
<div class="screen-body">
<h1 class="title">์‹œ์ž‘ํ•˜๊ธฐ ์ „์—</h1>
<ul class="trust-list">
<li><span class="ic">๐Ÿ”’</span><span>์›๋ณธ ์‚ฌ์ง„์€ ๊ณต์œ ๋˜์ง€ ์•Š์•„์š”</span></li>
<li><span class="ic">๐Ÿ—‘๏ธ</span><span>์ž‘์—…์ด ๋๋‚˜๋ฉด ์›๋ณธ์€ ์ž๋™ ์‚ญ์ œ๋ผ์š”</span></li>
<li><span class="ic">โœจ</span><span>๊ฒฐ๊ณผ๋Š” AI๋กœ ์ƒ์„ฑยทํŽธ์ง‘๋œ ๊ฐ€์ƒ ์ด๋ฏธ์ง€์˜ˆ์š”</span></li>
<li><span class="ic">โณ</span><span>์ „๋‹ฌ์šฉ QR ๋งํฌ๋Š” 7์ผ ํ›„ ๋งŒ๋ฃŒ๋ผ์š”</span></li>
</ul>
<div class="consents">
<label class="check"><input type="checkbox" id="c-ai" /><span>[ํ•„์ˆ˜] AI ๋ณด์ •์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค</span></label>
<label class="check"><input type="checkbox" id="c-qr" /><span>[ํ•„์ˆ˜] QR ์ „๋‹ฌ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค</span></label>
<label class="check"><input type="checkbox" id="c-mkt" /><span>[์„ ํƒ] ๊ฒฐ๊ณผ ์ด๋ฏธ์ง€์˜ ๋งˆ์ผ€ํŒ… ํ™œ์šฉ ๋ณด๊ด€์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค</span></label>
<p class="consent-note">๋งˆ์ผ€ํŒ… ํ™œ์šฉ ๋ณด๊ด€์€ ์ตœ๋Œ€ 1๋…„์ด๋ฉฐ, ๋งค์žฅ์— ์š”์ฒญํ•˜๋ฉด ์–ธ์ œ๋“  ์ฒ ํšŒยท์‚ญ์ œํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋™์˜ํ•˜์ง€ ์•Š์•„๋„ ๋ณด์ • ๊ฒฐ๊ณผ๋Š” ์ •์ƒ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.</p>
</div>
</div>
<div class="screen-foot">
<button class="btn btn-primary" id="consent-go" data-go="capture" disabled>๋™์˜ํ•˜๊ณ  ๊ณ„์†</button>
<p class="fineprint">๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ</p>
</div>
</section>
<!-- 3/7 CAPTURE -->
<section class="screen" id="screen-capture" data-step="2">
<header class="topbar"><button class="icon-btn" data-go="consent" aria-label="๋’ค๋กœ">โ€น</button><span class="topbar-title">์‚ฌ์ง„ ์ดฌ์˜</span><span class="icon-btn ghost"></span></header>
<div class="screen-body capture-body">
<div class="capture-frame" id="capture-frame">
<img id="capture-preview" class="capture-preview" alt="" hidden />
<div class="face-guide" id="face-guide"><div class="oval"></div></div>
<p class="capture-hint" id="capture-hint">์–ผ๊ตด์ด ์ž˜ ๋ณด์ด๊ฒŒ ์ •๋ฉด์œผ๋กœ ๋งž์ถฐ ์ฃผ์„ธ์š”</p>
</div>
<div class="chips"><span class="chip">๋ฐ์€ ๊ณณ</span><span class="chip">์ •๋ฉด</span><span class="chip">์ •์ง€</span></div>
</div>
<div class="screen-foot capture-foot">
<div id="capture-actions">
<button class="btn btn-primary" id="btn-shoot">๐Ÿ“ท ์‚ฌ์ง„ ์ดฌ์˜</button>
<button class="btn btn-text" id="btn-gallery">๊ฐค๋Ÿฌ๋ฆฌ์—์„œ ์„ ํƒ</button>
</div>
<div id="capture-confirm" hidden>
<div class="gender-pick" id="gender-pick" role="group" aria-label="์„ฑ๋ณ„ ์„ ํƒ">
<span class="gender-pick-label">์„ฑ๋ณ„</span>
<div class="gender-seg">
<button type="button" class="gender-opt active" data-gender="auto">์ž๋™</button>
<button type="button" class="gender-opt" data-gender="woman">์—ฌ์„ฑ</button>
<button type="button" class="gender-opt" data-gender="man">๋‚จ์„ฑ</button>
</div>
</div>
<button class="btn btn-primary" id="btn-use">์ด ์‚ฌ์ง„์œผ๋กœ</button>
<button class="btn btn-text" id="btn-retake">๋‹ค์‹œ ์ฐ๊ธฐ</button>
</div>
</div>
</section>
<!-- 4/7 LOADING -->
<section class="screen" id="screen-loading" data-step="3">
<div class="loading-bg" id="loading-bg"></div>
<div class="loading-center">
<div class="ring"></div>
<h1 class="title light">AI๊ฐ€ ์–ผ๊ตด์„ ๋ณด์ •ํ•˜๊ณ  ์žˆ์–ด์š”</h1>
<p class="loading-pct" id="loading-pct">0%</p>
<div class="progress"><div class="progress-fill" id="progress-fill"></div></div>
<p class="loading-time" id="loading-time">๋ณดํ†ต 15์ดˆ, ๊ธธ๋ฉด 1๋ถ„ ์ •๋„ ๊ฑธ๋ ค์š”</p>
<div class="value-banner">ํ—ค์–ด ยท ์˜์ƒ ยท ๋ฐฐ๊ฒฝ์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค</div>
<div class="loading-notice" id="loading-notice" aria-live="polite">
<span class="notice-tag">๊ณต์ง€</span>
<span class="notice-text" id="notice-text">ํ—ค์–ดยท์˜์ƒยท๋ฐฐ๊ฒฝ์€ ๊ทธ๋Œ€๋กœ, ์–ผ๊ตด๋งŒ ๋” ๋ฉ‹์ง€๊ฒŒ ๋ณด์ •๋ผ์š”.</span>
</div>
</div>
</section>
<!-- 5/7 RESULT -->
<section class="screen" id="screen-result" data-step="4">
<header class="topbar"><button class="icon-btn" data-go="capture" aria-label="๋’ค๋กœ">โ€น</button><span class="topbar-title">๊ฒฐ๊ณผ</span><span class="icon-btn ghost"></span></header>
<div class="screen-body">
<!-- photo/video shown SEPARATELY (tabs appear only after a clip is made) -->
<div class="share-tabs" id="result-tabs" hidden>
<button type="button" class="share-tab active" id="result-tab-photo">์‚ฌ์ง„</button>
<button type="button" class="share-tab" id="result-tab-video">์˜์ƒ</button>
</div>
<div id="result-photo-wrap">
<div class="ba" id="ba">
<img class="ba-after" id="ba-after" alt="AI ๊ฒฐ๊ณผ" />
<img class="ba-before" id="ba-before" alt="์›๋ณธ" />
<span class="ba-tag ba-tag-l">์›๋ณธ</span>
<span class="ba-tag ba-tag-r">AI</span>
<span class="wm">AI ๊ฐ€์ƒ ๋ชจ๋ธ ยท LeeChard</span>
</div>
<input type="range" id="ba-range" class="ba-range" min="0" max="100" value="50" aria-label="์›๋ณธ/AI ๋น„๊ต" />
</div>
<div class="share-frame" id="result-video-wrap" hidden>
<video id="result-video" class="share-video" controls playsinline loop muted></video>
</div>
<div class="chips center">
<span class="chip gold">ํ—ค์–ด ์œ ์ง€</span><span class="chip gold">๋ฐฐ๊ฒฝ ์œ ์ง€</span><span class="chip gold">AI ๊ฐ€์ƒ ๋ชจ๋ธ ํ‘œ์‹œ</span>
</div>
<p class="disclosure">์ด ์ด๋ฏธ์ง€๋Š” AI๋กœ ์ƒ์„ฑยทํŽธ์ง‘๋œ ๊ฒฐ๊ณผ๋กœ, ์‹ค์ œ ๋ณด์ • ์ „ ์‚ฌ์ง„์ด ์•„๋‹™๋‹ˆ๋‹ค.</p>
</div>
<div class="screen-foot">
<button class="btn btn-primary" id="result-go">QR๋กœ ์ „๋‹ฌํ•˜๊ธฐ</button>
<div class="action-row">
<button class="btn btn-outline" id="btn-save">๐Ÿ“ฅ ์‚ฌ์ง„ ์ €์žฅ</button>
<button class="btn btn-outline" id="btn-video">โœจ ์˜์ƒ ๋งŒ๋“ค๊ธฐ</button>
</div>
<p class="video-status" id="video-status" hidden></p>
<button class="btn btn-text" data-go="capture">๋‹ค์‹œ ์ฐ๊ธฐ</button>
</div>
</section>
<!-- 6/7 QR -->
<section class="screen" id="screen-qr" data-step="5">
<header class="topbar"><button class="icon-btn" data-go="result" aria-label="๋’ค๋กœ">โ€น</button><span class="topbar-title">QR ์ „์†ก</span><span class="icon-btn ghost"></span></header>
<div class="screen-body center-col">
<h1 class="title">ํœด๋Œ€ํฐ์œผ๋กœ ๋ฐ›๊ธฐ</h1>
<div class="qr-card"><img id="qr-img" class="qr-img" alt="QR ์ฝ”๋“œ" /></div>
<p class="qr-instr">์†๋‹˜ ํœด๋Œ€ํฐ์œผ๋กœ QR์„ ์Šค์บ”ํ•˜์„ธ์š”</p>
<div class="link-row"><span class="link-text" id="share-link"></span><button class="btn-copy" id="btn-copy">๋ณต์‚ฌ</button></div>
<div class="note-card">์›๋ณธ ์‚ฌ์ง„์€ ์„œ๋ฒ„์— ์ €์žฅ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์ด ๋งํฌ๋Š” 7์ผ ํ›„ ๋งŒ๋ฃŒ๋ฉ๋‹ˆ๋‹ค.</div>
</div>
<div class="screen-foot"><button class="btn btn-primary" data-go="done">์™„๋ฃŒ</button></div>
</section>
<!-- 7/7 DONE -->
<section class="screen" id="screen-done" data-step="6">
<div class="screen-body center-col">
<div class="success-check">โœ“</div>
<h1 class="title">์ „๋‹ฌ ์ค€๋น„ ์™„๋ฃŒ</h1>
<img id="done-thumb" class="done-thumb" alt="๊ฒฐ๊ณผ ๋ฏธ๋ฆฌ๋ณด๊ธฐ" />
<p class="fineprint">์†๋‹˜์ด QR๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„ ์ €์žฅํ•  ์ˆ˜ ์žˆ์–ด์š”.</p>
</div>
<div class="screen-foot"><button class="btn btn-primary" id="done-home">์ฒ˜์Œ์œผ๋กœ</button></div>
</section>
<!-- ERROR -->
<section class="screen" id="screen-error">
<div class="screen-body center-col">
<div class="error-mark">!</div>
<h1 class="title" id="error-title">๋‹ค์‹œ ์‹œ๋„ํ•ด ์ฃผ์„ธ์š”</h1>
<p class="error-msg" id="error-msg"></p>
</div>
<div class="screen-foot">
<button class="btn btn-primary" id="error-retry">๋‹ค์‹œ ์‹œ๋„</button>
<button class="btn btn-text" data-go="landing">์ฒ˜์Œ์œผ๋กœ</button>
</div>
</section>
<!-- CUSTOMER SHARE (/result/{token}) -->
<section class="screen" id="screen-share">
<div class="share-head"><p class="brand-logo small">LeeChard</p></div>
<div class="screen-body center-col">
<!-- photo/video are SEPARATE views: tabs appear only when a video exists;
the photo shows alone by default (clean, no frame decorations) -->
<div class="share-tabs" id="share-tabs" hidden>
<button type="button" class="share-tab active" id="tab-photo">์‚ฌ์ง„</button>
<button type="button" class="share-tab" id="tab-video">์˜์ƒ</button>
</div>
<div class="share-frame" id="share-photo-wrap"><img id="share-img" class="share-img" alt="AI ๊ฒฐ๊ณผ" /></div>
<div class="share-frame" id="share-video-wrap" hidden>
<video id="share-video" class="share-video" controls playsinline loop muted></video>
</div>
<button class="btn btn-primary" id="share-save">๐Ÿ“ฅ ์‚ฌ์ง„ ์ €์žฅ</button>
<p class="disclosure">AI๋กœ ์ƒ์„ฑยทํŽธ์ง‘๋œ ๊ฐ€์ƒ ๊ฒฐ๊ณผ ์ด๋ฏธ์ง€์ž…๋‹ˆ๋‹ค.</p>
<p class="fineprint">์ €์žฅ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๊ฐค๋Ÿฌ๋ฆฌ์— ์ €์žฅ๋ผ์š” ยท ๋งํฌ๋Š” 7์ผ ํ›„ ๋งŒ๋ฃŒ๋ฉ๋‹ˆ๋‹ค.</p>
</div>
</section>
<!-- EXPIRED -->
<section class="screen" id="screen-expired">
<div class="screen-body center-col">
<div class="error-mark muted">โณ</div>
<h1 class="title">๋งํฌ๊ฐ€ ๋งŒ๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค</h1>
<p class="error-msg">์ด ๊ณต์œ  ๋งํฌ๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์–ด์š”.</p>
</div>
</section>
<!-- ACCESS GATE (shown only when the deployment requires a code) -->
<section class="screen" id="screen-access">
<div class="screen-body center-col">
<p class="brand-logo">LeeChard</p>
<h1 class="title">์ ‘์† ์ฝ”๋“œ ์ž…๋ ฅ</h1>
<p class="fineprint">๋งค์žฅ์—์„œ ๋ฐ›์€ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”</p>
<input id="access-input" class="code-input" type="password" inputmode="text" autocomplete="off" placeholder="์ ‘์† ์ฝ”๋“œ" />
<p class="error-msg" id="access-error" hidden>์ฝ”๋“œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์•„์š”</p>
</div>
<div class="screen-foot"><button class="btn btn-primary" id="access-go">์ž…์žฅ</button></div>
</section>
<!-- RECENT (operator: server-backed work history โ€” visible on any tablet) -->
<section class="screen" id="screen-recent">
<header class="topbar"><button class="icon-btn" data-go="landing" aria-label="๋’ค๋กœ">โ€น</button><span class="topbar-title">์ž‘์—… ๋‚ด์—ญ</span><button class="icon-btn" id="recent-refresh" aria-label="์ƒˆ๋กœ๊ณ ์นจ" title="์ƒˆ๋กœ๊ณ ์นจ">โ†ป</button></header>
<div class="screen-body">
<p class="recent-note">๋งค์žฅ์—์„œ ๋งŒ๋“  ์ตœ๊ทผ ์ž‘์—…์ด์—์š” ยท ์–ด๋А ํƒœ๋ธ”๋ฆฟ์—์„œ๋„ ๋ณด์—ฌ์š”</p>
<div class="recent-grid" id="recent-grid"></div>
<p class="recent-empty" id="recent-empty" hidden>์•„์ง ์ž‘์—… ๋‚ด์—ญ์ด ์—†์–ด์š”.<br />์‚ฌ์ง„์„ ๋งŒ๋“ค๋ฉด ์—ฌ๊ธฐ์— ๋ชจ์—ฌ์š”.</p>
</div>
</section>
<!-- RECENT VIEW (tap a thumbnail โ€” photo/video shown SEPARATELY, save either) -->
<section class="screen" id="screen-recent-view">
<header class="topbar"><button class="icon-btn" data-go="recent" aria-label="๋’ค๋กœ">โ€น</button><span class="topbar-title">๊ฒฐ๊ณผ ๋ณด๊ธฐ</span><span class="icon-btn ghost"></span></header>
<div class="screen-body center-col">
<div class="share-tabs" id="rv-tabs" hidden>
<button type="button" class="share-tab active" id="rv-tab-photo">์‚ฌ์ง„</button>
<button type="button" class="share-tab" id="rv-tab-video">์˜์ƒ</button>
</div>
<div class="share-frame" id="rv-photo-wrap"><img id="rv-img" class="share-img" alt="AI ๊ฒฐ๊ณผ" /></div>
<div class="share-frame" id="rv-video-wrap" hidden><video id="rv-video" class="share-video" controls playsinline loop></video></div>
<p class="disclosure">AI๋กœ ์ƒ์„ฑยทํŽธ์ง‘๋œ ๊ฐ€์ƒ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.</p>
</div>
<div class="screen-foot">
<button class="btn btn-primary" id="rv-save">๐Ÿ“ฅ ์ €์žฅ</button>
<div class="link-row"><span class="link-text" id="recent-link"></span><button class="btn-copy" id="recent-copy">๋ณต์‚ฌ</button></div>
</div>
</section>
</main>
<input id="photo-input" type="file" accept="image/*" capture="environment" hidden />
<div class="toast" id="toast" role="status" aria-live="polite"></div>
<script src="/static/js/app.js?v=21" defer></script>
</body>
</html>