@lemonppt/renderer 0.2.0 → 0.2.1

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.
Files changed (72) hide show
  1. package/dist/client/client-render.js +65 -5401
  2. package/dist/client/editor-script.js +3355 -0
  3. package/dist/client/theme-echarts.js +65 -25
  4. package/dist/client-render.d.ts +1 -7
  5. package/dist/client-render.d.ts.map +1 -1
  6. package/dist/client-render.js +1 -11
  7. package/dist/client-render.js.map +1 -1
  8. package/dist/editor-script.d.ts +1 -1
  9. package/dist/editor-script.d.ts.map +1 -1
  10. package/dist/editor-script.js +80 -77
  11. package/dist/editor-script.js.map +1 -1
  12. package/dist/export-pdf.js +1 -1
  13. package/dist/export-pdf.js.map +1 -1
  14. package/dist/export-pptx.d.ts +1132 -2
  15. package/dist/export-pptx.d.ts.map +1 -1
  16. package/dist/export-pptx.js +1208 -19525
  17. package/dist/export-pptx.js.map +1 -1
  18. package/dist/index.d.ts +1 -0
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +1 -0
  21. package/dist/index.js.map +1 -1
  22. package/dist/render-editor-data.d.ts +21 -0
  23. package/dist/render-editor-data.d.ts.map +1 -0
  24. package/dist/render-editor-data.js +1068 -0
  25. package/dist/render-editor-data.js.map +1 -0
  26. package/dist/render.d.ts +0 -2
  27. package/dist/render.d.ts.map +1 -1
  28. package/dist/render.js +7 -323
  29. package/dist/render.js.map +1 -1
  30. package/dist/theme01-pptx.d.ts +12 -0
  31. package/dist/theme01-pptx.d.ts.map +1 -0
  32. package/dist/theme01-pptx.js +2954 -0
  33. package/dist/theme01-pptx.js.map +1 -0
  34. package/dist/theme02-pptx.d.ts +5 -0
  35. package/dist/theme02-pptx.d.ts.map +1 -0
  36. package/dist/theme02-pptx.js +1063 -0
  37. package/dist/theme02-pptx.js.map +1 -0
  38. package/dist/theme03-pptx.d.ts +5 -0
  39. package/dist/theme03-pptx.d.ts.map +1 -0
  40. package/dist/theme03-pptx.js +3279 -0
  41. package/dist/theme03-pptx.js.map +1 -0
  42. package/dist/theme04-pptx.d.ts +6 -0
  43. package/dist/theme04-pptx.d.ts.map +1 -0
  44. package/dist/theme04-pptx.js +5496 -0
  45. package/dist/theme04-pptx.js.map +1 -0
  46. package/dist/theme05-pptx.d.ts +5 -0
  47. package/dist/theme05-pptx.d.ts.map +1 -0
  48. package/dist/theme05-pptx.js +3152 -0
  49. package/dist/theme05-pptx.js.map +1 -0
  50. package/dist/theme06-pptx.d.ts +124 -0
  51. package/dist/theme06-pptx.d.ts.map +1 -0
  52. package/dist/theme06-pptx.js +8154 -0
  53. package/dist/theme06-pptx.js.map +1 -0
  54. package/dist/theme07-pptx.d.ts +49 -0
  55. package/dist/theme07-pptx.d.ts.map +1 -0
  56. package/dist/theme07-pptx.js +2579 -0
  57. package/dist/theme07-pptx.js.map +1 -0
  58. package/dist/theme08-pptx.d.ts +19 -0
  59. package/dist/theme08-pptx.d.ts.map +1 -0
  60. package/dist/theme08-pptx.js +1411 -0
  61. package/dist/theme08-pptx.js.map +1 -0
  62. package/dist/theme09-pptx.d.ts +18 -0
  63. package/dist/theme09-pptx.d.ts.map +1 -0
  64. package/dist/theme09-pptx.js +1513 -0
  65. package/dist/theme09-pptx.js.map +1 -0
  66. package/dist/theme10-pptx.d.ts +18 -0
  67. package/dist/theme10-pptx.d.ts.map +1 -0
  68. package/dist/theme10-pptx.js +2889 -0
  69. package/dist/theme10-pptx.js.map +1 -0
  70. package/package.json +7 -6
  71. package/templates/editor.html +580 -0
  72. package/templates/editor.js +222 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lemonppt/renderer",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -12,7 +12,8 @@
