@openedx/paragon 23.0.0-alpha.3 → 23.0.0-alpha.5

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 (258) hide show
  1. package/bin/paragon-scripts.js +10 -0
  2. package/dist/Annotation/index.scss +16 -0
  3. package/dist/Card/CardDeck.js +0 -2
  4. package/dist/Card/CardDeck.js.map +1 -1
  5. package/dist/Card/index.scss +8 -6
  6. package/dist/Carousel/index.scss +24 -1
  7. package/dist/Chip/ChipIcon.d.ts +1 -1
  8. package/dist/CloseButton/index.scss +8 -0
  9. package/dist/ColorPicker/index.scss +1 -1
  10. package/dist/Container/index.d.ts +16 -0
  11. package/dist/Container/index.js +15 -13
  12. package/dist/Container/index.js.map +1 -1
  13. package/dist/DataTable/index.scss +12 -0
  14. package/dist/Dropdown/dropdown-bootstrap.scss +6 -0
  15. package/dist/Dropzone/index.scss +34 -0
  16. package/dist/Form/_FormText.scss +1 -1
  17. package/dist/Form/_bootstrap-custom-forms.scss +40 -0
  18. package/dist/Form/_index.scss +9 -0
  19. package/dist/Form/_mixins.scss +22 -0
  20. package/dist/IconButton/index.d.ts +1 -1
  21. package/dist/IconButton/index.js +1 -1
  22. package/dist/IconButton/index.js.map +1 -1
  23. package/dist/IconButton/index.scss +146 -0
  24. package/dist/Menu/SelectMenu.js +9 -4
  25. package/dist/Menu/SelectMenu.js.map +1 -1
  26. package/dist/Menu/index.scss +8 -0
  27. package/dist/Modal/ModalContext.d.ts +15 -0
  28. package/dist/Modal/ModalContext.js +7 -14
  29. package/dist/Modal/ModalContext.js.map +1 -1
  30. package/dist/Modal/ModalDialog.d.ts +110 -0
  31. package/dist/Modal/ModalDialog.js +30 -24
  32. package/dist/Modal/ModalDialog.js.map +1 -1
  33. package/dist/Modal/ModalDialogHeader.d.ts +10 -0
  34. package/dist/Modal/ModalDialogHeader.js +6 -7
  35. package/dist/Modal/ModalDialogHeader.js.map +1 -1
  36. package/dist/Modal/ModalLayer.d.ts +53 -0
  37. package/dist/Modal/ModalLayer.js +5 -14
  38. package/dist/Modal/ModalLayer.js.map +1 -1
  39. package/dist/Modal/Portal.d.ts +11 -0
  40. package/dist/Modal/Portal.js +5 -6
  41. package/dist/Modal/Portal.js.map +1 -1
  42. package/dist/Modal/_ModalDialog.scss +22 -2
  43. package/dist/Nav/index.scss +8 -0
  44. package/dist/Overlay/index.d.ts +2 -2
  45. package/dist/PageBanner/index.scss +2 -2
  46. package/dist/Pagination/pagination-bootstrap.scss +9 -0
  47. package/dist/Popover/index.scss +1 -1
  48. package/dist/ProductTour/Checkpoint.scss +1 -1
  49. package/dist/ProgressBar/bootstrap-progress.scss +20 -5
  50. package/dist/ProgressBar/index.scss +3 -3
  51. package/dist/Stepper/index.scss +1 -1
  52. package/dist/Sticky/index.scss +12 -0
  53. package/dist/Toast/index.scss +13 -1
  54. package/dist/Tooltip/index.scss +16 -0
  55. package/dist/core.css +913 -470
  56. package/dist/core.css.map +1 -1
  57. package/dist/core.min.css +1 -1
  58. package/dist/hooks/useArrowKeyNavigation.js +2 -3
  59. package/dist/hooks/useArrowKeyNavigation.js.map +1 -1
  60. package/dist/index.d.ts +19 -5
  61. package/dist/index.js +5 -5
  62. package/dist/light.css +2035 -1315
  63. package/dist/light.css.map +1 -1
  64. package/dist/light.min.css +1 -1
  65. package/icons/es5/Newsstand.js +15 -0
  66. package/icons/es5/index.js +1 -0
  67. package/icons/es5/index.ts +1 -0
  68. package/icons/jsx/Newsstand.jsx +17 -0
  69. package/icons/jsx/index.jsx +1 -0
  70. package/icons/svg/newsstand.svg +1 -0
  71. package/lib/build-tokens.js +67 -31
  72. package/package.json +8 -5
  73. package/src/Annotation/index.scss +16 -0
  74. package/src/Card/CardDeck.jsx +0 -3
  75. package/src/Card/README.md +0 -31
  76. package/src/Card/index.scss +8 -6
  77. package/src/Carousel/index.scss +24 -1
  78. package/src/CloseButton/index.scss +8 -0
  79. package/src/ColorPicker/index.scss +1 -1
  80. package/src/Container/{Container.test.jsx → Container.test.tsx} +14 -8
  81. package/src/Container/README.md +4 -0
  82. package/src/Container/index.tsx +64 -0
  83. package/src/DataTable/index.scss +12 -0
  84. package/src/DataTable/selection/tests/ControlledSelectHeader.test.jsx +7 -7
  85. package/src/Dropdown/dropdown-bootstrap.scss +6 -0
  86. package/src/Dropzone/index.scss +34 -0
  87. package/src/Form/_FormText.scss +1 -1
  88. package/src/Form/_bootstrap-custom-forms.scss +40 -0
  89. package/src/Form/_index.scss +9 -0
  90. package/src/Form/_mixins.scss +22 -0
  91. package/src/IconButton/index.scss +146 -0
  92. package/src/IconButton/index.tsx +1 -1
  93. package/src/Menu/SelectMenu.jsx +5 -0
  94. package/src/Menu/SelectMenu.test.jsx +6 -0
  95. package/src/Menu/index.scss +8 -0
  96. package/src/Menu/select-menu.md +8 -0
  97. package/src/Modal/{ModalContext.jsx → ModalContext.tsx} +19 -16
  98. package/src/Modal/{ModalDialog.jsx → ModalDialog.tsx} +57 -26
  99. package/src/Modal/{ModalDialogHeader.jsx → ModalDialogHeader.tsx} +17 -11
  100. package/src/Modal/{ModalLayer.jsx → ModalLayer.tsx} +17 -17
  101. package/src/Modal/{Portal.jsx → Portal.tsx} +10 -7
  102. package/src/Modal/_ModalDialog.scss +22 -2
  103. package/src/Modal/modal-dialog.mdx +95 -6
  104. package/src/Modal/tests/{ModalDialog.test.jsx → ModalDialog.test.tsx} +18 -10
  105. package/src/Modal/tests/{ModalLayer.test.jsx → ModalLayer.test.tsx} +5 -5
  106. package/src/Modal/tests/{Portal.test.jsx → Portal.test.tsx} +3 -3
  107. package/src/Nav/index.scss +8 -0
  108. package/src/PageBanner/index.scss +2 -2
  109. package/src/Pagination/pagination-bootstrap.scss +9 -0
  110. package/src/Popover/index.scss +1 -1
  111. package/src/ProductTour/Checkpoint.scss +1 -1
  112. package/src/ProgressBar/bootstrap-progress.scss +20 -5
  113. package/src/ProgressBar/index.scss +3 -3
  114. package/src/Stepper/index.scss +1 -1
  115. package/src/Sticky/index.scss +12 -0
  116. package/src/Toast/index.scss +13 -1
  117. package/src/Tooltip/index.scss +16 -0
  118. package/src/hooks/useArrowKeyNavigation.jsx +1 -2
  119. package/src/index.d.ts +19 -5
  120. package/src/index.js +5 -5
  121. package/styles/css/core/abstraction-variables.css +44 -0
  122. package/styles/css/core/custom-media-breakpoints.css +3 -4
  123. package/styles/css/core/index.css +2 -1
  124. package/styles/css/core/variables.css +494 -430
  125. package/styles/css/themes/light/abstraction-variables.css +304 -0
  126. package/styles/css/themes/light/index.css +1 -0
  127. package/styles/css/themes/light/utility-classes.css +2 -3
  128. package/styles/css/themes/light/variables.css +1753 -1334
  129. package/styles/scss/core/_typography.scss +16 -4
  130. package/styles/scss/core/_utilities.scss +7 -3
  131. package/styles/scss/core/_variables.scss +43 -30
  132. package/styles/scss/core/core.scss +1 -0
  133. package/tokens/src/core/alias/size.json +6 -5
  134. package/tokens/src/core/components/ActionRow.json +3 -2
  135. package/tokens/src/core/components/Alert.json +12 -10
  136. package/tokens/src/core/components/Annotation.json +9 -7
  137. package/tokens/src/core/components/Avatar.json +9 -9
  138. package/tokens/src/core/components/AvatarButton.json +4 -3
  139. package/tokens/src/core/components/Badge.json +12 -9
  140. package/tokens/src/core/components/Breadcrumb.json +7 -5
  141. package/tokens/src/core/components/Bubble.json +4 -3
  142. package/tokens/src/core/components/Button/core.json +35 -59
  143. package/tokens/src/core/components/Card.json +33 -44
  144. package/tokens/src/core/components/Carousel.json +39 -13
  145. package/tokens/src/core/components/Chip.json +13 -21
  146. package/tokens/src/core/components/ChipCarousel.json +4 -5
  147. package/tokens/src/core/components/CloseButton.json +2 -6
  148. package/tokens/src/core/components/Code.json +9 -8
  149. package/tokens/src/core/components/Collapsible.json +10 -13
  150. package/tokens/src/core/components/ColorPicker.json +3 -2
  151. package/tokens/src/core/components/Container.json +6 -5
  152. package/tokens/src/core/components/DataTable.json +17 -9
  153. package/tokens/src/core/components/Dropdown.json +24 -29
  154. package/tokens/src/core/components/Dropzone.json +5 -7
  155. package/tokens/src/core/components/Form/other.json +5 -4
  156. package/tokens/src/core/components/Form/size.json +72 -119
  157. package/tokens/src/core/components/Form/spacing.json +39 -83
  158. package/tokens/src/core/components/Form/transition.json +43 -7
  159. package/tokens/src/core/components/Form/typography.json +24 -88
  160. package/tokens/src/core/components/Icon.json +6 -5
  161. package/tokens/src/core/components/IconButton.json +4 -7
  162. package/tokens/src/core/components/Image.json +7 -6
  163. package/tokens/src/core/components/Menu.json +14 -12
  164. package/tokens/src/core/components/Modal.json +26 -21
  165. package/tokens/src/core/components/Nav.json +14 -16
  166. package/tokens/src/core/components/Navbar.json +15 -30
  167. package/tokens/src/core/components/Pagination.json +23 -24
  168. package/tokens/src/core/components/Popover.json +18 -14
  169. package/tokens/src/core/components/ProductTour.json +8 -14
  170. package/tokens/src/core/components/ProgressBar.json +29 -14
  171. package/tokens/src/core/components/SearchField.json +7 -9
  172. package/tokens/src/core/components/SelectableBox.json +4 -3
  173. package/tokens/src/core/components/Sheet.json +3 -2
  174. package/tokens/src/core/components/Spinner.json +9 -7
  175. package/tokens/src/core/components/Stack.json +2 -1
  176. package/tokens/src/core/components/Stepper.json +12 -14
  177. package/tokens/src/core/components/Sticky.json +2 -1
  178. package/tokens/src/core/components/Tab.json +8 -7
  179. package/tokens/src/core/components/Tabs.json +5 -5
  180. package/tokens/src/core/components/Toast.json +11 -8
  181. package/tokens/src/core/components/Tooltip.json +13 -11
  182. package/tokens/src/core/components/general/caret.json +5 -3
  183. package/tokens/src/core/components/general/headings.json +5 -4
  184. package/tokens/src/core/components/general/hr.json +3 -2
  185. package/tokens/src/core/components/general/input.json +19 -19
  186. package/tokens/src/core/components/general/link.json +13 -12
  187. package/tokens/src/core/components/general/list.json +9 -6
  188. package/tokens/src/core/components/general/text.json +6 -12
  189. package/tokens/src/core/global/breakpoints.json +25 -6
  190. package/tokens/src/core/global/elevation.json +55 -13
  191. package/tokens/src/core/global/other.json +5 -1
  192. package/tokens/src/core/global/spacing.json +70 -17
  193. package/tokens/src/core/global/transition.json +41 -4
  194. package/tokens/src/core/global/typography.json +248 -53
  195. package/tokens/src/core/utilities/color.json +35 -4
  196. package/tokens/src/themes/light/alias/color.json +276 -75
  197. package/tokens/src/themes/light/components/Alert.json +15 -26
  198. package/tokens/src/themes/light/components/Annotation.json +27 -13
  199. package/tokens/src/themes/light/components/Avatar.json +2 -1
  200. package/tokens/src/themes/light/components/Badge.json +57 -122
  201. package/tokens/src/themes/light/components/Breadcrumb.json +6 -5
  202. package/tokens/src/themes/light/components/Bubble.json +9 -8
  203. package/tokens/src/themes/light/components/Button/brand.json +171 -119
  204. package/tokens/src/themes/light/components/Button/core.json +8 -9
  205. package/tokens/src/themes/light/components/Button/danger.json +171 -112
  206. package/tokens/src/themes/light/components/Button/dark.json +188 -106
  207. package/tokens/src/themes/light/components/Button/info.json +186 -112
  208. package/tokens/src/themes/light/components/Button/light.json +186 -110
  209. package/tokens/src/themes/light/components/Button/primary.json +178 -116
  210. package/tokens/src/themes/light/components/Button/secondary.json +166 -132
  211. package/tokens/src/themes/light/components/Button/success.json +176 -117
  212. package/tokens/src/themes/light/components/Button/tertiary.json +34 -60
  213. package/tokens/src/themes/light/components/Button/warning.json +164 -128
  214. package/tokens/src/themes/light/components/Card.json +10 -21
  215. package/tokens/src/themes/light/components/Carousel.json +12 -11
  216. package/tokens/src/themes/light/components/Chip.json +14 -26
  217. package/tokens/src/themes/light/components/CloseButton.json +12 -2
  218. package/tokens/src/themes/light/components/Code.json +7 -9
  219. package/tokens/src/themes/light/components/DataTable.json +7 -11
  220. package/tokens/src/themes/light/components/Dropdown.json +17 -20
  221. package/tokens/src/themes/light/components/Dropzone.json +49 -11
  222. package/tokens/src/themes/light/components/Form/color.json +101 -155
  223. package/tokens/src/themes/light/components/Form/elevation.json +38 -42
  224. package/tokens/src/themes/light/components/Form/other.json +44 -41
  225. package/tokens/src/themes/light/components/IconButton.json +408 -256
  226. package/tokens/src/themes/light/components/Image.json +7 -4
  227. package/tokens/src/themes/light/components/Menu.json +12 -10
  228. package/tokens/src/themes/light/components/Modal.json +22 -12
  229. package/tokens/src/themes/light/components/Nav.json +82 -94
  230. package/tokens/src/themes/light/components/Navbar.json +32 -76
  231. package/tokens/src/themes/light/components/OverflowScroll.json +3 -1
  232. package/tokens/src/themes/light/components/PageBanner.json +11 -10
  233. package/tokens/src/themes/light/components/Pagination.json +19 -23
  234. package/tokens/src/themes/light/components/Popover.json +22 -27
  235. package/tokens/src/themes/light/components/ProductTour.json +9 -20
  236. package/tokens/src/themes/light/components/ProgressBar.json +12 -10
  237. package/tokens/src/themes/light/components/Scrollable.json +3 -3
  238. package/tokens/src/themes/light/components/SearchField.json +9 -9
  239. package/tokens/src/themes/light/components/Sheet.json +6 -7
  240. package/tokens/src/themes/light/components/Stepper.json +12 -17
  241. package/tokens/src/themes/light/components/Sticky.json +31 -6
  242. package/tokens/src/themes/light/components/Tab.json +47 -24
  243. package/tokens/src/themes/light/components/Toast.json +26 -14
  244. package/tokens/src/themes/light/components/Tooltip.json +25 -10
  245. package/tokens/src/themes/light/components/general/body.json +3 -2
  246. package/tokens/src/themes/light/components/general/headings.json +2 -1
  247. package/tokens/src/themes/light/components/general/hr.json +3 -6
  248. package/tokens/src/themes/light/components/general/input.json +11 -4
  249. package/tokens/src/themes/light/components/general/link.json +34 -43
  250. package/tokens/src/themes/light/components/general/list.json +15 -19
  251. package/tokens/src/themes/light/components/general/text.json +5 -6
  252. package/tokens/src/themes/light/global/color.json +1592 -867
  253. package/tokens/src/themes/light/global/elevation.json +481 -93
  254. package/tokens/style-dictionary.js +342 -144
  255. package/tokens/utils.js +176 -6
  256. package/src/Container/index.jsx +0 -49
  257. package/tokens/src/core/global/display.json +0 -22
  258. /package/src/Truncate/{Truncate.test.js → utils.test.js} +0 -0
