@lax-wp/editor 0.3.15 → 0.3.17

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.
@@ -1,13 +1,11 @@
1
1
  import { type DetectionConfig } from "@/constants/sidebar";
2
- import { type ScanDocumentResult } from "@/config/EditorConfig";
3
2
  export interface PIIScanResultsProps {
4
3
  detectionConfigs: DetectionConfig[];
5
- scanResult?: ScanDocumentResult;
6
4
  onClose?: () => void;
7
5
  onSettings?: () => void;
8
- onApply?: (selectedReplacements: string[]) => void;
6
+ onApply?: (selectedReplacements: string[], unselectedReplacements: string[]) => void;
9
7
  onRevealStart?: () => void;
10
8
  onRevealEnd?: () => void;
11
9
  onRevertAnonymization?: () => void;
12
10
  }
13
- export declare const PIIScanResults: ({ detectionConfigs, scanResult, onClose, onApply, onRevertAnonymization }: PIIScanResultsProps) => import("react/jsx-runtime").JSX.Element;
11
+ export declare const PIIScanResults: ({ detectionConfigs, onClose, onApply, onRevertAnonymization }: PIIScanResultsProps) => import("react/jsx-runtime").JSX.Element;
@@ -1,6 +1,17 @@
1
1
  import type { Editor } from "@tiptap/react";
2
2
  import type { ApiTagEntry } from "@/config/EditorConfig";
3
3
  export declare function setShowValue(editor: Editor, showValue: boolean, filter?: Set<string>): void;
4
+ /**
5
+ * Replace `anonymizedLink` marks in the document with the editor's default
6
+ * `link` mark. The restored `href` is the original URL stored in
7
+ * `anonymizedData[0].value` (falling back to the mark's `href` attr if the
8
+ * value is missing). `target` / `rel` / `class` are carried over so the
9
+ * resulting link preserves its formatting while PII metadata is dropped.
10
+ *
11
+ * If `filter` is provided, only marks whose `anonymizedVariable` is in the
12
+ * set are reverted. No-op if either mark type is missing from the schema.
13
+ */
14
+ export declare function revertAnonymizedLinksToLinks(editor: Editor, filter?: Set<string>): void;
4
15
  export declare function revertToPlainText(editor: Editor, filter?: Set<string>): void;
5
16
  export declare function buildTagsFromEditor(editor: Editor): Record<string, ApiTagEntry[]>;
6
17
  export type AnonymizedVariableRevealState = 'placeholder' | 'revealed';
@@ -59,6 +59,9 @@ export interface ScanDocumentResult {
59
59
  * - For `placeholderFormat === "descriptive"`, strips the `[` / `]` brackets
60
60
  * from placeholder tokens so the chip shows e.g. `PERSON_A_NAME` not
61
61
  * `[PERSON_A_NAME]`.
62
+ * - Normalises `anonymizedLink` marks: when `showValue: true`, the mark is
63
+ * rewritten to the standard `link` mark (using the original URL stored in
64
+ * `anonymizedData[0].value`) so it behaves identically to a default link.
62
65
  */
63
66
  export declare function normalizeAnonymizationApiResponse(jsonContent: Record<string, unknown>, placeholderFormat?: string): Record<string, unknown>;
64
67
  /** Payload for Save Changes (PII anonymization settings). Passed to onSaveAnonymizationSettings. */
@@ -159,8 +162,6 @@ export interface EditorConfig {
159
162
  settings?: PiiDetectionConfig;
160
163
  onSaveAnonymizationSettings?: (payload: AnonymizationSavePayload) => void;
161
164
  onScanDocument?: (json: Record<string, unknown>) => Promise<ScanDocumentResult | void>;
162
- tags?: Record<string, ApiTagEntry[]>;
163
- onApplyAnonymization?: (document: Record<string, unknown>) => void;
164
165
  onRevertAnonymization?: () => void;
165
166
  onAnonymizeDocument?: () => void;
166
167
  isAnonymized?: boolean;
@@ -187,5 +188,14 @@ export interface EditorConfig {
187
188
  tableType: string;
188
189
  headerIds: string[];
189
190
  }) => void;
191
+ /**
192
+ * Fires when the in-app edit mode changes (toolbar). Use this to update `mode` in
193
+ * your parent state so {@link isCollaborativeEditingActive} and collaboration stay in sync.
194
+ */
195
+ onEditModeChange?: (mode: TEditorMode) => void;
190
196
  }
197
+ /**
198
+ * Yjs collaboration + caret extensions should not load in view / read-only modes.
199
+ */
200
+ export declare function isCollaborativeEditingActive(config?: EditorConfig): boolean;
191
201
  export declare const defaultEditorConfig: EditorConfig;
