@algolia/satellite 1.0.0-beta.157 → 1.0.0-beta.158

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 (69) hide show
  1. package/cjs/Badge/Badge.d.ts +2 -2
  2. package/cjs/Badge/Badge.js +7 -6
  3. package/cjs/Banners/Alert/Alert.js +1 -1
  4. package/cjs/Button/Button.d.ts +3 -5
  5. package/cjs/Button/Button.js +8 -51
  6. package/cjs/Button/IconButton.d.ts +3 -18
  7. package/cjs/Button/IconButton.js +8 -64
  8. package/cjs/Button/PolymorphicButton.d.ts +11 -0
  9. package/cjs/Button/PolymorphicButton.js +76 -0
  10. package/cjs/Button/PolymorphicIconButton.d.ts +24 -0
  11. package/cjs/Button/PolymorphicIconButton.js +84 -0
  12. package/cjs/Button/index.d.ts +1 -1
  13. package/cjs/Button/index.js +16 -12
  14. package/cjs/Button/types.d.ts +11 -6
  15. package/cjs/Button/types.js +3 -1
  16. package/cjs/Dropdown/DropdownButton.d.ts +3 -3
  17. package/cjs/Dropdown/DropdownButton.js +5 -2
  18. package/cjs/Link/ButtonLink.d.ts +5 -3
  19. package/cjs/Link/ButtonLink.js +9 -6
  20. package/cjs/Link/IconButtonLink.d.ts +5 -4
  21. package/cjs/Link/IconButtonLink.js +8 -5
  22. package/cjs/Medallion/Medallion.js +1 -1
  23. package/cjs/Modal/Modal.d.ts +35 -11
  24. package/cjs/Modal/Modal.js +131 -95
  25. package/cjs/Modal/Modal.tailwind.js +7 -0
  26. package/cjs/Satellite/Satellite.d.ts +2 -1
  27. package/cjs/Satellite/Satellite.js +26 -2
  28. package/cjs/Tag/Tag.d.ts +26 -6
  29. package/cjs/Tag/Tag.js +51 -19
  30. package/cjs/Tag/Tag.tailwind.js +17 -1
  31. package/cjs/styles/colors.d.ts +18 -0
  32. package/cjs/styles/colors.js +33 -15
  33. package/cjs/types.d.ts +9 -0
  34. package/esm/Badge/Badge.d.ts +2 -2
  35. package/esm/Badge/Badge.js +7 -6
  36. package/esm/Banners/Alert/Alert.js +1 -1
  37. package/esm/Button/Button.d.ts +3 -5
  38. package/esm/Button/Button.js +8 -52
  39. package/esm/Button/IconButton.d.ts +3 -18
  40. package/esm/Button/IconButton.js +8 -66
  41. package/esm/Button/PolymorphicButton.d.ts +11 -0
  42. package/esm/Button/PolymorphicButton.js +66 -0
  43. package/esm/Button/PolymorphicIconButton.d.ts +24 -0
  44. package/esm/Button/PolymorphicIconButton.js +78 -0
  45. package/esm/Button/index.d.ts +1 -1
  46. package/esm/Button/index.js +1 -1
  47. package/esm/Button/types.d.ts +11 -6
  48. package/esm/Button/types.js +3 -1
  49. package/esm/Dropdown/DropdownButton.d.ts +3 -3
  50. package/esm/Dropdown/DropdownButton.js +5 -2
  51. package/esm/Link/ButtonLink.d.ts +5 -3
  52. package/esm/Link/ButtonLink.js +9 -6
  53. package/esm/Link/IconButtonLink.d.ts +5 -4
  54. package/esm/Link/IconButtonLink.js +8 -5
  55. package/esm/Medallion/Medallion.js +1 -1
  56. package/esm/Modal/Modal.d.ts +35 -11
  57. package/esm/Modal/Modal.js +129 -96
  58. package/esm/Modal/Modal.tailwind.js +7 -0
  59. package/esm/Satellite/Satellite.d.ts +2 -1
  60. package/esm/Satellite/Satellite.js +24 -1
  61. package/esm/Tag/Tag.d.ts +26 -6
  62. package/esm/Tag/Tag.js +52 -20
  63. package/esm/Tag/Tag.tailwind.js +17 -1
  64. package/esm/styles/colors.d.ts +18 -0
  65. package/esm/styles/colors.js +33 -15
  66. package/esm/types.d.ts +9 -0
  67. package/package.json +7 -4
  68. package/satellite.min.css +1 -1
  69. package/scss/colors.scss +27 -10
