Awwwards 사례 연구

욕실 그림과 입력을 반씩 나눈 구독창

섹션 · MIT

섹션 더 보기
CASE STUDY
욕실 그림과 입력을 반씩 나눈 구독창 정적 미리보기

갤러리 안에서는 화면을 벗어나거나 움직임을 멈추면 예제도 닫힙니다. 다시 재생할 때는 처음부터 시작해요.

큰 화면으로 보기 새 탭실행 HTML 저장

저장한 HTML에서는 갤러리의 재생 설정이 적용되지 않아요.

SOURCE FILES

독립 예제 코드 읽기

5개 파일

사례의 구도나 문서의 원리를 바탕으로 새로 만든 예제입니다. 아래 코드를 복사해 직접 응용할 수 있습니다. 실행 HTML에는 미리보기를 위한 실행 환경이 들어 있습니다.

index.html독립 구현
파일 저장

<!doctype html>
<html lang="ko"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline'; style-src 'unsafe-inline'; img-src data:; media-src data:; font-src data:; connect-src 'none'; base-uri 'none'; form-action 'none'"><title>욕실 그림과 입력을 반씩 나눈 구독창 · 독립 장면 연구</title><style>/* Generated by scripts/build-awwwards-studies.mjs from vendor/awwwards-studies/scenes*.mjs and runtime.mjs. Edit those authoring modules for repository changes.

MIT License

Copyright (c) 2026 StyleGallery contributors

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Scope: Newly authored HTML, CSS, JavaScript and SVG study only. This grant does not cover any referenced website, brand, article, photograph, screenshot or original asset. None is included in this package.
 */

