@lofcz/pptist 2.0.18 → 2.0.19

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/README.md CHANGED
@@ -21,9 +21,10 @@
21
21
 
22
22
 
23
23
  # ✨ Highlights
24
- 1. **Easy Development**: Built with Vue 3.x and TypeScript, it does not rely on UI component libraries and avoids third-party components as much as possible. This makes styling customization easier and functionality extension more convenient.
25
- 2. **User Friendly**: It offers a context menu available everywhere, dozens of keyboard shortcuts, and countless editing detail optimizations, striving to replicate a desktop application-level experience.
26
- 3. **Feature Rich**: Supports most of the commonly used elements and functionalities found in PowerPoint, supports generate PPT by AI, supports exporting in various formats, and offers basic editing and previewing on mobile devices.
24
+ 1. **Easy Development**: Built with Vue 3.x and TypeScript, it does not rely on UI component libraries, making styling customization easier and functionality extension more convenient.
25
+ 2. **User Friendly**: It offers context menus everywhere, dozens of shortcut operations, and continuously refined editing details, striving to replicate a desktop application-level experience.
26
+ 3. **Feature Rich**: Supports most commonly used Office PPT elements and features, supports template-based AIPPT, supports exporting in various formats, and offers basic editing and previewing on mobile devices.
27
+ 4. **Controllable Code**: Not a temporary product of vibe coding. The code is robust, controllable, easy to maintain, and leaves no technical debt.
27
28
 
28
29
 
29
30
  # 👀 Front-Row Reminder
@@ -36,9 +37,9 @@
36
37
  > This project is strictly positioned as a Web Slide Editing/Presentation Application. It is not intended to be an ~~AI PPT generator, low-code platform, or image editor~~. The following are the recommendation levels for common use cases:
37
38
 
38
39
  - **Low-code Platforms / H5 Editors / Image Editors / Whiteboards** (Recommendation: Not Recommended): We suggest choosing open-source projects specifically designed for those purposes.
39
- - **PPT File Preview Tool** (Recommendation: ⭐): The ability to import .pptx files is limited (roughly 70%~80% fidelity). Unless your requirements for preview accuracy are low and you only need basic content display, this is not recommended.
40
- - **AI PPT Generation Tool** (Recommendation: ⭐⭐): While the project provides basic template-based AI generation, it is not the core focus. As AI technology evolves (moving from templates to HTML-based or image-based generation), this project will not necessarily follow those trends. However, if you wish to build a template-based AI generator and are willing to implement your own generation logic, PPTists robust editing capabilities make it a strong foundation.
41
- - **Office PPT Authoring Tool** (Recommendation: ⭐⭐): PPTist supports many common Office features and basic .pptx export. However, exports are not 100% identical to the original, and as mentioned, import capabilities are limited. Choose this only if you can accept these limitations.
40
+ - **PPT File Preview Tool** (Recommendation: ⭐): The ability to import .pptx files is limited (roughly 80% fidelity). Unless your requirements for preview accuracy are low and you only need basic content display, this is not recommended.
41
+ - **AI PPT Generation Tool** (Recommendation: ⭐⭐): While the project provides basic template-based AIPPT generation, it is not the core focus. As AI technology evolves, the form of AIPPT will continue to change (templates -> HTML webpages -> pure images -> SVG -> ...), and this project will not follow those trends. However, if you only want to build a template-based AIPPT generator, or are willing to extend better generation solutions yourself, PPTist's complete Schema and editing capabilities may be helpful.
42
+ - **Office PPT Authoring Tool** (Recommendation: ⭐⭐): PPTist supports many common Office PPT features and basic local .pptx export. However, exports cannot be 100% faithful, and this scenario generally has high requirements for importing .pptx files, while the import capability mentioned above is limited. Choose cautiously unless you can accept imperfect import capabilities.
42
43
  - **Web Slide Editing/Presentation App** (Recommendation: ⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐): This is the primary use case. The core strengths of PPTist are its editing capabilities and user experience. You can build upon this project to customize or add unique nodes and features tailored to your specific needs, where Office compatibility is not the ultimate goal. **Summary: Our vision is for you to use PPTist to create a presentation product that is distinct from Microsoft Office, rather than just using it as a middleman for editing Office files.**
