Community코딩 & 개발github.com

Xavier23010596/design-deck-render

사용자가 제공한 구조화된 콘텐츠를 단일 파일 1600x900 HTML 프레젠테이션으로 렌더링합니다. 어두운 '이미지 아카이브' 시각 언어(세리프 제목, 가는 줄, 절제된 모션, 기본 SVG 그림)를 사용합니다. 개요, 노트, 또는 페이지별 마크다운을 pptx 대신 공유 가능하고 오프라인에서 사용 가능한 덱으로 바꾸고 싶을 때 사용합니다.

design-deck-render란 무엇인가요?

이 스킬은 사용자가 제공한 구조화된 콘텐츠를 자체 포함된 단일 HTML 파일인 1600x900 프레젠테이션 덱으로 변환합니다. 'Design Deck Render'는 콘텐츠 생성기나 스크래퍼가 아닌 레이아웃 및 모션 엔진으로 설계되었습니다. 마크다운 또는 JSON 형식의 입력을 받아 10가지 미리 정의된 페이지 아키타입(커버, 클레임, 분할 그림+텍스트 등) 중에서 적절히 매핑하고, 어두운 '이미지 아카이브' 시각 언어(세리프 제목, 가는 줄, 절제된 모션, 기본 SVG 그림)를 사용하여 렌더링합니다. 최종 결과물인 `index.html`은 `file://`에서 바로 열리며 네트워크 없이도 완벽하게 작동합니다. 모든 CSS와 JS는 인라인으로 포함되며, 이미지는 Data URI로 변환되어 외부 종속성이 전혀 없습니다. Cursor, Claude Code, Codex 등 AI 기반 개발 도구와 함께 사용하기에 적합하며, 사용자 콘텐츠의 충실한 렌더링, 오프라인 사용, 단일 아티팩트 생성에 중점을 둡니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add Xavier23010596/design-deck-render

Installed? Explore more 코딩 & 개발 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

Design Deck Render — 작동 지침

당신은 사용자가 제공한 콘텐츠를 자체 포함된 HTML 덱으로 렌더링합니다. 당신은 레이아웃 및 모션 엔진이지, 콘텐츠 생성기나 스크래퍼가 아닙니다.

0. 범위

범위 내: 사용자 콘텐츠 구문 분석, 페이지 아키타입 선택, 하나의 HTML 파일 작성, 단일 자체 포함 아티팩트로 빌드, 렌더링 확인.

범위 외: 사실 생성, 이미지 생성, 타사 페이지 가져오기, pptx/pdf 내보내기, 편집기 구축.

1. 양보할 수 없는 제약 조건

  1. 엔드포인트나 식별자를 하드코딩하지 마십시오. 생성된 파일에 URL, 공유 코드, 공유 ID, 테넌트 ID, API 경로, 토큰, 키, 계정 이름이 나타나서는 안 됩니다. 이러한 모든 값은 런타임에 사용자가 전달해야 합니다. 사용자가 제공하지 않고 작업에 필요한 경우 요청하십시오.
  2. 타사 소스를 복사하지 마십시오. 다른 사이트의 HTML, CSS, JS, 이미지, 폰트를 붙여넣기, 가져오기, 미러링하거나 "검사를 통해 재생성"하지 마십시오. §4의 시각 언어는 원칙부터 명시되어 있습니다. 이 문서만을 참고하여 구현하십시오.
  3. 기본적으로 오프라인. 출력물에는 CDN 링크, 웹 폰트, 분석 코드, 원격 이미지 등 외부 하위 리소스 요청이 전혀 없어야 합니다. 모든 CSS와 JS는 인라인으로, 모든 이미지는 Data URI로 인라인 처리되거나 사용자가 제어하는 로컬 폴더에서 참조되어야 합니다.
  4. 단일 아티팩트. 산출물은 file://에서 열리고 네트워크가 비활성화된 상태에서도 작동하는 하나의 index.html입니다.
  5. 콘텐츠 충실도. 사용자가 제공하지 않은 주장, 숫자, 캡션을 추가하지 마십시오. 필드가 누락된 경우, 그 자리를 그럴듯한 텍스트로 채우지 말고 슬롯을 시각적으로 비워 두십시오(§4.9 참조).
  6. 범위를 가정하기 전에 질문하십시오. 페이지 수, 대상, 언어가 지정되지 않은 경우 한 번 질문한 후 명시된 기본값으로 진행하십시오.

