@numerum-tech/yeriasdk 1.0.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 (94) hide show
  1. package/README.md +864 -0
  2. package/dist/core/action-grid-view.d.ts +57 -0
  3. package/dist/core/action-grid-view.d.ts.map +1 -0
  4. package/dist/core/action-grid-view.js +112 -0
  5. package/dist/core/action-grid-view.js.map +1 -0
  6. package/dist/core/action-list-view.d.ts +39 -0
  7. package/dist/core/action-list-view.d.ts.map +1 -0
  8. package/dist/core/action-list-view.js +77 -0
  9. package/dist/core/action-list-view.js.map +1 -0
  10. package/dist/core/base/base-action-view.d.ts +82 -0
  11. package/dist/core/base/base-action-view.d.ts.map +1 -0
  12. package/dist/core/base/base-action-view.js +143 -0
  13. package/dist/core/base/base-action-view.js.map +1 -0
  14. package/dist/core/base-view.d.ts +105 -0
  15. package/dist/core/base-view.d.ts.map +1 -0
  16. package/dist/core/base-view.js +426 -0
  17. package/dist/core/base-view.js.map +1 -0
  18. package/dist/core/card-view.d.ts +24 -0
  19. package/dist/core/card-view.d.ts.map +1 -0
  20. package/dist/core/card-view.js +127 -0
  21. package/dist/core/card-view.js.map +1 -0
  22. package/dist/core/carousel-view.d.ts +22 -0
  23. package/dist/core/carousel-view.d.ts.map +1 -0
  24. package/dist/core/carousel-view.js +99 -0
  25. package/dist/core/carousel-view.js.map +1 -0
  26. package/dist/core/form-view.d.ts +165 -0
  27. package/dist/core/form-view.d.ts.map +1 -0
  28. package/dist/core/form-view.js +365 -0
  29. package/dist/core/form-view.js.map +1 -0
  30. package/dist/core/jsonapp.d.ts +263 -0
  31. package/dist/core/jsonapp.d.ts.map +1 -0
  32. package/dist/core/jsonapp.js +528 -0
  33. package/dist/core/jsonapp.js.map +1 -0
  34. package/dist/core/key-store.d.ts +51 -0
  35. package/dist/core/key-store.d.ts.map +1 -0
  36. package/dist/core/key-store.js +138 -0
  37. package/dist/core/key-store.js.map +1 -0
  38. package/dist/core/map-view.d.ts +45 -0
  39. package/dist/core/map-view.d.ts.map +1 -0
  40. package/dist/core/map-view.js +318 -0
  41. package/dist/core/map-view.js.map +1 -0
  42. package/dist/core/media-view.d.ts +20 -0
  43. package/dist/core/media-view.d.ts.map +1 -0
  44. package/dist/core/media-view.js +75 -0
  45. package/dist/core/media-view.js.map +1 -0
  46. package/dist/core/message-view.d.ts +53 -0
  47. package/dist/core/message-view.d.ts.map +1 -0
  48. package/dist/core/message-view.js +109 -0
  49. package/dist/core/message-view.js.map +1 -0
  50. package/dist/core/notification.d.ts +17 -0
  51. package/dist/core/notification.d.ts.map +1 -0
  52. package/dist/core/notification.js +33 -0
  53. package/dist/core/notification.js.map +1 -0
  54. package/dist/core/qr-display-view.d.ts +32 -0
  55. package/dist/core/qr-display-view.d.ts.map +1 -0
  56. package/dist/core/qr-display-view.js +66 -0
  57. package/dist/core/qr-display-view.js.map +1 -0
  58. package/dist/core/qr-scan-view.d.ts +148 -0
  59. package/dist/core/qr-scan-view.d.ts.map +1 -0
  60. package/dist/core/qr-scan-view.js +259 -0
  61. package/dist/core/qr-scan-view.js.map +1 -0
  62. package/dist/core/reader-view.d.ts +73 -0
  63. package/dist/core/reader-view.d.ts.map +1 -0
  64. package/dist/core/reader-view.js +285 -0
  65. package/dist/core/reader-view.js.map +1 -0
  66. package/dist/core/timeline-view.d.ts +16 -0
  67. package/dist/core/timeline-view.d.ts.map +1 -0
  68. package/dist/core/timeline-view.js +68 -0
  69. package/dist/core/timeline-view.js.map +1 -0
  70. package/dist/errors/index.d.ts +276 -0
  71. package/dist/errors/index.d.ts.map +1 -0
  72. package/dist/errors/index.js +431 -0
  73. package/dist/errors/index.js.map +1 -0
  74. package/dist/index.d.ts +26 -0
  75. package/dist/index.d.ts.map +1 -0
  76. package/dist/index.js +103 -0
  77. package/dist/index.js.map +1 -0
  78. package/dist/types/index.d.ts +576 -0
  79. package/dist/types/index.d.ts.map +1 -0
  80. package/dist/types/index.js +48 -0
  81. package/dist/types/index.js.map +1 -0
  82. package/dist/utils/fileFormats.d.ts +52 -0
  83. package/dist/utils/fileFormats.d.ts.map +1 -0
  84. package/dist/utils/fileFormats.js +198 -0
  85. package/dist/utils/fileFormats.js.map +1 -0
  86. package/dist/utils/logger.d.ts +38 -0
  87. package/dist/utils/logger.d.ts.map +1 -0
  88. package/dist/utils/logger.js +109 -0
  89. package/dist/utils/logger.js.map +1 -0
  90. package/dist/utils/validators.d.ts +48 -0
  91. package/dist/utils/validators.d.ts.map +1 -0
  92. package/dist/utils/validators.js +445 -0
  93. package/dist/utils/validators.js.map +1 -0
  94. package/package.json +65 -0
