domma-cms 0.7.8 → 0.8.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.
Files changed (43) hide show
  1. package/admin/css/admin.css +1 -1
  2. package/admin/js/app.js +1 -1
  3. package/admin/js/config/sidebar-config.js +1 -1
  4. package/admin/js/templates/effects.html +594 -0
  5. package/admin/js/views/effects.js +1 -0
  6. package/admin/js/views/index.js +1 -1
  7. package/admin/js/views/plugins.js +24 -12
  8. package/config/effects.json +6 -0
  9. package/config/plugins.json +4 -34
  10. package/package.json +1 -1
  11. package/plugins/demo-viewer/config.js +4 -0
  12. package/plugins/demo-viewer/plugin.js +36 -0
  13. package/plugins/demo-viewer/plugin.json +9 -0
  14. package/plugins/theme-switcher/admin/templates/theme-switcher.html +86 -0
  15. package/plugins/theme-switcher/admin/views/theme-switcher.js +65 -0
  16. package/plugins/theme-switcher/config.js +10 -0
  17. package/plugins/theme-switcher/plugin.js +26 -0
  18. package/plugins/theme-switcher/plugin.json +74 -0
  19. package/plugins/theme-switcher/public/inject-body.html +153 -0
  20. package/plugins/theme-switcher/public/inject-head.html +260 -0
  21. package/public/js/celebrations/core/canvas.js +9 -0
  22. package/public/js/celebrations/core/particles.js +1 -0
  23. package/public/js/celebrations/core/physics.js +1 -0
  24. package/public/js/celebrations/index.js +1 -0
  25. package/public/js/celebrations/themes/christmas.js +1 -0
  26. package/public/js/celebrations/themes/guy-fawkes.js +1 -0
  27. package/public/js/celebrations/themes/halloween.js +1 -0
  28. package/public/js/celebrations/themes/st-andrews.js +1 -0
  29. package/public/js/celebrations/themes/st-davids.js +1 -0
  30. package/public/js/celebrations/themes/st-georges.js +1 -0
  31. package/public/js/celebrations/themes/st-patricks.js +1 -0
  32. package/public/js/celebrations/themes/valentines.js +1 -0
  33. package/public/js/effects.js +1 -0
  34. package/server/routes/api/effects.js +23 -0
  35. package/server/server.js +2 -0
  36. package/server/services/markdown.js +125 -2
  37. package/server/services/plugins.js +1 -1
  38. package/server/templates/page.html +3 -0
  39. package/plugins/data-transfer/admin/templates/data-transfer.html +0 -172
  40. package/plugins/data-transfer/admin/views/data-transfer.js +0 -558
  41. package/plugins/data-transfer/config.js +0 -9
  42. package/plugins/data-transfer/plugin.js +0 -424
  43. package/plugins/data-transfer/plugin.json +0 -33
