@cloudscape-design/board-components 3.0.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.
Files changed (220) hide show
  1. package/Config +23 -0
  2. package/LICENSE +201 -0
  3. package/NOTICE +2 -0
  4. package/README-cloudscape.md +20 -0
  5. package/README-open-source.md +0 -0
  6. package/README.md +20 -0
  7. package/board/index.d.ts +4 -0
  8. package/board/index.js +11 -0
  9. package/board/interfaces.d.ts +167 -0
  10. package/board/interfaces.js +1 -0
  11. package/board/internal.d.ts +4 -0
  12. package/board/internal.js +199 -0
  13. package/board/placeholder.d.ts +10 -0
  14. package/board/placeholder.js +24 -0
  15. package/board/styles.css.js +10 -0
  16. package/board/styles.scoped.css +23 -0
  17. package/board/styles.selectors.js +11 -0
  18. package/board/transition.d.ts +50 -0
  19. package/board/transition.js +211 -0
  20. package/board/utils/announcements.d.ts +10 -0
  21. package/board/utils/announcements.js +98 -0
  22. package/board/utils/create-transforms.d.ts +7 -0
  23. package/board/utils/create-transforms.js +22 -0
  24. package/board/utils/events.d.ts +3 -0
  25. package/board/utils/events.js +14 -0
  26. package/board/utils/get-hovered-rect.d.ts +10 -0
  27. package/board/utils/get-hovered-rect.js +19 -0
  28. package/board/utils/layout.d.ts +19 -0
  29. package/board/utils/layout.js +77 -0
  30. package/board/utils/path.d.ts +10 -0
  31. package/board/utils/path.js +73 -0
  32. package/board-item/header.d.ts +7 -0
  33. package/board-item/header.js +8 -0
  34. package/board-item/index.d.ts +4 -0
  35. package/board-item/index.js +11 -0
  36. package/board-item/interfaces.d.ts +42 -0
  37. package/board-item/interfaces.js +1 -0
  38. package/board-item/internal.d.ts +4 -0
  39. package/board-item/internal.js +20 -0
  40. package/board-item/styles.css.js +15 -0
  41. package/board-item/styles.scoped.css +41 -0
  42. package/board-item/styles.selectors.js +16 -0
  43. package/index.d.ts +6 -0
  44. package/index.js +5 -0
  45. package/internal/api-docs/components/board-item.js +68 -0
  46. package/internal/api-docs/components/board.js +117 -0
  47. package/internal/api-docs/components/index.js +5 -0
  48. package/internal/api-docs/components/items-palette.js +58 -0
  49. package/internal/api-docs/test-utils-doc/dom.js +4 -0
  50. package/internal/api-docs/test-utils-doc/selectors.js +4 -0
  51. package/internal/base-component/use-base-component.d.ts +12 -0
  52. package/internal/base-component/use-base-component.js +16 -0
  53. package/internal/base-component/use-telemetry.d.ts +1 -0
  54. package/internal/base-component/use-telemetry.js +9 -0
  55. package/internal/base-component/use-visual-refresh.d.ts +1 -0
  56. package/internal/base-component/use-visual-refresh.js +24 -0
  57. package/internal/breakpoints.d.ts +2 -0
  58. package/internal/breakpoints.js +18 -0
  59. package/internal/constants.d.ts +3 -0
  60. package/internal/constants.js +5 -0
  61. package/internal/debug-tools/converters.d.ts +4 -0
  62. package/internal/debug-tools/converters.js +21 -0
  63. package/internal/debug-tools/generators.d.ts +25 -0
  64. package/internal/debug-tools/generators.js +258 -0
  65. package/internal/debug-tools/index.d.ts +8 -0
  66. package/internal/debug-tools/index.js +10 -0
  67. package/internal/debug-tools/interfaces.d.ts +2 -0
  68. package/internal/debug-tools/interfaces.js +3 -0
  69. package/internal/debug-tools/parsers.d.ts +8 -0
  70. package/internal/debug-tools/parsers.js +66 -0
  71. package/internal/dnd-controller/__mocks__/controller.d.ts +13 -0
  72. package/internal/dnd-controller/__mocks__/controller.js +33 -0
  73. package/internal/dnd-controller/collision.d.ts +17 -0
  74. package/internal/dnd-controller/collision.js +32 -0
  75. package/internal/dnd-controller/controller.d.ts +64 -0
  76. package/internal/dnd-controller/controller.js +131 -0
  77. package/internal/dnd-controller/event-emitter.d.ts +9 -0
  78. package/internal/dnd-controller/event-emitter.js +22 -0
  79. package/internal/drag-handle/icon.d.ts +4 -0
  80. package/internal/drag-handle/icon.js +12 -0
  81. package/internal/drag-handle/index.d.ts +9 -0
  82. package/internal/drag-handle/index.js +11 -0
  83. package/internal/drag-handle/styles.css.js +6 -0
  84. package/internal/drag-handle/styles.scoped.css +7 -0
  85. package/internal/drag-handle/styles.selectors.js +7 -0
  86. package/internal/environment.d.ts +4 -0
  87. package/internal/environment.js +4 -0
  88. package/internal/generated/styles/tokens.d.ts +0 -0
  89. package/internal/generated/styles/tokens.js +0 -0
  90. package/internal/grid/grid.d.ts +3 -0
  91. package/internal/grid/grid.js +28 -0
  92. package/internal/grid/index.d.ts +2 -0
  93. package/internal/grid/index.js +3 -0
  94. package/internal/grid/interfaces.d.ts +14 -0
  95. package/internal/grid/interfaces.js +3 -0
  96. package/internal/grid/item.d.ts +8 -0
  97. package/internal/grid/item.js +10 -0
  98. package/internal/grid/styles.css.js +7 -0
  99. package/internal/grid/styles.scoped.css +221 -0
  100. package/internal/grid/styles.selectors.js +8 -0
  101. package/internal/handle/index.d.ts +3 -0
  102. package/internal/handle/index.js +17 -0
  103. package/internal/handle/styles.css.js +6 -0
  104. package/internal/handle/styles.scoped.css +32 -0
  105. package/internal/handle/styles.selectors.js +7 -0
  106. package/internal/interfaces.d.ts +50 -0
  107. package/internal/interfaces.js +3 -0
  108. package/internal/is-development.d.ts +6 -0
  109. package/internal/is-development.js +8 -0
  110. package/internal/item-container/get-next-droppable.d.ts +7 -0
  111. package/internal/item-container/get-next-droppable.js +15 -0
  112. package/internal/item-container/index.d.ts +48 -0
  113. package/internal/item-container/index.js +262 -0
  114. package/internal/item-container/styles.css.js +12 -0
  115. package/internal/item-container/styles.scoped.css +33 -0
  116. package/internal/item-container/styles.selectors.js +13 -0
  117. package/internal/layout-engine/engine-conflicts.d.ts +4 -0
  118. package/internal/layout-engine/engine-conflicts.js +53 -0
  119. package/internal/layout-engine/engine-step.d.ts +5 -0
  120. package/internal/layout-engine/engine-step.js +307 -0
  121. package/internal/layout-engine/engine.d.ts +19 -0
  122. package/internal/layout-engine/engine.js +105 -0
  123. package/internal/layout-engine/grid.d.ts +28 -0
  124. package/internal/layout-engine/grid.js +140 -0
  125. package/internal/layout-engine/interfaces.d.ts +30 -0
  126. package/internal/layout-engine/interfaces.js +3 -0
  127. package/internal/layout-engine/utils.d.ts +12 -0
  128. package/internal/layout-engine/utils.js +79 -0
  129. package/internal/live-region/index.d.ts +44 -0
  130. package/internal/live-region/index.js +85 -0
  131. package/internal/logging.d.ts +1 -0
  132. package/internal/logging.js +10 -0
  133. package/internal/manifest.json +3 -0
  134. package/internal/resize-handle/icon.d.ts +4 -0
  135. package/internal/resize-handle/icon.js +12 -0
  136. package/internal/resize-handle/index.d.ts +8 -0
  137. package/internal/resize-handle/index.js +7 -0
  138. package/internal/resize-handle/styles.css.js +6 -0
  139. package/internal/resize-handle/styles.scoped.css +3 -0
  140. package/internal/resize-handle/styles.selectors.js +7 -0
  141. package/internal/screenreader-grid-navigation/index.d.ts +22 -0
  142. package/internal/screenreader-grid-navigation/index.js +42 -0
  143. package/internal/screenreader-grid-navigation/styles.css.js +7 -0
  144. package/internal/screenreader-grid-navigation/styles.scoped.css +12 -0
  145. package/internal/screenreader-grid-navigation/styles.selectors.js +8 -0
  146. package/internal/screenreader-only/index.d.ts +21 -0
  147. package/internal/screenreader-only/index.js +23 -0
  148. package/internal/screenreader-only/styles.css.js +6 -0
  149. package/internal/screenreader-only/styles.scoped.css +9 -0
  150. package/internal/screenreader-only/styles.selectors.js +7 -0
  151. package/internal/utils/apply-display-name.d.ts +1 -0
  152. package/internal/utils/apply-display-name.js +5 -0
  153. package/internal/utils/coordinates.d.ts +14 -0
  154. package/internal/utils/coordinates.js +20 -0
  155. package/internal/utils/events.d.ts +2 -0
  156. package/internal/utils/events.js +18 -0
  157. package/internal/utils/layout.d.ts +18 -0
  158. package/internal/utils/layout.js +132 -0
  159. package/internal/utils/position.d.ts +9 -0
  160. package/internal/utils/position.js +9 -0
  161. package/internal/utils/rects.d.ts +6 -0
  162. package/internal/utils/rects.js +76 -0
  163. package/internal/utils/screen.d.ts +1 -0
  164. package/internal/utils/screen.js +17 -0
  165. package/internal/utils/stack-set.d.ts +8 -0
  166. package/internal/utils/stack-set.js +23 -0
  167. package/internal/utils/throttle.d.ts +5 -0
  168. package/internal/utils/throttle.js +51 -0
  169. package/internal/utils/use-auto-scroll.d.ts +5 -0
  170. package/internal/utils/use-auto-scroll.js +62 -0
  171. package/internal/utils/use-last-interaction.d.ts +1 -0
  172. package/internal/utils/use-last-interaction.js +22 -0
  173. package/internal/utils/use-merge-refs.d.ts +9 -0
  174. package/internal/utils/use-merge-refs.js +29 -0
  175. package/internal/utils/use-stable-event-handler.d.ts +9 -0
  176. package/internal/utils/use-stable-event-handler.js +19 -0
  177. package/internal/utils/use-throttled-event-handler.d.ts +1 -0
  178. package/internal/utils/use-throttled-event-handler.js +11 -0
  179. package/internal/utils/zip-arrays.d.ts +1 -0
  180. package/internal/utils/zip-arrays.js +8 -0
  181. package/items-palette/index.d.ts +4 -0
  182. package/items-palette/index.js +11 -0
  183. package/items-palette/interfaces.d.ts +49 -0
  184. package/items-palette/interfaces.js +3 -0
  185. package/items-palette/internal.d.ts +4 -0
  186. package/items-palette/internal.js +73 -0
  187. package/items-palette/styles.css.js +6 -0
  188. package/items-palette/styles.scoped.css +3 -0
  189. package/items-palette/styles.selectors.js +7 -0
  190. package/package.json +43 -0
  191. package/test-utils/dom/board/index.d.ts +6 -0
  192. package/test-utils/dom/board/index.js +15 -0
  193. package/test-utils/dom/board/index.js.map +1 -0
  194. package/test-utils/dom/board-item/index.d.ts +10 -0
  195. package/test-utils/dom/board-item/index.js +33 -0
  196. package/test-utils/dom/board-item/index.js.map +1 -0
  197. package/test-utils/dom/index.d.ts +19 -0
  198. package/test-utils/dom/index.js +41 -0
  199. package/test-utils/dom/index.js.map +1 -0
  200. package/test-utils/dom/items-palette/index.d.ts +7 -0
  201. package/test-utils/dom/items-palette/index.js +18 -0
  202. package/test-utils/dom/items-palette/index.js.map +1 -0
  203. package/test-utils/dom/palette-item/index.d.ts +5 -0
  204. package/test-utils/dom/palette-item/index.js +15 -0
  205. package/test-utils/dom/palette-item/index.js.map +1 -0
  206. package/test-utils/selectors/board/index.d.ts +6 -0
  207. package/test-utils/selectors/board/index.js +15 -0
  208. package/test-utils/selectors/board/index.js.map +1 -0
  209. package/test-utils/selectors/board-item/index.d.ts +10 -0
  210. package/test-utils/selectors/board-item/index.js +33 -0
  211. package/test-utils/selectors/board-item/index.js.map +1 -0
  212. package/test-utils/selectors/index.d.ts +19 -0
  213. package/test-utils/selectors/index.js +41 -0
  214. package/test-utils/selectors/index.js.map +1 -0
  215. package/test-utils/selectors/items-palette/index.d.ts +7 -0
  216. package/test-utils/selectors/items-palette/index.js +18 -0
  217. package/test-utils/selectors/items-palette/index.js.map +1 -0
  218. package/test-utils/selectors/palette-item/index.d.ts +5 -0
  219. package/test-utils/selectors/palette-item/index.js +15 -0
  220. package/test-utils/selectors/palette-item/index.js.map +1 -0
