← 미리디 아카이브

내용시각화 런타임 설계 2026-08-26 코드 실측

Sheet json · RLSC · Style Meta

요소 생성·대치의 큰그림. 모양(sheet json)을 고치고, 의미(RLSC)로 판단하고, 테마에 맞춘다 — 이 세 축이 어디서 만나는지를 데이터 층 · 서버 · 클라이언트 런타임 순으로 편다.

miricanvas-web-2 engine miricanvas-iui color-mapper aippt-prisonbreak structure_json
§1

데이터 층 — 같은 디자인의 세 표현 + 템플릿 테마

하나의 디자인이 세 가지 표현으로 동시에 존재한다. 그리는 것은 모양, 판단하는 것은 의미, 색을 맞출 곳은 테마다.

Sheet json (모양)
실제로 그리는 원본 노드 트리
PageJson · design_object_sheet_json
모든 대치의 최종 수정 대상
↳ DO별로 DB에 저장
RLSC (의미) · type/role 2축 트리
aippt LLM이 오프라인 구조화 · structure_json
Component RLSC — 컴포넌트 단위
검색·랭킹·폰트 주입의 근거
Sheet RLSC — 페이지(시트) 단위
GetTemplatePageRlscByIndex (이 흐름 밖 API)
↳ 시그니처 원료
테마 (색)
두 갈래다 — §2·§4 참고
ColorProfile (런타임 추출)
ThemeRegistry (오프라인 파일)
내용시각화는 앞, AIP는 뒤를 쓴다
Visual Tree (기하)
bbox 포함 관계 트리
sheet json에서 즉석 파생
buildVisualTree()
RLSC와 별개 · color-mapper v2 내부에서만

Sheet json 의 정본 타입은 어디에 있나

저장소마다 이름이 다르다 — 엔진은 PageData/PageJson, iui 는 Doc/Sheet, MORDOR 는 느슨한 PageJson (pipeline/common/type/pageJson.ts:314). 상속 관계가 아니라 각자 필요한 필드만 다시 선언한 것이라 구조적으로 호환되어 그냥 넘겨 쓴다. 자세한 해부는 sheetJson 해부도.

§2

서버 — 검색·매칭 (무엇으로 바꿀지 결정)

comp-sign 시그니처(structureHash)로 후보를 검색하고 하나를 고른다. 서버가 돌려주는 것은 후보키와 파일 URL이고, 큰 컬럼은 브라우저가 따로 받아 온다.

후보 해석 — 시그니처 파일을 여기서 fetch 한다 _core/compSignSearch.ts:147
export async function resolveCandidates(matched: MatchedCandidate[]) {
  return Promise.all(matched.map(async (c) => {
    const [textMap, textNodeRoles] = await Promise.all([
      fetchSignatureJson<TextMap>(c.textMapUrl),
      fetchSignatureJson<TextNodeRoles>(c.textNodeRolesUrl),
    ]);
    return { componentKey: c.componentKey, variant, textMap, textNodeRoles, ... };
  }));
}

이 payload 가 §3의 입력이 된다. 서버·브라우저 경계의 전체 지도는 web-2 역할 분담.

§3

클라이언트 런타임 — buildMappedComponentSheetJson 4단계

생성과 대치가 같은 경로를 쓴다. 코드가 실제로 부르는 순서는 아래와 같다.

1. 내용 대치 (텍스트)
applyContentMapping
:108
comp-sign textMap 경로로 주입
2. role 폰트 주입
applyRoleFontsToTextNodes
:110
현 디자인의 role별 폰트 입힘
3. 스타일 대치 (색)
applyMappedStylesToNodes
:116
→ TemplateStyleMapper
4. 이미지 대치
replaceComponentImages
:129
images 가 없으면 여기서 종료
buildMappedComponentSheetJson.ts:108-131 · 3단계는 nodes 만 교체한다 — 내용 대치된 페이지 컨테이너에 스타일된 nodes 를 끼워 넣는다(:122).

⚠ 위키 도식과 순서가 다르다

원본 도식은 role 폰트 → 내용 → 스타일 → 이미지 였지만, 코드는 내용(:108) → role 폰트(:110) → 스타일(:116) → 이미지(:129) 다. 폰트 주입이 contentMappedSheetJson 을 입력으로 받으므로 순서가 뒤바뀔 수 없다.

