엔터프라이즈 제품 디자인 · 신규 리소스

Porsche 디자인 시스템.

유동적인 간격, CSS 색상 구성, Porsche Next 타이포그래피, 두 가지 선택이 가능한 구성 도구를 통해 Porsche Design System v4를 살펴보세요. 실제 토큰 표현식과 최신 세그먼트 컨트롤 이벤트를 사용하는 완전한 Vite 엔트리 파일이 포함되어 있습니다.

OpenDesign 가이드8개 챕터참고 항목 45개독자적 적용 가이드
01

Porsche 디자인 시스템 인터페이스 미리보기

외장 색상과 휠 스타일을 선택하고, 세션 요약을 확인하며, 인터페이스의 라이트/다크 모드를 전환하세요.

자체 제작 외장 색상 및 휠 연구전체 예시 열기
v4 토큰 역할과 분할 선택 동작을 자체적으로 오프라인에서 해석한 HTML/CSS 예시입니다. 네이티브 PDS 런타임, 원격 글꼴, 공식 모델 이미지, 실제 차량 데이터는 사용하지 않습니다. · 구현 레퍼런스
02

Porsche 디자인 시스템 디자인 참고 자료

Porsche Design System v4 문서를 참고하며, 토큰 페이지에는 v4.8.0이 표시됩니다. 최신 버전이라고 주장하는 것이 아니라 특정 버전 범위를 기준으로 한 참고 자료입니다. 자체 제작 외장 색상 견본은 애플리케이션 데이터이며, 공식 Porsche 도장 색상 코드가 아닙니다.

고정 간격

출처
이름 / 규칙값 / 구성용도
spacingStatic2Xs1px고정 간격 토큰입니다.
spacingStaticXs4px고정 간격 토큰입니다.
spacingStaticSm8px고정 간격 토큰입니다.
spacingStaticMd16px고정 간격 토큰입니다.
spacingStaticLg32px고정 간격 토큰입니다.
spacingStaticXl48px고정 간격 토큰입니다.
spacingStatic2Xl80px고정 간격 토큰입니다.

유동형 간격

출처
이름 / 규칙값 / 구성용도
spacingFluidXsclamp(4px, 0.25vw + 3px, 8px)작은 반응형 간격입니다.
spacingFluidSmclamp(8px, 0.5vw + 6px, 16px)좁은 반응형 간격입니다.
spacingFluidMdclamp(16px, 1.25vw + 12px, 36px)페이지 안쪽 여백 예시입니다.
spacingFluidLgclamp(32px, 2.75vw + 23px, 76px)섹션 간격.
spacingFluidXlclamp(48px, 3vw + 38px, 96px)넓은 간격입니다.
spacingFluid2Xlclamp(80px, 7.5vw + 56px, 200px)주요 구성 요소 간 간격입니다.

색상 역할