@@ -7,6 +7,7 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports["default"] = exports.DropdownButton = void 0;
8
8
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
9
  var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
10
+ var _react = require("react");
10
11
  var _reactFeather = require("react-feather");
11
12
  var _Button = _interopRequireDefault(require("../Button"));
12
13
  var _Dropdown = _interopRequireDefault(require("./Dropdown"));
@@ -14,7 +15,7 @@ var _jsxRuntime = require("react/jsx-runtime");
14
15
  var _excluded = ["children", "title", "renderFooter"];
15
16
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
16
17
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
17
- var DropdownButton = function DropdownButton(_ref) {
18
+ var DropdownButton = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
18
19
  var children = _ref.children,
19
20
  title = _ref.title,
20
21
  renderFooter = _ref.renderFooter,
@@ -32,6 +33,7 @@ var DropdownButton = function DropdownButton(_ref) {
32
33
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Button["default"], _objectSpread(_objectSpread({}, buttonProps), {}, {
33
34
  onClick: handleClick,
34
35
  endIcon: _reactFeather.ChevronDown,
36
+ ref: ref,
35
37
  children: title
36
38
  }));
37
39
  };
@@ -40,7 +42,8 @@ var DropdownButton = function DropdownButton(_ref) {
40
42
  renderFooter: renderFooter,
41
43
  children: children
42
44
  });
43
- };
45
+ });
44
46
  exports.DropdownButton = DropdownButton;
47
+ DropdownButton.displayName = "DropdownButton";
45
48
  var _default = DropdownButton;
46
49
  exports["default"] = _default;
@@ -1,7 +1,9 @@
1
1
  /// <reference types="react" />
2
- import type { ButtonBaseProps, ExtractProps } from "../Button/types";
3
- export declare type ButtonLinkProps = ButtonBaseProps & ExtractProps<"a"> & {
2
+ import { type PolymorphicButtonProps } from "../Button/PolymorphicButton";
3
+ export declare type ButtonLinkProps = Omit<PolymorphicButtonProps<"a">, "as" | "ref"> & {
4
4
  href: string;
5
5
  };
6
- export declare const ButtonLink: ({ endIcon: EndIcon, href, onClick, ...props }: ButtonLinkProps) => JSX.Element;
6
+ export declare const ButtonLink: import("react").ForwardRefExoticComponent<Omit<PolymorphicButtonProps<"a">, "ref" | "as"> & {
7
+ href: string;
8
+ } & import("react").RefAttributes<HTMLAnchorElement>>;
7
9
  export default ButtonLink;
@@ -7,14 +7,15 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports["default"] = exports.ButtonLink = void 0;
8
8
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
9
  var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
10
+ var _react = require("react");
10
11
  var _reactFeather = require("react-feather");
11
- var _Button = _interopRequireDefault(require("../Button/Button"));
12
+ var _PolymorphicButton = require("../Button/PolymorphicButton");
12
13
  var _useLinkProps = _interopRequireDefault(require("../utils/useLinkProps"));
13
14
  var _jsxRuntime = require("react/jsx-runtime");
14
15
  var _excluded = ["endIcon", "href", "onClick"];
15
16
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
16
17
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
17
- var ButtonLink = function ButtonLink(_ref) {
18
+ var ButtonLink = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
18
19
  var EndIcon = _ref.endIcon,
19
20
  href = _ref.href,
20
21
  onClick = _ref.onClick,
@@ -26,11 +27,13 @@ var ButtonLink = function ButtonLink(_ref) {
26
27
  if (linkProps.target === "_blank" && EndIcon === undefined) {
27
28
  EndIcon = _reactFeather.ExternalLink;
28
29
  }
29
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Button["default"], _objectSpread(_objectSpread(_objectSpread({}, props), linkProps), {}, {
30
- endIcon: EndIcon,
31
- as: "a"
30
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_PolymorphicButton.PolymorphicButton, _objectSpread(_objectSpread(_objectSpread({}, props), linkProps), {}, {
31
+ ref: ref,
32
+ as: "a",
33
+ endIcon: EndIcon
32
34
  }));
33
- };
35
+ });
34
36
  exports.ButtonLink = ButtonLink;
37
+ ButtonLink.displayName = "ButtonLink";
35
38
  var _default = ButtonLink;
36
39
  exports["default"] = _default;
@@ -1,8 +1,9 @@
1
1
  /// <reference types="react" />
2
- import { IconButtonBaseProps } from "../Button/IconButton";
3
- import type { ExtractProps } from "../Button/types";
4
- export declare type IconButtonLinkProps = IconButtonBaseProps & ExtractProps<"a"> & {
2
+ import { type PolymorphicIconButtonProps } from "../Button/PolymorphicIconButton";
3
+ export declare type IconButtonLinkProps = Omit<PolymorphicIconButtonProps<"a">, "as" | "ref"> & {
5
4
  href: string;
6
5
  };
7
- export declare const IconButtonLink: ({ href, onClick, ...props }: IconButtonLinkProps) => JSX.Element;
6
+ export declare const IconButtonLink: import("react").ForwardRefExoticComponent<Omit<PolymorphicIconButtonProps<"a">, "ref" | "as"> & {
7
+ href: string;
8
+ } & import("react").RefAttributes<HTMLAnchorElement>>;
8
9
  export default IconButtonLink;
@@ -7,13 +7,14 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports["default"] = exports.IconButtonLink = void 0;
8
8
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
9
  var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
10
- var _IconButton = _interopRequireDefault(require("../Button/IconButton"));
10
+ var _react = require("react");
11
+ var _PolymorphicIconButton = require("../Button/PolymorphicIconButton");
11
12
  var _useLinkProps = _interopRequireDefault(require("../utils/useLinkProps"));
12
13
  var _jsxRuntime = require("react/jsx-runtime");
13
14
  var _excluded = ["href", "onClick"];
14
15
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
15
16
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
16
- var IconButtonLink = function IconButtonLink(_ref) {
17
+ var IconButtonLink = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
17
18
  var href = _ref.href,
18
19
  onClick = _ref.onClick,
19
20
  props = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
@@ -21,10 +22,12 @@ var IconButtonLink = function IconButtonLink(_ref) {
21
22
  href: href,
22
23
  onClick: onClick
23
24
  }));
24
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_IconButton["default"], _objectSpread(_objectSpread(_objectSpread({}, props), linkProps), {}, {
25
- as: "a"
25
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_PolymorphicIconButton.PolymorphicIconButton, _objectSpread(_objectSpread(_objectSpread({}, props), linkProps), {}, {
26
+ as: "a",
27
+ ref: ref
26
28
  }));
27
- };
29
+ });
28
30
  exports.IconButtonLink = IconButtonLink;