@@ -0,0 +1,62 @@
1
+ import { Mark } from '@tiptap/core';
2
+ import type { AnonymizedDataItem } from './AnonymizedText';
3
+ export interface AnonymizedLinkOptions {
4
+ /** HTML attributes to add to the rendered <a> element. */
5
+ HTMLAttributes: Record<string, unknown>;
6
+ /** If true, clicking a link in a non-editable view opens the href in a new tab. */
7
+ openOnClick: boolean;
8
+ }
9
+ declare module '@tiptap/core' {
10
+ interface Commands<ReturnType> {
11
+ anonymizedLink: {
12
+ /**
13
+ * Set an anonymizedLink mark on the current selection.
14
+ */
15
+ setAnonymizedLink: (attributes: {
16
+ href: string;
17
+ target?: string | null;
18
+ rel?: string | null;
19
+ class?: string | null;
20
+ anonymizedData?: AnonymizedDataItem[] | string | null;
21
+ showValue?: boolean | null;
22
+ }) => ReturnType;
23
+ /**
24
+ * Remove the anonymizedLink mark from the current selection.
25
+ */
26
+ unsetAnonymizedLink: () => ReturnType;
27
+ };
28
+ }
29
+ }
30
+ /**
31
+ * AnonymizedLink Mark
32
+ *
33
+ * Renders anonymized URLs as regular `<a>` elements while preserving the
34
+ * original value inside the mark's `anonymizedData` attribute. It mirrors the
35
+ * behaviour of the default Tiptap `link` mark (href / target / rel / class)
36
+ * and adds the PII-specific `anonymizedData` + `showValue` attributes used by
37
+ * the anonymization pipeline.
38
+ *
39
+ * Accepts the following JSON shape:
40
+ * ```json
41
+ * {
42
+ * "type": "text",
43
+ * "text": "arrived",
44
+ * "marks": [{
45
+ * "type": "anonymizedLink",
46
+ * "attrs": {
47
+ * "href": "https://google.com/",
48
+ * "target": "_blank",
49
+ * "rel": "noopener noreferrer nofollow",
50
+ * "class": null,
51
+ * "anonymizedData": [{ "anonymizedVariable": "URL 3", "value": "https://google.com/" }],
52
+ * "showValue": false
53
+ * }
54
+ * }]
55
+ * }
56
+ * ```
57
+ *
58
+ * The mark coexists with the default `link` mark: only `<a>` elements tagged
59
+ * with `data-anon-link` (or a `data-anon-data` payload) parse into this mark,
60
+ * so plain links continue to be handled by the Link extension.
61
+ */
62
+ export declare const AnonymizedLink: Mark<AnonymizedLinkOptions, any>;
@@ -1,5 +1,5 @@
1
- import type { EditorConfig } from "@/config/EditorConfig";
2
- export declare const EditorExtensions: (config?: EditorConfig) => (import("@tiptap/core").Node<import("@tiptap/extension-list").OrderedListOptions, any> | import("@tiptap/core").Node<import("@tiptap/extension-list").TaskItemOptions, any> | import("@tiptap/core").Extension<import("@/extensions/AIAutoCompletion").AIAutocompletionOptions, any> | import("@tiptap/core").Extension<any, any> | import("@tiptap/core").Extension<import("./Indent").IndentOptions, any> | import("@tiptap/core").Node<import("./ListItemWithDepthLimit").ListItemOptions, any> | import("@tiptap/core").Extension<import("./Redline").RedlineOptions, any> | import("@tiptap/core").Node<import("@tiptap/extension-table").TableOptions, any> | import("@tiptap/core").Node<import("@tiptap/extension-table").TableRowOptions, any> | import("@tiptap/core").Node<import("./VariableText").VariableOptions, any> | import("@tiptap/core").Node<import("@tiptap/extension-horizontal-rule").HorizontalRuleOptions, any> | import("@tiptap/core").Node<import("./CodeBlockWithToolbar").CodeBlockWithToolbarOptions, any> | import("@tiptap/core").Extension<import("./PageMargin").PageMarginOptions, any> | import("@tiptap/core").Extension<import("./PageBackground").PageBackgroundOptions, any> | import("@tiptap/core").Node<import("./PageBreak").PageBreakOptions, any> | import("@tiptap/core").Node<any, any> | import("@tiptap/core").Node<import("./CustomImageExtension").CustomImageExtensionOptions, any> | import("@tiptap/core").Node<import("./Signature").SignatureOptions, any> | import("@tiptap/core").Node<import("./AnonymizedText").AnonymizedTextOptions, any> | import("@tiptap/core").Extension<import("@tiptap/extensions").UndoRedoOptions, any> | import("@tiptap/core").Extension<import("@tiptap/extensions").CharacterCountOptions, import("@tiptap/extensions").CharacterCountStorage> | import("@tiptap/core").Extension<import("@tiptap/extensions").PlaceholderOptions, any> | import("@tiptap/core").Extension<import("@tiptap/extension-typography").TypographyOptions, any> | import("@tiptap/core").Mark<import("@tiptap/extension-text-style").TextStyleOptions, any> | import("@tiptap/core").Extension<import("@tiptap/extension-text-style").FontSizeOptions, any> | import("@tiptap/core").Mark<import("@tiptap/extension-superscript").SuperscriptExtensionOptions, any> | import("@tiptap/core").Mark<import("@tiptap/extension-highlight").HighlightOptions, any> | import("@tiptap/core").Node<import("@tiptap/extension-list").TaskListOptions, any> | import("@tiptap/core").Extension<import("@tiptap/extension-text-align").TextAlignOptions, any> | import("@tiptap/core").Node<import("@tiptap/extension-heading").HeadingOptions, any> | import("@tiptap/core").Mark<import("@tiptap/extension-link").LinkOptions, any> | import("@tiptap/core").Node<import("@tiptap/extension-hard-break").HardBreakOptions, any> | import("@tiptap/core").Extension<import("@tiptap/extensions").TrailingNodeOptions, any> | import("@tiptap/core").Extension<import("@tiptap/extension-collaboration").CollaborationOptions, import("@tiptap/extension-collaboration").CollaborationStorage> | import("@tiptap/core").Extension<import("@tiptap/extension-collaboration-caret").CollaborationCaretOptions, {
1
+ import { type EditorConfig } from "@/config/EditorConfig";
2
+ export declare const EditorExtensions: (config?: EditorConfig) => (import("@tiptap/core").Node<import("@tiptap/extension-list").OrderedListOptions, any> | import("@tiptap/core").Node<import("@tiptap/extension-list").TaskItemOptions, any> | import("@tiptap/core").Extension<import("@/extensions/AIAutoCompletion").AIAutocompletionOptions, any> | import("@tiptap/core").Extension<any, any> | import("@tiptap/core").Extension<import("./Indent").IndentOptions, any> | import("@tiptap/core").Node<import("./ListItemWithDepthLimit").ListItemOptions, any> | import("@tiptap/core").Extension<import("./Redline").RedlineOptions, any> | import("@tiptap/core").Node<import("@tiptap/extension-table").TableOptions, any> | import("@tiptap/core").Node<import("@tiptap/extension-table").TableRowOptions, any> | import("@tiptap/core").Node<import("./VariableText").VariableOptions, any> | import("@tiptap/core").Node<import("@tiptap/extension-horizontal-rule").HorizontalRuleOptions, any> | import("@tiptap/core").Node<import("./CodeBlockWithToolbar").CodeBlockWithToolbarOptions, any> | import("@tiptap/core").Extension<import("./PageMargin").PageMarginOptions, any> | import("@tiptap/core").Extension<import("./PageBackground").PageBackgroundOptions, any> | import("@tiptap/core").Node<import("./PageBreak").PageBreakOptions, any> | import("@tiptap/core").Node<any, any> | import("@tiptap/core").Node<import("./CustomImageExtension").CustomImageExtensionOptions, any> | import("@tiptap/core").Node<import("./Signature").SignatureOptions, any> | import("@tiptap/core").Node<import("./AnonymizedText").AnonymizedTextOptions, any> | import("@tiptap/core").Mark<import("./AnonymizedLink").AnonymizedLinkOptions, any> | import("@tiptap/core").Extension<import("@tiptap/extensions").UndoRedoOptions, any> | import("@tiptap/core").Extension<import("@tiptap/extensions").CharacterCountOptions, import("@tiptap/extensions").CharacterCountStorage> | import("@tiptap/core").Extension<import("@tiptap/extensions").PlaceholderOptions, any> | import("@tiptap/core").Extension<import("@tiptap/extension-typography").TypographyOptions, any> | import("@tiptap/core").Mark<import("@tiptap/extension-text-style").TextStyleOptions, any> | import("@tiptap/core").Extension<import("@tiptap/extension-text-style").FontSizeOptions, any> | import("@tiptap/core").Mark<import("@tiptap/extension-superscript").SuperscriptExtensionOptions, any> | import("@tiptap/core").Mark<import("@tiptap/extension-highlight").HighlightOptions, any> | import("@tiptap/core").Node<import("@tiptap/extension-list").TaskListOptions, any> | import("@tiptap/core").Extension<import("@tiptap/extension-text-align").TextAlignOptions, any> | import("@tiptap/core").Node<import("@tiptap/extension-heading").HeadingOptions, any> | import("@tiptap/core").Mark<import("@tiptap/extension-link").LinkOptions, any> | import("@tiptap/core").Node<import("@tiptap/extension-hard-break").HardBreakOptions, any> | import("@tiptap/core").Extension<import("@tiptap/extensions").TrailingNodeOptions, any> | import("@tiptap/core").Extension<import("@tiptap/extension-collaboration").CollaborationOptions, import("@tiptap/extension-collaboration").CollaborationStorage> | import("@tiptap/core").Extension<import("@tiptap/extension-collaboration-caret").CollaborationCaretOptions, {
3
3
  users: {
4
4
  clientId: number;
5
5
  [key: string]: any;