@@ -0,0 +1,132 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { MIN_COL_SPAN, MIN_ROW_SPAN } from "../constants";
4
+ /**
5
+ * The function produces grid layout from board items and given number of columns.
6
+ * The positional data is taken from the items when available or the default placement is used otherwise.
7
+ */
8
+ export function interpretItems(items, columns) {
9
+ const layoutItems = [];
10
+ const columnHeights = Array(columns).fill(0);
11
+ function getColumnSpan(item) {
12
+ var _a;
13
+ const minColumnSpan = getMinColumnSpan(item, columns);
14
+ const columnSpan = (_a = item.columnSpan) !== null && _a !== void 0 ? _a : getDefaultColumnSpan(item, columns);
15
+ return Math.min(columns, Math.max(minColumnSpan, columnSpan));
16
+ }
17
+ function getRowSpan(item) {
18
+ var _a;
19
+ const minRowSpan = getMinRowSpan(item);
20
+ const rowSpan = (_a = item.rowSpan) !== null && _a !== void 0 ? _a : getDefaultRowSpan(item);
21
+ return Math.max(minRowSpan, rowSpan);
22
+ }
23
+ function getColumnOffset(item, currentOffset) {
24
+ var _a, _b;
25
+ const columnSpan = getColumnSpan(item);
26
+ const rowSpan = getRowSpan(item);
27
+ const columnOffset = (_b = (_a = item.columnOffset) === null || _a === void 0 ? void 0 : _a[columns]) !== null && _b !== void 0 ? _b : findOptimalColumnOffset(currentOffset, columnSpan, rowSpan);
28
+ return columnOffset + columnSpan <= columns ? columnOffset : 0;
29
+ }
30
+ function findOptimalColumnOffset(currentColumnOffset, columnSpan, rowSpan) {
31
+ for (let colOffset = currentColumnOffset; colOffset + columnSpan <= columns; colOffset++) {
32
+ if (getRowOffset(colOffset, columnSpan) + rowSpan <= getRowOffset(0, columns)) {
33
+ return colOffset;
34
+ }
35
+ }
36
+ for (let colOffset = 0; colOffset + columnSpan <= columns; colOffset++) {
37
+ if (getRowOffset(colOffset, columnSpan) + rowSpan <= getRowOffset(0, columns)) {
38
+ return colOffset;
39
+ }
40
+ }
41
+ return currentColumnOffset;
42
+ }
43
+ function getRowOffset(columnOffset, columnSpan) {
44
+ let rowOffset = 0;
45
+ for (let col = columnOffset; col < columnOffset + columnSpan; col++) {
46
+ rowOffset = Math.max(rowOffset, columnHeights[col]);
47
+ }
48
+ return rowOffset;
49
+ }
50
+ for (let index = 0, columnOffset = 0, rowOffset = 0; index < items.length; index++, rowOffset = 0) {
51
+ const columnSpan = getColumnSpan(items[index]);
52
+ const rowSpan = getRowSpan(items[index]);
53
+ columnOffset = getColumnOffset(items[index], columnOffset);
54
+ rowOffset = getRowOffset(columnOffset, columnSpan);
55
+ layoutItems.push({ id: items[index].id, width: columnSpan, height: rowSpan, x: columnOffset, y: rowOffset });
56
+ for (let col = columnOffset; col < columnOffset + columnSpan; col++) {
57
+ columnHeights[col] = rowOffset + rowSpan;
58
+ }
59
+ columnOffset += columnSpan;
60
+ }
61
+ layoutItems.sort(itemComparator);
62
+ return { items: layoutItems, columns, rows: getRowOffset(0, columns) };
63
+ }
64
+ /**
65
+ * The function produces new items from the current state and updated grid layout.
66
+ * The positional data for the given number of columns is preserved as is while the other layouts are partially invalidated.
67
+ */
68
+ export function transformItems(sourceItems, gridLayout, resizeTarget) {
69
+ const itemById = new Map(sourceItems.map((item) => [item.id, item]));
70
+ const getItem = (itemId) => {
71
+ const item = itemById.get(itemId);
72
+ if (!item) {
73
+ throw new Error("Invariant violation: no matching source item found.");
74
+ }
75
+ return item;
76
+ };
77
+ const sortedLayout = gridLayout.items.slice().sort(itemComparator);
78
+ const items = [];
79
+ let changeFromIndex = sortedLayout.findIndex(({ id }, index) => id !== sourceItems[index].id || id === resizeTarget);
80
+ changeFromIndex = changeFromIndex !== -1 ? changeFromIndex : sortedLayout.length;
81
+ function setColumnOffset(item, layout, value) {
82
+ if (!item.columnOffset) {
83
+ item.columnOffset = {};
84
+ }
85
+ item.columnOffset[layout] = value;
86
+ }
87
+ for (let index = 0; index < sortedLayout.length; index++) {
88
+ const { id, x, width, height } = sortedLayout[index];
89
+ const item = { ...getItem(id) };
90
+ if (index >= changeFromIndex) {
91
+ item.columnOffset = undefined;
92
+ }
93
+ setColumnOffset(item, gridLayout.columns, x);
94
+ if (item.id === resizeTarget) {
95
+ item.columnSpan = width;
96
+ item.rowSpan = height;
97
+ }
98
+ items.push(item);
99
+ }
100
+ return items;
101
+ }
102
+ export function createPlaceholdersLayout(rows, columns) {
103
+ const layoutItems = [];
104
+ for (let row = 0; row < rows; row++) {
105
+ for (let col = 0; col < columns; col++) {
106
+ layoutItems.push({ id: `awsui-placeholder-${row}-${col}`, x: col, y: row, width: 1, height: 1 });
107
+ }
108
+ }
109
+ return { items: layoutItems, columns, rows };
110
+ }
111
+ export function getMinColumnSpan(item, columns) {
112
+ var _a, _b;
113
+ return Math.min(columns, Math.max(MIN_COL_SPAN, (_b = (_a = item.definition) === null || _a === void 0 ? void 0 : _a.minColumnSpan) !== null && _b !== void 0 ? _b : 0));
114
+ }
115
+ export function getDefaultColumnSpan(item, columns) {
116
+ var _a, _b;
117
+ return Math.min(columns, Math.max(getMinColumnSpan(item, columns), (_b = (_a = item.definition) === null || _a === void 0 ? void 0 : _a.defaultColumnSpan) !== null && _b !== void 0 ? _b : 0));
118
+ }
119
+ export function getMinRowSpan(item) {
120
+ var _a, _b;
121
+ return Math.max(MIN_ROW_SPAN, (_b = (_a = item.definition) === null || _a === void 0 ? void 0 : _a.minRowSpan) !== null && _b !== void 0 ? _b : 0);
122
+ }
123
+ export function getDefaultRowSpan(item) {
124
+ var _a, _b;
125
+ return Math.max(getMinRowSpan(item), (_b = (_a = item.definition) === null || _a === void 0 ? void 0 : _a.defaultRowSpan) !== null && _b !== void 0 ? _b : 0);
126
+ }
127
+ function itemComparator(a, b) {
128
+ if (a.y !== b.y) {
129
+ return a.y > b.y ? 1 : -1;
130
+ }
131
+ return a.x > b.x ? 1 : -1;
132
+ }
@@ -0,0 +1,9 @@
1
+ export declare class Position {
2
+ readonly __type = "Position";
3
+ readonly x: number;
4
+ readonly y: number;
5
+ constructor({ x, y }: {
6
+ x: number;
7
+ y: number;
8
+ });
9
+ }
@@ -0,0 +1,9 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ export class Position {
4
+ constructor({ x, y }) {
5
+ this.__type = "Position";
6
+ this.x = x;
7
+ this.y = y;
8
+ }
9
+ }
@@ -0,0 +1,6 @@
1
+ import { Direction, Rect } from "../interfaces";
2
+ export declare function isInside(rect: Rect, bounds: Rect): boolean;
3
+ export declare function isIntersecting(rect1: Rect, rect2: Rect): boolean;
4
+ export declare function getIntersectionArea(rect1: Rect, rect2: Rect): number;
5
+ export declare function getGridPlacement(target: Rect, grid: readonly Rect[]): Rect;
6
+ export declare function getClosestNeighbor(target: Rect, sources: readonly Rect[], direction: Direction): null | Rect;
@@ -0,0 +1,76 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ export function isInside(rect, bounds) {
4
+ return (rect.top >= bounds.top && rect.left >= bounds.left && rect.right <= bounds.right && rect.bottom <= bounds.bottom);
5
+ }
6
+ export function isIntersecting(rect1, rect2) {
7
+ return getIntersectionArea(rect1, rect2) > 0;
8
+ }
9
+ export function getIntersectionArea(rect1, rect2) {
10
+ let horizontalIntersectionLength = 0;
11
+ if (rect2.left <= rect1.left && rect1.left <= rect2.right) {
12
+ horizontalIntersectionLength = Math.min(rect1.right, rect2.right) - rect1.left;
13
+ }
14
+ else if (rect2.left <= rect1.right && rect1.right <= rect2.right) {
15
+ horizontalIntersectionLength = rect1.right - Math.max(rect1.left, rect2.left);
16
+ }
17
+ else if (rect1.left <= rect2.left && rect2.left <= rect1.right) {
18
+ horizontalIntersectionLength = Math.min(rect1.right, rect2.right) - rect2.left;
19
+ }
20
+ else if (rect1.left <= rect2.right && rect2.right <= rect1.right) {
21
+ horizontalIntersectionLength = rect2.right - Math.max(rect1.left, rect2.left);
22
+ }
23
+ let verticalIntersectionLength = 0;
24
+ if (rect2.top <= rect1.top && rect1.top <= rect2.bottom) {
25
+ verticalIntersectionLength = Math.min(rect1.bottom, rect2.bottom) - rect1.top;
26
+ }
27
+ else if (rect2.top <= rect1.bottom && rect1.bottom <= rect2.bottom) {
28
+ verticalIntersectionLength = rect1.bottom - Math.max(rect1.top, rect2.top);
29
+ }
30
+ else if (rect1.top <= rect2.top && rect2.top <= rect1.bottom) {
31
+ verticalIntersectionLength = Math.min(rect1.bottom, rect2.bottom) - rect2.top;
32
+ }
33
+ else if (rect1.top <= rect2.bottom && rect2.bottom <= rect1.bottom) {
34
+ verticalIntersectionLength = rect2.bottom - Math.max(rect1.top, rect2.top);
35
+ }
36
+ return horizontalIntersectionLength * verticalIntersectionLength;
37
+ }
38
+ export function getGridPlacement(target, grid) {
39
+ function getMinDistance(min, current, collision) {
40
+ const minDistance = Math.abs(min - collision);
41
+ const currentDistance = Math.abs(current - collision);
42
+ return currentDistance < minDistance ? current : min;
43
+ }
44
+ let placement = {
45
+ top: Number.POSITIVE_INFINITY,
46
+ left: Number.POSITIVE_INFINITY,
47
+ right: Number.POSITIVE_INFINITY,
48
+ bottom: Number.POSITIVE_INFINITY,
49
+ };
50
+ for (const rect of grid) {
51
+ if (isIntersecting(rect, target)) {
52
+ placement = {
53
+ top: getMinDistance(placement.top, rect.top, target.top),
54
+ left: getMinDistance(placement.left, rect.left, target.left),
55
+ right: getMinDistance(placement.right, rect.right, target.right),
56
+ bottom: getMinDistance(placement.bottom, rect.bottom, target.bottom),
57
+ };
58
+ }
59
+ }
60
+ return placement;
61
+ }
62
+ export function getClosestNeighbor(target, sources, direction) {
63
+ const getFirst = (rects) => { var _a; return (_a = rects[0]) !== null && _a !== void 0 ? _a : null; };
64
+ const verticalDiff = (r1, r2) => Math.abs(r1.top - target.top) - Math.abs(r2.top - target.top);
65
+ const horizontalDiff = (r1, r2) => Math.abs(r1.left - target.left) - Math.abs(r2.left - target.left);
66
+ switch (direction) {
67
+ case "left":
68
+ return getFirst(sources.filter((rect) => rect.right <= target.left).sort((r1, r2) => r2.left - r1.left || verticalDiff(r1, r2)));
69
+ case "right":
70
+ return getFirst(sources.filter((rect) => rect.left >= target.right).sort((r1, r2) => r1.left - r2.left || verticalDiff(r1, r2)));
71
+ case "up":
72
+ return getFirst(sources.filter((rect) => rect.bottom <= target.top).sort((r1, r2) => r2.top - r1.top || horizontalDiff(r1, r2)));
73
+ case "down":
74
+ return getFirst(sources.filter((rect) => rect.top >= target.bottom).sort((r1, r2) => r1.top - r2.top || horizontalDiff(r1, r2)));
75
+ }
76
+ }
@@ -0,0 +1 @@
1
+ export declare function getNormalizedElementRect(element: HTMLElement): DOMRect;
@@ -0,0 +1,17 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ export function getNormalizedElementRect(element) {
4
+ const { x, y, left, right, top, bottom, width, height } = element.getBoundingClientRect();
5
+ const xOffset = element.ownerDocument.defaultView.pageXOffset - window.scrollX;
6
+ const yOffset = element.ownerDocument.defaultView.pageYOffset - window.scrollY;
7
+ return {
8
+ x: x + xOffset,
9
+ left: left + xOffset,
10
+ right: right + xOffset,
11
+ y: y + yOffset,
12
+ top: top + yOffset,
13
+ bottom: bottom + yOffset,
14
+ width: width,
15
+ height: height,
16
+ };
17
+ }
@@ -0,0 +1,8 @@
1
+ export declare class StackSet<T> implements Iterable<T> {
2
+ private list;
3
+ private set;
4
+ constructor(input?: Iterable<T>);
5
+ push(value: T): void;
6
+ pop(): null | T;
7
+ [Symbol.iterator](): Iterator<T>;
8
+ }
@@ -0,0 +1,23 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ export class StackSet {
4
+ constructor(input = []) {
5
+ this.list = [...input];
6
+ this.set = new Set(this.list);
7
+ }
8
+ push(value) {
9
+ if (!this.set.has(value)) {
10
+ this.list.push(value);
11
+ this.set.add(value);
12
+ }
13
+ }
14
+ pop() {
15
+ var _a;
16
+ const value = (_a = this.list.pop()) !== null && _a !== void 0 ? _a : null;
17
+ value && this.set.delete(value);
18
+ return value;
19
+ }
20
+ [Symbol.iterator]() {
21
+ return this.list[Symbol.iterator]();
22
+ }
23
+ }
@@ -0,0 +1,5 @@
1
+ export interface ThrottledFunction<F extends (...args: any) => any> {
2
+ (...args: Parameters<F>): void;
3
+ cancel(): void;
4
+ }
5
+ export declare function throttle<F extends (...args: any) => any>(func: F, delay: number): ThrottledFunction<F>;
@@ -0,0 +1,51 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ export function throttle(func, delay) {
4
+ let pending = null;
5
+ let lastInvokeTime = null;
6
+ let timerId = null;
7
+ // Runs on every animation frame until timer stopped.
8
+ function pendingFunc() {
9
+ if (pending === null || lastInvokeTime === null) {
10
+ return;
11
+ }
12
+ const invokeTime = Date.now();
13
+ const shouldInvoke = invokeTime - lastInvokeTime >= delay;
14
+ if (shouldInvoke) {
15
+ func.apply(pending.this, pending.args);
16
+ lastInvokeTime = invokeTime;
17
+ pending = null;
18
+ timerId = null;
19
+ }
20
+ else {
21
+ startTimer();
22
+ }
23
+ }
24
+ function startTimer() {
25
+ if (timerId) {
26
+ cancelAnimationFrame(timerId);
27
+ }
28
+ timerId = requestAnimationFrame(pendingFunc);
29
+ }
30
+ // Decorated client function with delay mechanism.
31
+ function throttled(...args) {
32
+ if (lastInvokeTime === null) {
33
+ lastInvokeTime = Date.now();
34
+ func.apply(this, args);
35
+ }
36
+ else {
37
+ pending = { this: this, args };
38
+ startTimer();
39
+ }
40
+ }
41
+ // Prevents delayed function from execution when no longer needed.
42
+ throttled.cancel = () => {
43
+ if (timerId) {
44
+ cancelAnimationFrame(timerId);
45
+ }
46
+ pending = null;
47
+ lastInvokeTime = null;
48
+ timerId = null;
49
+ };
50
+ return throttled;
51
+ }
@@ -0,0 +1,5 @@
1
+ export declare function useAutoScroll(): {
2
+ addPointerEventHandlers: () => void;
3
+ removePointerEventHandlers: () => void;
4
+ scheduleActiveElementScrollIntoView: (delay: number) => void;
5
+ };
@@ -0,0 +1,62 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { useCallback, useEffect, useRef, useState } from "react";
4
+ import { useLastInteraction } from "./use-last-interaction";
5
+ export function useAutoScroll() {
6
+ const [activeAutoScroll, setActiveAutoScroll] = useState("none");
7
+ const scrollIntoViewTimerRef = useRef(null);
8
+ const getLastInteraction = useLastInteraction();
9
+ // Scroll window repeatedly if activeAutoScroll="up" or activeAutoScroll="down".
10
+ useEffect(() => {
11
+ if (activeAutoScroll === "none") {
12
+ return;
13
+ }
14
+ const direction = activeAutoScroll === "up" ? -1 : 1;
15
+ let timer;
16
+ function scrollLoop() {
17
+ timer = setTimeout(() => {
18
+ window.scrollBy({ top: direction * 5 });
19
+ scrollLoop();
20
+ }, 10);
21
+ }
22
+ scrollLoop();
23
+ return () => clearTimeout(timer);
24
+ }, [activeAutoScroll]);
25
+ const onPointerMove = useCallback((event) => {
26
+ const autoScrollMargin = 50;
27
+ if (event.clientY > window.innerHeight - autoScrollMargin) {
28
+ setActiveAutoScroll("down");
29
+ }
30
+ else if (event.clientY < autoScrollMargin) {
31
+ setActiveAutoScroll("up");
32
+ }
33
+ else {
34
+ setActiveAutoScroll("none");
35
+ }
36
+ }, []);
37
+ const onPointerUp = useCallback(() => {
38
+ setActiveAutoScroll("none");
39
+ }, []);
40
+ const addPointerEventHandlers = useCallback(() => {
41
+ if (getLastInteraction() === "pointer") {
42
+ window.addEventListener("pointermove", onPointerMove);
43
+ window.addEventListener("pointerup", onPointerUp);
44
+ }
45
+ }, [getLastInteraction, onPointerMove, onPointerUp]);
46
+ const removePointerEventHandlers = useCallback(() => {
47
+ window.removeEventListener("pointermove", onPointerMove);
48
+ window.removeEventListener("pointerup", onPointerUp);
49
+ }, [onPointerMove, onPointerUp]);
50
+ const scheduleActiveElementScrollIntoView = useCallback((delay) => {
51
+ scrollIntoViewTimerRef.current && clearTimeout(scrollIntoViewTimerRef.current);
52
+ const activeElementBeforeDelay = document.activeElement;
53
+ scrollIntoViewTimerRef.current = setTimeout(() => {
54
+ if (document.activeElement &&
55
+ document.activeElement === activeElementBeforeDelay &&
56
+ getLastInteraction() === "keyboard") {
57
+ document.activeElement.scrollIntoView({ behavior: "smooth", block: "nearest" });
58
+ }
59
+ }, delay);
60
+ }, [getLastInteraction]);
61
+ return { addPointerEventHandlers, removePointerEventHandlers, scheduleActiveElementScrollIntoView };
62
+ }
@@ -0,0 +1 @@
1
+ export declare function useLastInteraction(): () => "pointer" | "keyboard";
@@ -0,0 +1,22 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { useCallback, useEffect, useRef } from "react";
4
+ export function useLastInteraction() {
5
+ const lastInteractionRef = useRef("pointer");
6
+ useEffect(() => {
7
+ const onPointerDown = () => {
8
+ lastInteractionRef.current = "pointer";
9
+ };
10
+ const onKeyDown = () => {
11
+ lastInteractionRef.current = "keyboard";
12
+ };
13
+ window.addEventListener("pointerdown", onPointerDown);
14
+ window.addEventListener("keydown", onKeyDown);
15
+ return () => {
16
+ window.removeEventListener("pointerdown", onPointerDown);
17
+ window.removeEventListener("keydown", onKeyDown);
18
+ };
19
+ }, []);
20
+ const getLastEvent = useCallback(() => lastInteractionRef.current, []);
21
+ return getLastEvent;
22
+ }
@@ -0,0 +1,9 @@
1
+ import { MutableRefObject, RefCallback } from "react";
2
+ /**
3
+ * useMergeRefs merges multiple refs into a single ref callback.
4
+ *
5
+ * For example:
6
+ * const mergedRef = useMergeRefs(ref1, ref2, ref3)
7
+ * <div ref={refs}>...</div>
8
+ */
9
+ export declare function useMergeRefs(...refs: Array<RefCallback<any> | MutableRefObject<any> | null | undefined>): ((value: any) => void) | null;
@@ -0,0 +1,29 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { useMemo } from "react";
4
+ /**
5
+ * useMergeRefs merges multiple refs into a single ref callback.
6
+ *
7
+ * For example:
8
+ * const mergedRef = useMergeRefs(ref1, ref2, ref3)
9
+ * <div ref={refs}>...</div>
10
+ */
11
+ export function useMergeRefs(...refs) {
12
+ return useMemo(() => {
13
+ if (refs.every((ref) => ref === null || ref === undefined)) {
14
+ return null;
15
+ }
16
+ return (value) => {
17
+ refs.forEach((ref) => {
18
+ if (typeof ref === "function") {
19
+ ref(value);
20
+ }
21
+ else if (ref !== null && ref !== undefined) {
22
+ ref.current = value;
23
+ }
24
+ });
25
+ };
26
+ // ESLint expects an array literal which we can not provide here
27
+ // eslint-disable-next-line react-hooks/exhaustive-deps
28
+ }, refs);
29
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * A callback that stays stable between renders even as the dependencies change.
3
+ * Not a recommended React pattern, so it should be used sparingly and only if
4
+ * the callback is an event handler (i.e. not used during rendering) and causing
5
+ * clear performance issues.
6
+ *
7
+ * @see https://reactjs.org/docs/hooks-faq.html#how-to-read-an-often-changing-value-from-usecallback
8
+ */
9
+ export declare function useStableEventHandler<T extends (...args: any[]) => any>(fn: T): T;
@@ -0,0 +1,19 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { useCallback, useEffect, useRef } from "react";
4
+ // The code is copied from https://github.com/cloudscape-design/components/blob/main/src/internal/hooks/use-stable-event-handler/index.ts
5
+ /**
6
+ * A callback that stays stable between renders even as the dependencies change.
7
+ * Not a recommended React pattern, so it should be used sparingly and only if
8
+ * the callback is an event handler (i.e. not used during rendering) and causing
9
+ * clear performance issues.
10
+ *
11
+ * @see https://reactjs.org/docs/hooks-faq.html#how-to-read-an-often-changing-value-from-usecallback
12
+ */
13
+ export function useStableEventHandler(fn) {
14
+ const ref = useRef();
15
+ useEffect(() => {
16
+ ref.current = fn;
17
+ });
18
+ return useCallback((...args) => { var _a; return (_a = ref.current) === null || _a === void 0 ? void 0 : _a.apply(undefined, args); }, []);
19
+ }
@@ -0,0 +1 @@
1
+ export declare function useThrottledEventHandler<T extends (...args: any[]) => void>(callback: T, delay: number): import("./throttle").ThrottledFunction<T>;
@@ -0,0 +1,11 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { useCallback } from "react";
4
+ import { throttle } from "./throttle";
5
+ import { useStableEventHandler } from "./use-stable-event-handler";
6
+ export function useThrottledEventHandler(callback, delay) {
7
+ const stableCallback = useStableEventHandler(callback);
8
+ // ESLint rule requires an inline function which we cannot provide here
9
+ // eslint-disable-next-line react-hooks/exhaustive-deps
10
+ return useCallback(throttle(((...args) => stableCallback(...args)), delay), []);
11
+ }
@@ -0,0 +1 @@
1
+ export declare function zipTwoArrays<A, B>(a: readonly A[], b: readonly B[]): readonly [A, B][];
@@ -0,0 +1,8 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ export function zipTwoArrays(a, b) {
4
+ const longest = a.length >= b.length ? a : b;
5
+ return longest.map((_, idx) => {
6
+ return [a[idx], b[idx]];
7
+ });
8
+ }
@@ -0,0 +1,4 @@
1
+ /// <reference types="react" />
2
+ import type { ItemsPaletteProps } from "./interfaces";
3
+ export type { ItemsPaletteProps };
4
+ export default function ItemsPalette<DataType>(props: ItemsPaletteProps<DataType>): JSX.Element;
@@ -0,0 +1,11 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ import useBaseComponent from "../internal/base-component/use-base-component";
5
+ import { applyDisplayName } from "../internal/utils/apply-display-name";
6
+ import { InternalItemsPalette } from "./internal";
7
+ export default function ItemsPalette(props) {
8
+ const baseComponentProps = useBaseComponent("ItemsPalette");
9
+ return _jsx(InternalItemsPalette, { ...props, ...baseComponentProps });
10
+ }
11
+ applyDisplayName(ItemsPalette, "ItemsPalette");
@@ -0,0 +1,49 @@
1
+ /// <reference types="react" />
2
+ import { BoardItemDefinitionBase, DataFallbackType } from "../internal/interfaces";
3
+ export interface ItemsPaletteProps<D = DataFallbackType> {
4
+ /**
5
+ * Specifies the items displayed in the palette. The content of each item is controlled by the `renderItem` property.
6
+ *
7
+ * The ItemsPaletteProps.Item includes:
8
+ * * `id` (string) - the unique item identifier. The IDs of any two items in a page must be different.
9
+ * * `definition.minRowSpan` (number, optional) - the minimal number of rows the item is allowed to take. It can't be less than two. Defaults to two.
10
+ * * `definition.minColumnSpan` (number, optional) - the minimal number of columns the item is allowed to take (in a 4 column layout). It can't be less than one. Defaults to one.
11
+ * * `definition.defaultRowSpan` (number) - the number or rows the item will take when inserted to the board. It can't be less than `definition.minRowSpan`.
12
+ * * `definition.defaultColumnSpan` (number) - the number or columns the item will take (in a 4 column layout) when inserted to the board. It can't be less than `definition.minColumnSpan`.
13
+ * * `data` (D) - optional item data which can include the specific configurations of an item, such as its title.
14
+ */
15
+ items: ReadonlyArray<ItemsPaletteProps.Item<D>>;
16
+ /**
17
+ * Specifies a function to render content for a palette item. The return value must include board item component.
18
+ *
19
+ * The function takes the item and its associated context (ItemsPaletteProps.ItemContext) that include:
20
+ * * `showPreview` (boolean) - a flag that indicates if the item's content needs to be rendered in preview mode.
21
+ */
22
+ renderItem: (item: ItemsPaletteProps.Item<D>, context: ItemsPaletteProps.ItemContext) => JSX.Element;
23
+ /**
24
+ * An object containing all the necessary localized strings required by the component.
25
+ *
26
+ * Live announcements:
27
+ * * `liveAnnouncementDndStarted` (string) - live announcement string to indicate start of DnD.
28
+ * * `liveAnnouncementDndDiscarded` (string) - live announcement string to indicate discard of DnD.
29
+ *
30
+ * Navigation labels:
31
+ * * `navigationAriaLabel` (string) - the ARIA label for the accessible board navigation element.
32
+ * * `navigationAriaDescription` (string, optional) - the ARIA description for the accessible board navigation element.
33
+ * * `navigationItemAriaLabel(null | BoardProps.Item<D>): string` - the function to create the ARIA label for a navigation board item.
34
+ */
35
+ i18nStrings: ItemsPaletteProps.I18nStrings<D>;
36
+ }
37
+ export declare namespace ItemsPaletteProps {
38
+ type Item<D = DataFallbackType> = BoardItemDefinitionBase<D>;
39
+ interface ItemContext {
40
+ showPreview: boolean;
41
+ }
42
+ interface I18nStrings<D> {
43
+ liveAnnouncementDndStarted: string;
44
+ liveAnnouncementDndDiscarded: string;
45
+ navigationAriaLabel: string;
46
+ navigationAriaDescription?: string;
47
+ navigationItemAriaLabel: (item: ItemsPaletteProps.Item<D>) => string;
48
+ }
49
+ }
@@ -0,0 +1,3 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ export {};
@@ -0,0 +1,4 @@
1
+ /// <reference types="react" />
2
+ import { InternalBaseComponentProps } from "../internal/base-component/use-base-component";
3
+ import { ItemsPaletteProps } from "./interfaces";
4
+ export declare function InternalItemsPalette<D>({ items, renderItem, i18nStrings, __internalRootRef, }: ItemsPaletteProps<D> & InternalBaseComponentProps): JSX.Element;