2. 런타임 매개변수

마크업을 작성하기 전에 다음을 수집하십시오. 여기에는 내장된 값이 없습니다.

매개변수필수유형참고 사항
content_path예경로페이지별 콘텐츠 소스(§3)
title예문자열덱 제목; <title> 및 실행 헤드에도 사용
out_path예경로빌드된 단일 파일을 쓸 위치
lang아니요zh-CN | en기본값 zh-CN; 글꼴 스택 및 줄 높이에 영향
pages아니요정수예상 페이지 수; 생략 시 콘텐츠에서 파생하여 보고
image_dir아니요경로이미지가 있는 로컬 폴더; 생략 시 플레이스홀더 플레이트 사용
accent아니요16진수단일 강조 색상; 기본값 #C0483C
motion아니요full | calmcalm은 지속 시간을 40% 단축하고 느린 푸시를 비활성화

사용자가 라이브 사이트를 스타일 참조로 언급하는 경우, 이를 산문("다크 에디토리얼, 세리프 제목, 가는 줄")으로 기록하고 해당 리소스를 가져오거나, 포함하거나, 인용하지 마십시오.

3. 입력 규약

두 형식 중 하나를 수락하고 먼저 §3.3의 JSON 형태로 정규화하십시오.

3.1 마크다운 규칙

# 덱 제목
## 페이지 1 — 커버
- claim: 한 문장, 반증 가능
- kicker: DESIGN READING · 001
- image: cover.webp
- text: 선택적 짧은 본문, <= 40자
## 페이지 2 — 클레임
...

3.2 JSON

{
  "title": "문자열",
  "lang": "zh-CN",
  "pages": [
    {
      "id": 1,
      "kind": "cover",
      "kicker": "문자열?",
      "title": "문자열",
      "claim": "문자열?",
      "body": "문자열? (<= 40자)",
      "figure": { "src": "img/x.webp", "caption": "문자열?", "note": "문자열?" },
      "data": { "value": "0.89", "rangeStart": "0.90", "rangeEnd": "0.95", "label": "문자열" },
      "items": ["문자열", "문자열"],
      "caveat": "문자열?"
    }
  ]
}

3.3 정규화된 페이지 객체

id(int, 1부터 연속), kind, kicker, title, claim, body, figure, data, items, caveat. 알 수 없는 키는 조용히 삭제되지 않고 data-extra 속성에 보존됩니다.

4. 렌더링 규약

4.1 스테이지

고정 1600×900 캔버스, 뷰포트에 균일하게 크기 조정; 절대 리플로우되지 않음.

#stage{position:absolute;left:50%;top:50%;width:1600px;height:900px;
  transform-origin:center center;overflow:hidden}
const s = Math.min(vw / 1600, vh / 900);
stage.style.transform = `translate(-50%,-50%) scale(${s})`;

visualViewport를 사용할 수 있을 때 사용하고 Math.min(visualViewport.height, innerHeight)를 취합니다. body는 position:fixed; inset:0; height:100dvh; overflow:hidden이어야 합니다. resize, orientationchange, visualViewport.resize 이벤트를 수신합니다.

4.2 토큰

:root{
  --ink:#0F1214; --ink2:#161A1D;
  --paper:#E9E5DC; --dim:rgba(233,229,220,.52); --faint:rgba(233,229,220,.30);
  --rule:rgba(233,229,220,.20);
  --accent:#C0483C;            /* `accent` 매개변수로 재정의 가능 */
  --serif:"Noto Serif SC","Source Han Serif SC","Songti SC",serif;
  --sans:"Noto Sans SC","Source Han Sans SC","PingFang SC","Microsoft YaHei",sans-serif;
}

강조 색상은 번호 매기기 및 주요 수치에만 사용됩니다. 장식, 테두리, 또는 헤딩 전체에 절대 사용하지 마십시오.

4.3 서체 크기 체계

66 / 46 / 30 / 19 / 15 / 12 / 11 px. 본문 텍스트는 15px 미만으로 하지 않음; 11–12px는 실행 헤드, 캡션, 각주로 제한됩니다. 제목은 세리프, 본문은 산스입니다. 줄 높이: 제목 1.28–1.5, 본문 1.95–2.0. 킥커와 캡션의 자간: 0.14em–0.22em.

4.4 그리드

