@cloudscape-design/components-themeable 3.0.1326 → 3.0.1328

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 (116) hide show
  1. package/lib/internal/manifest.json +1 -1
  2. package/lib/internal/scss/action-card/styles.scss +4 -2
  3. package/lib/internal/scss/box/styles.scss +1 -0
  4. package/lib/internal/scss/box/visual-accent.scss +117 -0
  5. package/lib/internal/scss/button-dropdown/styles.scss +6 -0
  6. package/lib/internal/scss/help-panel/styles.scss +6 -6
  7. package/lib/internal/scss/internal/generated/custom-css-properties/index.scss +1 -1
  8. package/lib/internal/template/action-card/interfaces.d.ts +40 -1
  9. package/lib/internal/template/action-card/interfaces.d.ts.map +1 -1
  10. package/lib/internal/template/action-card/interfaces.js.map +1 -1
  11. package/lib/internal/template/action-card/internal.d.ts.map +1 -1
  12. package/lib/internal/template/action-card/internal.js +32 -9
  13. package/lib/internal/template/action-card/internal.js.map +1 -1
  14. package/lib/internal/template/action-card/styles.css.js +17 -17
  15. package/lib/internal/template/action-card/styles.scoped.css +96 -92
  16. package/lib/internal/template/action-card/styles.selectors.js +17 -17
  17. package/lib/internal/template/box/interfaces.d.ts +59 -0
  18. package/lib/internal/template/box/interfaces.d.ts.map +1 -1
  19. package/lib/internal/template/box/interfaces.js.map +1 -1
  20. package/lib/internal/template/box/internal.d.ts +1 -1
  21. package/lib/internal/template/box/internal.d.ts.map +1 -1
  22. package/lib/internal/template/box/internal.js +4 -2
  23. package/lib/internal/template/box/internal.js.map +1 -1
  24. package/lib/internal/template/box/styles.css.js +224 -193
  25. package/lib/internal/template/box/styles.scoped.css +424 -238
  26. package/lib/internal/template/box/styles.selectors.js +224 -193
  27. package/lib/internal/template/button-dropdown/category-elements/category-element.d.ts +1 -1
  28. package/lib/internal/template/button-dropdown/category-elements/category-element.d.ts.map +1 -1
  29. package/lib/internal/template/button-dropdown/category-elements/category-element.js +3 -3
  30. package/lib/internal/template/button-dropdown/category-elements/category-element.js.map +1 -1
  31. package/lib/internal/template/button-dropdown/category-elements/expandable-category-element.d.ts +1 -1
  32. package/lib/internal/template/button-dropdown/category-elements/expandable-category-element.d.ts.map +1 -1
  33. package/lib/internal/template/button-dropdown/category-elements/expandable-category-element.js +22 -12
  34. package/lib/internal/template/button-dropdown/category-elements/expandable-category-element.js.map +1 -1
  35. package/lib/internal/template/button-dropdown/category-elements/mobile-expandable-category-element.d.ts +1 -1
  36. package/lib/internal/template/button-dropdown/category-elements/mobile-expandable-category-element.d.ts.map +1 -1
  37. package/lib/internal/template/button-dropdown/category-elements/mobile-expandable-category-element.js +12 -10
  38. package/lib/internal/template/button-dropdown/category-elements/mobile-expandable-category-element.js.map +1 -1
  39. package/lib/internal/template/button-dropdown/filter.d.ts +8 -0
  40. package/lib/internal/template/button-dropdown/filter.d.ts.map +1 -0
  41. package/lib/internal/template/button-dropdown/filter.js +18 -0
  42. package/lib/internal/template/button-dropdown/filter.js.map +1 -0
  43. package/lib/internal/template/button-dropdown/index.d.ts.map +1 -1
  44. package/lib/internal/template/button-dropdown/index.js +3 -3
  45. package/lib/internal/template/button-dropdown/index.js.map +1 -1
  46. package/lib/internal/template/button-dropdown/interfaces.d.ts +41 -0
  47. package/lib/internal/template/button-dropdown/interfaces.d.ts.map +1 -1
  48. package/lib/internal/template/button-dropdown/interfaces.js.map +1 -1
  49. package/lib/internal/template/button-dropdown/internal-interfaces.d.ts +12 -0
  50. package/lib/internal/template/button-dropdown/internal-interfaces.d.ts.map +1 -1
  51. package/lib/internal/template/button-dropdown/internal-interfaces.js.map +1 -1
  52. package/lib/internal/template/button-dropdown/internal.d.ts.map +1 -1
  53. package/lib/internal/template/button-dropdown/internal.js +46 -7
  54. package/lib/internal/template/button-dropdown/internal.js.map +1 -1
  55. package/lib/internal/template/button-dropdown/item-element/index.d.ts +1 -1
  56. package/lib/internal/template/button-dropdown/item-element/index.d.ts.map +1 -1
  57. package/lib/internal/template/button-dropdown/item-element/index.js +35 -16
  58. package/lib/internal/template/button-dropdown/item-element/index.js.map +1 -1
  59. package/lib/internal/template/button-dropdown/items-list.d.ts +1 -1
  60. package/lib/internal/template/button-dropdown/items-list.d.ts.map +1 -1
  61. package/lib/internal/template/button-dropdown/items-list.js +4 -4
  62. package/lib/internal/template/button-dropdown/items-list.js.map +1 -1
  63. package/lib/internal/template/button-dropdown/styles.css.js +23 -22
  64. package/lib/internal/template/button-dropdown/styles.scoped.css +38 -32
  65. package/lib/internal/template/button-dropdown/styles.selectors.js +23 -22
  66. package/lib/internal/template/button-dropdown/tooltip.d.ts +2 -1
  67. package/lib/internal/template/button-dropdown/tooltip.d.ts.map +1 -1
  68. package/lib/internal/template/button-dropdown/tooltip.js +22 -14
  69. package/lib/internal/template/button-dropdown/tooltip.js.map +1 -1
  70. package/lib/internal/template/button-dropdown/utils/filter-items.d.ts +4 -0
  71. package/lib/internal/template/button-dropdown/utils/filter-items.d.ts.map +1 -0
  72. package/lib/internal/template/button-dropdown/utils/filter-items.js +55 -0
  73. package/lib/internal/template/button-dropdown/utils/filter-items.js.map +1 -0
  74. package/lib/internal/template/button-dropdown/utils/use-button-dropdown.d.ts +7 -1
  75. package/lib/internal/template/button-dropdown/utils/use-button-dropdown.d.ts.map +1 -1
  76. package/lib/internal/template/button-dropdown/utils/use-button-dropdown.js +77 -13
  77. package/lib/internal/template/button-dropdown/utils/use-button-dropdown.js.map +1 -1
  78. package/lib/internal/template/error-boundary/internal.d.ts.map +1 -1
  79. package/lib/internal/template/error-boundary/internal.js +1 -0
  80. package/lib/internal/template/error-boundary/internal.js.map +1 -1
  81. package/lib/internal/template/help-panel/styles.css.js +6 -6
  82. package/lib/internal/template/help-panel/styles.scoped.css +67 -70
  83. package/lib/internal/template/help-panel/styles.selectors.js +6 -6
  84. package/lib/internal/template/internal/base-component/index.js +3 -3
  85. package/lib/internal/template/internal/base-component/index.js.map +1 -1
  86. package/lib/internal/template/internal/base-component/styles.scoped.css +17 -1
  87. package/lib/internal/template/internal/components/option/utils/filter-options.d.ts.map +1 -1
  88. package/lib/internal/template/internal/components/option/utils/filter-options.js +7 -8
  89. package/lib/internal/template/internal/components/option/utils/filter-options.js.map +1 -1
  90. package/lib/internal/template/internal/environment.js +2 -2
  91. package/lib/internal/template/internal/environment.json +2 -2
  92. package/lib/internal/template/internal/generated/styles/tokens.d.ts +132 -0
  93. package/lib/internal/template/internal/generated/styles/tokens.js +132 -0
  94. package/lib/internal/template/internal/generated/theming/index.cjs +1884 -0
  95. package/lib/internal/template/internal/generated/theming/index.js +1884 -0
  96. package/lib/internal/template/item-card/internal.js +1 -1
  97. package/lib/internal/template/item-card/internal.js.map +1 -1
  98. package/lib/internal/template/multiselect/embedded.d.ts +2 -2
  99. package/lib/internal/template/multiselect/internal.d.ts +1 -1
  100. package/lib/internal/template/select/parts/filter.d.ts +1 -1
  101. package/lib/internal/template/table/index.d.ts.map +1 -1
  102. package/lib/internal/template/table/index.js +5 -3
  103. package/lib/internal/template/table/index.js.map +1 -1
  104. package/lib/internal/template/table/thead.d.ts.map +1 -1
  105. package/lib/internal/template/table/thead.js +8 -4
  106. package/lib/internal/template/table/thead.js.map +1 -1
  107. package/lib/internal/template/test-utils/dom/action-card/index.d.ts +4 -2
  108. package/lib/internal/template/test-utils/dom/action-card/index.js +5 -3
  109. package/lib/internal/template/test-utils/dom/action-card/index.js.map +1 -1
  110. package/lib/internal/template/test-utils/dom/button-dropdown/index.d.ts +16 -0
  111. package/lib/internal/template/test-utils/dom/button-dropdown/index.js +24 -0
  112. package/lib/internal/template/test-utils/dom/button-dropdown/index.js.map +1 -1
  113. package/lib/internal/template/test-utils/selectors/button-dropdown/index.d.ts +16 -0
  114. package/lib/internal/template/test-utils/selectors/button-dropdown/index.js +24 -0
  115. package/lib/internal/template/test-utils/selectors/button-dropdown/index.js.map +1 -1
  116. package/package.json +1 -1
