@deque/cauldron-react 6.27.0-canary.2c4ec65c → 6.27.0-canary.34834ec5

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.
@@ -1,8 +1,17 @@
1
1
  import React, { type ButtonHTMLAttributes, type Ref } from 'react';
2
- export interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
2
+ import type { TagSize } from '../Tag';
3
+ interface ButtonBaseProps extends ButtonHTMLAttributes<HTMLButtonElement> {
3
4
  buttonRef?: Ref<HTMLButtonElement>;
4
- variant?: 'primary' | 'secondary' | 'tertiary' | 'error' | 'danger' | 'danger-secondary' | 'link' | 'tag' | 'badge';
5
5
  thin?: boolean;
6
6
  }
7
+ interface ButtonTagProps extends ButtonBaseProps {
8
+ variant: 'tag';
9
+ size?: TagSize;
10
+ }
11
+ interface ButtonNonTagProps extends ButtonBaseProps {
12
+ variant?: 'primary' | 'secondary' | 'tertiary' | 'error' | 'danger' | 'danger-secondary' | 'link' | 'badge';
13
+ size?: never;
14
+ }
15
+ export type ButtonProps = ButtonTagProps | ButtonNonTagProps;
7
16
  declare const Button: React.ForwardRefExoticComponent<ButtonProps & React.RefAttributes<HTMLButtonElement>>;
8
17
  export default Button;
@@ -3,7 +3,7 @@ import { ContentNode } from '../../types';
3
3
  import Button from '../Button';
4
4
  import Tooltip from '../Tooltip';
5
5
  type ButtonProps = React.ComponentProps<typeof Button>;
6
- export interface CopyButtonProps extends Omit<ButtonProps, 'onCopy' | 'onClick'> {
6
+ export interface CopyButtonProps extends Omit<ButtonProps, 'onCopy' | 'onClick' | 'size'> {
7
7
  value: string;
8
8
  variant?: Extract<ButtonProps['variant'], 'primary' | 'secondary' | 'tertiary'>;
9
9
  children?: ContentNode;
@@ -6,6 +6,7 @@ interface DialogContextValue {
6
6
  onClose: () => void;
7
7
  forceAction: boolean;
8
8
  closeButtonText: string;
9
+ scrollable: boolean;
9
10
  }
10
11
  declare const DialogContext: React.Context<DialogContextValue | null>;
11
12
  declare function useDialogContext(): DialogContextValue;
@@ -12,6 +12,7 @@ export interface DialogProps extends React.HTMLAttributes<HTMLDivElement> {
12
12
  };
13
13
  closeButtonText?: string;
14
14
  portal?: React.RefObject<HTMLElement> | HTMLElement;
15
+ scrollable?: boolean;
15
16
  }
16
17
  declare const Dialog: React.ForwardRefExoticComponent<DialogProps & React.RefAttributes<HTMLDivElement>>;
17
18
  export default Dialog;
@@ -7,18 +7,6 @@ export interface IconButtonProps extends PolymorphicProps<React.HTMLAttributes<H
7
7
  label: React.ReactNode;
8
8
  tooltipProps?: Omit<TooltipProps, 'children' | 'target'>;
9
9
  disabled?: boolean;
10
- /**
11
- * @deprecated use `tooltipProps.placement` instead
12
- */
13
- tooltipPlacement?: TooltipProps['placement'];
14
- /**
15
- * @deprecated use `tooltipProps.variant` instead
16
- */
17
- tooltipVariant?: TooltipProps['variant'];
18
- /**
19
- * @deprecated use `tooltipProps.portal` instead
20
- */
21
- tooltipPortal?: TooltipProps['portal'];
22
10
  variant?: 'primary' | 'secondary' | 'tertiary' | 'error';
23
11
  large?: boolean;
24
12
  }
@@ -2,8 +2,9 @@ import React from 'react';
2
2
  import { DialogProps } from '../Dialog';
3
3
  interface ModalProps extends Omit<DialogProps, 'forceAction'> {
4
4
  variant?: 'info';
5
+ scrollable?: boolean;
5
6
  }