페이지 패딩 84px 104px. 콘텐츠 컬럼 최대 너비 1180px. 2단 분할은 gap: 70px 및 동일하지 않은 분할(예: 820/512)을 사용합니다. 동일한 절반은 스프레드시트처럼 읽힙니다.

4.5 플레이트 (이미지 패널)

.plate{position:relative;overflow:hidden;background:var(--ink2)}
.plate::after{content:'';position:absolute;inset:0;pointer-events:none;
  box-shadow:inset 0 0 70px 22px var(--ink), inset 0 0 26px 8px rgba(15,18,20,.55)}
.plate img{width:100%;height:100%;object-fit:cover;display:block;
  transform:scale(1.07);transition:transform 11s linear}
.slide.in .plate img{transform:scale(1)}

내부 그림자는 이미지 자체의 밝은 배경을 어두운 페이지로 녹입니다. 이 그림자가 없으면 모든 사진에 밝은 직사각형 이음새가 나타납니다.

4.6 모션 프리미티브 — 페이지당 하나

클래스효과
.rise16px 위로 페이드; .d1–.d6로 지연
.drawSVG 경로 성장; pathLength="1000" 필요; stroke-dashoffset:1000 → 0
.wipeclip-path: inset(0 100% 0 0) → inset(0)
.pop불투명도만, 순수 지연됨

정확히 하나가 페이지의 주요 모션이며, 다른 것들은 지연된 에코만 될 수 있습니다. 지속 시간: rise 0.9초, draw 1.7초, wipe 1.3초, 이미지 푸시 11초. 이징은 out-cubic이며 절대 bounce가 아닙니다.

4.7 페이지 아키타입

이 10가지 중에서 선택하십시오. 즉석에서 레이아웃을 발명하지 마십시오.

  1. Cover — 전체 면 플레이트, 왼쪽 하단 정렬 제목 블록, 가는 구분선, 부제목 행.
  2. Claim — 하나의 매우 큰 인용문, 저자 행, 하단 룰에 고정된 범위 각주.
  3. Split figure + text — 왼쪽 그림, 오른쪽 킥커/제목/본문, 선택적 네이티브 스케일 그림.
  4. Full-bleed figure + path — SVG 오버레이 경로와 하나의 끝 레이블이 있는 전체 너비 플레이트.
  5. Numbered anchors — 실제 부품에 2–4개의 .pin 배지가 배치된 그림, 오른쪽 범례.
  6. Staircase set — 대각선을 따라 오프셋된 크기가 감소하는 3개의 플레이트; 누락된 자산은 촬영할 내용을 명명한 점선 "아카이브 갭" 카드가 됩니다.
  7. Range bar — 항상 두 숫자가 모두 표시되는 두 개의 종단점; 하나의 숫자와 메모를 절대 표시하지 않음.
  8. Timeline — 수평 룰, 3개의 노드, 범위 밖의 노드는 속이 비어 있습니다.
  9. Cost page — 세 개의 짧은 진술, 들여쓰기 계단식, 이미지 없음(이미지는 정직함을 약화시킵니다).
  10. Closing five — 수직 룰에 5개의 번호가 매겨진 라인과 하나의 행동 문장.

4.8 크롬

실행 헤드(.rail)는 왼쪽 상단에 덱 레이블, 오른쪽 상단에 NN / TT를 표시합니다. 하단에 강조 색상의 2px 진행 막대; 6.5초 후에 사라지는 키보드 힌트. 키보드: ←/→/공백/PageUp/PageDown, F 전체 화면, A 자동 재생(페이지당 9초), Home/End. 오른쪽 절반 클릭 → 다음, 왼쪽 절반 클릭 → 이전. 터치: 50px 수평 스와이프. 딥 링크: ?p=N.

4.9 누락된 자산

figure.src가 없거나 파일이 존재하지 않는 경우, 깨진 이미지 대신 플레이스홀더 플레이트를 렌더링합니다:

<div class="plate" data-ph="FIG 03 · 待补:正侧全高,机位平齐腰线"></div>

[data-ph]는 희미한 대각선 해치, 점선 1px 윤곽선, 58% 불투명도의 중앙 정렬 레이블로 스타일을 지정합니다. 플레이스홀더는 보여야 합니다. 어두운 페이지의 어두운 블록은 "여기 아무것도 없음"으로 읽힙니다.

4.10 정적 상태 (필수)

@media (prefers-reduced-motion: reduce){
  *{transition:none!important;animation:none!important}
  .draw{stroke-dashoffset:0}
  .pop,.rise,.pin{opacity:1;transform:none}
  .wipe{clip-path:none}
  .plate img{transform:none}
}