@@ -1,23 +1,56 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { useEffect, useMemo, useRef, useState } from 'react';
1
4
  import { useOpenState } from '../../internal/components/options-list/utils/use-open-state';
2
5
  import { fireCancelableEvent, isPlainLeftClick } from '../../internal/events';
3
6
  import { KeyCode } from '../../internal/keycode';
7
+ import { filterItems } from './filter-items';
4
8
  import useHighlightedMenu from './use-highlighted-menu';
5
9
  import { getItemTarget, isCheckboxItem, isItemGroup, isLinkItem } from './utils';
6
- export function useButtonDropdown({ items, onItemClick, onItemFollow, onReturnFocus, hasExpandableGroups, isInRestrictedView = false, expandToViewport = false, }) {
10
+ export function useButtonDropdown({ items, onItemClick, onItemFollow, onReturnFocus, hasExpandableGroups, isInRestrictedView = false, expandToViewport = false, hasFiltering, }) {
11
+ const [filteringValue, setFilteringValue] = useState('');
12
+ const filteredItems = useMemo(() => (hasFiltering && filteringValue ? filterItems(items, filteringValue) : items), [hasFiltering, filteringValue, items]);
13
+ const showExpandableGroups = hasExpandableGroups && !filteringValue;
7
14
  const { targetItem, isHighlighted, isKeyboardHighlight, isExpanded, highlightItem, moveHighlight, expandGroup, collapseGroup, reset, setIsUsingMouse, } = useHighlightedMenu({
8
- items,
9
- hasExpandableGroups,
15
+ items: filteredItems,
16
+ hasExpandableGroups: showExpandableGroups,
10
17
  isInRestrictedView,
11
18
  });
12
- const { isOpen, closeDropdown, ...openStateProps } = useOpenState({ onClose: reset });
19
+ // If the filtering input changes, the options list also changes,
20
+ // so the highlight isn't valid anymore.
21
+ const prevFilteringValue = useRef(filteringValue);
22
+ useEffect(() => {
23
+ if (prevFilteringValue.current !== filteringValue) {
24
+ prevFilteringValue.current = filteringValue;
25
+ reset();
26
+ }
27
+ }, [filteringValue, reset]);
28
+ const { isOpen, closeDropdown: closeDropdownState, ...openStateProps } = useOpenState({ onClose: reset });
29
+ const closeDropdown = () => {
30
+ setFilteringValue('');
31
+ closeDropdownState();
32
+ };
13
33
  const toggleDropdown = (options = {}) => {
14
34
  var _a;
15
35
  const moveHighlightOnOpen = (_a = options.moveHighlightOnOpen) !== null && _a !== void 0 ? _a : true;
16
- if (!isOpen && moveHighlightOnOpen) {
36
+ if (!isOpen && moveHighlightOnOpen && !hasFiltering) {
17
37
  moveHighlight(1);
18
38
  }
39
+ if (isOpen) {
40
+ setFilteringValue('');
41
+ }
19
42
  openStateProps.toggleDropdown();
20
43
  };
44
+ const onDropdownFocusLeave = () => {
45
+ if (hasFiltering && isOpen) {
46
+ if (expandToViewport) {
47
+ // When expanded to viewport the focus can't move naturally to the next element.
48
+ // Returning the focus to the trigger instead.
49
+ onReturnFocus();
50
+ }
51
+ closeDropdown();
52
+ }
53
+ };
21
54
  const onGroupToggle = item => (!isExpanded(item) ? expandGroup(item) : collapseGroup());
22
55
  const onItemActivate = (item, event) => {
23
56
  const isCheckbox = isCheckboxItem(item);
@@ -76,7 +109,9 @@ export function useButtonDropdown({ items, onItemClick, onItemFollow, onReturnFo
76
109
  case KeyCode.down: {
77
110
  if (!isOpen) {
78
111
  toggleDropdown();
79
- moveHighlight(1, true);
112
+ if (!hasFiltering) {
113
+ moveHighlight(1, true);
114
+ }
80
115
  }
81
116
  else {
82
117
  moveHighlight(1);
@@ -87,7 +122,9 @@ export function useButtonDropdown({ items, onItemClick, onItemFollow, onReturnFo
87
122
  case KeyCode.up: {
88
123
  if (!isOpen) {
89
124
  toggleDropdown();
90
- moveHighlight(-1, true);
125
+ if (!hasFiltering) {
126
+ moveHighlight(-1, true);
127
+ }
91
128
  }
92
129
  else {
93
130
  moveHighlight(-1);
@@ -96,11 +133,20 @@ export function useButtonDropdown({ items, onItemClick, onItemFollow, onReturnFo
96
133
  break;
97
134
  }
98
135
  case KeyCode.space: {
99
- // Prevent scrolling the list of items and highlighting the trigger
100
- event.preventDefault();
136
+ // Prevent scrolling the list of items and highlighting the trigger when filtering
137
+ // isn't active. Hitting space when filtering is active should just type a space
138
+ // character into the input, or activate the clear button.
139
+ if (!hasFiltering && !isOpen) {
140
+ event.preventDefault();
141
+ }
101
142
  break;
102
143
  }
103
144
  case KeyCode.enter: {
145
+ // While filtering, pressing Enter without a highlighted item should not select
146
+ // any item or close the dropdown.
147
+ if (isOpen && hasFiltering && !targetItem) {
148
+ break;
149
+ }
104
150
  if (!(targetItem === null || targetItem === void 0 ? void 0 : targetItem.disabled)) {
105
151
  activate(event, true);
106
152
  }
@@ -108,6 +154,11 @@ export function useButtonDropdown({ items, onItemClick, onItemFollow, onReturnFo
108
154
  }
109
155
  case KeyCode.left:
110
156
  case KeyCode.right: {
157
+ // When filtering is enabled and there's text in the filter input, left/right
158
+ // arrow keys should move the caret between the characters.
159
+ if (hasFiltering && filteringValue) {
160
+ break;
161
+ }
111
162
  if (targetItem && !targetItem.disabled && isItemGroup(targetItem) && !isExpanded(targetItem)) {
112
163
  expandGroup();
113
164
  }
@@ -127,6 +178,13 @@ export function useButtonDropdown({ items, onItemClick, onItemFollow, onReturnFo
127
178
  break;
128
179
  }
129
180
  case KeyCode.tab: {
181
+ // In filtering mode the dropdown contains multiple focusable elements (the filter
182
+ // input and its clear button). Tabbing between them must not close the dropdown, so
183
+ // closing on Tab is handled by onDropdownFocusLeave instead, which only fires once
184
+ // focus actually leaves the dropdown.
185
+ if (hasFiltering) {
186
+ break;
187
+ }
130
188
  // When expanded to viewport the focus can't move naturally to the next element.
131
189
  // Returning the focus to the trigger instead.
132
190
  if (expandToViewport) {
@@ -138,10 +196,11 @@ export function useButtonDropdown({ items, onItemClick, onItemFollow, onReturnFo
138
196
  }
139
197
  };
140
198
  const onKeyUp = (event) => {
141
- // We need to handle activating items with Space separately because there is a bug
142
- // in Firefox where changing the focus during a Space keydown event it will trigger
143
- // unexpected click events on the new element: https://bugzilla.mozilla.org/show_bug.cgi?id=1220143
144
- if (event.keyCode === KeyCode.space && !(targetItem === null || targetItem === void 0 ? void 0 : targetItem.disabled)) {
199
+ // When using a roving tabindex (filtering disabled), we need to handle activating items
200
+ // with Space separately because there is a bug in Firefox where changing the focus during
201
+ // a Space keydown event it will trigger unexpected click events on the new element.
202
+ // See https://bugzilla.mozilla.org/show_bug.cgi?id=1220143
203
+ if (event.keyCode === KeyCode.space && !(targetItem === null || targetItem === void 0 ? void 0 : targetItem.disabled) && !hasFiltering) {
145
204
  activate(event);
146
205
  }
147
206
  };
@@ -156,9 +215,14 @@ export function useButtonDropdown({ items, onItemClick, onItemFollow, onReturnFo
156
215
  onKeyUp,
157
216
  onItemActivate,
158
217
  onGroupToggle,
218
+ onDropdownFocusLeave,
159
219
  toggleDropdown,
160
220
  closeDropdown,
161
221
  setIsUsingMouse,
222
+ filteringValue,
223
+ setFilteringValue,
224
+ filteredItems,
225
+ showExpandableGroups,
162
226
  };
163
227
  }
164
228
  //# sourceMappingURL=use-button-dropdown.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-button-dropdown.js","sourceRoot":"","sources":["../../../../src/button-dropdown/utils/use-button-dropdown.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport React from 'react';\n\nimport { useOpenState } from '../../internal/components/options-list/utils/use-open-state';\nimport { fireCancelableEvent, isPlainLeftClick } from '../../internal/events';\nimport { KeyCode } from '../../internal/keycode';\nimport { CancelableEventHandler } from '../../types/events';\nimport { ButtonDropdownProps, ButtonDropdownSettings, GroupToggle, HighlightProps, ItemActivate } from '../interfaces';\nimport useHighlightedMenu from './use-highlighted-menu';\nimport { getItemTarget, isCheckboxItem, isItemGroup, isLinkItem } from './utils';\n\ninterface UseButtonDropdownOptions extends ButtonDropdownSettings {\n items: ButtonDropdownProps.Items;\n onItemClick?: CancelableEventHandler<ButtonDropdownProps.ItemClickDetails>;\n onItemFollow?: CancelableEventHandler<ButtonDropdownProps.ItemClickDetails>;\n onReturnFocus: () => void;\n expandToViewport?: boolean;\n}\n\ninterface UseButtonDropdownApi extends HighlightProps {\n isOpen: boolean;\n onKeyDown: (event: React.KeyboardEvent) => void;\n onKeyUp: (event: React.KeyboardEvent) => void;\n onItemActivate: ItemActivate;\n onGroupToggle: GroupToggle;\n toggleDropdown: (options?: { moveHighlightOnOpen?: boolean }) => void;\n closeDropdown: () => void;\n setIsUsingMouse: (isUsingMouse: boolean) => void;\n}\n\nexport function useButtonDropdown({\n items,\n onItemClick,\n onItemFollow,\n onReturnFocus,\n hasExpandableGroups,\n isInRestrictedView = false,\n expandToViewport = false,\n}: UseButtonDropdownOptions): UseButtonDropdownApi {\n const {\n targetItem,\n isHighlighted,\n isKeyboardHighlight,\n isExpanded,\n highlightItem,\n moveHighlight,\n expandGroup,\n collapseGroup,\n reset,\n setIsUsingMouse,\n } = useHighlightedMenu({\n items,\n hasExpandableGroups,\n isInRestrictedView,\n });\n\n const { isOpen, closeDropdown, ...openStateProps } = useOpenState({ onClose: reset });\n const toggleDropdown = (options: { moveHighlightOnOpen?: boolean } = {}) => {\n const moveHighlightOnOpen = options.moveHighlightOnOpen ?? true;\n if (!isOpen && moveHighlightOnOpen) {\n moveHighlight(1);\n }\n openStateProps.toggleDropdown();\n };\n\n const onGroupToggle: GroupToggle = item => (!isExpanded(item) ? expandGroup(item) : collapseGroup());\n\n const onItemActivate: ItemActivate = (item, event) => {\n const isCheckbox = isCheckboxItem(item);\n const isLink = isLinkItem(item);\n const details = {\n id: item.id || 'undefined',\n href: isLink ? item.href : undefined,\n external: isLink ? item.external : undefined,\n target: isLink ? getItemTarget(item) : undefined,\n checked: isCheckbox ? !item.checked : undefined,\n };\n onReturnFocus();\n if (onItemFollow && isLink && isPlainLeftClick(event)) {\n fireCancelableEvent(onItemFollow, details, event);\n }\n if (onItemClick) {\n fireCancelableEvent(onItemClick, details, event);\n }\n closeDropdown();\n };\n\n const openAndSelectFirst = (event: React.KeyboardEvent) => {\n toggleDropdown();\n event.preventDefault();\n };\n\n const actOnParentDropdown = (event: React.KeyboardEvent) => {\n // if there is no highlighted item we act on the trigger by opening or closing dropdown\n if (!targetItem) {\n if (isOpen && !isInRestrictedView) {\n toggleDropdown();\n } else {\n openAndSelectFirst(event);\n }\n } else {\n if (isItemGroup(targetItem)) {\n onGroupToggle(targetItem, event);\n } else {\n onItemActivate(targetItem, event);\n }\n }\n };\n\n const activate = (event: React.KeyboardEvent, isEnter?: boolean) => {\n setIsUsingMouse(false);\n\n // if item is a link we rely on default behavior of an anchor, no need to prevent\n if (targetItem && isLinkItem(targetItem) && isEnter) {\n return;\n }\n\n event.preventDefault();\n actOnParentDropdown(event);\n };\n\n const onKeyDown = (event: React.KeyboardEvent) => {\n setIsUsingMouse(false);\n switch (event.keyCode) {\n case KeyCode.down: {\n if (!isOpen) {\n toggleDropdown();\n moveHighlight(1, true);\n } else {\n moveHighlight(1);\n }\n event.preventDefault();\n break;\n }\n case KeyCode.up: {\n if (!isOpen) {\n toggleDropdown();\n moveHighlight(-1, true);\n } else {\n moveHighlight(-1);\n }\n event.preventDefault();\n break;\n }\n case KeyCode.space: {\n // Prevent scrolling the list of items and highlighting the trigger\n event.preventDefault();\n break;\n }\n case KeyCode.enter: {\n if (!targetItem?.disabled) {\n activate(event, true);\n }\n break;\n }\n case KeyCode.left:\n case KeyCode.right: {\n if (targetItem && !targetItem.disabled && isItemGroup(targetItem) && !isExpanded(targetItem)) {\n expandGroup();\n } else if (hasExpandableGroups) {\n collapseGroup();\n }\n\n event.preventDefault();\n break;\n }\n case KeyCode.escape: {\n onReturnFocus();\n closeDropdown();\n event.preventDefault();\n if (isOpen) {\n event.stopPropagation();\n }\n break;\n }\n case KeyCode.tab: {\n // When expanded to viewport the focus can't move naturally to the next element.\n // Returning the focus to the trigger instead.\n if (expandToViewport) {\n onReturnFocus();\n }\n closeDropdown();\n break;\n }\n }\n };\n const onKeyUp = (event: React.KeyboardEvent) => {\n // We need to handle activating items with Space separately because there is a bug\n // in Firefox where changing the focus during a Space keydown event it will trigger\n // unexpected click events on the new element: https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n if (event.keyCode === KeyCode.space && !targetItem?.disabled) {\n activate(event);\n }\n };\n\n return {\n isOpen,\n targetItem,\n isHighlighted,\n isKeyboardHighlight,\n isExpanded,\n highlightItem,\n onKeyDown,\n onKeyUp,\n onItemActivate,\n onGroupToggle,\n toggleDropdown,\n closeDropdown,\n setIsUsingMouse,\n };\n}\n"]}
1
+ {"version":3,"file":"use-button-dropdown.js","sourceRoot":"","sources":["../../../../src/button-dropdown/utils/use-button-dropdown.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,sCAAsC;AACtC,OAAc,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEpE,OAAO,EAAE,YAAY,EAAE,MAAM,6DAA6D,CAAC;AAC3F,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9E,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAGjD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,kBAAkB,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AA2BjF,MAAM,UAAU,iBAAiB,CAAC,EAChC,KAAK,EACL,WAAW,EACX,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,kBAAkB,GAAG,KAAK,EAC1B,gBAAgB,GAAG,KAAK,EACxB,YAAY,GACa;IACzB,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEzD,MAAM,aAAa,GAAG,OAAO,CAC3B,GAAG,EAAE,CAAC,CAAC,YAAY,IAAI,cAAc,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EACnF,CAAC,YAAY,EAAE,cAAc,EAAE,KAAK,CAAC,CACtC,CAAC;IAEF,MAAM,oBAAoB,GAAG,mBAAmB,IAAI,CAAC,cAAc,CAAC;IAEpE,MAAM,EACJ,UAAU,EACV,aAAa,EACb,mBAAmB,EACnB,UAAU,EACV,aAAa,EACb,aAAa,EACb,WAAW,EACX,aAAa,EACb,KAAK,EACL,eAAe,GAChB,GAAG,kBAAkB,CAAC;QACrB,KAAK,EAAE,aAAa;QACpB,mBAAmB,EAAE,oBAAoB;QACzC,kBAAkB;KACnB,CAAC,CAAC;IAEH,iEAAiE;IACjE,wCAAwC;IACxC,MAAM,kBAAkB,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;IAClD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,kBAAkB,CAAC,OAAO,KAAK,cAAc,EAAE,CAAC;YAClD,kBAAkB,CAAC,OAAO,GAAG,cAAc,CAAC;YAC5C,KAAK,EAAE,CAAC;QACV,CAAC;IACH,CAAC,EAAE,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC,CAAC;IAE5B,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,kBAAkB,EAAE,GAAG,cAAc,EAAE,GAAG,YAAY,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IAE1G,MAAM,aAAa,GAAG,GAAG,EAAE;QACzB,iBAAiB,CAAC,EAAE,CAAC,CAAC;QACtB,kBAAkB,EAAE,CAAC;IACvB,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,CAAC,UAA6C,EAAE,EAAE,EAAE;;QACzE,MAAM,mBAAmB,GAAG,MAAA,OAAO,CAAC,mBAAmB,mCAAI,IAAI,CAAC;QAChE,IAAI,CAAC,MAAM,IAAI,mBAAmB,IAAI,CAAC,YAAY,EAAE,CAAC;YACpD,aAAa,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC;QACD,IAAI,MAAM,EAAE,CAAC;YACX,iBAAiB,CAAC,EAAE,CAAC,CAAC;QACxB,CAAC;QACD,cAAc,CAAC,cAAc,EAAE,CAAC;IAClC,CAAC,CAAC;IAEF,MAAM,oBAAoB,GAAG,GAAG,EAAE;QAChC,IAAI,YAAY,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,gBAAgB,EAAE,CAAC;gBACrB,gFAAgF;gBAChF,8CAA8C;gBAC9C,aAAa,EAAE,CAAC;YAClB,CAAC;YACD,aAAa,EAAE,CAAC;QAClB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,aAAa,GAAgB,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC;IAErG,MAAM,cAAc,GAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACnD,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,OAAO,GAAG;YACd,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,WAAW;YAC1B,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;YACpC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;YAC5C,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;YAChD,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;SAChD,CAAC;QACF,aAAa,EAAE,CAAC;QAChB,IAAI,YAAY,IAAI,MAAM,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;YACtD,mBAAmB,CAAC,YAAY,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QACpD,CAAC;QACD,IAAI,WAAW,EAAE,CAAC;YAChB,mBAAmB,CAAC,WAAW,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QACnD,CAAC;QACD,aAAa,EAAE,CAAC;IAClB,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,CAAC,KAA0B,EAAE,EAAE;QACxD,cAAc,EAAE,CAAC;QACjB,KAAK,CAAC,cAAc,EAAE,CAAC;IACzB,CAAC,CAAC;IAEF,MAAM,mBAAmB,GAAG,CAAC,KAA0B,EAAE,EAAE;QACzD,uFAAuF;QACvF,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,IAAI,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAClC,cAAc,EAAE,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC5B,aAAa,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YACnC,CAAC;iBAAM,CAAC;gBACN,cAAc,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,CAAC,KAA0B,EAAE,OAAiB,EAAE,EAAE;QACjE,eAAe,CAAC,KAAK,CAAC,CAAC;QAEvB,iFAAiF;QACjF,IAAI,UAAU,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,OAAO,EAAE,CAAC;YACpD,OAAO;QACT,CAAC;QAED,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,CAAC,KAA0B,EAAE,EAAE;QAC/C,eAAe,CAAC,KAAK,CAAC,CAAC;QACvB,QAAQ,KAAK,CAAC,OAAO,EAAE,CAAC;YACtB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;gBAClB,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,cAAc,EAAE,CAAC;oBACjB,IAAI,CAAC,YAAY,EAAE,CAAC;wBAClB,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;oBACzB,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,aAAa,CAAC,CAAC,CAAC,CAAC;gBACnB,CAAC;gBACD,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,MAAM;YACR,CAAC;YACD,KAAK,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;gBAChB,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,cAAc,EAAE,CAAC;oBACjB,IAAI,CAAC,YAAY,EAAE,CAAC;wBAClB,aAAa,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;oBAC1B,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpB,CAAC;gBACD,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,MAAM;YACR,CAAC;YACD,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;gBACnB,kFAAkF;gBAClF,gFAAgF;gBAChF,0DAA0D;gBAC1D,IAAI,CAAC,YAAY,IAAI,CAAC,MAAM,EAAE,CAAC;oBAC7B,KAAK,CAAC,cAAc,EAAE,CAAC;gBACzB,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;gBACnB,+EAA+E;gBAC/E,kCAAkC;gBAClC,IAAI,MAAM,IAAI,YAAY,IAAI,CAAC,UAAU,EAAE,CAAC;oBAC1C,MAAM;gBACR,CAAC;gBACD,IAAI,CAAC,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,QAAQ,CAAA,EAAE,CAAC;oBAC1B,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;gBACxB,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,OAAO,CAAC,IAAI,CAAC;YAClB,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;gBACnB,6EAA6E;gBAC7E,2DAA2D;gBAC3D,IAAI,YAAY,IAAI,cAAc,EAAE,CAAC;oBACnC,MAAM;gBACR,CAAC;gBACD,IAAI,UAAU,IAAI,CAAC,UAAU,CAAC,QAAQ,IAAI,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC7F,WAAW,EAAE,CAAC;gBAChB,CAAC;qBAAM,IAAI,mBAAmB,EAAE,CAAC;oBAC/B,aAAa,EAAE,CAAC;gBAClB,CAAC;gBAED,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,MAAM;YACR,CAAC;YACD,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;gBACpB,aAAa,EAAE,CAAC;gBAChB,aAAa,EAAE,CAAC;gBAChB,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,IAAI,MAAM,EAAE,CAAC;oBACX,KAAK,CAAC,eAAe,EAAE,CAAC;gBAC1B,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;gBACjB,kFAAkF;gBAClF,oFAAoF;gBACpF,mFAAmF;gBACnF,sCAAsC;gBACtC,IAAI,YAAY,EAAE,CAAC;oBACjB,MAAM;gBACR,CAAC;gBACD,gFAAgF;gBAChF,8CAA8C;gBAC9C,IAAI,gBAAgB,EAAE,CAAC;oBACrB,aAAa,EAAE,CAAC;gBAClB,CAAC;gBACD,aAAa,EAAE,CAAC;gBAChB,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,CAAC,KAA0B,EAAE,EAAE;QAC7C,wFAAwF;QACxF,0FAA0F;QAC1F,oFAAoF;QACpF,2DAA2D;QAC3D,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,CAAC,KAAK,IAAI,CAAC,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,QAAQ,CAAA,IAAI,CAAC,YAAY,EAAE,CAAC;YAC9E,QAAQ,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC;IAEF,OAAO;QACL,MAAM;QACN,UAAU;QACV,aAAa;QACb,mBAAmB;QACnB,UAAU;QACV,aAAa;QACb,SAAS;QACT,OAAO;QACP,cAAc;QACd,aAAa;QACb,oBAAoB;QACpB,cAAc;QACd,aAAa;QACb,eAAe;QACf,cAAc;QACd,iBAAiB;QACjB,aAAa;QACb,oBAAoB;KACrB,CAAC;AACJ,CAAC","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\n\nimport { useOpenState } from '../../internal/components/options-list/utils/use-open-state';\nimport { fireCancelableEvent, isPlainLeftClick } from '../../internal/events';\nimport { KeyCode } from '../../internal/keycode';\nimport { CancelableEventHandler } from '../../types/events';\nimport { ButtonDropdownProps, ButtonDropdownSettings, GroupToggle, HighlightProps, ItemActivate } from '../interfaces';\nimport { filterItems } from './filter-items';\nimport useHighlightedMenu from './use-highlighted-menu';\nimport { getItemTarget, isCheckboxItem, isItemGroup, isLinkItem } from './utils';\n\ninterface UseButtonDropdownOptions extends ButtonDropdownSettings {\n items: ButtonDropdownProps.Items;\n onItemClick?: CancelableEventHandler<ButtonDropdownProps.ItemClickDetails>;\n onItemFollow?: CancelableEventHandler<ButtonDropdownProps.ItemClickDetails>;\n onReturnFocus: () => void;\n expandToViewport?: boolean;\n hasFiltering: boolean;\n}\n\ninterface UseButtonDropdownApi extends HighlightProps {\n isOpen: boolean;\n onKeyDown: (event: React.KeyboardEvent) => void;\n onKeyUp: (event: React.KeyboardEvent) => void;\n onItemActivate: ItemActivate;\n onGroupToggle: GroupToggle;\n onDropdownFocusLeave: () => void;\n toggleDropdown: (options?: { moveHighlightOnOpen?: boolean }) => void;\n closeDropdown: () => void;\n setIsUsingMouse: (isUsingMouse: boolean) => void;\n filteringValue: string;\n setFilteringValue: (value: string) => void;\n filteredItems: ButtonDropdownProps.Items;\n showExpandableGroups: boolean;\n}\n\nexport function useButtonDropdown({\n items,\n onItemClick,\n onItemFollow,\n onReturnFocus,\n hasExpandableGroups,\n isInRestrictedView = false,\n expandToViewport = false,\n hasFiltering,\n}: UseButtonDropdownOptions): UseButtonDropdownApi {\n const [filteringValue, setFilteringValue] = useState('');\n\n const filteredItems = useMemo(\n () => (hasFiltering && filteringValue ? filterItems(items, filteringValue) : items),\n [hasFiltering, filteringValue, items]\n );\n\n const showExpandableGroups = hasExpandableGroups && !filteringValue;\n\n const {\n targetItem,\n isHighlighted,\n isKeyboardHighlight,\n isExpanded,\n highlightItem,\n moveHighlight,\n expandGroup,\n collapseGroup,\n reset,\n setIsUsingMouse,\n } = useHighlightedMenu({\n items: filteredItems,\n hasExpandableGroups: showExpandableGroups,\n isInRestrictedView,\n });\n\n // If the filtering input changes, the options list also changes,\n // so the highlight isn't valid anymore.\n const prevFilteringValue = useRef(filteringValue);\n useEffect(() => {\n if (prevFilteringValue.current !== filteringValue) {\n prevFilteringValue.current = filteringValue;\n reset();\n }\n }, [filteringValue, reset]);\n\n const { isOpen, closeDropdown: closeDropdownState, ...openStateProps } = useOpenState({ onClose: reset });\n\n const closeDropdown = () => {\n setFilteringValue('');\n closeDropdownState();\n };\n\n const toggleDropdown = (options: { moveHighlightOnOpen?: boolean } = {}) => {\n const moveHighlightOnOpen = options.moveHighlightOnOpen ?? true;\n if (!isOpen && moveHighlightOnOpen && !hasFiltering) {\n moveHighlight(1);\n }\n if (isOpen) {\n setFilteringValue('');\n }\n openStateProps.toggleDropdown();\n };\n\n const onDropdownFocusLeave = () => {\n if (hasFiltering && isOpen) {\n if (expandToViewport) {\n // When expanded to viewport the focus can't move naturally to the next element.\n // Returning the focus to the trigger instead.\n onReturnFocus();\n }\n closeDropdown();\n }\n };\n\n const onGroupToggle: GroupToggle = item => (!isExpanded(item) ? expandGroup(item) : collapseGroup());\n\n const onItemActivate: ItemActivate = (item, event) => {\n const isCheckbox = isCheckboxItem(item);\n const isLink = isLinkItem(item);\n const details = {\n id: item.id || 'undefined',\n href: isLink ? item.href : undefined,\n external: isLink ? item.external : undefined,\n target: isLink ? getItemTarget(item) : undefined,\n checked: isCheckbox ? !item.checked : undefined,\n };\n onReturnFocus();\n if (onItemFollow && isLink && isPlainLeftClick(event)) {\n fireCancelableEvent(onItemFollow, details, event);\n }\n if (onItemClick) {\n fireCancelableEvent(onItemClick, details, event);\n }\n closeDropdown();\n };\n\n const openAndSelectFirst = (event: React.KeyboardEvent) => {\n toggleDropdown();\n event.preventDefault();\n };\n\n const actOnParentDropdown = (event: React.KeyboardEvent) => {\n // if there is no highlighted item we act on the trigger by opening or closing dropdown\n if (!targetItem) {\n if (isOpen && !isInRestrictedView) {\n toggleDropdown();\n } else {\n openAndSelectFirst(event);\n }\n } else {\n if (isItemGroup(targetItem)) {\n onGroupToggle(targetItem, event);\n } else {\n onItemActivate(targetItem, event);\n }\n }\n };\n\n const activate = (event: React.KeyboardEvent, isEnter?: boolean) => {\n setIsUsingMouse(false);\n\n // if item is a link we rely on default behavior of an anchor, no need to prevent\n if (targetItem && isLinkItem(targetItem) && isEnter) {\n return;\n }\n\n event.preventDefault();\n actOnParentDropdown(event);\n };\n\n const onKeyDown = (event: React.KeyboardEvent) => {\n setIsUsingMouse(false);\n switch (event.keyCode) {\n case KeyCode.down: {\n if (!isOpen) {\n toggleDropdown();\n if (!hasFiltering) {\n moveHighlight(1, true);\n }\n } else {\n moveHighlight(1);\n }\n event.preventDefault();\n break;\n }\n case KeyCode.up: {\n if (!isOpen) {\n toggleDropdown();\n if (!hasFiltering) {\n moveHighlight(-1, true);\n }\n } else {\n moveHighlight(-1);\n }\n event.preventDefault();\n break;\n }\n case KeyCode.space: {\n // Prevent scrolling the list of items and highlighting the trigger when filtering\n // isn't active. Hitting space when filtering is active should just type a space\n // character into the input, or activate the clear button.\n if (!hasFiltering && !isOpen) {\n event.preventDefault();\n }\n break;\n }\n case KeyCode.enter: {\n // While filtering, pressing Enter without a highlighted item should not select\n // any item or close the dropdown.\n if (isOpen && hasFiltering && !targetItem) {\n break;\n }\n if (!targetItem?.disabled) {\n activate(event, true);\n }\n break;\n }\n case KeyCode.left:\n case KeyCode.right: {\n // When filtering is enabled and there's text in the filter input, left/right\n // arrow keys should move the caret between the characters.\n if (hasFiltering && filteringValue) {\n break;\n }\n if (targetItem && !targetItem.disabled && isItemGroup(targetItem) && !isExpanded(targetItem)) {\n expandGroup();\n } else if (hasExpandableGroups) {\n collapseGroup();\n }\n\n event.preventDefault();\n break;\n }\n case KeyCode.escape: {\n onReturnFocus();\n closeDropdown();\n event.preventDefault();\n if (isOpen) {\n event.stopPropagation();\n }\n break;\n }\n case KeyCode.tab: {\n // In filtering mode the dropdown contains multiple focusable elements (the filter\n // input and its clear button). Tabbing between them must not close the dropdown, so\n // closing on Tab is handled by onDropdownFocusLeave instead, which only fires once\n // focus actually leaves the dropdown.\n if (hasFiltering) {\n break;\n }\n // When expanded to viewport the focus can't move naturally to the next element.\n // Returning the focus to the trigger instead.\n if (expandToViewport) {\n onReturnFocus();\n }\n closeDropdown();\n break;\n }\n }\n };\n const onKeyUp = (event: React.KeyboardEvent) => {\n // When using a roving tabindex (filtering disabled), we need to handle activating items\n // with Space separately because there is a bug in Firefox where changing the focus during\n // a Space keydown event it will trigger unexpected click events on the new element.\n // See https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n if (event.keyCode === KeyCode.space && !targetItem?.disabled && !hasFiltering) {\n activate(event);\n }\n };\n\n return {\n isOpen,\n targetItem,\n isHighlighted,\n isKeyboardHighlight,\n isExpanded,\n highlightItem,\n onKeyDown,\n onKeyUp,\n onItemActivate,\n onGroupToggle,\n onDropdownFocusLeave,\n toggleDropdown,\n closeDropdown,\n setIsUsingMouse,\n filteringValue,\n setFilteringValue,\n filteredItems,\n showExpandableGroups,\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../../src/error-boundary/internal.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AAElF,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,kCAAkC,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAKjH,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,WAAW;QACnB,SAAS,CAAC,EAAE;YAAE,UAAU,CAAC,IAAI,IAAI,CAAC;YAAC,gBAAgB,CAAC,IAAI,IAAI,CAAA;SAAE,CAAC;KAChE;CACF;AAaD,UAAU,0BACR,SAAQ,YAAY,CAAC,kBAAkB,EAAE,gBAAgB,GAAG,cAAc,CAAC,EACzE,0BAA0B;CAAG;AAEjC,wBAAgB,qBAAqB,CAAC,EACpC,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,GAAG,KAAK,EACT,EAAE,0BAA0B,eA8B5B;AAED,wBAAgB,oBAAoB,CAAC,EAAE,OAAO,EAAE,cAAsB,EAAE,QAAQ,EAAE,EAAE,yBAAyB,eAa5G;AAED,wBAAgB,6BAA6B,CAAC,EAC5C,OAAO,EACP,cAAsB,EACtB,QAAQ,EACR,cAA4B,EAC5B,aAAa,GACd,EAAE,kCAAkC,eAuBpC"}
1
+ {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../../src/error-boundary/internal.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AAElF,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,kCAAkC,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAKjH,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,WAAW;QACnB,SAAS,CAAC,EAAE;YAAE,UAAU,CAAC,IAAI,IAAI,CAAC;YAAC,gBAAgB,CAAC,IAAI,IAAI,CAAA;SAAE,CAAC;KAChE;CACF;AAaD,UAAU,0BACR,SAAQ,YAAY,CAAC,kBAAkB,EAAE,gBAAgB,GAAG,cAAc,CAAC,EACzE,0BAA0B;CAAG;AAEjC,wBAAgB,qBAAqB,CAAC,EACpC,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,GAAG,KAAK,EACT,EAAE,0BAA0B,eA8B5B;AAED,wBAAgB,oBAAoB,CAAC,EAAE,OAAO,EAAE,cAAsB,EAAE,QAAQ,EAAE,EAAE,yBAAyB,eAa5G;AAED,wBAAgB,6BAA6B,CAAC,EAC5C,OAAO,EACP,cAAsB,EACtB,QAAQ,EACR,cAA4B,EAC5B,aAAa,GACd,EAAE,kCAAkC,eAwBpC"}
@@ -46,6 +46,7 @@ export function AppLayoutBuiltInErrorBoundary({ wrapper, suppressNested = false,
46
46
  errorMessage: (_c = (_b = error === null || error === void 0 ? void 0 : error.error) === null || _b === void 0 ? void 0 : _b.message) !== null && _c !== void 0 ? _c : '',
47
47
  appLayoutPart: appLayoutPart !== null && appLayoutPart !== void 0 ? appLayoutPart : '',
48
48
  });
49
+ console.log(`[AwsUiAppLayoutError] appLayoutPart=${appLayoutPart !== null && appLayoutPart !== void 0 ? appLayoutPart : ''}`, error === null || error === void 0 ? void 0 : error.error);
49
50
  } },
50
51
  React.createElement(ErrorBoundariesContext.Provider, { value: { ...context, suppressed: nextSuppressed, renderFallback } }, children)));
51
52
  }
@@ -1 +1 @@
1
- {"version":3,"file":"internal.js","sourceRoot":"","sources":["../../../src/error-boundary/internal.tsx"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,sCAAsC;AAEtC,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE9E,OAAO,EAAE,YAAY,EAAE,MAAM,+CAA+C,CAAC;AAG7E,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAGnD,OAAO,MAAM,MAAM,iBAAiB,CAAC;AASrC,MAAM,cAAc,GAAG,MAAM,EAAE,CAAC;AAEhC,MAAM,sBAAsB,GAAG,aAAa,CAI1C;IACA,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;IACjB,UAAU,EAAE,cAAc;CAC3B,CAAC,CAAC;AAMH,MAAM,UAAU,qBAAqB,CAAC,EACpC,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,GAAG,KAAK,EACmB;IAC3B,MAAM,OAAO,GAAG,UAAU,CAAC,sBAAsB,CAAC,CAAC;IACnD,MAAM,cAAc,GAAG,OAAO,CAAC,UAAU,KAAK,IAAI,IAAI,YAAY,CAAC;IACnE,MAAM,cAAc,GAAG,cAAc,IAAI,cAAc,CAAC;IAExD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,UAAU,GAAG,CAAC,IAA2B,EAAE,EAAE;QACjD,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACpB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;YACtB,CAAC;YACD,IAAI,CAAC,SAAS,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YACvD,IAAI,CAAC,SAAS,CAAC,gBAAgB,GAAG,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAChE,CAAC;IACH,CAAC,CAAC;IACF,MAAM,SAAS,GAAG,YAAY,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;IAE9D,OAAO,CACL,6BAAK,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,gBAAgB,CAAC,4BAA0B,KAAK,CAAC,eAAe,IACpG,CAAC,cAAc,CAAC,CAAC,CAAC,CACjB,oBAAC,iBAAiB,OAAK,KAAK,EAAE,WAAW,EAAE,WAAW;QACpD,oBAAC,sBAAsB,CAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,IAC7E,QAAQ,CACuB,CAChB,CACrB,CAAC,CAAC,CAAC,CACF,0CAAG,QAAQ,CAAI,CAChB,CACG,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,EAAE,OAAO,EAAE,cAAc,GAAG,KAAK,EAAE,QAAQ,EAA6B;IAC3G,MAAM,OAAO,GAAG,UAAU,CAAC,sBAAsB,CAAC,CAAC;IACnD,MAAM,cAAc,GAAG,OAAO,CAAC,UAAU,KAAK,IAAI,IAAI,OAAO,CAAC,UAAU,KAAK,cAAc,CAAC;IAC5F,MAAM,cAAc,GAAG,cAAc,IAAI,cAAc,CAAC;IACxD,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CACvB,oBAAC,iBAAiB,OAAK,OAAO,EAAE,OAAO,EAAE,OAAO;QAC9C,oBAAC,sBAAsB,CAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,IAC/E,QAAQ,CACuB,CAChB,CACrB,CAAC,CAAC,CAAC,CACF,0CAAG,QAAQ,CAAI,CAChB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,EAC5C,OAAO,EACP,cAAc,GAAG,KAAK,EACtB,QAAQ,EACR,cAAc,GAAG,GAAG,EAAE,CAAC,yCAAK,EAC5B,aAAa,GACsB;IACnC,MAAM,OAAO,GAAG,UAAU,CAAC,sBAAsB,CAAC,CAAC;IACnD,MAAM,cAAc,GAAG,OAAO,CAAC,UAAU,KAAK,IAAI,IAAI,OAAO,CAAC,UAAU,KAAK,cAAc,CAAC;IAC5F,MAAM,cAAc,GAAG,cAAc,IAAI,cAAc,CAAC;IACxD,OAAO,CACL,oBAAC,iBAAiB,OACZ,OAAO,EACX,OAAO,EAAE,OAAO,EAChB,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,MAAM,CAAC,0BAA0B,CAAC,EAC7C,OAAO,EAAE,KAAK,CAAC,EAAE;;YACf,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,wDAAG,KAAK,CAAC,CAAC;YAC1B,OAAO,CAAC,mBAAmB,CAAC,uCAAuC,EAAE;gBACnE,YAAY,EAAE,MAAA,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,KAAK,0CAAE,OAAO,mCAAI,EAAE;gBACzC,aAAa,EAAE,aAAa,aAAb,aAAa,cAAb,aAAa,GAAI,EAAE;aACnC,CAAC,CAAC;QACL,CAAC;QAED,oBAAC,sBAAsB,CAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,IAC/F,QAAQ,CACuB,CAChB,CACrB,CAAC;AACJ,CAAC;AAWD,MAAM,iBAAkB,SAAQ,SAAqD;IACnF,YAAY,KAA6B;QACvC,KAAK,CAAC,KAAK,CAAC,CAAC;QACb,IAAI,CAAC,KAAK,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACnC,CAAC;IAED,MAAM,CAAC,wBAAwB;QAC7B,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED,iBAAiB,CAAC,KAAY,EAAE,SAA0B;;QACxD,MAAA,MAAA,IAAI,CAAC,KAAK,EAAC,OAAO,mDAAG,EAAE,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC;IAC1F,CAAC;IAED,MAAM;;QACJ,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;YAClD,MAAM,QAAQ,GAAG,oBAAC,qBAAqB,OAAK,IAAI,CAAC,KAAK,GAAI,CAAC;YAC3D,OAAO,MAAA,MAAA,MAAA,IAAI,CAAC,KAAK,EAAC,OAAO,mDAAG,QAAQ,CAAC,mCAAI,QAAQ,CAAC;QACpD,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;IAC7B,CAAC;CACF","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport React, { Component, createContext, useContext, useState } from 'react';\n\nimport { useMergeRefs } from '@cloudscape-design/component-toolkit/internal';\n\nimport { InternalBaseComponentProps } from '../internal/hooks/use-base-component';\nimport { metrics } from '../internal/metrics';\nimport { SomeRequired } from '../internal/types';\nimport { ErrorBoundaryFallback } from './fallback';\nimport { AppLayoutBuiltInErrorBoundaryProps, BuiltInErrorBoundaryProps, ErrorBoundaryProps } from './interfaces';\n\nimport styles from './styles.css.js';\n\n// Helper methods attached to the component's root node for e2e testing.\ndeclare global {\n interface HTMLElement {\n __awsui__?: { forceError?(): void; clearForcedError?(): void };\n }\n}\n\nconst RootSuppressed = Symbol();\n\nconst ErrorBoundariesContext = createContext<\n Pick<ErrorBoundaryProps, 'renderFallback' | 'i18nStrings' | 'onError' | 'errorBoundaryId'> & {\n suppressed: boolean | typeof RootSuppressed;\n }\n>({\n onError: () => {},\n suppressed: RootSuppressed,\n});\n\ninterface InternalErrorBoundaryProps\n extends SomeRequired<ErrorBoundaryProps, 'suppressNested' | 'suppressible'>,\n InternalBaseComponentProps {}\n\nexport function InternalErrorBoundary({\n children,\n suppressNested,\n suppressible,\n __internalRootRef,\n ...props\n}: InternalErrorBoundaryProps) {\n const context = useContext(ErrorBoundariesContext);\n const thisSuppressed = context.suppressed === true && suppressible;\n const nextSuppressed = suppressNested || thisSuppressed;\n\n const [forcedError, setForcedError] = useState(false);\n const setElement = (node: null | HTMLDivElement) => {\n if (node) {\n if (!node.__awsui__) {\n node.__awsui__ = {};\n }\n node.__awsui__.forceError = () => setForcedError(true);\n node.__awsui__.clearForcedError = () => setForcedError(false);\n }\n };\n const mergedRef = useMergeRefs(setElement, __internalRootRef);\n\n return (\n <div ref={mergedRef} className={styles['error-boundary']} data-awsui-boundary-id={props.errorBoundaryId}>\n {!thisSuppressed ? (\n <ErrorBoundaryImpl {...props} forcedError={forcedError}>\n <ErrorBoundariesContext.Provider value={{ ...props, suppressed: nextSuppressed }}>\n {children}\n </ErrorBoundariesContext.Provider>\n </ErrorBoundaryImpl>\n ) : (\n <>{children}</>\n )}\n </div>\n );\n}\n\nexport function BuiltInErrorBoundary({ wrapper, suppressNested = false, children }: BuiltInErrorBoundaryProps) {\n const context = useContext(ErrorBoundariesContext);\n const thisSuppressed = context.suppressed === true || context.suppressed === RootSuppressed;\n const nextSuppressed = suppressNested || thisSuppressed;\n return !thisSuppressed ? (\n <ErrorBoundaryImpl {...context} wrapper={wrapper}>\n <ErrorBoundariesContext.Provider value={{ ...context, suppressed: nextSuppressed }}>\n {children}\n </ErrorBoundariesContext.Provider>\n </ErrorBoundaryImpl>\n ) : (\n <>{children}</>\n );\n}\n\nexport function AppLayoutBuiltInErrorBoundary({\n wrapper,\n suppressNested = false,\n children,\n renderFallback = () => <></>,\n appLayoutPart,\n}: AppLayoutBuiltInErrorBoundaryProps) {\n const context = useContext(ErrorBoundariesContext);\n const thisSuppressed = context.suppressed === true || context.suppressed === RootSuppressed;\n const nextSuppressed = suppressNested || thisSuppressed;\n return (\n <ErrorBoundaryImpl\n {...context}\n wrapper={wrapper}\n renderFallback={renderFallback}\n className={styles['app-layout-part-fallback']}\n onError={error => {\n context?.onError?.(error);\n metrics.sendOpsMetricObject('awsui-app-layout-error-boundary-fired', {\n errorMessage: error?.error?.message ?? '',\n appLayoutPart: appLayoutPart ?? '',\n });\n }}\n >\n <ErrorBoundariesContext.Provider value={{ ...context, suppressed: nextSuppressed, renderFallback }}>\n {children}\n </ErrorBoundariesContext.Provider>\n </ErrorBoundaryImpl>\n );\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n}\n\ninterface ErrorBoundaryImplProps extends ErrorBoundaryProps {\n wrapper?: (content: React.ReactNode) => React.ReactNode;\n forcedError?: boolean;\n}\n\nclass ErrorBoundaryImpl extends Component<ErrorBoundaryImplProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryImplProps) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError() {\n return { hasError: true };\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo): void {\n this.props.onError?.({ error, errorInfo, errorBoundaryId: this.props.errorBoundaryId });\n }\n\n render() {\n if (this.state.hasError || this.props.forcedError) {\n const fallback = <ErrorBoundaryFallback {...this.props} />;\n return this.props.wrapper?.(fallback) ?? fallback;\n }\n return this.props.children;\n }\n}\n"]}
1
+ {"version":3,"file":"internal.js","sourceRoot":"","sources":["../../../src/error-boundary/internal.tsx"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,sCAAsC;AAEtC,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE9E,OAAO,EAAE,YAAY,EAAE,MAAM,+CAA+C,CAAC;AAG7E,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAGnD,OAAO,MAAM,MAAM,iBAAiB,CAAC;AASrC,MAAM,cAAc,GAAG,MAAM,EAAE,CAAC;AAEhC,MAAM,sBAAsB,GAAG,aAAa,CAI1C;IACA,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;IACjB,UAAU,EAAE,cAAc;CAC3B,CAAC,CAAC;AAMH,MAAM,UAAU,qBAAqB,CAAC,EACpC,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,GAAG,KAAK,EACmB;IAC3B,MAAM,OAAO,GAAG,UAAU,CAAC,sBAAsB,CAAC,CAAC;IACnD,MAAM,cAAc,GAAG,OAAO,CAAC,UAAU,KAAK,IAAI,IAAI,YAAY,CAAC;IACnE,MAAM,cAAc,GAAG,cAAc,IAAI,cAAc,CAAC;IAExD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,UAAU,GAAG,CAAC,IAA2B,EAAE,EAAE;QACjD,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACpB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;YACtB,CAAC;YACD,IAAI,CAAC,SAAS,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YACvD,IAAI,CAAC,SAAS,CAAC,gBAAgB,GAAG,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAChE,CAAC;IACH,CAAC,CAAC;IACF,MAAM,SAAS,GAAG,YAAY,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;IAE9D,OAAO,CACL,6BAAK,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,gBAAgB,CAAC,4BAA0B,KAAK,CAAC,eAAe,IACpG,CAAC,cAAc,CAAC,CAAC,CAAC,CACjB,oBAAC,iBAAiB,OAAK,KAAK,EAAE,WAAW,EAAE,WAAW;QACpD,oBAAC,sBAAsB,CAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,IAC7E,QAAQ,CACuB,CAChB,CACrB,CAAC,CAAC,CAAC,CACF,0CAAG,QAAQ,CAAI,CAChB,CACG,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,EAAE,OAAO,EAAE,cAAc,GAAG,KAAK,EAAE,QAAQ,EAA6B;IAC3G,MAAM,OAAO,GAAG,UAAU,CAAC,sBAAsB,CAAC,CAAC;IACnD,MAAM,cAAc,GAAG,OAAO,CAAC,UAAU,KAAK,IAAI,IAAI,OAAO,CAAC,UAAU,KAAK,cAAc,CAAC;IAC5F,MAAM,cAAc,GAAG,cAAc,IAAI,cAAc,CAAC;IACxD,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CACvB,oBAAC,iBAAiB,OAAK,OAAO,EAAE,OAAO,EAAE,OAAO;QAC9C,oBAAC,sBAAsB,CAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,IAC/E,QAAQ,CACuB,CAChB,CACrB,CAAC,CAAC,CAAC,CACF,0CAAG,QAAQ,CAAI,CAChB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,EAC5C,OAAO,EACP,cAAc,GAAG,KAAK,EACtB,QAAQ,EACR,cAAc,GAAG,GAAG,EAAE,CAAC,yCAAK,EAC5B,aAAa,GACsB;IACnC,MAAM,OAAO,GAAG,UAAU,CAAC,sBAAsB,CAAC,CAAC;IACnD,MAAM,cAAc,GAAG,OAAO,CAAC,UAAU,KAAK,IAAI,IAAI,OAAO,CAAC,UAAU,KAAK,cAAc,CAAC;IAC5F,MAAM,cAAc,GAAG,cAAc,IAAI,cAAc,CAAC;IACxD,OAAO,CACL,oBAAC,iBAAiB,OACZ,OAAO,EACX,OAAO,EAAE,OAAO,EAChB,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,MAAM,CAAC,0BAA0B,CAAC,EAC7C,OAAO,EAAE,KAAK,CAAC,EAAE;;YACf,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,wDAAG,KAAK,CAAC,CAAC;YAC1B,OAAO,CAAC,mBAAmB,CAAC,uCAAuC,EAAE;gBACnE,YAAY,EAAE,MAAA,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,KAAK,0CAAE,OAAO,mCAAI,EAAE;gBACzC,aAAa,EAAE,aAAa,aAAb,aAAa,cAAb,aAAa,GAAI,EAAE;aACnC,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,uCAAuC,aAAa,aAAb,aAAa,cAAb,aAAa,GAAI,EAAE,EAAE,EAAE,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,KAAK,CAAC,CAAC;QAC1F,CAAC;QAED,oBAAC,sBAAsB,CAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,IAC/F,QAAQ,CACuB,CAChB,CACrB,CAAC;AACJ,CAAC;AAWD,MAAM,iBAAkB,SAAQ,SAAqD;IACnF,YAAY,KAA6B;QACvC,KAAK,CAAC,KAAK,CAAC,CAAC;QACb,IAAI,CAAC,KAAK,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACnC,CAAC;IAED,MAAM,CAAC,wBAAwB;QAC7B,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC5B,CAAC;IAED,iBAAiB,CAAC,KAAY,EAAE,SAA0B;;QACxD,MAAA,MAAA,IAAI,CAAC,KAAK,EAAC,OAAO,mDAAG,EAAE,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC;IAC1F,CAAC;IAED,MAAM;;QACJ,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;YAClD,MAAM,QAAQ,GAAG,oBAAC,qBAAqB,OAAK,IAAI,CAAC,KAAK,GAAI,CAAC;YAC3D,OAAO,MAAA,MAAA,MAAA,IAAI,CAAC,KAAK,EAAC,OAAO,mDAAG,QAAQ,CAAC,mCAAI,QAAQ,CAAC;QACpD,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;IAC7B,CAAC;CACF","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport React, { Component, createContext, useContext, useState } from 'react';\n\nimport { useMergeRefs } from '@cloudscape-design/component-toolkit/internal';\n\nimport { InternalBaseComponentProps } from '../internal/hooks/use-base-component';\nimport { metrics } from '../internal/metrics';\nimport { SomeRequired } from '../internal/types';\nimport { ErrorBoundaryFallback } from './fallback';\nimport { AppLayoutBuiltInErrorBoundaryProps, BuiltInErrorBoundaryProps, ErrorBoundaryProps } from './interfaces';\n\nimport styles from './styles.css.js';\n\n// Helper methods attached to the component's root node for e2e testing.\ndeclare global {\n interface HTMLElement {\n __awsui__?: { forceError?(): void; clearForcedError?(): void };\n }\n}\n\nconst RootSuppressed = Symbol();\n\nconst ErrorBoundariesContext = createContext<\n Pick<ErrorBoundaryProps, 'renderFallback' | 'i18nStrings' | 'onError' | 'errorBoundaryId'> & {\n suppressed: boolean | typeof RootSuppressed;\n }\n>({\n onError: () => {},\n suppressed: RootSuppressed,\n});\n\ninterface InternalErrorBoundaryProps\n extends SomeRequired<ErrorBoundaryProps, 'suppressNested' | 'suppressible'>,\n InternalBaseComponentProps {}\n\nexport function InternalErrorBoundary({\n children,\n suppressNested,\n suppressible,\n __internalRootRef,\n ...props\n}: InternalErrorBoundaryProps) {\n const context = useContext(ErrorBoundariesContext);\n const thisSuppressed = context.suppressed === true && suppressible;\n const nextSuppressed = suppressNested || thisSuppressed;\n\n const [forcedError, setForcedError] = useState(false);\n const setElement = (node: null | HTMLDivElement) => {\n if (node) {\n if (!node.__awsui__) {\n node.__awsui__ = {};\n }\n node.__awsui__.forceError = () => setForcedError(true);\n node.__awsui__.clearForcedError = () => setForcedError(false);\n }\n };\n const mergedRef = useMergeRefs(setElement, __internalRootRef);\n\n return (\n <div ref={mergedRef} className={styles['error-boundary']} data-awsui-boundary-id={props.errorBoundaryId}>\n {!thisSuppressed ? (\n <ErrorBoundaryImpl {...props} forcedError={forcedError}>\n <ErrorBoundariesContext.Provider value={{ ...props, suppressed: nextSuppressed }}>\n {children}\n </ErrorBoundariesContext.Provider>\n </ErrorBoundaryImpl>\n ) : (\n <>{children}</>\n )}\n </div>\n );\n}\n\nexport function BuiltInErrorBoundary({ wrapper, suppressNested = false, children }: BuiltInErrorBoundaryProps) {\n const context = useContext(ErrorBoundariesContext);\n const thisSuppressed = context.suppressed === true || context.suppressed === RootSuppressed;\n const nextSuppressed = suppressNested || thisSuppressed;\n return !thisSuppressed ? (\n <ErrorBoundaryImpl {...context} wrapper={wrapper}>\n <ErrorBoundariesContext.Provider value={{ ...context, suppressed: nextSuppressed }}>\n {children}\n </ErrorBoundariesContext.Provider>\n </ErrorBoundaryImpl>\n ) : (\n <>{children}</>\n );\n}\n\nexport function AppLayoutBuiltInErrorBoundary({\n wrapper,\n suppressNested = false,\n children,\n renderFallback = () => <></>,\n appLayoutPart,\n}: AppLayoutBuiltInErrorBoundaryProps) {\n const context = useContext(ErrorBoundariesContext);\n const thisSuppressed = context.suppressed === true || context.suppressed === RootSuppressed;\n const nextSuppressed = suppressNested || thisSuppressed;\n return (\n <ErrorBoundaryImpl\n {...context}\n wrapper={wrapper}\n renderFallback={renderFallback}\n className={styles['app-layout-part-fallback']}\n onError={error => {\n context?.onError?.(error);\n metrics.sendOpsMetricObject('awsui-app-layout-error-boundary-fired', {\n errorMessage: error?.error?.message ?? '',\n appLayoutPart: appLayoutPart ?? '',\n });\n console.log(`[AwsUiAppLayoutError] appLayoutPart=${appLayoutPart ?? ''}`, error?.error);\n }}\n >\n <ErrorBoundariesContext.Provider value={{ ...context, suppressed: nextSuppressed, renderFallback }}>\n {children}\n </ErrorBoundariesContext.Provider>\n </ErrorBoundaryImpl>\n );\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n}\n\ninterface ErrorBoundaryImplProps extends ErrorBoundaryProps {\n wrapper?: (content: React.ReactNode) => React.ReactNode;\n forcedError?: boolean;\n}\n\nclass ErrorBoundaryImpl extends Component<ErrorBoundaryImplProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryImplProps) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError() {\n return { hasError: true };\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo): void {\n this.props.onError?.({ error, errorInfo, errorBoundaryId: this.props.errorBoundaryId });\n }\n\n render() {\n if (this.state.hasError || this.props.forcedError) {\n const fallback = <ErrorBoundaryFallback {...this.props} />;\n return this.props.wrapper?.(fallback) ?? fallback;\n }\n return this.props.children;\n }\n}\n"]}
@@ -1,11 +1,11 @@
1
1
 
2
2
  import './styles.scoped.css';
3
3
  export default {
4
- "help-panel": "awsui_help-panel_1d237_w9ngm_181",
5
- "loading": "awsui_loading_1d237_w9ngm_354",
6
- "header": "awsui_header_1d237_w9ngm_359",
7
- "with-toolbar": "awsui_with-toolbar_1d237_w9ngm_377",
8
- "content": "awsui_content_1d237_w9ngm_396",
9
- "footer": "awsui_footer_1d237_w9ngm_448"
4
+ "help-panel": "awsui_help-panel_1d237_1lt51_181",
5
+ "loading": "awsui_loading_1d237_1lt51_351",
6
+ "header": "awsui_header_1d237_1lt51_356",
7
+ "with-toolbar": "awsui_with-toolbar_1d237_1lt51_374",
8
+ "content": "awsui_content_1d237_1lt51_393",
9
+ "footer": "awsui_footer_1d237_1lt51_445"
10
10
  };
11
11