출처
이름 / 규칙값 / 구성용도
colorCanvaslight-dark(#fff,hsl(225 66.7% 1.2%))페이지 캔버스.
colorSurfacelight-dark(hsl(240 10% 95%),hsl(240 2% 10%))보조 표면입니다.
colorPrimarylight-dark(hsl(225 66.7% 1.2%),hsl(225 100% 99%))기본 텍스트.
colorFocuslight-dark(#1A44EA,#1A44EA)키보드 포커스입니다.
colorContrastLow / colorContrastLowerDecorative only접근성 기준을 충족하지 않는 텍스트 역할입니다.

타이포그래피 표현식

출처
이름 / 규칙값 / 구성용도
fontPorscheNext'Porsche Next','Arial Narrow',Arial,'Heiti SC',SimHei,sans-serif공식 글꼴 계열과 대체 글꼴입니다.
typescale2Xs.75rem목록에 있는 가장 작은 글자 크기입니다.
typescaleXs.875rem작은 메타데이터입니다.
typescaleSm1rem본문 기본 글자 크기입니다.
typescaleMdclamp(1.13rem, 0.21vw + 1.08rem, 1.33rem)유동형 글자 크기입니다.
typescale2Xlclamp(1.6rem, 1.56vw + 1.29rem, 3.16rem)유동형 대형 제목입니다.
leadingNormalcalc(6px + 2.125ex)서체에 따라 달라지는 줄 높이입니다.
fontWeightNormal / Semibold / Bold400 / 600 / 700사용 가능한 글꼴 두께입니다.

모양

출처
이름 / 규칙값 / 구성용도
radiusXs / Sm / Md2px / 4px / 6px작은 모양입니다.
radiusLg8px좁은 대화형 컨트롤입니다.
radiusXl12px표준 대화형 컨트롤입니다.
radius2Xl16px알림입니다.
radius3Xl24px타일 및 대화 상자형 컨테이너입니다.
radius4Xl32px고정 모서리 반경 중 가장 큽니다.
radiusFullcalc(infinity * 1px)독립형 알약 모양 표시기입니다.

중단점

출처
이름 / 규칙값 / 구성용도
breakpointXs480px 단위와 함께 사용하는 숫자 토큰입니다.
breakpointSm760px 단위와 함께 사용하는 숫자 토큰입니다.
breakpointMd1000px 단위와 함께 사용하는 숫자 토큰입니다.
breakpointLg1300px 단위와 함께 사용하는 숫자 토큰입니다.
breakpointXl1760px 단위와 함께 사용하는 숫자 토큰입니다.
breakpoint2Xl1920px 단위와 함께 사용하는 숫자 토큰입니다.

분할 선택 규칙

출처
이름 / 규칙값 / 구성용도
valuestring | number선택된 항목의 값입니다.
change eventdetail: { value: string | number }애플리케이션 상태를 업데이트합니다.
columnsauto or 1–25; responsive values supported항목 그리드를 제어합니다.
noWrapfalse by defaulttrue로 설정하면 한 줄로 스크롤할 수 있습니다.
statenone / error / success유효성 검사 스타일입니다.
disabledExcludes value from form submission일반적인 미선택 항목과 다릅니다.
03

Porsche 디자인 시스템 전체 가이드

실제 인터페이스를 위해 이 시스템을 선택하고 적용하고 검토하는 실용 가이드.

DESIGN-porsche.md

완전한 안내와 구현 시작점, 소스 링크.

가이드 다운로드

Porsche 디자인 시스템 v4 기반 요소를 하나의 완전한 구성으로 사용하세요

전역 변수가 필수입니다

버전 4에서는 전역 CSS 변수를 기반으로 구성 요소 스타일을 만듭니다. 따라서 전역 스타일시트를 가져오는 것은 장식용 초기화가 아니라 아키텍처상 필수 요건입니다. 같은 가져오기에 정규화 규칙과 Porsche Next @font-face 정의도 포함됩니다.

이 OpenDesign 가이드에서

이 참고 자료에는 v4 구성 요소와 토큰 규칙을 함께 정리했습니다. 텍스트 필드 래퍼나 구성 요소별 테마 prop을 사용하는 이전 예제를 마이그레이션 가이드 없이 그대로 가져오지 마세요. 문서 자체도 버전이 지정되어 있으므로, 이 페이지에서는 변하지 않는 API라고 주장하는 대신 적용 범위를 명시합니다.

지원 사양 읽기

Porsche 디자인 시스템 색상 구성에서 역할별 색상 쌍 전체를 선택합니다

인터페이스 역할과 외장 색상 견본을 구분하세요

캔버스, 표면, 기본 전경색 토큰에는 light-dark() 쌍이 포함되어 있습니다. CSS color-scheme 속성에서 적용할 색상 분기를 선택합니다. 애플리케이션에서 모드를 고정하거나 사용자의 환경설정을 따르도록 설정하려면 light, dark 또는 light dark를 지정하세요.

이 예시의 외장 색상은 별도로 제작한 견본입니다. 인터페이스를 다크 모드로 전환해도 주변의 표면과 텍스트만 바뀌며 선택한 외장 색상은 바뀌지 않습니다. 대비가 낮은 색상 역할은 장식용입니다. 이를 필수 선택 항목의 레이블에 사용하면 토큰의 의도된 사용 범위를 벗어납니다.

지원 사양 읽기

Porsche 디자인 시스템 유동적인 리듬과 고정된 컨트롤 간격의 조화

공간이 늘어나야 하는 곳에는 clamp 표현식을 사용하세요

Porsche는 고정형과 유동형 스케일을 모두 제공합니다. 기본 엔트리는 페이지 여백에 중간 유동 표현식을 사용하고, 옵션 영역 내부에는 16px 및 32px 간격을 적용해 안정적인 관계를 유지합니다. 유동형 최댓값을 설정하면 넓은 화면에서도 여백이 끝없이 늘어나는 것을 방지할 수 있습니다.

예제는 문서화된 브레이크포인트 값 중 하나인 760px 아래에서 넓은 이미지와 컨트롤의 배치를 섹션별 세로 배치로 전환합니다. 세로 배치 여부는 애플리케이션 구성에 따른 선택이며, 브레이크포인트 값 자체는 디자인 시스템의 기준입니다.

지원 사양 읽기

Porsche 디자인 시스템 타이포그래피는 제공된 글꼴에 따라 달라집니다

줄 높이 표현식은 일반적인 비율이 아닙니다

Porsche Next에는 문서화된 대체 글꼴 스택과 작은 고정 크기 및 큰 유동형 크기로 구성된 타이포그래피 스케일이 있습니다. leadingNormal은 글꼴의 x-height에 반응하는 ex 단위에 고정 픽셀 값을 더해 사용합니다. 이를 임의의 1.5 비율로 바꾸면 의도한 리듬이 달라집니다.

오프라인 해석에서는 라이선스가 필요한 글꼴이 포함된 것처럼 가장하지 않고, 로컬 대체 글꼴과 편안하게 읽을 수 있는 줄 높이를 사용합니다. 기본 엔트리에서는 전역 스타일시트가 실제 글꼴을 정의합니다. v4 디자인 언어에서 제목은 일반 굵기를 사용하며, 계층을 표현하기 위해 큰 글꼴을 반드시 굵게 만들 필요는 없습니다.

지원 사양 읽기

Porsche 디자인 시스템 컨트롤과 컨테이너에는 서로 다른 모서리 반경을 사용합니다

12px와 24px로 주요 계층을 정의합니다

표준 인터랙티브 요소의 반경은 12px이며, 카드와 대화상자 계열에는 24px을 사용합니다. 컴팩트 컨트롤에는 8px, 알림에는 16px을 적용합니다. 모든 요소에 가장 큰 반경을 적용하면 이러한 관계가 사라집니다.

원본 미리보기는 차량 디자인 예시를 넓은 24px 표면에 배치하고 12px 컨트롤을 사용합니다. 차량 실루엣은 독창적인 CSS 아트워크이며, Porsche 모델 렌더링이나 제품 사진이 아닙니다. 실제 구성 가능성을 암시하지 않으면서 동일한 구성을 소재 선택기에 활용할 수 있습니다.

지원 사양 읽기

Porsche 디자인 시스템 세그먼트 컨트롤은 선택 컨트롤이지 탭 바가 아닙니다

안정적인 값을 사용하고 상태 관리 주체를 하나로 유지하세요

각 p-segmented-control-item은 값을 제공합니다. 변경 이벤트는 해당 값을 event.detail로 반환하며, 예제에서는 요약을 다시 그리기 전에 이 값을 저장합니다. 그룹에는 표시되는 레이블을 지정해 마감 옵션과 휠 옵션을 구분합니다.

v4 API은 반응형 열 개수와 선택적 줄 바꿈 없는 스크롤을 지원합니다. 짧은 옵션은 한 화면에 함께 표시할 수 있으며, 현지화로 길어진 레이블은 잘라내지 말고 줄 바꿈을 적용하거나 의도적으로 스크롤할 수 있게 해야 합니다. 비활성화된 컨트롤은 폼 데이터에서 제외되므로, 이 예제를 실제 폼으로 확장할 때 유의해야 합니다.

  1. 애플리케이션 상태에서 마감과 휠 값을 한 번만 초기화합니다.
  2. 그룹의 change 이벤트에서 detail.value를 읽습니다.
  3. 화면에 표시되는 예시와 텍스트 선택 값을 함께 업데이트합니다.
  4. 수정 후에는 이전에 저장한 요약을 지웁니다.

지원 사양 읽기

Porsche 디자인 시스템 로컬에서 선택한 것은 완료된 거래가 아닙니다

버튼 유형을 명시적으로 지정하세요

p-button의 기본 유형은 submit입니다. 조합 저장과 색상 테마 변경은 로컬 상호작용이므로 예제에서는 type="button"을 지정합니다. 이동에는 목적지를 임의로 설정한 버튼 대신 Link 컴포넌트를 사용합니다.

기본 동작은 실제 수행된 내용만 알립니다. 현재 페이지 세션에서 조합을 저장했다는 뜻입니다. 새로고침 후에도 유지되거나 계정에 저장되거나 주문이 접수됐다고 알리지 않습니다. 인터페이스 예제로서 의도적으로 동작 범위를 제한했으며, 이 범위에서 완결성을 갖춥니다.

  • 기본 버튼은 현재 로컬 조합을 저장합니다.
  • 보조 버튼은 인터페이스 색상 테마를 변경합니다.
  • 두 동작 모두 표시되는 레이블을 유지합니다.
  • 대기 중인 작업이 없으면 로딩 스피너를 표시하지 않습니다.

지원 사양 읽기

Porsche 디자인 시스템 컴포넌트를 로드하고 첫 렌더링을 보호하세요

로더, 스타일시트, 컴파일러가 함께 작동합니다

Vite 구성은 공식 로더 부분 템플릿을 문서의 body에 삽입합니다. 메인 엔트리는 전역 스타일시트를 가져와 실제 커스텀 요소를 렌더링합니다. 범위가 지정된 :not(:defined) 규칙은 선택한 컴포넌트 태그가 등록되기 전에 깜빡이는 현상을 방지합니다.

문서화된 Vite 설정에서는 Lightning CSS의 LightDark 변환 기능을 제외합니다. 해당 폴리필에 문제가 있다고 명시되어 있기 때문입니다. 이 제외 설정은 중요합니다. 토큰 함수를 잘못 컴파일해 제거하면 컴포넌트 마크업이 올바르더라도 테마가 깨질 수 있습니다. 권장 프리로드는 나중에 문서화된 글꼴, 아이콘, 컴포넌트 부분 템플릿을 통해 추가할 수 있습니다.

지원 사양 읽기

Porsche 디자인 시스템 Porsche 디자인 시스템 컴포넌트 예제

완전한 독립형 인터랙티브 예제

전체 문서를 index.html로 저장한 다음 브라우저에서 엽니다. v4 토큰 역할과 세그먼트 선택 동작을 오프라인에서 독창적으로 HTML/CSS 해석한 예제입니다. 기본 PDS 런타임, 원격 글꼴, 공식 모델 이미지 또는 실제 차량 데이터는 포함하지 않습니다.

html
<!doctype html><html lang="en"><meta charset="utf-8"><meta name="viewport" content="width=device-width"><title>Original finish study</title><style>:root{color-scheme:light;--canvas:#fff;--surface:hsl(240 10% 95%);--ink:hsl(225 66.7% 1.2%);--line:#c8c8cd;--paint:#b9b6ae}*{box-sizing:border-box}body{margin:0;background:var(--canvas);color:var(--ink);font:16px/1.5 'Arial Narrow',Arial,sans-serif}body.dark{color-scheme:dark;--canvas:hsl(225 66.7% 1.2%);--surface:hsl(240 2% 10%);--ink:#fcfcff;--line:#515156}button{font:inherit;cursor:pointer}button:focus-visible,input:focus-visible+span{outline:3px solid #1a44ea;outline-offset:4px}header{display:flex;justify-content:space-between;gap:16px;align-items:center;padding:24px 32px;border-bottom:1px solid var(--line)}header b{letter-spacing:3px;font-weight:400}header button{border:1px solid var(--line);color:var(--ink);background:var(--canvas);border-radius:12px;padding:8px 16px}main{max-width:1200px;padding:clamp(16px,1.25vw + 12px,36px);margin:auto}h1{font-size:clamp(1.6rem,1.56vw + 1.29rem,3.16rem);font-weight:400;line-height:1.2;margin:16px 0}.intro{color:var(--ink);opacity:.8;max-width:650px}.layout{display:grid;grid-template-columns:1.4fr 1fr;gap:32px;margin-top:32px}.stage{background:var(--surface);border-radius:24px;display:flex;flex-direction:column;justify-content:center;min-height:360px;overflow:hidden;padding:32px;position:relative}.scene{height:210px;position:relative;width:100%;max-width:520px;margin:auto}.car{height:80px;width:94%;position:absolute;bottom:28px;left:3%;background:var(--paint);border-radius:60% 35% 18% 22% / 75% 65% 25% 35%;box-shadow:inset 0 5px 10px #ffffff70,inset 0 -10px 12px #0003}.roof{position:absolute;bottom:80px;left:25%;width:46%;height:70px;background:var(--paint);border-radius:65% 55% 0 0;transform:skewX(-9deg)}.window{position:absolute;inset:9px 13px 4px;background:linear-gradient(135deg,#202d37,#67737b);border-radius:70% 52% 0 0;border-right:7px solid var(--paint)}.window:after{content:'';position:absolute;left:46%;top:0;height:100%;width:6px;background:var(--paint)}.wheel{position:absolute;bottom:12px;width:69px;height:69px;background:repeating-conic-gradient(#d2d5d8 0deg 13deg,#42464b 13deg 60deg);border:11px solid #191a1d;border-radius:50%;box-shadow:0 0 0 4px #08090a}.wheel.a{left:16%}.wheel.b{right:12%}.aero .wheel{background:radial-gradient(circle,#505860 0 18%,#c6c9cc 20% 65%,#464a4d 68%)}.headlight{position:absolute;right:0;top:18px;width:34px;height:12px;background:#fff9d8;border:2px solid #ffffff80;border-radius:80%;transform:rotate(15deg)}.shadow{height:10px;background:#0002;position:absolute;bottom:7px;width:90%;left:5%;border-radius:50%;filter:blur(5px)}.stage small{font-size:12px;opacity:.7}.panel{padding:8px 0}fieldset{border:0;padding:0;margin:0 0 32px;min-width:0}legend{font-size:18px;margin-bottom:16px}.segments{display:flex;background:var(--surface);padding:4px;border-radius:16px;gap:4px}.segments label{flex:1;min-width:0;position:relative;text-align:center;cursor:pointer}.segments input{position:absolute;opacity:0;width:1px;height:1px}.segments span{display:block;padding:12px 8px;border:1px solid transparent;border-radius:12px}.segments input:checked+span{background:var(--canvas);border-color:var(--ink);box-shadow:0 1px 4px #0002}.swatch{display:inline-block;width:12px;height:12px;border-radius:50%;margin-right:6px;border:1px solid #777}.summary{border-top:1px solid var(--line);padding-top:24px;margin:0 0 24px}.summary small{display:block;opacity:.65;margin-bottom:4px}.summary strong{font-weight:400;font-size:20px}.primary{border:0;border-radius:12px;min-height:52px;background:var(--ink);color:var(--canvas);padding:12px 24px;width:100%}.saved{border-left:3px solid var(--ink);padding-left:16px;margin-top:24px}.saved:empty{display:none}footer{font-size:12px;opacity:.7;padding-top:32px}@media(max-width:759px){header{padding:16px}header b{font-size:13px;letter-spacing:1px}.layout{grid-template-columns:1fr;gap:24px}.stage{min-height:270px;padding:16px}.scene{height:210px}.wheel{width:53px;height:53px;border-width:8px;bottom:21px}.car{bottom:38px}.roof{bottom:91px;height:60px}.segments span{padding:12px 5px;font-size:14px}fieldset{margin-bottom:24px}}
</style><header><b>DESIGN STUDY / 01</b><button id="theme" type="button">Dark interface</button></header><main><h1>A different point of view.</h1><p class="intro">Explore two small choices in an original vehicle study. See how a restrained interface keeps the object at the center.</p><div class="layout"><div class="stage"><div class="scene" id="scene" role="img" aria-label="Original vehicle illustration in Chalk with Classic wheels"><div class="shadow"></div><div class="roof"><div class="window"></div></div><div class="car"><div class="headlight"></div></div><div class="wheel a"></div><div class="wheel b"></div></div><small>Original illustration · Not a Porsche model render</small></div><section class="panel" aria-label="Study options"><fieldset><legend>Finish</legend><div class="segments"><label><input type="radio" name="paint" value="chalk" checked><span><i class="swatch" style="background:#b9b6ae"></i>Chalk</span></label><label><input type="radio" name="paint" value="blue"><span><i class="swatch" style="background:#456171"></i>Coastal blue</span></label><label><input type="radio" name="paint" value="red"><span><i class="swatch" style="background:#9f2937"></i>Garnet</span></label></div></fieldset><fieldset><legend>Wheel study</legend><div class="segments"><label><input type="radio" name="wheel" value="Classic" checked><span>Classic</span></label><label><input type="radio" name="wheel" value="Aero"><span>Aero</span></label></div></fieldset><p class="summary" aria-live="polite"><small>YOUR COMBINATION</small><strong id="summary">Chalk · Classic</strong></p><button class="primary" id="save" type="button">Keep this combination</button><p class="saved" id="saved" role="status"></p></section></div><footer>Independent PDS v4 interpretation. Original finish names and illustration; no pricing, vehicle specification, live configuration or order. Choices last only for this page session.</footer></main><script>const colors={chalk:'#b9b6ae',blue:'#456171',red:'#9f2937'},names={chalk:'Chalk',blue:'Coastal blue',red:'Garnet'};function values(){return[document.querySelector('[name=paint]:checked').value,document.querySelector('[name=wheel]:checked').value]}function update(){const[p,w]=values();document.documentElement.style.setProperty('--paint',colors[p]);document.querySelector('#scene').classList.toggle('aero',w==='Aero');document.querySelector('#scene').setAttribute('aria-label',`Original vehicle illustration in ${names[p]} with ${w} wheels`);document.querySelector('#summary').textContent=`${names[p]} · ${w}`;document.querySelector('#saved').textContent=''}document.querySelectorAll('input').forEach(x=>x.addEventListener('change',update));document.querySelector('#save').onclick=()=>{const[p,w]=values();document.querySelector('#saved').textContent=`Kept for this page session: ${names[p]}, ${w}. No order submitted.`};document.querySelector('#theme').onclick=e=>{const dark=document.body.classList.toggle('dark');e.currentTarget.textContent=dark?'Light interface':'Dark interface'};</script></html>

코드 참조

  • 마감과 휠 옵션을 선택하면 독창적인 구성기 일러스트가 업데이트됩니다. Porsche 제품 사양을 나타내지 않으며, 기본 세그먼트 컨트롤 이벤트는 별도의 v4 예제에 표시됩니다.

선택 항목 두 개를 제어하고 세션에만 요약 저장

기본 p-segmented-control 요소는 detail.value를 포함한 change 이벤트를 발생시키며, p-button은 명시적 유형과 함께 click 이벤트를 사용합니다.

타입스크립트
import './style.css';
const paints={chalk:'#b9b6ae',blue:'#456171',red:'#9f2937'};
const names={chalk:'Chalk',blue:'Coastal blue',red:'Garnet'};
type Paint=keyof typeof paints;
let paint:Paint='chalk',wheel='Classic';
document.querySelector<HTMLDivElement>('#app')!.innerHTML=`
<main><h1>Explore an original color study</h1>
<p>This specimen is not a real vehicle configurator or order.</p>
<div class="options">
<p-segmented-control id="paint" label="Finish" value="chalk">
 <p-segmented-control-item value="chalk">Chalk</p-segmented-control-item>
 <p-segmented-control-item value="blue">Coastal blue</p-segmented-control-item>
 <p-segmented-control-item value="red">Garnet</p-segmented-control-item>
</p-segmented-control>
<p-segmented-control id="wheel" label="Wheel study" value="Classic">
 <p-segmented-control-item value="Classic">Classic</p-segmented-control-item>
 <p-segmented-control-item value="Aero">Aero</p-segmented-control-item>
</p-segmented-control>
</div><div class="preview"><div id="swatch" style="height:120px;border-radius:12px"></div>
<p id="summary" aria-live="polite"></p></div>
<div class="actions"><p-button id="save" type="button">Keep this combination</p-button>
<p-button id="scheme" type="button" variant="secondary">Switch color scheme</p-button></div>
<p id="saved" role="status"></p></main>`;
function render(){document.querySelector<HTMLElement>('#swatch')!.style.background=paints[paint];document.querySelector('#summary')!.textContent=`${names[paint]} · ${wheel} wheel study`;document.querySelector('#saved')!.textContent='';}
document.querySelector('#paint')!.addEventListener('change',e=>{const v=(e as CustomEvent<{value:string}>).detail.value;if(v in paints){paint=v as Paint;render();}});
document.querySelector('#wheel')!.addEventListener('change',e=>{wheel=String((e as CustomEvent<{value:string}>).detail.value);render();});
document.querySelector('#save')!.addEventListener('click',()=>{document.querySelector('#saved')!.textContent=`Kept for this page session: ${names[paint]}, ${wheel}. No order submitted.`;});
document.querySelector('#scheme')!.addEventListener('click',()=>{const root=document.documentElement;root.style.colorScheme=root.style.colorScheme==='dark'?'light':'dark';});
render();

코드 참조

  • 두 선택 항목 중 하나를 변경하면 이전에 저장한 조합이 지워집니다.
  • color-scheme 속성은 시스템 테마를 제어하며, 마감 색상 견본은 애플리케이션의 독창적인 데이터로 유지됩니다.
  • 이 예제는 연락처 정보를 수집하거나 차량을 예약하거나 주문을 제출하지 않습니다.
04

Porsche 디자인 시스템 AI 에이전트 설정

구현 시작점

문서화된 전역 스타일시트와 로더 부분 템플릿을 사용하는 v4 기본 Web Component 설정입니다. 오프라인 미리보기에는 원격 글꼴이나 패키지 런타임이 없습니다. 기본 패키지 컴파일은 여기서 검증하지 않았습니다.

text
# In a new Vite vanilla-ts project:
npm create vite@latest pds-specimen -- --template vanilla-ts
cd pds-specimen
npm install
npm install @porsche-design-system/components-js@4
npm install --save-dev lightningcss

// vite.config.ts
import {defineConfig} from 'vite';
import {Features} from 'lightningcss';
import {getLoaderScript} from '@porsche-design-system/components-js/partials';
export default defineConfig({
 plugins:[{name:'pds-loader',transformIndexHtml(html){
  return html.replace('</body>',getLoaderScript()+'</body>');
 }}],
 css:{transformer:'lightningcss',lightningcss:{exclude:Features.LightDark}}
});

/* src/style.css */
@import '@porsche-design-system/components-js';
html { color-scheme: light; }
:is(p-button,p-segmented-control,p-segmented-control-item):not(:defined){visibility:hidden}
main{max-width:60rem;margin:auto;padding:clamp(16px,1.25vw + 12px,36px)}
.options{display:grid;gap:32px}
.preview{padding:32px;border-radius:24px;margin-block:32px;border:1px solid currentColor}
.actions{display:flex;gap:16px;flex-wrap:wrap}

# Replace src/main.ts with the example below, then:
npm run dev

프로젝트를 위한 프롬프트

에이전트 프롬프트
필수 전역 스타일, 로더 부분 템플릿, color-scheme, 실제 유동형 간격, 12px 컨트롤 및 24px 컨테이너 반경을 사용하는 v4 PDS 구성을 만드세요. 독창적인 샘플 선택 항목 두 개에는 segmented-control의 change 이벤트에서 detail.value를 사용하고, 로컬 동작에는 type=button을 명시하세요. 레거시 래퍼 API를 함께 사용하지 말고, 샘플을 실제 차량 구성으로 표현하지 마세요.
05

Porsche 디자인 시스템 출처 및 범위

PDS v4에 한정된 독립적인 OpenDesign 참고 자료입니다. 오리지널 아트워크와 마감 이름은 Porsche 차량 사양, 도장 코드 또는 선택 가능한 옵션이 아닙니다. 거래는 이루어지지 않습니다.