@innovastudio/contentbuilder 1.5.211 → 1.5.213

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 (92) hide show
  1. package/index.d.ts +232 -3
  2. package/package.json +9 -10
  3. package/public/contentbuilder/contentbuilder.css +11169 -6865
  4. package/public/contentbuilder/contentbuilder.esm.js +42164 -50757
  5. package/public/contentbuilder/contentbuilder.min.js +10 -107
  6. package/public/contentbuilder/lang/en.js +237 -6
  7. package/public/contentbuilder/lang/fr.js +245 -14
  8. package/public/contentbuilder/themes/colored-blue.css +57 -1324
  9. package/public/contentbuilder/themes/colored-blue2.css +57 -1324
  10. package/public/contentbuilder/themes/colored-blue3.css +57 -1324
  11. package/public/contentbuilder/themes/colored-blue4.css +57 -1324
  12. package/public/contentbuilder/themes/colored-blue5.css +57 -1324
  13. package/public/contentbuilder/themes/colored-blue6.css +57 -1324
  14. package/public/contentbuilder/themes/colored-blue7.css +57 -1324
  15. package/public/contentbuilder/themes/colored-blue8.css +57 -1324
  16. package/public/contentbuilder/themes/colored-cyan.css +58 -0
  17. package/public/contentbuilder/themes/colored-dark.css +57 -1295
  18. package/public/contentbuilder/themes/colored-darkblue.css +57 -1324
  19. package/public/contentbuilder/themes/colored-gray.css +57 -1324
  20. package/public/contentbuilder/themes/colored-green.css +57 -1324
  21. package/public/contentbuilder/themes/colored-green2.css +57 -1324
  22. package/public/contentbuilder/themes/colored-green3.css +57 -1324
  23. package/public/contentbuilder/themes/colored-green4.css +57 -1324
  24. package/public/contentbuilder/themes/colored-green5.css +57 -1324
  25. package/public/contentbuilder/themes/colored-magenta.css +57 -1324
  26. package/public/contentbuilder/themes/colored-orange.css +57 -1324
  27. package/public/contentbuilder/themes/colored-orange2.css +57 -1324
  28. package/public/contentbuilder/themes/colored-orange3.css +57 -1324
  29. package/public/contentbuilder/themes/colored-pink.css +57 -1324
  30. package/public/contentbuilder/themes/colored-pink2.css +57 -1324
  31. package/public/contentbuilder/themes/colored-pink3.css +57 -1324
  32. package/public/contentbuilder/themes/colored-pink4.css +57 -1324
  33. package/public/contentbuilder/themes/colored-purple.css +57 -1324
  34. package/public/contentbuilder/themes/colored-purple2.css +57 -1324
  35. package/public/contentbuilder/themes/colored-red.css +57 -1324
  36. package/public/contentbuilder/themes/colored-red2.css +57 -1324
  37. package/public/contentbuilder/themes/colored-red3.css +57 -1324
  38. package/public/contentbuilder/themes/colored-red4.css +57 -1324
  39. package/public/contentbuilder/themes/colored-red5.css +57 -1324
  40. package/public/contentbuilder/themes/colored-yellow.css +57 -1324
  41. package/public/contentbuilder/themes/colored-yellow2.css +57 -1324
  42. package/public/contentbuilder/themes/colored-yellow3.css +58 -0
  43. package/public/contentbuilder/themes/dark-blue.css +26 -1371
  44. package/public/contentbuilder/themes/dark-blue2.css +26 -1371
  45. package/public/contentbuilder/themes/dark-blue3.css +26 -1371
  46. package/public/contentbuilder/themes/dark-gray.css +26 -1371
  47. package/public/contentbuilder/themes/dark-pink.css +26 -1371
  48. package/public/contentbuilder/themes/dark-purple.css +26 -1371
  49. package/public/contentbuilder/themes/dark-red.css +26 -1371
  50. package/public/contentbuilder/themes/light-blue.css +29 -1323
  51. package/public/contentbuilder/themes/light-blue2.css +29 -1323
  52. package/public/contentbuilder/themes/light-blue3.css +29 -1323
  53. package/public/contentbuilder/themes/light-cyan.css +29 -1323
  54. package/public/contentbuilder/themes/light-gray.css +29 -1323
  55. package/public/contentbuilder/themes/light-gray2.css +29 -1323
  56. package/public/contentbuilder/themes/light-gray3.css +29 -1323
  57. package/public/contentbuilder/themes/light-green.css +29 -1323
  58. package/public/contentbuilder/themes/light-pink.css +29 -1323
  59. package/public/contentbuilder/themes/light-pink2.css +29 -1323
  60. package/public/contentbuilder/themes/light-purple.css +29 -1323
  61. package/public/contentbuilder/themes/light-purple2.css +29 -1323
  62. package/public/contentbuilder/themes/light-red.css +29 -1323
  63. package/public/contentbuilder/themes/light-yellow.css +29 -1323
  64. package/public/contentbuilder/themes/light-yellow2.css +29 -1323
  65. package/readme.txt +225 -154
  66. package/public/contentbuilder/config.js +0 -7
  67. package/public/contentbuilder/content.css +0 -7777
  68. package/public/contentbuilder/plugins/animation/plugin.js +0 -25
  69. package/public/contentbuilder/plugins/buttoneditor/images/a.jpg +0 -0
  70. package/public/contentbuilder/plugins/buttoneditor/images/b.jpg +0 -0
  71. package/public/contentbuilder/plugins/buttoneditor/images/c.jpg +0 -0
  72. package/public/contentbuilder/plugins/buttoneditor/images/d.jpg +0 -0
  73. package/public/contentbuilder/plugins/buttoneditor/images/e.jpg +0 -0
  74. package/public/contentbuilder/plugins/buttoneditor/images/f.jpg +0 -0
  75. package/public/contentbuilder/plugins/buttoneditor/images/g.jpg +0 -0
  76. package/public/contentbuilder/plugins/buttoneditor/images/h.jpg +0 -0
  77. package/public/contentbuilder/plugins/buttoneditor/plugin.js +0 -1600
  78. package/public/contentbuilder/plugins/buttoneditor/readme.txt +0 -7
  79. package/public/contentbuilder/plugins/helloworld/plugin.js +0 -21
  80. package/public/contentbuilder/plugins/helloworld/readme.txt +0 -23
  81. package/public/contentbuilder/plugins/preview/plugin.js +0 -371
  82. package/public/contentbuilder/plugins/preview/readme.txt +0 -23
  83. package/public/contentbuilder/plugins/searchreplace/plugin.js +0 -524
  84. package/public/contentbuilder/plugins/searchreplace/readme.txt +0 -23
  85. package/public/contentbuilder/plugins/searchreplace/searchreplace.html +0 -264
  86. package/public/contentbuilder/plugins/showgrid/plugin.js +0 -74
  87. package/public/contentbuilder/plugins/showgrid/readme.txt +0 -23
  88. package/public/contentbuilder/plugins/symbols/plugin.js +0 -3126
  89. package/public/contentbuilder/plugins/symbols/readme.txt +0 -23
  90. package/public/contentbuilder/plugins/wordcount/plugin.js +0 -76
  91. package/public/contentbuilder/plugins/wordcount/readme.txt +0 -23
  92. package/public/contentbuilder/themes/dark.css +0 -1377