12
12
  },
13
13
  "files": [
14
14
  "dist",
15
- "assets/fonts"
15
+ "assets/fonts",
16
+ "templates"
16
17
  ],
17
18
  "publishConfig": {
18
19
  "access": "public"
@@ -31,9 +32,9 @@
31
32
  "pptxgenjs": "3.12.0",
32
33
  "react": "^18.3.1",
33
34
  "react-dom": "^18.3.1",
34
- "@lemonppt/core": "0.2.0",
35
- "@lemonppt/templates": "0.2.0",
36
- "@lemonppt/themes": "0.2.0"
35
+ "@lemonppt/core": "0.2.1",
36
+ "@lemonppt/templates": "0.2.1",
37
+ "@lemonppt/themes": "0.2.1"
37
38
  },
38
39
  "devDependencies": {
39
40
  "@types/node": "^20.0.0",
@@ -44,7 +45,7 @@
44
45
  },
45
46
  "license": "AGPL-3.0",
46
47
  "scripts": {
47
- "build": "tsc && esbuild src/client-render.ts --bundle --platform=browser --format=iife --global-name=__lemonPPT_clientRender --outfile=dist/client/client-render.js --alias:react-dom/server=react-dom/server.browser --target=es2019 --minify && esbuild src/theme-echarts.ts --bundle --platform=browser --format=iife --outfile=dist/client/theme-echarts.js --target=es2019 --minify",
48
+ "build": "tsc && node scripts/build-editor-script.js && esbuild src/client-render.ts --bundle --platform=browser --format=iife --global-name=__lemonPPT_clientRender --outfile=dist/client/client-render.js --alias:react-dom/server=react-dom/server.browser --target=es2019 --minify && esbuild src/theme-echarts.ts --bundle --platform=browser --format=iife --global-name=__lemonPPT_themeECharts --outfile=dist/client/theme-echarts.js --target=es2019 --minify",
48
49
  "typecheck": "tsc --noEmit"
49
50
  }
50
51
  }