@@ -0,0 +1,259 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.QRScanView = void 0;
4
+ const base_view_1 = require("./base-view");
5
+ const errors_1 = require("../errors");
6
+ /**
7
+ * QRScanView - A view for scanning QR codes
8
+ *
9
+ * **Design Principles:**
10
+ * - Mobile app handles ALL scanner implementation (camera, torch, focus, formats, UI)
11
+ * - View only describes what to scan and where to submit
12
+ * - Convention: Field name is ALWAYS "qrData" (not configurable)
13
+ * - Auto-submit by default: scan → immediately POST { qrData: "ABC123" }
14
+ * - Submit button disables auto-submit for manual confirmation workflows
15
+ *
16
+ * **Submission Convention:**
17
+ * - Auto-submit: POST {service.baseUrl}/{viewId} with { qrData: "scanned-value" }
18
+ * - With button: User scans, previews, clicks button to submit
19
+ *
20
+ * @example
21
+ * // Simple: Auto-submit after scan
22
+ * const view = new QRScanView('scan-ticket', 'Scan Your Ticket')
23
+ * .setIntro('Point camera at the QR code on your ticket');
24
+ * // → Scans, immediately POSTs { qrData: "ABC123" } to {baseUrl}/scan-ticket
25
+ *
26
+ * @example
27
+ * // Manual confirmation workflow
28
+ * const view = new QRScanView('verify-product', 'Verify Product')
29
+ * .setIntro('Scan the product barcode')
30
+ * .enablePreview(true, 'Product Code')
31
+ * .submitButton('Verify Product');
32
+ * // → Scans, shows preview, user clicks "Verify Product" to submit
33
+ *
34
+ * @example
35
+ * // With validation
36
+ * const view = new QRScanView('scan-invoice', 'Scan Invoice')
37
+ * .setIntro('Scan the invoice QR code')
38
+ * .setValidation(/^INV-\d{6}$/, 'Invalid invoice format')
39
+ * .submitButton('Process Invoice');
40
+ * // → Scans, validates pattern, shows preview, submits on button click
41
+ */
42
+ class QRScanView extends base_view_1.BaseView {
43
+ constructor(viewId, title, processId) {
44
+ super({
45
+ id: viewId,
46
+ type: 'QRScan',
47
+ processId,
48
+ metadata: {
49
+ version: '2.0.0',
50
+ createdAt: new Date()
51
+ }
52
+ });
53
+ this.content = {
54
+ title,
55
+ intro: '',
56
+ autoSubmit: true // Auto-submit by default
57
+ };
58
+ }
59
+ /**
60
+ * Sets instructional text shown to the user
61
+ *
62
+ * @param intro - Instructions like "Point your camera at the QR code"
63
+ * @returns this for chaining
64
+ *
65
+ * @example
66
+ * view.setIntro('Scan the code on your membership card');
67
+ */
68
+ setIntro(intro) {
69
+ return this.setIntroText('intro', intro);
70
+ }
71
+ /**
72
+ * Configures a submit button for manual confirmation
73
+ * **IMPORTANT**: Automatically disables auto-submit when button is added
74
+ * **Note**: QRScan submissions are always POST (convention-based security)
75
+ *
76
+ * @param text - Button text like "Confirm", "Process", "Submit"
77
+ * @param confirmMessage - Optional confirmation dialog
78
+ * @returns this for chaining
79
+ *
80
+ * @example
81
+ * view.submitButton('Verify Code');
82
+ * // User must click button after scanning
83
+ *
84
+ * @example
85
+ * view.submitButton('Process', 'Are you sure?');
86
+ */
87
+ submitButton(text, confirmMessage) {
88
+ if (!text || text.trim().length === 0) {
89
+ throw new errors_1.InvalidParameterError('text', text, 'Button text cannot be empty');
90
+ }
91
+ this.content.submit = {
92
+ text: text.trim(),
93
+ method: 'POST',
94
+ confirmMessage
95
+ };
96
+ // Disable auto-submit when button is present
97
+ this.content.autoSubmit = false;
98
+ return this;
99
+ }
100
+ /**
101
+ * Sets simple validation rules for scanned data
102
+ * **IMPORTANT**: Mobile app validates client-side for UX, but server MUST re-validate for security
103
+ *
104
+ * @param errorMessage - Error message shown on validation failure
105
+ * @param format - Data format: 'text' (any), 'number' (digits only), 'url' (http/https), 'email' (has @ and .)
106
+ * @param minLength - Minimum length (includes prefix if startsWith is set)
107
+ * @param maxLength - Maximum length (includes prefix if startsWith is set)
108
+ * @param startsWith - Required prefix (exempt from format validation)
109
+ * @returns this for chaining
110
+ *
111
+ * @example
112
+ * // Numeric code with exact length
113
+ * view.setValidation('Code must be 6 digits', 'number', 6, 6);
114
+ * // Accepts: "123456", "000001"
115
+ *
116
+ * @example
117
+ * // Prefix + format + length range
118
+ * view.setValidation('Invalid invoice', 'number', 10, 15, 'INV-');
119
+ * // Accepts: "INV-123456" (10-15 chars total, digits after INV-)
120
+ *
121
+ * @example
122
+ * // Email format
123
+ * view.setValidation('Invalid email format', 'email');
124
+ * // Accepts: "user@example.com" (simple check: has @ and .)
125
+ *
126
+ * @example
127
+ * // URL format
128
+ * view.setValidation('Invalid URL', 'url');
129
+ * // Accepts: "https://example.com" (starts with http:// or https://)
130
+ *
131
+ * @example
132
+ * // Just prefix, any content after
133
+ * view.setValidation('Must start with TICKET-', undefined, undefined, undefined, 'TICKET-');
134
+ * // Accepts: "TICKET-ABC123", "TICKET-XYZ"
135
+ *
136
+ * @example
137
+ * // Length range without format
138
+ * view.setValidation('Code must be 8-20 characters', undefined, 8, 20);
139
+ */
140
+ setValidation(errorMessage, format, minLength, maxLength, startsWith) {
141
+ if (!errorMessage || errorMessage.trim().length === 0) {
142
+ throw new errors_1.InvalidParameterError('errorMessage', errorMessage, 'Error message is required for validation');
143
+ }
144
+ const validation = {
145
+ errorMessage: errorMessage.trim()
146
+ };
147
+ // Validate and set format
148
+ if (format !== undefined) {
149
+ const validFormats = ['text', 'number', 'url', 'email'];
150
+ if (!validFormats.includes(format)) {
151
+ throw new errors_1.InvalidParameterError('format', format, `Format must be one of: ${validFormats.join(', ')}`);
152
+ }
153
+ validation.format = format;
154
+ }
155
+ // Validate and set startsWith prefix
156
+ if (startsWith !== undefined && startsWith !== null) {
157
+ const trimmed = startsWith.trim();
158
+ if (trimmed.length === 0) {
159
+ throw new errors_1.InvalidParameterError('startsWith', startsWith, 'startsWith cannot be empty');
160
+ }
161
+ validation.startsWith = trimmed;
162
+ }
163
+ // Validate and set minLength
164
+ if (minLength !== undefined) {
165
+ if (minLength < 0) {
166
+ throw new errors_1.InvalidParameterError('minLength', minLength, 'minLength must be >= 0');
167
+ }
168
+ validation.minLength = minLength;
169
+ }
170
+ // Validate and set maxLength
171
+ if (maxLength !== undefined) {
172
+ if (maxLength < 1) {
173
+ throw new errors_1.InvalidParameterError('maxLength', maxLength, 'maxLength must be >= 1');
174
+ }
175
+ if (minLength !== undefined && maxLength < minLength) {
176
+ throw new errors_1.InvalidParameterError('maxLength', maxLength, 'maxLength must be >= minLength');
177
+ }
178
+ validation.maxLength = maxLength;
179
+ }
180
+ this.content.validation = validation;
181
+ return this;
182
+ }
183
+ /**
184
+ * Enables preview mode where scanned value is shown before submission
185
+ * **Note**: Requires submit button to be set
186
+ *
187
+ * @param editable - Allow user to manually edit the scanned value
188
+ * @param label - Field label in preview (default: "Scanned Code")
189
+ * @returns this for chaining
190
+ *
191
+ * @example
192
+ * view.enablePreview(true, 'Barcode')
193
+ * .submitButton('Confirm');
194
+ */
195
+ enablePreview(editable = false, label) {
196
+ this.content.preview = {
197
+ enabled: true,
198
+ editable,
199
+ label: label?.trim() || 'Scanned Code'
200
+ };
201
+ return this;
202
+ }
203
+ /**
204
+ * Disables preview mode
205
+ * @returns this for chaining
206
+ */
207
+ disablePreview() {
208
+ this.content.preview = undefined;
209
+ return this;
210
+ }
211
+ /**
212
+ * Explicitly enables or disables auto-submit
213
+ * **Note**: Auto-submit is automatically disabled when submitButton() is called
214
+ *
215
+ * @param enabled - Enable auto-submit (default: true)
216
+ * @returns this for chaining
217
+ *
218
+ * @example
219
+ * // Explicit auto-submit
220
+ * view.setAutoSubmit(true); // Scan → immediate POST
221
+ *
222
+ * @example
223
+ * // Disable auto-submit without button (rare case)
224
+ * view.setAutoSubmit(false);
225
+ */
226
+ setAutoSubmit(enabled = true) {
227
+ this.content.autoSubmit = enabled;
228
+ return this;
229
+ }
230
+ // ============================================
231
+ // Getters
232
+ // ============================================
233
+ /**
234
+ * Validates the view configuration before serving
235
+ * @internal
236
+ */
237
+ validate() {
238
+ const baseResult = super.validate();
239
+ const content = this.content;
240
+ const errors = [...baseResult.errors];
241
+ // Preview requires submit button
242
+ if (content.preview?.enabled && !content.submit) {
243
+ errors.push({ message: 'Preview mode requires a submit button' });
244
+ }
245
+ // If preview is editable, submit button is required
246
+ if (content.preview?.editable && !content.submit) {
247
+ errors.push({ message: 'Editable preview requires a submit button' });
248
+ }
249
+ // Validation without submit button is allowed (auto-submit with validation)
250
+ // But it's recommended to have a button for better UX
251
+ return {
252
+ isValid: errors.length === 0,
253
+ errors,
254
+ warnings: baseResult.warnings
255
+ };
256
+ }
257
+ }
258
+ exports.QRScanView = QRScanView;
259
+ //# sourceMappingURL=qr-scan-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qr-scan-view.js","sourceRoot":"","sources":["../../src/core/qr-scan-view.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ import { BaseView } from './base-view';
2
+ import { ReaderElement } from '../types';
3
+ export interface ReaderContent {
4
+ title: string;
5
+ intro: string;
6
+ elements: ReaderElement[];
7
+ }
8
+ export declare class ReaderView extends BaseView {
9
+ constructor(viewId: string, title: string, processId?: string);
10
+ /**
11
+ * Définit l'introduction
12
+ */
13
+ setIntro(intro: string): this;
14
+ /**
15
+ * Ajoute un paragraphe
16
+ */
17
+ addParagraph(text: string): this;
18
+ /**
19
+ * Ajoute une image
20
+ */
21
+ addImage(url: string, alt?: string, caption?: string): this;
22
+ /**
23
+ * Ajoute un sous-titre
24
+ */
25
+ addSubTitle(text: string): this;
26
+ /**
27
+ * Ajoute du contenu Markdown
28
+ */
29
+ addMarkdown(markdownText: string, options?: {
30
+ sanitize?: boolean;
31
+ }): this;
32
+ /**
33
+ * Ajoute une liste
34
+ */
35
+ addListField(items: string[], ordered?: boolean): this;
36
+ /**
37
+ * Ajoute un lien
38
+ */
39
+ addLink(url: string, text: string, description?: string): this;
40
+ /**
41
+ * Ajoute un tableau
42
+ */
43
+ addTable(headers: string[], rows: string[][]): this;
44
+ /**
45
+ * Ajoute un bloc de code
46
+ */
47
+ addCodeBlock(code: string, language?: string): this;
48
+ /**
49
+ * Ajoute une citation
50
+ */
51
+ addQuote(text: string, author?: string, source?: string): this;
52
+ /**
53
+ * Ajoute un séparateur
54
+ */
55
+ addSeparator(): this;
56
+ /**
57
+ * Ajoute un élément personnalisé
58
+ */
59
+ addCustomElement(type: string, data: Record<string, unknown>): this;
60
+ /**
61
+ * Obtient les éléments par type
62
+ */
63
+ getElementsByType(type: ReaderElement['type']): ReaderElement[];
64
+ /**
65
+ * Supprime un élément par index
66
+ */
67
+ removeElement(index: number): boolean;
68
+ /**
69
+ * Insère un élément à un index spécifique
70
+ */
71
+ insertElement(index: number, element: ReaderElement): boolean;
72
+ }
73
+ //# sourceMappingURL=reader-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reader-view.d.ts","sourceRoot":"","sources":["../../src/core/reader-view.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,aAAa,EAAgB,MAAM,UAAU,CAAC;AAKvD,MAAM,WAAW,aAAa;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC7B;AAgCD,qBAAa,UAAW,SAAQ,QAAQ;gBACxB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;IAkB7D;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI7B;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAahC;;OAEG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAuB3D;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAa/B;;OAEG;IACH,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,IAAI;IAsC7E;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,OAAe,GAAG,IAAI;IAgB7D;;OAEG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;IA0B9D;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,IAAI;IAenD;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAcnD;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAkB9D;;OAEG;IACH,YAAY,IAAI,IAAI;IAOpB;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAcnE;;OAEG;IACH,iBAAiB,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,aAAa,EAAE;IAI/D;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IASrC;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO;CAQhE"}
@@ -0,0 +1,285 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ReaderView = void 0;
7
+ const base_view_1 = require("./base-view");
8
+ const marked_1 = require("marked");
9
+ const errors_1 = require("../errors");
10
+ const sanitize_html_1 = __importDefault(require("sanitize-html"));
11
+ /**
12
+ * Sanitizes HTML using sanitize-html to prevent XSS attacks
13
+ * More secure than regex-based sanitization with comprehensive protection
14
+ */
15
+ const sanitizeHtml = (html) => {
16
+ return (0, sanitize_html_1.default)(html, {
17
+ allowedTags: [
18
+ 'p', 'br', 'strong', 'em', 'u', 'i', 'b',
19
+ 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
20
+ 'ul', 'ol', 'li',
21
+ 'a', 'blockquote', 'code', 'pre',
22
+ 'table', 'thead', 'tbody', 'tr', 'th', 'td',
23
+ 'hr', 'div', 'span'
24
+ ],
25
+ allowedAttributes: {
26
+ 'a': ['href', 'title'],
27
+ '*': ['class', 'id']
28
+ },
29
+ allowedSchemes: ['http', 'https', 'mailto'],
30
+ allowedSchemesByTag: {
31
+ 'a': ['http', 'https', 'mailto']
32
+ },
33
+ // Disallow data attributes to prevent data: URL attacks
34
+ allowedClasses: {},
35
+ disallowedTagsMode: 'discard',
36
+ // Enforce strict filtering
37
+ enforceHtmlBoundary: true
38
+ });
39
+ };
40
+ class ReaderView extends base_view_1.BaseView {
41
+ constructor(viewId, title, processId) {
42
+ super({
43
+ id: viewId,
44
+ type: 'Reader',
45
+ processId,
46
+ metadata: {
47
+ version: '1.0.0',
48
+ createdAt: new Date()
49
+ }
50
+ });
51
+ this.content = {
52
+ title: title,
53
+ intro: '',
54
+ elements: []
55
+ };
56
+ }
57
+ /**
58
+ * Définit l'introduction
59
+ */
60
+ setIntro(intro) {
61
+ return this.setIntroText('intro', intro);
62
+ }
63
+ /**
64
+ * Ajoute un paragraphe
65
+ */
66
+ addParagraph(text) {
67
+ const trimmed = text.trim();
68
+ if (trimmed.length === 0) {
69
+ throw new errors_1.InvalidParameterError('text', text, 'Paragraph text cannot be empty');
70
+ }
71
+ this.content.elements.push({
72
+ type: 'paragraph',
73
+ text: trimmed
74
+ });
75
+ return this;
76
+ }
77
+ /**
78
+ * Ajoute une image
79
+ */
80
+ addImage(url, alt, caption) {
81
+ const trimmedUrl = url.trim();
82
+ if (trimmedUrl.length === 0) {
83
+ throw new errors_1.InvalidParameterError('url', url, 'Image URL cannot be empty');
84
+ }
85
+ const imageElement = {
86
+ type: 'image',
87
+ url: trimmedUrl
88
+ };
89
+ if (alt) {
90
+ imageElement.alt = alt;
91
+ }
92
+ if (caption) {
93
+ imageElement.caption = caption;
94
+ }
95
+ this.content.elements.push(imageElement);
96
+ return this;
97
+ }
98
+ /**
99
+ * Ajoute un sous-titre
100
+ */
101
+ addSubTitle(text) {
102
+ const trimmed = text.trim();
103
+ if (trimmed.length === 0) {
104
+ throw new errors_1.InvalidParameterError('text', text, 'Subtitle text cannot be empty');
105
+ }
106
+ this.content.elements.push({
107
+ type: 'subtitle',
108
+ text: trimmed
109
+ });
110
+ return this;
111
+ }
112
+ /**
113
+ * Ajoute du contenu Markdown
114
+ */
115
+ addMarkdown(markdownText, options = {}) {
116
+ const { sanitize = true } = options;
117
+ try {
118
+ const parsed = marked_1.marked.parse(markdownText);
119
+ const htmlContent = typeof parsed === 'string' ? parsed : parsed.toString();
120
+ const page = {
121
+ content: sanitize ? sanitizeHtml(htmlContent) : htmlContent,
122
+ raw: markdownText,
123
+ sanitized: sanitize
124
+ };
125
+ const elements = this.content.elements;
126
+ const existingMarkdown = elements.find((element) => element.type === 'markdown');
127
+ if (!existingMarkdown) {
128
+ elements.push({
129
+ type: 'markdown',
130
+ pages: [page]
131
+ });
132
+ }
133
+ else {
134
+ if (!existingMarkdown.pages) {
135
+ existingMarkdown.pages = [];
136
+ }
137
+ existingMarkdown.pages.push(page);
138
+ }
139
+ }
140
+ catch (error) {
141
+ const err = error instanceof Error ? error : new Error('Unknown error');
142
+ throw new errors_1.MarkdownParseError(this.id, err);
143
+ }
144
+ return this;
145
+ }
146
+ /**
147
+ * Ajoute une liste
148
+ */
149
+ addListField(items, ordered = false) {
150
+ if (!Array.isArray(items)) {
151
+ throw new errors_1.InvalidParameterError('items', items, 'List items must be an array');
152
+ }
153
+ const trimmedItems = items.map(item => item.trim());
154
+ const listElement = {
155
+ type: 'list',
156
+ items: trimmedItems,
157
+ ordered
158
+ };
159
+ this.content.elements.push(listElement);
160
+ return this;
161
+ }
162
+ /**
163
+ * Ajoute un lien
164
+ */
165
+ addLink(url, text, description) {
166
+ const trimmedUrl = url.trim();
167
+ const trimmedText = text.trim();
168
+ if (trimmedUrl.length === 0) {
169
+ throw new errors_1.InvalidParameterError('url', url, 'Link URL cannot be empty');
170
+ }
171
+ if (trimmedText.length === 0) {
172
+ throw new errors_1.InvalidParameterError('text', text, 'Link text cannot be empty');
173
+ }
174
+ const linkElement = {
175
+ type: 'link',
176
+ url: trimmedUrl,
177
+ text: trimmedText
178
+ };
179
+ if (description) {
180
+ linkElement.description = description;
181
+ }
182
+ this.content.elements.push(linkElement);
183
+ return this;
184
+ }
185
+ /**
186
+ * Ajoute un tableau
187
+ */
188
+ addTable(headers, rows) {
189
+ if (!Array.isArray(headers) || !Array.isArray(rows)) {
190
+ throw new errors_1.InvalidParameterError('table data', { headers, rows }, 'Headers and rows must be arrays');
191
+ }
192
+ const tableElement = {
193
+ type: 'table',
194
+ headers,
195
+ rows
196
+ };
197
+ this.content.elements.push(tableElement);
198
+ return this;
199
+ }
200
+ /**
201
+ * Ajoute un bloc de code
202
+ */
203
+ addCodeBlock(code, language) {
204
+ const codeElement = {
205
+ type: 'code',
206
+ code
207
+ };
208
+ if (language) {
209
+ codeElement.language = language;
210
+ }
211
+ this.content.elements.push(codeElement);
212
+ return this;
213
+ }
214
+ /**
215
+ * Ajoute une citation
216
+ */
217
+ addQuote(text, author, source) {
218
+ const quoteElement = {
219
+ type: 'quote',
220
+ text
221
+ };
222
+ if (author) {
223
+ quoteElement.author = author;
224
+ }
225
+ if (source) {
226
+ quoteElement.source = source;
227
+ }
228
+ this.content.elements.push(quoteElement);
229
+ return this;
230
+ }
231
+ /**
232
+ * Ajoute un séparateur
233
+ */
234
+ addSeparator() {
235
+ this.content.elements.push({
236
+ type: 'separator'
237
+ });
238
+ return this;
239
+ }
240
+ /**
241
+ * Ajoute un élément personnalisé
242
+ */
243
+ addCustomElement(type, data) {
244
+ const trimmedType = type.trim();
245
+ if (trimmedType.length === 0) {
246
+ throw new errors_1.InvalidParameterError('type', type, 'Custom element type cannot be empty');
247
+ }
248
+ this.content.elements.push({
249
+ type: 'custom',
250
+ kind: trimmedType,
251
+ data: { ...data }
252
+ });
253
+ return this;
254
+ }
255
+ /**
256
+ * Obtient les éléments par type
257
+ */
258
+ getElementsByType(type) {
259
+ return this.content.elements.filter(element => element.type === type);
260
+ }
261
+ /**
262
+ * Supprime un élément par index
263
+ */
264
+ removeElement(index) {
265
+ const elements = this.content.elements;
266
+ if (index >= 0 && index < elements.length) {
267
+ elements.splice(index, 1);
268
+ return true;
269
+ }
270
+ return false;
271
+ }
272
+ /**
273
+ * Insère un élément à un index spécifique
274
+ */
275
+ insertElement(index, element) {
276
+ const elements = this.content.elements;
277
+ if (index >= 0 && index <= elements.length) {
278
+ elements.splice(index, 0, element);
279
+ return true;
280
+ }
281
+ return false;
282
+ }
283
+ }
284
+ exports.ReaderView = ReaderView;
285
+ //# sourceMappingURL=reader-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reader-view.js","sourceRoot":"","sources":["../../src/core/reader-view.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { BaseView } from './base-view';
2
+ import { TimelineContent, TimelineItem, TimelineStatus } from '../types';
3
+ export declare class TimelineView extends BaseView {
4
+ constructor(viewId: string, title: string, processId?: string);
5
+ setIntro(intro: string): this;
6
+ addItem(item: TimelineItem): this;
7
+ addEvent(id: string, title: string, timestamp: string, options?: {
8
+ description?: string;
9
+ status?: TimelineStatus;
10
+ icon?: string;
11
+ }): this;
12
+ setItems(items: TimelineItem[]): this;
13
+ clearItems(): this;
14
+ getContent(): TimelineContent;
15
+ }
16
+ //# sourceMappingURL=timeline-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline-view.d.ts","sourceRoot":"","sources":["../../src/core/timeline-view.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAKzE,qBAAa,YAAa,SAAQ,QAAQ;gBAC1B,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;IAmB7D,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK7B,OAAO,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAgBjC,QAAQ,CACJ,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,cAAc,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAO,GAC/E,IAAI;IAYP,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,IAAI;IAMrC,UAAU,IAAI,IAAI;IAMlB,UAAU,IAAI,eAAe;CAGhC"}