package/index.d.ts CHANGED
@@ -9,6 +9,13 @@ interface ContentBuilderOptions {
9
9
  imageQuality?: number;
10
10
  maxZoom?: number;
11
11
  elementSelection?: boolean;
12
+ /** Paste mode.
13
+ * 'auto' (default): content adopts the destination block,
14
+ * keeping semantic inline marks (bold/italic/underline/strike/link/code/
15
+ * sub-sup) and dropping presentational styling
16
+ * 'text': plain text.
17
+ * 'html': HTML with styles.
18
+ * 'html-without-styles': HTML, inline styles dropped, classes kept. */
12
19
  paste?: string;
13
20
  snippetJSON?: object;
14
21
  screenMode?: string;
@@ -31,6 +38,23 @@ interface ContentBuilderOptions {
31
38
  assetPath?: string;
32
39
  fontAssetPath?: string;
33
40
  fontPath?: string;
41
+
42
+ /** Replaces the built-in font list of the Text panel's font picker. */
43
+ fonts?: FontEntry[] | null;
44
+ /** Adds fonts to the font list. Use this for fonts your users upload. */
45
+ customFonts?: FontEntry[];
46
+ /**
47
+ * How the font picker shows each font: drawn in the font itself ('font',
48
+ * the default), the thumbnails shipped in fontAssetPath ('image', which
49
+ * needs no internet connection), or plain text ('none').
50
+ */
51
+ fontPreview?: 'font' | 'image' | 'none';
52
+ /**
53
+ * Where 'font' previews are fetched from. Defaults to Google's CSS2
54
+ * endpoint; any Google Fonts compatible service works.
55
+ */
56
+ fontPreviewUrl?: string;
57
+
34
58
  snippetModal?: boolean;
35
59
  snippetModalLeft?: boolean;
36
60
  snippetData?: string;
@@ -61,7 +85,7 @@ interface ContentBuilderOptions {
61
85
  onVideoUpload?: () => void;
62
86
  audioHandler?: string;
63
87
  onAudioUpload?: () => void;
64
- colors?: any[];
88
+ colors?: any[];
65
89
  builderMode?: string;
66
90
  rowTool?: string;
67
91
  rowcolOutline?: boolean;
@@ -94,6 +118,16 @@ interface ContentBuilderOptions {
94
118
  onImageSettingClick?: () => void;
95
119
  onImageEditClick?: () => void;
96
120
  setCropperConfig?: () => void;
121
+ /** @deprecated 'crop' opens the older crop-only dialog. It will be removed. */
122
+ imageEditor?: string;
123
+ /** LUT library for the image editor's look reel: entries, { category: entries }, or a URL to a JSON file. */
124
+ imageEditorPresets?: string | any[] | Record<string, any[]> | null;
125
+ /** Encoder quality (0-1) used when the image editor saves. Default 0.92. */
126
+ imageEditorQuality?: number;
127
+ /** Show the image editor's "My looks" section (save & re-apply a treatment). Default false. */
128
+ imageEditorMyLooks?: boolean;
129
+ /** Show the image editor's "Load .cube…" button (load a LUT from the user's computer). Default false. */
130
+ imageEditorLoadCube?: boolean;
97
131
  imageEmbed?: boolean;
98
132
  imageselect?: string;
99
133
  fileselect?: string;
@@ -147,7 +181,9 @@ interface ContentBuilderOptions {
147
181
  toolbarAddSnippetButton?: boolean;
148
182
  animateModal?: boolean;
149
183
  defaultFontSizes?: any[];
150
- fontSizeClassValues?: any[];
184
+ fontSizeClassValues?: any[];
185
+ /** Box-shadow presets shown as a swatch grid in the element panel's Shadow tab. */
186
+ shadowTemplates?: string[];
151
187
  gradientcolors?: any[];
152
188
  elementEditor?: boolean;
153
189
  customval?: string;
@@ -172,6 +208,10 @@ interface ContentBuilderOptions {
172
208
  pageSizes?: any[];
173
209
  maxEmbedImageWidth?: number;
174
210
  zoom?: number;
211
+ /** Default position of the plugin settings modal. Default 'center'. */
212
+ pluginSettingsPosition?: 'center' | 'right' | 'left' | { top?: string | number; left?: string | number; right?: string | number; bottom?: string | number };
213
+ /** Default position of the button editor modal. Default 'center'. */
214
+ buttonEditorPosition?: 'center' | 'right' | 'left' | { top?: string | number; left?: string | number; right?: string | number; bottom?: string | number };
175
215
  useLightbox?: boolean;
176
216
  lightboxArrow?: boolean;
177
217
  imageRenameOnEdit?: boolean;
@@ -188,6 +228,10 @@ interface ContentBuilderOptions {
188
228
  leadingPreset?: any[];
189
229
  cssClasses?: object;
190
230
  useCssClasses?: boolean;
231
+ /** When the caret is in text with no selection, apply formatting (bold,
232
+ * size, color, …) to the nearest element the caret is in — e.g. restyle a
233
+ * whole heading without selecting it. Default true. */
234
+ caretFormatting?: boolean;
191
235
  useButtonPlugin?: boolean;
192
236
  enableDragResize?: boolean;
193
237
  simpleTextSettings?: boolean;
@@ -235,9 +279,33 @@ interface ContentBuilderOptions {
235
279
  clearChatSettings?: boolean;
236
280
  defaultChatSettings?: Record<string, any>;
237
281
  demoMode?: boolean;
238
- demoConversations?: any[];
282
+ demoConversations?: any[];
239
283
  startCodeChat?: boolean;
240
284
 
285
+ //-- Code Chat: vision / attachments
286
+ /** Let files be attached to a chat message. Off by default: the attach
287
+ * button is hidden and drag-and-drop and paste are not accepted. */
288
+ chatAttachments?: boolean;
289
+ /** Legacy attachment handling: extract text from Office/text files and
290
+ * transcode images before sending, instead of passing files through
291
+ * natively. Off by default. */
292
+ convertAttachments?: boolean;
293
+ /** Explicit override of which code models accept image input. When omitted,
294
+ * capability comes from a model entry's own `accepts` list, then family
295
+ * heuristics. */
296
+ visionCapableCodeModels?: string[];
297
+ /** Same as visionCapableCodeModels, for the chat model list. */
298
+ visionCapableChatModels?: string[];
299
+ /** Per-provider image model lists. Only the active provider's list is used,
300
+ * and the provider suffix is matched case-insensitively. An entry is
301
+ * `{ id, label, sizes?, size_param?, output_format?, output_param?,
302
+ * size_auto?, image_input?, edit? }`; a Fal entry adds
303
+ * `edit: { id, image_param, image_max?, ...overrides }` naming the model id
304
+ * used when reference images ride along. */
305
+ imageModels_Fal?: any[];
306
+ imageModels_OpenRouter?: any[];
307
+ imageModels_OpenAI?: any[];
308
+
241
309
  //-- Asset Manager
242
310
  listFilesUrl?: string;
243
311
  listFoldersUrl?: string;
@@ -282,6 +350,21 @@ interface ContentBuilderOptions {
282
350
  generateMediaUrl_Fal?: string;
283
351
  checkRequestStatusUrl_Fal?: string;
284
352
  getResultUrl_Fal?: string;
353
+ /** OpenRouter image provider (defaultImageGenerationProvider: 'openrouter').
354
+ * Same three-step request/status/result contract as the _Fal endpoints,
355
+ * including reference-image features (restyle / edit existing photos),
356
+ * which all three providers serve. */
357
+ generateMediaUrl_OpenRouter?: string;
358
+ checkRequestStatusUrl_OpenRouter?: string;
359
+ getResultUrl_OpenRouter?: string;
360
+ /** OpenAI image provider (defaultImageGenerationProvider: 'openai').
361
+ * The same three-step request/status/result contract as the _Fal and
362
+ * _OpenRouter endpoints, including reference-image features (an entry with
363
+ * image_input: true routes to /v1/images/edits). Distinct from the older
364
+ * one-shot generateMediaUrl_OpenAI_CreateImage(Edit) below. */
365
+ generateMediaUrl_OpenAI?: string;
366
+ checkRequestStatusUrl_OpenAI?: string;
367
+ getResultUrl_OpenAI?: string;
285
368
  minimizeImageUrl?: string;
286
369
  cleanup?: string;
287
370
  generateMediaUrl_OpenAI_CreateImage?: string;
@@ -299,6 +382,38 @@ interface ContentBuilderOptions {
299
382
  //---
300
383
  }
301
384
 
385
+ /** Options for builder.modal(). Only `html` is required. */
386
+ interface ModalOptions {
387
+ /** Title bar text. Omit for a bare dialog with a floating close button. */
388
+ title?: string;
389
+ /** The content of the dialog: plain markup, no shell needed. */
390
+ html: string;
391
+ /** 320 (px) or any CSS length, e.g. '40rem'. */
392
+ width?: number | string;
393
+ /** Overrides the body padding. Skipped automatically if your own outermost
394
+ * element already sets padding inline. */
395
+ padding?: string;
396
+ /** Default: true. */
397
+ closeButton?: boolean;
398
+ /** Default: true. Applies to the title bar. */
399
+ draggable?: boolean;
400
+ /** Extra class on the shell, so you can style it from your own CSS. */
401
+ className?: string;
402
+ overlayStay?: boolean;
403
+ onOpen?: (modal: ModalHandle) => void;
404
+ onClose?: (modal: ModalHandle) => void;
405
+ }
406
+
407
+ /** What builder.modal() returns. */
408
+ interface ModalHandle {
409
+ /** The dialog element. */
410
+ el: HTMLElement;
411
+ /** The content wrapper - query your own markup from here. */
412
+ body: HTMLElement;
413
+ open(): ModalHandle;
414
+ close(): ModalHandle;
415
+ }
416
+
302
417
  declare class ContentBuilder {
303
418
  constructor(options?: ContentBuilderOptions);
304
419
 
@@ -312,6 +427,10 @@ declare class ContentBuilder {
312
427
  saveImages(handler?: string, onComplete?: () => void, onBase64Upload?: () => void): void;
313
428
  applyBehavior(): void;
314
429
  applyBehaviorOn(element: HTMLElement): void;
430
+ /** Paint a colour-swatch button (`.cb-colorbtn`): reflect the colour on the
431
+ * swatch's inner `<span>` and toggle its empty (checkerboard) state. Public
432
+ * counterpart to `colorPicker` for external swatches. Pass '' to clear. */
433
+ paintColorButton(btn: HTMLElement, value: string): void;
315
434
  viewConfig(): void;
316
435
  setUIColor(mode: string, csslink?: string): void;
317
436
  viewHtml(): void;
@@ -329,10 +448,120 @@ declare class ContentBuilder {
329
448
  openAIAssistant(): void;
330
449
  closeAIAssistant(): void;
331
450
  saveForUndo(): void;
451
+ /**
452
+ * Translate a source string through the configured language map
453
+ * (`opts.lang`, populated from the global `_txt` when a language file is
454
+ * loaded). Returns the translation, or the string itself when there's no
455
+ * entry. Safe to call outside the editor — e.g. to localize the title of a
456
+ * custom toolbar button added with `addButton`.
457
+ */
458
+ out(text: string): string;
459
+ /**
460
+ * Convert the current text selection into an inline plugin instance
461
+ * (e.g. wrap selected text in a tooltip/footnote span). Wire a toolbar
462
+ * button (addButton) that calls this; the framework restores the RTE
463
+ * selection, wraps it, stamps data-cb-type, mounts via the runtime, and
464
+ * optionally opens the plugin's content editor. Returns the created element,
465
+ * or null when there is no usable selection.
466
+ */
467
+ convertSelectionToPlugin(
468
+ pluginName: string,
469
+ config?: {
470
+ create?: (selectedText: string, doc: Document) => HTMLElement;
471
+ attributes?: Record<string, string>;
472
+ className?: string;
473
+ tag?: string;
474
+ openEditor?: boolean;
475
+ }
476
+ ): HTMLElement | null;
477
+ /**
478
+ * Create a rich-text editor (Inscribe) inside a plugin settings panel — a
479
+ * modern, execCommand-free replacement for a raw contenteditable. Returns the
480
+ * Inscribe instance (toggle/apply/link/list/setBlock/getHTML/setHTML/on/…).
481
+ * Lifecycle is framework-managed: every editor is torn down when the plugin
482
+ * settings panel rebuilds or closes, so multiple editors per panel are safe.
483
+ */
484
+ createPanelEditor(
485
+ el: HTMLElement,
486
+ opts?: { onChange?: () => void; inscribe?: Record<string, any> }
487
+ ): any;
488
+ /** Destroy every editor created by createPanelEditor (framework-managed). */
489
+ destroyPanelEditors(): void;
490
+ /**
491
+ * Convert an inline plugin (a span[data-cb-type], e.g. a tooltip) back to
492
+ * plain text: cleanly unmount it and unwrap it, keeping its text. Undoable.
493
+ */
494
+ convertPluginToText(element: HTMLElement): boolean;
495
+ /**
496
+ * Toggle a highlight (marker) background on the current text selection —
497
+ * apply it, or remove it if the selection is already highlighted.
498
+ */
499
+ toggleHighlight(color?: string): void;
332
500
  selectAsset(s: string, f?: boolean): void;
501
+ /**
502
+ * Show a file: images and video open in the editor's lightbox, anything
503
+ * else (pdf, audio, archives) opens in a new tab. Also available inside a
504
+ * page opened by the editor as window.parent.previewAsset(url).
505
+ */
506
+ previewAsset(url: string): void;
333
507
  hideModal(modal?: HTMLElement): void;
508
+
509
+ /**
510
+ * Build a dialog from plain content. The shell, title bar, close button,
511
+ * aria attributes, padding and drag wiring are supplied for you:
512
+ *
513
+ * const wc = builder.modal({ title: 'Word Count', width: 320, html: '<div>…</div>' });
514
+ * wc.open();
515
+ */
516
+ modal(options: ModalOptions): ModalHandle;
517
+
518
+ /**
519
+ * Page Preview. Opens previewURL in a fullscreen frame with a width ruler,
520
+ * so a layout can be checked at any width without leaving the editor.
521
+ * Does nothing when previewURL is unset.
522
+ *
523
+ * Distinct from openPreview(), which opens Live Preview, the small floating
524
+ * window. Both remain available.
525
+ */
526
+ openPagePreview(): void;
527
+
528
+ /** Insert markup into the editor's container (#_cbhtml), so .is-modal and
529
+ * friends style it as they style the built-in dialogs. */
530
+ addHtml(html: string): void;
531
+ /** Append a stylesheet to the page's <head>. */
532
+ addCss(css: string): void;
533
+ showModal(
534
+ modal: HTMLElement,
535
+ overlayStay?: boolean,
536
+ cancelCallback?: () => void,
537
+ animated?: boolean,
538
+ overflowHidden?: boolean
539
+ ): void;
540
+ /** Insert the modal if it is not there yet, show it, and wire dragging. */
541
+ createModal(
542
+ modal: HTMLElement,
543
+ selector: string,
544
+ overlayStay?: boolean,
545
+ cancelCallback?: () => void,
546
+ animated?: boolean,
547
+ overflowHidden?: boolean
548
+ ): HTMLElement;
549
+ /** Make anything matching the selector draggable by that element. */
550
+ draggable(selector: string): void;
551
+ showSidePanel(panel: HTMLElement): void;
552
+ hideSidePanel(panel: HTMLElement): void;
553
+ getScriptPath(): string;
334
554
  closeAsset(): void;
335
555
  addBlock(html: string, blockContainer?: HTMLElement): void;
556
+ /**
557
+ * Register a custom button on the text-selection (RTE) toolbar. `pluginName`
558
+ * matches a `data-plugin` placeholder produced by listing the name in the
559
+ * `buttons` option; `html` is the button markup (include that
560
+ * `data-plugin="<name>"`), `selector` finds it, and `exec` runs on click.
561
+ */
562
+ addButton(pluginName: string, html: string, selector: string, exec: (e: MouseEvent) => void): void;
563
+ /** Same as `addButton`, but for the element (block) toolbar. */
564
+ addButton2(pluginName: string, html: string, selector: string, exec: (e: MouseEvent) => void): void;
336
565
  addPage(box?: HTMLElement): void;
337
566
  setPageSize(s?: string): void;
338
567
  openPageOptions(): void;
package/package.json CHANGED
@@ -1,22 +1,24 @@
1
1
  {
2
- "name": "@innovastudio/contentbuilder",
3
2
  "type": "module",
4
- "version": "1.5.211",
3
+ "name": "@innovastudio/contentbuilder",
4
+ "version": "1.5.213",
5
5
  "description": "",
6
6
  "main": "public/contentbuilder/contentbuilder.esm.js",
7
7
  "types": "index.d.ts",
8
8
  "files": [
9
9
  "public/contentbuilder",
10
+ "!public/contentbuilder/plugins",
11
+ "!public/contentbuilder/config.js",
10
12
  "index.d.ts"
11
13
  ],
12
14
  "scripts": {
13
15
  "build": "rollup -c",
14
16
  "start": "concurrently \"node server.js\" \"webpack serve --config webpack.config.js\"",
15
- "scss": "sass --no-source-map src/scss/contentbuilder.scss:public/contentbuilder/contentbuilder.css src/scss/themes/dark.scss:public/contentbuilder/themes/dark.css src/scss/themes/colored-blue.scss:public/contentbuilder/themes/colored-blue.css src/scss/themes/colored-blue6.scss:public/contentbuilder/themes/colored-blue6.css src/scss/themes/colored-darkblue.scss:public/contentbuilder/themes/colored-darkblue.css src/scss/themes/colored-green.scss:public/contentbuilder/themes/colored-green.css src/scss/themes/colored-orange.scss:public/contentbuilder/themes/colored-orange.css src/scss/themes/colored-magenta.scss:public/contentbuilder/themes/colored-magenta.css src/scss/themes/colored-purple.scss:public/contentbuilder/themes/colored-purple.css src/scss/themes/colored-pink.scss:public/contentbuilder/themes/colored-pink.css src/scss/themes/colored-red.scss:public/contentbuilder/themes/colored-red.css src/scss/themes/colored-yellow.scss:public/contentbuilder/themes/colored-yellow.css src/scss/themes/colored-green4.scss:public/contentbuilder/themes/colored-green4.css src/scss/themes/colored-dark.scss:public/contentbuilder/themes/colored-dark.css src/scss/themes/light-blue.scss:public/contentbuilder/themes/light-blue.css src/scss/themes/light-pink.scss:public/contentbuilder/themes/light-pink.css src/scss/themes/light-purple.scss:public/contentbuilder/themes/light-purple.css src/scss/themes/light-red.scss:public/contentbuilder/themes/light-red.css src/scss/themes/light-yellow.scss:public/contentbuilder/themes/light-yellow.css src/scss/themes/light-green.scss:public/contentbuilder/themes/light-green.css src/scss/themes/light-cyan.scss:public/contentbuilder/themes/light-cyan.css src/scss/themes/light-blue2.scss:public/contentbuilder/themes/light-blue2.css src/scss/themes/light-pink2.scss:public/contentbuilder/themes/light-pink2.css src/scss/themes/light-purple2.scss:public/contentbuilder/themes/light-purple2.css src/scss/themes/light-blue3.scss:public/contentbuilder/themes/light-blue3.css src/scss/themes/light-yellow2.scss:public/contentbuilder/themes/light-yellow2.css src/scss/themes/light-gray3.scss:public/contentbuilder/themes/light-gray3.css src/scss/themes/light-gray2.scss:public/contentbuilder/themes/light-gray2.css src/scss/themes/light-gray.scss:public/contentbuilder/themes/light-gray.css src/scss/themes/colored-blue2.scss:public/contentbuilder/themes/colored-blue2.css src/scss/themes/colored-blue4.scss:public/contentbuilder/themes/colored-blue4.css src/scss/themes/colored-blue3.scss:public/contentbuilder/themes/colored-blue3.css src/scss/themes/colored-blue5.scss:public/contentbuilder/themes/colored-blue5.css src/scss/themes/colored-pink3.scss:public/contentbuilder/themes/colored-pink3.css src/scss/themes/colored-purple2.scss:public/contentbuilder/themes/colored-purple2.css src/scss/themes/colored-yellow2.scss:public/contentbuilder/themes/colored-yellow2.css src/scss/themes/colored-red3.scss:public/contentbuilder/themes/colored-red3.css src/scss/themes/colored-green2.scss:public/contentbuilder/themes/colored-green2.css src/scss/themes/colored-green3.scss:public/contentbuilder/themes/colored-green3.css src/scss/themes/colored-pink2.scss:public/contentbuilder/themes/colored-pink2.css src/scss/themes/colored-orange2.scss:public/contentbuilder/themes/colored-orange2.css src/scss/themes/colored-red2.scss:public/contentbuilder/themes/colored-red2.css src/scss/themes/colored-gray.scss:public/contentbuilder/themes/colored-gray.css src/scss/themes/dark-blue.scss:public/contentbuilder/themes/dark-blue.css src/scss/themes/dark-blue2.scss:public/contentbuilder/themes/dark-blue2.css src/scss/themes/dark-purple.scss:public/contentbuilder/themes/dark-purple.css src/scss/themes/dark-pink.scss:public/contentbuilder/themes/dark-pink.css src/scss/themes/dark-blue3.scss:public/contentbuilder/themes/dark-blue3.css src/scss/themes/dark-gray.scss:public/contentbuilder/themes/dark-gray.css src/scss/themes/dark-red.scss:public/contentbuilder/themes/dark-red.css src/scss/themes/colored-red4.scss:public/contentbuilder/themes/colored-red4.css src/scss/themes/colored-blue7.scss:public/contentbuilder/themes/colored-blue7.css src/scss/themes/colored-pink4.scss:public/contentbuilder/themes/colored-pink4.css src/scss/themes/colored-blue8.scss:public/contentbuilder/themes/colored-blue8.css src/scss/themes/colored-green5.scss:public/contentbuilder/themes/colored-green5.css src/scss/themes/colored-orange3.scss:public/contentbuilder/themes/colored-orange3.css src/scss/themes/colored-red5.scss:public/contentbuilder/themes/colored-red5.css ",
17
+ "scss": "sass --no-source-map src/scss/contentbuilder.scss:public/contentbuilder/contentbuilder.css src/scss/themes/colored-blue.scss:public/contentbuilder/themes/colored-blue.css src/scss/themes/colored-blue6.scss:public/contentbuilder/themes/colored-blue6.css src/scss/themes/colored-darkblue.scss:public/contentbuilder/themes/colored-darkblue.css src/scss/themes/colored-green.scss:public/contentbuilder/themes/colored-green.css src/scss/themes/colored-orange.scss:public/contentbuilder/themes/colored-orange.css src/scss/themes/colored-magenta.scss:public/contentbuilder/themes/colored-magenta.css src/scss/themes/colored-purple.scss:public/contentbuilder/themes/colored-purple.css src/scss/themes/colored-pink.scss:public/contentbuilder/themes/colored-pink.css src/scss/themes/colored-red.scss:public/contentbuilder/themes/colored-red.css src/scss/themes/colored-yellow.scss:public/contentbuilder/themes/colored-yellow.css src/scss/themes/colored-green4.scss:public/contentbuilder/themes/colored-green4.css src/scss/themes/colored-dark.scss:public/contentbuilder/themes/colored-dark.css src/scss/themes/light-blue.scss:public/contentbuilder/themes/light-blue.css src/scss/themes/light-pink.scss:public/contentbuilder/themes/light-pink.css src/scss/themes/light-purple.scss:public/contentbuilder/themes/light-purple.css src/scss/themes/light-red.scss:public/contentbuilder/themes/light-red.css src/scss/themes/light-yellow.scss:public/contentbuilder/themes/light-yellow.css src/scss/themes/light-green.scss:public/contentbuilder/themes/light-green.css src/scss/themes/light-cyan.scss:public/contentbuilder/themes/light-cyan.css src/scss/themes/light-blue2.scss:public/contentbuilder/themes/light-blue2.css src/scss/themes/light-pink2.scss:public/contentbuilder/themes/light-pink2.css src/scss/themes/light-purple2.scss:public/contentbuilder/themes/light-purple2.css src/scss/themes/light-blue3.scss:public/contentbuilder/themes/light-blue3.css src/scss/themes/light-yellow2.scss:public/contentbuilder/themes/light-yellow2.css src/scss/themes/light-gray3.scss:public/contentbuilder/themes/light-gray3.css src/scss/themes/light-gray2.scss:public/contentbuilder/themes/light-gray2.css src/scss/themes/light-gray.scss:public/contentbuilder/themes/light-gray.css src/scss/themes/colored-blue2.scss:public/contentbuilder/themes/colored-blue2.css src/scss/themes/colored-blue4.scss:public/contentbuilder/themes/colored-blue4.css src/scss/themes/colored-blue3.scss:public/contentbuilder/themes/colored-blue3.css src/scss/themes/colored-blue5.scss:public/contentbuilder/themes/colored-blue5.css src/scss/themes/colored-pink3.scss:public/contentbuilder/themes/colored-pink3.css src/scss/themes/colored-purple2.scss:public/contentbuilder/themes/colored-purple2.css src/scss/themes/colored-yellow2.scss:public/contentbuilder/themes/colored-yellow2.css src/scss/themes/colored-red3.scss:public/contentbuilder/themes/colored-red3.css src/scss/themes/colored-green2.scss:public/contentbuilder/themes/colored-green2.css src/scss/themes/colored-green3.scss:public/contentbuilder/themes/colored-green3.css src/scss/themes/colored-pink2.scss:public/contentbuilder/themes/colored-pink2.css src/scss/themes/colored-orange2.scss:public/contentbuilder/themes/colored-orange2.css src/scss/themes/colored-red2.scss:public/contentbuilder/themes/colored-red2.css src/scss/themes/colored-gray.scss:public/contentbuilder/themes/colored-gray.css src/scss/themes/dark-blue.scss:public/contentbuilder/themes/dark-blue.css src/scss/themes/dark-blue2.scss:public/contentbuilder/themes/dark-blue2.css src/scss/themes/dark-purple.scss:public/contentbuilder/themes/dark-purple.css src/scss/themes/dark-pink.scss:public/contentbuilder/themes/dark-pink.css src/scss/themes/dark-blue3.scss:public/contentbuilder/themes/dark-blue3.css src/scss/themes/dark-gray.scss:public/contentbuilder/themes/dark-gray.css src/scss/themes/dark-red.scss:public/contentbuilder/themes/dark-red.css src/scss/themes/colored-red4.scss:public/contentbuilder/themes/colored-red4.css src/scss/themes/colored-blue7.scss:public/contentbuilder/themes/colored-blue7.css src/scss/themes/colored-pink4.scss:public/contentbuilder/themes/colored-pink4.css src/scss/themes/colored-blue8.scss:public/contentbuilder/themes/colored-blue8.css src/scss/themes/colored-green5.scss:public/contentbuilder/themes/colored-green5.css src/scss/themes/colored-orange3.scss:public/contentbuilder/themes/colored-orange3.css src/scss/themes/colored-red5.scss:public/contentbuilder/themes/colored-red5.css src/scss/themes/colored-cyan.scss:public/contentbuilder/themes/colored-cyan.css src/scss/themes/colored-yellow3.scss:public/contentbuilder/themes/colored-yellow3.css ",
16
18
  "serve": "webpack serve --config webpack.config.js",
17
19
  "build-old": "webpack --config webpack.prod.config.js",
18
20
  "scss2": "sass --watch --no-source-map src/scss/contentbuilder.scss public/contentbuilder/contentbuilder.css",
19
- "scss3": "sass --watch --no-source-map src/scss/content.scss:public/contentbuilder/content.css"
21
+ "test": "node src/contentbuilder/test/tabletool.test.mjs"
20
22
  },
21
23
  "keywords": [],
22
24
  "author": "",
@@ -27,7 +29,6 @@
27
29
  "@babel/plugin-proposal-class-properties": "^7.14.5",
28
30
  "@babel/plugin-transform-runtime": "^7.18.2",
29
31
  "@babel/preset-env": "^7.15.6",
30
- "@deepgram/sdk": "^2.3.0",
31
32
  "@fal-ai/client": "^1.4.0",
32
33
  "@google/genai": "^0.12.0",
33
34
  "@rollup/plugin-babel": "^5.3.0",
@@ -44,9 +45,11 @@
44
45
  "express": "^4.17.1",
45
46
  "express-session": "^1.17.2",
46
47
  "formidable-serverless": "^1.1.1",
48
+ "jsdom": "^29.1.1",
47
49
  "mini-css-extract-plugin": "^2.3.0",
48
50
  "multer": "^1.4.5-lts.1",
49
51
  "openai": "^4.96.2",
52
+ "playwright": "^1.62.1",
50
53
  "rollup": "^2.57.0",
51
54
  "rollup-plugin-terser": "^7.0.2",
52
55
  "sass": "^1.42.1",
@@ -60,13 +63,9 @@
60
63
  },
61
64
  "dependencies": {
62
65
  "@monaco-editor/loader": "^1.6.1",
63
- "blueimp-load-image": "^5.16.0",
64
66
  "cropperjs": "^1.5.12",
65
67
  "js-beautify": "^1.14.0",
66
68
  "marked": "^17.0.0",
67
- "moveable": "^0.30.0",
68
- "nanopop": "^2.4.2",
69
- "sortablejs": "^1.15.2",
70
- "string-similarity-js": "^2.1.4"
69
+ "sortablejs": "^1.15.2"
71
70
  }
72
71
  }