@tienne/gestalt 0.17.0 → 0.18.2

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.
Files changed (173) hide show
  1. package/dist/package.json +1 -1
  2. package/dist/role-agents/presentation-designer/AGENT.md +262 -0
  3. package/dist/role-agents/presentation-designer/templates/broadside.html +292 -0
  4. package/dist/role-agents/presentation-designer/templates/editorial-forest.html +264 -0
  5. package/dist/role-agents/presentation-designer/templates/emerald-editorial.html +273 -0
  6. package/dist/role-agents/presentation-designer/templates/neo-grid.html +407 -0
  7. package/dist/role-agents/presentation-designer/templates/pin-and-paper.html +225 -0
  8. package/dist/role-agents/presentation-designer/templates/pink-script.html +241 -0
  9. package/dist/role-agents/presentation-designer/templates/sakura-chroma.html +293 -0
  10. package/dist/role-agents/presentation-designer/templates/signal.html +403 -0
  11. package/dist/role-agents/presentation-designer/templates/stencil-tablet.html +211 -0
  12. package/dist/role-agents/presentation-designer/templates/studio.html +379 -0
  13. package/dist/role-agents/technical-writer/AGENT.md +38 -0
  14. package/dist/skills/agent/SKILL.md +2 -0
  15. package/dist/skills/seed/SKILL.md +92 -0
  16. package/dist/src/cli/commands/monitor.d.ts +2 -0
  17. package/dist/src/cli/commands/monitor.d.ts.map +1 -0
  18. package/dist/src/cli/commands/monitor.js +13 -0
  19. package/dist/src/cli/commands/monitor.js.map +1 -0
  20. package/dist/src/cli/commands/seed.d.ts +4 -0
  21. package/dist/src/cli/commands/seed.d.ts.map +1 -0
  22. package/dist/src/cli/commands/seed.js +34 -0
  23. package/dist/src/cli/commands/seed.js.map +1 -0
  24. package/dist/src/interview/ambiguity.d.ts +8 -0
  25. package/dist/src/interview/ambiguity.d.ts.map +1 -0
  26. package/dist/src/interview/ambiguity.js +69 -0
  27. package/dist/src/interview/ambiguity.js.map +1 -0
  28. package/dist/src/mcp/tools/seed-passthrough.d.ts +5 -0
  29. package/dist/src/mcp/tools/seed-passthrough.d.ts.map +1 -0
  30. package/dist/src/mcp/tools/seed-passthrough.js +29 -0
  31. package/dist/src/mcp/tools/seed-passthrough.js.map +1 -0
  32. package/dist/src/mcp/tools/seed.d.ts +5 -0
  33. package/dist/src/mcp/tools/seed.d.ts.map +1 -0
  34. package/dist/src/mcp/tools/seed.js +19 -0
  35. package/dist/src/mcp/tools/seed.js.map +1 -0
  36. package/dist/src/recording/agg-converter.d.ts +25 -0
  37. package/dist/src/recording/agg-converter.d.ts.map +1 -0
  38. package/dist/src/recording/agg-converter.js +80 -0
  39. package/dist/src/recording/agg-converter.js.map +1 -0
  40. package/dist/src/recording/agg-installer.d.ts +6 -0
  41. package/dist/src/recording/agg-installer.d.ts.map +1 -0
  42. package/dist/src/recording/agg-installer.js +50 -0
  43. package/dist/src/recording/agg-installer.js.map +1 -0
  44. package/dist/src/recording/asciinema-installer.d.ts +6 -0
  45. package/dist/src/recording/asciinema-installer.d.ts.map +1 -0
  46. package/dist/src/recording/asciinema-installer.js +50 -0
  47. package/dist/src/recording/asciinema-installer.js.map +1 -0
  48. package/dist/src/recording/asciinema-recorder.d.ts +26 -0
  49. package/dist/src/recording/asciinema-recorder.d.ts.map +1 -0
  50. package/dist/src/recording/asciinema-recorder.js +52 -0
  51. package/dist/src/recording/asciinema-recorder.js.map +1 -0
  52. package/dist/src/recording/cast-generator.d.ts +7 -0
  53. package/dist/src/recording/cast-generator.d.ts.map +1 -0
  54. package/dist/src/recording/cast-generator.js +97 -0
  55. package/dist/src/recording/cast-generator.js.map +1 -0
  56. package/dist/src/recording/filename-generator.d.ts +19 -0
  57. package/dist/src/recording/filename-generator.d.ts.map +1 -0
  58. package/dist/src/recording/filename-generator.js +67 -0
  59. package/dist/src/recording/filename-generator.js.map +1 -0
  60. package/dist/src/recording/gif-generator.d.ts +21 -0
  61. package/dist/src/recording/gif-generator.d.ts.map +1 -0
  62. package/dist/src/recording/gif-generator.js +121 -0
  63. package/dist/src/recording/gif-generator.js.map +1 -0
  64. package/dist/src/recording/recording-dir.d.ts +5 -0
  65. package/dist/src/recording/recording-dir.d.ts.map +1 -0
  66. package/dist/src/recording/recording-dir.js +13 -0
  67. package/dist/src/recording/recording-dir.js.map +1 -0
  68. package/dist/src/recording/recording-orchestrator.d.ts +50 -0
  69. package/dist/src/recording/recording-orchestrator.d.ts.map +1 -0
  70. package/dist/src/recording/recording-orchestrator.js +98 -0
  71. package/dist/src/recording/recording-orchestrator.js.map +1 -0
  72. package/dist/src/recording/resume-detector.d.ts +10 -0
  73. package/dist/src/recording/resume-detector.d.ts.map +1 -0
  74. package/dist/src/recording/resume-detector.js +14 -0
  75. package/dist/src/recording/resume-detector.js.map +1 -0
  76. package/dist/src/recording/segment-merger.d.ts +27 -0
  77. package/dist/src/recording/segment-merger.d.ts.map +1 -0
  78. package/dist/src/recording/segment-merger.js +65 -0
  79. package/dist/src/recording/segment-merger.js.map +1 -0
  80. package/dist/src/recording/terminal-recorder.d.ts +31 -0
  81. package/dist/src/recording/terminal-recorder.d.ts.map +1 -0
  82. package/dist/src/recording/terminal-recorder.js +111 -0
  83. package/dist/src/recording/terminal-recorder.js.map +1 -0
  84. package/dist/src/scripts/postinstall.d.ts +2 -0
  85. package/dist/src/scripts/postinstall.d.ts.map +1 -0
  86. package/dist/src/scripts/postinstall.js +29 -0
  87. package/dist/src/scripts/postinstall.js.map +1 -0
  88. package/dist/src/seed/extractor.d.ts +15 -0
  89. package/dist/src/seed/extractor.d.ts.map +1 -0
  90. package/dist/src/seed/extractor.js +88 -0
  91. package/dist/src/seed/extractor.js.map +1 -0
  92. package/dist/src/seed/generator.d.ts +12 -0
  93. package/dist/src/seed/generator.d.ts.map +1 -0
  94. package/dist/src/seed/generator.js +66 -0
  95. package/dist/src/seed/generator.js.map +1 -0
  96. package/dist/src/seed/passthrough-generator.d.ts +31 -0
  97. package/dist/src/seed/passthrough-generator.d.ts.map +1 -0
  98. package/dist/src/seed/passthrough-generator.js +80 -0
  99. package/dist/src/seed/passthrough-generator.js.map +1 -0
  100. package/dist/src/seed/schema.d.ts +145 -0
  101. package/dist/src/seed/schema.d.ts.map +1 -0
  102. package/dist/src/seed/schema.js +37 -0
  103. package/dist/src/seed/schema.js.map +1 -0
  104. package/dist/src/tui/components/TUIApp.d.ts +20 -0
  105. package/dist/src/tui/components/TUIApp.d.ts.map +1 -0
  106. package/dist/src/tui/components/TUIApp.js +84 -0
  107. package/dist/src/tui/components/TUIApp.js.map +1 -0
  108. package/dist/src/tui/hooks/event-store-reader.d.ts +28 -0
  109. package/dist/src/tui/hooks/event-store-reader.d.ts.map +1 -0
  110. package/dist/src/tui/hooks/event-store-reader.js +141 -0
  111. package/dist/src/tui/hooks/event-store-reader.js.map +1 -0
  112. package/dist/src/tui/hooks/useEventStorePoller.d.ts +12 -0
  113. package/dist/src/tui/hooks/useEventStorePoller.d.ts.map +1 -0
  114. package/dist/src/tui/hooks/useEventStorePoller.js +84 -0
  115. package/dist/src/tui/hooks/useEventStorePoller.js.map +1 -0
  116. package/dist/src/tui/screens/DashboardScreen.d.ts +4 -0
  117. package/dist/src/tui/screens/DashboardScreen.d.ts.map +1 -0
  118. package/dist/src/tui/screens/DashboardScreen.js +132 -0
  119. package/dist/src/tui/screens/DashboardScreen.js.map +1 -0
  120. package/dist/src/tui/screens/DebugScreen.d.ts +4 -0
  121. package/dist/src/tui/screens/DebugScreen.d.ts.map +1 -0
  122. package/dist/src/tui/screens/DebugScreen.js +40 -0
  123. package/dist/src/tui/screens/DebugScreen.js.map +1 -0
  124. package/dist/src/tui/screens/EvolutionScreen.d.ts +4 -0
  125. package/dist/src/tui/screens/EvolutionScreen.d.ts.map +1 -0
  126. package/dist/src/tui/screens/EvolutionScreen.js +136 -0
  127. package/dist/src/tui/screens/EvolutionScreen.js.map +1 -0
  128. package/dist/src/tui/screens/HUDPanel.d.ts +4 -0
  129. package/dist/src/tui/screens/HUDPanel.d.ts.map +1 -0
  130. package/dist/src/tui/screens/HUDPanel.js +13 -0
  131. package/dist/src/tui/screens/HUDPanel.js.map +1 -0
  132. package/dist/src/tui/screens/InterviewScreen.d.ts +4 -0
  133. package/dist/src/tui/screens/InterviewScreen.d.ts.map +1 -0
  134. package/dist/src/tui/screens/InterviewScreen.js +103 -0
  135. package/dist/src/tui/screens/InterviewScreen.js.map +1 -0
  136. package/dist/src/tui/screens/LogScreen.d.ts +4 -0
  137. package/dist/src/tui/screens/LogScreen.d.ts.map +1 -0
  138. package/dist/src/tui/screens/LogScreen.js +83 -0
  139. package/dist/src/tui/screens/LogScreen.js.map +1 -0
  140. package/dist/src/tui/screens/SessionListScreen.d.ts +4 -0
  141. package/dist/src/tui/screens/SessionListScreen.d.ts.map +1 -0
  142. package/dist/src/tui/screens/SessionListScreen.js +71 -0
  143. package/dist/src/tui/screens/SessionListScreen.js.map +1 -0
  144. package/dist/src/tui/screens/SpecViewerScreen.d.ts +4 -0
  145. package/dist/src/tui/screens/SpecViewerScreen.d.ts.map +1 -0
  146. package/dist/src/tui/screens/SpecViewerScreen.js +73 -0
  147. package/dist/src/tui/screens/SpecViewerScreen.js.map +1 -0
  148. package/dist/src/tui/widgets/DriftMeter.d.ts +15 -0
  149. package/dist/src/tui/widgets/DriftMeter.d.ts.map +1 -0
  150. package/dist/src/tui/widgets/DriftMeter.js +27 -0
  151. package/dist/src/tui/widgets/DriftMeter.js.map +1 -0
  152. package/dist/src/tui/widgets/GestaltPrincipleBar.d.ts +9 -0
  153. package/dist/src/tui/widgets/GestaltPrincipleBar.d.ts.map +1 -0
  154. package/dist/src/tui/widgets/GestaltPrincipleBar.js +35 -0
  155. package/dist/src/tui/widgets/GestaltPrincipleBar.js.map +1 -0
  156. package/dist/src/tui/widgets/TaskDAGTree.d.ts +15 -0
  157. package/dist/src/tui/widgets/TaskDAGTree.d.ts.map +1 -0
  158. package/dist/src/tui/widgets/TaskDAGTree.js +54 -0
  159. package/dist/src/tui/widgets/TaskDAGTree.js.map +1 -0
  160. package/package.json +1 -1
  161. package/role-agents/presentation-designer/AGENT.md +262 -0
  162. package/role-agents/presentation-designer/templates/broadside.html +292 -0
  163. package/role-agents/presentation-designer/templates/editorial-forest.html +264 -0
  164. package/role-agents/presentation-designer/templates/emerald-editorial.html +273 -0
  165. package/role-agents/presentation-designer/templates/neo-grid.html +407 -0
  166. package/role-agents/presentation-designer/templates/pin-and-paper.html +225 -0
  167. package/role-agents/presentation-designer/templates/pink-script.html +241 -0
  168. package/role-agents/presentation-designer/templates/sakura-chroma.html +293 -0
  169. package/role-agents/presentation-designer/templates/signal.html +403 -0
  170. package/role-agents/presentation-designer/templates/stencil-tablet.html +211 -0
  171. package/role-agents/presentation-designer/templates/studio.html +379 -0
  172. package/role-agents/technical-writer/AGENT.md +38 -0
  173. 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.17.0",
