@react-stately/layout 3.13.10-nightly.4674 → 3.13.10-nightly.4683
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/dist/ListLayout.main.js +33 -108
- package/dist/ListLayout.main.js.map +1 -1
- package/dist/ListLayout.mjs +33 -108
- package/dist/ListLayout.module.js +33 -108
- package/dist/ListLayout.module.js.map +1 -1
- package/dist/TableLayout.main.js +63 -99
- package/dist/TableLayout.main.js.map +1 -1
- package/dist/TableLayout.mjs +63 -99
- package/dist/TableLayout.module.js +63 -99
- package/dist/TableLayout.module.js.map +1 -1
- package/dist/main.js.map +1 -1
- package/dist/module.js.map +1 -1
- package/dist/types.d.ts +30 -70
- package/dist/types.d.ts.map +1 -1
- package/package.json +9 -9
- package/src/ListLayout.ts +59 -166
- package/src/TableLayout.ts +86 -130
- package/src/index.ts +2 -1
package/dist/types.d.ts
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import { Collection, DropTarget, DropTargetDelegate, Key,
|
|
2
|
-
import { InvalidationContext, Layout, LayoutInfo, Rect, Size
|
|
3
|
-
import { ColumnSize, TableCollection } from "@react-types/table";
|
|
1
|
+
import { Collection, DropTarget, DropTargetDelegate, Key, Node } from "@react-types/shared";
|
|
2
|
+
import { InvalidationContext, Layout, LayoutInfo, Rect, Size } from "@react-stately/virtualizer";
|
|
4
3
|
import { GridNode } from "@react-types/grid";
|
|
5
|
-
import {
|
|
4
|
+
import { TableCollection } from "@react-types/table";
|
|
6
5
|
export type ListLayoutOptions<T> = {
|
|
7
6
|
/** The height of a row in px. */
|
|
8
7
|
rowHeight?: number;
|
|
@@ -11,11 +10,10 @@ export type ListLayoutOptions<T> = {
|
|
|
11
10
|
estimatedHeadingHeight?: number;
|
|
12
11
|
padding?: number;
|
|
13
12
|
indentationForItem?: (collection: Collection<Node<T>>, key: Key) => number;
|
|
14
|
-
collator?: Intl.Collator;
|
|
15
13
|
loaderHeight?: number;
|
|
16
14
|
placeholderHeight?: number;
|
|
17
|
-
allowDisabledKeyFocus?: boolean;
|
|
18
15
|
forceSectionHeaders?: boolean;
|
|
16
|
+
enableEmptyState?: boolean;
|
|
19
17
|
};
|
|
20
18
|
export interface LayoutNode {
|
|
21
19
|
node?: Node<unknown>;
|
|
@@ -25,20 +23,20 @@ export interface LayoutNode {
|
|
|
25
23
|
validRect: Rect;
|
|
26
24
|
index?: number;
|
|
27
25
|
}
|
|
28
|
-
interface ListLayoutProps {
|
|
26
|
+
export interface ListLayoutProps {
|
|
29
27
|
isLoading?: boolean;
|
|
30
28
|
}
|
|
31
29
|
/**
|
|
32
|
-
* The ListLayout class is an implementation of a
|
|
30
|
+
* The ListLayout class is an implementation of a virtualizer {@link Layout}
|
|
33
31
|
* it is used for creating lists and lists with indented sub-lists.
|
|
34
32
|
*
|
|
35
33
|
* To configure a ListLayout, you can use the properties to define the
|
|
36
34
|
* layouts and/or use the method for defining indentation.
|
|
37
|
-
* The {@link ListKeyboardDelegate} extends the existing
|
|
35
|
+
* The {@link ListKeyboardDelegate} extends the existing virtualizer
|
|
38
36
|
* delegate with an additional method to do this (it uses the same delegate object as
|
|
39
|
-
* the
|
|
37
|
+
* the virtualizer itself).
|
|
40
38
|
*/
|
|
41
|
-
export class ListLayout<T> extends Layout<Node<T>, ListLayoutProps> implements
|
|
39
|
+
export class ListLayout<T> extends Layout<Node<T>, ListLayoutProps> implements DropTargetDelegate {
|
|
42
40
|
protected rowHeight: number;
|
|
43
41
|
protected estimatedRowHeight: number;
|
|
44
42
|
protected headingHeight: number;
|
|
@@ -49,19 +47,19 @@ export class ListLayout<T> extends Layout<Node<T>, ListLayoutProps> implements K
|
|
|
49
47
|
protected layoutInfos: Map<Key, LayoutInfo>;
|
|
50
48
|
protected layoutNodes: Map<Key, LayoutNode>;
|
|
51
49
|
protected contentSize: Size;
|
|
52
|
-
collection: Collection<Node<T>>;
|
|
53
|
-
|
|
54
|
-
allowDisabledKeyFocus: boolean;
|
|
55
|
-
isLoading: boolean;
|
|
50
|
+
protected collection: Collection<Node<T>>;
|
|
51
|
+
protected isLoading: boolean;
|
|
56
52
|
protected lastWidth: number;
|
|
57
53
|
protected lastCollection: Collection<Node<T>>;
|
|
58
54
|
protected rootNodes: LayoutNode[];
|
|
59
|
-
protected collator: Intl.Collator;
|
|
60
55
|
protected invalidateEverything: boolean;
|
|
61
56
|
protected loaderHeight: number;
|
|
62
57
|
protected placeholderHeight: number;
|
|
63
|
-
protected
|
|
58
|
+
protected enableEmptyState: boolean;
|
|
59
|
+
/** The rectangle containing currently valid layout infos. */
|
|
64
60
|
protected validRect: Rect;
|
|
61
|
+
/** The rectangle of requested layout infos so far. */
|
|
62
|
+
protected requestedRect: Rect;
|
|
65
63
|
/**
|
|
66
64
|
* Creates a new ListLayout with options. See the list of properties below for a description
|
|
67
65
|
* of the options that can be provided.
|
|
@@ -69,75 +67,37 @@ export class ListLayout<T> extends Layout<Node<T>, ListLayoutProps> implements K
|
|
|
69
67
|
constructor(options?: ListLayoutOptions<T>);
|
|
70
68
|
getLayoutInfo(key: Key): LayoutInfo;
|
|
71
69
|
getVisibleLayoutInfos(rect: Rect): LayoutInfo[];
|
|
72
|
-
layoutIfNeeded(rect: Rect): void;
|
|
73
|
-
ensureLayoutInfo(key: Key): boolean;
|
|
74
|
-
isVisible(node: LayoutNode, rect: Rect): boolean;
|
|
70
|
+
protected layoutIfNeeded(rect: Rect): void;
|
|
75
71
|
protected shouldInvalidateEverything(invalidationContext: InvalidationContext<ListLayoutProps>): boolean;
|
|
76
72
|
validate(invalidationContext: InvalidationContext<ListLayoutProps>): void;
|
|
77
|
-
buildCollection(): LayoutNode[];
|
|
78
|
-
isValid(node: Node<T>, y: number): boolean;
|
|
79
|
-
buildChild(node: Node<T>, x: number, y: number): LayoutNode;
|
|
80
|
-
buildNode(node: Node<T>, x: number, y: number): LayoutNode;
|
|
81
|
-
buildSection(node: Node<T>, x: number, y: number): LayoutNode;
|
|
82
|
-
buildHeader(node: Node<T>, x: number, y: number): LayoutNode;
|
|
83
|
-
buildItem(node: Node<T>, x: number, y: number): LayoutNode;
|
|
73
|
+
protected buildCollection(): LayoutNode[];
|
|
74
|
+
protected isValid(node: Node<T>, y: number): boolean;
|
|
75
|
+
protected buildChild(node: Node<T>, x: number, y: number, parentKey: Key | null): LayoutNode;
|
|
76
|
+
protected buildNode(node: Node<T>, x: number, y: number): LayoutNode;
|
|
84
77
|
updateItemSize(key: Key, size: Size): boolean;
|
|
85
|
-
updateLayoutNode(key: Key, oldLayoutInfo: LayoutInfo, newLayoutInfo: LayoutInfo): void;
|
|
86
78
|
getContentSize(): Size;
|
|
87
|
-
getKeyAbove(key: Key): Key | null;
|
|
88
|
-
getKeyBelow(key: Key): Key | null;
|
|
89
|
-
getKeyPageAbove(key: Key): Key | null;
|
|
90
|
-
getKeyPageBelow(key: Key): Key | null;
|
|
91
|
-
getFirstKey(): Key | null;
|
|
92
|
-
getLastKey(): Key | null;
|
|
93
|
-
getKeyForSearch(search: string, fromKey?: Key): Key | null;
|
|
94
79
|
getDropTargetFromPoint(x: number, y: number, isValidDropTarget: (target: DropTarget) => boolean): DropTarget;
|
|
95
80
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
81
|
+
export interface TableLayoutOptions<T> extends ListLayoutOptions<T> {
|
|
82
|
+
scrollContainer?: 'table' | 'body';
|
|
83
|
+
}
|
|
84
|
+
export interface TableLayoutProps extends ListLayoutProps {
|
|
85
|
+
columnWidths?: Map<Key, number>;
|
|
86
|
+
}
|
|
100
87
|
export class TableLayout<T> extends ListLayout<T> {
|
|
101
88
|
collection: TableCollection<T>;
|
|
102
89
|
lastCollection: TableCollection<T>;
|
|
103
90
|
columnWidths: Map<Key, number>;
|
|
104
91
|
stickyColumnIndices: number[];
|
|
105
|
-
wasLoading: boolean;
|
|
106
92
|
isLoading: boolean;
|
|
107
93
|
lastPersistedKeys: Set<Key>;
|
|
108
94
|
persistedIndices: Map<Key, number[]>;
|
|
109
|
-
|
|
110
|
-
controlledColumns: Map<Key, GridNode<unknown>>;
|
|
111
|
-
uncontrolledColumns: Map<Key, GridNode<unknown>>;
|
|
112
|
-
uncontrolledWidths: Map<Key, ColumnSize>;
|
|
113
|
-
resizingColumn: Key | null;
|
|
95
|
+
scrollContainer: 'table' | 'body';
|
|
114
96
|
constructor(options: TableLayoutOptions<T>);
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
getColumnMinWidth(key: Key): number;
|
|
119
|
-
getColumnMaxWidth(key: Key): number;
|
|
120
|
-
startResize(key: Key): void;
|
|
121
|
-
updateResizedColumns(key: Key, width: number): Map<Key, ColumnSize>;
|
|
122
|
-
endResize(): void;
|
|
123
|
-
buildCollection(): LayoutNode[];
|
|
124
|
-
buildHeader(): LayoutNode;
|
|
125
|
-
buildHeaderRow(headerRow: GridNode<T>, x: number, y: number): LayoutNode;
|
|
126
|
-
setChildHeights(children: LayoutNode[], height: number): void;
|
|
127
|
-
getRenderedColumnWidth(node: GridNode<T>): number;
|
|
128
|
-
getEstimatedHeight(node: GridNode<T>, width: number, height: number, estimatedHeight: number): {
|
|
129
|
-
height: number;
|
|
130
|
-
isEstimated: boolean;
|
|
131
|
-
};
|
|
132
|
-
buildColumn(node: GridNode<T>, x: number, y: number): LayoutNode;
|
|
133
|
-
buildBody(y: number): LayoutNode;
|
|
134
|
-
buildNode(node: GridNode<T>, x: number, y: number): LayoutNode;
|
|
135
|
-
buildRow(node: GridNode<T>, x: number, y: number): LayoutNode;
|
|
136
|
-
buildCell(node: GridNode<T>, x: number, y: number): LayoutNode;
|
|
97
|
+
validate(invalidationContext: InvalidationContext<TableLayoutProps>): void;
|
|
98
|
+
protected buildCollection(): LayoutNode[];
|
|
99
|
+
protected buildNode(node: GridNode<T>, x: number, y: number): LayoutNode;
|
|
137
100
|
getVisibleLayoutInfos(rect: Rect): LayoutInfo[];
|
|
138
|
-
addVisibleLayoutInfos(res: LayoutInfo[], node: LayoutNode, rect: Rect): void;
|
|
139
|
-
binarySearch(items: LayoutNode[], point: Point, axis: 'x' | 'y'): number;
|
|
140
|
-
buildPersistedIndices(): void;
|
|
141
101
|
getDropTargetFromPoint(x: number, y: number, isValidDropTarget: (target: DropTarget) => boolean): DropTarget;
|
|
142
102
|
}
|
|
143
103
|
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"
|
|
1
|
+
{"mappings":"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","sources":["packages/@react-stately/layout/src/packages/@react-stately/layout/src/ListLayout.ts","packages/@react-stately/layout/src/packages/@react-stately/layout/src/TableLayout.ts","packages/@react-stately/layout/src/packages/@react-stately/layout/src/index.ts","packages/@react-stately/layout/src/index.ts"],"sourcesContent":[null,null,null,"/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nexport type {ListLayoutOptions, ListLayoutProps, LayoutNode} from './ListLayout';\nexport type {TableLayoutOptions, TableLayoutProps} from './TableLayout';\nexport {ListLayout} from './ListLayout';\nexport {TableLayout} from './TableLayout';\n"],"names":[],"version":3,"file":"types.d.ts.map"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@react-stately/layout",
|
|
3
|
-
"version": "3.13.10-nightly.
|
|
3
|
+
"version": "3.13.10-nightly.4683+4e3af379e",
|
|
4
4
|
"description": "Spectrum UI components in React",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"main": "dist/main.js",
|
|
@@ -22,19 +22,19 @@
|
|
|
22
22
|
"url": "https://github.com/adobe/react-spectrum"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@react-stately/collections": "3.0.0-nightly.
|
|
26
|
-
"@react-stately/table": "3.11.9-nightly.
|
|
27
|
-
"@react-stately/virtualizer": "3.7.2-nightly.
|
|
28
|
-
"@react-types/grid": "3.2.7-nightly.
|
|
29
|
-
"@react-types/shared": "3.0.0-nightly.
|
|
30
|
-
"@react-types/table": "3.9.6-nightly.
|
|
25
|
+
"@react-stately/collections": "3.0.0-nightly.2971+4e3af379e",
|
|
26
|
+
"@react-stately/table": "3.11.9-nightly.4683+4e3af379e",
|
|
27
|
+
"@react-stately/virtualizer": "3.7.2-nightly.4683+4e3af379e",
|
|
28
|
+
"@react-types/grid": "3.2.7-nightly.4683+4e3af379e",
|
|
29
|
+
"@react-types/shared": "3.0.0-nightly.2971+4e3af379e",
|
|
30
|
+
"@react-types/table": "3.9.6-nightly.4683+4e3af379e",
|
|
31
31
|
"@swc/helpers": "^0.5.0"
|
|
32
32
|
},
|
|
33
33
|
"peerDependencies": {
|
|
34
|
-
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
|
|
34
|
+
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0"
|
|
35
35
|
},
|
|
36
36
|
"publishConfig": {
|
|
37
37
|
"access": "public"
|
|
38
38
|
},
|
|
39
|
-
"gitHead": "
|
|
39
|
+
"gitHead": "4e3af379e569faac3b374e0ed5a98b2a19cd92c3"
|
|
40
40
|
}
|