@itwin/itwinui-react 1.27.0 → 1.29.2

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 (76) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/cjs/core/Breadcrumbs/Breadcrumbs.js +1 -1
  3. package/cjs/core/ButtonGroup/ButtonGroup.js +2 -4
  4. package/cjs/core/Buttons/Button/Button.d.ts +6 -26
  5. package/cjs/core/Buttons/Button/Button.js +2 -2
  6. package/cjs/core/Buttons/DropdownButton/DropdownButton.d.ts +1 -1
  7. package/cjs/core/Buttons/IconButton/IconButton.d.ts +3 -8
  8. package/cjs/core/Buttons/IconButton/IconButton.js +2 -2
  9. package/cjs/core/Buttons/SplitButton/SplitButton.d.ts +9 -7
  10. package/cjs/core/Buttons/SplitButton/SplitButton.js +11 -6
  11. package/cjs/core/Checkbox/Checkbox.js +2 -2
  12. package/cjs/core/ColorPicker/ColorInputPanel.js +2 -2
  13. package/cjs/core/ColorPicker/ColorSwatch.d.ts +1 -1
  14. package/cjs/core/DatePicker/DatePicker.js +14 -15
  15. package/cjs/core/Header/HeaderButton.d.ts +6 -4
  16. package/cjs/core/Header/HeaderButton.js +3 -4
  17. package/cjs/core/LabeledInput/LabeledInput.d.ts +1 -1
  18. package/cjs/core/Modal/Modal.js +4 -1
  19. package/cjs/core/SideNavigation/SidenavButton.d.ts +3 -13
  20. package/cjs/core/Table/Table.d.ts +5 -0
  21. package/cjs/core/Table/Table.js +13 -5
  22. package/cjs/core/Table/TablePaginator.js +11 -5
  23. package/cjs/core/Table/TableRowMemoized.js +1 -1
  24. package/cjs/core/Table/filters/BaseFilter.js +3 -1
  25. package/cjs/core/Table/filters/FilterToggle.js +4 -3
  26. package/cjs/core/Table/hooks/useResizeColumns.js +2 -0
  27. package/cjs/core/Typography/Anchor/Anchor.d.ts +3 -0
  28. package/cjs/core/Typography/Anchor/Anchor.js +41 -0
  29. package/cjs/core/Typography/Anchor/index.d.ts +3 -0
  30. package/cjs/core/Typography/Anchor/index.js +10 -0
  31. package/cjs/core/Typography/Text/Text.d.ts +6 -10
  32. package/cjs/core/Typography/Text/Text.js +3 -4
  33. package/cjs/core/Typography/index.d.ts +1 -0
  34. package/cjs/core/Typography/index.js +3 -1
  35. package/cjs/core/index.d.ts +1 -1
  36. package/cjs/core/index.js +2 -1
  37. package/cjs/core/utils/hooks/useTheme.js +20 -3
  38. package/cjs/core/utils/props.d.ts +29 -1
  39. package/esm/core/Breadcrumbs/Breadcrumbs.js +1 -1
  40. package/esm/core/ButtonGroup/ButtonGroup.js +2 -4
  41. package/esm/core/Buttons/Button/Button.d.ts +6 -26
  42. package/esm/core/Buttons/Button/Button.js +3 -3
  43. package/esm/core/Buttons/DropdownButton/DropdownButton.d.ts +1 -1
  44. package/esm/core/Buttons/IconButton/IconButton.d.ts +3 -8
  45. package/esm/core/Buttons/IconButton/IconButton.js +2 -2
  46. package/esm/core/Buttons/SplitButton/SplitButton.d.ts +9 -7
  47. package/esm/core/Buttons/SplitButton/SplitButton.js +11 -5
  48. package/esm/core/Checkbox/Checkbox.js +2 -2
  49. package/esm/core/ColorPicker/ColorInputPanel.js +2 -2
  50. package/esm/core/ColorPicker/ColorSwatch.d.ts +1 -1
  51. package/esm/core/DatePicker/DatePicker.js +14 -15
  52. package/esm/core/Header/HeaderButton.d.ts +6 -4
  53. package/esm/core/Header/HeaderButton.js +3 -3
  54. package/esm/core/LabeledInput/LabeledInput.d.ts +1 -1
  55. package/esm/core/Modal/Modal.js +4 -1
  56. package/esm/core/SideNavigation/SidenavButton.d.ts +3 -13
  57. package/esm/core/Table/Table.d.ts +5 -0
  58. package/esm/core/Table/Table.js +13 -5
  59. package/esm/core/Table/TablePaginator.js +11 -5
  60. package/esm/core/Table/TableRowMemoized.js +1 -1
  61. package/esm/core/Table/filters/BaseFilter.js +3 -1
  62. package/esm/core/Table/filters/FilterToggle.js +4 -3
  63. package/esm/core/Table/hooks/useResizeColumns.js +2 -0
  64. package/esm/core/Typography/Anchor/Anchor.d.ts +3 -0
  65. package/esm/core/Typography/Anchor/Anchor.js +35 -0
  66. package/esm/core/Typography/Anchor/index.d.ts +3 -0
  67. package/esm/core/Typography/Anchor/index.js +6 -0
  68. package/esm/core/Typography/Text/Text.d.ts +6 -10
  69. package/esm/core/Typography/Text/Text.js +4 -4
  70. package/esm/core/Typography/index.d.ts +1 -0
  71. package/esm/core/Typography/index.js +1 -0
  72. package/esm/core/index.d.ts +1 -1
  73. package/esm/core/index.js +1 -1
  74. package/esm/core/utils/hooks/useTheme.js +20 -3
  75. package/esm/core/utils/props.d.ts +29 -1
  76. package/package.json +10 -5
