@portel/photon 1.14.0 → 1.16.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/auto-ui/beam/routes/api-config.d.ts.map +1 -1
- package/dist/auto-ui/beam/routes/api-config.js +29 -8
- package/dist/auto-ui/beam/routes/api-config.js.map +1 -1
- package/dist/auto-ui/beam/routes/api-marketplace.d.ts.map +1 -1
- package/dist/auto-ui/beam/routes/api-marketplace.js +3 -0
- package/dist/auto-ui/beam/routes/api-marketplace.js.map +1 -1
- package/dist/auto-ui/beam.d.ts.map +1 -1
- package/dist/auto-ui/beam.js +167 -48
- package/dist/auto-ui/beam.js.map +1 -1
- package/dist/auto-ui/bridge/index.d.ts.map +1 -1
- package/dist/auto-ui/bridge/index.js +578 -0
- package/dist/auto-ui/bridge/index.js.map +1 -1
- package/dist/auto-ui/bridge/renderers.d.ts.map +1 -1
- package/dist/auto-ui/bridge/renderers.js +7 -3
- package/dist/auto-ui/bridge/renderers.js.map +1 -1
- package/dist/auto-ui/bridge/types.d.ts +6 -0
- package/dist/auto-ui/bridge/types.d.ts.map +1 -1
- package/dist/auto-ui/frontend/pure-view.html +289 -0
- package/dist/auto-ui/photon-bridge.d.ts +11 -0
- package/dist/auto-ui/photon-bridge.d.ts.map +1 -1
- package/dist/auto-ui/photon-bridge.js +75 -1
- package/dist/auto-ui/photon-bridge.js.map +1 -1
- package/dist/auto-ui/streamable-http-transport.d.ts.map +1 -1
- package/dist/auto-ui/streamable-http-transport.js +29 -3
- package/dist/auto-ui/streamable-http-transport.js.map +1 -1
- package/dist/beam-form.bundle.js +5707 -0
- package/dist/beam-form.bundle.js.map +7 -0
- package/dist/beam.bundle.js +1947 -523
- package/dist/beam.bundle.js.map +4 -4
- package/dist/cli/commands/info.d.ts.map +1 -1
- package/dist/cli/commands/info.js +15 -2
- package/dist/cli/commands/info.js.map +1 -1
- package/dist/daemon/client.d.ts +5 -0
- package/dist/daemon/client.d.ts.map +1 -1
- package/dist/daemon/client.js +50 -0
- package/dist/daemon/client.js.map +1 -1
- package/dist/daemon/manager.d.ts +15 -0
- package/dist/daemon/manager.d.ts.map +1 -1
- package/dist/daemon/manager.js +142 -11
- package/dist/daemon/manager.js.map +1 -1
- package/dist/deploy/cloudflare.d.ts.map +1 -1
- package/dist/deploy/cloudflare.js +10 -2
- package/dist/deploy/cloudflare.js.map +1 -1
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +50 -3
- package/dist/loader.js.map +1 -1
- package/dist/marketplace-manager.d.ts +9 -0
- package/dist/marketplace-manager.d.ts.map +1 -1
- package/dist/marketplace-manager.js +115 -42
- package/dist/marketplace-manager.js.map +1 -1
- package/dist/meta.d.ts +51 -0
- package/dist/meta.d.ts.map +1 -0
- package/dist/meta.js +320 -0
- package/dist/meta.js.map +1 -0
- package/dist/photon-cli-runner.d.ts.map +1 -1
- package/dist/photon-cli-runner.js +30 -5
- package/dist/photon-cli-runner.js.map +1 -1
- package/dist/photon-doc-extractor.d.ts +1 -0
- package/dist/photon-doc-extractor.d.ts.map +1 -1
- package/dist/photon-doc-extractor.js +33 -21
- package/dist/photon-doc-extractor.js.map +1 -1
- package/dist/photons/docs/ui/docs.html +441 -0
- package/dist/photons/docs.photon.d.ts +237 -0
- package/dist/photons/docs.photon.d.ts.map +1 -0
- package/dist/photons/docs.photon.js +483 -0
- package/dist/photons/docs.photon.js.map +1 -0
- package/dist/photons/docs.photon.ts +536 -0
- package/dist/photons/slides.photon.d.ts +212 -0
- package/dist/photons/slides.photon.d.ts.map +1 -0
- package/dist/photons/slides.photon.js +355 -0
- package/dist/photons/slides.photon.js.map +1 -0
- package/dist/photons/slides.photon.ts +370 -0
- package/dist/photons/spreadsheet/ui/spreadsheet.html +779 -0
- package/dist/photons/spreadsheet.photon.d.ts +554 -0
- package/dist/photons/spreadsheet.photon.d.ts.map +1 -0
- package/dist/photons/spreadsheet.photon.js +1050 -0
- package/dist/photons/spreadsheet.photon.js.map +1 -0
- package/dist/photons/spreadsheet.photon.ts +1239 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +17 -57
- package/dist/server.js.map +1 -1
- package/dist/shared/error-handler.d.ts +8 -0
- package/dist/shared/error-handler.d.ts.map +1 -1
- package/dist/shared/error-handler.js +50 -0
- package/dist/shared/error-handler.js.map +1 -1
- package/dist/shared-utils.d.ts +3 -2
- package/dist/shared-utils.d.ts.map +1 -1
- package/dist/shared-utils.js +4 -3
- package/dist/shared-utils.js.map +1 -1
- package/package.json +7 -2
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
export default class Slides {
|
|
2
|
+
protected settings: {
|
|
3
|
+
/** @property Directory where slide markdown files are stored */
|
|
4
|
+
folder: string;
|
|
5
|
+
};
|
|
6
|
+
memory: {
|
|
7
|
+
get<T>(key: string): Promise<T | null>;
|
|
8
|
+
set(key: string, value: unknown): Promise<void>;
|
|
9
|
+
};
|
|
10
|
+
emit: (payload: {
|
|
11
|
+
event: string;
|
|
12
|
+
data: unknown;
|
|
13
|
+
}) => void;
|
|
14
|
+
instanceName: string;
|
|
15
|
+
private marp;
|
|
16
|
+
private get defaultFolder();
|
|
17
|
+
private get deckPath();
|
|
18
|
+
onInitialize(): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Open the presentation UI
|
|
21
|
+
* @ui dashboard
|
|
22
|
+
* @autorun
|
|
23
|
+
*/
|
|
24
|
+
main(): Promise<{
|
|
25
|
+
type: string;
|
|
26
|
+
html: any;
|
|
27
|
+
css: any;
|
|
28
|
+
total: any;
|
|
29
|
+
current: number;
|
|
30
|
+
markdown: string;
|
|
31
|
+
}>;
|
|
32
|
+
/**
|
|
33
|
+
* Move to the next slide
|
|
34
|
+
* @ui dashboard
|
|
35
|
+
*/
|
|
36
|
+
next(): Promise<{
|
|
37
|
+
type: string;
|
|
38
|
+
index: any;
|
|
39
|
+
isEnd: boolean;
|
|
40
|
+
}>;
|
|
41
|
+
/**
|
|
42
|
+
* Move to the previous slide
|
|
43
|
+
* @ui dashboard
|
|
44
|
+
*/
|
|
45
|
+
previous(): Promise<{
|
|
46
|
+
type: string;
|
|
47
|
+
index: any;
|
|
48
|
+
isStart: boolean;
|
|
49
|
+
}>;
|
|
50
|
+
/**
|
|
51
|
+
* Jump to a specific slide
|
|
52
|
+
* @param index 0-based slide index
|
|
53
|
+
* @ui dashboard
|
|
54
|
+
*/
|
|
55
|
+
go({ index }: {
|
|
56
|
+
index: number;
|
|
57
|
+
}): Promise<{
|
|
58
|
+
type: string;
|
|
59
|
+
index: any;
|
|
60
|
+
}>;
|
|
61
|
+
/**
|
|
62
|
+
* List saved decks in the slides folder
|
|
63
|
+
* @readOnly
|
|
64
|
+
*/
|
|
65
|
+
list(): Promise<{
|
|
66
|
+
folder: string;
|
|
67
|
+
decks: {
|
|
68
|
+
file: string;
|
|
69
|
+
title: string;
|
|
70
|
+
updatedAt: string;
|
|
71
|
+
}[];
|
|
72
|
+
}>;
|
|
73
|
+
/**
|
|
74
|
+
* Read the current deck's markdown
|
|
75
|
+
* @readOnly
|
|
76
|
+
*/
|
|
77
|
+
read(): Promise<{
|
|
78
|
+
file: string;
|
|
79
|
+
markdown: string;
|
|
80
|
+
}>;
|
|
81
|
+
/**
|
|
82
|
+
* Save markdown to the current deck
|
|
83
|
+
* @param markdown Full Marp markdown content
|
|
84
|
+
* @ui dashboard
|
|
85
|
+
*/
|
|
86
|
+
save({ markdown }: {
|
|
87
|
+
markdown: string;
|
|
88
|
+
}): Promise<{
|
|
89
|
+
type: string;
|
|
90
|
+
html: any;
|
|
91
|
+
css: any;
|
|
92
|
+
total: any;
|
|
93
|
+
current: number;
|
|
94
|
+
markdown: string;
|
|
95
|
+
}>;
|
|
96
|
+
/**
|
|
97
|
+
* Update the full markdown and re-render
|
|
98
|
+
* @param markdown New Marp markdown content
|
|
99
|
+
* @ui dashboard
|
|
100
|
+
*/
|
|
101
|
+
update({ markdown }: {
|
|
102
|
+
markdown: string;
|
|
103
|
+
}): Promise<{
|
|
104
|
+
type: string;
|
|
105
|
+
html: any;
|
|
106
|
+
css: any;
|
|
107
|
+
total: any;
|
|
108
|
+
current: number;
|
|
109
|
+
markdown: string;
|
|
110
|
+
}>;
|
|
111
|
+
/**
|
|
112
|
+
* Insert a new slide at a position
|
|
113
|
+
* @param markdown Slide content
|
|
114
|
+
* @param index Position to insert (appends if omitted)
|
|
115
|
+
* @ui dashboard
|
|
116
|
+
*/
|
|
117
|
+
add(params?: {
|
|
118
|
+
markdown?: string;
|
|
119
|
+
index?: number;
|
|
120
|
+
}): Promise<{
|
|
121
|
+
type: string;
|
|
122
|
+
html: any;
|
|
123
|
+
css: any;
|
|
124
|
+
total: any;
|
|
125
|
+
current: number;
|
|
126
|
+
markdown: string;
|
|
127
|
+
}>;
|
|
128
|
+
/**
|
|
129
|
+
* Replace a slide's content
|
|
130
|
+
* @param index Slide index
|
|
131
|
+
* @param markdown New content
|
|
132
|
+
* @ui dashboard
|
|
133
|
+
*/
|
|
134
|
+
edit({ index, markdown }: {
|
|
135
|
+
index: number;
|
|
136
|
+
markdown: string;
|
|
137
|
+
}): Promise<{
|
|
138
|
+
type: string;
|
|
139
|
+
html: any;
|
|
140
|
+
css: any;
|
|
141
|
+
total: any;
|
|
142
|
+
current: number;
|
|
143
|
+
markdown: string;
|
|
144
|
+
}>;
|
|
145
|
+
/**
|
|
146
|
+
* Reorder a slide
|
|
147
|
+
* @param from Source index
|
|
148
|
+
* @param to Target index
|
|
149
|
+
* @ui dashboard
|
|
150
|
+
*/
|
|
151
|
+
move({ from, to }: {
|
|
152
|
+
from: number;
|
|
153
|
+
to: number;
|
|
154
|
+
}): Promise<{
|
|
155
|
+
type: string;
|
|
156
|
+
html: any;
|
|
157
|
+
css: any;
|
|
158
|
+
total: any;
|
|
159
|
+
current: number;
|
|
160
|
+
markdown: string;
|
|
161
|
+
}>;
|
|
162
|
+
/**
|
|
163
|
+
* Delete a slide
|
|
164
|
+
* @param index Slide index
|
|
165
|
+
* @destructive
|
|
166
|
+
* @ui dashboard
|
|
167
|
+
*/
|
|
168
|
+
remove({ index }: {
|
|
169
|
+
index: number;
|
|
170
|
+
}): Promise<{
|
|
171
|
+
type: string;
|
|
172
|
+
html: any;
|
|
173
|
+
css: any;
|
|
174
|
+
total: any;
|
|
175
|
+
current: number;
|
|
176
|
+
markdown: string;
|
|
177
|
+
} | {
|
|
178
|
+
error: string;
|
|
179
|
+
}>;
|
|
180
|
+
/**
|
|
181
|
+
* Duplicate a slide
|
|
182
|
+
* @param index Slide index to copy
|
|
183
|
+
* @ui dashboard
|
|
184
|
+
*/
|
|
185
|
+
duplicate({ index }: {
|
|
186
|
+
index: number;
|
|
187
|
+
}): Promise<{
|
|
188
|
+
type: string;
|
|
189
|
+
html: any;
|
|
190
|
+
css: any;
|
|
191
|
+
total: any;
|
|
192
|
+
current: number;
|
|
193
|
+
markdown: string;
|
|
194
|
+
}>;
|
|
195
|
+
/**
|
|
196
|
+
* Current presentation state for AI context
|
|
197
|
+
* @readOnly
|
|
198
|
+
*/
|
|
199
|
+
status(): Promise<{
|
|
200
|
+
file: string;
|
|
201
|
+
currentSlide: any;
|
|
202
|
+
totalSlides: number;
|
|
203
|
+
currentContent: string;
|
|
204
|
+
nextSlidePreview: string | null;
|
|
205
|
+
markdown: string;
|
|
206
|
+
}>;
|
|
207
|
+
private readDeck;
|
|
208
|
+
private getState;
|
|
209
|
+
private renderResult;
|
|
210
|
+
private countSlides;
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=slides.photon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slides.photon.d.ts","sourceRoot":"","sources":["../../src/photons/slides.photon.ts"],"names":[],"mappings":"AAyCA,MAAM,CAAC,OAAO,OAAO,MAAM;IACzB,SAAS,CAAC,QAAQ;QAChB,gEAAgE;;MAEhE;IAEM,MAAM,EAAE;QACd,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACvC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KACjD,CAAC;IACM,IAAI,EAAE,CAAC,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;IAC1D,YAAY,EAAE,MAAM,CAAC;IAE7B,OAAO,CAAC,IAAI,CAAM;IAIlB,OAAO,KAAK,aAAa,GAExB;IAED,OAAO,KAAK,QAAQ,GAUnB;IAEK,YAAY;IAwBlB;;;;OAIG;IACG,IAAI;;;;;;;;IAMV;;;OAGG;IACG,IAAI;;;;;IAYV;;;OAGG;IACG,QAAQ;;;;;IAUd;;;;OAIG;IACG,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE;;;;IAYrC;;;OAGG;IACG,IAAI;;;;;;;;IAoBV;;;OAGG;IACG,IAAI;;;;IAIV;;;;OAIG;IACG,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE;;;;;;;;IAQ7C;;;;OAIG;IACG,MAAM,CAAC,EAAE,QAAQ,EAAE,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE;;;;;;;;IAM/C;;;;;OAKG;IACG,GAAG,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;;;;;;;;IAexD;;;;;OAKG;IACG,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;;;;;;;;IAYnE;;;;;OAKG;IACG,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE;;;;;;;;IAgBrD;;;;;OAKG;IACG,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE;;;;;;;;;;IAezC;;;;OAIG;IACG,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE;;;;;;;;IAe5C;;;OAGG;IACG,MAAM;;;;;;;;YAgBE,QAAQ;YAQR,QAAQ;IAItB,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,WAAW;CAIpB"}
|
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slides — AI-Native Presentation Tool
|
|
3
|
+
*
|
|
4
|
+
* Each instance is a deck: `_use('quarterly-review')` → `quarterly-review.md`.
|
|
5
|
+
* Pass a full path to open any markdown file: `_use('/path/to/deck.md')`.
|
|
6
|
+
*
|
|
7
|
+
* @version 1.0.0
|
|
8
|
+
* @runtime ^1.14.0
|
|
9
|
+
* @dependencies @marp-team/marp-core@^4.3.0
|
|
10
|
+
* @tags presentation, slides, markdown, marp, ai-control
|
|
11
|
+
* @icon 📽️
|
|
12
|
+
* @stateful
|
|
13
|
+
* @ui dashboard ./ui/slides.html
|
|
14
|
+
*/
|
|
15
|
+
import * as fs from 'fs/promises';
|
|
16
|
+
import { existsSync, mkdirSync } from 'fs';
|
|
17
|
+
import * as path from 'path';
|
|
18
|
+
import * as os from 'os';
|
|
19
|
+
const DEFAULT_DECK = `---
|
|
20
|
+
marp: true
|
|
21
|
+
theme: default
|
|
22
|
+
paginate: true
|
|
23
|
+
---
|
|
24
|
+
# AI-Native Slides
|
|
25
|
+
### Powered by Marp & Photon
|
|
26
|
+
---
|
|
27
|
+
# How it works
|
|
28
|
+
1. **AI Generates Marp Markdown**
|
|
29
|
+
2. **Photon Renders High-Fidelity CSS/HTML**
|
|
30
|
+
3. **UI Bridge Syncs the View**
|
|
31
|
+
---
|
|
32
|
+
# Try it!
|
|
33
|
+
Ask me to:
|
|
34
|
+
- "Add a slide about the benefits of AI"
|
|
35
|
+
- "Change the theme to 'gaia'"
|
|
36
|
+
- "Go to the next slide"
|
|
37
|
+
`;
|
|
38
|
+
let Marp;
|
|
39
|
+
export default class Slides {
|
|
40
|
+
settings = {
|
|
41
|
+
/** @property Directory where slide markdown files are stored */
|
|
42
|
+
folder: path.join(os.homedir(), 'Documents', 'slides'),
|
|
43
|
+
};
|
|
44
|
+
marp;
|
|
45
|
+
// ── File Resolution (same pattern as Spreadsheet) ───────────────────────
|
|
46
|
+
get defaultFolder() {
|
|
47
|
+
return this.settings?.folder || path.join(os.homedir(), 'Documents', 'slides');
|
|
48
|
+
}
|
|
49
|
+
get deckPath() {
|
|
50
|
+
const name = this.instanceName || 'slides';
|
|
51
|
+
if (path.isAbsolute(name))
|
|
52
|
+
return name.endsWith('.md') ? name : name + '.md';
|
|
53
|
+
if (name.includes('/') || name.includes('\\')) {
|
|
54
|
+
const resolved = path.resolve(name);
|
|
55
|
+
return resolved.endsWith('.md') ? resolved : resolved + '.md';
|
|
56
|
+
}
|
|
57
|
+
const dir = this.defaultFolder;
|
|
58
|
+
if (!existsSync(dir))
|
|
59
|
+
mkdirSync(dir, { recursive: true });
|
|
60
|
+
return path.join(dir, name.endsWith('.md') ? name : name + '.md');
|
|
61
|
+
}
|
|
62
|
+
async onInitialize() {
|
|
63
|
+
const marpId = '@marp-team/marp-core';
|
|
64
|
+
const marpModule = await import(/* webpackIgnore: true */ marpId);
|
|
65
|
+
Marp = marpModule.Marp || marpModule.default;
|
|
66
|
+
this.marp = new Marp({ container: false, inlineSVG: true, html: true });
|
|
67
|
+
// Ensure folder exists
|
|
68
|
+
const dir = this.defaultFolder;
|
|
69
|
+
if (!existsSync(dir))
|
|
70
|
+
mkdirSync(dir, { recursive: true });
|
|
71
|
+
// Create default deck if this is the default instance and file doesn't exist
|
|
72
|
+
if (!existsSync(this.deckPath)) {
|
|
73
|
+
await fs.writeFile(this.deckPath, DEFAULT_DECK, 'utf8');
|
|
74
|
+
}
|
|
75
|
+
// Initialize slide position if not stored
|
|
76
|
+
const state = await this.memory.get('state');
|
|
77
|
+
if (!state) {
|
|
78
|
+
await this.memory.set('state', { currentSlide: 0 });
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// ── Presentation ────────────────────────────────────────────────────────
|
|
82
|
+
/**
|
|
83
|
+
* Open the presentation UI
|
|
84
|
+
* @ui dashboard
|
|
85
|
+
* @autorun
|
|
86
|
+
*/
|
|
87
|
+
async main() {
|
|
88
|
+
const markdown = await this.readDeck();
|
|
89
|
+
const state = await this.getState();
|
|
90
|
+
return this.renderResult(markdown, state.currentSlide);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Move to the next slide
|
|
94
|
+
* @ui dashboard
|
|
95
|
+
*/
|
|
96
|
+
async next() {
|
|
97
|
+
const markdown = await this.readDeck();
|
|
98
|
+
const total = this.countSlides(markdown);
|
|
99
|
+
const state = await this.getState();
|
|
100
|
+
if (state.currentSlide < total - 1) {
|
|
101
|
+
state.currentSlide++;
|
|
102
|
+
await this.memory.set('state', state);
|
|
103
|
+
}
|
|
104
|
+
this.emit({ event: 'slideChanged', data: { type: 'nav', index: state.currentSlide } });
|
|
105
|
+
return { type: 'nav', index: state.currentSlide, isEnd: state.currentSlide === total - 1 };
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Move to the previous slide
|
|
109
|
+
* @ui dashboard
|
|
110
|
+
*/
|
|
111
|
+
async previous() {
|
|
112
|
+
const state = await this.getState();
|
|
113
|
+
if (state.currentSlide > 0) {
|
|
114
|
+
state.currentSlide--;
|
|
115
|
+
await this.memory.set('state', state);
|
|
116
|
+
}
|
|
117
|
+
this.emit({ event: 'slideChanged', data: { type: 'nav', index: state.currentSlide } });
|
|
118
|
+
return { type: 'nav', index: state.currentSlide, isStart: state.currentSlide === 0 };
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Jump to a specific slide
|
|
122
|
+
* @param index 0-based slide index
|
|
123
|
+
* @ui dashboard
|
|
124
|
+
*/
|
|
125
|
+
async go({ index }) {
|
|
126
|
+
const markdown = await this.readDeck();
|
|
127
|
+
const total = this.countSlides(markdown);
|
|
128
|
+
const state = await this.getState();
|
|
129
|
+
state.currentSlide = clamp(Math.trunc(index), 0, Math.max(total - 1, 0));
|
|
130
|
+
await this.memory.set('state', state);
|
|
131
|
+
this.emit({ event: 'slideChanged', data: { type: 'nav', index: state.currentSlide } });
|
|
132
|
+
return { type: 'nav', index: state.currentSlide };
|
|
133
|
+
}
|
|
134
|
+
// ── Deck Management ─────────────────────────────────────────────────────
|
|
135
|
+
/**
|
|
136
|
+
* List saved decks in the slides folder
|
|
137
|
+
* @readOnly
|
|
138
|
+
*/
|
|
139
|
+
async list() {
|
|
140
|
+
const dir = this.defaultFolder;
|
|
141
|
+
if (!existsSync(dir))
|
|
142
|
+
return { folder: dir, decks: [] };
|
|
143
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
144
|
+
const decks = await Promise.all(entries
|
|
145
|
+
.filter((e) => e.isFile() && e.name.toLowerCase().endsWith('.md'))
|
|
146
|
+
.map(async (e) => {
|
|
147
|
+
const stat = await fs.stat(path.join(dir, e.name));
|
|
148
|
+
const md = await fs.readFile(path.join(dir, e.name), 'utf8');
|
|
149
|
+
return {
|
|
150
|
+
file: e.name,
|
|
151
|
+
title: firstHeading(md) || e.name.replace(/\.md$/i, ''),
|
|
152
|
+
updatedAt: stat.mtime.toISOString(),
|
|
153
|
+
};
|
|
154
|
+
}));
|
|
155
|
+
return { folder: dir, decks: decks.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt)) };
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Read the current deck's markdown
|
|
159
|
+
* @readOnly
|
|
160
|
+
*/
|
|
161
|
+
async read() {
|
|
162
|
+
return { file: path.basename(this.deckPath), markdown: await this.readDeck() };
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Save markdown to the current deck
|
|
166
|
+
* @param markdown Full Marp markdown content
|
|
167
|
+
* @ui dashboard
|
|
168
|
+
*/
|
|
169
|
+
async save({ markdown }) {
|
|
170
|
+
await fs.writeFile(this.deckPath, markdown, 'utf8');
|
|
171
|
+
const state = await this.getState();
|
|
172
|
+
const result = this.renderResult(markdown, state.currentSlide);
|
|
173
|
+
this.emit({ event: 'deckChanged', data: result });
|
|
174
|
+
return result;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Update the full markdown and re-render
|
|
178
|
+
* @param markdown New Marp markdown content
|
|
179
|
+
* @ui dashboard
|
|
180
|
+
*/
|
|
181
|
+
async update({ markdown }) {
|
|
182
|
+
return this.save({ markdown });
|
|
183
|
+
}
|
|
184
|
+
// ── Slide-Level Operations ──────────────────────────────────────────────
|
|
185
|
+
/**
|
|
186
|
+
* Insert a new slide at a position
|
|
187
|
+
* @param markdown Slide content
|
|
188
|
+
* @param index Position to insert (appends if omitted)
|
|
189
|
+
* @ui dashboard
|
|
190
|
+
*/
|
|
191
|
+
async add(params) {
|
|
192
|
+
const md = await this.readDeck();
|
|
193
|
+
const { frontmatter, slides } = splitMarpMarkdown(md);
|
|
194
|
+
const content = params?.markdown ?? '';
|
|
195
|
+
const index = params?.index != null ? clamp(Math.trunc(params.index), 0, slides.length) : slides.length;
|
|
196
|
+
slides.splice(index, 0, content);
|
|
197
|
+
const newMd = joinMarpMarkdown(frontmatter, slides);
|
|
198
|
+
await fs.writeFile(this.deckPath, newMd, 'utf8');
|
|
199
|
+
await this.memory.set('state', { currentSlide: index });
|
|
200
|
+
const result = this.renderResult(newMd, index);
|
|
201
|
+
this.emit({ event: 'deckChanged', data: result });
|
|
202
|
+
return result;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Replace a slide's content
|
|
206
|
+
* @param index Slide index
|
|
207
|
+
* @param markdown New content
|
|
208
|
+
* @ui dashboard
|
|
209
|
+
*/
|
|
210
|
+
async edit({ index, markdown }) {
|
|
211
|
+
const md = await this.readDeck();
|
|
212
|
+
const { frontmatter, slides } = splitMarpMarkdown(md);
|
|
213
|
+
const i = clamp(Math.trunc(index), 0, Math.max(slides.length - 1, 0));
|
|
214
|
+
slides[i] = markdown;
|
|
215
|
+
const newMd = joinMarpMarkdown(frontmatter, slides);
|
|
216
|
+
await fs.writeFile(this.deckPath, newMd, 'utf8');
|
|
217
|
+
const result = this.renderResult(newMd, i);
|
|
218
|
+
this.emit({ event: 'deckChanged', data: result });
|
|
219
|
+
return result;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Reorder a slide
|
|
223
|
+
* @param from Source index
|
|
224
|
+
* @param to Target index
|
|
225
|
+
* @ui dashboard
|
|
226
|
+
*/
|
|
227
|
+
async move({ from, to }) {
|
|
228
|
+
const md = await this.readDeck();
|
|
229
|
+
const { frontmatter, slides } = splitMarpMarkdown(md);
|
|
230
|
+
const f = clamp(Math.trunc(from), 0, Math.max(slides.length - 1, 0));
|
|
231
|
+
const t = clamp(Math.trunc(to), 0, Math.max(slides.length - 1, 0));
|
|
232
|
+
if (f === t)
|
|
233
|
+
return this.renderResult(md, f);
|
|
234
|
+
const [slide] = slides.splice(f, 1);
|
|
235
|
+
slides.splice(t, 0, slide);
|
|
236
|
+
const newMd = joinMarpMarkdown(frontmatter, slides);
|
|
237
|
+
await fs.writeFile(this.deckPath, newMd, 'utf8');
|
|
238
|
+
await this.memory.set('state', { currentSlide: t });
|
|
239
|
+
const result = this.renderResult(newMd, t);
|
|
240
|
+
this.emit({ event: 'deckChanged', data: result });
|
|
241
|
+
return result;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Delete a slide
|
|
245
|
+
* @param index Slide index
|
|
246
|
+
* @destructive
|
|
247
|
+
* @ui dashboard
|
|
248
|
+
*/
|
|
249
|
+
async remove({ index }) {
|
|
250
|
+
const md = await this.readDeck();
|
|
251
|
+
const { frontmatter, slides } = splitMarpMarkdown(md);
|
|
252
|
+
if (slides.length <= 1)
|
|
253
|
+
return { error: 'Cannot remove the last slide' };
|
|
254
|
+
const i = clamp(Math.trunc(index), 0, Math.max(slides.length - 1, 0));
|
|
255
|
+
slides.splice(i, 1);
|
|
256
|
+
const newMd = joinMarpMarkdown(frontmatter, slides);
|
|
257
|
+
await fs.writeFile(this.deckPath, newMd, 'utf8');
|
|
258
|
+
const cur = clamp(i, 0, Math.max(slides.length - 1, 0));
|
|
259
|
+
await this.memory.set('state', { currentSlide: cur });
|
|
260
|
+
const result = this.renderResult(newMd, cur);
|
|
261
|
+
this.emit({ event: 'deckChanged', data: result });
|
|
262
|
+
return result;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Duplicate a slide
|
|
266
|
+
* @param index Slide index to copy
|
|
267
|
+
* @ui dashboard
|
|
268
|
+
*/
|
|
269
|
+
async duplicate({ index }) {
|
|
270
|
+
const md = await this.readDeck();
|
|
271
|
+
const { frontmatter, slides } = splitMarpMarkdown(md);
|
|
272
|
+
const i = clamp(Math.trunc(index), 0, Math.max(slides.length - 1, 0));
|
|
273
|
+
slides.splice(i + 1, 0, slides[i]);
|
|
274
|
+
const newMd = joinMarpMarkdown(frontmatter, slides);
|
|
275
|
+
await fs.writeFile(this.deckPath, newMd, 'utf8');
|
|
276
|
+
await this.memory.set('state', { currentSlide: i + 1 });
|
|
277
|
+
const result = this.renderResult(newMd, i + 1);
|
|
278
|
+
this.emit({ event: 'deckChanged', data: result });
|
|
279
|
+
return result;
|
|
280
|
+
}
|
|
281
|
+
// ── Context ─────────────────────────────────────────────────────────────
|
|
282
|
+
/**
|
|
283
|
+
* Current presentation state for AI context
|
|
284
|
+
* @readOnly
|
|
285
|
+
*/
|
|
286
|
+
async status() {
|
|
287
|
+
const md = await this.readDeck();
|
|
288
|
+
const { slides } = splitMarpMarkdown(md);
|
|
289
|
+
const state = await this.getState();
|
|
290
|
+
return {
|
|
291
|
+
file: path.basename(this.deckPath),
|
|
292
|
+
currentSlide: state.currentSlide,
|
|
293
|
+
totalSlides: slides.length,
|
|
294
|
+
currentContent: slides[state.currentSlide],
|
|
295
|
+
nextSlidePreview: slides[state.currentSlide + 1] || null,
|
|
296
|
+
markdown: md,
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
// ── Private ─────────────────────────────────────────────────────────────
|
|
300
|
+
async readDeck() {
|
|
301
|
+
try {
|
|
302
|
+
return await fs.readFile(this.deckPath, 'utf8');
|
|
303
|
+
}
|
|
304
|
+
catch {
|
|
305
|
+
return DEFAULT_DECK;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
async getState() {
|
|
309
|
+
return (await this.memory.get('state')) || { currentSlide: 0 };
|
|
310
|
+
}
|
|
311
|
+
renderResult(markdown, currentSlide) {
|
|
312
|
+
const { html, css } = this.marp.render(markdown);
|
|
313
|
+
const total = (html.match(/<section/g) || []).length;
|
|
314
|
+
return {
|
|
315
|
+
type: 'render',
|
|
316
|
+
html,
|
|
317
|
+
css,
|
|
318
|
+
total,
|
|
319
|
+
current: clamp(currentSlide, 0, Math.max(total - 1, 0)),
|
|
320
|
+
markdown,
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
countSlides(markdown) {
|
|
324
|
+
const { html } = this.marp.render(markdown);
|
|
325
|
+
return (html.match(/<section/g) || []).length;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
// ── Helpers ───────────────────────────────────────────────────────────────
|
|
329
|
+
function clamp(v, min, max) {
|
|
330
|
+
return Math.min(Math.max(Number.isFinite(v) ? v : min, min), max);
|
|
331
|
+
}
|
|
332
|
+
function firstHeading(md) {
|
|
333
|
+
return md.match(/^#\s+(.+)$/m)?.[1]?.trim() || '';
|
|
334
|
+
}
|
|
335
|
+
function splitMarpMarkdown(markdown) {
|
|
336
|
+
const fm = markdown.match(/^---\n[\s\S]*?\n---\n*/);
|
|
337
|
+
const frontmatter = fm ? fm[0].trimEnd() : '---\nmarp: true\n---';
|
|
338
|
+
const body = fm ? markdown.slice(fm[0].length) : markdown;
|
|
339
|
+
const slides = [];
|
|
340
|
+
let cur = [];
|
|
341
|
+
for (const line of body.split('\n')) {
|
|
342
|
+
if (line.trim() === '---') {
|
|
343
|
+
slides.push(cur.join('\n').trim());
|
|
344
|
+
cur = [];
|
|
345
|
+
continue;
|
|
346
|
+
}
|
|
347
|
+
cur.push(line);
|
|
348
|
+
}
|
|
349
|
+
slides.push(cur.join('\n').trim());
|
|
350
|
+
return { frontmatter, slides: slides.filter((s) => s.length > 0) };
|
|
351
|
+
}
|
|
352
|
+
function joinMarpMarkdown(frontmatter, slides) {
|
|
353
|
+
return `${frontmatter}\n\n${slides.join('\n\n---\n\n')}\n`;
|
|
354
|
+
}
|
|
355
|
+
//# sourceMappingURL=slides.photon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slides.photon.js","sourceRoot":"","sources":["../../src/photons/slides.photon.ts"],"names":[],"mappings":"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"}
|