eunzzang's picture
Fix learning route build and restore word learning layout
11ab88a verified
Raw
History Blame Contribute Delete
18.7 kB
* {
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;
}
}