@iress-oss/ids-mcp-server 6.0.0-alpha.0 → 6.0.0-alpha.1-canary-20251204014525-3f0dce4

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 (108) hide show
  1. package/dist/searchHandlers.test.js +8 -2
  2. package/dist/toolHandler.test.js +9 -9
  3. package/dist/utils.test.js +6 -2
  4. package/package.json +32 -30
  5. package/generated/docs/components-alert-docs.md +0 -702
  6. package/generated/docs/components-autocomplete-docs.md +0 -1433
  7. package/generated/docs/components-autocomplete-recipes-docs.md +0 -104
  8. package/generated/docs/components-badge-docs.md +0 -531
  9. package/generated/docs/components-button-docs.md +0 -1442
  10. package/generated/docs/components-buttongroup-docs.md +0 -748
  11. package/generated/docs/components-card-docs.md +0 -944
  12. package/generated/docs/components-checkbox-docs.md +0 -694
  13. package/generated/docs/components-checkboxgroup-docs.md +0 -1087
  14. package/generated/docs/components-checkboxgroup-recipes-docs.md +0 -119
  15. package/generated/docs/components-col-docs.md +0 -881
  16. package/generated/docs/components-container-docs.md +0 -123
  17. package/generated/docs/components-divider-docs.md +0 -576
  18. package/generated/docs/components-expander-docs.md +0 -594
  19. package/generated/docs/components-field-docs.md +0 -2007
  20. package/generated/docs/components-filter-docs.md +0 -1322
  21. package/generated/docs/components-hide-docs.md +0 -702
  22. package/generated/docs/components-icon-docs.md +0 -816
  23. package/generated/docs/components-image-docs.md +0 -493
  24. package/generated/docs/components-inline-docs.md +0 -2003
  25. package/generated/docs/components-input-docs.md +0 -867
  26. package/generated/docs/components-input-recipes-docs.md +0 -140
  27. package/generated/docs/components-inputcurrency-docs.md +0 -689
  28. package/generated/docs/components-inputcurrency-recipes-docs.md +0 -115
  29. package/generated/docs/components-introduction-docs.md +0 -450
  30. package/generated/docs/components-label-docs.md +0 -562
  31. package/generated/docs/components-link-docs.md +0 -586
  32. package/generated/docs/components-menu-docs.md +0 -1146
  33. package/generated/docs/components-menu-menuitem-docs.md +0 -739
  34. package/generated/docs/components-modal-docs.md +0 -1346
  35. package/generated/docs/components-panel-docs.md +0 -600
  36. package/generated/docs/components-placeholder-docs.md +0 -446
  37. package/generated/docs/components-popover-docs.md +0 -1529
  38. package/generated/docs/components-popover-recipes-docs.md +0 -211
  39. package/generated/docs/components-progress-docs.md +0 -568
  40. package/generated/docs/components-provider-docs.md +0 -160
  41. package/generated/docs/components-radio-docs.md +0 -563
  42. package/generated/docs/components-radiogroup-docs.md +0 -1153
  43. package/generated/docs/components-readonly-docs.md +0 -535
  44. package/generated/docs/components-richselect-docs.md +0 -5836
  45. package/generated/docs/components-row-docs.md +0 -2354
  46. package/generated/docs/components-select-docs.md +0 -940
  47. package/generated/docs/components-skeleton-docs.md +0 -597
  48. package/generated/docs/components-skeleton-recipes-docs.md +0 -76
  49. package/generated/docs/components-skiplink-docs.md +0 -587
  50. package/generated/docs/components-slideout-docs.md +0 -1036
  51. package/generated/docs/components-slider-docs.md +0 -828
  52. package/generated/docs/components-spinner-docs.md +0 -450
  53. package/generated/docs/components-stack-docs.md +0 -923
  54. package/generated/docs/components-table-ag-grid-docs.md +0 -1444
  55. package/generated/docs/components-table-docs.md +0 -2327
  56. package/generated/docs/components-tabset-docs.md +0 -768
  57. package/generated/docs/components-tabset-tab-docs.md +0 -550
  58. package/generated/docs/components-tag-docs.md +0 -548
  59. package/generated/docs/components-text-docs.md +0 -585
  60. package/generated/docs/components-toaster-docs.md +0 -755
  61. package/generated/docs/components-toggle-docs.md +0 -614
  62. package/generated/docs/components-tooltip-docs.md +0 -747
  63. package/generated/docs/components-validationmessage-docs.md +0 -1161
  64. package/generated/docs/contact-us-docs.md +0 -27
  65. package/generated/docs/extensions-editor-docs.md +0 -1181
  66. package/generated/docs/extensions-editor-recipes-docs.md +0 -89
  67. package/generated/docs/foundations-accessibility-docs.md +0 -40
  68. package/generated/docs/foundations-consistency-docs.md +0 -52
  69. package/generated/docs/foundations-content-docs.md +0 -23
  70. package/generated/docs/foundations-grid-docs.md +0 -74
  71. package/generated/docs/foundations-introduction-docs.md +0 -19
  72. package/generated/docs/foundations-principles-docs.md +0 -70
  73. package/generated/docs/foundations-responsive-breakpoints-docs.md +0 -193
  74. package/generated/docs/foundations-tokens-colour-docs.md +0 -564
  75. package/generated/docs/foundations-tokens-elevation-docs.md +0 -155
  76. package/generated/docs/foundations-tokens-introduction-docs.md +0 -190
  77. package/generated/docs/foundations-tokens-radius-docs.md +0 -71
  78. package/generated/docs/foundations-tokens-spacing-docs.md +0 -89
  79. package/generated/docs/foundations-tokens-typography-docs.md +0 -322
  80. package/generated/docs/foundations-user-experience-docs.md +0 -63
  81. package/generated/docs/foundations-visual-design-docs.md +0 -46
  82. package/generated/docs/foundations-z-index-stacking-docs.md +0 -31
  83. package/generated/docs/frequently-asked-questions-docs.md +0 -53
  84. package/generated/docs/get-started-develop-docs.md +0 -209
  85. package/generated/docs/get-started-using-storybook-docs.md +0 -68
  86. package/generated/docs/guidelines.md +0 -2054
  87. package/generated/docs/introduction-docs.md +0 -87
  88. package/generated/docs/news-version-6-docs.md +0 -93
  89. package/generated/docs/patterns-form-docs.md +0 -3902
  90. package/generated/docs/patterns-form-recipes-docs.md +0 -1370
  91. package/generated/docs/patterns-introduction-docs.md +0 -24
  92. package/generated/docs/patterns-loading-docs.md +0 -4043
  93. package/generated/docs/resources-code-katas-docs.md +0 -29
  94. package/generated/docs/resources-introduction-docs.md +0 -38
  95. package/generated/docs/resources-mcp-server-docs.md +0 -27
  96. package/generated/docs/resources-migration-guides-from-v4-to-v5-docs.md +0 -437
  97. package/generated/docs/styling-props-colour-docs.md +0 -172
  98. package/generated/docs/styling-props-elevation-docs.md +0 -88
  99. package/generated/docs/styling-props-radius-docs.md +0 -86
  100. package/generated/docs/styling-props-reference-docs.md +0 -160
  101. package/generated/docs/styling-props-screen-readers-docs.md +0 -71
  102. package/generated/docs/styling-props-sizing-docs.md +0 -627
  103. package/generated/docs/styling-props-spacing-docs.md +0 -2282
  104. package/generated/docs/styling-props-typography-docs.md +0 -121
  105. package/generated/docs/themes-available-themes-docs.md +0 -66
  106. package/generated/docs/themes-introduction-docs.md +0 -121
  107. package/generated/docs/versions-docs.md +0 -17
  108. /package/{LICENSE.txt → LICENSE} +0 -0
