gesso-core 0.4.2 → 0.5.1

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.
@@ -1013,6 +1013,32 @@ declare class LayoutRecord {
1013
1013
  * that offset to its content extent.
1014
1014
  */
1015
1015
  clips: boolean;
1016
+ /**
1017
+ * Where anything in this subtree may paint, in the same space as the
1018
+ * box: the box itself, grown by whatever reaches past it under a node
1019
+ * that doesn't clip (an absolute child, a child pushed past it). A
1020
+ * renderer culls a node by this rather than by its box, since a node
1021
+ * that doesn't clip lets its children paint anywhere. It's the box
1022
+ * whenever nothing reaches past, which is nearly always. Worked out
1023
+ * when a node with children is placed, and grown up the ancestors
1024
+ * when a box is written; too large costs a descent, never a paint.
1025
+ */
1026
+ extentMinX: number;
1027
+ extentMinY: number;
1028
+ extentMaxX: number;
1029
+ extentMaxY: number;
1030
+ /**
1031
+ * How far past each side of its box the node itself paints: its
1032
+ * outer `boxShadows`, which no clip of its own holds in. Zero for
1033
+ * nearly every node. Part of the extent, and of a clipping node's
1034
+ * contribution to its parent's, since its clip is for its children.
1035
+ * Read from the node when its box is written and when a frame
1036
+ * repaints it; see `LayoutEngine.refreshPaintReach`.
1037
+ */
1038
+ paintReachLeft: number;
1039
+ paintReachTop: number;
1040
+ paintReachRight: number;
1041
+ paintReachBottom: number;
1016
1042
  scrollable: boolean;
1017
1043
  /**
1018
1044
  * An editable, which scrolls its own text inside its box.
@@ -1089,42 +1115,54 @@ declare class LayoutRecord {
1089
1115
  /** Constraints this record was last measured under. */
1090
1116
  lastConstraints: Constraints;
1091
1117
  /**
1092
- * A second memoised measurement. Flex measures every item twice —
1093
- * loose for its max-content size, then tight at its final size — and
1094
- * a one-entry memo would miss on every pass of every later frame. The
1095
- * outputs of the previous constraints are kept here and swapped back
1096
- * in when those constraints come round again, so an unchanged item
1097
- * costs nothing in either pass.
1098
- */
1099
- altValid: boolean;
1100
- altConstraints: Constraints;
1101
- /**
1102
- * The alternate measurement's twelve outputs, one field each.
1103
- *
1104
- * These were a `number[]` built by an `outputs()` helper, which reads
1105
- * better and cost two array allocations on every flex item of every
1106
- * pass: a full pass of the benchmark list spent 2.2% of its time in
1107
- * the pair of helpers that packed and unpacked them, before the
1108
- * collector's share of having made the arrays at all. A field per
1109
- * output is the same twelve numbers with nothing built to hold them.
1110
- */
1111
- private altMeasuredWidth;
1112
- private altMeasuredHeight;
1113
- private altOuterWidth;
1114
- private altOuterHeight;
1115
- private altMinContentWidth;
1116
- private altMinContentHeight;
1117
- private altMaxContentWidth;
1118
- private altIntrinsicWidth;
1119
- private altIntrinsicHeight;
1120
- private altHasBaseline;
1121
- private altBaseline;
1122
- private altContentWidth;
1123
- private altContentHeight;
1124
- /** Keeps the current measurement as the alternate before a fresh one overwrites it. */
1118
+ * The percentage base the current measurement resolved against, and
1119
+ * whether the node has a length that resolves against one.
1120
+ *
1121
+ * A percentage is resolved against the container's content box,
1122
+ * which is not in the constraints. A node sized `height: 100%` and
1123
+ * asked the same loose constraints under a taller container must
1124
+ * not be handed back the height it had in the shorter one, so for a
1125
+ * node with a percentage the base is part of what a memo matches.
1126
+ * Each axis counts only for a node with a percentage on it, so a
1127
+ * block that is `width: 100%` is not measured again because its
1128
+ * column's height changed, and a node with none (the overwhelming
1129
+ * majority) matches as cheaply as it always did.
1130
+ */
1131
+ lastBaseWidth: number | undefined;
1132
+ lastBaseHeight: number | undefined;
1133
+ percentWidth: boolean;
1134
+ percentHeight: boolean;
1135
+ /** Whether a measurement under `baseWidth` by `baseHeight` would resolve the same percentages as the current one. */
1136
+ sameBase(baseWidth: number | undefined, baseHeight: number | undefined): boolean;
1137
+ /**
1138
+ * Earlier memoised measurements, most recently used first.
1139
+ *
1140
+ * Flex measures an item more than once a pass, and a memo of one
1141
+ * entry missed on every pass of every later frame. Two entries (the
1142
+ * last one and one alternate) covered a column of items: loose for
1143
+ * the max-content size, then tight at the final size. A row with a
1144
+ * flexible child holding a column of auto-height blocks asks that
1145
+ * column's items a third question: the flex basis measures them
1146
+ * unbounded, the final width measures them loose in height, and a
1147
+ * row that stretches its items measures them again at the stretched
1148
+ * height. With two slots the third evicted one of the others, so an
1149
+ * edit to one block re-measured every block on every keystroke: 6,005
1150
+ * nodes for a 1,000-paragraph document, where a hit costs nothing.
1151
+ *
1152
+ * The slots are allocated the first time a record needs one, so a
1153
+ * node only ever measured one way carries none.
1154
+ */
1155
+ private alternates;
1156
+ /** Keeps the current measurement as the most recent alternate before a fresh one overwrites it. */
1125
1157
  saveAlt(): void;
1126
- /** Makes the alternate measurement current, and the current one alternate. */
1127
- swapAlt(): void;
1158
+ /**
1159
+ * Makes a remembered measurement for these constraints current, and
1160
+ * keeps the current one as an alternate in its place. False when
1161
+ * nothing remembered matches.
1162
+ */
1163
+ recallAlt(constraints: Constraints, baseWidth?: number, baseHeight?: number): boolean;
1164
+ /** Forgets every remembered measurement: the node's content changed. */
1165
+ forgetAlts(): void;
1128
1166
  /**
1129
1167
  * Set by the parent before measuring this node: something outside it
1130
1168
  * reads a content-derived output beyond its constrained size — its
@@ -1143,6 +1181,8 @@ declare class LayoutRecord {
1143
1181
  relayoutBoundary: boolean;
1144
1182
  measureDirty: boolean;
1145
1183
  placeDirty: boolean;
1184
+ /** Whether the node's children have been placed at least once, so its subtree can be shifted rather than placed. */
1185
+ placedOnce: boolean;
1146
1186
  transformDirty: boolean;
1147
1187
  /**
1148
1188
  * Which layout pass last folded the node's properties onto this
@@ -1241,6 +1281,15 @@ interface UiColors {
1241
1281
  readonly selectionBackground: UiColor;
1242
1282
  readonly selectionForeground: UiColor;
1243
1283
  }
1284
+ /**
1285
+ * The stock palettes.
1286
+ *
1287
+ * Neutrals carry a little blue, as a screen's greys do now, rather
1288
+ * than being an even mix of the three channels; the accent is deep
1289
+ * enough that white on it reads (4.5:1 and up), which the bright
1290
+ * Material blue this replaced did not. Values are written as 8-bit
1291
+ * channels so each one can be read as the hex it is.
1292
+ */
1244
1293
  declare const lightColors: UiColors;
1245
1294
  declare const darkColors: UiColors;
1246
1295
  /**
@@ -1743,6 +1792,8 @@ interface LayoutStats {
1743
1792
  measured: number;
1744
1793
  /** Nodes whose place ran. */
1745
1794
  placed: number;
1795
+ /** Laid-out subtrees that moved without changing size, and were shifted rather than placed again. */
1796
+ shifted: number;
1746
1797
  /** Subtrees laid out from a relayout boundary instead of the root. */
1747
1798
  relayoutRoots: number;
1748
1799
  /** Whether the pass started from the root. */