31
+ IconButtonLink.displayName = "IconButtonLink";
29
32
  var _default = IconButtonLink;
30
33
  exports["default"] = _default;
@@ -15,7 +15,7 @@ var VARIANT_CLASSNAMES = {
15
15
  pink: (0, _satellitePrefixer["default"])(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["medallion-pink text-pink-600"]))),
16
16
  accent: (0, _satellitePrefixer["default"])(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["medallion-accent text-accent-600"]))),
17
17
  blue: (0, _satellitePrefixer["default"])(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["medallion-blue text-blue-600"]))),
18
- green: (0, _satellitePrefixer["default"])(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["medallion-green text-green-700"]))),
18
+ green: (0, _satellitePrefixer["default"])(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["medallion-green text-green-600"]))),
19
19
  orange: (0, _satellitePrefixer["default"])(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2["default"])(["medallion-orange text-orange-600"]))),
20
20
  red: (0, _satellitePrefixer["default"])(_templateObject7 || (_templateObject7 = (0, _taggedTemplateLiteral2["default"])(["medallion-red text-red-600"]))),
21
21
  // eslint-disable-next-line @algolia/satellite/prefer-accent -- here we're definitely refering to the color itself
@@ -1,30 +1,54 @@
1
1
  import type { ReactNode } from "react";
2
+ import type { XOR } from "../types";
2
3
  export declare type ModalSizeVariant = "medium" | "large";
3
4
  export declare type ModalLocale = {
4
5
  dismissText?: string;
6
+ modalTitle?: string;
5
7
  };
