@orangelogic/design-system 4.18.0 → 4.20.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 (46) hide show
  1. package/library/chunks/{color-swatch-group.DHrDL5W4.js → color-swatch-group.WMinusvs.js} +378 -359
  2. package/library/chunks/{config-manager.j-83Ts1D.js → config-manager.Q6Uu3jTl.js} +7 -7
  3. package/library/chunks/{config-manager.utils.C-G0Iimp.js → config-manager.utils.BjTsUGLW.js} +11 -11
  4. package/library/chunks/{configs-controller.FjT3LVI8.js → configs-controller.Dea3OymR.js} +3 -3
  5. package/library/chunks/{folder-select.CmyEyzfA.js → folder-select.DZ27acgw.js} +36 -19
  6. package/library/chunks/{header.DpccEGpQ.js → header.Ny2fWwyt.js} +43 -15
  7. package/library/chunks/{src.BQQW1rcJ.js → src.BFdGIzyC.js} +1 -1
  8. package/library/components/atoms.js +2 -2
  9. package/library/components/color-swatch-group.js +1 -1
  10. package/library/components/folder-select.js +1 -1
  11. package/library/components/header.js +1 -1
  12. package/library/components/molecules.js +4 -4
  13. package/library/components/organisms.js +1 -1
  14. package/library/components/types.js +13074 -13010
  15. package/library/package.json +1 -1
  16. package/library/packages/events/src/cx-table-validation-change.d.ts +2 -2
  17. package/library/packages/events/src/cx-video-active-subclip-change.d.ts +6 -0
  18. package/library/packages/events/src/events.d.ts +1 -0
  19. package/library/packages/hybrid/rich-text/src/components/rich-text-toolbar/rich-text-toolbar.d.ts +16 -8
  20. package/library/packages/hybrid/rich-text/src/components/rich-text-toolbar/toolbar-align-actions.d.ts +3 -8
  21. package/library/packages/hybrid/rich-text/src/rich-text.d.ts +21 -1
  22. package/library/packages/hybrid/rich-text/src/utils/parse-border-from-style.d.ts +2 -1
  23. package/library/packages/hybrid/table-core/src/table/controllers/filter-controller.d.ts +8 -0
  24. package/library/packages/hybrid/table-core/src/table/table-in-memory-data.d.ts +2 -0
  25. package/library/packages/hybrid/table-core/src/table/table.d.ts +1 -1
  26. package/library/packages/hybrid/video-advanced/src/react/context.d.ts +1 -0
  27. package/library/packages/hybrid/video-advanced/src/react/hooks/useVideoEditorAnnotation.d.ts +26 -0
  28. package/library/packages/hybrid/video-advanced/src/react/type.d.ts +12 -0
  29. package/library/packages/molecules/src/faceted-filter/components/facet/facet.d.ts +2 -0
  30. package/library/packages/molecules/src/folder-select/components/folder-select-tree/folder-select-tree.d.ts +2 -0
  31. package/library/packages/molecules/src/folder-select/components/folder-select-tree-item/folder-select-tree-item.d.ts +3 -0
  32. package/library/packages/molecules/src/folder-select/folder-select.d.ts +2 -0
  33. package/library/packages/organisms/src/downloader/data/core/worker/app/DownloadManager.d.ts +4 -2
  34. package/library/packages/organisms/src/downloader/data/core/worker/app/utilities/index.d.ts +2 -1
  35. package/library/packages/organisms/src/downloader/data/core/worker/utilities/FilePathFixer.d.ts +10 -0
  36. package/library/packages/services/src/api/folder/folder.d.ts +1 -1
  37. package/library/packages/tools/src/tiptap/extensions/index.d.ts +7 -1
  38. package/library/packages/tools/src/tiptap/extensions/link/helpers/active-link-range.d.ts +9 -0
  39. package/library/packages/tools/src/tiptap/extensions/table/index.d.ts +13 -1
  40. package/library/packages/tools/src/tiptap/utils/to-published-html.d.ts +14 -0
  41. package/library/packages/types/src/folder-select.d.ts +1 -0
  42. package/library/packages/types/src/rich-text.d.ts +10 -0
  43. package/library/packages/types/src/table.d.ts +10 -0
  44. package/library/react-web-component.d.ts +5 -1
  45. package/package.json +1 -1
  46. package/library/packages/hybrid/video-advanced/src/react/@types/react-range-slider-input/index.d.ts +0 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@orangelogic/design-system",
3
3
  "type": "module",
4
- "version": "4.18.0",
4
+ "version": "4.20.0",
5
5
  "license": "UNLICENSED",
6
6
  "types": "library/types.d.ts",
