@patternfly/react-core 5.0.0-alpha.14 → 5.0.0-alpha.15

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 (178) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/components/AboutModal/AboutModal.d.ts +5 -23
  3. package/components/AboutModal/AboutModal.d.ts.map +1 -1
  4. package/components/AboutModal/AboutModal.js +26 -91
  5. package/components/AboutModal/AboutModal.js.map +1 -1
  6. package/components/AboutModal/AboutModalBox.d.ts +2 -2
  7. package/components/AboutModal/AboutModalBox.d.ts.map +1 -1
  8. package/components/AboutModal/AboutModalBox.js +2 -2
  9. package/components/AboutModal/AboutModalBox.js.map +1 -1
  10. package/components/AboutModal/AboutModalBoxBrand.d.ts +3 -5
  11. package/components/AboutModal/AboutModalBoxBrand.d.ts.map +1 -1
  12. package/components/AboutModal/AboutModalBoxBrand.js +2 -2
  13. package/components/AboutModal/AboutModalBoxBrand.js.map +1 -1
  14. package/components/AboutModal/AboutModalBoxCloseButton.d.ts +0 -2
  15. package/components/AboutModal/AboutModalBoxCloseButton.d.ts.map +1 -1
  16. package/components/AboutModal/AboutModalBoxCloseButton.js +2 -2
  17. package/components/AboutModal/AboutModalBoxCloseButton.js.map +1 -1
  18. package/components/AboutModal/AboutModalBoxContent.d.ts +3 -7
  19. package/components/AboutModal/AboutModalBoxContent.d.ts.map +1 -1
  20. package/components/AboutModal/AboutModalBoxContent.js +3 -3
  21. package/components/AboutModal/AboutModalBoxContent.js.map +1 -1
  22. package/components/AboutModal/AboutModalBoxHeader.d.ts +2 -4
  23. package/components/AboutModal/AboutModalBoxHeader.d.ts.map +1 -1
  24. package/components/AboutModal/AboutModalBoxHeader.js +2 -2
  25. package/components/AboutModal/AboutModalBoxHeader.js.map +1 -1
  26. package/components/AboutModal/AboutModalBoxHero.d.ts +1 -3
  27. package/components/AboutModal/AboutModalBoxHero.d.ts.map +1 -1
  28. package/components/AboutModal/AboutModalBoxHero.js +2 -2
  29. package/components/AboutModal/AboutModalBoxHero.js.map +1 -1
  30. package/components/BackToTop/BackToTop.d.ts +1 -1
  31. package/components/DataList/DataList.d.ts +3 -3
  32. package/components/DataList/DataList.d.ts.map +1 -1
  33. package/components/DataList/DataList.js +3 -3
  34. package/components/DataList/DataList.js.map +1 -1
  35. package/components/DataList/DataListItem.d.ts.map +1 -1
  36. package/components/DataList/DataListItem.js +6 -5
  37. package/components/DataList/DataListItem.js.map +1 -1
  38. package/components/DualListSelector/DualListSelectorControl.d.ts +1 -1
  39. package/components/DualListSelector/DualListSelectorControlsWrapper.d.ts +1 -1
  40. package/components/DualListSelector/DualListSelectorListItem.d.ts +1 -1
  41. package/components/DualListSelector/DualListSelectorListWrapper.d.ts +1 -1
  42. package/components/Menu/MenuContent.d.ts +1 -1
  43. package/components/Menu/MenuGroup.d.ts +1 -1
  44. package/components/Menu/MenuInput.d.ts +1 -1
  45. package/components/Menu/MenuItem.d.ts +1 -1
  46. package/components/NotificationDrawer/NotificationDrawer.d.ts +1 -1
  47. package/components/Panel/Panel.d.ts +1 -1
  48. package/components/Tabs/Tab.d.ts +1 -1
  49. package/components/TextInputGroup/TextInputGroupMain.d.ts +1 -1
  50. package/dist/esm/components/AboutModal/AboutModal.d.ts +5 -23
  51. package/dist/esm/components/AboutModal/AboutModal.d.ts.map +1 -1
  52. package/dist/esm/components/AboutModal/AboutModal.js +26 -91
  53. package/dist/esm/components/AboutModal/AboutModal.js.map +1 -1
  54. package/dist/esm/components/AboutModal/AboutModalBox.d.ts +2 -2
  55. package/dist/esm/components/AboutModal/AboutModalBox.d.ts.map +1 -1
  56. package/dist/esm/components/AboutModal/AboutModalBox.js +2 -2
  57. package/dist/esm/components/AboutModal/AboutModalBox.js.map +1 -1
  58. package/dist/esm/components/AboutModal/AboutModalBoxBrand.d.ts +3 -5
  59. package/dist/esm/components/AboutModal/AboutModalBoxBrand.d.ts.map +1 -1
  60. package/dist/esm/components/AboutModal/AboutModalBoxBrand.js +2 -2
  61. package/dist/esm/components/AboutModal/AboutModalBoxBrand.js.map +1 -1
  62. package/dist/esm/components/AboutModal/AboutModalBoxCloseButton.d.ts +0 -2
  63. package/dist/esm/components/AboutModal/AboutModalBoxCloseButton.d.ts.map +1 -1
  64. package/dist/esm/components/AboutModal/AboutModalBoxCloseButton.js +2 -2
  65. package/dist/esm/components/AboutModal/AboutModalBoxCloseButton.js.map +1 -1
  66. package/dist/esm/components/AboutModal/AboutModalBoxContent.d.ts +3 -7
  67. package/dist/esm/components/AboutModal/AboutModalBoxContent.d.ts.map +1 -1
  68. package/dist/esm/components/AboutModal/AboutModalBoxContent.js +3 -3
  69. package/dist/esm/components/AboutModal/AboutModalBoxContent.js.map +1 -1
  70. package/dist/esm/components/AboutModal/AboutModalBoxHeader.d.ts +2 -4
  71. package/dist/esm/components/AboutModal/AboutModalBoxHeader.d.ts.map +1 -1
  72. package/dist/esm/components/AboutModal/AboutModalBoxHeader.js +2 -2
  73. package/dist/esm/components/AboutModal/AboutModalBoxHeader.js.map +1 -1
  74. package/dist/esm/components/AboutModal/AboutModalBoxHero.d.ts +1 -3
  75. package/dist/esm/components/AboutModal/AboutModalBoxHero.d.ts.map +1 -1
  76. package/dist/esm/components/AboutModal/AboutModalBoxHero.js +2 -2
  77. package/dist/esm/components/AboutModal/AboutModalBoxHero.js.map +1 -1
  78. package/dist/esm/components/BackToTop/BackToTop.d.ts +1 -1
  79. package/dist/esm/components/DataList/DataList.d.ts +3 -3
  80. package/dist/esm/components/DataList/DataList.d.ts.map +1 -1
  81. package/dist/esm/components/DataList/DataList.js +3 -3
  82. package/dist/esm/components/DataList/DataList.js.map +1 -1
  83. package/dist/esm/components/DataList/DataListItem.d.ts.map +1 -1
  84. package/dist/esm/components/DataList/DataListItem.js +6 -5
  85. package/dist/esm/components/DataList/DataListItem.js.map +1 -1
  86. package/dist/esm/components/DualListSelector/DualListSelectorControl.d.ts +1 -1
  87. package/dist/esm/components/DualListSelector/DualListSelectorControlsWrapper.d.ts +1 -1
  88. package/dist/esm/components/DualListSelector/DualListSelectorListItem.d.ts +1 -1
  89. package/dist/esm/components/DualListSelector/DualListSelectorListWrapper.d.ts +1 -1
  90. package/dist/esm/components/Menu/MenuContent.d.ts +1 -1
  91. package/dist/esm/components/Menu/MenuGroup.d.ts +1 -1
  92. package/dist/esm/components/Menu/MenuInput.d.ts +1 -1
  93. package/dist/esm/components/Menu/MenuItem.d.ts +1 -1
  94. package/dist/esm/components/NotificationDrawer/NotificationDrawer.d.ts +1 -1
  95. package/dist/esm/components/Panel/Panel.d.ts +1 -1
  96. package/dist/esm/components/Tabs/Tab.d.ts +1 -1
  97. package/dist/esm/components/TextInputGroup/TextInputGroupMain.d.ts +1 -1
  98. package/dist/js/components/AboutModal/AboutModal.d.ts +5 -23
  99. package/dist/js/components/AboutModal/AboutModal.d.ts.map +1 -1
  100. package/dist/js/components/AboutModal/AboutModal.js +27 -92
  101. package/dist/js/components/AboutModal/AboutModal.js.map +1 -1
  102. package/dist/js/components/AboutModal/AboutModalBox.d.ts +2 -2
  103. package/dist/js/components/AboutModal/AboutModalBox.d.ts.map +1 -1
  104. package/dist/js/components/AboutModal/AboutModalBox.js +2 -2
  105. package/dist/js/components/AboutModal/AboutModalBox.js.map +1 -1
  106. package/dist/js/components/AboutModal/AboutModalBoxBrand.d.ts +3 -5
  107. package/dist/js/components/AboutModal/AboutModalBoxBrand.d.ts.map +1 -1
  108. package/dist/js/components/AboutModal/AboutModalBoxBrand.js +2 -2
  109. package/dist/js/components/AboutModal/AboutModalBoxBrand.js.map +1 -1
  110. package/dist/js/components/AboutModal/AboutModalBoxCloseButton.d.ts +0 -2
  111. package/dist/js/components/AboutModal/AboutModalBoxCloseButton.d.ts.map +1 -1
  112. package/dist/js/components/AboutModal/AboutModalBoxCloseButton.js +2 -2
  113. package/dist/js/components/AboutModal/AboutModalBoxCloseButton.js.map +1 -1
  114. package/dist/js/components/AboutModal/AboutModalBoxContent.d.ts +3 -7
  115. package/dist/js/components/AboutModal/AboutModalBoxContent.d.ts.map +1 -1
  116. package/dist/js/components/AboutModal/AboutModalBoxContent.js +3 -3
  117. package/dist/js/components/AboutModal/AboutModalBoxContent.js.map +1 -1
  118. package/dist/js/components/AboutModal/AboutModalBoxHeader.d.ts +2 -4
  119. package/dist/js/components/AboutModal/AboutModalBoxHeader.d.ts.map +1 -1
  120. package/dist/js/components/AboutModal/AboutModalBoxHeader.js +2 -2
  121. package/dist/js/components/AboutModal/AboutModalBoxHeader.js.map +1 -1
  122. package/dist/js/components/AboutModal/AboutModalBoxHero.d.ts +1 -3
  123. package/dist/js/components/AboutModal/AboutModalBoxHero.d.ts.map +1 -1
  124. package/dist/js/components/AboutModal/AboutModalBoxHero.js +2 -2
  125. package/dist/js/components/AboutModal/AboutModalBoxHero.js.map +1 -1
  126. package/dist/js/components/BackToTop/BackToTop.d.ts +1 -1
  127. package/dist/js/components/DataList/DataList.d.ts +3 -3
  128. package/dist/js/components/DataList/DataList.d.ts.map +1 -1
  129. package/dist/js/components/DataList/DataList.js +3 -3
  130. package/dist/js/components/DataList/DataList.js.map +1 -1
  131. package/dist/js/components/DataList/DataListItem.d.ts.map +1 -1
  132. package/dist/js/components/DataList/DataListItem.js +6 -5
  133. package/dist/js/components/DataList/DataListItem.js.map +1 -1
  134. package/dist/js/components/DualListSelector/DualListSelectorControl.d.ts +1 -1
  135. package/dist/js/components/DualListSelector/DualListSelectorControlsWrapper.d.ts +1 -1
  136. package/dist/js/components/DualListSelector/DualListSelectorListItem.d.ts +1 -1
  137. package/dist/js/components/DualListSelector/DualListSelectorListWrapper.d.ts +1 -1
  138. package/dist/js/components/Menu/MenuContent.d.ts +1 -1
  139. package/dist/js/components/Menu/MenuGroup.d.ts +1 -1
  140. package/dist/js/components/Menu/MenuInput.d.ts +1 -1
  141. package/dist/js/components/Menu/MenuItem.d.ts +1 -1
  142. package/dist/js/components/NotificationDrawer/NotificationDrawer.d.ts +1 -1
  143. package/dist/js/components/Panel/Panel.d.ts +1 -1
  144. package/dist/js/components/Tabs/Tab.d.ts +1 -1
  145. package/dist/js/components/TextInputGroup/TextInputGroupMain.d.ts +1 -1
  146. package/dist/umd/react-core.min.js +4 -4
  147. package/package.json +2 -2
  148. package/src/components/AboutModal/AboutModal.tsx +71 -115
  149. package/src/components/AboutModal/AboutModalBox.tsx +4 -4
  150. package/src/components/AboutModal/AboutModalBoxBrand.tsx +5 -8
  151. package/src/components/AboutModal/AboutModalBoxCloseButton.tsx +1 -4
  152. package/src/components/AboutModal/AboutModalBoxContent.tsx +6 -12
  153. package/src/components/AboutModal/AboutModalBoxHeader.tsx +4 -7
  154. package/src/components/AboutModal/AboutModalBoxHero.tsx +2 -5
  155. package/src/components/AboutModal/__tests__/AboutModal.test.tsx +14 -8
  156. package/src/components/AboutModal/__tests__/AboutModalBox.test.tsx +1 -1
  157. package/src/components/AboutModal/__tests__/__snapshots__/AboutModalBox.test.tsx.snap +0 -3
  158. package/src/components/AboutModal/examples/AboutModalComplexUserPositionedContent.tsx +1 -1
  159. package/src/components/AboutModal/examples/AboutModalCustomBackgroundImage.tsx +1 -0
  160. package/src/components/AboutModal/examples/AboutModalWithoutProductName.tsx +1 -0
  161. package/src/components/DataList/DataList.tsx +6 -6
  162. package/src/components/DataList/DataListItem.tsx +6 -5
  163. package/src/components/DataList/examples/DataListSelectableRows.tsx +2 -2
  164. package/components/AboutModal/AboutModalContainer.d.ts +0 -31
  165. package/components/AboutModal/AboutModalContainer.d.ts.map +0 -1
  166. package/components/AboutModal/AboutModalContainer.js +0 -28
  167. package/components/AboutModal/AboutModalContainer.js.map +0 -1
  168. package/dist/esm/components/AboutModal/AboutModalContainer.d.ts +0 -31
  169. package/dist/esm/components/AboutModal/AboutModalContainer.d.ts.map +0 -1
  170. package/dist/esm/components/AboutModal/AboutModalContainer.js +0 -28
  171. package/dist/esm/components/AboutModal/AboutModalContainer.js.map +0 -1
  172. package/dist/js/components/AboutModal/AboutModalContainer.d.ts +0 -31
  173. package/dist/js/components/AboutModal/AboutModalContainer.d.ts.map +0 -1
  174. package/dist/js/components/AboutModal/AboutModalContainer.js +0 -32
  175. package/dist/js/components/AboutModal/AboutModalContainer.js.map +0 -1
  176. package/src/components/AboutModal/AboutModalContainer.tsx +0 -91
  177. package/src/components/AboutModal/__tests__/AboutModalContainer.test.tsx +0 -38
  178. package/src/components/AboutModal/__tests__/__snapshots__/AboutModalContainer.test.tsx.snap +0 -101
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@patternfly/react-core",
3
- "version": "5.0.0-alpha.14",
3
+ "version": "5.0.0-alpha.15",
4
4
  "description": "This library provides a set of common React components for use with the PatternFly reference implementation.",