6
- export interface ModalProps {
7
- open?: boolean;
8
- /** Descriptive title for `Modal` */
8
+ interface ModalControlledProps {
9
+ /** Define whether the modal is open or closed. */
10
+ open: boolean;
11
+ /** The element that should receive focus once the `Modal` is closed. */
12
+ autoFocusOnCloseElement?: HTMLElement | null;
13
+ }
14
+ interface ModalUncontrolledProps {
15
+ /** Button which should trigger the modal */
16
+ triggerButton: ReactNode;
17
+ }
18
+ export declare type ModalProps = XOR<ModalControlledProps, ModalUncontrolledProps> & {
19
+ /** Descriptive title for `Modal`. */
9
20
  title?: ReactNode;
10
21
  /** @ignore */
11
22
  className?: string;
12
- /** Should the content take up full full width of the `Modal`. */
23
+ /** Define whether the content should take up the full width of the `Modal`. */
13
24
  fullBleed?: boolean;
14
- /** Define whether or not the modal should animate on show and hide */
25
+ /** Define whether or not the modal should animate on show and hide. */
15
26
  animate?: boolean;
27
+ /** Define the size of the `Modal`. */
16
28
  size?: ModalSizeVariant;
17
- /** Define whether or not the dismiss button should be hidden */
29
+ /** Define whether or not the dismiss button should be hidden. */
18
30
  hideCloseIcon?: boolean;
19
- /** Define whether or not the modal should be vertically aligned */
31
+ /** Define whether or not the modal should be vertically aligned. */
20
32
  centerY?: boolean;
21
- /** Function triggered when the dismiss button is clicked */
33
+ /**
34
+ * Function triggered when the modal is dismissed.
35
+ * This function is called when the user clicks the close button,
36
+ * clicks outside the modal or presses the escape key.
37
+ */
22
38
  onDismiss?: () => void;
23
- children: ReactNode;
39
+ /** The locale for the `Modal`. */
24
40
  locale?: ModalLocale;
25
- }
41
+ /**
42
+ * The element that should receive focus once the `Modal` is opened.
43
+ * If `undefined` or `null` is passed, the first focusable element will be focused.
44
+ * If `false`, no element will be focused.
45
+ */
46
+ autoFocusOnOpenElement?: HTMLElement | null | false;
47
+ children: ReactNode;
48
+ };
26
49
  export declare const Modal: {
27
- ({ title, className, children, open, fullBleed, onDismiss, animate, hideCloseIcon, size, centerY, locale: propsLocale, }: ModalProps): import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>>;
50
+ ({ title, className, children, open, onDismiss, fullBleed, animate, hideCloseIcon, size, centerY, autoFocusOnOpenElement, autoFocusOnCloseElement, triggerButton, locale: propsLocale, }: ModalProps): JSX.Element;
28
51
  Footer: import("react").FunctionComponent<import("./components/ModalFooter").ModalFooterProps>;
52
+ Section: ({ children, className, fullBleed }: import("./components/ModalSection").ModalSectionProps) => JSX.Element;
29
53
  };
30
54
  export default Modal;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
4
5
  Object.defineProperty(exports, "__esModule", {
5
6
  value: true
6
7
  });
@@ -8,36 +9,36 @@ exports["default"] = exports.Modal = void 0;
8
9
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
9
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
11
  var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
12
+ var Dialog = _interopRequireWildcard(require("@radix-ui/react-dialog"));
11
13
  var _clsx = _interopRequireDefault(require("clsx"));
12
14
  var _react = require("react");
13
15
  var _reactFeather = require("react-feather");
14
16
  var _reactTransitionGroup = require("react-transition-group");
15
- var _useKeyPressEvent = _interopRequireDefault(require("react-use/lib/useKeyPressEvent"));
16
- var _useLockBodyScroll = _interopRequireDefault(require("react-use/lib/useLockBodyScroll"));
17
17
  var _Button = require("../Button");
18
18
  var _Card = _interopRequireDefault(require("../Card"));
19
19
  var _Satellite = require("../Satellite");
20
20
  var _satellitePrefixer = _interopRequireDefault(require("../styles/helpers/satellitePrefixer"));
21
- var _uniqueId = _interopRequireDefault(require("../utils/uniqueId"));
22
21
  var _ModalFooter = _interopRequireDefault(require("./components/ModalFooter"));
22
+ var _ModalSection = _interopRequireDefault(require("./components/ModalSection"));
23
23
  var _jsxRuntime = require("react/jsx-runtime");
24
- var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9, _templateObject10, _templateObject11;
24
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9, _templateObject10, _templateObject11, _templateObject12, _templateObject13, _templateObject14, _templateObject15, _templateObject16;
25
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
26
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
25
27
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
26
28
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
27
29
  var DEFAULT_MODAL_LOCALE = {
28
- dismissText: "Dismiss"
30
+ dismissText: "Dismiss",
31
+ modalTitle: "Modal"
29
32
  };
