gesso-core 0.6.19 → 0.6.21

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.
@@ -591,9 +591,10 @@ type UiTransitionSpec = {
591
591
  /**
592
592
  * What an element may write for one property of a `transition`.
593
593
  *
594
- * A bare number is a duration in milliseconds, which is what makes
595
- * `transition: { opacity: 200, transform: spring() }` read the way
596
- * That is how it was written.
594
+ * A bare number is a duration in milliseconds, so the common case,
595
+ * `transition: { opacity: 200, transform: 120 }`, reads the way a CSS
596
+ * transition does. A spring is for a property that is one number, like
597
+ * `opacity`: a transform only tweens (see `spring`).
597
598
  */
598
599
  type UiTransitionValue = number | UiTransitionSpec;
599
600
  /** A tween of `duration` milliseconds along `easing`. */
@@ -889,7 +890,304 @@ declare class UiEnvironment {
889
890
  providesOwn(name: string): boolean;
890
891
  }
891
892
  //#endregion
893
+ //#region src/layout/TextMeasurer.d.ts
894
+ type TextWrap = 'word' | 'char' | 'none';
895
+ type TextOverflow = 'clip' | 'ellipsis';
896
+ /**
897
+ * The font a piece of text is measured in.
898
+ *
899
+ * Structural rather than imported so that layout keeps depending on
900
+ * nothing above it; a `UiResolvedTextSpan` is one of these plus the
901
+ * fields that only paint reads.
902
+ */
903
+ interface TextRunStyle {
904
+ fontFamily?: string;
905
+ fontWeight?: string | number;
906
+ fontSize?: number;
907
+ fontStyle?: string;
908
+ fontStretch?: string;
909
+ fontVariant?: string;
910
+ fontKerning?: string;
911
+ letterSpacing?: number;
912
+ }
913
+ /** A run of the paragraph with a font of its own, as offsets into the text. */
914
+ interface TextRunSpan extends TextRunStyle {
915
+ readonly start: number;
916
+ readonly end: number;
917
+ /**
918
+ * The run is in the text but takes no room: every width that touches
919
+ * it counts it as nothing, and a line's `runs` leave it out, so no
920
+ * renderer has anything to draw for it.
921
+ */
922
+ readonly hidden?: boolean;
923
+ }
924
+ interface TextMeasureRequest {
925
+ text: string;
926
+ fontSize: number;
927
+ /** Available width. Wrapping and fit-content sizing happen against it. */
928
+ maxWidth?: number;
929
+ /**
930
+ * `maxWidth` is the box's own width, fixed from outside (a width
931
+ * set, or the box being painted): lines wrap against it, and a word
932
+ * wider than it overflows on a line of its own. Otherwise the
933
+ * paragraph is fit-content, and a word wider than `maxWidth` widens
934
+ * it, every line wrapping against that wider box, as CSS lays out a
935
+ * box sized by its content.
936
+ */
937
+ exactWidth?: boolean;
938
+ /**
939
+ * Font family for platforms that can shape text.
940
+ *
941
+ * Deterministic measurers may ignore every style field; they
942
+ * are hints for platform-backed implementations only.
943
+ */
944
+ fontFamily?: string;
945
+ fontWeight?: string | number;
946
+ lineHeight?: number;
947
+ letterSpacing?: number;
948
+ fontStyle?: string;
949
+ fontStretch?: string;
950
+ fontVariant?: string;
951
+ fontKerning?: string;
952
+ /** Default 'word'. */
953
+ wrap?: TextWrap;
954
+ /** Keep at most this many lines. */
955
+ maxLines?: number;
956
+ /** What happens to a line that does not fit. Default 'clip'. */
957
+ overflow?: TextOverflow;
958
+ /**
959
+ * Runs of `text` with a font of their own, in order and not
960
+ * overlapping. Text outside every run is measured in the request's
961
+ * own font.
962
+ *
963
+ * Only the fields that change a width are here. A run that differs
964
+ * from its neighbours only in colour, background or underline is not
965
+ * in this list at all, so it costs a paint and never a re-layout.
966
+ */
967
+ spans?: readonly TextRunSpan[];
968
+ }
969
+ /** One run of a line: where it sits in the line and which span it came from. */
970
+ interface TextLineRun {
971
+ /** Index into the request's `spans`, or -1 for text outside every run. */
972
+ span: number;
973
+ /** Offsets into the source text. */
974
+ start: number;
975
+ end: number;
976
+ text: string;
977
+ /** Distance from the line's left edge to this run's left edge. */
978
+ x: number;
979
+ width: number;
980
+ }
981
+ /** One laid-out line. `text` is what gets drawn and may end in an ellipsis. */
982
+ interface TextLine {
983
+ /** Offsets into the source text; hanging spaces and the ellipsis are outside them. */
984
+ start: number;
985
+ end: number;
986
+ text: string;
987
+ width: number;
988
+ /**
989
+ * The line cut at its runs, present only for a paragraph that has
990
+ * spans. A hidden run is not among them.
991
+ *
992
+ * Measured once, here, where the line's own width is measured. That
993
+ * is what keeps a spanned paragraph as cheap to paint as a plain
994
+ * one: a renderer walks these and asks the platform for nothing.
995
+ */
996
+ runs?: readonly TextLineRun[];
997
+ }
998
+ interface FontMetrics {
999
+ /** Distance from the alphabetic baseline to the top of the glyph box. */
1000
+ ascent: number;
1001
+ /** Distance from the alphabetic baseline to the bottom of the glyph box. */
1002
+ descent: number;
1003
+ }
1004
+ /**
1005
+ * A measured paragraph: everything layout, alignment and painting need.
1006
+ *
1007
+ * `width` is fit-content, `height` is lines × lineHeight, and
1008
+ * `firstBaseline` is the distance from the paragraph top to the first
1009
+ * line's alphabetic baseline (half-leading plus ascent).
1010
+ */
1011
+ interface ParagraphLayout {
1012
+ lines: TextLine[];
1013
+ width: number;
1014
+ height: number;
1015
+ lineHeight: number;
1016
+ ascent: number;
1017
+ descent: number;
1018
+ firstBaseline: number;
1019
+ /** Widest unbreakable segment under the requested wrap mode. */
1020
+ minContentWidth: number;
1021
+ /** Width with no wrapping at all. */
1022
+ maxContentWidth: number;
1023
+ }
1024
+ /**
1025
+ * Abstraction between layout and text platforms.
1026
+ *
1027
+ * Layout never measures text itself; a platform layer
1028
+ * (Canvas2D, WebGPU, tests) supplies an implementation.
1029
+ */
1030
+ interface TextMeasurer {
1031
+ measure(request: TextMeasureRequest): Size;
1032
+ layout(request: TextMeasureRequest): ParagraphLayout;
1033
+ /**
1034
+ * The advance width of one run in the request's font. Caret and
1035
+ * selection geometry is built from prefix widths, so it has to come
1036
+ * from the same source as the line widths.
1037
+ */
1038
+ measureRunWidth(text: string, request: TextMeasureRequest): number;
1039
+ /**
1040
+ * Forgets every cached answer. Called when what a font string means
1041
+ * has changed under the measurer: a declared face finished loading,
1042
+ * so widths measured with its fallback are wrong now. Measurers with
1043
+ * nothing cached need not implement it.
1044
+ */
1045
+ invalidate?(): void;
1046
+ /**
1047
+ * Counts `invalidate` calls. A caller that keeps a paragraph past the
1048
+ * call that returned it (the layout engine keeps each node's last
1049
+ * one) may trust it only while this is unchanged. A measurer that
1050
+ * leaves it out is asked again every time.
1051
+ */
1052
+ readonly generation?: number;
1053
+ }
1054
+ /**
1055
+ * The primitive a platform has to provide: the advance width of one
1056
+ * run of text, and the font's vertical metrics. Everything above it
1057
+ * is shared (see ParagraphLayout.ts).
1058
+ */
1059
+ interface TextRunMeasurer {
1060
+ measureRunWidth(text: string, request: TextMeasureRequest): number;
1061
+ fontMetrics(request: TextMeasureRequest): FontMetrics;
1062
+ }
1063
+ /**
1064
+ * The widths of a paragraph whose runs have fonts of their own.
1065
+ *
1066
+ * Everything above it — line breaking, hanging blanks, the ellipsis,
1067
+ * caret and selection geometry — asks for the width of a stretch of
1068
+ * the text by its offsets rather than by its characters, and this
1069
+ * splits that stretch at the run boundaries and measures each piece in
1070
+ * its own font. That is the whole of what a span costs: the paragraph
1071
+ * algorithm is unchanged, and a paragraph with no spans never builds
1072
+ * one of these at all.
1073
+ */
1074
+ interface SpannedRuns {
1075
+ /** The runs, as the request gave them. */
1076
+ readonly spans: readonly TextRunSpan[];
1077
+ /** Index of the run covering `offset`, or -1 where no run does. */
1078
+ indexAt(offset: number): number;
1079
+ /** The request an offset is measured with: its run's, or the paragraph's. */
1080
+ requestAt(offset: number): TextMeasureRequest;
1081
+ /** Whether the character at `offset` is in a hidden run. */
1082
+ hiddenAt(offset: number): boolean;
1083
+ /** Width of `text.slice(start, end)`, measured run by run. */
1084
+ width(text: string, start: number, end: number): number;
1085
+ /**
1086
+ * Width of a string that is not in the text, in the font of the run
1087
+ * covering `offset`: the ellipsis, and the space a tab is counted
1088
+ * as.
1089
+ */
1090
+ widthOf(run: string, offset: number): number;
1091
+ /**
1092
+ * `text.slice(start, end)` cut at the run boundaries, each piece
1093
+ * placed from `x`. Hidden pieces take no room and are left out.
1094
+ */
1095
+ cut(text: string, start: number, end: number, x: number): TextLineRun[];
1096
+ }
1097
+ /**
1098
+ * Builds the run widths for a request, or undefined when it has no
1099
+ * runs.
1100
+ *
1101
+ * One request object per run, built once: the paragraph cache means a
1102
+ * paragraph is laid out once per distinct request, so this runs once
1103
+ * per paragraph rather than once per frame.
1104
+ */
1105
+ declare function spannedRunsFor(request: TextMeasureRequest, runs: Pick<TextRunMeasurer, 'measureRunWidth'>): SpannedRuns | undefined;
1106
+ /**
1107
+ * Base class for measurers: implement the two primitives and the
1108
+ * paragraph algorithm does the rest.
1109
+ *
1110
+ * **Every paragraph is laid out once per distinct request.** The same
1111
+ * request arrives several times a frame and on every frame after: the
1112
+ * layout engine asks when it measures the node, and both renderers ask
1113
+ * again when they paint it, because a `PaintState` and a box are all a
1114
+ * renderer holds. Without a cache a repaint is a line break, and a
1115
+ * transition that repaints the whole screen for half a second breaks
1116
+ * every paragraph on it sixty times a second. Measured on Sluice's
1117
+ * Bluesky feed opening a post: 30 to 50 ms a frame in `segmentParagraph`,
1118
+ * `measureRunWidth` and `applySpacing`, against under 13 ms on the same
1119
+ * click over short Wikipedia titles. The cache is keyed by every field
1120
+ * of the request, so a paragraph that changed in any way is laid out
1121
+ * again, and it is least-recently-used with a cap, so a feed that
1122
+ * mounts forty new rows a second does not grow it without bound.
1123
+ *
1124
+ * The result is shared between callers and must not be mutated.
1125
+ */
1126
+ declare abstract class ParagraphTextMeasurer implements TextMeasurer, TextRunMeasurer {
1127
+ private readonly paragraphs;
1128
+ /**
1129
+ * Paragraphs that came out the same at every width they fit in, by
1130
+ * their key without the width; see `layoutFitsAnyWidth`.
1131
+ *
1132
+ * A resize asks every paragraph again at a width a few pixels from
1133
+ * the last, and a title, a caption or a label that fitted before
1134
+ * fits still: its lines, its box and everything else are what they
1135
+ * were. Keyed by its width as well, each of those missed on every
1136
+ * step of a dragged window edge and was laid out again, and the
1137
+ * box it was then painted in (its own width, exact) missed once
1138
+ * more.
1139
+ */
1140
+ private readonly fitting;
1141
+ private generations;
1142
+ abstract measureRunWidth(text: string, request: TextMeasureRequest): number;
1143
+ abstract fontMetrics(request: TextMeasureRequest): FontMetrics;
1144
+ layout(request: TextMeasureRequest): ParagraphLayout;
1145
+ measure(request: TextMeasureRequest): Size;
1146
+ /** How many paragraphs are remembered right now; for specs. */
1147
+ get cachedParagraphs(): number;
1148
+ get generation(): number;
1149
+ /**
1150
+ * Forgets every laid-out paragraph. A subclass that caches its own
1151
+ * primitives overrides this and calls it, so a font that finished
1152
+ * loading invalidates the lines as well as the widths they were
1153
+ * built from.
1154
+ */
1155
+ invalidate(): void;
1156
+ }
1157
+ interface FixedMetricsOptions {
1158
+ /** Advance of every glyph as a fraction of the font size. Default 0.6. */
1159
+ glyphWidth?: number;
1160
+ /** Ascent as a fraction of the font size. Default 0.8. */
1161
+ ascent?: number;
1162
+ /** Descent as a fraction of the font size. Default 0.2. */
1163
+ descent?: number;
1164
+ }
1165
+ /**
1166
+ * Deterministic measurer: every glyph is `glyphWidth` em wide, the
1167
+ * font is `ascent + descent` em tall, and the default line is 1.2em.
1168
+ *
1169
+ * Intended for tests and headless environments. With `glyphWidth: 1`
1170
+ * it reproduces the Ahem test font exactly, which is how the layout
1171
+ * conformance fixtures compare real wrapping text against Chrome.
1172
+ */
1173
+ declare class CharacterCountTextMeasurer extends ParagraphTextMeasurer {
1174
+ private readonly glyphWidth;
1175
+ private readonly ascentFactor;
1176
+ private readonly descentFactor;
1177
+ constructor(options?: FixedMetricsOptions);
1178
+ measureRunWidth(text: string, request: TextMeasureRequest): number;
1179
+ fontMetrics(request: TextMeasureRequest): FontMetrics;
1180
+ }
1181
+ //#endregion
892
1182
  //#region src/layout/LayoutRecord.d.ts
1183
+ /** A text leaf's paragraph, the request it was laid out for, and the measurer generation it was laid out under. */
1184
+ interface TextMemo {
1185
+ readonly request: TextMeasureRequest;
1186
+ readonly paragraph: ParagraphLayout;
1187
+ readonly generation: number;
1188
+ /** The paragraph is the same at any width it fits in; see `layoutFitsAnyWidth`. */
1189
+ readonly fitsAnyWidth: boolean;
1190
+ }
893
1191
  /**
894
1192
  * Mutable per-node layout projection owned by LayoutEngine.
895
1193
  *
@@ -1058,6 +1356,8 @@ declare class LayoutRecord {
1058
1356
  * multiline, the overlay scrollbars.
1059
1357
  */
1060
1358
  scrollsText: boolean;
1359
+ /** A scroll container set to show no scrollbars (\`scrollbars: 'none'\`). */
1360
+ hidesScrollbars: boolean;
1061
1361
  /**
1062
1362
  * A multiline editable, which shows the overlay scrollbars a scroll
1063
1363
  * container does over its own text. A single-line field scrolls
@@ -1122,6 +1422,23 @@ declare class LayoutRecord {
1122
1422
  contentHeight: number;
1123
1423
  /** Constraints this record was last measured under. */
1124
1424
  lastConstraints: Constraints;
1425
+ /**
1426
+ * The paragraphs a text leaf was last measured as, one asked with a
1427
+ * width and one without; see `LayoutEngine.measureLeaf`. Flex asks
1428
+ * an item both questions every pass (its max-content basis, then its
1429
+ * final width), so one slot would be overwritten by the other every
1430
+ * time. Null until the node is measured as text that way.
1431
+ *
1432
+ * **Not reset.** These are the one thing a record carries from one
1433
+ * full pass into the next, on purpose: a full pass re-asks every
1434
+ * text leaf, and a memo that every pass cleared would answer
1435
+ * nothing a resize asks. They are safe to keep because they check
1436
+ * themselves — a memo is used only when every field of the request
1437
+ * it was laid out for matches and the measurer has not been
1438
+ * invalidated since — rather than trusting that nothing changed.
1439
+ */
1440
+ textBounded: TextMemo | null;
1441
+ textUnbounded: TextMemo | null;
1125
1442
  /**
1126
1443
  * The percentage base the current measurement resolved against, and
1127
1444
  * whether the node has a length that resolves against one.
@@ -1212,6 +1529,20 @@ declare class LayoutRecord {
1212
1529
  propsPass: number;
1213
1530
  propsBaseWidth: number | undefined;
1214
1531
  propsBaseHeight: number | undefined;
1532
+ /**
1533
+ * The node's `propertyVersion` when its layout properties were last
1534
+ * resolved, and whether that resolution read the node and nothing
1535
+ * else (no inherited direction, no scroll leader). Together with the
1536
+ * percentage base they let a later pass, a full one included, keep
1537
+ * what the last one resolved instead of reading forty properties
1538
+ * again; see `LayoutEngine.resolveLayoutProps`.
1539
+ *
1540
+ * **Not reset,** with the fields they vouch for: `reset()` leaves
1541
+ * every field `resolveLayoutProps` writes as it was, because these
1542
+ * say whether it is still right.
1543
+ */
1544
+ propsVersion: number;
1545
+ propsFromNodeAlone: boolean;
1215
1546
  /**
1216
1547
  * Returns the record to the state a freshly constructed one is in,
1217
1548
  * so a full layout can reuse the object instead of replacing it.
@@ -1226,7 +1557,9 @@ declare class LayoutRecord {
1226
1557
  * never reused across.
1227
1558
  *
1228
1559
  * **Every field above has to appear here, with the value it is
1229
- * declared with.** A field that is added and not reset would carry
1560
+ * declared with,** but the two text memos and the resolved layout
1561
+ * properties, which check themselves and are kept across passes on
1562
+ * purpose. A field that is added and not reset would carry
1230
1563
  * one pass's answer into the next, which is the kind of fault that
1231
1564
  * shows as a stale box on a screen and as nothing at all in a test
1232
1565
  * that lays out once. `LayoutRecord.spec.ts` compares a reset record
@@ -1722,8 +2055,23 @@ declare class UiNode {
1722
2055
  * opacity → 0.5
1723
2056
  * visible → true
1724
2057
  * width → 200
2058
+ *
2059
+ * Read it directly; write it through `setProperty` and
2060
+ * `removeProperty`, which count the change in `propertyVersion`.
1725
2061
  */
1726
2062
  readonly properties: Map<string, unknown>;
2063
+ /**
2064
+ * Counts writes to `properties`.
2065
+ *
2066
+ * Lets something derived from a node's own properties tell that it
2067
+ * is still right without reading them again. The layout engine
2068
+ * resolves forty of them into each record, and on a full pass over a
2069
+ * tree where nothing changed that reading was most of a sixth of the
2070
+ * pass. A counter is exact where a dirty flag is not: flags are
2071
+ * cleared by whichever pass runs next, and a record is resolved by
2072
+ * whichever pass reaches it.
2073
+ */
2074
+ propertyVersion: number;
1727
2075
  /**
1728
2076
  * Values a modifier has written over the element's own.
1729
2077
  *
@@ -1763,6 +2111,8 @@ declare class UiNode {
1763
2111
  isDirty(): boolean;
1764
2112
  getProperty<T>(property: NodeProperty): T | undefined;
1765
2113
  setProperty<T>(property: NodeProperty, value: T): void;
2114
+ /** Removes a property; whether it was there. */
2115
+ removeProperty(property: NodeProperty): boolean;
1766
2116
  }