@@ -0,0 +1,594 @@
1
+ <div class="view-header">
2
+ <h1><span data-icon="sparkles"></span> Domma Effects</h1>
3
+ <div>
4
+ <button id="save-settings-btn" class="btn btn-primary">
5
+ <span data-icon="save"></span> Save
6
+ </button>
7
+ </div>
8
+ </div>
9
+
10
+ <!-- Settings Card -->
11
+ <div class="card mb-4">
12
+ <div class="card-header"><h2>Settings</h2></div>
13
+ <div class="card-body">
14
+ <div class="row mb-3">
15
+ <div class="col">
16
+ <label class="form-check-label">
17
+ <input id="field-respect-motion" type="checkbox">
18
+ Respect <code>prefers-reduced-motion</code>
19
+ </label>
20
+ <span class="form-hint">When enabled, JS effects are skipped for users who prefer reduced motion. Content remains visible.</span>
21
+ </div>
22
+ </div>
23
+ <div class="row mb-3">
24
+ <div class="col-6">
25
+ <label class="form-label">Default animation duration (ms)</label>
26
+ <input id="field-default-duration" type="number" class="form-input" min="0" max="10000"
27
+ placeholder="600">
28
+ <span class="form-hint">Used by reveal when no <code>duration</code> attribute is specified.</span>
29
+ </div>
30
+ <div class="col-6">
31
+ <label class="form-label">Default reveal animation</label>
32
+ <select id="field-default-animation" class="form-select">
33
+ <option value="fade">Fade</option>
34
+ <option value="slide-up">Slide up</option>
35
+ <option value="slide-down">Slide down</option>
36
+ <option value="zoom">Zoom</option>
37
+ <option value="flip">Flip</option>
38
+ </select>
39
+ </div>
40
+ </div>
41
+ <div class="row">
42
+ <div class="col-6">
43
+ <label class="form-label">Default scroll threshold</label>
44
+ <input id="field-default-threshold" type="number" class="form-input" min="0" max="1" step="0.05"
45
+ placeholder="0.1">
46
+ <span class="form-hint">Fraction of element visible before reveal fires (0.0–1.0).</span>
47
+ </div>
48
+ </div>
49
+ </div>
50
+ </div>
51
+
52
+ <!-- Shortcode Reference Card -->
53
+ <div class="card mb-4">
54
+ <div class="card-header"><h2>Shortcode Reference</h2></div>
55
+ <div class="card-body">
56
+ <p class="text-muted mb-3">Use these shortcodes in any page's Markdown content. The <strong>Effects</strong>
57
+ toolbar
58
+ button in the editor inserts them automatically.</p>
59
+
60
+ <!-- Tabs -->
61
+ <div class="mb-3" style="display:flex;gap:6px;flex-wrap:wrap;">
62
+ <button class="btn btn-sm effects-tab-btn active" data-tab="entrance">Entrance</button>
63
+ <button class="btn btn-sm effects-tab-btn" data-tab="animation">Animation</button>
64
+ <button class="btn btn-sm effects-tab-btn" data-tab="text">Text</button>
65
+ <button class="btn btn-sm effects-tab-btn" data-tab="visual">Visual</button>
66
+ <button class="btn btn-sm effects-tab-btn" data-tab="examples">Examples</button>
67
+ <button class="btn btn-sm effects-tab-btn" data-tab="celebrations">Celebrations</button>
68
+ </div>
69
+
70
+ <!-- Entrance tab -->
71
+ <div id="tab-entrance" class="effects-tab-panel">
72
+ <h3 class="mb-2">Reveal</h3>
73
+ <p class="text-muted mb-2">Triggers a scroll-activated entrance animation when the element enters the
74
+ viewport.
75
+ Great for headers, cards, and feature sections.</p>
76
+ <pre class="code-block mb-2">[reveal animation="fade" duration="600" delay="0" threshold="0.1" once="true"]
77
+ ## Your heading or content
78
+
79
+ Markdown **works** inside.
80
+ [/reveal]</pre>
81
+ <table class="table mb-3">
82
+ <thead>
83
+ <tr>
84
+ <th>Attribute</th>
85
+ <th>Default</th>
86
+ <th>Description</th>
87
+ </tr>
88
+ </thead>
89
+ <tbody>
90
+ <tr>
91
+ <td><code>animation</code></td>
92
+ <td>fade</td>
93
+ <td>fade, slide-up, slide-down, zoom, flip</td>
94
+ </tr>
95
+ <tr>
96
+ <td><code>duration</code></td>
97
+ <td>600</td>
98
+ <td>Animation duration in milliseconds</td>
99
+ </tr>
100
+ <tr>
101
+ <td><code>delay</code></td>
102
+ <td>0</td>
103
+ <td>Delay before animation starts (ms)</td>
104
+ </tr>
105
+ <tr>
106
+ <td><code>threshold</code></td>
107
+ <td>0.1</td>
108
+ <td>Fraction visible before triggering (0–1)</td>
109
+ </tr>
110
+ <tr>
111
+ <td><code>once</code></td>
112
+ <td>true</td>
113
+ <td>Only animate once (true/false)</td>
114
+ </tr>
115
+ </tbody>
116
+ </table>
117
+ <p class="text-muted" style="font-size:.85rem;"><strong>Tip:</strong> Use <code>delay</code> to stagger
118
+ multiple
119
+ reveal blocks for a cascade effect.</p>
120
+ </div>
121
+
122
+ <!-- Animation tab -->
123
+ <div id="tab-animation" class="effects-tab-panel">
124
+ <h3 class="mb-2">Breathe</h3>
125
+ <p class="text-muted mb-2">Continuous gentle scaling — makes elements feel alive. Ideal for hero images or
126
+ call-to-action buttons.</p>
127
+ <pre class="code-block mb-3">[breathe amplitude="8" duration="3000"]
128
+ Content that breathes.
129
+ [/breathe]</pre>
130
+
131
+ <h3 class="mb-2">Pulse</h3>
132
+ <p class="text-muted mb-2">A repeating scale pulse — stronger than breathe, good for alerts or badges.</p>
133
+ <pre class="code-block mb-3">[pulse scale="1.05" duration="1000"]
134
+ Pulsing content.
135
+ [/pulse]</pre>
136
+
137
+ <h3 class="mb-2">Shake</h3>
138
+ <p class="text-muted mb-2">One-shot horizontal or vertical shake. Use for error states or attention-grabbing
139
+ elements.</p>
140
+ <pre class="code-block mb-3">[shake intensity="5" duration="500" direction="horizontal"]
141
+ This will shake.
142
+ [/shake]</pre>
143
+
144
+ <h3 class="mb-2">CSS Animate</h3>
145
+ <p class="text-muted mb-2">Applies Domma CSS animation utility classes — no JavaScript required. Works
146
+ without the
147
+ plugin enabled.</p>
148
+ <pre class="code-block mb-2">[animate type="fade-in-up" duration="normal" delay="200" repeat="once"]
149
+ Content here.
150
+ [/animate]</pre>
151
+ <table class="table mb-3">
152
+ <thead>
153
+ <tr>
154
+ <th>Attribute</th>
155
+ <th>Values</th>
156
+ </tr>
157
+ </thead>
158
+ <tbody>
159
+ <tr>
160
+ <td><code>type</code></td>
161
+ <td>fade-in, fade-out, fade-in-up, fade-in-down, fade-in-left, fade-in-right, slide-in-up,
162
+ slide-in-down,
163
+ slide-in-left, slide-in-right, zoom-in, zoom-out, bounce, pulse, shake, spin, rotate-in, flip
164
+ </td>
165
+ </tr>
166
+ <tr>
167
+ <td><code>duration</code></td>
168
+ <td>fast, normal, slow, slower</td>
169
+ </tr>
170
+ <tr>
171
+ <td><code>delay</code></td>
172
+ <td>100, 200, 300, 500, 1000</td>
173
+ </tr>
174
+ <tr>
175
+ <td><code>repeat</code></td>
176
+ <td>once, infinite, repeat-2, repeat-3</td>
177
+ </tr>
178
+ </tbody>
179
+ </table>
180
+ </div>
181
+
182
+ <!-- Text tab -->
183
+ <div id="tab-text" class="effects-tab-panel">
184
+ <h3 class="mb-2">Typewriter (Scribe)</h3>
185
+ <p class="text-muted mb-2">Types text character by character. Supports a simple one-shot mode or a full
186
+ action script for sequenced multi-step animations.</p>
187
+
188
+ <h4 class="mb-1" style="font-size:.9rem;">Simple mode</h4>
189
+ <pre class="code-block mb-2">[scribe speed="50" cursor="true" loop="false"]
190
+ Your text appears letter by letter.
191
+ [/scribe]</pre>
192
+
193
+ <h4 class="mb-1" style="font-size:.9rem;">Script mode — action shortcodes</h4>
194
+ <pre class="code-block mb-2">[scribe loop="true" loop-delay="2000"]
195
+ [render effect="fade"]Hello, world![/render]
196
+ [wait]1500[/wait]
197
+ [undo /]
198
+ [render]Something else entirely.[/render]
199
+ [/scribe]</pre>
200
+ <p class="text-muted mb-2" style="font-size:.85rem;">When any <code>[render]</code>, <code>[wait]</code>, or
201
+ <code>[undo]</code> shortcode is present inside the body, script mode activates automatically.</p>
202
+ <table class="table mb-2">
203
+ <thead>
204
+ <tr>
205
+ <th>Action</th>
206
+ <th>Syntax</th>
207
+ <th>Description</th>
208
+ </tr>
209
+ </thead>
210
+ <tbody>
211
+ <tr>
212
+ <td><code>[render]</code></td>
213
+ <td><code>[render effect="fade"]Text[/render]</code></td>
214
+ <td>Type the text. Optional <code>effect</code>: fade, slide (for appearance)</td>
215
+ </tr>
216
+ <tr>
217
+ <td><code>[wait]</code></td>
218
+ <td><code>[wait]1500[/wait]</code></td>
219
+ <td>Pause for N milliseconds (number) or a CSS duration string (e.g. <code>2s</code>)</td>
220
+ </tr>
221
+ <tr>
222
+ <td><code>[undo]</code></td>
223
+ <td><code>[undo /]</code> or <code>[undo count="3" /]</code> or <code>[undo all="true" /]</code>
224
+ </td>
225
+ <td>Delete the last render action, N renders, or all renders</td>
226
+ </tr>
227
+ </tbody>
228
+ </table>
229
+ <table class="table mb-3">
230
+ <thead>
231
+ <tr>
232
+ <th>Attribute</th>
233
+ <th>Default</th>
234
+ <th>Description</th>
235
+ </tr>
236
+ </thead>
237
+ <tbody>
238
+ <tr>
239
+ <td><code>speed</code></td>
240
+ <td>50</td>
241
+ <td>Typing speed (ms per character)</td>
242
+ </tr>
243
+ <tr>
244
+ <td><code>delete-speed</code></td>
245
+ <td>30</td>
246
+ <td>Deletion speed (ms per character)</td>
247
+ </tr>
248
+ <tr>
249
+ <td><code>cursor</code></td>
250
+ <td>true</td>
251
+ <td>Show blinking cursor (true/false)</td>
252
+ </tr>
253
+ <tr>
254
+ <td><code>cursor-char</code></td>
255
+ <td>|</td>
256
+ <td>Character to use as cursor</td>
257
+ </tr>
258
+ <tr>
259
+ <td><code>cursor-type</code></td>
260
+ <td>—</td>
261
+ <td>Cursor style (block, underline, beam)</td>
262
+ </tr>
263
+ <tr>
264
+ <td><code>loop</code></td>
265
+ <td>false</td>
266
+ <td>Repeat script continuously (true/false)</td>
267
+ </tr>
268
+ <tr>
269
+ <td><code>loop-delay</code></td>
270
+ <td>1000</td>
271
+ <td>Pause before repeating (ms)</td>
272
+ </tr>
273
+ <tr>
274
+ <td><code>pause-on-hover</code></td>
275
+ <td>false</td>
276
+ <td>Pause animation while hovered (true/false)</td>
277
+ </tr>
278
+ </tbody>
279
+ </table>
280
+
281
+ <h3 class="mb-2">Scramble</h3>
282
+ <p class="text-muted mb-2">Reveals text through a character-scramble animation. Great for tech/data
283
+ aesthetics.</p>
284
+ <pre class="code-block mb-3">[scramble speed="50" loop="false"]
285
+ Scrambled reveal text.
286
+ [/scramble]</pre>
287
+
288
+ <h3 class="mb-2">Counter</h3>
289
+ <p class="text-muted mb-2">Animates a number from <code>from</code> to <code>to</code>. Use in stat
290
+ sections. This
291
+ shortcode is self-closing.</p>
292
+ <pre class="code-block mb-2">[counter to="100" from="0" prefix="$" suffix="+" duration="2000" /]</pre>
293
+ <table class="table mb-3">
294
+ <thead>
295
+ <tr>
296
+ <th>Attribute</th>
297
+ <th>Default</th>
298
+ <th>Description</th>
299
+ </tr>
300
+ </thead>
301
+ <tbody>
302
+ <tr>
303
+ <td><code>to</code></td>
304
+ <td>0</td>
305
+ <td>Target number</td>
306
+ </tr>
307
+ <tr>
308
+ <td><code>from</code></td>
309
+ <td>0</td>
310
+ <td>Starting number</td>
311
+ </tr>
312
+ <tr>
313
+ <td><code>duration</code></td>
314
+ <td>2000</td>
315
+ <td>Animation duration (ms)</td>
316
+ </tr>
317
+ <tr>
318
+ <td><code>prefix</code></td>
319
+ <td>—</td>
320
+ <td>Text before the number (e.g. $)</td>
321
+ </tr>
322
+ <tr>
323
+ <td><code>suffix</code></td>
324
+ <td>—</td>
325
+ <td>Text after the number (e.g. +)</td>
326
+ </tr>
327
+ <tr>
328
+ <td><code>decimals</code></td>
329
+ <td>0</td>
330
+ <td>Decimal places to display</td>
331
+ </tr>
332
+ <tr>
333
+ <td><code>separator</code></td>
334
+ <td>—</td>
335
+ <td>Thousands separator (e.g. ,)</td>
336
+ </tr>
337
+ </tbody>
338
+ </table>
339
+ <p class="text-muted" style="font-size:.85rem;"><strong>Tip:</strong> Counters work great in a grid — place
340
+ 3–4
341
+ counter spans in a <code>[grid cols="4"]</code> for a stats section.</p>
342
+ </div>
343
+
344
+ <!-- Visual tab -->
345
+ <div id="tab-visual" class="effects-tab-panel">
346
+ <h3 class="mb-2">Ripple</h3>
347
+ <p class="text-muted mb-2">Click-triggered ripple effect on the element. Good for interactive content
348
+ blocks.</p>
349
+ <pre class="code-block mb-3">[ripple colour="#7c6af7" duration="600" opacity="0.3"]
350
+ Click this area for a ripple.
351
+ [/ripple]</pre>
352
+
353
+ <h3 class="mb-2">Twinkle</h3>
354
+ <p class="text-muted mb-2">Generates animated particle effects inside the element. Use for hero sections or
355
+ decorative areas.</p>
356
+ <pre class="code-block mb-3">[twinkle count="80" shape="star" colour="#fff" min-size="2" max-size="6"]
357
+ Content beneath the particles.
358
+ [/twinkle]</pre>
359
+
360
+ <h3 class="mb-2">Ambient Background</h3>
361
+ <p class="text-muted mb-2">Applies animated CSS background classes — no JavaScript needed. Works without the
362
+ plugin.</p>
363
+ <pre class="code-block mb-2">[ambient type="float-blobs" speed="slow" intensity="subtle"]
364
+ Content on animated background.
365
+ [/ambient]</pre>
366
+ <table class="table mb-3">
367
+ <thead>
368
+ <tr>
369
+ <th>Attribute</th>
370
+ <th>Values</th>
371
+ </tr>
372
+ </thead>
373
+ <tbody>
374
+ <tr>
375
+ <td><code>type</code></td>
376
+ <td>rotate-glow, rotate-dual, rotate-spotlight, float-blobs, float-orbs, float-particles, wave,
377
+ ripple,
378
+ aurora
379
+ </td>
380
+ </tr>
381
+ <tr>
382
+ <td><code>speed</code></td>
383
+ <td>slow, normal, fast</td>
384
+ </tr>
385
+ <tr>
386
+ <td><code>intensity</code></td>
387
+ <td>subtle, intense</td>
388
+ </tr>
389
+ </tbody>
390
+ </table>
391
+ </div>
392
+
393
+ <!-- Examples tab -->
394
+ <div id="tab-examples" class="effects-tab-panel">
395
+ <h3 class="mb-2">Hero section with typewriter</h3>
396
+ <pre class="code-block mb-3">[reveal animation="fade"]
397
+ # Welcome to our site
398
+
399
+ [scribe speed="40" cursor="true"]
400
+ We build things that matter.
401
+ [/scribe]
402
+ [/reveal]</pre>
403
+
404
+ <h3 class="mb-2">Stats row with counters</h3>
405
+ <pre class="code-block mb-3">[reveal animation="slide-up"]
406
+ [grid cols="3" gap="4"]
407
+ [col]
408
+ ## [counter to="500" suffix="+" /]
409
+ Happy clients
410
+ [/col]
411
+ [col]
412
+ ## [counter to="12" suffix=" years" /]
413
+ In business
414
+ [/col]
415
+ [col]
416
+ ## [counter to="98" suffix="%" /]
417
+ Satisfaction
418
+ [/col]
419
+ [/grid]
420
+ [/reveal]</pre>
421
+
422
+ <h3 class="mb-2">Staggered card reveal</h3>
423
+ <pre class="code-block mb-3">[reveal animation="fade-in-up" delay="0"]
424
+ [card title="Feature One"]First card content.[/card]
425
+ [/reveal]
426
+
427
+ [reveal animation="fade-in-up" delay="150"]
428
+ [card title="Feature Two"]Second card content.[/card]
429
+ [/reveal]
430
+
431
+ [reveal animation="fade-in-up" delay="300"]
432
+ [card title="Feature Three"]Third card content.[/card]
433
+ [/reveal]</pre>
434
+
435
+ <h3 class="mb-2">Hero with ambient background</h3>
436
+ <pre class="code-block mb-3">[ambient type="aurora" speed="slow" intensity="subtle"]
437
+ [reveal animation="zoom"]
438
+ # Your headline here
439
+
440
+ A compelling subheading that draws users in.
441
+ [/reveal]
442
+ [/ambient]</pre>
443
+
444
+ <h3 class="mb-2">Christmas page with fireworks</h3>
445
+ <pre class="code-block mb-3">[celebrate theme="christmas" intensity="medium" /]
446
+
447
+ [fireworks]
448
+ [firework type="burst" colour="rainbow" /]
449
+ [firework type="sparkle" colour="primary" /]
450
+ [/fireworks]
451
+
452
+ [reveal animation="fade"]
453
+ # Merry Christmas!
454
+ [/reveal]</pre>
455
+ </div>
456
+
457
+ <!-- Celebrations tab -->
458
+ <div id="tab-celebrations" class="effects-tab-panel">
459
+ <h3 class="mb-2">Firework <span class="badge badge-info">CSS only</span></h3>
460
+ <p class="text-muted mb-2">Pure CSS particle effect — no JavaScript required. Works even without the plugin
461
+ enabled. Use self-closing for standalone particles, or wrapping to apply the firework classes to
462
+ content.</p>
463
+ <pre class="code-block mb-2">[firework type="burst" colour="rainbow" size="lg" continuous="true" /]</pre>
464
+ <pre class="code-block mb-2">[firework type="sparkle" colour="primary"]
465
+ Click me for a burst!
466
+ [/firework]</pre>
467
+ <table class="table mb-3">
468
+ <thead>
469
+ <tr>
470
+ <th>Attribute</th>
471
+ <th>Values</th>
472
+ <th>Description</th>
473
+ </tr>
474
+ </thead>
475
+ <tbody>
476
+ <tr>
477
+ <td><code>type</code></td>
478
+ <td>burst, sparkle, trail</td>
479
+ <td>Firework particle shape</td>
480
+ </tr>
481
+ <tr>
482
+ <td><code>colour</code></td>
483
+ <td>rainbow, primary, info, success, warning, danger</td>
484
+ <td>Particle colour theme</td>
485
+ </tr>
486
+ <tr>
487
+ <td><code>size</code></td>
488
+ <td>sm, md, lg</td>
489
+ <td>Particle size (default: md)</td>
490
+ </tr>
491
+ <tr>
492
+ <td><code>continuous</code></td>
493
+ <td>true / false</td>
494
+ <td>Loop the animation continuously</td>
495
+ </tr>
496
+ <tr>
497
+ <td><code>hover</code></td>
498
+ <td>true / false</td>
499
+ <td>Only animate on mouse hover</td>
500
+ </tr>
501
+ </tbody>
502
+ </table>
503
+
504
+ <h3 class="mb-2">Fireworks Container <span class="badge badge-info">CSS only</span></h3>
505
+ <p class="text-muted mb-2">Groups multiple firework elements into a positioned overlay container.</p>
506
+ <pre class="code-block mb-3">[fireworks]
507
+ [firework type="burst" colour="rainbow" /]
508
+ [firework type="sparkle" colour="primary" /]
509
+ [firework type="trail" colour="warning" /]
510
+ [/fireworks]</pre>
511
+
512
+ <h3 class="mb-2">Celebrate <span class="badge badge-warning">Requires plugin JS</span></h3>
513
+ <p class="text-muted mb-2">Canvas-based seasonal particle system. Auto-detects the active celebration based
514
+ on
515
+ today's date, or specify a theme manually. Skipped automatically when
516
+ <code>prefers-reduced-motion</code> is active.</p>
517
+ <pre class="code-block mb-2">[celebrate theme="auto" intensity="medium" /]</pre>
518
+ <pre class="code-block mb-2">[celebrate theme="christmas" intensity="heavy" /]</pre>
519
+ <table class="table mb-3">
520
+ <thead>
521
+ <tr>
522
+ <th>Theme</th>
523
+ <th>Active dates</th>
524
+ </tr>
525
+ </thead>
526
+ <tbody>
527
+ <tr>
528
+ <td><code>auto</code></td>
529
+ <td>Detects automatically from the table below</td>
530
+ </tr>
531
+ <tr>
532
+ <td><code>christmas</code></td>
533
+ <td>1 Dec – 1 Jan (snowflakes)</td>
534
+ </tr>
535
+ <tr>
536
+ <td><code>halloween</code></td>
537
+ <td>26 Oct – 31 Oct (bats &amp; pumpkins)</td>
538
+ </tr>
539
+ <tr>
540
+ <td><code>valentines</code></td>
541
+ <td>9 Feb – 14 Feb (hearts)</td>
542
+ </tr>
543
+ <tr>
544
+ <td><code>guy-fawkes</code></td>
545
+ <td>1 Nov – 5 Nov (fireworks)</td>
546
+ </tr>
547
+ <tr>
548
+ <td><code>st-patricks</code></td>
549
+ <td>12 Mar – 17 Mar (shamrocks)</td>
550
+ </tr>
551
+ <tr>
552
+ <td><code>st-davids</code></td>
553
+ <td>24 Feb – 1 Mar (daffodils)</td>
554
+ </tr>
555
+ <tr>
556
+ <td><code>st-georges</code></td>
557
+ <td>18 Apr – 23 Apr (roses)</td>
558
+ </tr>
559
+ <tr>
560
+ <td><code>st-andrews</code></td>
561
+ <td>25 Nov – 30 Nov (thistles)</td>
562
+ </tr>
563
+ </tbody>
564
+ </table>
565
+ <table class="table mb-3">
566
+ <thead>
567
+ <tr>
568
+ <th>Attribute</th>
569
+ <th>Values</th>
570
+ <th>Description</th>
571
+ </tr>
572
+ </thead>
573
+ <tbody>
574
+ <tr>
575
+ <td><code>theme</code></td>
576
+ <td>auto, christmas, halloween, valentines, guy-fawkes, st-patricks, st-davids, st-georges,
577
+ st-andrews
578
+ </td>
579
+ <td>Theme to use (default: auto)</td>
580
+ </tr>
581
+ <tr>
582
+ <td><code>intensity</code></td>
583
+ <td>light, medium, heavy</td>
584
+ <td>Particle density (default: medium)</td>
585
+ </tr>
586
+ </tbody>
587
+ </table>
588
+ <p class="text-muted"><strong>Tip:</strong> CSS fireworks (<code>[firework]</code>) render instantly with no
589
+ JS.
590
+ Canvas celebrations (<code>[celebrate]</code>) load the JS module on demand and degrade silently if
591
+ unavailable.</p>
592
+ </div>
593
+ </div>
594
+ </div>
@@ -0,0 +1 @@
1
+ import{apiRequest as s}from"/admin/js/api.js";export const effectsView={templateUrl:"/admin/js/templates/effects.html",async onMount(t){let e={};try{e=await s("/effects/settings")}catch{E.toast("Could not load settings.",{type:"error"})}t.find("#field-respect-motion").prop("checked",e.respectMotion!==!1),t.find("#field-default-duration").val(e.defaultDuration??600),t.find("#field-default-animation").val(e.defaultAnimation||"fade"),t.find("#field-default-threshold").val(e.defaultThreshold??.1),t.find("#save-settings-btn").off("click").on("click",async()=>{const a={respectMotion:t.find("#field-respect-motion").prop("checked"),defaultDuration:parseInt(t.find("#field-default-duration").val(),10)||600,defaultAnimation:t.find("#field-default-animation").val(),defaultThreshold:parseFloat(t.find("#field-default-threshold").val())||.1};try{await s("/effects/settings",{method:"PUT",body:JSON.stringify(a)}),E.toast("Settings saved.",{type:"success"})}catch{E.toast("Failed to save settings.",{type:"error"})}}),t.find(".effects-tab-btn").on("click",function(){const a=$(this).data("tab");t.find(".effects-tab-btn").removeClass("active"),$(this).addClass("active"),t.find(".effects-tab-panel").hide(),t.find(`#tab-${a}`).show()}),t.find(".effects-tab-panel").hide(),t.find("#tab-entrance").show(),Domma.icons.scan()}};
@@ -1 +1 @@
1
- import{dashboardView as o}from"./dashboard.js";import{pagesView as i}from"./pages.js";import{pageEditorView as r}from"./page-editor.js";import{settingsView as t}from"./settings.js";import{navigationView as e}from"./navigation.js";import{layoutsView as m}from"./layouts.js";import{mediaView as s}from"./media.js";import{loginView as p}from"./login.js";import{usersView as f}from"./users.js";import{userEditorView as w}from"./user-editor.js";import{pluginsView as n}from"./plugins.js";import{documentationView as V}from"./documentation.js";import{tutorialsView as l}from"./tutorials.js";import{apiReferenceView as c}from"./api-reference.js";import{collectionsView as a}from"./collections.js";import{collectionEditorView as d}from"./collection-editor.js";import{collectionEntriesView as E}from"./collection-entries.js";import{formsView as u}from"./forms.js";import{formEditorView as g}from"./form-editor.js";import{formSubmissionsView as v}from"./form-submissions.js";import{viewsListView as b}from"./views-list.js";import{viewEditorView as k}from"./view-editor.js";import{viewPreviewView as y}from"./view-preview.js";import{actionsListView as L}from"./actions-list.js";import{actionEditorView as P}from"./action-editor.js";import{proDocsView as h}from"./pro-docs.js";import{blocksView as D}from"./blocks.js";import{blockEditorView as R}from"./block-editor.js";import{myProfileView as S}from"./my-profile.js";import{rolesView as x}from"./roles.js";import{roleEditorView as j}from"./role-editor.js";export const views={dashboard:o,pages:i,pageEditor:r,settings:t,navigation:e,layouts:m,media:s,login:p,users:f,userEditor:w,plugins:n,documentation:V,tutorials:l,apiReference:c,collections:a,collectionEditor:d,collectionEntries:E,forms:u,formEditor:g,formSubmissions:v,viewsList:b,viewEditor:k,viewPreview:y,actionsList:L,actionEditor:P,proDocs:h,blocks:D,blockEditor:R,myProfile:S,roles:x,roleEditor:j};
1
+ import{dashboardView as o}from"./dashboard.js";import{pagesView as i}from"./pages.js";import{pageEditorView as r}from"./page-editor.js";import{settingsView as e}from"./settings.js";import{navigationView as t}from"./navigation.js";import{layoutsView as m}from"./layouts.js";import{mediaView as s}from"./media.js";import{loginView as f}from"./login.js";import{usersView as p}from"./users.js";import{userEditorView as w}from"./user-editor.js";import{pluginsView as V}from"./plugins.js";import{documentationView as n}from"./documentation.js";import{tutorialsView as l}from"./tutorials.js";import{apiReferenceView as c}from"./api-reference.js";import{collectionsView as a}from"./collections.js";import{collectionEditorView as d}from"./collection-editor.js";import{collectionEntriesView as E}from"./collection-entries.js";import{formsView as u}from"./forms.js";import{formEditorView as g}from"./form-editor.js";import{formSubmissionsView as v}from"./form-submissions.js";import{viewsListView as b}from"./views-list.js";import{viewEditorView as k}from"./view-editor.js";import{viewPreviewView as y}from"./view-preview.js";import{actionsListView as L}from"./actions-list.js";import{actionEditorView as P}from"./action-editor.js";import{proDocsView as h}from"./pro-docs.js";import{blocksView as D}from"./blocks.js";import{blockEditorView as R}from"./block-editor.js";import{myProfileView as S}from"./my-profile.js";import{rolesView as x}from"./roles.js";import{roleEditorView as j}from"./role-editor.js";import{effectsView as q}from"./effects.js";export const views={dashboard:o,pages:i,pageEditor:r,settings:e,navigation:t,layouts:m,media:s,login:f,users:p,userEditor:w,plugins:V,documentation:n,tutorials:l,apiReference:c,collections:a,collectionEditor:d,collectionEntries:E,forms:u,formEditor:g,formSubmissions:v,viewsList:b,viewEditor:k,viewPreview:y,actionsList:L,actionEditor:P,proDocs:h,blocks:D,blockEditor:R,myProfile:S,roles:x,roleEditor:j,effects:q};