5
5
  "main": "dist/js/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -70,5 +70,5 @@
70
70
  "react": "^16.8 || ^17 || ^18",
71
71
  "react-dom": "^16.8 || ^17 || ^18"
72
72
  },
73
- "gitHead": "15626ee299af769871fd0852efd69373fa1e49b5"
73
+ "gitHead": "01c2451bcb6af1dc7767d86e6884c509b6b41891"
74
74
  }
@@ -1,13 +1,15 @@
1
1
  import * as React from 'react';
2
- import * as ReactDOM from 'react-dom';
3
2
  import { css } from '@patternfly/react-styles';
4
- import styles from '@patternfly/react-styles/css/components/Backdrop/backdrop';
5
- import { canUseDOM } from '../../helpers';
6
- import { KeyTypes } from '../../helpers/constants';
7
- import { AboutModalContainer } from './AboutModalContainer';
8
- import { PickOptional } from '../../helpers/typeUtils';
9
-
10
- export interface AboutModalProps {
3
+ import { AboutModalBoxContent } from './AboutModalBoxContent';
4
+ import { AboutModalBoxHeader } from './AboutModalBoxHeader';
5
+ import { AboutModalBoxHero } from './AboutModalBoxHero';
6
+ import { AboutModalBoxBrand } from './AboutModalBoxBrand';
7
+ import { AboutModalBoxCloseButton } from './AboutModalBoxCloseButton';
8
+ import { AboutModalBox } from './AboutModalBox';
9
+ import { Modal, ModalVariant } from '../Modal';
10
+ import { GenerateId } from '../../helpers/GenerateId/GenerateId';
11
+
12
+ export interface AboutModalProps extends React.HTMLProps<HTMLDivElement> {
11
13
  /** Content rendered inside the about modal */
12
14
  children: React.ReactNode;
13
15
  /** Additional classes added to the about modal */
@@ -27,123 +29,77 @@ export interface AboutModalProps {
27
29
  /** The URL of the image for the background */
28
30
  backgroundImageSrc?: string;
29
31
  /** Prevents the about modal from rendering content inside a container; allows for more flexible layouts */
30
- noAboutModalBoxContentContainer?: boolean;
32
+ hasNoContentContainer?: boolean;
31
33
  /** The parent container to append the modal to. Defaults to document.body */
32
34
  appendTo?: HTMLElement | (() => HTMLElement);
35
+ /** Aria label for the about modal. This should be used when no productName prop is provided */
36
+ 'aria-label'?: string;
33
37
  /** Set aria label to the close button */
34
38
  closeButtonAriaLabel?: string;
35
39
  /** Flag to disable focus trap */
36
40
  disableFocusTrap?: boolean;
37
41
  }
38
42
 
39
- interface ModalState {
40
- container: HTMLElement;
41
- }
42
-
43
- export class AboutModal extends React.Component<AboutModalProps, ModalState> {
44
- static displayName = 'AboutModal';
45
- private static currentId = 0;
46
- private id = AboutModal.currentId++;
47
- ariaLabelledBy = `pf-about-modal-title-${this.id}`;
48
- ariaDescribedBy = `pf-about-modal-content-${this.id}`;
49
-
50
- static defaultProps: PickOptional<AboutModalProps> = {
51
- className: '',
52
- isOpen: false,
53
- onClose: (_e): any => undefined,
54
- productName: '',
55
- trademark: '',
56
- backgroundImageSrc: '',
57
- noAboutModalBoxContentContainer: false,
58
- appendTo: null as HTMLElement
59
- };
60
-
61
- constructor(props: AboutModalProps) {
62
- super(props);
63
-
64
- this.state = {
65
- container: undefined
66
- };
67
- if (props.brandImageSrc && !props.brandImageAlt) {
68
- // eslint-disable-next-line no-console
69
- console.error('AboutModal:', 'brandImageAlt is required when a brandImageSrc is specified');
70
- }
43
+ export const AboutModal: React.FunctionComponent<AboutModalProps> = ({
44
+ children,
45
+ className,
46
+ isOpen = false,
47
+ onClose = (_e): any => undefined,
48
+ productName,
49
+ trademark,
50
+ backgroundImageSrc,
51
+ brandImageSrc,
52
+ brandImageAlt,
53
+ hasNoContentContainer = false,
54
+ appendTo,
55
+ closeButtonAriaLabel,
56
+ 'aria-label': ariaLabel,
57
+ disableFocusTrap,
58
+ ...props
59
+ }: AboutModalProps) => {
60
+ if (brandImageSrc && !brandImageAlt) {
61
+ // eslint-disable-next-line no-console
62
+ console.error('AboutModal:', 'brandImageAlt is required when a brandImageSrc is specified, and should not be an empty string.');
71
63
  }
72
64
 
73
- handleEscKeyClick = (event: KeyboardEvent) => {
74
- if (event.key === KeyTypes.Escape && this.props.isOpen) {
75
- this.props.onClose?.(event);
76
- }
77
- };
78
-
79
- toggleSiblingsFromScreenReaders = (hide: boolean) => {
80
- const { appendTo } = this.props;
81
- const target: HTMLElement = this.getElement(appendTo);
82
- const bodyChildren = target.children;
83
- for (const child of Array.from(bodyChildren)) {
84
- if (child !== this.state.container) {
85
- hide ? child.setAttribute('aria-hidden', '' + hide) : child.removeAttribute('aria-hidden');
86
- }
87
- }
88
- };
89
-
90
- getElement = (appendTo: HTMLElement | (() => HTMLElement)) => {
91
- if (typeof appendTo === 'function') {
92
- return appendTo();
93
- }
94
- return appendTo || document.body;
95
- };
96
-
97
- componentDidMount() {
98
- const container = document.createElement('div');
99
- const target: HTMLElement = this.getElement(this.props.appendTo);
100
- this.setState({ container });
101
- target.appendChild(container);
102
- target.addEventListener('keydown', this.handleEscKeyClick, false);
103
-
104
- if (this.props.isOpen) {
105
- target.classList.add(css(styles.backdropOpen));
106
- } else {
107
- target.classList.remove(css(styles.backdropOpen));
108
- }
109
- }
110
-
111
- componentDidUpdate() {
112
- const target: HTMLElement = this.getElement(this.props.appendTo);
113
- if (this.props.isOpen) {
114
- target.classList.add(css(styles.backdropOpen));
115
- this.toggleSiblingsFromScreenReaders(true);
116
- } else {
117
- target.classList.remove(css(styles.backdropOpen));
118
- this.toggleSiblingsFromScreenReaders(false);
119
- }
120
- }
121
-
122
- componentWillUnmount() {
123
- const target: HTMLElement = this.getElement(this.props.appendTo);
124
- if (this.state.container) {
125
- target.removeChild(this.state.container);
126
- }
127
- target.removeEventListener('keydown', this.handleEscKeyClick, false);
128
- target.classList.remove(css(styles.backdropOpen));
65
+ if (!productName && !ariaLabel) {
66
+ // eslint-disable-next-line no-console
67
+ console.error('AboutModal:', 'Either productName or ariaLabel is required for component to be accessible');
129
68
  }
130
69
 
131
- render() {
132
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
133
- const { appendTo, ...props } = this.props;
134
- const { container } = this.state;
135
-
136
- if (!canUseDOM || !container) {
137
- return null;
138
- }
139
-
140
- return ReactDOM.createPortal(
141
- <AboutModalContainer
142
- aboutModalBoxHeaderId={this.ariaLabelledBy}
143
- aboutModalBoxContentId={this.ariaDescribedBy}
144
- {...props}
145
- />,
146
- container
147
- ) as React.ReactElement;
70
+ if (!isOpen) {
71
+ return null;
148
72
  }
149
- }
73
+ return (
74
+ <GenerateId prefix="pf-about-modal-title-">
75
+ {ariaLabelledBy => (
76
+ <Modal
77
+ isOpen={isOpen}
78
+ variant={ModalVariant.large}
79
+ {...(productName && {'aria-labelledby': ariaLabelledBy})}
80
+ aria-label={ariaLabel}
81
+ onEscapePress={onClose}
82
+ showClose={false}
83
+ appendTo={appendTo}
84
+ disableFocusTrap={disableFocusTrap}
85
+ hasNoBodyWrapper
86
+ >
87
+ <AboutModalBox className={css(className)}>
88
+ <AboutModalBoxBrand src={brandImageSrc} alt={brandImageAlt} />
89
+ <AboutModalBoxCloseButton aria-label={closeButtonAriaLabel} onClose={onClose} />
90
+ {productName && <AboutModalBoxHeader id={ariaLabelledBy} productName={productName} />}
91
+ <AboutModalBoxContent
92
+ trademark={trademark}
93
+ hasNoContentContainer={hasNoContentContainer}
94
+ {...props}
95
+ >
96
+ {children}
97
+ </AboutModalBoxContent>
98
+ <AboutModalBoxHero backgroundImageSrc={backgroundImageSrc} />
99
+ </AboutModalBox>
100
+ </Modal>
101
+ )}
102
+ </GenerateId>
103
+ );
104
+ };
105
+ AboutModal.displayName = 'AboutModal';
@@ -3,18 +3,18 @@ import { css } from '@patternfly/react-styles';
3
3
  import styles from '@patternfly/react-styles/css/components/AboutModalBox/about-modal-box';
4
4
 
5
5
  export interface AboutModalBoxProps extends React.HTMLProps<HTMLDivElement> {
6
- /** content rendered inside the AboutModelBox. */
6
+ /** Content rendered inside the about modal box */
7
7
  children: React.ReactNode;
8
- /** additional classes added to the AboutModalBox */
8
+ /** Additional classes added to the about modal box */
9
9
  className?: string;
10
10
  }
11
11
 
12
12
  export const AboutModalBox: React.FunctionComponent<AboutModalBoxProps> = ({
13
13
  children,
14
- className = '',
14
+ className,
15
15
  ...props
16
16
  }: AboutModalBoxProps) => (
17
- <div role="dialog" aria-modal="true" className={css(styles.aboutModalBox, className)} {...props}>
17
+ <div className={css(styles.aboutModalBox, className)} {...props}>
18
18
  {children}
19
19
  </div>
20
20
  );
@@ -3,21 +3,18 @@ import { css } from '@patternfly/react-styles';
3
3
  import styles from '@patternfly/react-styles/css/components/AboutModalBox/about-modal-box';
4
4
 
5
5
  export interface AboutModalBoxBrandProps extends React.HTMLProps<HTMLDivElement> {
6
- /** additional classes added to the About Modal Brand */
7
- className?: string;
8
- /** the URL of the image for the Brand. */
9
- src?: string;
10
- /** the alternate text of the Brand image. */
6
+ /** The URL of the image for the brand. */
7
+ src: string;
8
+ /** The alternate text of the brand image. */
11
9
  alt: string;
12
10
  }
13
11
 
14
12
  export const AboutModalBoxBrand: React.FunctionComponent<AboutModalBoxBrandProps> = ({
15
- className = '',
16
- src = '',
13
+ src,
17
14
  alt,
18
15
  ...props
19
16
  }: AboutModalBoxBrandProps) => (
20
- <div className={css(styles.aboutModalBoxBrand, className)} {...props}>
17
+ <div className={css(styles.aboutModalBoxBrand)} {...props}>
21
18
  <img className={css(styles.aboutModalBoxBrandImage)} src={src} alt={alt} />
22
19
  </div>
23
20
  );
@@ -5,8 +5,6 @@ import { Button } from '../Button';
5
5
  import TimesIcon from '@patternfly/react-icons/dist/esm/icons/times-icon';
6
6
 
7
7
  export interface AboutModalBoxCloseButtonProps extends React.HTMLProps<HTMLDivElement> {
8
- /** additional classes added to the About Modal Close button */
9
- className?: string;
10
8
  /** A callback for when the close button is clicked */
11
9
  onClose?: (event: React.MouseEvent | MouseEvent | KeyboardEvent) => void;
12
10
  /** Set close button aria label */
@@ -14,12 +12,11 @@ export interface AboutModalBoxCloseButtonProps extends React.HTMLProps<HTMLDivEl
14
12
  }
15
13
 
16
14
  export const AboutModalBoxCloseButton: React.FunctionComponent<AboutModalBoxCloseButtonProps> = ({
17
- className = '',
18
15
  onClose = _e => undefined as any,
19
16
  'aria-label': ariaLabel = 'Close Dialog',
20
17
  ...props
21
18
  }: AboutModalBoxCloseButtonProps) => (
22
- <div className={css(styles.aboutModalBoxClose, className)} {...props}>
19
+ <div className={css(styles.aboutModalBoxClose)} {...props}>
23
20
  <Button variant="plain" onClick={onClose} aria-label={ariaLabel}>
24
21
  <TimesIcon />
25
22
  </Button>
@@ -4,29 +4,23 @@ import styles from '@patternfly/react-styles/css/components/AboutModalBox/about-
4
4
  import contentStyles from '@patternfly/react-styles/css/components/Content/content';
5
5
 
6
6
  export interface AboutModalBoxContentProps extends React.HTMLProps<HTMLDivElement> {
7
- /** content rendered inside the AboutModalBoxContent */
7
+ /** Content rendered inside the about modal box content */
8
8
  children: React.ReactNode;
9
- /** additional classes added to the AboutModalBoxContent */
10
- className?: string;
11
- /** id to use for About Modal Box aria described by */
12
- id: string;
13
- /** The Trademark info for the product */
9
+ /** The trademark info for the product */
14
10
  trademark: string;
15
11
  /** Prevents the about modal from rendering content inside a container; allows for more flexible layouts */
16
- noAboutModalBoxContentContainer?: boolean;
12
+ hasNoContentContainer?: boolean;
17
13
  }
18
14
 
19
15
  export const AboutModalBoxContent: React.FunctionComponent<AboutModalBoxContentProps> = ({
20
16
  children,
21
- className = '',
22
17
  trademark,
23
- id,
24
- noAboutModalBoxContentContainer = false,
18
+ hasNoContentContainer = false,
25
19
  ...props
26
20
  }: AboutModalBoxContentProps) => (
27
- <div className={css(styles.aboutModalBoxContent, className)} id={id} {...props}>
21
+ <div className={css(styles.aboutModalBoxContent)} {...props}>
28
22
  <div className={css('pf-c-about-modal-box__body')}>
29
- {noAboutModalBoxContentContainer ? children : <div className={css(contentStyles.content)}>{children}</div>}
23
+ {hasNoContentContainer ? children : <div className={css(contentStyles.content)}>{children}</div>}
30
24
  </div>
31
25
  <p className={css(styles.aboutModalBoxStrapline)}>{trademark}</p>
32
26
  </div>
@@ -4,21 +4,18 @@ import styles from '@patternfly/react-styles/css/components/AboutModalBox/about-
4
4
  import { Title } from '../Title';
5
5
 
6
6
  export interface AboutModalBoxHeaderProps extends React.HTMLProps<HTMLDivElement> {
7
- /** additional classes added to the button */
8
- className?: string;
9
- /** Name of the Product */
7
+ /** Name of the product */
10
8
  productName?: string;
11
- /** id to used for Modal Box header */
9
+ /** Id to use for about modal box header */
12
10
  id: string;
13
11
  }
14
12
 
15
13
  export const AboutModalBoxHeader: React.FunctionComponent<AboutModalBoxHeaderProps> = ({
16
- className = '',
17
- productName = '',
14
+ productName,
18
15
  id,
19
16
  ...props
20
17
  }: AboutModalBoxHeaderProps) => (
21
- <div className={css(styles.aboutModalBoxHeader, className)} {...props}>
18
+ <div className={css(styles.aboutModalBoxHeader)} {...props}>
22
19
  <Title headingLevel="h1" size="4xl" id={id}>
23
20
  {productName}
24
21
  </Title>
@@ -5,14 +5,11 @@ import styles from '@patternfly/react-styles/css/components/AboutModalBox/about-
5
5
  import c_about_modal_box__hero_sm_BackgroundImage from '@patternfly/react-tokens/dist/esm/c_about_modal_box__hero_sm_BackgroundImage';
6
6
 
7
7
  export interface AboutModalBoxHeroProps extends React.HTMLProps<HTMLDivElement> {
8
- /** additional classes added to the About Modal Hero */
9
- className?: string;
10
- /** background image data or file path */
8
+ /** Background image data or file path */
11
9
  backgroundImageSrc?: string;
12
10
  }
13
11
 
14
12
  export const AboutModalBoxHero: React.FunctionComponent<AboutModalBoxHeroProps> = ({
15
- className,
16
13
  backgroundImageSrc,
17
14
  ...props
18
15
  }: AboutModalBoxHeroProps) => (
@@ -24,7 +21,7 @@ export const AboutModalBoxHero: React.FunctionComponent<AboutModalBoxHeroProps>
24
21
  : {}
25
22
  /* eslint-enable camelcase */
26
23
  }
27
- className={css(styles.aboutModalBoxHero, className)}
24
+ className={css(styles.aboutModalBoxHero)}
28
25
  {...props}
29
26
  />
30
27
  );
@@ -30,14 +30,6 @@ describe('AboutModal', () => {
30
30
  expect(screen.queryByRole('dialog')).toBeNull();
31
31
  });
32
32
 
33
- test('Each modal is given new aria-describedby and aria-labelledby', () => {
34
- const first = new AboutModal(props);
35
- const second = new AboutModal(props);
36
-
37
- expect(first.ariaLabelledBy).not.toBe(second.ariaLabelledBy);
38
- expect(first.ariaDescribedBy).not.toBe(second.ariaDescribedBy);
39
- });
40
-
41
33
  test('Console error is generated when the logoImageSrc is provided without logoImageAlt', () => {
42
34
  const noImgAltrops = {
43
35
  onClose: jest.fn(),
@@ -53,4 +45,18 @@ describe('AboutModal', () => {
53
45
  render(<AboutModal {...noImgAltrops}>Test About Modal</AboutModal>);
54
46
  expect(myMock).toHaveBeenCalled();
55
47
  });
48
+
49
+ test('Console error is generated when the logoImageSrc is provided without logoImageAlt', () => {
50
+ const noProductNameProps = {
51
+ onClose: jest.fn(),
52
+ children: 'modal content',
53
+ trademark: 'Trademark and copyright information here'
54
+
55
+ } as any;
56
+ const myMock = jest.fn() as any;
57
+ global.console = { error: myMock } as any;
58
+
59
+ render(<AboutModal {...noProductNameProps}>Test About Modal</AboutModal>);
60
+ expect(myMock).toHaveBeenCalled();
61
+ });
56
62
  });
@@ -4,7 +4,7 @@ import { AboutModalBox } from '../AboutModalBox';
4
4
 
5
5
  test('AboutModalBox Test', () => {
6
6
  const { asFragment } = render(
7
- <AboutModalBox aria-labelledby="id" aria-describedby="id2">
7
+ <AboutModalBox aria-labelledby="id">
8
8
  This is a AboutModalBox
9
9
  </AboutModalBox>
10
10
  );
@@ -3,11 +3,8 @@
3
3
  exports[`AboutModalBox Test 1`] = `
4
4
  <DocumentFragment>
5
5
  <div
6
- aria-describedby="id2"
7
6
  aria-labelledby="id"
8
- aria-modal="true"
9
7
  class="pf-c-about-modal-box"
10
- role="dialog"
11
8
  >
12
9
  This is a AboutModalBox
13
10
  </div>
@@ -20,7 +20,7 @@ export const AboutModalComplexUserPositionedContent: React.FunctionComponent = (
20
20
  trademark="Trademark and copyright information here"
21
21
  brandImageSrc={brandImg}
22
22
  brandImageAlt="Patternfly Logo"
23
- noAboutModalBoxContentContainer={true}
23
+ hasNoContentContainer={true}
24
24
  productName="Product Name"
25
25
  >
26
26
  <TextContent id="test1" className="pf-u-py-xl">
@@ -22,6 +22,7 @@ export const AboutModalCustomBackgroundImage: React.FunctionComponent = () => {
22
22
  brandImageSrc={brandImg}
23
23
  brandImageAlt="Patternfly Logo"
24
24
  backgroundImageSrc={bgImg}
25
+ aria-label="Background image about modal"
25
26
  >
26
27
  <TextContent>
27
28
  <TextList component="dl">
@@ -20,6 +20,7 @@ export const AboutModalWithoutProductName: React.FunctionComponent = () => {
20
20
  trademark="Trademark and copyright information here"
21
21
  brandImageSrc={brandImg}
22
22
  brandImageAlt="Patternfly Logo"
23
+ aria-label="No product name about modal"
23
24
  >
24
25
  <TextContent>
25
26
  <TextList component="dl">
@@ -22,7 +22,7 @@ export enum DataListWrapModifier {
22
22
 
23
23
  export interface SelectableRowObject {
24
24
  /** Callback that executes when the screen reader accessible element receives a change event */
25
- onChange: (id: string, event: React.FormEvent<HTMLInputElement>) => void;
25
+ onChange: (event: React.FormEvent<HTMLInputElement>, id: string) => void;
26
26
  }
27
27
 
28
28
  export interface DataListProps extends Omit<React.HTMLProps<HTMLUListElement>, 'ref'> {
@@ -33,7 +33,7 @@ export interface DataListProps extends Omit<React.HTMLProps<HTMLUListElement>, '
33
33
  /** Adds accessible text to the DataList list */
34
34
  'aria-label': string;
35
35
  /** Optional callback to make DataList selectable, fired when DataListItem selected */
36
- onSelectDataListItem?: (id: string) => void;
36
+ onSelectDataListItem?: (event: React.MouseEvent | React.KeyboardEvent, id: string) => void;
37
37
  /** Id of DataList item currently selected */
38
38
  selectedDataListItemId?: string;
39
39
  /** Flag indicating if DataList should have compact styling */
@@ -49,7 +49,7 @@ export interface DataListProps extends Omit<React.HTMLProps<HTMLUListElement>, '
49
49
  interface DataListContextProps {
50
50
  isSelectable: boolean;
51
51
  selectedDataListItemId: string;
52
- updateSelectedDataListItem: (id: string) => void;
52
+ updateSelectedDataListItem: (event: React.MouseEvent | React.KeyboardEvent, id: string) => void;
53
53
  selectableRow?: SelectableRowObject;
54
54
  }
55
55
 
@@ -73,7 +73,7 @@ export class DataList extends React.Component<DataListProps> {
73
73
  super(props);
74
74
  }
75
75
 
76
- getIndex = (id: string) => Array.from(this.ref.current.children).findIndex(item => item.id === id);
76
+ getIndex = (id: string) => Array.from(this.ref.current.children).findIndex((item) => item.id === id);
77
77
 
78
78
  render() {
79
79
  const {
@@ -89,8 +89,8 @@ export class DataList extends React.Component<DataListProps> {
89
89
  } = this.props;
90
90
  const isSelectable = onSelectDataListItem !== undefined;
91
91
 
92
- const updateSelectedDataListItem = (id: string) => {
93
- onSelectDataListItem(id);
92
+ const updateSelectedDataListItem = (event: React.MouseEvent | React.KeyboardEvent, id: string) => {
93
+ onSelectDataListItem(event, id);
94
94
  };
95
95
 
96
96
  return (
@@ -60,12 +60,13 @@ export class DataListItem extends React.Component<DataListItemProps> {
60
60
  target = target.parentNode;
61
61
  }
62
62
  }
63
- updateSelectedDataListItem(id);
63
+ updateSelectedDataListItem(event, id);
64
64
  };
65
65
 
66
66
  const onKeyDown = (event: React.KeyboardEvent) => {
67
- if (event.key === KeyTypes.Enter) {
68
- updateSelectedDataListItem(id);
67
+ if ([KeyTypes.Enter, KeyTypes.Space].includes(event.key)) {
68
+ event.preventDefault();
69
+ updateSelectedDataListItem(event, id);
69
70
  }
70
71
  };
71
72
 
@@ -95,14 +96,14 @@ export class DataListItem extends React.Component<DataListItemProps> {
95
96
  className="pf-screen-reader"
96
97
  type="radio"
97
98
  checked={isSelected}
98
- onChange={event => selectableRow.onChange(id, event)}
99
+ onChange={(event) => selectableRow.onChange(event, id)}
99
100
  tabIndex={-1}
100
101
  {...selectableInputAriaProps}
101
102
  />
102
103
  )}
103
104
  {React.Children.map(
104
105
  children,
105
- child =>
106
+ (child) =>
106
107
  React.isValidElement(child) &&
107
108
  React.cloneElement(child as React.ReactElement<any>, {
108
109
  rowid: ariaLabelledBy
@@ -33,11 +33,11 @@ export const DataListSelectableRows: React.FunctionComponent = () => {
33
33
  setIsOpen2(!isOpen2);
34
34
  };
35
35
 
36
- const onSelectDataListItem = id => {
36
+ const onSelectDataListItem = (_event: React.MouseEvent | React.KeyboardEvent, id: string) => {
37
37
  setSelectedDataListItemId(id);
38
38
  };
39
39
 
40
- const handleInputChange = (id: string, _event: React.FormEvent<HTMLInputElement>) => {
40
+ const handleInputChange = (_event: React.FormEvent<HTMLInputElement>, id: string) => {
41
41
  setSelectedDataListItemId(id);
42
42
  };
43
43
 
@@ -1,31 +0,0 @@
1
- import * as React from 'react';
2
- export interface AboutModalContainerProps extends React.HTMLProps<HTMLDivElement> {
3
- /** content rendered inside the About Modal Box Content. */
4
- children: React.ReactNode;
5
- /** additional classes added to the About Modal Box */
6
- className?: string;
7
- /** Flag to show the About Modal */
8
- isOpen?: boolean;
9
- /** A callback for when the close button is clicked */
10
- onClose?: (event: React.MouseEvent | MouseEvent | KeyboardEvent) => void;
11
- /** Product Name */
12
- productName?: string;
13
- /** Trademark information */
14
- trademark?: string;
15
- /** the URL of the image for the Brand. */
16
- brandImageSrc: string;
17
- /** the alternate text of the Brand image. */
18
- brandImageAlt: string;
19
- /** the URL of the image for the background. */
20
- backgroundImageSrc?: string;
21
- /** id to use for About Modal Box aria labeled by */
22
- aboutModalBoxHeaderId: string;
23
- /** id to use for About Modal Box aria described by */
24
- aboutModalBoxContentId: string;
25
- /** Set close button aria label */
26
- closeButtonAriaLabel?: string;
27
- /** Flag to disable focus trap */
28
- disableFocusTrap?: boolean;
29
- }
30
- export declare const AboutModalContainer: React.FunctionComponent<AboutModalContainerProps>;
31
- //# sourceMappingURL=AboutModalContainer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AboutModalContainer.d.ts","sourceRoot":"","sources":["../../../../src/components/AboutModal/AboutModalContainer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAa/B,MAAM,WAAW,wBAAyB,SAAQ,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC;IAC/E,4DAA4D;IAC5D,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oCAAoC;IACpC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,uDAAuD;IACvD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,GAAG,UAAU,GAAG,aAAa,KAAK,IAAI,CAAC;IACzE,oBAAoB;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,aAAa,EAAE,MAAM,CAAC;IACtB,8CAA8C;IAC9C,aAAa,EAAE,MAAM,CAAC;IACtB,gDAAgD;IAChD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,qDAAqD;IACrD,qBAAqB,EAAE,MAAM,CAAC;IAC9B,uDAAuD;IACvD,sBAAsB,EAAE,MAAM,CAAC;IAC/B,kCAAkC;IAClC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,iCAAiC;IACjC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,iBAAiB,CAAC,wBAAwB,CA+CjF,CAAC"}
@@ -1,28 +0,0 @@
1
- import { __rest } from "tslib";
2
- import * as React from 'react';
3
- import { css } from '@patternfly/react-styles';
4
- import styles from '@patternfly/react-styles/css/layouts/Bullseye/bullseye';
5
- import { FocusTrap } from '../../helpers';
6
- import { AboutModalBoxContent } from './AboutModalBoxContent';
7
- import { AboutModalBoxHeader } from './AboutModalBoxHeader';
8
- import { AboutModalBoxHero } from './AboutModalBoxHero';
9
- import { AboutModalBoxBrand } from './AboutModalBoxBrand';
10
- import { AboutModalBoxCloseButton } from './AboutModalBoxCloseButton';
11
- import { AboutModalBox } from './AboutModalBox';
12
- import { Backdrop } from '../Backdrop/Backdrop';
13
- export const AboutModalContainer = (_a) => {
14
- var { children, className = '', isOpen = false, onClose = _e => undefined, productName = '', trademark, brandImageSrc, brandImageAlt, backgroundImageSrc, closeButtonAriaLabel, aboutModalBoxHeaderId, aboutModalBoxContentId, disableFocusTrap = false } = _a, props = __rest(_a, ["children", "className", "isOpen", "onClose", "productName", "trademark", "brandImageSrc", "brandImageAlt", "backgroundImageSrc", "closeButtonAriaLabel", "aboutModalBoxHeaderId", "aboutModalBoxContentId", "disableFocusTrap"]);
15
- if (!isOpen) {
16
- return null;
17
- }
18
- return (React.createElement(Backdrop, null,
19
- React.createElement(FocusTrap, { active: !disableFocusTrap, focusTrapOptions: { clickOutsideDeactivates: true, tabbableOptions: { displayCheck: 'none' } }, className: css(styles.bullseye) },
20
- React.createElement(AboutModalBox, { className: className, "aria-labelledby": aboutModalBoxHeaderId, "aria-describedby": aboutModalBoxContentId },
21
- React.createElement(AboutModalBoxBrand, { src: brandImageSrc, alt: brandImageAlt }),
22
- React.createElement(AboutModalBoxCloseButton, { "aria-label": closeButtonAriaLabel, onClose: onClose }),
23
- productName && React.createElement(AboutModalBoxHeader, { id: aboutModalBoxHeaderId, productName: productName }),
24
- React.createElement(AboutModalBoxContent, Object.assign({ trademark: trademark, id: aboutModalBoxContentId, noAboutModalBoxContentContainer: false }, props), children),
25
- React.createElement(AboutModalBoxHero, { backgroundImageSrc: backgroundImageSrc })))));
26
- };
27
- AboutModalContainer.displayName = 'AboutModalContainer';
28
- //# sourceMappingURL=AboutModalContainer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AboutModalContainer.js","sourceRoot":"","sources":["../../../../src/components/AboutModal/AboutModalContainer.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAC/C,OAAO,MAAM,MAAM,wDAAwD,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AA+BhD,MAAM,CAAC,MAAM,mBAAmB,GAAsD,CAAC,EAe5D,EAAE,EAAE;QAfwD,EACrF,QAAQ,EACR,SAAS,GAAG,EAAE,EACd,MAAM,GAAG,KAAK,EACd,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,SAAS,EACzB,WAAW,GAAG,EAAE,EAChB,SAAS,EACT,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,EACtB,gBAAgB,GAAG,KAAK,OAEC,EADtB,KAAK,cAd6E,iOAetF,CADS;IAER,IAAI,CAAC,MAAM,EAAE;QACX,OAAO,IAAI,CAAC;KACb;IACD,OAAO,CACL,oBAAC,QAAQ;QACP,oBAAC,SAAS,IACR,MAAM,EAAE,CAAC,gBAAgB,EACzB,gBAAgB,EAAE,EAAE,uBAAuB,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,EAC9F,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC;YAE/B,oBAAC,aAAa,IACZ,SAAS,EAAE,SAAS,qBACH,qBAAqB,sBACpB,sBAAsB;gBAExC,oBAAC,kBAAkB,IAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,aAAa,GAAI;gBAC9D,oBAAC,wBAAwB,kBAAa,oBAAoB,EAAE,OAAO,EAAE,OAAO,GAAI;gBAC/E,WAAW,IAAI,oBAAC,mBAAmB,IAAC,EAAE,EAAE,qBAAqB,EAAE,WAAW,EAAE,WAAW,GAAI;gBAC5F,oBAAC,oBAAoB,kBACnB,SAAS,EAAE,SAAS,EACpB,EAAE,EAAE,sBAAsB,EAC1B,+BAA+B,EAAE,KAAK,IAClC,KAAK,GAER,QAAQ,CACY;gBACvB,oBAAC,iBAAiB,IAAC,kBAAkB,EAAE,kBAAkB,GAAI,CAC/C,CACN,CACH,CACZ,CAAC;AACJ,CAAC,CAAC;AACF,mBAAmB,CAAC,WAAW,GAAG,qBAAqB,CAAC"}