43
44
 
44
45
 
@@ -58,10 +59,9 @@ Browser access: http://127.0.0.1:5173/
58
59
  - History (undo, redo)
59
60
  - Shortcuts
60
61
  - Right-click menu
61
- - Export local files (PPTX, JSON, images, PDF)
62
- - Import and export pptist files
63
- - Print
64
- - AI PPT
62
+ - Import: PPTX (overall fidelity ~80%), JSON, pptist files
63
+ - Export: PPTX (overall fidelity ~95%+), JSON, images, PDF (print), pptist files
64
+ - Template-based AI PPT generation
65
65
  ### Slide Page Editing
66
66
  - Add/delete pages
67
67
  - Copy/paste pages
@@ -113,6 +113,8 @@ Browser access: http://127.0.0.1:5173/
113
113
  - Shadow
114
114
  - Transparency
115
115
  - Vertical text
116
+ - Text box margins
117
+ - Auto-fit/fixed height (vertical alignment can be selected when fixed)
116
118
  - AI Rewrite/Expand/Abbreviate
117
119
  #### Images
118
120
  - Crop (custom, shape, aspect ratio)
@@ -126,8 +128,9 @@ Browser access: http://127.0.0.1:5173/
126
128
  - Reset image
127
129
  - Set as background
128
130
  #### Shapes
129
- - Draw any polygon
130
- - Draw any line (unclosed shape simulation)
131
+ - Freehand draw any polygon
132
+ - Freehand draw any line (unclosed shape simulation)
133
+ - Visual path creation method
131
134
  - Replace shape
132
135
  - Fill (solid color, gradient, image)
133
136
  - Border
@@ -136,6 +139,8 @@ Browser access: http://127.0.0.1:5173/
136
139
  - Flip
137
140
  - Shape format painter
138
141
  - Edit text (supports rich text, similar to text element’s rich text editing)
142
+ - Text box margins
143
+ - Text vertical alignment
139
144
  #### Lines
140
145
  - Straight lines, polylines, curves
141
146
  - Color
@@ -264,4 +269,4 @@ If you wish to use this project for commercial gain, I hope you will respect ope
264
269
  <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/chart?repos=pipipi-pikachu/PPTist&type=date&legend=top-left" />
265
270
  <img alt="Star History Chart" src="https://api.star-history.com/chart?repos=pipipi-pikachu/PPTist&type=date&legend=top-left" />
266
271
  </picture>
267
- </a>
272
+ </a>
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": 2,
3
3
  "package": "@lofcz/pptist",
4
- "packageVersion": "2.0.18",
5
- "generatedAt": "2026-06-19T14:08:21.973Z",
4
+ "packageVersion": "2.0.19",
5
+ "generatedAt": "2026-06-19T20:21:30.717Z",
6
6
  "summary": "Authoring guidance for the PPTist agentic bridge. The recommended way to build a deck from scratch: (1) pick ONE visual identity with styles.catalog -> deck.applyStyle (academic | minimal | bold | playful), then (2) for each slide pick a recipe from layouts.catalog and add it with slides.createFromLayout({ layoutId, slots }) — the engine themes, positions AND auto-fits every text box (via responsive measurement) so content never overflows. Author slot content as Markdown/plain text or structured values (arrays for bullets, { labels, series } for charts) — never hand-written HTML. Alternative: for pixel-perfect branded decks, use the built-in templates flow (deck.applyTemplate + slides.insertFromTemplate). Avoid blank slides.create / hand-placed elements unless neither a layout nor a template slide fits. Pair this with the machine schema (command payload/return types) in the same manifest.",
7
7
  "commandCount": 177,
