@ztffn/presentation-generator-plugin 1.2.0 → 1.3.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/.claude/settings.local.json +9 -0
- package/.claude-plugin/plugin.json +1 -1
- package/CONTEXT.md +110 -0
- package/HANDOFF.md +49 -0
- package/PLAN-consolidate-design-skills.md +238 -0
- package/README.md +15 -17
- package/agents/presentation-design.md +55 -8
- package/package.json +1 -1
- package/skills/graph-json-spec/SKILL.md +812 -0
- package/skills/presentation-generator/SKILL.md +1 -1
- package/skills/slide-content/SKILL.md +45 -0
- package/skills/edge-conventions/SKILL.md +0 -97
- package/skills/layout-templates/SKILL.md +0 -315
- package/skills/node-schema/SKILL.md +0 -135
- package/skills/pitch-reference/SKILL.md +0 -164
- package/skills/positioning/SKILL.md +0 -89
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: pitch-reference
|
|
3
|
-
description: Reference example of a complete 7-node presentation graph JSON demonstrating key slide types and edge wiring.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Pitch Reference Example
|
|
7
|
-
|
|
8
|
-
A 7-node presentation demonstrating key slide types. Each node shows a different design pattern the design agent should know how to produce.
|
|
9
|
-
|
|
10
|
-
```json
|
|
11
|
-
{
|
|
12
|
-
"_node_1_comment": "COVER NODE: centered, branded, brand font. Sets the context. No content-heavy text.",
|
|
13
|
-
"_node_2_comment": "CONTENT NODE: standard bullets, left-aligned (centered:false). Includes notes field for speaker context. The workhorse slide type.",
|
|
14
|
-
"_node_3_comment": "TWO-COLUMN NODE: layout:two-column splits on --- delimiter. Good for comparison or text+visual.",
|
|
15
|
-
"_node_4_comment": "INLINE CHART NODE: [chart:name] tag in content with charts record. Data supports the text argument.",
|
|
16
|
-
"_node_5_comment": "R3F SCENE NODE: type:r3f with scene config. lightText:true for dark background. Content overlays the 3D scene.",
|
|
17
|
-
"_node_6_comment": "BACKGROUND IMAGE NODE: Unsplash URL, overlay for readability, lightText. Mood-setting slide.",
|
|
18
|
-
"_node_7_comment": "CLOSING NODE: centered, branded, call to action. Mirrors cover structure.",
|
|
19
|
-
|
|
20
|
-
"nodes": [
|
|
21
|
-
{
|
|
22
|
-
"id": "cover",
|
|
23
|
-
"type": "huma",
|
|
24
|
-
"position": { "x": 0, "y": 0 },
|
|
25
|
-
"data": {
|
|
26
|
-
"label": "Graph-Based Presentations",
|
|
27
|
-
"topic": "Huma Showcase",
|
|
28
|
-
"content": "Non-linear storytelling for technical teams.\n\nNavigate with arrow keys. Press **down** to drill into any topic.",
|
|
29
|
-
"centered": true,
|
|
30
|
-
"brandFont": true,
|
|
31
|
-
"showBranding": true,
|
|
32
|
-
"brandingText": "huma.energy"
|
|
33
|
-
},
|
|
34
|
-
"style": { "width": 180, "height": 70 },
|
|
35
|
-
"measured": { "width": 180, "height": 70 }
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
"id": "problem",
|
|
39
|
-
"type": "huma",
|
|
40
|
-
"position": { "x": 240, "y": 0 },
|
|
41
|
-
"data": {
|
|
42
|
-
"label": "The Problem",
|
|
43
|
-
"topic": "01 / Problem",
|
|
44
|
-
"content": "## Linear tools break complex stories\n\n- Cannot branch based on audience questions\n- Skipping sections breaks the flow\n- Presenters get lost navigating dense topics\n- No private view for speaker notes during screen share\n\nEvery meeting is different. The presentation should adapt.",
|
|
45
|
-
"notes": "Pause here and ask: 'Does this match what you experience with your current tooling?' — their answer shapes how much time to spend on this node. If they push back, the drill-down below has the data. Key talking point: the fourth bullet is the one that resonates most with technical presenters.",
|
|
46
|
-
"centered": false
|
|
47
|
-
},
|
|
48
|
-
"style": { "width": 180, "height": 70 },
|
|
49
|
-
"measured": { "width": 180, "height": 70 }
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
"id": "value-detail",
|
|
53
|
-
"type": "huma",
|
|
54
|
-
"position": { "x": 240, "y": 150 },
|
|
55
|
-
"data": {
|
|
56
|
-
"label": "Value Breakdown",
|
|
57
|
-
"topic": "03 / Value",
|
|
58
|
-
"content": "## Flexible narratives\nAdapt flow to audience type and questions in real time\n\n---\n\n## Consistent style\nReuse front-end web styling and components directly\n\n## Professional delivery\nSpeaker notes and timing without the audience seeing them",
|
|
59
|
-
"layout": "two-column",
|
|
60
|
-
"centered": false
|
|
61
|
-
},
|
|
62
|
-
"style": { "width": 180, "height": 70 },
|
|
63
|
-
"measured": { "width": 180, "height": 70 }
|
|
64
|
-
},
|
|
65
|
-
{
|
|
66
|
-
"id": "value",
|
|
67
|
-
"type": "huma",
|
|
68
|
-
"position": { "x": 480, "y": 0 },
|
|
69
|
-
"data": {
|
|
70
|
-
"label": "The Value",
|
|
71
|
-
"topic": "03 / Value",
|
|
72
|
-
"content": "## Why this approach wins\n\n[chart:value]\n\nAdapt to the audience. Reuse web components. Deliver with confidence.",
|
|
73
|
-
"charts": {
|
|
74
|
-
"value": {
|
|
75
|
-
"chartType": "radar",
|
|
76
|
-
"data": [
|
|
77
|
-
{ "axis": "Flexibility", "graph": 95, "traditional": 30 },
|
|
78
|
-
{ "axis": "Visual Quality", "graph": 90, "traditional": 50 },
|
|
79
|
-
{ "axis": "Interactivity", "graph": 85, "traditional": 20 },
|
|
80
|
-
{ "axis": "Ease of Use", "graph": 60, "traditional": 90 },
|
|
81
|
-
{ "axis": "Consistency", "graph": 85, "traditional": 40 },
|
|
82
|
-
{ "axis": "Tech Signal", "graph": 95, "traditional": 15 }
|
|
83
|
-
],
|
|
84
|
-
"config": {
|
|
85
|
-
"xKey": "axis",
|
|
86
|
-
"yKeys": ["graph", "traditional"],
|
|
87
|
-
"showGrid": true,
|
|
88
|
-
"showLegend": true
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
},
|
|
92
|
-
"centered": false
|
|
93
|
-
},
|
|
94
|
-
"style": { "width": 180, "height": 70 },
|
|
95
|
-
"measured": { "width": 180, "height": 70 }
|
|
96
|
-
},
|
|
97
|
-
{
|
|
98
|
-
"id": "feat-3d",
|
|
99
|
-
"type": "huma",
|
|
100
|
-
"position": { "x": 720, "y": 0 },
|
|
101
|
-
"data": {
|
|
102
|
-
"label": "3D Scenes",
|
|
103
|
-
"topic": "04 / Features",
|
|
104
|
-
"type": "r3f",
|
|
105
|
-
"scene": {
|
|
106
|
-
"component": "rotating-cube",
|
|
107
|
-
"controls": true,
|
|
108
|
-
"background": "#1a1a2e"
|
|
109
|
-
},
|
|
110
|
-
"content": "Interactive React Three Fiber scene.\n\nDrag to rotate. Scroll to zoom. Scenes load from a component registry.",
|
|
111
|
-
"lightText": true
|
|
112
|
-
},
|
|
113
|
-
"style": { "width": 180, "height": 70 },
|
|
114
|
-
"measured": { "width": 180, "height": 70 }
|
|
115
|
-
},
|
|
116
|
-
{
|
|
117
|
-
"id": "feat-bgimage",
|
|
118
|
-
"type": "huma",
|
|
119
|
-
"position": { "x": 960, "y": 0 },
|
|
120
|
-
"data": {
|
|
121
|
-
"label": "Background Image",
|
|
122
|
-
"topic": "04 / Features",
|
|
123
|
-
"content": "## Full-bleed imagery\n\nUpload any image as a slide background. Toggle overlay for text readability.\n\n- Cover/contain fit modes\n- Dark overlay toggle\n- Light text auto-detection",
|
|
124
|
-
"backgroundImage": "https://images.unsplash.com/photo-1451187580459-43490279c0fa?w=1920&q=80",
|
|
125
|
-
"backgroundImageFit": "cover",
|
|
126
|
-
"backgroundImageOverlay": true,
|
|
127
|
-
"lightText": true,
|
|
128
|
-
"centered": false
|
|
129
|
-
},
|
|
130
|
-
"style": { "width": 180, "height": 70 },
|
|
131
|
-
"measured": { "width": 180, "height": 70 }
|
|
132
|
-
},
|
|
133
|
-
{
|
|
134
|
-
"id": "end",
|
|
135
|
-
"type": "huma",
|
|
136
|
-
"position": { "x": 1200, "y": 0 },
|
|
137
|
-
"data": {
|
|
138
|
-
"label": "Get Started",
|
|
139
|
-
"content": "Fork this template to build your own.\n\nEvery slide, chart, and scene is editable in the graph editor.",
|
|
140
|
-
"centered": true,
|
|
141
|
-
"brandFont": true,
|
|
142
|
-
"showBranding": true,
|
|
143
|
-
"brandingText": "huma.energy"
|
|
144
|
-
},
|
|
145
|
-
"style": { "width": 180, "height": 70 },
|
|
146
|
-
"measured": { "width": 180, "height": 70 }
|
|
147
|
-
}
|
|
148
|
-
],
|
|
149
|
-
"edges": [
|
|
150
|
-
{ "id": "e-cover-problem", "source": "cover", "target": "problem", "sourceHandle": "s-right", "targetHandle": "t-left" },
|
|
151
|
-
{ "id": "e-problem-cover", "source": "problem", "target": "cover", "sourceHandle": "s-left", "targetHandle": "t-right" },
|
|
152
|
-
{ "id": "e-problem-value", "source": "problem", "target": "value", "sourceHandle": "s-right", "targetHandle": "t-left" },
|
|
153
|
-
{ "id": "e-value-problem", "source": "value", "target": "problem", "sourceHandle": "s-left", "targetHandle": "t-right" },
|
|
154
|
-
{ "id": "e-problem-detail", "source": "problem", "target": "value-detail", "sourceHandle": "s-bottom", "targetHandle": "t-top" },
|
|
155
|
-
{ "id": "e-detail-problem", "source": "value-detail", "target": "problem", "sourceHandle": "s-top", "targetHandle": "t-bottom" },
|
|
156
|
-
{ "id": "e-value-3d", "source": "value", "target": "feat-3d", "sourceHandle": "s-right", "targetHandle": "t-left" },
|
|
157
|
-
{ "id": "e-3d-value", "source": "feat-3d", "target": "value", "sourceHandle": "s-left", "targetHandle": "t-right" },
|
|
158
|
-
{ "id": "e-3d-bgimage", "source": "feat-3d", "target": "feat-bgimage", "sourceHandle": "s-right", "targetHandle": "t-left" },
|
|
159
|
-
{ "id": "e-bgimage-3d", "source": "feat-bgimage", "target": "feat-3d", "sourceHandle": "s-left", "targetHandle": "t-right" },
|
|
160
|
-
{ "id": "e-bgimage-end", "source": "feat-bgimage", "target": "end", "sourceHandle": "s-right", "targetHandle": "t-left" },
|
|
161
|
-
{ "id": "e-end-bgimage", "source": "end", "target": "feat-bgimage", "sourceHandle": "s-left", "targetHandle": "t-right" }
|
|
162
|
-
]
|
|
163
|
-
}
|
|
164
|
-
```
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: positioning
|
|
3
|
-
description: Grid system and placement rules for positioning nodes on the graph canvas.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Node Positioning
|
|
7
|
-
|
|
8
|
-
How to place nodes on the graph canvas for a clean, readable layout in the editor.
|
|
9
|
-
Position affects visual arrangement only — navigation is determined by edges.
|
|
10
|
-
|
|
11
|
-
## Grid System
|
|
12
|
-
|
|
13
|
-
| Parameter | Value |
|
|
14
|
-
|---|---|
|
|
15
|
-
| Horizontal spacing | 240px |
|
|
16
|
-
| Vertical spacing | 150px |
|
|
17
|
-
| Node width | 180px (in `style` and `measured`) |
|
|
18
|
-
| Node height | 70px (in `style` and `measured`) |
|
|
19
|
-
|
|
20
|
-
## Spine Row
|
|
21
|
-
|
|
22
|
-
All spine nodes sit at `y: 0`, starting at `x: 0`, incrementing by 240 per node.
|
|
23
|
-
|
|
24
|
-
```
|
|
25
|
-
x: 0 240 480 720 960 1200
|
|
26
|
-
y: 0 [Cover] [Problem] [Solution] [Value] [Features] [CTA]
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
## Drill-Down Rows
|
|
30
|
-
|
|
31
|
-
Drill-down children are placed directly below their parent:
|
|
32
|
-
|
|
33
|
-
- First level: `y: 150`
|
|
34
|
-
- Second level: `y: 300`
|
|
35
|
-
|
|
36
|
-
The first child inherits the parent's `x` position. Additional siblings at the same depth increment `x` by 240.
|
|
37
|
-
|
|
38
|
-
```
|
|
39
|
-
x: 240 480
|
|
40
|
-
y:0 [Problem] [Solution]
|
|
41
|
-
↓ ↓
|
|
42
|
-
y:150 [Detail] [How It Works]
|
|
43
|
-
↓
|
|
44
|
-
y:300 [Root Cause]
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
### Multiple Siblings in a Branch
|
|
48
|
-
|
|
49
|
-
When a spine node has multiple drill-down children at the same depth:
|
|
50
|
-
|
|
51
|
-
```
|
|
52
|
-
x: 720 960
|
|
53
|
-
y:0 [Value]
|
|
54
|
-
↓
|
|
55
|
-
y:150 [Case A] [Case B]
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
- First child: same `x` as parent (720)
|
|
59
|
-
- Second child: parent `x` + 240 (960)
|
|
60
|
-
- Third child: parent `x` + 480 (1200)
|
|
61
|
-
|
|
62
|
-
## Position Template
|
|
63
|
-
|
|
64
|
-
```json
|
|
65
|
-
{
|
|
66
|
-
"position": { "x": 0, "y": 0 }
|
|
67
|
-
}
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
Quick reference for a 5-node spine with one drill-down each:
|
|
71
|
-
|
|
72
|
-
| Node | x | y | Role |
|
|
73
|
-
|---|---|---|---|
|
|
74
|
-
| cover | 0 | 0 | Spine 1 |
|
|
75
|
-
| problem | 240 | 0 | Spine 2 |
|
|
76
|
-
| problem-detail | 240 | 150 | Drill-down under problem |
|
|
77
|
-
| solution | 480 | 0 | Spine 3 |
|
|
78
|
-
| solution-how | 480 | 150 | Drill-down under solution |
|
|
79
|
-
| value | 720 | 0 | Spine 4 |
|
|
80
|
-
| value-case | 720 | 150 | Drill-down under value |
|
|
81
|
-
| cta | 960 | 0 | Spine 5 |
|
|
82
|
-
|
|
83
|
-
## Rules
|
|
84
|
-
|
|
85
|
-
1. Position reflects visual layout in the editor — it has no effect on navigation
|
|
86
|
-
2. Navigation is determined solely by edges and their handle assignments
|
|
87
|
-
3. Spine nodes must be at `y: 0` for visual clarity
|
|
88
|
-
4. Drill-downs must be below their parent for the folder-tree metaphor to hold
|
|
89
|
-
5. No two nodes should overlap (maintain at least 240px horizontal, 150px vertical separation)
|