@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.
- package/README.md +27 -1
- package/dist/0~1403.js +1 -1
- package/dist/0~4980.js +1 -1
- package/dist/0~5093.js +64 -5
- package/dist/0~7043.js +241 -241
- package/dist/0~7048.js +1 -1
- package/dist/0~7614.js +1 -1
- package/dist/0~document-editor.js +433 -10
- package/dist/0~presentation-editor.js +1 -1
- package/dist/0~spreadsheet-editor.js +1 -2
- package/dist/0~work-docx-export.js +141 -3
- package/dist/0~work-docx-import.js +5 -3
- package/dist/0~work-office-diagnostics.js +46 -3
- package/dist/0~work-pptx-export.js +1 -1
- package/dist/0~work-pptx-import.js +1 -1
- package/dist/0~work-presentation-charts.js +1 -1
- package/dist/1544.js +1 -1
- package/dist/4104.js +2 -2
- package/dist/4121.js +1510 -0
- package/dist/6282.js +59 -684
- package/dist/8715.js +1 -1
- package/dist/core.js +1 -1
- package/dist/index.js +1 -1
- package/dist/internal/features/work/editors/document-command-catalog.d.ts +9 -0
- package/dist/internal/features/work/editors/document-font-dialog-model.d.ts +5 -2
- package/dist/internal/features/work/editors/document-font-dialog-run-border-model.d.ts +24 -0
- package/dist/internal/features/work/editors/document-font-dialog-run-border-section.d.ts +10 -0
- package/dist/internal/features/work/work-document-character-formatting.d.ts +4 -0
- package/dist/internal/features/work/work-document-format-changes.d.ts +1 -0
- package/dist/internal/features/work/work-document-run-border.d.ts +11 -0
- package/dist/internal/features/work/work-document-word-line-metrics.d.ts +1 -0
- package/dist/internal/features/work/work-docx-run-border-diagnostics.d.ts +3 -0
- package/dist/internal/features/work/work-docx-run-border-export.d.ts +17 -0
- package/dist/internal/features/work/work-docx-run-border.d.ts +20 -0
- package/dist/internal/features/work/work-docx-run-formatting-import.d.ts +2 -0
- package/dist/office-kernel.wasm +0 -0
- package/dist/styles.css +31 -0
- package/docs/latest/en/browser-editor-architecture.md +22 -0
- package/package.json +4 -1
- package/dist/5184.js +0 -662
- package/dist/9424.js +0 -16
package/dist/8715.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createOfficeId as createWorkId, directChild, attribute } from "./
|
|
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 "./
|
|
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 "./
|
|
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,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;
|
package/dist/office-kernel.wasm
CHANGED
|
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.
|
|
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",
|