@liascript/exporter 3.0.0--1.0.3 → 3.0.1--1.0.3

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/assets/capacitor/{index.bfe7363b.js → index.a7f021f7.js} +1 -1
  2. package/dist/assets/capacitor/index.html +1 -1
  3. package/dist/assets/capacitor/{jszip.min.f6eda75b.js → jszip.min.43389eb1.js} +1 -1
  4. package/dist/assets/capacitor/{trystero-ipfs.min.b27a61d7.js → trystero-ipfs.min.f25fe3e7.js} +1 -1
  5. package/dist/assets/indexeddb/{index.599a57d6.js → index.4aceca2f.js} +1 -1
  6. package/dist/assets/indexeddb/index.html +1 -1
  7. package/dist/assets/indexeddb/{jszip.min.63142cc8.js → jszip.min.4fbcc13f.js} +1 -1
  8. package/dist/assets/scorm2004/{index.7a5820ab.js → index.33bec53a.js} +1 -1
  9. package/dist/assets/scorm2004/index.html +1 -1
  10. package/dist/assets/scorm2004/{jszip.min.63142cc8.js → jszip.min.4fbcc13f.js} +1 -1
  11. package/dist/assets/xapi/{index.018a032a.js → index.f2e89e49.js} +1 -1
  12. package/dist/assets/xapi/index.html +1 -1
  13. package/dist/assets/xapi/{jszip.min.eaecf580.js → jszip.min.19c66d77.js} +1 -1
  14. package/dist/index.js +47 -47
  15. package/dist/server/presets.json +94 -0
  16. package/dist/server/presets.yaml +120 -0
  17. package/dist/server/public/app.js +1 -0
  18. package/dist/server/public/assets/android.svg +38 -0
  19. package/dist/server/public/assets/cmi.svg +154 -0
  20. package/dist/server/public/assets/docx.svg +20 -0
  21. package/dist/server/public/assets/edX.svg +75 -0
  22. package/dist/server/public/assets/edx.svg +75 -0
  23. package/dist/server/public/assets/epub.svg +18 -0
  24. package/dist/server/public/assets/icon.svg +82 -0
  25. package/dist/server/public/assets/ilias.png +0 -0
  26. package/dist/server/public/assets/json.svg +4 -0
  27. package/dist/server/public/assets/learnworlds.png +0 -0
  28. package/dist/server/public/assets/moodle.svg +190 -0
  29. package/dist/server/public/assets/opal.png +0 -0
  30. package/dist/server/public/assets/openolat.png +0 -0
  31. package/dist/server/public/assets/pdf.svg +4 -0
  32. package/dist/server/public/assets/rdf.svg +4 -0
  33. package/dist/server/public/assets/scorm.png +0 -0
  34. package/dist/server/public/assets/web.png +0 -0
  35. package/dist/server/public/assets/xapi.png +0 -0
  36. package/dist/server/public/i18n.js +1 -0
  37. package/dist/server/public/index.html +1587 -0
  38. package/dist/server/public/locales/de.json +247 -0
  39. package/dist/server/public/locales/en.json +247 -0
  40. package/dist/server/public/status.html +251 -0
  41. package/dist/server/public/styles.css +712 -0
  42. package/package.json +5 -1
  43. package/.parcelrc +0 -3
  44. package/DESKTOP_APP_README.md +0 -58
  45. package/DOCKERHUB_DESCRIPTION.md +0 -52
  46. package/Dockerfile +0 -129
  47. package/PLAYSTORE_GUIDE.md +0 -172
  48. package/action.yml +0 -157
  49. package/custom.css +0 -10
  50. package/electron-builder.json +0 -149
  51. package/src/cli.ts +0 -69
  52. package/src/colorize.ts +0 -115
  53. package/src/export/android.ts +0 -419
  54. package/src/export/docx.ts +0 -1025
  55. package/src/export/epub.ts +0 -1306
  56. package/src/export/h5p.ts +0 -390
  57. package/src/export/helper.ts +0 -360
  58. package/src/export/ims.ts +0 -191
  59. package/src/export/pdf.ts +0 -406
  60. package/src/export/presets.ts +0 -220
  61. package/src/export/project.ts +0 -829
  62. package/src/export/rdf.ts +0 -551
  63. package/src/export/scorm12.ts +0 -167
  64. package/src/export/scorm2004.ts +0 -140
  65. package/src/export/web.ts +0 -306
  66. package/src/export/xapi.ts +0 -424
  67. package/src/exporter.ts +0 -296
  68. package/src/index.ts +0 -96
  69. package/src/parser.ts +0 -373
  70. package/src/presets.yaml +0 -219
  71. package/src/types.ts +0 -82
  72. package/tsconfig.json +0 -24
