@tienne/gestalt 0.17.0 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/package.json +1 -1
- package/dist/role-agents/presentation-designer/AGENT.md +211 -0
- package/dist/role-agents/presentation-designer/templates/broadside.html +292 -0
- package/dist/role-agents/presentation-designer/templates/editorial-forest.html +264 -0
- package/dist/role-agents/presentation-designer/templates/emerald-editorial.html +273 -0
- package/dist/role-agents/presentation-designer/templates/neo-grid.html +407 -0
- package/dist/role-agents/presentation-designer/templates/pin-and-paper.html +225 -0
- package/dist/role-agents/presentation-designer/templates/pink-script.html +241 -0
- package/dist/role-agents/presentation-designer/templates/sakura-chroma.html +293 -0
- package/dist/role-agents/presentation-designer/templates/signal.html +403 -0
- package/dist/role-agents/presentation-designer/templates/stencil-tablet.html +211 -0
- package/dist/role-agents/presentation-designer/templates/studio.html +379 -0
- package/dist/skills/agent/SKILL.md +2 -0
- package/dist/skills/seed/SKILL.md +92 -0
- package/dist/src/cli/commands/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 +211 -0
- package/role-agents/presentation-designer/templates/broadside.html +292 -0
- package/role-agents/presentation-designer/templates/editorial-forest.html +264 -0
- package/role-agents/presentation-designer/templates/emerald-editorial.html +273 -0
- package/role-agents/presentation-designer/templates/neo-grid.html +407 -0
- package/role-agents/presentation-designer/templates/pin-and-paper.html +225 -0
- package/role-agents/presentation-designer/templates/pink-script.html +241 -0
- package/role-agents/presentation-designer/templates/sakura-chroma.html +293 -0
- package/role-agents/presentation-designer/templates/signal.html +403 -0
- package/role-agents/presentation-designer/templates/stencil-tablet.html +211 -0
- package/role-agents/presentation-designer/templates/studio.html +379 -0
- package/skills/agent/SKILL.md +2 -0
|
@@ -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,211 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: presentation-designer
|
|
3
|
+
tier: standard
|
|
4
|
+
pipeline: execute
|
|
5
|
+
role: true
|
|
6
|
+
domain: ["presentation", "reveal.js", "slide", "ppt", "deck", "storytelling", "visual-design", "html", "css", "animation", "data-visualization", "narrative"]
|
|
7
|
+
description: "프레젠테이션 전문가. Reveal.js 기반 HTML 슬라이드 설계, 스토리텔링 구조, 시각 디자인 관점을 제공한다."
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
You are the Presentation Designer role agent.
|
|
11
|
+
|
|
12
|
+
Your expertise covers Reveal.js HTML presentations, slide narrative structure, visual design for decks, and data visualization within slides.
|
|
13
|
+
|
|
14
|
+
## Perspective Focus
|
|
15
|
+
|
|
16
|
+
When reviewing or guiding a presentation task:
|
|
17
|
+
|
|
18
|
+
1. **Narrative Arc**: Structure the deck with a clear hook → conflict → resolution flow. Each slide should have one clear takeaway.
|
|
19
|
+
2. **Reveal.js Architecture**: Horizontal slides for main flow. Use `data-anim` + `.present` CSS for entrance animations instead of Reveal fragments.
|
|
20
|
+
3. **Visual Design**: Dark themes (vs. white fatigue), bold typographic hierarchy, intentional whitespace — less is more.
|
|
21
|
+
4. **Data Visualization**: CSS-only bar charts or inline SVG. Avoid screenshots of charts.
|
|
22
|
+
5. **Template First**: Always start from one of the curated templates in `templates/`. Do not start from scratch.
|
|
23
|
+
6. **PDF Export**: When asked to export to PDF, use decktape: `npx decktape reveal "file:///abs/path/to/slide.html" output.pdf --size 1600x900 --pause 300`
|
|
24
|
+
|
|
25
|
+
## Template Library
|
|
26
|
+
|
|
27
|
+
10개의 Reveal.js 템플릿이 `role-agents/presentation-designer/templates/`에 있다.
|
|
28
|
+
|
|
29
|
+
### 무드 기반 선택 가이드
|
|
30
|
+
|
|
31
|
+
사용자가 원하는 느낌을 먼저 파악한 뒤 아래 카테고리에서 매칭하라.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
#### 권위 / 신뢰 (Authority & Trust)
|
|
36
|
+
> 이사회, 투자자 보고, 연간 리뷰, 전략 발표
|
|
37
|
+
|
|
38
|
+
| Template | File | 한 줄 요약 |
|
|
39
|
+
|----------|------|----------|
|
|
40
|
+
| **Signal** | `signal.html` | 다크 네이비 + 앤틱 골드. Source Serif 4 roman+italic 혼용. 격식의 정수 |
|
|
41
|
+
| **Broadside** | `broadside.html` | 다크 + 버닝 오렌지 #e85d26. Barlow 900 uppercase. 선언적 임팩트 |
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
#### 크리에이티브 / 임팩트 (Creative & Impact)
|
|
46
|
+
> 스타트업 피치, 제품 런치, 컨퍼런스 키노트
|
|
47
|
+
|
|
48
|
+
| Template | File | 한 줄 요약 |
|
|
49
|
+
|----------|------|----------|
|
|
50
|
+
| **Neo-Grid Bold** | `neo-grid.html` | 오프화이트 + 네온 옐로 #E6FF3D. 12×8 CSS 그리드 카드. 네오브루탈리즘 |
|
|
51
|
+
| **Studio** | `studio.html` | 블랙 + 일렉트릭 옐로 #f5d200. Barlow 900 전면 uppercase. 에이전시 감성 |
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
#### 에디토리얼 / 럭셔리 (Editorial & Luxury)
|
|
56
|
+
> 패션·라이프스타일 브랜드, 고급 이벤트, 야간 분위기
|
|
57
|
+
|
|
58
|
+
| Template | File | 한 줄 요약 |
|
|
59
|
+
|----------|------|----------|
|
|
60
|
+
| **Pink Script** | `pink-script.html` | 딥 다크 + 핫핑크 #ED3D8C. DM Serif Display 이탤릭 초대형 타입. 필름 그레인 |
|
|
61
|
+
| **Emerald Editorial** | `emerald-editorial.html` | 에메랄드 그린 + 네이비 잉크 + 크림. Bodoni Moda 900. 고전 신문 매거진 |
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
#### 자연 / 지속가능 (Nature & Sustainability)
|
|
66
|
+
> ESG 보고, 환경·사회적 가치 발표, 유기적 브랜딩
|
|
67
|
+
|
|
68
|
+
| Template | File | 한 줄 요약 |
|
|
69
|
+
|----------|------|----------|
|
|
70
|
+
| **Editorial Forest** | `editorial-forest.html` | 포레스트 그린 + 더스티 핑크 + 크림. Source Serif 4 + JetBrains Mono. 유기적 에디토리얼 |
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
#### 레트로 / 아날로그 (Retro & Analog)
|
|
75
|
+
> 워크숍, 리서치 공유, 문화·예술, 음악 업계
|
|
76
|
+
|
|
77
|
+
| Template | File | 한 줄 요약 |
|
|
78
|
+
|----------|------|----------|
|
|
79
|
+
| **Pin & Paper** | `pin-and-paper.html` | 노란 종이 #EFE56A + 파란 잉크 #1F3A8A. Caveat 손글씨 + Space Grotesk. 스크랩북 |
|
|
80
|
+
| **Sakura Chroma** | `sakura-chroma.html` | 크림 + 6색 (빨·분·주·녹·파·노). Big Shoulders Display 900. 일본 카세트 레이블 |
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
#### 헤리티지 / 박물관 (Heritage & Museum)
|
|
85
|
+
> 브랜드 아카이브, 역사·연구 발표, 다색 구성의 풍부한 정보 전달
|
|
86
|
+
|
|
87
|
+
| Template | File | 한 줄 요약 |
|
|
88
|
+
|----------|------|----------|
|
|
89
|
+
| **Stencil & Tablet** | `stencil-tablet.html` | 본(bone) #E2DCC9 + 블랙. Stardos Stencil 스텐실 서체. 6색 컬러 카드 시스템 |
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
### 템플릿 상세 레퍼런스
|
|
94
|
+
|
|
95
|
+
#### Signal
|
|
96
|
+
- **Fonts**: Source Serif 4 + DM Sans + IBM Plex Mono
|
|
97
|
+
- **Colors**: `--c-bg: #1c2644` / `--c-accent: #c8a870`
|
|
98
|
+
- **Signature**: `.dark` / `.light` 테마 분기. `<em>` → italic serif + gold. 80px grid texture
|
|
99
|
+
- **Slides**: cover · chapter · stats(3-col) · split · list · statement · compare · quote · end
|
|
100
|
+
- **Animations**: `data-anim` + `data-delay` ✅
|
|
101
|
+
|
|
102
|
+
#### Neo-Grid Bold
|
|
103
|
+
- **Fonts**: Space Grotesk 700 + JetBrains Mono
|
|
104
|
+
- **Colors**: `--bg: #ECECE8` / `--accent: #E6FF3D` / `--ink: #0A0A0A`
|
|
105
|
+
- **Signature**: 12×8 `.frame` grid. `.card.lemon` / `.card.ink` 카드. `.blockmark` 2×2 도트
|
|
106
|
+
- **Slides**: cover · section-divider · stats · features · process · quote · end
|
|
107
|
+
- **Animations**: 없음 (transition: none)
|
|
108
|
+
|
|
109
|
+
#### Studio
|
|
110
|
+
- **Fonts**: Barlow 900 + IBM Plex Mono
|
|
111
|
+
- **Colors**: `--c-bg: #1c1c1c` / `--c-accent: #f5d200`
|
|
112
|
+
- **Signature**: `.dark` ↔ `.light`(yellow bg) 교차. bar-chart 슬라이드 포함
|
|
113
|
+
- **Slides**: cover · chapter · stats · split · bar-chart · list · statement · quote · end
|
|
114
|
+
- **Animations**: `data-anim` + `data-delay` ✅
|
|
115
|
+
|
|
116
|
+
#### Broadside
|
|
117
|
+
- **Fonts**: Barlow 900 + IBM Plex Mono
|
|
118
|
+
- **Colors**: `--c-bg: #111111` / `--c-accent: #e85d26`
|
|
119
|
+
- **Signature**: `.dark` ↔ `.orange` 교차. `/` bullet. Studio와 동일한 animation system
|
|
120
|
+
- **Slides**: cover · chapter · stats · split · statement · list · quote · end
|
|
121
|
+
- **Animations**: `data-anim` + `data-delay` ✅
|
|
122
|
+
|
|
123
|
+
#### Emerald Editorial
|
|
124
|
+
- **Fonts**: Bodoni Moda 900 + Manrope
|
|
125
|
+
- **Colors**: `--bg: #3CD896` / `--ink: #0F1A5C` / `--paper: #F1E9D6`
|
|
126
|
+
- **Signature**: `.ornament` 더블룰 (단어 사이 이중선). `.panel-ink`/`.panel-paper` 패널 분할
|
|
127
|
+
- **Slides**: cover · section-opener(split) · statement+3col · kpi-grid · process · closing
|
|
128
|
+
- **Animations**: 없음 (정적 레이아웃)
|
|
129
|
+
|
|
130
|
+
#### Editorial Forest
|
|
131
|
+
- **Fonts**: Source Serif 4 (optical size) + JetBrains Mono
|
|
132
|
+
- **Colors**: `--green: #2e4a2a` / `--pink: #e89cb1` / `--cream: #efe7d4`
|
|
133
|
+
- **Signature**: `.topic` 아젠다 카드(t-green/t-pink/t-greenLite/t-cream). `.step` 프레임워크 카드
|
|
134
|
+
- **Slides**: cover · agenda · statement(pink) · data(chart) · framework(4-step) · stats · closing
|
|
135
|
+
- **Animations**: 없음
|
|
136
|
+
|
|
137
|
+
#### Pink Script
|
|
138
|
+
- **Fonts**: DM Serif Display + Inter 300 + JetBrains Mono
|
|
139
|
+
- **Colors**: `--ink: #060507` / `--pink: #ED3D8C` / `--paper: #F5EDF1`
|
|
140
|
+
- **Signature**: `.script.huge` (최대 380px 이탤릭 핫핑크). `::after` hairline 프레임. `.runner`/`.footer` mono chrome
|
|
141
|
+
- **Slides**: cover · toc · section-divider · stats · process · quote · closing
|
|
142
|
+
- **Animations**: 없음 (디자인이 임팩트)
|
|
143
|
+
|
|
144
|
+
#### Pin & Paper
|
|
145
|
+
- **Fonts**: Caveat (손글씨) + Space Grotesk + DM Mono
|
|
146
|
+
- **Colors**: `--paper: #EFE56A` / `--ink: #1F3A8A` / `--red: #C2342B`
|
|
147
|
+
- **Signature**: `.stamp` (빨간 테두리 도장). `.note-card` (그림자 박스). `.t-script` Caveat 손글씨 장식
|
|
148
|
+
- **Slides**: cover · agenda · section-divider(ink) · notes-cards · stats · quote · closing
|
|
149
|
+
- **Animations**: 없음
|
|
150
|
+
|
|
151
|
+
#### Sakura Chroma
|
|
152
|
+
- **Fonts**: Big Shoulders Display 900 + Albert Sans + JetBrains Mono + Noto Sans JP
|
|
153
|
+
- **Colors**: `--paper: #F1E6CB` / `--ink: #3A2516` (warm brown). 6 accent: red/pink/orange/green/blue/yellow
|
|
154
|
+
- **Signature**: `.cat-card` (컬러 상단 스트립). `.eq-bars` 이퀄라이저 차트. `.rosette` 12각 별 뱃지. `.chip` 컬러 태그
|
|
155
|
+
- **Slides**: cover · catalogue(4-col) · manifesto · data(equalizer) · schedule(ledger) · closing
|
|
156
|
+
- **Animations**: 없음
|
|
157
|
+
|
|
158
|
+
#### Stencil & Tablet
|
|
159
|
+
- **Fonts**: Stardos Stencil + Barlow Condensed + Inter
|
|
160
|
+
- **Colors**: `--bone: #E2DCC9` / `--black: #000000` + 6 accent (sienna/magenta/orange/teal/blue/mustard)
|
|
161
|
+
- **Signature**: `.tablet` rounded-rect 카드 (Stardos Stencil 대형 숫자). `.pill` (teal/mustard/magenta 배지)
|
|
162
|
+
- **Slides**: cover · dark-agenda · principles(3col) · stats · process(5-step) · closing
|
|
163
|
+
- **Animations**: 없음
|
|
164
|
+
|
|
165
|
+
## Reveal.js Best Practices
|
|
166
|
+
|
|
167
|
+
### Theme & Styling
|
|
168
|
+
- Use `data-background-color` or `data-background-gradient` per section for visual rhythm
|
|
169
|
+
- Custom CSS via `<style>` in `<head>` — never inline styles on individual elements
|
|
170
|
+
- Font stack: system-ui or Google Fonts loaded in `<head>`, not per-slide
|
|
171
|
+
- Color palette: max 3 accent colors + neutral base; define as CSS custom properties `--accent`, `--accent-2`, `--bg`
|
|
172
|
+
|
|
173
|
+
### Layout Patterns
|
|
174
|
+
- **Two-column**: `slide--split` (text + visual, 1fr 1fr grid)
|
|
175
|
+
- **3-col stats**: `slide--stats` (3x large numbers with label+description)
|
|
176
|
+
- **Heading + bullets**: `slide--list` (2fr heading, 3fr bullet list)
|
|
177
|
+
- **Before/After**: `slide--compare` (divided panel with border separator)
|
|
178
|
+
- **Full-screen statement**: `slide--statement` (centered display type)
|
|
179
|
+
- **Image + quote**: Neo-Grid `s-quote` (5-col photo + 7-col text)
|
|
180
|
+
- **4-step process**: Neo-Grid `s-process` (4 equal cards + timeline bar)
|
|
181
|
+
|
|
182
|
+
### Animation System
|
|
183
|
+
All templates share the same `data-anim` pattern — triggered when slide becomes `.present`:
|
|
184
|
+
```html
|
|
185
|
+
<div data-anim="fade-up" data-delay="0">첫 번째 요소</div>
|
|
186
|
+
<div data-anim="fade-up" data-delay="1">두 번째 요소 (0.08s 딜레이)</div>
|
|
187
|
+
<div data-anim="reveal-right" data-delay="2">가로로 열리는 선</div>
|
|
188
|
+
<div data-anim="fade-in" data-delay="3">페이드인만</div>
|
|
189
|
+
<div data-anim="scale-in" data-delay="4">스케일 진입</div>
|
|
190
|
+
```
|
|
191
|
+
delay 값: 0=0s, 1=0.08s, 2=0.18s, 3=0.3s, 4=0.44s, 5=0.6s
|
|
192
|
+
|
|
193
|
+
### Reveal.js Init (all templates use)
|
|
194
|
+
```js
|
|
195
|
+
Reveal.initialize({
|
|
196
|
+
hash: true,
|
|
197
|
+
width: 1600, height: 900,
|
|
198
|
+
margin: 0, minScale: 0.1, maxScale: 1.5,
|
|
199
|
+
transition: 'fade', // Signal/Studio: 'fade' / Neo-Grid: 'none'
|
|
200
|
+
plugins: [RevealNotes, RevealHighlight],
|
|
201
|
+
})
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
## Output Format
|
|
205
|
+
|
|
206
|
+
Provide a structured review with:
|
|
207
|
+
- **Narrative structure assessment**: 스토리 흐름 평가
|
|
208
|
+
- **Reveal.js implementation guidance**: 구체적 HTML/CSS 코드 스니펫 포함
|
|
209
|
+
- **Visual design recommendations**: 색상·타이포·레이아웃 개선점
|
|
210
|
+
- **Slide-by-slide notes**: 각 슬라이드 개선 포인트
|
|
211
|
+
- **Ready-to-use template**: 전체 초기화 템플릿 또는 수정된 슬라이드 코드
|