@itwin/itwinui-react 3.14.1 → 3.15.0

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 (113) hide show
  1. package/CHANGELOG.md +76 -2
  2. package/DEV-cjs/core/Carousel/CarouselDotsList.js +11 -4
  3. package/DEV-cjs/core/Carousel/CarouselSlider.js +3 -3
  4. package/DEV-cjs/core/ColorPicker/ColorBuilder.js +72 -24
  5. package/DEV-cjs/core/ColorPicker/ColorInputPanel.js +35 -7
  6. package/DEV-cjs/core/ColorPicker/ColorPalette.js +21 -3
  7. package/DEV-cjs/core/ComboBox/ComboBox.js +2 -1
  8. package/DEV-cjs/core/ComboBox/ComboBoxMenu.js +2 -2
  9. package/DEV-cjs/core/DropdownMenu/DropdownMenu.js +20 -19
  10. package/DEV-cjs/core/Footer/Footer.js +7 -7
  11. package/DEV-cjs/core/Overlay/Overlay.js +0 -18
  12. package/DEV-cjs/core/Popover/Popover.js +17 -10
  13. package/DEV-cjs/core/Select/Select.js +4 -2
  14. package/DEV-cjs/core/Table/Table.js +51 -26
  15. package/DEV-cjs/core/Table/TableExpandableContentMemoized.js +47 -0
  16. package/DEV-cjs/core/Table/TableRowMemoized.js +0 -18
  17. package/DEV-cjs/core/Table/cells/DefaultCell.js +5 -5
  18. package/DEV-cjs/core/Table/hooks/useColumnDragAndDrop.js +12 -14
  19. package/DEV-cjs/core/ThemeProvider/ThemeProvider.js +19 -1
  20. package/DEV-cjs/core/Toast/Toast.js +6 -7
  21. package/DEV-cjs/styles.js +1 -1
  22. package/DEV-cjs/utils/components/ShadowRoot.js +22 -8
  23. package/DEV-cjs/utils/hooks/useWarningLogger.js +5 -3
  24. package/DEV-esm/core/Carousel/CarouselDotsList.js +10 -5
  25. package/DEV-esm/core/Carousel/CarouselSlider.js +2 -3
  26. package/DEV-esm/core/ColorPicker/ColorBuilder.js +56 -22
  27. package/DEV-esm/core/ColorPicker/ColorInputPanel.js +37 -8
  28. package/DEV-esm/core/ColorPicker/ColorPalette.js +18 -3
  29. package/DEV-esm/core/ComboBox/ComboBox.js +2 -1
  30. package/DEV-esm/core/ComboBox/ComboBoxMenu.js +2 -2
  31. package/DEV-esm/core/DropdownMenu/DropdownMenu.js +20 -19
  32. package/DEV-esm/core/Footer/Footer.js +7 -7
  33. package/DEV-esm/core/Overlay/Overlay.js +1 -19
  34. package/DEV-esm/core/Popover/Popover.js +18 -10
  35. package/DEV-esm/core/Select/Select.js +4 -2
  36. package/DEV-esm/core/Table/Table.js +51 -26
  37. package/DEV-esm/core/Table/TableExpandableContentMemoized.js +33 -0
  38. package/DEV-esm/core/Table/TableRowMemoized.js +1 -21
  39. package/DEV-esm/core/Table/cells/DefaultCell.js +5 -5
  40. package/DEV-esm/core/Table/hooks/useColumnDragAndDrop.js +12 -6
  41. package/DEV-esm/core/ThemeProvider/ThemeProvider.js +19 -1
  42. package/DEV-esm/core/Toast/Toast.js +5 -5
  43. package/DEV-esm/styles.js +1 -1
  44. package/DEV-esm/utils/components/ShadowRoot.js +22 -8
  45. package/DEV-esm/utils/hooks/useWarningLogger.js +4 -3
  46. package/cjs/core/Buttons/SplitButton.d.ts +5 -0
  47. package/cjs/core/Carousel/CarouselDotsList.js +11 -4
  48. package/cjs/core/Carousel/CarouselSlider.js +3 -3
  49. package/cjs/core/ColorPicker/ColorBuilder.d.ts +22 -1
  50. package/cjs/core/ColorPicker/ColorBuilder.js +72 -24
  51. package/cjs/core/ColorPicker/ColorInputPanel.d.ts +18 -0
  52. package/cjs/core/ColorPicker/ColorInputPanel.js +35 -7
  53. package/cjs/core/ColorPicker/ColorPalette.d.ts +8 -0
  54. package/cjs/core/ColorPicker/ColorPalette.js +21 -3
  55. package/cjs/core/ComboBox/ComboBox.d.ts +3 -2
  56. package/cjs/core/ComboBox/ComboBox.js +2 -1
  57. package/cjs/core/ComboBox/ComboBoxMenu.js +2 -2
  58. package/cjs/core/DropdownMenu/DropdownMenu.d.ts +11 -0
  59. package/cjs/core/DropdownMenu/DropdownMenu.js +20 -19
  60. package/cjs/core/Footer/Footer.d.ts +5 -5
  61. package/cjs/core/Footer/Footer.js +7 -7
  62. package/cjs/core/Overlay/Overlay.js +0 -18
  63. package/cjs/core/Popover/Popover.d.ts +4 -1
  64. package/cjs/core/Popover/Popover.js +17 -10
  65. package/cjs/core/Select/Select.d.ts +14 -2
  66. package/cjs/core/Select/Select.js +4 -2
  67. package/cjs/core/Table/Table.js +51 -26
  68. package/cjs/core/Table/TableExpandableContentMemoized.d.ts +10 -0
  69. package/cjs/core/Table/TableExpandableContentMemoized.js +47 -0
  70. package/cjs/core/Table/TableRowMemoized.js +0 -18
  71. package/cjs/core/Table/cells/DefaultCell.js +5 -5
  72. package/cjs/core/Table/hooks/useColumnDragAndDrop.js +12 -14
  73. package/cjs/core/Table/utils.d.ts +2 -2
  74. package/cjs/core/ThemeProvider/ThemeProvider.js +19 -1
  75. package/cjs/core/Toast/Toast.js +6 -7
  76. package/cjs/styles.js +1 -1
  77. package/cjs/utils/components/ShadowRoot.js +22 -8
  78. package/cjs/utils/hooks/useWarningLogger.js +1 -0
  79. package/esm/core/Buttons/SplitButton.d.ts +5 -0
  80. package/esm/core/Carousel/CarouselDotsList.js +10 -5
  81. package/esm/core/Carousel/CarouselSlider.js +2 -3
  82. package/esm/core/ColorPicker/ColorBuilder.d.ts +22 -1
  83. package/esm/core/ColorPicker/ColorBuilder.js +56 -22
  84. package/esm/core/ColorPicker/ColorInputPanel.d.ts +18 -0
  85. package/esm/core/ColorPicker/ColorInputPanel.js +37 -8
  86. package/esm/core/ColorPicker/ColorPalette.d.ts +8 -0
  87. package/esm/core/ColorPicker/ColorPalette.js +18 -3
  88. package/esm/core/ComboBox/ComboBox.d.ts +3 -2
  89. package/esm/core/ComboBox/ComboBox.js +2 -1
  90. package/esm/core/ComboBox/ComboBoxMenu.js +2 -2
  91. package/esm/core/DropdownMenu/DropdownMenu.d.ts +11 -0
  92. package/esm/core/DropdownMenu/DropdownMenu.js +20 -19
  93. package/esm/core/Footer/Footer.d.ts +5 -5
  94. package/esm/core/Footer/Footer.js +7 -7
  95. package/esm/core/Overlay/Overlay.js +1 -19
  96. package/esm/core/Popover/Popover.d.ts +4 -1
  97. package/esm/core/Popover/Popover.js +18 -10
  98. package/esm/core/Select/Select.d.ts +14 -2
  99. package/esm/core/Select/Select.js +4 -2
  100. package/esm/core/Table/Table.js +51 -26
  101. package/esm/core/Table/TableExpandableContentMemoized.d.ts +10 -0
  102. package/esm/core/Table/TableExpandableContentMemoized.js +33 -0
  103. package/esm/core/Table/TableRowMemoized.js +1 -21
  104. package/esm/core/Table/cells/DefaultCell.js +5 -5
  105. package/esm/core/Table/hooks/useColumnDragAndDrop.js +12 -6
  106. package/esm/core/Table/utils.d.ts +2 -2
  107. package/esm/core/ThemeProvider/ThemeProvider.js +19 -1
  108. package/esm/core/Toast/Toast.js +5 -5
  109. package/esm/styles.js +1 -1
  110. package/esm/utils/components/ShadowRoot.js +22 -8
  111. package/esm/utils/hooks/useWarningLogger.js +1 -0
  112. package/package.json +8 -6
  113. package/styles.css +8 -8