@@ -1830,11 +1881,12 @@ declare class UiSharedElements {
1830
1881
  * But it must not disappear *yet*. A claim happens during
1831
1882
  * reconciliation, and the arriving node has no box until the frame
1832
1883
  * lays out — so yielding here leaves a window in which neither
1833
- * element is drawn. For a transform morph that window is closed
1834
- * within the same frame; for a geometry morph, which cannot write a
1835
- * box after layout has run, it is a whole frame long, and a whole
1836
- * frame with neither the old card nor the new one is a flash of the
1837
- * page behind them. It was exactly that visible.
1884
+ * element is drawn. The window closes within the frame now, for a
1885
+ * geometry morph as for a transform one, but only because the
1886
+ * arriving element takes its place in that frame's layout pass; when
1887
+ * a geometry morph's box waited for the next frame, a whole frame
1888
+ * with neither the old card nor the new one was a flash of the page
1889
+ * behind them, and it was exactly that visible.
1838
1890
  *
1839
1891
  * So the caller yields the previous holder at the moment it actually
1840
1892
  * takes its place. Until then both are on screen, in the same
@@ -1991,6 +2043,15 @@ declare class DirtyNodeSet {
1991
2043
  delete(node: UiNode): boolean;
1992
2044
  get size(): number;
1993
2045
  isEmpty(): boolean;
2046
+ /**
2047
+ * Whether any node in the set carries one of `flags`, without
2048
+ * draining it.
2049
+ *
2050
+ * What a frame asks after its layout listeners have run: whether one
2051
+ * of them wrote something that has to be laid out again before the
2052
+ * frame paints. Stops at the first node that says yes.
2053
+ */
2054
+ anyFlags(flags: DirtyFlags): boolean;
1994
2055
  /**
1995
2056
  * Drains the set, returning the nodes in insertion order.
1996
2057
  */
@@ -2290,7 +2351,21 @@ declare class UiKeyboardEvent extends UiInputEvent {
2290
2351
  declare class UiBeforeInputEvent extends UiInputEvent {
2291
2352
  readonly inputType: string;
2292
2353
  readonly data: string | null;
2293
- constructor(inputType: string, data: string | null);
2354
+ /**
2355
+ * For `insertFromPaste`, the clipboard's HTML when it held some,
2356
+ * else null. `data` is always its plain text, which is what the
2357
+ * field inserts; an editor that keeps structure (a heading, a list,
2358
+ * a link) can cancel the edit and convert this instead.
2359
+ */
2360
+ readonly html: string | null;
2361
+ constructor(inputType: string, data: string | null,
2362
+ /**
2363
+ * For `insertFromPaste`, the clipboard's HTML when it held some,
2364
+ * else null. `data` is always its plain text, which is what the
2365
+ * field inserts; an editor that keeps structure (a heading, a list,
2366
+ * a link) can cancel the edit and convert this instead.
2367
+ */
2368
+ html?: string | null);
2294
2369
  }
2295
2370
  /**
2296
2371
  * An editable node's text changed: the new value and the selection
@@ -2306,7 +2381,11 @@ declare class UiBeforeInputEvent extends UiInputEvent {
2306
2381
  */
2307
2382
  declare class UiPasteEvent extends UiInputEvent {
2308
2383
  readonly text: string;
2309
- constructor(text: string);
2384
+ /** The clipboard's HTML when it held some, else null. */
2385
+ readonly html: string | null;
2386
+ constructor(text: string,
2387
+ /** The clipboard's HTML when it held some, else null. */
2388
+ html?: string | null);
2310
2389
  }
2311
2390
  declare class UiTextChangeEvent extends UiInputEvent {
2312
2391
  readonly value: string;
@@ -2665,6 +2744,246 @@ interface ComponentResolver {
2665
2744
  flushMounts(): void;
2666
2745
  }
2667
2746
  //#endregion
2747
+ //#region src/input/UiFocusManager.d.ts
2748
+ /**
2749
+ * One entry on the focus scope stack.
2750
+ *
2751
+ * `restore` is what held focus when the scope was pushed, so popping
2752
+ * can hand focus back to the control that opened the dialog. Scopes
2753
+ * nest: a confirmation dialog over a dialog pushes a second one, and
2754
+ * each pop restores its own opener.
2755
+ */
2756
+ /**
2757
+ * What moved focus, which decides whether the focused node is scrolled
2758
+ * into view.
2759
+ *
2760
+ * A browser draws the same distinction and it is the reason it exists:
2761
+ * keyboard focus must reveal its target, because a control the person
2762
+ * cannot see is a control they cannot use, while a *click* has already
2763
+ * shown them where they are — the thing they pressed is under their
2764
+ * cursor. Scrolling after a click moves the page out from under a
2765
+ * pointer that is still there, and on a tall element that is a jump of
2766
+ * most of the screen.
2767
+ */
2768
+ type FocusSource = 'pointer' | 'keyboard' | 'program';
2769
+ /**
2770
+ * How focus is moved, beyond what moved it. The DOM's `FocusOptions`,
2771
+ * for the part of it that means something here.
2772
+ */
2773
+ interface FocusOptions {
2774
+ /**
2775
+ * Leaves every scroll container where it is, as
2776
+ * `element.focus({ preventScroll: true })` does: the node takes focus
2777
+ * without being scrolled into view.
2778
+ *
2779
+ * For focus placed for a screen reader's sake rather than the eye's.
2780
+ * A page that focuses its content region when it opens, so the region
2781
+ * is read out, starts at its top; revealing the region as well would
2782
+ * scroll a tall one to a few pixels short of its own edge, because a
2783
+ * reveal keeps a margin from the viewport.
2784
+ *
2785
+ * Kept for as long as the node holds focus: a key pressed later makes
2786
+ * the focus visible without scrolling to it either. Moving focus
2787
+ * again, by Tab or by code, reveals as usual.
2788
+ */
2789
+ readonly preventScroll?: boolean;
2790
+ }
2791
+ /**
2792
+ * How the person last drove the app, as far as focus can tell: the
2793
+ * pointer or the keyboard. This is what decides whether focus is
2794
+ * *visible*, the way `:focus-visible` does in a browser: a ring that
2795
+ * appeared on every mouse click would mark a control nobody is about to
2796
+ * drive with the keyboard, so the ring waits until the keyboard is used.
2797
+ */
2798
+ type FocusModality = 'pointer' | 'keyboard';
2799
+ /**
2800
+ * Logical focus within the UI tree.
2801
+ *
2802
+ * At most one node holds focus at a time. Focus transitions are
2803
+ * target-only: the node losing focus receives Blur (with the new
2804
+ * node as `relatedNode`), then the node gaining focus receives Focus
2805
+ * (with the old node as `relatedNode`).
2806
+ *
2807
+ * Tab / Shift+Tab navigation walks the focusable nodes in document
2808
+ * (depth-first) order and wraps around. A node participates when
2809
+ * `isNodeFocusable` says so: focusable by type (Button), explicitly
2810
+ * opted in via `focusable: true`, and never when inert.
2811
+ *
2812
+ * Focus-on-press is applied through `focusOnPress`, which the pointer
2813
+ * pipeline calls after a successful pointerdown (skipped when the
2814
+ * down was defaultPrevented).
2815
+ *
2816
+ * **Scopes.** `pushScope(node)` confines focus to a subtree: traversal
2817
+ * collects only that subtree's focusables, so Tab wraps inside it, and
2818
+ * `focus()` refuses a node outside it — which is what makes a modal
2819
+ * dialog modal for the keyboard. `popScope()` restores focus to
2820
+ * whatever held it when the scope was pushed. Components reach both
2821
+ * through `FocusService`, never directly.
2822
+ */
2823
+ declare class UiFocusManager {
2824
+ private readonly dispatcher;
2825
+ private root;
2826
+ private focused;
2827
+ /**
2828
+ * Keyboard until told otherwise, so focus placed before any input
2829
+ * (an `autoFocus`, a dialog's first field) is visible, as a browser
2830
+ * would show it.
2831
+ */
2832
+ private modality;
2833
+ /** How the focused node took focus; see `FocusOptions.preventScroll`. */
2834
+ private focusedOptions;
2835
+ private readonly listeners;
2836
+ private readonly scopeListeners;
2837
+ private readonly scopes;
2838
+ /** The field of each editing group that last had focus, where Tab back into the group lands. */
2839
+ private readonly groupEntries;
2840
+ constructor(root: UiNode, dispatcher: UiInputDispatcher);
2841
+ /** The root used for focus-order traversal. Clears any active scope. */
2842
+ setRoot(root: UiNode): void;
2843
+ /** The node that currently holds logical focus, or null. */
2844
+ get focusedNode(): UiNode | null;
2845
+ hasFocus(): boolean;
2846
+ /** How the person last drove the app. */
2847
+ get focusModality(): FocusModality;
2848
+ /**
2849
+ * Whether the focus held should be shown. True while focus was
2850
+ * reached by the keyboard, or by code with no pointer since; false
2851
+ * after a pointer press, until the next key.
2852
+ */
2853
+ get focusVisible(): boolean;
2854
+ /**
2855
+ * Records an input the person made. A change of modality while a node
2856
+ * holds focus is reported to the focus listeners as a change on that
2857
+ * node, so a ring can appear on a mouse-focused control the moment an
2858
+ * arrow key is pressed, and disappear again on the next press.
2859
+ */
2860
+ noteInput(modality: FocusModality): void;
2861
+ /**
2862
+ * The subtree focus is currently confined to: the innermost scope,
2863
+ * or the whole tree when none is active.
2864
+ */
2865
+ get scopeRoot(): UiNode;
2866
+ /** Whether focus is confined to a subtree. */
2867
+ get trapped(): boolean;
2868
+ /**
2869
+ * Moves focus to the node. Returns false when the node cannot be
2870
+ * focused (inert, non-focusable, outside the active scope); true
2871
+ * otherwise, including when the node already held focus (a no-op
2872
+ * that emits nothing).
2873
+ *
2874
+ * `options` travel with the change to the listeners, which is where
2875
+ * the runtime decides whether to scroll the node into view.
2876
+ */
2877
+ focus(node: UiNode, source?: FocusSource, options?: FocusOptions): boolean;
2878
+ /**
2879
+ * Called after focus moves or clears, with the new focused node. The
2880
+ * runtime uses it to scroll the focused node into view, unless the
2881
+ * options say not to.
2882
+ */
2883
+ onFocusChange(listener: (node: UiNode | null, source: FocusSource, options: FocusOptions) => void): () => void;
2884
+ /** Called after a scope is pushed or popped. */
2885
+ onScopeChange(listener: () => void): () => void;
2886
+ private notify;
2887
+ private notifyScope;
2888
+ /** Drops focus without moving it anywhere. */
2889
+ blur(): void;
2890
+ /**
2891
+ * Focus-on-press hook: focuses the nearest focusable node at or above
2892
+ * the one that was pressed.
2893
+ *
2894
+ * The walk upward is what the DOM does, and what a container that is
2895
+ * one tab stop needs: pressing a tab hits the Text inside it, a table
2896
+ * cell hits a Box three levels below the table, and a component whose
2897
+ * arrows move a selection is keyboard-dead after a mouse press if the
2898
+ * press left focus where it was. Found in a browser, on `Tabs` —
2899
+ * clicking a tab selected it and the arrows then did nothing.
2900
+ *
2901
+ * Nothing focusable above the press leaves focus untouched, as before:
2902
+ * pressing the page background is not a request to blur.
2903
+ */
2904
+ focusOnPress(node: UiNode): void;
2905
+ /** Moves focus to the next focusable node, wrapping to the first. */
2906
+ focusNext(): boolean;
2907
+ /** Moves focus to the previous focusable node, wrapping to the last. */
2908
+ focusPrevious(): boolean;
2909
+ /**
2910
+ * Confines focus to `root` until the matching `popScope`.
2911
+ *
2912
+ * Focus that is outside the new scope moves to its first focusable,
2913
+ * so the very next Tab stays inside; a scope with nothing focusable
2914
+ * in it drops focus rather than leaving it behind the dialog.
2915
+ */
2916
+ pushScope(root: UiNode): void;
2917
+ /**
2918
+ * Moves focus into the innermost scope when it is outside it, and
2919
+ * drops it when the scope has nothing to focus.
2920
+ *
2921
+ * A scope is usually taken from a `ref`, which fires before the
2922
+ * node's children are reconciled — so at that moment a dialog is an
2923
+ * empty box and there is nothing in it to focus. The runtime calls
2924
+ * this again once the frame's tree is built, which is when a dialog
2925
+ * gets its caret. Idempotent: with focus already inside the scope,
2926
+ * or no scope at all, it does nothing.
2927
+ *
2928
+ * **The scope root is the fallback, and it is the whole reason
2929
+ * `tabStop` exists.** A scope with no tab stop inside it used to
2930
+ * blur, which hands the keyboard to nothing: a `Dialog` whose body
2931
+ * is a sentence and a button could not be dismissed with Escape,
2932
+ * because Escape had nowhere to be delivered. Falling back to the
2933
+ * root fixes that only if the root can hold focus without becoming a
2934
+ * stop of its own, or every dialog grows a tab stop that announces
2935
+ * nothing. `focusable: true, tabStop: false` on the body is exactly
2936
+ * that pair, and the fallback is what makes it worth setting.
2937
+ *
2938
+ * Blurring is still what happens when the root cannot hold focus
2939
+ * either, because a scope that has genuinely nothing to focus is
2940
+ * better admitted than faked.
2941
+ */
2942
+ settleScope(): void;
2943
+ /**
2944
+ * Ends the innermost scope and hands focus back to whatever held it
2945
+ * when that scope was pushed, when that node is still in the tree
2946
+ * and still focusable. Otherwise focus is dropped rather than left
2947
+ * on a node the scope was hiding.
2948
+ */
2949
+ popScope(): void;
2950
+ /**
2951
+ * Reacts to a subtree leaving the graph.
2952
+ *
2953
+ * The graph reports the root of a removed subtree after detaching
2954
+ * every node in it, so the descendants' parent links are already
2955
+ * gone: the test is "is this node still attached", not "was it in
2956
+ * that subtree".
2957
+ *
2958
+ * A scope whose subtree has gone is a trap that ended, so it is
2959
+ * popped as though the component had released it and focus returns
2960
+ * to the opener — a dialog that unmounts hands the keyboard back
2961
+ * without having to sequence its own teardown. Focus lost with the
2962
+ * subtree is dropped without a Blur, since the node's listeners were
2963
+ * released with it.
2964
+ */
2965
+ handleNodeRemoved(_node: UiNode): void;
2966
+ private moveFocus;
2967
+ /**
2968
+ * The tab stops in document order (parent before children).
2969
+ *
2970
+ * Tab stops and not every focusable node: a container with
2971
+ * `tabStop: false` can hold focus and is not a place the cycle
2972
+ * stops, which is what lets a dialog body be the keyboard's home of
2973
+ * last resort without becoming a stop of its own.
2974
+ */
2975
+ private collectFocusable;
2976
+ /** Whether an ancestor is hidden or disabled, which takes the node's focus away with it. */
2977
+ private insideHidden;
2978
+ /** The editing group a field belongs to, by its root, or null for anything that isn't a field of one. */
2979
+ private groupOf;
2980
+ /** Whether the node may hold focus given the active scope, if any. */
2981
+ private withinScope;
2982
+ /** Whether the node is still connected to the traversal root. */
2983
+ private isAttached;
2984
+ private isWithin;
2985
+ }
2986
+ //#endregion
2668
2987
  //#region src/modifiers/UiModifierHost.d.ts
2669
2988
  /** Anything a modifier can hand to `own` to have released on detach. */
2670
2989
  type UiModifierTeardown = (() => void) | {
@@ -2788,27 +3107,46 @@ interface UiModifierHost {
2788
3107
  * A scroll is a superset of what a listener may care about: read
2789
3108
  * `flowBox()` inside the listener when what matters is the node's
2790
3109
  * place in the layout rather than on the screen.
3110
+ *
3111
+ * It runs after the frame's layout and before the frame paints, and
3112
+ * the listener may change layout from it: the runtime lays out again
3113
+ * before painting, and tells the listeners whose boxes that moved, so
3114
+ * what was written is on screen on the same frame. The loop is
3115
+ * bounded, so a listener that answers its own change with another
3116
+ * one is painted unsettled and warned about rather than hanging.
2791
3117
  */
2792
3118
  onLayout(listener: (box: LayoutBox) => void): void;
2793
3119
  /**
2794
3120
  * The value the node inherits for an environment key: what the
2795
3121
  * nearest provider above it supplies, else the key's default.
3122
+ *
3123
+ * `of` reads another node's instead, for a node whose environment
3124
+ * belongs somewhere else: an overlay's content keeps the theme of
3125
+ * the place it was declared, not of the layer it is drawn in.
2796
3126
  */
2797
- environment<T>(key: UiEnvironmentKey<T>): T;
3127
+ environment<T>(key: UiEnvironmentKey<T>, of?: UiNode): T;
2798
3128
  /**
2799
3129
  * Called after the node's inherited environment changed — a theme
2800
3130
  * provider above it swapping palettes, or the node being mounted
2801
3131
  * into a tree that provides one. Removed on detach.
2802
3132
  *
3133
+ * `of` follows another node's environment instead, as `environment`
3134
+ * reads it; the listener is still removed when this node's modifier
3135
+ * detaches.
3136
+ *
2803
3137
  * Register this only when the modifier holds a value it read out of
2804
3138
  * the environment. A colour does not need it: a `UiColorValue` may
2805
3139
  * name a palette entry, which resolves at paint against whatever the
2806
3140
  * node inherits, which is why `focusRing` has no environment access
2807
3141
  * at all.
2808
3142
  */
2809
- onEnvironment(listener: () => void): void;
2810
- /** Moves keyboard focus to the node, if it can take it. */
2811
- focus(): void;
3143
+ onEnvironment(listener: () => void, of?: UiNode): void;
3144
+ /**
3145
+ * Moves keyboard focus to the node, if it can take it. It is scrolled
3146
+ * into view as any focus from code is, unless `options.preventScroll`
3147
+ * says otherwise.
3148
+ */
3149
+ focus(options?: FocusOptions): void;
2812
3150
  /** Whether the node currently holds keyboard focus. */
2813
3151
  isFocused(): boolean;
2814
3152
  /**
@@ -2965,7 +3303,7 @@ interface UiModifierFocus {
2965
3303
  isFocused(node: UiNode): boolean;
2966
3304
  /** Whether the focus `node` holds should be shown; see `UiFocusManager.focusVisible`. */
2967
3305
  isFocusVisible(node: UiNode): boolean;
2968
- focus(node: UiNode): void;
3306
+ focus(node: UiNode, options?: FocusOptions): void;
2969
3307
  onFocusChange(node: UiNode, listener: (focused: boolean) => void): () => void;
2970
3308
  }
2971
3309
  /** Where a modifier's environment access comes from. */
@@ -3033,33 +3371,121 @@ declare class UiModifierSet {
3033
3371
  */
3034
3372
  declare function assertModifierList(node: UiNode, value: unknown): readonly UiModifier[];
3035
3373
  //#endregion
3036
- //#region src/environment/UiContainerSize.d.ts
3374
+ //#region src/editing/UiEditingGroup.d.ts
3037
3375
  /**
3038
- * A box's content size as it changes, for the things that branch on
3039
- * it.
3376
+ * Fields that select as one: the editables inside a container that sets
3377
+ * `editingGroup`.
3040
3378
  *
3041
- * The value behind `UiEnvironmentKeys.containerSize`, and deliberately
3042
- * a *source* rather than a size. An environment value is a snapshot
3043
- * that a subtree caches, so putting a number in one would mean
3044
- * rebuilding the environment of everything under a container on every
3045
- * pixel of a drag. The source object never changes identity, so the
3046
- * environment is built once; what changes is what the source reports,
3047
- * and only the code that asked to hear about it does any work.
3379
+ * A document editor is many fields, one per paragraph, and a person
3380
+ * selects across paragraphs as if they were one text: dragging from one
3381
+ * into the next, Shift and an arrow off the end of a line, Shift and a
3382
+ * press further down, select all. Each field's own selection can only
3383
+ * cover its own text, so inside a group the editing controller keeps a
3384
+ * selection whose two ends may sit in different fields, lights every
3385
+ * field between them, and hands the shell the selected text, so native
3386
+ * copy and cut take all of it.
3048
3387
  *
3049
- * A media query is the wrong tool for this and is why the environment
3050
- * carries the container and not the window. `observeMediaQuery` needs
3051
- * a window, the runtime that would branch on it is usually in a
3052
- * worker, and the question a component actually has is "how much room
3053
- * do I have", which is not the window's width in any layout with a
3054
- * sidebar in it.
3388
+ * What happens to such a selection when the person types, deletes,
3389
+ * presses Enter, pastes or cuts is the application's: only it knows
3390
+ * that joining a heading to the list under it makes a heading. So those
3391
+ * edits are not applied to any field. They go to `onEdit`, with both
3392
+ * ends, and the application changes its document and puts the caret
3393
+ * where it belongs.
3394
+ *
3395
+ * A selection inside one field is that field's, as it always was.
3055
3396
  */
3056
- interface UiContainerSize {
3057
- /** The last size reported, or zeroes before the first layout. */
3058
- readonly current: Size;
3059
- /** Every distinct size, starting with `current`. */
3060
- readonly changes: Observable<Size>;
3061
- }
3062
- /**
3397
+ interface UiEditingGroup {
3398
+ /** An edit over a selection that spans fields. Nothing is applied for it. */
3399
+ onEdit(edit: UiGroupEdit): void;
3400
+ /**
3401
+ * The text a selection spanning fields copies as. By default each
3402
+ * field's selected text, joined by newlines.
3403
+ */
3404
+ copyText?(start: UiTextPosition, end: UiTextPosition): string;
3405
+ /**
3406
+ * The selection as HTML, which a copy puts on the clipboard beside
3407
+ * the text, for a target that takes formatting (a document, an email).
3408
+ * Asked for a selection across fields and for one inside a single
3409
+ * field of the group. Null or absent copies text alone.
3410
+ */
3411
+ copyHtml?(start: UiTextPosition, end: UiTextPosition): string | null;
3412
+ /**
3413
+ * A selection across fields began, moved, or ended (null). For a
3414
+ * command the application runs over it, such as making it bold:
3415
+ * keys reach the focused field first, and only the group knows what
3416
+ * the selection covers.
3417
+ */
3418
+ onSelectionChange?(selection: {
3419
+ readonly start: UiTextPosition;
3420
+ readonly end: UiTextPosition;
3421
+ } | null): void;
3422
+ }
3423
+ /** A place in a field's text. */
3424
+ interface UiTextPosition {
3425
+ readonly node: UiNode;
3426
+ readonly offset: number;
3427
+ }
3428
+ /**
3429
+ * An edit over a selection that spans fields, in the DOM's vocabulary:
3430
+ * `insertText` with the text, `insertParagraph` for Enter,
3431
+ * `insertFromPaste`, a `delete…` type for Backspace and Delete, and
3432
+ * `deleteByCut`. `start` comes before `end` in document order.
3433
+ */
3434
+ interface UiGroupEdit {
3435
+ readonly inputType: string;
3436
+ readonly data: string | null;
3437
+ /** For a paste, the clipboard's HTML when it held some. */
3438
+ readonly html?: string | null;
3439
+ readonly start: UiTextPosition;
3440
+ readonly end: UiTextPosition;
3441
+ }
3442
+ /** The group a field belongs to, and the container that declared it, or null. */
3443
+ declare function editingGroupOf(node: UiNode): {
3444
+ readonly root: UiNode;
3445
+ readonly group: UiEditingGroup;
3446
+ } | null;
3447
+ /**
3448
+ * The next field in document order after `from` (or before it, for -1),
3449
+ * inside `root`, or null at either end. Walks only as far as it has to,
3450
+ * so stepping from one paragraph to the next costs the nodes between
3451
+ * them, not the whole document.
3452
+ */
3453
+ declare function adjacentField(root: UiNode, from: UiNode, direction: 1 | -1): UiNode | null;
3454
+ /** The first or last field inside `root`, or null when it has none. */
3455
+ declare function edgeField(root: UiNode, direction: 1 | -1): UiNode | null;
3456
+ /**
3457
+ * Which of two positions comes first in document order: negative, zero
3458
+ * or positive, as a comparator.
3459
+ */
3460
+ declare function comparePositions(a: UiTextPosition, b: UiTextPosition): number;
3461
+ //#endregion
3462
+ //#region src/environment/UiContainerSize.d.ts
3463
+ /**
3464
+ * A box's content size as it changes, for the things that branch on
3465
+ * it.
3466
+ *
3467
+ * The value behind `UiEnvironmentKeys.containerSize`, and deliberately
3468
+ * a *source* rather than a size. An environment value is a snapshot
3469
+ * that a subtree caches, so putting a number in one would mean
3470
+ * rebuilding the environment of everything under a container on every
3471
+ * pixel of a drag. The source object never changes identity, so the
3472
+ * environment is built once; what changes is what the source reports,
3473
+ * and only the code that asked to hear about it does any work.
3474
+ *
3475
+ * A media query is the wrong tool for this and is why the environment
3476
+ * carries the container and not the window. `observeMediaQuery` needs
3477
+ * a window, the runtime that would branch on it is usually in a
3478
+ * worker, and the question a component actually has is "how much room
3479
+ * do I have", which is not the window's width in any layout with a
3480
+ * sidebar in it.
3481
+ */
3482
+ interface UiContainerSize {
3483
+ /** The last size reported, or zeroes before the first layout. */
3484
+ readonly current: Size;
3485
+ /** Every distinct size, starting with `current`. */
3486
+ readonly changes: Observable<Size>;
3487
+ }
3488
+ /**
3063
3489
  * A container size nothing has measured yet.
3064
3490
  *
3065
3491
  * The default for the environment key, so a component that reads the
@@ -3249,24 +3675,28 @@ declare function propertyValuesEqual<T>(definition: UiPropertyDefinition<T>, a:
3249
3675
  //#endregion
3250
3676
  //#region src/properties/UiBoxShadow.d.ts
3251
3677
  /**
3252
- * Renderer-independent box shadow description.
3678
+ * Renderer-independent box shadow description, with CSS `box-shadow`
3679
+ * semantics.
3253
3680
  *
3254
- * A shadow is defined by its offset, blur, spread, color, and
3255
- * whether it is inset. The renderer is responsible for translating
3256
- * these semantics into drawing operations.
3681
+ * An outer shadow is the node's (rounded) box, grown by `spreadRadius`
3682
+ * on every side, moved by the offset, blurred by `blurRadius` (a
3683
+ * Gaussian whose standard deviation is half of it), and seen only
3684
+ * outside the box. An inset one is the same shape inverted and seen
3685
+ * only inside the box. `color` may be a palette name, resolved against
3686
+ * the node's theme as `backgroundColor` is.
3257
3687
  */
3258
3688
  interface UiBoxShadow {
3259
3689
  readonly offsetX: number;
3260
3690
  readonly offsetY: number;
3261
3691
  readonly blurRadius: number;
3262
3692
  readonly spreadRadius: number;
3263
- readonly color: UiColor;
3693
+ readonly color: UiColorValue;
3264
3694
  readonly inset?: boolean;
3265
3695
  }
3266
3696
  /**
3267
3697
  * Creates a box shadow with the supplied parameters.
3268
3698
  */
3269
- declare function boxShadow(offsetX: number, offsetY: number, blurRadius: number, spreadRadius: number, color: UiColor, inset?: boolean): UiBoxShadow;
3699
+ declare function boxShadow(offsetX: number, offsetY: number, blurRadius: number, spreadRadius: number, color: UiColorValue, inset?: boolean): UiBoxShadow;
3270
3700
  /**
3271
3701
  * Compares two box shadows for equality.
3272
3702
  */
@@ -3275,6 +3705,34 @@ declare function boxShadowsEqual(a: UiBoxShadow, b: UiBoxShadow): boolean;
3275
3705
  * Compares two shadow arrays for equality.
3276
3706
  */
3277
3707
  declare function boxShadowArraysEqual(a: readonly UiBoxShadow[], b: readonly UiBoxShadow[]): boolean;
3708
+ /**
3709
+ * How far a shadow's blur reaches past the edge of its shape, as a
3710
+ * multiple of `blurRadius`.
3711
+ *
3712
+ * The blur is a Gaussian with a standard deviation of half the radius,
3713
+ * so this is three standard deviations: what is left beyond it is
3714
+ * under a quarter of a percent of the shadow's colour, and both
3715
+ * renderers stop drawing there.
3716
+ */
3717
+ declare const BOX_SHADOW_BLUR_REACH = 1.5;
3718
+ /**
3719
+ * The corner radius of a shadow's shape, from the box's and the
3720
+ * spread: an outer shadow's corner grows with its spread, an inset
3721
+ * one's hole shrinks with it. A square corner stays square, as CSS
3722
+ * keeps it.
3723
+ */
3724
+ declare function boxShadowRadius(boxRadius: number, spreadRadius: number, inset: boolean): number;
3725
+ /**
3726
+ * How far past each side of the box a node's outer shadows may paint,
3727
+ * written into `out`; all zero for a node with none. Inset shadows
3728
+ * paint inside the box and add nothing.
3729
+ */
3730
+ declare function boxShadowReach(shadows: readonly UiBoxShadow[], out: {
3731
+ left: number;
3732
+ top: number;
3733
+ right: number;
3734
+ bottom: number;
3735
+ }): void;
3278
3736
  //#endregion
3279
3737
  //#region src/layout/UiLength.d.ts
3280
3738
  /**
@@ -3795,6 +4253,18 @@ interface UiTextMetrics {
3795
4253
  readonly fontVariant?: UiFontVariant;
3796
4254
  readonly fontKerning?: UiFontKerning;
3797
4255
  readonly letterSpacing?: number;
4256
+ /**
4257
+ * Kept in the text but not drawn: the run takes no room, paints
4258
+ * nothing, and a caret steps over it as one unit.
4259
+ *
4260
+ * It is a metric field because it changes a width, to nothing. Its
4261
+ * characters stay where they were, so every offset still means what
4262
+ * it meant, a copy of the text still copies them, and the semantics
4263
+ * mirror still reads them. It is how an editor that styles markup
4264
+ * as it is typed (`**bold**` drawn as a bold word) puts the markers
4265
+ * out of sight without taking them out of the string.
4266
+ */
4267
+ readonly hidden?: boolean;
3798
4268
  }
3799
4269
  /**
3800
4270
  * A run that is activated rather than only read.
@@ -3845,6 +4315,16 @@ interface UiSpannedText {
3845
4315
  readonly text: string;
3846
4316
  readonly spans: readonly UiResolvedTextSpan[];
3847
4317
  }
4318
+ /**
4319
+ * What text is set in when nothing says otherwise.
4320
+ *
4321
+ * `system-ui` is the platform's own interface face (San Francisco,
4322
+ * Segoe UI, Roboto), which is what an application on that platform is
4323
+ * expected to look like; `sans-serif` is there for an engine that does
4324
+ * not know the generic. The line is 20 on 14, about 1.43, because the
4325
+ * 1.2 that a browser's `normal` comes to sets lines too tight to read
4326
+ * in a paragraph. The ink is the stock palette's `text`, not black.
4327
+ */
3848
4328
  declare const defaultTextStyle: UiTextStyle;
3849
4329
  /** The text of a span array, with each run's offsets into it. */
3850
4330
  declare function flattenTextSpans(spans: readonly UiTextSpan[]): UiSpannedText;
@@ -3886,7 +4366,21 @@ declare function resolvedSpansOf(node: UiNode): readonly UiResolvedTextSpan[];
3886
4366
  * plain colour rather than a frame of nonsense, and corrects itself
3887
4367
  * as soon as the application catches up.
3888
4368
  */
3889
- declare function editableSpansOf(node: UiNode, text: string): readonly UiResolvedTextSpan[];
4369
+ declare function editableSpansOf(node: UiNode, text: string, composition?: UiTextRange | null): readonly UiResolvedTextSpan[];
4370
+ /** A stretch of a paragraph, as offsets into its text. */
4371
+ interface UiTextRange {
4372
+ readonly start: number;
4373
+ readonly end: number;
4374
+ }
4375
+ /** The part of a run `hiddenRangesOf` reads; a paint span has it as well as a resolved one. */
4376
+ type HiddenSpan = Pick<UiResolvedTextSpan, 'start' | 'end' | 'hidden'>;
4377
+ /**
4378
+ * The stretches of a paragraph its runs hide, in order, with runs that
4379
+ * touch merged into one: `**` hidden next to a hidden `_` is one
4380
+ * stretch of three characters, which a caret steps over at once.
4381
+ * Remembered by the identity of the array, as the flattening is.
4382
+ */
4383
+ declare function hiddenRangesOf(spans: readonly HiddenSpan[]): readonly UiTextRange[];
3890
4384
  /** The span covering an offset, or undefined where no run does. */
3891
4385
  declare function spanAtOffset(spans: readonly UiResolvedTextSpan[], offset: number): UiResolvedTextSpan | undefined;
3892
4386
  /**
@@ -4140,6 +4634,11 @@ type UiTypographyRole = keyof UiTypography | (keyof UiTypographyExtensions & str
4140
4634
  * drawing at a default size, which is the quieter of the two failures.
4141
4635
  */
4142
4636
  declare function isTypographyRole(value: unknown, scale: UiTypography): value is UiTypographyRole;
4637
+ /**
4638
+ * The stock scale: one face, and line heights on a 4-point grid rather
4639
+ * than 1.2 of the size, so a paragraph has room and a stack of text
4640
+ * lines up with the spacing scale around it.
4641
+ */
4143
4642
  declare const defaultTypography: UiTypography;
4144
4643
  /**
4145
4644
  * Compares two typography scales for equality.
@@ -5219,6 +5718,26 @@ interface CompositionRange {
5219
5718
  * took. `replaceText` — the host resetting the value from outside —
5220
5719
  * drops the history: the text it replaces never existed as far as the
5221
5720
  * next undo is concerned.
5721
+ *
5722
+ * **Hidden text.** Runs the field draws as nothing (`hidden` on a
5723
+ * span) are still in the text, and the caret treats each stretch of
5724
+ * them as one unit it cannot stop inside:
5725
+ *
5726
+ * - A move by grapheme or word crosses one visible grapheme or word,
5727
+ * and with it the hidden text in the way, and stops on the side of
5728
+ * any hidden text there nearest where it started. From the end of
5729
+ * `**bold**`, Left stops between `l` and `d`; from the start, Right
5730
+ * stops after `b`. Where nothing visible is left that way the caret
5731
+ * goes past the hidden text to the edge, so it is never stuck.
5732
+ * - Backspace and Delete remove the visible grapheme or word next to
5733
+ * the caret and keep hidden text at either end of it: Backspace at
5734
+ * the end of `**bold**` leaves `**bol**`. Hidden text strictly inside
5735
+ * what they remove goes with it, as it does from a selection, which
5736
+ * is deleted exactly as selected. With nothing visible that way they
5737
+ * delete nothing.
5738
+ * - An offset the application sets is kept as given, even inside
5739
+ * hidden text: it may be about to show that text. The next move
5740
+ * steps out of it.
5222
5741
  */
5223
5742
  declare class EditableTextModel {
5224
5743
  private textValue;
@@ -5230,6 +5749,9 @@ declare class EditableTextModel {
5230
5749
  private redoStack;
5231
5750
  private lastEdit;
5232
5751
  private lastEditEnd;
5752
+ private hiddenRanges;
5753
+ private hiddenText;
5754
+ private visibleCache;
5233
5755
  /** Whether the node holds focus; the caret only shows (and blinks) then. */
5234
5756
  focused: boolean;
5235
5757
  /**
@@ -5272,6 +5794,22 @@ declare class EditableTextModel {
5272
5794
  get composing(): boolean;
5273
5795
  get canUndo(): boolean;
5274
5796
  get canRedo(): boolean;
5797
+ /**
5798
+ * The stretches of the text that are not drawn, in order; empty when
5799
+ * none are, or when the ranges were given for a text the field no
5800
+ * longer holds (a keystroke the application has not restyled yet).
5801
+ */
5802
+ get hidden(): readonly UiTextRange[];
5803
+ /**
5804
+ * Says which stretches of `text` are not drawn. `editorFor` calls
5805
+ * this from the node's runs; the ranges only count while the field
5806
+ * holds that text.
5807
+ */
5808
+ setHidden(text: string, ranges: readonly UiTextRange[]): void;
5809
+ /** An offset moved out of hidden text, to the nearer end of it; any other offset as it is. */
5810
+ caretOffsetNear(offset: number): number;
5811
+ /** Whether no visible grapheme lies from the caret in `direction`, so a move that way can only reach the edge. */
5812
+ atVisibleEdge(direction: -1 | 1): boolean;
5275
5813
  /** Sets the selection; `focus` defaults to `anchor` (a caret). */
5276
5814
  select(anchor: number, focus?: number): void;
5277
5815
  /** Moves the caret to `offset`, extending the selection from the anchor when asked. */
@@ -5284,8 +5822,17 @@ declare class EditableTextModel {
5284
5822
  * vertical movement is the caller's, since it needs geometry.
5285
5823
  */
5286
5824
  move(unit: EditUnit, direction: -1 | 1, extend: boolean): void;
5287
- /** The offset one `unit` away from `from` in `direction`. */
5825
+ /** The offset one `unit` away from `from` in `direction`; see "Hidden text" above. */
5288
5826
  offsetBy(from: number, unit: EditUnit, direction: -1 | 1): number;
5827
+ /** The text as drawn, or null when nothing in it is hidden. */
5828
+ private visible;
5829
+ /**
5830
+ * The source range a delete of one `unit` from the caret removes, in
5831
+ * a text with hidden runs: the visible stretch it crosses, without
5832
+ * the hidden text at either end of it. Null when nothing visible is
5833
+ * there to delete.
5834
+ */
5835
+ private visibleDeletion;
5289
5836
  /**
5290
5837
  * Replaces the selection with `text` and puts the caret after it.
5291
5838
  * Single-grapheme insertions at the caret coalesce into one undo
@@ -5359,9 +5906,17 @@ declare class EditableTextModel {
5359
5906
  * What a node is. Closed, so a typo is a build error the way an
5360
5907
  * unknown prop already is: the mirror can only emit roles it knows.
5361
5908
  */
5362
- type UiRole = 'button' | 'checkbox' | 'switch' | 'radio' | 'radiogroup' | 'slider' | 'spinbutton' | 'textbox' | 'searchbox' | 'combobox' | 'listbox' | 'option' | 'menu' | 'menubar' | 'menuitem' | 'menuitemcheckbox' | 'menuitemradio' | 'tab' | 'tablist' | 'tabpanel' | 'link' | 'progressbar' | 'list' | 'listitem' | 'tree' | 'treeitem' | 'grid' | 'row' | 'columnheader' | 'rowheader' | 'cell' | 'group' | 'separator' | 'toolbar' | 'heading' | 'image' | 'paragraph' | 'dialog' | 'alertdialog' | 'tooltip' | 'alert' | 'status' | 'banner' | 'navigation' | 'main' | 'region' | 'form' | 'search' | 'contentinfo';
5909
+ type UiRole = 'button' | 'checkbox' | 'switch' | 'radio' | 'radiogroup' | 'slider' | 'spinbutton' | 'textbox' | 'searchbox' | 'combobox' | 'listbox' | 'option' | 'menu' | 'menubar' | 'menuitem' | 'menuitemcheckbox' | 'menuitemradio' | 'tab' | 'tablist' | 'tabpanel' | 'link' | 'progressbar' | 'list' | 'listitem' | 'tree' | 'treeitem' | 'grid' | 'row' | 'columnheader' | 'rowheader' | 'cell' |
5910
+ /** A cell of an interactive `grid`: what a calendar's day is, and what can be `selected`. */
5911
+ 'gridcell' | 'group' | 'separator' | 'toolbar' | 'heading' | 'image' | 'paragraph' | 'dialog' | 'alertdialog' | 'tooltip' | 'alert' | 'status' | 'banner' | 'navigation' | 'main' | 'region' | 'form' | 'search' | 'contentinfo';
5363
5912
  /** How urgently a live region's changes are announced. */
5364
5913
  type UiLiveRegion = 'polite' | 'assertive';
5914
+ /**
5915
+ * What a field offers as it's typed into: a list of suggestions to pick
5916
+ * from (`list`), the rest of the word filled in after the caret
5917
+ * (`inline`), or both. See `aria-autocomplete`.
5918
+ */
5919
+ type UiAutocomplete = 'list' | 'inline' | 'both';
5365
5920
  declare const UI_ROLES: readonly UiRole[];
5366
5921
  declare function isUiRole(value: unknown): value is UiRole;
5367
5922
  /**
@@ -5372,7 +5927,19 @@ declare function isUiRole(value: unknown): value is UiRole;
5372
5927
  * two ways to say it would let them disagree. The semantics record
5373
5928
  * derives it.
5374
5929
  */
5375
- type UiSemanticState = 'checked' | 'mixed' | 'expanded' | 'collapsed' | 'selected' | 'pressed' | 'busy' | 'invalid' | 'required' | 'readonly' | 'modal';
5930
+ type UiSemanticState = 'checked' | 'mixed' | 'expanded' | 'collapsed' | 'selected' | 'pressed' | 'busy' | 'invalid' | 'required' | 'readonly' | 'modal' |
5931
+ /**
5932
+ * On a `listbox`, `grid` or `tree` whose selection is a set: without
5933
+ * it a screen reader treats the option it's on as the one selected.
5934
+ */
5935
+ 'multiselectable' |
5936
+ /**
5937
+ * The item that is the current one of a set, such as the page a
5938
+ * navigation link leads to while it's open. `selected` is for choices
5939
+ * in a listbox, grid or tabs, and a screen reader ignores it on a link
5940
+ * or a button.
5941
+ */
5942
+ 'current';
5376
5943
  declare const UI_SEMANTIC_STATES: readonly UiSemanticState[];
5377
5944
  declare function isUiSemanticState(value: unknown): value is UiSemanticState;
5378
5945
  /**
@@ -5657,6 +6224,19 @@ declare const UiProperties: {
5657
6224
  readonly x: number;
5658
6225
  readonly y: number;
5659
6226
  } | undefined>;
6227
+ /**
6228
+ * The part of the anchor to be placed beside, in the anchor's own
6229
+ * coordinates (from its border box's top left): a character in a
6230
+ * field, the word being typed. The node is placed against that
6231
+ * rectangle as it would be against the whole anchor, and follows the
6232
+ * anchor through scrolling in the same way. Ignored without `anchor`.
6233
+ */
6234
+ readonly anchorRect: UiPropertyDefinition<{
6235
+ readonly x: number;
6236
+ readonly y: number;
6237
+ readonly width: number;
6238
+ readonly height: number;
6239
+ } | undefined>;
5660
6240
  /** Gap between an anchored node and its anchor. */
5661
6241
  readonly anchorOffset: UiPropertyDefinition<number | undefined>;
5662
6242
  /**
@@ -5778,6 +6358,12 @@ declare const UiProperties: {
5778
6358
  * label out by default.
5779
6359
  */
5780
6360
  readonly selectable: UiPropertyDefinition<boolean | undefined>;
6361
+ /**
6362
+ * Makes the editables inside one selection: a selection can start in
6363
+ * one and end in another, and edits over it go to the group's
6364
+ * `onEdit`. See `UiEditingGroup`.
6365
+ */
6366
+ readonly editingGroup: UiPropertyDefinition<UiEditingGroup | undefined>;
5781
6367
  readonly pointerEvents: UiPropertyDefinition<UiPointerEvents | undefined>;
5782
6368
  readonly focusable: UiPropertyDefinition<boolean | undefined>;
5783
6369
  readonly tabStop: UiPropertyDefinition<boolean | undefined>;
@@ -5806,6 +6392,26 @@ declare const UiProperties: {
5806
6392
  readonly posInSet: UiPropertyDefinition<number | undefined>;
5807
6393
  /** How many items the set holds, including the ones not mounted. */
5808
6394
  readonly setSize: UiPropertyDefinition<number | undefined>;
6395
+ /**
6396
+ * The descendant that's active while this node keeps focus: the
6397
+ * highlighted option of a combobox whose field holds the caret, the
6398
+ * cell a grid's cursor is on. A screen reader announces it as if it
6399
+ * were focused. The node should be a record of its own (an `option`,
6400
+ * a `gridcell`); see `aria-activedescendant`.
6401
+ */
6402
+ readonly activeDescendant: UiPropertyDefinition<UiNode | null | undefined>;
6403
+ /**
6404
+ * The node this one shows or changes: the list a combobox's field
6405
+ * opens, the panel a tab switches to. The node should be a record of
6406
+ * its own (a `listbox`, a `tabpanel`); see `aria-controls`.
6407
+ */
6408
+ readonly controls: UiPropertyDefinition<UiNode | null | undefined>;
6409
+ /**
6410
+ * What a field offers as it's typed into: `list` for a combobox whose
6411
+ * list suggests, `inline` for a field that fills in the rest of the
6412
+ * word, `both`. See `aria-autocomplete`.
6413
+ */
6414
+ readonly autocomplete: UiPropertyDefinition<UiAutocomplete | undefined>;
5809
6415
  /**
5810
6416
  * How deep a treeitem sits, 1 for a root. A tree is rendered as a
5811
6417
  * flat list of rows — it must be, to be virtualized — so the nesting
@@ -6063,20 +6669,20 @@ type BoxModelProps = PropsOf<'width' | 'height' | 'minWidth' | 'maxWidth' | 'min
6063
6669
  type FlexItemProps = PropsOf<'flex' | 'flexGrow' | 'flexShrink' | 'flexBasis' | 'selfX' | 'selfY' | 'layoutData'>;
6064
6670
  /** Where an element sits in a Grid. */
6065
6671
  type GridItemProps = PropsOf<'column' | 'columnSpan' | 'row' | 'rowSpan'>;
6066
- type PositionProps = PropsOf<'position' | 'top' | 'right' | 'bottom' | 'left' | 'inset' | 'zIndex' | 'lift' | 'liftBoundary' | 'anchor' | 'anchorPoint' | 'placement' | 'anchorOffset'>;
6672
+ type PositionProps = PropsOf<'position' | 'top' | 'right' | 'bottom' | 'left' | 'inset' | 'zIndex' | 'lift' | 'liftBoundary' | 'anchor' | 'anchorPoint' | 'anchorRect' | 'placement' | 'anchorOffset'>;
6067
6673
  type PaintProps = PropsOf<'backgroundColor' | 'backgroundGradient' | 'borderColor' | 'borderWidth' | 'borderRadius' | 'opacity' | 'boxShadows' | 'visible' | 'transform'>;
6068
6674
  /**
6069
6675
  * Inherited text properties. Legal on any element: set on a container,
6070
6676
  * they cascade to the text below it.
6071
6677
  */
6072
6678
  type TypographyProps = PropsOf<'color' | 'fontFamily' | 'fontSize' | 'fontWeight' | 'lineHeight' | 'letterSpacing' | 'textAlign' | 'textDirection' | 'fontStyle' | 'fontStretch' | 'fontVariant' | 'fontKerning' | 'textDecoration'>;
6073
- type InteractionProps = PropsOf<'cursor' | 'pointerEvents' | 'focusable' | 'tabStop' | 'disabled' | 'hitTestable' | 'visualState' | 'selectable'>;
6679
+ type InteractionProps = PropsOf<'cursor' | 'pointerEvents' | 'focusable' | 'tabStop' | 'disabled' | 'hitTestable' | 'visualState' | 'selectable' | 'editingGroup'>;
6074
6680
  /**
6075
6681
  * What the element means, for assistive technology. Legal on any
6076
6682
  * element; a component sets them on the node that *is* the control,
6077
6683
  * not on a wrapper. See `UiSemantics.ts`.
6078
6684
  */
6079
- type SemanticsProps = PropsOf<'role' | 'label' | 'description' | 'live' | 'states' | 'valueNow' | 'valueMin' | 'valueMax' | 'valueText' | 'posInSet' | 'setSize' | 'level'>;
6685
+ type SemanticsProps = PropsOf<'role' | 'label' | 'description' | 'live' | 'states' | 'valueNow' | 'valueMin' | 'valueMax' | 'valueText' | 'posInSet' | 'setSize' | 'level' | 'activeDescendant' | 'controls' | 'autocomplete'>;
6080
6686
  /** Environment values an element provides to its subtree. */
6081
6687
  type EnvironmentProps = PropsOf<'theme' | 'textStyle' | 'contentColor' | 'containerSize' | 'insets'>;
6082
6688
  /**
@@ -6370,6 +6976,18 @@ declare class UiGraphBuilder {
6370
6976
  * instance is unchanged and torn down when a property stops
6371
6977
  * being reactive.
6372
6978
  */
6979
+ /**
6980
+ * The properties each node's element declared last time, so a render
6981
+ * that stops declaring one takes it off the node.
6982
+ *
6983
+ * Only bindings used to be torn down that way. A plain value stayed:
6984
+ * a conditional that swapped `<scrollview padding={20}>` for a
6985
+ * `<scrollview>` reused the node and kept the padding, and an editor
6986
+ * switching from its source view back to its document came back
6987
+ * twenty pixels narrower. Only what the builder declared is tracked,
6988
+ * so what modifiers and the runtime write on a node is left alone.
6989
+ */
6990
+ private readonly declaredProps;
6373
6991
  private reconcileProps;
6374
6992
  /**
6375
6993
  * Attaches, updates and detaches the node's modifiers.
@@ -6695,6 +7313,12 @@ declare class UiGraph {
6695
7313
  * hold the node and would otherwise pay for an id lookup.
6696
7314
  */
6697
7315
  updateNodeProperty<T>(node: UiNode, property: string, value: T, dirtyFlags?: DirtyFlags): boolean;
7316
+ /**
7317
+ * Removes a property the element declared and no longer does, through
7318
+ * the same cascade a write goes through, so a modifier overriding it
7319
+ * keeps its value. See `UiGraphBuilder.reconcileProps`.
7320
+ */
7321
+ removeNodeProperty(node: UiNode, property: string, dirtyFlags?: DirtyFlags): boolean;
6698
7322
  /**
6699
7323
  * Writes a property without consulting the node's transitions.
6700
7324
  *
@@ -7043,7 +7667,9 @@ interface ResponsiveProps extends ColumnProps {
7043
7667
  * The first build happens before any layout, when the size is zero, so
7044
7668
  * `build` must return something sensible for a container whose room is
7045
7669
  * not yet known. Zero picks the narrowest arm, which is the right
7046
- * guess and also what a phone gets.
7670
+ * guess and also what a phone gets. It is never what a wider container
7671
+ * paints: the first layout reports the real size, the arm for it is
7672
+ * built, and the runtime lays that out before the frame paints.
7047
7673
  */
7048
7674
  declare function Responsive(props: ResponsiveProps, build: (size: Size) => UiChild | readonly UiChild[]): UiElement;
7049
7675
  //#endregion
@@ -7218,6 +7844,12 @@ interface TextRunStyle {
7218
7844
  interface TextRunSpan extends TextRunStyle {
7219
7845
  readonly start: number;
7220
7846
  readonly end: number;
7847
+ /**
7848
+ * The run is in the text but takes no room: every width that touches
7849
+ * it counts it as nothing, and a line's `runs` leave it out, so no
7850
+ * renderer has anything to draw for it.
7851
+ */
7852
+ readonly hidden?: boolean;
7221
7853
  }
7222
7854
  interface TextMeasureRequest {
7223
7855
  text: string;
@@ -7276,7 +7908,7 @@ interface TextLine {
7276
7908
  width: number;
7277
7909
  /**
7278
7910
  * The line cut at its runs, present only for a paragraph that has
7279
- * spans.
7911
+ * spans. A hidden run is not among them.
7280
7912
  *
7281
7913
  * Measured once, here, where the line's own width is measured. That
7282
7914
  * is what keeps a spanned paragraph as cheap to paint as a plain
@@ -7360,6 +7992,8 @@ interface SpannedRuns {
7360
7992
  indexAt(offset: number): number;
7361
7993
  /** The request an offset is measured with: its run's, or the paragraph's. */
7362
7994
  requestAt(offset: number): TextMeasureRequest;
7995
+ /** Whether the character at `offset` is in a hidden run. */
7996
+ hiddenAt(offset: number): boolean;
7363
7997
  /** Width of `text.slice(start, end)`, measured run by run. */
7364
7998
  width(text: string, start: number, end: number): number;
7365
7999
  /**
@@ -7368,7 +8002,10 @@ interface SpannedRuns {
7368
8002
  * as.
7369
8003
  */
7370
8004
  widthOf(run: string, offset: number): number;
7371
- /** `text.slice(start, end)` cut at the run boundaries, each piece placed from `x`. */
8005
+ /**
8006
+ * `text.slice(start, end)` cut at the run boundaries, each piece
8007
+ * placed from `x`. Hidden pieces take no room and are left out.
8008
+ */
7372
8009
  cut(text: string, start: number, end: number, x: number): TextLineRun[];
7373
8010
  }
7374
8011
  /**
@@ -7533,7 +8170,12 @@ interface PaintState {
7533
8170
  borderColor: UiColor | undefined;
7534
8171
  borderWidth: number;
7535
8172
  borderRadius: UiBorderRadius;
7536
- boxShadows: readonly UiBoxShadow[];
8173
+ /**
8174
+ * The node's shadows, in the order they were declared, with palette
8175
+ * names resolved against its theme. A shadow whose colour names
8176
+ * nothing is dropped, as a background that names nothing is.
8177
+ */
8178
+ boxShadows: readonly PaintBoxShadow[];
7537
8179
  hasTransform: boolean;
7538
8180
  transform: UiTransform;
7539
8181
  text: string | undefined;
@@ -7593,6 +8235,10 @@ interface PaintState {
7593
8235
  matchColor: UiColor;
7594
8236
  caretColor: UiColor;
7595
8237
  }
8238
+ /** A shadow ready to paint: a `UiBoxShadow` whose colour is resolved. */
8239
+ interface PaintBoxShadow extends UiBoxShadow {
8240
+ readonly color: UiColor;
8241
+ }
7596
8242
  /** A run of a paragraph, ready to paint: metrics, resolved colours, and its link. */
7597
8243
  interface PaintTextSpan extends UiTextMetrics {
7598
8244
  readonly start: number;
@@ -7814,6 +8460,15 @@ interface Canvas2DContext {
7814
8460
  font: string;
7815
8461
  textAlign: CanvasTextAlign;
7816
8462
  textBaseline: CanvasTextBaseline;
8463
+ /**
8464
+ * The shadow a fill casts, which is how a `boxShadows` entry is drawn.
8465
+ * Unlike everything else here, the offset and blur are in device
8466
+ * pixels: the current transform does not apply to them.
8467
+ */
8468
+ shadowColor: string;
8469
+ shadowBlur: number;
8470
+ shadowOffsetX: number;
8471
+ shadowOffsetY: number;
7817
8472
  }
7818
8473
  //#endregion
7819
8474
  //#region src/rendering/TextRenderer.d.ts
@@ -8008,13 +8663,27 @@ declare class EditableLayout {
8008
8663
  readonly rtl: boolean;
8009
8664
  constructor(model: EditableTextModel, box: LayoutBox, state: PaintState, measurer: TextMeasurer);
8010
8665
  caretRect(offset?: number): CaretRect;
8666
+ /**
8667
+ * The caret position nearest a point. Where hidden text sits at the
8668
+ * boundary nearest the point, a point before the boundary (left of it
8669
+ * in left-to-right text) lands before the hidden text and a point
8670
+ * past it lands after: hidden text takes no room, so its two ends
8671
+ * are drawn at one x and the side of the press is what tells them
8672
+ * apart. Never inside hidden text.
8673
+ */
8011
8674
  offsetAt(x: number, y: number): number;
8012
8675
  verticalMove(offset: number, direction: -1 | 1, goalX?: number): {
8013
8676
  offset: number;
8014
8677
  x: number;
8015
8678
  } | null;
8016
- /** Boxes behind the selected text. */
8017
- selectionBoxes(): LayoutBox[];
8679
+ /**
8680
+ * Boxes behind the selected text: the field's part of a selection
8681
+ * across an editing group when `range` is given, else its own.
8682
+ */
8683
+ selectionBoxes(range?: {
8684
+ readonly start: number;
8685
+ readonly end: number;
8686
+ }): LayoutBox[];
8018
8687
  /** Boxes under the text the IME is composing, for its underline. */
8019
8688
  compositionBoxes(): LayoutBox[];
8020
8689
  }
@@ -8790,351 +9459,145 @@ declare class UiFindController {
8790
9459
  /** The query the matches are for; empty when nothing is being searched. */
8791
9460
  get query(): string;
8792
9461
  /** Every match, in document order. */
8793
- get matches(): readonly FindMatch[];
8794
- get matchCount(): number;
8795
- /** The index of the active match, or -1 when there is none. */
8796
- get activeIndex(): number;
8797
- /**
8798
- * Runs a query over the app's text and activates the first match.
8799
- * Returns how many there are; an empty query clears everything.
8800
- */
8801
- search(query: string, options?: FindOptions): number;
8802
- /**
8803
- * Re-runs the current query. The tree changed under it — content was
8804
- * edited, a list scrolled new rows in — so the matches did too.
8805
- */
8806
- refresh(): void;
8807
- /** Moves to the next match, wrapping around. */
8808
- next(): boolean;
8809
- /** Moves to the previous match, wrapping around. */
8810
- previous(): boolean;
8811
- /** Drops the query, the matches and their highlights. */
8812
- clear(): void;
8813
- /**
8814
- * A node left the tree. Its matches went with it, so the search is
8815
- * re-run rather than left pointing at something that is gone.
8816
- */
8817
- handleNodeRemoved(node: UiNode): void;
8818
- private notify;
8819
- private step;
8820
- /**
8821
- * The matches of a query, dropped where the text they are in is not
8822
- * drawn: a paragraph capped by `maxLines` shows part of itself, and a
8823
- * match the user cannot see must not be counted or stepped through.
8824
- * Geometry is only measured for the nodes that matched at all.
8825
- */
8826
- private collect;
8827
- /** Writes the match ranges onto the nodes that hold them. */
8828
- private highlight;
8829
- /** Selects the match at `index` and scrolls it into view. */
8830
- private activate;
8831
- private revealMatch;
8832
- private geometryEndOf;
8833
- /** The node's text laid out in its own coordinates; see UiSelectionController. */
8834
- private geometryOf;
8835
- }
8836
- //#endregion
8837
- //#region src/graph/UiPropertyOverrides.d.ts
8838
- /**
8839
- * The cascade a modifier writes into.
8840
- *
8841
- * effective(property) = the last override in modifier order,
8842
- * else what the element declared
8843
- *
8844
- * Keeping the element's own value rather than replacing it is what
8845
- * makes a modifier safe to detach: dragging can write `transform` and
8846
- * `opacity` for as long as the drag lasts, and dropping restores
8847
- * exactly what the element asked for — including "nothing", which
8848
- * restores inheritance from the environment rather than a default.
8849
- *
8850
- * Everything here funnels into `graph.applyResolvedProperty`, so
8851
- * layout, paint, input and the environment read what they always read.
8852
- */
8853
- /**
8854
- * A write from the element: a plain prop, or an emission from a bound
8855
- * Observable. It updates the declared value; whether it reaches the
8856
- * node depends on whether a modifier is currently overriding it.
8857
- */
8858
- declare function writeDeclaredProperty(graph: UiGraph, node: UiNode, property: NodeProperty, value: unknown, flags: DirtyFlags): boolean;
8859
- /**
8860
- * A write from a modifier. Replaces that modifier's own entry, or adds
8861
- * one in its position in the list.
8862
- */
8863
- declare function writeOverrideProperty(graph: UiGraph, node: UiNode, property: NodeProperty, override: Omit<UiPropertyOverride, 'value'> & {
8864
- value: unknown;
8865
- }, flags: DirtyFlags): boolean;
8866
- /** Removes one modifier's write, restoring whatever was under it. */
8867
- declare function clearOverrideProperty(graph: UiGraph, node: UiNode, property: NodeProperty, source: symbol, flags: DirtyFlags): boolean;
8868
- /** The names of the modifiers overriding a property, in order. */
8869
- declare function overrideSources(node: UiNode, property: NodeProperty): string[];
8870
- /** Test hook: forgets which conflicts have been reported. */
8871
- declare function resetOverrideWarnings(): void;
8872
- //#endregion
8873
- //#region src/graph/UiPropertyTransitions.d.ts
8874
- /**
8875
- * The transitions declared on one node, and the animations they are
8876
- * currently running.
8877
- *
8878
- * This is the same shape as the override cascade and for the same
8879
- * reason that lives on the node: **both
8880
- * the builder's static writes and a binding's emissions funnel through
8881
- * `updateNodeProperty`**, so interposing there is the only place that
8882
- * catches both. `node.transitions` is null until an element declares
8883
- * one, so the cost to a tree without transitions is the second field
8884
- * read on the write path.
8885
- *
8886
- * What it interposes is a write, not a binding. The Observable a
8887
- * component wrote is still bound by the graph and still emits into the
8888
- * same property; what changes is that the emission becomes a target
8889
- * rather than a value. So nothing about component identity, binding
8890
- * teardown or `getBindingForProperty` moves, and a `transition` can be
8891
- * added to an element without touching anything else about it.
8892
- */
8893
- declare class NodeTransitions implements UiNodeTransitions {
8894
- private readonly node;
8895
- private readonly graph;
8896
- private readonly driver;
8897
- private specs;
8898
- private readonly cells;
8899
- private readonly targets;
8900
- constructor(node: UiNode, graph: UiGraph, driver: AnimationDriver);
8901
- /** Replaces what the element declares; a property dropped from the list stops animating. */
8902
- setSpecs(specs: ReadonlyMap<NodeProperty, UiTransitionSpec>): void;
8903
- get size(): number;
8904
- /**
8905
- * Takes over a write, or declines it.
8906
- *
8907
- * Declines when the property has no transition, when the node has no
8908
- * value yet — a node's *first* value is not a change and animating
8909
- * from nothing would mean animating from a default nobody asked for
8910
- * — and when the two values cannot be blended (`interpolatorFor`
8911
- * says which, and why).
8912
- */
8913
- write(property: NodeProperty, value: unknown, flags: DirtyFlags): boolean;
8914
- /** Cancels everything, for a node leaving the tree or dropping the prop. */
8915
- release(): void;
8916
- private stopProperty;
8917
- /**
8918
- * The cell one property animates through, kept for the life of the
8919
- * node: the driver keys its running set by cell identity, so a fresh
8920
- * adapter per write would leave the previous animation running.
8921
- *
8922
- * Writing goes through `updateNodePropertyNow`, which is the path a
8923
- * plain write takes minus this class — so a modifier's override still
8924
- * sits on top of an animated value, exactly as it sits on top of a
8925
- * bound one.
8926
- */
8927
- private cellFor;
8928
- private startAnimation;
8929
- }
8930
- /** Test hook: forgets which properties have been reported. */
8931
- declare function resetTransitionWarnings(): void;
8932
- //#endregion
8933
- //#region src/input/UiFocusManager.d.ts
8934
- /**
8935
- * One entry on the focus scope stack.
8936
- *
8937
- * `restore` is what held focus when the scope was pushed, so popping
8938
- * can hand focus back to the control that opened the dialog. Scopes
8939
- * nest: a confirmation dialog over a dialog pushes a second one, and
8940
- * each pop restores its own opener.
8941
- */
8942
- /**
8943
- * What moved focus, which decides whether the focused node is scrolled
8944
- * into view.
8945
- *
8946
- * A browser draws the same distinction and it is the reason it exists:
8947
- * keyboard focus must reveal its target, because a control the person
8948
- * cannot see is a control they cannot use, while a *click* has already
8949
- * shown them where they are — the thing they pressed is under their
8950
- * cursor. Scrolling after a click moves the page out from under a
8951
- * pointer that is still there, and on a tall element that is a jump of
8952
- * most of the screen.
8953
- */
8954
- type FocusSource = 'pointer' | 'keyboard' | 'program';
8955
- /**
8956
- * How the person last drove the app, as far as focus can tell: the
8957
- * pointer or the keyboard. This is what decides whether focus is
8958
- * *visible*, the way `:focus-visible` does in a browser: a ring that
8959
- * appeared on every mouse click would mark a control nobody is about to
8960
- * drive with the keyboard, so the ring waits until the keyboard is used.
8961
- */
8962
- type FocusModality = 'pointer' | 'keyboard';
8963
- /**
8964
- * Logical focus within the UI tree.
8965
- *
8966
- * At most one node holds focus at a time. Focus transitions are
8967
- * target-only: the node losing focus receives Blur (with the new
8968
- * node as `relatedNode`), then the node gaining focus receives Focus
8969
- * (with the old node as `relatedNode`).
8970
- *
8971
- * Tab / Shift+Tab navigation walks the focusable nodes in document
8972
- * (depth-first) order and wraps around. A node participates when
8973
- * `isNodeFocusable` says so: focusable by type (Button), explicitly
8974
- * opted in via `focusable: true`, and never when inert.
8975
- *
8976
- * Focus-on-press is applied through `focusOnPress`, which the pointer
8977
- * pipeline calls after a successful pointerdown (skipped when the
8978
- * down was defaultPrevented).
8979
- *
8980
- * **Scopes.** `pushScope(node)` confines focus to a subtree: traversal
8981
- * collects only that subtree's focusables, so Tab wraps inside it, and
8982
- * `focus()` refuses a node outside it — which is what makes a modal
8983
- * dialog modal for the keyboard. `popScope()` restores focus to
8984
- * whatever held it when the scope was pushed. Components reach both
8985
- * through `FocusService`, never directly.
8986
- */
8987
- declare class UiFocusManager {
8988
- private readonly dispatcher;
8989
- private root;
8990
- private focused;
8991
- /**
8992
- * Keyboard until told otherwise, so focus placed before any input
8993
- * (an `autoFocus`, a dialog's first field) is visible, as a browser
8994
- * would show it.
8995
- */
8996
- private modality;
8997
- private readonly listeners;
8998
- private readonly scopeListeners;
8999
- private readonly scopes;
9000
- constructor(root: UiNode, dispatcher: UiInputDispatcher);
9001
- /** The root used for focus-order traversal. Clears any active scope. */
9002
- setRoot(root: UiNode): void;
9003
- /** The node that currently holds logical focus, or null. */
9004
- get focusedNode(): UiNode | null;
9005
- hasFocus(): boolean;
9006
- /** How the person last drove the app. */
9007
- get focusModality(): FocusModality;
9008
- /**
9009
- * Whether the focus held should be shown. True while focus was
9010
- * reached by the keyboard, or by code with no pointer since; false
9011
- * after a pointer press, until the next key.
9012
- */
9013
- get focusVisible(): boolean;
9014
- /**
9015
- * Records an input the person made. A change of modality while a node
9016
- * holds focus is reported to the focus listeners as a change on that
9017
- * node, so a ring can appear on a mouse-focused control the moment an
9018
- * arrow key is pressed, and disappear again on the next press.
9019
- */
9020
- noteInput(modality: FocusModality): void;
9021
- /**
9022
- * The subtree focus is currently confined to: the innermost scope,
9023
- * or the whole tree when none is active.
9024
- */
9025
- get scopeRoot(): UiNode;
9026
- /** Whether focus is confined to a subtree. */
9027
- get trapped(): boolean;
9028
- /**
9029
- * Moves focus to the node. Returns false when the node cannot be
9030
- * focused (inert, non-focusable, outside the active scope); true
9031
- * otherwise, including when the node already held focus (a no-op
9032
- * that emits nothing).
9033
- */
9034
- focus(node: UiNode, source?: FocusSource): boolean;
9035
- /**
9036
- * Called after focus moves or clears, with the new focused node. The
9037
- * runtime uses it to scroll the focused node into view.
9038
- */
9039
- onFocusChange(listener: (node: UiNode | null, source: FocusSource) => void): () => void;
9040
- /** Called after a scope is pushed or popped. */
9041
- onScopeChange(listener: () => void): () => void;
9042
- private notify;
9043
- private notifyScope;
9044
- /** Drops focus without moving it anywhere. */
9045
- blur(): void;
9046
- /**
9047
- * Focus-on-press hook: focuses the nearest focusable node at or above
9048
- * the one that was pressed.
9049
- *
9050
- * The walk upward is what the DOM does, and what a container that is
9051
- * one tab stop needs: pressing a tab hits the Text inside it, a table
9052
- * cell hits a Box three levels below the table, and a component whose
9053
- * arrows move a selection is keyboard-dead after a mouse press if the
9054
- * press left focus where it was. Found in a browser, on `Tabs` —
9055
- * clicking a tab selected it and the arrows then did nothing.
9056
- *
9057
- * Nothing focusable above the press leaves focus untouched, as before:
9058
- * pressing the page background is not a request to blur.
9059
- */
9060
- focusOnPress(node: UiNode): void;
9061
- /** Moves focus to the next focusable node, wrapping to the first. */
9062
- focusNext(): boolean;
9063
- /** Moves focus to the previous focusable node, wrapping to the last. */
9064
- focusPrevious(): boolean;
9065
- /**
9066
- * Confines focus to `root` until the matching `popScope`.
9067
- *
9068
- * Focus that is outside the new scope moves to its first focusable,
9069
- * so the very next Tab stays inside; a scope with nothing focusable
9070
- * in it drops focus rather than leaving it behind the dialog.
9071
- */
9072
- pushScope(root: UiNode): void;
9073
- /**
9074
- * Moves focus into the innermost scope when it is outside it, and
9075
- * drops it when the scope has nothing to focus.
9076
- *
9077
- * A scope is usually taken from a `ref`, which fires before the
9078
- * node's children are reconciled — so at that moment a dialog is an
9079
- * empty box and there is nothing in it to focus. The runtime calls
9080
- * this again once the frame's tree is built, which is when a dialog
9081
- * gets its caret. Idempotent: with focus already inside the scope,
9082
- * or no scope at all, it does nothing.
9083
- *
9084
- * **The scope root is the fallback, and it is the whole reason
9085
- * `tabStop` exists.** A scope with no tab stop inside it used to
9086
- * blur, which hands the keyboard to nothing: a `Dialog` whose body
9087
- * is a sentence and a button could not be dismissed with Escape,
9088
- * because Escape had nowhere to be delivered. Falling back to the
9089
- * root fixes that only if the root can hold focus without becoming a
9090
- * stop of its own, or every dialog grows a tab stop that announces
9091
- * nothing. `focusable: true, tabStop: false` on the body is exactly
9092
- * that pair, and the fallback is what makes it worth setting.
9093
- *
9094
- * Blurring is still what happens when the root cannot hold focus
9095
- * either, because a scope that has genuinely nothing to focus is
9096
- * better admitted than faked.
9462
+ get matches(): readonly FindMatch[];
9463
+ get matchCount(): number;
9464
+ /** The index of the active match, or -1 when there is none. */
9465
+ get activeIndex(): number;
9466
+ /**
9467
+ * Runs a query over the app's text and activates the first match.
9468
+ * Returns how many there are; an empty query clears everything.
9097
9469
  */
9098
- settleScope(): void;
9470
+ search(query: string, options?: FindOptions): number;
9099
9471
  /**
9100
- * Ends the innermost scope and hands focus back to whatever held it
9101
- * when that scope was pushed, when that node is still in the tree
9102
- * and still focusable. Otherwise focus is dropped rather than left
9103
- * on a node the scope was hiding.
9472
+ * Re-runs the current query. The tree changed under it — content was
9473
+ * edited, a list scrolled new rows in — so the matches did too.
9104
9474
  */
9105
- popScope(): void;
9475
+ refresh(): void;
9476
+ /** Moves to the next match, wrapping around. */
9477
+ next(): boolean;
9478
+ /** Moves to the previous match, wrapping around. */
9479
+ previous(): boolean;
9480
+ /** Drops the query, the matches and their highlights. */
9481
+ clear(): void;
9106
9482
  /**
9107
- * Reacts to a subtree leaving the graph.
9108
- *
9109
- * The graph reports the root of a removed subtree after detaching
9110
- * every node in it, so the descendants' parent links are already
9111
- * gone: the test is "is this node still attached", not "was it in
9112
- * that subtree".
9483
+ * A node left the tree. Its matches went with it, so the search is
9484
+ * re-run rather than left pointing at something that is gone.
9485
+ */
9486
+ handleNodeRemoved(node: UiNode): void;
9487
+ private notify;
9488
+ private step;
9489
+ /**
9490
+ * The matches of a query, dropped where the text they are in is not
9491
+ * drawn: a paragraph capped by `maxLines` shows part of itself, and a
9492
+ * match the user cannot see must not be counted or stepped through.
9493
+ * Geometry is only measured for the nodes that matched at all.
9494
+ */
9495
+ private collect;
9496
+ /** Writes the match ranges onto the nodes that hold them. */
9497
+ private highlight;
9498
+ /** Selects the match at `index` and scrolls it into view. */
9499
+ private activate;
9500
+ private revealMatch;
9501
+ private geometryEndOf;
9502
+ /** The node's text laid out in its own coordinates; see UiSelectionController. */
9503
+ private geometryOf;
9504
+ }
9505
+ //#endregion
9506
+ //#region src/graph/UiPropertyOverrides.d.ts
9507
+ /**
9508
+ * The cascade a modifier writes into.
9509
+ *
9510
+ * effective(property) = the last override in modifier order,
9511
+ * else what the element declared
9512
+ *
9513
+ * Keeping the element's own value rather than replacing it is what
9514
+ * makes a modifier safe to detach: dragging can write `transform` and
9515
+ * `opacity` for as long as the drag lasts, and dropping restores
9516
+ * exactly what the element asked for — including "nothing", which
9517
+ * restores inheritance from the environment rather than a default.
9518
+ *
9519
+ * Everything here funnels into `graph.applyResolvedProperty`, so
9520
+ * layout, paint, input and the environment read what they always read.
9521
+ */
9522
+ /**
9523
+ * A write from the element: a plain prop, or an emission from a bound
9524
+ * Observable. It updates the declared value; whether it reaches the
9525
+ * node depends on whether a modifier is currently overriding it.
9526
+ */
9527
+ declare function writeDeclaredProperty(graph: UiGraph, node: UiNode, property: NodeProperty, value: unknown, flags: DirtyFlags): boolean;
9528
+ /**
9529
+ * A write from a modifier. Replaces that modifier's own entry, or adds
9530
+ * one in its position in the list.
9531
+ */
9532
+ declare function writeOverrideProperty(graph: UiGraph, node: UiNode, property: NodeProperty, override: Omit<UiPropertyOverride, 'value'> & {
9533
+ value: unknown;
9534
+ }, flags: DirtyFlags): boolean;
9535
+ /** Removes one modifier's write, restoring whatever was under it. */
9536
+ declare function clearOverrideProperty(graph: UiGraph, node: UiNode, property: NodeProperty, source: symbol, flags: DirtyFlags): boolean;
9537
+ /** The names of the modifiers overriding a property, in order. */
9538
+ declare function overrideSources(node: UiNode, property: NodeProperty): string[];
9539
+ /** Test hook: forgets which conflicts have been reported. */
9540
+ declare function resetOverrideWarnings(): void;
9541
+ //#endregion
9542
+ //#region src/graph/UiPropertyTransitions.d.ts
9543
+ /**
9544
+ * The transitions declared on one node, and the animations they are
9545
+ * currently running.
9546
+ *
9547
+ * This is the same shape as the override cascade and for the same
9548
+ * reason that lives on the node: **both
9549
+ * the builder's static writes and a binding's emissions funnel through
9550
+ * `updateNodeProperty`**, so interposing there is the only place that
9551
+ * catches both. `node.transitions` is null until an element declares
9552
+ * one, so the cost to a tree without transitions is the second field
9553
+ * read on the write path.
9554
+ *
9555
+ * What it interposes is a write, not a binding. The Observable a
9556
+ * component wrote is still bound by the graph and still emits into the
9557
+ * same property; what changes is that the emission becomes a target
9558
+ * rather than a value. So nothing about component identity, binding
9559
+ * teardown or `getBindingForProperty` moves, and a `transition` can be
9560
+ * added to an element without touching anything else about it.
9561
+ */
9562
+ declare class NodeTransitions implements UiNodeTransitions {
9563
+ private readonly node;
9564
+ private readonly graph;
9565
+ private readonly driver;
9566
+ private specs;
9567
+ private readonly cells;
9568
+ private readonly targets;
9569
+ constructor(node: UiNode, graph: UiGraph, driver: AnimationDriver);
9570
+ /** Replaces what the element declares; a property dropped from the list stops animating. */
9571
+ setSpecs(specs: ReadonlyMap<NodeProperty, UiTransitionSpec>): void;
9572
+ get size(): number;
9573
+ /**
9574
+ * Takes over a write, or declines it.
9113
9575
  *
9114
- * A scope whose subtree has gone is a trap that ended, so it is
9115
- * popped as though the component had released it and focus returns
9116
- * to the opener — a dialog that unmounts hands the keyboard back
9117
- * without having to sequence its own teardown. Focus lost with the
9118
- * subtree is dropped without a Blur, since the node's listeners were
9119
- * released with it.
9576
+ * Declines when the property has no transition, when the node has no
9577
+ * value yet — a node's *first* value is not a change and animating
9578
+ * from nothing would mean animating from a default nobody asked for
9579
+ * — and when the two values cannot be blended (`interpolatorFor`
9580
+ * says which, and why).
9120
9581
  */
9121
- handleNodeRemoved(_node: UiNode): void;
9122
- private moveFocus;
9582
+ write(property: NodeProperty, value: unknown, flags: DirtyFlags): boolean;
9583
+ /** Cancels everything, for a node leaving the tree or dropping the prop. */
9584
+ release(): void;
9585
+ private stopProperty;
9123
9586
  /**
9124
- * The tab stops in document order (parent before children).
9587
+ * The cell one property animates through, kept for the life of the
9588
+ * node: the driver keys its running set by cell identity, so a fresh
9589
+ * adapter per write would leave the previous animation running.
9125
9590
  *
9126
- * Tab stops and not every focusable node: a container with
9127
- * `tabStop: false` can hold focus and is not a place the cycle
9128
- * stops, which is what lets a dialog body be the keyboard's home of
9129
- * last resort without becoming a stop of its own.
9591
+ * Writing goes through `updateNodePropertyNow`, which is the path a
9592
+ * plain write takes minus this class — so a modifier's override still
9593
+ * sits on top of an animated value, exactly as it sits on top of a
9594
+ * bound one.
9130
9595
  */
9131
- private collectFocusable;
9132
- /** Whether the node may hold focus given the active scope, if any. */
9133
- private withinScope;
9134
- /** Whether the node is still connected to the traversal root. */
9135
- private isAttached;
9136
- private isWithin;
9596
+ private cellFor;
9597
+ private startAnimation;
9137
9598
  }
9599
+ /** Test hook: forgets which properties have been reported. */
9600
+ declare function resetTransitionWarnings(): void;
9138
9601
  //#endregion
9139
9602
  //#region src/input/FocusNotifier.d.ts
9140
9603
  /**
@@ -9578,6 +10041,8 @@ declare class UiWheelController {
9578
10041
  * still constructs; without it such a root is read as the default.
9579
10042
  */
9580
10043
  private readonly rootNode;
10044
+ /** The clock the precise-device memory below reads. Injectable for specs. */
10045
+ private readonly now;
9581
10046
  constructor(hitTester: HitTester, dispatcher: UiInputDispatcher, scrollSink: ScrollSink,
9582
10047
  /**
9583
10048
  * The tree's root, when the host knows it.
@@ -9587,7 +10052,27 @@ declare class UiWheelController {
9587
10052
  * container to walk up from. Optional so every existing caller
9588
10053
  * still constructs; without it such a root is read as the default.
9589
10054
  */
9590
- rootNode?: (() => UiNode | null) | null);
10055
+ rootNode?: (() => UiNode | null) | null,
10056
+ /** The clock the precise-device memory below reads. Injectable for specs. */
10057
+ now?: () => number, options?: UiWheelControllerOptions);
10058
+ /** Whether a precision device's steps are paced over frames; see `advance`. */
10059
+ private readonly paced;
10060
+ /** A precision device's gesture, by the container it scrolls. */
10061
+ private readonly pacing;
10062
+ /** When the event being routed happened, for the gesture it joins. */
10063
+ private eventTime;
10064
+ /** The last frame's time, and the display's interval measured from it. */
10065
+ private lastFrame;
10066
+ private frameInterval;
10067
+ /**
10068
+ * Until when the wheel is taken to be a precision device whatever an
10069
+ * event says. One event can't always tell: Chrome on a Mac reports a
10070
+ * trackpad's legacy delta as three times its pixel delta, so a step of
10071
+ * 40 pixels reads as a whole detent. A mouse wheel never sends an event
10072
+ * that doesn't look notched, so one that doesn't means a trackpad, and
10073
+ * every event close behind it (a gesture, and its momentum) is one too.
10074
+ */
10075
+ private preciseUntil;
9591
10076
  /**
9592
10077
  * The node the last wheel landed on, or null before any.
9593
10078
  *
@@ -9599,7 +10084,12 @@ declare class UiWheelController {
9599
10084
  * wheel of a burst land correctly even though the first could not.
9600
10085
  */
9601
10086
  lastWheelTarget: UiNode | null;
9602
- wheel(x: number, y: number, deltaX: number, deltaY: number, modifiers?: UiKeyModifiers, deltaMode?: UiWheelDeltaMode, wheelDeltaY?: number): UiWheelEvent;
10087
+ wheel(x: number, y: number, deltaX: number, deltaY: number, modifiers?: UiKeyModifiers, deltaMode?: UiWheelDeltaMode, wheelDeltaY?: number,
10088
+ /**
10089
+ * When the event happened, on this controller's clock. Pacing
10090
+ * predicts from it; without it, the time it arrives stands in.
10091
+ */
10092
+ at?: number): UiWheelEvent;
9603
10093
  /**
9604
10094
  * Whether a wheel at this point would move anything, without moving
9605
10095
  * it.
@@ -9662,6 +10152,39 @@ declare class UiWheelController {
9662
10152
  */
9663
10153
  private appContainsOverscroll;
9664
10154
  private applyDelta;
10155
+ /**
10156
+ * A container's state as a step should judge it: during a paced gesture,
10157
+ * where the steps so far have really taken it, not where the prediction
10158
+ * has drawn it. Judged by what's drawn, a flick into the top found no
10159
+ * room once the prediction got there first, its last steps were refused,
10160
+ * and withdrawing the prediction then moved the list back down off the
10161
+ * top.
10162
+ */
10163
+ private gestureState;
10164
+ /**
10165
+ * Moves each precision-device gesture for one frame. A host that turned
10166
+ * pacing on calls this once a frame, with the frame's time, before the
10167
+ * frame reads scroll offsets.
10168
+ *
10169
+ * A trackpad sends on its own clock, not the display's, so a frame
10170
+ * comes a varying time after the last step: applied as they arrive, a
10171
+ * steady flick moves the page by uneven amounts, which reads as
10172
+ * judder. Evening that out by waiting for steps puts the page behind
10173
+ * the hand. So this does what a browser does for its own scrolling:
10174
+ * it puts the page where the input will have reached when the frame is
10175
+ * shown, the steps so far plus their velocity times the time since the
10176
+ * last one, never more than a frame and a half ahead. Steps come out
10177
+ * even, and nothing trails.
10178
+ *
10179
+ * A gesture's first step, with no velocity yet, goes as it is. Once the
10180
+ * steps stop, the prediction is withdrawn and the page settles exactly
10181
+ * where they add up to; a trackpad's momentum slows to nothing first,
10182
+ * so there is next to nothing to withdraw.
10183
+ *
10184
+ * True while a gesture is still being paced, so the host keeps frames
10185
+ * coming until it has settled.
10186
+ */
10187
+ advance(time?: number): boolean;
9665
10188
  /**
9666
10189
  * A wheel delta in whatever unit it arrived in, as pixels.
9667
10190
  *
@@ -9675,6 +10198,13 @@ declare class UiWheelController {
9675
10198
  }
9676
10199
  /** A ScrollView, or any node with overflow 'scroll' or 'auto'. */
9677
10200
  declare function isScrollContainer(node: UiNode): boolean;
10201
+ interface UiWheelControllerOptions {
10202
+ /**
10203
+ * Pace a precision device's steps to the frame instead of applying each
10204
+ * as it arrives; the host then calls `advance` once a frame.
10205
+ */
10206
+ readonly pace?: boolean;
10207
+ }
9678
10208
  //#endregion
9679
10209
  //#region src/input/UiPointerController.d.ts
9680
10210
  interface PointerControllerOptions {
@@ -9730,7 +10260,12 @@ interface PointerControllerOptions {
9730
10260
  */
9731
10261
  editing?: {
9732
10262
  isEditable(node: UiNode): boolean;
9733
- pointerDown(node: UiNode, x: number, y: number, modifiers: UiKeyModifiers): void;
10263
+ /** The field of an editing group a press on none of its fields belongs to; see `UiEditingController.fieldNear`. */
10264
+ fieldNear?(target: UiNode, y: number, handlesPress: (node: UiNode) => boolean): UiNode | null;
10265
+ /** The text offset under a point in a field, as the field is drawn now; see `UiEditingController.offsetAt`. */
10266
+ offsetAt?(node: UiNode, x: number, y: number): number;
10267
+ /** `offset`, when given, is where the press landed, found before it moved focus. */
10268
+ pointerDown(node: UiNode, x: number, y: number, modifiers: UiKeyModifiers, offset?: number): void;
9734
10269
  pointerMove(node: UiNode, x: number, y: number): void;
9735
10270
  pointerUp(): void;
9736
10271
  };
@@ -9807,6 +10342,8 @@ interface PointerControllerOptions {
9807
10342
  declare class UiPointerController {
9808
10343
  private readonly hitTester;
9809
10344
  private readonly dispatcher;
10345
+ /** Whether a node answers a press itself: a click or pointer listener of its own. */
10346
+ private handlesPress;
9810
10347
  private readonly slop;
9811
10348
  private readonly touchSlop;
9812
10349
  private readonly gestures;
@@ -10031,7 +10568,7 @@ interface UiShortcutStep {
10031
10568
  /** What an application registers. */
10032
10569
  interface UiShortcut {
10033
10570
  /**
10034
- * The keys, as `'Mod+K'`, `'Shift+?'`, or `'g d'` for a chord: a
10571
+ * The keys, as `'Mod+K'`, `'?'`, or `'g d'` for a chord: a
10035
10572
  * sequence of presses, separated by spaces, that must arrive in
10036
10573
  * order and within the chord timeout.
10037
10574
  */
@@ -10115,6 +10652,12 @@ interface ShortcutRegistryOptions {
10115
10652
  * Without that rule an application with a `n` for "new note" becomes an
10116
10653
  * application you cannot type the letter n into, which is the failure
10117
10654
  * every home-grown key handler eventually ships.
10655
+ *
10656
+ * ## Pressing is not a shortcut
10657
+ *
10658
+ * A bare Enter or Space is skipped while a button or link has focus,
10659
+ * unless the shortcut is that control's own: the control is focused, so
10660
+ * it has the key first, as it would in a browser.
10118
10661
  */
10119
10662
  declare class UiShortcutRegistry {
10120
10663
  private readonly bindings;
@@ -10151,16 +10694,21 @@ declare class UiShortcutRegistry {
10151
10694
  * act on a key that has already been spent.
10152
10695
  */
10153
10696
  handleKey(key: string, modifiers: UiKeyModifiers, focused: UiNode | null): boolean;
10697
+ private platform;
10698
+ /** Whether a field would take this key as an edit of its own, rather than as text or as Enter. */
10699
+ private isEditingKey;
10154
10700
  /** Forgets a half-typed chord, for a route change or a lost focus. */
10155
10701
  reset(): void;
10156
10702
  /**
10157
10703
  * Whether a binding would fire for a key going to `focused`.
10158
10704
  *
10159
- * Three things take a shortcut out: its scope does not contain the
10160
- * focused node, its own `when` says no, and, for a shortcut with no
10161
- * modifier at all, the focused node is somewhere text is being
10162
- * typed. The last is the rule that keeps a single-letter shortcut
10163
- * from making a text field unusable.
10705
+ * Four things take a shortcut out: its scope does not contain the
10706
+ * focused node, its own `when` says no, for a shortcut with no
10707
+ * modifier at all the focused node is somewhere text is being typed,
10708
+ * and for a bare Enter or Space the focused node is a button that
10709
+ * isn't the shortcut's own. The third keeps a single-letter shortcut
10710
+ * from making a text field unusable; the fourth keeps a list's Enter
10711
+ * from opening a row when the button focused inside it was pressed.
10164
10712
  */
10165
10713
  private isLive;
10166
10714
  }
@@ -10173,14 +10721,31 @@ declare class UiShortcutRegistry {
10173
10721
  */
10174
10722
  declare function parseShortcut(keys: string): readonly UiShortcutStep[];
10175
10723
  /**
10176
- * The shortcut as a palette should print it.
10724
+ * The shortcut as a palette should print it, the way the platform
10725
+ * writes its own: `⇧⌘K` on a Mac, where `Mod` is Command, and
10726
+ * `Ctrl+Shift+K` elsewhere, where it is Control. The platform is the
10727
+ * one the editing keys follow (`detectEditingPlatform`, from the user
10728
+ * agent, which a worker can read too).
10729
+ */
10730
+ declare function formatShortcut(steps: readonly UiShortcutStep[], platform?: EditingPlatform): string;
10731
+ /**
10732
+ * The keys of each press, one string per key, for a help sheet that
10733
+ * draws them as key caps: `[['⇧', '⌘', 'K']]` on a Mac and
10734
+ * `[['Ctrl', 'Shift', 'K']]` elsewhere, and a chord is one array per
10735
+ * press. They are the pieces `formatShortcut` joins, so a sheet and a
10736
+ * palette print the same keys.
10737
+ */
10738
+ declare function shortcutKeyCaps(steps: readonly UiShortcutStep[], platform?: EditingPlatform): readonly (readonly string[])[];
10739
+ /**
10740
+ * The shortcut as a screen reader should say it: `Command Shift K` on a
10741
+ * Mac and `Control Shift K` elsewhere, `Down arrow`, `Question mark`,
10742
+ * and `g then d` for a chord.
10177
10743
  *
10178
- * `Mod` is printed as `Ctrl`, not as a platform glyph: the render
10179
- * worker cannot see the platform, and a wrong symbol is worse than a
10180
- * plain word. An application that knows what it is running on can
10181
- * format the `steps` itself.
10744
+ * A key cap's `⌘` or `↓` is read out inconsistently or not at all, and
10745
+ * punctuation is skipped at a screen reader's default verbosity, so a
10746
+ * row that shows caps takes this as its name.
10182
10747
  */
10183
- declare function formatShortcut(steps: readonly UiShortcutStep[]): string;
10748
+ declare function describeShortcut(steps: readonly UiShortcutStep[], platform?: EditingPlatform): string;
10184
10749
  //#endregion
10185
10750
  //#region src/input/UiDragSession.d.ts
10186
10751
  /**
@@ -10236,6 +10801,17 @@ interface UiDropZone {
10236
10801
  leave(): void;
10237
10802
  /** The drag was released over the zone. What it did, for the source. */
10238
10803
  drop(state: UiDragState): UiDropEffect;
10804
+ /**
10805
+ * The point is inside this zone and the zone would take the payload,
10806
+ * whether or not a deeper zone won the drop; null once it no longer
10807
+ * is, or the drag ended.
10808
+ *
10809
+ * `over` goes to the winner alone, which is right for "where would
10810
+ * this land" and wrong for auto-scroll: a list whose rows are drop
10811
+ * zones of their own is never the winner, so a drag held at its edge
10812
+ * never scrolled it. Auto-scroll listens here instead.
10813
+ */
10814
+ hover?(state: UiDragState | null): void;
10239
10815
  }
10240
10816
  /** The result a completed drag reports back to whatever started it. */
10241
10817
  interface UiDragResult {
@@ -10323,6 +10899,8 @@ declare class UiDragSession {
10323
10899
  private readonly zones;
10324
10900
  private current;
10325
10901
  private inside;
10902
+ /** Every zone the point is in that would take the payload, winner or not. */
10903
+ private hovering;
10326
10904
  /** Registers a drop target. The returned function unregisters it. */
10327
10905
  addZone(zone: UiDropZone): () => void;
10328
10906
  /** The drag in flight, or null when nothing is being carried. */
@@ -10347,6 +10925,8 @@ declare class UiDragSession {
10347
10925
  end(): UiDragResult | null;
10348
10926
  /** Abandons the drag: the zone under it is told, and nothing is dropped. */
10349
10927
  cancel(): void;
10928
+ /** Tells every zone the drag was hovering over that it no longer is. */
10929
+ private unhover;
10350
10930
  /**
10351
10931
  * Turns a shell's file-drop message into an ordinary drag.
10352
10932
  *
@@ -10532,6 +11112,12 @@ interface EditingState {
10532
11112
  readonly caret: LayoutBox;
10533
11113
  readonly multiline: boolean;
10534
11114
  readonly composing: boolean;
11115
+ /**
11116
+ * The selection as HTML, which a copy puts on the clipboard beside
11117
+ * the text, when the field's editing group gives some (see
11118
+ * `UiEditingGroup.copyHtml`). Absent otherwise.
11119
+ */
11120
+ readonly html?: string;
10535
11121
  }
10536
11122
  interface EditingControllerOptions {
10537
11123
  /** Keyboard conventions; detected from the user agent by default. */
@@ -10570,6 +11156,35 @@ declare class UiEditingController {
10570
11156
  private dragging;
10571
11157
  private lastPress;
10572
11158
  private compositionOpen;
11159
+ /**
11160
+ * The text as it was when the composition began. A commit is reported
11161
+ * against this, not against the text with the composition in it,
11162
+ * which already holds what is committed whenever the person picks
11163
+ * the candidate on screen: compared with that, a commit changed
11164
+ * nothing and the application never heard about the text.
11165
+ */
11166
+ private compositionBase;
11167
+ /**
11168
+ * A selection across the fields of an editing group, while it spans
11169
+ * more than one; null while the selection is one field's own. `lit`
11170
+ * is every field drawing part of it. See `UiEditingGroup`.
11171
+ */
11172
+ private span;
11173
+ /**
11174
+ * What the group last made of a selection for the clipboard, kept
11175
+ * while the selection and the texts it covers stay the same: the
11176
+ * state is asked for every frame, and serializing a long selection
11177
+ * every frame would cost more than the frame.
11178
+ */
11179
+ private copied;
11180
+ /** Set while the span moves focus to the field its focus end is in, so that move does not end it. */
11181
+ private spanFocusing;
11182
+ /**
11183
+ * The field focus left for the one just pressed. A press focuses its
11184
+ * field before this controller hears of it, so a Shift and press in a
11185
+ * new field needs to know where the selection was anchored.
11186
+ */
11187
+ private pressedFrom;
10573
11188
  constructor(host: EditingHost, dispatcher: UiInputDispatcher, focus: UiFocusManager, options?: EditingControllerOptions);
10574
11189
  /** The editable that holds focus, or null. */
10575
11190
  get focused(): UiNode | null;
@@ -10584,6 +11199,11 @@ declare class UiEditingController {
10584
11199
  handleKey(node: UiNode, key: string, modifiers: UiKeyModifiers, textFromKeys?: boolean): boolean;
10585
11200
  private execute;
10586
11201
  private move;
11202
+ /** Whether a move would go past the edge of a field, rather than somewhere in it. */
11203
+ private leavesField;
11204
+ /** Where a selection extended into a field from the one before or after it lands. */
11205
+ private entryOffset;
11206
+ private moveInField;
10587
11207
  /**
10588
11208
  * A `beforeinput` from the shell's editing proxy, in the DOM's
10589
11209
  * vocabulary. Returns true when it was applied to the focused
@@ -10615,7 +11235,7 @@ declare class UiEditingController {
10615
11235
  * text means something to it that it means to nothing else, and
10616
11236
  * before this there was no way for it to hear about one at all.
10617
11237
  */
10618
- paste(text: string): boolean;
11238
+ paste(text: string, html?: string | null): boolean;
10619
11239
  private offerPaste;
10620
11240
  private insert;
10621
11241
  compositionStart(): void;
@@ -10629,7 +11249,29 @@ declare class UiEditingController {
10629
11249
  * selects the word, a third the line. Dragging afterwards extends the
10630
11250
  * selection from the anchor.
10631
11251
  */
10632
- pointerDown(node: UiNode, x: number, y: number, modifiers: UiKeyModifiers): void;
11252
+ /**
11253
+ * The field a press belongs to that landed inside an editing group
11254
+ * but on none of its fields: in the padding round the fields, the gap
11255
+ * between two of them, or the plain structure a field sits in (a list
11256
+ * item's bullet). The nearest field, by height, as a document puts the
11257
+ * caret on the nearest line. Null for a press outside any group, and
11258
+ * for one on something that answers presses itself, such as a task's
11259
+ * checkbox: `handlesPress` says which nodes do.
11260
+ */
11261
+ fieldNear(target: UiNode, y: number, handlesPress: (node: UiNode) => boolean): UiNode | null;
11262
+ /**
11263
+ * The offset under a point in a field, by its layout as it stands. The
11264
+ * pointer controller asks this before a press moves focus, and hands
11265
+ * the answer to `pointerDown`; see there.
11266
+ */
11267
+ offsetAt(node: UiNode, x: number, y: number): number;
11268
+ /**
11269
+ * `pressedAt` is the offset the press landed on, found before focus
11270
+ * moved. A field may change how it is drawn when it takes focus (its
11271
+ * runs show text they hid), and from then on its geometry is not the
11272
+ * one the person pressed on. Without it, the offset is found here.
11273
+ */
11274
+ pointerDown(node: UiNode, x: number, y: number, modifiers: UiKeyModifiers, pressedAt?: number): void;
10633
11275
  pointerMove(node: UiNode, x: number, y: number): void;
10634
11276
  pointerUp(): void;
10635
11277
  /** The focused editable's state for the shell to mirror, or null. */
@@ -10668,6 +11310,49 @@ declare class UiEditingController {
10668
11310
  */
10669
11311
  private notifySelection;
10670
11312
  private afterSelectionChange;
11313
+ /**
11314
+ * Selects from `anchor` to `focus`, in one field or across the fields
11315
+ * of an editing group, and focuses the field the focus end is in: what
11316
+ * an application does after a command over a selection, to leave it
11317
+ * selected. False when the two ends are not editables of one group.
11318
+ */
11319
+ select(anchor: UiTextPosition, focus: UiTextPosition): boolean;
11320
+ /** Whether a selection is spanning the fields of a group. */
11321
+ get spanning(): boolean;
11322
+ /**
11323
+ * Selects from `anchor` to `focus` across a group's fields: lights
11324
+ * every field between them with its part, gives the focus field its
11325
+ * own part in its model (anchored on the side the selection comes
11326
+ * from, so its keys and its IME stay sensible), and moves focus there.
11327
+ * Two ends in one field are that field's selection, as ever.
11328
+ */
11329
+ private setSpan;
11330
+ /** Ends a selection across fields, if there is one, unlighting them. */
11331
+ private clearSpan;
11332
+ /** Collapses a selection across fields to its start (-1) or its end (1). */
11333
+ private collapseSpan;
11334
+ /**
11335
+ * Hands an edit over a selection across fields to the group, and ends
11336
+ * the selection. No field is changed: the application changes its
11337
+ * document, which changes the fields, and places the caret.
11338
+ */
11339
+ private spanEdit;
11340
+ /** The text and HTML a selection across fields copies as. */
11341
+ private spanCopy;
11342
+ /** The HTML a selection inside one field of a group copies as, if the group gives any. */
11343
+ private fieldHtml;
11344
+ private cachedCopy;
11345
+ /** Where a Shift and press extends from: the focused field's anchor, if it is in the same group. */
11346
+ private anchorIn;
11347
+ /**
11348
+ * The field of a group a drag at height `y` is over: stepping up or
11349
+ * down from `from` until one reaches it, so a drag costs the fields it
11350
+ * crosses. A point in the gap between two fields belongs to the next
11351
+ * one in the direction of travel.
11352
+ */
11353
+ private fieldAt;
11354
+ /** Focuses a field for the span without ending it. */
11355
+ private focusField;
10671
11356
  /**
10672
11357
  * Asks the host to scroll the caret into view, when the node has been
10673
11358
  * laid out: the field's own text first, then any scroll container
@@ -10702,9 +11387,13 @@ declare class UiEditingController {
10702
11387
  * a second measurer that must never disagree with this one. Asking
10703
11388
  * is the only version that stays right.
10704
11389
  *
11390
+ * `offset` asks where a caret at another character would be: where
11391
+ * the word being typed began, for a list that stays under its start.
11392
+ * It is clamped to the text.
11393
+ *
10705
11394
  * Null when the node is not an editable, or has not been laid out.
10706
11395
  */
10707
- caretRectOf(node: UiNode): CaretRect | null;
11396
+ caretRectOf(node: UiNode, offset?: number): CaretRect | null;
10708
11397
  private layoutOf;
10709
11398
  }
10710
11399
  //#endregion
@@ -11340,6 +12029,16 @@ declare class UiFrame {
11340
12029
  * node looked at.
11341
12030
  */
11342
12031
  anyFlags(flags: DirtyFlags): boolean;
12032
+ /**
12033
+ * This frame and `later` as one: every node in either, with the
12034
+ * flags it carried in both.
12035
+ *
12036
+ * What the phases after layout read when layout ran more than once
12037
+ * in a frame (see `UiScheduler.recollect`): a node dirtied by a
12038
+ * layout listener has to be re-meant and redrawn like any other
12039
+ * node the frame changed.
12040
+ */
12041
+ merged(later: UiFrame): UiFrame;
11343
12042
  get size(): number;
11344
12043
  isEmpty(): boolean;
11345
12044
  dirtyFlagsFor(node: UiNode): DirtyFlags;
@@ -11512,30 +12211,6 @@ interface ScrollAdjustment {
11512
12211
  scrollX: number;
11513
12212
  scrollY: number;
11514
12213
  }
11515
- /**
11516
- * Calculates geometry for a retained UiNode tree.
11517
- *
11518
- * Layout owns a separate projection of the graph (LayoutRecords
11519
- * keyed by UiNode identity) so the graph stays structural and
11520
- * the renderer/hit-testing read geometry from one place. The
11521
- * engine knows nothing about Canvas, WebGPU, or the DOM: it
11522
- * produces numbers only.
11523
- *
11524
- * measure: bottom-up, dirty subtrees only, early-stop via
11525
- * idempotent measured-size comparison
11526
- * place: top-down, dirty paths only, re-places a child's
11527
- * descendants only when its box actually changed
11528
- *
11529
- * Flex is two-pass, as in CSS: items are first measured at their
11530
- * max-content size to obtain a flex base, the main axis is resolved,
11531
- * and any item whose main size changed is measured again at that size
11532
- * so a cross size that depends on it — wrapped text above all — comes
11533
- * out right. The second pass only touches items that actually flexed.
11534
- *
11535
- * Scroll offset is a coordinate-space translation stored on the
11536
- * container record; descendants keep content coordinates, so
11537
- * scrolling never re-measures or re-places them.
11538
- */
11539
12214
  declare class LayoutEngine {
11540
12215
  private records;
11541
12216
  /**
@@ -11570,6 +12245,14 @@ declare class LayoutEngine {
11570
12245
  * no children to translate, so they are kept apart from `scrollNodes`.
11571
12246
  */
11572
12247
  private readonly textScrollNodes;
12248
+ /**
12249
+ * The editables whose text scroll needs clamping at the end of this
12250
+ * pass: the ones measured in it, whose extent may have changed, and
12251
+ * the ones whose offset was written. A field nothing touched keeps
12252
+ * the offset it had; clamping every editable every frame cost a
12253
+ * keystroke five thousand clamps in a 5,000-line document.
12254
+ */
12255
+ private readonly textScrollPending;
11573
12256
  /** Absolutely positioned nodes placed against an anchor node. */
11574
12257
  private readonly anchoredNodes;
11575
12258
  /** The anchor each of those nodes was last placed against. */
@@ -12026,6 +12709,15 @@ declare class LayoutEngine {
12026
12709
  */
12027
12710
  private minContentHeightContribution;
12028
12711
  private measureStack;
12712
+ /** What a stack asks a child while measuring: tight on a stretched axis, up to its content box otherwise. */
12713
+ private stackQuestion;
12714
+ /**
12715
+ * Whether a scroller's content is read from outside it. Scrolled
12716
+ * content pushes on nothing past a scroller whose size is its own,
12717
+ * but one without is its content's size under a loose bound, so
12718
+ * whatever reads its size reads the content's.
12719
+ */
12720
+ private scrollContentMatters;
12029
12721
  private measureScroll;
12030
12722
  /**
12031
12723
  * A leaf is its content plus padding. Text content comes from the
@@ -12340,6 +13032,46 @@ declare class LayoutEngine {
12340
13032
  * size properties itself, in measure().
12341
13033
  */
12342
13034
  private assignBox;
13035
+ /**
13036
+ * A frame repainted the node, perhaps with new shadows. A shadow lays
13037
+ * nothing out, so no pass would otherwise notice that the node now
13038
+ * paints further out, or less far, than its extent says.
13039
+ */
13040
+ private refreshPaintReach;
13041
+ /**
13042
+ * Moves a laid-out subtree by (dx, dy) without placing it again.
13043
+ *
13044
+ * Boxes are absolute, so a block inserted at the top of a long
13045
+ * document moved every box below it, and each one that moved was
13046
+ * placed again: its children re-measured (memo hits) and re-assigned,
13047
+ * all the way down. An Enter in a 5,000-line document placed 9,572
13048
+ * nodes and cost 18 ms of layout. A subtree that moved without
13049
+ * changing size, with nothing inside it waiting to be laid out, is
13050
+ * placed relative to itself already, so every box in it moves by the
13051
+ * same amount, which is one addition per node.
13052
+ *
13053
+ * Two kinds of node don't move with it. An absolutely positioned
13054
+ * descendant whose containing block is outside the subtree is placed
13055
+ * against that block, which didn't move. An anchored one is placed
13056
+ * against its anchor, and is placed again (`movedAnchored`) when its
13057
+ * anchor is one of the boxes that moved.
13058
+ */
13059
+ /**
13060
+ * A node's paint extent, once its children are placed: its box and its
13061
+ * own shadows, grown by each child's (a clipping child's box, since nothing paints past
13062
+ * it; anything else's extent). Then carried up, since an ancestor that
13063
+ * wasn't placed this pass still needs to hear.
13064
+ */
13065
+ private updateExtent;
13066
+ /**
13067
+ * Grows each ancestor's extent to cover a node's, up to the first
13068
+ * that clips or already covers it, which is at once in the usual case.
13069
+ * An incremental pass doesn't place the ancestors of the subtree it
13070
+ * laid out, so this is how they hear that something under them moved
13071
+ * past them.
13072
+ */
13073
+ private growExtentUp;
13074
+ private shiftSubtree;
12343
13075
  private scrollDirection;
12344
13076
  /**
12345
13077
  * Iterates over a node's in-flow children, transparently expanding
@@ -13011,8 +13743,17 @@ declare function borders(options: BordersOptions): UiModifier<Decorations>;
13011
13743
  declare function borderShapes(options: BordersOptions): readonly DecorationShape[];
13012
13744
  //#endregion
13013
13745
  //#region src/modifiers/focus.d.ts
13014
- /** Takes focus the first time the node is laid out. */
13015
- declare function autoFocus(): UiModifier<void>;
13746
+ /**
13747
+ * Takes focus the first time the node is laid out.
13748
+ *
13749
+ * The node is scrolled into view, as focus from code always is, once
13750
+ * the frame's layout has settled. Pass `{ preventScroll: true }` to
13751
+ * leave the page where it is, as `element.focus({ preventScroll: true })`
13752
+ * does: for a region focused when a page opens so a screen reader reads
13753
+ * it, where revealing it would scroll a tall region to a few pixels
13754
+ * short of its own top instead of leaving the page at its start.
13755
+ */
13756
+ declare function autoFocus(options?: FocusOptions): UiModifier<FocusOptions>;
13016
13757
  //#endregion
13017
13758
  //#region src/modifiers/clickOutside.d.ts
13018
13759
  interface ClickOutsideOptions {
@@ -14316,6 +15057,9 @@ interface SizeContainerArgs {
14316
15057
  * padding, and a layout that switched arms at 600 px would otherwise
14317
15058
  * switch at 600 px of border box and lay itself out in 560.
14318
15059
  *
15060
+ * What a subtree builds from the size it reports is laid out on the
15061
+ * same frame, before anything paints; see `UiModifierHost.onLayout`.
15062
+ *
14319
15063
  * `Responsive` attaches this for you. Attach it by hand when the
14320
15064
  * source has to be reachable somewhere the helper's own children are
14321
15065
  * not, and put the same object on the node's `containerSize` prop.
@@ -14352,9 +15096,15 @@ interface BreakpointArgs {
14352
15096
  * about it and the thing a media query cannot do: a card in a sidebar
14353
15097
  * asks how wide the card is, not how wide the window is.
14354
15098
  *
14355
- * Nothing is written until the node has been laid out once, so the
14356
- * first frame uses the element's own values. Give the element the
14357
- * narrowest band's values as its declared props if that matters.
15099
+ * Nothing is written until the node has been laid out once, but the
15100
+ * first frame is already right: the runtime lays out again before it
15101
+ * paints when a layout listener changes layout (see
15102
+ * `UiModifierHost.onLayout`), so the frame a node first appears on,
15103
+ * and the frame a resize crosses a width on, are drawn with the band's
15104
+ * values. The element's own values are what that first pass measures
15105
+ * with; give it the narrowest band's values as its declared props so a
15106
+ * layout nothing settles (a headless one, a spec driving layout by
15107
+ * hand) starts from the right band.
14358
15108
  */
14359
15109
  declare const breakpoint: ((args: BreakpointArgs, key?: string | number) => UiModifier<BreakpointArgs>) & {
14360
15110
  readonly kind: UiModifierKind<BreakpointArgs>;
@@ -14838,7 +15588,9 @@ interface Canvas2DRendererOptions {
14838
15588
  *
14839
15589
  * Painting per node (in order):
14840
15590
  *
15591
+ * 0. outer shadows (boxShadows, last declared first, as CSS stacks them)
14841
15592
  * 1. background fill (backgroundColor, rounded rect when radius > 0)
15593
+ * 1b. inset shadows (boxShadows marked `inset`, over the background)
14842
15594
  * 2. background image (image + objectFit)
14843
15595
  * 2b. picture (what a Paint node's `paint`/`path` drew)
14844
15596
  * 3. border (borderWidth/borderColor)
@@ -14870,6 +15622,8 @@ declare class Canvas2DRenderer implements UiRenderer {
14870
15622
  /** Scratch for the padded box text is drawn in; reused across nodes. */
14871
15623
  private readonly contentBox;
14872
15624
  private readonly paint;
15625
+ /** The frame's context, wrapped so a huge scroll offset keeps its precision; reset each frame. */
15626
+ private precise;
14873
15627
  /**
14874
15628
  * Whose style the shared paint scratch currently holds.
14875
15629
  *
@@ -14963,6 +15717,25 @@ declare class Canvas2DRenderer implements UiRenderer {
14963
15717
  /** Everything between the boundary (or the root) and a lifted node. */
14964
15718
  private applyAncestors;
14965
15719
  private paintBackground;
15720
+ /**
15721
+ * The node's outer shadows, or its inset ones, with CSS `box-shadow`
15722
+ * semantics: see `UiBoxShadow`.
15723
+ *
15724
+ * Drawn with the canvas's own shadow, which blurs whatever a fill
15725
+ * covers. The fill itself must not show, so the shape is drawn well
15726
+ * away from the box, outside the clip, and its shadow is cast back by
15727
+ * exactly that distance. The clip is what CSS clips a shadow to: for
15728
+ * an outer shadow the ring around the box, so a translucent background
15729
+ * does not show the shadow through it; for an inset one the box. An
15730
+ * inset shadow is the shadow of a frame around a hole, the hole being
15731
+ * the box moved by the offset and shrunk by the spread.
15732
+ *
15733
+ * A canvas shadow's offset and blur are in device pixels and ignore
15734
+ * the transform, so both are carried through it here: the throw by
15735
+ * the transform's linear part, the blur by its scale. The list is
15736
+ * walked backwards because CSS paints the first shadow on top.
15737
+ */
15738
+ private paintShadows;
14966
15739
  /** The node's box, following its corner radius. */
14967
15740
  private fillBox;
14968
15741
  /**
@@ -16373,13 +17146,24 @@ declare class GlyphShaper {
16373
17146
  * 2 size.xy
16374
17147
  * 4 color.rgba
16375
17148
  * 8 radius, opacity, borderWidth
16376
- * 11 kind (u32: PrimitiveKind)
17149
+ * 11 kind (PrimitiveKind, as a float)
16377
17150
  * 12 transform 3x2 affine, absolute layout → logical screen
16378
17151
  * 18 clipIndex index into the clip chain, -1 for none
16379
17152
  * 19 gradientIndex index into the frame's gradients, -1 for none
16380
- * 20 (end)
16381
- */
16382
- declare const INSTANCE_STRIDE_FLOATS = 20;
17153
+ * 20 shadow offsetX, offsetY, spread, the other shape's radius
17154
+ * 24 (end)
17155
+ *
17156
+ * A shadow is two rounded rectangles, the blurred one and the box it
17157
+ * is cut by, and an instance describes the first. For an outer shadow
17158
+ * the rectangle is the blurred shape grown by the blur's reach
17159
+ * (`BOX_SHADOW_BLUR_REACH` × blur), `radius` its corners, `borderWidth`
17160
+ * the blur, and the box it must not show under is recovered from the
17161
+ * offset and spread, with the box's own radius last. An inset shadow's
17162
+ * rectangle is the box, and the hole it is cast from is the box moved
17163
+ * by the offset and shrunk by the spread, with the hole's radius last.
17164
+ * Every other instance writes zeros there.
17165
+ */
17166
+ declare const INSTANCE_STRIDE_FLOATS = 24;
16383
17167
  declare const INSTANCE_STRIDE_BYTES: number;
16384
17168
  /**
16385
17169
  * Textured instance layout (glyphs and images), in floats:
@@ -16415,7 +17199,11 @@ declare const CLIP_STRIDE_BYTES: number;
16415
17199
  declare const NO_CLIP_INDEX = -1;
16416
17200
  declare const enum PrimitiveKind {
16417
17201
  Fill = 0,
16418
- Border = 1
17202
+ Border = 1,
17203
+ /** A `boxShadows` entry outside the box; see the instance layout. */
17204
+ Shadow = 2,
17205
+ /** A `boxShadows` entry marked `inset`. */
17206
+ InsetShadow = 3
16419
17207
  }
16420
17208
  declare const enum CommandKind {
16421
17209
  /** A contiguous range of primitive instances under one scissor. */
@@ -17278,6 +18066,23 @@ declare class UiScheduler {
17278
18066
  * cleared surface for a frame.
17279
18067
  */
17280
18068
  flush(time: UiFrameTime): void;
18069
+ /**
18070
+ * Takes what was dirtied since `frame` was collected into that same
18071
+ * frame, rather than leaving it for the next one.
18072
+ *
18073
+ * For a phase that has to finish inside the frame what the frame
18074
+ * started. A layout listener (a `breakpoint`, a `sizeContainer`)
18075
+ * that writes padding after the boxes are final has made those boxes
18076
+ * stale, and painting them would show the stale layout for one frame
18077
+ * before the next corrects it. The runtime lays the writes out again
18078
+ * from what this returns, before anything paints.
18079
+ *
18080
+ * The result holds only the newly dirtied nodes, with `frame`'s id
18081
+ * and time: it is more of the same frame, not a new one, so the
18082
+ * frame count does not move. Anything armed by those writes finds
18083
+ * nothing left to do.
18084
+ */
18085
+ recollect(frame: UiFrame): UiFrame;
17281
18086
  /**
17282
18087
  * Runs one frame, and names its three parts for the browser's
17283
18088
  * profiler when anything is recording (`PerformanceMarks`).
@@ -17322,6 +18127,8 @@ interface ParagraphGeometry {
17322
18127
  readonly end: number;
17323
18128
  readonly measure: RunMeasure;
17324
18129
  readonly rtl: boolean;
18130
+ /** Stretches of the text its runs hide; a double click selects words as drawn. */
18131
+ readonly hidden: readonly UiTextRange[];
17325
18132
  }
17326
18133
  /**
17327
18134
  * Lays a node's text out in its content box, exactly as the renderers
@@ -17412,6 +18219,12 @@ interface UiSemanticsRecord {
17412
18219
  readonly setSize?: number;
17413
18220
  /** How deep a treeitem sits, 1 for a root. */
17414
18221
  readonly level?: number;
18222
+ /** The record id of the descendant that's active while this one keeps focus. */
18223
+ readonly activeDescendant?: string;
18224
+ /** The record id of what this one shows or changes, such as the list a combobox opens. */
18225
+ readonly controls?: string;
18226
+ /** What a field offers as it's typed into. */
18227
+ readonly autocomplete?: UiAutocomplete;
17415
18228
  }
17416
18229
  /** Insertion-ordered: iterating the map walks the tree in document order. */
17417
18230
  type UiSemanticsMap = ReadonlyMap<string, UiSemanticsRecord>;
@@ -17434,7 +18247,29 @@ type UiSemanticsMap = ReadonlyMap<string, UiSemanticsRecord>;
17434
18247
  * is, carrying `disabled` — unavailable is a thing to announce,
17435
18248
  * hidden is not.
17436
18249
  */
17437
- declare function buildSemanticsTree(root: UiNode): Map<string, UiSemanticsRecord>;
18250
+ declare function buildSemanticsTree(root: UiNode, memory?: SemanticsMemory): Map<string, UiSemanticsRecord>;
18251
+ /**
18252
+ * What a walk leaves behind for the next one, so a structural change can
18253
+ * be described without walking everything again.
18254
+ *
18255
+ * `described` is every node a walk has given a record, so a record is
18256
+ * only ever taken back by the node that earned it: an id can come back
18257
+ * on a new node once its old one has gone. `spans` is, for every node
18258
+ * without a record of its own, which records it contributed to the
18259
+ * record above it: the first, by id, and how many. An untouched
18260
+ * transparent subtree (a block of a long document, say) is then
18261
+ * renumbered as a run of its parent's children instead of walked.
18262
+ */
18263
+ interface SemanticsMemory {
18264
+ readonly described: WeakSet<UiNode>;
18265
+ readonly spans: WeakMap<UiNode, SemanticsSpan>;
18266
+ }
18267
+ interface SemanticsSpan {
18268
+ readonly parent: string | null;
18269
+ readonly first: string | null;
18270
+ readonly count: number;
18271
+ }
18272
+ declare function semanticsMemory(): SemanticsMemory;
17438
18273
  /**
17439
18274
  * The records one subtree contributes, as if walked in place.
17440
18275
  *
@@ -17455,7 +18290,57 @@ declare function buildSemanticsTree(root: UiNode): Map<string, UiSemanticsRecord
17455
18290
  * `inert` is whether an ancestor above this subtree is disabled, which
17456
18291
  * only the caller can know.
17457
18292
  */
17458
- declare function buildSemanticsSubtree(node: UiNode, parent: string | null, index: number, inert: boolean): Map<string, UiSemanticsRecord> | null;
18293
+ declare function buildSemanticsSubtree(node: UiNode, parent: string | null, index: number, inert: boolean, memory?: SemanticsMemory): Map<string, UiSemanticsRecord> | null;
18294
+ /**
18295
+ * What a walk after a structural change may take from the tree it is
18296
+ * replacing.
18297
+ *
18298
+ * `previous` is the last tree's records by id; their indices may be out
18299
+ * of date, so a record's place is read from `childrenOf`, its parent's
18300
+ * children in order, and `positionOf`. `unchanged(node)` says that a
18301
+ * node and everything under it mean what they meant then: nothing in it
18302
+ * was described differently, and it took no children and lost none.
18303
+ */
18304
+ interface SemanticsReuse {
18305
+ readonly previous: ReadonlyMap<string, UiSemanticsRecord>;
18306
+ readonly childrenOf: (parent: string | null) => readonly string[];
18307
+ readonly positionOf: (parent: string | null, id: string) => number;
18308
+ readonly memory: SemanticsMemory;
18309
+ readonly unchanged: (node: UiNode) => boolean;
18310
+ }
18311
+ /** What a walk after a structural change found. */
18312
+ interface SemanticsRewalk {
18313
+ /** The records described afresh, with their indices. */
18314
+ readonly records: Map<string, UiSemanticsRecord>;
18315
+ /** For each record the walk went inside, its children's ids in order. */
18316
+ readonly children: Map<string | null, string[]>;
18317
+ /** Records taken back as they were, subtrees and all, without being described. */
18318
+ readonly kept: Set<string>;
18319
+ /** Every record the walk put somewhere, in document order, with where. */
18320
+ readonly placed: readonly SemanticsPlacement[];
18321
+ }
18322
+ interface SemanticsPlacement {
18323
+ readonly id: string;
18324
+ readonly parent: string | null;
18325
+ readonly index: number;
18326
+ }
18327
+ /**
18328
+ * Walks a subtree again after the shape of the tree changed inside it,
18329
+ * describing only what changed.
18330
+ *
18331
+ * A full walk asks every node what it means, and moves every record
18332
+ * whose siblings moved. After a block is inserted in a long document
18333
+ * nearly every node means what it did. So a record `reuse.unchanged`
18334
+ * vouches for is taken back as it was, and an untouched transparent
18335
+ * subtree (one with no record of its own, like a block of the document)
18336
+ * is taken back as the run of its parent's children it contributed last
18337
+ * time, without being walked into. Nothing taken back is renumbered:
18338
+ * the caller learns where everything went from `children` and `placed`.
18339
+ *
18340
+ * `node` has to carry a record, as for `buildSemanticsSubtree`; null
18341
+ * otherwise.
18342
+ */
18343
+ declare function rewalkSemantics(node: UiNode, parent: string | null, index: number, inert: boolean, reuse: SemanticsReuse): SemanticsRewalk | null;
17459
18344
  /**
17460
18345
  * Whether an ancestor of `node` is disabled, which every record in its
17461
18346
  * subtree inherits.
@@ -17487,6 +18372,11 @@ declare function textRunOfRecordId(id: string): {
17487
18372
  * from them, and a whole record cannot be applied out of order into
17488
18373
  * something half-updated. `remove` carries only the id, since a
17489
18374
  * removed subtree's records are each removed in their own patch.
18375
+ *
18376
+ * A record whose index moved only because a sibling came or went is
18377
+ * not sent (see `dropIndexShifts`). A consumer that applies removals,
18378
+ * then adds and updates in order, placing each at its index, keeps its
18379
+ * children in order without them.
17490
18380
  */
17491
18381
  type UiSemanticsPatch = {
17492
18382
  readonly op: 'add';
@@ -17507,6 +18397,24 @@ type UiSemanticsPatch = {
17507
18397
  * a mirror can append as it reads.
17508
18398
  */
17509
18399
  declare function diffSemantics(previous: UiSemanticsMap, next: UiSemanticsMap): UiSemanticsPatch[];
18400
+ /**
18401
+ * Drops the updates that only renumber a record whose siblings kept
18402
+ * their order.
18403
+ *
18404
+ * A record carries its index among its siblings, so inserting one near
18405
+ * the top of a list changes the index of every record after it, and
18406
+ * each of those used to go out as an update: 4,266 patches for one
18407
+ * paragraph inserted in a 5,000-line document, every one of them
18408
+ * crossing to the main thread and rewriting a mirror element. They say
18409
+ * nothing a mirror needs. It applies removals, then adds in document
18410
+ * order at their indices, so the elements that stayed are already in
18411
+ * the right order around the ones that came and went. Only when the
18412
+ * siblings that stayed changed their order among themselves (a move)
18413
+ * do the new indices matter, and then every update is kept.
18414
+ *
18415
+ * The records keep their new indices; this only thins the patches.
18416
+ */
18417
+ declare function dropIndexShifts(previous: UiSemanticsMap, next: UiSemanticsMap, patches: readonly UiSemanticsPatch[]): UiSemanticsPatch[];
17510
18418
  /** Structural equality over the record's flat, pruned members. */
17511
18419
  declare function recordsEqual(a: UiSemanticsRecord, b: UiSemanticsRecord): boolean;
17512
18420
  //#endregion
@@ -17566,5 +18474,5 @@ interface UiSemanticsAction {
17566
18474
  readonly value?: string;
17567
18475
  }
17568
18476
  //#endregion
17569
- export { Mp3Header as $, UiPointerController as $a, ScrollView as $c, paintValuesEqual as $d, UiModifierLayout as $f, UiTransform as $h, formatConstraints as $i, validateStates as $l, validateSubgrid as $m, DefaultVideoResolver as $n, EnvironmentNotifier as $o, resolveMotionState as $p, decorated as $r, clearSelectionRange as $s, PaintResolver as $t, defaultSpacing as $u, MARK_PREFIX as A, EditingState as Aa, selectionRects as Ac, UiTextLink as Ad, repeat as Af, normalizeTransition as Ah, parseAlignContent as Ai, RowProps as Al, UI_SUBGRID_AXES as Am, resolveNumber as An, UiPoint as Ao, UiKeyboardEvent as Ap, shortcuts as Ar, textRunBackgrounds as As, WebGPUTextureCache as At, UiTheme as Au, ByteSource as B, UiDroppedFile as Ba, ResponsiveProps as Bc, textContentOf as Bd, UiInsetRegistry as Bf, UiTweenOptions as Bh, SCROLLBAR_FADE_MS as Bi, UiPropertyValueOf as Bl, UiObjectFit as Bm, publishInset as Bn, scrollbarThumbs as Bo, noKeyModifiers as Bp, reorderable as Br, PaintTextSpan as Bs, WebGPUSurface as Bt, hasThemeExtension as Bu, paragraphGeometry as C, UiPlatformAdapter as Ca, caretRectFor as Cc, UiFontKerning as Cd, fr as Cf, findEnvironmentKey as Ch, GridPlacement as Ci, IdentityProps as Cl, DecorationRect as Cm, OverlayShape as Cn, SelectionControllerOptions as Co, MOUSE_POINTER as Cp, AnimateLayoutOptions as Cr, buildFontString as Cs, glyphCount as Ct, VirtualItemMeasure as Cu, UiFrameCallback as D, touchActionFor as Da, offsetAtPoint as Dc, UiResolvedTextSpan as Dd, isPercentLength as Df, UiTransitionSpec as Dh, AlignContent as Di, PositionProps as Dl, decorationRect as Dm, CanvasSurface as Dn, HitTestResult as Do, UiGestureEvent as Dp, ShortcutsOptions as Dr, layoutTextLines as Ds, GlyphSlot as Dt, UiVideoSurface as Du, wordRangeIn as E, prepareInputSurface as Ea, lineLimit as Ec, UiFontVariant as Ed, isMinMaxTrack as Ef, AnimationDriver as Eh, sizeGridTracks as Ei, PaintProps as El, decorationColor as Em, CanvasHost as En, HitTestLayoutReader as Eo, UiFocusEvent as Ep, ShortcutOptions as Er, fillTextRects as Es, GLYPH_SUBPIXEL_PHASES as Et, lazySource as Eu, setPerformanceMarks as F, UiDragPayload as Fa, nextWordEnd as Fc, editableSpansOf as Fd, boxShadowsEqual as Ff, UiAnimationOptions as Fh, ELLIPSIS as Fi, TypographyProps as Fl, UiCursor as Fm, themeTokens as Fn, ScrollbarAxis as Fo, UiPointerKind as Fp, DragSourceOptions as Fr, DEFAULT_FONT_SIZE as Fs, DrawStats as Ft, withDensity as Fu, Mp4AudioTrack as G, UiShortcutBinding as Ga, LazyRow as Gc, PaintLineCap as Gd, observeViewportInsets as Gf, UiSpringSpec as Gh, Edges as Gi, UiRole as Gl, UiSelfAlignment as Gm, ScrollOffset as Gn, matchRangesOf as Go, MotionChannel as Gp, clickOutside as Gr, createPaintState as Gs, registerFontStack as Gt, UiContrast as Gu, RangeSourceOptions as H, dragSessionFor as Ha, LazyGrid as Hc, textStylesEqual as Hd, UiInsets as Hf, UiDurationToken as Hh, ScrollAdjustment as Hi, UI_ROLES as Hl, UiPlacement as Hm, SizeContainerArgs as Hn, SubtreeBounds as Ho, DirtyNodeSet as Hp, DraggableOptions as Hr, VerticalAlign as Hs, bumpFontStack as Ht, themeExtension as Hu, VttCue as I, UiDragSession as Ia, previousGraphemeStart as Ic, flattenTextSpans as Id, UiPropertyDefinition as If, UiReducedMotionPolicy as Ih, layoutParagraph as Ii, UiEventProps as Il, UiDirection as Im, sameArgs as In, ScrollbarThumb as Io, UiSelectionChangeEvent as Ip, DropTargetOptions as Ir, DEFAULT_FONT_WEIGHT as Is, RenderHooks as It, UiThemeExtension as Iu, demuxMp4Audio as J, formatShortcut as Ja, Column as Jc, PaintTextAlign as Jd, bandOf as Jf, UiInterpolator as Jh, OverrideSources as Ji, isUiRole as Jl, UiTextDirection as Jm, VideoClock as Jn, FindOptions as Jo, MotionTiming as Jp, BordersOptions as Jr, normalizeVerticalAlign as Js, PaintPictureCache as Jt, raiseContrast as Ju, Mp4Sample as K, UiShortcutRegistry as Ka, Box as Kc, PaintLineJoin as Kd, UiContainerSize as Kf, UiSpringToken as Kh, LayoutExplanation as Ki, UiSemanticState as Kl, UiSubgridAxis as Km, ScrollPositionArgs as Kn, setMatchRanges as Ko, MotionState as Kp, autoFocus as Kr, isPaintVisible as Ks, PaintCanvas as Kt, contrastRatio as Ku, VttTrack as L, UiDragState as La, previousWordStart as Lc, resolvedSpansOf as Ld, defineProperty as Lf, UiSpring as Lh, proportionalFontMetrics as Li, UiNodeRef as Ll, UiFlexWrap as Lm, InsetPaddingArgs as Ln, scrollLeaderOf as Lo, UiTextChangeEvent as Lp, ReorderableOptions as Lr, DEFAULT_TEXT_COLOR as Ls, WebGPURenderer as Lt, UiThemeExtensionOptions as Lu, markNow as M, TouchScrollerOptions as Ma, lineEndAt as Mc, UiTextSpan as Md, UiBoxShadow as Mf, tween as Mh, parseMainAxisAlignment as Mi, StackProps as Ml, UiBorderRadiusValue as Mm, resolvePropertyByName as Mn, SCROLLBAR_INSET as Mo, UiPinchEvent as Mp, ZoomState as Mr, Canvas2DContext as Ms, isWebGPUAvailable as Mt, lightTheme as Mu, measureSpan as N, UiTouchScroller as Na, lineStartAt as Nc, UiTextStyle as Nd, boxShadow as Nf, AnimatedCell as Nh, FlexDirection as Ni, TextContentProps as Nl, UiColorValue as Nm, resolveString as Nn, SCROLLBAR_MIN_THUMB as No, UiPointerDevice as Np, pinchable as Nr, Canvas2DGradient as Ns, WebGPUError as Nt, themesEqual as Nu, UiScheduler as O, EditingControllerOptions as Oa, offsetAtX as Oc, UiSpannedText as Od, minmax as Of, UiTransitionValue as Oh, CrossAxisAlignment as Oi, PropsOf as Ol, hasDecorationPhase as Om, createCanvasSurface as On, HitTester as Oo, UiInputEvent as Op, contextMenu as Or, runCanvasStyleInto as Os, GlyphUpload as Ot, isVideoSurface as Ou, performanceMarksEnabled as P, EXTERNAL_FILES as Pa, nextGraphemeEnd as Pc, defaultTextStyle as Pd, boxShadowArraysEqual as Pf, UiAnimation as Ph, parseFlexDirection as Pi, TextProps as Pl, UiContentDistribution as Pm, ThemeTokenTarget as Pn, SCROLLBAR_THICKNESS as Po, UiPointerEvent as Pp, AutoScrollOptions as Pr, DEFAULT_FONT_FAMILY as Ps, CapturedFrame as Pt, withContrast as Pu, Mp3Frames as Q, PointerControllerOptions as Qa, Row as Qc, inputsEqual as Qd, UiModifierFocus as Qf, interpolatorFor as Qh, describeOverrides as Qi, validateRole as Ql, UiVerticalAlign as Qm, videoSource as Qn, UiEnvironmentKeys as Qo, pop as Qp, borders as Qr, TextRange as Qs, PaintGradient as Qt, UiSpacing as Qu, cueAt as R, UiDropEffect as Ra, wordRangeAt as Rc, spanAtOffset as Rd, propertyValuesEqual as Rf, UiSpringOptions as Rh, LayoutNotifier as Ri, UiProperties as Rl, UiFontWeight as Rm, PublishInsetArgs as Rn, scrollRange as Ro, UiWheelDeltaMode as Rp, dragSource as Rr, ObjectFit as Rs, WebGPURendererOptions as Rt, UiThemeExtensions as Ru, offsetAtPointIn as S, PlatformSurface as Sa, RunMeasure as Sc, visualStatesEqual as Sd, auto as Sf, createEnvironmentKey as Sh, GridItemRequest as Si, GridProps as Sl, DecorationFill as Sm, LABEL_PADDING_X as Sn, UiFindController as So, UiListenerErrorReporter as Sp, ImageResolver as Sr, applyCanvasTextStyle as Ss, createTextCache as St, VIRTUAL_WINDOW_PROP as Su, selectionRectsIn as T, pointerDeviceOf as Ta, lineIndexForOffset as Tc, UiFontStyle as Td, isFrLength as Tf, DirtyFlags as Th, placeGridItems as Ti, PaintElementProps as Tl, DecorationStroke as Tm, labelOrigin as Tn, UiSelectionController as To, UiEventType as Tp, ContextMenuOptions as Tr, drawText as Ts, GlyphShaper as Tt, VirtualViewport as Tu, bufferSource as U, ShortcutRegistryOptions as Ua, LazyGridProps as Uc, PaintBox as Ud, insetsEqual as Uf, UiEasingToken as Uh, AxisExplanation as Ui, UI_SEMANTIC_STATES as Ul, UiPointerEvents as Um, breakpoint as Un, TEXT_MATCHES_PROP as Uo, MOTION_CHANNELS as Up, draggable as Ur, colorToCss as Us, clearFontStacks as Ut, themeExtensionsEqual as Uu, DEFAULT_BLOCK_SIZE as V, UiFileDropMessage as Va, LazyColumn as Vc, textSpansEqual as Vd, UiInsetSource as Vf, createTween as Vh, SCROLLBAR_LINGER_MS as Vi, UiPropertyValues as Vl, UiOverflow as Vm, BreakpointArgs as Vn, scrollbarZoneAt as Vo, wheelDeltaYOf as Vp, DragOffset as Vr, TextAlign as Vs, createWebGPUSurface as Vt, noThemeExtensions as Vu, rangeSource as W, UiShortcut as Wa, LazyListProps as Wc, PaintFillRule as Wd, noInsets as Wf, UiMotion as Wh, CustomLayoutExplanation as Wi, UiLiveRegion as Wl, UiPosition as Wm, sizeContainer as Wn, clearMatchRanges as Wo, MOTION_REST as Wp, ClickOutsideOptions as Wr, computeObjectFitRect as Ws, fontStackFor as Wt, withThemeExtension as Wu, Mp3Format as X, KeyboardControllerOptions as Xa, Grid as Xc, UiPaint as Xd, unknownContainerSize as Xf, interpolateNumber as Xh, SizeDecision as Xi, normalizeStates as Xl, UiTextWrapValue as Xm, VideoState as Xn, UiEnvironmentProvider as Xo, fade as Xp, FocusRingOptions as Xr, DEFAULT_LINE_HEIGHT_FACTOR as Xs, paintPictures as Xt, UiDensity as Xu, demuxMp4Video as Y, parseShortcut as Ya, EditableText as Yc, PaintTextStyle as Yd, containerBands as Yf, interpolateColor as Yh, RelayoutExplanation as Yi, isUiSemanticState as Yl, UiTextOverflowValue as Ym, VideoSourceArgs as Yn, findMatchesIn as Yo, ResolvedMotionState as Yp, Decorations as Yr, resolvePaintState as Ys, PaintStats as Yt, relativeLuminance as Yu, Mp3Frame as Z, UiKeyboardController as Za, Paint as Zc, UiPath as Zd, UiModifierEnvironment as Zf, interpolateTransform as Zh, describeLength as Zi, statesEqual as Zl, UiThemeColorName as Zm, VideoTransport as Zn, provideEnvironment as Zo, isMotionRest as Zp, borderShapes as Zr, TEXT_SELECTION_PROP as Zs, PaintContext2D as Zt, densityFactors as Zu, linkOf as _, isNodeTabStop as _a, TextRunStyle as _c, UiVisualState as _d, FrLength as _f, easings as _g, darkColors as _h, inheritedPropertyNames as _i, EditableTextProps as _l, NodeProperty as _m, RendererBackend as _n, overrideSources as _o, UiPropValue as _p, IconRasterizerOptions as _r, CanvasTextStyle as _s, ScissorRect as _t, LazyListOptions as _u, diffSemantics as a, UiFrameClock as aa, FixedMetricsOptions as ac, shadowsEqual as ad, ResolvedGradientStop as af, UiBasicColors as ag, borderRadiusIsZero as ah, measure as ai, UiBinding as al, SharedClaim as am, PaintRecording as an, isScrollContainer as ao, defineModifier as ap, MotionArgs as ar, editorOf as as, CLIP_STRIDE_FLOATS as at, SheetHeaderRenderer as au, ParagraphGeometry as b, PlatformAdapterOptions as ba, CaretRect as bc, hasVisualState as bd, UiLength as bf, UiEnvironment as bh, propertyValuesEqualByName as bi, FlexItemProps as bl, UiPropertyOverride as bm, RenderChanges as bn, writeOverrideProperty as bo, UiEventListenerOptions as bp, DefaultImageResolver as br, TextLinePlacement as bs, TextRunDraw as bt, VIRTUAL_INDEX_PROP as bu, UiSemanticsMap as c, UiHostFrameClock as ca, ParagraphTextMeasurer as cc, UiTypographyRole as cd, UiGradientStop as cf, colorToRgba as cg, uniformBorderRadius as ch, bundle as ci, ChildrenBindingId as cl, LayoutBox as cm, InspectorOverlay as cn, UiGestureRecognizer as co, UiModifierTeardown as cp, sharedElement as cr, isReadOnly as cs, INSTANCE_STRIDE_BYTES as ct, SheetSourceArgs as cu, buildSemanticsTree as d, UiTimerFrameClock as da, TextLineRun as dc, typographyEqual as dd, gradientPaint as df, normalizeColor as dg, UiShapes as dh, accumulatedOffsetTo as di, BoxModelProps as dl, Size as dm, CanvasTextMeasurer as dn, FocusNotifier as do, UiChild as dp, ImageSources as dr, EditCommand as ds, NO_CLIP_INDEX as dt, UiVirtualSheetOptions as du, formatExplanation as ea, selectableTextNodes as ec, scaleSpacing as ed, pathValuesEqual as ef, UiTransforms as eg, UiBorderRadius as eh, focusRing as ei, Stack as el, rotateFrom as em, PaintTarget as en, ScrollContainerState as eo, UiModifierSet as ep, DefaultVideoResolverOptions as er, CARET_BLINK_MS as es, readMp3Header as et, CompositionRange as eu, semanticsInertAbove as f, UiTimerFrameClockOptions as fa, TextMeasureRequest as fc, MAX_MEASURES_PER_CHILD as fd, gradientsEqual as ff, parseColor as fg, defaultShapes as fh, contentOffset as fi, BoxProps as fl, TightenOptions as fm, Canvas2DRenderer as fn, FocusSource as fo, UiElement as fp, iconSource as fr, EditingPlatform as fs, PrimitiveCommand as ft, VIRTUAL_SHEET_PROP as fu, linkHoverOf as g, isNodeSelectable as ga, TextRunSpan as gc, isLayoutProtocol as gd, AutoLength as gf, cubicBezier as gg, colorsEqualPalette as gh, inheritedPropertyFlags as gi, ContainerProps as gl, NodeId as gm, ScrollLayerStats as gn, clearOverrideProperty as go, isUiElement as gp, IconRasterizer as gr, EditableLayout as gs, RenderTextCache as gt, LazyItemRenderer as gu, hasTextLinks as h, isNodeInert as ha, TextRunMeasurer as hc, UiLayoutProtocol as hd, validateGradient as hf, UiEasing as hg, UiColors as hh, getPropertyNames as hi, CommonProps as hl, tightenConstraints as hm, LayerCanvasFactory as hn, resetTransitionWarnings as ho, isUiChild as hp, IconContext as hr, isPrintable as hs, RenderList as ht, LazyGridOptions as hu, UiSemanticsPatch as i, UiAnimationFrameClock as ia, CharacterCountTextMeasurer as ic, defaultShadows as id, ResolvedGradient as if, transformsEqual as ig, borderRadiusEqual as ih, interactive as ii, BindingId as il, slideUp as im, PaintRecorder as in, UiWheelController as io, UiModifierKind as ip, canDecodeVideo as ir, editorFor as is, CLIP_STRIDE_BYTES as it, LazySheetProps as iu, markInstant as j, UiEditingController as ja, graphemeBoundaries as jc, UiTextMetrics as jd, resolveLength as jf, spring as jh, parseCrossAxisAlignment as ji, ScrollViewProps as jl, UiAlignment as jm, resolveProperty as jn, SCROLLBAR_HOVER_ZONE as jo, UiPasteEvent as jp, PinchableOptions as jr, textRunDecorations as js, initializeWebGPU as jt, darkTheme as ju, UiSchedulerOptions as k, EditingHost as ka, offsetForVerticalMove as kc, UiTextDecoration as kd, percent as kf, assertTransitionMap as kh, MainAxisAlignment as ki, Reactive as kl, paintsAfterChildren as km, resolveBoolean as kn, UiHitTester as ko, UiKeyModifiers as kp, shortcut as kr, runFontString as ks, WebGPUGlyphAtlas as kt, videoFrameSize as ku, UiSemanticsRecord as l, UiHostFrameClockOptions as la, SpannedRuns as lc, defaultTypography as ld, UiLinearGradient as lf, colorValuesEqual as lg, UiShapeExtensions as lh, noModifiers as li, UiChildrenBinding as ll, LayoutResult as lm, LayoutInspector as ln, PinchRecognizerOptions as lo, ComponentResolver as lp, IconSourceArgs as lr, nextCaretToggle as ls, INSTANCE_STRIDE_FLOATS as lt, SheetViewport as lu, clearLinkHover as m, isNodeHitTestable as ma, TextOverflow as mc, UiLayoutContext as md, radialGradient as mf, rgba as mg, shapesEqual as mh, findPropertyDefinition as mi, ColumnProps as ml, constraintsEqual as mm, traceRoundedRect as mn, NodeTransitions as mo, isObservable$1 as mp, IconCanvas as mr, detectEditingPlatform as ms, RenderCommand as mt, LazyAxis as mu, UiSemanticsBox as n, withOverrideSource as na, selectionRangeOf as nc, spacingSteps as nd, GradientPaint as nf, transform as ng, borderRadius as nh, InteractiveOptions as ni, createElement as nl, slideDown as nm, EMPTY_RECORDING as nn, UiScrollBehavior as no, assertModifierList as np, VideoPlayback as nr, EDITOR_PROP as ns, WebGPUGlyphPages as nt, EditableTextModel as nu, recordsEqual as o, UiFrameClockFactory as oa, FontMetrics as oc, UiTypography as od, UiGradient as of, UiColor as og, borderRadiusValuesEqual as oh, pressable as oi, UiGraph as ol, UiSharedElements as om, replayPaint as on, GestureInput as oo, isUiModifier as op, SharedElementArgs as or, isEditableNode as os, CommandKind as ot, SheetRange as ou, textRunOfRecordId as p, isNodeFocusable as pa, TextMeasurer as pc, UiLayoutChild as pd, linearGradient as pf, rgb8 as pg, isShapeName as ph, closestPropertyName as pi, ButtonProps as pl, clampSize as pm, Canvas2DRendererOptions as pn, UiFocusManager as po, isComponentLikeElement as pp, imageSource as pr, commandForKey as ps, PrimitiveKind as pt, sheetSource as pu, Mp4VideoTrack as q, UiShortcutStep as qa, Button as qc, PaintSurface as qd, UiContainerSizeSource as qf, defaultMotion as qh, LayoutStateExplanation as qi, UiSemanticStates as ql, UiTextAlign as qm, scrollPosition as qn, FindMatch as qo, MotionStateInput as qp, BorderEdge as qr, normalizeTextAlign as qs, PaintCanvasFactory as qt, highContrastColors as qu, UiSemanticsUpdate as r, UiFrame as ra, setSelectionRange as rc, UiShadows as rd, MAX_GRADIENT_STOPS as rf, transformIsIdentity as rg, borderRadiusCorners as rh, hoverable as ri, UiDefinition as rl, slideFrom as rm, PaintOp as rn, UiScrollability as ro, UiModifier as rp, VideoResolver as rr, caretVisibleAt as rs, Affine as rt, LazySheet as ru, TEXT_RUN_ID_SEPARATOR as s, UiFrameTime as sa, ParagraphLayout as sc, UiTypographyExtensions as sd, UiGradientOffset as sf, colorToHex as sg, normalizeBorderRadius as sh, UiModifierBundle as si, UiEventBinding as sl, Constraints as sm, INSPECTOR_HEAT_MS as sn, GestureRecognizerOptions as so, UiModifierHost as sp, motion as sr, isMultiline as ss, GlyphCommand as st, SheetRowRenderer as su, UiSemanticsAction as t, labelNode as ta, selectableTextOf as tc, spacingEqual as td, UiImage as tf, parseTransform as tg, UiBorderRadiuses as th, BUTTON_INTERACTION as ti, Text as tl, scaleFrom as tm, tracePathData as tn, ScrollSink as to, UiUnknownModifierPropertyError as tp, RangeResponse as tr, CARET_WIDTH as ts, splitMp3Frames as tt, EditUnit as tu, buildSemanticsSubtree as u, UiManualFrameClock as ua, TextLine as uc, isTypographyRole as ud, UiRadialGradient as uf, colorsEqual as ug, UiShapeName as uh, Transform as ui, UiGraphBuilder as ul, LayoutStats as um, LayoutInspectorOptions as un, UiPinchRecognizer as uo, ComponentLikeElement as up, ImageSourceArgs as ur, syncEditorValue as us, ImageCommand as ut, UiVirtualSheet as uu, linkRunAtPointIn as v, resolveCursor as va, TextWrap as vc, UiVisualStateSet as vd, MinMaxTrack as vf, linear as vg, lightColors as vh, propertyEffects as vi, EnvironmentProps as vl, UiNode as vm, UiRenderer as vn, resetOverrideWarnings as vo, UiProps as vp, IconSpec as vr, PlacedTextRun as vs, TEXTURED_STRIDE_BYTES as vt, LazySourceArgs as vu, paragraphGeometryFrom as w, capturePointer as wa, lineIndexAtY as wc, UiFontStretch as wd, isAutoLength as wf, UiNodeType as wh, GridTrack as wi, InteractionProps as wl, DecorationShape as wm, drawOverlayShapes as wn, SelectionHost as wo, UiBeforeInputEvent as wp, animateLayout as wr, createCanvasTextStyle as ws, textRuns as wt, VirtualUpdate as wu, hasDrawnText as x, PlatformEventTarget as xa, PlacedLine as xc, visualState as xd, UiTrackSize as xf, UiEnvironmentKey as xh, GridContribution as xi, GridItemProps as xl, UiPropertyOverrides as xm, RenderContext as xn, FindHost as xo, UiInputDispatcher as xp, DefaultImageResolverOptions as xr, TextRunRect as xs, buildRenderList as xt, VIRTUAL_LEAD_PROP as xu, setLinkHover as y, CanvasPlatformSurface as ya, spannedRunsFor as yc, defaultVisualState as yd, PercentLength as yf, steps as yg, LayoutRecord as yh, propertyIsInherited as yi, FlexContainerProps as yl, UiNodeTransitions as ym, LayoutReader as yn, writeDeclaredProperty as yo, UiEventListener as yp, iconKey as yr, SpanPaint as ys, TEXTURED_STRIDE_FLOATS as yt, UiVirtualWindow as yu, parseWebVtt as z, UiDropZone as za, Responsive as zc, spannedTextOf as zd, UiInsetEdge as zf, UiTween as zh, LayoutEngine as zi, UiPropertyName as zl, UiGridAutoFlow as zm, insetPadding as zn, scrollbarThumb as zo, UiWheelEvent as zp, dropTarget as zr, PaintState as zs, WebGPUCanvasHost as zt, defineThemeExtension as zu };
17570
- //# sourceMappingURL=index-BiN3WdTh.d.ts.map
18477
+ export { Mp4AudioTrack as $, UiShortcutBinding as $a, LazyListProps as $c, textSpansEqual as $d, propertyValuesEqual as $f, UiTransitionValue as $h, Edges as $i, UiAutocomplete as $l, hasDecorationPhase as $m, ScrollOffset as $n, matchRangesOf as $o, UiInputEvent as $p, clickOutside as $r, computeObjectFitRect as $s, registerFontStack as $t, themeExtensionsEqual as $u, offsetAtPointIn as A, PlatformSurface as Aa, PlacedLine as Ac, hasVisualState as Ad, MinMaxTrack as Af, UiBasicColors as Ag, borderRadiusIsZero as Ah, GridItemRequest as Ai, GridItemProps as Al, SharedClaim as Am, LABEL_PADDING_X as An, UiFindController as Ao, UiModifierTeardown as Ap, ImageResolver as Ar, applyCanvasTextStyle as As, createTextCache as At, VIRTUAL_INDEX_PROP as Au, markNow as B, TouchScrollerOptions as Ba, graphemeBoundaries as Bc, UiTextLink as Bd, minmax as Bf, UiEasing as Bg, UiColors as Bh, parseMainAxisAlignment as Bi, ScrollViewProps as Bl, tightenConstraints as Bm, resolvePropertyByName as Bn, SCROLLBAR_INSET as Bo, isUiChild as Bp, ZoomState as Br, Canvas2DContext as Bs, isWebGPUAvailable as Bt, UiTheme as Bu, hasTextLinks as C, isNodeInert as Ca, TextOverflow as Cc, UiLayoutChild as Cd, gradientPaint as Cf, interpolatorFor as Cg, UiVerticalAlign as Ch, getPropertyNames as Ci, ColumnProps as Cl, pop as Cm, LayerCanvasFactory as Cn, resetTransitionWarnings as Co, UiUnknownModifierPropertyError as Cp, IconContext as Cr, isPrintable as Cs, RenderList as Ct, sheetSource as Cu, setLinkHover as D, CanvasPlatformSurface as Da, TextWrap as Dc, UiVisualState as Dd, validateGradient as Df, transform as Dg, borderRadius as Dh, propertyIsInherited as Di, EnvironmentProps as Dl, slideDown as Dm, LayoutReader as Dn, writeDeclaredProperty as Do, defineModifier as Dp, iconKey as Dr, SpanPaint as Ds, TEXTURED_STRIDE_FLOATS as Dt, LazyListOptions as Du, linkRunAtPointIn as E, resolveCursor as Ea, TextRunStyle as Ec, isLayoutProtocol as Ed, radialGradient as Ef, parseTransform as Eg, UiBorderRadiuses as Eh, propertyEffects as Ei, EditableTextProps as El, scaleFrom as Em, UiRenderer as En, resetOverrideWarnings as Eo, UiModifierKind as Ep, IconSpec as Er, PlacedTextRun as Es, TEXTURED_STRIDE_BYTES as Et, LazyItemRenderer as Eu, UiFrameCallback as F, touchActionFor as Fa, lineLimit as Fc, UiFontStyle as Fd, fr as Ff, colorsEqual as Fg, UiShapeName as Fh, AlignContent as Fi, PaintProps as Fl, LayoutStats as Fm, CanvasSurface as Fn, HitTestResult as Fo, ComponentLikeElement as Fp, ShortcutsOptions as Fr, layoutTextLines as Fs, GlyphSlot as Ft, VirtualViewport as Fu, VttTrack as G, UiDragState as Ga, previousGraphemeStart as Gc, defaultTextStyle as Gd, UiBoxShadow as Gf, UiEnvironment as Gh, proportionalFontMetrics as Gi, UiEventProps as Gl, UiPropertyOverride as Gm, InsetPaddingArgs as Gn, scrollLeaderOf as Go, UiEventListenerOptions as Gp, ReorderableOptions as Gr, DEFAULT_TEXT_COLOR as Gs, WebGPURenderer as Gt, withDensity as Gu, performanceMarksEnabled as H, EXTERNAL_FILES as Ha, lineStartAt as Hc, UiTextRange as Hd, repeat as Hf, easings as Hg, darkColors as Hh, parseFlexDirection as Hi, TextContentProps as Hl, NodeProperty as Hm, ThemeTokenTarget as Hn, SCROLLBAR_THICKNESS as Ho, UiPropValue as Hp, AutoScrollOptions as Hr, DEFAULT_FONT_FAMILY as Hs, CapturedFrame as Ht, lightTheme as Hu, UiScheduler as I, EditingControllerOptions as Ia, offsetAtPoint as Ic, UiFontVariant as Id, isAutoLength as If, normalizeColor as Ig, UiShapes as Ih, CrossAxisAlignment as Ii, PositionProps as Il, Size as Im, createCanvasSurface as In, HitTester as Io, UiChild as Ip, contextMenu as Ir, runCanvasStyleInto as Is, GlyphUpload as It, lazySource as Iu, ByteSource as J, UiDroppedFile as Ja, Responsive as Jc, hiddenRangesOf as Jd, boxShadowRadius as Jf, findEnvironmentKey as Jh, SCROLLBAR_FADE_MS as Ji, UiPropertyName as Jl, DecorationRect as Jm, publishInset as Jn, scrollbarThumbs as Jo, MOUSE_POINTER as Jp, reorderable as Jr, PaintState as Js, WebGPUSurface as Jt, UiThemeExtensions as Ju, cueAt as K, UiDropEffect as Ka, previousWordStart as Kc, editableSpansOf as Kd, boxShadow as Kf, UiEnvironmentKey as Kh, LayoutNotifier as Ki, UiNodeRef as Kl, UiPropertyOverrides as Km, PublishInsetArgs as Kn, scrollRange as Ko, UiInputDispatcher as Kp, dragSource as Kr, ObjectFit as Ks, WebGPURendererOptions as Kt, UiThemeExtension as Ku, UiSchedulerOptions as L, EditingHost as La, offsetAtX as Lc, UiResolvedTextSpan as Ld, isFrLength as Lf, parseColor as Lg, defaultShapes as Lh, MainAxisAlignment as Li, PropsOf as Ll, TightenOptions as Lm, resolveBoolean as Ln, UiHitTester as Lo, UiElement as Lp, shortcut as Lr, runFontString as Ls, WebGPUGlyphAtlas as Lt, UiVideoSurface as Lu, paragraphGeometryFrom as M, capturePointer as Ma, caretRectFor as Mc, visualStatesEqual as Md, UiLength as Mf, colorToHex as Mg, normalizeBorderRadius as Mh, GridTrack as Mi, IdentityProps as Ml, Constraints as Mm, drawOverlayShapes as Mn, SelectionHost as Mo, FocusSource as Mp, animateLayout as Mr, createCanvasTextStyle as Ms, textRuns as Mt, VIRTUAL_WINDOW_PROP as Mu, selectionRectsIn as N, pointerDeviceOf as Na, lineIndexAtY as Nc, UiFontKerning as Nd, UiTrackSize as Nf, colorToRgba as Ng, uniformBorderRadius as Nh, placeGridItems as Ni, InteractionProps as Nl, LayoutBox as Nm, labelOrigin as Nn, UiSelectionController as No, UiFocusManager as Np, ContextMenuOptions as Nr, drawText as Ns, GlyphShaper as Nt, VirtualItemMeasure as Nu, ParagraphGeometry as O, PlatformAdapterOptions as Oa, spannedRunsFor as Oc, UiVisualStateSet as Od, AutoLength as Of, transformIsIdentity as Og, borderRadiusCorners as Oh, propertyValuesEqualByName as Oi, FlexContainerProps as Ol, slideFrom as Om, RenderChanges as On, writeOverrideProperty as Oo, isUiModifier as Op, DefaultImageResolver as Or, TextLinePlacement as Os, TextRunDraw as Ot, LazySourceArgs as Ou, wordRangeIn as P, prepareInputSurface as Pa, lineIndexForOffset as Pc, UiFontStretch as Pd, auto as Pf, colorValuesEqual as Pg, UiShapeExtensions as Ph, sizeGridTracks as Pi, PaintElementProps as Pl, LayoutResult as Pm, CanvasHost as Pn, HitTestLayoutReader as Po, ComponentResolver as Pp, ShortcutOptions as Pr, fillTextRects as Ps, GLYPH_SUBPIXEL_PHASES as Pt, VirtualUpdate as Pu, rangeSource as Q, UiShortcut as Qa, LazyGridProps as Qc, textContentOf as Qd, defineProperty as Qf, UiTransitionSpec as Qh, CustomLayoutExplanation as Qi, UI_SEMANTIC_STATES as Ql, decorationRect as Qm, sizeContainer as Qn, clearMatchRanges as Qo, UiGestureEvent as Qp, ClickOutsideOptions as Qr, colorToCss as Qs, fontStackFor as Qt, themeExtension as Qu, MARK_PREFIX as R, EditingState as Ra, offsetForVerticalMove as Rc, UiSpannedText as Rd, isMinMaxTrack as Rf, rgb8 as Rg, isShapeName as Rh, parseAlignContent as Ri, Reactive as Rl, clampSize as Rm, resolveNumber as Rn, UiPoint as Ro, isComponentLikeElement as Rp, shortcuts as Rr, textRunBackgrounds as Rs, WebGPUTextureCache as Rt, isVideoSurface as Ru, clearLinkHover as S, isNodeHitTestable as Sa, TextMeasurer as Sc, MAX_MEASURES_PER_CHILD as Sd, UiRadialGradient as Sf, interpolateTransform as Sg, UiThemeColorName as Sh, findPropertyDefinition as Si, ButtonProps as Sl, isMotionRest as Sm, traceRoundedRect as Sn, NodeTransitions as So, UiModifierSet as Sp, IconCanvas as Sr, detectEditingPlatform as Ss, RenderCommand as St, VIRTUAL_SHEET_PROP as Su, linkOf as T, isNodeTabStop as Ta, TextRunSpan as Tc, UiLayoutProtocol as Td, linearGradient as Tf, UiTransforms as Tg, UiBorderRadius as Th, inheritedPropertyNames as Ti, ContainerProps as Tl, rotateFrom as Tm, RendererBackend as Tn, overrideSources as To, UiModifier as Tp, IconRasterizerOptions as Tr, CanvasTextStyle as Ts, ScissorRect as Tt, LazyGridOptions as Tu, setPerformanceMarks as U, UiDragPayload as Ua, nextGraphemeEnd as Uc, UiTextSpan as Ud, resolveLength as Uf, linear as Ug, lightColors as Uh, ELLIPSIS as Ui, TextProps as Ul, UiNode as Um, themeTokens as Un, ScrollbarAxis as Uo, UiProps as Up, DragSourceOptions as Ur, DEFAULT_FONT_SIZE as Us, DrawStats as Ut, themesEqual as Uu, measureSpan as V, UiTouchScroller as Va, lineEndAt as Vc, UiTextMetrics as Vd, percent as Vf, cubicBezier as Vg, colorsEqualPalette as Vh, FlexDirection as Vi, StackProps as Vl, NodeId as Vm, resolveString as Vn, SCROLLBAR_MIN_THUMB as Vo, isUiElement as Vp, pinchable as Vr, Canvas2DGradient as Vs, WebGPUError as Vt, darkTheme as Vu, VttCue as W, UiDragSession as Wa, nextWordEnd as Wc, UiTextStyle as Wd, BOX_SHADOW_BLUR_REACH as Wf, steps as Wg, LayoutRecord as Wh, layoutParagraph as Wi, TypographyProps as Wl, UiNodeTransitions as Wm, sameArgs as Wn, ScrollbarThumb as Wo, UiEventListener as Wp, DropTargetOptions as Wr, DEFAULT_FONT_WEIGHT as Ws, RenderHooks as Wt, withContrast as Wu, RangeSourceOptions as X, dragSessionFor as Xa, LazyColumn as Xc, spanAtOffset as Xd, boxShadowsEqual as Xf, DirtyFlags as Xh, ScrollAdjustment as Xi, UiPropertyValues as Xl, DecorationStroke as Xm, SizeContainerArgs as Xn, SubtreeBounds as Xo, UiEventType as Xp, DraggableOptions as Xr, TextAlign as Xs, bumpFontStack as Xt, hasThemeExtension as Xu, DEFAULT_BLOCK_SIZE as Y, UiFileDropMessage as Ya, ResponsiveProps as Yc, resolvedSpansOf as Yd, boxShadowReach as Yf, UiNodeType as Yh, SCROLLBAR_LINGER_MS as Yi, UiPropertyValueOf as Yl, DecorationShape as Ym, BreakpointArgs as Yn, scrollbarZoneAt as Yo, UiBeforeInputEvent as Yp, DragOffset as Yr, PaintTextSpan as Ys, createWebGPUSurface as Yt, defineThemeExtension as Yu, bufferSource as Z, ShortcutRegistryOptions as Za, LazyGrid as Zc, spannedTextOf as Zd, UiPropertyDefinition as Zf, AnimationDriver as Zh, AxisExplanation as Zi, UI_ROLES as Zl, decorationColor as Zm, breakpoint as Zn, TEXT_MATCHES_PROP as Zo, UiFocusEvent as Zp, draggable as Zr, VerticalAlign as Zs, clearFontStacks as Zt, noThemeExtensions as Zu, buildSemanticsTree as _, UiHostFrameClockOptions as _a, ParagraphTextMeasurer as _c, UiTypographyExtensions as _d, ResolvedGradientStop as _f, UiSpringToken as _g, UiSubgridAxis as _h, noModifiers as _i, ChildrenBindingId as _l, MotionState as _m, LayoutInspector as _n, GestureRecognizerOptions as _o, edgeField as _p, IconSourceArgs as _r, nextCaretToggle as _s, INSTANCE_STRIDE_FLOATS as _t, SheetRowRenderer as _u, diffSemantics as a, describeLength as aa, DEFAULT_LINE_HEIGHT_FACTOR as ac, relativeLuminance as ad, PaintSurface as af, UiAnimation as ag, UiContentDistribution as ah, borderShapes as ai, Grid as al, UiPointerEvent as am, PaintContext2D as an, shortcutKeyCaps as ao, noInsets as ap, VideoTransport as ar, provideEnvironment as as, Mp3Frame as at, isUiSemanticState as au, semanticsMemory as b, UiTimerFrameClockOptions as ba, TextLineRun as bc, isTypographyRole as bd, UiGradientStop as bf, interpolateColor as bg, UiTextOverflowValue as bh, contentOffset as bi, BoxModelProps as bl, ResolvedMotionState as bm, Canvas2DRenderer as bn, UiPinchRecognizer as bo, UiModifierFocus as bp, iconSource as br, EditingPlatform as bs, PrimitiveCommand as bt, UiVirtualSheet as bu, SemanticsMemory as c, formatExplanation as ca, clearSelectionRange as cc, UiSpacing as cd, UiPaint as cf, UiSpring as cg, UiFlexWrap as ch, focusRing as ci, ScrollView as cl, UiTextChangeEvent as cm, PaintTarget as cn, PointerControllerOptions as co, UiContainerSizeSource as cp, DefaultVideoResolverOptions as cr, CARET_BLINK_MS as cs, readMp3Header as ct, validateRole as cu, SemanticsRewalk as d, UiFrame as da, selectionRangeOf as dc, spacingEqual as dd, paintValuesEqual as df, UiTweenOptions as dg, UiObjectFit as dh, hoverable as di, createElement as dl, noKeyModifiers as dm, PaintOp as dn, ScrollSink as do, unknownContainerSize as dp, VideoResolver as dr, caretVisibleAt as ds, Affine as dt, EditUnit as du, LayoutExplanation as ea, createPaintState as ec, withThemeExtension as ed, textStylesEqual as ef, assertTransitionMap as eg, paintsAfterChildren as eh, autoFocus as ei, LazyRow as el, UiKeyModifiers as em, PaintCanvas as en, UiShortcutRegistry as eo, UiInsetEdge as ep, ScrollPositionArgs as er, setMatchRanges as es, Mp4Sample as et, UiLiveRegion as eu, SemanticsSpan as f, UiAnimationFrameClock as fa, setSelectionRange as fc, spacingSteps as fd, pathValuesEqual as ff, createTween as fg, UiOverflow as fh, interactive as fi, UiDefinition as fl, wheelDeltaYOf as fm, PaintRecorder as fn, UiScrollBehavior as fo, UiEditingGroup as fp, canDecodeVideo as fr, editorFor as fs, CLIP_STRIDE_BYTES as ft, EditableTextModel as fu, buildSemanticsSubtree as g, UiHostFrameClock as ga, ParagraphLayout as gc, UiTypography as gd, ResolvedGradient as gf, UiSpringSpec as gg, UiSelfAlignment as gh, bundle as gi, UiEventBinding as gl, MotionChannel as gm, InspectorOverlay as gn, GestureInput as go, comparePositions as gp, sharedElement as gr, isReadOnly as gs, INSTANCE_STRIDE_BYTES as gt, SheetRange as gu, UiSemanticsRecord as h, UiFrameTime as ha, FontMetrics as hc, shadowsEqual as hd, MAX_GRADIENT_STOPS as hf, UiMotion as hg, UiPosition as hh, UiModifierBundle as hi, UiGraph as hl, MOTION_REST as hm, INSPECTOR_HEAT_MS as hn, isScrollContainer as ho, adjacentField as hp, motion as hr, isMultiline as hs, GlyphCommand as ht, SheetHeaderRenderer as hu, UiSemanticsPatch as i, SizeDecision as ia, resolvePaintState as ic, raiseContrast as id, PaintLineJoin as if, AnimatedCell as ig, UiColorValue as ih, FocusRingOptions as ii, EditableText as il, UiPointerDevice as im, paintPictures as in, parseShortcut as io, insetsEqual as ip, VideoState as ir, UiEnvironmentProvider as is, Mp3Format as it, isUiRole as iu, paragraphGeometry as j, UiPlatformAdapter as ja, RunMeasure as jc, visualState as jd, PercentLength as jf, UiColor as jg, borderRadiusValuesEqual as jh, GridPlacement as ji, GridProps as jl, UiSharedElements as jm, OverlayShape as jn, SelectionControllerOptions as jo, FocusOptions as jp, AnimateLayoutOptions as jr, buildFontString as js, glyphCount as jt, VIRTUAL_LEAD_PROP as ju, hasDrawnText as k, PlatformEventTarget as ka, CaretRect as kc, defaultVisualState as kd, FrLength as kf, transformsEqual as kg, borderRadiusEqual as kh, GridContribution as ki, FlexItemProps as kl, slideUp as km, RenderContext as kn, FindHost as ko, UiModifierHost as kp, DefaultImageResolverOptions as kr, TextRunRect as ks, buildRenderList as kt, UiVirtualWindow as ku, SemanticsPlacement as l, labelNode as la, selectableTextNodes as lc, defaultSpacing as ld, UiPath as lf, UiSpringOptions as lg, UiFontWeight as lh, BUTTON_INTERACTION as li, Stack as ll, UiWheelDeltaMode as lm, tracePathData as ln, UiPointerController as lo, bandOf as lp, RangeResponse as lr, CARET_WIDTH as ls, splitMp3Frames as lt, validateStates as lu, UiSemanticsMap as m, UiFrameClockFactory as ma, FixedMetricsOptions as mc, defaultShadows as md, GradientPaint as mf, UiEasingToken as mg, UiPointerEvents as mh, pressable as mi, UiBinding as ml, MOTION_CHANNELS as mm, replayPaint as mn, UiWheelController as mo, UiTextPosition as mp, SharedElementArgs as mr, isEditableNode as ms, CommandKind as mt, LazySheetProps as mu, UiSemanticsBox as n, OverrideSources as na, normalizeTextAlign as nc, contrastRatio as nd, PaintFillRule as nf, spring as ng, UiAlignment as nh, BordersOptions as ni, Button as nl, UiPasteEvent as nm, PaintPictureCache as nn, describeShortcut as no, UiInsetSource as np, VideoClock as nr, FindOptions as ns, demuxMp4Audio as nt, UiSemanticState as nu, dropIndexShifts as o, describeOverrides as oa, TEXT_SELECTION_PROP as oc, UiDensity as od, PaintTextAlign as of, UiAnimationOptions as og, UiCursor as oh, borders as oi, Paint as ol, UiPointerKind as om, PaintGradient as on, KeyboardControllerOptions as oo, observeViewportInsets as op, videoSource as or, UiEnvironmentKeys as os, Mp3Frames as ot, normalizeStates as ou, TEXT_RUN_ID_SEPARATOR as p, UiFrameClock as pa, CharacterCountTextMeasurer as pc, UiShadows as pd, UiImage as pf, UiDurationToken as pg, UiPlacement as ph, measure as pi, BindingId as pl, DirtyNodeSet as pm, PaintRecording as pn, UiScrollability as po, UiGroupEdit as pp, MotionArgs as pr, editorOf as ps, CLIP_STRIDE_FLOATS as pt, LazySheet as pu, parseWebVtt as q, UiDropZone as qa, wordRangeAt as qc, flattenTextSpans as qd, boxShadowArraysEqual as qf, createEnvironmentKey as qh, LayoutEngine as qi, UiProperties as ql, DecorationFill as qm, insetPadding as qn, scrollbarThumb as qo, UiListenerErrorReporter as qp, dropTarget as qr, PaintBoxShadow as qs, WebGPUCanvasHost as qt, UiThemeExtensionOptions as qu, UiSemanticsUpdate as r, RelayoutExplanation as ra, normalizeVerticalAlign as rc, highContrastColors as rd, PaintLineCap as rf, tween as rg, UiBorderRadiusValue as rh, Decorations as ri, Column as rl, UiPinchEvent as rm, PaintStats as rn, formatShortcut as ro, UiInsets as rp, VideoSourceArgs as rr, findMatchesIn as rs, demuxMp4Video as rt, UiSemanticStates as ru, recordsEqual as s, formatConstraints as sa, TextRange as sc, densityFactors as sd, PaintTextStyle as sf, UiReducedMotionPolicy as sg, UiDirection as sh, decorated as si, Row as sl, UiSelectionChangeEvent as sm, PaintResolver as sn, UiKeyboardController as so, UiContainerSize as sp, DefaultVideoResolver as sr, EnvironmentNotifier as ss, Mp3Header as st, statesEqual as su, UiSemanticsAction as t, LayoutStateExplanation as ta, isPaintVisible as tc, UiContrast as td, PaintBox as tf, normalizeTransition as tg, UI_SUBGRID_AXES as th, BorderEdge as ti, Box as tl, UiKeyboardEvent as tm, PaintCanvasFactory as tn, UiShortcutStep as to, UiInsetRegistry as tp, scrollPosition as tr, FindMatch as ts, Mp4VideoTrack as tt, UiRole as tu, SemanticsReuse as u, withOverrideSource as ua, selectableTextOf as uc, scaleSpacing as ud, inputsEqual as uf, UiTween as ug, UiGridAutoFlow as uh, InteractiveOptions as ui, Text as ul, UiWheelEvent as um, EMPTY_RECORDING as un, ScrollContainerState as uo, containerBands as up, VideoPlayback as ur, EDITOR_PROP as us, WebGPUGlyphPages as ut, CompositionRange as uu, rewalkSemantics as v, UiManualFrameClock as va, SpannedRuns as vc, UiTypographyRole as vd, UiGradient as vf, defaultMotion as vg, UiTextAlign as vh, Transform as vi, UiChildrenBinding as vl, MotionStateInput as vm, LayoutInspectorOptions as vn, UiGestureRecognizer as vo, editingGroupOf as vp, ImageSourceArgs as vr, syncEditorValue as vs, ImageCommand as vt, SheetSourceArgs as vu, linkHoverOf as w, isNodeSelectable as wa, TextRunMeasurer as wc, UiLayoutContext as wd, gradientsEqual as wf, UiTransform as wg, validateSubgrid as wh, inheritedPropertyFlags as wi, CommonProps as wl, resolveMotionState as wm, ScrollLayerStats as wn, clearOverrideProperty as wo, assertModifierList as wp, IconRasterizer as wr, EditableLayout as ws, RenderTextCache as wt, LazyAxis as wu, textRunOfRecordId as x, isNodeFocusable as xa, TextMeasureRequest as xc, typographyEqual as xd, UiLinearGradient as xf, interpolateNumber as xg, UiTextWrapValue as xh, closestPropertyName as xi, BoxProps as xl, fade as xm, Canvas2DRendererOptions as xn, FocusNotifier as xo, UiModifierLayout as xp, imageSource as xr, commandForKey as xs, PrimitiveKind as xt, UiVirtualSheetOptions as xu, semanticsInertAbove as y, UiTimerFrameClock as ya, TextLine as yc, defaultTypography as yd, UiGradientOffset as yf, UiInterpolator as yg, UiTextDirection as yh, accumulatedOffsetTo as yi, UiGraphBuilder as yl, MotionTiming as ym, CanvasTextMeasurer as yn, PinchRecognizerOptions as yo, UiModifierEnvironment as yp, ImageSources as yr, EditCommand as ys, NO_CLIP_INDEX as yt, SheetViewport as yu, markInstant as z, UiEditingController as za, selectionRects as zc, UiTextDecoration as zd, isPercentLength as zf, rgba as zg, shapesEqual as zh, parseCrossAxisAlignment as zi, RowProps as zl, constraintsEqual as zm, resolveProperty as zn, SCROLLBAR_HOVER_ZONE as zo, isObservable$1 as zp, PinchableOptions as zr, textRunDecorations as zs, initializeWebGPU as zt, videoFrameSize as zu };
18478
+ //# sourceMappingURL=index-B3zydgF2.d.ts.map