Spaces:
Sleeping
Sleeping
| * { | |
| 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 ; | |
| } | |
| 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; | |
| } | |
| } | |