@a3s-lab/office 0.28.0 → 0.29.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 (41) hide show
  1. package/README.md +27 -1
  2. package/dist/0~1403.js +1 -1
  3. package/dist/0~4980.js +1 -1
  4. package/dist/0~5093.js +64 -5
  5. package/dist/0~7043.js +241 -241
  6. package/dist/0~7048.js +1 -1
  7. package/dist/0~7614.js +1 -1
  8. package/dist/0~document-editor.js +433 -10
  9. package/dist/0~presentation-editor.js +1 -1
  10. package/dist/0~spreadsheet-editor.js +1 -2
  11. package/dist/0~work-docx-export.js +141 -3
  12. package/dist/0~work-docx-import.js +5 -3
  13. package/dist/0~work-office-diagnostics.js +46 -3
  14. package/dist/0~work-pptx-export.js +1 -1
  15. package/dist/0~work-pptx-import.js +1 -1
  16. package/dist/0~work-presentation-charts.js +1 -1
  17. package/dist/1544.js +1 -1
  18. package/dist/4104.js +2 -2
  19. package/dist/4121.js +1510 -0
  20. package/dist/6282.js +59 -684
  21. package/dist/8715.js +1 -1
  22. package/dist/core.js +1 -1
  23. package/dist/index.js +1 -1
  24. package/dist/internal/features/work/editors/document-command-catalog.d.ts +9 -0
  25. package/dist/internal/features/work/editors/document-font-dialog-model.d.ts +5 -2
  26. package/dist/internal/features/work/editors/document-font-dialog-run-border-model.d.ts +24 -0
  27. package/dist/internal/features/work/editors/document-font-dialog-run-border-section.d.ts +10 -0
  28. package/dist/internal/features/work/work-document-character-formatting.d.ts +4 -0
  29. package/dist/internal/features/work/work-document-format-changes.d.ts +1 -0
  30. package/dist/internal/features/work/work-document-run-border.d.ts +11 -0
  31. package/dist/internal/features/work/work-document-word-line-metrics.d.ts +1 -0
  32. package/dist/internal/features/work/work-docx-run-border-diagnostics.d.ts +3 -0
  33. package/dist/internal/features/work/work-docx-run-border-export.d.ts +17 -0
  34. package/dist/internal/features/work/work-docx-run-border.d.ts +20 -0
  35. package/dist/internal/features/work/work-docx-run-formatting-import.d.ts +2 -0
  36. package/dist/office-kernel.wasm +0 -0
  37. package/dist/styles.css +31 -0
  38. package/docs/latest/en/browser-editor-architecture.md +22 -0
  39. package/package.json +4 -1
  40. package/dist/5184.js +0 -662
  41. package/dist/9424.js +0 -16
package/dist/8715.js CHANGED
@@ -1,4 +1,4 @@
1
- import { createOfficeId as createWorkId, directChild, attribute } from "./5184.js";
1
+ import { createOfficeId as createWorkId, directChild, attribute } from "./4121.js";
2
2
  const CELL_REFERENCE = /\$?([A-Z]{1,3})\$?([1-9]\d*)/i;
3
3
  const CELL_OR_RANGE = new RegExp(`^${CELL_REFERENCE.source}(?::${CELL_REFERENCE.source})?$`, 'i');
4
4
  const COLUMN_RANGE = /^\$?([A-Z]{1,3}):\$?([A-Z]{1,3})$/i;
