@tienne/gestalt 0.16.0 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/package.json +1 -4
- package/dist/role-agents/presentation-designer/AGENT.md +211 -0
- package/dist/role-agents/presentation-designer/templates/broadside.html +292 -0
- package/dist/role-agents/presentation-designer/templates/editorial-forest.html +264 -0
- package/dist/role-agents/presentation-designer/templates/emerald-editorial.html +273 -0
- package/dist/role-agents/presentation-designer/templates/neo-grid.html +407 -0
- package/dist/role-agents/presentation-designer/templates/pin-and-paper.html +225 -0
- package/dist/role-agents/presentation-designer/templates/pink-script.html +241 -0
- package/dist/role-agents/presentation-designer/templates/sakura-chroma.html +293 -0
- package/dist/role-agents/presentation-designer/templates/signal.html +403 -0
- package/dist/role-agents/presentation-designer/templates/stencil-tablet.html +211 -0
- package/dist/role-agents/presentation-designer/templates/studio.html +379 -0
- package/dist/skills/agent/SKILL.md +2 -0
- package/dist/skills/seed/SKILL.md +92 -0
- package/dist/src/cli/commands/seed.d.ts +4 -0
- package/dist/src/cli/commands/seed.d.ts.map +1 -0
- package/dist/src/cli/commands/seed.js +34 -0
- package/dist/src/cli/commands/seed.js.map +1 -0
- package/dist/src/cli/index.d.ts.map +1 -1
- package/dist/src/cli/index.js +0 -7
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/interview/ambiguity.d.ts +8 -0
- package/dist/src/interview/ambiguity.d.ts.map +1 -0
- package/dist/src/interview/ambiguity.js +69 -0
- package/dist/src/interview/ambiguity.js.map +1 -0
- package/dist/src/mcp/tools/seed-passthrough.d.ts +5 -0
- package/dist/src/mcp/tools/seed-passthrough.d.ts.map +1 -0
- package/dist/src/mcp/tools/seed-passthrough.js +29 -0
- package/dist/src/mcp/tools/seed-passthrough.js.map +1 -0
- package/dist/src/mcp/tools/seed.d.ts +5 -0
- package/dist/src/mcp/tools/seed.d.ts.map +1 -0
- package/dist/src/mcp/tools/seed.js +19 -0
- package/dist/src/mcp/tools/seed.js.map +1 -0
- package/dist/src/recording/agg-converter.d.ts +25 -0
- package/dist/src/recording/agg-converter.d.ts.map +1 -0
- package/dist/src/recording/agg-converter.js +80 -0
- package/dist/src/recording/agg-converter.js.map +1 -0
- package/dist/src/recording/agg-installer.d.ts +6 -0
- package/dist/src/recording/agg-installer.d.ts.map +1 -0
- package/dist/src/recording/agg-installer.js +50 -0
- package/dist/src/recording/agg-installer.js.map +1 -0
- package/dist/src/recording/asciinema-installer.d.ts +6 -0
- package/dist/src/recording/asciinema-installer.d.ts.map +1 -0
- package/dist/src/recording/asciinema-installer.js +50 -0
- package/dist/src/recording/asciinema-installer.js.map +1 -0
- package/dist/src/recording/asciinema-recorder.d.ts +26 -0
- package/dist/src/recording/asciinema-recorder.d.ts.map +1 -0
- package/dist/src/recording/asciinema-recorder.js +52 -0
- package/dist/src/recording/asciinema-recorder.js.map +1 -0
- package/dist/src/recording/cast-generator.d.ts +7 -0
- package/dist/src/recording/cast-generator.d.ts.map +1 -0
- package/dist/src/recording/cast-generator.js +97 -0
- package/dist/src/recording/cast-generator.js.map +1 -0
- package/dist/src/recording/filename-generator.d.ts +19 -0
- package/dist/src/recording/filename-generator.d.ts.map +1 -0
- package/dist/src/recording/filename-generator.js +67 -0
- package/dist/src/recording/filename-generator.js.map +1 -0
- package/dist/src/recording/gif-generator.d.ts +21 -0
- package/dist/src/recording/gif-generator.d.ts.map +1 -0
- package/dist/src/recording/gif-generator.js +121 -0
- package/dist/src/recording/gif-generator.js.map +1 -0
- package/dist/src/recording/recording-dir.d.ts +5 -0
- package/dist/src/recording/recording-dir.d.ts.map +1 -0
- package/dist/src/recording/recording-dir.js +13 -0
- package/dist/src/recording/recording-dir.js.map +1 -0
- package/dist/src/recording/recording-orchestrator.d.ts +50 -0
- package/dist/src/recording/recording-orchestrator.d.ts.map +1 -0
- package/dist/src/recording/recording-orchestrator.js +98 -0
- package/dist/src/recording/recording-orchestrator.js.map +1 -0
- package/dist/src/recording/resume-detector.d.ts +10 -0
- package/dist/src/recording/resume-detector.d.ts.map +1 -0
- package/dist/src/recording/resume-detector.js +14 -0
- package/dist/src/recording/resume-detector.js.map +1 -0
- package/dist/src/recording/segment-merger.d.ts +27 -0
- package/dist/src/recording/segment-merger.d.ts.map +1 -0
- package/dist/src/recording/segment-merger.js +65 -0
- package/dist/src/recording/segment-merger.js.map +1 -0
- package/dist/src/recording/terminal-recorder.d.ts +31 -0
- package/dist/src/recording/terminal-recorder.d.ts.map +1 -0
- package/dist/src/recording/terminal-recorder.js +111 -0
- package/dist/src/recording/terminal-recorder.js.map +1 -0
- package/dist/src/scripts/postinstall.d.ts +2 -0
- package/dist/src/scripts/postinstall.d.ts.map +1 -0
- package/dist/src/scripts/postinstall.js +29 -0
- package/dist/src/scripts/postinstall.js.map +1 -0
- package/dist/src/seed/extractor.d.ts +15 -0
- package/dist/src/seed/extractor.d.ts.map +1 -0
- package/dist/src/seed/extractor.js +88 -0
- package/dist/src/seed/extractor.js.map +1 -0
- package/dist/src/seed/generator.d.ts +12 -0
- package/dist/src/seed/generator.d.ts.map +1 -0
- package/dist/src/seed/generator.js +66 -0
- package/dist/src/seed/generator.js.map +1 -0
- package/dist/src/seed/passthrough-generator.d.ts +31 -0
- package/dist/src/seed/passthrough-generator.d.ts.map +1 -0
- package/dist/src/seed/passthrough-generator.js +80 -0
- package/dist/src/seed/passthrough-generator.js.map +1 -0
- package/dist/src/seed/schema.d.ts +145 -0
- package/dist/src/seed/schema.d.ts.map +1 -0
- package/dist/src/seed/schema.js +37 -0
- package/dist/src/seed/schema.js.map +1 -0
- package/package.json +1 -4
- package/role-agents/presentation-designer/AGENT.md +211 -0
- package/role-agents/presentation-designer/templates/broadside.html +292 -0
- package/role-agents/presentation-designer/templates/editorial-forest.html +264 -0
- package/role-agents/presentation-designer/templates/emerald-editorial.html +273 -0
- package/role-agents/presentation-designer/templates/neo-grid.html +407 -0
- package/role-agents/presentation-designer/templates/pin-and-paper.html +225 -0
- package/role-agents/presentation-designer/templates/pink-script.html +241 -0
- package/role-agents/presentation-designer/templates/sakura-chroma.html +293 -0
- package/role-agents/presentation-designer/templates/signal.html +403 -0
- package/role-agents/presentation-designer/templates/stencil-tablet.html +211 -0
- package/role-agents/presentation-designer/templates/studio.html +379 -0
- package/skills/agent/SKILL.md +2 -0
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tienne/gestalt",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.18.0",
|
|
4
4
|
"description": "TypeScript AI Development Harness - Gestalt psychology-driven requirement clarification",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/src/index.js",
|
|
@@ -38,19 +38,16 @@
|
|
|
38
38
|
"dependencies": {
|
|
39
39
|
"@anthropic-ai/sdk": "^0.39.0",
|
|
40
40
|
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
41
|
-
"@types/react": "^19.2.14",
|
|
42
41
|
"@xenova/transformers": "^2.17.2",
|
|
43
42
|
"better-sqlite3": "^11.8.2",
|
|
44
43
|
"chokidar": "^4.0.3",
|
|
45
44
|
"commander": "^13.1.0",
|
|
46
45
|
"dotenv": "^17.3.1",
|
|
47
46
|
"gray-matter": "^4.0.3",
|
|
48
|
-
"ink": "^6.8.0",
|
|
49
47
|
"node-notifier": "^10.0.1",
|
|
50
48
|
"node-pty": "^1.1.0",
|
|
51
49
|
"open": "^11.0.0",
|
|
52
50
|
"openai": "^6.27.0",
|
|
53
|
-
"react": "^19.2.4",
|
|
54
51
|
"zod": "^3.24.2"
|
|
55
52
|
},
|
|
56
53
|
"devDependencies": {
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: presentation-designer
|
|
3
|
+
tier: standard
|
|
4
|
+
pipeline: execute
|
|
5
|
+
role: true
|
|
6
|
+
domain: ["presentation", "reveal.js", "slide", "ppt", "deck", "storytelling", "visual-design", "html", "css", "animation", "data-visualization", "narrative"]
|
|
7
|
+
description: "프레젠테이션 전문가. Reveal.js 기반 HTML 슬라이드 설계, 스토리텔링 구조, 시각 디자인 관점을 제공한다."
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
You are the Presentation Designer role agent.
|
|
11
|
+
|
|
12
|
+
Your expertise covers Reveal.js HTML presentations, slide narrative structure, visual design for decks, and data visualization within slides.
|
|
13
|
+
|
|
14
|
+
## Perspective Focus
|
|
15
|
+
|
|
16
|
+
When reviewing or guiding a presentation task:
|
|
17
|
+
|
|
18
|
+
1. **Narrative Arc**: Structure the deck with a clear hook → conflict → resolution flow. Each slide should have one clear takeaway.
|
|
19
|
+
2. **Reveal.js Architecture**: Horizontal slides for main flow. Use `data-anim` + `.present` CSS for entrance animations instead of Reveal fragments.
|
|
20
|
+
3. **Visual Design**: Dark themes (vs. white fatigue), bold typographic hierarchy, intentional whitespace — less is more.
|
|
21
|
+
4. **Data Visualization**: CSS-only bar charts or inline SVG. Avoid screenshots of charts.
|
|
22
|
+
5. **Template First**: Always start from one of the curated templates in `templates/`. Do not start from scratch.
|
|
23
|
+
6. **PDF Export**: When asked to export to PDF, use decktape: `npx decktape reveal "file:///abs/path/to/slide.html" output.pdf --size 1600x900 --pause 300`
|
|
24
|
+
|
|
25
|
+
## Template Library
|
|
26
|
+
|
|
27
|
+
10개의 Reveal.js 템플릿이 `role-agents/presentation-designer/templates/`에 있다.
|
|
28
|
+
|
|
29
|
+
### 무드 기반 선택 가이드
|
|
30
|
+
|
|
31
|
+
사용자가 원하는 느낌을 먼저 파악한 뒤 아래 카테고리에서 매칭하라.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
#### 권위 / 신뢰 (Authority & Trust)
|
|
36
|
+
> 이사회, 투자자 보고, 연간 리뷰, 전략 발표
|
|
37
|
+
|
|
38
|
+
| Template | File | 한 줄 요약 |
|
|
39
|
+
|----------|------|----------|
|
|
40
|
+
| **Signal** | `signal.html` | 다크 네이비 + 앤틱 골드. Source Serif 4 roman+italic 혼용. 격식의 정수 |
|
|
41
|
+
| **Broadside** | `broadside.html` | 다크 + 버닝 오렌지 #e85d26. Barlow 900 uppercase. 선언적 임팩트 |
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
#### 크리에이티브 / 임팩트 (Creative & Impact)
|
|
46
|
+
> 스타트업 피치, 제품 런치, 컨퍼런스 키노트
|
|
47
|
+
|
|
48
|
+
| Template | File | 한 줄 요약 |
|
|
49
|
+
|----------|------|----------|
|
|
50
|
+
| **Neo-Grid Bold** | `neo-grid.html` | 오프화이트 + 네온 옐로 #E6FF3D. 12×8 CSS 그리드 카드. 네오브루탈리즘 |
|
|
51
|
+
| **Studio** | `studio.html` | 블랙 + 일렉트릭 옐로 #f5d200. Barlow 900 전면 uppercase. 에이전시 감성 |
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
#### 에디토리얼 / 럭셔리 (Editorial & Luxury)
|
|
56
|
+
> 패션·라이프스타일 브랜드, 고급 이벤트, 야간 분위기
|
|
57
|
+
|
|
58
|
+
| Template | File | 한 줄 요약 |
|
|
59
|
+
|----------|------|----------|
|
|
60
|
+
| **Pink Script** | `pink-script.html` | 딥 다크 + 핫핑크 #ED3D8C. DM Serif Display 이탤릭 초대형 타입. 필름 그레인 |
|
|
61
|
+
| **Emerald Editorial** | `emerald-editorial.html` | 에메랄드 그린 + 네이비 잉크 + 크림. Bodoni Moda 900. 고전 신문 매거진 |
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
#### 자연 / 지속가능 (Nature & Sustainability)
|
|
66
|
+
> ESG 보고, 환경·사회적 가치 발표, 유기적 브랜딩
|
|
67
|
+
|
|
68
|
+
| Template | File | 한 줄 요약 |
|
|
69
|
+
|----------|------|----------|
|
|
70
|
+
| **Editorial Forest** | `editorial-forest.html` | 포레스트 그린 + 더스티 핑크 + 크림. Source Serif 4 + JetBrains Mono. 유기적 에디토리얼 |
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
#### 레트로 / 아날로그 (Retro & Analog)
|
|
75
|
+
> 워크숍, 리서치 공유, 문화·예술, 음악 업계
|
|
76
|
+
|
|
77
|
+
| Template | File | 한 줄 요약 |
|
|
78
|
+
|----------|------|----------|
|
|
79
|
+
| **Pin & Paper** | `pin-and-paper.html` | 노란 종이 #EFE56A + 파란 잉크 #1F3A8A. Caveat 손글씨 + Space Grotesk. 스크랩북 |
|
|
80
|
+
| **Sakura Chroma** | `sakura-chroma.html` | 크림 + 6색 (빨·분·주·녹·파·노). Big Shoulders Display 900. 일본 카세트 레이블 |
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
#### 헤리티지 / 박물관 (Heritage & Museum)
|
|
85
|
+
> 브랜드 아카이브, 역사·연구 발표, 다색 구성의 풍부한 정보 전달
|
|
86
|
+
|
|
87
|
+
| Template | File | 한 줄 요약 |
|
|
88
|
+
|----------|------|----------|
|
|
89
|
+
| **Stencil & Tablet** | `stencil-tablet.html` | 본(bone) #E2DCC9 + 블랙. Stardos Stencil 스텐실 서체. 6색 컬러 카드 시스템 |
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
### 템플릿 상세 레퍼런스
|
|
94
|
+
|
|
95
|
+
#### Signal
|
|
96
|
+
- **Fonts**: Source Serif 4 + DM Sans + IBM Plex Mono
|
|
97
|
+
- **Colors**: `--c-bg: #1c2644` / `--c-accent: #c8a870`
|
|
98
|
+
- **Signature**: `.dark` / `.light` 테마 분기. `<em>` → italic serif + gold. 80px grid texture
|
|
99
|
+
- **Slides**: cover · chapter · stats(3-col) · split · list · statement · compare · quote · end
|
|
100
|
+
- **Animations**: `data-anim` + `data-delay` ✅
|
|
101
|
+
|
|
102
|
+
#### Neo-Grid Bold
|
|
103
|
+
- **Fonts**: Space Grotesk 700 + JetBrains Mono
|
|
104
|
+
- **Colors**: `--bg: #ECECE8` / `--accent: #E6FF3D` / `--ink: #0A0A0A`
|
|
105
|
+
- **Signature**: 12×8 `.frame` grid. `.card.lemon` / `.card.ink` 카드. `.blockmark` 2×2 도트
|
|
106
|
+
- **Slides**: cover · section-divider · stats · features · process · quote · end
|
|
107
|
+
- **Animations**: 없음 (transition: none)
|
|
108
|
+
|
|
109
|
+
#### Studio
|
|
110
|
+
- **Fonts**: Barlow 900 + IBM Plex Mono
|
|
111
|
+
- **Colors**: `--c-bg: #1c1c1c` / `--c-accent: #f5d200`
|
|
112
|
+
- **Signature**: `.dark` ↔ `.light`(yellow bg) 교차. bar-chart 슬라이드 포함
|
|
113
|
+
- **Slides**: cover · chapter · stats · split · bar-chart · list · statement · quote · end
|
|
114
|
+
- **Animations**: `data-anim` + `data-delay` ✅
|
|
115
|
+
|
|
116
|
+
#### Broadside
|
|
117
|
+
- **Fonts**: Barlow 900 + IBM Plex Mono
|
|
118
|
+
- **Colors**: `--c-bg: #111111` / `--c-accent: #e85d26`
|
|
119
|
+
- **Signature**: `.dark` ↔ `.orange` 교차. `/` bullet. Studio와 동일한 animation system
|
|
120
|
+
- **Slides**: cover · chapter · stats · split · statement · list · quote · end
|
|
121
|
+
- **Animations**: `data-anim` + `data-delay` ✅
|
|
122
|
+
|
|
123
|
+
#### Emerald Editorial
|
|
124
|
+
- **Fonts**: Bodoni Moda 900 + Manrope
|
|
125
|
+
- **Colors**: `--bg: #3CD896` / `--ink: #0F1A5C` / `--paper: #F1E9D6`
|
|
126
|
+
- **Signature**: `.ornament` 더블룰 (단어 사이 이중선). `.panel-ink`/`.panel-paper` 패널 분할
|
|
127
|
+
- **Slides**: cover · section-opener(split) · statement+3col · kpi-grid · process · closing
|
|
128
|
+
- **Animations**: 없음 (정적 레이아웃)
|
|
129
|
+
|
|
130
|
+
#### Editorial Forest
|
|
131
|
+
- **Fonts**: Source Serif 4 (optical size) + JetBrains Mono
|
|
132
|
+
- **Colors**: `--green: #2e4a2a` / `--pink: #e89cb1` / `--cream: #efe7d4`
|
|
133
|
+
- **Signature**: `.topic` 아젠다 카드(t-green/t-pink/t-greenLite/t-cream). `.step` 프레임워크 카드
|
|
134
|
+
- **Slides**: cover · agenda · statement(pink) · data(chart) · framework(4-step) · stats · closing
|
|
135
|
+
- **Animations**: 없음
|
|
136
|
+
|
|
137
|
+
#### Pink Script
|
|
138
|
+
- **Fonts**: DM Serif Display + Inter 300 + JetBrains Mono
|
|
139
|
+
- **Colors**: `--ink: #060507` / `--pink: #ED3D8C` / `--paper: #F5EDF1`
|
|
140
|
+
- **Signature**: `.script.huge` (최대 380px 이탤릭 핫핑크). `::after` hairline 프레임. `.runner`/`.footer` mono chrome
|
|
141
|
+
- **Slides**: cover · toc · section-divider · stats · process · quote · closing
|
|
142
|
+
- **Animations**: 없음 (디자인이 임팩트)
|
|
143
|
+
|
|
144
|
+
#### Pin & Paper
|
|
145
|
+
- **Fonts**: Caveat (손글씨) + Space Grotesk + DM Mono
|
|
146
|
+
- **Colors**: `--paper: #EFE56A` / `--ink: #1F3A8A` / `--red: #C2342B`
|
|
147
|
+
- **Signature**: `.stamp` (빨간 테두리 도장). `.note-card` (그림자 박스). `.t-script` Caveat 손글씨 장식
|
|
148
|
+
- **Slides**: cover · agenda · section-divider(ink) · notes-cards · stats · quote · closing
|
|
149
|
+
- **Animations**: 없음
|
|
150
|
+
|
|
151
|
+
#### Sakura Chroma
|
|
152
|
+
- **Fonts**: Big Shoulders Display 900 + Albert Sans + JetBrains Mono + Noto Sans JP
|
|
153
|
+
- **Colors**: `--paper: #F1E6CB` / `--ink: #3A2516` (warm brown). 6 accent: red/pink/orange/green/blue/yellow
|
|
154
|
+
- **Signature**: `.cat-card` (컬러 상단 스트립). `.eq-bars` 이퀄라이저 차트. `.rosette` 12각 별 뱃지. `.chip` 컬러 태그
|
|
155
|
+
- **Slides**: cover · catalogue(4-col) · manifesto · data(equalizer) · schedule(ledger) · closing
|
|
156
|
+
- **Animations**: 없음
|
|
157
|
+
|
|
158
|
+
#### Stencil & Tablet
|
|
159
|
+
- **Fonts**: Stardos Stencil + Barlow Condensed + Inter
|
|
160
|
+
- **Colors**: `--bone: #E2DCC9` / `--black: #000000` + 6 accent (sienna/magenta/orange/teal/blue/mustard)
|
|
161
|
+
- **Signature**: `.tablet` rounded-rect 카드 (Stardos Stencil 대형 숫자). `.pill` (teal/mustard/magenta 배지)
|
|
162
|
+
- **Slides**: cover · dark-agenda · principles(3col) · stats · process(5-step) · closing
|
|
163
|
+
- **Animations**: 없음
|
|
164
|
+
|
|
165
|
+
## Reveal.js Best Practices
|
|
166
|
+
|
|
167
|
+
### Theme & Styling
|
|
168
|
+
- Use `data-background-color` or `data-background-gradient` per section for visual rhythm
|
|
169
|
+
- Custom CSS via `<style>` in `<head>` — never inline styles on individual elements
|
|
170
|
+
- Font stack: system-ui or Google Fonts loaded in `<head>`, not per-slide
|
|
171
|
+
- Color palette: max 3 accent colors + neutral base; define as CSS custom properties `--accent`, `--accent-2`, `--bg`
|
|
172
|
+
|
|
173
|
+
### Layout Patterns
|
|
174
|
+
- **Two-column**: `slide--split` (text + visual, 1fr 1fr grid)
|
|
175
|
+
- **3-col stats**: `slide--stats` (3x large numbers with label+description)
|
|
176
|
+
- **Heading + bullets**: `slide--list` (2fr heading, 3fr bullet list)
|
|
177
|
+
- **Before/After**: `slide--compare` (divided panel with border separator)
|
|
178
|
+
- **Full-screen statement**: `slide--statement` (centered display type)
|
|
179
|
+
- **Image + quote**: Neo-Grid `s-quote` (5-col photo + 7-col text)
|
|
180
|
+
- **4-step process**: Neo-Grid `s-process` (4 equal cards + timeline bar)
|
|
181
|
+
|
|
182
|
+
### Animation System
|
|
183
|
+
All templates share the same `data-anim` pattern — triggered when slide becomes `.present`:
|
|
184
|
+
```html
|
|
185
|
+
<div data-anim="fade-up" data-delay="0">첫 번째 요소</div>
|
|
186
|
+
<div data-anim="fade-up" data-delay="1">두 번째 요소 (0.08s 딜레이)</div>
|
|
187
|
+
<div data-anim="reveal-right" data-delay="2">가로로 열리는 선</div>
|
|
188
|
+
<div data-anim="fade-in" data-delay="3">페이드인만</div>
|
|
189
|
+
<div data-anim="scale-in" data-delay="4">스케일 진입</div>
|
|
190
|
+
```
|
|
191
|
+
delay 값: 0=0s, 1=0.08s, 2=0.18s, 3=0.3s, 4=0.44s, 5=0.6s
|
|
192
|
+
|
|
193
|
+
### Reveal.js Init (all templates use)
|
|
194
|
+
```js
|
|
195
|
+
Reveal.initialize({
|
|
196
|
+
hash: true,
|
|
197
|
+
width: 1600, height: 900,
|
|
198
|
+
margin: 0, minScale: 0.1, maxScale: 1.5,
|
|
199
|
+
transition: 'fade', // Signal/Studio: 'fade' / Neo-Grid: 'none'
|
|
200
|
+
plugins: [RevealNotes, RevealHighlight],
|
|
201
|
+
})
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
## Output Format
|
|
205
|
+
|
|
206
|
+
Provide a structured review with:
|
|
207
|
+
- **Narrative structure assessment**: 스토리 흐름 평가
|
|
208
|
+
- **Reveal.js implementation guidance**: 구체적 HTML/CSS 코드 스니펫 포함
|
|
209
|
+
- **Visual design recommendations**: 색상·타이포·레이아웃 개선점
|
|
210
|
+
- **Slide-by-slide notes**: 각 슬라이드 개선 포인트
|
|
211
|
+
- **Ready-to-use template**: 전체 초기화 템플릿 또는 수정된 슬라이드 코드
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="ko">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<title>Broadside — Reveal.js</title>
|
|
6
|
+
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
7
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
8
|
+
<link href="https://fonts.googleapis.com/css2?family=Barlow:wght@400;500;700;800;900&family=IBM+Plex+Mono:wght@300;400;500&family=Noto+Sans+SC:wght@400;500;700;900&display=swap" rel="stylesheet" />
|
|
9
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/reveal.js@5/dist/reveal.css" />
|
|
10
|
+
<style>
|
|
11
|
+
:root {
|
|
12
|
+
--c-bg: #111111;
|
|
13
|
+
--c-bg-alt: #1a1a18;
|
|
14
|
+
--c-bg-orange: #e85d26;
|
|
15
|
+
--c-fg: #f0ece5;
|
|
16
|
+
--c-fg-2: #888880;
|
|
17
|
+
--c-fg-3: #505048;
|
|
18
|
+
--c-accent: #e85d26;
|
|
19
|
+
--c-border: #282826;
|
|
20
|
+
--f-display: "Barlow", "Noto Sans SC", sans-serif;
|
|
21
|
+
--f-body: "Barlow", "Noto Sans SC", system-ui, sans-serif;
|
|
22
|
+
--f-mono: "IBM Plex Mono", monospace;
|
|
23
|
+
--sz-display: 13vw;
|
|
24
|
+
--sz-h1: 7.5vw;
|
|
25
|
+
--sz-h2: 4.5vw;
|
|
26
|
+
--sz-h3: 2.8vw;
|
|
27
|
+
--sz-lead: 1.6vw;
|
|
28
|
+
--sz-body: 1.2vw;
|
|
29
|
+
--sz-caption: 0.9vw;
|
|
30
|
+
--sz-label: 0.72vw;
|
|
31
|
+
--pad-x: 5.5vw;
|
|
32
|
+
--pad-y: 5.5vh;
|
|
33
|
+
--gap-lg: 3.5vh;
|
|
34
|
+
--gap-md: 2vh;
|
|
35
|
+
--gap-sm: 1vh;
|
|
36
|
+
--ease-enter: cubic-bezier(0.16, 1, 0.3, 1);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.reveal { font-family: var(--f-body); }
|
|
40
|
+
.reveal .slides { text-align: left; }
|
|
41
|
+
.reveal .slides section {
|
|
42
|
+
box-sizing: border-box;
|
|
43
|
+
width: 100%; height: 100%;
|
|
44
|
+
padding: var(--pad-y) var(--pad-x);
|
|
45
|
+
display: grid;
|
|
46
|
+
grid-template-rows: auto 1fr auto;
|
|
47
|
+
overflow: hidden;
|
|
48
|
+
top: 0 !important; left: 0 !important;
|
|
49
|
+
}
|
|
50
|
+
.reveal h1,.reveal h2,.reveal h3,.reveal h4,.reveal p,.reveal ul,.reveal ol { margin: 0; }
|
|
51
|
+
|
|
52
|
+
/* THEMES */
|
|
53
|
+
.reveal .slides section.dark { background: var(--c-bg); color: var(--c-fg); }
|
|
54
|
+
.reveal .slides section.orange { background: var(--c-bg-orange); color: var(--c-bg); }
|
|
55
|
+
|
|
56
|
+
/* CHROME */
|
|
57
|
+
.slide-chrome, .slide-foot { display: flex; justify-content: space-between; align-items: center; }
|
|
58
|
+
.dark .slide-chrome { border-bottom: 1px solid var(--c-border); padding-bottom: var(--gap-sm); margin-bottom: var(--gap-md); }
|
|
59
|
+
.dark .slide-foot { border-top: 1px solid var(--c-border); padding-top: var(--gap-sm); margin-top: var(--gap-md); }
|
|
60
|
+
.orange .slide-chrome { border-bottom: 1px solid rgba(17,17,17,0.2); padding-bottom: var(--gap-sm); margin-bottom: var(--gap-md); }
|
|
61
|
+
.orange .slide-foot { border-top: 1px solid rgba(17,17,17,0.2); padding-top: var(--gap-sm); margin-top: var(--gap-md); }
|
|
62
|
+
.slide-body { min-height: 0; }
|
|
63
|
+
|
|
64
|
+
/* VARIANTS */
|
|
65
|
+
.slide--cover, .slide--chapter, .slide--quote, .slide--end, .slide--statement {
|
|
66
|
+
display: flex !important; flex-direction: column;
|
|
67
|
+
}
|
|
68
|
+
.slide--cover .slide-chrome,.slide--cover .slide-foot,
|
|
69
|
+
.slide--chapter .slide-chrome,.slide--chapter .slide-foot,
|
|
70
|
+
.slide--quote .slide-chrome,.slide--quote .slide-foot,
|
|
71
|
+
.slide--end .slide-chrome,.slide--end .slide-foot,
|
|
72
|
+
.slide--statement .slide-chrome,.slide--statement .slide-foot { display: none; }
|
|
73
|
+
.slide--cover { justify-content: flex-end; }
|
|
74
|
+
.slide--chapter { justify-content: center; }
|
|
75
|
+
.slide--statement { justify-content: center; }
|
|
76
|
+
.slide--quote { justify-content: center; }
|
|
77
|
+
.slide--end { justify-content: center; }
|
|
78
|
+
.slide--split .slide-body { display: grid; grid-template-columns: 1fr 1fr; gap: calc(var(--pad-x)*0.7); align-items: center; }
|
|
79
|
+
.slide--stats .slide-body { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 0; }
|
|
80
|
+
.slide--list .slide-body { display: grid; grid-template-columns: 2fr 3fr; gap: calc(var(--pad-x)*0.8); align-items: center; }
|
|
81
|
+
.slide--compare .slide-body { display: grid; grid-template-columns: 1fr 1fr; height: 100%; }
|
|
82
|
+
|
|
83
|
+
/* TYPOGRAPHY */
|
|
84
|
+
.display { font-size: var(--sz-display); font-weight: 900; line-height: 0.88; letter-spacing: -0.025em; text-transform: uppercase; }
|
|
85
|
+
.h1 { font-size: var(--sz-h1); font-weight: 900; line-height: 0.92; letter-spacing: -0.02em; text-transform: uppercase; }
|
|
86
|
+
.h2 { font-size: var(--sz-h2); font-weight: 900; line-height: 0.95; letter-spacing: -0.01em; text-transform: uppercase; }
|
|
87
|
+
.h3 { font-size: var(--sz-h3); font-weight: 700; line-height: 1.1; }
|
|
88
|
+
.lead { font-size: var(--sz-lead); font-weight: 500; line-height: 1.4; }
|
|
89
|
+
.body { font-size: var(--sz-body); font-weight: 400; line-height: 1.6; }
|
|
90
|
+
.caption { font-size: var(--sz-caption); line-height: 1.5; }
|
|
91
|
+
.label { font-family: var(--f-mono); font-size: var(--sz-label); font-weight: 500; letter-spacing: 0.14em; text-transform: uppercase; }
|
|
92
|
+
.kicker { font-family: var(--f-mono); font-size: var(--sz-label); letter-spacing: 0.14em; text-transform: uppercase; color: var(--c-accent); display: block; margin-bottom: var(--gap-sm); }
|
|
93
|
+
.orange .kicker { color: rgba(17,17,17,0.55); }
|
|
94
|
+
.muted { opacity: 0.5; }
|
|
95
|
+
.accent { color: var(--c-accent); }
|
|
96
|
+
|
|
97
|
+
/* COMPONENTS */
|
|
98
|
+
.rule { width: 36px; height: 2px; background: var(--c-accent); margin: var(--gap-sm) 0; }
|
|
99
|
+
.orange .rule { background: #111; }
|
|
100
|
+
.tag {
|
|
101
|
+
display: inline-block; font-family: var(--f-mono);
|
|
102
|
+
font-size: var(--sz-label); letter-spacing: 0.14em; text-transform: uppercase;
|
|
103
|
+
color: var(--c-accent); border: 1px solid var(--c-accent); padding: 0.3em 0.8em;
|
|
104
|
+
}
|
|
105
|
+
.orange .tag { color: #111; border-color: rgba(17,17,17,0.4); }
|
|
106
|
+
.stat-card { display: flex; flex-direction: column; gap: var(--gap-sm); padding: var(--gap-md) var(--gap-md) var(--gap-md) 0; border-top: 1px solid var(--c-border); }
|
|
107
|
+
.orange .stat-card { border-top-color: rgba(17,17,17,0.2); }
|
|
108
|
+
.stat-value { font-size: 5.5vw; font-weight: 900; line-height: 1; color: var(--c-accent); letter-spacing: -0.04em; }
|
|
109
|
+
.orange .stat-value { color: #111; }
|
|
110
|
+
.bullet-list { list-style: none; padding: 0; display: flex; flex-direction: column; gap: var(--gap-sm); }
|
|
111
|
+
.bullet-list li { display: grid; grid-template-columns: 1.2em 1fr; gap: 0.5em; font-size: var(--sz-lead); font-weight: 500; line-height: 1.4; }
|
|
112
|
+
.dark .bullet-list li::before { content: "/"; color: var(--c-accent); font-family: var(--f-mono); font-weight: 700; }
|
|
113
|
+
.orange .bullet-list li::before { content: "/"; color: rgba(17,17,17,0.55); font-family: var(--f-mono); font-weight: 700; }
|
|
114
|
+
.img-placeholder { background: var(--c-bg-alt); width: 100%; height: 100%; min-height: 25vh; display: flex; align-items: center; justify-content: center; font-family: var(--f-mono); font-size: var(--sz-label); letter-spacing: 0.1em; color: var(--c-fg-3); }
|
|
115
|
+
|
|
116
|
+
/* ANIMATIONS — same system as Signal/Studio */
|
|
117
|
+
[data-anim] { opacity: 0; animation-fill-mode: forwards; animation-timing-function: var(--ease-enter); animation-duration: 0.55s; }
|
|
118
|
+
[data-anim][data-delay="0"] { animation-delay: 0s; }
|
|
119
|
+
[data-anim][data-delay="1"] { animation-delay: 0.08s; }
|
|
120
|
+
[data-anim][data-delay="2"] { animation-delay: 0.18s; }
|
|
121
|
+
[data-anim][data-delay="3"] { animation-delay: 0.3s; }
|
|
122
|
+
[data-anim][data-delay="4"] { animation-delay: 0.44s; }
|
|
123
|
+
[data-anim][data-delay="5"] { animation-delay: 0.6s; }
|
|
124
|
+
.reveal .present [data-anim="fade-up"] { animation-name: kFadeUp; }
|
|
125
|
+
.reveal .present [data-anim="fade-in"] { animation-name: kFadeIn; }
|
|
126
|
+
.reveal .present [data-anim="reveal-right"] { animation-name: kRevealRight; opacity: 1; }
|
|
127
|
+
.reveal .present [data-anim="scale-in"] { animation-name: kScaleIn; }
|
|
128
|
+
@keyframes kFadeUp { from { opacity:0; transform:translateY(28px); } to { opacity:1; transform:none; } }
|
|
129
|
+
@keyframes kFadeIn { from { opacity:0; } to { opacity:1; } }
|
|
130
|
+
@keyframes kRevealRight { from { clip-path:inset(0 100% 0 0); } to { clip-path:inset(0 0 0 0); } }
|
|
131
|
+
@keyframes kScaleIn { from { opacity:0; transform:scale(0.94); } to { opacity:1; transform:none; } }
|
|
132
|
+
|
|
133
|
+
.reveal .controls { color: var(--c-accent); }
|
|
134
|
+
.reveal .progress { color: var(--c-accent); }
|
|
135
|
+
.reveal .slide-number { font-family: var(--f-mono); background: transparent; color: var(--c-fg-3); font-size: 0.6em; }
|
|
136
|
+
</style>
|
|
137
|
+
</head>
|
|
138
|
+
<body style="margin:0;background:#060606">
|
|
139
|
+
<div class="reveal">
|
|
140
|
+
<div class="slides">
|
|
141
|
+
|
|
142
|
+
<!-- COVER (orange) -->
|
|
143
|
+
<section class="orange slide--cover">
|
|
144
|
+
<div class="slide-body">
|
|
145
|
+
<span class="kicker" data-anim="fade-in" data-delay="0">{{ORGANIZATION}}</span>
|
|
146
|
+
<div class="display" data-anim="fade-up" data-delay="1">{{TITLE}}</div>
|
|
147
|
+
<div class="rule" data-anim="reveal-right" data-delay="2" style="margin-top:2vh"></div>
|
|
148
|
+
<div style="display:flex;justify-content:space-between;margin-top:1.5vh" data-anim="fade-in" data-delay="3">
|
|
149
|
+
<span class="label" style="color:rgba(17,17,17,0.55)">{{DATE}}</span>
|
|
150
|
+
<span class="label" style="color:rgba(17,17,17,0.55)">{{AUTHOR}}</span>
|
|
151
|
+
</div>
|
|
152
|
+
</div>
|
|
153
|
+
</section>
|
|
154
|
+
|
|
155
|
+
<!-- CHAPTER (orange) -->
|
|
156
|
+
<section class="orange slide--chapter">
|
|
157
|
+
<div class="slide-body" style="display:flex;flex-direction:column;justify-content:center;gap:var(--gap-sm)">
|
|
158
|
+
<span class="label" style="color:rgba(17,17,17,0.5)" data-anim="fade-in" data-delay="0">01</span>
|
|
159
|
+
<div class="rule" data-anim="reveal-right" data-delay="1"></div>
|
|
160
|
+
<div class="h1" data-anim="fade-up" data-delay="2">챕터<br>제목</div>
|
|
161
|
+
<p class="body muted" data-anim="fade-up" data-delay="3">서브 설명</p>
|
|
162
|
+
</div>
|
|
163
|
+
</section>
|
|
164
|
+
|
|
165
|
+
<!-- STATS (orange) -->
|
|
166
|
+
<section class="orange">
|
|
167
|
+
<div class="slide-chrome">
|
|
168
|
+
<span class="label" style="color:rgba(17,17,17,0.5)">{{SECTION_LABEL}}</span>
|
|
169
|
+
<span class="label" style="color:rgba(17,17,17,0.5)">01 / 지표</span>
|
|
170
|
+
</div>
|
|
171
|
+
<div class="slide-body slide--stats">
|
|
172
|
+
<div class="stat-card" data-anim="fade-up" data-delay="1">
|
|
173
|
+
<div class="stat-value">98<span style="font-size:0.45em">%</span></div>
|
|
174
|
+
<p class="body">지표명</p>
|
|
175
|
+
<p class="caption muted">설명</p>
|
|
176
|
+
</div>
|
|
177
|
+
<div class="stat-card" data-anim="fade-up" data-delay="2">
|
|
178
|
+
<div class="stat-value">2.4<span style="font-size:0.45em">s</span></div>
|
|
179
|
+
<p class="body">지표명</p>
|
|
180
|
+
<p class="caption muted">설명</p>
|
|
181
|
+
</div>
|
|
182
|
+
<div class="stat-card" data-anim="fade-up" data-delay="3">
|
|
183
|
+
<div class="stat-value">41</div>
|
|
184
|
+
<p class="body">지표명</p>
|
|
185
|
+
<p class="caption muted">설명</p>
|
|
186
|
+
</div>
|
|
187
|
+
</div>
|
|
188
|
+
<div class="slide-foot">
|
|
189
|
+
<span class="label" style="color:rgba(17,17,17,0.5)">{{ORG}} · {{DATE}}</span>
|
|
190
|
+
</div>
|
|
191
|
+
</section>
|
|
192
|
+
|
|
193
|
+
<!-- SPLIT (dark) -->
|
|
194
|
+
<section class="dark">
|
|
195
|
+
<div class="slide-chrome">
|
|
196
|
+
<span class="label muted">{{SECTION_LABEL}}</span>
|
|
197
|
+
<span class="label muted">01 / 분석</span>
|
|
198
|
+
</div>
|
|
199
|
+
<div class="slide-body slide--split">
|
|
200
|
+
<div data-anim="fade-up" data-delay="1">
|
|
201
|
+
<span class="kicker">Topic</span>
|
|
202
|
+
<div class="h2">슬라이드<br>제목</div>
|
|
203
|
+
<div class="rule"></div>
|
|
204
|
+
</div>
|
|
205
|
+
<div data-anim="fade-up" data-delay="2">
|
|
206
|
+
<ul class="bullet-list">
|
|
207
|
+
<li>항목 1 — 설명</li>
|
|
208
|
+
<li>항목 2 — 설명</li>
|
|
209
|
+
<li>항목 3 — 설명</li>
|
|
210
|
+
<li>항목 4 — 설명</li>
|
|
211
|
+
</ul>
|
|
212
|
+
</div>
|
|
213
|
+
</div>
|
|
214
|
+
<div class="slide-foot">
|
|
215
|
+
<span class="label muted">{{ORG}} · {{DATE}}</span>
|
|
216
|
+
</div>
|
|
217
|
+
</section>
|
|
218
|
+
|
|
219
|
+
<!-- STATEMENT (dark) -->
|
|
220
|
+
<section class="dark slide--statement">
|
|
221
|
+
<div class="slide-body" style="display:flex;flex-direction:column;justify-content:center">
|
|
222
|
+
<div class="display" data-anim="fade-up" data-delay="0">선언문<br>여기에</div>
|
|
223
|
+
<div class="rule" data-anim="reveal-right" data-delay="2" style="margin-top:2vh"></div>
|
|
224
|
+
<p class="body muted" data-anim="fade-up" data-delay="3" style="margin-top:var(--gap-sm)">— 출처 / 맥락</p>
|
|
225
|
+
</div>
|
|
226
|
+
</section>
|
|
227
|
+
|
|
228
|
+
<!-- LIST (dark) -->
|
|
229
|
+
<section class="dark">
|
|
230
|
+
<div class="slide-chrome">
|
|
231
|
+
<span class="label muted">{{SECTION_LABEL}}</span>
|
|
232
|
+
<span class="label muted">02 / 계획</span>
|
|
233
|
+
</div>
|
|
234
|
+
<div class="slide-body slide--list">
|
|
235
|
+
<div data-anim="fade-up" data-delay="1">
|
|
236
|
+
<span class="kicker">{{PERIOD}}</span>
|
|
237
|
+
<div class="h2">주요<br>과제</div>
|
|
238
|
+
<div class="rule"></div>
|
|
239
|
+
</div>
|
|
240
|
+
<div data-anim="fade-up" data-delay="2">
|
|
241
|
+
<ul class="bullet-list">
|
|
242
|
+
<li>할 일 1</li>
|
|
243
|
+
<li>할 일 2</li>
|
|
244
|
+
<li>할 일 3</li>
|
|
245
|
+
<li>할 일 4</li>
|
|
246
|
+
</ul>
|
|
247
|
+
</div>
|
|
248
|
+
</div>
|
|
249
|
+
<div class="slide-foot">
|
|
250
|
+
<span class="label muted">{{ORG}} · {{DATE}}</span>
|
|
251
|
+
</div>
|
|
252
|
+
</section>
|
|
253
|
+
|
|
254
|
+
<!-- QUOTE (dark) -->
|
|
255
|
+
<section class="dark slide--quote">
|
|
256
|
+
<div class="slide-body" style="display:flex;flex-direction:column;justify-content:center;gap:var(--gap-md)">
|
|
257
|
+
<div class="rule" data-anim="reveal-right" data-delay="0"></div>
|
|
258
|
+
<div class="h1" data-anim="fade-up" data-delay="1">"인용문이<br>여기에"</div>
|
|
259
|
+
<p class="label muted" data-anim="fade-in" data-delay="3">— 발언자</p>
|
|
260
|
+
</div>
|
|
261
|
+
</section>
|
|
262
|
+
|
|
263
|
+
<!-- END (orange) -->
|
|
264
|
+
<section class="orange slide--end">
|
|
265
|
+
<div class="slide-body" style="display:flex;flex-direction:column;justify-content:center;gap:var(--gap-lg)">
|
|
266
|
+
<div data-anim="fade-up" data-delay="0">
|
|
267
|
+
<span class="kicker">감사합니다</span>
|
|
268
|
+
<div class="display">Q&A</div>
|
|
269
|
+
<div class="rule" style="margin-top:2vh"></div>
|
|
270
|
+
</div>
|
|
271
|
+
<div style="display:grid;grid-template-columns:1fr 1fr;gap:var(--gap-md)" data-anim="fade-up" data-delay="2">
|
|
272
|
+
<div><p class="label" style="color:rgba(17,17,17,0.5)">이메일</p><p class="body">{{EMAIL}}</p></div>
|
|
273
|
+
<div><p class="label" style="color:rgba(17,17,17,0.5)">소속</p><p class="body">{{ORG}}</p></div>
|
|
274
|
+
</div>
|
|
275
|
+
</div>
|
|
276
|
+
</section>
|
|
277
|
+
|
|
278
|
+
</div>
|
|
279
|
+
</div>
|
|
280
|
+
<script src="https://cdn.jsdelivr.net/npm/reveal.js@5/dist/reveal.js"></script>
|
|
281
|
+
<script src="https://cdn.jsdelivr.net/npm/reveal.js@5/plugin/notes/notes.js"></script>
|
|
282
|
+
<script>
|
|
283
|
+
Reveal.initialize({
|
|
284
|
+
hash: true, width: 1600, height: 900, margin: 0,
|
|
285
|
+
minScale: 0.1, maxScale: 1.5,
|
|
286
|
+
controls: true, progress: true, slideNumber: 'c/t',
|
|
287
|
+
transition: 'fade', backgroundTransition: 'fade',
|
|
288
|
+
plugins: [RevealNotes],
|
|
289
|
+
});
|
|
290
|
+
</script>
|
|
291
|
+
</body>
|
|
292
|
+
</html>
|