+ ${title}
+2026.05.24 SUN
+OUR WEDDING ARCHIVE
+${isError ? "PLEASE TRY AGAIN" : "THANK YOU"}
+${escapeHtml(heading)}
+${escapeHtml(message)}
+ ${isError ? "다시 올리기" : "사진 더 올리기"} +diff --git a/src/public/upload.css b/src/public/upload.css index 557ce9e..406cdaa 100644 --- a/src/public/upload.css +++ b/src/public/upload.css @@ -123,7 +123,9 @@ h1 { transform: scaleX(-1); } -.upload-button { +.select-button, +.upload-button, +.upload-again { position: relative; display: grid; place-items: center; @@ -147,6 +149,19 @@ h1 { font-weight: 400; letter-spacing: 0.08em; cursor: pointer; + text-decoration: none; +} + +.select-button { + margin-bottom: 14px; + background: + radial-gradient(ellipse at 50% 0%, rgba(255, 255, 255, 0.2), transparent 58%), + linear-gradient(180deg, #f8f8f6 0%, #eeeee9 100%); + box-shadow: + 0 9px 18px rgba(85, 85, 85, 0.11), + inset 0 0 0 1px rgba(83, 83, 83, 0.14); + color: #565656; + font-size: clamp(24px, 4.6vw, 32px); } .file-picker input[type="file"] { @@ -158,16 +173,64 @@ h1 { cursor: pointer; } -.submit-fallback { - position: absolute; - width: 1px; - height: 1px; - margin: -1px; +.file-summary { + margin: 0 0 14px; + padding: 16px 18px; + border: 1px solid rgba(137, 166, 158, 0.35); + border-radius: 8px; + background: rgba(255, 255, 255, 0.86); + box-shadow: 0 8px 18px rgba(55, 55, 55, 0.06); + text-align: left; +} + +.file-summary__title { + margin: 0 0 10px; + color: #45615c; + font-family: "Apple SD Gothic Neo", "Malgun Gothic", system-ui, sans-serif; + font-size: 14px; + font-weight: 700; +} + +.file-list { + display: grid; + gap: 8px; + margin: 0; padding: 0; + list-style: none; +} + +.file-list li { + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + gap: 12px; + align-items: center; + color: #4f4f4f; + font-family: "Apple SD Gothic Neo", "Malgun Gothic", system-ui, sans-serif; + font-size: 13px; +} + +.file-list span:first-child { overflow: hidden; - clip: rect(0 0 0 0); + text-overflow: ellipsis; white-space: nowrap; - border: 0; +} + +.file-list span:last-child { + color: #87928f; + font-size: 12px; +} + +.upload-status { + min-height: 22px; + margin: 12px 0 0; + color: #64736f; + font-family: "Apple SD Gothic Neo", "Malgun Gothic", system-ui, sans-serif; + font-size: 13px; + line-height: 1.45; +} + +.upload-status[data-type="error"] { + color: #a64635; } .upload-button:hover { @@ -177,12 +240,96 @@ h1 { linear-gradient(180deg, #216d65 0%, var(--deep-dark) 100%); } +.select-button:hover { + background: + radial-gradient(ellipse at 50% 0%, rgba(255, 255, 255, 0.26), transparent 58%), + linear-gradient(180deg, #ffffff 0%, #e9e9e3 100%); +} + +.upload-button:disabled { + opacity: 0.48; + cursor: default; +} + +.upload-panel[data-uploading="true"] .upload-button span { + visibility: hidden; +} + +.upload-panel[data-uploading="true"] .upload-button::after { + content: ""; + width: 28px; + height: 28px; + border: 3px solid rgba(255, 255, 255, 0.35); + border-top-color: #ffffff; + border-radius: 50%; + animation: spin 0.9s linear infinite; +} + .upload-button:focus-visible, +.upload-again:focus-visible, .file-picker:focus-within { outline: 3px solid #89aaa3; outline-offset: 3px; } +.thank-you { + width: min(100%, 420px); + margin: clamp(18px, 4vw, 28px) auto 0; + padding: 26px 24px 28px; + border: 1px solid rgba(137, 166, 158, 0.32); + border-radius: 10px; + background: rgba(255, 255, 255, 0.9); + box-shadow: 0 14px 30px rgba(55, 55, 55, 0.08); +} + +.thank-you__eyebrow { + margin: 0 0 10px; + color: #8aa69f; + font-family: "Times New Roman", "Batang", serif; + font-size: 15px; + font-weight: 700; + letter-spacing: 0.22em; +} + +.thank-you h2 { + margin: 0; + color: #4f4f4f; + font-size: clamp(31px, 6vw, 42px); + line-height: 1.15; + font-weight: 400; + letter-spacing: 0.08em; +} + +.thank-you p:last-of-type { + margin: 14px 0 22px; + color: #626262; + font-family: "Apple SD Gothic Neo", "Malgun Gothic", system-ui, sans-serif; + font-size: 15px; + line-height: 1.6; + word-break: keep-all; +} + +.thank-you--error { + border-color: rgba(166, 70, 53, 0.28); +} + +.thank-you--error .thank-you__eyebrow, +.thank-you--error h2 { + color: #8c4d43; +} + +.upload-again { + min-height: 58px; + margin: 0 auto; + font-size: clamp(22px, 4.4vw, 29px); +} + +@keyframes spin { + to { + transform: rotate(360deg); + } +} + @media (max-width: 430px) { .upload-page { padding-left: 7px; @@ -205,6 +352,10 @@ h1 { width: min(100%, 300px); } + .thank-you { + width: min(100%, 300px); + } + .upload-panel__today { font-size: clamp(23px, 6.5vw, 29px); } diff --git a/src/public/upload.html b/src/public/upload.html index d12bb20..339dabd 100644 --- a/src/public/upload.html +++ b/src/public/upload.html @@ -22,21 +22,107 @@
+ +THANK YOU
+소중한 오늘을 함께 남겨주셔서 고마워요.
+ 사진 더 올리기 +
+ 2026.05.24 SUN
+OUR WEDDING ARCHIVE
+${isError ? "PLEASE TRY AGAIN" : "THANK YOU"}
+${escapeHtml(message)}
+ ${isError ? "다시 올리기" : "사진 더 올리기"} +이 링크 전체에서 총 ${values.maxMb} MB까지 업로드할 수 있어.
@@ -372,7 +408,11 @@ app.post("/r/:slug", async (req, res) => { if (error) { await removeFiles(req.files); const message = "업로드 중 오류가 났어. 파일 형식과 용량을 확인해줘."; - res.status(400).send(page("업로드 실패", `