@@ -0,0 +1,1587 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>LiaScript Exporter</title>
7
+ <link rel="stylesheet" href="/styles.css" />
8
+ <script src="/i18n.js"></script>
9
+ </head>
10
+ <body>
11
+ <nav class="navbar">
12
+ <div class="navbar-container">
13
+ <a href="/" class="navbar-brand">
14
+ <img src="./assets/icon.svg" alt="LiaScript" />
15
+ </a>
16
+ <ul class="navbar-menu">
17
+ <li>
18
+ <a href="/" class="navbar-link active" data-i18n="nav.home">Home</a>
19
+ </li>
20
+ <li>
21
+ <a href="/status.html" class="navbar-link" data-i18n="nav.status"
22
+ >Status</a
23
+ >
24
+ </li>
25
+ <li class="language-selector-container">
26
+ <select id="language-selector" class="language-selector">
27
+ <option value="en">EN</option>
28
+ <option value="de">DE</option>
29
+ </select>
30
+ </li>
31
+ </ul>
32
+ </div>
33
+ </nav>
34
+
35
+ <div class="container">
36
+ <header>
37
+ <h1 data-i18n="header.title">LiaScript Exporter</h1>
38
+ <p class="subtitle" data-i18n="header.subtitle">
39
+ Create exports for various LMS and formats
40
+ </p>
41
+ </header>
42
+
43
+ <main>
44
+ <form id="exportForm" enctype="multipart/form-data">
45
+ <!-- Section 1: Project Source -->
46
+ <section class="card">
47
+ <h2 data-i18n="sections.projectSource">1. Project Source</h2>
48
+
49
+ <!-- Upload Tab -->
50
+ <div class="source-tabs">
51
+ <button
52
+ type="button"
53
+ class="tab-button active"
54
+ data-tab="upload"
55
+ data-i18n="tabs.fileUpload"
56
+ >
57
+ File Upload
58
+ </button>
59
+ <button
60
+ type="button"
61
+ class="tab-button"
62
+ data-tab="git"
63
+ data-i18n="tabs.gitRepository"
64
+ >
65
+ Git Repository
66
+ </button>
67
+ </div>
68
+
69
+ <!-- Upload Panel -->
70
+ <div class="tab-panel active" id="upload-panel">
71
+ <div class="upload-area" id="uploadArea">
72
+ <svg
73
+ width="48"
74
+ height="48"
75
+ viewBox="0 0 24 24"
76
+ fill="none"
77
+ stroke="currentColor"
78
+ stroke-width="2"
79
+ >
80
+ <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path>
81
+ <polyline points="17 8 12 3 7 8"></polyline>
82
+ <line x1="12" y1="3" x2="12" y2="15"></line>
83
+ </svg>
84
+ <p data-i18n="upload.dropzone">
85
+ Drop files here or click to select
86
+ </p>
87
+ <p class="hint" data-i18n="upload.hint">
88
+ ZIP files or multiple files (max. 100MB)
89
+ </p>
90
+ </div>
91
+ <div id="fileList" class="file-list"></div>
92
+ </div>
93
+
94
+ <!-- Git Panel -->
95
+ <div class="tab-panel" id="git-panel">
96
+ <div class="form-group">
97
+ <label for="gitUrl" data-i18n="git.repoUrlRequired"
98
+ >Repository URL *</label
99
+ >
100
+ <input
101
+ type="text"
102
+ id="gitUrl"
103
+ name="gitUrl"
104
+ placeholder="https://github.com/user/repo.git"
105
+ />
106
+ </div>
107
+ <div class="form-row">
108
+ <div class="form-group">
109
+ <label for="gitBranch" data-i18n="git.branch"
110
+ >Branch / Tag</label
111
+ >
112
+ <input
113
+ type="text"
114
+ id="gitBranch"
115
+ name="gitBranch"
116
+ data-i18n-placeholder="git.branchPlaceholder"
117
+ placeholder="main"
118
+ />
119
+ </div>
120
+ <div class="form-group">
121
+ <label for="gitSubdir" data-i18n="git.subdirectory"
122
+ >Subdirectory</label
123
+ >
124
+ <input
125
+ type="text"
126
+ id="gitSubdir"
127
+ name="gitSubdir"
128
+ data-i18n-placeholder="git.subdirPlaceholder"
129
+ placeholder="docs/"
130
+ />
131
+ </div>
132
+ </div>
133
+ </div>
134
+ </section>
135
+
136
+ <!-- Section 2: Export Target -->
137
+ <section class="card">
138
+ <h2 data-i18n="sections.exportTarget">2. Export Target</h2>
139
+
140
+ <!-- Export Target Tabs -->
141
+ <div class="export-tabs">
142
+ <button
143
+ type="button"
144
+ class="export-tab-button active"
145
+ data-export-tab="presets"
146
+ data-i18n="exportTabs.presets"
147
+ >
148
+ Known Configurations
149
+ </button>
150
+ <button
151
+ type="button"
152
+ class="export-tab-button"
153
+ data-export-tab="formats"
154
+ data-i18n="exportTabs.formats"
155
+ >
156
+ Formats
157
+ </button>
158
+ </div>
159
+
160
+ <!-- Presets Panel -->
161
+ <div class="export-tab-panel active" id="presets-panel">
162
+ <div class="preset-grid" id="presets-grid">
163
+ <!-- Presets will be loaded dynamically -->
164
+ </div>
165
+
166
+ <hr
167
+ style="
168
+ margin: 2rem 0 1rem 0;
169
+ border: none;
170
+ border-top: 1px solid #e0e0e0;
171
+ "
172
+ />
173
+
174
+ <div
175
+ id="preset-description"
176
+ style="
177
+ padding: 1rem;
178
+ background-color: #f8f9fa;
179
+ border-radius: 8px;
180
+ display: none;
181
+ "
182
+ >
183
+ <p style="margin: 0; color: #555; line-height: 1.6"></p>
184
+ </div>
185
+ </div>
186
+
187
+ <!-- Formats Panel -->
188
+ <div class="export-tab-panel" id="formats-panel">
189
+ <div class="preset-grid">
190
+ <label class="preset-tile">
191
+ <input
192
+ type="radio"
193
+ name="format"
194
+ value="scorm1.2"
195
+ data-i18n-description="formats.scorm12.description"
196
+ data-description="E-learning standard for learning management systems. Widely used, but older. Suitable for legacy LMS platforms. <a href='https://en.wikipedia.org/wiki/Sharable_Content_Object_Reference_Model' target='_blank'>Learn more</a>"
197
+ />
198
+ <div class="preset-content">
199
+ <img
200
+ style="height: 48px"
201
+ src="../assets/scorm.png"
202
+ alt="SCORM"
203
+ />
204
+ <h3 data-i18n="formats.scorm12.title">SCORM 1.2</h3>
205
+ <p data-i18n="formats.scorm12.subtitle">Legacy Standard</p>
206
+ </div>
207
+ </label>
208
+
209
+ <label class="preset-tile">
210
+ <input
211
+ type="radio"
212
+ name="format"
213
+ value="scorm2004"
214
+ data-i18n-description="formats.scorm2004.description"
215
+ data-description="Modern version of the SCORM standard with advanced features for learning paths and assessments. Recommended for current LMS systems. <a href='https://en.wikipedia.org/wiki/Sharable_Content_Object_Reference_Model' target='_blank'>Learn more</a>"
216
+ />
217
+ <div class="preset-content">
218
+ <img
219
+ style="height: 48px"
220
+ src="../assets/scorm.png"
221
+ alt="SCORM"
222
+ />
223
+ <h3 data-i18n="formats.scorm2004.title">SCORM 2004</h3>
224
+ <p data-i18n="formats.scorm2004.subtitle">
225
+ Modern Standard
226
+ </p>
227
+ </div>
228
+ </label>
229
+
230
+ <label class="preset-tile">
231
+ <input
232
+ type="radio"
233
+ name="format"
234
+ value="ims"
235
+ data-i18n-description="formats.ims.description"
236
+ data-description="IMS Content Packaging for exchanging learning content between different platforms. Standard for cross-platform compatibility. <a href='https://en.wikipedia.org/wiki/IMS_Content_Packaging' target='_blank'>Learn more</a>"
237
+ />
238
+ <div class="preset-content">
239
+ <img
240
+ style="height: 48px"
241
+ src="../assets/cmi.svg"
242
+ alt="IMS"
243
+ />
244
+ <h3 data-i18n="formats.ims.title">IMS</h3>
245
+ <p data-i18n="formats.ims.subtitle">Content Package</p>
246
+ </div>
247
+ </label>
248
+
249
+ <label class="preset-tile">
250
+ <input
251
+ type="radio"
252
+ name="format"
253
+ value="web"
254
+ data-i18n-description="formats.web.description"
255
+ data-description="Standalone HTML website for hosting on any web server. Works offline and online. Perfect for self-hosting."
256
+ />
257
+ <div class="preset-content">
258
+ <img
259
+ style="height: 48px"
260
+ src="../assets/web.png"
261
+ alt="Web"
262
+ />
263
+ <h3 data-i18n="formats.web.title">Web</h3>
264
+ <p data-i18n="formats.web.subtitle">Standalone</p>
265
+ </div>
266
+ </label>
267
+
268
+ <label class="preset-tile">
269
+ <input
270
+ type="radio"
271
+ name="format"
272
+ value="pdf"
273
+ data-i18n-description="formats.pdf.description"
274
+ data-description="Portable Document Format for printing and archiving. Ideal for static content and offline reading. <a href='https://en.wikipedia.org/wiki/PDF' target='_blank'>Learn more</a>"
275
+ />
276
+ <div class="preset-content">
277
+ <img
278
+ style="height: 48px"
279
+ src="../assets/pdf.svg"
280
+ alt="PDF"
281
+ />
282
+ <h3 data-i18n="formats.pdf.title">PDF</h3>
283
+ <p data-i18n="formats.pdf.subtitle">Document</p>
284
+ </div>
285
+ </label>
286
+
287
+ <label class="preset-tile">
288
+ <input
289
+ type="radio"
290
+ name="format"
291
+ value="android"
292
+ data-i18n-description="formats.android.description"
293
+ data-description="Android app package (APK) for installation on Android devices. Enables offline access and native app experience."
294
+ />
295
+ <div class="preset-content">
296
+ <img
297
+ style="height: 48px"
298
+ src="../assets/android.svg"
299
+ alt="Android"
300
+ />
301
+ <h3 data-i18n="formats.android.title">Android</h3>
302
+ <p data-i18n="formats.android.subtitle">App Package</p>
303
+ </div>
304
+ </label>
305
+
306
+ <label class="preset-tile">
307
+ <input
308
+ type="radio"
309
+ name="format"
310
+ value="json"
311
+ data-i18n-description="formats.json.description"
312
+ data-description="Structured data format for programmatic processing and API integration. Perfect for developers and automated workflows. <a href='https://en.wikipedia.org/wiki/JSON' target='_blank'>Learn more</a>"
313
+ />
314
+ <div class="preset-content">
315
+ <img
316
+ style="height: 48px"
317
+ src="../assets/json.svg"
318
+ alt="JSON"
319
+ />
320
+ <h3 data-i18n="formats.json.title">JSON</h3>
321
+ <p data-i18n="formats.json.subtitle">Data Export</p>
322
+ </div>
323
+ </label>
324
+
325
+ <label class="preset-tile">
326
+ <input
327
+ type="radio"
328
+ name="format"
329
+ value="epub"
330
+ data-i18n-description="formats.epub.description"
331
+ data-description="Open e-book format for e-readers and mobile devices. Supports reflowable layouts and is compatible with most e-readers. <a href='https://en.wikipedia.org/wiki/EPUB' target='_blank'>Learn more</a>"
332
+ />
333
+ <div class="preset-content">
334
+ <img
335
+ style="height: 48px"
336
+ src="../assets/epub.svg"
337
+ alt="EPUB"
338
+ />
339
+ <h3 data-i18n="formats.epub.title">EPUB</h3>
340
+ <p data-i18n="formats.epub.subtitle">E-Book</p>
341
+ </div>
342
+ </label>
343
+
344
+ <label class="preset-tile">
345
+ <input
346
+ type="radio"
347
+ name="format"
348
+ value="docx"
349
+ data-i18n-description="formats.docx.description"
350
+ data-description="Microsoft Word document format for professional documents. Compatible with Word 2007+, LibreOffice Writer, and Google Docs. <a href='https://en.wikipedia.org/wiki/Office_Open_XML' target='_blank'>Learn more</a>"
351
+ />
352
+ <div class="preset-content">
353
+ <img
354
+ style="height: 48px"
355
+ src="../assets/docx.svg"
356
+ alt="DOCX"
357
+ />
358
+ <h3 data-i18n="formats.docx.title">DOCX</h3>
359
+ <p data-i18n="formats.docx.subtitle">Word Document</p>
360
+ </div>
361
+ </label>
362
+
363
+ <label class="preset-tile">
364
+ <input
365
+ type="radio"
366
+ name="format"
367
+ value="rdf"
368
+ data-i18n-description="formats.rdf.description"
369
+ data-description="Resource Description Framework for structured metadata and Linked Data. For semantic web applications and metadata export. <a href='https://en.wikipedia.org/wiki/Resource_Description_Framework' target='_blank'>Learn more</a>"
370
+ />
371
+ <div class="preset-content">
372
+ <img
373
+ style="height: 48px"
374
+ src="../assets/rdf.svg"
375
+ alt="RDF"
376
+ />
377
+ <h3 data-i18n="formats.rdf.title">RDF</h3>
378
+ <p data-i18n="formats.rdf.subtitle">Metadata</p>
379
+ </div>
380
+ </label>
381
+
382
+ <label class="preset-tile">
383
+ <input
384
+ type="radio"
385
+ name="format"
386
+ value="xapi"
387
+ data-i18n-description="formats.xapi.description"
388
+ data-description="Experience API (xAPI) for Learning Analytics and detailed tracking of learning activities. Enables advanced analytics through a Learning Record Store (LRS). <a href='https://en.wikipedia.org/wiki/Experience_API' target='_blank'>Learn more</a>"
389
+ />
390
+ <div class="preset-content">
391
+ <img
392
+ style="height: 48px"
393
+ src="../assets/xapi.png"
394
+ alt="xAPI"
395
+ />
396
+ <h3 data-i18n="formats.xapi.title">xAPI</h3>
397
+ <p data-i18n="formats.xapi.subtitle">Learning Analytics</p>
398
+ </div>
399
+ </label>
400
+ </div>
401
+
402
+ <hr
403
+ style="
404
+ margin: 2rem 0 1rem 0;
405
+ border: none;
406
+ border-top: 1px solid #e0e0e0;
407
+ "
408
+ />
409
+
410
+ <div
411
+ id="format-description"
412
+ style="
413
+ padding: 1rem;
414
+ background-color: #f8f9fa;
415
+ border-radius: 8px;
416
+ display: none;
417
+ "
418
+ >
419
+ <p style="margin: 0; color: #555; line-height: 1.6"></p>
420
+ </div>
421
+ </div>
422
+ </section>
423
+
424
+ <!-- Section 3: Advanced Settings -->
425
+ <section class="card">
426
+ <h2>
427
+ <button
428
+ type="button"
429
+ id="toggleAdvanced"
430
+ class="collapsible-toggle"
431
+ >
432
+ <span class="toggle-icon">▶</span>
433
+ <span data-i18n="sections.advancedSettings"
434
+ >3. Advanced Settings (optional)</span
435
+ >
436
+ </button>
437
+ </h2>
438
+
439
+ <div id="advancedSettings" class="collapsible-content hidden">
440
+ <!-- SCORM Settings -->
441
+ <div
442
+ class="settings-group"
443
+ data-formats="scorm1.2,scorm2004,moodle,ilias,opal,generic,openolat,openedx"
444
+ >
445
+ <h3 class="settings-heading" data-i18n="settings.scorm.title">
446
+ SCORM Settings
447
+ </h3>
448
+
449
+ <div class="form-group">
450
+ <label
451
+ for="masteryScore"
452
+ data-i18n="settings.scorm.masteryScore"
453
+ >Mastery Score</label
454
+ >
455
+ <input
456
+ type="text"
457
+ inputmode="numeric"
458
+ id="masteryScore"
459
+ name="option_masteryScore"
460
+ placeholder="70"
461
+ />
462
+ <span class="hint" data-i18n="settings.scorm.masteryScoreHint"
463
+ >Minimum score to pass (0-100)</span
464
+ >
465
+ </div>
466
+
467
+ <div class="form-group">
468
+ <label
469
+ for="scormOrganization"
470
+ data-i18n="settings.scorm.organization"
471
+ >Organization</label
472
+ >
473
+ <input
474
+ type="text"
475
+ id="scormOrganization"
476
+ name="option_scormOrganization"
477
+ data-i18n-placeholder="settings.scorm.organizationHint"
478
+ placeholder="My Organization"
479
+ />
480
+ <span class="hint" data-i18n="settings.scorm.organizationHint"
481
+ >Organization title in SCORM package</span
482
+ >
483
+ </div>
484
+
485
+ <div class="form-group">
486
+ <label
487
+ for="typicalDuration"
488
+ data-i18n="settings.scorm.typicalDuration"
489
+ >Typical Duration</label
490
+ >
491
+ <input
492
+ type="text"
493
+ id="typicalDuration"
494
+ name="option_typicalDuration"
495
+ placeholder="PT0H5M0S"
496
+ value="PT0H5M0S"
497
+ />
498
+ <span
499
+ class="hint"
500
+ data-i18n="settings.scorm.typicalDurationHint"
501
+ >Format: PT0H5M0S (5 minutes)</span
502
+ >
503
+ </div>
504
+
505
+ <div class="form-group">
506
+ <label>
507
+ <input
508
+ type="checkbox"
509
+ id="scormIframe"
510
+ name="option_scormIframe"
511
+ />
512
+ <span data-i18n="settings.scorm.useIframe">Use iFrame</span>
513
+ </label>
514
+ <span class="hint" data-i18n="settings.scorm.useIframeHint"
515
+ >For better compatibility in some LMS</span
516
+ >
517
+ </div>
518
+
519
+ <div class="form-group">
520
+ <label>
521
+ <input
522
+ type="checkbox"
523
+ id="scormEmbed"
524
+ name="option_scormEmbed"
525
+ />
526
+ <span data-i18n="settings.scorm.embedMarkdown"
527
+ >Embed Markdown</span
528
+ >
529
+ </label>
530
+ <span
531
+ class="hint"
532
+ data-i18n="settings.scorm.embedMarkdownHint"
533
+ >Recommended for Moodle 4</span
534
+ >
535
+ </div>
536
+ </div>
537
+
538
+ <!-- xAPI Settings -->
539
+ <div class="settings-group" data-formats="xapi">
540
+ <h3 class="settings-heading" data-i18n="settings.xapi.title">
541
+ xAPI Settings
542
+ </h3>
543
+
544
+ <div class="form-group">
545
+ <label
546
+ for="xapiEndpoint"
547
+ data-i18n="settings.xapi.lrsEndpoint"
548
+ >LRS Endpoint</label
549
+ >
550
+ <input
551
+ type="text"
552
+ id="xapiEndpoint"
553
+ name="option_xapi-endpoint"
554
+ placeholder="https://lrs.example.com/xAPI/statements"
555
+ />
556
+ <span class="hint" data-i18n="settings.xapi.lrsEndpointHint"
557
+ >URL of the Learning Record Store (LRS) endpoint</span
558
+ >
559
+ </div>
560
+
561
+ <div class="form-group">
562
+ <label for="xapiAuth" data-i18n="settings.xapi.authentication"
563
+ >Authentication</label
564
+ >
565
+ <input
566
+ type="text"
567
+ id="xapiAuth"
568
+ name="option_xapi-auth"
569
+ placeholder="Basic dXNlcm5hbWU6cGFzc3dvcmQ="
570
+ />
571
+ <span
572
+ class="hint"
573
+ data-i18n="settings.xapi.authenticationHint"
574
+ >Basic Auth String for LRS (e.g. "Basic
575
+ base64encodedcredentials")</span
576
+ >
577
+ </div>
578
+
579
+ <div class="form-group">
580
+ <label for="xapiActor" data-i18n="settings.xapi.actor"
581
+ >Actor (JSON)</label
582
+ >
583
+ <textarea
584
+ id="xapiActor"
585
+ name="option_xapi-actor"
586
+ rows="4"
587
+ data-i18n-placeholder="settings.xapi.actorPlaceholder"
588
+ placeholder='{"objectType":"Agent","name":"Anonymous","mbox":"mailto:anonymous@example.com"}'
589
+ ></textarea>
590
+ <span class="hint" data-i18n="settings.xapi.actorHint"
591
+ >xAPI Actor in JSON format (default: anonymous)</span
592
+ >
593
+ </div>
594
+
595
+ <div class="form-group">
596
+ <label for="xapiCourseId" data-i18n="settings.xapi.courseId"
597
+ >Course ID</label
598
+ >
599
+ <input
600
+ type="text"
601
+ id="xapiCourseId"
602
+ name="option_xapi-course-id"
603
+ placeholder="https://example.com/course/123"
604
+ />
605
+ <span class="hint" data-i18n="settings.xapi.courseIdHint"
606
+ >Unique identifier for the course (default: course
607
+ URL)</span
608
+ >
609
+ </div>
610
+
611
+ <div class="form-group">
612
+ <label
613
+ for="xapiCourseTitle"
614
+ data-i18n="settings.xapi.courseTitle"
615
+ >Course Title</label
616
+ >
617
+ <input
618
+ type="text"
619
+ id="xapiCourseTitle"
620
+ name="option_xapi-course-title"
621
+ data-i18n-placeholder="settings.xapi.courseTitleHint"
622
+ placeholder="My LiaScript Course"
623
+ />
624
+ <span class="hint" data-i18n="settings.xapi.courseTitleHint"
625
+ >Displayed course title (default: from document)</span
626
+ >
627
+ </div>
628
+
629
+ <div class="form-group">
630
+ <label
631
+ for="xapiMasteryScore"
632
+ data-i18n="settings.xapi.masteryScore"
633
+ >Mastery Score</label
634
+ >
635
+ <input
636
+ type="text"
637
+ inputmode="decimal"
638
+ id="xapiMasteryScore"
639
+ name="option_xapi-mastery-threshold"
640
+ placeholder="0.8"
641
+ />
642
+ <span class="hint" data-i18n="settings.xapi.masteryScoreHint"
643
+ >Required score to pass (0.0-1.0, default: 0.8)</span
644
+ >
645
+ </div>
646
+
647
+ <div class="form-group">
648
+ <label
649
+ for="xapiProgressThreshold"
650
+ data-i18n="settings.xapi.progressThreshold"
651
+ >Progress Threshold</label
652
+ >
653
+ <input
654
+ type="text"
655
+ inputmode="decimal"
656
+ id="xapiProgressThreshold"
657
+ name="option_xapi-progress-threshold"
658
+ placeholder="0.9"
659
+ />
660
+ <span
661
+ class="hint"
662
+ data-i18n="settings.xapi.progressThresholdHint"
663
+ >Required slide progress for completion (0.0-1.0, default:
664
+ 0.9)</span
665
+ >
666
+ </div>
667
+
668
+ <div class="form-group">
669
+ <label>
670
+ <input
671
+ type="checkbox"
672
+ id="xapiDebug"
673
+ name="option_xapi-debug"
674
+ />
675
+ <span data-i18n="settings.xapi.debugMode">Debug Mode</span>
676
+ </label>
677
+ <span class="hint" data-i18n="settings.xapi.debugModeHint"
678
+ >Output xAPI statements to console</span
679
+ >
680
+ </div>
681
+
682
+ <div class="form-group">
683
+ <label>
684
+ <input
685
+ type="checkbox"
686
+ id="xapiZip"
687
+ name="option_xapi-zip"
688
+ checked
689
+ />
690
+ <span data-i18n="settings.xapi.zipPackage"
691
+ >Package as ZIP</span
692
+ >
693
+ </label>
694
+ <span class="hint" data-i18n="settings.xapi.zipPackageHint"
695
+ >Output as ZIP file</span
696
+ >
697
+ </div>
698
+ </div>
699
+
700
+ <!-- IMS Settings -->
701
+ <div class="settings-group" data-formats="ims">
702
+ <h3 class="settings-heading" data-i18n="settings.ims.title">
703
+ IMS Settings
704
+ </h3>
705
+
706
+ <div class="form-group">
707
+ <label>
708
+ <input
709
+ type="checkbox"
710
+ id="imsIndexeddb"
711
+ name="option_imsIndexeddb"
712
+ />
713
+ <span data-i18n="settings.ims.useIndexedDB"
714
+ >Use IndexedDB</span
715
+ >
716
+ </label>
717
+ <span class="hint" data-i18n="settings.ims.useIndexedDBHint"
718
+ >Persistent storage in browser</span
719
+ >
720
+ </div>
721
+ </div>
722
+
723
+ <!-- Web Settings -->
724
+ <div class="settings-group" data-formats="web">
725
+ <h3 class="settings-heading" data-i18n="settings.web.title">
726
+ Web Settings
727
+ </h3>
728
+
729
+ <div class="form-group">
730
+ <label>
731
+ <input
732
+ type="checkbox"
733
+ id="webIframe"
734
+ name="option_webIframe"
735
+ />
736
+ <span data-i18n="settings.web.iframeVersion"
737
+ >iFrame Version</span
738
+ >
739
+ </label>
740
+ <span class="hint" data-i18n="settings.web.iframeVersionHint"
741
+ >Hides the course URL</span
742
+ >
743
+ </div>
744
+
745
+ <div class="form-group">
746
+ <label>
747
+ <input
748
+ type="checkbox"
749
+ id="webIndexeddb"
750
+ name="option_webIndexeddb"
751
+ />
752
+ <span data-i18n="settings.web.useIndexedDB"
753
+ >Use IndexedDB</span
754
+ >
755
+ </label>
756
+ <span class="hint" data-i18n="settings.web.useIndexedDBHint"
757
+ >Store data in browser</span
758
+ >
759
+ </div>
760
+
761
+ <div class="form-group">
762
+ <label>
763
+ <input
764
+ type="checkbox"
765
+ id="webZip"
766
+ name="option_webZip"
767
+ checked
768
+ />
769
+ <span data-i18n="settings.web.zipPackage"
770
+ >Package as ZIP</span
771
+ >
772
+ </label>
773
+ <span class="hint" data-i18n="settings.web.zipPackageHint"
774
+ >Creates a ZIP file</span
775
+ >
776
+ </div>
777
+ </div>
778
+
779
+ <!-- PDF Settings -->
780
+ <div class="settings-group" data-formats="pdf">
781
+ <h3 class="settings-heading" data-i18n="settings.pdf.title">
782
+ PDF Settings
783
+ </h3>
784
+
785
+ <!-- Layout & Format -->
786
+ <div class="form-group">
787
+ <label for="pdfFormat" data-i18n="settings.pdf.pageFormat"
788
+ >Page Format</label
789
+ >
790
+ <select id="pdfFormat" name="option_pdf-format">
791
+ <option value="A4" selected>A4</option>
792
+ <option value="A3">A3</option>
793
+ <option value="A5">A5</option>
794
+ <option value="Letter">Letter</option>
795
+ <option value="Legal">Legal</option>
796
+ <option value="Tabloid">Tabloid</option>
797
+ <option value="Ledger">Ledger</option>
798
+ </select>
799
+ <span class="hint" data-i18n="settings.pdf.pageFormatHint"
800
+ >Standard paper size</span
801
+ >
802
+ </div>
803
+
804
+ <div class="form-group">
805
+ <label>
806
+ <input
807
+ type="checkbox"
808
+ id="pdfLandscape"
809
+ name="option_pdf-landscape"
810
+ />
811
+ <span data-i18n="settings.pdf.landscape">Landscape</span>
812
+ </label>
813
+ <span class="hint" data-i18n="settings.pdf.landscapeHint"
814
+ >Print page in landscape orientation</span
815
+ >
816
+ </div>
817
+
818
+ <!-- Scale & Background -->
819
+ <div class="form-group">
820
+ <label for="pdfScale" data-i18n="settings.pdf.scale"
821
+ >Scale</label
822
+ >
823
+ <input
824
+ type="text"
825
+ inputmode="decimal"
826
+ id="pdfScale"
827
+ name="option_pdf-scale"
828
+ placeholder="1.0"
829
+ />
830
+ <span class="hint" data-i18n="settings.pdf.scaleHint"
831
+ >Page scale (0.1 - 2.0)</span
832
+ >
833
+ </div>
834
+
835
+ <div class="form-group">
836
+ <label>
837
+ <input
838
+ type="checkbox"
839
+ id="pdfPrintBackground"
840
+ name="option_pdf-printBackground"
841
+ checked
842
+ />
843
+ <span data-i18n="settings.pdf.printBackground"
844
+ >Print Background Graphics</span
845
+ >
846
+ </label>
847
+ <span
848
+ class="hint"
849
+ data-i18n="settings.pdf.printBackgroundHint"
850
+ >Prints background colors and images</span
851
+ >
852
+ </div>
853
+
854
+ <!-- Margins -->
855
+ <div class="form-group">
856
+ <label for="pdfMarginTop" data-i18n="settings.pdf.marginTop"
857
+ >Top Margin</label
858
+ >
859
+ <input
860
+ type="text"
861
+ id="pdfMarginTop"
862
+ name="option_pdf-margin-top"
863
+ placeholder="80"
864
+ value="80"
865
+ />
866
+ <span class="hint" data-i18n="settings.pdf.marginTopHint"
867
+ >Top margin in pixels or with unit (e.g. "2cm")</span
868
+ >
869
+ </div>
870
+
871
+ <div class="form-group">
872
+ <label
873
+ for="pdfMarginBottom"
874
+ data-i18n="settings.pdf.marginBottom"
875
+ >Bottom Margin</label
876
+ >
877
+ <input
878
+ type="text"
879
+ id="pdfMarginBottom"
880
+ name="option_pdf-margin-bottom"
881
+ placeholder="80"
882
+ value="80"
883
+ />
884
+ <span class="hint" data-i18n="settings.pdf.marginBottomHint"
885
+ >Bottom margin in pixels or with unit</span
886
+ >
887
+ </div>
888
+
889
+ <div class="form-group">
890
+ <label for="pdfMarginLeft" data-i18n="settings.pdf.marginLeft"
891
+ >Left Margin</label
892
+ >
893
+ <input
894
+ type="text"
895
+ id="pdfMarginLeft"
896
+ name="option_pdf-margin-left"
897
+ placeholder="30"
898
+ value="30"
899
+ />
900
+ <span class="hint" data-i18n="settings.pdf.marginLeftHint"
901
+ >Left margin in pixels or with unit</span
902
+ >
903
+ </div>
904
+
905
+ <div class="form-group">
906
+ <label
907
+ for="pdfMarginRight"
908
+ data-i18n="settings.pdf.marginRight"
909
+ >Right Margin</label
910
+ >
911
+ <input
912
+ type="text"
913
+ id="pdfMarginRight"
914
+ name="option_pdf-margin-right"
915
+ placeholder="30"
916
+ value="30"
917
+ />
918
+ <span class="hint" data-i18n="settings.pdf.marginRightHint"
919
+ >Right margin in pixels or with unit</span
920
+ >
921
+ </div>
922
+
923
+ <!-- Header & Footer -->
924
+ <div class="form-group">
925
+ <label>
926
+ <input
927
+ type="checkbox"
928
+ id="pdfDisplayHeaderFooter"
929
+ name="option_pdf-displayHeaderFooter"
930
+ />
931
+ <span data-i18n="settings.pdf.displayHeaderFooter"
932
+ >Display Header & Footer</span
933
+ >
934
+ </label>
935
+ <span
936
+ class="hint"
937
+ data-i18n="settings.pdf.displayHeaderFooterHint"
938
+ >Shows header and footer on each page</span
939
+ >
940
+ </div>
941
+
942
+ <div
943
+ class="form-group"
944
+ id="pdfHeaderGroup"
945
+ style="display: none"
946
+ >
947
+ <label
948
+ for="pdfHeaderTemplate"
949
+ data-i18n="settings.pdf.headerTemplate"
950
+ >Header Template (HTML)</label
951
+ >
952
+ <textarea
953
+ id="pdfHeaderTemplate"
954
+ name="option_pdf-headerTemplate"
955
+ rows="3"
956
+ data-i18n-placeholder="settings.pdf.headerTemplatePlaceholder"
957
+ placeholder="<div style='font-size: 10px; text-align: center; width: 100%;'><span class='title'></span></div>"
958
+ ></textarea>
959
+ <span class="hint" data-i18n="settings.pdf.headerTemplateHint"
960
+ >HTML template with classes: date, title, url, pageNumber,
961
+ totalPages</span
962
+ >
963
+ </div>
964
+
965
+ <div
966
+ class="form-group"
967
+ id="pdfFooterGroup"
968
+ style="display: none"
969
+ >
970
+ <label
971
+ for="pdfFooterTemplate"
972
+ data-i18n="settings.pdf.footerTemplate"
973
+ >Footer Template (HTML)</label
974
+ >
975
+ <textarea
976
+ id="pdfFooterTemplate"
977
+ name="option_pdf-footerTemplate"
978
+ rows="3"
979
+ data-i18n-placeholder="settings.pdf.footerTemplatePlaceholder"
980
+ placeholder="<div style='font-size: 10px; text-align: center; width: 100%;'><span class='pageNumber'></span> / <span class='totalPages'></span></div>"
981
+ ></textarea>
982
+ <span class="hint" data-i18n="settings.pdf.footerTemplateHint"
983
+ >HTML template for footer</span
984
+ >
985
+ </div>
986
+
987
+ <!-- Page Ranges -->
988
+ <div class="form-group">
989
+ <label for="pdfPageRanges" data-i18n="settings.pdf.pageRanges"
990
+ >Page Ranges</label
991
+ >
992
+ <input
993
+ type="text"
994
+ id="pdfPageRanges"
995
+ name="option_pdf-pageRanges"
996
+ data-i18n-placeholder="settings.pdf.pageRangesPlaceholder"
997
+ placeholder="e.g. 1-5, 8, 11-13"
998
+ />
999
+ <span class="hint" data-i18n="settings.pdf.pageRangesHint"
1000
+ >Print only specific pages (optional)</span
1001
+ >
1002
+ </div>
1003
+
1004
+ <!-- LiaScript Specific -->
1005
+ <div class="form-group">
1006
+ <label for="pdfTheme" data-i18n="settings.pdf.theme"
1007
+ >LiaScript Theme</label
1008
+ >
1009
+ <select id="pdfTheme" name="option_pdf-theme">
1010
+ <option value="">Standard</option>
1011
+ <option
1012
+ value="default"
1013
+ data-i18n="settings.pdf.themeDefault"
1014
+ >
1015
+ Default
1016
+ </option>
1017
+ <option
1018
+ value="turquoise"
1019
+ data-i18n="settings.pdf.themeTurquoise"
1020
+ >
1021
+ Turquoise
1022
+ </option>
1023
+ <option value="blue" data-i18n="settings.pdf.themeBlue">
1024
+ Blue
1025
+ </option>
1026
+ <option value="red" data-i18n="settings.pdf.themeRed">
1027
+ Red
1028
+ </option>
1029
+ <option value="yellow" data-i18n="settings.pdf.themeYellow">
1030
+ Yellow
1031
+ </option>
1032
+ </select>
1033
+ <span class="hint" data-i18n="settings.pdf.themeHint"
1034
+ >Color scheme for PDF</span
1035
+ >
1036
+ </div>
1037
+
1038
+ <div class="form-group">
1039
+ <label for="pdfTimeout" data-i18n="settings.pdf.timeout"
1040
+ >Timeout (ms)</label
1041
+ >
1042
+ <input
1043
+ type="text"
1044
+ inputmode="numeric"
1045
+ id="pdfTimeout"
1046
+ name="option_pdf-timeout"
1047
+ placeholder="15000"
1048
+ />
1049
+ <span class="hint" data-i18n="settings.pdf.timeoutHint"
1050
+ >Wait time for complete loading (15000 = 15 seconds)</span
1051
+ >
1052
+ </div>
1053
+
1054
+ <!-- Advanced Options -->
1055
+ <div class="form-group">
1056
+ <label>
1057
+ <input
1058
+ type="checkbox"
1059
+ id="pdfPreferCSSPageSize"
1060
+ name="option_pdf-preferCSSPageSize"
1061
+ />
1062
+ <span data-i18n="settings.pdf.preferCSSPageSize"
1063
+ >Prefer CSS @page Size</span
1064
+ >
1065
+ </label>
1066
+ <span
1067
+ class="hint"
1068
+ data-i18n="settings.pdf.preferCSSPageSizeHint"
1069
+ >CSS page size takes precedence</span
1070
+ >
1071
+ </div>
1072
+
1073
+ <div class="form-group">
1074
+ <label>
1075
+ <input
1076
+ type="checkbox"
1077
+ id="pdfOmitBackground"
1078
+ name="option_pdf-omitBackground"
1079
+ />
1080
+ <span data-i18n="settings.pdf.omitBackground"
1081
+ >Transparent Background</span
1082
+ >
1083
+ </label>
1084
+ <span class="hint" data-i18n="settings.pdf.omitBackgroundHint"
1085
+ >White background is omitted</span
1086
+ >
1087
+ </div>
1088
+ </div>
1089
+
1090
+ <!-- Android Settings -->
1091
+ <div class="settings-group" data-formats="android">
1092
+ <h3 class="settings-heading" data-i18n="settings.android.title">
1093
+ Android Settings
1094
+ </h3>
1095
+
1096
+ <div class="form-group">
1097
+ <label
1098
+ for="androidAppName"
1099
+ data-i18n="settings.android.appName"
1100
+ >App Name</label
1101
+ >
1102
+ <input
1103
+ type="text"
1104
+ id="androidAppName"
1105
+ name="option_android-appName"
1106
+ data-i18n-placeholder="settings.android.appNameHint"
1107
+ placeholder="My App"
1108
+ />
1109
+ <span class="hint" data-i18n="settings.android.appNameHint"
1110
+ >Name of the Android app</span
1111
+ >
1112
+ </div>
1113
+
1114
+ <div class="form-group">
1115
+ <label for="androidAppId" data-i18n="settings.android.appId"
1116
+ >App ID *</label
1117
+ >
1118
+ <input
1119
+ type="text"
1120
+ id="androidAppId"
1121
+ name="option_android-appId"
1122
+ data-i18n-placeholder="settings.android.appIdPlaceholder"
1123
+ placeholder="io.github.liascript"
1124
+ data-required="true"
1125
+ />
1126
+ <span class="hint" data-i18n="settings.android.appIdHint"
1127
+ >Unique app identifier (e.g. io.github.liascript)</span
1128
+ >
1129
+ </div>
1130
+ </div>
1131
+
1132
+ <!-- EPUB Settings -->
1133
+ <div class="settings-group" data-formats="epub">
1134
+ <h3 class="settings-heading" data-i18n="settings.epub.title">
1135
+ EPUB Settings
1136
+ </h3>
1137
+
1138
+ <div class="form-group">
1139
+ <label for="epubAuthor" data-i18n="settings.epub.author"
1140
+ >Author</label
1141
+ >
1142
+ <input
1143
+ type="text"
1144
+ id="epubAuthor"
1145
+ name="option_epubAuthor"
1146
+ data-i18n-placeholder="settings.epub.authorPlaceholder"
1147
+ placeholder="John Doe"
1148
+ />
1149
+ <span class="hint" data-i18n="settings.epub.authorHint"
1150
+ >Author of the e-book</span
1151
+ >
1152
+ </div>
1153
+
1154
+ <div class="form-group">
1155
+ <label for="epubPublisher" data-i18n="settings.epub.publisher"
1156
+ >Publisher</label
1157
+ >
1158
+ <input
1159
+ type="text"
1160
+ id="epubPublisher"
1161
+ name="option_epubPublisher"
1162
+ data-i18n-placeholder="settings.epub.publisherHint"
1163
+ placeholder="My Publisher"
1164
+ />
1165
+ <span class="hint" data-i18n="settings.epub.publisherHint"
1166
+ >Publisher/Publisher house</span
1167
+ >
1168
+ </div>
1169
+ </div>
1170
+
1171
+ <!-- DOCX Settings -->
1172
+ <div class="settings-group" data-formats="docx">
1173
+ <h3 class="settings-heading" data-i18n="settings.docx.title">
1174
+ DOCX Settings
1175
+ </h3>
1176
+
1177
+ <div class="form-group">
1178
+ <label for="docxTitle" data-i18n="settings.docx.docTitle"
1179
+ >Document Title</label
1180
+ >
1181
+ <input
1182
+ type="text"
1183
+ id="docxTitle"
1184
+ name="option_docx-title"
1185
+ data-i18n-placeholder="settings.docx.docTitlePlaceholder"
1186
+ placeholder="My Course"
1187
+ />
1188
+ <span class="hint" data-i18n="settings.docx.docTitleHint"
1189
+ >Title of the Word document</span
1190
+ >
1191
+ </div>
1192
+
1193
+ <div class="form-group">
1194
+ <label for="docxAuthor" data-i18n="settings.docx.author"
1195
+ >Author</label
1196
+ >
1197
+ <input
1198
+ type="text"
1199
+ id="docxAuthor"
1200
+ name="option_docx-author"
1201
+ data-i18n-placeholder="settings.docx.authorPlaceholder"
1202
+ placeholder="John Doe"
1203
+ />
1204
+ <span class="hint" data-i18n="settings.docx.authorHint"
1205
+ >Author of the document</span
1206
+ >
1207
+ </div>
1208
+
1209
+ <div class="form-group">
1210
+ <label
1211
+ for="docxOrientation"
1212
+ data-i18n="settings.docx.orientation"
1213
+ >Orientation</label
1214
+ >
1215
+ <select id="docxOrientation" name="option_docx-orientation">
1216
+ <option
1217
+ value="portrait"
1218
+ selected
1219
+ data-i18n="settings.docx.orientationPortrait"
1220
+ >
1221
+ Portrait
1222
+ </option>
1223
+ <option
1224
+ value="landscape"
1225
+ data-i18n="settings.docx.orientationLandscape"
1226
+ >
1227
+ Landscape
1228
+ </option>
1229
+ </select>
1230
+ <span class="hint" data-i18n="settings.docx.orientationHint"
1231
+ >Page orientation</span
1232
+ >
1233
+ </div>
1234
+
1235
+ <div class="form-group">
1236
+ <label for="docxFont" data-i18n="settings.docx.font"
1237
+ >Font</label
1238
+ >
1239
+ <input
1240
+ type="text"
1241
+ id="docxFont"
1242
+ name="option_docx-font"
1243
+ placeholder="Arial"
1244
+ data-i18n-placeholder="settings.docx.fontPlaceholder"
1245
+ />
1246
+ <span class="hint" data-i18n="settings.docx.fontHint"
1247
+ >Font name (default: Arial)</span
1248
+ >
1249
+ </div>
1250
+
1251
+ <div class="form-group">
1252
+ <label for="docxFontSize" data-i18n="settings.docx.fontSize"
1253
+ >Font Size</label
1254
+ >
1255
+ <input
1256
+ type="number"
1257
+ id="docxFontSize"
1258
+ name="option_docx-font-size"
1259
+ placeholder="22"
1260
+ min="10"
1261
+ max="100"
1262
+ />
1263
+ <span class="hint" data-i18n="settings.docx.fontSizeHint"
1264
+ >Font size in half-points (22 = 11pt)</span
1265
+ >
1266
+ </div>
1267
+
1268
+ <div class="form-group">
1269
+ <label for="docxTheme" data-i18n="settings.docx.theme"
1270
+ >LiaScript Theme</label
1271
+ >
1272
+ <select id="docxTheme" name="option_docx-theme">
1273
+ <option
1274
+ value=""
1275
+ selected
1276
+ data-i18n="settings.docx.themeDefault"
1277
+ >
1278
+ Default
1279
+ </option>
1280
+ <option
1281
+ value="turquoise"
1282
+ data-i18n="settings.docx.themeTurquoise"
1283
+ >
1284
+ Turquoise
1285
+ </option>
1286
+ <option value="blue" data-i18n="settings.docx.themeBlue">
1287
+ Blue
1288
+ </option>
1289
+ <option value="red" data-i18n="settings.docx.themeRed">
1290
+ Red
1291
+ </option>
1292
+ <option
1293
+ value="yellow"
1294
+ data-i18n="settings.docx.themeYellow"
1295
+ >
1296
+ Yellow
1297
+ </option>
1298
+ </select>
1299
+ <span class="hint" data-i18n="settings.docx.themeHint"
1300
+ >Color scheme for the document</span
1301
+ >
1302
+ </div>
1303
+
1304
+ <div class="form-group">
1305
+ <label>
1306
+ <input
1307
+ type="checkbox"
1308
+ id="docxHeader"
1309
+ name="option_docx-header"
1310
+ />
1311
+ <span data-i18n="settings.docx.header">Enable Header</span>
1312
+ </label>
1313
+ <span class="hint" data-i18n="settings.docx.headerHint"
1314
+ >Add a header to every page</span
1315
+ >
1316
+ </div>
1317
+
1318
+ <div class="form-group">
1319
+ <label>
1320
+ <input
1321
+ type="checkbox"
1322
+ id="docxFooter"
1323
+ name="option_docx-footer"
1324
+ />
1325
+ <span data-i18n="settings.docx.footer">Enable Footer</span>
1326
+ </label>
1327
+ <span class="hint" data-i18n="settings.docx.footerHint"
1328
+ >Add a footer to every page</span
1329
+ >
1330
+ </div>
1331
+
1332
+ <div class="form-group">
1333
+ <label>
1334
+ <input
1335
+ type="checkbox"
1336
+ id="docxPageNumber"
1337
+ name="option_docx-page-number"
1338
+ />
1339
+ <span data-i18n="settings.docx.pageNumber"
1340
+ >Page Numbers</span
1341
+ >
1342
+ </label>
1343
+ <span class="hint" data-i18n="settings.docx.pageNumberHint"
1344
+ >Add page numbers to the footer</span
1345
+ >
1346
+ </div>
1347
+
1348
+ <div class="form-group">
1349
+ <label for="docxTimeout" data-i18n="settings.docx.timeout"
1350
+ >Timeout (ms)</label
1351
+ >
1352
+ <input
1353
+ type="number"
1354
+ id="docxTimeout"
1355
+ name="option_docx-timeout"
1356
+ placeholder="15000"
1357
+ min="1000"
1358
+ max="120000"
1359
+ />
1360
+ <span class="hint" data-i18n="settings.docx.timeoutHint"
1361
+ >Wait time for complete loading (15000 = 15 seconds)</span
1362
+ >
1363
+ </div>
1364
+ </div>
1365
+
1366
+ <!-- JSON Settings -->
1367
+ <div class="settings-group" data-formats="json">
1368
+ <h3 class="settings-heading" data-i18n="settings.json.title">
1369
+ JSON Settings
1370
+ </h3>
1371
+
1372
+ <div class="form-group">
1373
+ <label>
1374
+ <input
1375
+ type="checkbox"
1376
+ id="jsonFull"
1377
+ name="option_jsonFull"
1378
+ />
1379
+ <span data-i18n="settings.json.fullJSON">Full JSON</span>
1380
+ </label>
1381
+ <span class="hint" data-i18n="settings.json.fullJSONHint"
1382
+ >Exports all details</span
1383
+ >
1384
+ </div>
1385
+
1386
+ <div class="form-group">
1387
+ <label>
1388
+ <input
1389
+ type="checkbox"
1390
+ id="jsonPretty"
1391
+ name="option_jsonPretty"
1392
+ checked
1393
+ />
1394
+ <span data-i18n="settings.json.prettyPrint"
1395
+ >Formatted (Pretty Print)</span
1396
+ >
1397
+ </label>
1398
+ <span class="hint" data-i18n="settings.json.prettyPrintHint"
1399
+ >Readable formatted JSON</span
1400
+ >
1401
+ </div>
1402
+ </div>
1403
+
1404
+ <!-- RDF Settings -->
1405
+ <div class="settings-group" data-formats="rdf">
1406
+ <h3 class="settings-heading" data-i18n="settings.rdf.title">
1407
+ RDF Settings
1408
+ </h3>
1409
+
1410
+ <div class="form-group">
1411
+ <label for="rdfFormat" data-i18n="settings.rdf.outputFormat"
1412
+ >Output Format</label
1413
+ >
1414
+ <select id="rdfFormat" name="option_rdf-format">
1415
+ <option value="json-ld" selected>JSON-LD</option>
1416
+ <option value="n-quads">N-Quads</option>
1417
+ </select>
1418
+ <span class="hint" data-i18n="settings.rdf.outputFormatHint"
1419
+ >Format for RDF output (default: JSON-LD)</span
1420
+ >
1421
+ </div>
1422
+
1423
+ <div class="form-group">
1424
+ <label>
1425
+ <input
1426
+ type="checkbox"
1427
+ id="rdfPreview"
1428
+ name="option_rdf-preview"
1429
+ />
1430
+ <span data-i18n="settings.rdf.previewConsole"
1431
+ >Preview in Console</span
1432
+ >
1433
+ </label>
1434
+ <span class="hint" data-i18n="settings.rdf.previewConsoleHint"
1435
+ >Display output in console</span
1436
+ >
1437
+ </div>
1438
+
1439
+ <div class="form-group">
1440
+ <label for="rdfUrl" data-i18n="settings.rdf.externalUrl"
1441
+ >External URL</label
1442
+ >
1443
+ <input
1444
+ type="url"
1445
+ id="rdfUrl"
1446
+ name="option_rdf-url"
1447
+ placeholder="https://example.com/course"
1448
+ />
1449
+ <span class="hint" data-i18n="settings.rdf.externalUrlHint"
1450
+ >External URL for local projects (optional)</span
1451
+ >
1452
+ </div>
1453
+
1454
+ <div class="form-group">
1455
+ <label for="rdfType" data-i18n="settings.rdf.schemaType"
1456
+ >Schema.org Type</label
1457
+ >
1458
+ <input
1459
+ type="text"
1460
+ id="rdfType"
1461
+ name="option_rdf-type"
1462
+ placeholder="Course"
1463
+ />
1464
+ <span class="hint" data-i18n="settings.rdf.schemaTypeHint"
1465
+ >Schema.org type (default: Course, e.g.
1466
+ EducationalResource)</span
1467
+ >
1468
+ </div>
1469
+
1470
+ <div class="form-group">
1471
+ <label for="rdfTemplate" data-i18n="settings.rdf.templateUrl"
1472
+ >Template URL/File</label
1473
+ >
1474
+ <input
1475
+ type="text"
1476
+ id="rdfTemplate"
1477
+ name="option_rdf-template"
1478
+ placeholder="template.json"
1479
+ />
1480
+ <span class="hint" data-i18n="settings.rdf.templateUrlHint"
1481
+ >URL or JSON file as template (optional)</span
1482
+ >
1483
+ </div>
1484
+
1485
+ <div class="form-group">
1486
+ <label for="rdfLicense" data-i18n="settings.rdf.licenseUrl"
1487
+ >License URL</label
1488
+ >
1489
+ <input
1490
+ type="url"
1491
+ id="rdfLicense"
1492
+ name="option_rdf-license"
1493
+ placeholder="https://creativecommons.org/licenses/by/4.0/"
1494
+ />
1495
+ <span class="hint" data-i18n="settings.rdf.licenseUrlHint"
1496
+ >URL to course license (optional)</span
1497
+ >
1498
+ </div>
1499
+
1500
+ <div class="form-group">
1501
+ <label
1502
+ for="rdfEducationalLevel"
1503
+ data-i18n="settings.rdf.educationalLevel"
1504
+ >Educational Level</label
1505
+ >
1506
+ <input
1507
+ type="text"
1508
+ id="rdfEducationalLevel"
1509
+ name="option_rdf-educationalLevel"
1510
+ placeholder="beginner, intermediate, advanced"
1511
+ />
1512
+ <span
1513
+ class="hint"
1514
+ data-i18n="settings.rdf.educationalLevelHint"
1515
+ >Educational level (e.g. beginner, intermediate,
1516
+ advanced)</span
1517
+ >
1518
+ </div>
1519
+ </div>
1520
+
1521
+ <!-- No settings message -->
1522
+ <div class="settings-group no-settings" style="display: none">
1523
+ <p class="hint" data-i18n="settings.noSettings">
1524
+ No additional settings available for this format.
1525
+ </p>
1526
+ </div>
1527
+ </div>
1528
+ </section>
1529
+
1530
+ <!-- Submit Section -->
1531
+ <section class="card submit-section">
1532
+ <button type="submit" id="submitBtn" class="btn-primary">
1533
+ <svg
1534
+ width="20"
1535
+ height="20"
1536
+ viewBox="0 0 24 24"
1537
+ fill="none"
1538
+ stroke="currentColor"
1539
+ stroke-width="2"
1540
+ >
1541
+ <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path>
1542
+ <polyline points="7 10 12 15 17 10"></polyline>
1543
+ <line x1="12" y1="15" x2="12" y2="3"></line>
1544
+ </svg>
1545
+ <span data-i18n="submit.button">Start Export</span>
1546
+ </button>
1547
+ <p class="info-text" data-i18n-html="submit.info">
1548
+ Export jobs are queued.<br />Only one export is processed at a
1549
+ time.
1550
+ </p>
1551
+ </section>
1552
+ </form>
1553
+
1554
+ <!-- Confirmation Modal -->
1555
+ <div id="confirmationModal" class="modal hidden">
1556
+ <div class="modal-content">
1557
+ <h2 data-i18n="modal.title">Export Started</h2>
1558
+ <div id="confirmationDetails"></div>
1559
+ <div class="modal-actions">
1560
+ <a
1561
+ id="statusLink"
1562
+ href="#"
1563
+ class="btn-primary"
1564
+ data-i18n="modal.statusLink"
1565
+ >Go to Status Page</a
1566
+ >
1567
+ <button
1568
+ type="button"
1569
+ id="closeModal"
1570
+ class="btn-secondary"
1571
+ data-i18n="modal.close"
1572
+ >
1573
+ Close
1574
+ </button>
1575
+ </div>
1576
+ </div>
1577
+ </div>
1578
+ </main>
1579
+
1580
+ <footer>
1581
+ <p data-i18n="footer.copyright">&copy; 2026 LiaScript Exporter</p>
1582
+ </footer>
1583
+ </div>
1584
+
1585
+ <script src="/app.js"></script>
1586
+ </body>
1587
+ </html>