8
8
  "designSystem": {
@@ -2061,7 +2061,7 @@
2061
2061
  "PPTLineElement": "export interface PPTLineElement extends Omit<PPTBaseElement, 'height' | 'rotate'> { type: 'line'; start: [number, number]; end: [number, number]; style: LineStyleType; color: string; points: [LinePoint, LinePoint]; shadow?: PPTElementShadow; broken?: [number, number]; broken2?: [number, number]; broken2Direction?: Broken2LineDirection; curve?: [number, number]; cubic?: [[number, number], [number, number]] }",
2062
2062
  "PPTShapeElement": "export interface PPTShapeElement extends PPTBaseElement { type: 'shape'; viewBox: [number, number]; path: string; fixedRatio: boolean; fill: string; gradient?: Gradient; pattern?: string; outline?: PPTElementOutline; opacity?: number; flipH?: boolean; flipV?: boolean; shadow?: PPTElementShadow; special?: boolean; text?: ShapeText; pathFormula?: ShapePathFormulasKeys; keypoints?: number[] }",
2063
2063
  "PPTTableElement": "export interface PPTTableElement extends PPTBaseElement { type: 'table'; outline: PPTElementOutline; theme?: TableTheme; colWidths: number[]; cellMinHeight: number; data: TableCell[][] }",
2064
- "PPTTextElement": "export interface PPTTextElement extends PPTBaseElement { type: 'text'; content: string; defaultFontName: string; defaultColor: string; placeholder?: string; placeholderFontSize?: number; placeholderColor?: string; placeholderAlign?: TextAlign; outline?: PPTElementOutline; fill?: string; lineHeight?: number; wordSpace?: number; opacity?: number; shadow?: PPTElementShadow; paragraphSpace?: number; vertical?: boolean; textType?: TextType; inset?: TextInset }",
2064
+ "PPTTextElement": "export interface PPTTextElement extends PPTBaseElement { type: 'text'; content: string; defaultFontName: string; defaultColor: string; placeholder?: string; placeholderFontSize?: number; placeholderColor?: string; placeholderAlign?: TextAlign; outline?: PPTElementOutline; fill?: string; lineHeight?: number; wordSpace?: number; opacity?: number; shadow?: PPTElementShadow; paragraphSpace?: number; vertical?: boolean; textType?: TextType; inset?: TextInset; fixedHeight?: boolean; vAlign?: TextAlignVertical }",
2065
2065
  "PPTVideoElement": "export interface PPTVideoElement extends PPTBaseElement { type: 'video'; src: string; autoplay: boolean; poster?: string; ext?: string }",
2066
2066
  "SectionTag": "export interface SectionTag { id: string; title?: string }",
2067
2067
  "ShapePathFormulasKeys": "export declare const enum ShapePathFormulasKeys { ROUND_RECT = \"roundRect\", ROUND_RECT_DIAGONAL = \"roundRectDiagonal\", ROUND_RECT_SINGLE = \"roundRectSingle\", ROUND_RECT_SAMESIDE = \"roundRectSameSide\", CUT_RECT_DIAGONAL = \"cutRectDiagonal\", CUT_RECT_SINGLE = \"cutRectSingle\", CUT_RECT_SAMESIDE = \"cutRectSameSide\", CUT_ROUND_RECT = \"cutRoundRect\", MESSAGE = \"message\", ROUND_MESSAGE = \"roundMessage\", L = \"L\", RING_RECT = \"ringRect\", PLUS = \"plus\", TRIANGLE = \"triangle\", PARALLELOGRAM_LEFT = \"parallelogramLeft\", PARALLELOGRAM_RIGHT = \"parallelogramRight\", TRAPEZOID = \"trapezoid\", BULLET = \"bullet\", INDICATOR = \"indicator\", DONUT = \"donut\", DIAGSTRIPE = \"diagStripe\" }",
Binary file
@@ -1,184 +1,337 @@
1
1
  [
2
- {
3
- "id": "test-slide-1",
4
- "elements": [
5
- {
6
- "type": "shape",
7
- "id": "4cbRxp",
8
- "left": 0,
9
- "top": 200,
10
- "width": 546,
11
- "height": 362.5,
12
- "viewBox": [200, 200],
13
- "path": "M 0 0 L 0 200 L 200 200 Z",
14
- "fill": "#5b9bd5",
15
- "fixedRatio": false,
16
- "opacity": 0.7,
17
- "rotate": 0
18
- },
19
- {
20
- "type": "shape",
21
- "id": "ookHrf",
22
- "left": 0,
23
- "top": 0,
24
- "width": 300,
25
- "height": 320,
26
- "viewBox": [200, 200],
27
- "path": "M 0 0 L 0 200 L 200 200 Z",
28
- "fill": "#5b9bd5",
29
- "fixedRatio": false,
30
- "flipV": true,
31
- "rotate": 0
32
- },
33
- {
34
- "type": "text",
35
- "id": "idn7Mx",
36
- "left": 355,
37
- "top": 65.25,
38
- "width": 450,
39
- "height": 188,
40
- "lineHeight": 1.2,
41
- "content": "<p><strong><span style=\"font-size: 112px;\">PPTist</span></strong></p>",
42
- "rotate": 0,
43
- "defaultFontName": "",
44
- "defaultColor": "#333"
45
- },
46
- {
47
- "type": "text",
48
- "id": "7stmVP",
49
- "left": 355,
50
- "top": 253.25,
51
- "width": 585,
52
- "height": 56,
53
- "content": "<p><span style=\"font-size: 24px;\">Online presentation application based on Vue 3.x + TypeScript</span></p>",
54
- "rotate": 0,
55
- "defaultFontName": "",
56
- "defaultColor": "#333"
57
- },
58
- {
59
- "type": "line",
60
- "id": "FnpZs4",
61
- "left": 361,
62
- "top": 238,
63
- "start": [0, 0],
64
- "end": [549, 0],
65
- "points": ["", ""],
66
- "color": "#5b9bd5",
67
- "style": "solid",
68
- "width": 2
2
+ {
3
+ "id": "test-slide-1",
4
+ "elements": [
5
+ {
6
+ "type": "shape",
7
+ "id": "4cbRxp",
8
+ "left": 0,
9
+ "top": 200,
10
+ "width": 546,
11
+ "height": 362.5,
12
+ "viewBox": [
13
+ 200,
14
+ 200
15
+ ],
16
+ "path": "M 0 0 L 0 200 L 200 200 Z",
17
+ "fill": "#5b9bd5",
18
+ "fixedRatio": false,
19
+ "opacity": 0.5,
20
+ "rotate": 0
21
+ },
22
+ {
23
+ "type": "shape",
24
+ "id": "ookHrf",
25
+ "left": 0,
26
+ "top": 0,
27
+ "width": 300,
28
+ "height": 320,
29
+ "viewBox": [
30
+ 200,
31
+ 200
32
+ ],
33
+ "path": "M 0 0 L 0 200 L 200 200 Z",
34
+ "fill": "#5b9bd5",
35
+ "fixedRatio": false,
36
+ "flipV": true,
37
+ "rotate": 0
38
+ },
39
+ {
40
+ "type": "text",
41
+ "id": "idn7Mx",
42
+ "left": 355,
43
+ "top": 65,
44
+ "width": 585,
45
+ "height": 154.390625,
46
+ "lineHeight": 1.2,
47
+ "content": "<p><strong><span style=\"font-size: 112px;\">PPTist</span></strong></p>",
48
+ "rotate": 0,
49
+ "defaultFontName": "",
50
+ "defaultColor": "#333"
51
+ },
52
+ {
53
+ "type": "text",
54
+ "id": "7stmVP",
55
+ "left": 355,
56
+ "top": 238,
57
+ "width": 585,
58
+ "height": 86,
59
+ "content": "<p><strong><span style=\"font-size: 22px;\">PowerPoint-ist</span></strong><span style=\"font-size: 22px;\"> </span><em><span style=\"font-size: 22px;\">(/'pauəpɔintist/)</span></em><span style=\"font-size: 22px;\">,基于 Web 的开源演示文稿(幻灯片)应用,可以在浏览器中编辑/演示幻灯片。</span></p>",
60
+ "rotate": 0,
61
+ "defaultFontName": "",
62
+ "defaultColor": "#333"
63
+ },
64
+ {
65
+ "type": "line",
66
+ "id": "FnpZs4",
67
+ "left": 367,
68
+ "top": 220,
69
+ "start": [
70
+ 0,
71
+ 0
72
+ ],
73
+ "end": [
74
+ 555.6725978647687,
75
+ 0
76
+ ],
77
+ "points": [
78
+ "",
79
+ ""
80
+ ],
81
+ "color": "#5b9bd5",
82
+ "style": "solid",
83
+ "width": 2
84
+ }
85
+ ],
86
+ "background": {
87
+ "type": "solid",
88
+ "color": "#ffffff"
69
89
  }
70
- ],
71
- "background": {
72
- "type": "solid",
73
- "color": "#ffffff"
74
- }
75
- },
76
- {
77
- "id": "test-slide-2",
78
- "elements": [
79
- {
80
- "type": "text",
81
- "id": "ptNnUJ",
82
- "left": 145,
83
- "top": 148,
84
- "width": 711,
85
- "height": 77,
86
- "lineHeight": 1.2,
87
- "content": "<p style=\"text-align: center;\"><strong><span style=\"font-size: 48px;\">Add title here</span></strong></p>",
88
- "rotate": 0,
89
- "defaultFontName": "",
90
- "defaultColor": "#333"
91
- },
92
- {
93
- "type": "text",
94
- "id": "mRHvQN",
95
- "left": 207.50000000000003,
96
- "top": 249.84259259259264,
97
- "width": 585,
98
- "height": 56,
99
- "content": "<p style=\"text-align: center;\"><span style=\"font-size: 24px;\">Add subtitle here</span></p>",
100
- "rotate": 0,
101
- "defaultFontName": "",
102
- "defaultColor": "#333"
90
+ },
91
+ {
92
+ "id": "T2flB5Ms6N",
93
+ "elements": [
94
+ {
95
+ "type": "shape",
96
+ "id": "tgOHYFL9OJ",
97
+ "left": 0,
98
+ "top": 0,
99
+ "width": 1000,
100
+ "height": 281.25,
101
+ "viewBox": [
102
+ 200,
103
+ 200
104
+ ],
105
+ "path": "M 0 0 L 200 0 L 200 200 L 0 200 Z",
106
+ "fill": "rgb(91, 155, 213)",
107
+ "fixedRatio": false,
108
+ "rotate": 0,
109
+ "lock": false
110
+ },
111
+ {
112
+ "type": "shape",
113
+ "id": "7GFmEv6oB_",
114
+ "left": 0,
115
+ "top": 281.25,
116
+ "width": 1000,
117
+ "height": 281.25,
118
+ "viewBox": [
119
+ 200,
120
+ 200
121
+ ],
122
+ "path": "M 0 0 L 200 0 L 200 200 L 0 200 Z",
123
+ "fill": "rgb(242, 242, 242)",
124
+ "fixedRatio": false,
125
+ "rotate": 0,
126
+ "lock": false
127
+ },
128
+ {
129
+ "type": "shape",
130
+ "id": "rdxiACCJuV",
131
+ "left": 40,
132
+ "top": 39,
133
+ "width": 920,
134
+ "height": 482,
135
+ "viewBox": [
136
+ 920,
137
+ 482
138
+ ],
139
+ "path": "M 25.40421115065243 0 L 894.5957888493476 0 Q 920 0 920 25.40421115065243 L 920 456.59578884934757 Q 920 482 894.5957888493476 482 L 25.40421115065243 482 Q 0 482 0 456.59578884934757 L 0 25.40421115065243 Q 0 0 25.40421115065243 0 Z",
140
+ "fill": "#ffffff",
141
+ "fixedRatio": false,
142
+ "rotate": 0,
143
+ "shadow": {
144
+ "h": 4,
145
+ "v": 4,
146
+ "blur": 8,
147
+ "color": "rgba(128, 128, 128, 0.13)"
148
+ },
149
+ "lock": false,
150
+ "pathFormula": "roundRect",
151
+ "keypoints": [
152
+ 0.052705832262764374
153
+ ]
154
+ },
155
+ {
156
+ "type": "text",
157
+ "id": "Tn6kkOFntr",
158
+ "left": 80,
159
+ "top": 71.5,
160
+ "width": 716.9,
161
+ "height": 74,
162
+ "content": "<p><span style=\"font-size: 36px;\">✨项目特点</span></p>",
163
+ "rotate": 0,
164
+ "defaultFontName": "",
165
+ "defaultColor": "#333",
166
+ "vertical": false,
167
+ "textType": "title"
168
+ },
169
+ {
170
+ "type": "text",
171
+ "id": "oU7uzQkPpO",
172
+ "left": 80,
173
+ "top": 160,
174
+ "width": 830,
175
+ "height": 213,
176
+ "content": "<ul style=\"font-size: 18px;color: rgb(51, 51, 51);\"><li><p style=\"text-align: justify;\"><strong><span style=\"font-size: 18px;\"><span style=\"color: rgb(51, 51, 51);\">易开发:</span></span></strong><span style=\"font-size: 18px;\"><span style=\"color: rgb(51, 51, 51);\">基于 </span><code><span style=\"color: rgb(51, 51, 51);\">Vue3.x</span></code><span style=\"color: rgb(51, 51, 51);\"> + </span><code><span style=\"color: rgb(51, 51, 51);\">TypeScript</span></code><span style=\"color: rgb(51, 51, 51);\"> 构建,不依赖UI组件库,样式定制、功能扩展更方便;</span></span></p></li><li><p style=\"text-align: justify;\"><strong><span style=\"font-size: 18px;\"><span style=\"color: rgb(51, 51, 51);\">易使用:</span></span></strong><span style=\"font-size: 18px;\"><span style=\"color: rgb(51, 51, 51);\">随处可见的右键菜单、数十种快捷操作方式、持续深入打磨编辑细节,力求还原桌面应用级的交互体验;</span></span></p></li><li><p style=\"text-align: justify;\"><strong><span style=\"font-size: 18px;\"><span style=\"color: rgb(51, 51, 51);\">功能丰富:</span></span></strong><span style=\"font-size: 18px;\"><span style=\"color: rgb(51, 51, 51);\">支持 </span></span><em><span style=\"font-size: 18px;\"><span style=\"color: rgb(51, 51, 51);\">Office PPT</span></span></em><span style=\"font-size: 18px;\"><span style=\"color: rgb(51, 51, 51);\"> 大部分常用元素和功能,支持模板式AIPPT、支持多种格式导出、支持移动端基础编辑和预览;</span></span></p></li><li><p style=\"\"><strong>代码可控:</strong>非 <em>vibe coding</em>&nbsp;的临时产物,代码稳健、可控、易维护,不留技术债。</p></li></ul>",
177
+ "rotate": 0,
178
+ "defaultFontName": "",
179
+ "defaultColor": "#333",
180
+ "vertical": false,
181
+ "textType": "content",
182
+ "paragraphSpace": 10,
183
+ "lineHeight": 1.5
184
+ },
185
+ {
186
+ "type": "line",
187
+ "id": "0pCV4mHRO5",
188
+ "left": 140,
189
+ "top": 138,
190
+ "start": [
191
+ 0,
192
+ 0
193
+ ],
194
+ "end": [
195
+ 140.12455516014234,
196
+ 0
197
+ ],
198
+ "points": [
199
+ "",
200
+ ""
201
+ ],
202
+ "color": "rgb(91, 155, 213)",
203
+ "style": "solid",
204
+ "width": 2,
205
+ "lock": false
206
+ },
207
+ {
208
+ "type": "shape",
209
+ "id": "-5LJXtU4dt",
210
+ "left": 0,
211
+ "top": 450,
212
+ "width": 1000,
213
+ "height": 150,
214
+ "viewBox": [
215
+ 200,
216
+ 200
217
+ ],
218
+ "path": "M 0 20 C 40 -40 60 60 100 20 C 140 -40 160 60 200 20 L 200 180 C 140 240 160 140 100 180 C 40 240 60 140 0 180 L 0 20 Z",
219
+ "fill": "rgb(91, 155, 213)",
220
+ "fixedRatio": false,
221
+ "rotate": 0,
222
+ "lock": false,
223
+ "opacity": 0.2
224
+ }
225
+ ],
226
+ "background": {
227
+ "type": "solid",
228
+ "color": "#fff"
103
229
  },
104
- {
105
- "type": "line",
106
- "id": "7CQDwc",
107
- "left": 323.09259259259267,
108
- "top": 238.33333333333334,
109
- "start": [0, 0],
110
- "end": [354.8148148148148, 0],
111
- "points": ["", ""],
112
- "color": "#5b9bd5",
113
- "style": "solid",
114
- "width": 4
230
+ "type": "cover"
231
+ },
232
+ {
233
+ "id": "iqg6iGnei-",
234
+ "elements": [
235
+ {
236
+ "type": "shape",
237
+ "id": "78IHuud1fL",
238
+ "left": 850,
239
+ "top": 412.5,
240
+ "width": 300,
241
+ "height": 300,
242
+ "viewBox": [
243
+ 200,
244
+ 200
245
+ ],
246
+ "path": "M 100 0 A 50 50 0 1 1 100 200 A 50 50 0 1 1 100 0 Z",
247
+ "fill": "rgb(91, 155, 213)",
248
+ "fixedRatio": true,
249
+ "rotate": 0,
250
+ "lock": false,
251
+ "opacity": 0.2
252
+ },
253
+ {
254
+ "type": "shape",
255
+ "id": "qBDphekubT",
256
+ "left": -180,
257
+ "top": -180,
258
+ "width": 360,
259
+ "height": 360,
260
+ "viewBox": [
261
+ 200,
262
+ 200
263
+ ],
264
+ "path": "M 100 0 A 50 50 0 1 1 100 200 A 50 50 0 1 1 100 0 Z",
265
+ "fill": "rgb(91, 155, 213)",
266
+ "fixedRatio": true,
267
+ "rotate": 0,
268
+ "lock": false
269
+ },
270
+ {
271
+ "type": "text",
272
+ "id": "2y_IZ-pmfY",
273
+ "width": 500,
274
+ "height": 101,
275
+ "left": 250,
276
+ "top": 160,
277
+ "rotate": 0,
278
+ "defaultFontName": "",
279
+ "defaultColor": "#333",
280
+ "content": "<p style=\"text-align: center;\"><strong><span style=\"font-size: 54px;\"><span style=\"color: rgb(91, 155, 213);\">谢谢观看</span></span></strong></p>",
281
+ "vertical": false
282
+ },
283
+ {
284
+ "type": "text",
285
+ "id": "pOa5by-tWB",
286
+ "width": 500,
287
+ "height": 56,
288
+ "left": 250,
289
+ "top": 250,
290
+ "rotate": 0,
291
+ "defaultFontName": "",
292
+ "defaultColor": "#333",
293
+ "content": "<p style=\"text-align: center;\"><em><span style=\"font-size: 24px;\"><span style=\"color: rgb(51, 51, 51);\">-THANKS-</span></span></em></p>",
294
+ "vertical": false
295
+ },
296
+ {
297
+ "type": "shape",
298
+ "id": "dQo7Qrwmqd",
299
+ "width": 500,
300
+ "height": 44,
301
+ "left": 250,
302
+ "top": 316,
303
+ "viewBox": [
304
+ 500,
305
+ 44
306
+ ],
307
+ "path": "M 5.5 0 L 494.5 0 Q 500 0 500 5.5 L 500 38.5 Q 500 44 494.5 44 L 5.5 44 Q 0 44 0 38.5 L 0 5.5 Q 0 0 5.5 0 Z",
308
+ "fill": "rgb(91, 155, 213)",
309
+ "fixedRatio": false,
310
+ "rotate": 0,
311
+ "text": {
312
+ "content": "<p style=\"text-align: center;\"><span style=\"font-size: 16px;\"><span style=\"color: rgb(255, 255, 255);\">AGPL-3.0 License | Copyright © 2020-PRESENT pipipi-pikachu</span></span></p>",
313
+ "defaultFontName": "",
314
+ "defaultColor": "#333",
315
+ "align": "middle"
316
+ },
317
+ "flipH": false,
318
+ "flipV": false,
319
+ "pathFormula": "roundRect",
320
+ "keypoints": [
321
+ 0.125
322
+ ],
323
+ "opacity": 0.5,
324
+ "link": {
325
+ "type": "web",
326
+ "target": "https://github.com/pipipi-pikachu"
327
+ }
328
+ }
329
+ ],
330
+ "background": {
331
+ "type": "solid",
332
+ "color": "#FFFFFF"
115
333
  },
116
- {
117
- "type": "shape",
118
- "id": "09wqWw",
119
- "left": -27.648148148148138,
120
- "top": 432.73148148148147,
121
- "width": 1056.2962962962963,
122
- "height": 162.96296296296296,
123
- "viewBox": [200, 200],
124
- "path": "M 0 20 C 40 -40 60 60 100 20 C 140 -40 160 60 200 20 L 200 180 C 140 240 160 140 100 180 C 40 240 60 140 0 180 L 0 20 Z",
125
- "fill": "#5b9bd5",
126
- "fixedRatio": false,
127
- "rotate": 0
128
- }
129
- ],
130
- "background": {
131
- "type": "solid",
132
- "color": "#fff"
133
- }
134
- },
135
- {
136
- "id": "test-slide-3",
137
- "elements": [
138
- {
139
- "type": "shape",
140
- "id": "vSheCJ",
141
- "left": 183.5185185185185,
142
- "top": 175.5092592592593,
143
- "width": 605.1851851851851,
144
- "height": 185.18518518518516,
145
- "viewBox": [200, 200],
146
- "path": "M 0 0 L 200 0 L 200 200 L 0 200 Z",
147
- "fill": "#5b9bd5",
148
- "fixedRatio": false,
149
- "rotate": 0
150
- },
151
- {
152
- "type": "shape",
153
- "id": "Mpwv7x",
154
- "left": 211.29629629629628,
155
- "top": 201.80555555555557,
156
- "width": 605.1851851851851,
157
- "height": 185.18518518518516,
158
- "viewBox": [200, 200],
159
- "path": "M 0 0 L 200 0 L 200 200 L 0 200 Z",
160
- "fill": "#5b9bd5",
161
- "fixedRatio": false,
162
- "rotate": 0,
163
- "opacity": 0.7
164
- },
165
- {
166
- "type": "text",
167
- "id": "WQOTAp",
168
- "left": 304.9074074074074,
169
- "top": 198.10185185185182,
170
- "width": 417.9629629629629,
171
- "height": 140,
172
- "content": "<p style=\"text-align: center;\"><strong><span style=\"font-size: 80px;\"><span style=\"color: rgb(255, 255, 255);\">Thank you</span></span></strong></p>",
173
- "rotate": 0,
174
- "defaultFontName": "",
175
- "defaultColor": "#333",
176
- "wordSpace": 5
177
- }
178
- ],
179
- "background": {
180
- "type": "solid",
181
- "color": "#fff"
334
+ "remark": "",
335
+ "type": "end"
182
336
  }
183
- }
184
- ]
337
+ ]