digital-tools 2.0.2 → 2.1.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.
- package/CHANGELOG.md +17 -0
- package/package.json +3 -4
- package/src/define.js +267 -0
- package/src/entities/advertising.js +999 -0
- package/src/entities/ai.js +756 -0
- package/src/entities/analytics.js +1588 -0
- package/src/entities/automation.js +601 -0
- package/src/entities/communication.js +1150 -0
- package/src/entities/crm.js +1386 -0
- package/src/entities/design.js +546 -0
- package/src/entities/development.js +2212 -0
- package/src/entities/document.js +874 -0
- package/src/entities/ecommerce.js +1429 -0
- package/src/entities/experiment.js +1039 -0
- package/src/entities/finance.js +3478 -0
- package/src/entities/forms.js +1892 -0
- package/src/entities/hr.js +661 -0
- package/src/entities/identity.js +997 -0
- package/src/entities/index.js +282 -0
- package/src/entities/infrastructure.js +1153 -0
- package/src/entities/knowledge.js +1438 -0
- package/src/entities/marketing.js +1610 -0
- package/src/entities/media.js +1634 -0
- package/src/entities/notification.js +1199 -0
- package/src/entities/presentation.js +1274 -0
- package/src/entities/productivity.js +1317 -0
- package/src/entities/project-management.js +1136 -0
- package/src/entities/recruiting.js +736 -0
- package/src/entities/shipping.js +509 -0
- package/src/entities/signature.js +1102 -0
- package/src/entities/site.js +222 -0
- package/src/entities/spreadsheet.js +1341 -0
- package/src/entities/storage.js +1198 -0
- package/src/entities/support.js +1166 -0
- package/src/entities/video-conferencing.js +1750 -0
- package/src/entities/video.js +950 -0
- package/src/entities.js +1663 -0
- package/src/index.js +74 -0
- package/src/providers/analytics/index.js +17 -0
- package/src/providers/analytics/mixpanel.js +255 -0
- package/src/providers/calendar/cal-com.js +303 -0
- package/src/providers/calendar/google-calendar.js +335 -0
- package/src/providers/calendar/index.js +20 -0
- package/src/providers/crm/hubspot.js +566 -0
- package/src/providers/crm/index.js +17 -0
- package/src/providers/development/github.js +472 -0
- package/src/providers/development/index.js +17 -0
- package/src/providers/ecommerce/index.js +17 -0
- package/src/providers/ecommerce/shopify.js +378 -0
- package/src/providers/email/index.js +20 -0
- package/src/providers/email/resend.js +258 -0
- package/src/providers/email/sendgrid.js +161 -0
- package/src/providers/finance/index.js +17 -0
- package/src/providers/finance/stripe.js +549 -0
- package/src/providers/forms/index.js +17 -0
- package/src/providers/forms/typeform.js +500 -0
- package/src/providers/index.js +123 -0
- package/src/providers/knowledge/index.js +17 -0
- package/src/providers/knowledge/notion.js +389 -0
- package/src/providers/marketing/index.js +17 -0
- package/src/providers/marketing/mailchimp.js +443 -0
- package/src/providers/media/cloudinary.js +318 -0
- package/src/providers/media/index.js +17 -0
- package/src/providers/messaging/index.js +20 -0
- package/src/providers/messaging/slack.js +393 -0
- package/src/providers/messaging/twilio-sms.js +249 -0
- package/src/providers/project-management/index.js +17 -0
- package/src/providers/project-management/linear.js +575 -0
- package/src/providers/registry.js +86 -0
- package/src/providers/spreadsheet/google-sheets.js +375 -0
- package/src/providers/spreadsheet/index.js +20 -0
- package/src/providers/spreadsheet/xlsx.js +423 -0
- package/src/providers/storage/index.js +24 -0
- package/src/providers/storage/s3.js +419 -0
- package/src/providers/support/index.js +17 -0
- package/src/providers/support/zendesk.js +373 -0
- package/src/providers/tasks/index.js +17 -0
- package/src/providers/tasks/todoist.js +286 -0
- package/src/providers/types.js +9 -0
- package/src/providers/video-conferencing/google-meet.js +286 -0
- package/src/providers/video-conferencing/index.js +31 -0
- package/src/providers/video-conferencing/jitsi.js +254 -0
- package/src/providers/video-conferencing/teams.js +270 -0
- package/src/providers/video-conferencing/zoom.js +332 -0
- package/src/registry.js +128 -0
- package/src/tools/communication.js +184 -0
- package/src/tools/data.js +205 -0
- package/src/tools/index.js +11 -0
- package/src/tools/web.js +137 -0
- package/src/types.js +10 -0
- package/test/define.test.js +306 -0
- package/test/registry.test.js +357 -0
- package/test/tools.test.js +363 -0
|
@@ -0,0 +1,1274 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Presentation Entity Types (Nouns)
|
|
3
|
+
*
|
|
4
|
+
* Semantic type definitions for presentations that support
|
|
5
|
+
* Google Slides, Microsoft PowerPoint/PPTX, and Reveal.js/MDX formats.
|
|
6
|
+
* Each entity defines:
|
|
7
|
+
* - Properties: The data fields
|
|
8
|
+
* - Actions: Operations that can be performed (Verbs)
|
|
9
|
+
* - Events: State changes that occur
|
|
10
|
+
*
|
|
11
|
+
* @packageDocumentation
|
|
12
|
+
*/
|
|
13
|
+
// =============================================================================
|
|
14
|
+
// Presentation
|
|
15
|
+
// =============================================================================
|
|
16
|
+
/**
|
|
17
|
+
* Presentation entity
|
|
18
|
+
*
|
|
19
|
+
* Represents a slide presentation for creating and delivering visual content.
|
|
20
|
+
* Supports Google Slides, PowerPoint/PPTX, and Reveal.js/MDX formats.
|
|
21
|
+
*/
|
|
22
|
+
export const Presentation = {
|
|
23
|
+
singular: 'presentation',
|
|
24
|
+
plural: 'presentations',
|
|
25
|
+
description: 'A slide presentation for creating and delivering visual content',
|
|
26
|
+
properties: {
|
|
27
|
+
// Identity
|
|
28
|
+
title: {
|
|
29
|
+
type: 'string',
|
|
30
|
+
description: 'Presentation title',
|
|
31
|
+
},
|
|
32
|
+
slug: {
|
|
33
|
+
type: 'string',
|
|
34
|
+
optional: true,
|
|
35
|
+
description: 'URL-friendly identifier',
|
|
36
|
+
},
|
|
37
|
+
description: {
|
|
38
|
+
type: 'string',
|
|
39
|
+
optional: true,
|
|
40
|
+
description: 'Presentation description or summary',
|
|
41
|
+
},
|
|
42
|
+
subtitle: {
|
|
43
|
+
type: 'string',
|
|
44
|
+
optional: true,
|
|
45
|
+
description: 'Presentation subtitle',
|
|
46
|
+
},
|
|
47
|
+
// Format
|
|
48
|
+
format: {
|
|
49
|
+
type: 'string',
|
|
50
|
+
description: 'Presentation format: pptx, gslides, revealjs, mdx, pdf',
|
|
51
|
+
examples: ['pptx', 'gslides', 'revealjs', 'mdx', 'pdf', 'keynote'],
|
|
52
|
+
},
|
|
53
|
+
aspectRatio: {
|
|
54
|
+
type: 'string',
|
|
55
|
+
optional: true,
|
|
56
|
+
description: 'Slide aspect ratio: 16:9, 4:3, 16:10',
|
|
57
|
+
examples: ['16:9', '4:3', '16:10'],
|
|
58
|
+
},
|
|
59
|
+
slideSize: {
|
|
60
|
+
type: 'json',
|
|
61
|
+
optional: true,
|
|
62
|
+
description: 'Custom slide dimensions',
|
|
63
|
+
},
|
|
64
|
+
// Status
|
|
65
|
+
status: {
|
|
66
|
+
type: 'string',
|
|
67
|
+
description: 'Presentation status: draft, in-review, ready, presented, archived',
|
|
68
|
+
examples: ['draft', 'in-review', 'ready', 'presented', 'archived'],
|
|
69
|
+
},
|
|
70
|
+
visibility: {
|
|
71
|
+
type: 'string',
|
|
72
|
+
description: 'Visibility: private, internal, public',
|
|
73
|
+
examples: ['private', 'internal', 'public'],
|
|
74
|
+
},
|
|
75
|
+
// Structure
|
|
76
|
+
slideCount: {
|
|
77
|
+
type: 'number',
|
|
78
|
+
optional: true,
|
|
79
|
+
description: 'Total number of slides',
|
|
80
|
+
},
|
|
81
|
+
duration: {
|
|
82
|
+
type: 'number',
|
|
83
|
+
optional: true,
|
|
84
|
+
description: 'Estimated presentation duration in minutes',
|
|
85
|
+
},
|
|
86
|
+
// Theme and styling
|
|
87
|
+
theme: {
|
|
88
|
+
type: 'string',
|
|
89
|
+
optional: true,
|
|
90
|
+
description: 'Presentation theme name',
|
|
91
|
+
},
|
|
92
|
+
themeConfig: {
|
|
93
|
+
type: 'json',
|
|
94
|
+
optional: true,
|
|
95
|
+
description: 'Theme configuration and customization',
|
|
96
|
+
},
|
|
97
|
+
masterSlides: {
|
|
98
|
+
type: 'json',
|
|
99
|
+
optional: true,
|
|
100
|
+
description: 'Master slide layouts',
|
|
101
|
+
},
|
|
102
|
+
colorScheme: {
|
|
103
|
+
type: 'json',
|
|
104
|
+
optional: true,
|
|
105
|
+
description: 'Color scheme configuration',
|
|
106
|
+
},
|
|
107
|
+
fontScheme: {
|
|
108
|
+
type: 'json',
|
|
109
|
+
optional: true,
|
|
110
|
+
description: 'Font scheme configuration',
|
|
111
|
+
},
|
|
112
|
+
// Transitions and animations
|
|
113
|
+
defaultTransition: {
|
|
114
|
+
type: 'string',
|
|
115
|
+
optional: true,
|
|
116
|
+
description: 'Default slide transition effect',
|
|
117
|
+
examples: ['none', 'fade', 'slide', 'zoom', 'flip', 'cube', 'wipe'],
|
|
118
|
+
},
|
|
119
|
+
transitionSpeed: {
|
|
120
|
+
type: 'string',
|
|
121
|
+
optional: true,
|
|
122
|
+
description: 'Transition speed: slow, default, fast',
|
|
123
|
+
examples: ['slow', 'default', 'fast'],
|
|
124
|
+
},
|
|
125
|
+
// Presenter features
|
|
126
|
+
hasNotes: {
|
|
127
|
+
type: 'boolean',
|
|
128
|
+
optional: true,
|
|
129
|
+
description: 'Whether presentation includes speaker notes',
|
|
130
|
+
},
|
|
131
|
+
hasTimings: {
|
|
132
|
+
type: 'boolean',
|
|
133
|
+
optional: true,
|
|
134
|
+
description: 'Whether slides have timing information',
|
|
135
|
+
},
|
|
136
|
+
autoAdvance: {
|
|
137
|
+
type: 'boolean',
|
|
138
|
+
optional: true,
|
|
139
|
+
description: 'Whether slides auto-advance',
|
|
140
|
+
},
|
|
141
|
+
autoAdvanceDelay: {
|
|
142
|
+
type: 'number',
|
|
143
|
+
optional: true,
|
|
144
|
+
description: 'Auto-advance delay in seconds',
|
|
145
|
+
},
|
|
146
|
+
loop: {
|
|
147
|
+
type: 'boolean',
|
|
148
|
+
optional: true,
|
|
149
|
+
description: 'Whether presentation loops',
|
|
150
|
+
},
|
|
151
|
+
// Collaboration
|
|
152
|
+
allowComments: {
|
|
153
|
+
type: 'boolean',
|
|
154
|
+
optional: true,
|
|
155
|
+
description: 'Whether comments are enabled',
|
|
156
|
+
},
|
|
157
|
+
shareMode: {
|
|
158
|
+
type: 'string',
|
|
159
|
+
optional: true,
|
|
160
|
+
description: 'Sharing mode: view, comment, edit, present',
|
|
161
|
+
examples: ['view', 'comment', 'edit', 'present'],
|
|
162
|
+
},
|
|
163
|
+
allowDownload: {
|
|
164
|
+
type: 'boolean',
|
|
165
|
+
optional: true,
|
|
166
|
+
description: 'Whether download is allowed',
|
|
167
|
+
},
|
|
168
|
+
// Templates
|
|
169
|
+
isTemplate: {
|
|
170
|
+
type: 'boolean',
|
|
171
|
+
optional: true,
|
|
172
|
+
description: 'Whether this is a template',
|
|
173
|
+
},
|
|
174
|
+
templateId: {
|
|
175
|
+
type: 'string',
|
|
176
|
+
optional: true,
|
|
177
|
+
description: 'ID of template this was created from',
|
|
178
|
+
},
|
|
179
|
+
templateCategory: {
|
|
180
|
+
type: 'string',
|
|
181
|
+
optional: true,
|
|
182
|
+
description: 'Template category',
|
|
183
|
+
examples: ['business', 'education', 'pitch-deck', 'report', 'training'],
|
|
184
|
+
},
|
|
185
|
+
// Publishing
|
|
186
|
+
published: {
|
|
187
|
+
type: 'boolean',
|
|
188
|
+
optional: true,
|
|
189
|
+
description: 'Whether presentation is published',
|
|
190
|
+
},
|
|
191
|
+
publishedUrl: {
|
|
192
|
+
type: 'url',
|
|
193
|
+
optional: true,
|
|
194
|
+
description: 'Published presentation URL',
|
|
195
|
+
},
|
|
196
|
+
publishedAt: {
|
|
197
|
+
type: 'datetime',
|
|
198
|
+
optional: true,
|
|
199
|
+
description: 'Publication timestamp',
|
|
200
|
+
},
|
|
201
|
+
embedCode: {
|
|
202
|
+
type: 'string',
|
|
203
|
+
optional: true,
|
|
204
|
+
description: 'HTML embed code',
|
|
205
|
+
},
|
|
206
|
+
// Presentation sessions
|
|
207
|
+
lastPresentedAt: {
|
|
208
|
+
type: 'datetime',
|
|
209
|
+
optional: true,
|
|
210
|
+
description: 'Last presentation timestamp',
|
|
211
|
+
},
|
|
212
|
+
presentationCount: {
|
|
213
|
+
type: 'number',
|
|
214
|
+
optional: true,
|
|
215
|
+
description: 'Number of times presented',
|
|
216
|
+
},
|
|
217
|
+
// Integration
|
|
218
|
+
externalId: {
|
|
219
|
+
type: 'string',
|
|
220
|
+
optional: true,
|
|
221
|
+
description: 'External system ID (Google Slides ID, OneDrive ID, etc.)',
|
|
222
|
+
},
|
|
223
|
+
externalUrl: {
|
|
224
|
+
type: 'url',
|
|
225
|
+
optional: true,
|
|
226
|
+
description: 'URL in external system',
|
|
227
|
+
},
|
|
228
|
+
syncEnabled: {
|
|
229
|
+
type: 'boolean',
|
|
230
|
+
optional: true,
|
|
231
|
+
description: 'Whether sync is enabled',
|
|
232
|
+
},
|
|
233
|
+
lastSyncedAt: {
|
|
234
|
+
type: 'datetime',
|
|
235
|
+
optional: true,
|
|
236
|
+
description: 'Last sync timestamp',
|
|
237
|
+
},
|
|
238
|
+
// Metadata
|
|
239
|
+
language: {
|
|
240
|
+
type: 'string',
|
|
241
|
+
optional: true,
|
|
242
|
+
description: 'Presentation language code',
|
|
243
|
+
},
|
|
244
|
+
author: {
|
|
245
|
+
type: 'string',
|
|
246
|
+
optional: true,
|
|
247
|
+
description: 'Presentation author name',
|
|
248
|
+
},
|
|
249
|
+
company: {
|
|
250
|
+
type: 'string',
|
|
251
|
+
optional: true,
|
|
252
|
+
description: 'Company or organization',
|
|
253
|
+
},
|
|
254
|
+
tags: {
|
|
255
|
+
type: 'string',
|
|
256
|
+
array: true,
|
|
257
|
+
optional: true,
|
|
258
|
+
description: 'Tags for categorization',
|
|
259
|
+
},
|
|
260
|
+
category: {
|
|
261
|
+
type: 'string',
|
|
262
|
+
optional: true,
|
|
263
|
+
description: 'Presentation category',
|
|
264
|
+
},
|
|
265
|
+
folder: {
|
|
266
|
+
type: 'string',
|
|
267
|
+
optional: true,
|
|
268
|
+
description: 'Folder or workspace path',
|
|
269
|
+
},
|
|
270
|
+
customMetadata: {
|
|
271
|
+
type: 'json',
|
|
272
|
+
optional: true,
|
|
273
|
+
description: 'Custom metadata fields',
|
|
274
|
+
},
|
|
275
|
+
// Analytics
|
|
276
|
+
viewCount: {
|
|
277
|
+
type: 'number',
|
|
278
|
+
optional: true,
|
|
279
|
+
description: 'Number of views',
|
|
280
|
+
},
|
|
281
|
+
downloadCount: {
|
|
282
|
+
type: 'number',
|
|
283
|
+
optional: true,
|
|
284
|
+
description: 'Number of downloads',
|
|
285
|
+
},
|
|
286
|
+
lastViewedAt: {
|
|
287
|
+
type: 'datetime',
|
|
288
|
+
optional: true,
|
|
289
|
+
description: 'Last view timestamp',
|
|
290
|
+
},
|
|
291
|
+
lastEditedAt: {
|
|
292
|
+
type: 'datetime',
|
|
293
|
+
optional: true,
|
|
294
|
+
description: 'Last edit timestamp',
|
|
295
|
+
},
|
|
296
|
+
},
|
|
297
|
+
relationships: {
|
|
298
|
+
owner: {
|
|
299
|
+
type: 'Contact',
|
|
300
|
+
description: 'Presentation owner',
|
|
301
|
+
},
|
|
302
|
+
creator: {
|
|
303
|
+
type: 'Contact',
|
|
304
|
+
description: 'User who created the presentation',
|
|
305
|
+
},
|
|
306
|
+
lastEditor: {
|
|
307
|
+
type: 'Contact',
|
|
308
|
+
required: false,
|
|
309
|
+
description: 'User who last edited',
|
|
310
|
+
},
|
|
311
|
+
slides: {
|
|
312
|
+
type: 'Slide[]',
|
|
313
|
+
backref: 'presentation',
|
|
314
|
+
description: 'Slides in this presentation',
|
|
315
|
+
},
|
|
316
|
+
collaborators: {
|
|
317
|
+
type: 'Contact[]',
|
|
318
|
+
description: 'Users with access',
|
|
319
|
+
},
|
|
320
|
+
},
|
|
321
|
+
actions: [
|
|
322
|
+
'create',
|
|
323
|
+
'open',
|
|
324
|
+
'edit',
|
|
325
|
+
'save',
|
|
326
|
+
'saveAs',
|
|
327
|
+
'duplicate',
|
|
328
|
+
'rename',
|
|
329
|
+
'delete',
|
|
330
|
+
'restore',
|
|
331
|
+
'export',
|
|
332
|
+
'download',
|
|
333
|
+
'print',
|
|
334
|
+
'share',
|
|
335
|
+
'unshare',
|
|
336
|
+
'publish',
|
|
337
|
+
'unpublish',
|
|
338
|
+
'archive',
|
|
339
|
+
'unarchive',
|
|
340
|
+
'move',
|
|
341
|
+
'copy',
|
|
342
|
+
'present',
|
|
343
|
+
'startPresentation',
|
|
344
|
+
'endPresentation',
|
|
345
|
+
'addSlide',
|
|
346
|
+
'removeSlide',
|
|
347
|
+
'reorderSlides',
|
|
348
|
+
'duplicateSlide',
|
|
349
|
+
'makeTemplate',
|
|
350
|
+
'createFromTemplate',
|
|
351
|
+
'applyTheme',
|
|
352
|
+
'changeAspectRatio',
|
|
353
|
+
'setTransitions',
|
|
354
|
+
'addAnimation',
|
|
355
|
+
'recordPresentation',
|
|
356
|
+
'embedPresentation',
|
|
357
|
+
],
|
|
358
|
+
events: [
|
|
359
|
+
'created',
|
|
360
|
+
'opened',
|
|
361
|
+
'edited',
|
|
362
|
+
'saved',
|
|
363
|
+
'renamed',
|
|
364
|
+
'deleted',
|
|
365
|
+
'restored',
|
|
366
|
+
'exported',
|
|
367
|
+
'downloaded',
|
|
368
|
+
'printed',
|
|
369
|
+
'shared',
|
|
370
|
+
'unshared',
|
|
371
|
+
'published',
|
|
372
|
+
'unpublished',
|
|
373
|
+
'archived',
|
|
374
|
+
'unarchived',
|
|
375
|
+
'moved',
|
|
376
|
+
'copied',
|
|
377
|
+
'presented',
|
|
378
|
+
'presentationStarted',
|
|
379
|
+
'presentationEnded',
|
|
380
|
+
'slideAdded',
|
|
381
|
+
'slideRemoved',
|
|
382
|
+
'slidesReordered',
|
|
383
|
+
'slideDuplicated',
|
|
384
|
+
'themeApplied',
|
|
385
|
+
'aspectRatioChanged',
|
|
386
|
+
'transitionsSet',
|
|
387
|
+
'animationAdded',
|
|
388
|
+
'recorded',
|
|
389
|
+
'embedded',
|
|
390
|
+
'collaboratorAdded',
|
|
391
|
+
'collaboratorRemoved',
|
|
392
|
+
'permissionChanged',
|
|
393
|
+
'synced',
|
|
394
|
+
'viewed',
|
|
395
|
+
],
|
|
396
|
+
};
|
|
397
|
+
// =============================================================================
|
|
398
|
+
// Slide
|
|
399
|
+
// =============================================================================
|
|
400
|
+
/**
|
|
401
|
+
* Slide entity
|
|
402
|
+
*
|
|
403
|
+
* Represents a single slide within a presentation.
|
|
404
|
+
*/
|
|
405
|
+
export const Slide = {
|
|
406
|
+
singular: 'slide',
|
|
407
|
+
plural: 'slides',
|
|
408
|
+
description: 'A single slide within a presentation',
|
|
409
|
+
properties: {
|
|
410
|
+
// Identity
|
|
411
|
+
title: {
|
|
412
|
+
type: 'string',
|
|
413
|
+
optional: true,
|
|
414
|
+
description: 'Slide title',
|
|
415
|
+
},
|
|
416
|
+
index: {
|
|
417
|
+
type: 'number',
|
|
418
|
+
description: 'Slide position in presentation (0-based)',
|
|
419
|
+
},
|
|
420
|
+
slideId: {
|
|
421
|
+
type: 'string',
|
|
422
|
+
optional: true,
|
|
423
|
+
description: 'Internal slide identifier',
|
|
424
|
+
},
|
|
425
|
+
// Layout
|
|
426
|
+
layout: {
|
|
427
|
+
type: 'string',
|
|
428
|
+
optional: true,
|
|
429
|
+
description: 'Slide layout type',
|
|
430
|
+
examples: [
|
|
431
|
+
'title',
|
|
432
|
+
'title-content',
|
|
433
|
+
'section-header',
|
|
434
|
+
'two-column',
|
|
435
|
+
'comparison',
|
|
436
|
+
'blank',
|
|
437
|
+
'content',
|
|
438
|
+
'title-only',
|
|
439
|
+
'picture',
|
|
440
|
+
],
|
|
441
|
+
},
|
|
442
|
+
masterSlideId: {
|
|
443
|
+
type: 'string',
|
|
444
|
+
optional: true,
|
|
445
|
+
description: 'Master slide/layout reference',
|
|
446
|
+
},
|
|
447
|
+
// Background
|
|
448
|
+
backgroundColor: {
|
|
449
|
+
type: 'string',
|
|
450
|
+
optional: true,
|
|
451
|
+
description: 'Background color (hex)',
|
|
452
|
+
},
|
|
453
|
+
backgroundImage: {
|
|
454
|
+
type: 'url',
|
|
455
|
+
optional: true,
|
|
456
|
+
description: 'Background image URL',
|
|
457
|
+
},
|
|
458
|
+
backgroundType: {
|
|
459
|
+
type: 'string',
|
|
460
|
+
optional: true,
|
|
461
|
+
description: 'Background type: solid, gradient, image, video',
|
|
462
|
+
examples: ['solid', 'gradient', 'image', 'video'],
|
|
463
|
+
},
|
|
464
|
+
backgroundGradient: {
|
|
465
|
+
type: 'json',
|
|
466
|
+
optional: true,
|
|
467
|
+
description: 'Gradient configuration',
|
|
468
|
+
},
|
|
469
|
+
// Transition
|
|
470
|
+
transition: {
|
|
471
|
+
type: 'string',
|
|
472
|
+
optional: true,
|
|
473
|
+
description: 'Slide transition effect',
|
|
474
|
+
examples: ['none', 'fade', 'slide', 'zoom', 'flip', 'cube', 'wipe', 'dissolve'],
|
|
475
|
+
},
|
|
476
|
+
transitionDuration: {
|
|
477
|
+
type: 'number',
|
|
478
|
+
optional: true,
|
|
479
|
+
description: 'Transition duration in milliseconds',
|
|
480
|
+
},
|
|
481
|
+
transitionDirection: {
|
|
482
|
+
type: 'string',
|
|
483
|
+
optional: true,
|
|
484
|
+
description: 'Transition direction',
|
|
485
|
+
examples: ['left', 'right', 'up', 'down'],
|
|
486
|
+
},
|
|
487
|
+
// Timing
|
|
488
|
+
duration: {
|
|
489
|
+
type: 'number',
|
|
490
|
+
optional: true,
|
|
491
|
+
description: 'Slide display duration in seconds',
|
|
492
|
+
},
|
|
493
|
+
autoAdvance: {
|
|
494
|
+
type: 'boolean',
|
|
495
|
+
optional: true,
|
|
496
|
+
description: 'Whether slide auto-advances',
|
|
497
|
+
},
|
|
498
|
+
advanceAfter: {
|
|
499
|
+
type: 'number',
|
|
500
|
+
optional: true,
|
|
501
|
+
description: 'Seconds before auto-advance',
|
|
502
|
+
},
|
|
503
|
+
// Content
|
|
504
|
+
hasContent: {
|
|
505
|
+
type: 'boolean',
|
|
506
|
+
optional: true,
|
|
507
|
+
description: 'Whether slide has content elements',
|
|
508
|
+
},
|
|
509
|
+
elementCount: {
|
|
510
|
+
type: 'number',
|
|
511
|
+
optional: true,
|
|
512
|
+
description: 'Number of elements on slide',
|
|
513
|
+
},
|
|
514
|
+
// Notes
|
|
515
|
+
notes: {
|
|
516
|
+
type: 'string',
|
|
517
|
+
optional: true,
|
|
518
|
+
description: 'Speaker notes for this slide',
|
|
519
|
+
},
|
|
520
|
+
hasNotes: {
|
|
521
|
+
type: 'boolean',
|
|
522
|
+
optional: true,
|
|
523
|
+
description: 'Whether slide has speaker notes',
|
|
524
|
+
},
|
|
525
|
+
// Visibility
|
|
526
|
+
hidden: {
|
|
527
|
+
type: 'boolean',
|
|
528
|
+
optional: true,
|
|
529
|
+
description: 'Whether slide is hidden',
|
|
530
|
+
},
|
|
531
|
+
// Section
|
|
532
|
+
sectionTitle: {
|
|
533
|
+
type: 'string',
|
|
534
|
+
optional: true,
|
|
535
|
+
description: 'Section this slide belongs to',
|
|
536
|
+
},
|
|
537
|
+
isSection: {
|
|
538
|
+
type: 'boolean',
|
|
539
|
+
optional: true,
|
|
540
|
+
description: 'Whether this is a section divider',
|
|
541
|
+
},
|
|
542
|
+
// Animations
|
|
543
|
+
hasAnimations: {
|
|
544
|
+
type: 'boolean',
|
|
545
|
+
optional: true,
|
|
546
|
+
description: 'Whether slide has animations',
|
|
547
|
+
},
|
|
548
|
+
animationCount: {
|
|
549
|
+
type: 'number',
|
|
550
|
+
optional: true,
|
|
551
|
+
description: 'Number of animations',
|
|
552
|
+
},
|
|
553
|
+
// Thumbnail
|
|
554
|
+
thumbnail: {
|
|
555
|
+
type: 'url',
|
|
556
|
+
optional: true,
|
|
557
|
+
description: 'Slide thumbnail URL',
|
|
558
|
+
},
|
|
559
|
+
// Metadata
|
|
560
|
+
metadata: {
|
|
561
|
+
type: 'json',
|
|
562
|
+
optional: true,
|
|
563
|
+
description: 'Custom metadata',
|
|
564
|
+
},
|
|
565
|
+
},
|
|
566
|
+
relationships: {
|
|
567
|
+
presentation: {
|
|
568
|
+
type: 'Presentation',
|
|
569
|
+
backref: 'slides',
|
|
570
|
+
description: 'Parent presentation',
|
|
571
|
+
},
|
|
572
|
+
elements: {
|
|
573
|
+
type: 'SlideElement[]',
|
|
574
|
+
backref: 'slide',
|
|
575
|
+
description: 'Elements on this slide',
|
|
576
|
+
},
|
|
577
|
+
speakerNotes: {
|
|
578
|
+
type: 'SpeakerNotes',
|
|
579
|
+
required: false,
|
|
580
|
+
description: 'Detailed speaker notes',
|
|
581
|
+
},
|
|
582
|
+
animations: {
|
|
583
|
+
type: 'Animation[]',
|
|
584
|
+
backref: 'slide',
|
|
585
|
+
description: 'Animations on this slide',
|
|
586
|
+
},
|
|
587
|
+
},
|
|
588
|
+
actions: [
|
|
589
|
+
'create',
|
|
590
|
+
'edit',
|
|
591
|
+
'delete',
|
|
592
|
+
'duplicate',
|
|
593
|
+
'move',
|
|
594
|
+
'hide',
|
|
595
|
+
'unhide',
|
|
596
|
+
'setLayout',
|
|
597
|
+
'setBackground',
|
|
598
|
+
'setTransition',
|
|
599
|
+
'addElement',
|
|
600
|
+
'removeElement',
|
|
601
|
+
'reorderElements',
|
|
602
|
+
'addNotes',
|
|
603
|
+
'editNotes',
|
|
604
|
+
'addAnimation',
|
|
605
|
+
'preview',
|
|
606
|
+
'present',
|
|
607
|
+
'export',
|
|
608
|
+
'generateThumbnail',
|
|
609
|
+
'createSection',
|
|
610
|
+
],
|
|
611
|
+
events: [
|
|
612
|
+
'created',
|
|
613
|
+
'edited',
|
|
614
|
+
'deleted',
|
|
615
|
+
'duplicated',
|
|
616
|
+
'moved',
|
|
617
|
+
'hidden',
|
|
618
|
+
'unhidden',
|
|
619
|
+
'layoutSet',
|
|
620
|
+
'backgroundSet',
|
|
621
|
+
'transitionSet',
|
|
622
|
+
'elementAdded',
|
|
623
|
+
'elementRemoved',
|
|
624
|
+
'elementsReordered',
|
|
625
|
+
'notesAdded',
|
|
626
|
+
'notesEdited',
|
|
627
|
+
'animationAdded',
|
|
628
|
+
'presented',
|
|
629
|
+
'exported',
|
|
630
|
+
'thumbnailGenerated',
|
|
631
|
+
'sectionCreated',
|
|
632
|
+
],
|
|
633
|
+
};
|
|
634
|
+
// =============================================================================
|
|
635
|
+
// SlideElement
|
|
636
|
+
// =============================================================================
|
|
637
|
+
/**
|
|
638
|
+
* SlideElement entity
|
|
639
|
+
*
|
|
640
|
+
* Represents a content element on a slide (text, image, shape, chart, etc.).
|
|
641
|
+
*/
|
|
642
|
+
export const SlideElement = {
|
|
643
|
+
singular: 'slide element',
|
|
644
|
+
plural: 'slide elements',
|
|
645
|
+
description: 'A content element on a slide (text, image, shape, chart, video, etc.)',
|
|
646
|
+
properties: {
|
|
647
|
+
// Identity
|
|
648
|
+
elementId: {
|
|
649
|
+
type: 'string',
|
|
650
|
+
optional: true,
|
|
651
|
+
description: 'Unique element identifier',
|
|
652
|
+
},
|
|
653
|
+
name: {
|
|
654
|
+
type: 'string',
|
|
655
|
+
optional: true,
|
|
656
|
+
description: 'Element name or label',
|
|
657
|
+
},
|
|
658
|
+
// Type
|
|
659
|
+
type: {
|
|
660
|
+
type: 'string',
|
|
661
|
+
description: 'Element type',
|
|
662
|
+
examples: [
|
|
663
|
+
'text',
|
|
664
|
+
'textbox',
|
|
665
|
+
'image',
|
|
666
|
+
'shape',
|
|
667
|
+
'chart',
|
|
668
|
+
'table',
|
|
669
|
+
'video',
|
|
670
|
+
'audio',
|
|
671
|
+
'embed',
|
|
672
|
+
'line',
|
|
673
|
+
'arrow',
|
|
674
|
+
'group',
|
|
675
|
+
'smartart',
|
|
676
|
+
],
|
|
677
|
+
},
|
|
678
|
+
subtype: {
|
|
679
|
+
type: 'string',
|
|
680
|
+
optional: true,
|
|
681
|
+
description: 'Element subtype (shape type, chart type, etc.)',
|
|
682
|
+
},
|
|
683
|
+
// Position and size
|
|
684
|
+
x: {
|
|
685
|
+
type: 'number',
|
|
686
|
+
description: 'X position in slide coordinates',
|
|
687
|
+
},
|
|
688
|
+
y: {
|
|
689
|
+
type: 'number',
|
|
690
|
+
description: 'Y position in slide coordinates',
|
|
691
|
+
},
|
|
692
|
+
width: {
|
|
693
|
+
type: 'number',
|
|
694
|
+
description: 'Element width',
|
|
695
|
+
},
|
|
696
|
+
height: {
|
|
697
|
+
type: 'number',
|
|
698
|
+
description: 'Element height',
|
|
699
|
+
},
|
|
700
|
+
rotation: {
|
|
701
|
+
type: 'number',
|
|
702
|
+
optional: true,
|
|
703
|
+
description: 'Rotation angle in degrees',
|
|
704
|
+
},
|
|
705
|
+
zIndex: {
|
|
706
|
+
type: 'number',
|
|
707
|
+
optional: true,
|
|
708
|
+
description: 'Z-index for layering',
|
|
709
|
+
},
|
|
710
|
+
// Content (varies by type)
|
|
711
|
+
content: {
|
|
712
|
+
type: 'string',
|
|
713
|
+
optional: true,
|
|
714
|
+
description: 'Element content (text, URL, etc.)',
|
|
715
|
+
},
|
|
716
|
+
richContent: {
|
|
717
|
+
type: 'json',
|
|
718
|
+
optional: true,
|
|
719
|
+
description: 'Rich formatted content',
|
|
720
|
+
},
|
|
721
|
+
// Text-specific
|
|
722
|
+
text: {
|
|
723
|
+
type: 'string',
|
|
724
|
+
optional: true,
|
|
725
|
+
description: 'Text content',
|
|
726
|
+
},
|
|
727
|
+
fontFamily: {
|
|
728
|
+
type: 'string',
|
|
729
|
+
optional: true,
|
|
730
|
+
description: 'Font family',
|
|
731
|
+
},
|
|
732
|
+
fontSize: {
|
|
733
|
+
type: 'number',
|
|
734
|
+
optional: true,
|
|
735
|
+
description: 'Font size in points',
|
|
736
|
+
},
|
|
737
|
+
fontWeight: {
|
|
738
|
+
type: 'string',
|
|
739
|
+
optional: true,
|
|
740
|
+
description: 'Font weight: normal, bold',
|
|
741
|
+
examples: ['normal', 'bold'],
|
|
742
|
+
},
|
|
743
|
+
fontStyle: {
|
|
744
|
+
type: 'string',
|
|
745
|
+
optional: true,
|
|
746
|
+
description: 'Font style: normal, italic',
|
|
747
|
+
examples: ['normal', 'italic'],
|
|
748
|
+
},
|
|
749
|
+
textAlign: {
|
|
750
|
+
type: 'string',
|
|
751
|
+
optional: true,
|
|
752
|
+
description: 'Text alignment: left, center, right, justify',
|
|
753
|
+
examples: ['left', 'center', 'right', 'justify'],
|
|
754
|
+
},
|
|
755
|
+
textColor: {
|
|
756
|
+
type: 'string',
|
|
757
|
+
optional: true,
|
|
758
|
+
description: 'Text color (hex)',
|
|
759
|
+
},
|
|
760
|
+
lineHeight: {
|
|
761
|
+
type: 'number',
|
|
762
|
+
optional: true,
|
|
763
|
+
description: 'Line height multiplier',
|
|
764
|
+
},
|
|
765
|
+
bulletStyle: {
|
|
766
|
+
type: 'string',
|
|
767
|
+
optional: true,
|
|
768
|
+
description: 'Bullet list style',
|
|
769
|
+
},
|
|
770
|
+
// Image-specific
|
|
771
|
+
imageUrl: {
|
|
772
|
+
type: 'url',
|
|
773
|
+
optional: true,
|
|
774
|
+
description: 'Image URL',
|
|
775
|
+
},
|
|
776
|
+
imageSource: {
|
|
777
|
+
type: 'string',
|
|
778
|
+
optional: true,
|
|
779
|
+
description: 'Image source or attribution',
|
|
780
|
+
},
|
|
781
|
+
imageAlt: {
|
|
782
|
+
type: 'string',
|
|
783
|
+
optional: true,
|
|
784
|
+
description: 'Image alt text',
|
|
785
|
+
},
|
|
786
|
+
// Video-specific
|
|
787
|
+
videoUrl: {
|
|
788
|
+
type: 'url',
|
|
789
|
+
optional: true,
|
|
790
|
+
description: 'Video URL',
|
|
791
|
+
},
|
|
792
|
+
videoProvider: {
|
|
793
|
+
type: 'string',
|
|
794
|
+
optional: true,
|
|
795
|
+
description: 'Video provider: youtube, vimeo, etc.',
|
|
796
|
+
examples: ['youtube', 'vimeo', 'local'],
|
|
797
|
+
},
|
|
798
|
+
autoplay: {
|
|
799
|
+
type: 'boolean',
|
|
800
|
+
optional: true,
|
|
801
|
+
description: 'Whether video autoplays',
|
|
802
|
+
},
|
|
803
|
+
loop: {
|
|
804
|
+
type: 'boolean',
|
|
805
|
+
optional: true,
|
|
806
|
+
description: 'Whether video loops',
|
|
807
|
+
},
|
|
808
|
+
// Shape-specific
|
|
809
|
+
shapeType: {
|
|
810
|
+
type: 'string',
|
|
811
|
+
optional: true,
|
|
812
|
+
description: 'Shape type',
|
|
813
|
+
examples: ['rectangle', 'circle', 'triangle', 'star', 'arrow', 'callout'],
|
|
814
|
+
},
|
|
815
|
+
fillColor: {
|
|
816
|
+
type: 'string',
|
|
817
|
+
optional: true,
|
|
818
|
+
description: 'Fill color (hex)',
|
|
819
|
+
},
|
|
820
|
+
strokeColor: {
|
|
821
|
+
type: 'string',
|
|
822
|
+
optional: true,
|
|
823
|
+
description: 'Stroke/border color (hex)',
|
|
824
|
+
},
|
|
825
|
+
strokeWidth: {
|
|
826
|
+
type: 'number',
|
|
827
|
+
optional: true,
|
|
828
|
+
description: 'Stroke width in points',
|
|
829
|
+
},
|
|
830
|
+
// Chart-specific
|
|
831
|
+
chartType: {
|
|
832
|
+
type: 'string',
|
|
833
|
+
optional: true,
|
|
834
|
+
description: 'Chart type',
|
|
835
|
+
examples: ['line', 'bar', 'pie', 'scatter', 'area'],
|
|
836
|
+
},
|
|
837
|
+
chartData: {
|
|
838
|
+
type: 'json',
|
|
839
|
+
optional: true,
|
|
840
|
+
description: 'Chart data and configuration',
|
|
841
|
+
},
|
|
842
|
+
// Table-specific
|
|
843
|
+
tableData: {
|
|
844
|
+
type: 'json',
|
|
845
|
+
optional: true,
|
|
846
|
+
description: 'Table data as 2D array',
|
|
847
|
+
},
|
|
848
|
+
tableRows: {
|
|
849
|
+
type: 'number',
|
|
850
|
+
optional: true,
|
|
851
|
+
description: 'Number of table rows',
|
|
852
|
+
},
|
|
853
|
+
tableColumns: {
|
|
854
|
+
type: 'number',
|
|
855
|
+
optional: true,
|
|
856
|
+
description: 'Number of table columns',
|
|
857
|
+
},
|
|
858
|
+
// Styling
|
|
859
|
+
backgroundColor: {
|
|
860
|
+
type: 'string',
|
|
861
|
+
optional: true,
|
|
862
|
+
description: 'Background color (hex)',
|
|
863
|
+
},
|
|
864
|
+
opacity: {
|
|
865
|
+
type: 'number',
|
|
866
|
+
optional: true,
|
|
867
|
+
description: 'Opacity (0-1)',
|
|
868
|
+
},
|
|
869
|
+
shadow: {
|
|
870
|
+
type: 'json',
|
|
871
|
+
optional: true,
|
|
872
|
+
description: 'Shadow configuration',
|
|
873
|
+
},
|
|
874
|
+
border: {
|
|
875
|
+
type: 'json',
|
|
876
|
+
optional: true,
|
|
877
|
+
description: 'Border configuration',
|
|
878
|
+
},
|
|
879
|
+
// Interactions
|
|
880
|
+
link: {
|
|
881
|
+
type: 'url',
|
|
882
|
+
optional: true,
|
|
883
|
+
description: 'Hyperlink URL',
|
|
884
|
+
},
|
|
885
|
+
linkType: {
|
|
886
|
+
type: 'string',
|
|
887
|
+
optional: true,
|
|
888
|
+
description: 'Link type: url, slide, file',
|
|
889
|
+
examples: ['url', 'slide', 'file', 'email'],
|
|
890
|
+
},
|
|
891
|
+
linkedSlideIndex: {
|
|
892
|
+
type: 'number',
|
|
893
|
+
optional: true,
|
|
894
|
+
description: 'Linked slide index for navigation',
|
|
895
|
+
},
|
|
896
|
+
// Animation
|
|
897
|
+
hasAnimation: {
|
|
898
|
+
type: 'boolean',
|
|
899
|
+
optional: true,
|
|
900
|
+
description: 'Whether element has animation',
|
|
901
|
+
},
|
|
902
|
+
// Grouping
|
|
903
|
+
isGrouped: {
|
|
904
|
+
type: 'boolean',
|
|
905
|
+
optional: true,
|
|
906
|
+
description: 'Whether element is part of a group',
|
|
907
|
+
},
|
|
908
|
+
groupId: {
|
|
909
|
+
type: 'string',
|
|
910
|
+
optional: true,
|
|
911
|
+
description: 'Group identifier',
|
|
912
|
+
},
|
|
913
|
+
// Visibility
|
|
914
|
+
hidden: {
|
|
915
|
+
type: 'boolean',
|
|
916
|
+
optional: true,
|
|
917
|
+
description: 'Whether element is hidden',
|
|
918
|
+
},
|
|
919
|
+
locked: {
|
|
920
|
+
type: 'boolean',
|
|
921
|
+
optional: true,
|
|
922
|
+
description: 'Whether element is locked from editing',
|
|
923
|
+
},
|
|
924
|
+
// Metadata
|
|
925
|
+
metadata: {
|
|
926
|
+
type: 'json',
|
|
927
|
+
optional: true,
|
|
928
|
+
description: 'Custom metadata',
|
|
929
|
+
},
|
|
930
|
+
},
|
|
931
|
+
relationships: {
|
|
932
|
+
slide: {
|
|
933
|
+
type: 'Slide',
|
|
934
|
+
backref: 'elements',
|
|
935
|
+
description: 'Parent slide',
|
|
936
|
+
},
|
|
937
|
+
animations: {
|
|
938
|
+
type: 'Animation[]',
|
|
939
|
+
backref: 'element',
|
|
940
|
+
description: 'Animations applied to this element',
|
|
941
|
+
},
|
|
942
|
+
},
|
|
943
|
+
actions: [
|
|
944
|
+
'create',
|
|
945
|
+
'edit',
|
|
946
|
+
'delete',
|
|
947
|
+
'duplicate',
|
|
948
|
+
'move',
|
|
949
|
+
'resize',
|
|
950
|
+
'rotate',
|
|
951
|
+
'bringToFront',
|
|
952
|
+
'sendToBack',
|
|
953
|
+
'bringForward',
|
|
954
|
+
'sendBackward',
|
|
955
|
+
'align',
|
|
956
|
+
'distribute',
|
|
957
|
+
'group',
|
|
958
|
+
'ungroup',
|
|
959
|
+
'lock',
|
|
960
|
+
'unlock',
|
|
961
|
+
'hide',
|
|
962
|
+
'unhide',
|
|
963
|
+
'setStyle',
|
|
964
|
+
'addLink',
|
|
965
|
+
'removeLink',
|
|
966
|
+
'addAnimation',
|
|
967
|
+
'copy',
|
|
968
|
+
'paste',
|
|
969
|
+
'cut',
|
|
970
|
+
],
|
|
971
|
+
events: [
|
|
972
|
+
'created',
|
|
973
|
+
'edited',
|
|
974
|
+
'deleted',
|
|
975
|
+
'duplicated',
|
|
976
|
+
'moved',
|
|
977
|
+
'resized',
|
|
978
|
+
'rotated',
|
|
979
|
+
'reordered',
|
|
980
|
+
'aligned',
|
|
981
|
+
'distributed',
|
|
982
|
+
'grouped',
|
|
983
|
+
'ungrouped',
|
|
984
|
+
'locked',
|
|
985
|
+
'unlocked',
|
|
986
|
+
'hidden',
|
|
987
|
+
'unhidden',
|
|
988
|
+
'styled',
|
|
989
|
+
'linkAdded',
|
|
990
|
+
'linkRemoved',
|
|
991
|
+
'animationAdded',
|
|
992
|
+
'copied',
|
|
993
|
+
'pasted',
|
|
994
|
+
],
|
|
995
|
+
};
|
|
996
|
+
// =============================================================================
|
|
997
|
+
// SpeakerNotes
|
|
998
|
+
// =============================================================================
|
|
999
|
+
/**
|
|
1000
|
+
* SpeakerNotes entity
|
|
1001
|
+
*
|
|
1002
|
+
* Represents detailed speaker notes for a slide.
|
|
1003
|
+
*/
|
|
1004
|
+
export const SpeakerNotes = {
|
|
1005
|
+
singular: 'speaker notes',
|
|
1006
|
+
plural: 'speaker notes',
|
|
1007
|
+
description: 'Detailed speaker notes for a presentation slide',
|
|
1008
|
+
properties: {
|
|
1009
|
+
// Content
|
|
1010
|
+
text: {
|
|
1011
|
+
type: 'string',
|
|
1012
|
+
description: 'Notes text content',
|
|
1013
|
+
},
|
|
1014
|
+
richText: {
|
|
1015
|
+
type: 'json',
|
|
1016
|
+
optional: true,
|
|
1017
|
+
description: 'Rich formatted notes',
|
|
1018
|
+
},
|
|
1019
|
+
// Formatting
|
|
1020
|
+
fontSize: {
|
|
1021
|
+
type: 'number',
|
|
1022
|
+
optional: true,
|
|
1023
|
+
description: 'Font size for display',
|
|
1024
|
+
},
|
|
1025
|
+
// Timing
|
|
1026
|
+
estimatedTime: {
|
|
1027
|
+
type: 'number',
|
|
1028
|
+
optional: true,
|
|
1029
|
+
description: 'Estimated time for this slide in seconds',
|
|
1030
|
+
},
|
|
1031
|
+
actualTime: {
|
|
1032
|
+
type: 'number',
|
|
1033
|
+
optional: true,
|
|
1034
|
+
description: 'Actual time spent on slide during presentation',
|
|
1035
|
+
},
|
|
1036
|
+
// Cues
|
|
1037
|
+
cuePoints: {
|
|
1038
|
+
type: 'json',
|
|
1039
|
+
optional: true,
|
|
1040
|
+
description: 'Timing cues or reminders',
|
|
1041
|
+
},
|
|
1042
|
+
// Structure
|
|
1043
|
+
keyPoints: {
|
|
1044
|
+
type: 'string',
|
|
1045
|
+
array: true,
|
|
1046
|
+
optional: true,
|
|
1047
|
+
description: 'Key points to cover',
|
|
1048
|
+
},
|
|
1049
|
+
questions: {
|
|
1050
|
+
type: 'string',
|
|
1051
|
+
array: true,
|
|
1052
|
+
optional: true,
|
|
1053
|
+
description: 'Questions to ask audience',
|
|
1054
|
+
},
|
|
1055
|
+
// Visibility
|
|
1056
|
+
visibleToAudience: {
|
|
1057
|
+
type: 'boolean',
|
|
1058
|
+
optional: true,
|
|
1059
|
+
description: 'Whether notes are visible to audience',
|
|
1060
|
+
},
|
|
1061
|
+
// Metadata
|
|
1062
|
+
metadata: {
|
|
1063
|
+
type: 'json',
|
|
1064
|
+
optional: true,
|
|
1065
|
+
description: 'Custom metadata',
|
|
1066
|
+
},
|
|
1067
|
+
},
|
|
1068
|
+
relationships: {
|
|
1069
|
+
slide: {
|
|
1070
|
+
type: 'Slide',
|
|
1071
|
+
description: 'Associated slide',
|
|
1072
|
+
},
|
|
1073
|
+
},
|
|
1074
|
+
actions: [
|
|
1075
|
+
'create',
|
|
1076
|
+
'edit',
|
|
1077
|
+
'delete',
|
|
1078
|
+
'clear',
|
|
1079
|
+
'format',
|
|
1080
|
+
'addCue',
|
|
1081
|
+
'removeCue',
|
|
1082
|
+
'setTiming',
|
|
1083
|
+
'addKeyPoint',
|
|
1084
|
+
'addQuestion',
|
|
1085
|
+
'print',
|
|
1086
|
+
'export',
|
|
1087
|
+
],
|
|
1088
|
+
events: [
|
|
1089
|
+
'created',
|
|
1090
|
+
'edited',
|
|
1091
|
+
'deleted',
|
|
1092
|
+
'cleared',
|
|
1093
|
+
'formatted',
|
|
1094
|
+
'cueAdded',
|
|
1095
|
+
'cueRemoved',
|
|
1096
|
+
'timingSet',
|
|
1097
|
+
'keyPointAdded',
|
|
1098
|
+
'questionAdded',
|
|
1099
|
+
'printed',
|
|
1100
|
+
'exported',
|
|
1101
|
+
],
|
|
1102
|
+
};
|
|
1103
|
+
// =============================================================================
|
|
1104
|
+
// Animation
|
|
1105
|
+
// =============================================================================
|
|
1106
|
+
/**
|
|
1107
|
+
* Animation entity
|
|
1108
|
+
*
|
|
1109
|
+
* Represents an animation effect applied to a slide or element.
|
|
1110
|
+
*/
|
|
1111
|
+
export const Animation = {
|
|
1112
|
+
singular: 'animation',
|
|
1113
|
+
plural: 'animations',
|
|
1114
|
+
description: 'An animation effect applied to a slide or element',
|
|
1115
|
+
properties: {
|
|
1116
|
+
// Type
|
|
1117
|
+
type: {
|
|
1118
|
+
type: 'string',
|
|
1119
|
+
description: 'Animation type: entrance, emphasis, exit, motion',
|
|
1120
|
+
examples: ['entrance', 'emphasis', 'exit', 'motion'],
|
|
1121
|
+
},
|
|
1122
|
+
effect: {
|
|
1123
|
+
type: 'string',
|
|
1124
|
+
description: 'Animation effect name',
|
|
1125
|
+
examples: [
|
|
1126
|
+
'fade',
|
|
1127
|
+
'fly',
|
|
1128
|
+
'wipe',
|
|
1129
|
+
'split',
|
|
1130
|
+
'shape',
|
|
1131
|
+
'wheel',
|
|
1132
|
+
'zoom',
|
|
1133
|
+
'bounce',
|
|
1134
|
+
'spin',
|
|
1135
|
+
'grow',
|
|
1136
|
+
'shrink',
|
|
1137
|
+
'pulse',
|
|
1138
|
+
],
|
|
1139
|
+
},
|
|
1140
|
+
variant: {
|
|
1141
|
+
type: 'string',
|
|
1142
|
+
optional: true,
|
|
1143
|
+
description: 'Effect variant or direction',
|
|
1144
|
+
examples: ['left', 'right', 'up', 'down', 'in', 'out'],
|
|
1145
|
+
},
|
|
1146
|
+
// Timing
|
|
1147
|
+
trigger: {
|
|
1148
|
+
type: 'string',
|
|
1149
|
+
description: 'Animation trigger: on-click, with-previous, after-previous, auto',
|
|
1150
|
+
examples: ['on-click', 'with-previous', 'after-previous', 'auto'],
|
|
1151
|
+
},
|
|
1152
|
+
order: {
|
|
1153
|
+
type: 'number',
|
|
1154
|
+
description: 'Animation sequence order',
|
|
1155
|
+
},
|
|
1156
|
+
delay: {
|
|
1157
|
+
type: 'number',
|
|
1158
|
+
optional: true,
|
|
1159
|
+
description: 'Delay before animation starts in milliseconds',
|
|
1160
|
+
},
|
|
1161
|
+
duration: {
|
|
1162
|
+
type: 'number',
|
|
1163
|
+
optional: true,
|
|
1164
|
+
description: 'Animation duration in milliseconds',
|
|
1165
|
+
},
|
|
1166
|
+
// Easing
|
|
1167
|
+
easing: {
|
|
1168
|
+
type: 'string',
|
|
1169
|
+
optional: true,
|
|
1170
|
+
description: 'Easing function',
|
|
1171
|
+
examples: ['linear', 'ease', 'ease-in', 'ease-out', 'ease-in-out', 'bounce', 'elastic'],
|
|
1172
|
+
},
|
|
1173
|
+
// Motion path (for motion animations)
|
|
1174
|
+
motionPath: {
|
|
1175
|
+
type: 'json',
|
|
1176
|
+
optional: true,
|
|
1177
|
+
description: 'Motion path configuration',
|
|
1178
|
+
},
|
|
1179
|
+
// Options
|
|
1180
|
+
reverse: {
|
|
1181
|
+
type: 'boolean',
|
|
1182
|
+
optional: true,
|
|
1183
|
+
description: 'Whether animation plays in reverse',
|
|
1184
|
+
},
|
|
1185
|
+
rewind: {
|
|
1186
|
+
type: 'boolean',
|
|
1187
|
+
optional: true,
|
|
1188
|
+
description: 'Whether element rewinds after animation',
|
|
1189
|
+
},
|
|
1190
|
+
loop: {
|
|
1191
|
+
type: 'boolean',
|
|
1192
|
+
optional: true,
|
|
1193
|
+
description: 'Whether animation loops',
|
|
1194
|
+
},
|
|
1195
|
+
loopCount: {
|
|
1196
|
+
type: 'number',
|
|
1197
|
+
optional: true,
|
|
1198
|
+
description: 'Number of times to loop',
|
|
1199
|
+
},
|
|
1200
|
+
// Sound
|
|
1201
|
+
soundEffect: {
|
|
1202
|
+
type: 'url',
|
|
1203
|
+
optional: true,
|
|
1204
|
+
description: 'Sound effect URL',
|
|
1205
|
+
},
|
|
1206
|
+
// Metadata
|
|
1207
|
+
metadata: {
|
|
1208
|
+
type: 'json',
|
|
1209
|
+
optional: true,
|
|
1210
|
+
description: 'Custom metadata',
|
|
1211
|
+
},
|
|
1212
|
+
},
|
|
1213
|
+
relationships: {
|
|
1214
|
+
slide: {
|
|
1215
|
+
type: 'Slide',
|
|
1216
|
+
backref: 'animations',
|
|
1217
|
+
description: 'Parent slide',
|
|
1218
|
+
},
|
|
1219
|
+
element: {
|
|
1220
|
+
type: 'SlideElement',
|
|
1221
|
+
backref: 'animations',
|
|
1222
|
+
required: false,
|
|
1223
|
+
description: 'Element being animated',
|
|
1224
|
+
},
|
|
1225
|
+
},
|
|
1226
|
+
actions: [
|
|
1227
|
+
'create',
|
|
1228
|
+
'edit',
|
|
1229
|
+
'delete',
|
|
1230
|
+
'duplicate',
|
|
1231
|
+
'reorder',
|
|
1232
|
+
'play',
|
|
1233
|
+
'pause',
|
|
1234
|
+
'stop',
|
|
1235
|
+
'reset',
|
|
1236
|
+
'preview',
|
|
1237
|
+
'setTiming',
|
|
1238
|
+
'setEffect',
|
|
1239
|
+
'setTrigger',
|
|
1240
|
+
],
|
|
1241
|
+
events: [
|
|
1242
|
+
'created',
|
|
1243
|
+
'edited',
|
|
1244
|
+
'deleted',
|
|
1245
|
+
'duplicated',
|
|
1246
|
+
'reordered',
|
|
1247
|
+
'played',
|
|
1248
|
+
'paused',
|
|
1249
|
+
'stopped',
|
|
1250
|
+
'reset',
|
|
1251
|
+
'timingSet',
|
|
1252
|
+
'effectSet',
|
|
1253
|
+
'triggerSet',
|
|
1254
|
+
],
|
|
1255
|
+
};
|
|
1256
|
+
// =============================================================================
|
|
1257
|
+
// Export all entities as a schema
|
|
1258
|
+
// =============================================================================
|
|
1259
|
+
/**
|
|
1260
|
+
* All presentation entity types
|
|
1261
|
+
*/
|
|
1262
|
+
export const PresentationEntities = {
|
|
1263
|
+
Presentation,
|
|
1264
|
+
Slide,
|
|
1265
|
+
SlideElement,
|
|
1266
|
+
SpeakerNotes,
|
|
1267
|
+
Animation,
|
|
1268
|
+
};
|
|
1269
|
+
/**
|
|
1270
|
+
* Entity categories for organization
|
|
1271
|
+
*/
|
|
1272
|
+
export const PresentationCategories = {
|
|
1273
|
+
presentations: ['Presentation', 'Slide', 'SlideElement', 'SpeakerNotes', 'Animation'],
|
|
1274
|
+
};
|