@swiftbrowser/react 0.26.10 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -2
- package/dist/components/lists.d.ts +4 -3
- package/dist/components/lists.d.ts.map +1 -1
- package/dist/components/split.d.ts +6 -0
- package/dist/components/split.d.ts.map +1 -1
- package/dist/host/instance.d.ts +16 -0
- package/dist/host/instance.d.ts.map +1 -1
- package/dist/host/reconciler.d.ts +1 -1
- package/dist/host/reconciler.d.ts.map +1 -1
- package/dist/host/tree.d.ts +47 -2
- package/dist/host/tree.d.ts.map +1 -1
- package/dist/index.js +282 -186
- package/dist/index.js.map +1 -1
- package/dist/modifiers.d.ts +9 -0
- package/dist/modifiers.d.ts.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -185,7 +185,11 @@ is `Image(systemName: "swift").font(.system(size: 17, weight: .semibold))
|
|
|
185
185
|
.foregroundStyle(.white).frame(width: 32, height: 32).background(.orange, in:
|
|
186
186
|
RoundedRectangle(cornerRadius: 8))`. Each modifier wraps the view in the same
|
|
187
187
|
`styled` element the Swift shim emits, so the renderer lays it out
|
|
188
|
-
identically.
|
|
188
|
+
identically. The order matters as it does in SwiftUI: `aspectRatio={{ ratio: 1,
|
|
189
|
+
contentMode: 'fit' }} frame={{ maxWidth: 420 }}` is a square of at most 420
|
|
190
|
+
(the frame offers at most 420, and the square fits in it), while `frame`
|
|
191
|
+
written first offers the square the full width and then only narrows it. A
|
|
192
|
+
modifier that must apply twice goes in `modifiers={[…]}`, an
|
|
189
193
|
ordered list. A layered style is an array: `foregroundStyle={['white',
|
|
190
194
|
'indigo']}` is `.foregroundStyle(.white, .indigo)`, whose second style a
|
|
191
195
|
`symbolRenderingMode="palette"` symbol draws its disc in. The environment
|
|
@@ -398,6 +402,19 @@ makes its rows deletable (a swipe, or edit mode's minus) and `onMove` makes
|
|
|
398
402
|
them reorder with a grip, with `moveItems` to apply the move to an array.
|
|
399
403
|
`swipeActions`, `contextMenu` and `listRowBackground` are modifiers on a row.
|
|
400
404
|
|
|
405
|
+
`defaultMinListRowHeight` is `.environment(\.defaultMinListRowHeight, _)`:
|
|
406
|
+
set on any view, every list below spaces its rows at least that tall,
|
|
407
|
+
including the lists of an app drawn through `RemoteTree`. A Mac content
|
|
408
|
+
list's rows are 24 by default, where Apple's Mac apps space them like the
|
|
409
|
+
sidebar's, 32: one modifier at an app's top gives them all that. A list's
|
|
410
|
+
own `minRowHeight` overrides it for that list, and a Mac grouped form keeps
|
|
411
|
+
its form rows.
|
|
412
|
+
|
|
413
|
+
```tsx
|
|
414
|
+
const mac = usePlatform() === 'macos';
|
|
415
|
+
<NavigationSplitView defaultMinListRowHeight={mac ? 32 : undefined} sidebar={…} detail={…} />
|
|
416
|
+
```
|
|
417
|
+
|
|
401
418
|
### Size classes
|
|
402
419
|
|
|
403
420
|
`useHorizontalSizeClass()` is `compact` below 700 points of width (a phone)
|
|
@@ -426,7 +443,10 @@ titles when regular and the first column when compact.
|
|
|
426
443
|
a number fixes the column's width; `{ min, ideal, max }` starts it at `ideal`
|
|
427
444
|
and, on a Mac, lets the user drag it between `min` and `max`. Without it the
|
|
428
445
|
sidebar is the platform's default (140 on a Mac, 320 on an iPad); Apple's Mac
|
|
429
|
-
apps use about 200.
|
|
446
|
+
apps use about 200. `onSidebarWidthChange(width)` hears the width the user
|
|
447
|
+
dragged the sidebar to on a Mac, once the drag ends; keep it (in
|
|
448
|
+
`useAppStorage`, say) and pass it back as `ideal` to start there next time, as
|
|
449
|
+
a Mac app restores its columns.
|
|
430
450
|
|
|
431
451
|
### Platform
|
|
432
452
|
|
|
@@ -11,9 +11,10 @@ export interface ListProps<T = unknown> extends ViewModifiers {
|
|
|
11
11
|
/** `.formStyle(_:)` on a `Form`: on a Mac `grouped` lays it out in grouped sections, `columns` (and the default) in the columns style. */
|
|
12
12
|
formStyle?: 'automatic' | 'grouped' | 'columns';
|
|
13
13
|
/**
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
14
|
+
* This list's rows are at least this tall, over the
|
|
15
|
+
* `defaultMinListRowHeight` set above it (the modifier, which every list
|
|
16
|
+
* below inherits; set it once at an app's top). Absent both, the
|
|
17
|
+
* platform's default (44 on iOS, 24 on a Mac).
|
|
17
18
|
*/
|
|
18
19
|
minRowHeight?: number;
|
|
19
20
|
/** Edit mode (`EditButton`). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lists.d.ts","sourceRoot":"","sources":["../../src/components/lists.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAA2D,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEhG,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAE5D,OAAO,EAA4C,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAW5F,gEAAgE;AAChE,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;AAE7C,MAAM,WAAW,SAAS,CAAC,CAAC,GAAG,OAAO,CAAE,SAAQ,aAAa;IAC3D,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,gHAAgH;IAChH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,0IAA0I;IAC1I,SAAS,CAAC,EAAE,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;IAChD
|
|
1
|
+
{"version":3,"file":"lists.d.ts","sourceRoot":"","sources":["../../src/components/lists.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAA2D,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEhG,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAE5D,OAAO,EAA4C,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAW5F,gEAAgE;AAChE,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;AAE7C,MAAM,WAAW,SAAS,CAAC,CAAC,GAAG,OAAO,CAAE,SAAQ,aAAa;IAC3D,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,gHAAgH;IAChH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,0IAA0I;IAC1I,SAAS,CAAC,EAAE,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;IAChD;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gCAAgC;IAChC,OAAO,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;IAChC,sHAAsH;IACtH,SAAS,CAAC,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC;IACtE,iBAAiB,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACpE,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,wBAAgB,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAsDhE;AAED,oHAAoH;AACpH,wBAAgB,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,WAAW,GAAG,WAAW,GAAG,mBAAmB,GAAG,MAAM,CAAC,GAAG,SAAS,CAEhH;AAED,MAAM,WAAW,YAAa,SAAQ,aAAa;IACjD,iGAAiG;IACjG,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,2HAA2H;IAC3H,UAAU,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;IACnC,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,CAyBtD"}
|
|
@@ -40,6 +40,12 @@ export interface NavigationSplitViewProps extends ViewModifiers {
|
|
|
40
40
|
* 320 on an iPad).
|
|
41
41
|
*/
|
|
42
42
|
sidebarWidth?: SplitColumnWidth;
|
|
43
|
+
/**
|
|
44
|
+
* The sidebar was dragged to a new width (a Mac's column divider), once
|
|
45
|
+
* the drag ends: keep it and pass it back as `sidebarWidth`'s `ideal` to
|
|
46
|
+
* start there next time, as a Mac app restores its columns.
|
|
47
|
+
*/
|
|
48
|
+
onSidebarWidthChange?: (width: number) => void;
|
|
43
49
|
}
|
|
44
50
|
export declare function NavigationSplitView(props: NavigationSplitViewProps): ReactNode;
|
|
45
51
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"split.d.ts","sourceRoot":"","sources":["../../src/components/split.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAoE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACzG,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAI5D,OAAO,EAA8B,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAI9E,MAAM,MAAM,6BAA6B,GAAG,WAAW,GAAG,KAAK,GAAG,cAAc,GAAG,YAAY,CAAC;AAEhG;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IAChE,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,eAAO,MAAM,qBAAqB,gDAA6C,CAAC;AAEhF;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtF,MAAM,WAAW,wBAAyB,SAAQ,aAAa;IAC7D,OAAO,EAAE,SAAS,CAAC;IACnB,MAAM,EAAE,SAAS,CAAC;IAClB,gBAAgB,CAAC,EAAE,YAAY,CAAC,6BAA6B,CAAC,CAAC;IAC/D,wBAAwB,CAAC,EAAE,CAAC,UAAU,EAAE,6BAA6B,KAAK,IAAI,CAAC;IAC/E;;;;OAIG;IACH,YAAY,CAAC,EAAE,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"split.d.ts","sourceRoot":"","sources":["../../src/components/split.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAoE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACzG,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAI5D,OAAO,EAA8B,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAI9E,MAAM,MAAM,6BAA6B,GAAG,WAAW,GAAG,KAAK,GAAG,cAAc,GAAG,YAAY,CAAC;AAEhG;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IAChE,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,eAAO,MAAM,qBAAqB,gDAA6C,CAAC;AAEhF;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtF,MAAM,WAAW,wBAAyB,SAAQ,aAAa;IAC7D,OAAO,EAAE,SAAS,CAAC;IACnB,MAAM,EAAE,SAAS,CAAC;IAClB,gBAAgB,CAAC,EAAE,YAAY,CAAC,6BAA6B,CAAC,CAAC;IAC/D,wBAAwB,CAAC,EAAE,CAAC,UAAU,EAAE,6BAA6B,KAAK,IAAI,CAAC;IAC/E;;;;OAIG;IACH,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAChD;AAQD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,GAAG,SAAS,CAyD9E;AAsDD;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,cAAc,GAAG,IAAI,EAC5B,QAAQ,EAAE,OAAO,EACjB,KAAK,EAAE,MAAM,IAAI,EACjB,MAAM,UAAO,GACZ,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,IAAI,KAAK,IAAI,CAchD;AAED,oGAAoG;AACpG,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,GAAG,SAAS,CAE9E"}
|
package/dist/host/instance.d.ts
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import type { RendererEvent } from '@swiftbrowser/web/src/protocol';
|
|
9
9
|
import type { ReactNode } from 'react';
|
|
10
|
+
import type { Effective } from './tree';
|
|
10
11
|
export type EventType = RendererEvent['type'];
|
|
11
12
|
export type EventOf<K extends EventType> = Extract<RendererEvent, {
|
|
12
13
|
type: K;
|
|
@@ -65,6 +66,18 @@ export interface Instance {
|
|
|
65
66
|
committedProps: Record<string, unknown> | null;
|
|
66
67
|
committedParent: TreeNode | null;
|
|
67
68
|
committedChildren: Instance[];
|
|
69
|
+
/** The element React has it under (virtual kinds included); null while detached. */
|
|
70
|
+
parent: TreeNode | null;
|
|
71
|
+
/** Changed since the last flush (itself, a child, its visibility), or under something that has: resolved again at the next. */
|
|
72
|
+
stale: boolean;
|
|
73
|
+
/** How it was last emitted (tree.ts `Effective`); null before its first flush. */
|
|
74
|
+
entry: Effective | null;
|
|
75
|
+
/** Whether it is in the emitted tree as of the last flush. */
|
|
76
|
+
shown: boolean;
|
|
77
|
+
/** The element it is a child of as emitted: its React parent, or the target it was hoisted to. */
|
|
78
|
+
effectiveParent: TreeNode | null;
|
|
79
|
+
/** The flush that last resolved it (tree.ts `generation`); a reused subtree keeps an older one. */
|
|
80
|
+
resolvedIn: number;
|
|
68
81
|
}
|
|
69
82
|
/** The root container, element id 0. */
|
|
70
83
|
export interface RootNode {
|
|
@@ -72,6 +85,9 @@ export interface RootNode {
|
|
|
72
85
|
kind: 'root';
|
|
73
86
|
children: Instance[];
|
|
74
87
|
committedChildren: Instance[];
|
|
88
|
+
parent: null;
|
|
89
|
+
stale: boolean;
|
|
90
|
+
entry: Effective | null;
|
|
75
91
|
}
|
|
76
92
|
export type TreeNode = Instance | RootNode;
|
|
77
93
|
//# sourceMappingURL=instance.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instance.d.ts","sourceRoot":"","sources":["../../src/host/instance.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"instance.d.ts","sourceRoot":"","sources":["../../src/host/instance.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAExC,MAAM,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;AAC9C,MAAM,MAAM,OAAO,CAAC,CAAC,SAAS,SAAS,IAAI,OAAO,CAAC,aAAa,EAAE;IAAE,IAAI,EAAE,CAAC,CAAA;CAAE,CAAC,CAAC;AAC/E;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG;KAAG,CAAC,IAAI,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI;CAAE,GAAG;IAAE,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAA;CAAE,CAAC;AAE3H,sDAAsD;AACtD,MAAM,MAAM,cAAc,GAAG,OAAO,CAAC,aAAa,EAAE;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEpE;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,OAAO,GAAG,MAAM,CAAC;AAEzD;;;;GAIG;AACH,eAAO,MAAM,SAAS,UAAU,CAAC;AACjC;;;;GAIG;AACH,eAAO,MAAM,UAAU,WAAW,CAAC;AAEnC,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,EAAE,CAAC,EAAE,aAAa,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,0EAA0E;IAC1E,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,EAAE,EAAE,aAAa,GAAG,SAAS,CAAC;IAC9B,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;IAChC,yEAAyE;IACzE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,wDAAwD;IACxD,MAAM,EAAE,OAAO,CAAC;IAChB,4DAA4D;IAC5D,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC/C,eAAe,EAAE,QAAQ,GAAG,IAAI,CAAC;IACjC,iBAAiB,EAAE,QAAQ,EAAE,CAAC;IAC9B,oFAAoF;IACpF,MAAM,EAAE,QAAQ,GAAG,IAAI,CAAC;IACxB,+HAA+H;IAC/H,KAAK,EAAE,OAAO,CAAC;IACf,kFAAkF;IAClF,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IACxB,8DAA8D;IAC9D,KAAK,EAAE,OAAO,CAAC;IACf,kGAAkG;IAClG,eAAe,EAAE,QAAQ,GAAG,IAAI,CAAC;IACjC,mGAAmG;IACnG,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wCAAwC;AACxC,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,CAAC,CAAC;IACN,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,iBAAiB,EAAE,QAAQ,EAAE,CAAC;IAC9B,MAAM,EAAE,IAAI,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC"}
|
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import Reconciler from 'react-reconciler';
|
|
6
6
|
import type { Instance } from './instance';
|
|
7
|
-
import type
|
|
7
|
+
import { type HostTree } from './tree';
|
|
8
8
|
export declare const reconciler: Reconciler.Reconciler<HostTree, Instance, never, never, never, Instance>;
|
|
9
9
|
//# sourceMappingURL=reconciler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reconciler.d.ts","sourceRoot":"","sources":["../../src/host/reconciler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAE1C,OAAO,KAAK,EAAa,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"reconciler.d.ts","sourceRoot":"","sources":["../../src/host/reconciler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAE1C,OAAO,KAAK,EAAa,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAA6B,KAAK,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAqJlE,eAAO,MAAM,UAAU,0EAAyB,CAAC"}
|
package/dist/host/tree.d.ts
CHANGED
|
@@ -4,9 +4,16 @@
|
|
|
4
4
|
* (preferences and hoists), diffs the result against what was emitted last
|
|
5
5
|
* time and produces one render pass: creates and updates, inserts (parents
|
|
6
6
|
* before children, as the Swift core orders them), removes, `commit`.
|
|
7
|
+
*
|
|
8
|
+
* The flush is incremental: every mutation the reconciler makes marks the
|
|
9
|
+
* instance and its ancestors stale (`markStale`), and a flush resolves and
|
|
10
|
+
* diffs only the stale subtrees, reusing each clean subtree's effective
|
|
11
|
+
* entry from the last flush, what it hoisted and the preferences it sent
|
|
12
|
+
* up replayed into the ancestors resolved again. A knob dragged in a tree
|
|
13
|
+
* of three thousand elements then costs the knob's path, not the tree.
|
|
7
14
|
*/
|
|
8
15
|
import type { Animation, Op, RendererEvent } from '@swiftbrowser/web/src/protocol';
|
|
9
|
-
import { type HostProps, type Instance, type RootNode } from './instance';
|
|
16
|
+
import { type HoistTarget, type HostProps, type Instance, type RootNode, type TreeNode } from './instance';
|
|
10
17
|
export type OpsSink = (ops: Op[]) => void;
|
|
11
18
|
export interface HostTreeOptions {
|
|
12
19
|
/**
|
|
@@ -18,6 +25,40 @@ export interface HostTreeOptions {
|
|
|
18
25
|
*/
|
|
19
26
|
remote?: boolean;
|
|
20
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* What a subtree sends past its top to the ancestors that take it: a
|
|
30
|
+
* preference's props for the nearest element of its target kind, or an
|
|
31
|
+
* element hoisted after that target's own children. Kept with the subtree's
|
|
32
|
+
* entry and replayed when the subtree is reused, resolved against the
|
|
33
|
+
* ancestors it then has.
|
|
34
|
+
*/
|
|
35
|
+
type Contribution = {
|
|
36
|
+
kind: 'pref';
|
|
37
|
+
target: HoistTarget | undefined;
|
|
38
|
+
props: Record<string, unknown>;
|
|
39
|
+
} | {
|
|
40
|
+
kind: 'hoist';
|
|
41
|
+
target: HoistTarget | undefined;
|
|
42
|
+
node: Instance;
|
|
43
|
+
};
|
|
44
|
+
/** An element as emitted: its props with the preferences merged in, its children (own, then hoisted), what left it. */
|
|
45
|
+
export interface Effective {
|
|
46
|
+
/** The props as sent: the element's own object until a preference or an inherited title mode writes, then a copy. */
|
|
47
|
+
props: Record<string, unknown>;
|
|
48
|
+
/** The props before the title mode inherited from the screen below (a stack's screens), to derive it from again. */
|
|
49
|
+
base: Record<string, unknown>;
|
|
50
|
+
children: Instance[];
|
|
51
|
+
/** Children hoisted here from inside the subtree, appended after `children` once the whole tree is visited. */
|
|
52
|
+
hoisted: Instance[];
|
|
53
|
+
/** What this subtree sent to the ancestors above it, in visit order. */
|
|
54
|
+
escaping: Contribution[];
|
|
55
|
+
}
|
|
56
|
+
/** `node` changed (its props, its children, its visibility): it and every ancestor are resolved and diffed again at the next flush. */
|
|
57
|
+
export declare function markStale(node: TreeNode): void;
|
|
58
|
+
/** Puts `child` under `parent` at `index` (the end when absent), as the reconciler asks. */
|
|
59
|
+
export declare function attach(parent: TreeNode, child: Instance, index?: number): void;
|
|
60
|
+
/** Takes `child` out of `parent`, if it is there. */
|
|
61
|
+
export declare function detach(parent: TreeNode, child: Instance): void;
|
|
21
62
|
export declare class HostTree {
|
|
22
63
|
private readonly sink;
|
|
23
64
|
private readonly options;
|
|
@@ -25,9 +66,10 @@ export declare class HostTree {
|
|
|
25
66
|
private nextId;
|
|
26
67
|
/** Emitted elements by id, for event dispatch. */
|
|
27
68
|
private readonly live;
|
|
28
|
-
private committedLive;
|
|
29
69
|
/** Ids whose element changed kind: removed at the end of the next flush. */
|
|
30
70
|
private retired;
|
|
71
|
+
/** Which flush is under way; an instance resolved in it carries the number. */
|
|
72
|
+
private generation;
|
|
31
73
|
/** `withAnimation`: stamped on the next `commit`. */
|
|
32
74
|
pendingAnimation: Animation | undefined;
|
|
33
75
|
/** `withAnimation(_:completionCriteria:_:completion:)`: stamped on the next `commit` with its serial; the callback waits in `completions`. */
|
|
@@ -47,6 +89,8 @@ export declare class HostTree {
|
|
|
47
89
|
get remote(): boolean;
|
|
48
90
|
createInstance(props: HostProps): Instance;
|
|
49
91
|
updateInstance(instance: Instance, next: HostProps): void;
|
|
92
|
+
/** `node` is hidden or shown again (Suspense): it leaves or rejoins the emitted tree. */
|
|
93
|
+
setHidden(instance: Instance, hidden: boolean): void;
|
|
50
94
|
/** Emit the ops for everything that changed since the last commit. */
|
|
51
95
|
commit(): void;
|
|
52
96
|
flush(): Op[];
|
|
@@ -57,4 +101,5 @@ export declare class HostTree {
|
|
|
57
101
|
}
|
|
58
102
|
/** Structural equality of JSON-like values. */
|
|
59
103
|
export declare function deepEqual(a: unknown, b: unknown): boolean;
|
|
104
|
+
export {};
|
|
60
105
|
//# sourceMappingURL=tree.d.ts.map
|
package/dist/host/tree.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../../src/host/tree.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../../src/host/tree.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAY,EAAE,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC7F,OAAO,EAAyB,KAAK,WAAW,EAAE,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,KAAK,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAElI,MAAM,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,KAAK,IAAI,CAAC;AAE1C,MAAM,WAAW,eAAe;IAC9B;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;GAMG;AACH,KAAK,YAAY,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAE3K,uHAAuH;AACvH,MAAM,WAAW,SAAS;IACxB,qHAAqH;IACrH,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,oHAAoH;IACpH,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,+GAA+G;IAC/G,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,wEAAwE;IACxE,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAkCD,uIAAuI;AACvI,wBAAgB,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAE9C;AAED,4FAA4F;AAC5F,wBAAgB,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAM9E;AAED,qDAAqD;AACrD,wBAAgB,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,GAAG,IAAI,CAK9D;AAED,qBAAa,QAAQ;IAoBjB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IApB1B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAwG;IAC/H,OAAO,CAAC,MAAM,CAAK;IACnB,kDAAkD;IAClD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA+B;IACpD,4EAA4E;IAC5E,OAAO,CAAC,OAAO,CAAgB;IAC/B,+EAA+E;IAC/E,OAAO,CAAC,UAAU,CAAK;IACvB,qDAAqD;IACrD,gBAAgB,EAAE,SAAS,GAAG,SAAS,CAAC;IACxC,8IAA8I;IAC9I,iBAAiB,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,mBAAmB,GAAG,SAAS,CAAC;QAAC,QAAQ,EAAE,MAAM,IAAI,CAAC;QAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,SAAS,CAAC;IAC/I,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiC;IAC7D,8FAA8F;IAC9F,OAAO,CAAC,oBAAoB,CAAsC;IAClE,0CAA0C;IAC1C,OAAO,CAAC,kBAAkB,CAA+B;gBAGtC,IAAI,EAAE,OAAO,EACb,OAAO,GAAE,eAAoB;IAGhD,6GAA6G;IAC7G,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,QAAQ;IAsB1C,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI;IAqBzD,yFAAyF;IACzF,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI;IAKpD,sEAAsE;IACtE,MAAM,IAAI,IAAI;IAKd,KAAK,IAAI,EAAE,EAAE;IAyMb,qEAAqE;IACrE,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIzC,mEAAmE;IACnE,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;CAgBrC;AAED,+CAA+C;AAC/C,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAazD"}
|