1767
2117
  //#endregion
1768
2118
  //#region src/layout/LayoutTypes.d.ts
@@ -2064,6 +2414,8 @@ declare class DirtyNodeSet {
2064
2414
  delete(node: UiNode): boolean;
2065
2415
  get size(): number;
2066
2416
  isEmpty(): boolean;
2417
+ /** The nodes in the set, without draining it. Not to be changed while walked. */
2418
+ values(): IterableIterator<UiNode>;
2067
2419
  /**
2068
2420
  * Whether any node in the set carries one of `flags`, without
2069
2421
  * draining it.
@@ -3023,8 +3375,13 @@ declare class UiFocusManager {
3023
3375
  * when that scope was pushed, when that node is still in the tree
3024
3376
  * and still focusable. Otherwise focus is dropped rather than left
3025
3377
  * on a node the scope was hiding.
3378
+ *
3379
+ * Given its root, only that scope ends: none, when it has gone already
3380
+ * (its subtree removed, which pops it), so a trap released after its
3381
+ * content was taken away cannot end the one under it, a submenu's
3382
+ * menu's; and one under another is taken out where it is.
3026
3383
  */
3027
- popScope(): void;
3384
+ popScope(root?: UiNode): void;
3028
3385
  /**
3029
3386
  * Reacts to a subtree leaving the graph.
3030
3387
  *
@@ -5189,6 +5546,19 @@ interface LazyListOptions {
5189
5546
  readonly estimatedExtent: number;
5190
5547
  /** Items mounted beyond each edge of the viewport. Default 3. */
5191
5548
  readonly overscan?: number;
5549
+ /**
5550
+ * Reuse an item's node for the item that takes its place, as a native
5551
+ * list recycles its cells: an item scrolling out of the window hands its
5552
+ * node, and its component, to the one scrolling in, which is given the
5553
+ * new index. Nothing is built or torn down as the list scrolls, only
5554
+ * updated, which is most of what a scroll through rows of many nodes
5555
+ * costs.
5556
+ *
5557
+ * \`key\` is not used: items are keyed by their slot. The component an
5558
+ * item renders must follow its inputs as they change, since one keeps
5559
+ * its instance from item to item.
5560
+ */
5561
+ readonly recycle?: boolean;
5192
5562
  /** Identity of an item, for reconciliation. Default: its index. */
5193
5563
  readonly key?: (index: number) => string | number;
5194
5564
  /**
@@ -5293,6 +5663,15 @@ declare class UiVirtualWindow {
5293
5663
  private count;
5294
5664
  private readonly estimate;
5295
5665
  private readonly overscan;
5666
+ private readonly recycle;
5667
+ /**
5668
+ * The slot each mounted item is keyed by, when recycling: an item keeps
5669
+ * its slot while it stays, and one leaving gives its slot to the next
5670
+ * one to come, whose element then matches the node it leaves behind.
5671
+ */
5672
+ private readonly slotOf;
5673
+ private readonly freeSlots;
5674
+ private nextSlot;
5296
5675
  private readonly keyOf;
5297
5676
  private readonly renderItem;
5298
5677
  private readonly grid;
@@ -6443,6 +6822,14 @@ declare const UiProperties: {
6443
6822
  * descendants stick to its edges.
6444
6823
  */
6445
6824
  readonly overflow: UiPropertyDefinition<UiOverflow | undefined>;
6825
+ /**
6826
+ * Whether a scroll container shows its overlay scrollbars: \`'auto'\`
6827
+ * (the default) while scrolling, \`'none'\` never, and then they cannot
6828
+ * be grabbed either. For a container scrolled by something else, as a
6829
+ * picture is moved inside a window onto it, where a bar would claim
6830
+ * the person could scroll it.
6831
+ */
6832
+ readonly scrollbars: UiPropertyDefinition<"auto" | "none" | undefined>;
6446
6833
  readonly inset: UiPropertyDefinition<UiLength | undefined>;
6447
6834
  readonly backgroundColor: UiPropertyDefinition<UiColorValue | undefined>;
6448
6835
  /**
@@ -6537,6 +6924,12 @@ declare const UiProperties: {
6537
6924
  readonly multiline: UiPropertyDefinition<boolean | undefined>;
6538
6925
  /** The text can be selected and copied but not changed. */
6539
6926
  readonly readOnly: UiPropertyDefinition<boolean | undefined>;
6927
+ /**
6928
+ * A password field: every character is drawn as a bullet, copy and
6929
+ * cut take nothing, and the shell edits it through a password input.
6930
+ * The value itself is unchanged. Single-line only.
6931
+ */
6932
+ readonly secret: UiPropertyDefinition<boolean | undefined>;
6540
6933
  /** Colour of the caret; defaults to the text colour. */
6541
6934
  readonly caretColor: UiPropertyDefinition<UiColorValue | undefined>;
6542
6935
  /** Colour behind selected text; defaults to a translucent theme primary. */
@@ -6949,7 +7342,7 @@ type CommonProps = IdentityProps & UiEventProps & BoxModelProps & FlexItemProps
6949
7342
  * layout replaces whatever the container would have done with its
6950
7343
  * children, whichever container it is; see `layout/CustomLayout.ts`.
6951
7344
  */
6952
- type ContainerProps = CommonProps & PropsOf<'overflow' | 'scrollX' | 'scrollY' | 'scrollWith' | 'scrollWithAxis' | 'scrollBehavior' | 'overscrollBehavior' | 'layout'>;
7345
+ type ContainerProps = CommonProps & PropsOf<'overflow' | 'scrollbars' | 'scrollX' | 'scrollY' | 'scrollWith' | 'scrollWithAxis' | 'scrollBehavior' | 'overscrollBehavior' | 'layout'>;
6953
7346
  /** Props of a flex container: Row, Column, ScrollView. */
6954
7347
  type FlexContainerProps = ContainerProps & PropsOf<'gap' | 'rowGap' | 'columnGap' | 'x' | 'y' | 'flexWrap' | 'alignContent' | 'direction'>;
6955
7348
  /**
@@ -6975,7 +7368,7 @@ type TextProps = CommonProps & TextContentProps;
6975
7368
  * offset into the model's string, and runs describing a different one
6976
7369
  * would put the glyphs where the caret does not agree with them.
6977
7370
  */
6978
- type EditableTextProps = CommonProps & PropsOf<'value' | 'spans' | 'placeholder' | 'multiline' | 'readOnly' | 'textWrap' | 'verticalAlign' | 'caretColor' | 'selectionColor' | 'placeholderColor'>;
7371
+ type EditableTextProps = CommonProps & PropsOf<'value' | 'spans' | 'placeholder' | 'multiline' | 'readOnly' | 'secret' | 'textWrap' | 'verticalAlign' | 'caretColor' | 'selectionColor' | 'placeholderColor'>;
6979
7372
  /**
6980
7373
  * A Box stacks its children in one content box, aligned by `x` / `y`,
6981
7374
  * and may draw an image behind them.
@@ -7083,6 +7476,15 @@ interface UiGraphBuilderOptions {
7083
7476
  declare class UiGraphBuilder {
7084
7477
  private readonly graph;
7085
7478
  private readonly refs;
7479
+ /**
7480
+ * The definition each node was last reconciled from. A definition is
7481
+ * a description that is never changed once made, so the same object
7482
+ * again has nothing new to say: a lazy list hands back the row it made
7483
+ * for an index on every scroll, and reconciling seventy unchanged rows
7484
+ * (their props, then every node of each row's component) to mount the
7485
+ * four that scrolled in cost a 165 Hz frame its budget.
7486
+ */
7487
+ private readonly reconciledFrom;
7086
7488
  private readonly modifiers;
7087
7489
  private nextChildrenBindingId;
7088
7490
  /**
@@ -7442,6 +7844,14 @@ declare class UiGraph {
7442
7844
  */
7443
7845
  insertBefore(parent: UiNode, child: UiNode, reference: UiNode | null): void;
7444
7846
  removeNode(node: UiNode): void;
7847
+ /**
7848
+ * Moves a child before \`reference\` among its own siblings, or to the
7849
+ * end when that is null. Its parent is unchanged, and so is everything
7850
+ * it inherits, so its subtree is not visited: a lazy list recycling its
7851
+ * rows moves one from end to end on every frame of a scroll, and
7852
+ * re-inheriting walked the whole row each time.
7853
+ */
7854
+ moveWithin(child: UiNode, reference: UiNode | null): void;
7445
7855
  detachNode(node: UiNode): void;
7446
7856
  /**
7447
7857
  * The binding driving one property of one node, if any.
@@ -7971,377 +8381,119 @@ declare function graphemeBoundaries(text: string): number[];
7971
8381
  */
7972
8382
  declare function nextWordEnd(text: string, index: number): number;
7973
8383
  /**
7974
- * Where a word-wise move to the left stops: back over spaces and
7975
- * punctuation, to the start of the previous word.
7976
- */
7977
- declare function previousWordStart(text: string, index: number): number;
7978
- /**
7979
- * The word under `index`, for a double-click: a run of word
7980
- * characters, else the run of whatever else is there (spaces,
7981
- * punctuation), never crossing a newline.
7982
- */
7983
- declare function wordRangeAt(text: string, index: number): {
7984
- start: number;
7985
- end: number;
7986
- };
7987
- /** The offset just after the previous newline, or 0. */
7988
- declare function lineStartAt(text: string, index: number): number;
7989
- /** The offset of the next newline, or `text.length`. */
7990
- declare function lineEndAt(text: string, index: number): number;
7991
- //#endregion
7992
- //#region src/editing/TextGeometry.d.ts
7993
- /**
7994
- * A placed line, as `placeLines` in the text renderer produces: the
7995
- * source offsets it covers, its box after alignment, and its text.
7996
- */
7997
- interface PlacedLine {
7998
- readonly text: string;
7999
- readonly start: number;
8000
- readonly end: number;
8001
- readonly x: number;
8002
- readonly y: number;
8003
- readonly width: number;
8004
- readonly height: number;
8005
- }
8006
- /**
8007
- * The advance width of a run in the paragraph's font.
8008
- *
8009
- * `start` is the run's first character's offset in the source text,
8010
- * and is what a paragraph with runs of its own needs to know which
8011
- * font to measure in; a paragraph in one font ignores it. Omitted for
8012
- * a string that is not in the text at all, such as the space a
8013
- * selection past the end of a line is widened by.
8014
- */
8015
- type RunMeasure = (text: string, start?: number) => number;
8016
- interface CaretRect {
8017
- x: number;
8018
- y: number;
8019
- height: number;
8020
- /** Index of the line the caret is on. */
8021
- line: number;
8022
- }
8023
- /**
8024
- * Caret and selection geometry over laid-out lines.
8025
- *
8026
- * The lines are the paragraph the layout engine sized the node with
8027
- * and the renderer draws, so a caret computed here sits exactly where
8028
- * the glyphs are. Widths come from the same measurer: the x of offset
8029
- * `n` on a line is the width of that line's first `n` characters.
8030
- *
8031
- * Direction: `rtl` mirrors every x against the line's right edge, so a
8032
- * right-to-left paragraph places its caret and selection from the
8033
- * right. Runs of mixed direction within one line are not reordered —
8034
- * the renderers do not shape them either — so this is direction-aware
8035
- * rather than fully bidirectional, and says so.
8036
- */
8037
- /**
8038
- * The line an offset belongs to. Hanging spaces at a wrap belong to
8039
- * the line before the break; the first character after the break
8040
- * starts the next line.
8041
- */
8042
- declare function lineIndexForOffset(lines: readonly PlacedLine[], offset: number): number;
8043
- /**
8044
- * The offset a line's caret positions run to, hanging spaces included:
8045
- * the text's end on the last line, else up to the break — the newline
8046
- * character itself, or the first character of the next line.
8047
- *
8048
- * `line.end` stops at the last glyph, since spaces at a wrap hang and
8049
- * have no width in layout. The caret still has to move through them,
8050
- * as it does in a textarea, so geometry measures them from `text`.
8051
- */
8052
- declare function lineLimit(lines: readonly PlacedLine[], index: number, text: string): number;
8053
- /** Where the caret for `offset` is drawn. */
8054
- declare function caretRectFor(lines: readonly PlacedLine[], text: string, offset: number, measure: RunMeasure, rtl: boolean): CaretRect;
8055
- /** The line whose box contains `y`, clamped to the first and last. */
8056
- declare function lineIndexAtY(lines: readonly PlacedLine[], y: number): number;
8057
- /** The caret position nearest to a point: the boundary closest to `x` on the line under `y`. */
8058
- declare function offsetAtPoint(lines: readonly PlacedLine[], text: string, x: number, y: number, measure: RunMeasure, rtl: boolean): number;
8059
- /**
8060
- * The caret position on one line nearest to `x`. Widths grow with the
8061
- * prefix, so the boundary is found by bisection: O(log n) measures per
8062
- * click on a line of n graphemes.
8063
- *
8064
- * On the last line the trailing spaces are positions too, so a click
8065
- * past the text lands after them. On a wrapped line the hanging spaces
8066
- * are not: a click past the glyphs stops before the break, as it does
8067
- * in a textarea.
8068
- */
8069
- declare function offsetAtX(lines: readonly PlacedLine[], index: number, text: string, x: number, measure: RunMeasure, rtl: boolean): number;
8070
- /**
8071
- * The offset a vertical move lands on: the position nearest the
8072
- * caret's x (or `goalX`, the x of the line the run of moves started
8073
- * on) on the adjacent line. Null when there is no line that way, which
8074
- * callers turn into "go to the start / end of the text".
8075
- */
8076
- declare function offsetForVerticalMove(lines: readonly PlacedLine[], text: string, offset: number, direction: -1 | 1, measure: RunMeasure, rtl: boolean, goalX?: number): {
8077
- offset: number;
8078
- x: number;
8079
- } | null;
8080
- /**
8081
- * The boxes covering `[start, end)`, one per line touched. Hanging
8082
- * spaces inside the range are highlighted at their width; a line the
8083
- * range runs past with nothing hanging gets a space's width more, so a
8084
- * selected line break is visible.
8085
- */
8086
- declare function selectionRects(lines: readonly PlacedLine[], text: string, start: number, end: number, measure: RunMeasure, rtl: boolean): LayoutBox[];
8087
- //#endregion
8088
- //#region src/layout/TextMeasurer.d.ts
8089
- type TextWrap = 'word' | 'char' | 'none';
8090
- type TextOverflow = 'clip' | 'ellipsis';
8091
- /**
8092
- * The font a piece of text is measured in.
8093
- *
8094
- * Structural rather than imported so that layout keeps depending on
8095
- * nothing above it; a `UiResolvedTextSpan` is one of these plus the
8096
- * fields that only paint reads.
8097
- */
8098
- interface TextRunStyle {
8099
- fontFamily?: string;
8100
- fontWeight?: string | number;
8101
- fontSize?: number;
8102
- fontStyle?: string;
8103
- fontStretch?: string;
8104
- fontVariant?: string;
8105
- fontKerning?: string;
8106
- letterSpacing?: number;
8107
- }
8108
- /** A run of the paragraph with a font of its own, as offsets into the text. */
8109
- interface TextRunSpan extends TextRunStyle {
8110
- readonly start: number;
8111
- readonly end: number;
8112
- /**
8113
- * The run is in the text but takes no room: every width that touches
8114
- * it counts it as nothing, and a line's `runs` leave it out, so no
8115
- * renderer has anything to draw for it.
8116
- */
8117
- readonly hidden?: boolean;
8118
- }
8119
- interface TextMeasureRequest {
8120
- text: string;
8121
- fontSize: number;
8122
- /** Available width. Wrapping and fit-content sizing happen against it. */
8123
- maxWidth?: number;
8124
- /**
8125
- * Font family for platforms that can shape text.
8126
- *
8127
- * Deterministic measurers may ignore every style field; they
8128
- * are hints for platform-backed implementations only.
8129
- */
8130
- fontFamily?: string;
8131
- fontWeight?: string | number;
8132
- lineHeight?: number;
8133
- letterSpacing?: number;
8134
- fontStyle?: string;
8135
- fontStretch?: string;
8136
- fontVariant?: string;
8137
- fontKerning?: string;
8138
- /** Default 'word'. */
8139
- wrap?: TextWrap;
8140
- /** Keep at most this many lines. */
8141
- maxLines?: number;
8142
- /** What happens to a line that does not fit. Default 'clip'. */
8143
- overflow?: TextOverflow;
8144
- /**
8145
- * Runs of `text` with a font of their own, in order and not
8146
- * overlapping. Text outside every run is measured in the request's
8147
- * own font.
8148
- *
8149
- * Only the fields that change a width are here. A run that differs
8150
- * from its neighbours only in colour, background or underline is not
8151
- * in this list at all, so it costs a paint and never a re-layout.
8152
- */
8153
- spans?: readonly TextRunSpan[];
8154
- }
8155
- /** One run of a line: where it sits in the line and which span it came from. */
8156
- interface TextLineRun {
8157
- /** Index into the request's `spans`, or -1 for text outside every run. */
8158
- span: number;
8159
- /** Offsets into the source text. */
8160
- start: number;
8161
- end: number;
8162
- text: string;
8163
- /** Distance from the line's left edge to this run's left edge. */
8164
- x: number;
8165
- width: number;
8166
- }
8167
- /** One laid-out line. `text` is what gets drawn and may end in an ellipsis. */
8168
- interface TextLine {
8169
- /** Offsets into the source text; hanging spaces and the ellipsis are outside them. */
8170
- start: number;
8171
- end: number;
8172
- text: string;
8173
- width: number;
8174
- /**
8175
- * The line cut at its runs, present only for a paragraph that has
8176
- * spans. A hidden run is not among them.
8177
- *
8178
- * Measured once, here, where the line's own width is measured. That
8179
- * is what keeps a spanned paragraph as cheap to paint as a plain
8180
- * one: a renderer walks these and asks the platform for nothing.
8181
- */
8182
- runs?: readonly TextLineRun[];
8183
- }
8184
- interface FontMetrics {
8185
- /** Distance from the alphabetic baseline to the top of the glyph box. */
8186
- ascent: number;
8187
- /** Distance from the alphabetic baseline to the bottom of the glyph box. */
8188
- descent: number;
8384
+ * Where a word-wise move to the left stops: back over spaces and
8385
+ * punctuation, to the start of the previous word.
8386
+ */
8387
+ declare function previousWordStart(text: string, index: number): number;
8388
+ /**
8389
+ * The word under `index`, for a double-click: a run of word
8390
+ * characters, else the run of whatever else is there (spaces,
8391
+ * punctuation), never crossing a newline.
8392
+ */
8393
+ declare function wordRangeAt(text: string, index: number): {
8394
+ start: number;
8395
+ end: number;
8396
+ };
8397
+ /** The offset just after the previous newline, or 0. */
8398
+ declare function lineStartAt(text: string, index: number): number;
8399
+ /** The offset of the next newline, or `text.length`. */
8400
+ declare function lineEndAt(text: string, index: number): number;
8401
+ //#endregion
8402
+ //#region src/editing/TextGeometry.d.ts
8403
+ /**
8404
+ * A placed line, as `placeLines` in the text renderer produces: the
8405
+ * source offsets it covers, its box after alignment, and its text.
8406
+ */
8407
+ interface PlacedLine {
8408
+ readonly text: string;
8409
+ readonly start: number;
8410
+ readonly end: number;
8411
+ readonly x: number;
8412
+ readonly y: number;
8413
+ readonly width: number;
8414
+ readonly height: number;
8189
8415
  }
8190
8416
  /**
8191
- * A measured paragraph: everything layout, alignment and painting need.
8417
+ * The advance width of a run in the paragraph's font.
8192
8418
  *
8193
- * `width` is fit-content, `height` is lines × lineHeight, and
8194
- * `firstBaseline` is the distance from the paragraph top to the first
8195
- * line's alphabetic baseline (half-leading plus ascent).
8419
+ * `start` is the run's first character's offset in the source text,
8420
+ * and is what a paragraph with runs of its own needs to know which
8421
+ * font to measure in; a paragraph in one font ignores it. Omitted for
8422
+ * a string that is not in the text at all, such as the space a
8423
+ * selection past the end of a line is widened by.
8196
8424
  */
8197
- interface ParagraphLayout {
8198
- lines: TextLine[];
8199
- width: number;
8425
+ type RunMeasure = (text: string, start?: number) => number;
8426
+ interface CaretRect {
8427
+ x: number;
8428
+ y: number;
8200
8429
  height: number;
8201
- lineHeight: number;
8202
- ascent: number;
8203
- descent: number;
8204
- firstBaseline: number;
8205
- /** Widest unbreakable segment under the requested wrap mode. */
8206
- minContentWidth: number;
8207
- /** Width with no wrapping at all. */
8208
- maxContentWidth: number;
8430
+ /** Index of the line the caret is on. */
8431
+ line: number;
8209
8432
  }
8210
8433
  /**
8211
- * Abstraction between layout and text platforms.
8434
+ * Caret and selection geometry over laid-out lines.
8212
8435
  *
8213
- * Layout never measures text itself; a platform layer
8214
- * (Canvas2D, WebGPU, tests) supplies an implementation.
8436
+ * The lines are the paragraph the layout engine sized the node with
8437
+ * and the renderer draws, so a caret computed here sits exactly where
8438
+ * the glyphs are. Widths come from the same measurer: the x of offset
8439
+ * `n` on a line is the width of that line's first `n` characters.
8440
+ *
8441
+ * Direction: `rtl` mirrors every x against the line's right edge, so a
8442
+ * right-to-left paragraph places its caret and selection from the
8443
+ * right. Runs of mixed direction within one line are not reordered —
8444
+ * the renderers do not shape them either — so this is direction-aware
8445
+ * rather than fully bidirectional, and says so.
8215
8446
  */
8216
- interface TextMeasurer {
8217
- measure(request: TextMeasureRequest): Size;
8218
- layout(request: TextMeasureRequest): ParagraphLayout;
8219
- /**
8220
- * The advance width of one run in the request's font. Caret and
8221
- * selection geometry is built from prefix widths, so it has to come
8222
- * from the same source as the line widths.
8223
- */
8224
- measureRunWidth(text: string, request: TextMeasureRequest): number;
8225
- /**
8226
- * Forgets every cached answer. Called when what a font string means
8227
- * has changed under the measurer: a declared face finished loading,
8228
- * so widths measured with its fallback are wrong now. Measurers with
8229
- * nothing cached need not implement it.
8230
- */
8231
- invalidate?(): void;
8232
- }
8233
8447
  /**
8234
- * The primitive a platform has to provide: the advance width of one
8235
- * run of text, and the font's vertical metrics. Everything above it
8236
- * is shared (see ParagraphLayout.ts).
8448
+ * The line an offset belongs to. Hanging spaces at a wrap belong to
8449
+ * the line before the break; the first character after the break
8450
+ * starts the next line.
8237
8451
  */
8238
- interface TextRunMeasurer {
8239
- measureRunWidth(text: string, request: TextMeasureRequest): number;
8240
- fontMetrics(request: TextMeasureRequest): FontMetrics;
8241
- }
8452
+ declare function lineIndexForOffset(lines: readonly PlacedLine[], offset: number): number;
8242
8453
  /**
8243
- * The widths of a paragraph whose runs have fonts of their own.
8454
+ * The offset a line's caret positions run to, hanging spaces included:
8455
+ * the text's end on the last line, else up to the break — the newline
8456
+ * character itself, or the first character of the next line.
8244
8457
  *
8245
- * Everything above it — line breaking, hanging blanks, the ellipsis,
8246
- * caret and selection geometry — asks for the width of a stretch of
8247
- * the text by its offsets rather than by its characters, and this
8248
- * splits that stretch at the run boundaries and measures each piece in
8249
- * its own font. That is the whole of what a span costs: the paragraph
8250
- * algorithm is unchanged, and a paragraph with no spans never builds
8251
- * one of these at all.
8458
+ * `line.end` stops at the last glyph, since spaces at a wrap hang and
8459
+ * have no width in layout. The caret still has to move through them,
8460
+ * as it does in a textarea, so geometry measures them from `text`.
8252
8461
  */
8253
- interface SpannedRuns {
8254
- /** The runs, as the request gave them. */
8255
- readonly spans: readonly TextRunSpan[];
8256
- /** Index of the run covering `offset`, or -1 where no run does. */
8257
- indexAt(offset: number): number;
8258
- /** The request an offset is measured with: its run's, or the paragraph's. */
8259
- requestAt(offset: number): TextMeasureRequest;
8260
- /** Whether the character at `offset` is in a hidden run. */
8261
- hiddenAt(offset: number): boolean;
8262
- /** Width of `text.slice(start, end)`, measured run by run. */
8263
- width(text: string, start: number, end: number): number;
8264
- /**
8265
- * Width of a string that is not in the text, in the font of the run
8266
- * covering `offset`: the ellipsis, and the space a tab is counted
8267
- * as.
8268
- */
8269
- widthOf(run: string, offset: number): number;
8270
- /**
8271
- * `text.slice(start, end)` cut at the run boundaries, each piece
8272
- * placed from `x`. Hidden pieces take no room and are left out.
8273
- */
8274
- cut(text: string, start: number, end: number, x: number): TextLineRun[];
8275
- }
8462
+ declare function lineLimit(lines: readonly PlacedLine[], index: number, text: string): number;
8463
+ /** Where the caret for `offset` is drawn. */
8464
+ declare function caretRectFor(lines: readonly PlacedLine[], text: string, offset: number, measure: RunMeasure, rtl: boolean): CaretRect;
8465
+ /** The line whose box contains `y`, clamped to the first and last. */
8466
+ declare function lineIndexAtY(lines: readonly PlacedLine[], y: number): number;
8467
+ /** The caret position nearest to a point: the boundary closest to `x` on the line under `y`. */
8468
+ declare function offsetAtPoint(lines: readonly PlacedLine[], text: string, x: number, y: number, measure: RunMeasure, rtl: boolean): number;
8276
8469
  /**
8277
- * Builds the run widths for a request, or undefined when it has no
8278
- * runs.
8470
+ * The caret position on one line nearest to `x`. Widths grow with the
8471
+ * prefix, so the boundary is found by bisection: O(log n) measures per
8472
+ * click on a line of n graphemes.
8279
8473
  *
8280
- * One request object per run, built once: the paragraph cache means a
8281
- * paragraph is laid out once per distinct request, so this runs once
8282
- * per paragraph rather than once per frame.
8474
+ * On the last line the trailing spaces are positions too, so a click
8475
+ * past the text lands after them. On a wrapped line the hanging spaces
8476
+ * are not: a click past the glyphs stops before the break, as it does
8477
+ * in a textarea.
8283
8478
  */
8284
- declare function spannedRunsFor(request: TextMeasureRequest, runs: Pick<TextRunMeasurer, 'measureRunWidth'>): SpannedRuns | undefined;
8479
+ declare function offsetAtX(lines: readonly PlacedLine[], index: number, text: string, x: number, measure: RunMeasure, rtl: boolean): number;
8285
8480
  /**
8286
- * Base class for measurers: implement the two primitives and the
8287
- * paragraph algorithm does the rest.
8288
- *
8289
- * **Every paragraph is laid out once per distinct request.** The same
8290
- * request arrives several times a frame and on every frame after: the
8291
- * layout engine asks when it measures the node, and both renderers ask
8292
- * again when they paint it, because a `PaintState` and a box are all a
8293
- * renderer holds. Without a cache a repaint is a line break, and a
8294
- * transition that repaints the whole screen for half a second breaks
8295
- * every paragraph on it sixty times a second. Measured on Sluice's
8296
- * Bluesky feed opening a post: 30 to 50 ms a frame in `segmentParagraph`,
8297
- * `measureRunWidth` and `applySpacing`, against under 13 ms on the same
8298
- * click over short Wikipedia titles. The cache is keyed by every field
8299
- * of the request, so a paragraph that changed in any way is laid out
8300
- * again, and it is least-recently-used with a cap, so a feed that
8301
- * mounts forty new rows a second does not grow it without bound.
8302
- *
8303
- * The result is shared between callers and must not be mutated.
8481
+ * The offset a vertical move lands on: the position nearest the
8482
+ * caret's x (or `goalX`, the x of the line the run of moves started
8483
+ * on) on the adjacent line. Null when there is no line that way, which
8484
+ * callers turn into "go to the start / end of the text".
8304
8485
  */
8305
- declare abstract class ParagraphTextMeasurer implements TextMeasurer, TextRunMeasurer {
8306
- private readonly paragraphs;
8307
- abstract measureRunWidth(text: string, request: TextMeasureRequest): number;
8308
- abstract fontMetrics(request: TextMeasureRequest): FontMetrics;
8309
- layout(request: TextMeasureRequest): ParagraphLayout;
8310
- measure(request: TextMeasureRequest): Size;
8311
- /** How many paragraphs are remembered right now; for specs. */
8312
- get cachedParagraphs(): number;
8313
- /**
8314
- * Forgets every laid-out paragraph. A subclass that caches its own
8315
- * primitives overrides this and calls it, so a font that finished
8316
- * loading invalidates the lines as well as the widths they were
8317
- * built from.
8318
- */
8319
- invalidate(): void;
8320
- }
8321
- interface FixedMetricsOptions {
8322
- /** Advance of every glyph as a fraction of the font size. Default 0.6. */
8323
- glyphWidth?: number;
8324
- /** Ascent as a fraction of the font size. Default 0.8. */
8325
- ascent?: number;
8326
- /** Descent as a fraction of the font size. Default 0.2. */
8327
- descent?: number;
8328
- }
8486
+ declare function offsetForVerticalMove(lines: readonly PlacedLine[], text: string, offset: number, direction: -1 | 1, measure: RunMeasure, rtl: boolean, goalX?: number): {
8487
+ offset: number;
8488
+ x: number;
8489
+ } | null;
8329
8490
  /**
8330
- * Deterministic measurer: every glyph is `glyphWidth` em wide, the
8331
- * font is `ascent + descent` em tall, and the default line is 1.2em.
8332
- *
8333
- * Intended for tests and headless environments. With `glyphWidth: 1`
8334
- * it reproduces the Ahem test font exactly, which is how the layout
8335
- * conformance fixtures compare real wrapping text against Chrome.
8491
+ * The boxes covering `[start, end)`, one per line touched. Hanging
8492
+ * spaces inside the range are highlighted at their width; a line the
8493
+ * range runs past with nothing hanging gets a space's width more, so a
8494
+ * selected line break is visible.
8336
8495
  */
8337
- declare class CharacterCountTextMeasurer extends ParagraphTextMeasurer {
8338
- private readonly glyphWidth;
8339
- private readonly ascentFactor;
8340
- private readonly descentFactor;
8341
- constructor(options?: FixedMetricsOptions);
8342
- measureRunWidth(text: string, request: TextMeasureRequest): number;
8343
- fontMetrics(request: TextMeasureRequest): FontMetrics;
8344
- }
8496
+ declare function selectionRects(lines: readonly PlacedLine[], text: string, start: number, end: number, measure: RunMeasure, rtl: boolean): LayoutBox[];
8345
8497
  //#endregion
8346
8498
  //#region src/selection/UiSelectable.d.ts
8347
8499
  /**
@@ -8926,6 +9078,13 @@ declare class EditableLayout {
8926
9078
  readonly placeholderLines: readonly TextLinePlacement[];
8927
9079
  readonly measure: RunMeasure;
8928
9080
  readonly rtl: boolean;
9081
+ /**
9082
+ * The text as drawn: the model's, or a secret field's mask of it
9083
+ * (see `maskText`). The geometry is the drawing's, so it is measured
9084
+ * from this; the two are the same length, so its offsets are the
9085
+ * model's.
9086
+ */
9087
+ readonly text: string;
8929
9088
  constructor(model: EditableTextModel, box: LayoutBox, state: PaintState, measurer: TextMeasurer);
8930
9089
  caretRect(offset?: number): CaretRect;
8931
9090
  /**
@@ -9039,6 +9198,7 @@ declare function editorOf(node: UiNode): EditableTextModel | undefined;
9039
9198
  /** Applies a changed `value` property to the model; see editorFor. */
9040
9199
  declare function syncEditorValue(node: UiNode, model: EditableTextModel): void;
9041
9200
  declare function isEditableNode(node: UiNode): boolean;
9201
+ /** Whether Enter inserts a newline. Never in a secret field, which is one line, as a password input is. */
9042
9202
  declare function isMultiline(node: UiNode): boolean;
9043
9203
  declare function isReadOnly(node: UiNode): boolean;
9044
9204
  /**
@@ -10384,6 +10544,11 @@ declare class UiWheelController {
10384
10544
  * wheel of a burst land correctly even though the first could not.
10385
10545
  */
10386
10546
  lastWheelTarget: UiNode | null;
10547
+ /**
10548
+ * The container the wheel last scrolled, for a frame's report of where
10549
+ * scrolling put it. Null until the wheel has scrolled something.
10550
+ */
10551
+ lastScrolled: UiNode | null;
10387
10552
  wheel(x: number, y: number, deltaX: number, deltaY: number, modifiers?: UiKeyModifiers, deltaMode?: UiWheelDeltaMode, wheelDeltaY?: number,
10388
10553
  /**
10389
10554
  * When the event happened, on this controller's clock. Pacing
@@ -10470,16 +10635,15 @@ declare class UiWheelController {
10470
10635
  * comes a varying time after the last step: applied as they arrive, a
10471
10636
  * steady flick moves the page by uneven amounts, which reads as
10472
10637
  * judder. Evening that out by waiting for steps puts the page behind
10473
- * the hand. So this does what a browser does for its own scrolling:
10474
- * it puts the page where the input will have reached when the frame is
10475
- * shown, the steps so far plus their velocity times the time since the
10476
- * last one, never more than a frame and a half ahead. Steps come out
10477
- * even, and nothing trails.
10638
+ * the hand. So this does what a browser does for its own scrolling: it
10639
+ * resamples the steps at the frame's time, reading a line fitted through
10640
+ * the last `VELOCITY_WINDOW_MS` of them. Frames come out even, and
10641
+ * nothing trails.
10478
10642
  *
10479
- * A gesture's first step, with no velocity yet, goes as it is. Once the
10480
- * steps stop, the prediction is withdrawn and the page settles exactly
10481
- * where they add up to; a trackpad's momentum slows to nothing first,
10482
- * so there is next to nothing to withdraw.
10643
+ * A gesture's first step, with no line yet, goes as it is. Once the
10644
+ * steps stop, the page eases over a few frames to exactly where they add
10645
+ * up to; a trackpad's momentum slows to nothing first, so there is next
10646
+ * to nothing to take up.
10483
10647
  *
10484
10648
  * True while a gesture is still being paced, so the host keeps frames
10485
10649
  * coming until it has settled.
@@ -11454,6 +11618,14 @@ interface EditingState {
11454
11618
  * `UiEditingGroup.copyHtml`). Absent otherwise.
11455
11619
  */
11456
11620
  readonly html?: string;
11621
+ /**
11622
+ * A secret field (`UiProperties.secret`). `text` is then its mask,
11623
+ * not its value, so the value never leaves the runtime; `clipboard`
11624
+ * is empty, so a copy or a cut takes nothing. A shell edits it
11625
+ * through a password input, which is what tells the platform not to
11626
+ * learn, correct or read out what is typed.
11627
+ */
11628
+ readonly secret?: true;
11457
11629
  }
11458
11630
  interface EditingControllerOptions {
11459
11631
  /** Keyboard conventions; detected from the user agent by default. */
@@ -12169,6 +12341,8 @@ interface UiHostFrameClockOptions {
12169
12341
  * turn out to be worse than its host's.
12170
12342
  */
12171
12343
  requestAnimationFrame?: ((callback: (time: number) => void) => number) | null;
12344
+ /** This thread's `performance.timeOrigin`, to read the host's times on this clock. Injectable for specs. */
12345
+ timeOrigin?: number;
12172
12346
  /** How long to wait for a host tick before pacing a frame anyway. */
12173
12347
  fallbackMs?: number;
12174
12348
  /**
@@ -12246,14 +12420,104 @@ declare class UiHostFrameClock implements UiFrameClock {
12246
12420
  private readonly minStallMs;
12247
12421
  private readonly now;
12248
12422
  /** This thread's own `requestAnimationFrame`, or null where there is none. */
12249
- private readonly local;
12423
+ private local;
12250
12424
  private localHandle;
12425
+ /** Whether the page is hidden, when this thread's refreshes do not come. */
12426
+ private hidden;
12427
+ private readonly timeOrigin;
12428
+ /** Gaps between this thread's own refreshes while frames ran back to back. */
12429
+ private readonly localIntervals;
12430
+ private lastLocalTime;
12431
+ /** The display's interval and the host's time origin, once the host has said. */
12432
+ private display;
12433
+ /**
12434
+ * Set once this thread's refreshes have shown they keep no display's
12435
+ * time: frames are then timed here, on the beat the host's refreshes
12436
+ * show (see \`displayInterval\`).
12437
+ */
12438
+ private locked;
12439
+ /** The host's recent refresh times, which give the beat its phase. */
12440
+ private readonly refreshes;
12441
+ /** Host refreshes since the last frame drawn on the beat. */
12442
+ private refreshesSinceFrame;
12443
+ /** The refresh the last frame here was drawn for: a frame is never drawn for one twice. */
12444
+ private lastLocked;
12445
+ /** How long recent frames took here, which decides how many refreshes each one gets. */
12446
+ private readonly costs;
12447
+ /** Refreshes per frame on the beat: 1, or more when frames cost more than a refresh can hold. */
12448
+ private stride;
12251
12449
  constructor(onFrame: (time: UiFrameTime) => void,
12252
12450
  /** Told when this starts and stops wanting ticks. */
12253
12451
  onActive: (active: boolean) => void, options?: UiHostFrameClockOptions);
12254
12452
  /** Whether this clock is driving itself from the compositor. */
12255
12453
  get isLocal(): boolean;
12256
12454
  requestFrame(): void;
12455
+ /**
12456
+ * The page was hidden or shown. While it is hidden this thread's own
12457
+ * refreshes stop, so a frame asked for is paced by the timer, as a
12458
+ * hosted clock is when its host stops ticking; one already waiting
12459
+ * for a refresh that will not come is handed to the timer.
12460
+ */
12461
+ setHidden(hidden: boolean): void;
12462
+ /**
12463
+ * Tells the clock the display's interval, measured on the host's own
12464
+ * refreshes, and the host's \`timeOrigin\`, which puts the host's frame
12465
+ * times on this thread's clock.
12466
+ *
12467
+ * A worker's own refreshes are not always the display's. WebKit's come
12468
+ * from a timer near 65 Hz that keeps no display's time: on a 120 Hz
12469
+ * MacBook its frames fell 15 to 16.4 ms apart, so each was shown after
12470
+ * one refresh, two or three, and a scroll juddered at a steady sixty.
12471
+ * Driving frames from the host's ticks instead put the host's thread in
12472
+ * every frame, and WebKit's is uneven while scrolling: at 120 a seventh
12473
+ * of the frames missed their refresh. So once this thread's refreshes
12474
+ * have shown they keep no display's time, frames follow the host's
12475
+ * refreshes, which are the only ones a worker's canvas is shown on in
12476
+ * WebKit anyway, with two differences from a plain hosted clock: each
12477
+ * frame is stamped with its refresh on the display's beat and on this
12478
+ * thread's clock, which is the clock a wheel step's time is on; and
12479
+ * frames too costly for one refresh are given an even two (see
12480
+ * \`recordCost\`).
12481
+ */
12482
+ displayInterval(ms: number, origin: number): void;
12483
+ /** Whether frames are timed here on the display's beat; see \`displayInterval\`. */
12484
+ get isDisplayLocked(): boolean;
12485
+ private recordLocal;
12486
+ /**
12487
+ * Gives this thread's refreshes up when they come well slower than the
12488
+ * display's: they cost frames, and in WebKit keep no display's beat
12489
+ * either. Faster than the display is left alone, because that is the
12490
+ * display the measurement was taken on going stale (a window dragged to
12491
+ * a faster screen), not a worker failing to keep up with it.
12492
+ */
12493
+ private compareLocal;
12494
+ /** A time on the host's clock, on this thread's. */
12495
+ private toLocal;
12496
+ /**
12497
+ * When the display's refreshes start, on the host's clock: the earliest
12498
+ * in phase of the host's recent refresh times, since a host's callback
12499
+ * can only run late, never early.
12500
+ */
12501
+ private beat;
12502
+ /** The interval between the most punctual early and late refreshes, judged by `rough`. */
12503
+ private refineInterval;
12504
+ /**
12505
+ * Draws the frame a host refresh asked for, stamped with that refresh on
12506
+ * the display's beat rather than with when its callback happened to run,
12507
+ * and on this thread's clock.
12508
+ */
12509
+ private deliverOnBeat;
12510
+ /**
12511
+ * Keeps the stride to what frames cost: every refresh while the typical
12512
+ * frame fits in most of one, two once it no longer does. Decided by the
12513
+ * typical frame, not the slow ones: a slow frame (a few rows mounted at
12514
+ * once) shown a refresh late is a moment's hitch, where two refreshes a
12515
+ * frame for a whole scroll halves the rate. Ruled by the slow quarter,
12516
+ * a 165 Hz display drew at 82 with its typical frame in half a refresh.
12517
+ */
12518
+ private recordCost;
12519
+ /** Refreshes per frame while timed on the display's beat; see \`recordCost\`. */
12520
+ get displayStride(): number;
12257
12521
  /**
12258
12522
  * Arms the timer that draws a frame the host did not ask for.
12259
12523
  *
@@ -12691,6 +12955,8 @@ declare class LayoutEngine {
12691
12955
  */
12692
12956
  private readonly stickyShifted;
12693
12957
  private readonly textMeasurer;
12958
+ /** Where `measureLeaf` resolves a text node's font; read before anything else can resolve one. */
12959
+ private readonly fontScratch;
12694
12960
  /**
12695
12961
  * The definite size percentages resolve against while a container's
12696
12962
  * children are measured: its content box. Undefined on an axis whose
@@ -13742,7 +14008,10 @@ declare const ELLIPSIS = "…";
13742
14008
  * narrower than the widest segment. When a segment is wider than the
13743
14009
  * available width the paragraph grows to it, and every line wraps
13744
14010
  * against that grown width rather than the one asked for, because that
13745
- * is the box the lines will be painted in.
14011
+ * is the box the lines will be painted in. When the width is the box's
14012
+ * own (`exactWidth`: a width set from outside, or the box being
14013
+ * painted), it does not grow: the lines wrap against it and the wide
14014
+ * segment overflows alone, as CSS wraps text in a box of a fixed width.
13746
14015
  *
13747
14016
  * The first baseline sits half the leading below the line top, plus the
13748
14017
  * ascent, with the half-leading floored to a whole pixel. That floor is
@@ -16028,26 +16297,33 @@ interface UiRenderer {
16028
16297
  * subtree changed.
16029
16298
  *
16030
16299
  * **When one is trusted.** Only when the caller vouches for what
16031
- * changed (`RenderContext.changes`), and only while all of these hold:
16032
- *
16033
- * - no box moved anywhere (`geometryVersion` is unchanged), and the
16034
- * frame dirtied nothing but paint, scroll and semantics;
16035
- * - nothing in the container's subtree, and none of its ancestors,
16036
- * was dirtied, except the container's own scroll offset — an
16037
- * ancestor because inherited paint (a text colour, a font) reaches
16038
- * the subtree without dirtying it, and because the runtime marks
16039
- * the root to ask for a repaint and says nothing about what for;
16300
+ * changed (\`RenderContext.changes\`), and only while all of these hold:
16301
+ *
16302
+ * - no ancestor's properties or environment changed: an inherited
16303
+ * value set above marks the descendants that read it, which is
16304
+ * damage like any other, and this keeps the old caution for the
16305
+ * rest. An ancestor marked for paint alone is the runtime asking
16306
+ * for a frame; one laid out again either leaves the container where
16307
+ * it was or moves it, which the next rule hears about;
16040
16308
  * - the container lands on the same device-pixel phase, at the same
16041
16309
  * device scale, with no rotation, skew or scale above it and no
16042
16310
  * opacity in force, so a copy is exact rather than resampled;
16043
- * - the scroll moved it by a whole number of device pixels;
16044
16311
  * - nothing the layer drew depends on the clock (a caret, a fading
16045
16312
  * scrollbar, a video frame) or escaped it (a lifted node).
16046
16313
  *
16314
+ * **What a frame redraws in it.** The strip a scroll brought into view
16315
+ * (the scroll as the frame draws it, snapped to a device pixel), and the
16316
+ * items something changed (see \`damage\`): an item, one of the
16317
+ * container's children through any fragments, is wrong where it was and
16318
+ * where it is when it is added, removed, moved, or changed inside. A
16319
+ * lazy list scrolling mounts and unmounts rows in its overscan and grows
16320
+ * and shrinks spacers off screen, so what it redraws is the strip. Only
16321
+ * what reaches the strips is walked, a \`SPILL\` past them.
16322
+ *
16047
16323
  * Anything else, and the container is drawn directly, exactly as it
16048
16324
  * was before layers existed. The first frame a container scrolls on
16049
16325
  * pays for the layer — its content drawn into it, then the copy onto
16050
- * the frame — and every scroll-only frame after that is repaid.
16326
+ * the frame — and every frame after that is repaid.
16051
16327
  *
16052
16328
  * **What it cannot help.** A frame where the content itself changes —
16053
16329
  * a live layer redrawn every tick, a zoom that resizes every tile — is
@@ -16069,6 +16345,67 @@ interface ScrollLayerStats {
16069
16345
  dropped: number;
16070
16346
  }
16071
16347
  //#endregion
16348
+ //#region src/rendering/canvas2d/TextRasterCache.d.ts
16349
+ /**
16350
+ * Text kept as pixels, so a frame that only moved it copies it rather
16351
+ * than drawing its glyphs again.
16352
+ *
16353
+ * **Why.** Drawing glyphs is most of what a frame of text costs:
16354
+ * profiled while flicking through a file in Easel, `fillText` was 1,064
16355
+ * of the renderer's 1,985 ms. A scroll moves every line on screen and
16356
+ * changes none of them, so every one of those glyphs was drawn again
16357
+ * only to land a few pixels from where it was. In WKWebView a frame of
16358
+ * that cost 4 to 7 ms, which is more than a 165 Hz refresh holds.
16359
+ *
16360
+ * **What is kept.** What `drawText` draws for one node, drawn once into
16361
+ * a canvas of its own at the device scale and fraction of a pixel it
16362
+ * lands on, and copied onto the frame from then on. The copy lands on
16363
+ * whole device pixels, so the pixels are the ones a direct draw at that
16364
+ * fraction would have made, and a scroll, which moves by whole device
16365
+ * pixels, keeps the fraction.
16366
+ *
16367
+ * **When it is drawn again.** When anything `drawText` reads changes:
16368
+ * the text, its runs, its font, its colour, its box, the scale, or the
16369
+ * fraction of a pixel it sits at. Each is compared every frame, which is
16370
+ * a few comparisons; a run list or a colour that has not changed is the
16371
+ * same object it was.
16372
+ *
16373
+ * **What it is not for.** Text that changes on most frames (a clock, a
16374
+ * counter, an animated colour) would be drawn twice a frame, into the
16375
+ * cache and out of it. A node redrawn on most of its recent frames is
16376
+ * drawn directly instead, until it has been still for a while.
16377
+ */
16378
+ declare class TextRasterCache {
16379
+ private readonly createCanvas;
16380
+ private readonly entries;
16381
+ private frame;
16382
+ private pixels;
16383
+ /** Draws served from the cache and drawn into it, since the last reset. For budget specs. */
16384
+ readonly stats: {
16385
+ copied: number;
16386
+ drawn: number;
16387
+ direct: number;
16388
+ };
16389
+ constructor(createCanvas: LayerCanvasFactory);
16390
+ beginFrame(): void;
16391
+ /** Lets go of text not drawn lately: removed, scrolled far away, or hidden. */
16392
+ endFrame(): void;
16393
+ dropAll(): void;
16394
+ resetStats(): void;
16395
+ /**
16396
+ * Draws a node's text from the cache, drawing it into the cache first
16397
+ * when what it holds is out of date. False when the text should be
16398
+ * drawn directly: a context that cannot say where it draws, one that
16399
+ * rotates or skews, text too large to keep, or text that changes too
16400
+ * often to be worth keeping.
16401
+ */
16402
+ draw(ctx: Canvas2DContext, node: UiNode, box: LayoutBox, paint: PaintState, measurer: TextMeasurer): boolean;
16403
+ private redraw;
16404
+ /** Makes room for `needed` more pixels, letting go of what was drawn least recently. */
16405
+ private make;
16406
+ private drop;
16407
+ }
16408
+ //#endregion
16072
16409
  //#region src/rendering/canvas2d/Canvas2DRenderer.d.ts
16073
16410
  interface Canvas2DRendererOptions {
16074
16411
  /**
@@ -16091,10 +16428,16 @@ interface Canvas2DRendererOptions {
16091
16428
  */
16092
16429
  scrollLayers?: boolean;
16093
16430
  /**
16094
- * Makes the canvases scroll layers are kept in. Defaults to an
16095
- * `OffscreenCanvas`; a spec passes a double.
16431
+ * Makes the canvases scroll layers and kept text are held in. Defaults
16432
+ * to an `OffscreenCanvas`; a spec passes a double.
16096
16433
  */
16097
16434
  createLayerCanvas?: LayerCanvasFactory;
16435
+ /**
16436
+ * Whether text is kept as pixels across frames and copied rather than
16437
+ * drawn again while it has not changed. Defaults to true; false draws
16438
+ * every glyph every frame, as before. See `TextRasterCache.ts`.
16439
+ */
16440
+ textCache?: boolean;
16098
16441
  /**
16099
16442
  * How many frames in a row a container must scroll quietly before it
16100
16443
  * gets a layer. Defaults to `SCROLL_LAYER_SETTLE_FRAMES`; a spec of
@@ -16205,6 +16548,10 @@ declare class Canvas2DRenderer implements UiRenderer {
16205
16548
  */
16206
16549
  private volatileDraws;
16207
16550
  constructor(options: Canvas2DRendererOptions);
16551
+ /** Text kept as pixels; see `TextRasterCache.ts`. */
16552
+ private readonly textCache;
16553
+ /** What the text cache did since the last reset, or null with it off. For budget specs. */
16554
+ get textCacheStats(): TextRasterCache['stats'] | null;
16208
16555
  /** What the scroll layers did since the last reset. For budget specs. */
16209
16556
  get scrollLayerStats(): ScrollLayerStats;
16210
16557
  resetScrollLayerStats(): void;
@@ -19047,5 +19394,5 @@ interface UiSemanticsAction {
19047
19394
  readonly value?: string;
19048
19395
  }
19049
19396
  //#endregion
19050
- export { Mp4AudioTrack as $, UiDroppedFile as $a, Responsive as $c, editableSpansOf as $d, UiBoxShadow as $f, cubicBezier as $g, colorsEqualPalette as $h, AxisExplanation as $i, UiPropertyName as $l, NodeId as $m, ScrollOffset as $n, scrollbarThumbs as $o, UiPropValue as $p, clickOutside as $r, PaintState as $s, registerFontStack as $t, UiThemeExtensionOptions as $u, offsetAtPointIn as A, resolveCursor as Aa, TextRunSpan as Ac, UiLayoutChild as Ad, UiRadialGradient as Af, defaultMotion as Ag, UiTextAlign as Ah, propertyValuesEqualByName as Ai, ContainerProps as Al, MotionStateInput as Am, LABEL_PADDING_X as An, overrideSources as Ao, UiModifierEnvironment as Ap, ImageResolver as Ar, CanvasTextStyle as As, createTextCache as At, LazyAxis as Au, markNow as B, touchActionFor as Ba, lineLimit as Bc, UiFontKerning as Bd, UiLength as Bf, transformIsIdentity as Bg, borderRadiusCorners as Bh, parseAlignContent as Bi, PaintProps as Bl, slideFrom as Bm, resolvePropertyByName as Bn, HitTestResult as Bo, UiModifierHost as Bp, ZoomState as Br, layoutTextLines as Bs, isWebGPUAvailable as Bt, VirtualUpdate as Bu, hasTextLinks as C, isNodeFocusable as Ca, SpannedRuns as Cc, UiTypography as Cd, MAX_GRADIENT_STOPS as Cf, UiTweenOptions as Cg, UiObjectFit as Ch, findPropertyDefinition as Ci, UiChildrenBinding as Cl, noKeyModifiers as Cm, LayerCanvasFactory as Cn, UiGestureRecognizer as Co, UiEditingGroup as Cp, IconContext as Cr, syncEditorValue as Cs, RenderList as Ct, SheetRowRenderer as Cu, setLinkHover as D, isNodeTabStop as Da, TextMeasurer as Dc, isTypographyRole as Dd, UiGradientOffset as Df, UiMotion as Dg, UiPosition as Dh, propertyEffects as Di, ButtonProps as Dl, MOTION_REST as Dm, LayoutReader as Dn, NodeTransitions as Do, comparePositions as Dp, iconKey as Dr, detectEditingPlatform as Ds, TEXTURED_STRIDE_FLOATS as Dt, UiVirtualSheetOptions as Du, linkRunAtPointIn as E, isNodeSelectable as Ea, TextMeasureRequest as Ec, defaultTypography as Ed, UiGradient as Ef, UiEasingToken as Eg, UiPointerEvents as Eh, inheritedPropertyNames as Ei, BoxProps as El, MOTION_CHANNELS as Em, UiRenderer as En, FocusNotifier as Eo, adjacentField as Ep, IconSpec as Er, commandForKey as Es, TEXTURED_STRIDE_BYTES as Et, UiVirtualSheet as Eu, UiFrameCallback as F, UiPlatformAdapter as Fa, PlacedLine as Fc, UiVisualStateSet as Fd, validateGradient as Ff, interpolatorFor as Fg, UiVerticalAlign as Fh, placeGridItems as Fi, GridItemProps as Fl, pop as Fm, CanvasSurface as Fn, UiFindController as Fo, assertModifierList as Fp, ShortcutsOptions as Fr, applyCanvasTextStyle as Fs, GlyphSlot as Ft, UiVirtualWindow as Fu, VttTrack as G, TouchScrollerOptions as Ga, graphemeBoundaries as Gc, UiSpannedText as Gd, isFrLength as Gf, colorToRgba as Gg, uniformBorderRadius as Gh, ELLIPSIS as Gi, ScrollViewProps as Gl, LayoutBox as Gm, InsetPaddingArgs as Gn, SCROLLBAR_INSET as Go, ComponentResolver as Gp, ReorderableOptions as Gr, Canvas2DContext as Gs, WebGPURenderer as Gt, videoFrameSize as Gu, performanceMarksEnabled as H, EditingHost as Ha, offsetAtX as Hc, UiFontStyle as Hd, auto as Hf, UiBasicColors as Hg, borderRadiusIsZero as Hh, parseMainAxisAlignment as Hi, PropsOf as Hl, SharedClaim as Hm, ThemeTokenTarget as Hn, UiHitTester as Ho, FocusOptions as Hp, AutoScrollOptions as Hr, runFontString as Hs, CapturedFrame as Ht, lazySource as Hu, UiScheduler as I, capturePointer as Ia, RunMeasure as Ic, defaultVisualState as Id, AutoLength as If, UiTransform as Ig, validateSubgrid as Ih, sizeGridTracks as Ii, GridProps as Il, resolveMotionState as Im, createCanvasSurface as In, SelectionControllerOptions as Io, UiModifier as Ip, contextMenu as Ir, buildFontString as Is, GlyphUpload as It, VIRTUAL_INDEX_PROP as Iu, ByteSource as J, UiDragPayload as Ja, nextGraphemeEnd as Jc, UiTextMetrics as Jd, minmax as Jf, normalizeColor as Jg, UiShapes as Jh, LayoutNotifier as Ji, TextProps as Jl, Size as Jm, publishInset as Jn, ScrollbarAxis as Jo, UiElement as Jp, reorderable as Jr, DEFAULT_FONT_SIZE as Js, WebGPUSurface as Jt, lightTheme as Ju, cueAt as K, UiTouchScroller as Ka, lineEndAt as Kc, UiTextDecoration as Kd, isMinMaxTrack as Kf, colorValuesEqual as Kg, UiShapeExtensions as Kh, layoutParagraph as Ki, StackProps as Kl, LayoutResult as Km, PublishInsetArgs as Kn, SCROLLBAR_MIN_THUMB as Ko, ComponentLikeElement as Kp, dragSource as Kr, Canvas2DGradient as Ks, WebGPURendererOptions as Kt, UiTheme as Ku, UiSchedulerOptions as L, isImeKey as La, caretRectFor as Lc, hasVisualState as Ld, FrLength as Lf, UiTransforms as Lg, UiBorderRadius as Lh, AlignContent as Li, IdentityProps as Ll, rotateFrom as Lm, resolveBoolean as Ln, SelectionHost as Lo, UiModifierKind as Lp, shortcut as Lr, createCanvasTextStyle as Ls, WebGPUGlyphAtlas as Lt, VIRTUAL_LEAD_PROP as Lu, paragraphGeometryFrom as M, PlatformAdapterOptions as Ma, TextWrap as Mc, UiLayoutProtocol as Md, gradientsEqual as Mf, interpolateColor as Mg, UiTextOverflowValue as Mh, GridItemRequest as Mi, EnvironmentProps as Ml, ResolvedMotionState as Mm, drawOverlayShapes as Mn, writeDeclaredProperty as Mo, UiModifierLayout as Mp, animateLayout as Mr, SpanPaint as Ms, textRuns as Mt, LazyItemRenderer as Mu, selectionRectsIn as N, PlatformEventTarget as Na, spannedRunsFor as Nc, isLayoutProtocol as Nd, linearGradient as Nf, interpolateNumber as Ng, UiTextWrapValue as Nh, GridPlacement as Ni, FlexContainerProps as Nl, fade as Nm, labelOrigin as Nn, writeOverrideProperty as No, UiModifierSet as Np, ContextMenuOptions as Nr, TextLinePlacement as Ns, GlyphShaper as Nt, LazyListOptions as Nu, ParagraphGeometry as O, isSubtreeInert as Oa, TextOverflow as Oc, typographyEqual as Od, UiGradientStop as Of, UiSpringSpec as Og, UiSelfAlignment as Oh, propertyIsInherited as Oi, ColumnProps as Ol, MotionChannel as Om, RenderChanges as On, resetTransitionWarnings as Oo, edgeField as Op, DefaultImageResolver as Or, isPrintable as Os, TextRunDraw as Ot, VIRTUAL_SHEET_PROP as Ou, wordRangeIn as P, PlatformSurface as Pa, CaretRect as Pc, UiVisualState as Pd, radialGradient as Pf, interpolateTransform as Pg, UiThemeColorName as Ph, GridTrack as Pi, FlexItemProps as Pl, isMotionRest as Pm, CanvasHost as Pn, FindHost as Po, UiUnknownModifierPropertyError as Pp, ShortcutOptions as Pr, TextRunRect as Ps, GLYPH_SUBPIXEL_PHASES as Pt, LazySourceArgs as Pu, rangeSource as Q, UiDropZone as Qa, wordRangeAt as Qc, defaultTextStyle as Qd, BOX_SHADOW_BLUR_REACH as Qf, UiEasing as Qg, UiColors as Qh, ScrollAdjustment as Qi, UiProperties as Ql, tightenConstraints as Qm, sizeContainer as Qn, scrollbarThumb as Qo, isUiElement as Qp, ClickOutsideOptions as Qr, PaintBoxShadow as Qs, fontStackFor as Qt, UiThemeExtension as Qu, MARK_PREFIX as R, pointerDeviceOf as Ra, lineIndexAtY as Rc, visualState as Rd, MinMaxTrack as Rf, parseTransform as Rg, UiBorderRadiuses as Rh, CrossAxisAlignment as Ri, InteractionProps as Rl, scaleFrom as Rm, resolveNumber as Rn, UiSelectionController as Ro, defineModifier as Rp, shortcuts as Rr, drawText as Rs, WebGPUTextureCache as Rt, VIRTUAL_WINDOW_PROP as Ru, clearLinkHover as S, UiTimerFrameClockOptions as Sa, ParagraphTextMeasurer as Sc, shadowsEqual as Sd, GradientPaint as Sf, UiTween as Sg, UiGridAutoFlow as Sh, closestPropertyName as Si, ChildrenBindingId as Sl, UiWheelEvent as Sm, traceRoundedRect as Sn, GestureRecognizerOptions as So, textInputOf as Sp, IconCanvas as Sr, nextCaretToggle as Ss, RenderCommand as St, SheetRange as Su, linkOf as T, isNodeInert as Ta, TextLineRun as Tc, UiTypographyRole as Td, ResolvedGradientStop as Tf, UiDurationToken as Tg, UiPlacement as Th, inheritedPropertyFlags as Ti, BoxModelProps as Tl, DirtyNodeSet as Tm, RendererBackend as Tn, UiPinchRecognizer as To, UiTextPosition as Tp, IconRasterizerOptions as Tr, EditingPlatform as Ts, ScissorRect as Tt, SheetViewport as Tu, setPerformanceMarks as U, EditingState as Ua, offsetForVerticalMove as Uc, UiFontVariant as Ud, fr as Uf, UiColor as Ug, borderRadiusValuesEqual as Uh, FlexDirection as Ui, Reactive as Ul, UiSharedElements as Um, themeTokens as Un, UiPoint as Uo, FocusSource as Up, DragSourceOptions as Ur, textRunBackgrounds as Us, DrawStats as Ut, UiVideoSurface as Uu, measureSpan as V, EditingControllerOptions as Va, offsetAtPoint as Vc, UiFontStretch as Vd, UiTrackSize as Vf, transformsEqual as Vg, borderRadiusEqual as Vh, parseCrossAxisAlignment as Vi, PositionProps as Vl, slideUp as Vm, resolveString as Vn, HitTester as Vo, UiModifierTeardown as Vp, pinchable as Vr, runCanvasStyleInto as Vs, WebGPUError as Vt, VirtualViewport as Vu, VttCue as W, UiEditingController as Wa, selectionRects as Wc, UiResolvedTextSpan as Wd, isAutoLength as Wf, colorToHex as Wg, normalizeBorderRadius as Wh, parseFlexDirection as Wi, RowProps as Wl, Constraints as Wm, sameArgs as Wn, SCROLLBAR_HOVER_ZONE as Wo, UiFocusManager as Wp, DropTargetOptions as Wr, textRunDecorations as Ws, RenderHooks as Wt, isVideoSurface as Wu, RangeSourceOptions as X, UiDragState as Xa, previousGraphemeStart as Xc, UiTextSpan as Xd, repeat as Xf, rgb8 as Xg, isShapeName as Xh, SCROLLBAR_FADE_MS as Xi, UiEventProps as Xl, clampSize as Xm, SizeContainerArgs as Xn, scrollLeaderOf as Xo, isObservable$1 as Xp, DraggableOptions as Xr, DEFAULT_TEXT_COLOR as Xs, bumpFontStack as Xt, withContrast as Xu, DEFAULT_BLOCK_SIZE as Y, UiDragSession as Ya, nextWordEnd as Yc, UiTextRange as Yd, percent as Yf, parseColor as Yg, defaultShapes as Yh, LayoutEngine as Yi, TypographyProps as Yl, TightenOptions as Ym, BreakpointArgs as Yn, ScrollbarThumb as Yo, isComponentLikeElement as Yp, DragOffset as Yr, DEFAULT_FONT_WEIGHT as Ys, createWebGPUSurface as Yt, themesEqual as Yu, bufferSource as Z, UiDropEffect as Za, previousWordStart as Zc, UiTextStyle as Zd, resolveLength as Zf, rgba as Zg, shapesEqual as Zh, SCROLLBAR_LINGER_MS as Zi, UiNodeRef as Zl, constraintsEqual as Zm, breakpoint as Zn, scrollRange as Zo, isUiChild as Zp, draggable as Zr, ObjectFit as Zs, clearFontStacks as Zt, withDensity as Zu, buildSemanticsTree as _, UiFrameTime as _a, setSelectionRange as _c, scaleSpacing as _d, UiPath as _f, UiAnimation as _g, UiContentDistribution as _h, bundle as _i, UiDefinition as _l, UiPointerEvent as _m, LayoutInspector as _n, UiScrollBehavior as _o, bandOf as _p, IconSourceArgs as _r, editorFor as _s, INSTANCE_STRIDE_FLOATS as _t, EditUnit as _u, diffSemantics as a, RelayoutExplanation as aa, createPaintState as ac, themeExtensionsEqual as ad, spansDifferOnlyInPaint as af, createEnvironmentKey as ag, DecorationFill as ah, borderShapes as ai, LazyRow as al, MOUSE_POINTER as am, PaintContext2D as an, UiShortcutRegistry as ao, UiPropertyDefinition as ap, VideoTransport as ar, setMatchRanges as as, Mp3Frame as at, UiLiveRegion as au, semanticsMemory as b, UiManualFrameClock as ba, FontMetrics as bc, UiShadows as bd, pathValuesEqual as bf, UiSpring as bg, UiFlexWrap as bh, accumulatedOffsetTo as bi, UiGraph as bl, UiTextChangeEvent as bm, Canvas2DRenderer as bn, isScrollContainer as bo, UiTextInput as bp, iconSource as br, isMultiline as bs, PrimitiveCommand as bt, LazySheetProps as bu, SemanticsMemory as c, describeOverrides as ca, normalizeVerticalAlign as cc, UiContrast as cd, textStylesEqual as cf, DirtyFlags as cg, DecorationStroke as ch, focusRing as ci, Column as cl, UiEventType as cm, PaintTarget as cn, formatShortcut as co, UiInsetEdge as cp, DefaultVideoResolverOptions as cr, findMatchesIn as cs, readMp3Header as ct, UiSemanticState as cu, SemanticsRewalk as d, labelNode as da, TEXT_SELECTION_PROP as dc, raiseContrast as dd, PaintLineCap as df, UiTransitionValue as dg, hasDecorationPhase as dh, hoverable as di, Paint as dl, UiInputEvent as dm, PaintOp as dn, KeyboardControllerOptions as do, UiInsets as dp, VideoResolver as dr, UiEnvironmentKeys as ds, Affine as dt, isUiSemanticState as du, easings as e_, CustomLayoutExplanation as ea, PaintTextSpan as ec, UiThemeExtensions as ed, flattenTextSpans as ef, darkColors as eg, NodeProperty as eh, autoFocus as ei, ResponsiveProps as el, UiProps as em, PaintCanvas as en, UiFileDropMessage as eo, boxShadow as ep, ScrollPositionArgs as er, scrollbarZoneAt as es, Mp4Sample as et, UiPropertyValueOf as eu, SemanticsSpan as f, withOverrideSource as fa, TextRange as fc, relativeLuminance as fd, PaintLineJoin as ff, assertTransitionMap as fg, paintsAfterChildren as fh, interactive as fi, Row as fl, UiKeyModifiers as fm, PaintRecorder as fn, UiKeyboardController as fo, insetsEqual as fp, canDecodeVideo as fr, EnvironmentNotifier as fs, CLIP_STRIDE_BYTES as ft, normalizeStates as fu, buildSemanticsSubtree as g, UiFrameClockFactory as ga, selectionRangeOf as gc, defaultSpacing as gd, UiPaint as gf, AnimatedCell as gg, UiColorValue as gh, UiModifierBundle as gi, createElement as gl, UiPointerDevice as gm, InspectorOverlay as gn, ScrollSink as go, UiContainerSizeSource as gp, sharedElement as gr, caretVisibleAt as gs, INSTANCE_STRIDE_BYTES as gt, CompositionRange as gu, UiSemanticsRecord as h, UiFrameClock as ha, selectableTextOf as hc, UiSpacing as hd, PaintTextStyle as hf, tween as hg, UiBorderRadiusValue as hh, pressable as hi, Text as hl, UiPinchEvent as hm, INSPECTOR_HEAT_MS as hn, ScrollContainerState as ho, UiContainerSize as hp, motion as hr, EDITOR_PROP as hs, GlyphCommand as ht, validateStates as hu, UiSemanticsPatch as i, OverrideSources as ia, computeObjectFitRect as ic, themeExtension as id, spannedTextOf as if, UiEnvironmentKey as ig, UiPropertyOverrides as ih, FocusRingOptions as ii, LazyListProps as il, UiListenerErrorReporter as im, paintPictures as in, UiShortcutBinding as io, boxShadowsEqual as ip, VideoState as ir, matchRangesOf as is, Mp3Format as it, UiAutocomplete as iu, paragraphGeometry as j, CanvasPlatformSurface as ja, TextRunStyle as jc, UiLayoutContext as jd, gradientPaint as jf, UiInterpolator as jg, UiTextDirection as jh, GridContribution as ji, EditableTextProps as jl, MotionTiming as jm, OverlayShape as jn, resetOverrideWarnings as jo, UiModifierFocus as jp, AnimateLayoutOptions as jr, PlacedTextRun as js, glyphCount as jt, LazyGridOptions as ju, hasDrawnText as k, pointerEventsOf as ka, TextRunMeasurer as kc, MAX_MEASURES_PER_CHILD as kd, UiLinearGradient as kf, UiSpringToken as kg, UiSubgridAxis as kh, propertyNarrowers as ki, CommonProps as kl, MotionState as km, RenderContext as kn, clearOverrideProperty as ko, editingGroupOf as kp, DefaultImageResolverOptions as kr, EditableLayout as ks, buildRenderList as kt, sheetSource as ku, SemanticsPlacement as l, formatConstraints as la, resolvePaintState as lc, contrastRatio as ld, PaintBox as lf, AnimationDriver as lg, decorationColor as lh, BUTTON_INTERACTION as li, EditableText as ll, UiFocusEvent as lm, tracePathData as ln, parseShortcut as lo, UiInsetRegistry as lp, RangeResponse as lr, UiEnvironmentProvider as ls, splitMp3Frames as lt, UiSemanticStates as lu, UiSemanticsMap as m, UiAnimationFrameClock as ma, selectableTextNodes as mc, densityFactors as md, PaintTextAlign as mf, spring as mg, UiAlignment as mh, measureFlow as mi, Stack as ml, UiPasteEvent as mm, replayPaint as mn, UiPointerController as mo, observeViewportInsets as mp, SharedElementArgs as mr, CARET_WIDTH as ms, CommandKind as mt, validateRole as mu, UiSemanticsBox as n, steps as n_, LayoutExplanation as na, VerticalAlign as nc, hasThemeExtension as nd, resolvedSpansOf as nf, LayoutRecord as ng, UiNodeTransitions as nh, BordersOptions as ni, LazyGrid as nl, UiEventListenerOptions as nm, PaintPictureCache as nn, ShortcutRegistryOptions as no, boxShadowRadius as np, VideoClock as nr, TEXT_MATCHES_PROP as ns, demuxMp4Audio as nt, UI_ROLES as nu, dropIndexShifts as o, SizeDecision as oa, isPaintVisible as oc, withThemeExtension as od, textContentOf as of, findEnvironmentKey as og, DecorationRect as oh, borders as oi, Box as ol, UiBeforeInputEvent as om, PaintGradient as on, UiShortcutStep as oo, defineProperty as op, videoSource as or, FindMatch as os, Mp3Frames as ot, UiOrientation as ou, TEXT_RUN_ID_SEPARATOR as p, UiFrame as pa, clearSelectionRange as pc, UiDensity as pd, PaintSurface as pf, normalizeTransition as pg, UI_SUBGRID_AXES as ph, measure as pi, ScrollView as pl, UiKeyboardEvent as pm, PaintRecording as pn, PointerControllerOptions as po, noInsets as pp, MotionArgs as pr, CARET_BLINK_MS as ps, CLIP_STRIDE_FLOATS as pt, statesEqual as pu, parseWebVtt as q, EXTERNAL_FILES as qa, lineStartAt as qc, UiTextLink as qd, isPercentLength as qf, colorsEqual as qg, UiShapeName as qh, proportionalFontMetrics as qi, TextContentProps as ql, LayoutStats as qm, insetPadding as qn, SCROLLBAR_THICKNESS as qo, UiChild as qp, dropTarget as qr, DEFAULT_FONT_FAMILY as qs, WebGPUCanvasHost as qt, darkTheme as qu, UiSemanticsUpdate as r, LayoutStateExplanation as ra, colorToCss as rc, noThemeExtensions as rd, spanAtOffset as rf, UiEnvironment as rg, UiPropertyOverride as rh, Decorations as ri, LazyGridProps as rl, UiInputDispatcher as rm, PaintStats as rn, UiShortcut as ro, boxShadowReach as rp, VideoSourceArgs as rr, clearMatchRanges as rs, demuxMp4Video as rt, UI_SEMANTIC_STATES as ru, recordsEqual as s, describeLength as sa, normalizeTextAlign as sc, HighContrastOptions as sd, textSpansEqual as sf, UiNodeType as sg, DecorationShape as sh, decorated as si, Button as sl, UiCompositionEvent as sm, PaintResolver as sn, describeShortcut as so, propertyValuesEqual as sp, DefaultVideoResolver as sr, FindOptions as ss, Mp3Header as st, UiRole as su, UiSemanticsAction as t, linear as t_, Edges as ta, TextAlign as tc, defineThemeExtension as td, hiddenRangesOf as tf, lightColors as tg, UiNode as th, BorderEdge as ti, LazyColumn as tl, UiEventListener as tm, PaintCanvasFactory as tn, dragSessionFor as to, boxShadowArraysEqual as tp, scrollPosition as tr, SubtreeBounds as ts, Mp4VideoTrack as tt, UiPropertyValues as tu, SemanticsReuse as u, formatExplanation as ua, DEFAULT_LINE_HEIGHT_FACTOR as uc, highContrastColors as ud, PaintFillRule as uf, UiTransitionSpec as ug, decorationRect as uh, InteractiveOptions as ui, Grid as ul, UiGestureEvent as um, EMPTY_RECORDING as un, shortcutKeyCaps as uo, UiInsetSource as up, VideoPlayback as ur, provideEnvironment as us, WebGPUGlyphPages as ut, isUiRole as uu, rewalkSemantics as v, UiHostFrameClock as va, CharacterCountTextMeasurer as vc, spacingEqual as vd, inputsEqual as vf, UiAnimationOptions as vg, UiCursor as vh, noModifiers as vi, BindingId as vl, UiPointerKind as vm, LayoutInspectorOptions as vn, UiScrollability as vo, containerBands as vp, ImageSourceArgs as vr, editorOf as vs, ImageCommand as vt, EditableTextModel as vu, linkHoverOf as w, isNodeHitTestable as wa, TextLine as wc, UiTypographyExtensions as wd, ResolvedGradient as wf, createTween as wg, UiOverflow as wh, getPropertyNames as wi, UiGraphBuilder as wl, wheelDeltaYOf as wm, ScrollLayerStats as wn, PinchRecognizerOptions as wo, UiGroupEdit as wp, IconRasterizer as wr, EditCommand as ws, RenderTextCache as wt, SheetSourceArgs as wu, textRunOfRecordId as x, UiTimerFrameClock as xa, ParagraphLayout as xc, defaultShadows as xd, UiImage as xf, UiSpringOptions as xg, UiFontWeight as xh, contentOffset as xi, UiEventBinding as xl, UiWheelDeltaMode as xm, Canvas2DRendererOptions as xn, GestureInput as xo, UiTextInputState as xp, imageSource as xr, isReadOnly as xs, PrimitiveKind as xt, SheetHeaderRenderer as xu, semanticsInertAbove as y, UiHostFrameClockOptions as ya, FixedMetricsOptions as yc, spacingSteps as yd, paintValuesEqual as yf, UiReducedMotionPolicy as yg, UiDirection as yh, Transform as yi, UiBinding as yl, UiSelectionChangeEvent as ym, CanvasTextMeasurer as yn, UiWheelController as yo, unknownContainerSize as yp, ImageSources as yr, isEditableNode as ys, NO_CLIP_INDEX as yt, LazySheet as yu, markInstant as z, prepareInputSurface as za, lineIndexForOffset as zc, visualStatesEqual as zd, PercentLength as zf, transform as zg, borderRadius as zh, MainAxisAlignment as zi, PaintElementProps as zl, slideDown as zm, resolveProperty as zn, HitTestLayoutReader as zo, isUiModifier as zp, PinchableOptions as zr, fillTextRects as zs, initializeWebGPU as zt, VirtualItemMeasure as zu };
19051
- //# sourceMappingURL=index-8yhrkCnb.d.ts.map
19397
+ export { Mp4AudioTrack as $, UiDroppedFile as $a, Text as $c, PaintTextStyle as $d, UiContainerSize as $f, cubicBezier as $g, TextRunSpan as $h, AxisExplanation as $i, validateStates as $l, UiBorderRadiusValue as $m, ScrollOffset as $n, scrollbarThumbs as $o, UiPinchEvent as $p, clickOutside as $r, PaintState as $s, registerFontStack as $t, UiSpacing as $u, offsetAtPointIn as A, resolveCursor as Aa, lineEndAt as Ac, UiTextDecoration as Ad, isMinMaxTrack as Af, defaultMotion as Ag, UiShapeExtensions as Ah, propertyValuesEqualByName as Ai, StackProps as Al, LayoutResult as Am, LABEL_PADDING_X as An, overrideSources as Ao, ComponentLikeElement as Ap, ImageResolver as Ar, CanvasTextStyle as As, createTextCache as At, UiTheme as Au, markNow as B, touchActionFor as Ba, LazyGrid as Bc, resolvedSpansOf as Bd, boxShadowRadius as Bf, transformIsIdentity as Bg, LayoutRecord as Bh, parseAlignContent as Bi, UI_ROLES as Bl, UiNodeTransitions as Bm, resolvePropertyByName as Bn, HitTestResult as Bo, UiEventListenerOptions as Bp, ZoomState as Br, layoutTextLines as Bs, isWebGPUAvailable as Bt, hasThemeExtension as Bu, hasTextLinks as C, isNodeFocusable as Ca, lineIndexForOffset as Cc, visualStatesEqual as Cd, PercentLength as Cf, UiTweenOptions as Cg, borderRadius as Ch, findPropertyDefinition as Ci, PaintElementProps as Cl, slideDown as Cm, LayerCanvasFactory as Cn, UiGestureRecognizer as Co, isUiModifier as Cp, IconContext as Cr, syncEditorValue as Cs, RenderList as Ct, VirtualItemMeasure as Cu, setLinkHover as D, isNodeTabStop as Da, offsetForVerticalMove as Dc, UiFontVariant as Dd, fr as Df, UiMotion as Dg, borderRadiusValuesEqual as Dh, propertyEffects as Di, Reactive as Dl, UiSharedElements as Dm, LayoutReader as Dn, NodeTransitions as Do, FocusSource as Dp, iconKey as Dr, detectEditingPlatform as Ds, TEXTURED_STRIDE_FLOATS as Dt, UiVideoSurface as Du, linkRunAtPointIn as E, isNodeSelectable as Ea, offsetAtX as Ec, UiFontStyle as Ed, auto as Ef, UiEasingToken as Eg, borderRadiusIsZero as Eh, inheritedPropertyNames as Ei, PropsOf as El, SharedClaim as Em, UiRenderer as En, FocusNotifier as Eo, FocusOptions as Ep, IconSpec as Er, commandForKey as Es, TEXTURED_STRIDE_BYTES as Et, lazySource as Eu, UiFrameCallback as F, UiPlatformAdapter as Fa, previousWordStart as Fc, UiTextStyle as Fd, resolveLength as Ff, interpolatorFor as Fg, shapesEqual as Fh, placeGridItems as Fi, UiNodeRef as Fl, constraintsEqual as Fm, CanvasSurface as Fn, UiFindController as Fo, isUiChild as Fp, ShortcutsOptions as Fr, applyCanvasTextStyle as Fs, GlyphSlot as Ft, withDensity as Fu, VttTrack as G, TouchScrollerOptions as Ga, Button as Gc, textSpansEqual as Gd, propertyValuesEqual as Gf, colorToRgba as Gg, ParagraphTextMeasurer as Gh, ELLIPSIS as Gi, UiRole as Gl, DecorationShape as Gm, InsetPaddingArgs as Gn, SCROLLBAR_INSET as Go, UiCompositionEvent as Gp, ReorderableOptions as Gr, Canvas2DContext as Gs, WebGPURenderer as Gt, HighContrastOptions as Gu, performanceMarksEnabled as H, EditingHost as Ha, LazyListProps as Hc, spannedTextOf as Hd, boxShadowsEqual as Hf, UiBasicColors as Hg, FixedMetricsOptions as Hh, parseMainAxisAlignment as Hi, UiAutocomplete as Hl, UiPropertyOverrides as Hm, ThemeTokenTarget as Hn, UiHitTester as Ho, UiListenerErrorReporter as Hp, AutoScrollOptions as Hr, runFontString as Hs, CapturedFrame as Ht, themeExtension as Hu, UiScheduler as I, capturePointer as Ia, wordRangeAt as Ic, defaultTextStyle as Id, BOX_SHADOW_BLUR_REACH as If, UiTransform as Ig, UiColors as Ih, sizeGridTracks as Ii, UiProperties as Il, tightenConstraints as Im, createCanvasSurface as In, SelectionControllerOptions as Io, isUiElement as Ip, contextMenu as Ir, buildFontString as Is, GlyphUpload as It, UiThemeExtension as Iu, ByteSource as J, UiDragPayload as Ja, Grid as Jc, PaintFillRule as Jd, UiInsetSource as Jf, normalizeColor as Jg, TextLineRun as Jh, LayoutNotifier as Ji, isUiRole as Jl, decorationRect as Jm, publishInset as Jn, ScrollbarAxis as Jo, UiGestureEvent as Jp, reorderable as Jr, DEFAULT_FONT_SIZE as Js, WebGPUSurface as Jt, highContrastColors as Ju, cueAt as K, UiTouchScroller as Ka, Column as Kc, textStylesEqual as Kd, UiInsetEdge as Kf, colorValuesEqual as Kg, SpannedRuns as Kh, layoutParagraph as Ki, UiSemanticState as Kl, DecorationStroke as Km, PublishInsetArgs as Kn, SCROLLBAR_MIN_THUMB as Ko, UiEventType as Kp, dragSource as Kr, Canvas2DGradient as Ks, WebGPURendererOptions as Kt, UiContrast as Ku, UiSchedulerOptions as L, isImeKey as La, Responsive as Lc, editableSpansOf as Ld, UiBoxShadow as Lf, UiTransforms as Lg, colorsEqualPalette as Lh, AlignContent as Li, UiPropertyName as Ll, NodeId as Lm, resolveBoolean as Ln, SelectionHost as Lo, UiPropValue as Lp, shortcut as Lr, createCanvasTextStyle as Ls, WebGPUGlyphAtlas as Lt, UiThemeExtensionOptions as Lu, paragraphGeometryFrom as M, PlatformAdapterOptions as Ma, nextGraphemeEnd as Mc, UiTextMetrics as Md, minmax as Mf, interpolateColor as Mg, UiShapes as Mh, GridItemRequest as Mi, TextProps as Ml, Size as Mm, drawOverlayShapes as Mn, writeDeclaredProperty as Mo, UiElement as Mp, animateLayout as Mr, SpanPaint as Ms, textRuns as Mt, lightTheme as Mu, selectionRectsIn as N, PlatformEventTarget as Na, nextWordEnd as Nc, UiTextRange as Nd, percent as Nf, interpolateNumber as Ng, defaultShapes as Nh, GridPlacement as Ni, TypographyProps as Nl, TightenOptions as Nm, labelOrigin as Nn, writeOverrideProperty as No, isComponentLikeElement as Np, ContextMenuOptions as Nr, TextLinePlacement as Ns, GlyphShaper as Nt, themesEqual as Nu, ParagraphGeometry as O, isSubtreeInert as Oa, selectionRects as Oc, UiResolvedTextSpan as Od, isAutoLength as Of, UiSpringSpec as Og, normalizeBorderRadius as Oh, propertyIsInherited as Oi, RowProps as Ol, Constraints as Om, RenderChanges as On, resetTransitionWarnings as Oo, UiFocusManager as Op, DefaultImageResolver as Or, isPrintable as Os, TextRunDraw as Ot, isVideoSurface as Ou, wordRangeIn as P, PlatformSurface as Pa, previousGraphemeStart as Pc, UiTextSpan as Pd, repeat as Pf, interpolateTransform as Pg, isShapeName as Ph, GridTrack as Pi, UiEventProps as Pl, clampSize as Pm, CanvasHost as Pn, FindHost as Po, isObservable$1 as Pp, ShortcutOptions as Pr, TextRunRect as Ps, GLYPH_SUBPIXEL_PHASES as Pt, withContrast as Pu, rangeSource as Q, UiDropZone as Qa, Stack as Qc, PaintTextAlign as Qd, observeViewportInsets as Qf, UiEasing as Qg, TextRunMeasurer as Qh, ScrollAdjustment as Qi, validateRole as Ql, UiAlignment as Qm, sizeContainer as Qn, scrollbarThumb as Qo, UiPasteEvent as Qp, ClickOutsideOptions as Qr, PaintBoxShadow as Qs, fontStackFor as Qt, densityFactors as Qu, MARK_PREFIX as R, pointerDeviceOf as Ra, ResponsiveProps as Rc, flattenTextSpans as Rd, boxShadow as Rf, parseTransform as Rg, darkColors as Rh, CrossAxisAlignment as Ri, UiPropertyValueOf as Rl, NodeProperty as Rm, resolveNumber as Rn, UiSelectionController as Ro, UiProps as Rp, shortcuts as Rr, drawText as Rs, WebGPUTextureCache as Rt, UiThemeExtensions as Ru, clearLinkHover as S, UiTimerFrameClockOptions as Sa, lineIndexAtY as Sc, visualState as Sd, MinMaxTrack as Sf, UiTween as Sg, UiBorderRadiuses as Sh, closestPropertyName as Si, InteractionProps as Sl, scaleFrom as Sm, traceRoundedRect as Sn, GestureRecognizerOptions as So, defineModifier as Sp, IconCanvas as Sr, nextCaretToggle as Ss, RenderCommand as St, VIRTUAL_WINDOW_PROP as Su, linkOf as T, isNodeInert as Ta, offsetAtPoint as Tc, UiFontStretch as Td, UiTrackSize as Tf, UiDurationToken as Tg, borderRadiusEqual as Th, inheritedPropertyFlags as Ti, PositionProps as Tl, slideUp as Tm, RendererBackend as Tn, UiPinchRecognizer as To, UiModifierTeardown as Tp, IconRasterizerOptions as Tr, EditingPlatform as Ts, ScissorRect as Tt, VirtualViewport as Tu, setPerformanceMarks as U, EditingState as Ua, LazyRow as Uc, spansDifferOnlyInPaint as Ud, UiPropertyDefinition as Uf, UiColor as Ug, FontMetrics as Uh, FlexDirection as Ui, UiLiveRegion as Ul, DecorationFill as Um, themeTokens as Un, UiPoint as Uo, MOUSE_POINTER as Up, DragSourceOptions as Ur, textRunBackgrounds as Us, DrawStats as Ut, themeExtensionsEqual as Uu, measureSpan as V, EditingControllerOptions as Va, LazyGridProps as Vc, spanAtOffset as Vd, boxShadowReach as Vf, transformsEqual as Vg, CharacterCountTextMeasurer as Vh, parseCrossAxisAlignment as Vi, UI_SEMANTIC_STATES as Vl, UiPropertyOverride as Vm, resolveString as Vn, HitTester as Vo, UiInputDispatcher as Vp, pinchable as Vr, runCanvasStyleInto as Vs, WebGPUError as Vt, noThemeExtensions as Vu, VttCue as W, UiEditingController as Wa, Box as Wc, textContentOf as Wd, defineProperty as Wf, colorToHex as Wg, ParagraphLayout as Wh, parseFlexDirection as Wi, UiOrientation as Wl, DecorationRect as Wm, sameArgs as Wn, SCROLLBAR_HOVER_ZONE as Wo, UiBeforeInputEvent as Wp, DropTargetOptions as Wr, textRunDecorations as Ws, RenderHooks as Wt, withThemeExtension as Wu, RangeSourceOptions as X, UiDragState as Xa, Row as Xc, PaintLineJoin as Xd, insetsEqual as Xf, rgb8 as Xg, TextMeasurer as Xh, SCROLLBAR_FADE_MS as Xi, normalizeStates as Xl, paintsAfterChildren as Xm, SizeContainerArgs as Xn, scrollLeaderOf as Xo, UiKeyModifiers as Xp, DraggableOptions as Xr, DEFAULT_TEXT_COLOR as Xs, bumpFontStack as Xt, relativeLuminance as Xu, DEFAULT_BLOCK_SIZE as Y, UiDragSession as Ya, Paint as Yc, PaintLineCap as Yd, UiInsets as Yf, parseColor as Yg, TextMeasureRequest as Yh, LayoutEngine as Yi, isUiSemanticState as Yl, hasDecorationPhase as Ym, BreakpointArgs as Yn, ScrollbarThumb as Yo, UiInputEvent as Yp, DragOffset as Yr, DEFAULT_FONT_WEIGHT as Ys, createWebGPUSurface as Yt, raiseContrast as Yu, bufferSource as Z, UiDropEffect as Za, ScrollView as Zc, PaintSurface as Zd, noInsets as Zf, rgba as Zg, TextOverflow as Zh, SCROLLBAR_LINGER_MS as Zi, statesEqual as Zl, UI_SUBGRID_AXES as Zm, breakpoint as Zn, scrollRange as Zo, UiKeyboardEvent as Zp, draggable as Zr, ObjectFit as Zs, clearFontStacks as Zt, UiDensity as Zu, buildSemanticsTree as _, UiFrameTime as _a, setSelectionRange as _c, isLayoutProtocol as _d, linearGradient as _f, UiAnimation as _g, UiTextWrapValue as _h, bundle as _i, FlexContainerProps as _l, fade as _m, LayoutInspector as _n, UiScrollBehavior as _o, UiModifierSet as _p, IconSourceArgs as _r, editorFor as _s, INSTANCE_STRIDE_FLOATS as _t, LazyListOptions as _u, diffSemantics as a, RelayoutExplanation as aa, createPaintState as ac, defaultShadows as ad, UiImage as af, createEnvironmentKey as ag, UiFontWeight as ah, borderShapes as ai, UiEventBinding as al, UiWheelDeltaMode as am, PaintContext2D as an, UiShortcutRegistry as ao, UiTextInputState as ap, VideoTransport as ar, setMatchRanges as as, Mp3Frame as at, SheetHeaderRenderer as au, semanticsMemory as b, UiManualFrameClock as ba, RunMeasure as bc, defaultVisualState as bd, AutoLength as bf, UiSpring as bg, validateSubgrid as bh, accumulatedOffsetTo as bi, GridProps as bl, resolveMotionState as bm, Canvas2DRenderer as bn, isScrollContainer as bo, UiModifier as bp, iconSource as br, isMultiline as bs, PrimitiveCommand as bt, VIRTUAL_INDEX_PROP as bu, SemanticsMemory as c, describeOverrides as ca, normalizeVerticalAlign as cc, UiTypographyExtensions as cd, ResolvedGradient as cf, DirtyFlags as cg, UiOverflow as ch, focusRing as ci, UiGraphBuilder as cl, wheelDeltaYOf as cm, PaintTarget as cn, formatShortcut as co, UiGroupEdit as cp, DefaultVideoResolverOptions as cr, findMatchesIn as cs, readMp3Header as ct, SheetSourceArgs as cu, SemanticsRewalk as d, labelNode as da, TEXT_SELECTION_PROP as dc, isTypographyRole as dd, UiGradientOffset as df, UiTransitionValue as dg, UiPosition as dh, hoverable as di, ButtonProps as dl, MOTION_REST as dm, PaintOp as dn, KeyboardControllerOptions as do, comparePositions as dp, VideoResolver as dr, UiEnvironmentKeys as ds, Affine as dt, UiVirtualSheetOptions as du, easings as e_, CustomLayoutExplanation as ea, PaintTextSpan as ec, defaultSpacing as ed, UiPaint as ef, TextRunStyle as eg, UiColorValue as eh, autoFocus as ei, createElement as el, UiPointerDevice as em, PaintCanvas as en, UiFileDropMessage as eo, UiContainerSizeSource as ep, ScrollPositionArgs as er, scrollbarZoneAt as es, Mp4Sample as et, CompositionRange as eu, SemanticsSpan as f, withOverrideSource as fa, TextRange as fc, typographyEqual as fd, UiGradientStop as ff, assertTransitionMap as fg, UiSelfAlignment as fh, interactive as fi, ColumnProps as fl, MotionChannel as fm, PaintRecorder as fn, UiKeyboardController as fo, edgeField as fp, canDecodeVideo as fr, EnvironmentNotifier as fs, CLIP_STRIDE_BYTES as ft, VIRTUAL_SHEET_PROP as fu, buildSemanticsSubtree as g, UiFrameClockFactory as ga, selectionRangeOf as gc, UiLayoutProtocol as gd, gradientsEqual as gf, AnimatedCell as gg, UiTextOverflowValue as gh, UiModifierBundle as gi, EnvironmentProps as gl, ResolvedMotionState as gm, InspectorOverlay as gn, ScrollSink as go, UiModifierLayout as gp, sharedElement as gr, caretVisibleAt as gs, INSTANCE_STRIDE_BYTES as gt, LazyItemRenderer as gu, UiSemanticsRecord as h, UiFrameClock as ha, selectableTextOf as hc, UiLayoutContext as hd, gradientPaint as hf, tween as hg, UiTextDirection as hh, pressable as hi, EditableTextProps as hl, MotionTiming as hm, INSPECTOR_HEAT_MS as hn, ScrollContainerState as ho, UiModifierFocus as hp, motion as hr, EDITOR_PROP as hs, GlyphCommand as ht, LazyGridOptions as hu, UiSemanticsPatch as i, OverrideSources as ia, computeObjectFitRect as ic, UiShadows as id, pathValuesEqual as if, UiEnvironmentKey as ig, UiFlexWrap as ih, FocusRingOptions as ii, UiGraph as il, UiTextChangeEvent as im, paintPictures as in, UiShortcutBinding as io, UiTextInput as ip, VideoState as ir, matchRangesOf as is, Mp3Format as it, LazySheetProps as iu, paragraphGeometry as j, CanvasPlatformSurface as ja, lineStartAt as jc, UiTextLink as jd, isPercentLength as jf, UiInterpolator as jg, UiShapeName as jh, GridContribution as ji, TextContentProps as jl, LayoutStats as jm, OverlayShape as jn, resetOverrideWarnings as jo, UiChild as jp, AnimateLayoutOptions as jr, PlacedTextRun as js, glyphCount as jt, darkTheme as ju, hasDrawnText as k, pointerEventsOf as ka, graphemeBoundaries as kc, UiSpannedText as kd, isFrLength as kf, UiSpringToken as kg, uniformBorderRadius as kh, propertyNarrowers as ki, ScrollViewProps as kl, LayoutBox as km, RenderContext as kn, clearOverrideProperty as ko, ComponentResolver as kp, DefaultImageResolverOptions as kr, EditableLayout as ks, buildRenderList as kt, videoFrameSize as ku, SemanticsPlacement as l, formatConstraints as la, resolvePaintState as lc, UiTypographyRole as ld, ResolvedGradientStop as lf, AnimationDriver as lg, UiPlacement as lh, BUTTON_INTERACTION as li, BoxModelProps as ll, DirtyNodeSet as lm, tracePathData as ln, parseShortcut as lo, UiTextPosition as lp, RangeResponse as lr, UiEnvironmentProvider as ls, splitMp3Frames as lt, SheetViewport as lu, UiSemanticsMap as m, UiAnimationFrameClock as ma, selectableTextNodes as mc, UiLayoutChild as md, UiRadialGradient as mf, spring as mg, UiTextAlign as mh, measureFlow as mi, ContainerProps as ml, MotionStateInput as mm, replayPaint as mn, UiPointerController as mo, UiModifierEnvironment as mp, SharedElementArgs as mr, CARET_WIDTH as ms, CommandKind as mt, LazyAxis as mu, UiSemanticsBox as n, steps as n_, LayoutExplanation as na, VerticalAlign as nc, spacingEqual as nd, inputsEqual as nf, spannedRunsFor as ng, UiCursor as nh, BordersOptions as ni, BindingId as nl, UiPointerKind as nm, PaintPictureCache as nn, ShortcutRegistryOptions as no, containerBands as np, VideoClock as nr, TEXT_MATCHES_PROP as ns, demuxMp4Audio as nt, EditableTextModel as nu, dropIndexShifts as o, SizeDecision as oa, isPaintVisible as oc, shadowsEqual as od, GradientPaint as of, findEnvironmentKey as og, UiGridAutoFlow as oh, borders as oi, ChildrenBindingId as ol, UiWheelEvent as om, PaintGradient as on, UiShortcutStep as oo, textInputOf as op, videoSource as or, FindMatch as os, Mp3Frames as ot, SheetRange as ou, TEXT_RUN_ID_SEPARATOR as p, UiFrame as pa, clearSelectionRange as pc, MAX_MEASURES_PER_CHILD as pd, UiLinearGradient as pf, normalizeTransition as pg, UiSubgridAxis as ph, measure as pi, CommonProps as pl, MotionState as pm, PaintRecording as pn, PointerControllerOptions as po, editingGroupOf as pp, MotionArgs as pr, CARET_BLINK_MS as ps, CLIP_STRIDE_FLOATS as pt, sheetSource as pu, parseWebVtt as q, EXTERNAL_FILES as qa, EditableText as qc, PaintBox as qd, UiInsetRegistry as qf, colorsEqual as qg, TextLine as qh, proportionalFontMetrics as qi, UiSemanticStates as ql, decorationColor as qm, insetPadding as qn, SCROLLBAR_THICKNESS as qo, UiFocusEvent as qp, dropTarget as qr, DEFAULT_FONT_FAMILY as qs, WebGPUCanvasHost as qt, contrastRatio as qu, UiSemanticsUpdate as r, LayoutStateExplanation as ra, colorToCss as rc, spacingSteps as rd, paintValuesEqual as rf, UiEnvironment as rg, UiDirection as rh, Decorations as ri, UiBinding as rl, UiSelectionChangeEvent as rm, PaintStats as rn, UiShortcut as ro, unknownContainerSize as rp, VideoSourceArgs as rr, clearMatchRanges as rs, demuxMp4Video as rt, LazySheet as ru, recordsEqual as s, describeLength as sa, normalizeTextAlign as sc, UiTypography as sd, MAX_GRADIENT_STOPS as sf, UiNodeType as sg, UiObjectFit as sh, decorated as si, UiChildrenBinding as sl, noKeyModifiers as sm, PaintResolver as sn, describeShortcut as so, UiEditingGroup as sp, DefaultVideoResolver as sr, FindOptions as ss, Mp3Header as st, SheetRowRenderer as su, UiSemanticsAction as t, linear as t_, Edges as ta, TextAlign as tc, scaleSpacing as td, UiPath as tf, TextWrap as tg, UiContentDistribution as th, BorderEdge as ti, UiDefinition as tl, UiPointerEvent as tm, PaintCanvasFactory as tn, dragSessionFor as to, bandOf as tp, scrollPosition as tr, SubtreeBounds as ts, Mp4VideoTrack as tt, EditUnit as tu, SemanticsReuse as u, formatExplanation as ua, DEFAULT_LINE_HEIGHT_FACTOR as uc, defaultTypography as ud, UiGradient as uf, UiTransitionSpec as ug, UiPointerEvents as uh, InteractiveOptions as ui, BoxProps as ul, MOTION_CHANNELS as um, EMPTY_RECORDING as un, shortcutKeyCaps as uo, adjacentField as up, VideoPlayback as ur, provideEnvironment as us, WebGPUGlyphPages as ut, UiVirtualSheet as uu, rewalkSemantics as v, UiHostFrameClock as va, CaretRect as vc, UiVisualState as vd, radialGradient as vf, UiAnimationOptions as vg, UiThemeColorName as vh, noModifiers as vi, FlexItemProps as vl, isMotionRest as vm, LayoutInspectorOptions as vn, UiScrollability as vo, UiUnknownModifierPropertyError as vp, ImageSourceArgs as vr, editorOf as vs, ImageCommand as vt, LazySourceArgs as vu, linkHoverOf as w, isNodeHitTestable as wa, lineLimit as wc, UiFontKerning as wd, UiLength as wf, createTween as wg, borderRadiusCorners as wh, getPropertyNames as wi, PaintProps as wl, slideFrom as wm, ScrollLayerStats as wn, PinchRecognizerOptions as wo, UiModifierHost as wp, IconRasterizer as wr, EditCommand as ws, RenderTextCache as wt, VirtualUpdate as wu, textRunOfRecordId as x, UiTimerFrameClock as xa, caretRectFor as xc, hasVisualState as xd, FrLength as xf, UiSpringOptions as xg, UiBorderRadius as xh, contentOffset as xi, IdentityProps as xl, rotateFrom as xm, Canvas2DRendererOptions as xn, GestureInput as xo, UiModifierKind as xp, imageSource as xr, isReadOnly as xs, PrimitiveKind as xt, VIRTUAL_LEAD_PROP as xu, semanticsInertAbove as y, UiHostFrameClockOptions as ya, PlacedLine as yc, UiVisualStateSet as yd, validateGradient as yf, UiReducedMotionPolicy as yg, UiVerticalAlign as yh, Transform as yi, GridItemProps as yl, pop as ym, CanvasTextMeasurer as yn, UiWheelController as yo, assertModifierList as yp, ImageSources as yr, isEditableNode as ys, NO_CLIP_INDEX as yt, UiVirtualWindow as yu, markInstant as z, prepareInputSurface as za, LazyColumn as zc, hiddenRangesOf as zd, boxShadowArraysEqual as zf, transform as zg, lightColors as zh, MainAxisAlignment as zi, UiPropertyValues as zl, UiNode as zm, resolveProperty as zn, HitTestLayoutReader as zo, UiEventListener as zp, PinchableOptions as zr, fillTextRects as zs, initializeWebGPU as zt, defineThemeExtension as zu };
19398
+ //# sourceMappingURL=index-DR8HAfh3.d.ts.map