이 예제는 구현에 사용한 선택형 카드 참고 자료와 일치하도록 @volvo-cars/css 2.5.1을 사용합니다. 버전 3은 계약이 다르므로, 마크업을 확인하지 않고 최신 패키지를 설치하면 패턴이 제대로 완성되지 않을 수 있습니다. 가이드뿐 아니라 설정에도 버전을 명시해야 합니다. 컴포넌트 클래스가 있다고 해서 모든 릴리스에서 동일한 스타일이 적용되는 것은 아닙니다.
공개 웹 레이어를 의도적으로 사용하세요
이 사례는 공개 웹 토큰과 모든 미디어에 적용되는 스타일시트를 직접 가져옵니다. 별도의 내부 EDLS 패키지에는 의존하지 않습니다. 애플리케이션은 일반 HTML을 사용하고 체크리스트에는 소량의 JavaScript를 적용합니다. 설치된 CSS는 선택형 카드의 모양, 컨트롤 스타일 및 색상 모드 역할을 처리하고, 앱은 콘텐츠와 상태를 제공합니다.
Volvo Cars Web 디자인 시스템 중립 역할, 타이포그래피 및 간격
라이트 모드와 다크 모드의 역할을 연동하세요
표에는 기본 라이트 모드 선언이 기록되어 있고, data-color-mode는 이에 대응하는 기본 다크 모드 값을 선택합니다. 이 구성에서는 모든 카드에 흰색 텍스트를 고정하는 대신 배경 및 전경 역할을 사용합니다. 테마를 전환해도 선택한 플랜과 추가 항목은 유지되어야 합니다. 팔레트를 바꾸는 것은 체크리스트를 바꾸는 것과 별개입니다.
고정 간격과 유동적인 페이지 리듬을 구분하세요
선택한 참고 자료의 고정 간격 값은 2px에서 64px까지입니다. 다른 공개 페이지 토큰은 clamp와 round를 사용하므로 뷰포트에 따라 반응합니다. 예제의 2열 구성과 40px 간격은 기본 카드 주위에 별도로 적용한 레이아웃입니다. 공개된 글꼴 스택을 유지하되 Volvo 글꼴 파일은 포함하지 않았으므로, 사용 가능한 시스템 대체 글꼴로 렌더링됩니다.
Volvo Cars Web 디자인 시스템 선택형 카드의 의미론
플랜 하나를 선택할 때는 라디오 입력을 사용하세요
두 플랜 카드에는 같은 name을 사용하는 기본 라디오 입력이 fieldset 안에 있으며, fieldset에는 legend가 있습니다. 각 카드는 제목, 메타 정보, 설명 슬롯으로 구성된 label입니다. 카드를 클릭하면 해당 라디오가 선택되며, 기본 라디오 키보드 동작도 그대로 사용할 수 있습니다. 따라서 선택한 플랜은 별도로 관리하는 장식용 테두리가 아니라 실제 폼 상태입니다.
독립적으로 선택하는 추가 항목에는 체크박스를 사용하세요
물과 여벌 옷은 각각 독립적으로 선택할 수 있으므로 체크박스를 사용합니다. 카드 안에는 중첩된 링크나 버튼이 없습니다. label 안에 대화형 요소를 넣으면 활성화 동작이 서로 충돌할 수 있습니다. 요약 액션은 카드 바깥에 배치합니다. 디자인상 더 복잡한 대화형 카드 콘텐츠가 실제로 필요한 경우에는 공개된 React 폼 레이어를 대안으로 사용할 수 있습니다.
라디오 그룹은 하나의 fieldset과 legend 안에 두세요.
독립적인 추가 항목에는 체크박스를 사용하세요.
CSS 전용 label 카드 안에는 링크와 버튼을 넣지 마세요.
Volvo Cars Web 디자인 시스템 계산된 체크리스트 및 확인
동일한 컨트롤에서 요약을 계산하세요
요약에는 선택한 플랜의 기본 준비물과 선택한 추가 항목이 함께 표시됩니다. 라디오를 바꾸면 독립적으로 선택한 추가 항목은 유지되고, 플랜 제목과 기본 준비물은 업데이트됩니다. 개수는 결과 목록을 기준으로 계산됩니다. 샘플 준비물 목록은 독자적으로 작성했으며, 실제 Volvo 구매 구성에 대한 차량 사양, 가격 또는 주장은 의도적으로 포함하지 않았습니다.
선택 항목이 바뀌면 이전 확인 메시지를 지우세요
Volvo Cars Web 디자인 시스템 색상 모드 및 반응형 구성
테마와 체크리스트 상태를 분리하세요
색상 모드 선택 컨트롤은 문서의 data-color-mode를 변경합니다. 라디오, 체크박스 또는 요약을 다시 만들지는 않습니다. 기본 스타일시트는 일부 표면에 전환 효과를 적용하므로, 변경 도중 캡처한 화면이 아니라 테마 전환이 끝난 뒤의 상태를 확인해야 합니다. 텍스트, 컨트롤 상태, 표면의 명암 대비를 함께 점검하세요.
좁은 화면에서는 읽기 순서에 맞춰 쌓으세요
문서 순서상 요약보다 먼저 선택 항목이 나옵니다. 모바일 너비에서는 2열 그리드가 1열로 바뀌며, 이 순서와 모든 동작이 유지됩니다. fieldset에는 min-width:0을 지정해 기본 크기 계산으로 가로 넘침이 발생하지 않도록 합니다. 카드 내용이 길어져도 선택 카드 레이아웃 안에서 줄바꿈되므로 부모 영역 밖으로 벗어나지 않습니다.
Volvo Cars Web 디자인 시스템 전체 소스 및 로컬 검증
해당 패키지에 맞는 두 소스 파일 실행
JavaScript에는 원본 콘텐츠 전체와 모든 상호작용 핸들러가 포함됩니다. CSS에는 애플리케이션 구성과 로컬 체크박스 체크 표시 대체 기능만 들어 있습니다. 제공된 HTML 셸을 사용하고, 두 소스 파일을 저장한 다음 고정된 CSS 릴리스를 설치하세요. 스타일시트만 가져오면 컨트롤에 스타일은 적용되지만 체크리스트 항목 수 계산이나 로컬 확인 기능은 구현되지 않습니다.
바닐라 앱을 만들고 @volvo-cars/css 2.5.1을 설치합니다.
main.js, volvo.css와 제공된 루트 HTML 셸을 저장합니다.
앱을 실행한 다음 라디오 버튼과 체크박스 동작을 비교합니다.
안정화된 밝은 테마와 어두운 테마, 초기화 상태를 확인합니다.
선택 항목, 테마, 초기화 기능 함께 확인하기
해안 여행 계획을 선택하고 물을 추가해 항목이 네 개 표시되는지 확인합니다. 계획은 유지한 채 추가 레이어를 선택하고 이전 확인 메시지가 사라지는지 확인합니다. 선택 항목을 유지한 채 어두운 모드로 전환한 다음, 추가 항목 없이 첫 번째 계획으로 초기화합니다. 키보드로 라디오 항목을 선택할 수 있는지, 좁은 화면에서 줄바꿈이 되는지 확인하고 안정화된 밝은 표면과 어두운 표면을 살펴봅니다.
Volvo Cars Web 디자인 시스템 구성 요소 예제
main.js — 전체 계획 선택 기능
모든 선택 항목, 계산된 요약, 로컬 확인 메시지, 테마 및 초기화 기능.
자바스크립트
import '@volvo-cars/css/tokens.css';
import '@volvo-cars/css/styles_all-media.css';
import './volvo.css';
document.querySelector('#root').innerHTML=`<main><header><p class="eyebrow">OpenDesign · Original planning study</p><h1>A little room for the weekend.</h1><p class="intro">Build a simple packing plan with selectable cards. These sample choices are not vehicle options or product specifications.</p><label class="mode">Color mode <select id="mode"><option value="light">Light</option><option value="dark">Dark</option></select></label></header><div class="composition"><div><fieldset class="stack-16"><legend>Choose your plan</legend><label class="selectable-card"><input type="radio" name="plan" value="city" checked><span slot="title">A day in the city</span><span slot="meta">Travel light</span><span slot="description">Space for a day bag and the things you use most.</span></label><label class="selectable-card"><input type="radio" name="plan" value="coast"><span slot="title">A quiet coastal break</span><span slot="meta">Stay a little longer</span><span slot="description">Bring layers, a weekend bag and time to pause.</span></label></fieldset><fieldset class="stack-16 extras"><legend>Add to your checklist</legend><label class="selectable-card"><input type="checkbox" value="water"><span slot="title">Water and a reusable cup</span><span slot="description">Keep everyday essentials close at hand.</span></label><label class="selectable-card"><input type="checkbox" value="layers"><span slot="title">An extra layer</span><span slot="description">Prepare for a change in the weather.</span></label></fieldset></div><aside class="summary bg-secondary p-24 shape-default"><p class="eyebrow">Your local checklist</p><h2 id="plan-title">A day in the city</h2><ul id="items"></ul><p id="count" role="status"></p><button type="button" class="button-filled" id="save">Keep this plan</button><button type="button" class="button-text" id="reset">Start again</button><p id="saved" role="status" hidden></p></aside></div><p class="note">Published Volvo Cars CSS 2.5.1 selectable-card styling with original packing content and local behavior. The preview uses the stylesheet’s system-font fallback; Volvo font assets are not bundled. Nothing is booked, purchased or sent.</p></main>`;
const plans={city:{title:'A day in the city',items:['Day bag','Comfortable shoes']},coast:{title:'A quiet coastal break',items:['Weekend bag','Route notes','A good book']}};const extras={water:'Water and a reusable cup',layers:'An extra layer'};let current='city';
function render(){current=document.querySelector('[name=plan]:checked').value;let list=[...plans[current].items,...[...document.querySelectorAll('.extras input:checked')].map(e=>extras[e.value])];document.querySelector('#plan-title').textContent=plans[current].title;const ul=document.querySelector('#items');ul.replaceChildren(...list.map(x=>{let li=document.createElement('li');li.textContent=x;return li}));document.querySelector('#count').textContent=`${list.length} things on your checklist`;document.querySelector('#saved').hidden=true;}
document.querySelectorAll('fieldset input').forEach(e=>e.addEventListener('change',render));document.querySelector('#mode').addEventListener('change',e=>document.documentElement.dataset.colorMode=e.target.value);document.querySelector('#save').addEventListener('click',()=>{let p=document.querySelector('#saved');p.hidden=false;p.textContent='Plan kept in this page. Changing a choice will clear this confirmation.';});document.querySelector('#reset').addEventListener('click',()=>{document.querySelector('[value=city]').checked=true;document.querySelectorAll('.extras input').forEach(e=>e.checked=false);render();document.querySelector('[value=city]').focus();});render();
고정된 버전은 이 선택형 카드 구현에 맞춰져 있습니다. 공식 글꼴 에셋은 미리보기에 포함되어 있지 않습니다.
sh
npm create vite@latest weekend-plan -- --template vanilla
cd weekend-plan
npm install
npm install @volvo-cars/[email protected]
# Save index.html at the root; main.js and volvo.css in src.
npm run dev
프로젝트를 위한 프롬프트
에이전트 프롬프트
Volvo Cars CSS 2.5.1과 제공된 전체 소스를 사용해 독창적인 주말 짐 꾸리기 예제를 만드세요. 기본 label 기반 선택형 카드, fieldset 라디오 그룹, 서로 독립적인 체크박스 추가 항목, 계산된 항목 수, 오래된 확인 메시지 지우기, 선택 항목과 독립적으로 유지되는 테마 상태를 사용하세요. 모든 예시 콘텐츠는 실제 차량 사양과 구분되도록 하세요.
05
Volvo Cars Web 디자인 시스템 출처 및 범위
@volvo-cars/css 2.5.1을 사용한 독창적인 OpenDesign 짐 꾸리기 예제입니다. 차량 구성 도구가 아닙니다. Volvo 글꼴 파일은 포함하지 않으며, 네이티브 스타일시트 대체 글꼴을 사용합니다.