package/dist/core.js CHANGED
@@ -3,7 +3,7 @@ export { AGENT_PROPOSAL_PROTOCOL, OFFICE_NOTIFICATION_EVENT, createAgentProposal
3
3
  export { DOCUMENT_SNAPSHOT_MEDIA_TYPE, DOCUMENT_SNAPSHOT_SCHEMA, DOCUMENT_SNAPSHOT_VERSION, DOCUMENT_SOURCE_MEDIA_TYPE, DOCUMENT_SOURCE_SCHEMA, DOCUMENT_SOURCE_VERSION, OFFICE_COLLABORATION_DEFAULT_MAX_TRANSPORT_PAYLOAD_BYTES, OFFICE_COLLABORATION_MAX_TRANSPORT_PAYLOAD_BYTES, OFFICE_COLLABORATION_PRESENCE_FIELD, OFFICE_FILE_ACCEPT, applyDocumentSource, artifactExtension, artifactExtension as workArtifactExtension, artifactKindLabel, artifactKindLabel as workArtifactKindLabel, createArtifactBlob, createOfficeCollaborationPresence, createOfficeCollaborationTransportBinding, createPdfCollaborationContent, decodeDocumentSnapshot, defaultPptxRuntimeUrl, downloadArtifact, downloadArtifactPdf, encodeDocumentSnapshot, forgetSourceBlob, importOfficeFile, officeKindForFile, pdfPagesForExport, projectDocumentSource, readSourceBlob, registerSourceBlob } from "./4104.js";
4
4
  export { OFFICE_COLLABORATION_NAMESPACE, OFFICE_COLLABORATION_PROTOCOL, OfficeCollaborationError, createOfficeCollaborationSession, readOfficeCollaborationMetadata } from "./9787.js";
5
5
  export { assertPdfCollaborationSource, createOfficePdfCollaborationBinding, initializeOfficePdfCollaboration, readOfficePdfCollaboration, readOfficePdfCollaborationSource, replaceOfficePdfCollaboration } from "./3818.js";
6
- export { createArtifact, createOfficeId, officeTemplates } from "./5184.js";
6
+ export { createArtifact, createOfficeId, officeTemplates } from "./4121.js";
7
7
  export { createOfficeDocumentCollaborationBinding, initializeOfficeDocumentCollaboration, officeDocumentCollaborationFragment, readOfficeDocumentCollaboration } from "./6282.js";
8
8
  export { createOfficeMarkdownCollaborationBinding, initializeOfficeMarkdownCollaboration, readOfficeMarkdownCollaboration, replaceOfficeMarkdownCollaboration } from "./2591.js";
9
9
  export { createOfficePresentationCollaborationBinding, initializeOfficePresentationCollaboration, readOfficePresentationCollaboration, replaceOfficePresentationCollaboration } from "./4560.js";
package/dist/index.js CHANGED
@@ -6,7 +6,7 @@ export { DOCUMENT_SNAPSHOT_MEDIA_TYPE, DOCUMENT_SNAPSHOT_SCHEMA, DOCUMENT_SOURCE
6
6
  export { DocumentEditor, MarkdownEditor, PDF_EVIDENCE_COORDINATE_BASIS, PdfViewer, PresentationEditor, SpreadsheetEditor, defaultDocumentArabicLayoutFontUrl, defaultDocumentHebrewLayoutFontUrl, defaultDocumentLatinLayoutFontUrl, defaultDocumentLayoutFontUrl, defaultDocumentLayoutFonts, defaultOfficeKernelWasmUrl, defaultPdfiumWasmUrl, preloadOfficeEditor } from "./432.js";
7
7
  export { OFFICE_COLLABORATION_NAMESPACE, OFFICE_COLLABORATION_PROTOCOL, OfficeCollaborationError, createOfficeCollaborationSession, readOfficeCollaborationMetadata } from "./9787.js";
8
8
  export { assertPdfCollaborationSource, createOfficePdfCollaborationBinding, initializeOfficePdfCollaboration, readOfficePdfCollaboration, readOfficePdfCollaborationSource, replaceOfficePdfCollaboration } from "./3818.js";
9
- export { createArtifact, createOfficeId, officeTemplates } from "./5184.js";
9
+ export { createArtifact, createOfficeId, officeTemplates } from "./4121.js";
10
10
  export { createOfficeDocumentCollaborationBinding, initializeOfficeDocumentCollaboration, officeDocumentCollaborationFragment, readOfficeDocumentCollaboration } from "./6282.js";
11
11
  export { createOfficeMarkdownCollaborationBinding, initializeOfficeMarkdownCollaboration, readOfficeMarkdownCollaboration, replaceOfficeMarkdownCollaboration } from "./2591.js";
12
12
  export { createOfficePresentationCollaborationBinding, initializeOfficePresentationCollaboration, readOfficePresentationCollaboration, replaceOfficePresentationCollaboration } from "./4560.js";
@@ -333,6 +333,15 @@ export declare const documentCommandCatalog: {
333
333
  readonly editor: readonly ["Mod-Shift-h"];
334
334
  };
335
335
  };
336
+ readonly runBorder: {
337
+ readonly id: "font.runBorder";
338
+ readonly label: "字符边框";
339
+ readonly location: {
340
+ readonly area: "ribbon";
341
+ readonly tab: "home";
342
+ readonly group: "font";
343
+ };
344
+ };
336
345
  readonly clearFormatting: {
337
346
  readonly id: "font.clearFormatting";
338
347
  readonly label: "清除格式";
@@ -1,6 +1,7 @@
1
1
  import type { Editor } from '@tiptap/core';
2
2
  import { type WorkDocumentEmphasisMark } from '../work-document-emphasis';
3
3
  import { type DocumentFontDialogScriptFontPatch, type DocumentFontFamilySource } from './document-font-dialog-script-font-model';
4
+ import { type DocumentFontDialogRunBorderDraft, type DocumentFontDialogRunBorderPatch, type DocumentFontDialogRunBorderSource } from './document-font-dialog-run-border-model';
4
5
  export type { DocumentFontFamilySource } from './document-font-dialog-script-font-model';
5
6
  export type DocumentCharacterSpacingMode = 'condensed' | 'expanded' | 'mixed' | 'normal';
6
7
  export type DocumentCharacterPositionMode = 'lowered' | 'mixed' | 'normal' | 'raised';
@@ -47,6 +48,7 @@ export interface DocumentFontDialogSource {
47
48
  mixed: boolean;
48
49
  value: boolean | null;
49
50
  };
51
+ runBorder: DocumentFontDialogRunBorderSource;
50
52
  latinFont: DocumentFontFamilySource;
51
53
  eastAsiaFont: DocumentFontFamilySource;
52
54
  complexScriptFont: DocumentFontFamilySource;
@@ -55,7 +57,7 @@ export interface DocumentFontDialogSource {
55
57
  previewText: string;
56
58
  selectedCharacters: number;
57
59
  }
58
- export interface DocumentFontDialogDraft {
60
+ export interface DocumentFontDialogDraft extends DocumentFontDialogRunBorderDraft {
59
61
  characterScaleMode: DocumentCharacterScaleMode;
60
62
  characterScalePercent: string;
61
63
  characterPositionMode: DocumentCharacterPositionMode;
@@ -74,7 +76,7 @@ export interface DocumentFontDialogDraft {
74
76
  eastAsiaFont: string;
75
77
  complexScriptFont: string;
76
78
  }
77
- export interface DocumentFontDialogPatch extends DocumentFontDialogScriptFontPatch {
79
+ export interface DocumentFontDialogPatch extends DocumentFontDialogScriptFontPatch, DocumentFontDialogRunBorderPatch {
78
80
  characterScalePercent?: number;
79
81
  characterPositionHalfPoints?: number;
80
82
  characterSpacingTwips?: number;
@@ -98,6 +100,7 @@ export interface DocumentFontDialogTouched {
98
100
  legacyTextShadow: boolean;
99
101
  legacyTextEmboss: boolean;
100
102
  legacyTextImprint: boolean;
103
+ runBorder: boolean;
101
104
  kerning: boolean;
102
105
  latinFont: boolean;
103
106
  }
@@ -0,0 +1,24 @@
1
+ import { type DocumentRunBorder, type DocumentRunBorderStyle } from '../work-document-run-border';
2
+ export type DocumentFontDialogRunBorderMode = 'inherit' | 'mixed' | 'none' | 'value';
3
+ export interface DocumentFontDialogRunBorderSource {
4
+ mixed: boolean;
5
+ value: DocumentRunBorder | null;
6
+ }
7
+ export interface DocumentFontDialogRunBorderDraft {
8
+ runBorderMode: DocumentFontDialogRunBorderMode;
9
+ runBorderStyle: DocumentRunBorderStyle;
10
+ runBorderColor: 'auto' | `#${string}`;
11
+ runBorderWidthPoints: string;
12
+ runBorderSpacingPoints: string;
13
+ runBorderShadow: boolean;
14
+ runBorderFrame: boolean;
15
+ }
16
+ export interface DocumentFontDialogRunBorderPatch {
17
+ runBorder?: DocumentRunBorder | null;
18
+ }
19
+ export declare function addDocumentFontDialogRunBorderValue(values: Map<string, DocumentRunBorder | null>, source: unknown): void;
20
+ export declare function selectedDocumentFontDialogRunBorderValue(values: ReadonlyMap<string, DocumentRunBorder | null>): DocumentFontDialogRunBorderSource;
21
+ export declare function createDocumentFontDialogRunBorderDraft(source: DocumentFontDialogRunBorderSource): DocumentFontDialogRunBorderDraft;
22
+ export declare function documentFontDialogRunBorderDraftError(draft: DocumentFontDialogRunBorderDraft): string | null;
23
+ export declare function documentFontDialogRunBorderPatch(source: DocumentFontDialogRunBorderSource, draft: DocumentFontDialogRunBorderDraft, touched: boolean): DocumentFontDialogRunBorderPatch;
24
+ export declare function documentFontDialogRunBorderFromDraft(source: DocumentFontDialogRunBorderSource, draft: DocumentFontDialogRunBorderDraft): DocumentRunBorder | null;
@@ -0,0 +1,10 @@
1
+ import type { CSSProperties } from 'react';
2
+ import { type DocumentFontDialogRunBorderDraft, type DocumentFontDialogRunBorderSource } from './document-font-dialog-run-border-model';
3
+ export declare function DocumentFontDialogRunBorderSection({ source, draft, touched, onDraftChange, onTouched, }: {
4
+ source: DocumentFontDialogRunBorderSource;
5
+ draft: DocumentFontDialogRunBorderDraft;
6
+ touched: boolean;
7
+ onDraftChange: (patch: Partial<DocumentFontDialogRunBorderDraft>) => void;
8
+ onTouched: () => void;
9
+ }): import("react").JSX.Element;
10
+ export declare function documentFontDialogRunBorderPreviewStyle(source: DocumentFontDialogRunBorderSource, draft: DocumentFontDialogRunBorderDraft): CSSProperties;
@@ -1,6 +1,7 @@
1
1
  import { Extension, type Editor } from '@tiptap/core';
2
2
  import { type WorkDocumentEmphasisMark } from './work-document-emphasis';
3
3
  import { type WorkDocumentTextCase } from './work-document-text-case';
4
+ import { type DocumentRunBorder } from './work-document-run-border';
4
5
  declare module '@tiptap/core' {
5
6
  interface Commands<ReturnType> {
6
7
  documentCharacterFormatting: {
@@ -18,6 +19,9 @@ declare module '@tiptap/core' {
18
19
  toggleDocumentHiddenText: () => ReturnType;
19
20
  setDocumentTextCase: (textCase: WorkDocumentTextCase) => ReturnType;
20
21
  toggleDocumentTextCase: (textCase: Exclude<WorkDocumentTextCase, 'none'>) => ReturnType;
22
+ setDocumentRunBorder: (border: DocumentRunBorder) => ReturnType;
23
+ unsetDocumentRunBorder: () => ReturnType;
24
+ toggleDocumentRunBorder: () => ReturnType;
21
25
  };
22
26
  }
23
27
  }
@@ -35,6 +35,7 @@ export declare function importedDocumentCharacterFormatting(formatting: {
35
35
  legacyTextShadow?: boolean;
36
36
  legacyTextEmboss?: boolean;
37
37
  legacyTextImprint?: boolean;
38
+ runBorder?: string;
38
39
  wordLineHeightFactor?: number;
39
40
  wordSnapToGrid?: boolean;
40
41
  fontSize?: number;
@@ -0,0 +1,11 @@
1
+ import { type DocumentParagraphBorder, type DocumentParagraphBorderStyle } from './work-document-paragraph-borders';
2
+ export declare const DOCUMENT_RUN_BORDER_ATTRIBUTE = "data-office-run-border";
3
+ export type DocumentRunBorder = DocumentParagraphBorder;
4
+ export type DocumentRunBorderStyle = DocumentParagraphBorderStyle;
5
+ export declare const DOCUMENT_RUN_BORDER_STYLES: readonly DocumentRunBorderStyle[];
6
+ export declare function normalizeDocumentRunBorder(source: unknown): DocumentRunBorder | null;
7
+ export declare function parseDocumentRunBorder(source: unknown): DocumentRunBorder | null;
8
+ export declare function serializeDocumentRunBorder(source: unknown): string | undefined;
9
+ export declare function parseDocumentRunBorderElement(element: HTMLElement): DocumentRunBorder | null;
10
+ export declare function documentRunBorderDomAttributes(source: unknown): Record<string, string>;
11
+ export declare function documentRunBorderIsVisible(source: unknown): boolean;
@@ -13,6 +13,7 @@ declare module '@tiptap/extension-text-style' {
13
13
  legacyTextShadow?: boolean | null;
14
14
  legacyTextEmboss?: boolean | null;
15
15
  legacyTextImprint?: boolean | null;
16
+ runBorder?: string | null;
16
17
  kerningThresholdHalfPoints?: number | null;
17
18
  scriptFonts?: string | null;
18
19
  scriptFontSlot?: WorkDocumentScriptFontSlot | null;
@@ -0,0 +1,3 @@
1
+ import { type OoxmlPackage } from './work-ooxml-package';
2
+ import type { WorkCompatibilityIssue } from './work-types';
3
+ export declare function diagnoseDocxRunBorders(archive: OoxmlPackage, document: Document): Promise<WorkCompatibilityIssue[]>;
@@ -0,0 +1,17 @@
1
+ import type { IRunOptions } from 'docx';
2
+ import { type DocumentRunBorder } from './work-document-run-border';
3
+ export interface DocxRunBorderPatch {
4
+ marker: string;
5
+ border: DocumentRunBorder;
6
+ }
7
+ export declare class DocxRunBorderPatchCollector {
8
+ readonly patches: DocxRunBorderPatch[];
9
+ private nextMarker;
10
+ private readonly usedColors;
11
+ constructor(sourceHtml: string);
12
+ marker(source: unknown): string | null;
13
+ hasMarker(value: string | null | undefined): value is string;
14
+ }
15
+ export declare function documentRunBorderDocxOptions(source: unknown, collector: DocxRunBorderPatchCollector): Pick<IRunOptions, 'border'>;
16
+ export declare function patchDocxRunBorders(buffer: ArrayBuffer, patches: readonly DocxRunBorderPatch[]): Promise<ArrayBuffer>;
17
+ export declare function setDocxRunBorderAttributes(document: Document, element: Element, border: DocumentRunBorder): void;
@@ -0,0 +1,20 @@
1
+ import type { DocumentRunBorder } from './work-document-run-border';
2
+ import { type DocxThemeSource } from './work-docx-theme';
3
+ export type DocxRunBorderInspection = {
4
+ status: 'absent';
5
+ spoofedCount: number;
6
+ } | {
7
+ status: 'invalid';
8
+ spoofedCount: number;
9
+ } | {
10
+ status: 'valid';
11
+ value: DocumentRunBorder;
12
+ spoofedCount: number;
13
+ };
14
+ export interface ResolvedDocxRunBorder {
15
+ border: DocumentRunBorder | undefined;
16
+ invalidCount: number;
17
+ spoofedCount: number;
18
+ }
19
+ export declare function inspectDocxRunBorder(properties: Element | null | undefined, themeSource?: DocxThemeSource): DocxRunBorderInspection;
20
+ export declare function resolveDocxRunBorder(propertySources: readonly Element[], themeSource?: DocxThemeSource): ResolvedDocxRunBorder;
@@ -7,6 +7,7 @@ import { type WorkDocumentTextCase } from './work-document-text-case';
7
7
  import { type WorkDocumentUnderlineFormatting } from './work-document-underline';
8
8
  import { type WorkDocumentStrikeFormatting } from './work-document-strike';
9
9
  import { type WorkDocumentScriptFontSlot, type WorkDocumentScriptFonts } from './work-document-script-fonts';
10
+ import { type DocumentRunBorder } from './work-document-run-border';
10
11
  export interface ImportedDocxRunFormatting {
11
12
  bold?: boolean;
12
13
  italic?: boolean;
@@ -35,6 +36,7 @@ export interface ImportedDocxRunFormatting {
35
36
  themeColor?: DocxThemeColorReference;
36
37
  themeFill?: DocxThemeColorReference;
37
38
  textCase?: WorkDocumentTextCase;
39
+ runBorder?: DocumentRunBorder;
38
40
  }
39
41
  export interface ImportedDocxRunFormattingMarker {
40
42
  startMarker: string;
Binary file
package/dist/styles.css CHANGED
@@ -9718,6 +9718,33 @@ button.work-office-collaboration-participant:hover .work-office-collaboration-lo
9718
9718
  display: grid;
9719
9719
  }
9720
9720
 
9721
+ .work-document-font-dialog-run-border {
9722
+ border: 1px solid color-mix(in srgb, var(--a3s-line) 78%, transparent);
9723
+ background: var(--a3s-panel-soft);
9724
+ border-radius: 8px;
9725
+ grid-column: 1 / -1;
9726
+ grid-template-columns: repeat(3, minmax(0, 1fr));
9727
+ gap: 10px 14px;
9728
+ min-width: 0;
9729
+ margin: 0;
9730
+ padding: 10px 12px 12px;
9731
+ display: grid;
9732
+ }
9733
+
9734
+ .work-document-font-dialog-run-border > legend {
9735
+ color: var(--a3s-muted);
9736
+ padding: 0 4px;
9737
+ font-size: 11px;
9738
+ font-weight: 700;
9739
+ }
9740
+
9741
+ .work-document-font-dialog-run-border-effects {
9742
+ align-items: end;
9743
+ gap: 16px;
9744
+ min-height: 32px;
9745
+ display: flex;
9746
+ }
9747
+
9721
9748
  .work-document-font-dialog-field > .work-office-select, .work-document-font-dialog-field .work-office-number-field, .work-document-font-dialog-field button[role="combobox"] {
9722
9749
  width: 100%;
9723
9750
  }
@@ -9788,6 +9815,10 @@ button.work-office-collaboration-participant:hover .work-office-collaboration-lo
9788
9815
  grid-template-columns: repeat(2, minmax(0, 1fr));
9789
9816
  }
9790
9817
 
9818
+ .work-document-font-dialog-run-border {
9819
+ grid-template-columns: minmax(0, 1fr);
9820
+ }
9821
+
9791
9822
  .work-document-font-dialog-preview {
9792
9823
  min-height: 88px;
9793
9824
  }
@@ -699,6 +699,28 @@ an empty nested container. The four effects change paint but not advances, so
699
699
  eligible paragraphs remain on Worker/WASM layout and the browser/PDF CSS
700
700
  projection stays an explicitly bounded approximation.
701
701
 
702
+ Native character borders are resolved as one validated TextStyle value before
703
+ layout eligibility, DOM serialization, and DOCX export. The closed model
704
+ accepts 25 visible `w:bdr` line styles plus `nil` and `none`, direct or resolved
705
+ theme colors with tint/shade identity, bounded eighth-point width, point
706
+ spacing, shadow, and frame fields. Duplicate, misplaced, art-style,
707
+ namespace-spoofed, child- or text-bearing, extra-attribute, out-of-range, and
708
+ unresolved-theme leaves normalize to an explicit `nil` reset and emit a
709
+ compatibility diagnostic instead of enabling untrusted paint or reviving
710
+ inherited formatting.
711
+
712
+ The canonical DOM mark stores semantic JSON in `data-office-run-border`; its
713
+ CSS projection uses four-edge border paint, padding, shadow, and
714
+ `box-decoration-break: clone`. A visible border changes inline geometry, so
715
+ the containing paragraph deliberately uses browser-authoritative measurement.
716
+ Explicit `nil` and `none` add no geometry and remain eligible for Worker/WASM
717
+ shaping. The DOCX generator allocates a collision-checked temporary border
718
+ color only inside generated runs, then patches the body, page chrome, and note
719
+ parts to exact `w:bdr` attributes before formatting-change snapshots are
720
+ written. This keeps direct/style inheritance and prior `w:rPrChange` values
721
+ exact while treating browser and PDF line-style paint as a bounded visual
722
+ approximation.
723
+
702
724
  Tables, images, code blocks, and other complex content use explicit
703
725
  format-specific measurement. Top-level tables are row flows; eligible rows can
704
726
  additionally expose synchronized direct-cell block fragments. Ordered and bullet
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@a3s-lab/office",
3
- "version": "0.28.0",
3
+ "version": "0.29.0",
4
4
  "description": "Open-source collaborative browser editors for documents, Markdown, spreadsheets, presentations, and PDFs.",
5
5
  "keywords": [
6
6
  "office",
@@ -90,6 +90,7 @@
90
90
  "playground:visual:document-emphasis": "playwright test visual-tests/document-emphasis.functional.spec.ts --config playwright.config.ts",
91
91
  "playground:visual:document-hidden-text": "playwright test visual-tests/document-hidden-text.functional.spec.ts --config playwright.config.ts",
92
92
  "playground:visual:document-legacy-text-effects": "playwright test visual-tests/document-legacy-text-effects.functional.spec.ts --config playwright.config.ts",
93
+ "playground:visual:document-run-border": "playwright test visual-tests/document-run-border.functional.spec.ts --config playwright.config.ts",
93
94
  "playground:visual:document-kerning": "playwright test visual-tests/document-kerning.functional.spec.ts --config playwright.config.ts",
94
95
  "playground:visual:document-character-scale": "playwright test visual-tests/document-character-scale.functional.spec.ts --config playwright.config.ts",
95
96
  "playground:visual:document-character-position": "playwright test visual-tests/document-character-position.functional.spec.ts --config playwright.config.ts",
@@ -201,6 +202,8 @@
201
202
  "test:e2e:writer-hidden-text:check": "a3s-test check tests/e2e/word-hidden-text.acl --json",
202
203
  "test:e2e:writer-legacy-text-effects": "A3S_TEST_SUITE=tests/e2e/word-legacy-text-effects.acl bash scripts/run-a3s-test-web-gate.sh",
203
204
  "test:e2e:writer-legacy-text-effects:check": "a3s-test check tests/e2e/word-legacy-text-effects.acl --json",
205
+ "test:e2e:writer-run-border": "A3S_TEST_SUITE=tests/e2e/word-run-border.acl bash scripts/run-a3s-test-web-gate.sh",
206
+ "test:e2e:writer-run-border:check": "a3s-test check tests/e2e/word-run-border.acl --json",
204
207
  "test:e2e:writer-kerning": "A3S_TEST_SUITE=tests/e2e/word-kerning.acl bash scripts/run-a3s-test-web-gate.sh",
205
208
  "test:e2e:writer-kerning:check": "a3s-test check tests/e2e/word-kerning.acl --json",
206
209
  "test:e2e:writer-character-scale": "A3S_TEST_SUITE=tests/e2e/word-character-scale.acl bash scripts/run-a3s-test-web-gate.sh",