@@ -30,6 +30,7 @@ import { IconButton } from '../Buttons';
30
30
  import { Input } from '../Input';
31
31
  import { ColorValue, InputContainer, useTheme } from '../utils';
32
32
  import { useColorPickerContext } from './ColorPickerContext';
33
+ import SvgSwap from '@itwin/itwinui-icons-react/cjs/icons/Swap';
33
34
  import '@itwin/itwinui-css/css/color-picker.css';
34
35
  /**
35
36
  * `ColorInputPanel` shows input fields to enter precise color values in the specified format.
@@ -296,8 +297,7 @@ export var ColorInputPanel = React.forwardRef(function (props, ref) {
296
297
  : currentFormat.toUpperCase()),
297
298
  React.createElement("div", { className: 'iui-color-input' },
298
299
  allowedColorFormats.length > 1 && (React.createElement(IconButton, { styleType: 'borderless', onClick: swapColorFormat, size: 'small' },
299
- React.createElement("svg", { viewBox: '0 0 16 16', className: 'iui-icon', "aria-hidden": true },
300
- React.createElement("path", { d: 'm5 15-3.78125-3.5 3.78125-3.5v2h8v3h-8zm6-7 3.78125-3.5-3.78125-3.5v2h-8v3h8z' })))),
300
+ React.createElement(SvgSwap, null))),
301
301
  React.createElement("div", { ref: inputsContainerRef, className: 'iui-color-input-fields' },
302
302
  currentFormat === 'hex' && hexInputField,
303
303
  currentFormat === 'rgb' && rgbInputs,
@@ -17,5 +17,5 @@ export declare type ColorSwatchProps = {
17
17
  * <ColorSwatch color='#23450b' onClick={onClick}/>
18
18
  * <ColorSwatch color={{ r: 255, g: 255, b: 0 }} onClick={onClick}/>
19
19
  */
20
- export declare const ColorSwatch: React.ForwardRefExoticComponent<Pick<ColorSwatchProps, "dir" | "slot" | "style" | "title" | "id" | "role" | "children" | "className" | "accessKey" | "draggable" | "hidden" | "lang" | "translate" | "prefix" | "contentEditable" | "inputMode" | "tabIndex" | "onFocus" | "color" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "contextMenu" | "placeholder" | "spellCheck" | "radioGroup" | "about" | "datatype" | "inlist" | "property" | "resource" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "is" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerEnterCapture" | "onPointerLeave" | "onPointerLeaveCapture" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "isActive" | "key"> & React.RefAttributes<HTMLDivElement>>;
20
+ export declare const ColorSwatch: React.ForwardRefExoticComponent<Pick<ColorSwatchProps, "dir" | "slot" | "style" | "title" | "id" | "role" | "children" | "className" | "accessKey" | "draggable" | "hidden" | "lang" | "translate" | "prefix" | "contentEditable" | "inputMode" | "tabIndex" | "onFocus" | "color" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerEnterCapture" | "onPointerLeave" | "onPointerLeaveCapture" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "key" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "contextMenu" | "placeholder" | "spellCheck" | "radioGroup" | "about" | "datatype" | "inlist" | "property" | "resource" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "is" | "isActive"> & React.RefAttributes<HTMLDivElement>>;
21
21
  export default ColorSwatch;
@@ -247,22 +247,21 @@ export var DatePicker = function (props) {
247
247
  }
248
248
  };