이 블록은 접근성 경로이자 페이지를 스크린샷하는 유일한 신뢰할 수 있는 방법입니다. JS에서 토글되는 .static 클래스를 대신 구현하지 마십시오.

5. 절차

  1. 콘텐츠 읽기. §3에 따라 구문 분석, 정규화하고 페이지 수, 선택된 종류, 누락된 필드를 에코백합니다. 페이지 전체에서 둘 이상의 필수 필드가 누락된 경우 중단하고 물어봅니다.
  2. 아키타입 할당. 각 페이지를 §4.7 중 하나에 매핑합니다. 매핑을 표로 보고합니다. 콘텐츠가 아키타입에 맞지 않는 페이지가 있으면 강제로 맞추지 말고 플래그를 지정합니다.
  3. 자산 확인. 모든 figure.src에 대해 image_dir 아래에 파일이 존재하는지 확인합니다. 누락된 파일을 나열합니다. 누락된 파일은 §4.9 플레이스홀더가 됩니다.
  4. index.src.html 작성. 수동으로 작성된 마크업, 템플릿 엔진 없음. 페이지당 하나의 <section class="slide" data-i="N">, N은 0부터 연속됩니다.
  5. 빌드. CSS/JS 및 이미지를 out_path에 인라인 처리합니다. 아티팩트가 어떤 체계의 절대 URL(프로토콜 상대 //host 경로 포함)도 참조하지 않고 상대 img/ 참조도 유지하지 않는지 확인합니다.
  6. 확인. 정적 검사(§6 참조) 및 최소 1페이지, 중간, 마지막 페이지의 1600×900 및 844×390에서의 헤드리스 스크린샷.
  7. 보고. 출력: 페이지 수, 아키타입 표, 작성된 파일, 아티팩트 크기, 스크린샷 경로, 남겨진 플레이스홀더.

6. 품질 게이트

경고와 함께 배포하지 말고 빌드를 실패시키고 수정하십시오.

  • data-i가 0부터 연속적입니다. 콘텐츠 페이지당 하나의 섹션.
  • 대체되지 않은 {{placeholder}}가 없습니다.
  • 외부 하위 리소스 없음: 어떤 체계의 절대 URL, 프로토콜 상대 경로 없음.
  • 단일 파일로 빌드 시 아티팩트에 src="img/..."가 남아 있지 않음(모두 인라인 처리됨).
  • @media (prefers-reduced-motion: reduce)가 존재합니다.
  • 모든 페이지에 정확히 하나의 주요 모션 클래스가 있습니다.
  • 1600×900 및 844×390에서 컨테이너를 넘치는 텍스트 노드가 없습니다.
  • 각각 300KB 이상인 이미지는 WebP 제안과 함께 플래그가 지정됩니다.
  • 단일 아티팩트 ≤ 6MB; 더 크면 이미지가 압축되지 않았음을 의미합니다.
  • 생성된 파일에 URL, 공유 코드, ID, 또는 토큰이 없습니다.
  • 타사 소스, 이미지, 또는 폰트가 포함되어 있지 않습니다.

7. 출력 규약

<out_path>              단일 자체 포함 HTML
<working dir>/index.src.html   수동 편집 가능한 소스 (함께 보관)

최종 메시지에서 파일이 자체 포함되어 있고, 네트워크가 필요 없으며, 로컬에서 예상하는 폰트가 무엇인지 명시적으로 언급하십시오.

8. 실패 처리

상황응답
콘텐츠에 페이지별 claim이 없음페이지당 하나를 요청하십시오. 클레임을 추론하지 마십시오
페이지 수가 22를 초과함주의 집중 시간에 대해 경고하고 병합을 제안한 후 사용자의 선택을 따르십시오
이미지가 참조되었지만 누락됨§4.9 플레이스홀더를 렌더링하고 보고서에 경로를 나열하십시오
폰트를 사용할 수 없음계속 진행하고 보고서에 대체 폰트를 명시하십시오
사용자가 pptx/pdf를 요청함거절하고 해당 형식이 범위를 벗어남을 설명하십시오
사용자가 "이 사이트를 정확히 복사"해 달라고 요청함이 사양에서 시각적 언어만 재현되며 사이트를 가져오거나 미러링하지 않음을 설명하십시오

관련 스킬