6
- declare const Modal: ({ children, className, variant, ...other }: ModalProps) => React.JSX.Element;
7
+ declare const Modal: ({ children, className, variant, scrollable, ...other }: ModalProps) => React.JSX.Element;
7
8
  declare const ModalHeader: {
8
9
  ({ children, className, ...other }: import("../Dialog").DialogHeaderProps): React.JSX.Element;
9
10
  displayName: string;
@@ -4,7 +4,9 @@ type SortDirection = 'ascending' | 'descending' | 'none';
4
4
  interface TableHeaderProps extends Omit<React.ThHTMLAttributes<HTMLTableHeaderCellElement>, 'align'> {
5
5
  sortDirection?: SortDirection;
6
6
  onSort?: () => void;
7
+ /** @deprecated No longer used. Sort state is communicated via aria-sort. */
7
8
  sortAscendingAnnouncement?: string;
9
+ /** @deprecated No longer used. Sort state is communicated via aria-sort. */
8
10
  sortDescendingAnnouncement?: string;
9
11
  align?: ColumnAlignment;
10
12
  variant?: 'header' | 'cell';
@@ -1,8 +1,9 @@
1
1
  import React from 'react';
2
+ export type TagSize = 'default' | 'small';
2
3
  interface TagProps {
3
4
  children: React.ReactNode;
4
5
  className?: string;
5
- size?: 'default' | 'small';
6
+ size?: TagSize;
6
7
  }
7
8
  export declare const TagLabel: {
8
9
  ({ children, className, ...other }: TagProps): React.JSX.Element;
@@ -1,11 +1,13 @@
1
- import React from 'react';
1
+ import React, { type ButtonHTMLAttributes } from 'react';
2
2
  import { IconType } from '../Icon';
3
3
  import { ContentNode } from '../../types';
4
- interface TagButtonProps extends React.HTMLAttributes<HTMLButtonElement> {
4
+ import { type TagSize } from '../Tag';
5
+ interface TagButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'value'> {
5
6
  label: ContentNode;
6
7
  value: ContentNode;
7
8
  icon: IconType;
8
9
  onClick: (e: React.MouseEvent<HTMLButtonElement>) => void;
10
+ size?: TagSize;
9
11
  }
10
12
  declare const TagButton: React.ForwardRefExoticComponent<TagButtonProps & React.RefAttributes<HTMLButtonElement>>;
11
13
  export default TagButton;
@@ -1,39 +1,19 @@
1
1
  import React from 'react';
2
- import AriaIsolate from '../../utils/aria-isolate';
3
2
  export interface ToastProps extends React.HTMLAttributes<HTMLDivElement> {
4
3
  type: 'confirmation' | 'caution' | 'error' | 'action-needed' | 'info';
5
- onDismiss: () => void;
4
+ onDismiss?: () => void;
6
5
  dismissText?: string;
7
- toastRef: React.Ref<HTMLDivElement>;
6
+ toastRef?: React.Ref<HTMLDivElement>;
8
7
  focus?: boolean;
9
8
  show?: boolean;
10
9
  dismissible?: boolean;
11
10
  children: React.ReactNode;
12
11
  }
13
- interface ToastState {
14
- animationClass: string;
15
- isolator?: AriaIsolate;
16
- }
17
12
  /**
18
13
  * The cauldron toast notification component
19
14
  */
20
- export default class Toast extends React.Component<ToastProps, ToastState> {
21
- static defaultProps: {
22
- dismissText: string;
23
- onDismiss: () => void;
24
- toastRef: () => void;
25
- focus: boolean;
26
- show: boolean;
27
- dismissible: boolean;
28
- };
29
- static displayName: string;
30
- private el;
31
- constructor(props: ToastProps);
32
- componentDidMount(): void;
33
- componentDidUpdate(prevProps: ToastProps): void;
34
- componentWillUnmount(): void;
35
- render(): React.JSX.Element;
36
- dismissToast(): void;
37
- showToast(): void;
38
- }
39
- export {};
15
+ declare const Toast: {
16
+ ({ type, children, onDismiss, dismissText, toastRef, focus, show, dismissible, className, ...otherProps }: ToastProps): React.JSX.Element;
17
+ displayName: string;
18
+ };
19
+ export default Toast;
package/lib/index.d.ts CHANGED
@@ -37,7 +37,7 @@ export { default as Sidebar, SideBarItem } from './components/SideBar';
37
37
  export { default as Code } from './components/Code';
38
38
  export { default as LoaderOverlay } from './components/LoaderOverlay';
39
39
  export { default as Line } from './components/Line';
40
- export { default as Tag, TagLabel } from './components/Tag';
40
+ export { default as Tag, TagLabel, type TagSize } from './components/Tag';
41
41
  export { default as Badge, BadgeLabel } from './components/Badge';
42
42
  export { default as ImpactBadge } from './components/ImpactBadge';
43
43
  export { default as TagButton } from './components/TagButton';
package/lib/index.js CHANGED
@@ -1532,9 +1532,9 @@ var isEscape = function (event) {
1532
1532
  return event.key === 'Escape' || event.key === 'Esc' || event.keyCode === 27;
1533
1533
  };
1534
1534
  var Dialog = React.forwardRef(function (_a, ref) {
1535
- var dialogRefProp = _a.dialogRef, _b = _a.forceAction, forceAction = _b === void 0 ? false : _b, className = _a.className, children = _a.children, _c = _a.closeButtonText, closeButtonText = _c === void 0 ? 'Close' : _c, heading = _a.heading, _d = _a.show, show = _d === void 0 ? false : _d, portal = _a.portal, _e = _a.onClose, onClose = _e === void 0 ? function () { return null; } : _e, other = tslib.__rest(_a, ["dialogRef", "forceAction", "className", "children", "closeButtonText", "heading", "show", "portal", "onClose"]);
1535
+ var dialogRefProp = _a.dialogRef, _b = _a.forceAction, forceAction = _b === void 0 ? false : _b, className = _a.className, children = _a.children, _c = _a.closeButtonText, closeButtonText = _c === void 0 ? 'Close' : _c, heading = _a.heading, _d = _a.show, show = _d === void 0 ? false : _d, portal = _a.portal, _e = _a.scrollable, scrollable = _e === void 0 ? false : _e, _f = _a.onClose, onClose = _f === void 0 ? function () { return null; } : _f, other = tslib.__rest(_a, ["dialogRef", "forceAction", "className", "children", "closeButtonText", "heading", "show", "portal", "scrollable", "onClose"]);
1536
1536
  var dialogRef = useSharedRef(dialogRefProp || ref);
1537
- var _f = tslib.__read(nextId.useId(1, 'dialog-title-'), 1), headingId = _f[0];
1537
+ var _g = tslib.__read(nextId.useId(1, 'dialog-title-'), 1), headingId = _g[0];
1538
1538
  var headingRef = React.useRef(null);
1539
1539
  var isolatorRef = React.useRef();
1540
1540
  var headingLevel = typeof heading === 'object' && 'level' in heading && heading.level
@@ -1605,14 +1605,16 @@ var Dialog = React.forwardRef(function (_a, ref) {
1605
1605
  headingLevel: headingLevel,
1606
1606
  onClose: handleClose,
1607
1607
  forceAction: forceAction,
1608
- closeButtonText: closeButtonText
1608
+ closeButtonText: closeButtonText,
1609
+ scrollable: scrollable
1609
1610
  }); }, [
1610
1611
  headingId,
1611
1612
  headingRef,
1612
1613
  headingLevel,
1613
1614
  handleClose,
1614
1615
  forceAction,
1615
- closeButtonText
1616
+ closeButtonText,
1617
+ scrollable
1616
1618
  ]);
1617
1619
  if (!show || !isBrowser()) {
1618
1620
  return null;
@@ -1642,11 +1644,12 @@ var Dialog = React.forwardRef(function (_a, ref) {
1642
1644
  Dialog.displayName = 'Dialog';
1643
1645
  var DialogContent = function (_a) {
1644
1646
  var children = _a.children, className = _a.className, align = _a.align, other = tslib.__rest(_a, ["children", "className", "align"]);
1647
+ var context = React.useContext(DialogContext);
1645
1648
  return (React__default["default"].createElement("div", tslib.__assign({ className: classNames__default["default"]('Dialog__content', className, {
1646
1649
  'text--align-left': align === 'left',
1647
1650
  'text--align-center': align === 'center',
1648
1651
  'text--align-right': align === 'right'
1649
- }) }, other), children));
1652
+ }), tabIndex: (context === null || context === void 0 ? void 0 : context.scrollable) ? -1 : undefined }, other), children));
1650
1653
  };
1651
1654
  DialogContent.displayName = 'DialogContent';
1652
1655
  var DialogFooter = function (_a) {
@@ -1700,10 +1703,11 @@ var AlertContent = DialogContent;
1700
1703
  var AlertActions = DialogFooter;
1701
1704
 
1702
1705
  var Modal = function (_a) {
1703
- var children = _a.children, className = _a.className, variant = _a.variant, other = tslib.__rest(_a, ["children", "className", "variant"]);
1706
+ var children = _a.children, className = _a.className, variant = _a.variant, scrollable = _a.scrollable, other = tslib.__rest(_a, ["children", "className", "variant", "scrollable"]);
1704
1707
  return (React__default["default"].createElement(Dialog, tslib.__assign({ className: classNames__default["default"]('Modal', className, {
1705
- 'Modal--info': variant === 'info'
1706
- }) }, other, { forceAction: false }), children));
1708
+ 'Modal--info': variant === 'info',
1709
+ 'Modal--scrollable': scrollable
1710
+ }) }, other, { scrollable: scrollable, forceAction: false }), children));
1707
1711
  };