@@ -1,9 +1,16 @@
1
1
  import React from 'react';
2
2
  import ReactDOM from 'react-dom';
3
- import PropTypes from 'prop-types';
4
3
 
5
- class Portal extends React.Component {
6
- constructor(props) {
4
+ interface Props {
5
+ children: React.ReactNode;
6
+ }
7
+
8
+ class Portal extends React.Component<Props> {
9
+ private rootName: string;
10
+
11
+ private rootElement: HTMLElement | null;
12
+
13
+ constructor(props: Props) {
7
14
  super(props);
8
15
  this.rootName = 'paragon-portal-root';
9
16
  // istanbul ignore if
@@ -31,8 +38,4 @@ class Portal extends React.Component {
31
38
  }
32
39
  }
33
40
 
34
- Portal.propTypes = {
35
- children: PropTypes.node.isRequired,
36
- };
37
-
38
41
  export default Portal;
@@ -1,3 +1,23 @@
1
+ :root {
2
+ --pgn-elevation-modal-content-box-shadow-sm-up:
3
+ var(--pgn-elevation-modal-content-box-shadow-sm-up-1-offset-x)
4
+ var(--pgn-elevation-modal-content-box-shadow-sm-up-1-offset-y)
5
+ var(--pgn-elevation-modal-content-box-shadow-sm-up-1-blur)
6
+ var(--pgn-elevation-modal-content-box-shadow-sm-up-1-color),
7
+ var(--pgn-elevation-modal-content-box-shadow-sm-up-2-offset-x)
8
+ var(--pgn-elevation-modal-content-box-shadow-sm-up-2-offset-y)
9
+ var(--pgn-elevation-modal-content-box-shadow-sm-up-2-blur)
10
+ var(--pgn-elevation-modal-content-box-shadow-sm-up-2-color);
11
+
12
+ --pgn-spacing-modal-footer-padding-base:
13
+ var(--pgn-spacing-modal-footer-padding-base-y)
14
+ var(--pgn-spacing-modal-footer-padding-base-x);
15
+
16
+ --pgn-spacing-modal-header-padding-base:
17
+ var(--pgn-spacing-modal-header-padding-base-y)
18
+ var(--pgn-spacing-modal-header-padding-base-x);
19
+ }
20
+
1
21
  .pgn__modal {
2
22
  background: var(--pgn-color-modal-content-bg);
3
23
  border-radius: calc(var(--pgn-size-modal-content-border-radius) - var(--pgn-size-modal-content-border-width));
@@ -122,7 +142,7 @@
122
142
  }
123
143
 
124
144
  .pgn__modal-title {
125
- font-size: var(--pgn-typography-font-size-h3);
145
+ font-size: var(--pgn-typography-font-size-h3-base);
126
146
  margin-inline-end: 3rem; // roughly accomodate the width of the close buttonn
127
147
  text-align: start;
128
148
  }
@@ -310,7 +330,7 @@
310
330
  }
311
331
 
312
332
  .pgn__modal-title {
313
- font-size: var(--pgn-typography-font-size-h4);
333
+ font-size: var(--pgn-typography-font-size-h4-base);
314
334
  display: flex;
315
335
  flex-grow: 1;
316
336
  align-items: center;
@@ -31,10 +31,13 @@ label for the dialog element.
31
31
  const variants = ['default', 'warning', 'danger', 'success', 'dark'];
32
32
  const [modalSize, setModalSize] = useState('md');
33
33
  const [modalVariant, setModalVariant] = useState('default');
34
+
34
35
  return (
35
36
  <>
36
37
  <div className="d-flex">
37
- <Button variant="outline-primary" onClick={open}>Open standard modal dialog</Button>
38
+ <Button variant="outline-primary" onClick={open}>
39
+ Open standard modal dialog
40
+ </Button>
38
41
  </div>
39
42
  <ModalDialog
40
43
  title="My dialog"
@@ -44,6 +47,7 @@ label for the dialog element.
44
47
  variant={modalVariant}
45
48
  hasCloseButton
46
49
  isFullscreenOnMobile
50
+ isOverflowVisible
47
51
  >
48
52
  <ModalDialog.Header>
49
53
  <ModalDialog.Title>
@@ -73,7 +77,11 @@ label for the dialog element.
73
77
  </Form.RadioSet>
74
78
  </Form.Group>
75
79
  <p>
76
- I'm baby palo santo ugh celiac fashion axe. La croix lo-fi venmo whatever. Beard man braid migas single-origin coffee forage ramps. Tumeric messenger bag bicycle rights wayfarers, try-hard cronut blue bottle health goth. Sriracha tumblr cardigan, cloud bread succulents tumeric copper mug marfa semiotics woke next level organic roof party +1 try-hard.
80
+ I'm baby palo santo ugh celiac fashion axe. La croix lo-fi venmo whatever.
81
+ Beard man braid migas single-origin coffee forage ramps. Tumeric messenger
82
+ bag bicycle rights wayfarers, try-hard cronut blue bottle health goth.
83
+ Sriracha tumblr cardigan, cloud bread succulents tumeric copper mug marfa
84
+ semiotics woke next level organic roof party +1 try-hard.
77
85
  </p>
78
86
  </ModalDialog.Body>
79
87
 
@@ -82,7 +90,7 @@ label for the dialog element.
82
90
  <ModalDialog.CloseButton variant="tertiary">
83
91
  Cancel
84
92
  </ModalDialog.CloseButton>
85
- <Button variant="primary">
93
+ <Button>
86
94
  A button
87
95
  </Button>
88
96
  </ActionRow>
@@ -102,10 +110,13 @@ label for the dialog element.
102
110
  const variants = ['default', 'warning', 'danger', 'success', 'dark'];
103
111
  const [modalSize, setModalSize] = useState('md');
104
112
  const [modalVariant, setModalVariant] = useState('dark');
113
+
105
114
  return (
106
115
  <>
107
116
  <div className="d-flex">
108
- <Button variant="outline-primary" onClick={open}>Open marketing modal dialog</Button>
117
+ <Button variant="outline-primary" onClick={open}>
118
+ Open marketing modal dialog
119
+ </Button>
109
120
  </div>
110
121
  <ModalDialog
111
122
  title="My dialog"
@@ -114,6 +125,7 @@ label for the dialog element.
114
125
  size={modalSize}
115
126
  variant={modalVariant}
116
127
  hasCloseButton
128
+ isOverflowVisible
117
129
  >
118
130
  <ModalDialog.Hero>
119
131
  <ModalDialog.Hero.Background
@@ -144,7 +156,11 @@ label for the dialog element.
144
156
  </Form.RadioSet>
145
157
  </Form.Group>
146
158
  <p>
147
- I'm baby palo santo ugh celiac fashion axe. La croix lo-fi venmo whatever. Beard man braid migas single-origin coffee forage ramps. Tumeric messenger bag bicycle rights wayfarers, try-hard cronut blue bottle health goth. Sriracha tumblr cardigan, cloud bread succulents tumeric copper mug marfa semiotics woke next level organic roof party +1 try-hard.
159
+ I'm baby palo santo ugh celiac fashion axe. La croix lo-fi venmo whatever.
160
+ Beard man braid migas single-origin coffee forage ramps. Tumeric messenger
161
+ bag bicycle rights wayfarers, try-hard cronut blue bottle health goth.
162
+ Sriracha tumblr cardigan, cloud bread succulents tumeric copper mug marfa
163
+ semiotics woke next level organic roof party +1 try-hard.
148
164
  </p>
149
165
  </ModalDialog.Body>
150
166
 
@@ -153,7 +169,80 @@ label for the dialog element.
153
169
  <ModalDialog.CloseButton variant="tertiary">
154
170
  Cancel
155
171
  </ModalDialog.CloseButton>
156
- <Button variant="primary">
172
+ <Button>
173
+ A button
174
+ </Button>
175
+ </ActionRow>
176
+ </ModalDialog.Footer>
177
+ </ModalDialog>
178
+ </>
179
+ )
180
+ }
181
+ ```
182
+
183
+ ## Overflow visibility handling
184
+
185
+ The `isOverflowVisible` toggle controls whether content that extends beyond the modal's viewport boundaries is visible.
186
+ When enabled (`isOverflowVisible` is set to `true`), any overflow content, such as dropdowns or tooltips,
187
+ will be displayed outside the modal's main area instead of being clipped.
188
+
189
+ In this example, switching `isOverflowVisible` on and off affects the visibility of the dropdown options in
190
+ the autosuggest field, showing how overflow handling impacts content display within a modal.
191
+
192
+ ```jsx live
193
+ () => {
194
+ const [isOpen, open, close] = useToggle(false);
195
+ const [isOn, setOn, setOff, toggle] = useToggle(false);
196
+
197
+ return (
198
+ <>
199
+ <div className="d-flex">
200
+ <Button variant="outline-primary" onClick={open}>
201
+ Open standard modal dialog
202
+ </Button>
203
+ </div>
204
+ <ModalDialog
205
+ title="My dialog"
206
+ isOpen={isOpen}
207
+ onClose={close}
208
+ hasCloseButton
209
+ isFullscreenOnMobile
210
+ isOverflowVisible={isOn}
211
+ >
212
+ <ModalDialog.Header>
213
+ <ModalDialog.Title>
214
+ I'm a dialog box
215
+ </ModalDialog.Title>
216
+ </ModalDialog.Header>
217
+
218
+ <ModalDialog.Body>
219
+ <Stack className="mb-3" direction="horizontal" gap={2}>
220
+ <Form.Switch checked={isOn} onChange={toggle}>
221
+ isOverflowVisible
222
+ </Form.Switch>
223
+ {isOn
224
+ ? <Badge variant="success">{JSON.stringify(isOn)}</Badge>
225
+ : <Badge variant="light">{JSON.stringify(isOn)}</Badge>
226
+ }
227
+ </Stack>
228
+ <Form.Autosuggest
229
+ aria-label="form autosuggest"
230
+ helpMessage="Select language"
231
+ placeholder="Open autosuggest dropdown"
232
+ >
233
+ <Form.AutosuggestOption id="javascript-option-id">JavaScript</Form.AutosuggestOption>
234
+ <Form.AutosuggestOption id="python-option-id">Python</Form.AutosuggestOption>
235
+ <Form.AutosuggestOption id="ruby-option-id">Ruby</Form.AutosuggestOption>
236
+ <Form.AutosuggestOption id="c-option-id">C</Form.AutosuggestOption>
237
+ </Form.Autosuggest>
238
+ </ModalDialog.Body>
239
+
240
+ <ModalDialog.Footer>
241
+ <ActionRow>
242
+ <ModalDialog.CloseButton variant="tertiary">
243
+ Cancel
244
+ </ModalDialog.CloseButton>
245
+ <Button>
157
246
  A button
158
247
  </Button>
159
248
  </ActionRow>
@@ -3,16 +3,6 @@ import { render, screen } from '@testing-library/react';
3
3
 
4
4
  import ModalDialog from '../ModalDialog';
5
5
 
6
- jest.mock('../ModalLayer', () => function ModalLayerMock(props) {
7
- // eslint-disable-next-line react/prop-types
8
- const { children, ...otherProps } = props;
9
- return (
10
- <modal-layer {...otherProps}>
11
- {children}
12
- </modal-layer>
13
- );
14
- });
15
-
16
6
  describe('ModalDialog', () => {
17
7
  it('renders a dialog with aria-label and content', () => {
18
8
  const onClose = jest.fn();
@@ -24,6 +14,7 @@ describe('ModalDialog', () => {
24
14
  size="md"
25
15
  variant="default"
26
16
  hasCloseButton
17
+ isOverflowVisible
27
18
  >
28
19
  <ModalDialog.Header>
29
20
  <ModalDialog.Title>The title</ModalDialog.Title>
@@ -45,6 +36,22 @@ describe('ModalDialog', () => {
45
36
  expect(dialogNode).toHaveAttribute('aria-label', 'My dialog');
46
37
  expect(screen.getByText('The content')).toBeInTheDocument();
47
38
  });
39
+
40
+ it('is hidden by default', () => {
41
+ const onClose = jest.fn();
42
+ render(
43
+ <ModalDialog
44
+ title="My dialog"
45
+ onClose={onClose}
46
+ >
47
+ <ModalDialog.Header><ModalDialog.Title>The title</ModalDialog.Title></ModalDialog.Header>
48
+ <ModalDialog.Body><p>The hidden content</p></ModalDialog.Body>
49
+ <ModalDialog.Footer><ModalDialog.CloseButton>Cancel</ModalDialog.CloseButton></ModalDialog.Footer>
50
+ </ModalDialog>,
51
+ );
52
+
53
+ expect(screen.queryByRole('dialog')).not.toBeInTheDocument();
54
+ });
48
55
  });
49
56
 
50
57
  describe('ModalDialog with Hero', () => {
@@ -58,6 +65,7 @@ describe('ModalDialog with Hero', () => {
58
65
  size="md"
59
66
  variant="default"
60
67
  hasCloseButton
68
+ isOverflowVisible
61
69
  >
62
70
  <ModalDialog.Hero>
63
71
  <ModalDialog.Hero.Background backgroundSrc="imageurl" />
@@ -6,12 +6,11 @@ import userEvent from '@testing-library/user-event';
6
6
  import ModalLayer from '../ModalLayer';
7
7
 
8
8
  /* eslint-disable react/prop-types */
9
- jest.mock('../Portal', () => function PortalMock(props) {
9
+ jest.mock('../Portal', () => function PortalMock(props: any) {
10
10
  const { children, ...otherProps } = props;
11
11
  return (
12
- <paragon-portal {...otherProps}>
13
- {children}
14
- </paragon-portal>
12
+ // @ts-ignore this fake element. (Property 'paragon-portal' does not exist on type 'JSX.IntrinsicElements')
13
+ <paragon-portal {...otherProps}>{children}</paragon-portal>
15
14
  );
16
15
  });
17
16
 
@@ -19,6 +18,7 @@ jest.mock('react-focus-on', () => ({
19
18
  FocusOn: jest.fn().mockImplementation((props) => {
20
19
  const { children, ...otherProps } = props;
21
20
  return (
21
+ // @ts-ignore this fake element. (Property 'focus-on' does not exist on type 'JSX.IntrinsicElements')
22
22
  <focus-on data-testid="focus-on" {...otherProps}>{children}</focus-on>
23
23
  );
24
24
  }),
@@ -117,7 +117,7 @@ describe('<ModalLayer />', () => {
117
117
  );
118
118
  expect(FocusOn).toHaveBeenCalledWith(
119
119
  expect.objectContaining({
120
- onEscapeKey: null,
120
+ onEscapeKey: undefined,
121
121
  }),
122
122
  // note: this 2nd function argument represents the
123
123
  // `refOrContext` (in this case, the context value
@@ -21,7 +21,7 @@ describe('<Portal />', () => {
21
21
 
22
22
  const portalRoot = getPortalRoot();
23
23
  expect(portalRoot).not.toBeNull();
24
- expect(portalRoot.children[0].id).toBe('portal-content-a');
24
+ expect(portalRoot!.children[0].id).toBe('portal-content-a');
25
25
  });
26
26
 
27
27
  it('renders both contents in a single #paragon-portal-root div', () => {
@@ -38,7 +38,7 @@ describe('<Portal />', () => {
38
38
 
39
39
  const portalRoot = getPortalRoot();
40
40
  expect(portalRoot).not.toBeNull();
41
- expect(portalRoot.children[0].id).toBe('portal-content-a');
42
- expect(portalRoot.children[1].id).toBe('portal-content-b');
41
+ expect(portalRoot!.children[0].id).toBe('portal-content-a');
42
+ expect(portalRoot!.children[1].id).toBe('portal-content-b');
43
43
  });
44
44
  });
@@ -1,5 +1,13 @@
1
1
  @import "mixins";
2
2
 
3
+ :root {
4
+ --pgn-border-color-nav-tabs-link-border-hover:
5
+ var(--pgn-border-color-nav-tabs-link-border-hover-top)
6
+ var(--pgn-border-color-nav-tabs-link-border-hover-right)
7
+ var(--pgn-border-color-nav-tabs-link-border-hover-bottom)
8
+ var(--pgn-border-color-nav-tabs-link-border-hover-left);
9
+ }
10
+
3
11
  // Base class
4
12
  //
5
13
  // Kickstart any navigation component with a set of style resets. Works with
@@ -4,12 +4,12 @@
4
4
  min-height: 36px;
5
5
  display: flex;
6
6
  flex-wrap: nowrap;
7
- font-size: var(--pgn-typography-font-size-small-x);
7
+ font-size: var(--pgn-typography-font-size-xs);
8
8
  background-color: var(--pgn-page-baner-bg, inherit);
9
9
  color: var(--pgn-page-baner-color, inherit);
10
10
 
11
11
  @include media-breakpoint-up(md) {
12
- font-size: var(--pgn-typography-font-size-small-base);
12
+ font-size: var(--pgn-typography-font-size-sm);
13
13
  }
14
14
  }
15
15
 
@@ -1,3 +1,12 @@
1
+ :root {
2
+ --pgn-elevation-pagination-focus-box-shadow:
3
+ var(--pgn-elevation-pagination-focus-box-shadow-offset-x)
4
+ var(--pgn-elevation-pagination-focus-box-shadow-offset-y)
5
+ var(--pgn-elevation-pagination-focus-box-shadow-blur)
6
+ var(--pgn-elevation-pagination-focus-box-shadow-spread)
7
+ var(--pgn-elevation-pagination-focus-box-shadow-color);
8
+ }
9
+
1
10
  .pagination {
2
11
  display: flex;
3
12
 
@@ -7,7 +7,7 @@
7
7
  .popover-header {
8
8
  display: flex;
9
9
  align-items: center;
10
- font-size: var(--pgn-typography-font-size-h5);
10
+ font-size: var(--pgn-typography-font-size-h5-base);
11
11
  }
12
12
 
13
13
  .pgn__icon {
@@ -88,7 +88,7 @@
88
88
  }
89
89
 
90
90
  #pgn__checkpoint-title {
91
- font-size: var(--pgn-typography-font-size-h3);
91
+ font-size: var(--pgn-typography-font-size-h3-base);
92
92
  margin-inline-end: map_get($spacers, 2\.5);
93
93
  margin-bottom: 0;
94
94
  }
@@ -1,3 +1,18 @@
1
+ :root {
2
+ --pgn-transition-progress-bar-animation-timing:
3
+ var(--pgn-transition-progress-bar-animation-timing-duration)
4
+ var(--pgn-transition-progress-bar-animation-timing-timing-function)
5
+ var(--pgn-transition-progress-bar-animation-timing-iteration-count)
6
+ var(--pgn-transition-progress-bar-animation-timing-delay);
7
+
8
+ --pgn-transition-progress-bar-transition:
9
+ var(--pgn-transition-progress-bar-transition-property)
10
+ var(--pgn-transition-progress-bar-transition-duration)
11
+ var(--pgn-transition-progress-bar-transition-timing-function)
12
+ var(--pgn-transition-progress-bar-transition-delay)
13
+ var(--pgn-transition-progress-bar-transition-behavior);
14
+ }
15
+
1
16
  @if $enable-transitions {
2
17
  @keyframes progress-bar-stripes {
3
18
  from { background-position: var(--pgn-size-progress-bar-height-base) 0; }
@@ -10,7 +25,7 @@
10
25
  height: var(--pgn-size-progress-bar-height-base);
11
26
  overflow: hidden;
12
27
  line-height: 0;
13
- background-color: var(--pgn-color-progress-bar-bg);
28
+ background-color: var(--pgn-color-progress-bg);
14
29
  box-shadow: var(--pgn-elevation-progress-bar-box-shadow);
15
30
 
16
31
  @include font-size(var(--pgn-typography-progress-bar-font-size));
@@ -22,12 +37,12 @@
22
37
  flex-direction: column;
23
38
  justify-content: center;
24
39
  overflow: hidden;
25
- color: var(--pgn-color-progress-bar-bar-base);
40
+ color: var(--pgn-color-progress-bar-base);
26
41
  text-align: center;
27
42
  white-space: nowrap;
28
- background-color: var(--pgn-color-progress-bar-bar-bg-base);
43
+ background-color: var(--pgn-color-progress-bar-bg-base);
29
44
 
30
- @include transition(var(--pgn-transition-progress-bar-bar-transition));
45
+ @include transition(var(--pgn-transition-progress-bar-transition));
31
46
  }
32
47
 
33
48
  .progress-bar-striped {
@@ -38,7 +53,7 @@
38
53
 
39
54
  @if $enable-transitions {
40
55
  .progress-bar-animated {
41
- animation: var(--pgn-transition-progress-bar-bar-animation-timing) progress-bar-stripes;
56
+ animation: var(--pgn-transition-progress-bar-animation-timing) progress-bar-stripes;
42
57
 
43
58
  @if $enable-prefers-reduced-motion-media-query {
44
59
  @media (prefers-reduced-motion: reduce) {
@@ -6,7 +6,7 @@
6
6
  }
7
7
 
8
8
  .progress-bar {
9
- background-color: var(--pgn-color-progress-bar-bar-bg-base);
9
+ background-color: var(--pgn-color-progress-bar-bg-base);
10
10
  }
11
11
 
12
12
  .pgn__progress-annotated {
@@ -22,7 +22,7 @@
22
22
  border: none;
23
23
 
24
24
  .progress-bar {
25
- background-color: var(--pgn-color-progress-bar-bar-bg-annotated);
25
+ background-color: var(--pgn-color-progress-bar-bg-annotated);
26
26
  overflow: visible;
27
27
  position: relative;
28
28
  }
@@ -87,6 +87,6 @@
87
87
  .pgn__progress-hint {
88
88
  box-sizing: border-box;
89
89
  padding: 0 var(--pgn-spacing-progress-bar-hint-annotation-gap);
90
- font-size: var(--pgn-typography-font-size-small-base);
90
+ font-size: var(--pgn-typography-font-size-sm);
91
91
  }
92
92
  }
@@ -56,7 +56,7 @@
56
56
  }
57
57
 
58
58
  .pgn__stepper-header-step-description {
59
- font-size: var(--pgn-typography-font-size-small-x);
59
+ font-size: var(--pgn-typography-font-size-xs);
60
60
  }
61
61
 
62
62
  &.pgn__stepper-header-step-active ~ .pgn__stepper-header-step {
@@ -1,3 +1,15 @@
1
+ :root {
2
+ --pgn-elevation-sticky-shadow-bottom:
3
+ var(--pgn-elevation-sticky-shadow-bottom-1-offset-x)
4
+ var(--pgn-elevation-sticky-shadow-bottom-1-offset-y)
5
+ var(--pgn-elevation-sticky-shadow-bottom-1-blur)
6
+ var(--pgn-elevation-sticky-shadow-bottom-1-color),
7
+ var(--pgn-elevation-sticky-shadow-bottom-2-offset-x)
8
+ var(--pgn-elevation-sticky-shadow-bottom-2-offset-y)
9
+ var(--pgn-elevation-sticky-shadow-bottom-2-blur)
10
+ var(--pgn-elevation-sticky-shadow-bottom-2-color);
11
+ }
12
+
1
13
  .pgn__sticky {
2
14
  display: flex;
3
15
  width: 100%;
@@ -1,5 +1,17 @@
1
1
  @import "bootstrap-toast";
2
2
 
3
+ :root {
4
+ --pgn-elevation-toast-box-shadow:
5
+ var(--pgn-elevation-toast-box-shadow-1-offset-x)
6
+ var(--pgn-elevation-toast-box-shadow-1-offset-y)
7
+ var(--pgn-elevation-toast-box-shadow-1-blur)
8
+ var(--pgn-elevation-toast-box-shadow-1-color),
9
+ var(--pgn-elevation-toast-box-shadow-2-offset-x)
10
+ var(--pgn-elevation-toast-box-shadow-2-offset-y)
11
+ var(--pgn-elevation-toast-box-shadow-2-blur)
12
+ var(--pgn-elevation-toast-box-shadow-2-color);
13
+ }
14
+
3
15
  .toast {
4
16
  background-color: var(--pgn-color-toast-bg);
5
17
  box-shadow: var(--pgn-elevation-toast-box-shadow);
@@ -31,7 +43,7 @@
31
43
  padding: 0;
32
44
 
33
45
  p {
34
- font-size: var(--pgn-typography-font-size-small-base);
46
+ font-size: var(--pgn-typography-font-size-sm);
35
47
  margin: 0;
36
48
  padding-right: .75rem;
37
49
  }
@@ -1,3 +1,19 @@
1
+ :root {
2
+ --pgn-elevation-tooltip-box-shadow:
3
+ drop-shadow(
4
+ var(--pgn-elevation-tooltip-box-shadow-1-offset-x)
5
+ var(--pgn-elevation-tooltip-box-shadow-1-offset-y)
6
+ var(--pgn-elevation-tooltip-box-shadow-1-blur)
7
+ var(--pgn-elevation-tooltip-box-shadow-1-color)
8
+ )
9
+ drop-shadow(
10
+ var(--pgn-elevation-tooltip-box-shadow-2-offset-x)
11
+ var(--pgn-elevation-tooltip-box-shadow-2-offset-y)
12
+ var(--pgn-elevation-tooltip-box-shadow-2-blur)
13
+ var(--pgn-elevation-tooltip-box-shadow-2-color)
14
+ );
15
+ }
16
+
1
17
  // Base class
2
18
  .tooltip {
3
19
  position: absolute;
@@ -32,8 +32,7 @@ function handleArrowKey({ event, currentIndex, availableElements }) {
32
32
  [nextElement] = availableElements;
33
33
  }
34
34
 
35
- // eslint-disable-next-line no-unused-expressions
36
- nextElement && nextElement.focus();
35
+ nextElement?.focus();
37
36
  event.preventDefault();
38
37
  }
39
38
 
package/src/index.d.ts CHANGED
@@ -8,10 +8,15 @@ export { default as Bubble } from './Bubble';
8
8
  export { default as Button, ButtonGroup, ButtonToolbar } from './Button';
9
9
  export { default as Chip, CHIP_PGN_CLASS } from './Chip';
10
10
  export { default as ChipCarousel } from './ChipCarousel';
11
+ export { default as Container, ContainerSize } from './Container';
11
12
  export { default as Hyperlink, HYPER_LINK_EXTERNAL_LINK_ALT_TEXT, HYPER_LINK_EXTERNAL_LINK_TITLE } from './Hyperlink';
12
13
  export { default as Icon } from './Icon';
13
14
  export { default as IconButton, IconButtonWithTooltip } from './IconButton';
15
+ export { default as ModalContext } from './Modal/ModalContext';
16
+ export { default as ModalDialog, MODAL_DIALOG_CLOSE_LABEL } from './Modal/ModalDialog';
17
+ export { default as ModalLayer } from './Modal/ModalLayer';
14
18
  export { default as Overlay, OverlayTrigger } from './Overlay';
19
+ export { default as Portal } from './Modal/Portal';
15
20
  export { default as Tooltip } from './Tooltip';
16
21
 
17
22
  // // // // // // // // // // // // // // // // // // // // // // // // // // //
@@ -38,10 +43,11 @@ export const
38
43
  export const
39
44
  Carousel: any, CarouselItem: any, CAROUSEL_NEXT_LABEL_TEXT: any, CAROUSEL_PREV_LABEL_TEXT: any;
40
45
  // from './Carousel';
46
+ /** @deprecated Replaced by `Form.Checkbox`. */
41
47
  export const CheckBox: any; // from './CheckBox';
48
+ /** @deprecated Replaced by `Form.Checkbox` and `Form.CheckboxSet`. */
42
49
  export const CheckBoxGroup: any; // from './CheckBoxGroup';
43
50
  export const CloseButton: any; // from './CloseButton';
44
- export const Container: any; // from './Container';
45
51
  export const Layout: any, Col: any, Row: any; // from './Layout';
46
52
  export const Collapse: any; // from './Collapse';
47
53
  export const Collapsible: any; // from './Collapsible';
@@ -53,6 +59,7 @@ export const
53
59
  SplitButton: any;
54
60
  // from './Dropdown';
55
61
  export const Fade: any; // from './Fade';
62
+ /** @deprecated */
56
63
  export const Fieldset: any; // from './Fieldset';
57
64
  export const
58
65
  Form: any,
@@ -77,28 +84,30 @@ export const
77
84
  InputGroup: any;
78
85
  // from './Form';
79
86
  export const IconButtonToggle: any; // from './IconButtonToggle';
87
+ /** @deprecated Replaced by `Form.Control`. */
80
88
  export const Input: any; // from './Input';
89
+ /** @deprecated Replaced by `Form.Control`. */
81
90
  export const InputSelect: any; // from './InputSelect';
91
+ /** @deprecated Replaced by `Form.Control`. */
82
92
  export const InputText: any; // from './InputText';
83
93
  export const Image: any, Figure; // from './Image';
94
+ /** @deprecated */
84
95
  export const ListBox: any; // from './ListBox';
96
+ /** @deprecated */
85
97
  export const ListBoxOption: any; // from './ListBoxOption';
86
98
  export const MailtoLink: any, MAIL_TO_LINK_EXTERNAL_LINK_ALTERNATIVE_TEXT: string, MAIL_TO_LINK_EXTERNAL_LINK_TITLE: string; // from './MailtoLink';
87
99
  export const Media: any; // from './Media';
88
100
  export const Menu: any; // from './Menu';
89
101
  export const MenuItem: any; // from './Menu/MenuItem';
90
102
  export const SelectMenu: any, SELECT_MENU_DEFAULT_MESSAGE: string; // from './Menu/SelectMenu';
103
+ /** @deprecated Use `ModalDialog` instead. */
91
104
  export const Modal: any; // from './Modal';
92
105
  export const ModalCloseButton: any; // from './Modal/ModalCloseButton';
93
106
  export const FullscreenModal: any, FULLSCREEN_MODAL_CLOSE_LABEL: string; // from './Modal/FullscreenModal';
94
107
  export const MarketingModal: any; // from './Modal/MarketingModal';
95
108
  export const StandardModal: any, STANDARD_MODAL_CLOSE_LABEL: string; // from './Modal/StandardModal';
96
109
  export const AlertModal: any; // from './Modal/AlertModal';
97
- export const ModalLayer: any; // from './Modal/ModalLayer';
98
- export const ModalDialog: any, MODAL_DIALOG_CLOSE_LABEL: string; // from './Modal/ModalDialog';
99
110
  export const ModalPopup: any; // from './Modal/ModalPopup';
100
- export const ModalContext: any; // from './Modal/ModalContext';
101
- export const Portal: any; // from './Modal/Portal';
102
111
  export const PopperElement: any; // from './Modal/PopperElement';
103
112
 
104
113
  export const
@@ -122,6 +131,7 @@ export const
122
131
  export const Popover: any, PopoverTitle: any, PopoverContent: any; // from './Popover';
123
132
  export const ProgressBar: any; // from './ProgressBar';
124
133
  export const ProductTour: any; // from './ProductTour';
134
+ /** @deprecated Replaced by `Form.Radio` and `Form.RadioSet`. */
125
135
  export const RadioButtonGroup: any, RadioButton: any; // from './RadioButtonGroup';
126
136
  export const ResponsiveEmbed: any; // from './ResponsiveEmbed';
127
137
  export const
@@ -135,7 +145,9 @@ export const Sheet: any; // from './Sheet';
135
145
  export const Spinner: any; // from './Spinner';
136
146
  export const Stepper: any; // from './Stepper';
137
147
  export const StatefulButton: any; // from './StatefulButton';
148
+ /** @deprecated Replaced by `Alert`. */
138
149
  export const StatusAlert: any; // from './StatusAlert';
150
+ /** @deprecated Replaced by `DataTable`. */
139
151
  export const Table: any; // from './Table';
140
152
  export const
141
153
  Tabs: any,
@@ -144,8 +156,10 @@ export const
144
156
  TabContent: any,
145
157
  TabPane: any;
146
158
  // from './Tabs';
159
+ /** @deprecated Replaced by `Form.Control`. */
147
160
  export const TextArea: any; // from './TextArea';
148
161
  export const Toast: any, TOAST_CLOSE_LABEL_TEXT: string, TOAST_DELAY: number; // from './Toast';
162
+ /** @deprecated Replaced by `Form.Group`. */
149
163
  export const ValidationFormGroup: any; // from './ValidationFormGroup';
150
164
  export const TransitionReplace: any; // from './TransitionReplace';
151
165
  export const ValidationMessage: any; // from './ValidationMessage';