대치의 종착점

CmdReplaceComponentBySignature
EventHandler.ts:95
buildMappedComponentSheetJson
4단계
ComponentItemReplaceCommand
:118 → 캔버스 반영
§4

스타일 대치의 실체 — 테마 경로가 두 갈래다

여기가 도식과 코드가 가장 크게 갈리는 곳이다. "Style Meta 에 맞춘다"는 두 개의 서로 다른 구현을 하나로 뭉뚱그린 서술이었다.

A. 내용시각화 (이 흐름)B. AI 프레젠테이션
진입TemplateStyleMapper.getMappedStylesapplyColorMapping
테마 출처런타임 추출getTemplateV2ByIdx 로 템플릿 페이지를 받아 buildColorProfile()오프라인 파일getTemplateStyleMetadatastyleMetadataFileUrl fetch
테마 타입ColorProfile = { groups }ThemeRegistry
적용 함수recolorComponent(profile, targetBgHex, sheet)같은 iui 패키지의 색 매핑
Component RLSC쓰지 않는다 — 계약 호환용으로 받기만 한다
캐시StyleMapperMemoryCache (최대 20)fetch 결과
RLSC 를 안 쓴다는 것이 주석에 박혀 있다 TemplateStyleMapper.ts:41-52
/**
 * 현재 페이지의 template 테마를 기반으로 매핑된 스타일을 반환
 * @param _componentRlsc - 상위 StyleMapper 계약 호환을 위해 받지만
 *                         recolor API에서는 사용하지 않음
 */
public override async getMappedStyles(
  componentDoc: PageJson,
  _componentRlsc: StructuredContent,   // ← 밑줄 = 미사용
  componentOriginId?: number,
)

⚠ color-mapper v2 8단계는 이 경로가 아니다

mapComponentToThemeV2(slots → keys → Visual Tree → features → candidates → scorer → Hungarian → apply)는 실재하지만 (v2/index.ts:8-15), miricanvas-web-2 어디에서도 부르지 않는다. 현재 사용처는 iui 저장소 안의 문서와 평가 스크립트(scripts/style-mapper-eval.ts 등)뿐이다.

런타임이 실제로 쓰는 것은 같은 패키지의 recolor.ts:3181 recolorComponent 이고, 테마는 recolor.ts:1849 buildColorProfile 이 만든다. v2 는 다음 세대이고, 지금 프로덕션은 recolor 다.

그래서 스타일 대치의 입력은

recolorComponent 입력
profile: ColorProfile  — 현재 템플릿 페이지에서 추출
targetBgHex  — 현재 페이지 배경색
componentSheet  — 대치 대상 sheet json
모양 + 테마 + 배경색. 의미(RLSC)는 들어가지 않는다.
RLSC 가 쓰이는 곳은
① 검색·랭킹(comp-sign) ② role 폰트 주입 ③ 이미지 대치의 role 게이트
§5

코드 지도

단계파일 · 줄저장소
4단계 오케스트레이션buildMappedComponentSheetJson.ts:91-138web-2
1 · 내용 대치buildSignatureMappedSheetJson.tsweb-2
2 · role 폰트_utils/ApplyRoleFontsToTextNodes.tsweb-2
3 · 스타일 대치TemplateStyleMapper.tsweb-2
3-내부 · recolorcolor-mapper/recolor.ts:3181iui
3-내부 · 테마 추출color-mapper/recolor.ts:1849iui
3-차세대 · v2 8단계color-mapper/v2/index.ts:88 미사용iui
4 · 이미지 대치replaceComponentImages.tsweb-2
AIP 테마 경로style_replacement/colorMapping.tsweb-2
RLSC 생산pipeline/common/type/pageJson.ts:314aippt
§6

한 줄 결론

∴ 세 축의 역할

대치 3종(내용 · 스타일 · 이미지)은 전부 모양(sheet json)을 고친다. 판단 근거는 의미(RLSC) — 단 검색·폰트·이미지 게이트에서만이고, 색 재배정에는 들어가지 않는다. 색의 목적지는 현재 템플릿에서 추출한 ColorProfile 이다.