33
+ var MODAL_ANIMATION_OUT_DELAY = 200;
30
34
  var ModalAnimation = function ModalAnimation(props) {
31
- return (
32
- /*#__PURE__*/
35
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactTransitionGroup.CSSTransition, _objectSpread(_objectSpread({}, props), {}, {
33
36
  /* eslint-disable-next-line @algolia/satellite/invalid-classnames */
34
- (0, _jsxRuntime.jsx)(_reactTransitionGroup.CSSTransition, _objectSpread(_objectSpread({}, props), {}, {
35
- classNames: (0, _satellitePrefixer["default"])(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["satellite-modal"]))),
36
- timeout: 200,
37
- appear: true,
38
- unmountOnExit: true
39
- }))
40
- );
37
+ classNames: (0, _satellitePrefixer["default"])(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["satellite-modal"]))),
38
+ timeout: MODAL_ANIMATION_OUT_DELAY,
39
+ appear: true,
40
+ unmountOnExit: true
41
+ }));
41
42
  };
42
43
  var ModalNoAnimation = function ModalNoAnimation(props) {
43
44
  return props["in"] ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
@@ -53,11 +54,10 @@ var Modal = function Modal(_ref) {
53
54
  className = _ref.className,
54
55
  children = _ref.children,
55
56
  _ref$open = _ref.open,
56
- open = _ref$open === void 0 ? true : _ref$open,
57
+ open = _ref$open === void 0 ? false : _ref$open,
58
+ onDismiss = _ref.onDismiss,
57
59
  _ref$fullBleed = _ref.fullBleed,
58
60
  fullBleed = _ref$fullBleed === void 0 ? false : _ref$fullBleed,
59
- _ref$onDismiss = _ref.onDismiss,
60
- onDismiss = _ref$onDismiss === void 0 ? function () {} : _ref$onDismiss,
61
61
  _ref$animate = _ref.animate,
62
62
  animate = _ref$animate === void 0 ? true : _ref$animate,
63
63
  _ref$hideCloseIcon = _ref.hideCloseIcon,
@@ -66,93 +66,129 @@ var Modal = function Modal(_ref) {
66
66
  size = _ref$size === void 0 ? "medium" : _ref$size,
67
67
  _ref$centerY = _ref.centerY,
68
68
  centerY = _ref$centerY === void 0 ? false : _ref$centerY,
69
+ autoFocusOnOpenElement = _ref.autoFocusOnOpenElement,
70
+ autoFocusOnCloseElement = _ref.autoFocusOnCloseElement,
71
+ triggerButton = _ref.triggerButton,
69
72
  propsLocale = _ref.locale;
70
- var createPortal = (0, _Satellite.useCreatePortal)();
71
73
  var contextLocale = (0, _Satellite.useLocale)("modal");
72
74
  var locale = _objectSpread(_objectSpread(_objectSpread({}, DEFAULT_MODAL_LOCALE), contextLocale), propsLocale);
73
- var _useState = (0, _react.useState)(null),
74
- _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
75
- modalWrapperRef = _useState2[0],
76
- setModalWrapperRef = _useState2[1];
77
- var dialogRef = (0, _react.useRef)(null);
78
- var mouseDownTargetRef = (0, _react.useRef)(null);
75
+ var createPortal = (0, _Satellite.useCreatePortal)();
79
76
  var ModalContainer = animate ? ModalAnimation : ModalNoAnimation;
80
- var modalTitleId = (0, _react.useMemo)(function () {
81
- return (0, _uniqueId["default"])("modal-title");
82
- }, []);
83
- (0, _useLockBodyScroll["default"])(open);
84
- (0, _useKeyPressEvent["default"])("Escape", function () {
85
- if (open) onDismiss();
86
- });
77
+ var _useState = (0, _react.useState)(open),
78
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
79
+ isOpen = _useState2[0],
80
+ setIsOpen = _useState2[1];
81
+ var _useState3 = (0, _react.useState)(open),
82
+ _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
83
+ isOpenAnimated = _useState4[0],
84
+ setIsOpenAnimated = _useState4[1];
85
+ var openTimeoutId = (0, _react.useRef)();
86
+ var onOpenChangeTimeoutId = (0, _react.useRef)();
87
+ var isControlled = triggerButton === undefined;
87
88
  (0, _react.useEffect)(function () {
88
- if (!modalWrapperRef) return;
89
- var onMouseUp = function onMouseUp(evt) {
90
- if (evt.target === mouseDownTargetRef.current && dialogRef.current && !dialogRef.current.contains(evt.target)) {
91
- onDismiss();
89
+ clearTimeout(openTimeoutId.current);
90
+ setIsOpenAnimated(open);
91
+ if (animate && !open) {
92
+ openTimeoutId.current = setTimeout(function () {
93
+ return setIsOpen(open);
94
+ }, MODAL_ANIMATION_OUT_DELAY);
95
+ } else {
96
+ setIsOpen(open);
97
+ }
98
+ }, [open, animate]);
99
+ if (typeof document === "undefined") return /*#__PURE__*/(0, _jsxRuntime.jsx)(_react.Fragment, {});
100
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(Dialog.Root, {
101
+ open: isOpen,
102
+ onOpenChange: function onOpenChange(open) {
103
+ clearTimeout(onOpenChangeTimeoutId.current);
104
+ setIsOpenAnimated(open);
105
+ var cb = function cb() {
106
+ setIsOpen(open);
107
+ if (!open) onDismiss === null || onDismiss === void 0 ? void 0 : onDismiss();
108
+ };
109
+ if (animate) {
110
+ onOpenChangeTimeoutId.current = setTimeout(cb, MODAL_ANIMATION_OUT_DELAY);
111
+ } else {
112
+ cb();
92
113
  }
93
- mouseDownTargetRef.current = null;
94
- };
95
- var onMouseDown = function onMouseDown(evt) {
96
- return mouseDownTargetRef.current = evt.target;
97
- };
98
-
99
- /**
100
- * We use native event handlers to avoid React event bubbling behaviour with element rendered in a portal.
101
- * (otherwise, the modal gets dismissed when clicking on an AutoComplete menu item)
102
- */
103
- modalWrapperRef.addEventListener("mouseup", onMouseUp);
104
- modalWrapperRef.addEventListener("mousedown", onMouseDown);
105
- return function () {
106
- modalWrapperRef.removeEventListener("mouseup", onMouseUp);
107
- modalWrapperRef.removeEventListener("mousedown", onMouseDown);
108
- };
109
- }, [modalWrapperRef, onDismiss]);
110
- var modalAccessibilityProps = _objectSpread({
111
- role: "dialog"
112
- }, title ? {
113
- "aria-labelledby": modalTitleId
114
- } : {
115
- "aria-label": "Modal"
116
- });
117
- return createPortal( /*#__PURE__*/(0, _jsxRuntime.jsx)(ModalContainer, {
118
- "in": open,
119
- children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
120
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
121
- className: (0, _clsx["default"])((0, _satellitePrefixer["default"])(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["bg-grey-900/30 z-modalOverlay inset-x-0 inset-y-0 fixed w-full h-full"]))))
122
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", _objectSpread(_objectSpread({
123
- className: (0, _clsx["default"])((0, _satellitePrefixer["default"])(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["modal-container inset-x-0 inset-y-0 fixed w-full h-full p-4 overflow-x-hidden overflow-y-auto"]))), centerY && (0, _satellitePrefixer["default"])(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2["default"])(["flex items-center"])))),
124
- ref: setModalWrapperRef
125
- }, modalAccessibilityProps), {}, {
126
- children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Card["default"], {
127
- ref: dialogRef,
128
- as: "section",
129
- elevation: "500",
130
- className: (0, _clsx["default"])((0, _satellitePrefixer["default"])(_templateObject7 || (_templateObject7 = (0, _taggedTemplateLiteral2["default"])(["my-6 mx-auto"]))), SIZE_CLASSNAMES[size], className),
131
- fullBleed: true,
132
- "aria-label": title || "Modal",
133
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("header", {
134
- className: (0, _satellitePrefixer["default"])(_templateObject8 || (_templateObject8 = (0, _taggedTemplateLiteral2["default"])(["\n px-8 min-h-14\n flex items-center justify-between space-x-2\n ", "\n ", "\n "])), title ? "border-b border-grey-100" : "justify-end", !title && hideCloseIcon && "hidden"),
135
- children: [!!title && /*#__PURE__*/(0, _jsxRuntime.jsx)("h2", {
136
- id: modalTitleId,
137
- className: (0, _satellitePrefixer["default"])(_templateObject9 || (_templateObject9 = (0, _taggedTemplateLiteral2["default"])(["flex-1 display-heading truncate"]))),
138
- children: title
139
- }), !hideCloseIcon && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.IconButton, {
140
- icon: _reactFeather.X,
141
- title: locale.dismissText,
142
- variant: "subtle",
143
- onClick: onDismiss,
144
- className: (0, _satellitePrefixer["default"])(_templateObject10 || (_templateObject10 = (0, _taggedTemplateLiteral2["default"])(["shrink-0 -mr-2"])))
145
- })]
146
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
147
- className: fullBleed ? undefined : (0, _satellitePrefixer["default"])(_templateObject11 || (_templateObject11 = (0, _taggedTemplateLiteral2["default"])(["p-10"]))),
148
- children: children
149
- })]
114
+ },
115
+ modal: true,
116
+ children: [!isControlled && /*#__PURE__*/(0, _jsxRuntime.jsx)(Dialog.Trigger, {
117
+ asChild: true,
118
+ children: triggerButton
119
+ }), createPortal( /*#__PURE__*/(0, _jsxRuntime.jsx)(Dialog.Overlay, {
120
+ className: (0, _satellitePrefixer["default"])(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["bg-grey-900/30 z-modalOverlay inset-0 fixed w-full h-full flex items-start justify-center overflow-x-hidden overflow-y-auto px-4 py-10"]))),
121
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(Dialog.Content, {
122
+ className: (0, _clsx["default"])((0, _satellitePrefixer["default"])(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["modal-content"]))), SIZE_CLASSNAMES[size], !isOpen && (0, _satellitePrefixer["default"])(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2["default"])(["hidden"]))), centerY && (0, _satellitePrefixer["default"])(_templateObject7 || (_templateObject7 = (0, _taggedTemplateLiteral2["default"])(["flex m-auto"])))),
123
+ onOpenAutoFocus: function onOpenAutoFocus(e) {
124
+ if (autoFocusOnOpenElement === false) {
125
+ e.preventDefault();
126
+ } else if (autoFocusOnOpenElement instanceof HTMLElement) {
127
+ e.preventDefault();
128
+ autoFocusOnOpenElement.focus();
129
+ }
130
+ },
131
+ onCloseAutoFocus: function onCloseAutoFocus(e) {
132
+ if (autoFocusOnCloseElement instanceof HTMLElement) {
133
+ e.preventDefault();
134
+ autoFocusOnCloseElement.focus();
135
+ }
136
+ },
137
+ onEscapeKeyDown: function onEscapeKeyDown(e) {
138
+ if (isControlled) {
139
+ e.preventDefault();
140
+ onDismiss === null || onDismiss === void 0 ? void 0 : onDismiss();
141
+ }
142
+ },
143
+ onInteractOutside: function onInteractOutside(e) {
144
+ if (isControlled) {
145
+ e.preventDefault();
146
+ onDismiss === null || onDismiss === void 0 ? void 0 : onDismiss();
147
+ }
148
+ },
149
+ "aria-label": !title ? locale.modalTitle : undefined,
150
+ "aria-describedby": undefined,
151
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(ModalContainer, {
152
+ "in": animate ? isOpenAnimated : isOpen,
153
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
154
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
155
+ className: (0, _satellitePrefixer["default"])(_templateObject8 || (_templateObject8 = (0, _taggedTemplateLiteral2["default"])(["modal-container"]))),
156
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Card["default"], {
157
+ as: "div",
158
+ elevation: "500",
159
+ className: (0, _clsx["default"])((0, _satellitePrefixer["default"])(_templateObject9 || (_templateObject9 = (0, _taggedTemplateLiteral2["default"])(["relative"]))), className),
160
+ fullBleed: true,
161
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("header", {
162
+ className: (0, _clsx["default"])((0, _satellitePrefixer["default"])(_templateObject10 || (_templateObject10 = (0, _taggedTemplateLiteral2["default"])(["min-h-14 flex items-center justify-between space-x-2"]))), title ? (0, _satellitePrefixer["default"])(_templateObject11 || (_templateObject11 = (0, _taggedTemplateLiteral2["default"])(["border-b border-grey-100 pl-8 pr-16"]))) : (0, _satellitePrefixer["default"])(_templateObject12 || (_templateObject12 = (0, _taggedTemplateLiteral2["default"])(["justify-end px-8"]))), !title && hideCloseIcon && (0, _satellitePrefixer["default"])(_templateObject13 || (_templateObject13 = (0, _taggedTemplateLiteral2["default"])(["hidden"])))),
163
+ children: !!title && /*#__PURE__*/(0, _jsxRuntime.jsx)(Dialog.Title, {
164
+ className: (0, _satellitePrefixer["default"])(_templateObject14 || (_templateObject14 = (0, _taggedTemplateLiteral2["default"])(["flex-1 display-heading truncate"]))),
165
+ children: title
166
+ })
167
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
168
+ className: (0, _clsx["default"])(!fullBleed && (0, _satellitePrefixer["default"])(_templateObject15 || (_templateObject15 = (0, _taggedTemplateLiteral2["default"])(["p-10"])))),
169
+ children: children
170
+ }), !hideCloseIcon && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
171
+ className: (0, _satellitePrefixer["default"])(_templateObject16 || (_templateObject16 = (0, _taggedTemplateLiteral2["default"])(["-mr-2 absolute top-3 right-8"]))),
172
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(Dialog.Close, {
173
+ asChild: true,
174
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.IconButton, {
175
+ icon: _reactFeather.X,
176
+ title: locale.dismissText,
177
+ variant: "subtle",
178
+ showTooltip: false
179
+ })
180
+ })
181
+ })]
182
+ })
183
+ })
184
+ })
150
185
  })
