* { box-sizing: border-box; margin: 0; padding: 0; } :root { --bg: #fff2df; --panel: #fffaf2; --panel-soft: #fff6e8; --line: #6c4328; --text: #4a2b1a; --muted: #8a654f; --primary: #ff7f85; --primary-dark: #e7636d; --accent: #159947; --warning: #ffd84d; --shadow: 6px 7px 0 rgba(92, 55, 31, .92); } body { min-height: 100vh; max-width: 1180px; margin: 0 auto; padding: 28px 20px 44px; background: linear-gradient(180deg, #ff8a8e 0 128px, var(--bg) 128px); color: var(--text); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Pretendard", sans-serif; line-height: 1.55; position: relative; overflow-x: hidden; } body::before { content: ""; position: fixed; top: 0; left: 0; z-index: -1; width: 100%; height: 190px; pointer-events: none; background: radial-gradient(36px 80px at 7% 0, #fff2df 45%, transparent 47%), radial-gradient(44px 105px at 18% 0, #fff2df 45%, transparent 47%), radial-gradient(38px 92px at 33% 0, #fff2df 45%, transparent 47%), radial-gradient(48px 112px at 52% 0, #fff2df 45%, transparent 47%), radial-gradient(36px 82px at 66% 0, #fff2df 45%, transparent 47%), radial-gradient(42px 108px at 82% 0, #fff2df 45%, transparent 47%), radial-gradient(34px 78px at 96% 0, #fff2df 45%, transparent 47%), linear-gradient(#fff2df 0 84px, transparent 85px); } a { color: inherit; text-decoration: none; } [hidden] { display: none !important; } button, select, input { font: inherit; } button, .button-link { display: inline-flex; align-items: center; justify-content: center; min-height: 44px; border: 0; border: 2px solid var(--line); border-radius: 8px; padding: 0 18px; background: var(--primary); color: #ffffff; font-weight: 700; cursor: pointer; transition: background .18s ease, transform .18s ease, box-shadow .18s ease; box-shadow: 3px 4px 0 var(--line); } button:hover, .button-link:hover { background: var(--primary-dark); transform: translateY(-1px); } button:active { transform: translateY(0); } button:disabled { cursor: not-allowed; opacity: .55; transform: none; } .main-ui { opacity: 1; transform: translateY(0); transition: opacity .5s ease, transform .5s ease; } .main-ui.is-hidden { opacity: 0; transform: translateY(12px); pointer-events: none; } .intro-overlay { position: fixed; inset: 0; z-index: 50; display: grid; place-items: center; background: rgba(245, 247, 251, .9); backdrop-filter: blur(12px); transition: opacity .45s ease, visibility .45s ease; } .intro-overlay.is-done { opacity: 0; visibility: hidden; pointer-events: none; } .intro-content { display: grid; place-items: center; } .intro-start-btn { width: 104px; height: 104px; border-radius: 999px; padding: 0; background: var(--primary); color: #ffffff; box-shadow: 5px 6px 0 var(--line); } .intro-overlay.is-bursting .intro-start-btn { opacity: 0; transform: scale(.86); } .intro-dot { position: fixed; left: 50%; top: 50%; width: 7px; height: 7px; border-radius: 999px; background: var(--dot-color); transform: translate(-50%, -50%) scale(.4); animation: dotBurst .78s cubic-bezier(.16, 1, .3, 1) forwards; animation-delay: var(--dot-delay); pointer-events: none; } @keyframes dotBurst { 0% { opacity: 0; transform: translate(-50%, -50%) scale(.25); } 18% { opacity: 1; } 100% { opacity: 0; transform: translate(calc(-50% + var(--dot-x)), calc(-50% + var(--dot-y))) scale(var(--dot-scale)); } } .navbar { display: flex; align-items: center; justify-content: space-between; gap: 18px; min-height: 64px; padding: 10px 14px; margin-bottom: 38px; background: rgba(255, 250, 242, .94); border: 3px solid var(--line); border-radius: 8px; box-shadow: 4px 5px 0 var(--line); } .brand { display: inline-flex; align-items: center; gap: 10px; font-weight: 800; } .brand-mark { display: grid; place-items: center; width: 34px; height: 34px; border-radius: 8px; background: var(--primary); color: #ffffff; font-size: 12px; letter-spacing: 0; } .navbar nav { display: flex; align-items: center; gap: 8px; } .navbar nav a { min-height: 38px; display: inline-flex; align-items: center; padding: 0 13px; border-radius: 8px; color: var(--muted); font-weight: 700; } .navbar nav a:hover { background: #ffe0e2; color: var(--text); } .navbar nav a[aria-current="page"] { background: var(--primary); color: #ffffff; } .home-hero { display: grid; align-items: start; min-height: 360px; } .home-hero h1 { max-width: 1040px; margin-top: 8px; font-size: 48px; line-height: 1.16; word-break: keep-all; overflow-wrap: break-word; } .home-hero p:not(.eyebrow) { max-width: 920px; margin-top: 16px; color: var(--muted); font-size: 18px; word-break: keep-all; overflow-wrap: break-word; } .home-actions { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 28px; } .secondary-link { background: var(--panel); color: var(--text); } .page-heading { max-width: 980px; margin: 0 0 28px; } .page-heading.compact { margin-bottom: 22px; } .eyebrow { color: var(--primary-dark); font-size: 13px; font-weight: 800; letter-spacing: .06em; text-transform: uppercase; } .page-heading h1, .detail-body h1 { margin-top: 6px; font-size: 42px; line-height: 1.18; letter-spacing: 0; word-break: keep-all; overflow-wrap: break-word; } .page-heading p:not(.eyebrow) { margin-top: 12px; color: var(--muted); font-size: 17px; word-break: keep-all; overflow-wrap: break-word; } .card, .toolbar { background: var(--panel); border: 3px solid var(--line); border-radius: 8px; box-shadow: var(--shadow); } .predict-layout { display: grid; grid-template-columns: minmax(0, 680px); justify-content: center; align-items: start; gap: 22px; } .predict-layout:has(#resultBox:not([hidden])) { grid-template-columns: minmax(0, 1.04fr) minmax(330px, .96fr); } .upload-box, .result-card { padding: 22px; } .section-title { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; margin-bottom: 18px; } .section-title h2 { font-size: 21px; line-height: 1.25; } .section-title span { color: var(--muted); font-size: 13px; font-weight: 700; white-space: nowrap; } .upload-area { display: grid; place-items: center; min-height: clamp(300px, 35vw, 440px); margin-bottom: 16px; padding: 28px; border: 3px dashed rgba(108, 67, 40, .58); border-radius: 8px; background: var(--panel-soft); cursor: pointer; overflow: hidden; position: relative; transition: border-color .18s ease, background .18s ease; } .upload-area:hover, .upload-area.is-dragging { border-color: var(--primary); background: #fff0f1; } .upload-area.has-image { padding: 0; border-style: solid; background: #ffffff; } .upload-area input { display: none; } .upload-area span { color: var(--muted); font-weight: 800; text-align: center; } .upload-area.has-image span { display: none; } #preview { display: none; width: 100%; height: 100%; min-height: clamp(300px, 35vw, 440px); padding: 12px; object-fit: contain; } #preview[src] { display: block; } #cameraPreview { width: 100%; height: 100%; min-height: clamp(300px, 35vw, 440px); object-fit: cover; } .upload-area.is-camera { padding: 0; border-style: solid; background: #ffffff; } .upload-area.is-camera span, .upload-area.is-camera #preview { display: none; } .webcam-controls { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-bottom: 12px; } .result-card { min-height: clamp(300px, 35vw, 440px); } .result-summary { display: grid; gap: 6px; padding: 18px; margin-bottom: 16px; border-radius: 8px; background: #ffe0e2; border: 2px solid rgba(108, 67, 40, .2); } .result-summary span { font-size: clamp(34px, 5vw, 52px); line-height: 1; font-weight: 900; color: var(--primary); } .result-summary strong { color: var(--muted); font-size: 16px; } .score-list { display: grid; gap: 10px; list-style: none; margin-bottom: 18px; } .score-list li { display: grid; grid-template-columns: 44px 1fr 64px; align-items: center; gap: 10px; color: var(--muted); font-weight: 700; } .score-list .score-track { height: 8px; border-radius: 999px; background: #f1dcc7; overflow: hidden; } .score-list .score-bar { height: 100%; border-radius: inherit; background: var(--primary); } .result-row { display: flex; justify-content: space-between; gap: 18px; padding: 14px 0; border-bottom: 1px solid var(--line); } .result-row span { color: var(--muted); font-weight: 700; } .toolbar { display: flex; align-items: end; justify-content: space-between; gap: 14px; padding: 16px; margin-bottom: 22px; } .alphabet-tabs { display: flex; flex-wrap: wrap; gap: 8px; } .tab-chip { min-width: 42px; min-height: 42px; padding: 0 14px; background: #ffffff; color: var(--text); } .tab-chip.is-active { background: var(--primary); color: #ffffff; } .post-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 18px; } .post-card { display: grid; overflow: hidden; min-height: 100%; background: var(--panel); border: 3px solid var(--line); border-radius: 8px; color: inherit; box-shadow: 4px 5px 0 rgba(108, 67, 40, .9); transition: transform .18s ease, box-shadow .18s ease; animation: slideInFromRight .42s cubic-bezier(.16, 1, .3, 1) both; animation-delay: var(--card-delay, 0s); } .post-card:hover { transform: translateY(-3px); box-shadow: var(--shadow); } .post-card img { width: 100%; aspect-ratio: 4 / 3; object-fit: cover; background: var(--panel-soft); } .post-image-link { display: block; } .post-body { display: grid; gap: 10px; padding: 16px; } .post-letter-row { display: flex; align-items: center; justify-content: space-between; gap: 12px; } .post-letter { font-size: 34px; line-height: 1; font-weight: 900; color: var(--primary-dark); } .post-body h3 { font-size: 17px; line-height: 1.3; } .title-input { min-width: 0; height: 40px; padding: 0 11px; border: 2px solid rgba(108, 67, 40, .38); border-radius: 8px; background: #ffffff; color: var(--text); font-weight: 800; } .title-input:focus { border-color: var(--primary); outline: 3px solid rgba(255, 127, 133, .22); } .detail-link { color: var(--muted); font-size: 14px; font-weight: 800; text-decoration: underline; text-underline-offset: 3px; } .post-meta { display: flex; align-items: center; justify-content: space-between; gap: 12px; } .post-label { display: inline-flex; align-items: center; min-height: 30px; padding: 0 10px; border-radius: 999px; background: #ffe0e2; color: var(--text); font-weight: 800; } .post-confidence { color: var(--muted); font-weight: 800; } .confidence-badge { display: inline-flex; align-items: center; min-height: 30px; padding: 0 10px; border-radius: 999px; font-size: 13px; font-weight: 800; border: 2px solid rgba(108, 67, 40, .14); } .confidence-stable { background: #dff4e8; color: #1f6b3e; } .confidence-review { background: #fff1c8; color: #8f6510; } .confidence-retry { background: #ffe0e2; color: #a23c47; } .word-learning { display: grid; gap: 22px; } .word-input-panel { display: grid; gap: 8px; padding: 18px; background: var(--panel); border: 3px solid var(--line); border-radius: 8px; box-shadow: 4px 5px 0 rgba(108, 67, 40, .9); } .word-input-panel label { color: var(--muted); font-size: 13px; font-weight: 900; text-transform: uppercase; } .word-input-panel input { width: 100%; min-height: 48px; padding: 0 14px; border: 2px solid rgba(108, 67, 40, .28); border-radius: 8px; background: #ffffff; color: var(--text); font-size: 20px; font-weight: 900; text-transform: uppercase; } .practice-compare { display: grid; grid-template-columns: minmax(260px, .92fr) minmax(320px, 1.08fr); gap: 18px; align-items: stretch; } .letter-step { color: var(--muted); font-size: 13px; font-weight: 900; } .letter-controls { display: flex; gap: 10px; flex-wrap: wrap; } .love-letters { display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 12px; } .letter { display: grid; gap: 10px; padding: 18px; background: var(--panel); border: 3px solid var(--line); border-radius: 8px; box-shadow: 4px 5px 0 rgba(108, 67, 40, .9); } .letter h3 { color: var(--primary-dark); font-size: 34px; line-height: 1; } .letter img { width: 100%; aspect-ratio: 1 / 1; object-fit: contain; background: var(--panel-soft); border: 2px solid rgba(108, 67, 40, .22); border-radius: 8px; } .letter p, .practice p, footer p { color: var(--muted); } .letter-choice { cursor: pointer; gap: 8px; padding: 12px; text-align: left; } .letter-choice h3 { font-size: 28px; } .letter-choice p { font-size: 13px; font-weight: 800; } .letter-choice:hover { background: var(--panel-soft); } .letter-choice.is-active { outline: 3px solid var(--primary); outline-offset: 3px; } .practice { display: grid; gap: 14px; align-content: start; padding: 22px; background: var(--panel); border: 3px solid var(--line); border-radius: 8px; box-shadow: var(--shadow); } .practice video, .practice canvas { width: 100%; max-width: 640px; aspect-ratio: 4 / 3; object-fit: cover; transform: scaleX(-1); border-radius: 8px; background: var(--panel-soft); border: 2px solid rgba(108, 67, 40, .22); } .practice canvas { display: none; } footer { margin-top: 28px; text-align: center; } #loadMoreBtn { grid-column: 1 / -1; justify-self: center; min-width: 150px; margin-top: 6px; } .empty-state { grid-column: 1 / -1; padding: 34px 20px; text-align: center; color: var(--muted); background: var(--panel); border: 3px solid var(--line); border-radius: 8px; } .detail-shell { max-width: 960px; margin: 0 auto; } .detail-card { display: grid; grid-template-columns: minmax(0, 1.05fr) minmax(300px, .95fr); overflow: hidden; } .detail-image { width: 100%; height: 100%; min-height: 420px; object-fit: contain; background: var(--panel-soft); border-right: 1px solid var(--line); } .detail-body { padding: 26px; } .detail-body h1 { font-size: clamp(26px, 3vw, 38px); } .detail-title-row { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: start; gap: 14px; margin-bottom: 18px; } .detail-actions { display: flex; gap: 8px; } .detail-link-row { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 20px; } .detail-title-editor { display: grid; grid-template-columns: minmax(0, 1fr) auto auto; gap: 8px; margin-bottom: 18px; } .detail-title-editor button { min-height: 40px; padding: 0 12px; } .secondary-btn { background: var(--panel); color: var(--text); } .danger-btn { background: #b64040; } .danger-btn:hover { background: #983333; } @keyframes slideInFromRight { from { opacity: 0; transform: translateY(14px); } to { opacity: 1; transform: translateY(0); } } @media (max-width: 820px) { body { padding: 18px 14px 34px; } .navbar { align-items: flex-start; flex-direction: column; margin-bottom: 28px; } .home-hero { min-height: auto; } .home-hero h1 { font-size: 34px; } .page-heading h1, .detail-body h1 { font-size: 30px; } .predict-layout, .predict-layout:has(#resultBox:not([hidden])), .detail-card { grid-template-columns: 1fr; } .practice-compare { grid-template-columns: 1fr; } .detail-image { min-height: 300px; border-right: 0; border-bottom: 1px solid var(--line); } .toolbar { flex-direction: column; align-items: stretch; justify-content: stretch; } .alphabet-tabs { width: 100%; } .toolbar .button-link, .detail-link-row .button-link { width: 100%; } .detail-title-row, .detail-title-editor { grid-template-columns: 1fr; } .webcam-controls { grid-template-columns: 1fr; } }