@openedx/paragon 23.0.0-alpha.2 → 23.0.0-alpha.4

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 (274) hide show
  1. package/bin/paragon-scripts.js +10 -0
  2. package/dist/Annotation/index.scss +16 -0
  3. package/dist/Button/index.d.ts +35 -0
  4. package/dist/Button/index.js +37 -15
  5. package/dist/Button/index.js.map +1 -1
  6. package/dist/Card/CardDeck.js +0 -2
  7. package/dist/Card/CardDeck.js.map +1 -1
  8. package/dist/Card/index.scss +6 -6
  9. package/dist/Carousel/index.scss +24 -1
  10. package/dist/Chip/ChipIcon.d.ts +13 -8
  11. package/dist/Chip/ChipIcon.js +0 -2
  12. package/dist/Chip/ChipIcon.js.map +1 -1
  13. package/dist/Chip/constants.d.ts +4 -0
  14. package/dist/Chip/constants.js +3 -2
  15. package/dist/Chip/constants.js.map +1 -0
  16. package/dist/Chip/index.d.ts +4 -3
  17. package/dist/Chip/index.js +2 -4
  18. package/dist/Chip/index.js.map +1 -1
  19. package/dist/ChipCarousel/index.js +0 -2
  20. package/dist/ChipCarousel/index.js.map +1 -1
  21. package/dist/CloseButton/index.scss +8 -0
  22. package/dist/ColorPicker/index.scss +1 -1
  23. package/dist/DataTable/index.scss +12 -0
  24. package/dist/Dropdown/dropdown-bootstrap.scss +6 -0
  25. package/dist/Dropzone/index.scss +34 -0
  26. package/dist/Form/_FormText.scss +1 -1
  27. package/dist/Form/_bootstrap-custom-forms.scss +40 -0
  28. package/dist/Form/_index.scss +9 -0
  29. package/dist/Form/_mixins.scss +22 -0
  30. package/dist/Hyperlink/index.d.ts +24 -0
  31. package/dist/Hyperlink/index.js +20 -32
  32. package/dist/Hyperlink/index.js.map +1 -1
  33. package/dist/Icon/index.d.ts +4 -2
  34. package/dist/Icon/index.js +1 -1
  35. package/dist/Icon/index.js.map +1 -1
  36. package/dist/IconButton/index.d.ts +342 -0
  37. package/dist/IconButton/index.js +18 -26
  38. package/dist/IconButton/index.js.map +1 -1
  39. package/dist/IconButton/index.scss +146 -0
  40. package/dist/Menu/index.scss +8 -0
  41. package/dist/Modal/ModalDialog.js +8 -4
  42. package/dist/Modal/ModalDialog.js.map +1 -1
  43. package/dist/Modal/ModalPopup.js +7 -1
  44. package/dist/Modal/ModalPopup.js.map +1 -1
  45. package/dist/Modal/_ModalDialog.scss +26 -2
  46. package/dist/Nav/index.scss +8 -0
  47. package/dist/Overlay/index.d.ts +128 -0
  48. package/dist/Overlay/index.js +8 -2
  49. package/dist/Overlay/index.js.map +1 -1
  50. package/dist/PageBanner/index.scss +2 -2
  51. package/dist/Pagination/pagination-bootstrap.scss +9 -0
  52. package/dist/Popover/index.scss +1 -1
  53. package/dist/ProductTour/Checkpoint.scss +1 -1
  54. package/dist/ProgressBar/bootstrap-progress.scss +20 -5
  55. package/dist/ProgressBar/index.scss +3 -3
  56. package/dist/Stepper/index.scss +1 -1
  57. package/dist/Sticky/index.scss +12 -0
  58. package/dist/Toast/index.scss +13 -1
  59. package/dist/Tooltip/index.d.ts +7 -0
  60. package/dist/Tooltip/index.js.map +1 -1
  61. package/dist/Tooltip/index.scss +16 -0
  62. package/dist/core.css +914 -470
  63. package/dist/core.css.map +1 -1
  64. package/dist/core.min.css +1 -1
  65. package/dist/index.d.ts +5 -5
  66. package/dist/index.js +7 -7
  67. package/dist/light.css +2035 -1315
  68. package/dist/light.css.map +1 -1
  69. package/dist/light.min.css +1 -1
  70. package/dist/setupTest.d.ts +2 -0
  71. package/dist/setupTest.js.map +1 -0
  72. package/dist/utils/types/bootstrap.d.ts +39 -0
  73. package/dist/utils/types/bootstrap.js +2 -0
  74. package/dist/utils/types/bootstrap.js.map +1 -0
  75. package/lib/build-tokens.js +67 -31
  76. package/package.json +11 -8
  77. package/src/Annotation/index.scss +16 -0
  78. package/src/Button/{Button.test.jsx → Button.test.tsx} +14 -2
  79. package/src/Button/__snapshots__/{Button.test.jsx.snap → Button.test.tsx.snap} +19 -2
  80. package/src/Button/{index.jsx → index.tsx} +58 -16
  81. package/src/Card/CardDeck.jsx +0 -3
  82. package/src/Card/README.md +0 -31
  83. package/src/Card/index.scss +6 -6
  84. package/src/Carousel/index.scss +24 -1
  85. package/src/Chip/{Chip.test.jsx → Chip.test.tsx} +5 -7
  86. package/src/Chip/ChipIcon.tsx +8 -8
  87. package/src/Chip/{constants.js → constants.ts} +1 -1
  88. package/src/Chip/index.tsx +6 -8
  89. package/src/ChipCarousel/index.tsx +0 -2
  90. package/src/CloseButton/index.scss +8 -0
  91. package/src/ColorPicker/index.scss +1 -1
  92. package/src/DataTable/index.scss +12 -0
  93. package/src/Dropdown/dropdown-bootstrap.scss +6 -0
  94. package/src/Dropzone/index.scss +34 -0
  95. package/src/Form/_FormText.scss +1 -1
  96. package/src/Form/_bootstrap-custom-forms.scss +40 -0
  97. package/src/Form/_index.scss +9 -0
  98. package/src/Form/_mixins.scss +22 -0
  99. package/src/Hyperlink/{Hyperlink.test.jsx → Hyperlink.test.tsx} +21 -10
  100. package/src/Hyperlink/{index.jsx → index.tsx} +41 -37
  101. package/src/Icon/index.d.ts +4 -2
  102. package/src/Icon/index.jsx +1 -1
  103. package/src/IconButton/{IconButton.test.jsx → IconButton.test.tsx} +24 -3
  104. package/src/IconButton/__snapshots__/IconButton.test.tsx.snap +90 -0
  105. package/src/IconButton/index.scss +146 -0
  106. package/src/IconButton/{index.jsx → index.tsx} +66 -26
  107. package/src/Menu/index.scss +8 -0
  108. package/src/Modal/ModalDialog.jsx +7 -3
  109. package/src/Modal/ModalPopup.jsx +9 -1
  110. package/src/Modal/_ModalDialog.scss +26 -2
  111. package/src/Modal/modal-dialog.mdx +95 -6
  112. package/src/Modal/tests/ModalDialog.test.jsx +2 -0
  113. package/src/Modal/tests/ModalPopupNoMock.test.jsx +29 -0
  114. package/src/Nav/index.scss +8 -0
  115. package/src/Overlay/{index.jsx → index.tsx} +13 -8
  116. package/src/PageBanner/index.scss +2 -2
  117. package/src/Pagination/pagination-bootstrap.scss +9 -0
  118. package/src/Popover/index.scss +1 -1
  119. package/src/ProductTour/Checkpoint.scss +1 -1
  120. package/src/ProgressBar/bootstrap-progress.scss +20 -5
  121. package/src/ProgressBar/index.scss +3 -3
  122. package/src/Stepper/index.scss +1 -1
  123. package/src/Sticky/index.scss +12 -0
  124. package/src/Toast/index.scss +13 -1
  125. package/src/Tooltip/index.scss +16 -0
  126. package/src/Tooltip/{index.jsx → index.tsx} +9 -3
  127. package/src/index.d.ts +5 -5
  128. package/src/index.js +7 -7
  129. package/src/{setupTest.js → setupTest.ts} +1 -0
  130. package/src/utils/types/bootstrap.test.tsx +86 -0
  131. package/src/utils/types/bootstrap.ts +43 -0
  132. package/styles/css/core/abstraction-variables.css +44 -0
  133. package/styles/css/core/custom-media-breakpoints.css +3 -4
  134. package/styles/css/core/index.css +2 -1
  135. package/styles/css/core/variables.css +494 -430
  136. package/styles/css/themes/light/abstraction-variables.css +304 -0
  137. package/styles/css/themes/light/index.css +1 -0
  138. package/styles/css/themes/light/utility-classes.css +2 -3
  139. package/styles/css/themes/light/variables.css +1753 -1334
  140. package/styles/scss/core/_typography.scss +16 -4
  141. package/styles/scss/core/_utilities.scss +7 -3
  142. package/styles/scss/core/_variables.scss +43 -30
  143. package/styles/scss/core/core.scss +1 -0
  144. package/tokens/src/core/alias/size.json +6 -5
  145. package/tokens/src/core/components/ActionRow.json +3 -2
  146. package/tokens/src/core/components/Alert.json +12 -10
  147. package/tokens/src/core/components/Annotation.json +9 -7
  148. package/tokens/src/core/components/Avatar.json +9 -9
  149. package/tokens/src/core/components/AvatarButton.json +4 -3
  150. package/tokens/src/core/components/Badge.json +12 -9
  151. package/tokens/src/core/components/Breadcrumb.json +7 -5
  152. package/tokens/src/core/components/Bubble.json +4 -3
  153. package/tokens/src/core/components/Button/core.json +35 -59
  154. package/tokens/src/core/components/Card.json +33 -44
  155. package/tokens/src/core/components/Carousel.json +39 -13
  156. package/tokens/src/core/components/Chip.json +13 -21
  157. package/tokens/src/core/components/ChipCarousel.json +4 -5
  158. package/tokens/src/core/components/CloseButton.json +2 -6
  159. package/tokens/src/core/components/Code.json +9 -8
  160. package/tokens/src/core/components/Collapsible.json +10 -13
  161. package/tokens/src/core/components/ColorPicker.json +3 -2
  162. package/tokens/src/core/components/Container.json +6 -5
  163. package/tokens/src/core/components/DataTable.json +17 -9
  164. package/tokens/src/core/components/Dropdown.json +24 -29
  165. package/tokens/src/core/components/Dropzone.json +5 -7
  166. package/tokens/src/core/components/Form/other.json +5 -4
  167. package/tokens/src/core/components/Form/size.json +72 -119
  168. package/tokens/src/core/components/Form/spacing.json +39 -83
  169. package/tokens/src/core/components/Form/transition.json +43 -7
  170. package/tokens/src/core/components/Form/typography.json +24 -88
  171. package/tokens/src/core/components/Icon.json +6 -5
  172. package/tokens/src/core/components/IconButton.json +4 -7
  173. package/tokens/src/core/components/Image.json +7 -6
  174. package/tokens/src/core/components/Menu.json +14 -12
  175. package/tokens/src/core/components/Modal.json +26 -21
  176. package/tokens/src/core/components/Nav.json +14 -16
  177. package/tokens/src/core/components/Navbar.json +15 -30
  178. package/tokens/src/core/components/Pagination.json +23 -24
  179. package/tokens/src/core/components/Popover.json +18 -14
  180. package/tokens/src/core/components/ProductTour.json +8 -14
  181. package/tokens/src/core/components/ProgressBar.json +29 -14
  182. package/tokens/src/core/components/SearchField.json +7 -9
  183. package/tokens/src/core/components/SelectableBox.json +4 -3
  184. package/tokens/src/core/components/Sheet.json +3 -2
  185. package/tokens/src/core/components/Spinner.json +9 -7
  186. package/tokens/src/core/components/Stack.json +2 -1
  187. package/tokens/src/core/components/Stepper.json +12 -14
  188. package/tokens/src/core/components/Sticky.json +2 -1
  189. package/tokens/src/core/components/Tab.json +8 -7
  190. package/tokens/src/core/components/Tabs.json +5 -5
  191. package/tokens/src/core/components/Toast.json +11 -8
  192. package/tokens/src/core/components/Tooltip.json +13 -11
  193. package/tokens/src/core/components/general/caret.json +5 -3
  194. package/tokens/src/core/components/general/headings.json +5 -4
  195. package/tokens/src/core/components/general/hr.json +3 -2
  196. package/tokens/src/core/components/general/input.json +19 -19
  197. package/tokens/src/core/components/general/link.json +13 -12
  198. package/tokens/src/core/components/general/list.json +9 -6
  199. package/tokens/src/core/components/general/text.json +6 -12
  200. package/tokens/src/core/global/breakpoints.json +25 -6
  201. package/tokens/src/core/global/elevation.json +55 -13
  202. package/tokens/src/core/global/other.json +5 -1
  203. package/tokens/src/core/global/spacing.json +70 -17
  204. package/tokens/src/core/global/transition.json +41 -4
  205. package/tokens/src/core/global/typography.json +248 -53
  206. package/tokens/src/core/utilities/color.json +35 -4
  207. package/tokens/src/themes/light/alias/color.json +276 -75
  208. package/tokens/src/themes/light/components/Alert.json +15 -26
  209. package/tokens/src/themes/light/components/Annotation.json +27 -13
  210. package/tokens/src/themes/light/components/Avatar.json +2 -1
  211. package/tokens/src/themes/light/components/Badge.json +57 -122
  212. package/tokens/src/themes/light/components/Breadcrumb.json +6 -5
  213. package/tokens/src/themes/light/components/Bubble.json +9 -8
  214. package/tokens/src/themes/light/components/Button/brand.json +171 -119
  215. package/tokens/src/themes/light/components/Button/core.json +8 -9
  216. package/tokens/src/themes/light/components/Button/danger.json +171 -112
  217. package/tokens/src/themes/light/components/Button/dark.json +188 -106
  218. package/tokens/src/themes/light/components/Button/info.json +186 -112
  219. package/tokens/src/themes/light/components/Button/light.json +186 -110
  220. package/tokens/src/themes/light/components/Button/primary.json +178 -116
  221. package/tokens/src/themes/light/components/Button/secondary.json +166 -132
  222. package/tokens/src/themes/light/components/Button/success.json +176 -117
  223. package/tokens/src/themes/light/components/Button/tertiary.json +34 -60
  224. package/tokens/src/themes/light/components/Button/warning.json +164 -128
  225. package/tokens/src/themes/light/components/Card.json +10 -21
  226. package/tokens/src/themes/light/components/Carousel.json +12 -11
  227. package/tokens/src/themes/light/components/Chip.json +14 -26
  228. package/tokens/src/themes/light/components/CloseButton.json +12 -2
  229. package/tokens/src/themes/light/components/Code.json +7 -9
  230. package/tokens/src/themes/light/components/DataTable.json +7 -11
  231. package/tokens/src/themes/light/components/Dropdown.json +17 -20
  232. package/tokens/src/themes/light/components/Dropzone.json +49 -11
  233. package/tokens/src/themes/light/components/Form/color.json +101 -155
  234. package/tokens/src/themes/light/components/Form/elevation.json +38 -42
  235. package/tokens/src/themes/light/components/Form/other.json +44 -41
  236. package/tokens/src/themes/light/components/IconButton.json +408 -256
  237. package/tokens/src/themes/light/components/Image.json +7 -4
  238. package/tokens/src/themes/light/components/Menu.json +12 -10
  239. package/tokens/src/themes/light/components/Modal.json +22 -12
  240. package/tokens/src/themes/light/components/Nav.json +82 -94
  241. package/tokens/src/themes/light/components/Navbar.json +32 -76
  242. package/tokens/src/themes/light/components/OverflowScroll.json +3 -1
  243. package/tokens/src/themes/light/components/PageBanner.json +11 -10
  244. package/tokens/src/themes/light/components/Pagination.json +19 -23
  245. package/tokens/src/themes/light/components/Popover.json +22 -27
  246. package/tokens/src/themes/light/components/ProductTour.json +9 -20
  247. package/tokens/src/themes/light/components/ProgressBar.json +12 -10
  248. package/tokens/src/themes/light/components/Scrollable.json +3 -3
  249. package/tokens/src/themes/light/components/SearchField.json +9 -9
  250. package/tokens/src/themes/light/components/Sheet.json +6 -7
  251. package/tokens/src/themes/light/components/Stepper.json +12 -17
  252. package/tokens/src/themes/light/components/Sticky.json +31 -6
  253. package/tokens/src/themes/light/components/Tab.json +47 -24
  254. package/tokens/src/themes/light/components/Toast.json +26 -14
  255. package/tokens/src/themes/light/components/Tooltip.json +25 -10
  256. package/tokens/src/themes/light/components/general/body.json +3 -2
  257. package/tokens/src/themes/light/components/general/headings.json +2 -1
  258. package/tokens/src/themes/light/components/general/hr.json +3 -6
  259. package/tokens/src/themes/light/components/general/input.json +11 -4
  260. package/tokens/src/themes/light/components/general/link.json +34 -43
  261. package/tokens/src/themes/light/components/general/list.json +15 -19
  262. package/tokens/src/themes/light/components/general/text.json +5 -6
  263. package/tokens/src/themes/light/global/color.json +1592 -867
  264. package/tokens/src/themes/light/global/elevation.json +481 -93
  265. package/tokens/style-dictionary.js +342 -144
  266. package/tokens/utils.js +176 -6
  267. package/src/IconButton/__snapshots__/IconButton.test.jsx.snap +0 -20
  268. package/tokens/src/core/global/display.json +0 -22
  269. /package/src/Button/{ButtonGroup.test.jsx → ButtonGroup.test.tsx} +0 -0
  270. /package/src/Button/{ButtonToolbar.test.jsx → ButtonToolbar.test.tsx} +0 -0
  271. /package/src/Button/__snapshots__/{ButtonGroup.test.jsx.snap → ButtonGroup.test.tsx.snap} +0 -0
  272. /package/src/Button/__snapshots__/{ButtonToolbar.test.jsx.snap → ButtonToolbar.test.tsx.snap} +0 -0
  273. /package/src/Chip/__snapshots__/{Chip.test.jsx.snap → Chip.test.tsx.snap} +0 -0
  274. /package/src/Tooltip/{Tooltip.test.jsx → Tooltip.test.tsx} +0 -0