3
+ "version": "0.18.2",
4
4
  "description": "TypeScript AI Development Harness - Gestalt psychology-driven requirement clarification",
5
5
  "type": "module",
6
6
  "main": "./dist/src/index.js",
@@ -0,0 +1,262 @@
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
+ ## Collaboration Protocol — technical-writer 우선
205
+
206
+ 프레젠테이션은 **워딩이 먼저, 디자인이 나중**이다. 순서를 지키지 않으면 디자인에 워딩을 끼워 맞추게 된다.
207
+
208
+ ### Phase 1: technical-writer (워딩 초안)
209
+
210
+ 프레젠테이션 작성 요청이 들어오면, 디자인 작업 전에 반드시 `technical-writer` 관점을 먼저 확보해야 한다.
211
+
212
+ `technical-writer`에게 위임할 내용:
213
+
214
+ ```
215
+ 목적: [발표 목적 한 문장]
216
+ 청중: [누가 보는가]
217
+ 핵심 메시지: [이 발표로 청중이 가져갈 단 하나의 것]
218
+
219
+ 슬라이드별 워딩 초안 요청:
220
+ - 각 슬라이드의 제목 (동사형 또는 핵심 주장으로)
221
+ - 핵심 포인트 1–3줄 (불릿 아님, 문장으로)
222
+ - 통계·수치가 있다면 맥락 설명 포함
223
+ - CTA 또는 마무리 메시지
224
+ ```
225
+
226
+ **technical-writer의 워딩 원칙** (참고):
227
+ - 슬라이드 제목은 "무엇을" 이 아니라 "무엇이 왜 중요한가"
228
+ - 수치는 단독으로 쓰지 않음 — 반드시 맥락(전기 대비, 목표 대비)과 함께
229
+ - 한 슬라이드 = 한 메시지. 두 개면 두 슬라이드로 분리
230
+
231
+ ### Phase 2: presentation-designer (디자인 적용)
232
+
233
+ `technical-writer`의 워딩 초안을 받은 뒤 아래 순서로 진행:
234
+
235
+ 1. **템플릿 선택** — 무드 가이드 기준으로 청중·목적에 맞는 템플릿 결정
236
+ 2. **슬라이드 타입 매핑** — 워딩의 성격에 따라 슬라이드 타입 배정
237
+ - 수치 강조 → `stats` 슬라이드
238
+ - 비교·대조 → `compare` 또는 `split`
239
+ - 핵심 선언 → `statement`
240
+ - 과정·단계 → `process` 또는 `list`
241
+ - 인용·증언 → `quote`
242
+ 3. **카피 압축** — 문장을 슬라이드 공간에 맞게 압축 (의미 손실 없이)
243
+ 4. **코드 생성** — 선택한 템플릿 기반 HTML 생성
244
+
245
+ ### 협업 체크리스트
246
+
247
+ 디자인 작업 시작 전 반드시 확인:
248
+ - [ ] 발표 목적이 한 문장으로 정의됐는가?
249
+ - [ ] 각 슬라이드의 핵심 메시지가 워딩으로 확정됐는가?
250
+ - [ ] 수치에 맥락(비교 기준)이 붙어 있는가?
251
+ - [ ] 슬라이드 수가 적정한가? (발표 시간 × 1분/슬라이드 기준)
252
+
253
+ ---
254
+
255
+ ## Output Format
256
+
257
+ Provide a structured review with:
258
+ - **Narrative structure assessment**: 스토리 흐름 평가 — technical-writer 관점 반영 여부 포함
259
+ - **Reveal.js implementation guidance**: 구체적 HTML/CSS 코드 스니펫 포함
260
+ - **Visual design recommendations**: 색상·타이포·레이아웃 개선점
261
+ - **Slide-by-slide notes**: 각 슬라이드 개선 포인트 (워딩 + 디자인 동시 평가)
262
+ - **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&amp;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>