@vivliostyle/core 2.40.0 → 2.42.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.
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Copyright 2026 Vivliostyle Foundation
3
+ *
4
+ * Vivliostyle.js is free software: you can redistribute it and/or modify
5
+ * it under the terms of the GNU Affero General Public License as published by
6
+ * the Free Software Foundation, either version 3 of the License, or
7
+ * (at your option) any later version.
8
+ *
9
+ * Vivliostyle.js is distributed in the hope that it will be useful,
10
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ * GNU Affero General Public License for more details.
13
+ *
14
+ * You should have received a copy of the GNU Affero General Public License
15
+ * along with Vivliostyle.js. If not, see <http://www.gnu.org/licenses/>.
16
+ *
17
+ * @fileoverview Semantic footnote helper utilities.
18
+ *
19
+ * This module owns semantic-footnote-specific rules that are independent from
20
+ * the main view-generation flow: element/reference detection, shared marker
21
+ * attributes, first-reference bookkeeping, and style-merging helpers that can
22
+ * be driven by injected style accessors.
23
+ *
24
+ * Keep view-tree sequencing and DOM construction in vgen.ts. Extend this
25
+ * module when new DPUB/EPUB semantic footnote behavior can be expressed as
26
+ * pure reference/style helpers that do not need direct access to ViewFactory
27
+ * state.
28
+ */
29
+ import * as Css from "./css";
30
+ import * as Exprs from "./exprs";
31
+ import * as Vtree from "./vtree";
32
+ import { CssCascade } from "./types";
33
+ export declare const SEMANTIC_FOOTNOTE_FIRST_REF_ATTR = "data-vivliostyle-footnote-first-ref";
34
+ export declare const SEMANTIC_FOOTNOTE_REFERENCED_ATTR = "data-vivliostyle-footnote-referenced";
35
+ type CascadeValueLike = {
36
+ value: Css.Val;
37
+ priority: number;
38
+ evaluate?: (context: Exprs.Context, propName: string) => Css.Val;
39
+ filterValue?: (visitor: unknown) => CascadeValueLike;
40
+ };
41
+ type ElementStyleMap = {
42
+ [key: string]: CssCascade.ElementStyle;
43
+ };
44
+ export type SemanticFootnoteStyleAccess = {
45
+ getStyle: (element: Element) => CssCascade.ElementStyle | null;
46
+ getProp: (style: CssCascade.ElementStyle | null | undefined, propName: string) => CascadeValueLike | null | undefined;
47
+ getStyleMap: (style: CssCascade.ElementStyle, mapName: string) => ElementStyleMap | null | undefined;
48
+ getMutableStyleMap: (style: CssCascade.ElementStyle, mapName: string) => ElementStyleMap;
49
+ createCascadeValue: (value: Css.Val, priority: number) => CascadeValueLike;
50
+ filterFootnoteMarkerContent: (content: CascadeValueLike, element: Element) => Css.Val;
51
+ };
52
+ export type SemanticFootnoteStyleState = {
53
+ sourceStyle: CssCascade.ElementStyle | null;
54
+ footnoteDisplay: Css.Val | null;
55
+ footnotePolicy: Css.Ident | null;
56
+ };
57
+ export declare function isSemanticFootnoteElement(element: Element): boolean;
58
+ export declare function isSemanticFootnoteNoterefElement(element: Element): boolean;
59
+ export declare function resolveSemanticFootnoteReference(element: Element, baseURL: string): string | null;
60
+ export declare function resolveSemanticFootnoteTarget(element: Element, baseURL: string, resolveElement: (reference: string) => Element | null): Element | null;
61
+ export declare function initializeFirstSemanticFootnoteReferenceOffsets(ownerDocument: Document, baseURL: string, getElementOffset: (element: Element) => number, firstRefOffsets: Map<string, number>, initialized: {
62
+ value: boolean;
63
+ }): void;
64
+ export declare function shouldGenerateSemanticFootnote(element: Element, baseURL: string, getElementOffset: (element: Element) => number, firstRefOffsets: Map<string, number>, initialized: {
65
+ value: boolean;
66
+ }): boolean;
67
+ export declare function mergeSemanticFootnoteIncludeStyle(element: Element, elementStyle: CssCascade.ElementStyle, shadowContext: Vtree.ShadowContext | null, baseURL: string, resolveElement: (reference: string) => Element | null, footnoteCounterAttr: string, styleAccess: SemanticFootnoteStyleAccess): CssCascade.ElementStyle;
68
+ export declare function mergeSemanticFootnoteRootStyle(element: Element, elementStyle: CssCascade.ElementStyle, shadowContext: Vtree.ShadowContext | null, context: Exprs.Context, styleAccess: SemanticFootnoteStyleAccess): CssCascade.ElementStyle;
69
+ export declare function getSemanticFootnoteStyleState(element: Element, shadowContext: Vtree.ShadowContext | null, styleAccess: SemanticFootnoteStyleAccess): SemanticFootnoteStyleState;
70
+ export declare function resolveMarkerContentValue(val: Css.Val, context: Exprs.Context): Css.Val;
71
+ export declare function refreshSemanticFootnoteMarkerContent(sourceStyle: CssCascade.ElementStyle | null, computedStyle: {
72
+ [key: string]: Css.Val;
73
+ }, context: Exprs.Context): void;
74
+ export {};
@@ -10,6 +10,8 @@ export declare class TableRow {
10
10
  readonly rowIndex: number;
11
11
  readonly sourceNode: Node;
12
12
  cells: TableCell[];
13
+ breakBefore: string | null;
14
+ breakAfter: string | null;
13
15
  constructor(rowIndex: number, sourceNode: Node);
14
16
  addCell(cell: TableCell): void;
15
17
  getMinimumHeight(): number;
@@ -51,6 +53,13 @@ export declare class BetweenTableRowBreakPosition extends BreakPosition.EdgeBrea
51
53
  private rowIndex;
52
54
  constructor(position: Vtree.NodeContext, breakOnEdge: string | null, overflows: boolean, columnBlockSize: number);
53
55
  findAcceptableBreak(column: Layout.Column, penalty: number): Vtree.NodeContext;
56
+ /**
57
+ * Check if any non-spanning cell in the row has content that wasn't fully
58
+ * rendered. This happens when page floats (footnotes) reduce available space
59
+ * during a retry, causing cell content to overflow within the row even though
60
+ * the row boundary appears acceptable. (Issue #1663)
61
+ */
62
+ private hasUnfinishedCells;
54
63
  getMinBreakPenalty(): number;
55
64
  getAcceptableCellBreakPositions(): Layout.BreakPositionAndNodeContext[];
56
65
  private getRowIndex;
@@ -161,10 +170,19 @@ export declare class TableLayoutStrategy extends LayoutUtil.EdgeSkipper {
161
170
  inHeader: boolean;
162
171
  inFooter: boolean;
163
172
  constructor(formattingContext: TableFormattingContext, column: Layout.Column);
173
+ startNonInlineElementNode(state: LayoutUtil.LayoutIteratorState): void | Task.Result<boolean>;
164
174
  resetColumn(): void;
165
175
  getColSpanningCellWidth(cell: TableCell): number;
166
176
  layoutCell(cell: TableCell, cellNodeContext: Vtree.NodeContext, startChunkPosition: Vtree.ChunkPosition): Task.Result<boolean>;
167
- hasBrokenCellAtSlot(slotIndex: any): boolean;
177
+ /**
178
+ * Find the break position for the cell at the given slot index.
179
+ * Returns the break position and its index in cellBreakPositions, or null if not found.
180
+ * Uses sourceNode matching instead of sequential index to support layout retry (issue #1663).
181
+ */
182
+ findBrokenCellAtSlot(slotIndex: number, sourceNode: Node): {
183
+ position: BrokenTableCellPosition;
184
+ index: number;
185
+ } | null;
168
186
  private extractRowSpanningCellBreakPositions;
169
187
  layoutRowSpanningCellsFromPreviousFragment(state: LayoutUtil.LayoutIteratorState): Task.Result<boolean>;
170
188
  startTableRow(state: LayoutUtil.LayoutIteratorState): Task.Result<boolean>;
@@ -186,6 +204,11 @@ export declare class TableLayoutProcessor implements LayoutProcessor.LayoutProce
186
204
  */
187
205
  normalizeColGroups(formattingContext: TableFormattingContext, tableElement: Element, column: Layout.Column): void;
188
206
  doInitialLayout(nodeContext: Vtree.NodeContext, column: Layout.Column): Task.Result<Vtree.NodeContext>;
207
+ /**
208
+ * Check if any row inside the table has a forced break value
209
+ * (propagated from cells or set on the row itself).
210
+ */
211
+ private hasForcedBreakInRows;
189
212
  addCaptions(formattingContext: TableFormattingContext, rootViewNode: Element, firstChild: Node | null): void;
190
213
  addColGroups(formattingContext: TableFormattingContext, rootViewNode: Element, firstChild: Node | null): void;
191
214
  removeColGroups(formattingContext: TableFormattingContext, rootViewNode: Element): void;
@@ -110,6 +110,7 @@ export declare namespace Layout {
110
110
  last: Node;
111
111
  viewDocument: Document;
112
112
  flowRootFormattingContext: Vtree.FormattingContext;
113
+ isNonFirstColumn: boolean;
113
114
  isFloat: boolean;
114
115
  isFootnote: boolean;
115
116
  startEdge: number;
@@ -142,6 +143,7 @@ export declare namespace Layout {
142
143
  pseudoParent: Column;
143
144
  nodeContextOverflowingDueToRepetitiveElements: Vtree.NodeContext | null;
144
145
  blockDistanceToBlockEndFloats: number;
146
+ lastLineStride: number;
145
147
  computedBlockSize: number;
146
148
  layoutContext: Vtree.LayoutContext;
147
149
  clientLayout: Vtree.ClientLayout;
@@ -235,8 +237,8 @@ export declare namespace Layout {
235
237
  * Layout a single float element.
236
238
  */
237
239
  layoutFloat(nodeContext: Vtree.NodeContext): Task.Result<Vtree.NodeContext>;
238
- setupFloatArea(area: PageFloatArea, floatReference: PageFloats.FloatReference, floatSide: string, anchorEdge: number | null, strategy: PageFloats.PageFloatLayoutStrategy, condition: PageFloats.PageFloatPlacementCondition): boolean;
239
- createPageFloatArea(float: PageFloats.PageFloat | null, floatSide: string, anchorEdge: number | null, strategy: PageFloats.PageFloatLayoutStrategy, condition: PageFloats.PageFloatPlacementCondition): PageFloatArea | null;
240
+ setupFloatArea(area: PageFloatArea, floatReference: PageFloats.FloatReference, floatSide: string, anchorEdge: number | null, strategy: PageFloats.PageFloatLayoutStrategy, condition: PageFloats.PageFloatPlacementCondition): Task.Result<boolean>;
241
+ createPageFloatArea(float: PageFloats.PageFloat | null, floatSide: string, anchorEdge: number | null, strategy: PageFloats.PageFloatLayoutStrategy, condition: PageFloats.PageFloatPlacementCondition): Task.Result<PageFloatArea | null>;
240
242
  layoutSinglePageFloatFragment(continuations: PageFloats.PageFloatContinuation[], floatSide: string, clearSide: string | null, allowFragmented: boolean, strategy: PageFloats.PageFloatLayoutStrategy, anchorEdge: number | null, pageFloatFragment?: PageFloats.PageFloatFragment | null): Task.Result<SinglePageFloatLayoutResult>;
241
243
  layoutPageFloatInner(continuation: PageFloats.PageFloatContinuation, strategy: PageFloats.PageFloatLayoutStrategy, anchorEdge: number | null, pageFloatFragment?: PageFloats.PageFloatFragment): Task.Result<boolean>;
242
244
  setFloatAnchorViewNode(nodeContext: Vtree.NodeContext): Vtree.NodeContext;
@@ -286,10 +288,6 @@ export declare namespace Layout {
286
288
  * Determines if a page break is acceptable at this position
287
289
  */
288
290
  isBreakable(flowPosition: Vtree.NodeContext): boolean;
289
- /**
290
- * Determines if an indent value is zero
291
- */
292
- zeroIndent(val: string | number): boolean;
293
291
  /**
294
292
  * @return true if overflows
295
293
  */
@@ -384,6 +382,7 @@ export declare namespace Layout {
384
382
  readonly parentContainer: Vtree.Container;
385
383
  convertPercentageSizesToPx(target: Element): void;
386
384
  fixFloatSizeAndPosition(nodeContext: Vtree.NodeContext): void;
385
+ getContentBlockMarginAfter(): number;
387
386
  getContentInlineSize(): number;
388
387
  }
389
388
  }
@@ -437,6 +436,8 @@ export declare namespace PageFloats {
437
436
  interface PageFloat {
438
437
  order: number | null;
439
438
  id: PageFloatID | null;
439
+ insidePageFloatArea: boolean;
440
+ parentPageFloat: PageFloat | null;
440
441
  readonly nodePosition: Vtree.NodePosition;
441
442
  readonly floatReference: FloatReference;
442
443
  readonly floatSide: string;
@@ -476,11 +477,14 @@ export declare namespace PageFloats {
476
477
  writingMode: Css.Val;
477
478
  direction: Css.Val;
478
479
  floatFragments: PageFloatFragment[];
480
+ ignoreFootnoteAreaMaxHeight: boolean;
479
481
  readonly parent: PageFloatLayoutContext;
482
+ readonly effectiveParent: PageFloatLayoutContext | null;
480
483
  readonly flowName: string | null;
481
484
  readonly generatingNodePosition: Vtree.NodePosition | null;
482
485
  getContainer(floatReference?: FloatReference): Vtree.Container;
483
486
  setContainer(container: Vtree.Container): any;
487
+ setOuterContext(outerContext: PageFloatLayoutContext): void;
484
488
  addPageFloat(float: PageFloat): void;
485
489
  getPageFloatLayoutContext(floatReference: FloatReference): PageFloatLayoutContext;
486
490
  findPageFloatByNodePosition(nodePosition: Vtree.NodePosition): PageFloat | null;
@@ -490,15 +494,18 @@ export declare namespace PageFloats {
490
494
  findPageFloatFragment(float: PageFloat): PageFloatFragment | null;
491
495
  hasFloatFragments(condition?: (p1: PageFloatFragment) => boolean): boolean;
492
496
  hasContinuingFloatFragmentsInFlow(flowName: string): boolean;
497
+ markPageFloatAnchorSeen(float: PageFloat): void;
493
498
  registerPageFloatAnchor(float: PageFloat, anchorViewNode: Node): void;
494
499
  collectPageFloatAnchors(): any;
495
500
  isAnchorAlreadyAppeared(floatId: PageFloatID): boolean;
496
501
  deferPageFloat(continuation: PageFloatContinuation): void;
502
+ removeFloatDeferredToNext(float: PageFloat): void;
497
503
  hasPrecedingFloatsDeferredToNext(float: PageFloat, ignoreReference?: boolean): boolean;
498
504
  getLastFollowingFloatInFragments(float: PageFloat): PageFloat | null;
499
505
  getDeferredPageFloatContinuations(flowName?: string | null): PageFloatContinuation[];
500
506
  getPageFloatContinuationsDeferredToNext(flowName?: string | null): PageFloatContinuation[];
501
507
  getFloatsDeferredToNextInChildContexts(): PageFloat[];
508
+ initFootnoteRetryFromEmptyFragment(float: PageFloat, area: Layout.PageFloatArea): boolean;
502
509
  checkAndForbidNotAllowedFloat(): boolean;
503
510
  checkAndForbidFloatFollowingDeferredFloat(): boolean;
504
511
  finish(): void;
@@ -522,7 +529,8 @@ export declare namespace PageFloats {
522
529
  setFloatAreaDimensions(area: Layout.PageFloatArea, floatReference: FloatReference, floatSide: string, anchorEdge: number | null, init: boolean, force: boolean, condition: PageFloatPlacementCondition): string | null;
523
530
  getFloatFragmentExclusions(): GeometryUtil.Shape[];
524
531
  getMaxReachedAfterEdge(): number;
525
- getBlockStartEdgeOfBlockEndFloats(): number;
532
+ getBlockEndEdgeOfBlockStartFloats(inlinePos?: number): number;
533
+ getBlockStartEdgeOfBlockEndFloats(inlinePos?: number): number;
526
534
  getPageFloatClearEdge(clear: string, column: Layout.Column): number;
527
535
  getPageFloatPlacementCondition(float: PageFloat, floatSide: string, clearSide: string | null): PageFloatPlacementCondition;
528
536
  getLayoutConstraints(): Layout.LayoutConstraint[];
@@ -538,7 +546,7 @@ export declare namespace PageFloats {
538
546
  createPageFloat(nodeContext: Vtree.NodeContext, pageFloatLayoutContext: PageFloatLayoutContext, column: Layout.Column): Task.Result<PageFloat>;
539
547
  createPageFloatFragment(continuations: PageFloatContinuation[], floatSide: string, clearSide: string | null, floatArea: Layout.PageFloatArea, continues: boolean): PageFloatFragment;
540
548
  findPageFloatFragment(float: PageFloat, pageFloatLayoutContext: PageFloatLayoutContext): PageFloatFragment | null;
541
- adjustPageFloatArea(floatArea: Layout.PageFloatArea, floatContainer: Vtree.Container, column: Layout.Column): any;
549
+ adjustPageFloatArea(floatArea: Layout.PageFloatArea, floatContainer: Vtree.Container, column: Layout.Column): Task.Result<void>;
542
550
  forbid(float: PageFloat, pageFloatLayoutContext: PageFloatLayoutContext): any;
543
551
  }
544
552
  }
@@ -707,7 +715,7 @@ export declare namespace Vtree {
707
715
  * @param target element to apply styles to
708
716
  * @return vertical
709
717
  */
710
- applyFootnoteStyle(vertical: boolean, rtl: boolean, target: Element): boolean;
718
+ applyFootnoteStyle(vertical: boolean, rtl: boolean, target: Element): Task.Result<boolean>;
711
719
  /**
712
720
  * Peel off innermost first-XXX pseudoelement, create and create view nodes
713
721
  * after the end of that pseudoelement.
@@ -883,7 +891,6 @@ export declare namespace Vtree {
883
891
  clearSide: string | null;
884
892
  floatMinWrapBlock: Css.Numeric | null;
885
893
  columnSpan: Css.Val | null;
886
- verticalAlign: string;
887
894
  captionSide: string;
888
895
  inlineBorderSpacing: number;
889
896
  blockBorderSpacing: number;
@@ -38,9 +38,18 @@ export declare class ViewFactory extends Base.SimpleEventTarget implements Vtree
38
38
  [key: string]: string;
39
39
  };
40
40
  readonly documentURLTransformer: Base.DocumentURLTransformer;
41
+ readonly pageProps?: {
42
+ [key: string]: CssCascade.ElementStyle;
43
+ };
44
+ readonly cascadedPageStyle?: CssCascade.ElementStyle;
45
+ private readonly semanticFootnoteFirstRefOffsets;
46
+ private readonly semanticFootnoteFirstRefOffsetsInitialized;
41
47
  private static SVG_URL_ATTRIBUTES;
48
+ private static FOOTNOTE_CALL_OWNER_ATTR;
42
49
  document: Document;
43
50
  exprContentListener: Vtree.ExprContentListener;
51
+ private computedStyleParentFontSizeOverride;
52
+ private computedStyleParentLineHeightOverride;
44
53
  nodeContext: Vtree.NodeContext | null;
45
54
  viewRoot: Element | null;
46
55
  isFootnote: boolean;
@@ -49,9 +58,14 @@ export declare class ViewFactory extends Base.SimpleEventTarget implements Vtree
49
58
  viewNode: Node | null;
50
59
  constructor(flowName: string, context: Exprs.Context, viewport: Viewport, styler: CssStyler.Styler, regionIds: string[], xmldoc: XmlDoc.XMLDocHolder, docFaces: Font.DocumentFaces, footnoteStyle: CssCascade.ElementStyle, stylerProducer: StylerProducer, page: Vtree.Page, customRenderer: CustomRenderer, fallbackMap: {
51
60
  [key: string]: string;
52
- }, documentURLTransformer: Base.DocumentURLTransformer);
61
+ }, documentURLTransformer: Base.DocumentURLTransformer, pageProps?: {
62
+ [key: string]: CssCascade.ElementStyle;
63
+ }, cascadedPageStyle?: CssCascade.ElementStyle, semanticFootnoteFirstRefOffsets?: Map<string, number | null>, semanticFootnoteFirstRefOffsetsInitialized?: {
64
+ value: boolean;
65
+ });
53
66
  /** @override */
54
67
  clone(): Vtree.LayoutContext;
68
+ private syncSemanticFootnoteCounterToTarget;
55
69
  createPseudoelementShadow(element: Element, isRoot: boolean, cascStyle: CssCascade.ElementStyle, computedStyle: {
56
70
  [key: string]: Css.Val;
57
71
  }, styler: CssStyler.AbstractStyler, context: Exprs.Context, parentShadow: Vtree.ShadowContext, subShadow: Vtree.ShadowContext): Vtree.ShadowContext;
@@ -125,7 +139,22 @@ export declare class ViewFactory extends Base.SimpleEventTarget implements Vtree
125
139
  setCurrent(nodeContext: Vtree.NodeContext, firstTime: boolean, atUnforcedBreak?: boolean): Task.Result<boolean>;
126
140
  processShadowContent(pos: Vtree.NodeContext): Vtree.NodeContext;
127
141
  private nextPositionInTree;
128
- isTransclusion(element: Element, elementStyle: CssCascade.ElementStyle, transclusionType: string | null): boolean;
142
+ /**
143
+ * Find a footnote-call element immediately before the given view node.
144
+ */
145
+ private findImmediateFootnoteCallSibling;
146
+ /**
147
+ * True for semantic footnotes that already provide a noteref call in source
148
+ * (EPUB or DPUB-ARIA pattern), so an extra ::footnote-call must not be inserted.
149
+ */
150
+ private isSemanticFootnoteElement;
151
+ /**
152
+ * Insert a footnote-call NodeContext before the footnote element.
153
+ * The footnote-call will be processed as a normal inline element,
154
+ * then shadowSibling will lead to the footnote element.
155
+ * (Issue #868)
156
+ */
157
+ private insertFootnoteCall;
129
158
  /** @override */
130
159
  nextInTree(position: Vtree.NodeContext, atUnforcedBreak?: boolean): Task.Result<Vtree.NodeContext>;
131
160
  addImageFetchers(bg: Css.Val): void;
@@ -140,6 +169,10 @@ export declare class ViewFactory extends Base.SimpleEventTarget implements Vtree
140
169
  * @returns parsed and adjusted value in px, or null if cannot parse as "px" unit, e.g. "normal"
141
170
  */
142
171
  private parsePlusLayoutUnitAdj;
172
+ private getFootnoteAreaInheritedMetrics;
173
+ private getComputedFontMetrics;
174
+ private getParentViewStyle;
175
+ private getParentComputedMetrics;
143
176
  /**
144
177
  * Get "lh" unit size in px
145
178
  * @return line-height in px, or null if cannot be determined
@@ -156,7 +189,7 @@ export declare class ViewFactory extends Base.SimpleEventTarget implements Vtree
156
189
  peelOff(nodeContext: Vtree.NodeContext, nodeOffset: number): Task.Result<Vtree.NodeContext>;
157
190
  createElement(ns: string, tag: string): Element;
158
191
  /** @override */
159
- applyFootnoteStyle(vertical: boolean, rtl: boolean, target: Element): boolean;
192
+ applyFootnoteStyle(vertical: boolean, rtl: boolean, target: Element): Task.Result<boolean>;
160
193
  /** @override */
161
194
  processFragmentedBlockEdge(nodeContext: Vtree.NodeContext): void;
162
195
  private fixClonedBoxDecorationOverflow;
@@ -178,6 +211,7 @@ export declare const propertiesNotPassedToDOM: {
178
211
  "flow-linger": boolean;
179
212
  "flow-options": boolean;
180
213
  "flow-priority": boolean;
214
+ "footnote-display": boolean;
181
215
  "footnote-policy": boolean;
182
216
  "margin-break": boolean;
183
217
  page: boolean;
@@ -123,6 +123,7 @@ export type Whitespace = Vtree.Whitespace;
123
123
  */
124
124
  export declare function whitespaceFromPropertyValue(whitespace: string): Whitespace | null;
125
125
  export declare function canIgnore(node: Node, whitespace?: Whitespace): boolean;
126
+ export declare function canIgnoreText(text: string, whitespace?: Whitespace): boolean;
126
127
  export declare class Flow {
127
128
  readonly flowName: string;
128
129
  readonly parentFlowName: string | null;
@@ -222,7 +223,6 @@ export declare class NodeContext implements Vtree.NodeContext {
222
223
  clearSide: string | null;
223
224
  floatMinWrapBlock: Css.Numeric | null;
224
225
  columnSpan: Css.Val | null;
225
- verticalAlign: string;
226
226
  captionSide: string;
227
227
  inlineBorderSpacing: number;
228
228
  blockBorderSpacing: number;