독립적인 오프라인 HTML/CSS 구현입니다. 독자적인 팔레트, 시스템 글꼴, 애플리케이션 크기를 사용하며 네이티브 iX 런타임이 아닙니다. · 구현 레퍼런스
02
Siemens iX 디자인 시스템 설계 참고 자료
현재 공개된 iX 문서와 공식 main 브랜치의 컴포넌트 API 스냅샷을 참고했습니다. 아래 색상 항목은 의미 역할이며, 임의로 만든 고정 16진수 색상 값이 아닙니다. 설치 패키지 버전은 함께 고정해야 합니다. 오프라인 예시에는 자체 팔레트와 크기를 사용하며, 이를 명확히 표시합니다.
작업 예시는 가상의 장비 노트북입니다. 세 개의 기록은 원본 심각도를 유지하고, 별도의 로컬 검토 상태로 독자가 확인한 항목을 추적합니다. 이러한 분리는 구성의 핵심입니다. 행 선택, 메모 읽기, 물리적 상태 해결은 서로 다른 작업입니다. 미리보기는 처음 두 작업을 구현하며, 실제 장비를 제어한다고 주장하지 않습니다.
Event List는 장식용 카드보다 더 나은 시작점입니다. 선택 상태, 심각도 표시, 꺾쇠 아이콘을 통해 반복되는 기록을 탐색 가능한 모음으로 명확하게 보여 주기 때문입니다. 긴 텍스트는 인스펙터에서 행 바깥에 표시합니다. 알람이 해제되었다고 주장하는 가짜 원격 측정 데이터나 성공 토스트는 없습니다.
색상 시스템은 불투명한 배경 레이어와 반투명한 컴포넌트 채우기를 구분합니다. 컴포넌트 채우기는 그 아래에 놓인 표면과 함께 평가해야 합니다. 스크린샷의 16진수 색상 값을 각 행에 복사하지 말고, 네이티브 코드에서 실제 테마 변수를 사용하세요.
표준 텍스트와 부드러운 텍스트는 서로 다른 읽기 우선순위에 사용됩니다. 약한 텍스트는 비활성 콘텐츠용이므로, 조사에 필요한 타임스탬프를 무조건 해당 역할로 지정해서는 안 됩니다. 오류 전경색에는 상태 채우기 색을 그대로 재사용하기보다 전용 알람 텍스트 역할을 사용하는 것이 적절합니다.
iX는 타이포그래피를 제목, 본문, 레이블, 디스플레이, 코드로 구분합니다. 점검 메모에는 여러 줄 표시를 지원하는 본문 형식이 필요합니다. 큰 숫자에는 디스플레이 형식이 적합하고, 짧은 필터 레이블에는 레이블 형식을 사용합니다. 전체 이벤트 설명을 키우기 위한 편법으로 디스플레이 형식을 사용해서는 안 됩니다.
문서에 수록된 ix-typography format="h3" 예제는 구체적인 구현 방법을 보여 줍니다. 이에 상응하는 Sass typography-h3 믹스인을 사용하면 글꼴 규칙을 다시 만들지 않고도 사용자 지정 요소에 적용할 수 있습니다. 미리보기에는 의도적으로 시스템 글꼴 대체 설정과 애플리케이션 글꼴 크기를 사용했습니다. 이 값들은 공식 Siemens 토큰으로 제시하는 것이 아닙니다.
API 스냅샷은 itemHeight에 S, L 또는 숫자를 지정할 수 있음을 보여 줍니다. 예제에서는 L을 선택하고 compact는 기본값인 false로 두며 꺾쇠 아이콘을 활성화합니다. 현지화된 제목이 긴 운영 로그에서는 예제처럼 모든 기록이 들어맞는다고 가정하지 말고, 줄바꿈을 고려해 선택한 높이를 확인해야 합니다.
각 항목의 selected는 ID 비교 결과를 사용하고, 래퍼의 onItemClick 핸들러를 통해 itemClick을 전달합니다. 인스펙터도 동일한 ID를 읽습니다. 따라서 시각적 선택과 상세 패널이 서로 다른 기록을 가리키는 문제를 방지할 수 있습니다. 필터를 변경하면 선택된 ID를 명시적으로 초기화합니다.
Siemens iX 디자인 시스템: 색상이나 정밀한 포인터 조작 없이도 상태를 인지할 수 있게 하세요
텍스트, 키보드 조작, 포커스
오프라인 미리보기에서는 기록에 네이티브 버튼을, 심각도에 레이블이 있는 선택 컨트롤을, 검토 피드백에 aria-live 상태 영역을 사용합니다. Enter와 Space로 기록을 선택할 수 있습니다. 네이티브 라이브러리 구성에서는 Event List 래퍼를 사용합니다. 사용자 지정 포커스 재정의를 적용하기 전에 설치된 버전의 키보드 및 보조 기술 동작을 테스트해야 합니다.
레이블은 업무상 차이를 명확히 나타냅니다. 알람 해결이 아니라 로컬에서 검토 표시를 합니다. 검토 작업을 사용할 수 없는 경우에도 검토 완료 상태를 눈에 보이게 표시합니다. 의미 전달을 색상에만 의존하지 않으며, 필터를 바꿔도 다른 범주에 접근할 수 없는 이전 선택 상태가 남지 않습니다.
설정 블록에는 패키지 가져오기, 문서 테마 속성, 실제 컴포넌트 속성, 전체 React 상태, 애플리케이션 CSS가 포함됩니다. 테마 선택기에는 비슷한 이름의 사용자 지정 속성이 아니라 data-ix-color-schema를 사용하세요. 애플리케이션에서 설치된 core, wrappers, icons의 호환 버전을 고정하세요.
시각적 예제는 이러한 상호작용 규칙을 적용한 오프라인 HTML/CSS입니다. 짙은 남색 팔레트, 24픽셀 여백, 개략적인 장비 그림은 애플리케이션에서 자체적으로 정한 요소입니다. 네이티브 화면과 시각적으로 일치시키려면 공식 스타일시트를 사용해 별도의 React 예제를 실행하고 계산된 테마 값을 확인하세요.
Vite React 스캐폴드에 core, React wrappers, icons를 설치하고 생성된 루트 요소를 유지하세요.
제공된 파일로 main.jsx와 style.css를 바꾼 다음, 문서에서 classic과 dark, light 또는 system을 선택하세요.
기록을 선택하고 검토 표시를 한 뒤 목록을 필터링하여, 숨겨진 선택 상태는 초기화되면서 심각도는 유지되는지 확인하세요.
전체 문서를 index.html로 저장한 다음 브라우저에서 여세요. 독립적으로 만든 오프라인 HTML/CSS 구현입니다. 자체 팔레트, 시스템 글꼴, 애플리케이션 크기를 사용하며 네이티브 iX 런타임이 아닙니다.
html
<!doctype html><html lang="en"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Equipment event notebook — iX interpretation</title><style>
*{box-sizing:border-box}body{margin:0;background:#000028;color:#f3f3fa;font:15px/1.5 Arial,sans-serif}button,select{font:inherit;color:inherit}button{cursor:pointer}button:focus-visible,select:focus-visible{outline:3px solid #00cccc;outline-offset:3px}.app{max-width:1200px;margin:auto;padding:28px}.top{display:flex;justify-content:space-between;gap:16px;border-bottom:1px solid #55556b;padding-bottom:18px}.brand{letter-spacing:.12em;color:#00cccc}.dim{color:#b6b6c8}h1{font-size:30px;font-weight:500;line-height:1.2;margin:20px 0 8px}h2{font-size:21px;font-weight:500;margin:0 0 12px}.banner{display:grid;grid-template-columns:1.2fr 1fr;gap:24px;align-items:center;padding-bottom:24px}.schematic{height:140px;position:relative;display:flex;align-items:center;justify-content:space-evenly;border-bottom:2px solid #77788e;background:linear-gradient(transparent 23px,#23233c 24px);background-size:24px 24px}.schematic:before{content:'';position:absolute;left:10%;right:10%;top:68px;height:5px;background:#666780}.unit{position:relative;width:76px;height:76px;border:2px solid #b6b6c8;background:#141432;display:grid;place-content:center;text-align:center}.unit:first-child{border-color:#ff8da5}.unit span{color:#b6b6c8;font:12px monospace}.toolbar{display:flex;align-items:center;gap:16px;margin:10px 0 18px}select{background:#23233c;border:1px solid #8b8b9e;padding:8px 28px 8px 10px}.layout{display:grid;grid-template-columns:1.6fr 1fr;gap:24px}.event{width:100%;display:grid;grid-template-columns:70px 1fr 20px;gap:14px;text-align:left;align-items:center;padding:18px 14px;border:1px solid #55556b;border-left:4px solid var(--severity);background:#141432;margin-bottom:10px}.event:hover{background:#292944}.event[aria-pressed=true]{outline:2px solid #00cccc;outline-offset:1px}.event strong{font-size:15px;font-weight:600;display:block}.event small{display:block;color:#c0c0cf;margin-top:4px}.severity{font-size:11px;letter-spacing:.06em}.inspector{padding:20px;background:#23233c;border-top:3px solid #00cccc;min-height:290px}.meta{font:12px monospace;color:#b6b6c8}.tag{font-size:12px;border:1px solid #6c6c80;padding:3px 8px;display:inline-block;margin:10px 0}.action{background:#00cccc;border:0;color:#000028;padding:11px 16px;margin-top:10px}.action:disabled{background:#515168;color:#e0e0e8;cursor:default}.status{min-height:48px;color:#b7eeee;font-size:13px}.note{border-top:1px solid #55556b;margin-top:24px;padding-top:16px;color:#b6b6c8;font-size:12px}@media(max-width:650px){.app{padding:18px}.top{font-size:12px}.banner,.layout{grid-template-columns:1fr}.banner{gap:8px}.schematic{height:115px}.schematic:before{top:56px}.unit{height:60px;width:65px}h1{font-size:26px}.event{grid-template-columns:60px 1fr 10px;gap:8px}.toolbar{flex-wrap:wrap}}
</style><main class="app"><header class="top"><b class="brand">EVENT NOTEBOOK</b><span class="dim">Sample plant / offline</span></header><div class="banner"><div><h1>Inspect the event.<br>Keep its meaning.</h1><p class="dim">Review equipment notes without changing their original severity.</p></div><div class="schematic" aria-label="Original schematic of three fictional equipment units" role="img"><div class="unit">A<span>PUMP</span></div><div class="unit">B<span>PUMP</span></div><div class="unit">C<span>LINE</span></div></div></div><div class="toolbar"><label for="severity">Severity</label><select id="severity"><option value="all">All events</option><option value="alarm">Alarm</option><option value="warning">Warning</option><option value="info">Info</option></select><span class="dim" id="count"></span></div><div class="layout"><section aria-label="Event records" id="events"></section><aside class="inspector" aria-label="Selected event" id="detail"></aside></div><p class="note">Independent HTML interpretation of Siemens iX interaction rules. Original colors, dimensions and fictional equipment records. Local review does not acknowledge or resolve a live alarm.</p></main><script>
const data=[{id:'E-014',severity:'alarm',color:'#ff8da5',title:'Cooling flow below sample threshold',asset:'Pump A',time:'09:42',note:'Inspect the cooling circuit before considering a reset. This fictional record remains an alarm after you mark the note reviewed.'},{id:'E-015',severity:'warning',color:'#ffce6b',title:'Filter service approaching',asset:'Pump B',time:'09:38',note:'Schedule a filter inspection. Reviewing this notebook entry does not schedule maintenance or alter equipment.'},{id:'E-016',severity:'info',color:'#65cfff',title:'Inspection checklist attached',asset:'Line C',time:'09:30',note:'A fictional checklist is available for review. This sample displays the record; it does not connect to a document service.'}];let selected='E-014';const reviewed=new Set();function render(){let visible=data.filter(r=>severity.value==='all'||r.severity===severity.value);document.querySelector('#count').textContent=visible.length+' event'+(visible.length===1?'':'s');events.innerHTML=visible.map(r=>`<button class="event" id="row-${r.id}" style="--severity:${r.color}" aria-pressed="${selected===r.id}" data-id="${r.id}"><span class="severity">${r.severity.toUpperCase()}</span><span><strong>${r.title}</strong><small>${r.asset} · ${r.time}${reviewed.has(r.id)?' · Reviewed locally':''}</small></span><span aria-hidden="true">›</span></button>`).join('');const r=visible.find(r=>r.id===selected);detail.innerHTML=r?`<div class="meta">${r.id} / ${r.asset}</div><h2>${r.title}</h2><span class="tag">${r.severity.toUpperCase()} · source condition unchanged</span><p>${r.note}</p><button class="action" id="review" ${reviewed.has(r.id)?'disabled':''}>Mark reviewed locally</button><p class="status" role="status">${reviewed.has(r.id)?'Reviewed in this browser session. Source severity is unchanged.':''}</p>`:'<h2>Select an event</h2><p class="dim">Choose a record to inspect its note.</p>';events.querySelectorAll('button').forEach(b=>b.onclick=()=>{selected=b.dataset.id;render();document.getElementById('row-'+selected).focus()});if(r&&!reviewed.has(r.id))document.querySelector('#review').onclick=()=>{reviewed.add(r.id);render()}}const severity=document.querySelector('#severity'),events=document.querySelector('#events'),detail=document.querySelector('#detail');severity.onchange=()=>{selected='';render()};render();
</script></html>
미리보기는 시스템 글꼴 대체 서체를 사용하며, Siemens 브랜드 글꼴을 제공하지 않습니다.
04
Siemens iX 디자인 시스템 에이전트 설정
구현 시작점
기존 루트 요소가 있는 Vite React 스캐폴드에 맞춰 main.jsx와 style.css를 완성하세요. 공식 래퍼, CSS 가져오기 및 Event List 속성은 문서화되어 있지만, 여기서는 패키지를 직접 컴파일하지 않았습니다. 임베디드 미리보기는 별도로 만든 오프라인 해석입니다.
jsx
// In a Vite React project: npm install @siemens/ix @siemens/ix-react @siemens/ix-icons
// src/main.jsx
import React, {useState} from 'react';
import {createRoot} from 'react-dom/client';
import {IxEventList, IxEventListItem, IxTypography} from '@siemens/ix-react';
import '@siemens/ix/dist/siemens-ix/siemens-ix.css';
import './style.css';
document.documentElement.dataset.ixTheme='classic';
document.documentElement.dataset.ixColorSchema='dark';
const records=[
{id:'E-014',severity:'alarm',title:'Cooling flow below sample threshold',asset:'Pump A',time:'09:42',note:'Original demonstration record: inspect the cooling circuit before considering a reset.'},
{id:'E-015',severity:'warning',title:'Filter service approaching',asset:'Pump B',time:'09:38',note:'Original demonstration record: schedule a filter inspection.'},
{id:'E-016',severity:'info',title:'Inspection checklist attached',asset:'Line C',time:'09:30',note:'Original demonstration record: a checklist is available for review.'}
];
function App(){
const [filter,setFilter]=useState('all'),[selected,setSelected]=useState('E-014'),[reviewed,setReviewed]=useState([]);
const visible=records.filter(r=>filter==='all'||r.severity===filter);
const record=visible.find(r=>r.id===selected);
return <main><h1>Equipment event notebook</h1><p>Fictional records. Reviewing an entry does not control equipment or acknowledge a live alarm.</p>
<label htmlFor="severity">Severity</label><select id="severity" value={filter} onChange={e=>{setFilter(e.target.value);setSelected('')}}>
<option value="all">All events</option><option value="alarm">Alarm</option><option value="warning">Warning</option><option value="info">Info</option></select>
<div className="workspace"><section aria-label="Event records"><IxEventList itemHeight="L" chevron>
{visible.map(r=><IxEventListItem key={r.id} selected={selected===r.id} itemColor={`var(--theme-color-${r.severity})`} onItemClick={()=>setSelected(r.id)}>
<div className="record"><strong>{r.title}</strong><span>{r.severity.toUpperCase()} · {r.asset} · {r.time}{reviewed.includes(r.id)?' · Reviewed locally':''}</span></div>
</IxEventListItem>)}
</IxEventList></section><aside aria-label="Selected event">
{record?<><IxTypography format="h3">{record.id} / {record.asset}</IxTypography><p>{record.note}</p>
<button type="button" onClick={()=>setReviewed(a=>a.includes(record.id)?a:[...a,record.id])} disabled={reviewed.includes(record.id)}>Mark reviewed locally</button>
<p role="status">{reviewed.includes(record.id)?'Reviewed in this browser session. Source severity is unchanged.':''}</p></>:<p>Select an event to inspect its record.</p>}
</aside></div></main>
}
createRoot(document.getElementById('root')).render(<App/>);
/* src/style.css — custom dimensions are application choices */
main{max-width:72rem;margin:auto;padding:24px;color:var(--theme-color-std-text)}
.workspace{display:grid;grid-template-columns:2fr 1fr;gap:24px;margin-top:24px}
.workspace>*{min-width:0}aside{padding:20px;border:1px solid var(--theme-color-soft-bdr)}
.record{display:grid;gap:4px;padding:8px;white-space:normal;overflow-wrap:anywhere}
.record span{color:var(--theme-color-soft-text)}
button,select{font:inherit;padding:10px;background:var(--theme-color-component-1);color:var(--theme-color-std-text);border:1px solid var(--theme-color-std-bdr)}
button:focus-visible,select:focus-visible{outline:2px solid var(--theme-color-primary);outline-offset:3px}
@media(max-width:700px){.workspace{grid-template-columns:1fr}}
프로젝트를 위한 프롬프트
에이전트 프롬프트
이 가이드에서 확인된 Event List 속성과 문서화된 테마 속성을 사용해 Siemens iX 이벤트 노트를 만드세요. 심각도는 선택 및 로컬 검토 상태와 별도로 유지하세요. 기본 버전에서는 의미에 맞는 테마 색상을 사용하세요. 노트 작업이 실제 알람을 해결한다고 암시하지 마세요. 필터에 레이블을 붙이고, 행은 키보드로 접근할 수 있게 하며, 좁은 화면에서는 검사기를 세로로 배치하세요.
05
Siemens iX 디자인 시스템의 출처와 범위
독립적으로 제작한 OpenDesign 가이드입니다. 이벤트 데이터와 장비 일러스트는 허구입니다. 미리보기 스타일은 독창적인 해석이며, 별도의 React 예시는 문서화된 iX API를 사용합니다. 장비 연결, 원격 측정 또는 실시간 확인 기능은 구현되어 있지 않습니다.