@@ -1,1346 +0,0 @@
1
- [](#modal)Modal
2
- ===============
3
-
4
- Overview
5
- --------
6
-
7
- Modals gather information, complete a subtask, or provide additional information without losing the context of an underlying page.
8
-
9
- * * *
10
-
11
- Updated
12
-
13
- **Recently updated**
14
-
15
- This component has been recently updated with new props. The props have been marked as beta. Please tell us if there are any issues.
16
-
17
- Read more
18
-
19
- [](#use-a-modal-when)Use a modal when
20
- -------------------------------------
21
-
22
- * Providing supplemental tasks required by the underlying page
23
- * Providing non-essential information related to the underlying page
24
- * Content require full attention
25
-
26
- [](#avoid-using-a-modal-when)Avoid using a modal when
27
- -----------------------------------------------------
28
-
29
- * Conveying brief messages about background processes or status changes. Instead use IressAlert or IressToast.
30
- * The modal content can be incorporated into the page without complicating the page's intent
31
-
32
- Show modal
33
-
34
- Hide code
35
-
36
- \[data-radix-scroll-area-viewport\] { scrollbar-width: none; -ms-overflow-style: none; -webkit-overflow-scrolling: touch; } \[data-radix-scroll-area-viewport\]::-webkit-scrollbar { display: none; } :where(\[data-radix-scroll-area-viewport\]) { display: flex; flex-direction: column; align-items: stretch; } :where(\[data-radix-scroll-area-content\]) { flex-grow: 1; }
37
-
38
- const Story \= () \=> {
39
- const { showModal } \= useModal();
40
- const MODAL\_ID \= 'storybook-modal';
41
- return (
42
- <\>
43
- <IressButton onClick\={() \=> showModal(MODAL\_ID)}\>
44
- Show modal </IressButton\>
45
- <IressModal
46
- footer\="Footer slot"
47
- id\="storybook-modal"
48
- \>
49
- Modal content </IressModal\>
50
- </\>
51
- );
52
- };
53
-
54
- export const App \= () \=> (
55
- <IressModalProvider\>
56
- <Story />
57
- </IressModalProvider\>
58
- );
59
-
60
- Copy
61
-
62
- [](#props)Props
63
- ---------------
64
-
65
- | Name | Description | Default | Control |
66
- | --- | --- | --- | --- |
67
- | bg |
68
- **`bg`** sets the background color of an element using the `background-color` css property using the color tokens in the design system.
69
-
70
- We recommend using the following token values for best background contrast:
71
-
72
- * `colour.primary.fill` for primary backgrounds that need to stand out
73
- * `colour.primary.surface` for primary backgrounds that need to be less prominent
74
- * `colour.neutral.10` for the base background color, normally white in light mode or shade of grey in dark mode
75
- * `colour.neutral.20` for a slightly darker background color, used in neutral state components
76
- * `colour.system.danger.fill` for error backgrounds that need to stand out
77
- * `colour.system.danger.surface` for error backgrounds that need to be less prominent
78
- * `colour.system.success.fill` for success backgrounds that need to stand out
79
- * `colour.system.success.surface` for success backgrounds that need to be less prominent
80
- * `colour.system.warning.fill` for warning backgrounds that need to stand out
81
- * `colour.system.warning.surface` for warning backgrounds that need to be less prominent
82
- * `colour.system.info.fill` for info backgrounds that need to stand out
83
- * `colour.system.info.surface` for info backgrounds that need to be less prominent
84
-
85
- ResponsiveProp<ColorToken> | undefined
86
-
87
- | \- | Set object |
88
- | borderRadius |
89
-
90
- The **`border-radius`** CSS property rounds the corners of an element's outer border edge using the radius tokens in the design system.
91
-
92
- | Chrome | Firefox | Safari | Edge | IE |
93
- | --- | --- | --- | --- | --- |
94
- | **4** | **4** | **5** | **12** | **9** |
95
- | 1 _\-x-_ | | 3 _\-x-_ | | |
96
-
97
- ResponsiveProp<RadiusToken> | undefined
98
-
99
- | \- | Set object |
100
- | children |
101
-
102
- Text to be displayed inside the modal.
103
-
104
- ReactNode
105
-
106
-
107
-
108
- | \- |
109
-
110
- "Modal content"
111
-
112
- |
113
- | closeText |
114
-
115
- Screenreader text for close button.
116
-
117
- stringundefined
118
-
119
-
120
-
121
- |
122
-
123
- Close
124
-
125
- | Set object |
126
- | color |
127
-
128
- The **`color`** CSS property sets the foreground color value of an element's text and text decorations using the colour tokens from the design system. It also sets the `currentcolor` value. `currentcolor` may be used as an indirect value on _other_ properties and is the default for other color properties, such as `border-color`.
129
-
130
- We recommend using the following token values for best color contrast:
131
-
132
- * `colour.primary.onFill` used on top of `colour.primary.fill` for primary text that needs to stand out
133
- * `colour.primary.text` used on top of `colour.primary.surface` or `colour.neutral.10` for primary text that needs to be less prominent
134
- * `colour.neutral.70` used on top of `colour.neutral.10` or `colour.neutral.20` for muted text
135
- * `colour.neutral.80` used on top of `colour.neutral.10` or `colour.neutral.20` for standard text
136
- * `colour.system.danger.onFill` used on top of `colour.system.danger.fill` for error text that needs to stand out
137
- * `colour.system.danger.text` used on top of `colour.system.danger.surface` for error text that needs to be less prominent
138
- * `colour.system.success.onFill` used on top of `colour.system.success.fill` for success text that needs to stand out
139
- * `colour.system.success.text` used on top of `colour.system.success.surface` for success text that needs to be less prominent
140
- * `colour.system.warning.onFill` used on top of `colour.system.warning.fill` for warning text that needs to stand out
141
- * `colour.system.warning.text` used on top of `colour.system.warning.surface` for warning text that needs to be less prominent
142
- * `colour.system.info.onFill` used on top of `colour.system.info.fill` for informative text that needs to stand out
143
- * `colour.system.info.text` used on top of `colour.system.info.surface` for informative text that needs to be less prominent
144
-
145
- ResponsiveProp<ColorToken> | undefined
146
-
147
- | \- | Set object |
148
- | container |
149
-
150
- The container element to render the modal into. By default, the modal will render at the end of the document body.
151
-
152
- FloatingUIContainerundefined
153
-
154
-
155
-
156
- | \- | Set object |
157
- | defaultShow |
158
-
159
- When set to `true` the modal will be visible by default. Use for uncontrolled modals.
160
-
161
- booleanundefined
162
-
163
-
164
-
165
- |
166
-
167
- false
168
-
169
- | Set object |
170
- | disableBackdropClick |
171
-
172
- When set to `true`, users cannot exit the modal by clicking the backdrop or using the escape key.
173
-
174
- booleanundefined
175
-
176
-
177
-
178
- | \- | Set object |
179
- | fixedFooter |
180
-
181
- When set to `true` the modal's footer will always be visible and fixed to the bottom of the modal.
182
-
183
- booleanundefined
184
-
185
-
186
-
187
- | \- | Set object |
188
- | focusable |
189
-
190
- The `focusable` prop is used to apply the focus elevation when focused. It can be set to `true` to apply focus styles on focus, or `'within'` to apply focus styles when the element or any of its children are focused.
191
-
192
- "true""within"undefined
193
-
194
-
195
-
196
- | \- | Set object |
197
- | footer |
198
-
199
- Panel to place modal controls.
200
-
201
- ReactNode
202
-
203
-
204
-
205
- | \- |
206
-
207
- "Footer slot"
208
-
209
- |
210
- | heading |
211
-
212
- Sets the heading for the modal. If passed an element, it will render the element with an id, to ensure its connection to the modal.
213
-
214
- string | ReactElement<any, string | JSXElementConstructor<any>> | undefined
215
-
216
- | \- | Set object |
217
- | hide |
218
-
219
- Set **`hide`** to hide an element completely using `display: none`. It can also be set to an object of breakpoints to hide the element at specific breakpoints.
220
-
221
- Hide on all breakpoints: `hide: true` Hide on specific breakpoints: `hide: { xs: false, sm: true, md: false, lg: true, xl: false, xxl: true }`
222
-
223
- Notes:
224
-
225
- * If you need to hide an element but allow it to be visible to screen readers, use the `srOnly` prop instead.
226
- * Consider if you can conditionally render the element instead of hiding it.
227
-
228
- ResponsiveProp<boolean> | undefined
229
-
230
- | \- | Set object |
231
- | id |
232
-
233
- Unique ID for the modal. Use if you would like to open this modal from anywhere in your app using the `useModal` hook.
234
-
235
- stringundefined
236
-
237
-
238
-
239
- | \- |
240
-
241
- "storybook-modal"
242
-
243
- |
244
- | layerStyle |
245
-
246
- Elevate a layer by using a **`layerStyle`**. These are connected to the elevation tokens in the design system. They can be combined to create hierarchy and structure.
247
-
248
- * `elevation.raised`: Raised elevations sit slightly higher than other content. They are reserved for cards that can be moved, such as Jira issue cards and Trello cards. In special circumstances, they can be used for cards as a way to provide additional heirarchy or emphasis.
249
- * `elevation.floating`: Floating is the highest elevation available. It is reserved for a UI that sits over another UI, such as modals, dialogs, dropdown menus, floating toolbars, and floating single-action buttons.
250
- * `elevation.overflow`: Overflow is a shadow indicating content has scrolled outside a view. It can be used for vertical or horizontal scroll. An example of overflow shadows is the horizontal scroll in tables on a Confluence page.
251
-
252
- ResponsiveProp<"elevation.raised" | "elevation.floating" | "elevation.overflow" | "elevation.focus" | "elevation.focusCompact"> | undefined
253
-
254
- | \- | Set object |
255
- | m |
256
-
257
- The **`m`** property is short for `margin`, and sets the margin area on all four sides of an element.
258
-
259
- It uses the spacing tokens in the design system. You can also use the negative values to overlap elements or ignore padding based on the design requirements.
260
-
261
- | Chrome | Firefox | Safari | Edge | IE |
262
- | --- | --- | --- | --- | --- |
263
- | **1** | **1** | **1** | **12** | **3** |
264
-
265
- ResponsiveProp<SpacingToken | "auto"> | undefined
266
-
267
- | \- | Set object |
268
- | maxWidth |
269
-
270
- The **`max-width`** CSS property sets the maximum width of an element. It prevents the used value of the `width` property from becoming larger than the value specified by `max-width`.
271
-
272
- | Chrome | Firefox | Safari | Edge | IE |
273
- | --- | --- | --- | --- | --- |
274
- | **1** | **1** | **1** | **12** | **7** |
275
-
276
- ResponsiveProp<"auto" | SizeToken | "screen" | "1/2" | "1/3" | "2/3" | "1/4" | "2/4" | "3/4" | "1/5" | "2/5" | "3/5" | "4/5" | "1/6" | "2/6" | "3/6" | "4/6" | "5/6" | "1/12" | "2/12" | ... 8 more ... | "11/12"> | undefined
277
-
278
- | \- | Set object |
279
- | mb |
280
-
281
- The **`mb`** property is short for `margin-bottom` and sets the margin area on the bottom side of an element. A positive value places it farther from its neighbors, while a negative value places it closer.
282
-
283
- It uses the spacing tokens in the design system.
284
-
285
- | Chrome | Firefox | Safari | Edge | IE |
286
- | --- | --- | --- | --- | --- |
287
- | **1** | **1** | **1** | **12** | **3** |
288
-
289
- ResponsiveProp<SpacingToken | "auto"> | undefined
290
-
291
- | \- | Set object |
292
- | ml |
293
-
294
- The **`ml`** property is short for `margin-left` and sets the margin area on the left side of an element. A positive value places it farther from its neighbors, while a negative value places it closer.
295
-
296
- It uses the spacing tokens in the design system.
297
-
298
- | Chrome | Firefox | Safari | Edge | IE |
299
- | --- | --- | --- | --- | --- |
300
- | **1** | **1** | **1** | **12** | **3** |
301
-
302
- ResponsiveProp<SpacingToken | "auto"> | undefined
303
-
304
- | \- | Set object |
305
- | mr |
306
-
307
- The **`mr`** property is short for `margin-right` and sets the margin area on the right side of an element. A positive value places it farther from its neighbors, while a negative value places it closer.
308
-
309
- It uses the spacing tokens in the design system.
310
-
311
- | Chrome | Firefox | Safari | Edge | IE |
312
- | --- | --- | --- | --- | --- |
313
- | **1** | **1** | **1** | **12** | **3** |
314
-
315
- ResponsiveProp<SpacingToken | "auto"> | undefined
316
-
317
- | \- | Set object |
318
- | mt |
319
-
320
- The **`mt`** property is short for `margin-top` and sets the margin area on the top side of an element. A positive value places it farther from its neighbors, while a negative value places it closer.
321
-
322
- It uses the spacing tokens in the design system.
323
-
324
- | Chrome | Firefox | Safari | Edge | IE |
325
- | --- | --- | --- | --- | --- |
326
- | **1** | **1** | **1** | **12** | **3** |
327
-
328
- ResponsiveProp<SpacingToken | "auto"> | undefined
329
-
330
- | \- | Set object |
331
- | mx |
332
-
333
- The **`mx`** property is short for `margin-inline`. It is a shorthand property that defines both the logical inline start and end margins of an element, which maps to physical margins depending on the element's writing mode, directionality, and text orientation.
334
-
335
- It uses the spacing tokens in the design system. You can also use the negative values to overlap elements or ignore padding based on the design requirements.
336
-
337
- | Chrome | Firefox | Safari | Edge | IE |
338
- | --- | --- | --- | --- | --- |
339
- | **1** | **1** | **1** | **12** | **3** |
340
-
341
- ResponsiveProp<SpacingToken | "auto"> | undefined
342
-
343
- | \- | Set object |
344
- | my |
345
-
346
- The **`my`** property is short for `margin-block`. It defines the logical block start and end margins of an element, which maps to physical margins depending on the element's writing mode, directionality, and text orientation.
347
-
348
- It uses the spacing tokens in the design system. You can also use the negative values to overlap elements or ignore padding based on the design requirements.
349
-
350
- | Chrome | Firefox | Safari | Edge | IE |
351
- | --- | --- | --- | --- | --- |
352
- | **1** | **1** | **1** | **12** | **3** |
353
-
354
- ResponsiveProp<SpacingToken | "auto"> | undefined
355
-
356
- | \- | Set object |
357
- | noCloseButton |
358
-
359
- When set to `true`, no close button will be rendered. You must add your own closing mechanism to ensure accessibility.
360
-
361
- booleanundefined
362
-
363
-
364
-
365
- | \- | Set object |
366
- | noGutter |
367
-
368
- The **`noGutter`** property is used to remove the bottom margin from the last child of a component. This is useful when you want to avoid extra spacing at the end of a layout.
369
-
370
- booleanundefined
371
-
372
-
373
-
374
- | \- | Set object |
375
- | onEntered |
376
-
377
- Emitted when the modal has opened.
378
-
379
- (() => void) | undefined
380
-
381
- | \- | \- |
382
- | onExited |
383
-
384
- Emitted when the modal has closed.
385
-
386
- (() => void) | undefined
387
-
388
- | \- | \- |
389
- | onShowChange |
390
-
391
- Emitted when the modal has opened or closed internally. Use for controlled modals.
392
-
393
- ((show: boolean) => void) | undefined
394
-
395
- | \- | \- |
396
- | onStatus |
397
-
398
- Emitted when the modal has mounted, unmounted, opened or closed. Open and close occur before animation begins.
399
-
400
- ((status: "initial" | "open" | "close" | "unmounted") => void) | undefined
401
-
402
- | \- | \- |
403
- | p |
404
-
405
- The **`p`** property is short for `padding`, and sets the padding area on all four sides of an element at once.
406
-
407
- It uses the spacing tokens in the design system. Padding cannot use negative values, if you need to overlap elements or ignore padding, use the margin property instead.
408
-
409
- | Chrome | Firefox | Safari | Edge | IE |
410
- | --- | --- | --- | --- | --- |
411
- | **1** | **1** | **1** | **12** | **3** |
412
-
413
- ResponsiveProp<"xs" | "sm" | "md" | "lg" | "xl" | "none" | "spacing.000" | "spacing.050" | "spacing.100" | "spacing.150" | "spacing.200" | "spacing.250" | "spacing.300" | "spacing.350" | ... 9 more ... | "slider.tick"> | undefined
414
-
415
- | \- | Set object |
416
- | pb |
417
-
418
- The **`pb`** property is short for `padding-bottom` and sets the padding area on the bottom side of an element.
419
-
420
- It uses the spacing tokens in the design system. Padding cannot use negative values, if you need to overlap elements or ignore padding, use the margin property instead.
421
-
422
- | Chrome | Firefox | Safari | Edge | IE |
423
- | --- | --- | --- | --- | --- |
424
- | **1** | **1** | **1** | **12** | **3** |
425
-
426
- ResponsiveProp<"xs" | "sm" | "md" | "lg" | "xl" | "none" | "spacing.000" | "spacing.050" | "spacing.100" | "spacing.150" | "spacing.200" | "spacing.250" | "spacing.300" | "spacing.350" | ... 9 more ... | "slider.tick"> | undefined
427
-
428
- | \- | Set object |
429
- | pl |
430
-
431
- The **`pl`** property is short for `padding-left` and sets the padding area on the left side of an element.
432
-
433
- It uses the spacing tokens in the design system. Padding cannot use negative values, if you need to overlap elements or ignore padding, use the margin property instead.
434
-
435
- | Chrome | Firefox | Safari | Edge | IE |
436
- | --- | --- | --- | --- | --- |
437
- | **1** | **1** | **1** | **12** | **3** |
438
-
439
- ResponsiveProp<"xs" | "sm" | "md" | "lg" | "xl" | "none" | "spacing.000" | "spacing.050" | "spacing.100" | "spacing.150" | "spacing.200" | "spacing.250" | "spacing.300" | "spacing.350" | ... 9 more ... | "slider.tick"> | undefined
440
-
441
- | \- | Set object |
442
- | pr |
443
-
444
- The **`pr`** property is short for `padding-right` and sets the padding area on the right side of an element.
445
-
446
- It uses the spacing tokens in the design system. Padding cannot use negative values, if you need to overlap elements or ignore padding, use the margin property instead.
447
-
448
- | Chrome | Firefox | Safari | Edge | IE |
449
- | --- | --- | --- | --- | --- |
450
- | **1** | **1** | **1** | **12** | **3** |
451
-
452
- ResponsiveProp<"xs" | "sm" | "md" | "lg" | "xl" | "none" | "spacing.000" | "spacing.050" | "spacing.100" | "spacing.150" | "spacing.200" | "spacing.250" | "spacing.300" | "spacing.350" | ... 9 more ... | "slider.tick"> | undefined
453
-
454
- | \- | Set object |
455
- | pt |
456
-
457
- The **`pt`** property is short for `padding-top` and sets the padding area on the top side of an element.
458
-
459
- It uses the spacing tokens in the design system. Padding cannot use negative values, if you need to overlap elements or ignore padding, use the margin property instead.
460
-
461
- | Chrome | Firefox | Safari | Edge | IE |
462
- | --- | --- | --- | --- | --- |
463
- | **1** | **1** | **1** | **12** | **3** |
464
-
465
- ResponsiveProp<"xs" | "sm" | "md" | "lg" | "xl" | "none" | "spacing.000" | "spacing.050" | "spacing.100" | "spacing.150" | "spacing.200" | "spacing.250" | "spacing.300" | "spacing.350" | ... 9 more ... | "slider.tick"> | undefined
466
-
467
- | \- | Set object |
468
- | px |
469
-
470
- The **`px`** property is short for `padding-inline`. It is a shorthand property that defines both the logical inline start and end paddings of an element, which maps to physical paddings depending on the element's writing mode, directionality, and text orientation.
471
-
472
- It uses the spacing tokens in the design system. Padding cannot use negative values, if you need to overlap elements or ignore padding, use the margin property instead.
473
-
474
- | Chrome | Firefox | Safari | Edge | IE |
475
- | --- | --- | --- | --- | --- |
476
- | **1** | **1** | **1** | **12** | **3** |
477
-
478
- ResponsiveProp<"xs" | "sm" | "md" | "lg" | "xl" | "none" | "spacing.000" | "spacing.050" | "spacing.100" | "spacing.150" | "spacing.200" | "spacing.250" | "spacing.300" | "spacing.350" | ... 9 more ... | "slider.tick"> | undefined
479
-
480
- | \- | Set object |
481
- | py |
482
-
483
- The **`py`** property is short for `padding-block`. It defines the logical block start and end paddings of an element, which maps to physical paddings depending on the element's writing mode, directionality, and text orientation.
484
-
485
- It uses the spacing tokens in the design system. Padding cannot use negative values, if you need to overlap elements or ignore padding, use the margin property instead.
486
-
487
- | Chrome | Firefox | Safari | Edge | IE |
488
- | --- | --- | --- | --- | --- |
489
- | **1** | **1** | **1** | **12** | **3** |
490
-
491
- ResponsiveProp<"xs" | "sm" | "md" | "lg" | "xl" | "none" | "spacing.000" | "spacing.050" | "spacing.100" | "spacing.150" | "spacing.200" | "spacing.250" | "spacing.300" | "spacing.350" | ... 9 more ... | "slider.tick"> | undefined
492
-
493
- | \- | Set object |
494
- | rowGap |
495
-
496
- The **`row-gap`** CSS property sets the size of the gap (gutter) between an element's rows.
497
-
498
- Note: It only has an effect when used as a direct child of a layout component, such as IressRow, IressStack or IressInline.
499
-
500
- | Chrome | Firefox | Safari | Edge | IE |
501
- | --- | --- | --- | --- | --- |
502
- | **47** | **52** | **10.1** | **16** | No |
503
-
504
- ResponsiveProp<"xs" | "sm" | "md" | "lg" | "xl" | "none" | "spacing.000" | "spacing.050" | "spacing.100" | "spacing.150" | "spacing.200" | "spacing.250" | "spacing.300" | "spacing.350" | ... 9 more ... | "slider.tick"> | undefined
505
-
506
- | \- | Set object |
507
- | show |
508
-
509
- When set to `true` the modal will be visible. Use for controlled modals.
510
-
511
- booleanundefined
512
-
513
-
514
-
515
- | \- | \- |
516
- | srOnly |
517
-
518
- Set **`srOnly`** to hide an element visually but still make it accessible to screen readers. It can also be set to an object of breakpoints to hide the element at specific breakpoints.
519
-
520
- Hide on all breakpoints: `srOnly: true` Hide on specific breakpoints: `srOnly: { xs: false, sm: true, md: false, lg: true, xl: false, xxl: true }`
521
-
522
- ResponsiveProp<boolean> | undefined
523
-
524
- | \- | Set object |
525
- | static |
526
-
527
- When set to `true`, the modal will act like a static element when open. This means it will not lock scroll or focus within the modal. Note: This is used internally to display modals in Styler. It is not recommended to use this prop in your own applications.
528
-
529
- booleanundefined
530
-
531
-
532
-
533
- | \- | Set object |
534
- | stretch |
535
-
536
- The **`stretch`** property is used to stretch an element to fill the available space in its parent container. It sets the `height` property to `100%` and `alignSelf` to `stretch`, allowing the element to expand and contract based on the size of its parent.
537
-
538
- booleanundefined
539
-
540
-
541
-
542
- | \- | Set object |
543
- | textAlign |
544
-
545
- The **`text-align`** CSS property sets the horizontal alignment of the inline-level content inside a block element or table-cell box.
546
-
547
- | Chrome | Firefox | Safari | Edge | IE |
548
- | --- | --- | --- | --- | --- |
549
- | **1** | **1** | **1** | **12** | **3** |
550
-
551
- ResponsiveProp<"center" | "left" | "right" | "inherit" | "justify"> | undefined
552
-
553
- | \- | Set object |
554
- | textStyle |
555
-
556
- Select the typography to be used using the **`textStyle`** prop. These are connected to the typography tokens in the design system.'
557
-
558
- * `typography.body.sm` - Use for small components such as badges and disclaimers, as well as compact variations of tables and lists.
559
- * `typography.body.md` - The most commonly used body text size, used for most text content in the product and the default state of all components in the design system.
560
- * `typography.body.lg` - Use for tag lines, subtitles, and other large text content in the product.
561
- * `typography.heading.1` - Use for the main page title to establish a clear hierarchy. There is typically only one H1 per screen, emphasising the primary purpose or context of the page.
562
- * `typography.heading.2` - Use for primary section headings within a page to organise content and guide the user through key areas. Also suitable for large components—such as modals—where space allows and where it pairs well with body.md or body.lg.
563
- * `typography.heading.3` - Use for sub-sections under H2s to further structure content and maintain a clear visual hierarchy. Ideal for breaking down complex sections into manageable parts.
564
- * `typography.heading.4` - Use for supporting headings within content blocks or small components where space is limited—such as table headers, cards, or side panels. Provides structure without overwhelming the layout.
565
- * `typography.heading.5` - Use for minor labels or titles in compact UI elements, such as cards, sidebars, or inline labels. Best used to emphasise supplementary information without drawing too much attention. Works well with body.sm and is ideal for subtle content like fine print. Use sparingly to preserve typographic hierarchy.
566
- * `typography.code` - Used to display code snippets in the product, such as in the API documentation.
567
-
568
- ResponsiveProp<"typography.heading.1" | "typography.heading.2" | "typography.heading.3" | "typography.heading.4" | "typography.heading.5" | "typography.body.sm" | "typography.body.sm.regular" | ... 10 more ... | "typography.code"> | undefined
569
-
570
- | \- | Set object |
571
- | width |
572
-
573
- The **`width`** CSS property sets an element's width. By default, it sets the width of the content area, but if `box-sizing` is set to `border-box`, it sets the width of the border area.
574
-
575
- This prop only allows widths available throughout the component library. To use a custom width, you need to use the `style` prop, or add a custom class to the element and use CSS.
576
-
577
- | Chrome | Firefox | Safari | Edge | IE |
578
- | --- | --- | --- | --- | --- |
579
- | **1** | **1** | **1** | **12** | **4** |
580
-
581
- ResponsiveProp<"auto" | SizeToken | "screen" | "1/2" | "1/3" | "2/3" | "1/4" | "2/4" | "3/4" | "1/5" | "2/5" | "3/5" | "4/5" | "1/6" | "2/6" | "3/6" | "4/6" | "5/6" | "1/12" | "2/12" | ... 8 more ... | "11/12"> | undefined
582
-
583
- | \- | Set object |
584
-
585
- [](#controlling-the-modal)Controlling the modal
586
- -----------------------------------------------
587
-
588
- ### [](#using-the-show-property)Using the `show` property
589
-
590
- You can use state to control the modal by setting the `show` property to `true` or `false`. To sync your state with the modal, you can use the `onShowChange` prop, which is normally passed the set function from `useState`.
591
-
592
- Show modal using state
593
-
594
- Hide code
595
-
596
- \[data-radix-scroll-area-viewport\] { scrollbar-width: none; -ms-overflow-style: none; -webkit-overflow-scrolling: touch; } \[data-radix-scroll-area-viewport\]::-webkit-scrollbar { display: none; } :where(\[data-radix-scroll-area-viewport\]) { display: flex; flex-direction: column; align-items: stretch; } :where(\[data-radix-scroll-area-content\]) { flex-grow: 1; }
597
-
598
- import { IressButton, IressModal, IressModalProps } from '@iress-oss/ids-components';
599
- import { useState } from 'react';
600
- export const ModalUsingState \= () \=> {
601
- const \[show, setShow\] \= useState(false);
602
- return (
603
- <\>
604
- <IressButton onClick\={() \=> setShow(true)}\>
605
- Show modal using state </IressButton\>
606
- <IressModal
607
- {...{
608
- children: 'This modal was opened via state',
609
- }}
610
- show\={show}
611
- onShowChange\={setShow}
612
- footer\={<IressButton onClick\={() \=> setShow(false)}\>Close</IressButton\>}
613
- />
614
- </\>
615
- );
616
- };
617
-
618
- Copy
619
-
620
- ### [](#using-the-iressmodalprovider)Using the `IressModalProvider`
621
-
622
- You can use the `IressModalProvider` to open and close modals from anywhere in your application, as long as the modal has a unique `id`. In this case you would use the `useModal` hook to open and close the modal.
623
-
624
- To use, wrap your `<App/>` or the component that you want to use the `useModal` hook with `<IressModalProvider />`.
625
-
626
- Show modal using provider
627
-
628
- Hide code
629
-
630
- \[data-radix-scroll-area-viewport\] { scrollbar-width: none; -ms-overflow-style: none; -webkit-overflow-scrolling: touch; } \[data-radix-scroll-area-viewport\]::-webkit-scrollbar { display: none; } :where(\[data-radix-scroll-area-viewport\]) { display: flex; flex-direction: column; align-items: stretch; } :where(\[data-radix-scroll-area-content\]) { flex-grow: 1; }
631
-
632
- import {
633
- IressButton,
634
- IressModal,
635
- IressModalProps,
636
- IressModalProvider,
637
- useModal,
638
- } from '@iress-oss/ids-components';
639
- const MODAL\_ID \= 'storybook-modal';
640
- export const App \= (modalProps: IressModalProps) \=> (
641
- <IressModalProvider\>
642
- <ModalWithTrigger {...modalProps} />
643
- </IressModalProvider\>
644
- );
645
- const ModalWithTrigger \= ({
646
- id \= MODAL\_ID,
647
- ...modalProps
648
- }: IressModalProps) \=> {
649
- const { showModal } \= useModal();
650
- return (
651
- <\>
652
- <IressButton onClick\={() \=> showModal(id)}\>
653
- Show modal using provider </IressButton\>
654
- <IressModal
655
- {...modalProps}
656
- id\={id}
657
- footer\={
658
- <IressButton onClick\={() \=> showModal(id, false)}\>Close</IressButton\>
659
- }
660
- \>
661
- {modalProps.children ?? 'Modal content'}
662
- </IressModal\>
663
- </\>
664
- );
665
- };
666
-
667
- Copy
668
-
669
- #### [](#provider-api)Props
670
-
671
- These are some settings you can use to customise the provider, such as setting where the modals are rendered in the DOM.
672
-
673
- | Name | Description | Default | Control |
674
- | --- | --- | --- | --- |
675
- | children |
676
- \-
677
-
678
- | \- | \- |
679
- | container |
680
-
681
- The container element to render the modal into. By default, the modal will render at the end of the document body.
682
-
683
- FloatingUIContainerundefined
684
-
685
-
686
-
687
- | \- | \- |
688
- | Show Storybook only itemsStorybook only | Show Storybook only items |
689
-
690
- [](#behaviour)Behaviour
691
- -----------------------
692
-
693
- * No other interaction on the main page can be accessed while a modal is active. A backdrop covers the content beneath so that the content beneath cannot be interacted with.
694
- * Clicking on the the backdrop closes the modal and returns the focus to the triggering element.
695
- * When the modal is active the body is set to overflow: hidden to stop any scrolling of the underlying page. Scrolling should then only be possible on the modal wrapper.
696
- * By default there are 3 ways to dismiss the modal; click X in the header; press ESC on a keyboard; click anywhere on the backdrop. It is also recommended that consumers add a Cancel or Close button to the modal's footer slot if required.
697
-
698
- [](#examples)Examples
699
- ---------------------
700
-
701
- ### [](#footer-slot)Footer slot
702
-
703
- Content to appear underneath the main content. Usually used for extra controls like buttons etc.
704
-
705
- Footer slot modal
706
-
707
- Hide code
708
-
709
- \[data-radix-scroll-area-viewport\] { scrollbar-width: none; -ms-overflow-style: none; -webkit-overflow-scrolling: touch; } \[data-radix-scroll-area-viewport\]::-webkit-scrollbar { display: none; } :where(\[data-radix-scroll-area-viewport\]) { display: flex; flex-direction: column; align-items: stretch; } :where(\[data-radix-scroll-area-content\]) { flex-grow: 1; }
710
-
711
- const Story \= () \=> {
712
- const { showModal } \= useModal();
713
- const MODAL\_ID \= 'storybook-modal';
714
- return (
715
- <\>
716
- <IressButton onClick\={() \=> showModal(MODAL\_ID)}\>
717
- Footer slot modal </IressButton\>
718
- <IressModal
719
- footer\={<IressButton\>Button in footer</IressButton\>}
720
- id\="storybook-modal"
721
- \>
722
- Normal modal content </IressModal\>
723
- </\>
724
- );
725
- };
726
-
727
- export const App \= () \=> (
728
- <IressModalProvider\>
729
- <Story />
730
- </IressModalProvider\>
731
- );
732
-
733
- Copy
734
-
735
- ### [](#fixed-footer)Fixed footer
736
-
737
- The `fixedFooter` prop can be used to set the footer to be fixed to the bottom of the modal. This is often useful when there is a lot of content in the main area that you would like to scroll underneath the footer content.
738
-
739
- **Note:** Also works without footer content.
740
-
741
- Using with popovers and tooltips
742
- --------------------------------
743
-
744
- The fixed footer variant of IressModal prevents content from overflowing the modal. This can cause layout issues when using with components that use popovers (for example IressCombobox), especially when these components sit at the end of the modal's content. If you encounter these issues, try using a modal without a fixed footer. Normal modals allow content to overflow, which should fix the issue.
745
-
746
- Fixed footer modal
747
-
748
- Hide code
749
-
750
- \[data-radix-scroll-area-viewport\] { scrollbar-width: none; -ms-overflow-style: none; -webkit-overflow-scrolling: touch; } \[data-radix-scroll-area-viewport\]::-webkit-scrollbar { display: none; } :where(\[data-radix-scroll-area-viewport\]) { display: flex; flex-direction: column; align-items: stretch; } :where(\[data-radix-scroll-area-content\]) { flex-grow: 1; }
751
-
752
- const Story \= () \=> {
753
- const { showModal } \= useModal();
754
- const MODAL\_ID \= 'storybook-modal';
755
- return (
756
- <\>
757
- <IressButton onClick\={() \=> showModal(MODAL\_ID)}\>
758
- Fixed footer modal </IressButton\>
759
- <IressModal
760
- fixedFooter
761
- footer\={<IressButton\>Button in footer</IressButton\>}
762
- id\="storybook-modal"
763
- \>
764
- <React.Fragment key\=".0"\>
765
- <IressText element\="h2"\>
766
- Next Saturday night, we're sending you back to the future </IressText\>
767
- <IressText\>
768
- <p\>
769
- I still don't understand, how am I supposed to go to the dance with her, if she's already going to the dance with you. Alright, okay Jennifer. What if I send in the tape and they don't like it. I mean, what if they say I'm no good. What if they say, 'Get out of here, kid, you got no future.' I mean, I just don't think I can take that kind of rejection. Jesus, I'm beginning to sound like my old man. Ahh. Alright, take it up, go. Doc. This is it. This is the answer. It says here that a bolt of lightning is gonna strike the clock tower precisely at 10:04 p.m. next Saturday night. If we could somehow harness this bolt of lightning, channel it into the flux capacitor, it just might work. Next Saturday night, we're sending you back to the future. </p\>
770
- <p\>
771
- Go. Yeah, it's in the back. The future, it's where you're going? Mother, with Marty's parents out of town, don't you think he oughta spend the night, after all, Dad almost killed him with the car. What's going on? Where have you been all week? </p\>
772
- <p\>
773
- But I can't go to the dance, I'll miss my favorite television program, Science Fiction Theater. Well uh, good, fine. Ahh. Ahh. Right, okay, so right around 9:00 she's gonna get very angry with me. That's right. </p\>
774
- <h3\>
775
- I just don't think I can take that kind of rejection </h3\>
776
- <p\>
777
- I still don't understand, how am I supposed to go to the dance with her, if she's already going to the dance with you. Alright, okay Jennifer. What if I send in the tape and they don't like it. I mean, what if they say I'm no good. What if they say, 'Get out of here, kid, you got no future.' I mean, I just don't think I can take that kind of rejection. Jesus, I'm beginning to sound like my old man. Ahh. Alright, take it up, go. Doc. This is it. This is the answer. It says here that a bolt of lightning is gonna strike the clock tower precisely at 10:04 p.m. next Saturday night. If we could somehow harness this bolt of lightning, channel it into the flux capacitor, it just might work. Next Saturday night, we're sending you back to the future. </p\>
778
- <p\>
779
- Go. Yeah, it's in the back. The future, it's where you're going? Mother, with Marty's parents out of town, don't you think he oughta spend the night, after all, Dad almost killed him with the car. What's going on? Where have you been all week? </p\>
780
- <p\>
781
- But I can't go to the dance, I'll miss my favorite television program, Science Fiction Theater. Well uh, good, fine. Ahh. Ahh. Right, okay, so right around 9:00 she's gonna get very angry with me. That's right. </p\>
782
- <p\>
783
- I still don't understand, how am I supposed to go to the dance with her, if she's already going to the dance with you. Alright, okay Jennifer. What if I send in the tape and they don't like it. I mean, what if they say I'm no good. What if they say, 'Get out of here, kid, you got no future.' I mean, I just don't think I can take that kind of rejection. Jesus, I'm beginning to sound like my old man. Ahh. Alright, take it up, go. Doc. This is it. This is the answer. It says here that a bolt of lightning is gonna strike the clock tower precisely at 10:04 p.m. next Saturday night. If we could somehow harness this bolt of lightning, channel it into the flux capacitor, it just might work. Next Saturday night, we're sending you back to the future. </p\>
784
- <p\>
785
- Go. Yeah, it's in the back. The future, it's where you're going? Mother, with Marty's parents out of town, don't you think he oughta spend the night, after all, Dad almost killed him with the car. What's going on? Where have you been all week? </p\>
786
- <p\>
787
- But I can't go to the dance, I'll miss my favorite television program, Science Fiction Theater. Well uh, good, fine. Ahh. Ahh. Right, okay, so right around 9:00 she's gonna get very angry with me. That's right. </p\>
788
- <p\>
789
- I still don't understand, how am I supposed to go to the dance with her, if she's already going to the dance with you. Alright, okay Jennifer. What if I send in the tape and they don't like it. I mean, what if they say I'm no good. What if they say, 'Get out of here, kid, you got no future.' I mean, I just don't think I can take that kind of rejection. Jesus, I'm beginning to sound like my old man. Ahh. Alright, take it up, go. Doc. This is it. This is the answer. It says here that a bolt of lightning is gonna strike the clock tower precisely at 10:04 p.m. next Saturday night. If we could somehow harness this bolt of lightning, channel it into the flux capacitor, it just might work. Next Saturday night, we're sending you back to the future. </p\>
790
- </IressText\>
791
- </React.Fragment\>
792
- </IressModal\>
793
- </\>
794
- );
795
- };
796
-
797
- export const App \= () \=> (
798
- <IressModalProvider\>
799
- <Story />
800
- </IressModalProvider\>
801
- );
802
-
803
- Copy
804
-
805
- ### [](#size)Size
806
-
807
- The `size` prop can be set to `sm`, `md` or `lg`. It defaults to `md`.
808
-
809
- Below is a guide on when to use which size.
810
-
811
- Small modal
812
- -----------
813
-
814
- Small modals communicate the outcome of an irreversible action. They should be concise and straightforward, containing a single action and, in some cases, a single input field.
815
-
816
- View small modal example
817
-
818
- Medium modal
819
- ------------
820
-
821
- Medium modals provide optional supporting information to help users understand the context of a word or screen. They may contain a single action and, in some cases, a larger input such as a textarea.
822
-
823
- View medium modal example
824
-
825
- Large modal
826
- -----------
827
-
828
- Large modals facilitate sub-flows within a primary flow, allowing users to focus on tasks that will impact the underlying screen once the modal is closed (e.g., adding an item to a table or bulk uploading items). They should be used sparingly and only when there is a direct relationship to the underlying screen, where the action wouldn't warrant a separate dedicated screen.
829
-
830
- View large modal example
831
-
832
- Hide code
833
-
834
- \[data-radix-scroll-area-viewport\] { scrollbar-width: none; -ms-overflow-style: none; -webkit-overflow-scrolling: touch; } \[data-radix-scroll-area-viewport\]::-webkit-scrollbar { display: none; } :where(\[data-radix-scroll-area-viewport\]) { display: flex; flex-direction: column; align-items: stretch; } :where(\[data-radix-scroll-area-content\]) { flex-grow: 1; }
835
-
836
- const SmallModal \= () \=> {
837
- const \[show, setShow\] \= useState(false);
838
- return (
839
- <\>
840
- <IressCard
841
- heading\="Small modal"
842
- stretch
843
- footer\={
844
- <IressButton onClick\={() \=> setShow(true)}\>
845
- View small modal example </IressButton\>
846
- }
847
- \>
848
- <p\>
849
- Small modals communicate the outcome of an irreversible action. They should be concise and straightforward, containing a single action and, in some cases, a single input field. </p\>
850
- </IressCard\>
851
- <IressModal
852
- width\="overlay.sm"
853
- heading\="Terms of service update"
854
- footer\={
855
- <IressButton mode\="primary" onClick\={() \=> setShow(false)}\>
856
- Accept </IressButton\>
857
- }
858
- disableBackdropClick
859
- show\={show}
860
- onShowChange\={setShow}
861
- \>
862
- <p\>
863
- A change in our <a href\="#"\>terms of service</a\> takes effect on July 1st, 2024. Please read and accept the terms. </p\>
864
- <IressCheckbox\>I accept the terms of service</IressCheckbox\>
865
- </IressModal\>
866
- </\>
867
- );
868
- };
869
- const MediumModal \= () \=> {
870
- const \[show, setShow\] \= useState(false);
871
- return (
872
- <\>
873
- <IressCard
874
- stretch
875
- heading\="Medium modal"
876
- footer\={
877
- <IressButton onClick\={() \=> setShow(true)}\>
878
- View medium modal example </IressButton\>
879
- }
880
- \>
881
- <p\>
882
- Medium modals provide optional supporting information to help users understand the context of a word or screen. They may contain a single action and, in some cases, a larger input such as a textarea. </p\>
883
- </IressCard\>
884
- <IressModal
885
- width\="overlay.md"
886
- heading\="History of Iress"
887
- footer\={<IressButton onClick\={() \=> setShow(false)}\>Close</IressButton\>}
888
- fixedFooter
889
- show\={show}
890
- onShowChange\={setShow}
891
- \>
892
- <h3\>Founding and Early Years (1993 - 2000)</h3\>
893
- <p\>
894
- Iress Limited (ASX: IRE) was founded in 1993 in Melbourne, Australia, as a provider of financial market data and trading software. Initially, the company focused on delivering technology solutions for stockbrokers and traders, providing real-time market data, order management, and trading execution tools. </p\>
895
- <h3\>Expansion and IPO (2001 - 2010)</h3\>
896
- <p\>
897
- In 2001, Iress went public, listing on the Australian Securities Exchange (ASX). This move provided the company with capital to expand its operations and invest in new technologies. During this period, Iress expanded its services beyond trading platforms to include financial planning software, portfolio management, and wealth management solutions. The company also started expanding internationally, entering markets such as the UK, Canada, New Zealand, and South Africa, through organic growth and acquisitions. </p\>
898
- <h3\>Global Growth and Acquisitions (2011 - 2020)</h3\>
899
- <p\>
900
- Between 2011 and 2020, Iress continued its global expansion through acquisitions and product diversification. Key acquisitions included: </p\>
901
- <ul\>
902
- <li\>
903
- Avelo (2013): Strengthened its presence in the UK financial services market. </li\>
904
- <li\>
905
- Pulse Software (2014): Added financial advice solutions to its portfolio. </li\>
906
- <li\>
907
- INET BFA (2016): Expanded its reach into South Africa’s financial market. </li\>
908
- <li\>
909
- OneVue (2020): Enhanced its superannuation and investment administration capabilities. </li\>
910
- </ul\>
911
- <p\>
912
- During this period, Iress also expanded into mortgage lending technology and digital financial services, adapting to the increasing demand for automation and efficiency in financial markets. </p\>
913
- <h3\>Recent Developments (2021 - Present)</h3\>
914
- <p\>
915
- In 2021, Iress announced a strategic review of its business, focusing on streamlining operations and improving profitability. The company also experienced leadership changes, including new CEO appointments to drive digital transformation.{' '}
916
- </p\>
917
- <p\>
918
- Iress has continued to innovate with cloud-based solutions, artificial intelligence (AI), and data analytics, catering to financial institutions, brokers, and wealth management firms globally. </p\>
919
- <IressExpander activator\="Was this helpful?"\>
920
- <IressStack gap\="sm"\>
921
- <IressInput rows\={2} placeholder\="Enter your feedback" />
922
- <IressButton\>Provide feedback</IressButton\>
923
- </IressStack\>
924
- </IressExpander\>
925
- </IressModal\>
926
- </\>
927
- );
928
- };
929
- interface LargeModalActionsProps {
930
- isStart: boolean;
931
- isFinal: boolean;
932
- onBack: () \=> void;
933
- onNext: () \=> void;
934
- onCancel: () \=> void;
935
- onFinish: () \=> void;
936
- }
937
- const LargeModalActions \= ({
938
- isStart,
939
- isFinal,
940
- onBack,
941
- onNext,
942
- onCancel,
943
- onFinish,
944
- }: LargeModalActionsProps) \=> (
945
- <IressInline gap\="sm" horizontalAlign\={isFinal ? 'center' : 'left'}\>
946
- {isFinal && (
947
- <IressButton mode\="primary" onClick\={onFinish}\>
948
- Finish </IressButton\>
949
- )}
950
- {!isFinal && (
951
- <IressButton mode\="primary" onClick\={onNext}\>
952
- Next </IressButton\>
953
- )}
954
- {!isStart && !isFinal && (
955
- <IressButton onClick\={onBack}\>Previous</IressButton\>
956
- )}
957
- {!isFinal && (
958
- <IressInline ml\="auto"\>
959
- <IressButton onClick\={onCancel} mode\="tertiary"\>
960
- Cancel </IressButton\>
961
- </IressInline\>
962
- )}
963
- </IressInline\>
964
- );
965
- const LargeModal \= () \=> {
966
- const \[show, setShow\] \= useState(false);
967
- const \[step, setStep\] \= useState(0);
968
- return (
969
- <\>
970
- <IressCard
971
- heading\="Large modal"
972
- stretch
973
- footer\={
974
- <IressButton onClick\={() \=> setShow(true)}\>
975
- View large modal example </IressButton\>
976
- }
977
- \>
978
- <p\>
979
- Large modals facilitate sub-flows within a primary flow, allowing users to focus on tasks that will impact the underlying screen once the modal is closed (e.g., adding an item to a table or bulk uploading items). They should be used sparingly and only when there is a direct relationship to the underlying screen, where the action wouldn't warrant a separate dedicated screen. </p\>
980
- </IressCard\>
981
- <IressModal
982
- width\="overlay.lg"
983
- heading\="Upload from CSV"
984
- footer\={
985
- <LargeModalActions
986
- isStart\={step \=== 0}
987
- isFinal\={step \=== 2}
988
- onBack\={() \=> setStep(step \- 1)}
989
- onNext\={() \=> setStep(step + 1)}
990
- onFinish\={() \=> setShow(false)}
991
- onCancel\={() \=> setShow(false)}
992
- />
993
- }
994
- disableBackdropClick
995
- show\={show}
996
- onShowChange\={setShow}
997
- fixedFooter
998
- \>
999
- <IressStack gap\="lg" mb\="md"\>
1000
- <IressProgress max\={3} value\={step + 1} />
1001
- {step \=== 0 && (
1002
- <IressStack gap\="md"\>
1003
- <IressField label\="Select a file to upload"\>
1004
- <IressInput type\="file" accept\=".csv" />
1005
- </IressField\>
1006
- <IressDivider />
1007
- <IressField label\="Type of data"\>
1008
- <IressRichSelect
1009
- options\={\[
1010
- { label: 'Clients' },
1011
- { label: 'Products' },
1012
- { label: 'Transactions' },
1013
- \]}
1014
- />
1015
- </IressField\>
1016
- <IressCheckbox\>Overwrite existing data</IressCheckbox\>
1017
- </IressStack\>
1018
- )}
1019
- {step \=== 1 && (
1020
- <IressTable
1021
- caption\="Preview of data to be uploaded"
1022
- columns\={\[
1023
- { key: 'import', label: 'Upload', width: '1%' },
1024
- { key: 'name', label: 'Name' },
1025
- { key: 'email', label: 'Email' },
1026
- \]}
1027
- rows\={\[
1028
- {
1029
- import: <IressCheckbox defaultChecked />,
1030
- name: 'Luke Skywalker',
1031
- email: 'luke.skywalker@iress.com',
1032
- },
1033
- {
1034
- import: <IressCheckbox defaultChecked />,
1035
- name: 'Leia Skywalker',
1036
- email: 'leia.skywalker@iress.com',
1037
- },
1038
- {
1039
- import: <IressCheckbox defaultChecked />,
1040
- name: 'Han Solo',
1041
- email: 'han.solo@iress.com',
1042
- },
1043
- \]}
1044
- />
1045
- )}
1046
- {step \=== 2 && (
1047
- <IressStack gap\="md" horizontalAlign\="center"\>
1048
- <img
1049
- src\={modalIsDone}
1050
- alt\=""
1051
- style\={{ maxWidth: '200px', height: 'auto' }}
1052
- />
1053
- <h3\>3 items have been uploaded</h3\>
1054
- <IressCheckbox\>Send a copy to yourself</IressCheckbox\>
1055
- </IressStack\>
1056
- )}
1057
- </IressStack\>
1058
- </IressModal\>
1059
- </\>
1060
- );
1061
- };
1062
- export const ModalSizes \= () \=> (
1063
- <IressRow gutter\="spacing.700" verticalAlign\="stretch"\>
1064
- <IressCol\>
1065
- <SmallModal />
1066
- </IressCol\>
1067
- <IressCol\>
1068
- <MediumModal />
1069
- </IressCol\>
1070
- <IressCol\>
1071
- <LargeModal />
1072
- </IressCol\>
1073
- </IressRow\>
1074
- );
1075
-
1076
- Copy
1077
-
1078
- ### [](#responsive-size)Responsive size
1079
-
1080
- The `size` prop can take an object that takes five key/value pairs that correlate with the IDS breakpoints.
1081
-
1082
- If you set a responsive `size`, the modal becomes full width on screens smaller than the value you specified. For example, if you want to create a large modal on medium screens and above:
1083
-
1084
- \[data-radix-scroll-area-viewport\] {
1085
- scrollbar-width: none;
1086
- -ms-overflow-style: none;
1087
- -webkit-overflow-scrolling: touch;
1088
- }
1089
- \[data-radix-scroll-area-viewport\]::-webkit-scrollbar {
1090
- display: none;
1091
- }
1092
- :where(\[data-radix-scroll-area-viewport\]) {
1093
- display: flex;
1094
- flex-direction: column;
1095
- align-items: stretch;
1096
- }
1097
- :where(\[data-radix-scroll-area-content\]) {
1098
- flex-grow: 1;
1099
- }
1100
-
1101
- <IressModal size\={{ md: IressModal.Size.Lg }}\>
1102
-
1103
- Copy
1104
-
1105
- The modal will be full width on extra-small and small screens, and large width on medium, large and extra-large screens. This is the same as setting:
1106
-
1107
- \[data-radix-scroll-area-viewport\] {
1108
- scrollbar-width: none;
1109
- -ms-overflow-style: none;
1110
- -webkit-overflow-scrolling: touch;
1111
- }
1112
- \[data-radix-scroll-area-viewport\]::-webkit-scrollbar {
1113
- display: none;
1114
- }
1115
- :where(\[data-radix-scroll-area-viewport\]) {
1116
- display: flex;
1117
- flex-direction: column;
1118
- align-items: stretch;
1119
- }
1120
- :where(\[data-radix-scroll-area-content\]) {
1121
- flex-grow: 1;
1122
- }
1123
-
1124
- <IressModal size\={{ xs: IressModal.Size.Fullpage, md: IressModal.Size.Lg }}\>
1125
-
1126
- Copy
1127
-
1128
- You can override this behaviour by specifying a value for `xs` in your size object:
1129
-
1130
- \[data-radix-scroll-area-viewport\] {
1131
- scrollbar-width: none;
1132
- -ms-overflow-style: none;
1133
- -webkit-overflow-scrolling: touch;
1134
- }
1135
- \[data-radix-scroll-area-viewport\]::-webkit-scrollbar {
1136
- display: none;
1137
- }
1138
- :where(\[data-radix-scroll-area-viewport\]) {
1139
- display: flex;
1140
- flex-direction: column;
1141
- align-items: stretch;
1142
- }
1143
- :where(\[data-radix-scroll-area-content\]) {
1144
- flex-grow: 1;
1145
- }
1146
-
1147
- <IressModal size\={{ xs: IressModal.Size.Sm, md: IressModal.Size.Lg }}\>
1148
-
1149
- Copy
1150
-
1151
- Responsive modal
1152
-
1153
- Hide code
1154
-
1155
- \[data-radix-scroll-area-viewport\] { scrollbar-width: none; -ms-overflow-style: none; -webkit-overflow-scrolling: touch; } \[data-radix-scroll-area-viewport\]::-webkit-scrollbar { display: none; } :where(\[data-radix-scroll-area-viewport\]) { display: flex; flex-direction: column; align-items: stretch; } :where(\[data-radix-scroll-area-content\]) { flex-grow: 1; }
1156
-
1157
- const Story \= () \=> {
1158
- const { showModal } \= useModal();
1159
- const MODAL\_ID \= 'storybook-modal';
1160
- return (
1161
- <\>
1162
- <IressButton onClick\={() \=> showModal(MODAL\_ID)}\>
1163
- Responsive modal </IressButton\>
1164
- <IressModal
1165
- footer\=""
1166
- id\="storybook-modal"
1167
- width\={{
1168
- md: 'overlay.md',
1169
- xs: 'overlay.sm',
1170
- xxl: 'overlay.lg'
1171
- }}
1172
- \>
1173
- <CurrentBreakpoint />
1174
- </IressModal\>
1175
- </\>
1176
- );
1177
- };
1178
-
1179
- export const App \= () \=> (
1180
- <IressModalProvider\>
1181
- <Story />
1182
- </IressModalProvider\>
1183
- );
1184
-
1185
- Copy
1186
-
1187
- ### [](#disable-closing)Disable closing
1188
-
1189
- For instances where you require the user's full attention and you want to ensure they continue the current task before closing the modal, you can disable the backdrop and escape key using `disableBackdropClick` and/or hide the close button using `noCloseButton`.
1190
-
1191
- **Note:** As these options remove the default handling of the closing the modal, please ensure you provide a clear way for the user to close the modal.
1192
-
1193
- Disable backdrop clickNo close button (please provide one, if you decide to hide the close button)Both (If you hide the close button, ensure you provide another way to close the modal)
1194
-
1195
- Hide code
1196
-
1197
- \[data-radix-scroll-area-viewport\] { scrollbar-width: none; -ms-overflow-style: none; -webkit-overflow-scrolling: touch; } \[data-radix-scroll-area-viewport\]::-webkit-scrollbar { display: none; } :where(\[data-radix-scroll-area-viewport\]) { display: flex; flex-direction: column; align-items: stretch; } :where(\[data-radix-scroll-area-content\]) { flex-grow: 1; }
1198
-
1199
- const Story \= () \=> {
1200
- const { showModal } \= useModal();
1201
- const MODAL\_ID \= 'storybook-modal';
1202
- return (
1203
- <IressStack gap\="md"\>
1204
- <IressButton
1205
- fluid
1206
- onClick\={() \=> showModal("disable-backdrop-click")}
1207
- \>
1208
- Disable backdrop click </IressButton\>
1209
- <IressModal
1210
- disableBackdropClick
1211
- footer\="Footer slot"
1212
- id\="disable-backdrop-click"
1213
- \>
1214
- Modal content </IressModal\>
1215
- <IressButton
1216
- fluid
1217
- onClick\={() \=> showModal("no-close-button")}
1218
- \>
1219
- No close button (please provide one, if you decide to hide the close button) </IressButton\>
1220
- <IressModal
1221
- footer\={<IressButton onClick\={() \=> showModal("no-close-button", false)}\>Close</IressButton\>}
1222
- id\="no-close-button"
1223
- noCloseButton
1224
- \>
1225
- Modal content </IressModal\>
1226
- <IressButton
1227
- fluid
1228
- onClick\={() \=> showModal("both")}
1229
- \>
1230
- Both (If you hide the close button, ensure you provide another way to close the modal) </IressButton\>
1231
- <IressModal
1232
- disableBackdropClick
1233
- footer\={<IressButton onClick\={() \=> showModal("both", false)}\>Close</IressButton\>}
1234
- id\="both"
1235
- noCloseButton
1236
- \>
1237
- Modal content </IressModal\>
1238
- </IressStack\>
1239
- );
1240
- };
1241
-
1242
- export const App \= () \=> (
1243
- <IressModalProvider\>
1244
- <Story />
1245
- </IressModalProvider\>
1246
- );
1247
-
1248
- Copy
1249
-
1250
- [](#migrating-to-version-5)Migrating to version 5
1251
- -------------------------------------------------
1252
-
1253
- ### [](#adding-the-provider)Adding the provider
1254
-
1255
- For your components to work as previously, you will need to set up the `IressModalProvider` at the root of your application. This will allow you to use the `useModal` hook to open and close modals from anywhere in your application using the ID of the modal.
1256
-
1257
- \[data-radix-scroll-area-viewport\] {
1258
- scrollbar-width: none;
1259
- -ms-overflow-style: none;
1260
- -webkit-overflow-scrolling: touch;
1261
- }
1262
- \[data-radix-scroll-area-viewport\]::-webkit-scrollbar {
1263
- display: none;
1264
- }
1265
- :where(\[data-radix-scroll-area-viewport\]) {
1266
- display: flex;
1267
- flex-direction: column;
1268
- align-items: stretch;
1269
- }
1270
- :where(\[data-radix-scroll-area-content\]) {
1271
- flex-grow: 1;
1272
- }
1273
-
1274
- const App \= () \=> <IressModalProvider\>Rest of app here</IressModalProvider\>;
1275
-
1276
- Copy
1277
-
1278
- ### [](#testing)Testing
1279
-
1280
- In version 5, modals are rendered conditionally, meaning they will not be available in the DOM until they are shown. This means that you will need to update your tests to account for this, as you cannot interact with its contents until it is shown, unlike in version 4.
1281
-
1282
- See below for an example in version 4 and version 5.
1283
-
1284
- Mode
1285
-
1286
- DiffOldNew
1287
-
1288
- <table class="css-1n5o7vh-diff-container"><tbody><tr class="css-1n7ec1i-line"><td class="css-17vezug-marker css-rq9a2a-diff-removed"><pre>-</pre></td><td class="css-vl0irh-content css-rq9a2a-diff-removed"><pre class="css-o1u8iu-content-text">import { render, waitFor, screen } from '@testing-library/react';</pre></td></tr><tr class="css-1n7ec1i-line"><td class="css-17vezug-marker css-cnnxkz-diff-added"><pre>+</pre></td><td class="css-vl0irh-content css-cnnxkz-diff-added"><pre class="css-o1u8iu-content-text">import { render, screen, waitForElementToBeRemoved } from '@testing-library/react';</pre></td></tr><tr class="css-1n7ec1i-line"><td class="css-17vezug-marker css-rq9a2a-diff-removed"><pre>-</pre></td><td class="css-vl0irh-content css-rq9a2a-diff-removed"><pre class="css-o1u8iu-content-text">import { idsFireEvent, componentLoad } from '@iress/ids-react-test-utils';</pre></td></tr><tr class="css-1n7ec1i-line"><td class="css-17vezug-marker css-cnnxkz-diff-added"><pre>+</pre></td><td class="css-vl0irh-content css-cnnxkz-diff-added"><pre class="css-o1u8iu-content-text">import { userEvent } from '@testing-library/user-event';</pre></td></tr><tr class="css-1n7ec1i-line"><td class="css-17vezug-marker css-rq9a2a-diff-removed"><pre>-</pre></td><td class="css-vl0irh-content css-rq9a2a-diff-removed"><pre class="css-o1u8iu-content-text"> </pre></td></tr><tr class="css-1n7ec1i-line"><td class="css-17vezug-marker"><pre></pre></td><td class="css-vl0irh-content"><pre class="css-o1u8iu-content-text">test('opening and closing a modal', async () =&gt; {</pre></td></tr><tr class="css-1n7ec1i-line"><td class="css-17vezug-marker css-rq9a2a-diff-removed"><pre>-</pre></td><td class="css-vl0irh-content css-rq9a2a-diff-removed"><pre class="css-o1u8iu-content-text"> await componentLoad([</pre></td></tr><tr class="css-1n7ec1i-line"><td class="css-17vezug-marker css-cnnxkz-diff-added"><pre>+</pre></td><td class="css-vl0irh-content css-cnnxkz-diff-added"><pre class="css-o1u8iu-content-text"> const trigger = screen.getByRole('button', { name: /open modal/i });</pre></td></tr><tr class="css-1n7ec1i-line"><td class="css-17vezug-marker css-rq9a2a-diff-removed"><pre>-</pre></td><td class="css-vl0irh-content css-rq9a2a-diff-removed"><pre class="css-o1u8iu-content-text"> 'modal-trigger',</pre></td></tr><tr class="css-1n7ec1i-line"><td class="css-17vezug-marker css-rq9a2a-diff-removed"><pre>-</pre></td><td class="css-vl0irh-content css-rq9a2a-diff-removed"><pre class="css-o1u8iu-content-text"> 'modal',</pre></td></tr><tr class="css-1n7ec1i-line"><td class="css-17vezug-marker css-cnnxkz-diff-added"><pre>+</pre></td><td class="css-vl0irh-content css-cnnxkz-diff-added"><pre class="css-o1u8iu-content-text"> // activate modal</pre></td></tr><tr class="css-1n7ec1i-line"><td class="css-17vezug-marker css-rq9a2a-diff-removed"><pre>-</pre></td><td class="css-vl0irh-content css-rq9a2a-diff-removed"><pre class="css-o1u8iu-content-text"> ]);</pre></td></tr><tr class="css-1n7ec1i-line"><td class="css-17vezug-marker css-cnnxkz-diff-added"><pre>+</pre></td><td class="css-vl0irh-content css-cnnxkz-diff-added"><pre class="css-o1u8iu-content-text"> await userEvent.click(trigger);</pre></td></tr><tr class="css-1n7ec1i-line"><td class="css-17vezug-marker css-cnnxkz-diff-added"><pre>+</pre></td><td class="css-vl0irh-content css-cnnxkz-diff-added"><pre class="css-o1u8iu-content-text"> const modal = await screen.findByRole('dialog');</pre></td></tr><tr class="css-1n7ec1i-line"><td class="css-17vezug-marker css-rq9a2a-diff-removed"><pre>-</pre></td><td class="css-vl0irh-content css-rq9a2a-diff-removed"><pre class="css-o1u8iu-content-text"> const trigger = screen.getByTestId('modal-trigger');</pre></td></tr><tr class="css-1n7ec1i-line"><td class="css-17vezug-marker css-rq9a2a-diff-removed"><pre>-</pre></td><td class="css-vl0irh-content css-rq9a2a-diff-removed"><pre class="css-o1u8iu-content-text"> const modal = screen.getByTestId('modal');</pre></td></tr><tr class="css-1n7ec1i-line"><td class="css-17vezug-marker css-cnnxkz-diff-added"><pre>+</pre></td><td class="css-vl0irh-content css-cnnxkz-diff-added"><pre class="css-o1u8iu-content-text"> // In version 5, you can only interact with the modal once it has been loaded here.</pre></td></tr><tr class="css-1n7ec1i-line"><td class="css-17vezug-marker css-10regm7-empty-line"><pre></pre></td><td class="css-vl0irh-content css-10regm7-empty-line"><pre class="css-o1u8iu-content-text"></pre></td></tr><tr class="css-1n7ec1i-line"><td class="css-17vezug-marker css-10regm7-empty-line"><pre></pre></td><td class="css-vl0irh-content css-10regm7-empty-line"><pre class="css-o1u8iu-content-text"></pre></td></tr><tr class="css-1n7ec1i-line"><td class="css-17vezug-marker css-rq9a2a-diff-removed"><pre>-</pre></td><td class="css-vl0irh-content css-rq9a2a-diff-removed"><pre class="css-o1u8iu-content-text"> // In version 4, you can already interact with the modal here as its in the DOM at this stage.</pre></td></tr><tr class="css-1n7ec1i-line"><td class="css-17vezug-marker css-rq9a2a-diff-removed"><pre>-</pre></td><td class="css-vl0irh-content css-rq9a2a-diff-removed"><pre class="css-o1u8iu-content-text"> </pre></td></tr><tr class="css-1n7ec1i-line"><td class="css-17vezug-marker css-rq9a2a-diff-removed"><pre>-</pre></td><td class="css-vl0irh-content css-rq9a2a-diff-removed"><pre class="css-o1u8iu-content-text"> // activate modal</pre></td></tr><tr class="css-1n7ec1i-line"><td class="css-17vezug-marker css-rq9a2a-diff-removed"><pre>-</pre></td><td class="css-vl0irh-content css-rq9a2a-diff-removed"><pre class="css-o1u8iu-content-text"> idsFireEvent.click(trigger);</pre></td></tr><tr class="css-1n7ec1i-line"><td class="css-17vezug-marker css-rq9a2a-diff-removed"><pre>-</pre></td><td class="css-vl0irh-content css-rq9a2a-diff-removed"><pre class="css-o1u8iu-content-text"> await waitFor(() =&gt; expect(modal).toBeVisible());</pre></td></tr><tr class="css-1n7ec1i-line"><td class="css-17vezug-marker css-rq9a2a-diff-removed"><pre>-</pre></td><td class="css-vl0irh-content css-rq9a2a-diff-removed"><pre class="css-o1u8iu-content-text"> </pre></td></tr><tr class="css-1n7ec1i-line"><td class="css-17vezug-marker"><pre></pre></td><td class="css-vl0irh-content"><pre class="css-o1u8iu-content-text"> // close modal</pre></td></tr><tr class="css-1n7ec1i-line"><td class="css-17vezug-marker css-rq9a2a-diff-removed"><pre>-</pre></td><td class="css-vl0irh-content css-rq9a2a-diff-removed"><pre class="css-o1u8iu-content-text"> const closeButton = screen.getByTestId('modal__close-button');</pre></td></tr><tr class="css-1n7ec1i-line"><td class="css-17vezug-marker css-cnnxkz-diff-added"><pre>+</pre></td><td class="css-vl0irh-content css-cnnxkz-diff-added"><pre class="css-o1u8iu-content-text"> const closeButton = screen.getByRole('button', { name: /close/i });</pre></td></tr><tr class="css-1n7ec1i-line"><td class="css-17vezug-marker css-rq9a2a-diff-removed"><pre>-</pre></td><td class="css-vl0irh-content css-rq9a2a-diff-removed"><pre class="css-o1u8iu-content-text"> idsFireEvent.click(closeButton);</pre></td></tr><tr class="css-1n7ec1i-line"><td class="css-17vezug-marker css-cnnxkz-diff-added"><pre>+</pre></td><td class="css-vl0irh-content css-cnnxkz-diff-added"><pre class="css-o1u8iu-content-text"> await userEvent.click(closeButton);</pre></td></tr><tr class="css-1n7ec1i-line"><td class="css-17vezug-marker css-rq9a2a-diff-removed"><pre>-</pre></td><td class="css-vl0irh-content css-rq9a2a-diff-removed"><pre class="css-o1u8iu-content-text"> await waitFor(() =&gt; expect(modal).not.toBeVisible());</pre></td></tr><tr class="css-1n7ec1i-line"><td class="css-17vezug-marker css-cnnxkz-diff-added"><pre>+</pre></td><td class="css-vl0irh-content css-cnnxkz-diff-added"><pre class="css-o1u8iu-content-text"> await waitForElementToBeRemoved(modal);</pre></td></tr><tr class="css-1n7ec1i-line"><td class="css-17vezug-marker"><pre></pre></td><td class="css-vl0irh-content"><pre class="css-o1u8iu-content-text">});</pre></td></tr></tbody></table>
1289
-
1290
- ### [](#speed-up-tests)Speed up tests
1291
-
1292
- You can speed up tests by wrapping your tests in a provider that overrides the theme tokens for animations.
1293
-
1294
- \[data-radix-scroll-area-viewport\] {
1295
- scrollbar-width: none;
1296
- -ms-overflow-style: none;
1297
- -webkit-overflow-scrolling: touch;
1298
- }
1299
- \[data-radix-scroll-area-viewport\]::-webkit-scrollbar {
1300
- display: none;
1301
- }
1302
- :where(\[data-radix-scroll-area-viewport\]) {
1303
- display: flex;
1304
- flex-direction: column;
1305
- align-items: stretch;
1306
- }
1307
- :where(\[data-radix-scroll-area-content\]) {
1308
- flex-grow: 1;
1309
- }
1310
-
1311
- const themeOverrides: Record<string, string\> \= {
1312
- '--iress-backdrop-transition-duration': '0s',
1313
- };
1314
- export const TestAppProvider \= ({ children }: PropsWithChildren) \=> {
1315
- const containerRef \= useRef<HTMLDivElement\>(null);
1316
- return (
1317
- <IressModalProvider container\={containerRef}\>
1318
- <div style\={themeOverrides} ref\={containerRef}\>
1319
- {children}
1320
- </div\>
1321
- </IressModalProvider\>
1322
- );
1323
- };
1324
-
1325
- Copy
1326
-
1327
- On this page
1328
-
1329
- * [Overview](#overview)
1330
- * [Use a modal when](#use-a-modal-when)
1331
- * [Avoid using a modal when](#avoid-using-a-modal-when)
1332
- * [Props](#props)
1333
- * [Controlling the modal](#controlling-the-modal)
1334
- * [Using the show property](#using-the-show-property)
1335
- * [Using the IressModalProvider](#using-the-iressmodalprovider)
1336
- * [Behaviour](#behaviour)
1337
- * [Examples](#examples)
1338
- * [Footer slot](#footer-slot)
1339
- * [Fixed footer](#fixed-footer)
1340
- * [Size](#size)
1341
- * [Responsive size](#responsive-size)
1342
- * [Disable closing](#disable-closing)
1343
- * [Migrating to version 5](#migrating-to-version-5)
1344
- * [Adding the provider](#adding-the-provider)
1345
- * [Testing](#testing)
1346
- * [Speed up tests](#speed-up-tests)