151
- }))]
152
- })
153
- }));
186
+ })
187
+ }))]
188
+ });
154
189
  };
155
190
  exports.Modal = Modal;
156
191
  Modal.Footer = _ModalFooter["default"];
192
+ Modal.Section = _ModalSection["default"];
157
193
  var _default = Modal;
158
194
  exports["default"] = _default;
@@ -11,6 +11,13 @@ var modalPlugin = plugin(function (_ref) {
11
11
  ".modal-container": {
12
12
  zIndex: theme("zIndex.modal")
13
13
  },
14
+ ".modal-content": {
15
+ borderRadius: "8px",
16
+ width: "100%",
17
+ "&:focus": {
18
+ outline: "none"
19
+ }
20
+ },
14
21
  // Sizes
15
22
  ".modal-dialog-medium": {
16
23
  maxWidth: "640px"
@@ -1,4 +1,4 @@
1
- import type { FunctionComponent, ReactNode } from "react";
1
+ import { type FunctionComponent, type ReactNode } from "react";
2
2
  import type { ComponentsLocales } from "./locale";
3
3
  import type { SatelliteRouter } from "./SatelliteRouter";
4
4
  export interface SatelliteProps {
@@ -7,5 +7,6 @@ export interface SatelliteProps {
7
7
  portalTarget?: HTMLElement;
8
8
  children: ReactNode;
9
9
  }
10
+ export declare const DEFAULT_PORTAL_TARGET_ID = "satellite-portal";
10
11
  export declare const Satellite: FunctionComponent<SatelliteProps>;
11
12
  export default Satellite;
@@ -4,16 +4,40 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports["default"] = exports.Satellite = void 0;
7
+ exports["default"] = exports.Satellite = exports.DEFAULT_PORTAL_TARGET_ID = void 0;
8
+ var _react = require("react");
8
9
  var _SatelliteContext = _interopRequireDefault(require("./SatelliteContext"));
9
10
  var _SatelliteRouter = require("./SatelliteRouter");
10
11
  var _jsxRuntime = require("react/jsx-runtime");
12
+ var DEFAULT_PORTAL_TARGET_ID = "satellite-portal";
13
+ exports.DEFAULT_PORTAL_TARGET_ID = DEFAULT_PORTAL_TARGET_ID;
14
+ var portalElement;
15
+ var getPortalElement = function getPortalElement() {
16
+ if (typeof document === "undefined") return;
17
+ if (!portalElement) {
18
+ var element = document.createElement("div");
19
+ element.setAttribute("id", DEFAULT_PORTAL_TARGET_ID);
20
+ document.body.appendChild(element);
21
+ portalElement = element;
22
+ }
23
+ return portalElement;
24
+ };
11
25
  var Satellite = function Satellite(_ref) {
12
26
  var _ref$router = _ref.router,
13
27
  router = _ref$router === void 0 ? _SatelliteRouter.router : _ref$router,
14
28
  locales = _ref.locales,
15
- portalTarget = _ref.portalTarget,
29
+ _ref$portalTarget = _ref.portalTarget,
30
+ portalTarget = _ref$portalTarget === void 0 ? getPortalElement() : _ref$portalTarget,
16
31
  children = _ref.children;
32
+ (0, _react.useEffect)(function () {
33
+ if (!portalTarget) return;
34
+ if (portalTarget === document.body) {
35
+ console.warn("Avoid using the document body as a portal target.");
36
+ }
37
+
38
+ // Radix adds pointer-events: none; on the body for its modal, so we need to reenable it for other portaled elements (tooltips, menus, autocomplete)
39
+ portalTarget.style.pointerEvents = "auto";
40
+ }, [portalTarget]);
17
41
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_SatelliteContext["default"].Provider, {
18
42
  value: {
19
43
  router: router,