@@ -117,7 +117,7 @@ const CustomSelect = _react.forwardRef((props, forwardedRef) => {
117
117
  multiple = false,
118
118
  triggerProps,
119
119
  status,
120
- popoverProps,
120
+ popoverProps: { portal = true, ...popoverProps } = {},
121
121
  styleType,
122
122
  ...rest
123
123
  } = props;
@@ -314,7 +314,9 @@ const CustomSelect = _react.forwardRef((props, forwardedRef) => {
314
314
  popover.open &&
315
315
  _react.createElement(
316
316
  _index.Portal,
317
- null,
317
+ {
318
+ portal: portal,
319
+ },
318
320
  _react.createElement(
319
321
  SelectListbox,
320
322
  {
@@ -31,6 +31,7 @@ const _index1 = require('./hooks/index.js');
31
31
  const _index2 = require('./actionHandlers/index.js');
32
32
  const _index3 = require('./columns/index.js');
33
33
  const _ColumnHeader = require('./ColumnHeader.js');
34
+ const _TableExpandableContentMemoized = require('./TableExpandableContentMemoized.js');
34
35
  const singleRowSelectedAction = 'singleRowSelected';
35
36
  const shiftRowSelectedAction = 'shiftRowSelected';
36
37
  const tableResizeStartAction = 'tableResizeStart';
@@ -224,6 +225,17 @@ const Table = (props) => {
224
225
  ),
225
226
  [data, getSubRows],
226
227
  );
228
+ let [rowHasParent] = _react.useState(() => new WeakSet());
229
+ let getSubRowsWithSubComponents = _react.useCallback(
230
+ (originalRow) => {
231
+ if (!rowHasParent.has(originalRow)) {
232
+ rowHasParent.add(originalRow);
233
+ return [originalRow];
234
+ }
235
+ return originalRow.subRows || [];
236
+ },
237
+ [rowHasParent],
238
+ );
227
239
  let instance = (0, _reacttable.useTable)(
228
240
  {
229
241
  manualPagination: !paginatorRenderer,
@@ -236,7 +248,7 @@ const Table = (props) => {
236
248
  filterTypes,
237
249
  selectSubRows,
238
250
  data,
239
- getSubRows,
251
+ getSubRows: subComponent ? getSubRowsWithSubComponents : getSubRows,
240
252
  initialState: {
241
253
  pageSize,
242
254
  ...props.initialState,
@@ -437,39 +449,54 @@ const Table = (props) => {
437
449
  (0, _index.useLayoutEffect)(() => {
438
450
  if (scrollToIndex)
439
451
  virtualizer.scrollToIndex(scrollToIndex, {
440
- align: 'center',
452
+ align: 'start',
441
453
  });
442
454
  }, [virtualizer, scrollToIndex]);
443
455
  let getPreparedRow = _react.useCallback(
444
456
  (index, virtualItem, virtualizer) => {
445
457
  let row = page[index];
446
458
  prepareRow(row);
447
- return _react.createElement(_TableRowMemoized.TableRowMemoized, {
448
- row: row,
449
- rowProps: rowProps,
450
- isLast: index === page.length - 1,
451
- onRowInViewport: onRowInViewportRef,
452
- onBottomReached: onBottomReachedRef,
453
- intersectionMargin: intersectionMargin,
454
- state: state,
455
- key: row.getRowProps().key,
456
- onClick: onRowClickHandler,
457
- subComponent: subComponent,
458
- isDisabled: !!isRowDisabled?.(row.original),
459
- tableHasSubRows: hasAnySubRows,
460
- tableInstance: instance,
461
- expanderCell: expanderCell,
462
- scrollContainerRef: tableRef.current,
463
- tableRowRef: enableVirtualization ? void 0 : tableRowRef(row),
464
- density: density,
465
- virtualItem: virtualItem,
466
- virtualizer: virtualizer,
467
- });
459
+ if (row.subRows.length > 0 || !subComponent)
460
+ return _react.createElement(_TableRowMemoized.TableRowMemoized, {
461
+ row: row,
462
+ rowProps: rowProps,
463
+ isLast: index === page.length - 1,
464
+ onRowInViewport: onRowInViewportRef,
465
+ onBottomReached: onBottomReachedRef,
466
+ intersectionMargin: intersectionMargin,
467
+ state: state,
468
+ key: row.getRowProps().key,
469
+ onClick: onRowClickHandler,
470
+ subComponent: subComponent,
471
+ isDisabled: !!isRowDisabled?.(row.original),
472
+ tableHasSubRows: hasAnySubRows,
473
+ tableInstance: instance,
474
+ expanderCell: expanderCell,
475
+ scrollContainerRef: tableRef.current,
476
+ tableRowRef: enableVirtualization ? void 0 : tableRowRef(row),
477
+ density: density,
478
+ virtualItem: virtualItem,
479
+ virtualizer: virtualizer,
480
+ });
481
+ return _react.createElement(
482
+ _TableExpandableContentMemoized.TableExpandableContentMemoized,
483
+ {
484
+ key: row.getRowProps().key,
485
+ virtualItem: virtualItem,
486
+ ref: enableVirtualization
487
+ ? virtualizer?.measureElement
488
+ : tableRowRef(row),
489
+ isDisabled: !!isRowDisabled?.(row.original),
490
+ },
491
+ subComponent(row),
492
+ );
468
493
  },
469
494
  [
470
495
  page,
471
496
  prepareRow,
472
497
  rowProps,
498
+ onRowInViewportRef,
499
+ onBottomReachedRef,
473
500
  intersectionMargin,
474
501
  state,
475
502
  onRowClickHandler,
@@ -481,8 +508,6 @@ const Table = (props) => {
481
508
  enableVirtualization,
482
509
  tableRowRef,
483
510
  density,
484
- onBottomReachedRef,
485
- onRowInViewportRef,
486
511
  ],
487
512
  );
488
513
  let updateStickyState = () => {
@@ -514,7 +539,7 @@ const Table = (props) => {
514
539
  return _react.createElement(
515
540
  _utils.TableColumnsContext.Provider,
516
541
  {
517
- value: columns,
542
+ value: instance.columns,
518
543
  },
519
544
  _react.createElement(
520
545
  _index.Box,
@@ -0,0 +1,47 @@
1
+ 'use strict';
2
+ Object.defineProperty(exports, '__esModule', {
3
+ value: true,
4
+ });
5
+ Object.defineProperty(exports, 'TableExpandableContentMemoized', {
6
+ enumerable: true,
7
+ get: function () {
8
+ return TableExpandableContentMemoized;
9
+ },
10
+ });
11
+ const _interop_require_default = require('@swc/helpers/_/_interop_require_default');
12
+ const _interop_require_wildcard = require('@swc/helpers/_/_interop_require_wildcard');
13
+ const _classnames = _interop_require_default._(require('classnames'));
14
+ const _react = _interop_require_wildcard._(require('react'));
15
+ const _index = require('../../utils/index.js');
16
+ const TableExpandableContent = _react.forwardRef((props, ref) => {
17
+ let { children, className, style, isDisabled, virtualItem, ...rest } = props;
18
+ return _react.createElement(
19
+ _index.Box,
20
+ {
21
+ className: (0, _classnames.default)(
22
+ 'iui-table-row',
23
+ 'iui-table-expanded-content',
24
+ className,
25
+ ),
26
+ style: {
27
+ flex: '0 0 auto',
28
+ minWidth: '100%',
29
+ ...(null != virtualItem
30
+ ? {
31
+ transform: `translateY(${virtualItem.start}px)`,
32
+ }
33
+ : {}),
34
+ ...style,
35
+ },
36
+ 'aria-disabled': isDisabled,
37
+ 'data-iui-index': virtualItem?.index,
38
+ ...(null != virtualItem && {
39
+ 'data-iui-virtualizer': 'item',
40
+ }),
41
+ ref: ref,
42
+ ...rest,
43
+ },
44
+ children,
45
+ );
46
+ });
47
+ const TableExpandableContentMemoized = _react.memo(TableExpandableContent);
@@ -122,24 +122,6 @@ const TableRow = (props) => {
122
122
  }),
123
123
  ),
124
124
  ),
125
- subComponent &&
126
- _react.createElement(
127
- _index.WithCSSTransition,
128
- {
129
- in: row.isExpanded,
130
- },
131
- _react.createElement(
132
- _index.Box,
133
- {
134
- className: (0, _classnames.default)(
135
- 'iui-table-row',
136
- 'iui-table-expanded-content',
137
- ),
138
- 'aria-disabled': isDisabled,
139
- },
140
- subComponent(row),
141
- ),
142
- ),
143
125
  );
144
126
  };
145
127
  const hasAnySelectedSubRow = (row, selectedRowIds) => {
@@ -11,17 +11,17 @@ Object.defineProperty(exports, 'DefaultCell', {
11
11
  const _interop_require_default = require('@swc/helpers/_/_interop_require_default');
12
12
  const _interop_require_wildcard = require('@swc/helpers/_/_interop_require_wildcard');
13
13
  const _react = _interop_require_wildcard._(require('react'));
14
+ const _reacttable = require('react-table');
14
15
  const _classnames = _interop_require_default._(require('classnames'));
15
16
  const _index = require('../../../utils/index.js');
16
17
  const _utils = require('../utils.js');
17
18
  const DefaultCell = (props) => {
18
- let columnsProp = _react.useContext(_utils.TableColumnsContext);
19
+ let instanceColumns = _react.useContext(_utils.TableColumnsContext);
19
20
  let isCustomCell = _react.useMemo(
20
21
  () =>
21
- columnsProp
22
- .find(({ id }) => props.cellProps.column.id === id)
23
- ?.hasOwnProperty('Cell'),
24
- [props.cellProps.column.id, columnsProp],
22
+ instanceColumns.find(({ id }) => props.cellProps.column.id === id)
23
+ ?.Cell !== _reacttable.defaultColumn.Cell,
24
+ [instanceColumns, props.cellProps.column.id],
25
25
  );
26
26
  let {
27
27
  cellElementProps: {
@@ -10,6 +10,8 @@ Object.defineProperty(exports, 'useColumnDragAndDrop', {
10
10
  });
11
11
  const _reacttable = require('react-table');
12
12
  const _styles = require('../../../styles.js');
13
+ const leftClassName = _styles.styles['iui-table-reorder-column-left'];
14
+ const rightClassName = _styles.styles['iui-table-reorder-column-right'];
13
15
  const REORDER_ACTIONS = {
14
16
  columnDragStart: 'columnDragStart',
15
17
  columnDragEnd: 'columnDragEnd',
@@ -31,20 +33,16 @@ const defaultGetDragAndDropProps =
31
33
  };
32
34
  let setOnDragColumnStyle = (event, position) => {
33
35
  let columnElement = event.currentTarget;
34
- columnElement.classList.remove(
35
- _styles.styles['iui-table-reorder-column-right'],
36
- );
37
- columnElement.classList.remove(
38
- _styles.styles['iui-table-reorder-column-left'],
39
- );
40
- if ('left' === position)
41
- columnElement.classList.add(
42
- _styles.styles['iui-table-reorder-column-left'],
43
- );
44
- else if ('right' === position)
45
- columnElement.classList.add(
46
- _styles.styles['iui-table-reorder-column-right'],
47
- );
36
+ if ('left' === position) {
37
+ columnElement.classList.remove(rightClassName);
38
+ columnElement.classList.add(leftClassName);
39
+ } else if ('right' === position) {
40
+ columnElement.classList.remove(leftClassName);
41
+ columnElement.classList.add(rightClassName);
42
+ } else {
43
+ columnElement.classList.remove(leftClassName);
44
+ columnElement.classList.remove(rightClassName);
45
+ }
48
46
  };
49
47
  let reorderColumns = (tableColumns, srcIndex, dstIndex) => {
50
48
  let newTableColumns = [...tableColumns];
@@ -30,6 +30,7 @@ const ThemeProvider = _react.forwardRef((props, forwardedRef) => {
30
30
  includeCss = 'inherit' === themeProp,
31
31
  ...rest
32
32
  } = props;
33
+ useInertPolyfill();
33
34
  let [rootElement, setRootElement] = _react.useState(null);
34
35
  let parent = useParentThemeAndContext(rootElement);
35
36
  let theme = 'inherit' === themeProp ? parent.theme || 'light' : themeProp;
@@ -247,7 +248,7 @@ const FallbackStyles = ({ root }) => {
247
248
  } catch (error) {
248
249
  console.log('Error loading styles.css locally', error);
249
250
  let css = await (0, _index.importCss)(
250
- 'https://cdn.jsdelivr.net/npm/@itwin/itwinui-react@3/styles.css',
251
+ `https://cdn.jsdelivr.net/npm/@itwin/itwinui-react@${_meta.meta.version}/styles.css`,
251
252
  );
252
253
  document.adoptedStyleSheets = [
253
254
  ...document.adoptedStyleSheets,
@@ -291,3 +292,20 @@ const useIuiDebugRef = () => {
291
292
  };
292
293
  _globalThis1.__iui.versions.add(JSON.stringify(_meta.meta));
293
294
  };
295
+ const useInertPolyfill = () => {
296
+ let loaded = _react.useRef(false);
297
+ let modulePath =
298
+ 'https://cdn.jsdelivr.net/npm/wicg-inert@3.1.2/dist/inert.min.js';
299
+ _react.useEffect(() => {
300
+ (async () => {
301
+ if (
302
+ !HTMLElement.prototype.hasOwnProperty('inert') &&
303
+ !loaded.current &&
304
+ !_index.isUnitTest
305
+ ) {
306
+ await new Function('url', 'return import(url)')(modulePath);
307
+ loaded.current = true;
308
+ }
309
+ })();
310
+ }, []);
311
+ };
@@ -25,10 +25,6 @@ const _classnames = _interop_require_default._(require('classnames'));
25
25
  const _index = require('../../utils/index.js');
26
26
  const _IconButton = require('../Buttons/IconButton.js');
27
27
  const _Toaster = require('./Toaster.js');
28
- const isMotionOk = () =>
29
- (0, _index.getWindow)()?.matchMedia?.(
30
- '(prefers-reduced-motion: no-preference)',
31
- )?.matches;
32
28
  const Toast = (props) => {
33
29
  let {
34
30
  content,
@@ -52,6 +48,9 @@ const Toast = (props) => {
52
48
  let [height, setHeight] = _react.useState(0);
53
49
  let thisElement = _react.useRef(null);
54
50
  let [margin, setMargin] = _react.useState(0);
51
+ let motionOk = (0, _index.useMediaQuery)(
52
+ '(prefers-reduced-motion: no-preference)',
53
+ );
55
54
  let marginStyle = () => {
56
55
  if ('top' === placementPosition)
57
56
  return {
@@ -116,16 +115,16 @@ const Toast = (props) => {
116
115
  appear: true,
117
116
  unmountOnExit: true,
118
117
  onEnter: (node) => {
119
- if (isMotionOk()) {
118
+ if (motionOk) {
120
119
  node.style.transform = 'translateY(15%)';
121
120
  node.style.transitionTimingFunction = 'ease';
122
121
  }
123
122
  },
124
123
  onEntered: (node) => {
125
- if (isMotionOk()) node.style.transform = 'translateY(0)';
124
+ if (motionOk) node.style.transform = 'translateY(0)';
126
125
  },
127
126
  onExiting: (node) => {
128
- if (isMotionOk()) {
127
+ if (motionOk) {
129
128
  let { translateX, translateY } = calculateOutAnimation(node);
130
129
  node.style.transform = animateOutTo
131
130
  ? `scale(0.9) translate(${translateX}px,${translateY}px)`
package/DEV-cjs/styles.js CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
3
- const e = '3.14.1';
3
+ const e = '3.15.0';
4
4
  const u = new Proxy(
5
5
  {},
6
6
  {
@@ -61,6 +61,19 @@ function useShadowRoot(templateRef, { css = '' }) {
61
61
  let styleSheet = _react.useRef();
62
62
  let latestCss = (0, _index.useLatestRef)(css);
63
63
  let latestShadowRoot = (0, _index.useLatestRef)(shadowRoot);
64
+ let createStyleSheet = _react.useCallback(
65
+ (shadow) => {
66
+ if (shadow && supportsAdoptedStylesheets) {
67
+ let currentWindow = shadow.ownerDocument.defaultView || globalThis;
68
+ if (styleSheet.current instanceof currentWindow.CSSStyleSheet) return;
69
+ styleSheet.current = new currentWindow.CSSStyleSheet();
70
+ shadow.adoptedStyleSheets.push(styleSheet.current);
71
+ if (latestCss.current)
72
+ styleSheet.current.replaceSync(latestCss.current);
73
+ }
74
+ },
75
+ [latestCss],
76
+ );
64
77
  (0, _index.useLayoutEffect)(() => {
65
78
  let parent = templateRef.current?.parentElement;
66
79
  if (!parent) return;
@@ -72,22 +85,23 @@ function useShadowRoot(templateRef, { css = '' }) {
72
85
  parent.attachShadow({
73
86
  mode: 'open',
74
87
  });
75
- if (supportsAdoptedStylesheets) {
76
- let currentWindow = shadow.ownerDocument.defaultView || globalThis;
77
- styleSheet.current = new currentWindow.CSSStyleSheet();
78
- shadow.adoptedStyleSheets = [styleSheet.current];
79
- if (latestCss.current)
80
- styleSheet.current.replaceSync(latestCss.current);
81
- }
88
+ createStyleSheet(shadow);
82
89
  _reactdom.flushSync(() => setShadowRoot(shadow));
83
90
  };
84
91
  queueMicrotask(() => {
85
92
  setupOrReuseShadowRoot();
86
93
  });
87
94
  return () => void setShadowRoot(null);
88
- }, [templateRef, latestCss, latestShadowRoot]);
95
+ }, [templateRef, createStyleSheet, latestShadowRoot]);
89
96
  (0, _index.useLayoutEffect)(() => {
90
97
  if (css && supportsAdoptedStylesheets) styleSheet.current?.replaceSync(css);
91
98
  }, [css]);
99
+ _react.useEffect(() => {
100
+ let listener = () => createStyleSheet(latestShadowRoot.current);
101
+ window.addEventListener('appui:reparent', listener);
102
+ return () => {
103
+ window.removeEventListener('appui:reparent', listener);
104
+ };
105
+ }, [createStyleSheet, latestShadowRoot]);
92
106
  return shadowRoot;
93
107
  }
@@ -11,6 +11,7 @@ Object.defineProperty(exports, 'useWarningLogger', {
11
11
  const _interop_require_wildcard = require('@swc/helpers/_/_interop_require_wildcard');
12
12
  const _react = _interop_require_wildcard._(require('react'));
13
13
  const _dev = require('../functions/dev.js');
14
+ const _dom = require('../functions/dom.js');
14
15
  const _React = _react;
15
16
  const ReactInternals =
16
17
  _React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
@@ -18,13 +19,13 @@ const useWarningLogger = _dev.isUnitTest
18
19
  ? () => () => {}
19
20
  : function () {
20
21
  let loggedRef = _react.useRef(false);
21
- let timeoutRef = _react.useRef(null);
22
+ let timeoutRef = _react.useRef(void 0);
22
23
  let stack = ReactInternals?.ReactDebugCurrentFrame?.getCurrentStack?.();
23
24
  let componentName = stack?.trim().split('\n')[1]?.trim();
24
25
  let prefix = componentName ? `Warning (${componentName}):` : 'Warning:';
25
26
  let logWarning = _react.useCallback(
26
27
  (message) => {
27
- timeoutRef.current = window.setTimeout(() => {
28
+ timeoutRef.current = (0, _dom.getWindow)()?.setTimeout(() => {
28
29
  if (!loggedRef.current) {
29
30
  console.error(prefix, message);
30
31
  loggedRef.current = true;
@@ -35,7 +36,8 @@ const useWarningLogger = _dev.isUnitTest
35
36
  );
36
37
  _react.useEffect(
37
38
  () => () => {
38
- if (timeoutRef.current) window.clearTimeout(timeoutRef.current);
39
+ if (timeoutRef.current)
40
+ (0, _dom.getWindow)()?.clearTimeout(timeoutRef.current);
39
41
  },
40
42
  [],
41
43
  );
@@ -3,7 +3,7 @@ import cx from 'classnames';
3
3
  import { CarouselContext } from './CarouselContext.js';
4
4
  import {
5
5
  getBoundedValue,
6
- getWindow,
6
+ useMediaQuery,
7
7
  useMergedRefs,
8
8
  useResizeObserver,
9
9
  Box,
@@ -96,18 +96,23 @@ export const CarouselDotsList = React.forwardRef((props, ref) => {
96
96
  handleSlideChange,
97
97
  ],
98
98
  );
99
+ let motionOk = useMediaQuery('(prefers-reduced-motion: no-preference)');
99
100
  React.useEffect(() => {
100
101
  let firstDot = listRef.current?.children[firstVisibleDotIndex];
101
102
  if (!listRef.current || !firstDot) return;
102
- let motionOk = getWindow()?.matchMedia(
103
- '(prefers-reduced-motion: no-preference)',
104
- )?.matches;
105
103
  listRef.current.scrollTo({
106
104
  left: firstDot.offsetLeft - listRef.current.offsetLeft,
107
105
  behavior: motionOk && !justMounted.current ? 'smooth' : 'auto',
108
106
  });
109
107
  if (justMounted.current) justMounted.current = false;
110
- }, [currentIndex, firstVisibleDotIndex, slideCount, visibleCount, width]);
108
+ }, [
109
+ currentIndex,
110
+ firstVisibleDotIndex,
111
+ motionOk,
112
+ slideCount,
113
+ visibleCount,
114
+ width,
115
+ ]);
111
116
  let handleKeyDown = (event) => {
112
117
  if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey)
113
118
  return;
@@ -6,6 +6,7 @@ import {
6
6
  useMergedRefs,
7
7
  useLayoutEffect,
8
8
  Box,
9
+ useMediaQuery,
9
10
  } from '../../utils/index.js';
10
11
  export const CarouselSlider = React.forwardRef((props, ref) => {
11
12
  let { children, className, ...rest } = props;
@@ -30,13 +31,11 @@ export const CarouselSlider = React.forwardRef((props, ref) => {
30
31
  }, [items.length, setSlideCount]);
31
32
  let sliderRef = React.useRef(null);
32
33
  let refs = useMergedRefs(sliderRef, ref);
34
+ let motionOk = useMediaQuery('(prefers-reduced-motion: no-preference)');
33
35
  scrollToSlide.current = (slideIndex, { instant } = {}) => {
34
36
  isManuallyUpdating.current = true;
35
37
  let slideToShow = sliderRef.current?.children.item(slideIndex);
36
38
  if (!sliderRef.current || !slideToShow) return;
37
- let motionOk = getWindow()?.matchMedia(
38
- '(prefers-reduced-motion: no-preference)',
39
- )?.matches;
40
39
  sliderRef.current.scrollTo({
41
40
  left: slideToShow.offsetLeft - sliderRef.current.offsetLeft,
42
41
  behavior: instant || !motionOk ? 'instant' : 'smooth',
@@ -6,6 +6,7 @@ import {
6
6
  useEventListener,
7
7
  useMergedRefs,
8
8
  Box,
9
+ mergeEventHandlers,
9
10
  } from '../../utils/index.js';
10
11
  import { Slider } from '../Slider/Slider.js';
11
12
  import { useColorPickerContext } from './ColorPickerContext.js';
@@ -18,7 +19,14 @@ let getHorizontalPercentageOfRectangle = (rect, pointer) => {
18
19
  return ((position - rect.left) / rect.width) * 100;
19
20
  };
20
21
  export const ColorBuilder = React.forwardRef((props, ref) => {
21
- let { className, ...rest } = props;
22
+ let {
23
+ className,
24
+ colorFieldProps,
25
+ colorDotProps,
26
+ opacitySliderProps,
27
+ hueSliderProps,
28
+ ...rest
29
+ } = props;
22
30
  let builderRef = React.useRef();
23
31
  let refs = useMergedRefs(builderRef, ref);
24
32
  let {
@@ -206,54 +214,74 @@ export const ColorBuilder = React.forwardRef((props, ref) => {
206
214
  React.createElement(
207
215
  Box,
208
216
  {
209
- className: 'iui-color-field',
217
+ as: 'div',
218
+ ...colorFieldProps,
219
+ className: cx('iui-color-field', colorFieldProps?.className),
210
220
  style: {
211
221
  '--iui-color-field-hue': hueColorString,
212
222
  '--iui-color-picker-selected-color': dotColorString,
223
+ ...colorFieldProps?.style,
213
224
  },
214
- ref: squareRef,
215
- onPointerDown: (event) => {
216
- event.preventDefault();
217
- updateSquareValue(event, 'onClick');
218
- setColorDotActive(true);
219
- colorDotRef.current?.focus();
220
- },
225
+ ref: useMergedRefs(squareRef, colorFieldProps?.ref),
226
+ onPointerDown: mergeEventHandlers(
227
+ colorFieldProps?.onPointerDown,
228
+ (event) => {
229
+ event.preventDefault();
230
+ updateSquareValue(event, 'onClick');
231
+ setColorDotActive(true);
232
+ colorDotRef.current?.focus();
233
+ },
234
+ ),
221
235
  },
222
236
  React.createElement(Box, {
223
- className: 'iui-color-dot',
237
+ as: 'div',
238
+ ...colorDotProps,
239
+ className: cx('iui-color-dot', colorDotProps?.className),
224
240
  style: {
225
241
  '--iui-color-dot-inset-block': `${squareTop.toString()}% auto`,
226
242
  '--iui-color-dot-inset-inline': `${squareLeft.toString()}% auto`,
243
+ ...colorDotProps?.style,
227
244
  },
228
- onPointerDown: () => {
245
+ onPointerDown: mergeEventHandlers(colorDotProps?.onPointerDown, () => {
229
246
  setColorDotActive(true);
230
247
  colorDotRef.current?.focus();
231
- },
232
- onKeyDown: handleColorDotKeyDown,
233
- onKeyUp: handleColorDotKeyUp,
248
+ }),
249
+ onKeyDown: mergeEventHandlers(
250
+ colorDotProps?.onKeyDown,
251
+ handleColorDotKeyDown,
252
+ ),
253
+ onKeyUp: mergeEventHandlers(
254
+ colorDotProps?.onKeyUp,
255
+ handleColorDotKeyUp,
256
+ ),
234
257
  tabIndex: 0,
235
- ref: colorDotRef,
258
+ ref: useMergedRefs(colorDotRef, colorDotProps?.ref),
236
259
  }),
237
260
  ),
238
261
  React.createElement(Slider, {
239
262
  minLabel: '',
240
263
  maxLabel: '',
241
264
  values: [sliderValue],
242
- className: 'iui-hue-slider',
243
265
  trackDisplayMode: 'none',
266
+ min: 0,
267
+ max: 359,
268
+ ...hueSliderProps,
269
+ className: cx('iui-hue-slider', hueSliderProps?.className),
244
270
  tooltipProps: () => ({
245
271
  visible: false,
272
+ ...hueSliderProps?.tooltipProps,
246
273
  }),
247
274
  onChange: (values) => {
275
+ hueSliderProps?.onChange?.(values);
248
276
  updateHueSlider(values[0], true);
249
277
  },
250
278
  onUpdate: (values) => {
279
+ hueSliderProps?.onUpdate?.(values);
251
280
  updateHueSlider(values[0], false);
252
281
  },
253
- min: 0,
254
- max: 359,
255
282
  thumbProps: () => ({
256
283
  'aria-label': 'Hue',
284
+ ...hueSliderProps?.thumbProps,
257
285
  }),
258
286
  }),
259
287
  showAlpha &&
@@ -261,25 +289,31 @@ export const ColorBuilder = React.forwardRef((props, ref) => {
261
289
  minLabel: '',
262
290
  maxLabel: '',
263
291
  values: [alphaValue],
264
- className: 'iui-opacity-slider',
265
292
  trackDisplayMode: 'none',
293
+ min: 0,
294
+ max: 1,
295
+ step: 0.01,
296
+ ...opacitySliderProps,
297
+ className: cx('iui-opacity-slider', opacitySliderProps?.className),
266
298
  tooltipProps: () => ({
267
299
  visible: false,
300
+ ...opacitySliderProps?.tooltipProps,
268
301
  }),
269
302
  onChange: (values) => {
303
+ opacitySliderProps?.onChange?.(values);
270
304
  updateOpacitySlider(values[0], true);
271
305
  },
272
306
  onUpdate: (values) => {
307
+ opacitySliderProps?.onUpdate?.(values);
273
308
  updateOpacitySlider(values[0], false);
274
309
  },
275
- min: 0,
276
- max: 1,
277
- step: 0.01,
278
310
  style: {
279
311
  '--iui-color-picker-selected-color': hueColorString,
312
+ ...opacitySliderProps?.style,
280
313
  },
281
314
  thumbProps: () => ({
282
315
  'aria-label': 'Opacity',
316
+ ...opacitySliderProps?.thumbProps,
283
317
  }),
284
318
  }),
285
319
  );