Awwwards 사례 연구
다섯 재료 카드와 상세창
섹션 · MIT
갤러리 안에서는 화면을 벗어나거나 움직임을 멈추면 예제도 닫힙니다. 다시 재생할 때는 처음부터 시작해요.
저장한 HTML에서는 갤러리의 재생 설정이 적용되지 않아요.
SOURCE FILES
독립 예제 코드 읽기
사례의 구도나 문서의 원리를 바탕으로 새로 만든 예제입니다. 아래 코드를 복사해 직접 응용할 수 있습니다. 실행 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}}
.stage{min-height:620px}.stage h1,.stage h2{overflow-wrap:anywhere}.topline{flex-wrap:wrap}button{max-width:100%}@media(max-width:480px){.stage{min-height:640px}}:root{--bg:#f9faf7;--fg:#242824}.showroom-intro{margin:35px 0 28px;text-align:center}.showroom-badge{border:1px solid #a1b49d;border-radius:20px;color:#596c58;font:8px ui-monospace;padding:7px 12px}.showroom-intro h1{font:400 clamp(34px,4.5vw,49px)/1.05 Georgia;letter-spacing:-.04em;margin-top:20px}.showroom-cards{display:grid;gap:10px;grid-template-columns:repeat(5,minmax(0,1fr))}.showroom-card{min-width:0;overflow:hidden;position:relative}.showroom-card svg{width:100%}.showroom-card h2{font-size:11px;left:12px;position:absolute;top:14px}.showroom-card button{background:#202623;border:0;border-radius:50%;bottom:11px;color:white;font-size:20px;height:31px;position:absolute;right:10px;width:31px}.showroom-bottom{align-items:center;display:flex;flex-wrap:wrap;font:9px ui-monospace;gap:20px;justify-content:space-between;margin-top:35px}.showroom-bottom i{color:#a5afa4;font-style:normal;margin:0 3px}@media(max-width:480px){.showroom-cards{gap:8px;grid-template-columns:repeat(2,minmax(0,1fr))}.showroom-card:last-child{grid-column:1/-1}.showroom-card:last-child>.art{height:170px}.showroom-card:last-child svg{height:100%;object-fit:contain}.showroom-card h2{font-size:12px}.showroom-bottom{font-size:8px;margin-top:24px}.showroom-intro{margin-top:28px}}</style></head><body><main id="root"><section class="stage" aria-label="다섯 재료 카드와 상세창">
<header class="topline"><strong>HOUSE / NOTES</strong><span class="eyebrow">A SMALL MATERIAL COLLECTION</span></header><div class="showroom-intro"><span class="showroom-badge">FOR CURIOUS ROOMS</span><h1>Make space<br>feel like home.</h1></div>
<div class="showroom-cards"><article class="showroom-card"><div class="art"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 220 320" aria-hidden="true"><rect width="220" height="320" fill="#e8d4c6"/><ellipse cx="110" cy="245" rx="70" ry="17" fill="#b48b7d33"/><path d="M61 119H159L151 236Q108 254 69 236Z" fill="#c98f78"/><ellipse cx="110" cy="120" rx="49" ry="14" fill="#f3c4aa"/><ellipse cx="110" cy="120" rx="37" ry="9" fill="#976a61"/><path d="M66 134Q24 173 71 207" fill="none" stroke="#7b6d5e" stroke-width="6"/><path d="M79 169H144V204H79Z" fill="#e7d7b7"/></svg></div><h2>페인트</h2><button data-material="0" aria-label="페인트 설명 열기">+</button></article><article class="showroom-card"><div class="art"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 220 320" aria-hidden="true"><rect width="220" height="320" fill="#d9c5a6"/><path d="M18 210L109 82 200 210 109 281Z" fill="#a9845d"/><path d="M39 219L128 107M60 237L149 136M83 255L171 167M109 269L190 198" stroke="#715a45" stroke-width="3"/><path d="M65 145L162 246M86 114L181 224" stroke="#d2b591" stroke-width="2"/></svg></div><h2>바닥</h2><button data-material="1" aria-label="바닥 설명 열기">+</button></article><article class="showroom-card"><div class="art"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 220 320" aria-hidden="true"><rect width="220" height="320" fill="#e1e2cf"/><path d="M45 93H144V264H45Z" fill="#d2d6b3"/><path d="M144 93Q193 71 193 117V265Q167 291 143 264Z" fill="#adb897"/><ellipse cx="169" cy="103" rx="24" ry="17" fill="#e8e8cc"/><ellipse cx="169" cy="103" rx="9" ry="7" fill="#8a967e"/><g fill="none" stroke="#96a077" stroke-width="3"><path d="M55 100Q110 140 55 180T55 260M89 100Q145 140 89 180T89 260M121 100Q160 140 121 180T121 260"/></g></svg></div><h2>벽지</h2><button data-material="2" aria-label="벽지 설명 열기">+</button></article><article class="showroom-card"><div class="art"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 220 320" aria-hidden="true"><rect width="220" height="320" fill="#c6bcae"/><path d="M50 72H171V282H50Z" fill="#7a6658"/><path d="M61 82H160V273H61Z" fill="#b9a28a"/><path d="M71 93H150V157H71ZM71 171H150V260H71Z" fill="none" stroke="#897763" stroke-width="3"/><circle cx="145" cy="174" r="5" fill="#423e35"/></svg></div><h2>문</h2><button data-material="3" aria-label="문 설명 열기">+</button></article><article class="showroom-card"><div class="art"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 220 320" aria-hidden="true"><rect width="220" height="320" fill="#d2dbc6"/><path d="M65 104Q109 76 155 104L143 191H76Z" fill="#99aa89"/><path d="M62 187H158V213H62Z" fill="#b7c5a1"/><path d="M76 210L62 281M145 210L159 281" stroke="#665b47" stroke-width="9"/><path d="M61 181L42 148M159 181L178 148" stroke="#665b47" stroke-width="7"/></svg></div><h2>가구</h2><button data-material="4" aria-label="가구 설명 열기">+</button></article></div>
<div class="showroom-bottom"><span>01 <i>―</i> 02 <i>―</i> 03 <i>―</i> 04 <i>―</i> 05 <i>―</i> 06 <i>―</i> 07</span><span>첫 번째 재료 모음 / LOCAL CATALOG</span></div>
<dialog aria-labelledby="material-title"><form method="dialog"><button class="close" aria-label="닫기">×</button><p class="eyebrow">MATERIAL NOTES</p><h2 id="material-title">재료 설명</h2><p class="copy" data-material-copy></p><button class="pill">목록으로 돌아가기</button></form></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-7d1497c2ae1e";
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 descriptions=['따뜻한 분홍색을 고른 가상의 페인트 견본입니다. 실제 제품이나 성능을 나타내지 않습니다.','결의 방향이 다른 나무 조각을 함께 놓은 바닥 재료 그림입니다.','반복 곡선의 크기를 비교하기 위한 가상의 벽지 견본입니다.','단순한 두 패널과 손잡이로 구성한 문 그림입니다.','곡선 등받이와 네 다리의 관계를 기록한 의자 그림입니다.'];const names=['페인트','바닥','벽지','문','가구'];const dialog=stage.querySelector('dialog');stage.querySelectorAll('[data-material]').forEach(button=>button.addEventListener('click',()=>{const i=Number(button.dataset.material);stage.querySelector('#material-title').textContent=names[i];stage.querySelector('[data-material-copy]').textContent=descriptions[i];dialog.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}}
.stage{min-height:620px}.stage h1,.stage h2{overflow-wrap:anywhere}.topline{flex-wrap:wrap}button{max-width:100%}@media(max-width:480px){.stage{min-height:640px}}:root{--bg:#f9faf7;--fg:#242824}.showroom-intro{margin:35px 0 28px;text-align:center}.showroom-badge{border:1px solid #a1b49d;border-radius:20px;color:#596c58;font:8px ui-monospace;padding:7px 12px}.showroom-intro h1{font:400 clamp(34px,4.5vw,49px)/1.05 Georgia;letter-spacing:-.04em;margin-top:20px}.showroom-cards{display:grid;gap:10px;grid-template-columns:repeat(5,minmax(0,1fr))}.showroom-card{min-width:0;overflow:hidden;position:relative}.showroom-card svg{width:100%}.showroom-card h2{font-size:11px;left:12px;position:absolute;top:14px}.showroom-card button{background:#202623;border:0;border-radius:50%;bottom:11px;color:white;font-size:20px;height:31px;position:absolute;right:10px;width:31px}.showroom-bottom{align-items:center;display:flex;flex-wrap:wrap;font:9px ui-monospace;gap:20px;justify-content:space-between;margin-top:35px}.showroom-bottom i{color:#a5afa4;font-style:normal;margin:0 3px}@media(max-width:480px){.showroom-cards{gap:8px;grid-template-columns:repeat(2,minmax(0,1fr))}.showroom-card:last-child{grid-column:1/-1}.showroom-card:last-child>.art{height:170px}.showroom-card:last-child svg{height:100%;object-fit:contain}.showroom-card h2{font-size:12px}.showroom-bottom{font-size:8px;margin-top:24px}.showroom-intro{margin-top:28px}}함께 쓰는 파일 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-7d1497c2ae1e";
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 descriptions=['따뜻한 분홍색을 고른 가상의 페인트 견본입니다. 실제 제품이나 성능을 나타내지 않습니다.','결의 방향이 다른 나무 조각을 함께 놓은 바닥 재료 그림입니다.','반복 곡선의 크기를 비교하기 위한 가상의 벽지 견본입니다.','단순한 두 패널과 손잡이로 구성한 문 그림입니다.','곡선 등받이와 네 다리의 관계를 기록한 의자 그림입니다.'];const names=['페인트','바닥','벽지','문','가구'];const dialog=stage.querySelector('dialog');stage.querySelectorAll('[data-material]').forEach(button=>button.addEventListener('click',()=>{const i=Number(button.dataset.material);stage.querySelector('#material-title').textContent=names[i];stage.querySelector('[data-material-copy]').textContent=descriptions[i];dialog.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를 작성했습니다. 원본 구현, 자산, 상표, 문구를 재배포하지 않습니다.
다섯 범주의 자체 물건 그림과 대상 이름이 있는 더하기 버튼을 제공합니다. 하나의 네이티브 상세창은 선택한 설명을 열고 닫을 때 호출 버튼으로 초점을 돌려줍니다. 원본 AR 기능은 구현하지 않습니다.
## 실행과 수정
index.html을 브라우저에서 열면 단독으로 실행됩니다. 수정할 때도 이 파일 안의 style과 script를 편집하세요. styles.css와 script.js는 읽기·복사용 사본이며 index.html에서 불러오는 파일이 아닙니다. 이 사본만 수정해도 실행 화면이 달라지지는 않습니다.
저장소 유지보수자는 vendor/awwwards-studies/scenes*.mjs와 runtime.mjs를 수정하고 node scripts/build-awwwards-studies.mjs로 모든 사본을 다시 생성합니다. 이 내부 재빌드에는 비공개 캡처 입력이 필요합니다. 다운로드한 HTML의 실행과 수정에는 캡처 입력이 필요하지 않습니다.
## 관찰과 검증
프레임 관찰 범위: observed. 원본의 시간 변화나 사용자 입력 결과를 이 예제로 입증하지 않습니다. 비공개 관찰 근거는 artifacts/full-import/awwwards/captures/awwwards-7d1497c2ae1e/frames/scene-00-f0-y0.png 및 visual-reviews.json의 같은 id 행입니다. 프레임과 행의 결합 해시는 0a90994324d2d7e63d6509d780ee078aa34213d3643067ed7287ce7503009622입니다. 해당 캡처는 다운로드에 포함하지 않으며, 검토에는 저장소의 비공개 아티팩트 접근이 필요합니다.
이 패키지는 네트워크 없이 실행되며 실제 구독, 예약, 결제 또는 원격 작업을 수행하지 않습니다. ready 신호는 마운트 진단이며 브라우저 검증을 뜻하지 않습니다. 움직임은 명시적으로 시작해야 하며 시스템의 움직임 줄이기 선호가 우선합니다. 시각 팔레트는 각 사례의 독립 구성에 속합니다.
consumer_reference: consumer-reference/agent-native/registry.json
BEHIND THE EXAMPLE
이 장면을 만드는 원리
다섯 재료 카드와 상세창의 구현 계약
겉모양보다 사용자의 행동을 기준으로 요소의 의미·초점·닫기 책임을 정합니다.
- 이 예제에서는
- 다섯 범주의 자체 물건 그림과 대상 이름이 있는 더하기 버튼을 제공합니다. 하나의 네이티브 상세창은 선택한 설명을 열고 닫을 때 호출 버튼으로 초점을 돌려줍니다. 원본 AR 기능은 구현하지 않습니다. 이 연결은 새로 작성한 실행 코드의 계약을 설명하며, 원본의 동작을 검증했다는 뜻은 아닙니다.
코드와 함께 확인하기
코드에서 찾기
.showroom-introindex.html관찰한 구도에서 출발한 새 장면의 실제 마크업·SVG·스타일입니다. 원본 사이트 코드를 뜻하지 않습니다.
[data-material]script.js이 독립 예제의 입력과 상태 변경 코드입니다. 제안 검사를 실행해 결과를 별도로 기록해야 합니다.
직접 해보기
이 예제를 320px와 900px 너비에서 열고 다섯 재료 카드와 상세창의 제목·설명·조작 순서를 확인합니다.
살펴볼 변화관찰의 장식 구도와 별도로 읽기 가능한 제목이 남고, 가로 스크롤 없이 핵심 조작에 도달해야 합니다.
키보드와 포인터로 장면에 표시된 조작을 실행하고 다시 초기 상태로 열어 비교합니다.
살펴볼 변화다섯 범주의 자체 물건 그림과 대상 이름이 있는 더하기 버튼을 제공합니다. 하나의 네이티브 상세창은 선택한 설명을 열고 닫을 때 호출 버튼으로 초점을 돌려줍니다. 원본 AR 기능은 구현하지 않습니다. 이 문장은 기대 결과이며 실행 통과 기록이 아닙니다.