@@ -0,0 +1,580 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=1280, initial-scale=1.0">
6
+ <title>lemonPPT 编辑器</title>
7
+ <link rel="stylesheet" href="/deck/assets/fonts/fonts.css">
8
+ <script src="/deck/assets/jquery.min.js"></script>
9
+ <style>
10
+ * { margin: 0; padding: 0; box-sizing: border-box; }
11
+ :root {
12
+ --lp-bg: #1a1a1a;
13
+ --lp-panel: #1e1e1e;
14
+ --lp-border: #333;
15
+ --lp-text: #e5e5e5;
16
+ --lp-text-secondary: #aaa;
17
+ --lp-primary: #34d399;
18
+ --lp-accent: #3b82f6;
19
+ }
20
+ html, body {
21
+ width: 100%;
22
+ height: 100%;
23
+ background: #111;
24
+ }
25
+ body {
26
+ display: flex;
27
+ align-items: center;
28
+ justify-content: center;
29
+ }
30
+ .lp-editor-body {
31
+ display: block;
32
+ }
33
+ .lp-deck {
34
+ box-shadow: 0 24px 80px rgba(0,0,0,0.5);
35
+ border-radius: 12px;
36
+ overflow: hidden;
37
+ }
38
+ .lp-error {
39
+ width: 100%;
40
+ height: 100%;
41
+ display: flex;
42
+ align-items: center;
43
+ justify-content: center;
44
+ background: #fee2e2;
45
+ color: #991b1b;
46
+ font-family: system-ui, sans-serif;
47
+ }
48
+ .lp-editor-root {
49
+ display: flex;
50
+ flex-direction: column;
51
+ width: 100vw;
52
+ height: 100vh;
53
+ background: #1a1a1a;
54
+ color: #e5e5e5;
55
+ overflow: hidden;
56
+ }
57
+ .lp-editor-bar {
58
+ position: relative;
59
+ width: 100%;
60
+ height: 64px;
61
+ box-sizing: border-box;
62
+ border-bottom: 1px solid #333;
63
+ background: #1e1e1e;
64
+ color: #e5e5e5;
65
+ padding: 0 16px;
66
+ display: flex;
67
+ align-items: center;
68
+ gap: 12px;
69
+ z-index: 100;
70
+ }
71
+ .lp-editor-title {
72
+ margin-right: auto;
73
+ font-size: 16px;
74
+ font-weight: 600;
75
+ }
76
+ .lp-appearance-switcher {
77
+ display: inline-flex;
78
+ align-items: center;
79
+ background: #2a2a2a;
80
+ border: 1px solid #444;
81
+ border-radius: 999px;
82
+ padding: 3px;
83
+ gap: 3px;
84
+ }
85
+ .lp-appearance-btn {
86
+ display: inline-flex;
87
+ align-items: center;
88
+ gap: 5px;
89
+ background: transparent;
90
+ color: #aaa;
91
+ border: none;
92
+ border-radius: 999px;
93
+ padding: 5px 10px;
94
+ font-size: 13px;
95
+ cursor: pointer;
96
+ transition: background 0.15s, color 0.15s;
97
+ }
98
+ .lp-appearance-btn:hover {
99
+ color: #e5e5e5;
100
+ }
101
+ .lp-appearance-active {
102
+ background: #3a3a3a;
103
+ color: #fff;
104
+ font-weight: 500;
105
+ }
106
+ .lp-editor-btn {
107
+ display: inline-flex;
108
+ align-items: center;
109
+ gap: 6px;
110
+ background: #2a2a2a;
111
+ color: #e5e5e5;
112
+ border: 1px solid #444;
113
+ border-radius: 8px;
114
+ padding: 7px 12px;
115
+ font-size: 13px;
116
+ line-height: 1.4;
117
+ cursor: pointer;
118
+ transition: background 0.15s, border-color 0.15s, box-shadow 0.15s;
119
+ }
120
+ .lp-editor-btn:hover:not(:disabled) {
121
+ background: #333;
122
+ border-color: #555;
123
+ }
124
+ .lp-editor-btn:disabled {
125
+ opacity: 0.5;
126
+ cursor: not-allowed;
127
+ }
128
+ .lp-editor-btn-group {
129
+ display: inline-flex;
130
+ align-items: center;
131
+ gap: 6px;
132
+ }
133
+ .lp-editor-btn-primary {
134
+ background: #34d399;
135
+ border-color: #34d399;
136
+ color: #111;
137
+ font-weight: 600;
138
+ }
139
+ .lp-editor-btn-primary:hover:not(:disabled) {
140
+ background: #10b981;
141
+ border-color: #10b981;
142
+ }
143
+ .lp-editor-select {
144
+ background: #2a2a2a;
145
+ color: #e5e5e5;
146
+ border: 1px solid #444;
147
+ border-radius: 6px;
148
+ padding: 6px 10px;
149
+ font-size: 13px;
150
+ outline: none;
151
+ max-width: 120px;
152
+ }
153
+ .lp-editor-select:focus {
154
+ border-color: #5b8cff;
155
+ }
156
+ .lp-editor-export {
157
+ position: relative;
158
+ }
159
+ .lp-editor-export-toggle {
160
+ display: inline-flex;
161
+ align-items: center;
162
+ gap: 6px;
163
+ }
164
+ .lp-editor-caret {
165
+ font-size: 10px;
166
+ line-height: 1;
167
+ transform: translateY(1px);
168
+ }
169
+ .lp-editor-export-menu {
170
+ position: absolute;
171
+ top: calc(100% + 6px);
172
+ right: 0;
173
+ min-width: 220px;
174
+ background: #2a2a2a;
175
+ border: 1px solid #444;
176
+ border-radius: 8px;
177
+ padding: 6px;
178
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
179
+ z-index: 1000;
180
+ display: flex;
181
+ flex-direction: column;
182
+ gap: 2px;
183
+ }
184
+ .lp-editor-export-menu[hidden] {
185
+ display: none !important;
186
+ }
187
+ .lp-editor-export-item {
188
+ display: flex;
189
+ align-items: center;
190
+ gap: 10px;
191
+ width: 100%;
192
+ padding: 8px 10px;
193
+ background: transparent;
194
+ border: none;
195
+ border-radius: 6px;
196
+ color: #e5e5e5;
197
+ font-size: 14px;
198
+ cursor: pointer;
199
+ text-align: left;
200
+ }
201
+ .lp-editor-export-item:hover {
202
+ background: #3a3a3a;
203
+ }
204
+ .lp-editor-export-icon {
205
+ width: 20px;
206
+ text-align: center;
207
+ color: #aaa;
208
+ font-size: 14px;
209
+ }
210
+ .lp-editor-export-label {
211
+ flex: 1;
212
+ }
213
+ .lp-editor-export-tag {
214
+ font-size: 11px;
215
+ color: #999;
216
+ background: #3a3a3a;
217
+ padding: 2px 6px;
218
+ border-radius: 4px;
219
+ }
220
+ .lp-editor-workspace {
221
+ display: flex;
222
+ flex: 1;
223
+ min-height: 0;
224
+ }
225
+ .lp-editor-left-panel {
226
+ width: 180px;
227
+ flex: none;
228
+ background: #1e1e1e;
229
+ border-right: 1px solid #333;
230
+ overflow-y: auto;
231
+ padding: 12px;
232
+ position: relative;
233
+ }
234
+ .lp-editor-right-panel {
235
+ width: 400px;
236
+ flex: none;
237
+ background: #1e1e1e;
238
+ border-left: 1px solid #333;
239
+ overflow-y: auto;
240
+ padding: 16px;
241
+ }
242
+ .lp-editor-stage {
243
+ flex: 1;
244
+ display: flex;
245
+ align-items: center;
246
+ justify-content: center;
247
+ overflow: hidden;
248
+ position: relative;
249
+ background-color: #1a1a1a;
250
+ background-image: radial-gradient(circle, rgba(255,255,255,0.12) 1.5px, transparent 1.5px);
251
+ background-size: 28px 28px;
252
+ background-position: center center;
253
+ }
254
+ .lp-editor-stage-scaler {
255
+ transform-origin: center center;
256
+ transition: transform 0.2s ease;
257
+ position: relative;
258
+ }
259
+ .lp-editor-page-counter {
260
+ position: absolute;
261
+ bottom: -32px;
262
+ left: 50%;
263
+ transform: translateX(-50%);
264
+ color: #888;
265
+ font-size: 13px;
266
+ font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
267
+ }
268
+ .lp-editor-thumbnails {
269
+ display: flex;
270
+ flex-direction: column;
271
+ gap: 10px;
272
+ }
273
+ .lp-thumbnail {
274
+ width: 100%;
275
+ aspect-ratio: 16 / 9;
276
+ border: 2px solid transparent;
277
+ border-radius: 6px;
278
+ background: #2a2a2a;
279
+ cursor: grab;
280
+ display: flex;
281
+ flex-direction: column;
282
+ justify-content: center;
283
+ padding: 10px;
284
+ text-align: left;
285
+ color: #bbb;
286
+ transition: border-color 0.15s, background 0.15s, opacity 0.15s;
287
+ font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
288
+ position: relative;
289
+ user-select: none;
290
+ -webkit-user-select: none;
291
+ outline: none;
292
+ }
293
+ .lp-thumbnail:hover {
294
+ background: #333;
295
+ }
296
+ .lp-thumbnail:focus-visible {
297
+ border-color: #5b8cff;
298
+ }
299
+ .lp-thumbnail.active {
300
+ border-color: #3b82f6;
301
+ background: #26354f;
302
+ color: #fff;
303
+ }
304
+ .lp-thumbnail.dragging,
305
+ .lp-thumbnail:active {
306
+ cursor: grabbing;
307
+ }
308
+ .lp-thumbnail.dragging {
309
+ opacity: 0.45;
310
+ border: 2px dashed #3b82f6;
311
+ background: #1f2937;
312
+ }
313
+ .lp-thumbnail.drag-over {
314
+ border-color: #10b981;
315
+ background: #1f3d32;
316
+ }
317
+ .lp-thumbnail-index {
318
+ font-size: 11px;
319
+ color: #888;
320
+ margin-bottom: 4px;
321
+ }
322
+ .lp-thumbnail-title {
323
+ font-size: 13px;
324
+ font-weight: 500;
325
+ line-height: 1.3;
326
+ overflow: hidden;
327
+ text-overflow: ellipsis;
328
+ display: -webkit-box;
329
+ -webkit-line-clamp: 2;
330
+ -webkit-box-orient: vertical;
331
+ }
332
+ .lp-thumbnail-layout {
333
+ font-size: 11px;
334
+ color: #666;
335
+ margin-top: 4px;
336
+ }
337
+ .lp-thumbnail-drag-handle {
338
+ position: absolute;
339
+ top: 6px;
340
+ left: 6px;
341
+ width: 20px;
342
+ height: 24px;
343
+ display: flex;
344
+ flex-direction: column;
345
+ align-items: center;
346
+ justify-content: center;
347
+ gap: 2px;
348
+ opacity: 0.45;
349
+ z-index: 4;
350
+ color: #888;
351
+ transition: opacity 0.15s ease, color 0.15s ease, background 0.15s ease;
352
+ line-height: 1;
353
+ font-size: 10px;
354
+ user-select: none;
355
+ -webkit-user-select: none;
356
+ pointer-events: none;
357
+ border-radius: 4px;
358
+ padding: 2px;
359
+ }
360
+ .lp-thumbnail:hover .lp-thumbnail-drag-handle,
361
+ .lp-thumbnail-drag-handle:hover {
362
+ opacity: 0.9;
363
+ color: #bbb;
364
+ background: rgba(255, 255, 255, 0.08);
365
+ }
366
+ .lp-thumbnail.dragging .lp-thumbnail-drag-handle {
367
+ opacity: 1;
368
+ color: #fff;
369
+ background: rgba(255, 255, 255, 0.15);
370
+ }
371
+ .lp-thumbnail-drop-indicator {
372
+ position: absolute;
373
+ left: 0;
374
+ right: 0;
375
+ height: 3px;
376
+ background: #3b82f6;
377
+ border-radius: 2px;
378
+ pointer-events: none;
379
+ z-index: 10;
380
+ opacity: 0;
381
+ transition: opacity 0.1s ease;
382
+ box-shadow: 0 0 8px rgba(59, 130, 246, 0.6);
383
+ }
384
+ .lp-thumbnail-drop-indicator.visible {
385
+ opacity: 1;
386
+ }
387
+ .lp-property-header {
388
+ font-size: 14px;
389
+ font-weight: 600;
390
+ margin-bottom: 12px;
391
+ color: #fff;
392
+ }
393
+ .lp-property-empty {
394
+ color: #888;
395
+ font-size: 13px;
396
+ line-height: 1.5;
397
+ }
398
+ .lp-property-group {
399
+ margin-bottom: 16px;
400
+ }
401
+ .lp-property-label {
402
+ font-size: 12px;
403
+ color: #999;
404
+ margin-bottom: 6px;
405
+ display: block;
406
+ }
407
+ .lp-property-input,
408
+ .lp-property-textarea {
409
+ width: 100%;
410
+ background: #2a2a2a;
411
+ border: 1px solid #444;
412
+ border-radius: 6px;
413
+ color: #e5e5e5;
414
+ padding: 8px 10px;
415
+ font-size: 13px;
416
+ font-family: inherit;
417
+ }
418
+ .lp-property-input:focus,
419
+ .lp-property-textarea:focus {
420
+ outline: none;
421
+ border-color: #3b82f6;
422
+ }
423
+ .lp-property-textarea {
424
+ min-height: 80px;
425
+ resize: vertical;
426
+ }
427
+ .lp-add-slide-modal-overlay {
428
+ position: fixed;
429
+ inset: 0;
430
+ background: rgba(0,0,0,0.6);
431
+ z-index: 2000;
432
+ display: flex;
433
+ align-items: center;
434
+ justify-content: center;
435
+ opacity: 0;
436
+ pointer-events: none;
437
+ transition: opacity 0.2s ease;
438
+ }
439
+ .lp-add-slide-modal-overlay.active {
440
+ opacity: 1;
441
+ pointer-events: auto;
442
+ }
443
+ .lp-add-slide-modal {
444
+ width: 600px;
445
+ max-width: 90vw;
446
+ max-height: 80vh;
447
+ background: #1e1e1e;
448
+ border: 1px solid #333;
449
+ border-radius: 12px;
450
+ overflow: hidden;
451
+ display: flex;
452
+ flex-direction: column;
453
+ box-shadow: 0 20px 60px rgba(0,0,0,0.5);
454
+ }
455
+ .lp-add-slide-modal-header {
456
+ display: flex;
457
+ align-items: center;
458
+ justify-content: space-between;
459
+ padding: 16px 20px;
460
+ border-bottom: 1px solid #333;
461
+ }
462
+ .lp-add-slide-modal-title {
463
+ font-size: 16px;
464
+ font-weight: 600;
465
+ color: #fff;
466
+ }
467
+ .lp-add-slide-modal-close {
468
+ background: transparent;
469
+ border: none;
470
+ color: #888;
471
+ font-size: 20px;
472
+ cursor: pointer;
473
+ }
474
+ .lp-add-slide-modal-close:hover {
475
+ color: #fff;
476
+ }
477
+ .lp-add-slide-modal-body {
478
+ padding: 16px 20px;
479
+ overflow-y: auto;
480
+ flex: 1;
481
+ }
482
+ .lp-add-slide-section-title {
483
+ font-size: 13px;
484
+ font-weight: 600;
485
+ color: #bbb;
486
+ margin: 16px 0 10px;
487
+ }
488
+ .lp-add-slide-section-title:first-child {
489
+ margin-top: 0;
490
+ }
491
+ .lp-add-slide-grid {
492
+ display: grid;
493
+ grid-template-columns: repeat(4, 1fr);
494
+ gap: 10px;
495
+ }
496
+ .lp-add-slide-item {
497
+ aspect-ratio: 16 / 9;
498
+ background: #2a2a2a;
499
+ border: 1px solid #444;
500
+ border-radius: 6px;
501
+ display: flex;
502
+ flex-direction: column;
503
+ align-items: center;
504
+ justify-content: center;
505
+ gap: 6px;
506
+ cursor: pointer;
507
+ transition: background 0.15s, border-color 0.15s;
508
+ padding: 8px;
509
+ text-align: center;
510
+ }
511
+ .lp-add-slide-item:hover {
512
+ background: #333;
513
+ border-color: #5b8cff;
514
+ }
515
+ .lp-add-slide-item-icon {
516
+ font-size: 24px;
517
+ color: #888;
518
+ }
519
+ .lp-add-slide-item-label {
520
+ font-size: 12px;
521
+ color: #bbb;
522
+ }
523
+ .lp-loading {
524
+ position: fixed;
525
+ inset: 0;
526
+ display: flex;
527
+ flex-direction: column;
528
+ align-items: center;
529
+ justify-content: center;
530
+ gap: 16px;
531
+ background: #1a1a1a;
532
+ color: #e5e5e5;
533
+ z-index: 3000;
534
+ }
535
+ .lp-loading.hidden {
536
+ display: none;
537
+ }
538
+ .lp-spinner {
539
+ width: 40px;
540
+ height: 40px;
541
+ border: 3px solid #333;
542
+ border-top-color: #34d399;
543
+ border-radius: 50%;
544
+ animation: lp-spin 0.8s linear infinite;
545
+ }
546
+ @keyframes lp-spin {
547
+ to { transform: rotate(360deg); }
548
+ }
549
+ </style>
550
+ </head>
551
+ <body class="lp-editor-body">
552
+ <div id="lp-loading" class="lp-loading">
553
+ <div class="lp-spinner"></div>
554
+ <div>正在加载编辑器...</div>
555
+ </div>
556
+ <div id="lp-editor-root" class="lp-editor-root" style="display:none;">
557
+ <div id="lp-editor-bar" class="lp-editor-bar"></div>
558
+ <div class="lp-editor-workspace">
559
+ <aside id="lp-left-panel" class="lp-editor-left-panel"></aside>
560
+ <main class="lp-editor-stage">
561
+ <div class="lp-editor-stage-scaler">
562
+ <div id="lp-slides"></div>
563
+ <div class="lp-editor-page-counter"><span id="lp-current">1</span> / <span id="lp-total">1</span></div>
564
+ </div>
565
+ <div class="lp-editor-zoom-bar">
566
+ <button id="lp-zoom-out" title="缩小">-</button>
567
+ <input type="range" id="lp-zoom-slider" min="35" max="150" value="100">
568
+ <button id="lp-zoom-in" title="放大">+</button>
569
+ <button id="lp-zoom-fit" title="适应画布">适应</button>
570
+ <span id="lp-zoom-value">100%</span>
571
+ </div>
572
+ </main>
573
+ <aside id="lp-right-panel" class="lp-editor-right-panel"></aside>
574
+ </div>
575
+ <div id="lp-modal"></div>
576
+ </div>
577
+
578
+ <script src="/editor.js"></script>
579
+ </body>
580
+ </html>