본문으로 건너뛰기

테마 레벨

테마는 세 가지 독립적인 레벨로 만들어집니다. 이 구분을 이해하는 것이 테마가 동작을 건드리지 않고 애플리케이션 전체의 모양을 바꾸는 방법입니다.

레벨 1: 디자인 토큰​

토큰은 --st- 접두사가 붙은 의미적 CSS 사용자 지정 속성입니다. 색상, 타이포그래피, 간격, 모서리 반경, 테두리, 그림자, z-index 레이어, 모션, 컨트롤 크기, 스크롤바, 채팅 캔버스를 다룹니다.

컴포넌트는 토큰만 참조하며 색상, 글꼴, 간격 값을 절대 하드코딩하지 않습니다. 테마 매니페스트에서 토큰을 오버라이드하면 그 토큰을 사용하는 모든 컴포넌트가 다시 스타일링됩니다.

{
"tokens": {
"dark": {
"color-accent": "#ff00aa",
"font-ui": "'Atkinson Hyperlegible', system-ui, sans-serif"
}
}
}

토큰은 상속 체인을 통해 해석됩니다. 모드의 기본 제공 기본값, 그다음 부모 테마, 마지막으로 테마 자체입니다. 다크 오버라이드가 없으면 다크 모드는 테마의 라이트 토큰으로 폴백합니다. 전체 계약은 디자인 토큰을 참조하세요.

레벨 2: 컴포넌트 스킨​

컴포넌트 스킨은 안정적인 훅을 통해 기본 제공 컴포넌트를 다시 스타일링하는 CSS입니다. 호스트가 data-component, data-part, data-role, data-state 속성을 게시하고, 테마는 생성된 CSS 모듈 클래스 이름이 아니라 이 속성을 스타일링합니다.

@layer theme {
[data-component='button'][data-variant='primary'] {
background: var(--st-color-accent);
}
}

스킨은 고정된 순서의 캐스케이드 레이어로 적용되며 사용자 오버라이드 레이어가 마지막입니다. !important는 접근성 기본 설정 레이어를 제외하고 테마 CSS에서 금지됩니다. 레이어 순서와 훅 레퍼런스는 컴포넌트 스킨을 참조하세요.

레벨 3: 셸 레이아웃​

셸 레이아웃은 주요 영역의 구성입니다. 내비게이션 레일, 관리 패널, 채팅 워크스페이스입니다. JavaScript가 아니라 theme.json에 표현되는 선언적 형식입니다.

{
"shellLayout": {
"navigationRail": {
"main": [
"menu-toggle",
"chats",
"characters",
"personas",
"lorebooks",
"backgrounds",
"ai-settings",
"plugins"
],
"bottom": ["settings"]
}
}
}

유효한 레일 항목은 chats, characters, personas, lorebooks, backgrounds, ai-settings, plugins, settings, 선택적인 menu-toggle입니다. main 그룹은 위에서부터 흐르고 bottom은 아래 가장자리에 고정됩니다. 생략한 항목은 표준 순서로 다시 추가되므로 테마가 실수로 설정을 숨겨 사용자가 복구에서 잠기는 일이 없습니다.

다른 인터페이스 흉내내기​

레벨이 서로 분리되어 있으므로 테마는 완전히 다른 인터페이스 패러다임을 흉내낼 수 있습니다.

  • 콘솔 스타일 테마는 토큰과 스킨을 바꿔 레일, 패널, 버튼을 게임 UI처럼 보이게 합니다.
  • 비주얼 노벨 테마는 채팅 로직이 온전한 채로 채팅 뷰포트, 메시지, 캐릭터 헤더를 다시 스타일링합니다.
  • 모바일 앱 테마는 선언적 셸 레이아웃으로 레일과 패널을 재정렬합니다.

이 중 어느 것도 채팅 로직, 데이터, 플러그인 동작을 건드릴 필요가 없으며, 그래서 테마 표면을 통째로 교체할 수 있습니다. v1이 제공하지 않는 한 가지는 셸 영역의 자유 형식 재배치입니다. 슬롯은 스타일링되고 채워지지만 이동되지는 않습니다. 범위는 셸 계약을 참조하세요.