@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.
- package/dist/package.json +1 -1
- package/dist/role-agents/presentation-designer/AGENT.md +262 -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/role-agents/technical-writer/AGENT.md +38 -0
- package/dist/skills/agent/SKILL.md +2 -0
- package/dist/skills/seed/SKILL.md +92 -0
- package/dist/src/cli/commands/monitor.d.ts +2 -0
- package/dist/src/cli/commands/monitor.d.ts.map +1 -0
- package/dist/src/cli/commands/monitor.js +13 -0
- package/dist/src/cli/commands/monitor.js.map +1 -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/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/dist/src/tui/components/TUIApp.d.ts +20 -0
- package/dist/src/tui/components/TUIApp.d.ts.map +1 -0
- package/dist/src/tui/components/TUIApp.js +84 -0
- package/dist/src/tui/components/TUIApp.js.map +1 -0
- package/dist/src/tui/hooks/event-store-reader.d.ts +28 -0
- package/dist/src/tui/hooks/event-store-reader.d.ts.map +1 -0
- package/dist/src/tui/hooks/event-store-reader.js +141 -0
- package/dist/src/tui/hooks/event-store-reader.js.map +1 -0
- package/dist/src/tui/hooks/useEventStorePoller.d.ts +12 -0
- package/dist/src/tui/hooks/useEventStorePoller.d.ts.map +1 -0
- package/dist/src/tui/hooks/useEventStorePoller.js +84 -0
- package/dist/src/tui/hooks/useEventStorePoller.js.map +1 -0
- package/dist/src/tui/screens/DashboardScreen.d.ts +4 -0
- package/dist/src/tui/screens/DashboardScreen.d.ts.map +1 -0
- package/dist/src/tui/screens/DashboardScreen.js +132 -0
- package/dist/src/tui/screens/DashboardScreen.js.map +1 -0
- package/dist/src/tui/screens/DebugScreen.d.ts +4 -0
- package/dist/src/tui/screens/DebugScreen.d.ts.map +1 -0
- package/dist/src/tui/screens/DebugScreen.js +40 -0
- package/dist/src/tui/screens/DebugScreen.js.map +1 -0
- package/dist/src/tui/screens/EvolutionScreen.d.ts +4 -0
- package/dist/src/tui/screens/EvolutionScreen.d.ts.map +1 -0
- package/dist/src/tui/screens/EvolutionScreen.js +136 -0
- package/dist/src/tui/screens/EvolutionScreen.js.map +1 -0
- package/dist/src/tui/screens/HUDPanel.d.ts +4 -0
- package/dist/src/tui/screens/HUDPanel.d.ts.map +1 -0
- package/dist/src/tui/screens/HUDPanel.js +13 -0
- package/dist/src/tui/screens/HUDPanel.js.map +1 -0
- package/dist/src/tui/screens/InterviewScreen.d.ts +4 -0
- package/dist/src/tui/screens/InterviewScreen.d.ts.map +1 -0
- package/dist/src/tui/screens/InterviewScreen.js +103 -0
- package/dist/src/tui/screens/InterviewScreen.js.map +1 -0
- package/dist/src/tui/screens/LogScreen.d.ts +4 -0
- package/dist/src/tui/screens/LogScreen.d.ts.map +1 -0
- package/dist/src/tui/screens/LogScreen.js +83 -0
- package/dist/src/tui/screens/LogScreen.js.map +1 -0
- package/dist/src/tui/screens/SessionListScreen.d.ts +4 -0
- package/dist/src/tui/screens/SessionListScreen.d.ts.map +1 -0
- package/dist/src/tui/screens/SessionListScreen.js +71 -0
- package/dist/src/tui/screens/SessionListScreen.js.map +1 -0
- package/dist/src/tui/screens/SpecViewerScreen.d.ts +4 -0
- package/dist/src/tui/screens/SpecViewerScreen.d.ts.map +1 -0
- package/dist/src/tui/screens/SpecViewerScreen.js +73 -0
- package/dist/src/tui/screens/SpecViewerScreen.js.map +1 -0
- package/dist/src/tui/widgets/DriftMeter.d.ts +15 -0
- package/dist/src/tui/widgets/DriftMeter.d.ts.map +1 -0
- package/dist/src/tui/widgets/DriftMeter.js +27 -0
- package/dist/src/tui/widgets/DriftMeter.js.map +1 -0
- package/dist/src/tui/widgets/GestaltPrincipleBar.d.ts +9 -0
- package/dist/src/tui/widgets/GestaltPrincipleBar.d.ts.map +1 -0
- package/dist/src/tui/widgets/GestaltPrincipleBar.js +35 -0
- package/dist/src/tui/widgets/GestaltPrincipleBar.js.map +1 -0
- package/dist/src/tui/widgets/TaskDAGTree.d.ts +15 -0
- package/dist/src/tui/widgets/TaskDAGTree.d.ts.map +1 -0
- package/dist/src/tui/widgets/TaskDAGTree.js +54 -0
- package/dist/src/tui/widgets/TaskDAGTree.js.map +1 -0
- package/package.json +1 -1
- package/role-agents/presentation-designer/AGENT.md +262 -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/role-agents/technical-writer/AGENT.md +38 -0
- package/skills/agent/SKILL.md +2 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo } from 'react';
|
|
3
|
+
import { Box, Text } from 'ink';
|
|
4
|
+
function parseSpecEvents(events, sessionId) {
|
|
5
|
+
if (!sessionId)
|
|
6
|
+
return null;
|
|
7
|
+
// Spec events may be tied to the interview session or an execute session
|
|
8
|
+
// Look for SPEC_GENERATED events across all events matching the session
|
|
9
|
+
const specEvents = events.filter((e) => e.eventType === 'spec.generated' &&
|
|
10
|
+
(e.aggregateId === sessionId || hasMatchingSessionId(e, sessionId)));
|
|
11
|
+
if (specEvents.length === 0)
|
|
12
|
+
return null;
|
|
13
|
+
// Use the latest spec event
|
|
14
|
+
const latestSpec = specEvents[specEvents.length - 1];
|
|
15
|
+
if (!latestSpec)
|
|
16
|
+
return null;
|
|
17
|
+
const payload = latestSpec.payload;
|
|
18
|
+
// The spec may be nested under "spec" or at the top level
|
|
19
|
+
const spec = payload.spec ?? payload;
|
|
20
|
+
const ontology = spec.ontologySchema ?? {};
|
|
21
|
+
return {
|
|
22
|
+
goal: spec.goal ?? '',
|
|
23
|
+
constraints: spec.constraints ?? [],
|
|
24
|
+
acceptanceCriteria: spec.acceptanceCriteria ?? [],
|
|
25
|
+
entities: ontology.entities ?? [],
|
|
26
|
+
relations: ontology.relations ?? [],
|
|
27
|
+
gestaltAnalysis: spec.gestaltAnalysis ?? [],
|
|
28
|
+
generatedAt: latestSpec.timestamp,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function hasMatchingSessionId(event, sessionId) {
|
|
32
|
+
const payload = event.payload;
|
|
33
|
+
return (payload.interviewSessionId === sessionId ||
|
|
34
|
+
payload.sessionId === sessionId);
|
|
35
|
+
}
|
|
36
|
+
const PRINCIPLE_COLORS = {
|
|
37
|
+
closure: 'magenta',
|
|
38
|
+
proximity: 'blue',
|
|
39
|
+
similarity: 'yellow',
|
|
40
|
+
figure_ground: 'green',
|
|
41
|
+
continuity: 'cyan',
|
|
42
|
+
};
|
|
43
|
+
export function SpecViewerScreen({ events, selectedSessionId, }) {
|
|
44
|
+
const spec = useMemo(() => parseSpecEvents(events, selectedSessionId), [events, selectedSessionId]);
|
|
45
|
+
if (!selectedSessionId) {
|
|
46
|
+
return (_jsxs(Box, { flexDirection: "column", alignItems: "center", justifyContent: "center", minHeight: 10, children: [_jsx(Text, { bold: true, color: "yellow", children: "No session selected" }), _jsx(Text, { dimColor: true, children: "Press 1 to go to Sessions and select one." })] }));
|
|
47
|
+
}
|
|
48
|
+
if (!spec) {
|
|
49
|
+
return (_jsxs(Box, { flexDirection: "column", alignItems: "center", justifyContent: "center", minHeight: 10, children: [_jsx(Text, { bold: true, color: "yellow", children: "No spec found" }), _jsx(Text, { dimColor: true, children: "No SPEC_GENERATED event found for this session." })] }));
|
|
50
|
+
}
|
|
51
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { marginBottom: 1, gap: 1, children: [_jsx(Text, { bold: true, children: "Spec Viewer" }), _jsxs(Text, { dimColor: true, children: ["| generated: ", formatTimestamp(spec.generatedAt)] })] }), _jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: "Goal" }), _jsx(Box, { paddingLeft: 2, children: _jsx(Text, { children: spec.goal }) })] }), _jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { bold: true, color: "yellow", children: "Constraints" }), _jsxs(Text, { dimColor: true, children: ["(", spec.constraints.length, ")"] })] }), spec.constraints.map((c, i) => (_jsxs(Box, { paddingLeft: 2, children: [_jsx(Text, { color: "yellow", children: "- " }), _jsx(Text, { children: truncate(c, 80) })] }, i)))] }), _jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { bold: true, color: "green", children: "Acceptance Criteria" }), _jsxs(Text, { dimColor: true, children: ["(", spec.acceptanceCriteria.length, ")"] })] }), spec.acceptanceCriteria.map((ac, i) => (_jsxs(Box, { paddingLeft: 2, children: [_jsxs(Text, { color: "green", children: [i + 1, ". "] }), _jsx(Text, { children: truncate(ac, 78) })] }, i)))] }), _jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { bold: true, color: "magenta", children: "Ontology" }), _jsxs(Text, { dimColor: true, children: ["(", spec.entities.length, " entities, ", spec.relations.length, " relations)"] })] }), spec.entities.length > 0 && (_jsxs(Box, { flexDirection: "column", paddingLeft: 2, children: [_jsx(Text, { bold: true, dimColor: true, children: "Entities:" }), spec.entities.map((entity) => (_jsxs(Box, { paddingLeft: 2, flexDirection: "column", children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { color: "magenta", children: entity.name }), _jsxs(Text, { dimColor: true, children: ["- ", truncate(entity.description, 50)] })] }), entity.attributes.length > 0 && (_jsx(Box, { paddingLeft: 2, children: _jsxs(Text, { dimColor: true, children: ["attrs: ", entity.attributes.join(', ')] }) }))] }, entity.name)))] })), spec.relations.length > 0 && (_jsxs(Box, { flexDirection: "column", paddingLeft: 2, marginTop: 1, children: [_jsx(Text, { bold: true, dimColor: true, children: "Relations:" }), spec.relations.map((rel, i) => (_jsxs(Box, { paddingLeft: 2, gap: 1, children: [_jsx(Text, { color: "magenta", children: rel.from }), _jsxs(Text, { dimColor: true, children: ["--[", rel.type, "]--", '>'] }), _jsx(Text, { color: "magenta", children: rel.to })] }, i)))] }))] }), spec.gestaltAnalysis.length > 0 && (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { bold: true, color: "blue", children: "Gestalt Analysis" }), _jsxs(Text, { dimColor: true, children: ["(", spec.gestaltAnalysis.length, ")"] })] }), spec.gestaltAnalysis.map((ga, i) => (_jsxs(Box, { paddingLeft: 2, gap: 1, children: [_jsxs(Text, { color: PRINCIPLE_COLORS[ga.principle] ?? 'gray', children: ["[", ga.principle, "]"] }), _jsx(Text, { children: truncate(ga.finding, 60) }), _jsxs(Text, { dimColor: true, children: ["(", (ga.confidence * 100).toFixed(0), "%)"] })] }, i)))] }))] }));
|
|
52
|
+
}
|
|
53
|
+
function truncate(str, max) {
|
|
54
|
+
if (str.length <= max)
|
|
55
|
+
return str;
|
|
56
|
+
return str.slice(0, max - 3) + '...';
|
|
57
|
+
}
|
|
58
|
+
function formatTimestamp(ts) {
|
|
59
|
+
try {
|
|
60
|
+
const d = new Date(ts);
|
|
61
|
+
return d.toLocaleString('en-US', {
|
|
62
|
+
month: 'short',
|
|
63
|
+
day: '2-digit',
|
|
64
|
+
hour: '2-digit',
|
|
65
|
+
minute: '2-digit',
|
|
66
|
+
hour12: false,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return ts.slice(0, 19);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=SpecViewerScreen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpecViewerScreen.js","sourceRoot":"","sources":["../../../../src/tui/screens/SpecViewerScreen.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface DriftDimension {
|
|
3
|
+
name: string;
|
|
4
|
+
score: number;
|
|
5
|
+
weight: number;
|
|
6
|
+
}
|
|
7
|
+
interface DriftMeterProps {
|
|
8
|
+
dimensions: DriftDimension[];
|
|
9
|
+
overall: number;
|
|
10
|
+
threshold: number;
|
|
11
|
+
barWidth?: number;
|
|
12
|
+
}
|
|
13
|
+
export declare function DriftMeter({ dimensions, overall, threshold, barWidth, }: DriftMeterProps): React.ReactElement;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=DriftMeter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DriftMeter.d.ts","sourceRoot":"","sources":["../../../../src/tui/widgets/DriftMeter.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,eAAe;IACvB,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAQD,wBAAgB,UAAU,CAAC,EACzB,UAAU,EACV,OAAO,EACP,SAAS,EACT,QAAa,GACd,EAAE,eAAe,GAAG,KAAK,CAAC,YAAY,CAyCtC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
const DIMENSION_COLORS = {
|
|
4
|
+
goal: 'blue',
|
|
5
|
+
constraint: 'magenta',
|
|
6
|
+
ontology: 'yellow',
|
|
7
|
+
};
|
|
8
|
+
export function DriftMeter({ dimensions, overall, threshold, barWidth = 20, }) {
|
|
9
|
+
const overThreshold = overall > threshold;
|
|
10
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { gap: 1, marginBottom: 1, children: [_jsx(Text, { bold: true, children: "Drift" }), _jsxs(Text, { color: overThreshold ? 'red' : 'green', bold: true, children: [(overall * 100).toFixed(0), "%"] }), _jsxs(Text, { dimColor: true, children: ["threshold: ", (threshold * 100).toFixed(0), "%"] })] }), dimensions.map((dim) => {
|
|
11
|
+
const dimOver = dim.score > threshold;
|
|
12
|
+
const color = DIMENSION_COLORS[dim.name] ?? 'white';
|
|
13
|
+
return (_jsxs(Box, { gap: 1, children: [_jsx(Box, { width: 12, children: _jsx(Text, { color: color, children: padRight(dim.name, 11) }) }), _jsx(Text, { children: renderBar(dim.score, barWidth, dimOver) }), _jsxs(Text, { color: dimOver ? 'red' : 'green', children: [(dim.score * 100).toFixed(0), "%"] }), _jsxs(Text, { dimColor: true, children: ["(", (dim.weight * 100).toFixed(0), "%w)"] })] }, dim.name));
|
|
14
|
+
}), overThreshold && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "red", bold: true, children: "WARNING: Drift exceeds threshold!" }) }))] }));
|
|
15
|
+
}
|
|
16
|
+
function renderBar(score, width, over) {
|
|
17
|
+
const filled = Math.round(score * width);
|
|
18
|
+
const empty = width - filled;
|
|
19
|
+
const fillChar = over ? '#' : '=';
|
|
20
|
+
return '[' + fillChar.repeat(filled) + ' '.repeat(empty) + ']';
|
|
21
|
+
}
|
|
22
|
+
function padRight(str, len) {
|
|
23
|
+
if (str.length >= len)
|
|
24
|
+
return str;
|
|
25
|
+
return str + ' '.repeat(len - str.length);
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=DriftMeter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DriftMeter.js","sourceRoot":"","sources":["../../../../src/tui/widgets/DriftMeter.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export type PrinciplePhase = 'figure_ground' | 'closure' | 'proximity' | 'continuity';
|
|
3
|
+
interface GestaltPrincipleBarProps {
|
|
4
|
+
currentPhase: PrinciplePhase | null;
|
|
5
|
+
completedPhases: PrinciplePhase[];
|
|
6
|
+
}
|
|
7
|
+
export declare function GestaltPrincipleBar({ currentPhase, completedPhases, }: GestaltPrincipleBarProps): React.ReactElement;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=GestaltPrincipleBar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GestaltPrincipleBar.d.ts","sourceRoot":"","sources":["../../../../src/tui/widgets/GestaltPrincipleBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,MAAM,cAAc,GAAG,eAAe,GAAG,SAAS,GAAG,WAAW,GAAG,YAAY,CAAC;AA4BtF,UAAU,wBAAwB;IAChC,YAAY,EAAE,cAAc,GAAG,IAAI,CAAC;IACpC,eAAe,EAAE,cAAc,EAAE,CAAC;CACnC;AAED,wBAAgB,mBAAmB,CAAC,EAClC,YAAY,EACZ,eAAe,GAChB,EAAE,wBAAwB,GAAG,KAAK,CAAC,YAAY,CAuC/C"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { Box, Text } from 'ink';
|
|
4
|
+
const PHASES = [
|
|
5
|
+
{ key: 'figure_ground', label: 'Figure-Ground' },
|
|
6
|
+
{ key: 'closure', label: 'Closure' },
|
|
7
|
+
{ key: 'proximity', label: 'Proximity' },
|
|
8
|
+
{ key: 'continuity', label: 'Continuity' },
|
|
9
|
+
];
|
|
10
|
+
const STATUS_COLORS = {
|
|
11
|
+
completed: 'green',
|
|
12
|
+
active: 'cyan',
|
|
13
|
+
pending: 'gray',
|
|
14
|
+
};
|
|
15
|
+
const STATUS_ICONS = {
|
|
16
|
+
completed: '[x]',
|
|
17
|
+
active: '[>]',
|
|
18
|
+
pending: '[ ]',
|
|
19
|
+
};
|
|
20
|
+
export function GestaltPrincipleBar({ currentPhase, completedPhases, }) {
|
|
21
|
+
function getStatus(phase) {
|
|
22
|
+
if (completedPhases.includes(phase))
|
|
23
|
+
return 'completed';
|
|
24
|
+
if (phase === currentPhase)
|
|
25
|
+
return 'active';
|
|
26
|
+
return 'pending';
|
|
27
|
+
}
|
|
28
|
+
const completedCount = completedPhases.length;
|
|
29
|
+
const totalCount = PHASES.length;
|
|
30
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { gap: 1, marginBottom: 1, children: [_jsx(Text, { bold: true, children: "Gestalt Phases" }), _jsxs(Text, { dimColor: true, children: ["(", completedCount, "/", totalCount, ")"] })] }), _jsx(Box, { gap: 1, children: PHASES.map((phase, index) => {
|
|
31
|
+
const status = getStatus(phase.key);
|
|
32
|
+
return (_jsxs(React.Fragment, { children: [_jsx(Box, { children: _jsxs(Text, { color: STATUS_COLORS[status], bold: status === 'active', children: [STATUS_ICONS[status], " ", phase.label] }) }), index < PHASES.length - 1 && (_jsx(Text, { color: completedPhases.includes(phase.key) ? 'green' : 'gray', children: ' -> ' }))] }, phase.key));
|
|
33
|
+
}) })] }));
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=GestaltPrincipleBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GestaltPrincipleBar.js","sourceRoot":"","sources":["../../../../src/tui/widgets/GestaltPrincipleBar.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAWhC,MAAM,MAAM,GAAgB;IAC1B,EAAE,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAE;IAChD,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;IACpC,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE;IACxC,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE;CAC3C,CAAC;AAEF,MAAM,aAAa,GAAgC;IACjD,SAAS,EAAE,OAAO;IAClB,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,MAAM;CAChB,CAAC;AAEF,MAAM,YAAY,GAAgC;IAChD,SAAS,EAAE,KAAK;IAChB,MAAM,EAAE,KAAK;IACb,OAAO,EAAE,KAAK;CACf,CAAC;AAOF,MAAM,UAAU,mBAAmB,CAAC,EAClC,YAAY,EACZ,eAAe,GACU;IACzB,SAAS,SAAS,CAAC,KAAqB;QACtC,IAAI,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,WAAW,CAAC;QACxD,IAAI,KAAK,KAAK,YAAY;YAAE,OAAO,QAAQ,CAAC;QAC5C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,cAAc,GAAG,eAAe,CAAC,MAAM,CAAC;IAC9C,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC;IAEjC,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,MAAC,GAAG,IAAC,GAAG,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,aAC1B,KAAC,IAAI,IAAC,IAAI,qCAAsB,EAChC,MAAC,IAAI,IAAC,QAAQ,wBACV,cAAc,OAAG,UAAU,SACxB,IACH,EACN,KAAC,GAAG,IAAC,GAAG,EAAE,CAAC,YACR,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;oBAC3B,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBACpC,OAAO,CACL,MAAC,KAAK,CAAC,QAAQ,eACb,KAAC,GAAG,cACF,MAAC,IAAI,IAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,KAAK,QAAQ,aAC1D,YAAY,CAAC,MAAM,CAAC,OAAG,KAAK,CAAC,KAAK,IAC9B,GACH,EACL,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAC5B,KAAC,IAAI,IAAC,KAAK,EAAE,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,YAChE,MAAM,GACF,CACR,KAVkB,KAAK,CAAC,GAAG,CAWb,CAClB,CAAC;gBACJ,CAAC,CAAC,GACE,IACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export type TaskStatus = 'pending' | 'in_progress' | 'completed' | 'failed' | 'skipped';
|
|
3
|
+
export interface TaskNode {
|
|
4
|
+
id: string;
|
|
5
|
+
title: string;
|
|
6
|
+
status: TaskStatus;
|
|
7
|
+
dependsOn: string[];
|
|
8
|
+
}
|
|
9
|
+
interface TaskDAGTreeProps {
|
|
10
|
+
tasks: TaskNode[];
|
|
11
|
+
maxHeight?: number;
|
|
12
|
+
}
|
|
13
|
+
export declare function TaskDAGTree({ tasks, maxHeight }: TaskDAGTreeProps): React.ReactElement;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=TaskDAGTree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskDAGTree.d.ts","sourceRoot":"","sources":["../../../../src/tui/widgets/TaskDAGTree.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;AAExF,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAkBD,UAAU,gBAAgB;IACxB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,gBAAgB,GAAG,KAAK,CAAC,YAAY,CAwCtF"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
const STATUS_ICONS = {
|
|
4
|
+
pending: 'o',
|
|
5
|
+
in_progress: '>',
|
|
6
|
+
completed: 'v',
|
|
7
|
+
failed: 'x',
|
|
8
|
+
skipped: '-',
|
|
9
|
+
};
|
|
10
|
+
const STATUS_COLORS = {
|
|
11
|
+
pending: 'gray',
|
|
12
|
+
in_progress: 'cyan',
|
|
13
|
+
completed: 'green',
|
|
14
|
+
failed: 'red',
|
|
15
|
+
skipped: 'yellow',
|
|
16
|
+
};
|
|
17
|
+
export function TaskDAGTree({ tasks, maxHeight }) {
|
|
18
|
+
const completedCount = tasks.filter((t) => t.status === 'completed').length;
|
|
19
|
+
const failedCount = tasks.filter((t) => t.status === 'failed').length;
|
|
20
|
+
const totalCount = tasks.length;
|
|
21
|
+
const layers = buildLayers(tasks);
|
|
22
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { gap: 1, marginBottom: 1, children: [_jsx(Text, { bold: true, children: "Task DAG" }), _jsxs(Text, { color: "green", children: [completedCount, "v"] }), failedCount > 0 && _jsxs(Text, { color: "red", children: [failedCount, "x"] }), _jsxs(Text, { dimColor: true, children: [completedCount, "/", totalCount] })] }), _jsx(Box, { flexDirection: "column", height: maxHeight, children: layers.map((layer, layerIdx) => (_jsxs(Box, { flexDirection: "column", children: [layerIdx > 0 && (_jsx(Text, { dimColor: true, children: " |" })), layer.map((task) => (_jsxs(Box, { paddingLeft: 1, children: [_jsx(Text, { color: STATUS_COLORS[task.status], children: STATUS_ICONS[task.status] }), _jsxs(Text, { color: STATUS_COLORS[task.status], bold: task.status === 'in_progress', children: [' ', task.id] }), _jsxs(Text, { dimColor: true, children: [" ", truncate(task.title, 40)] })] }, task.id)))] }, layerIdx))) })] }));
|
|
23
|
+
}
|
|
24
|
+
function buildLayers(tasks) {
|
|
25
|
+
if (tasks.length === 0)
|
|
26
|
+
return [];
|
|
27
|
+
const taskMap = new Map(tasks.map((t) => [t.id, t]));
|
|
28
|
+
const layers = [];
|
|
29
|
+
const placed = new Set();
|
|
30
|
+
// Kahn's algorithm for layer assignment
|
|
31
|
+
while (placed.size < tasks.length) {
|
|
32
|
+
const layer = [];
|
|
33
|
+
for (const task of tasks) {
|
|
34
|
+
if (placed.has(task.id))
|
|
35
|
+
continue;
|
|
36
|
+
const depsPlaced = task.dependsOn.every((dep) => placed.has(dep) || !taskMap.has(dep));
|
|
37
|
+
if (depsPlaced) {
|
|
38
|
+
layer.push(task);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (layer.length === 0)
|
|
42
|
+
break; // cycle guard
|
|
43
|
+
for (const t of layer)
|
|
44
|
+
placed.add(t.id);
|
|
45
|
+
layers.push(layer);
|
|
46
|
+
}
|
|
47
|
+
return layers;
|
|
48
|
+
}
|
|
49
|
+
function truncate(str, max) {
|
|
50
|
+
if (str.length <= max)
|
|
51
|
+
return str;
|
|
52
|
+
return str.slice(0, max - 3) + '...';
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=TaskDAGTree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskDAGTree.js","sourceRoot":"","sources":["../../../../src/tui/widgets/TaskDAGTree.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -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**: 전체 초기화 템플릿 또는 수정된 슬라이드 코드
|