@@ -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>
@@ -24,6 +24,7 @@ describe('ModalDialog', () => {
24
24
  size="md"
25
25
  variant="default"
26
26
  hasCloseButton
27
+ isOverflowVisible
27
28
  >
28
29
  <ModalDialog.Header>
29
30
  <ModalDialog.Title>The title</ModalDialog.Title>
@@ -58,6 +59,7 @@ describe('ModalDialog with Hero', () => {
58
59
  size="md"
59
60
  variant="default"
60
61
  hasCloseButton
62
+ isOverflowVisible
61
63
  >
62
64
  <ModalDialog.Hero>
63
65
  <ModalDialog.Hero.Background backgroundSrc="imageurl" />
@@ -0,0 +1,29 @@
1
+ import React from 'react';
2
+ import { fireEvent, render } from '@testing-library/react';
3
+ import userEvent from '@testing-library/user-event';
4
+ import ModalPopup from '../ModalPopup';
5
+
6
+ describe('<ModalPopup />', () => {
7
+ const mockPositionRef = React.createRef();
8
+
9
+ describe('when isOpen', () => {
10
+ const isOpen = true;
11
+ const closeFn = jest.fn();
12
+
13
+ it('calls close on click events but not touchstart events', async () => {
14
+ render(
15
+ <ModalPopup
16
+ positionRef={mockPositionRef}
17
+ isOpen={isOpen}
18
+ onClose={closeFn}
19
+ >
20
+ <div>Modal Contents</div>
21
+ </ModalPopup>,
22
+ );
23
+ await fireEvent.touchStart(document.body);
24
+ expect(closeFn).not.toHaveBeenCalled();
25
+ await userEvent.click(document.body);
26
+ expect(closeFn).toHaveBeenCalled();
27
+ });
28
+ });
29
+ });
@@ -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
@@ -1,9 +1,14 @@
1
1
  import React from 'react';
2
- import BaseOverlay from 'react-bootstrap/Overlay';
3
- import BaseOverlayTrigger from 'react-bootstrap/OverlayTrigger';
2
+ import BaseOverlay, { type OverlayProps, type Placement } from 'react-bootstrap/Overlay';
3
+ import BaseOverlayTrigger, { type OverlayTriggerProps, type OverlayTriggerType } from 'react-bootstrap/OverlayTrigger';
4
+ import Fade from 'react-bootstrap/Fade';
4
5
  import PropTypes from 'prop-types';
5
6
 
6
- const PLACEMENT_VARIANTS = [
7
+ // Note: The only thing this file adds to the base component is propTypes validation.
8
+ // As more Paragon consumers adopt TypeScript, we could consider removing almost all of this code
9
+ // and just re-export the Overlay and OverlayTrigger components from react-bootstrap unmodified.
10
+
11
+ const PLACEMENT_VARIANTS: Placement[] = [
7
12
  'auto-start',
8
13
  'auto',
9
14
  'auto-end',
@@ -21,16 +26,16 @@ const PLACEMENT_VARIANTS = [
21
26
  'left-start',
22
27
  ];
23
28
 
24
- const TRIGGER_VARIANTS = [
29
+ const TRIGGER_VARIANTS: OverlayTriggerType[] = [
25
30
  'hover',
26
31
  'click',
27
32
  'focus',
28
33
  ];
29
34
 
30
- function Overlay(props) {
35
+ function Overlay(props: OverlayProps) {
31
36
  return <BaseOverlay {...props} />;
32
37
  }
33
- function OverlayTrigger(props) {
38
+ function OverlayTrigger(props: OverlayTriggerProps) {
34
39
  return (
35
40
  <BaseOverlayTrigger {...props}>
36
41
  {props.children}
@@ -88,7 +93,7 @@ Overlay.propTypes = {
88
93
  * Animate the entering and exiting of the Overlay. `true` will use the `<Fade>` transition,
89
94
  * or a custom react-transition-group `<Transition>` component can be provided.
90
95
  */
91
- transition: PropTypes.oneOfType([PropTypes.bool, PropTypes.elementType]),
96
+ transition: PropTypes.oneOfType([PropTypes.object, PropTypes.bool]),
92
97
  };
93
98
 
94
99
  OverlayTrigger.propTypes = {
@@ -144,7 +149,7 @@ Overlay.defaultProps = {
144
149
  rootCloseEvent: undefined,
145
150
  show: false,
146
151
  target: undefined,
147
- transition: true,
152
+ transition: Fade,
148
153
  };
149
154
 
150
155
  OverlayTrigger.defaultProps = {
@@ -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;
@@ -1,9 +1,15 @@
1
1
  import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import classNames from 'classnames';
4
- import BaseTooltip from 'react-bootstrap/Tooltip';
4
+ import BaseTooltip, { type TooltipProps as BaseTooltipProps } from 'react-bootstrap/Tooltip';
5
+ import { type Placement } from 'react-bootstrap/Overlay';
6
+ import type { ComponentWithAsProp } from '../utils/types/bootstrap';
5
7
 
6
- const PLACEMENT_VARIANTS = [
8
+ interface TooltipProps extends BaseTooltipProps {
9
+ variant?: 'light';
10
+ }
11
+
12
+ const PLACEMENT_VARIANTS: Placement[] = [
7
13
  'auto-start',
8
14
  'auto',
9
15
  'auto-end',
@@ -21,7 +27,7 @@ const PLACEMENT_VARIANTS = [
21
27
  'left-start',
22
28
  ];
23
29
 
24
- const Tooltip = React.forwardRef(({
30
+ const Tooltip: ComponentWithAsProp<'div', TooltipProps> = React.forwardRef(({
25
31
  children,
26
32
  variant,
27
33
  ...props
package/src/index.d.ts CHANGED
@@ -5,9 +5,14 @@
5
5
  // Things that have types
6
6
  // // // // // // // // // // // // // // // // // // // // // // // // // // //
7
7
  export { default as Bubble } from './Bubble';
8
+ export { default as Button, ButtonGroup, ButtonToolbar } from './Button';
8
9
  export { default as Chip, CHIP_PGN_CLASS } from './Chip';
9
10
  export { default as ChipCarousel } from './ChipCarousel';
11
+ export { default as Hyperlink, HYPER_LINK_EXTERNAL_LINK_ALT_TEXT, HYPER_LINK_EXTERNAL_LINK_TITLE } from './Hyperlink';
10
12
  export { default as Icon } from './Icon';
13
+ export { default as IconButton, IconButtonWithTooltip } from './IconButton';
14
+ export { default as Overlay, OverlayTrigger } from './Overlay';
15
+ export { default as Tooltip } from './Tooltip';
11
16
 
12
17
  // // // // // // // // // // // // // // // // // // // // // // // // // // //
13
18
  // Things that don't have types
@@ -20,7 +25,6 @@ export const Avatar: any; // from './Avatar';
20
25
  export const AvatarButton: any; // from './AvatarButton';
21
26
  export const Badge: any; // from './Badge';
22
27
  export const Breadcrumb: any; // from './Breadcrumb';
23
- export const Button: any, ButtonGroup: any, ButtonToolbar: any; // from './Button';
24
28
  export const
25
29
  Card: any,
26
30
  CardColumns: any,
@@ -72,8 +76,6 @@ export const
72
76
  FormAutosuggestOption: any,
73
77
  InputGroup: any;
74
78
  // from './Form';
75
- export const Hyperlink: any, HYPER_LINK_EXTERNAL_LINK_ALT_TEXT: string, HYPER_LINK_EXTERNAL_LINK_TITLE: string; // from './Hyperlink';
76
- export const IconButton: any, IconButtonWithTooltip: any; // from './IconButton';
77
79
  export const IconButtonToggle: any; // from './IconButtonToggle';
78
80
  export const Input: any; // from './Input';
79
81
  export const InputSelect: any; // from './InputSelect';
@@ -106,7 +108,6 @@ export const
106
108
  NavLink: any;
107
109
  // from './Nav';
108
110
  export const Navbar: any, NavbarBrand: any, NAVBAR_LABEL: string; // from './Navbar';
109
- export const Overlay: any, OverlayTrigger: any; // from './Overlay';
110
111
  export const PageBanner: any, PAGE_BANNER_DISMISS_ALT_TEXT: string; // from './PageBanner';
111
112
  export const
112
113
  Pagination: any,
@@ -145,7 +146,6 @@ export const
145
146
  // from './Tabs';
146
147
  export const TextArea: any; // from './TextArea';
147
148
  export const Toast: any, TOAST_CLOSE_LABEL_TEXT: string, TOAST_DELAY: number; // from './Toast';
148
- export const Tooltip: any; // from './Tooltip';
149
149
  export const ValidationFormGroup: any; // from './ValidationFormGroup';
150
150
  export const TransitionReplace: any; // from './TransitionReplace';
151
151
  export const ValidationMessage: any; // from './ValidationMessage';
package/src/index.js CHANGED
@@ -1,13 +1,18 @@
1
- // To keep this file in sync with the .d.ts file, it's in the same order
2
- // and each line number is the same
1
+ // Keep this file in sync with the .d.ts file (manually). It's in the same order
2
+ // and each line number is the same, to make it easier.
3
3
 
4
4
  // // // // // // // // // // // // // // // // // // // // // // // // // // //
5
5
  // Things that have types
6
6
  // // // // // // // // // // // // // // // // // // // // // // // // // // //
7
7
  export { default as Bubble } from './Bubble';
8
+ export { default as Button, ButtonGroup, ButtonToolbar } from './Button';
8
9
  export { default as Chip, CHIP_PGN_CLASS } from './Chip';
9
10
  export { default as ChipCarousel } from './ChipCarousel';
11
+ export { default as Hyperlink, HYPER_LINK_EXTERNAL_LINK_ALT_TEXT, HYPER_LINK_EXTERNAL_LINK_TITLE } from './Hyperlink';
10
12
  export { default as Icon } from './Icon';
13
+ export { default as IconButton, IconButtonWithTooltip } from './IconButton';
14
+ export { default as Overlay, OverlayTrigger } from './Overlay';
15
+ export { default as Tooltip } from './Tooltip';
11
16
 
12
17
  // // // // // // // // // // // // // // // // // // // // // // // // // // //
13
18
  // Things that don't have types
@@ -20,7 +25,6 @@ export { default as Avatar } from './Avatar';
20
25
  export { default as AvatarButton } from './AvatarButton';
21
26
  export { default as Badge } from './Badge';
22
27
  export { default as Breadcrumb } from './Breadcrumb';
23
- export { default as Button, ButtonGroup, ButtonToolbar } from './Button';
24
28
  export {
25
29
  default as Card,
26
30
  CardColumns,
@@ -69,8 +73,6 @@ export {
69
73
  FormAutosuggestOption,
70
74
  InputGroup,
71
75
  } from './Form';
72
- export { default as Hyperlink, HYPER_LINK_EXTERNAL_LINK_ALT_TEXT, HYPER_LINK_EXTERNAL_LINK_TITLE } from './Hyperlink';
73
- export { default as IconButton, IconButtonWithTooltip } from './IconButton';
74
76
  export { default as IconButtonToggle } from './IconButtonToggle';
75
77
  export { default as Image, Figure } from './Image';
76
78
  export { default as MailtoLink, MAIL_TO_LINK_EXTERNAL_LINK_ALTERNATIVE_TEXT, MAIL_TO_LINK_EXTERNAL_LINK_TITLE } from './MailtoLink';
@@ -97,7 +99,6 @@ export {
97
99
  NavLink,
98
100
  } from './Nav';
99
101
  export { default as Navbar, NavbarBrand, NAVBAR_LABEL } from './Navbar';
100
- export { default as Overlay, OverlayTrigger } from './Overlay';
101
102
  export { default as PageBanner, PAGE_BANNER_DISMISS_ALT_TEXT } from './PageBanner';
102
103
  export {
103
104
  default as Pagination,
@@ -132,7 +133,6 @@ export {
132
133
  TabPane,
133
134
  } from './Tabs';
134
135
  export { default as Toast, TOAST_CLOSE_LABEL_TEXT, TOAST_DELAY } from './Toast';
135
- export { default as Tooltip } from './Tooltip';
136
136
  export { default as TransitionReplace } from './TransitionReplace';
137
137
  export { default as ValidationMessage } from './ValidationMessage';
138
138
  export { default as DataTable } from './DataTable';
@@ -1,3 +1,4 @@
1
+ /* eslint-disable import/no-extraneous-dependencies */
1
2
  import 'regenerator-runtime/runtime';
2
3
 
3
4
  import '@testing-library/jest-dom';