@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,66 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { Position } from "../utils/position";
4
+ const LETTER_INDICES = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
5
+ export function fromMatrix(matrix) {
6
+ var _a, _b;
7
+ const items = [];
8
+ const added = new Set();
9
+ for (let y = 0; y < matrix.length; y++) {
10
+ for (let x = 0; x < matrix[y].length; x++) {
11
+ const ids = matrix[y][x].split("/").map((id) => id.trim());
12
+ for (const id of ids) {
13
+ if (id.trim().length === 0) {
14
+ continue;
15
+ }
16
+ if (!added.has(id)) {
17
+ const item = { id, y, x, width: 1, height: 1 };
18
+ for (let itemX = x + 1; itemX < matrix[y].length; itemX++) {
19
+ if (matrix[y][itemX] === id) {
20
+ x++;
21
+ item.width++;
22
+ }
23
+ else {
24
+ break;
25
+ }
26
+ }
27
+ for (let itemY = y + 1; itemY < matrix.length; itemY++) {
28
+ if (matrix[itemY][x] === id) {
29
+ item.height++;
30
+ }
31
+ else {
32
+ break;
33
+ }
34
+ }
35
+ items.push(item);
36
+ added.add(id);
37
+ }
38
+ }
39
+ }
40
+ }
41
+ return { items, columns: (_b = (_a = matrix[0]) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0, rows: matrix.length };
42
+ }
43
+ // Path is defined like "A1 A2 B2 C2" where A-C is a column index (A-based) and 1-2 is a row index (1-based).
44
+ export function fromTextPath(textPath, gridArg) {
45
+ // Parse path.
46
+ const positions = textPath.split(" ").filter(Boolean);
47
+ const [start, ...rest] = positions.map((pos) => {
48
+ const x = LETTER_INDICES.indexOf(pos[0]);
49
+ const y = parseInt(pos.slice(1)) - 1;
50
+ return { y, x };
51
+ });
52
+ // Find move target.
53
+ const grid = Array.isArray(gridArg) ? fromMatrix(gridArg) : gridArg;
54
+ const targets = grid.items.filter((item) => item.y <= start.y && start.y < item.y + item.height && item.x <= start.x && start.x < item.x + item.width);
55
+ if (targets.length === 0) {
56
+ throw new Error("No move target corresponding given path.");
57
+ }
58
+ if (targets.length > 1) {
59
+ throw new Error("Multiple move targets corresponding given path.");
60
+ }
61
+ const [moveTarget] = targets;
62
+ // Adjust path to target's top-left point.
63
+ const yOffset = start.y - moveTarget.y;
64
+ const xOffset = start.x - moveTarget.x;
65
+ return { itemId: moveTarget.id, path: rest.map(({ y, x }) => new Position({ y: y - yOffset, x: x - xOffset })) };
66
+ }
@@ -0,0 +1,13 @@
1
+ import { DragAndDropData, DragAndDropEvents } from "../controller";
2
+ import { EventEmitter } from "../event-emitter";
3
+ declare class MockController extends EventEmitter<DragAndDropEvents> {
4
+ start(event: DragAndDropData): void;
5
+ update(event: DragAndDropData): void;
6
+ submit(): void;
7
+ discard(): void;
8
+ }
9
+ export declare const mockController: MockController;
10
+ export declare function useDragSubscription<K extends keyof DragAndDropEvents>(event: K, handler: DragAndDropEvents[K]): void;
11
+ export declare const mockDraggable: any;
12
+ export declare function useDraggable(): any;
13
+ export {};
@@ -0,0 +1,33 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { useEffect } from "react";
4
+ import { vi } from "vitest";
5
+ import { EventEmitter } from "../event-emitter";
6
+ class MockController extends EventEmitter {
7
+ start(event) {
8
+ this.emit("start", event);
9
+ }
10
+ update(event) {
11
+ this.emit("update", event);
12
+ }
13
+ submit() {
14
+ this.emit("submit");
15
+ }
16
+ discard() {
17
+ this.emit("discard");
18
+ }
19
+ }
20
+ export const mockController = new MockController();
21
+ export function useDragSubscription(event, handler) {
22
+ useEffect(() => mockController.on(event, handler), [event, handler]);
23
+ }
24
+ export const mockDraggable = {
25
+ start: vi.fn(),
26
+ updateTransition: vi.fn(),
27
+ submitTransition: vi.fn(),
28
+ discardTransition: vi.fn(),
29
+ getDroppables: vi.fn(),
30
+ };
31
+ export function useDraggable() {
32
+ return mockDraggable;
33
+ }
@@ -0,0 +1,17 @@
1
+ import { ItemId } from "../../internal/interfaces";
2
+ import { Rect } from "../../internal/interfaces";
3
+ import { Coordinates } from "../utils/coordinates";
4
+ import { Operation } from "./controller";
5
+ /**
6
+ * Produces a rect (in coordinates) to represent the draggable item.
7
+ */
8
+ export declare function getCollisionRect(operation: Operation, draggableElement: HTMLElement, coordinates: Coordinates): {
9
+ left: number;
10
+ top: number;
11
+ right: number;
12
+ bottom: number;
13
+ };
14
+ /**
15
+ * Returns IDs of droppables hovered by the draggable rect.
16
+ */
17
+ export declare function getHoveredDroppables(collisionRect: Rect, droppables: readonly [ItemId, HTMLElement][]): string[];
@@ -0,0 +1,32 @@
1
+ import { getGridPlacement, isInside } from "../utils/rects";
2
+ import { getNormalizedElementRect } from "../utils/screen";
3
+ /**
4
+ * Produces a rect (in coordinates) to represent the draggable item.
5
+ */
6
+ export function getCollisionRect(operation, draggableElement, coordinates) {
7
+ const activeRect = getNormalizedElementRect(draggableElement);
8
+ let collisionRect = { left: 0, top: 0, right: 0, bottom: 0 };
9
+ if (operation === "reorder") {
10
+ collisionRect = activeRect;
11
+ }
12
+ if (operation === "resize") {
13
+ collisionRect = { left: activeRect.left, top: activeRect.top, right: coordinates.x, bottom: coordinates.y };
14
+ }
15
+ if (operation === "insert") {
16
+ collisionRect = {
17
+ left: coordinates.x,
18
+ top: coordinates.y,
19
+ right: coordinates.x + activeRect.width,
20
+ bottom: coordinates.y + activeRect.height,
21
+ };
22
+ }
23
+ return collisionRect;
24
+ }
25
+ /**
26
+ * Returns IDs of droppables hovered by the draggable rect.
27
+ */
28
+ export function getHoveredDroppables(collisionRect, droppables) {
29
+ const droppableRects = droppables.map(([, element]) => getNormalizedElementRect(element));
30
+ const bounds = getGridPlacement(collisionRect, droppableRects);
31
+ return droppables.filter((_, index) => isInside(droppableRects[index], bounds)).map(([droppableId]) => droppableId);
32
+ }
@@ -0,0 +1,64 @@
1
+ import { BoardItemDefinitionBase, ItemId, Rect } from "../interfaces";
2
+ import { Coordinates } from "../utils/coordinates";
3
+ type Item = BoardItemDefinitionBase<unknown>;
4
+ export type Operation = "reorder" | "resize" | "insert";
5
+ export type InteractionType = "pointer" | "keyboard";
6
+ /**
7
+ * Represents the relations between droppables and draggables.
8
+ *
9
+ * The `scale` function transforms draggable's width/height in relative units
10
+ * to the absolute width/height in pixels the droppable expects.
11
+ */
12
+ export interface DropTargetContext {
13
+ scale: (item: Item, size?: {
14
+ width: number;
15
+ height: number;
16
+ }) => {
17
+ width: number;
18
+ height: number;
19
+ };
20
+ }
21
+ export interface DragAndDropData {
22
+ operation: Operation;
23
+ interactionType: InteractionType;
24
+ draggableItem: Item;
25
+ draggableElement: HTMLElement;
26
+ positionOffset: Coordinates;
27
+ coordinates: Coordinates;
28
+ collisionRect: Rect;
29
+ collisionIds: ItemId[];
30
+ dropTarget: null | DropTargetContext;
31
+ }
32
+ export interface Droppable {
33
+ element: HTMLElement;
34
+ context: DropTargetContext;
35
+ }
36
+ interface AcquireData {
37
+ droppableId: ItemId;
38
+ draggableItem: Item;
39
+ }
40
+ export interface DragAndDropEvents {
41
+ start: (data: DragAndDropData) => void;
42
+ update: (data: DragAndDropData) => void;
43
+ submit: () => void;
44
+ discard: () => void;
45
+ acquire: (data: AcquireData) => void;
46
+ }
47
+ export declare function useDragSubscription<K extends keyof DragAndDropEvents>(event: K, handler: DragAndDropEvents[K]): void;
48
+ export declare function useDraggable({ item, getElement }: {
49
+ item: Item;
50
+ getElement: () => HTMLElement;
51
+ }): {
52
+ start(operation: Operation, interactionType: InteractionType, startCoordinates: Coordinates): void;
53
+ updateTransition(coordinates: Coordinates): void;
54
+ submitTransition(): void;
55
+ discardTransition(): void;
56
+ acquire(droppableId: ItemId): void;
57
+ getDroppables(): [string, Droppable][];
58
+ };
59
+ export declare function useDroppable({ itemId, context, getElement, }: {
60
+ itemId: ItemId;
61
+ context: DropTargetContext;
62
+ getElement: () => HTMLElement;
63
+ }): void;
64
+ export {};
@@ -0,0 +1,131 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { useEffect } from "react";
4
+ import { Coordinates } from "../utils/coordinates";
5
+ import { getCollisionRect, getHoveredDroppables } from "./collision";
6
+ import { EventEmitter } from "./event-emitter";
7
+ class DragAndDropController extends EventEmitter {
8
+ constructor() {
9
+ super(...arguments);
10
+ this.droppables = new Map();
11
+ this.transition = null;
12
+ }
13
+ /**
14
+ * Inits a drag transition and issues a "start" event.
15
+ *
16
+ * The method overrides the previous transition if exists (w/o a cancellation event)!
17
+ */
18
+ start(operation, interactionType, draggableItem, draggableElement, startCoordinates) {
19
+ this.transition = {
20
+ operation,
21
+ interactionType,
22
+ draggableItem,
23
+ draggableElement,
24
+ startCoordinates,
25
+ };
26
+ this.emit("start", this.getDragAndDropData(startCoordinates));
27
+ }
28
+ /**
29
+ * Updates current transition with given coordinates and issues an "update" event.
30
+ */
31
+ update(coordinates) {
32
+ this.emit("update", this.getDragAndDropData(coordinates));
33
+ }
34
+ /**
35
+ * Removes transition and issues a "submit" event.
36
+ */
37
+ submit() {
38
+ this.emit("submit");
39
+ this.transition = null;
40
+ }
41
+ /**
42
+ * Removes transition and issues a "discard" event.
43
+ */
44
+ discard() {
45
+ this.emit("discard");
46
+ this.transition = null;
47
+ }
48
+ /**
49
+ * Issues an "acquire" event to notify the current transition draggable is acquired by the given droppable.
50
+ */
51
+ acquire(droppableId) {
52
+ if (!this.transition) {
53
+ throw new Error("Invariant violation: no transition present for acquire.");
54
+ }
55
+ this.emit("acquire", { droppableId, draggableItem: this.transition.draggableItem });
56
+ }
57
+ /**
58
+ * Registers a droppable used for collisions check, acquire, and dropTarget provision.
59
+ */
60
+ addDroppable(id, context, element) {
61
+ this.droppables.set(id, { element, context });
62
+ }
63
+ /**
64
+ * Un-registers the droppable - use it when component unmounts.
65
+ */
66
+ removeDroppable(id) {
67
+ this.droppables.delete(id);
68
+ }
69
+ /**
70
+ * Retrieves all registered droppables to run a manual match against.
71
+ */
72
+ getDroppables() {
73
+ return [...this.droppables.entries()];
74
+ }
75
+ getDragAndDropData(coordinates) {
76
+ if (!this.transition) {
77
+ throw new Error("Invariant violation: no transition present for interaction.");
78
+ }
79
+ const { operation, draggableElement, startCoordinates } = this.transition;
80
+ const positionOffset = Coordinates.cursorOffset(coordinates, startCoordinates);
81
+ const collisionRect = getCollisionRect(operation, draggableElement, coordinates);
82
+ const { collisionIds, dropTarget } = this.getCollisions(collisionRect);
83
+ return { ...this.transition, positionOffset, coordinates, collisionRect, collisionIds, dropTarget };
84
+ }
85
+ getCollisions(collisionRect) {
86
+ const droppableEntries = [...this.droppables.entries()];
87
+ const droppableElements = droppableEntries.map(([id, entry]) => [id, entry.element]);
88
+ const collisionIds = getHoveredDroppables(collisionRect, droppableElements);
89
+ if (collisionIds.length === 0) {
90
+ return { collisionIds, dropTarget: null };
91
+ }
92
+ const matchedDroppable = droppableEntries.find(([id]) => id === collisionIds[0]);
93
+ if (!matchedDroppable) {
94
+ throw new Error("Invariant violation: no droppable matches collision.");
95
+ }
96
+ return { collisionIds, dropTarget: matchedDroppable[1].context };
97
+ }
98
+ }
99
+ // Controller is a singleton and is shared between all d&d elements.
100
+ const controller = new DragAndDropController();
101
+ export function useDragSubscription(event, handler) {
102
+ useEffect(() => controller.on(event, handler), [event, handler]);
103
+ }
104
+ export function useDraggable({ item, getElement }) {
105
+ return {
106
+ start(operation, interactionType, startCoordinates) {
107
+ controller.start(operation, interactionType, item, getElement(), startCoordinates);
108
+ },
109
+ updateTransition(coordinates) {
110
+ controller.update(coordinates);
111
+ },
112
+ submitTransition() {
113
+ controller.submit();
114
+ },
115
+ discardTransition() {
116
+ controller.discard();
117
+ },
118
+ acquire(droppableId) {
119
+ controller.acquire(droppableId);
120
+ },
121
+ getDroppables() {
122
+ return controller.getDroppables();
123
+ },
124
+ };
125
+ }
126
+ export function useDroppable({ itemId, context, getElement, }) {
127
+ useEffect(() => {
128
+ controller.addDroppable(itemId, context, getElement());
129
+ return () => controller.removeDroppable(itemId);
130
+ }, [itemId, context, getElement]);
131
+ }
@@ -0,0 +1,9 @@
1
+ type Listeners<L> = {
2
+ [E in keyof L]: (...args: any[]) => any;
3
+ };
4
+ export declare class EventEmitter<Events extends Listeners<Events>> {
5
+ private listeners;
6
+ on<Event extends keyof Events>(event: Event, handler: Events[Event]): () => void;
7
+ protected emit<Event extends keyof Events>(event: Event, ...data: Parameters<Events[Event]>): void;
8
+ }
9
+ export {};
@@ -0,0 +1,22 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ export class EventEmitter {
4
+ constructor() {
5
+ this.listeners = new Map();
6
+ }
7
+ on(event, handler) {
8
+ if (!this.listeners.has(event)) {
9
+ this.listeners.set(event, []);
10
+ }
11
+ this.listeners.get(event).push(handler);
12
+ return () => {
13
+ this.listeners.set(event, this.listeners.get(event).filter((item) => item !== handler));
14
+ };
15
+ }
16
+ emit(event, ...data) {
17
+ var _a;
18
+ for (const handler of (_a = this.listeners.get(event)) !== null && _a !== void 0 ? _a : []) {
19
+ handler(...data);
20
+ }
21
+ }
22
+ }
@@ -0,0 +1,4 @@
1
+ /// <reference types="react" />
2
+ declare function DragHandleIcon(): JSX.Element;
3
+ declare const _default: import("react").MemoExoticComponent<typeof DragHandleIcon>;
4
+ export default _default;
@@ -0,0 +1,12 @@
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 Icon from "@cloudscape-design/components/icon";
5
+ import { memo } from "react";
6
+ function DragHandleIcon() {
7
+ return _jsx(Icon, { svg: _jsx(SVG, {}) });
8
+ }
9
+ function SVG() {
10
+ return (_jsx("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: _jsx("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M6 2H6.01V2.01H6V2ZM6 6H6.01V6.01H6V6ZM6.01 10H6V10.01H6.01V10ZM6 14H6.01V14.01H6V14ZM10.01 2H10V2.01H10.01V2ZM10 6H10.01V6.01H10V6ZM10.01 10H10V10.01H10.01V10ZM10 14H10.01V14.01H10V14Z", fill: "#16191F" }) }));
11
+ }
12
+ export default memo(DragHandleIcon);
@@ -0,0 +1,9 @@
1
+ import { KeyboardEvent, PointerEvent } from "react";
2
+ export interface DragHandleProps {
3
+ ariaLabelledBy: string;
4
+ ariaDescribedBy: string;
5
+ onPointerDown: (event: PointerEvent) => void;
6
+ onKeyDown: (event: KeyboardEvent) => void;
7
+ }
8
+ declare const _default: import("react").ForwardRefExoticComponent<DragHandleProps & import("react").RefAttributes<HTMLButtonElement>>;
9
+ export default _default;
@@ -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 { forwardRef } from "react";
5
+ import Handle from "../handle";
6
+ import DragHandleIcon from "./icon";
7
+ import styles from "./styles.css.js";
8
+ function DragHandle({ ariaLabelledBy, ariaDescribedBy, onPointerDown, onKeyDown }, ref) {
9
+ return (_jsx(Handle, { ref: ref, className: styles.handle, "aria-labelledby": ariaLabelledBy, "aria-describedby": ariaDescribedBy, onPointerDown: onPointerDown, onKeyDown: onKeyDown, children: _jsx(DragHandleIcon, {}) }));
10
+ }
11
+ export default forwardRef(DragHandle);
@@ -0,0 +1,6 @@
1
+
2
+ import './styles.scoped.css';
3
+ export default {
4
+ "handle": "awsui_handle_umbhe_1e9tr_1"
5
+ };
6
+
@@ -0,0 +1,7 @@
1
+ .awsui_handle_umbhe_1e9tr_1:not(#\9) {
2
+ cursor: grab;
3
+ }
4
+
5
+ .awsui_handle_umbhe_1e9tr_1:not(#\9):active {
6
+ cursor: grabbing;
7
+ }
@@ -0,0 +1,7 @@
1
+
2
+ // es-module interop with Babel and Typescript
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ module.exports.default = {
5
+ "handle": "awsui_handle_umbhe_1e9tr_1"
6
+ };
7
+
@@ -0,0 +1,4 @@
1
+ export const PACKAGE_SOURCE: string;
2
+ export const PACKAGE_VERSION: string;
3
+ export const THEME: string;
4
+ export const ALWAYS_VISUAL_REFRESH: string;
@@ -0,0 +1,4 @@
1
+ export var PACKAGE_SOURCE = "board-components";
2
+ export var PACKAGE_VERSION = "3.0.0 (f7bedc98)";
3
+ export var THEME = "default";
4
+ export var ALWAYS_VISUAL_REFRESH = false;
File without changes
File without changes
@@ -0,0 +1,3 @@
1
+ /// <reference types="react" />
2
+ import { GridProps } from "./interfaces";
3
+ export default function Grid({ layout, children: render, columns, rows }: GridProps): JSX.Element;
@@ -0,0 +1,28 @@
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 { useContainerQuery } from "@cloudscape-design/component-toolkit";
5
+ import { Children } from "react";
6
+ import { zipTwoArrays } from "../utils/zip-arrays";
7
+ import GridItem from "./item";
8
+ import styles from "./styles.css.js";
9
+ /* Matches grid gap in CSS. */
10
+ const GRID_GAP = 16;
11
+ /* Matches grid-auto-rows in CSS. */
12
+ const ROWSPAN_HEIGHT = 100;
13
+ export default function Grid({ layout, children: render, columns, rows }) {
14
+ const [gridWidth, containerQueryRef] = useContainerQuery((entry) => entry.contentBoxWidth, []);
15
+ // The below getters translate relative grid units into size/offset values in pixels.
16
+ const getWidth = (colspan) => {
17
+ colspan = Math.min(columns, colspan);
18
+ const cellWidth = ((gridWidth || 0) - (columns - 1) * GRID_GAP) / columns;
19
+ return colspan * cellWidth + (colspan - 1) * GRID_GAP;
20
+ };
21
+ const getHeight = (rowspan) => rowspan * ROWSPAN_HEIGHT + (rowspan - 1) * GRID_GAP;
22
+ const getColOffset = (x) => getWidth(x) + GRID_GAP;
23
+ const getRowOffset = (y) => getHeight(y) + GRID_GAP;
24
+ const gridContext = { getWidth, getHeight, getColOffset, getRowOffset };
25
+ const children = render === null || render === void 0 ? void 0 : render(gridContext);
26
+ const zipped = zipTwoArrays(layout, Children.toArray(children));
27
+ return (_jsx("div", { ref: containerQueryRef, "data-columns": columns, "data-rows": rows, className: styles.grid, children: zipped.map(([item, children]) => (_jsx(GridItem, { item: item, children: children }, item.id))) }));
28
+ }
@@ -0,0 +1,2 @@
1
+ export { default as default } from "./grid";
2
+ export type { GridProps } from "./interfaces";
@@ -0,0 +1,3 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ export { default as default } from "./grid";
@@ -0,0 +1,14 @@
1
+ import { ReactNode } from "react";
2
+ import { GridLayoutItem } from "../interfaces";
3
+ export interface GridProps {
4
+ layout: GridLayoutItem[];
5
+ columns: number;
6
+ rows: number;
7
+ children?: (context: GridContext) => ReactNode;
8
+ }
9
+ export interface GridContext {
10
+ getWidth: (colspan: number) => number;
11
+ getHeight: (rowspan: number) => number;
12
+ getColOffset: (x: number) => number;
13
+ getRowOffset: (y: number) => number;
14
+ }
@@ -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,8 @@
1
+ import { ReactNode } from "react";
2
+ import { GridLayoutItem } from "../interfaces";
3
+ export interface GridItemProps {
4
+ item: GridLayoutItem;
5
+ children?: ReactNode;
6
+ }
7
+ declare const _default: import("react").MemoExoticComponent<({ children, item }: GridItemProps) => JSX.Element>;
8
+ export default _default;
@@ -0,0 +1,10 @@
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 { memo } from "react";
5
+ import styles from "./styles.css.js";
6
+ const GridItem = ({ children, item }) => {
7
+ // Grid row start can not be set as part of a CSS class names, since we have a potentially infinite height grid.
8
+ return (_jsx("div", { "data-column-span": item.width, "data-row-span": item.height, "data-column-offset": item.x + 1, "data-row-offset": item.y + 1, className: styles.grid__item, style: { gridRowStart: item.y + 1, gridRowEnd: `span ${item.height}` }, children: children }));
9
+ };
10
+ export default memo(GridItem);
@@ -0,0 +1,7 @@
1
+
2
+ import './styles.scoped.css';
3
+ export default {
4
+ "grid": "awsui_grid_1hw7z_67wyf_1",
5
+ "grid__item": "awsui_grid__item_1hw7z_67wyf_26"
6
+ };
7
+