249
249
  return (React.createElement("div", __assign({ className: cx('iui-date-picker', className), style: style }, rest),
250
- React.createElement("div", { className: 'iui-calendar' },
251
- React.createElement("div", { className: 'iui-header' },
252
- React.createElement("div", { className: 'iui-month-year' },
253
- React.createElement(IconButton, { styleType: 'borderless', onClick: handleMoveToPreviousMonth, "aria-label": 'Previous month' },
254
- React.createElement(SvgChevronLeft, null)),
255
- React.createElement("span", { "aria-live": 'polite' },
256
- React.createElement("span", { className: 'iui-month', title: monthNames[displayedMonthIndex] }, monthNames[displayedMonthIndex]),
257
- "\u00A0",
258
- displayedYear),
259
- React.createElement(IconButton, { styleType: 'borderless', onClick: handleMoveToNextMonth, "aria-label": 'Next month' },
260
- React.createElement(SvgChevronRight, null))),
261
- React.createElement("div", { className: 'iui-weekdays' }, shortDays.map(function (day, index) { return (React.createElement("div", { key: day, title: longDays[index] }, day)); }))),
262
- React.createElement("div", { className: 'iui-dates', onKeyDown: handleCalendarKeyDown, role: 'listbox' }, weeks.map(function (weekDays, weekIndex) {
263
- return (React.createElement("div", { key: "week-" + displayedMonthIndex + "-" + weekIndex, className: 'iui-week' }, weekDays.map(function (weekDay, dayIndex) {
250
+ React.createElement("div", null,
251
+ React.createElement("div", { className: 'iui-calendar-month-year' },
252
+ React.createElement(IconButton, { styleType: 'borderless', onClick: handleMoveToPreviousMonth, "aria-label": 'Previous month' },
253
+ React.createElement(SvgChevronLeft, null)),
254
+ React.createElement("span", { "aria-live": 'polite' },
255
+ React.createElement("span", { className: 'iui-calendar-month', title: monthNames[displayedMonthIndex] }, monthNames[displayedMonthIndex]),
256
+ "\u00A0",
257
+ displayedYear),
258
+ React.createElement(IconButton, { styleType: 'borderless', onClick: handleMoveToNextMonth, "aria-label": 'Next month' },
259
+ React.createElement(SvgChevronRight, null))),
260
+ React.createElement("div", { className: 'iui-calendar-weekdays' }, shortDays.map(function (day, index) { return (React.createElement("div", { key: day, title: longDays[index] }, day)); })),
261
+ React.createElement("div", { onKeyDown: handleCalendarKeyDown, role: 'listbox' }, weeks.map(function (weekDays, weekIndex) {
262
+ return (React.createElement("div", { key: "week-" + displayedMonthIndex + "-" + weekIndex, className: 'iui-calendar-week' }, weekDays.map(function (weekDay, dayIndex) {
264
263
  var dateValue = weekDay.getDate();
265
- return (React.createElement("div", { key: "day-" + displayedMonthIndex + "-" + dayIndex, className: cx('iui-date', {
264
+ return (React.createElement("div", { key: "day-" + displayedMonthIndex + "-" + dayIndex, className: cx('iui-calendar-day', {
266
265
  'iui-outside-month': weekDay.getMonth() !== displayedMonthIndex,
267
266
  'iui-today': isSameDay(weekDay, new Date()),
268
267
  'iui-selected': isSameDay(weekDay, selectedDay),
@@ -1,13 +1,14 @@
1
1
  import React from 'react';
2
2
  import { ButtonProps, DropdownButtonProps } from '../Buttons';
3
+ import { PolymorphicForwardRefComponent } from '../utils';
3
4
  import '@itwin/itwinui-css/css/header.css';
4
5
  export declare type HeaderButtonProps = {
5
6
  /**
6
- * Name.
7
+ * Main label of the header button.
7
8
  */
8
9
  name: React.ReactNode;
9
10
  /**
10
- * Description shown below the name, will be hidden in `Header` slim mode.
11
+ * Description shown below the main label, will be hidden in `Header` slim mode.
11
12
  */
12
13
  description?: React.ReactNode;
13
14
  /**
@@ -15,7 +16,8 @@ export declare type HeaderButtonProps = {
15
16
  * @default false
16
17
  */
17
18
  isActive?: boolean;
18
- } & Omit<Partial<DropdownButtonProps> & Partial<ButtonProps>, 'children' | 'styleType' | 'name'>;
19
+ } & Partial<Pick<DropdownButtonProps, 'menuItems'>> & Pick<ButtonProps, 'startIcon' | 'endIcon'>;
20
+ declare type HeaderButtonComponent = PolymorphicForwardRefComponent<'button', HeaderButtonProps>;
19
21
  /**
20
22
  * Header button that handles slim state of the `Header` it's in.
21
23
  * When in slim mode, will only display the name and reduce icon size.
@@ -26,5 +28,5 @@ export declare type HeaderButtonProps = {
26
28
  * <HeaderButton name='Project C' startIcon={<img style={{ objectFit: 'cover' }} src='project.png' />} />
27
29
  * <HeaderButton name='Project D' isActive />
28
30
  */
29
- export declare const HeaderButton: (props: HeaderButtonProps) => JSX.Element;
31
+ export declare const HeaderButton: HeaderButtonComponent;
30
32
  export default HeaderButton;
@@ -45,7 +45,7 @@ var isDropdownButton = function (props) {
45
45
  * <HeaderButton name='Project C' startIcon={<img style={{ objectFit: 'cover' }} src='project.png' />} />
46
46
  * <HeaderButton name='Project D' isActive />
47
47
  */
48
- export var HeaderButton = function (props) {
48
+ export var HeaderButton = React.forwardRef(function (props, ref) {
49
49
  var name = props.name, description = props.description, _a = props.isActive, isActive = _a === void 0 ? false : _a, className = props.className, startIcon = props.startIcon, menuItems = props.menuItems, rest = __rest(props, ["name", "description", "isActive", "className", "startIcon", "menuItems"]);
50
50
  useTheme();
51
51
  var buttonProps = __assign(__assign({ startIcon: React.isValidElement(startIcon)
@@ -58,7 +58,7 @@ export var HeaderButton = function (props) {
58
58
  'iui-active': isActive,
59
59
  }, className), 'aria-current': isActive ? 'location' : undefined, children: (React.createElement(React.Fragment, null,
60
60
  React.createElement("div", null, name),
61
- description && React.createElement("div", { className: 'iui-description' }, description))) }, (!!menuItems && { menuItems: menuItems })), rest);
61
+ description && React.createElement("div", { className: 'iui-description' }, description))), ref: ref }, (!!menuItems && { menuItems: menuItems })), rest);
62
62
  if (isSplitButton(buttonProps)) {
63
63
  return React.createElement(SplitButton, __assign({}, buttonProps));
64
64
  }
@@ -66,5 +66,5 @@ export var HeaderButton = function (props) {
66
66
  return React.createElement(DropdownButton, __assign({}, buttonProps));
67
67
  }
68
68
  return React.createElement(Button, __assign({}, buttonProps));
69
- };
69
+ });
70
70
  export default HeaderButton;
@@ -84,7 +84,7 @@ export declare const LabeledInput: React.ForwardRefExoticComponent<{
84
84
  * - 'inline' - appears in the same line as input.
85
85
  * @default 'default'
86
86
  */
87
- displayStyle?: "inline" | "default" | undefined;
87
+ displayStyle?: "default" | "inline" | undefined;
88
88
  /**
89
89
  * Set display style of icon.
90
90
  * Supported values:
@@ -104,13 +104,16 @@ export var Modal = function (props) {
104
104
  var handleMouseDown = function (event) {
105
105
  // Prevents React from resetting its properties
106
106
  event.persist();
107
+ if (event.target !== overlayRef.current) {
108
+ return;
109
+ }
107
110
  if (isDismissible && closeOnExternalClick && onClose) {
108
111
  onClose(event);
109
112
  }
110
113
  };
111
114
  return !!container ? (ReactDOM.createPortal(isOpen && (React.createElement(FocusTrap, null,
112
115
  React.createElement("div", __assign({ className: cx('iui-modal', 'iui-modal-visible', className), tabIndex: -1, onKeyDown: handleKeyDown, ref: overlayRef, onMouseDown: handleMouseDown }, rest),
113
- React.createElement("div", { className: 'iui-modal-dialog', id: id, style: style, role: 'dialog', "aria-modal": 'true', onMouseDown: function (event) { return event.stopPropagation(); } },
116
+ React.createElement("div", { className: 'iui-modal-dialog', id: id, style: style, role: 'dialog', "aria-modal": 'true' },
114
117
  React.createElement("div", { className: 'iui-title-bar' },
115
118
  React.createElement("div", { className: 'iui-title' }, title),
116
119
  isDismissible && (React.createElement(IconButton, { size: 'small', styleType: 'borderless', onClick: onClose, "aria-label": 'Close' },
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import { PolymorphicForwardRefComponent } from '../utils';
2
2
  import { ButtonProps } from '../Buttons';
3
3
  import '@itwin/itwinui-css/css/side-navigation.css';
4
4
  export declare type SidenavButtonProps = {
@@ -13,20 +13,10 @@ export declare type SidenavButtonProps = {
13
13
  */
14
14
  isSubmenuOpen?: boolean;
15
15
  } & Omit<ButtonProps, 'styleType' | 'size'>;
16
+ declare type SideNavButtonComponent = PolymorphicForwardRefComponent<'button', SidenavButtonProps>;
16
17
  /**
17
18
  * Wrapper around Button to be used as SideNavigation items.
18
19
  * Label is hidden when sidenav is collapsed.
19
20
  */
20
- export declare const SidenavButton: React.ForwardRefExoticComponent<{
21
- /**
22
- * Whether the sidenav button is active,
23
- * i.e. the current page corresponds to this button.
24
- */
25
- isActive?: boolean | undefined;
26
- /**
27
- * Whether the sidenav button only has submenu open,
28
- * i.e. submenu is open but the current page does not correspond to this button.
29
- */
30
- isSubmenuOpen?: boolean | undefined;
31
- } & Omit<ButtonProps, "size" | "styleType"> & React.RefAttributes<HTMLButtonElement>>;
21
+ export declare const SidenavButton: SideNavButtonComponent;
32
22
  export default SidenavButton;
@@ -155,6 +155,11 @@ export declare type TableProps<T extends Record<string, unknown> = Record<string
155
155
  * @default false
156
156
  */
157
157
  isResizable?: boolean;
158
+ /**
159
+ * Style of the table.
160
+ * @default 'default'
161
+ */
162
+ styleType?: 'default' | 'zebra-rows';
158
163
  } & Omit<CommonProps, 'title'>;
159
164
  /**
160
165
  * Table based on [react-table](https://react-table.tanstack.com/docs/api/overview).
@@ -87,9 +87,9 @@ var tableResizeEndAction = 'tableResizeEnd';
87
87
  */
88
88
  export var Table = function (props) {
89
89
  var _a;
90
- var data = props.data, columns = props.columns, _b = props.isLoading, isLoading = _b === void 0 ? false : _b, emptyTableContent = props.emptyTableContent, className = props.className, style = props.style, id = props.id, _c = props.isSelectable, isSelectable = _c === void 0 ? false : _c, onSelect = props.onSelect, onRowClick = props.onRowClick, _d = props.isSortable, isSortable = _d === void 0 ? false : _d, onSort = props.onSort, stateReducer = props.stateReducer, onBottomReached = props.onBottomReached, onRowInViewport = props.onRowInViewport, _e = props.intersectionMargin, intersectionMargin = _e === void 0 ? 300 : _e, subComponent = props.subComponent, onExpand = props.onExpand, onFilter = props.onFilter, emptyFilteredTableContent = props.emptyFilteredTableContent, filterFunctions = props.filterTypes, expanderCell = props.expanderCell, isRowDisabled = props.isRowDisabled, rowProps = props.rowProps, _f = props.density, density = _f === void 0 ? 'default' : _f, _g = props.selectSubRows, selectSubRows = _g === void 0 ? true : _g, getSubRows = props.getSubRows, _h = props.selectRowOnClick, selectRowOnClick = _h === void 0 ? true : _h, paginatorRenderer = props.paginatorRenderer, _j = props.pageSize, pageSize = _j === void 0 ? 25 : _j, _k = props.isResizable, isResizable = _k === void 0 ? false : _k, rest = __rest(props, ["data", "columns", "isLoading", "emptyTableContent", "className", "style", "id", "isSelectable", "onSelect", "onRowClick", "isSortable", "onSort", "stateReducer", "onBottomReached", "onRowInViewport", "intersectionMargin", "subComponent", "onExpand", "onFilter", "emptyFilteredTableContent", "filterTypes", "expanderCell", "isRowDisabled", "rowProps", "density", "selectSubRows", "getSubRows", "selectRowOnClick", "paginatorRenderer", "pageSize", "isResizable"]);
90
+ var data = props.data, columns = props.columns, _b = props.isLoading, isLoading = _b === void 0 ? false : _b, emptyTableContent = props.emptyTableContent, className = props.className, style = props.style, id = props.id, _c = props.isSelectable, isSelectable = _c === void 0 ? false : _c, onSelect = props.onSelect, onRowClick = props.onRowClick, _d = props.isSortable, isSortable = _d === void 0 ? false : _d, onSort = props.onSort, stateReducer = props.stateReducer, onBottomReached = props.onBottomReached, onRowInViewport = props.onRowInViewport, _e = props.intersectionMargin, intersectionMargin = _e === void 0 ? 300 : _e, subComponent = props.subComponent, onExpand = props.onExpand, onFilter = props.onFilter, emptyFilteredTableContent = props.emptyFilteredTableContent, filterFunctions = props.filterTypes, expanderCell = props.expanderCell, isRowDisabled = props.isRowDisabled, rowProps = props.rowProps, _f = props.density, density = _f === void 0 ? 'default' : _f, _g = props.selectSubRows, selectSubRows = _g === void 0 ? true : _g, getSubRows = props.getSubRows, _h = props.selectRowOnClick, selectRowOnClick = _h === void 0 ? true : _h, paginatorRenderer = props.paginatorRenderer, _j = props.pageSize, pageSize = _j === void 0 ? 25 : _j, _k = props.isResizable, isResizable = _k === void 0 ? false : _k, _l = props.styleType, styleType = _l === void 0 ? 'default' : _l, rest = __rest(props, ["data", "columns", "isLoading", "emptyTableContent", "className", "style", "id", "isSelectable", "onSelect", "onRowClick", "isSortable", "onSort", "stateReducer", "onBottomReached", "onRowInViewport", "intersectionMargin", "subComponent", "onExpand", "onFilter", "emptyFilteredTableContent", "filterTypes", "expanderCell", "isRowDisabled", "rowProps", "density", "selectSubRows", "getSubRows", "selectRowOnClick", "paginatorRenderer", "pageSize", "isResizable", "styleType"]);
91
91
  useTheme();
92
- var _l = React.useState(), ownerDocument = _l[0], setOwnerDocument = _l[1];
92
+ var _m = React.useState(), ownerDocument = _m[0], setOwnerDocument = _m[1];
93
93
  var defaultColumn = React.useMemo(function () { return ({
94
94
  maxWidth: 0,
95
95
  minWidth: 0,
@@ -225,6 +225,8 @@ export var Table = function (props) {
225
225
  dispatch({ type: tableResizeEndAction, columnWidths: newColumnWidths_1 });
226
226
  }
227
227
  });
228
+ var headerRef = React.useRef(null);
229
+ var bodyRef = React.useRef(null);
228
230
  return (React.createElement(React.Fragment, null,
229
231
  React.createElement("div", __assign({ ref: function (element) {
230
232
  setOwnerDocument(element === null || element === void 0 ? void 0 : element.ownerDocument);
@@ -235,7 +237,7 @@ export var Table = function (props) {
235
237
  className: cx('iui-table', (_a = {}, _a["iui-" + density] = density !== 'default', _a), className),
236
238
  style: style,
237
239
  }), ariaDataAttributes),
238
- React.createElement("div", { className: 'iui-table-header' }, headerGroups.slice(1).map(function (headerGroup) {
240
+ React.createElement("div", { className: 'iui-table-header', ref: headerRef }, headerGroups.slice(1).map(function (headerGroup) {
239
241
  var headerGroupProps = headerGroup.getHeaderGroupProps({
240
242
  className: 'iui-row',
241
243
  });
@@ -258,8 +260,14 @@ export var Table = function (props) {
258
260
  })));
259
261
  })),
260
262
  React.createElement("div", __assign({}, getTableBodyProps({
261
- className: 'iui-table-body',
262
- })),
263
+ className: cx('iui-table-body', {
264
+ 'iui-zebra-striping': styleType === 'zebra-rows',
265
+ }),
266
+ }), { ref: bodyRef, onScroll: function () {
267
+ if (headerRef.current && bodyRef.current) {
268
+ headerRef.current.scrollLeft = bodyRef.current.scrollLeft;
269
+ }
270
+ } }),
263
271
  data.length !== 0 &&
264
272
  page.map(function (row) {
265
273
  prepareRow(row);
@@ -29,7 +29,6 @@ import cx from 'classnames';
29
29
  import '@itwin/itwinui-css/css/table.css';
30
30
  import SvgChevronLeft from '@itwin/itwinui-icons-react/cjs/icons/ChevronLeft';
31
31
  import SvgChevronRight from '@itwin/itwinui-icons-react/cjs/icons/ChevronRight';
32
- import { ButtonGroup } from '../ButtonGroup';
33
32
  import { IconButton, Button, DropdownButton } from '../Buttons';
34
33
  import { ProgressRadial } from '../ProgressIndicators';
35
34
  import { MenuItem } from '../Menu';
@@ -71,7 +70,7 @@ export var TablePaginator = function (props) {
71
70
  // Checking `isMounted.current` prevents from focusing on initial load.
72
71
  // Checking `needFocus.current` prevents from focusing page when clicked on previous/next page.
73
72
  if (isMounted.current && needFocus.current) {
74
- var buttonToFocus = Array.from((_b = (_a = pageListRef.current) === null || _a === void 0 ? void 0 : _a.querySelectorAll('.iui-button')) !== null && _b !== void 0 ? _b : []).find(function (el) { var _a; return ((_a = el.textContent) === null || _a === void 0 ? void 0 : _a.trim()) === (focusedIndex + 1).toString(); });
73
+ var buttonToFocus = Array.from((_b = (_a = pageListRef.current) === null || _a === void 0 ? void 0 : _a.querySelectorAll('.iui-paginator-page-button')) !== null && _b !== void 0 ? _b : []).find(function (el) { var _a; return ((_a = el.textContent) === null || _a === void 0 ? void 0 : _a.trim()) === (focusedIndex + 1).toString(); });
75
74
  (_c = buttonToFocus) === null || _c === void 0 ? void 0 : _c.focus();
76
75
  needFocus.current = false;
77
76
  }
@@ -80,7 +79,11 @@ export var TablePaginator = function (props) {
80
79
  var buttonSize = size != 'default' ? 'small' : undefined;
81
80
  var pageButton = React.useCallback(function (index, tabIndex) {
82
81
  if (tabIndex === void 0) { tabIndex = index === focusedIndex ? 0 : -1; }
83
- return (React.createElement(Button, { key: index, styleType: 'borderless', className: cx({ 'iui-active': index === currentPage }), onClick: function () { return onPageChange(index); }, "aria-current": index === currentPage, "aria-label": localization.goToPageLabel(index + 1), tabIndex: tabIndex, size: buttonSize }, index + 1));
82
+ return (React.createElement("div", { key: index },
83
+ React.createElement("button", { className: cx('iui-paginator-page-button', {
84
+ 'iui-active': index === currentPage,
85
+ 'iui-paginator-page-button-small': buttonSize === 'small',
86
+ }), onClick: function () { return onPageChange(index); }, "aria-current": index === currentPage, "aria-label": localization.goToPageLabel(index + 1), tabIndex: tabIndex }, index + 1)));
84
87
  }, [focusedIndex, currentPage, localization, buttonSize, onPageChange]);
85
88
  var totalPagesCount = Math.ceil(totalRowsCount / pageSize);
86
89
  var pageList = React.useMemo(function () {
@@ -142,7 +145,10 @@ export var TablePaginator = function (props) {
142
145
  var hasNoRows = totalPagesCount === 0;
143
146
  var showPagesList = totalPagesCount > 1 || isLoading;
144
147
  var showPageSizeList = pageSizeList && onPageSizeChange && !!totalRowsCount;
145
- var ellipsis = (React.createElement("span", { className: cx('iui-ellipsis', { 'iui-small': size === 'small' }) }, "\u2026"));
148
+ var ellipsis = (React.createElement("div", null,
149
+ React.createElement("span", { className: cx('iui-paginator-ellipsis', {
150
+ 'iui-paginator-ellipsis-small': size === 'small',
151
+ }) }, "\u2026")));
146
152
  var noRowsContent = (React.createElement(React.Fragment, null, isLoading ? (React.createElement(ProgressRadial, { indeterminate: true, size: 'small' })) : (React.createElement(Button, { styleType: 'borderless', disabled: true, size: buttonSize }, "1"))));
147
153
  if (!showPagesList && !showPageSizeList) {
148
154
  return null;
@@ -152,7 +158,7 @@ export var TablePaginator = function (props) {
152
158
  showPagesList && (React.createElement("div", { className: 'iui-center', ref: overflowRef },
153
159
  React.createElement(IconButton, { styleType: 'borderless', disabled: currentPage === 0, onClick: function () { return onPageChange(currentPage - 1); }, size: buttonSize, "aria-label": localization.previousPage },
154
160
  React.createElement(SvgChevronLeft, null)),
155
- React.createElement(ButtonGroup, { onKeyDown: onKeyDown, ref: pageListRef }, (function () {
161
+ React.createElement("span", { className: 'iui-paginator-pages-group', onKeyDown: onKeyDown, ref: pageListRef }, (function () {
156
162
  if (hasNoRows) {
157
163
  return noRowsContent;
158
164
  }
@@ -34,7 +34,7 @@ export var TableRow = function (props) {
34
34
  rootMargin: intersectionMargin + "px",
35
35
  });
36
36
  var userRowProps = rowProps === null || rowProps === void 0 ? void 0 : rowProps(row);
37
- var mergedProps = __assign(__assign(__assign({}, row.getRowProps({ style: { flex: "0 0 auto" } })), userRowProps), {
37
+ var mergedProps = __assign(__assign(__assign({}, row.getRowProps({ style: { flex: "0 0 auto", minWidth: '100%' } })), userRowProps), {
38
38
  className: cx('iui-row', {
39
39
  'iui-selected': row.isSelected,
40
40
  'iui-row-expanded': row.isExpanded && subComponent,
@@ -23,7 +23,9 @@ import { useTheme } from '../../utils';
23
23
  export var BaseFilter = function (props) {
24
24
  var children = props.children, className = props.className, style = props.style, id = props.id;
25
25
  useTheme();
26
- return (React.createElement("div", { className: cx('iui-column-filter', className), style: style, onClick: function (e) {
26
+ return (React.createElement("div", { className: cx('iui-column-filter', className), style: style,
27
+ // Prevents from triggering sort
28
+ onMouseDown: function (e) {
27
29
  e.stopPropagation();
28
30
  }, id: id }, children));
29
31
  };
@@ -48,8 +48,9 @@ export var FilterToggle = function (props) {
48
48
  close();
49
49
  }, [close, column]);
50
50
  return (React.createElement(React.Fragment, null, column.canFilter && column.Filter && (React.createElement(Popover, { content: column.render('Filter', { close: close, setFilter: setFilter, clearFilter: clearFilter }), placement: 'bottom-start', visible: isVisible, onClickOutside: close, appendTo: ownerDocument === null || ownerDocument === void 0 ? void 0 : ownerDocument.body },
51
- React.createElement(IconButton, __assign({ styleType: 'borderless', isActive: isVisible || column.filterValue, className: cx('iui-filter-button', className), onClick: function (e) {
52
- e.stopPropagation();
51
+ React.createElement(IconButton, __assign({ styleType: 'borderless', isActive: isVisible || column.filterValue, className: cx('iui-filter-button', className), onClick: function () {
53
52
  setIsVisible(function (v) { return !v; });
54
- } }, rest), column.filterValue ? React.createElement(SvgFilter, null) : React.createElement(SvgFilterHollow, null))))));
53
+ },
54
+ // Prevents from triggering sort
55
+ onMouseDown: function (e) { return e.stopPropagation(); } }, rest), column.filterValue ? React.createElement(SvgFilter, null) : React.createElement(SvgFilterHollow, null))))));
55
56
  };
@@ -110,11 +110,13 @@ var defaultGetResizerProps = function (ownerDocument) { return function (props,
110
110
  {
111
111
  onMouseDown: function (e) {
112
112
  e.persist();
113
+ // Prevents from triggering sort
113
114
  e.stopPropagation();
114
115
  onResizeStart(e, header);
115
116
  },
116
117
  onTouchStart: function (e) {
117
118
  e.persist();
119
+ // Prevents from triggering sort
118
120
  e.stopPropagation();
119
121
  onResizeStart(e, header);
120
122
  },
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ export declare const Anchor: React.ForwardRefExoticComponent<Pick<React.DetailedHTMLProps<React.AnchorHTMLAttributes<HTMLAnchorElement>, HTMLAnchorElement>, "key" | keyof React.AnchorHTMLAttributes<HTMLAnchorElement>> & React.RefAttributes<HTMLAnchorElement>>;
3
+ export default Anchor;
@@ -0,0 +1,35 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __rest = (this && this.__rest) || function (s, e) {
13
+ var t = {};
14
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
15
+ t[p] = s[p];
16
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
17
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
18
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
19
+ t[p[i]] = s[p[i]];
20
+ }
21
+ return t;
22
+ };
23
+ /*---------------------------------------------------------------------------------------------
24
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
25
+ * See LICENSE.md in the project root for license terms and full copyright notice.
26
+ *--------------------------------------------------------------------------------------------*/
27
+ import React from 'react';
28
+ import cx from 'classnames';
29
+ import { useTheme } from '../../utils';
30
+ export var Anchor = React.forwardRef(function (_a, ref) {
31
+ var className = _a.className, rest = __rest(_a, ["className"]);
32
+ useTheme();
33
+ return React.createElement("a", __assign({ className: cx('iui-anchor', className), ref: ref }, rest));
34
+ });
35
+ export default Anchor;
@@ -0,0 +1,3 @@
1
+ export { Anchor } from './Anchor';
2
+ declare const _default: "./Anchor";
3
+ export default _default;
@@ -0,0 +1,6 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ export { Anchor } from './Anchor';
6
+ export default './Anchor';
@@ -1,12 +1,7 @@
1
1
  import React from 'react';
2
- import { CommonProps } from '../../utils';
2
+ import { PolymorphicComponentProps, PolymorphicForwardRefComponent } from '../../utils';
3
3
  import '@itwin/itwinui-css/css/text.css';
4
- declare type TextOwnProps<T extends React.ElementType | React.ComponentType = 'div'> = {
5
- /**
6
- * What element should the text be rendered as?
7
- * @default 'div'
8
- */
9
- as?: T;
4
+ declare type TextOwnProps = {
10
5
  /**
11
6
  * Which typography variant/size should be used for the styling?
12
7
  *
@@ -30,8 +25,9 @@ declare type TextOwnProps<T extends React.ElementType | React.ComponentType = 'd
30
25
  * @default false
31
26
  */
32
27
  isSkeleton?: boolean;
33
- } & CommonProps;
34
- export declare type TextProps<T extends React.ElementType | React.ComponentType = 'div'> = TextOwnProps<T> & Omit<React.ComponentPropsWithoutRef<T>, keyof TextOwnProps<T>>;
28
+ };
29
+ export declare type TextProps<T extends React.ElementType = 'div'> = PolymorphicComponentProps<T, TextOwnProps>;
30
+ declare type TextComponent = PolymorphicForwardRefComponent<'div', TextOwnProps>;
35
31
  /**
36
32
  * Polymorphic typography component to render any kind of text as any kind of element.
37
33
  * @example
@@ -42,5 +38,5 @@ export declare type TextProps<T extends React.ElementType | React.ComponentType
42
38
  * <Text isMuted>Some muted text.</Text>
43
39
  * <Text isSkeleton>Skeleton text</Text>
44
40
  */
45
- export declare const Text: <T extends React.ElementType<any> | React.ComponentType<{}> = "div">(props: TextProps<T>) => JSX.Element;
41
+ export declare const Text: TextComponent;
46
42
  export default Text;
@@ -26,7 +26,7 @@ var __rest = (this && this.__rest) || function (s, e) {
26
26
  *--------------------------------------------------------------------------------------------*/
27
27
  import cx from 'classnames';
28
28
  import React from 'react';
29
- import { useTheme } from '../../utils';
29
+ import { useTheme, } from '../../utils';
30
30
  import '@itwin/itwinui-css/css/text.css';
31
31
  /**
32
32
  * Polymorphic typography component to render any kind of text as any kind of element.
@@ -38,7 +38,7 @@ import '@itwin/itwinui-css/css/text.css';
38
38
  * <Text isMuted>Some muted text.</Text>
39
39
  * <Text isSkeleton>Skeleton text</Text>
40
40
  */
41
- export var Text = function (props) {
41
+ export var Text = React.forwardRef(function (props, ref) {
42
42
  var _a;
43
43
  var _b = props.variant, variant = _b === void 0 ? 'body' : _b, _c = props.as, Element = _c === void 0 ? 'div' : _c, className = props.className, _d = props.isMuted, isMuted = _d === void 0 ? false : _d, _e = props.isSkeleton, isSkeleton = _e === void 0 ? false : _e, rest = __rest(props, ["variant", "as", "className", "isMuted", "isSkeleton"]);
44
44
  useTheme();
@@ -47,6 +47,6 @@ export var Text = function (props) {
47
47
  _a['iui-text-block'] = variant === 'body',
48
48
  _a['iui-text-muted'] = isMuted,
49
49
  _a['iui-skeleton'] = isSkeleton,
50
- _a), className) }, rest)));
51
- };
50
+ _a), className), ref: ref }, rest)));
51
+ });
52
52
  export default Text;
@@ -1,3 +1,4 @@
1
+ export { Anchor } from './Anchor';
1
2
  export { Headline } from './Headline';
2
3
  export type { HeadlineProps } from './Headline';
3
4
  export { Title } from './Title';
@@ -2,6 +2,7 @@
2
2
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
3
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
4
  *--------------------------------------------------------------------------------------------*/
5
+ export { Anchor } from './Anchor';
5
6
  export { Headline } from './Headline';
6
7
  export { Title } from './Title';
7
8
  export { Subheading } from './Subheading';
@@ -80,7 +80,7 @@ export { ToggleSwitch } from './ToggleSwitch';
80
80
  export type { ToggleSwitchProps } from './ToggleSwitch';
81
81
  export { Tooltip } from './Tooltip';
82
82
  export type { TooltipProps } from './Tooltip';
83
- export { Body, Headline, Leading, Small, Subheading, Title, Blockquote, Code, Kbd, KbdKeys, Text, } from './Typography';
83
+ export { Anchor, Body, Headline, Leading, Small, Subheading, Title, Blockquote, Code, Kbd, KbdKeys, Text, } from './Typography';
84
84
  export type { BodyProps, HeadlineProps, LeadingProps, SmallProps, SubheadingProps, TitleProps, BlockquoteProps, CodeProps, KbdProps, TextProps, } from './Typography';
85
85
  export { UserIcon } from './UserIcon';
86
86
  export type { UserIconProps, StatusTitles, UserIconStatus } from './UserIcon';
package/esm/core/index.js CHANGED
@@ -43,7 +43,7 @@ export { default as toaster } from './Toast';
43
43
  export { ThemeProvider } from './ThemeProvider';
44
44
  export { ToggleSwitch } from './ToggleSwitch';
45
45
  export { Tooltip } from './Tooltip';
46
- export { Body, Headline, Leading, Small, Subheading, Title, Blockquote, Code, Kbd, KbdKeys, Text, } from './Typography';
46
+ export { Anchor, Body, Headline, Leading, Small, Subheading, Title, Blockquote, Code, Kbd, KbdKeys, Text, } from './Typography';
47
47
  export { UserIcon } from './UserIcon';
48
48
  export { UserIconGroup } from './UserIconGroup';
49
49
  export { Wizard } from './Wizard';
@@ -20,20 +20,33 @@ export var useTheme = function (theme, themeOptions) {
20
20
  }
21
21
  }, [ownerDocument]);
22
22
  React.useLayoutEffect(function () {
23
- var _a, _b;
23
+ var _a, _b, _c, _d, _e;
24
24
  if (!ownerDocument) {
25
25
  return;
26
26
  }
27
+ var prefersDarkMediaQuery = (_b = (_a = getWindow()) === null || _a === void 0 ? void 0 : _a.matchMedia) === null || _b === void 0 ? void 0 : _b.call(_a, '(prefers-color-scheme: dark)');
28
+ var addOSTheme = function (_a) {
29
+ var isDark = _a.matches;
30
+ if (isDark) {
31
+ addDarkTheme(ownerDocument);
32
+ }
33
+ else {
34
+ addLightTheme(ownerDocument);
35
+ }
36
+ };
27
37
  switch (theme) {
28
38
  case 'light':
39
+ (_c = prefersDarkMediaQuery === null || prefersDarkMediaQuery === void 0 ? void 0 : prefersDarkMediaQuery.removeEventListener) === null || _c === void 0 ? void 0 : _c.call(prefersDarkMediaQuery, 'change', addOSTheme);
29
40
  addLightTheme(ownerDocument);
30
41
  break;
31
42
  case 'dark':
43
+ (_d = prefersDarkMediaQuery === null || prefersDarkMediaQuery === void 0 ? void 0 : prefersDarkMediaQuery.removeEventListener) === null || _d === void 0 ? void 0 : _d.call(prefersDarkMediaQuery, 'change', addOSTheme);
32
44
  addDarkTheme(ownerDocument);
33
45
  break;
34
46
  case 'os':
35
- if ((_b = (_a = getWindow()) === null || _a === void 0 ? void 0 : _a.matchMedia) === null || _b === void 0 ? void 0 : _b.call(_a, '(prefers-color-scheme: dark)').matches) {
36
- addDarkTheme(ownerDocument);
47
+ if (prefersDarkMediaQuery != undefined) {
48
+ addOSTheme(prefersDarkMediaQuery);
49
+ (_e = prefersDarkMediaQuery.addEventListener) === null || _e === void 0 ? void 0 : _e.call(prefersDarkMediaQuery, 'change', addOSTheme);
37
50
  }
38
51
  else {
39
52
  addLightTheme(ownerDocument);
@@ -44,6 +57,10 @@ export var useTheme = function (theme, themeOptions) {
44
57
  addLightTheme(ownerDocument);
45
58
  }
46
59
  }
60
+ return function () {
61
+ var _a;
62
+ (_a = prefersDarkMediaQuery === null || prefersDarkMediaQuery === void 0 ? void 0 : prefersDarkMediaQuery.removeEventListener) === null || _a === void 0 ? void 0 : _a.call(prefersDarkMediaQuery, 'change', addOSTheme);
63
+ };
47
64
  }, [ownerDocument, theme]);
48
65
  };
49
66
  var addLightTheme = function (ownerDocument) {