7
7
  "scripts": {
@@ -1,5 +1,5 @@
1
- import { ValidationSummary } from '../../types/src/table';
2
- export type CxTableValidationChangeEvent = CustomEvent<ValidationSummary>;
1
+ import { TableValidationChangeDetail } from '../../types/src/table';
2
+ export type CxTableValidationChangeEvent = CustomEvent<TableValidationChangeDetail>;
3
3
  declare global {
4
4
  interface GlobalEventHandlersEventMap {
5
5
  'cx-table-validation-change': CxTableValidationChangeEvent;
@@ -0,0 +1,6 @@
1
+ export type CxVideoActiveSubclipChangeEvent = CustomEvent<Record<PropertyKey, never>>;
2
+ declare global {
3
+ interface GlobalEventHandlersEventMap {
4
+ 'cx-video-active-subclip-change': CxVideoActiveSubclipChangeEvent;
5
+ }
6
+ }
@@ -239,6 +239,7 @@ export * from './cx-typeface-download';
239
239
  export * from './cx-unauthorized';
240
240
  export * from './cx-undo';
241
241
  export * from './cx-unmark-favorite';
242
+ export * from './cx-video-active-subclip-change';
242
243
  export * from './cx-video-annotation-layer-change';
243
244
  export * from './cx-video-click';
244
245
  export * from './cx-video-closed';
@@ -196,6 +196,8 @@ export default class CxRichTextToolbar extends CortexElement {
196
196
  /** Browse callback forwarded from cx-rich-text host into the video dialog. */
197
197
  enableBrowseVideo: BrowseVideo | null;
198
198
  private caps;
199
+ /** Dialogs opened at least once; they stay mounted so their form state survives a close. */
200
+ private openedDialogs;
199
201
  /**
200
202
  * User-saved custom palette shared by text color, highlight, and rich-text dialogs (localStorage
201
203
  * `cx-rich-text-shared-custom-colors`).
@@ -279,8 +281,11 @@ export default class CxRichTextToolbar extends CortexElement {
279
281
  private applyOrderedListStyle;
280
282
  /** Selection's touched blocks as blank-line-separated runs, as `setTextSelection` spans. */
281
283
  private collectSelectedBlockGroups;
282
- /** Wraps each blank-line-separated run as its own flat list (so sections list separately). */
283
- private wrapSelectionGroupsAsList;
284
+ /**
285
+ * Flattens each touched blank-line-separated section to paragraphs, then lets `applyToGroup`
286
+ * turn each one into its own list. Toggling off passes nothing, so off mirrors on.
287
+ */
288
+ private flattenSelectionGroups;
284
289
  /**
285
290
  * Whether every touched block is already this list type — i.e. a click should remove
286
291
  * (vs. add). Block-level on purpose: Tiptap's `isActive` is range-coverage based and
@@ -288,8 +293,6 @@ export default class CxRichTextToolbar extends CortexElement {
288
293
  * mixed selection would look fully listed and wrongly toggle off.
289
294
  */
290
295
  private selectionIsEntirelyListType;
291
- /** Flattens each touched section back to paragraphs (the remove counterpart of the add path). */
292
- private flattenSelectionGroups;
293
296
  private handleBulletListDefault;
294
297
  private handleOrderedListDefault;
295
298
  private handleBulletListStylePick;
@@ -334,14 +337,15 @@ export default class CxRichTextToolbar extends CortexElement {
334
337
  private handleToggleHighlight;
335
338
  private handleSetLineHeight;
336
339
  /**
337
- * Whether the caret is on a link, including at its very start or end. Tiptap's
338
- * `isActive('link')` only reports true strictly *between* the link characters,
339
- * so at the boundary we also check the link mark on the adjacent character.
340
- * Matches the legacy editor, which recognised the link at both edges. (426ODZ)
340
+ * Shares the boundary rule with the `link--active` decoration, so the highlight can never claim
341
+ * a link this button would not edit. The decoration draws only for a caret; a selection lying
342
+ * inside a link still counts here, which is what `isActive` covers.
341
343
  */
342
344
  private isLinkActive;
343
345
  private buildLinkDialogOpenDetail;
344
346
  private handleLinkDialogSave;
347
+ /** Renders a dialog on first use and waits for it, so the `@query` below it resolves. */
348
+ private mountDialog;
345
349
  private handleLink;
346
350
  private handleSpecialCharacters;
347
351
  private handleSpecialCharactersInsert;
@@ -433,6 +437,10 @@ export default class CxRichTextToolbar extends CortexElement {
433
437
  private renderClearTextFormattingControl;
434
438
  private renderCodeBlockControl;
435
439
  private renderToolbarControl;
440
+ /**
441
+ * `trailingControl` is placed at the end of the **last** row (not in a row of its own) so the
442
+ * Advanced mode switch shares the formatting line, matching the legacy editor.
443
+ */
436
444
  private renderToolbarSpecRows;
437
445
  private renderSpecIconRows;
438
446
  private renderBlockAndSize;
@@ -9,14 +9,9 @@ export declare const ALIGN_TOOLBAR_META: Record<AlignToolbarId, {
9
9
  }>;
10
10
  export declare function alignToolbarTiptapValue(id: AlignToolbarId): TiptapTextAlign;
11
11
  /**
12
- * Whether the current selection is uniformly aligned to `align`.
13
- *
14
- * `editor.isActive({ textAlign })` returns false across a multi-block or
15
- * document-wide selection (e.g. after "select all") even when every block
16
- * shares the same alignment, so the toolbar button would fail to highlight.
17
- * We additionally inspect every alignable block in the selection, treating the
18
- * unset/default value as 'left'. This only ever adds active states on top of
19
- * `isActive`, never removes them. (426TAJ)
12
+ * Whether the selection is uniformly aligned to `align`. We scan the blocks rather than trust
13
+ * `isActive`, which is false across a multi-block selection (426TAJ) and matches the attribute on
14
+ * any node at the selection — a table cell included, which lit two buttons at once (L-429DQ4).
20
15
  */
21
16
  export declare function isTextAlignActive(ed: Editor, align: TiptapTextAlign): boolean;
22
17
  export declare function getAlignToolbarState(ed: Editor | null | undefined, id: AlignToolbarId, toolbarDisabled: boolean): {
@@ -95,7 +95,7 @@ export default class CxRichText extends CortexElement {
95
95
  */
96
96
  private resolvedImagePasteFolderPromise;
97
97
  /**
98
- * Canonical HTML last emitted on `cx-rich-text-change`. When **`fire-change-on-same-content`** is false, duplicate emits are
98
+ * Editor HTML behind the last `cx-rich-text-change`. When **`fire-change-on-same-content`** is false, duplicate emits are
99
99
  * skipped when `getHTML()` is unchanged.
100
100
  */
101
101
  private lastContent;
@@ -201,6 +201,18 @@ export default class CxRichText extends CortexElement {
201
201
  * Default false. Mirrors `cx-rich-text-toolbar` **`enable-table-header-row`**.
202
202
  */
203
203
  enableTableHeaderRow: boolean;
204
+ /**
205
+ * When true, hovering a table shows a drag handle that selects the whole table. Off by default:
206
+ * the legacy editor had none. Table properties stay reachable from the toolbar and table bubble
207
+ * either way. Only applies when **`feat-table`** is true.
208
+ */
209
+ enableTableDragHandle: boolean;
210
+ /**
211
+ * Class stamped on every rendered table, on top of the author's own, and stripped back out on
212
+ * parse so it never reaches the Table Properties field. Cortex passes `mce-table` for legacy
213
+ * markup parity. Default `''`. Only applies when **`feat-table`** is true.
214
+ */
215
+ tableClass: string;
204
216
  /**
205
217
  * When false, the `link` mark is excluded; toggling after mount rebuilds the editor (HTML preserved).
206
218
  */
@@ -267,6 +279,12 @@ export default class CxRichText extends CortexElement {
267
279
  selectionContainsSuggestion(): boolean;
268
280
  updateSuggestionContent(content: string): void;
269
281
  openFindAndReplacePopup(searchTerm?: string): void;
282
+ /**
283
+ * The content as it should be published: stored, rendered by a viewer, or sent as email.
284
+ * `editor.getHTML()` stays a faithful serialization of the document, wrappers the schema forces
285
+ * included; this resolves those away. Hosts that persist the value should read this.
286
+ */
287
+ getValue(): string;
270
288
  private teardownEditor;
271
289
  private initializeEditor;
272
290
  private emitRichTextChange;
@@ -279,6 +297,8 @@ export default class CxRichText extends CortexElement {
279
297
  handleExtensionSchemaFlagsChange(): void;
280
298
  syncNativeSpellcheckOnEditorDom(): void;
281
299
  private handleToolbarNativeSpellcheckChange;
300
+ /** `editable` is only read when the Editor is constructed, so a later flip needs pushing in. */
301
+ syncEditorEditable(): void;
282
302
  handleTableBubblePluginForEditableOrEditor(): Promise<void>;
283
303
  handleContentCssChange(): void;
284
304
  handleBaseUrlChange(): void;
@@ -1,7 +1,8 @@
1
1
  import { RichTextBorderWidthUnit, TableCellBorderStyle } from '../../../../types/src/rich-text';
2
+ /** `borderStyle` is null when nothing declared one, which a caller must not read as `none`. */
2
3
  export declare function parseBorderFromStyle(imgStyle: string): {
3
4
  borderColor: string;
4
- borderStyle: TableCellBorderStyle;
5
+ borderStyle: TableCellBorderStyle | null;
5
6
  borderWidthAmount: string;
6
7
  borderWidthUnit: RichTextBorderWidthUnit;
7
8
  };
@@ -33,6 +33,12 @@ export declare class FilterController implements ReactiveController {
33
33
  hostDisconnected(): void;
34
34
  hostUpdated(): void;
35
35
  resetAppliedFilterBaseline(): void;
36
+ /**
37
+ * Records filters already supplied to a newly-created Tabulator instance.
38
+ * This prevents the first post-build reconciliation from re-applying the
39
+ * same filters and triggering a duplicate remote data load.
40
+ */
41
+ setAppliedFilterBaseline(filters: Filter[]): void;
36
42
  /**
37
43
  * Set filters for a specific source, replacing any existing filters for that source.
38
44
  * @param source - The filter source identifier
@@ -87,6 +93,8 @@ export declare class FilterController implements ReactiveController {
87
93
  * @returns Array of all active programmatic filters from controller-managed sources
88
94
  */
89
95
  getFilters(): Filter[];
96
+ /** Returns the complete programmatic filter set handed to Tabulator. */
97
+ getMergedFilters(): Filter[];
90
98
  /**
91
99
  * Get filters for a specific source.
92
100
  * @param source - The filter source identifier
@@ -57,6 +57,8 @@ export declare function normalizeValidatorConfig(definition: ColumnDefinition['v
57
57
  parameters?: unknown;
58
58
  type: string;
59
59
  }>;
60
+ /** Total number of failing cells across every row in `validationResult`. */
61
+ export declare function countInvalidCells(validationResult: InMemoryValidationResult): number;
60
62
  /**
61
63
  * Validates a chunk of in-memory rows against `columns`' `validator`
62
64
  * configs, using the shared validation worker (`validateBatch`) — the same
@@ -82,7 +82,7 @@ import { CxTableColumnEditor, CxTableFooter, CxTableHeaderMenu, CxTableRowAction
82
82
  * E.g: `cx-table.rowMoved` will fire when `rowMoved` event is emitted.
83
83
  * @event {{ url: string, format: string, rowCount: number }} cx-table-data-load - Emitted when data is successfully loaded from dataUrl.
84
84
  * @event {{ url: string, error: unknown }} cx-table-data-load-error - Emitted when fetching or parsing data from dataUrl fails.
85
- * @event {{ invalidCellCount: number, invalidCells: ICellComponent[] }} cx-table-validation-change - Emitted when the set of cells failing column `validator` rules changes (edit, load validation, or programmatic validate).
85
+ * @event {{ invalidCellCount: number, invalidCells: ICellComponent[], complete: boolean }} cx-table-validation-change - Emitted when the set of cells failing column `validator` rules changes (edit, load validation, or programmatic validate). `complete` is true when the count covers the whole dataset and its validation has finished; a paginated `dataUrl` load emits running progress with `complete: false` per chunk, then one final event with `complete: true`.
86
86
  * @event {{ field: string, visible: boolean }} cx-table-column-visibility-change - Emitted after a column's visibility changes via the header right-click "Hide column" action.
87
87
  * @event {{ field: string }} cx-table-edit-columns - Emitted when "Edit columns" is chosen from the header right-click menu. Extension point for a future manage-columns panel; no built-in panel is shown.
88
88
  * @event {{ key: string }} cx-table-applied-filter-remove - Emitted when a host-provided chip from `additionalAppliedFilters` is removed (individually or via "Clear") in the faceted-filter panel. Carries the removed chip's `key`; the host owns the underlying filter and updates `additionalAppliedFilters` in response.
@@ -6,6 +6,7 @@ export declare const VideoReactContext: import('react').Context<{
6
6
  displayDurationTimecode: Timecode;
7
7
  displayTimecode: Timecode;
8
8
  frameRate: number;
9
+ isAnnotationEnabled: boolean;
9
10
  jumpBackward: () => void;
10
11
  jumpForward: () => void;
11
12
  players: Record<string, any>;
@@ -0,0 +1,26 @@
1
+ import { ExtendedSubClip, IComment, SubClip, TimelineMarker } from '../type';
2
+ /** The layer of one given player, since each publishes its own and the later mount wins. */
3
+ export declare const getAnnotationLayerInsidePlayer: (playerEl: HTMLElement | null | undefined) => HTMLElement | null;
4
+ /** Source time to timeline time; one comment raises any number of markers, or none. */
5
+ export declare const buildTimelineMarkers: ({ comments, subClips, }: {
6
+ comments: IComment[];
7
+ subClips: ExtendedSubClip[];
8
+ }) => TimelineMarker[];
9
+ /**
10
+ * Tells the annotator which clip is on screen and how it is shaped. On the layer rather than in
11
+ * the event, because Cortex rebuilds its annotator whenever the clips change.
12
+ */
13
+ export declare const useVideoEditorAnnotation: ({ comments, ctx, getMainVideoPlayer, isAnnotationEnabled, subClips, subClipsMap, }: {
14
+ comments: IComment[] | undefined;
15
+ ctx: any;
16
+ getMainVideoPlayer: () => any;
17
+ isAnnotationEnabled: boolean;
18
+ subClips: ExtendedSubClip[];
19
+ subClipsMap: Map<string, {
20
+ index: number;
21
+ subClip: SubClip;
22
+ }>;
23
+ }) => {
24
+ publishOnScreenClip: (player: any) => void;
25
+ timelineMarkers: TimelineMarker[];
26
+ };
@@ -13,8 +13,13 @@ export interface IComment {
13
13
  editTimestamp?: number;
14
14
  endTime?: number;
15
15
  id: string;
16
+ occurrenceId?: string;
16
17
  startTime: number;
18
+ subClipIds?: string[];
17
19
  }
20
+ export type TimelineMarker = IComment & {
21
+ occurrenceId: string;
22
+ };
18
23
  export type EnterPointRangeModePayload = {
19
24
  endTime?: number;
20
25
  startTime?: number;
@@ -206,6 +211,13 @@ export type Context = {
206
211
  fire: () => void;
207
212
  onFired: (handler: () => void) => () => void;
208
213
  };
214
+ /**
215
+ * What is on screen changed. Carries nothing - the values live on the annotation layer.
216
+ * Outbound only: listeners take the composed `cx-video-active-subclip-change` DOM event.
217
+ */
218
+ activeSubClipChangeEvent: {
219
+ fire: () => void;
220
+ };
209
221
  assetsSelected: {
210
222
  onFired: (handler: (args: any) => void) => () => void;
211
223
  };
@@ -1,6 +1,7 @@
1
1
  import { default as CxButton } from '../../../../../atoms/src/components/button/button.ts';
2
2
  import { default as CxDetails } from '../../../../../atoms/src/components/details/details.ts';
3
3
  import { default as CxIcon } from '../../../../../atoms/src/components/icon/icon.ts';
4
+ import { default as CxLineClamp } from '../../../../../atoms/src/components/line-clamp/line-clamp.ts';
4
5
  import { default as CxSpace } from '../../../../../atoms/src/components/space/space.ts';
5
6
  import { default as CxSpinner } from '../../../../../atoms/src/components/spinner/spinner.ts';
6
7
  import { default as CxTree } from '../../../../../atoms/src/components/tree/tree.ts';
@@ -20,6 +21,7 @@ export default class CxFacetedFilterFacet extends CortexElement {
20
21
  'cx-button': typeof CxButton;
21
22
  'cx-details': typeof CxDetails;
22
23
  'cx-icon': typeof CxIcon;
24
+ 'cx-line-clamp': typeof CxLineClamp;
23
25
  'cx-space': typeof CxSpace;
24
26
  'cx-spinner': typeof CxSpinner;
25
27
  'cx-tree': typeof CxTree;
@@ -34,6 +34,8 @@ export default class CxFolderSelectTree extends CortexElement {
34
34
  extraFolderData: Folder | null;
35
35
  api?: FolderSelectApi;
36
36
  excludeVirtualFolders: boolean;
37
+ /** Refetches a folder's children on every expand, not just the first. */
38
+ reloadOnExpand: boolean;
37
39
  firstFetchCallback: ((data: Folder[]) => void) | null;
38
40
  autoPageSize: boolean;
39
41
  data: Folder[];
@@ -63,6 +63,8 @@ export default class CxFolderSelectTreeItem extends CortexElement {
63
63
  searchTerm: string;
64
64
  api?: FolderSelectApi;
65
65
  excludeVirtualFolders: boolean;
66
+ /** Refetches the children on every expand, not just the first. */
67
+ reloadOnExpand: boolean;
66
68
  url: string;
67
69
  /** Overrides the default `folder` icon name when set. */
68
70
  icon: string;
@@ -100,6 +102,7 @@ export default class CxFolderSelectTreeItem extends CortexElement {
100
102
  }): Promise<GetFolderResponse>;
101
103
  loadMore(event: MouseEvent): Promise<void>;
102
104
  private handleLazyLoad;
105
+ private handleAfterCollapse;
103
106
  /**
104
107
  * Recompute this tree-item's selected/indeterminate state from the
105
108
  * top-level selection set, purely declaratively. This lets us:
@@ -41,6 +41,8 @@ export default class CxFolderSelect extends CortexElement {
41
41
  required: boolean;
42
42
  form: string | HTMLElement | undefined;
43
43
  excludeVirtualFolders: boolean;
44
+ /** Refetches a folder's children on every expand, not just the first. */
45
+ reloadOnExpand: boolean;
44
46
  extraFolderId: string;
45
47
  extraFolderTitle: string;
46
48
  extraFolderIcon: string;
@@ -6,7 +6,7 @@ import { FileProgressUpdatedEvent } from '../models';
6
6
  import { FileStateChangedEvent } from '../models/DownloadFile';
7
7
  import { IDownloadChunksRepository, IDownloadFilesRepository, IDownloadTransactionsRepository } from '../repositories';
8
8
  import { IStorage } from '../storage';
9
- import { ILocker, ILogger, IRetrier } from '../utilities';
9
+ import { ILocker, ILogger, IRetrier, IUserPromptService } from '../utilities';
10
10
  import { DownloadDatabase } from './db';
11
11
  import { GetFileQuery, ListAllFilesQuery } from './queries';
12
12
  export type Constructor<T> = new (...args: any[]) => T;
@@ -79,12 +79,13 @@ export declare class DownloadManager implements IDownloadManager {
79
79
  readonly logger: ILogger;
80
80
  readonly retrier: IRetrier;
81
81
  readonly locker: ILocker;
82
+ readonly userPromptService: IUserPromptService;
82
83
  private started;
83
84
  private backgroundJobs;
84
85
  private backgroundJobsStartTimeouts;
85
86
  private rocketModeEnabled;
86
87
  private databaseDiscarded;
87
- constructor(context: DownloadContext, downloadDatabase: DownloadDatabase, downloadTransactionsRepo: IDownloadTransactionsRepository, downloadFilesRepo: IDownloadFilesRepository, downloadChunksRepo: IDownloadChunksRepository, downloadApiClient: IDownloadApiClient, storage: IStorage, eventHub: IEventHub, logger: ILogger, retrier: IRetrier, locker: ILocker);
88
+ constructor(context: DownloadContext, downloadDatabase: DownloadDatabase, downloadTransactionsRepo: IDownloadTransactionsRepository, downloadFilesRepo: IDownloadFilesRepository, downloadChunksRepo: IDownloadChunksRepository, downloadApiClient: IDownloadApiClient, storage: IStorage, eventHub: IEventHub, logger: ILogger, retrier: IRetrier, locker: ILocker, userPromptService: IUserPromptService);
88
89
  handleCookiesRejected(): void;
89
90
  handleCookiesAccepted(): Promise<void>;
90
91
  private setupBackgroundJobs;
@@ -129,6 +130,7 @@ export declare class DownloadManagerBuilder {
129
130
  logger?: ILogger;
130
131
  retrier?: IRetrier;
131
132
  locker?: ILocker;
133
+ userPromptService?: IUserPromptService;
132
134
  database?: DownloadDatabase;
133
135
  constructor(context?: DownloadContext);
134
136
  build(): DownloadManager;
@@ -1,5 +1,6 @@
1
1
  import { DatabaseLocker } from './DatabaseLocker';
2
2
  import { ConsoleLogger } from './Logger';
3
3
  import { Retrier } from './Retrier';
4
+ import { UserPromptService } from './UserPromptService';
4
5
  import { WebLocker } from './WebLocker';
5
- export { Retrier, ConsoleLogger, DatabaseLocker, WebLocker };
6
+ export { ConsoleLogger, DatabaseLocker, Retrier, UserPromptService, WebLocker };
@@ -11,6 +11,16 @@ export declare class FilePathFixer {
11
11
  };
12
12
  constructor(storage: IStorage, userPromptService: IUserPromptService, logger: ILogger);
13
13
  shouldFixPath(file: DownloadFile): Promise<boolean>;
14
+ /**
15
+ * Checks if a file path contains any invalid characters
16
+ * across macOS, Linux, and Windows.
17
+ */
18
+ private hasInvalidPathChars;
19
+ /**
20
+ * Replaces all path-invalid characters from a file path string,
21
+ * supporting macOS, Linux, and Windows.
22
+ */
23
+ sanitizeFilePath(filePath: string, replacement?: string): string;
14
24
  private truncatePath;
15
25
  tryFixPath(file: DownloadFile, invalidPaths: string[]): Promise<void>;
16
26
  }
@@ -9,7 +9,7 @@ export type GetContentResponse = {
9
9
  }>;
10
10
  totalCount: number;
11
11
  };
12
- export declare function apiGetFolders({ allowedFolders, baseUrl, bearerToken, excludeVirtualFolders, folderId, includeDirectChild, limit, searchTerm, self, start, token, }: GetFolderRequest): Promise<GetFolderResponse>;
12
+ export declare function apiGetFolders({ allowedFolders, baseUrl, bearerToken, excludeVirtualFolders, folderId, includeDirectChild, limit, noCache, searchTerm, self, start, token, }: GetFolderRequest): Promise<GetFolderResponse>;
13
13
  export type GetCollectionsRequest = {
14
14
  baseUrl?: string;
15
15
  bearerToken?: string;
@@ -5,6 +5,10 @@ export type GetExtensionsOptions = {
5
5
  * Only applies when **`featLink`** is true. Default true.
6
6
  */
7
7
  autolink?: boolean;
8
+ /** Inline style a new table starts with. Default `'width: 100%;'`. */
9
+ defaultTableStyle?: string;
10
+ /** Shows the drag handle that selects the whole table. Default false. */
11
+ enableTableDragHandle?: boolean;
8
12
  /** When false, the `anchor` node is omitted. Default true. */
9
13
  featAnchor?: boolean;
10
14
  /** When false, the `codeBlock` node extension is omitted. Default true. */
@@ -55,7 +59,9 @@ export type GetExtensionsOptions = {
55
59
  };
56
60
  /** When true, empty `<p>` nodes serialize as `<p>&nbsp;</p>` via a NodeView-backed paragraph extension. Default false. */
57
61
  serializeEmptyParagraphAsNbsp?: boolean;
62
+ /** Class stamped on every rendered table, on top of the author's own. Default `''` (none). */
63
+ tableClass?: string;
58
64
  /** When true, unsupported wrapper tags from pasted HTML are lifted while preserving supported child content. Default false. */
59
65
  unwrapUnsupportedHtmlWrappers?: boolean;
60
66
  };
61
- export default function getExtensions({ autolink, featAnchor, featCodeBlock, featFindAndReplace, featFontFamily, featFontSize, featImage, featImageCaption, featLineHeight, featLink, featList, featSuggestion, featTable, featTextColor, featVideo, featVideoPoster, image, openSearchPopup, placeholder, serializeEmptyParagraphAsNbsp, unwrapUnsupportedHtmlWrappers, }: GetExtensionsOptions): (import('@tiptap/core').Mark<any, any> | import('@tiptap/core').Node<any, any> | import('@tiptap/core').Extension<any, any>)[];
67
+ export default function getExtensions({ autolink, defaultTableStyle, enableTableDragHandle, featAnchor, featCodeBlock, featFindAndReplace, featFontFamily, featFontSize, featImage, featImageCaption, featLineHeight, featLink, featList, featSuggestion, featTable, featTextColor, featVideo, featVideoPoster, image, openSearchPopup, placeholder, serializeEmptyParagraphAsNbsp, tableClass, unwrapUnsupportedHtmlWrappers, }: GetExtensionsOptions): (import('@tiptap/core').Mark<any, any> | import('@tiptap/core').Node<any, any> | import('@tiptap/core').Extension<any, any>)[];
@@ -0,0 +1,9 @@
1
+ import { EditorState } from '@tiptap/pm/state';
2
+ /**
3
+ * The link the caret is on, counting both edges as the legacy editor did (`isActive('link')` is
4
+ * true only strictly between them). Shared with the `link--active` decoration so both agree. (426ODZ)
5
+ */
6
+ export default function activeLinkRange(state: EditorState): {
7
+ from: number;
8
+ to: number;
9
+ } | null;
@@ -1,4 +1,16 @@
1
- export declare const Table: import('@tiptap/core').Node<import('@tiptap/extension-table').TableOptions, any>;
1
+ import { TableOptions } from '@tiptap/extension-table';
2
+ /** Inline style a new table starts with when the host does not pass its own. */
3
+ export declare const DEFAULT_TABLE_STYLE = "width: 100%;";
4
+ interface CortexTableOptions extends TableOptions {
5
+ /** Inline style a new table starts with. */
6
+ defaultTableStyle: string;
7
+ /** Shows the drag handle that selects the whole table. Off by default; the legacy editor had none. */
8
+ enableTableDragHandle: boolean;
9
+ /** Class stamped on every rendered table, on top of the author's own. Empty forces none. */
10
+ tableClass: string;
11
+ }
12
+ export declare const Table: import('@tiptap/core').Node<CortexTableOptions, any>;
2
13
  export declare const TableRow: import('@tiptap/core').Node<any, any>;
3
14
  export declare const TableHeader: import('@tiptap/core').Node<any, any>;
4
15
  export declare const TableCell: import('@tiptap/core').Node<any, any>;
16
+ export {};
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Turns the editor's serialization into HTML meant to be published — stored, shown by a viewer, or
3
+ * sent as email. Each step undoes something true only inside the editor. Editor-only *styling*
4
+ * does not belong here: stop the editor rendering differently instead of writing the difference
5
+ * into stored content.
6
+ */
7
+ /**
8
+ * `<li><p>x</p></li>` becomes `<li>x</li>`, as the legacy editor wrote it. The paragraph is an
9
+ * artifact of the model — a node cannot hold inline content and a nested list at once — and it
10
+ * picks up the host's `p { margin-block-end }`, spacing items far wider than in the editor.
11
+ */
12
+ export declare function flattenListItemParagraphs(root: ParentNode): void;
13
+ export declare function toPublishedHtml(html: string): string;
14
+ export default toPublishedHtml;
@@ -32,6 +32,7 @@ export type GetFolderRequest = {
32
32
  folderId: string;
33
33
  includeDirectChild?: boolean;
34
34
  limit?: number;
35
+ noCache?: boolean;
35
36
  searchTerm?: string;
36
37
  seeThru?: boolean;
37
38
  self?: boolean;
@@ -64,3 +64,13 @@ export type SuggestionConfig = {
64
64
  fieldExternalId?: string;
65
65
  options?: unknown;
66
66
  };
67
+ /** Dialogs the rich-text toolbar owns; each is rendered only once the user first opens it. */
68
+ export declare enum RichTextToolbarDialog {
69
+ Anchor = "anchor",
70
+ Image = "image",
71
+ Link = "link",
72
+ SpecialCharacters = "special-characters",
73
+ Table = "table",
74
+ TableCell = "table-cell",
75
+ Video = "video"
76
+ }
@@ -2700,6 +2700,16 @@ export interface ValidationSummary {
2700
2700
  invalidCellCount: number;
2701
2701
  invalidCells: ICellComponent[];
2702
2702
  }
2703
+ /** Detail of `cx-table-validation-change`. */
2704
+ export interface TableValidationChangeDetail extends ValidationSummary {
2705
+ /**
2706
+ * True when `invalidCellCount` covers the whole dataset and its validation has
2707
+ * finished. False for running progress while a paginated `dataUrl` file is still
2708
+ * being validated chunk by chunk, and for summaries scoped to the rows currently
2709
+ * loaded in the table (the page on screen) in that same mode.
2710
+ */
2711
+ complete: boolean;
2712
+ }
2703
2713
  export type ColumnSorterParamLookupFunction = (column: IColumnComponent, dir: SortDirection) => Record<string, unknown>;
2704
2714
  export type ColumnLookup = IColumn | IColumnComponent | ColumnDefinition | HTMLElement | string;
2705
2715
  export type RowLookup = IRow | IRowComponent | HTMLElement | string | number;
@@ -6638,6 +6638,10 @@
6638
6638
  *
6639
6639
  */
6640
6640
  excludeVirtualFolders?: boolean;
6641
+ /**
6642
+ * Refetches a folder's children on every expand, not just the first.
6643
+ */
6644
+ reloadOnExpand?: boolean;
6641
6645
  /**
6642
6646
  *
6643
6647
  */
@@ -11431,7 +11435,7 @@
11431
11435
  /**
11432
11436
  *
11433
11437
  */
11434
- comments?: { "createUserId": string; "editTimestamp": number; "endTime": number; "id": string; "startTime": number; }[];
11438
+ comments?: { "createUserId": string; "editTimestamp": number; "endTime": number; "id": string; "occurrenceId": string; "startTime": number; "subClipIds": string[]; }[];
11435
11439
  /**
11436
11440
  *
11437
11441
  */
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@orangelogic/design-system",
3
3
  "type": "module",
4
- "version": "4.18.0",
4
+ "version": "4.20.0",
5
5
  "license": "UNLICENSED",
6
6
  "types": "library/types.d.ts",
7
7
  "scripts": {
@@ -1 +0,0 @@
1
- declare module 'react-range-slider-input';