1708
1712
  var ModalHeader = DialogHeader;
1709
1713
  var ModalHeading = DialogHeading;
@@ -1768,7 +1772,7 @@ var SkipLink = /** @class */ (function (_super) {
1768
1772
  }(React__default["default"].Component));
1769
1773
 
1770
1774
  var Button = React.forwardRef(function (_a, ref) {
1771
- var _b = _a.variant, variant = _b === void 0 ? 'primary' : _b, thin = _a.thin, children = _a.children, className = _a.className, buttonRef = _a.buttonRef, other = tslib.__rest(_a, ["variant", "thin", "children", "className", "buttonRef"]);
1775
+ var _b = _a.variant, variant = _b === void 0 ? 'primary' : _b, thin = _a.thin, size = _a.size, children = _a.children, className = _a.className, buttonRef = _a.buttonRef, other = tslib.__rest(_a, ["variant", "thin", "size", "children", "className", "buttonRef"]);
1772
1776
  return (React__default["default"].createElement("button", tslib.__assign({ type: "button", className: classNames__default["default"](className, {
1773
1777
  'Button--primary': variant === 'primary',
1774
1778
  'Button--secondary': variant === 'secondary',
@@ -1779,6 +1783,7 @@ var Button = React.forwardRef(function (_a, ref) {
1779
1783
  Link: variant === 'link',
1780
1784
  Tag: variant === 'tag',
1781
1785
  'Button--tag': variant === 'tag',
1786
+ 'Tag--small': variant === 'tag' && size === 'small',
1782
1787
  'Button--thin': thin,
1783
1788
  'Button--badge': variant === 'badge'
1784
1789
  }), ref: ref || buttonRef }, other), children));
@@ -2028,10 +2033,17 @@ function Tooltip(_a) {
2028
2033
  fireCustomEvent(false, targetElement);
2029
2034
  }, TIP_HIDE_DELAY);
2030
2035
  }
2036
+ }, [target]);
2037
+ // Cancel any pending hide timeout when the Tooltip unmounts so it
2038
+ // does not fire setShowTooltip on an unmounted component.
2039
+ React.useEffect(function () {
2031
2040
  return function () {
2032
- clearTimeout(hideTimeoutRef.current);
2041
+ if (hideTimeoutRef.current) {
2042
+ clearTimeout(hideTimeoutRef.current);
2043
+ hideTimeoutRef.current = null;
2044
+ }
2033
2045
  };
2034
- }, [target]);
2046
+ }, []);
2035
2047
  React.useEffect(function () {
2036
2048
  if (typeof showProp === 'boolean') {
2037
2049
  setShowTooltip(showProp);
@@ -2118,7 +2130,7 @@ var looksLikeLink = function (props) {
2118
2130
  return 'to' in props || 'href' in props;
2119
2131
  };
2120
2132
  var IconButton = React.forwardRef(function (_a, ref) {
2121
- var _b = _a.as, Component = _b === void 0 ? 'button' : _b, icon = _a.icon, label = _a.label, tooltipPlacement = _a.tooltipPlacement, tooltipVariant = _a.tooltipVariant, tooltipPortal = _a.tooltipPortal, _c = _a.tooltipProps, tooltipPropsProp = _c === void 0 ? {} : _c, className = _a.className, _d = _a.variant, variant = _d === void 0 ? 'secondary' : _d, disabled = _a.disabled, _e = _a.tabIndex, tabIndex = _e === void 0 ? 0 : _e, large = _a.large, other = tslib.__rest(_a, ["as", "icon", "label", "tooltipPlacement", "tooltipVariant", "tooltipPortal", "tooltipProps", "className", "variant", "disabled", "tabIndex", "large"]);
2133
+ var _b = _a.as, Component = _b === void 0 ? 'button' : _b, icon = _a.icon, label = _a.label, _c = _a.tooltipProps, tooltipPropsProp = _c === void 0 ? {} : _c, className = _a.className, _d = _a.variant, variant = _d === void 0 ? 'secondary' : _d, disabled = _a.disabled, _e = _a.tabIndex, tabIndex = _e === void 0 ? 0 : _e, large = _a.large, other = tslib.__rest(_a, ["as", "icon", "label", "tooltipProps", "className", "variant", "disabled", "tabIndex", "large"]);
2122
2134
  var internalRef = React.useRef();
2123
2135
  React.useImperativeHandle(ref, function () { return internalRef.current; });
2124
2136
  // Configure additional properties based on the type of the Component
@@ -2136,15 +2148,7 @@ var IconButton = React.forwardRef(function (_a, ref) {
2136
2148
  accessibilityProps['aria-disabled'] = disabled;
2137
2149
  }
2138
2150
  }
2139
- if (process.env.NODE_ENV !== 'production') {
2140
- if (!!tooltipPlacement || !!tooltipVariant || !!tooltipPortal) {
2141
- React__default["default"].useEffect(function () {
2142
- console.warn('[IconButton] The following props are deprecated: tooltipPlacement, tooltipVariant, tooltipPortal. ' +
2143
- 'See https://cauldron.dequelabs.com/components/IconButton for recommended replacement.');
2144
- }, []);
2145
- }
2146
- }
2147
- var tooltipProps = tslib.__assign({ placement: tooltipPlacement || 'auto', variant: tooltipVariant, portal: tooltipPortal, association: 'aria-labelledby', hideElementOnHidden: true }, tooltipPropsProp);
2151
+ var tooltipProps = tslib.__assign({ placement: 'auto', association: 'aria-labelledby', hideElementOnHidden: true }, tooltipPropsProp);
2148
2152
  return (React__default["default"].createElement(React__default["default"].Fragment, null,
2149
2153
  React__default["default"].createElement(Component, tslib.__assign({ className: classNames__default["default"](className, {
2150
2154
  IconButton: true,
@@ -2216,126 +2220,110 @@ var tabIndexHandler = function (reset, toast) {
2216
2220
  };
2217
2221
 
2218
2222
  /**
2219
- * The cauldron toast notification component
2223
+ * Hook to be used similarly to the React.Component#componentDidMount.
2224
+ * Executes the provided `effect` when `dependencies` change but does not
2225
+ * execute the effect initially (on mount) - only on update.
2226
+ *
2227
+ * @param effect {Function} function to be executed when dependencies update
2228
+ * @param dependencies {Any} any valid dependency argument to React.useEffect
2220
2229
  */
2221
- var Toast = /** @class */ (function (_super) {
2222
- tslib.__extends(Toast, _super);
2223
- function Toast(props) {
2224
- var _this = _super.call(this, props) || this;
2225
- _this.state = {
2226
- animationClass: props.show ? 'FadeIn--flex' : 'is--hidden'
2227
- };
2228
- _this.dismissToast = _this.dismissToast.bind(_this);
2229
- _this.showToast = _this.showToast.bind(_this);
2230
- return _this;
2231
- }
2232
- Toast.prototype.componentDidMount = function () {
2233
- var show = this.props.show;
2234
- if (show) {
2235
- // Timeout because CSS display: none/block and opacity:
2236
- // 0/1 properties cannot be toggled in the same tick
2237
- // see: https://codepen.io/isnerms/pen/eyQaLP
2238
- setTimeout(this.showToast);
2230
+ var useDidUpdate = function (effect, dependencies) {
2231
+ var mounted = React__default["default"].useRef(false);
2232
+ React__default["default"].useEffect(function () {
2233
+ if (!mounted.current) {
2234
+ mounted.current = true;
2235
+ return;
2239
2236
  }
2237
+ effect();
2238
+ }, dependencies);
2239
+ };
2240
+
2241
+ /**
2242
+ * The cauldron toast notification component
2243
+ */
2244
+ var Toast = function (_a) {
2245
+ var type = _a.type, children = _a.children, _b = _a.onDismiss, onDismiss = _b === void 0 ? function () {
2246
+ // noop
2247
+ } : _b, _c = _a.dismissText, dismissText = _c === void 0 ? 'Dismiss' : _c, toastRef = _a.toastRef, _d = _a.focus, focus = _d === void 0 ? true : _d, _e = _a.show, show = _e === void 0 ? false : _e, _f = _a.dismissible, dismissible = _f === void 0 ? true : _f, className = _a.className, otherProps = tslib.__rest(_a, ["type", "children", "onDismiss", "dismissText", "toastRef", "focus", "show", "dismissible", "className"]);
2248
+ var elRef = useSharedRef(toastRef !== null && toastRef !== void 0 ? toastRef : null);
2249
+ var isolatorRef = React.useRef(null);
2250
+ var timeoutsRef = React.useRef(new Set());
2251
+ var _g = tslib.__read(React.useState(show ? 'FadeIn--flex' : 'is--hidden'), 2), animationClass = _g[0], setAnimationClass = _g[1];
2252
+ // Timeout because CSS display: none/block and opacity:
2253
+ // 0/1 properties cannot be toggled in the same tick
2254
+ // see: https://codepen.io/isnerms/pen/eyQaLP
2255
+ var scheduleNextTick = function (fn) {
2256
+ var id = setTimeout(function () {
2257
+ timeoutsRef.current.delete(id);
2258
+ fn();
2259
+ });
2260
+ timeoutsRef.current.add(id);
2240
2261
  };
2241
- Toast.prototype.componentDidUpdate = function (prevProps) {
2242
- var _this = this;
2243
- var show = this.props.show;
2244
- if (prevProps.show !== show) {
2245
- if (show) {
2246
- this.setState({ animationClass: 'FadeIn--flex' }, function () {
2247
- setTimeout(_this.showToast);
2248
- });
2249
- }
2250
- else {
2251
- this.dismissToast();
2252
- }
2262
+ var showToast = React.useCallback(function () {
2263
+ setAnimationClass('FadeIn--flex FadeIn');
2264
+ if (type === 'action-needed' && elRef.current) {
2265
+ var isolator = new AriaIsolate(elRef.current);
2266
+ tabIndexHandler(false, elRef.current);
2267
+ isolatorRef.current = isolator;
2268
+ isolator.activate();
2253
2269
  }
2254
- };
2255
- Toast.prototype.componentWillUnmount = function () {
2256
- var isolator = this.state.isolator;
2257
- isolator === null || isolator === void 0 ? void 0 : isolator.deactivate();
2258
- };
2259
- Toast.prototype.render = function () {
2260
- var _this = this;
2261
- var animationClass = this.state.animationClass;
2262
- var _a = this.props, type = _a.type, children = _a.children;
2263
- // prevent `onDismiss` from being passed-through to DOM
2264
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
2265
- _a.onDismiss; var dismissText = _a.dismissText, toastRef = _a.toastRef, focus = _a.focus, show = _a.show, dismissible = _a.dismissible, className = _a.className, otherProps = tslib.__rest(_a, ["type", "children", "onDismiss", "dismissText", "toastRef", "focus", "show", "dismissible", "className"]);
2266
- var scrim = type === 'action-needed' && show ? (React__default["default"].createElement("div", { className: "Scrim--light Scrim--show Scrim--fade-in" })) : null;
2267
- var defaultProps = {
2268
- tabIndex: -1,
2269
- className: classNames__default["default"]('Toast', "Toast--".concat(typeMap[type].className), animationClass, { 'Toast--non-dismissible': !dismissible }, className)
2270
- };
2271
- if (!focus) {
2272
- defaultProps.role = 'alert';
2270
+ if (elRef.current && !!focus) {
2271
+ elRef.current.focus();
2273
2272
  }
2274
- return (React__default["default"].createElement(React__default["default"].Fragment, null,
2275
- React__default["default"].createElement("div", tslib.__assign({ ref: function (el) {
2276
- _this.el = el;
2277
- setRef(toastRef, el);
2278
- } }, defaultProps, otherProps),
2279
- React__default["default"].createElement("div", { className: "Toast__message" },
2280
- React__default["default"].createElement(Icon, { type: typeMap[type].icon }),
2281
- React__default["default"].createElement("div", { className: "Toast__message-content" }, children)),
2282
- type !== 'action-needed' && dismissible && (React__default["default"].createElement("button", { type: "button", className: 'Toast__dismiss', "aria-label": dismissText, onClick: this.dismissToast },
2283
- React__default["default"].createElement(Icon, { type: "close" })))),
2284
- scrim));
2285
- };
2286
- Toast.prototype.dismissToast = function () {
2287
- var _this = this;
2288
- if (!this.el) {
2273
+ }, [type, focus]);
2274
+ var dismissToast = React.useCallback(function () {
2275
+ if (!elRef.current) {
2289
2276
  return;
2290
2277
  }
2291
- var _a = this.props, onDismiss = _a.onDismiss, type = _a.type;
2292
- var isolator = this.state.isolator;
2293
- this.setState({
2294
- animationClass: 'FadeIn--flex'
2295
- }, function () {
2296
- // Timeout because CSS display: none/block and opacity:
2297
- // 0/1 properties cannot be toggled in the same tick
2298
- // see: https://codepen.io/isnerms/pen/eyQaLP
2299
- setTimeout(function () {
2300
- if (type === 'action-needed') {
2301
- tabIndexHandler(true, _this.el);
2302
- isolator === null || isolator === void 0 ? void 0 : isolator.deactivate();
2303
- }
2304
- _this.setState({ animationClass: 'is--hidden' }, onDismiss);
2305
- });
2306
- });
2307
- };
2308
- Toast.prototype.showToast = function () {
2309
- var _this = this;
2310
- var _a = this.props, type = _a.type, focus = _a.focus;
2311
- this.setState({
2312
- animationClass: 'FadeIn--flex FadeIn'
2313
- }, function () {
2278
+ setAnimationClass('FadeIn--flex');
2279
+ scheduleNextTick(function () {
2280
+ var _a;
2314
2281
  if (type === 'action-needed') {
2315
- var isolator = new AriaIsolate(_this.el);
2316
- tabIndexHandler(false, _this.el);
2317
- _this.setState({ isolator: isolator });
2318
- isolator.activate();
2319
- }
2320
- if (_this.el && !!focus) {
2321
- // focus the toast
2322
- _this.el.focus();
2282
+ tabIndexHandler(true, elRef.current);
2283
+ (_a = isolatorRef.current) === null || _a === void 0 ? void 0 : _a.deactivate();
2323
2284
  }
2285
+ setAnimationClass('is--hidden');
2286
+ onDismiss();
2324
2287
  });
2288
+ }, [type, onDismiss]);
2289
+ React.useEffect(function () {
2290
+ if (show) {
2291
+ scheduleNextTick(showToast);
2292
+ }
2293
+ return function () {
2294
+ var _a;
2295
+ timeoutsRef.current.forEach(clearTimeout);
2296
+ timeoutsRef.current.clear();
2297
+ (_a = isolatorRef.current) === null || _a === void 0 ? void 0 : _a.deactivate();
2298
+ };
2299
+ }, []);
2300
+ useDidUpdate(function () {
2301
+ if (show) {
2302
+ setAnimationClass('FadeIn--flex');
2303
+ scheduleNextTick(showToast);
2304
+ }
2305
+ else {
2306
+ dismissToast();
2307
+ }
2308
+ }, [show]);
2309
+ var scrim = type === 'action-needed' && show ? (React__default["default"].createElement("div", { className: "Scrim--light Scrim--show Scrim--fade-in" })) : null;
2310
+ var defaultProps = {
2311
+ tabIndex: -1,
2312
+ className: classNames__default["default"]('Toast', "Toast--".concat(typeMap[type].className), animationClass, { 'Toast--non-dismissible': !dismissible }, className)
2325
2313
  };
2326
- Toast.defaultProps = {
2327
- dismissText: 'Dismiss',
2328
- // eslint-disable-next-line @typescript-eslint/no-empty-function
2329
- onDismiss: function () { },
2330
- // eslint-disable-next-line @typescript-eslint/no-empty-function
2331
- toastRef: function () { },
2332
- focus: true,
2333
- show: false,
2334
- dismissible: true
2335
- };
2336
- Toast.displayName = 'Toast';
2337
- return Toast;
2338
- }(React__default["default"].Component));
2314
+ if (!focus) {
2315
+ defaultProps.role = 'alert';
2316
+ }
2317
+ return (React__default["default"].createElement(React__default["default"].Fragment, null,
2318
+ React__default["default"].createElement("div", tslib.__assign({ ref: elRef }, defaultProps, otherProps),
2319
+ React__default["default"].createElement("div", { className: "Toast__message" },
2320
+ React__default["default"].createElement(Icon, { type: typeMap[type].icon }),
2321
+ React__default["default"].createElement("div", { className: "Toast__message-content" }, children)),
2322
+ type !== 'action-needed' && dismissible && (React__default["default"].createElement("button", { type: "button", className: "Toast__dismiss", "aria-label": dismissText, onClick: dismissToast },
2323
+ React__default["default"].createElement(Icon, { type: "close" })))),
2324
+ scrim));
2325
+ };
2326
+ Toast.displayName = 'Toast';
2339
2327
 
2340
2328
  var Link = React.forwardRef(function (_a, ref) {
2341
2329
  var children = _a.children, linkRef = _a.linkRef, className = _a.className, variant = _a.variant, thin = _a.thin, other = tslib.__rest(_a, ["children", "linkRef", "className", "variant", "thin"]);
@@ -3042,8 +3030,8 @@ var ImpactBadge = React.forwardRef(function (_a, ref) {
3042
3030
  ImpactBadge.displayName = 'ImpactBadge';
3043
3031
 
3044
3032
  var TagButton = React__default["default"].forwardRef(function (_a, ref) {
3045
- var label = _a.label, value = _a.value, icon = _a.icon, className = _a.className, rest = tslib.__rest(_a, ["label", "value", "icon", "className"]);
3046
- return (React__default["default"].createElement(Button, tslib.__assign({ variant: "tag", className: classNames__default["default"]('TagButton', className), ref: ref }, rest),
3033
+ var label = _a.label, value = _a.value, icon = _a.icon, className = _a.className, size = _a.size, rest = tslib.__rest(_a, ["label", "value", "icon", "className", "size"]);
3034
+ return (React__default["default"].createElement(Button, tslib.__assign({ variant: "tag", className: classNames__default["default"]('TagButton', className), size: size, ref: ref }, rest),
3047
3035
  React__default["default"].createElement(TagLabel, null, label),
3048
3036
  value,
3049
3037
  React__default["default"].createElement(Icon, { className: "TagButton__icon", type: icon })));
@@ -3186,23 +3174,25 @@ var TableHead = React.forwardRef(function (_a, ref) {
3186
3174
  TableHead.displayName = 'TableHead';
3187
3175
 
3188
3176
  var TableHeader = React.forwardRef(function (_a, ref) {
3189
- var children = _a.children, sortDirection = _a.sortDirection, onSort = _a.onSort, className = _a.className, _b = _a.sortAscendingAnnouncement, sortAscendingAnnouncement = _b === void 0 ? 'sorted ascending' : _b, _c = _a.sortDescendingAnnouncement, sortDescendingAnnouncement = _c === void 0 ? 'sorted descending' : _c, align = _a.align, _d = _a.variant, variant = _d === void 0 ? 'header' : _d, style = _a.style, other = tslib.__rest(_a, ["children", "sortDirection", "onSort", "className", "sortAscendingAnnouncement", "sortDescendingAnnouncement", "align", "variant", "style"]);
3177
+ var children = _a.children, sortDirection = _a.sortDirection, onSort = _a.onSort, className = _a.className, _sortAscendingAnnouncement = _a.sortAscendingAnnouncement, _sortDescendingAnnouncement = _a.sortDescendingAnnouncement, align = _a.align, _b = _a.variant, variant = _b === void 0 ? 'header' : _b, style = _a.style, other = tslib.__rest(_a, ["children", "sortDirection", "onSort", "className", "sortAscendingAnnouncement", "sortDescendingAnnouncement", "align", "variant", "style"]);
3190
3178
  var tableHeaderRef = useSharedRef(ref);
3191
- var _e = useTable(), layout = _e.layout, columns = _e.columns;
3179
+ var _c = useTable(), layout = _c.layout, columns = _c.columns;
3192
3180
  var tableGridStyles = useTableGridStyles({
3193
3181
  elementRef: tableHeaderRef,
3194
3182
  align: align,
3195
3183
  columns: columns,
3196
3184
  layout: layout
3197
3185
  });
3198
- // When the sort direction changes, we want to announce the change in a live region
3199
- // because changes to the sort value is not widely supported yet
3200
- // see: https://a11ysupport.io/tech/aria/aria-sort_attribute
3201
- var announcement = sortDirection === 'ascending'
3202
- ? sortAscendingAnnouncement
3203
- : sortDirection === 'descending'
3204
- ? sortDescendingAnnouncement
3205
- : '';
3186
+ React.useEffect(function () {
3187
+ if (process.env.NODE_ENV === 'production')
3188
+ return;
3189
+ if (_sortAscendingAnnouncement !== undefined ||
3190
+ _sortDescendingAnnouncement !== undefined) {
3191
+ console.warn('[TableHeader] The following props are deprecated and no longer used: sortAscendingAnnouncement, sortDescendingAnnouncement. ' +
3192
+ 'Sort state is communicated via aria-sort. ' +
3193
+ 'See https://cauldron.dequelabs.com/components/Table for more information.');
3194
+ }
3195
+ }, [_sortAscendingAnnouncement, _sortDescendingAnnouncement]);
3206
3196
  return (React__default["default"].createElement("th", tslib.__assign({ ref: tableHeaderRef, "aria-sort": sortDirection, className: classNames__default["default"](variant === 'cell'
3207
3197
  ? ['TableCell', 'TableHeader--cell-variant']
3208
3198
  : 'TableHeader', className, {
@@ -3210,9 +3200,7 @@ var TableHeader = React.forwardRef(function (_a, ref) {
3210
3200
  'TableHeader--sort-descending': sortDirection === 'descending'
3211
3201
  }), style: tslib.__assign(tslib.__assign({}, tableGridStyles), style) }, other), !!onSort && !!sortDirection ? (React__default["default"].createElement("button", { onClick: onSort, className: "TableHeader__sort-button", type: "button" },
3212
3202
  children,
3213
- React__default["default"].createElement("span", { "aria-hidden": "true" }, sortDirection === 'none' ? (React__default["default"].createElement(Icon, { type: "sort-triangle" })) : sortDirection === 'ascending' ? (React__default["default"].createElement(Icon, { type: "table-sort-ascending" })) : (React__default["default"].createElement(Icon, { type: "table-sort-descending" }))),
3214
- React__default["default"].createElement(Offscreen, null,
3215
- React__default["default"].createElement("span", { role: "status", "aria-live": "polite" }, announcement)))) : (children)));
3203
+ React__default["default"].createElement("span", { "aria-hidden": "true" }, sortDirection === 'none' ? (React__default["default"].createElement(Icon, { type: "sort-triangle" })) : sortDirection === 'ascending' ? (React__default["default"].createElement(Icon, { type: "table-sort-ascending" })) : (React__default["default"].createElement(Icon, { type: "table-sort-descending" }))))) : (children)));
3216
3204
  });
3217
3205
  TableHeader.displayName = 'TableHeader';
3218
3206
 
@@ -3234,25 +3222,6 @@ var Tab = React__default["default"].forwardRef(function (_a, ref) {
3234
3222
  });
3235
3223
  Tab.displayName = 'Tab';
3236
3224
 
3237
- /**
3238
- * Hook to be used similarly to the React.Component#componentDidMount.
3239
- * Executes the provided `effect` when `dependencies` change but does not
3240
- * execute the effect initially (on mount) - only on update.
3241
- *
3242
- * @param effect {Function} function to be executed when dependencies update
3243
- * @param dependencies {Any} any valid dependency argument to React.useEffect
3244
- */
3245
- var useDidUpdate = function (effect, dependencies) {
3246
- var mounted = React__default["default"].useRef(false);
3247
- React__default["default"].useEffect(function () {
3248
- if (!mounted.current) {
3249
- mounted.current = true;
3250
- return;
3251
- }
3252
- effect();
3253
- }, dependencies);
3254
- };
3255
-
3256
3225
  var Tabs = function (_a) {
3257
3226
  var children = _a.children, thin = _a.thin, _b = _a.orientation, orientation = _b === void 0 ? 'horizontal' : _b, _c = _a.initialActiveIndex, initialActiveIndex = _c === void 0 ? 0 : _c, className = _a.className, onChange = _a.onChange, labelProp = tslib.__rest(_a, ["children", "thin", "orientation", "initialActiveIndex", "className", "onChange"]);
3258
3227
  var _d = tslib.__read(React.useState(initialActiveIndex), 2), activeIndex = _d[0], setActiveIndex = _d[1];
@@ -4609,16 +4578,6 @@ var Combobox = React.forwardRef(function (_a, ref) {
4609
4578
  : ComboboxNoResults;
4610
4579
  }, [renderNoResults]);
4611
4580
  var noMatchingOptions = !!inputValue && !matchingOptions.size && (React__default["default"].createElement(NoMatchingOptions, null));
4612
- var comboboxListbox = (
4613
- // eslint-disable-next-line
4614
- // @ts-expect-error
4615
- // multiselect & value props are passed to Listbox, but TS is unable to infer that
4616
- // it's a correct mapping from Combobox's multiselect & value props
4617
- React__default["default"].createElement(Listbox, { className: classNames__default["default"]('Combobox__listbox', {
4618
- 'Combobox__listbox--open': open
4619
- }), role: noMatchingOptions ? 'presentation' : 'listbox', "aria-labelledby": noMatchingOptions ? undefined : "".concat(id, "-label"), id: "".concat(id, "-listbox"), value: multiselect ? selectedValues : selectedValues[0], onMouseDown: handleComboboxOptionMouseDown, onClick: handleComboboxOptionClick, onSelectionChange: handleSelectionChange, onActiveChange: handleActiveChange, ref: listboxRef, tabIndex: noMatchingOptions ? undefined : -1, "aria-activedescendant": undefined, multiselect: multiselect, disabled: disabled },
4620
- comboboxOptions,
4621
- noMatchingOptions));
4622
4581
  var errorId = "".concat(id, "-error");
4623
4582
  var descriptionId = "".concat(id, "-description");
4624
4583
  var describedby = ariaDescribedby;
@@ -4629,6 +4588,16 @@ var Combobox = React.forwardRef(function (_a, ref) {
4629
4588
  describedby = addIdRef(describedby, errorId);
4630
4589
  }
4631
4590
  var inputProps = tslib.__assign(tslib.__assign({}, props), { 'aria-describedby': describedby });
4591
+ var comboboxListbox = (
4592
+ // eslint-disable-next-line
4593
+ // @ts-expect-error
4594
+ // multiselect & value props are passed to Listbox, but TS is unable to infer that
4595
+ // it's a correct mapping from Combobox's multiselect & value props
4596
+ React__default["default"].createElement(Listbox, { className: classNames__default["default"]('Combobox__listbox', {
4597
+ 'Combobox__listbox--open': open
4598
+ }), role: noMatchingOptions ? 'presentation' : 'listbox', "aria-labelledby": noMatchingOptions ? undefined : "".concat(id, "-label"), "aria-describedby": describedby, id: "".concat(id, "-listbox"), value: multiselect ? selectedValues : selectedValues[0], onMouseDown: handleComboboxOptionMouseDown, onClick: handleComboboxOptionClick, onSelectionChange: handleSelectionChange, onActiveChange: handleActiveChange, ref: listboxRef, tabIndex: noMatchingOptions ? undefined : -1, "aria-activedescendant": undefined, multiselect: multiselect, disabled: disabled },
4599
+ comboboxOptions,
4600
+ noMatchingOptions));
4632
4601
  return (React__default["default"].createElement("div", { id: id, className: classNames__default["default"]('Combobox', { 'Combobox--multiselect': multiselect }, className), ref: comboboxRef },
4633
4602
  name &&
4634
4603
  formValues.map(function (formValue, index) { return (React__default["default"].createElement("input", { type: "hidden", key: index, name: name, value: formValue })); }),
@@ -4661,7 +4630,7 @@ var Combobox = React.forwardRef(function (_a, ref) {
4661
4630
  };
4662
4631
  return (React__default["default"].createElement(ComboboxPill, { ref: refCallback, key: value, value: value, removeOptionLabel: removeOptionLabels[index], disabled: disabled, onClick: handleClick, onKeyDown: handlePillKeyDown }));
4663
4632
  }),
4664
- React__default["default"].createElement("input", tslib.__assign({ type: "text", id: "".concat(id, "-input"), ref: inputRef, value: inputValue, role: "combobox", disabled: disabled, "aria-autocomplete": !isAutoComplete ? 'none' : 'list', "aria-controls": "".concat(id, "-listbox"), "aria-expanded": open, "aria-haspopup": "listbox", "aria-activedescendant": open && activeDescendant ? activeDescendant.element.id : undefined }, inputProps, { onChange: handleChange, onKeyDown: handleKeyDown, onFocus: handleFocus, onBlur: handleBlur })),
4633
+ React__default["default"].createElement("input", tslib.__assign({ type: "text", id: "".concat(id, "-input"), ref: inputRef, value: inputValue, role: "combobox", disabled: disabled, "aria-invalid": error ? true : undefined, "aria-autocomplete": !isAutoComplete ? 'none' : 'list', "aria-controls": "".concat(id, "-listbox"), "aria-expanded": open, "aria-haspopup": "listbox", "aria-activedescendant": open && activeDescendant ? activeDescendant.element.id : undefined }, inputProps, { onChange: handleChange, onKeyDown: handleKeyDown, onFocus: handleFocus, onBlur: handleBlur })),
4665
4634
  React__default["default"].createElement("span", { className: "Combobox__arrow" })),
4666
4635
  React__default["default"].createElement(ComboboxProvider, { autocomplete: autocomplete, inputValue: inputValue, formValues: formValues, selectedValues: selectedValues, removeOptionLabels: removeOptionLabels, setRemoveOptionLabels: setRemoveOptionLabels, matches: !isAutoComplete || defaultAutoCompleteMatches, matchingOptions: matchingOptions, setMatchingOptions: setMatchingOptions, setFormValues: setFormValues }, portal && typeof document !== 'undefined'
4667
4636
  ? reactDom.createPortal(comboboxListbox,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deque/cauldron-react",
3
- "version": "6.27.0-canary.2c4ec65c",
3
+ "version": "6.27.0-canary.34834ec5",
4
4
  "license": "MPL-2.0",
5
5
  "description": "Fully accessible react components library for Deque Cauldron",
6
6
  "homepage": "https://cauldron.dequelabs.com/",