*{box-sizing:border-box}html,body{margin:0;min-height:100%;font-family:Arial,Helvetica,sans-serif}body{background:var(--bg,#f5f2eb);color:var(--fg,#181818)}button,input,select{font:inherit}button,a,input,select,summary{touch-action:manipulation}button{cursor:pointer}button:focus-visible,a:focus-visible,input:focus-visible,select:focus-visible,summary:focus-visible{outline:3px solid var(--focus,#ef6b3f);outline-offset:4px}button{color:inherit}button:disabled{cursor:default;opacity:.45}svg{display:block;max-width:100%}a{color:inherit}.stage{isolation:isolate;min-height:100vh;overflow:hidden;padding:26px;position:relative}.art{pointer-events:none}.eyebrow{font:10px/1.5 ui-monospace,monospace;letter-spacing:.12em;text-transform:uppercase}.topline{align-items:center;display:flex;gap:14px;justify-content:space-between;position:relative;z-index:5}.topline strong{font-size:13px;letter-spacing:-.04em}.topline nav{display:flex;gap:12px}h1,h2,p{margin:0}h1{font-size:clamp(42px,9vw,116px);font-weight:600;letter-spacing:-.065em;line-height:.94}h2{font-size:clamp(24px,4vw,44px);letter-spacing:-.04em;line-height:1.05}.serif{font-family:Georgia,'Times New Roman',serif;font-weight:400}.copy{font-size:13px;line-height:1.55;max-width:31em}.pill{align-items:center;background:var(--fg,#181818);border:1px solid transparent;border-radius:99px;color:var(--bg,#f5f2eb);display:inline-flex;gap:18px;justify-content:center;min-height:40px;padding:10px 19px;text-decoration:none}.ghost{background:transparent;border-color:currentColor;color:inherit}.small{font-size:11px}.huge{font-size:clamp(68px,18vw,220px);line-height:.8}.caption{font:10px/1.4 ui-monospace,monospace}.controls{align-items:center;display:flex;flex-wrap:wrap;gap:8px;position:relative;z-index:6}.controls button{background:transparent;border:1px solid currentColor;border-radius:999px;font-size:11px;min-height:34px;padding:7px 12px}.controls button[aria-pressed=true]{background:var(--fg);color:var(--bg)}.bottomline{align-items:end;display:flex;gap:20px;justify-content:space-between;position:relative;z-index:4}.stack{display:grid;gap:18px}.row{align-items:center;display:flex;gap:16px}.visually-hidden{clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}.feedback{font-size:12px;min-height:18px}.surface{background:var(--panel,#fff);border:1px solid #8883;border-radius:16px;padding:24px}.scene-footer{bottom:13px;left:26px;position:absolute;right:26px}.artfill{height:100%;left:0;position:absolute;top:0;width:100%;z-index:-1}.artfill svg{height:100%;width:100%}.line{border-top:1px solid currentColor;opacity:.4}input,select{border:1px solid #8887;border-radius:7px;min-height:38px;min-width:0;padding:8px 10px;width:100%}input[type=range]{accent-color:var(--accent,#ed6447);min-height:28px;padding:0}details>summary{cursor:pointer;list-style:none}details>summary::-webkit-details-marker{display:none}[hidden]{display:none!important}.flow{display:grid;gap:24px}dialog{background:var(--panel,#fff);border:0;border-radius:12px;color:#171717;max-width:calc(100vw - 34px);padding:28px;width:430px}dialog::backdrop{background:#111a;backdrop-filter:blur(5px)}dialog form{display:grid;gap:15px}dialog .close{background:transparent;border:0;float:right;font-size:25px}body[data-preview-status=error]::after{background:#781b21;color:white;content:'Preview error';padding:8px;position:fixed;right:0;top:0}.motion{animation-play-state:paused!important}.stage[data-playing=true] .motion{animation-play-state:running!important}@media(prefers-reduced-motion:reduce){*,*::before,*::after{animation:none!important;scroll-behavior:auto!important;transition:none!important}}@media(max-width:480px){.stage{padding:18px}.topline nav{gap:8px}.eyebrow{font-size:9px}.scene-footer{left:18px;right:18px}.copy{font-size:12px}.topline{gap:8px}.topline strong{font-size:12px}.surface{padding:17px}}


  :root{--bg:#e3dfd1;--fg:#515548}.stage{min-height:570px}.house-still-art{inset:70px 0 0;opacity:.5;position:absolute;z-index:-1}.house-still-art>div{overflow:hidden;position:absolute;width:150px}.house-still-art>div:nth-child(1){height:220px;left:4%;top:25px;transform:rotate(-5deg)}.house-still-art>div:nth-child(2){right:6%;top:220px;transform:rotate(6deg);width:225px}.house-still-art>div:nth-child(3){left:23%;top:330px;width:90px}.house-still-art svg{height:100%;width:100%}.house-heading{font-size:clamp(40px,7vw,76px);margin:150px 0 25px;text-align:center}.house-reopen{display:flex;margin:auto}.house-letter{background:#ece8d8;border-radius:0;max-width:calc(100vw - 32px);padding:0;width:750px}.house-letter::backdrop{background:#363a3766;backdrop-filter:blur(3px)}.house-letter>.close{color:#3e493e;font-size:26px;padding:5px 10px;position:absolute;right:5px;top:5px;z-index:2}.house-letter-grid{display:grid;grid-template-columns:1fr 1fr}.house-letter-image{overflow:hidden}.house-letter-image svg{height:100%;object-fit:cover;width:100%}.house-letter form{align-content:center;gap:22px;padding:45px 33px}.house-letter h2{font-size:clamp(31px,4.8vw,45px);letter-spacing:-.04em}.house-letter .copy{font-size:11px}.house-letter label{font-size:11px}.house-letter input{background:none;border:0;border-bottom:1px solid #838774;border-radius:0;margin-top:10px;padding:8px 0}.house-letter-submit{background:none;border:2px solid #6b785b;border-radius:43% 52% 40% 49% / 20% 27% 25% 21%;font-size:12px;min-height:45px;transform:rotate(-2deg)}.house-letter .feedback{color:#68705c;font-size:10px;line-height:1.5}@media(max-width:500px){.house-letter-grid{grid-template-columns:1fr}.house-letter-image{height:145px}.house-letter-image svg{object-fit:cover;object-position:50% 65%}.house-letter form{gap:17px;padding:25px}.house-letter>.close{background:#ece8d8cc;border-radius:50%;right:8px;top:8px}.house-letter h2{font-size:34px}}</style></head><body><main id="root"><section class="stage" aria-label="욕실 그림과 입력을 반씩 나눈 구독창">
  <header class="topline"><strong>SUNDAY / HOUSE</strong><span class="eyebrow">A COLLECTION OF QUIET ROOMS</span></header>
  <div class="house-still-art art"><div><svg aria-hidden="true" focusable="false" viewBox="0 0 520 650" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient id="drawing-0-bath-wall" x2="1" y2="1"><stop stop-color="#b9b1a0"/><stop offset="1" stop-color="#716d5d"/></linearGradient><linearGradient id="drawing-0-bath-light" x2="0" y2="1"><stop stop-color="#dedbd0"/><stop offset="1" stop-color="#81978b"/></linearGradient></defs><rect width="520" height="650" fill="url(#drawing-0-bath-wall)"/><path d="M0 485L520 414V650H0" fill="#68614f"/><path d="M0 523L520 451M0 579L520 506M70 484L199 650M226 461L365 650M371 439L504 608" stroke="#9a9077" stroke-width="2"/><rect x="215" y="58" width="246" height="305" rx="113" fill="#ddd7bd"/><rect x="231" y="74" width="214" height="273" rx="99" fill="url(#drawing-0-bath-light)"/><path d="M249 283Q339 128 433 237V327H249" fill="#597362"/><path d="M45 384L416 360 448 422 84 460Z" fill="#dcd7c4"/><path d="M84 460L448 422 428 538 150 572Z" fill="#bbb8aa"/><ellipse cx="240" cy="409" rx="154" ry="28" fill="#858f82"/><ellipse cx="240" cy="411" rx="134" ry="20" fill="#bdccc1"/><path d="M134 340V381M134 340Q134 316 156 316H180" fill="none" stroke="#393e33" stroke-width="11"/><path d="M75 0V307" stroke="#303f32" stroke-width="3"/><ellipse cx="75" cy="316" rx="30" ry="44" fill="#e7cc8c"/><path d="M428 543V603M150 574V620" stroke="#5a6255" stroke-width="7"/></svg></div><div><svg aria-hidden="true" focusable="false" viewBox="0 0 1000 600" xmlns="http://www.w3.org/2000/svg"><rect width="1000" height="600" fill="#849264"/><path d="M0 370L440 65 1000 115V600H0" fill="#a2a477"/><path d="M161 106L517 50 753 216 384 303Z" fill="#ded5b7"/><path d="M195 113L505 69 698 205 390 271Z" fill="#ae8062"/><path d="M203 121L399 247 683 205M398 87L543 235" stroke="#c99e7d" stroke-width="14"/><path d="M383 301L751 216V352L390 452Z" fill="#d3c7aa"/><path d="M160 105L384 303 390 452 170 260Z" fill="#a9a58a"/><path d="M448 324L504 309V389L448 405M555 294L613 280V361L555 378M658 266L719 250V328L658 345" fill="#647b66"/><path d="M312 475L700 366 891 474 501 595Z" fill="#daceb0"/><path d="M386 479L672 398 793 472 508 555Z" fill="#436f75"/><path d="M408 480L672 408 771 470 509 543Z" fill="#78b9b3"/><path d="M429 480L670 419M459 502L700 439M490 523L728 460" stroke="#b3ddd0" stroke-width="3"/><path d="M91 363L261 312 287 390 113 442Z" fill="#b7a688"/><g fill="#34573b"><circle cx="61" cy="95" r="52"/><circle cx="81" cy="81" r="31.2" fill="#4c6e43"/><circle cx="844" cy="151" r="90"/><circle cx="864" cy="137" r="54" fill="#4c6e43"/><circle cx="928" cy="335" r="65"/><circle cx="948" cy="321" r="39" fill="#4c6e43"/><circle cx="71" cy="514" r="78"/><circle cx="91" cy="500" r="46.8" fill="#4c6e43"/><circle cx="256" cy="532" r="58"/><circle cx="276" cy="518" r="34.8" fill="#4c6e43"/><circle cx="782" cy="55" r="54"/><circle cx="802" cy="41" r="32.4" fill="#4c6e43"/><circle cx="445" cy="25" r="48"/><circle cx="465" cy="11" r="28.799999999999997" fill="#4c6e43"/></g><ellipse cx="825" cy="392" rx="37" ry="22" fill="#e4ddc2"/><path d="M825 392V433" stroke="#777b5c" stroke-width="6"/></svg></div><div><svg aria-hidden="true" focusable="false" viewBox="0 0 800 500" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient id="drawing-2-stone-shade" x2="1" y2="1"><stop stop-color="#fafafa"/><stop offset=".5" stop-color="#8d8d8a"/><stop offset="1" stop-color="#292a29"/></linearGradient><radialGradient id="drawing-2-stone-back"><stop stop-color="#d7d7d2"/><stop offset="1" stop-color="#777974"/></radialGradient></defs><rect width="800" height="500" fill="url(#drawing-2-stone-back)"/><ellipse cx="420" cy="432" rx="220" ry="31" fill="#282a2838"/><path d="M230 367L275 129 442 53 585 195 543 401 363 436Z" fill="url(#drawing-2-stone-shade)"/><path d="M275 129L407 215 442 53M407 215L363 436M407 215L585 195" fill="none" stroke="#f7f7ef66" stroke-width="3"/><path d="M283 366L388 181 521 302" fill="none" stroke="#292a2938" stroke-width="28"/></svg></div></div><h1 class="house-heading serif">Leave a little<br>room for Sunday.</h1><button class="pill ghost house-reopen" data-letter-open>새 소식 창 열기</button>
  <dialog class="house-letter" aria-labelledby="house-letter-title"><button class="close" data-letter-close aria-label="구독창 닫기">×</button><div class="house-letter-grid"><div class="house-letter-image art"><svg aria-hidden="true" focusable="false" viewBox="0 0 520 650" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient id="drawing-3-letter-wall" x2="1" y2="1"><stop stop-color="#b9b1a0"/><stop offset="1" stop-color="#716d5d"/></linearGradient><linearGradient id="drawing-3-letter-light" x2="0" y2="1"><stop stop-color="#dedbd0"/><stop offset="1" stop-color="#81978b"/></linearGradient></defs><rect width="520" height="650" fill="url(#drawing-3-letter-wall)"/><path d="M0 485L520 414V650H0" fill="#68614f"/><path d="M0 523L520 451M0 579L520 506M70 484L199 650M226 461L365 650M371 439L504 608" stroke="#9a9077" stroke-width="2"/><rect x="215" y="58" width="246" height="305" rx="113" fill="#ddd7bd"/><rect x="231" y="74" width="214" height="273" rx="99" fill="url(#drawing-3-letter-light)"/><path d="M249 283Q339 128 433 237V327H249" fill="#597362"/><path d="M45 384L416 360 448 422 84 460Z" fill="#dcd7c4"/><path d="M84 460L448 422 428 538 150 572Z" fill="#bbb8aa"/><ellipse cx="240" cy="409" rx="154" ry="28" fill="#858f82"/><ellipse cx="240" cy="411" rx="134" ry="20" fill="#bdccc1"/><path d="M134 340V381M134 340Q134 316 156 316H180" fill="none" stroke="#393e33" stroke-width="11"/><path d="M75 0V307" stroke="#303f32" stroke-width="3"/><ellipse cx="75" cy="316" rx="30" ry="44" fill="#e7cc8c"/><path d="M428 543V603M150 574V620" stroke="#5a6255" stroke-width="7"/></svg></div><form><p class="eyebrow">LETTERS FROM THE HOUSE</p><h2 class="serif" id="house-letter-title">A quiet note,<br>now and then.</h2><p class="copy">가끔 도착하는 새로운 공간 이야기.<br>먼저 이메일 입력을 확인해 보세요.</p><label>이메일 주소<input type="email" name="email" placeholder="you@example.com" autocomplete="off" required></label><button class="house-letter-submit" type="submit">입력 확인 ↗</button><p class="feedback" data-letter-result role="status">이 예시는 이메일을 전송하지 않습니다.</p></form></div></dialog></section></main><script>/* Generated by scripts/build-awwwards-studies.mjs from vendor/awwwards-studies/scenes*.mjs and runtime.mjs. Edit those authoring modules for repository changes.

MIT License

Copyright (c) 2026 StyleGallery contributors

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Scope: Newly authored HTML, CSS, JavaScript and SVG study only. This grant does not cover any referenced website, brand, article, photograph, screenshot or original asset. None is included in this package.
 */
(() => {
  'use strict';
  const id="awwwards-35180d0ec0c0";
  const stage=document.querySelector('.stage');
  const state=window.__STYLEGALLERY_PREVIEW__={id,status:'loading',errors:[]};
  const report=(error)=>{const message=error instanceof Error?error.message:String(error);if(!state.errors.includes(message))state.errors.push(message);state.status='error';document.body.dataset.previewStatus='error';parent.postMessage({type:'sg-preview-error',id,message},'*');};
  addEventListener('error',event=>report(event.error||event.message));
  addEventListener('unhandledrejection',event=>report(event.reason));
  const query=new URLSearchParams(location.search);
  document.documentElement.dataset.theme=query.get('theme')==='dark'?'dark':'light';
  const reduced=matchMedia('(prefers-reduced-motion: reduce)');
  stage.dataset.playing='false';
  const setChoice=(group,value)=>{stage.setAttribute('data-'+group,value);stage.querySelectorAll('[data-choice-group="'+group+'"]').forEach(button=>button.setAttribute('aria-pressed',String(button.dataset.choice===value)));};
  const announce=(message)=>{const output=stage.querySelector('[data-feedback]');if(output)output.textContent=message;};
  stage.querySelectorAll('[data-choice-group]').forEach(button=>button.addEventListener('click',()=>setChoice(button.dataset.choiceGroup,button.dataset.choice)));
  stage.querySelectorAll('[data-choice-group][aria-pressed="true"]').forEach(button=>setChoice(button.dataset.choiceGroup,button.dataset.choice));
  stage.querySelectorAll('[data-range]').forEach(input=>input.addEventListener('input',()=>{stage.style.setProperty('--'+input.dataset.range,input.value);const output=stage.querySelector('[data-output="'+input.dataset.range+'"]');if(output)output.textContent=input.value;}));
  stage.querySelectorAll('[data-play]').forEach(button=>button.addEventListener('click',()=>{const play=stage.dataset.playing!=='true'&&!reduced.matches;stage.dataset.playing=String(play);button.setAttribute('aria-pressed',String(play));button.textContent=play?'움직임 정지':reduced.matches?'움직임 줄이기 적용 중':'움직임 시작';}));
  reduced.addEventListener('change',()=>{if(reduced.matches){stage.dataset.playing='false';stage.querySelectorAll('[data-play]').forEach(button=>{button.setAttribute('aria-pressed','false');button.textContent='움직임 줄이기 적용 중';});}});
  const observe=()=>{const root=document.getElementById('root'),elements=[...root.querySelectorAll('*')],rect=root.getBoundingClientRect();parent.postMessage({type:'sg-preview-observation',id,diagnostics:{textLength:root.textContent.trim().length,elementCount:elements.length,visibleElementCount:elements.filter(element=>{const r=element.getBoundingClientRect(),s=getComputedStyle(element);return r.width>0&&r.height>0&&s.display!=='none'&&s.visibility!=='hidden'&&Number(s.opacity)!==0;}).length,images:[],canvases:[],rootRect:{width:rect.width,height:rect.height},documentWidth:document.documentElement.scrollWidth,viewportWidth:innerWidth}},'*');};
  try{const letterDialog=stage.querySelector('dialog'),letterOpener=stage.querySelector('[data-letter-open]');letterOpener.addEventListener('click',()=>letterDialog.showModal());stage.querySelector('[data-letter-close]').addEventListener('click',()=>letterDialog.close());letterDialog.addEventListener('close',()=>letterOpener.focus());letterDialog.querySelector('form').addEventListener('submit',event=>{event.preventDefault();stage.querySelector('[data-letter-result]').textContent='입력 형식을 확인했습니다. 이메일은 전송하지 않았습니다.';});letterDialog.showModal();
}catch(error){report(error);}
  requestAnimationFrame(()=>requestAnimationFrame(()=>{if(state.status!=='error'){state.status='mounted';document.body.dataset.previewStatus='mounted';parent.postMessage({type:'sg-preview-ready',id},'*');observe();setTimeout(observe,700);}}));
})();</script></body></html>
styles.css독립 구현
파일 저장

/* Generated by scripts/build-awwwards-studies.mjs from vendor/awwwards-studies/scenes*.mjs and runtime.mjs. Edit those authoring modules for repository changes.

MIT License

Copyright (c) 2026 StyleGallery contributors

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Scope: Newly authored HTML, CSS, JavaScript and SVG study only. This grant does not cover any referenced website, brand, article, photograph, screenshot or original asset. None is included in this package.
 */

*{box-sizing:border-box}html,body{margin:0;min-height:100%;font-family:Arial,Helvetica,sans-serif}body{background:var(--bg,#f5f2eb);color:var(--fg,#181818)}button,input,select{font:inherit}button,a,input,select,summary{touch-action:manipulation}button{cursor:pointer}button:focus-visible,a:focus-visible,input:focus-visible,select:focus-visible,summary:focus-visible{outline:3px solid var(--focus,#ef6b3f);outline-offset:4px}button{color:inherit}button:disabled{cursor:default;opacity:.45}svg{display:block;max-width:100%}a{color:inherit}.stage{isolation:isolate;min-height:100vh;overflow:hidden;padding:26px;position:relative}.art{pointer-events:none}.eyebrow{font:10px/1.5 ui-monospace,monospace;letter-spacing:.12em;text-transform:uppercase}.topline{align-items:center;display:flex;gap:14px;justify-content:space-between;position:relative;z-index:5}.topline strong{font-size:13px;letter-spacing:-.04em}.topline nav{display:flex;gap:12px}h1,h2,p{margin:0}h1{font-size:clamp(42px,9vw,116px);font-weight:600;letter-spacing:-.065em;line-height:.94}h2{font-size:clamp(24px,4vw,44px);letter-spacing:-.04em;line-height:1.05}.serif{font-family:Georgia,'Times New Roman',serif;font-weight:400}.copy{font-size:13px;line-height:1.55;max-width:31em}.pill{align-items:center;background:var(--fg,#181818);border:1px solid transparent;border-radius:99px;color:var(--bg,#f5f2eb);display:inline-flex;gap:18px;justify-content:center;min-height:40px;padding:10px 19px;text-decoration:none}.ghost{background:transparent;border-color:currentColor;color:inherit}.small{font-size:11px}.huge{font-size:clamp(68px,18vw,220px);line-height:.8}.caption{font:10px/1.4 ui-monospace,monospace}.controls{align-items:center;display:flex;flex-wrap:wrap;gap:8px;position:relative;z-index:6}.controls button{background:transparent;border:1px solid currentColor;border-radius:999px;font-size:11px;min-height:34px;padding:7px 12px}.controls button[aria-pressed=true]{background:var(--fg);color:var(--bg)}.bottomline{align-items:end;display:flex;gap:20px;justify-content:space-between;position:relative;z-index:4}.stack{display:grid;gap:18px}.row{align-items:center;display:flex;gap:16px}.visually-hidden{clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}.feedback{font-size:12px;min-height:18px}.surface{background:var(--panel,#fff);border:1px solid #8883;border-radius:16px;padding:24px}.scene-footer{bottom:13px;left:26px;position:absolute;right:26px}.artfill{height:100%;left:0;position:absolute;top:0;width:100%;z-index:-1}.artfill svg{height:100%;width:100%}.line{border-top:1px solid currentColor;opacity:.4}input,select{border:1px solid #8887;border-radius:7px;min-height:38px;min-width:0;padding:8px 10px;width:100%}input[type=range]{accent-color:var(--accent,#ed6447);min-height:28px;padding:0}details>summary{cursor:pointer;list-style:none}details>summary::-webkit-details-marker{display:none}[hidden]{display:none!important}.flow{display:grid;gap:24px}dialog{background:var(--panel,#fff);border:0;border-radius:12px;color:#171717;max-width:calc(100vw - 34px);padding:28px;width:430px}dialog::backdrop{background:#111a;backdrop-filter:blur(5px)}dialog form{display:grid;gap:15px}dialog .close{background:transparent;border:0;float:right;font-size:25px}body[data-preview-status=error]::after{background:#781b21;color:white;content:'Preview error';padding:8px;position:fixed;right:0;top:0}.motion{animation-play-state:paused!important}.stage[data-playing=true] .motion{animation-play-state:running!important}@media(prefers-reduced-motion:reduce){*,*::before,*::after{animation:none!important;scroll-behavior:auto!important;transition:none!important}}@media(max-width:480px){.stage{padding:18px}.topline nav{gap:8px}.eyebrow{font-size:9px}.scene-footer{left:18px;right:18px}.copy{font-size:12px}.topline{gap:8px}.topline strong{font-size:12px}.surface{padding:17px}}


  :root{--bg:#e3dfd1;--fg:#515548}.stage{min-height:570px}.house-still-art{inset:70px 0 0;opacity:.5;position:absolute;z-index:-1}.house-still-art>div{overflow:hidden;position:absolute;width:150px}.house-still-art>div:nth-child(1){height:220px;left:4%;top:25px;transform:rotate(-5deg)}.house-still-art>div:nth-child(2){right:6%;top:220px;transform:rotate(6deg);width:225px}.house-still-art>div:nth-child(3){left:23%;top:330px;width:90px}.house-still-art svg{height:100%;width:100%}.house-heading{font-size:clamp(40px,7vw,76px);margin:150px 0 25px;text-align:center}.house-reopen{display:flex;margin:auto}.house-letter{background:#ece8d8;border-radius:0;max-width:calc(100vw - 32px);padding:0;width:750px}.house-letter::backdrop{background:#363a3766;backdrop-filter:blur(3px)}.house-letter>.close{color:#3e493e;font-size:26px;padding:5px 10px;position:absolute;right:5px;top:5px;z-index:2}.house-letter-grid{display:grid;grid-template-columns:1fr 1fr}.house-letter-image{overflow:hidden}.house-letter-image svg{height:100%;object-fit:cover;width:100%}.house-letter form{align-content:center;gap:22px;padding:45px 33px}.house-letter h2{font-size:clamp(31px,4.8vw,45px);letter-spacing:-.04em}.house-letter .copy{font-size:11px}.house-letter label{font-size:11px}.house-letter input{background:none;border:0;border-bottom:1px solid #838774;border-radius:0;margin-top:10px;padding:8px 0}.house-letter-submit{background:none;border:2px solid #6b785b;border-radius:43% 52% 40% 49% / 20% 27% 25% 21%;font-size:12px;min-height:45px;transform:rotate(-2deg)}.house-letter .feedback{color:#68705c;font-size:10px;line-height:1.5}@media(max-width:500px){.house-letter-grid{grid-template-columns:1fr}.house-letter-image{height:145px}.house-letter-image svg{object-fit:cover;object-position:50% 65%}.house-letter form{gap:17px;padding:25px}.house-letter>.close{background:#ece8d8cc;border-radius:50%;right:8px;top:8px}.house-letter h2{font-size:34px}}
함께 쓰는 파일 3개 보기
script.js독립 구현
파일 저장

/* Generated by scripts/build-awwwards-studies.mjs from vendor/awwwards-studies/scenes*.mjs and runtime.mjs. Edit those authoring modules for repository changes.

MIT License

Copyright (c) 2026 StyleGallery contributors

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Scope: Newly authored HTML, CSS, JavaScript and SVG study only. This grant does not cover any referenced website, brand, article, photograph, screenshot or original asset. None is included in this package.
 */
(() => {
  'use strict';
  const id="awwwards-35180d0ec0c0";
  const stage=document.querySelector('.stage');
  const state=window.__STYLEGALLERY_PREVIEW__={id,status:'loading',errors:[]};
  const report=(error)=>{const message=error instanceof Error?error.message:String(error);if(!state.errors.includes(message))state.errors.push(message);state.status='error';document.body.dataset.previewStatus='error';parent.postMessage({type:'sg-preview-error',id,message},'*');};
  addEventListener('error',event=>report(event.error||event.message));
  addEventListener('unhandledrejection',event=>report(event.reason));
  const query=new URLSearchParams(location.search);
  document.documentElement.dataset.theme=query.get('theme')==='dark'?'dark':'light';
  const reduced=matchMedia('(prefers-reduced-motion: reduce)');
  stage.dataset.playing='false';
  const setChoice=(group,value)=>{stage.setAttribute('data-'+group,value);stage.querySelectorAll('[data-choice-group="'+group+'"]').forEach(button=>button.setAttribute('aria-pressed',String(button.dataset.choice===value)));};
  const announce=(message)=>{const output=stage.querySelector('[data-feedback]');if(output)output.textContent=message;};
  stage.querySelectorAll('[data-choice-group]').forEach(button=>button.addEventListener('click',()=>setChoice(button.dataset.choiceGroup,button.dataset.choice)));
  stage.querySelectorAll('[data-choice-group][aria-pressed="true"]').forEach(button=>setChoice(button.dataset.choiceGroup,button.dataset.choice));
  stage.querySelectorAll('[data-range]').forEach(input=>input.addEventListener('input',()=>{stage.style.setProperty('--'+input.dataset.range,input.value);const output=stage.querySelector('[data-output="'+input.dataset.range+'"]');if(output)output.textContent=input.value;}));
  stage.querySelectorAll('[data-play]').forEach(button=>button.addEventListener('click',()=>{const play=stage.dataset.playing!=='true'&&!reduced.matches;stage.dataset.playing=String(play);button.setAttribute('aria-pressed',String(play));button.textContent=play?'움직임 정지':reduced.matches?'움직임 줄이기 적용 중':'움직임 시작';}));
  reduced.addEventListener('change',()=>{if(reduced.matches){stage.dataset.playing='false';stage.querySelectorAll('[data-play]').forEach(button=>{button.setAttribute('aria-pressed','false');button.textContent='움직임 줄이기 적용 중';});}});
  const observe=()=>{const root=document.getElementById('root'),elements=[...root.querySelectorAll('*')],rect=root.getBoundingClientRect();parent.postMessage({type:'sg-preview-observation',id,diagnostics:{textLength:root.textContent.trim().length,elementCount:elements.length,visibleElementCount:elements.filter(element=>{const r=element.getBoundingClientRect(),s=getComputedStyle(element);return r.width>0&&r.height>0&&s.display!=='none'&&s.visibility!=='hidden'&&Number(s.opacity)!==0;}).length,images:[],canvases:[],rootRect:{width:rect.width,height:rect.height},documentWidth:document.documentElement.scrollWidth,viewportWidth:innerWidth}},'*');};
  try{const letterDialog=stage.querySelector('dialog'),letterOpener=stage.querySelector('[data-letter-open]');letterOpener.addEventListener('click',()=>letterDialog.showModal());stage.querySelector('[data-letter-close]').addEventListener('click',()=>letterDialog.close());letterDialog.addEventListener('close',()=>letterOpener.focus());letterDialog.querySelector('form').addEventListener('submit',event=>{event.preventDefault();stage.querySelector('[data-letter-result]').textContent='입력 형식을 확인했습니다. 이메일은 전송하지 않았습니다.';});letterDialog.showModal();
}catch(error){report(error);}
  requestAnimationFrame(()=>requestAnimationFrame(()=>{if(state.status!=='error'){state.status='mounted';document.body.dataset.previewStatus='mounted';parent.postMessage({type:'sg-preview-ready',id},'*');observe();setTimeout(observe,700);}}));
})();
LICENSE독립 구현
파일 저장

MIT License

Copyright (c) 2026 StyleGallery contributors

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Scope: Newly authored HTML, CSS, JavaScript and SVG study only. This grant does not cover any referenced website, brand, article, photograph, screenshot or original asset. None is included in this package.
NOTES.md독립 구현
파일 저장

# 욕실 그림과 입력을 반씩 나눈 구독창

사례를 연구한 독립 예제입니다. 관찰된 구성을 출발점으로 새 문구·코드·SVG를 작성했습니다. 원본 구현, 자산, 상표, 문구를 재배포하지 않습니다.

네이티브 dialog가 모달·취소를 소유하고 입력 초안은 닫았다 열어도 보존됩니다. 사진 자리가 작아져도 이메일·검증 결과·닫기는 그대로 남습니다.

## 실행과 수정

index.html을 브라우저에서 열면 단독으로 실행됩니다. 수정할 때도 이 파일 안의 style과 script를 편집하세요. styles.css와 script.js는 읽기·복사용 사본이며 index.html에서 불러오는 파일이 아닙니다. 이 사본만 수정해도 실행 화면이 달라지지는 않습니다.

저장소 유지보수자는 vendor/awwwards-studies/scenes*.mjs와 runtime.mjs를 수정하고 node scripts/build-awwwards-studies.mjs로 모든 사본을 다시 생성합니다. 이 내부 재빌드에는 비공개 캡처 입력이 필요합니다. 다운로드한 HTML의 실행과 수정에는 캡처 입력이 필요하지 않습니다.

## 관찰과 검증

프레임 관찰 범위: partial. 원본의 시간 변화나 사용자 입력 결과를 이 예제로 입증하지 않습니다. 비공개 관찰 근거는 artifacts/full-import/awwwards/captures/awwwards-35180d0ec0c0/frames/scene-00-f0-y0.png 및 visual-reviews.json의 같은 id 행입니다. 프레임과 행의 결합 해시는 f8a83f9463f826abb0cd4fcf8f18ea9a48d2c6a2d2c097d4436a62a298e87df3입니다. 해당 캡처는 다운로드에 포함하지 않으며, 검토에는 저장소의 비공개 아티팩트 접근이 필요합니다.

이 패키지는 네트워크 없이 실행되며 실제 구독, 예약, 결제 또는 원격 작업을 수행하지 않습니다. ready 신호는 마운트 진단이며 브라우저 검증을 뜻하지 않습니다. 움직임은 명시적으로 시작해야 하며 시스템의 움직임 줄이기 선호가 우선합니다. 시각 팔레트는 각 사례의 독립 구성에 속합니다.

consumer_reference: consumer-reference/agent-native/registry.json