colibri-ui 0.8.76 → 0.8.77

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 (119) hide show
  1. package/Autocomplete/Autocomplete.d.ts +6 -0
  2. package/Autocomplete/Autocomplete.js +298 -0
  3. package/Autocomplete/Autocomplete.module.css +147 -0
  4. package/Autocomplete/index.d.ts +2 -0
  5. package/Autocomplete/index.js +7 -0
  6. package/Autocomplete/index.props.d.ts +39 -0
  7. package/Autocomplete/package.json +9 -0
  8. package/Button/tokens.d.ts +78 -0
  9. package/Button/tokens.js +84 -0
  10. package/Calendar/Calendar.js +3 -1
  11. package/Input/index.d.ts +1 -1
  12. package/Input/index.js +20 -14
  13. package/Input/index.props.d.ts +4 -1
  14. package/List/List.d.ts +5 -0
  15. package/List/List.js +161 -0
  16. package/List/List.module.css +185 -0
  17. package/List/index.d.ts +2 -0
  18. package/List/index.js +9 -0
  19. package/List/index.props.d.ts +43 -0
  20. package/List/package.json +9 -0
  21. package/Modal/Modal.module.css +14 -7
  22. package/Modal/components/Body/Body.module.css +12 -0
  23. package/Modal/components/Body/index.d.ts +3 -0
  24. package/Modal/components/Body/index.js +27 -0
  25. package/Modal/components/Body/index.props.d.ts +1 -0
  26. package/Modal/components/Close/index.js +5 -2
  27. package/Modal/components/Close/index.props.d.ts +1 -0
  28. package/Modal/components/Footer/Footer.module.css +10 -0
  29. package/Modal/components/Footer/index.d.ts +3 -0
  30. package/Modal/components/Footer/index.js +23 -0
  31. package/Modal/components/Footer/index.props.d.ts +1 -0
  32. package/Modal/components/Header/Header.module.css +32 -0
  33. package/Modal/components/Header/index.d.ts +3 -0
  34. package/Modal/components/Header/index.js +37 -0
  35. package/Modal/components/Header/index.props.d.ts +1 -0
  36. package/Modal/components/Title/index.js +20 -7
  37. package/Modal/components/Title/index.props.d.ts +1 -2
  38. package/Modal/context.d.ts +9 -0
  39. package/Modal/context.js +15 -0
  40. package/Modal/index.d.ts +12 -2
  41. package/Modal/index.js +102 -30
  42. package/Modal/index.props.d.ts +25 -0
  43. package/Modal/useModalStack.d.ts +2 -0
  44. package/Modal/useModalStack.js +20 -0
  45. package/Theme/colors/index.d.ts +4 -0
  46. package/Theme/colors/theme_buenos_aires.d.ts +4 -0
  47. package/Theme/colors/theme_buenos_aires.js +2 -0
  48. package/Theme/colors/theme_jaipur.d.ts +4 -0
  49. package/Theme/colors/theme_jaipur.js +2 -0
  50. package/Theme/index.d.ts +298 -152
  51. package/Theme/index.js +3 -2
  52. package/Theme/themes/buenos_aires.d.ts +73 -76
  53. package/Theme/themes/buenos_aires.js +73 -76
  54. package/Theme/themes/jaipur.d.ts +73 -76
  55. package/Theme/themes/jaipur.js +73 -76
  56. package/esm/Autocomplete/Autocomplete.d.ts +6 -0
  57. package/esm/Autocomplete/Autocomplete.js +288 -0
  58. package/esm/Autocomplete/Autocomplete.module.css +147 -0
  59. package/esm/Autocomplete/index.d.ts +2 -0
  60. package/esm/Autocomplete/index.props.d.ts +39 -0
  61. package/esm/Button/tokens.d.ts +78 -0
  62. package/esm/Button/tokens.js +82 -0
  63. package/esm/Calendar/Calendar.js +3 -1
  64. package/esm/Input/index.d.ts +1 -1
  65. package/esm/Input/index.js +16 -10
  66. package/esm/Input/index.props.d.ts +4 -1
  67. package/esm/List/List.d.ts +5 -0
  68. package/esm/List/List.js +150 -0
  69. package/esm/List/List.module.css +185 -0
  70. package/esm/List/index.d.ts +2 -0
  71. package/esm/List/index.props.d.ts +43 -0
  72. package/esm/Modal/Modal.module.css +14 -7
  73. package/esm/Modal/components/Body/Body.module.css +12 -0
  74. package/esm/Modal/components/Body/index.d.ts +3 -0
  75. package/esm/Modal/components/Body/index.js +18 -0
  76. package/esm/Modal/components/Body/index.props.d.ts +1 -0
  77. package/esm/Modal/components/Close/index.js +4 -2
  78. package/esm/Modal/components/Close/index.props.d.ts +1 -0
  79. package/esm/Modal/components/Footer/Footer.module.css +10 -0
  80. package/esm/Modal/components/Footer/index.d.ts +3 -0
  81. package/esm/Modal/components/Footer/index.js +15 -0
  82. package/esm/Modal/components/Footer/index.props.d.ts +1 -0
  83. package/esm/Modal/components/Header/Header.module.css +32 -0
  84. package/esm/Modal/components/Header/index.d.ts +3 -0
  85. package/esm/Modal/components/Header/index.js +28 -0
  86. package/esm/Modal/components/Header/index.props.d.ts +1 -0
  87. package/esm/Modal/components/Title/index.js +20 -8
  88. package/esm/Modal/components/Title/index.props.d.ts +1 -2
  89. package/esm/Modal/context.d.ts +9 -0
  90. package/esm/Modal/context.js +12 -0
  91. package/esm/Modal/index.d.ts +12 -2
  92. package/esm/Modal/index.js +91 -24
  93. package/esm/Modal/index.props.d.ts +25 -0
  94. package/esm/Modal/useModalStack.d.ts +2 -0
  95. package/esm/Modal/useModalStack.js +18 -0
  96. package/esm/Theme/colors/index.d.ts +4 -0
  97. package/esm/Theme/colors/theme_buenos_aires.d.ts +4 -0
  98. package/esm/Theme/colors/theme_buenos_aires.js +2 -0
  99. package/esm/Theme/colors/theme_jaipur.d.ts +4 -0
  100. package/esm/Theme/colors/theme_jaipur.js +2 -0
  101. package/esm/Theme/index.d.ts +298 -152
  102. package/esm/Theme/index.js +3 -2
  103. package/esm/Theme/themes/buenos_aires.d.ts +73 -76
  104. package/esm/Theme/themes/buenos_aires.js +73 -76
  105. package/esm/Theme/themes/jaipur.d.ts +73 -76
  106. package/esm/Theme/themes/jaipur.js +73 -76
  107. package/esm/hooks/useTrapFocus/index.d.ts +1 -1
  108. package/esm/hooks/useTrapFocus/index.js +3 -2
  109. package/esm/index.d.ts +6 -2
  110. package/esm/index.js +6 -0
  111. package/esm/theme_ba_variables.css +149 -76
  112. package/esm/theme_jaipur_variables.css +149 -76
  113. package/hooks/useTrapFocus/index.d.ts +1 -1
  114. package/hooks/useTrapFocus/index.js +3 -2
  115. package/index.d.ts +6 -2
  116. package/index.js +51 -35
  117. package/package.json +1 -1
  118. package/theme_ba_variables.css +149 -76
  119. package/theme_jaipur_variables.css +149 -76
@@ -0,0 +1,12 @@
1
+ .root {
2
+ box-sizing: border-box;
3
+ display: flex;
4
+ flex: 1 1 auto;
5
+ flex-direction: column;
6
+ min-height: 0;
7
+ overflow-y: auto;
8
+ padding: var(--space-4) var(--space-5);
9
+ }
10
+ .root_bleed {
11
+ padding: 0;
12
+ }
@@ -0,0 +1,3 @@
1
+ import type { FC } from "react";
2
+ import type { BodyProps } from "./index.props";
3
+ export declare const Body: FC<BodyProps>;
@@ -0,0 +1,27 @@
1
+ 'use strict';
2
+
3
+ var _defineProperty = require('@babel/runtime/helpers/defineProperty');
4
+ var tslib = require('tslib');
5
+ var React = require('react');
6
+ var clsx = require('clsx');
7
+ var styles = require('./Body.module.css');
8
+
9
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
10
+
11
+ var _defineProperty__default = /*#__PURE__*/_interopDefault(_defineProperty);
12
+ var React__default = /*#__PURE__*/_interopDefault(React);
13
+ var clsx__default = /*#__PURE__*/_interopDefault(clsx);
14
+ var styles__default = /*#__PURE__*/_interopDefault(styles);
15
+
16
+ var Body = function Body(_a) {
17
+ var children = _a.children,
18
+ className = _a.className,
19
+ _a$bleed = _a.bleed,
20
+ bleed = _a$bleed === void 0 ? false : _a$bleed,
21
+ props = tslib.__rest(_a, ["children", "className", "bleed"]);
22
+ return /*#__PURE__*/React__default.default.createElement("div", Object.assign({}, props, {
23
+ className: clsx__default.default(styles__default.default.root, _defineProperty__default.default({}, styles__default.default.root_bleed, bleed), className)
24
+ }), children);
25
+ };
26
+
27
+ exports.Body = Body;
@@ -0,0 +1 @@
1
+ export type { ModalBodyProps as BodyProps } from "../../index.props";
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var React = require('react');
4
+ var clsx = require('clsx');
4
5
  require('../../../Icons/index.js');
5
6
  var styles = require('./Close.module.css');
6
7
  var Close$1 = require('../../../Icons/Close.js');
@@ -8,16 +9,18 @@ var Close$1 = require('../../../Icons/Close.js');
8
9
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
9
10
 
10
11
  var React__default = /*#__PURE__*/_interopDefault(React);
12
+ var clsx__default = /*#__PURE__*/_interopDefault(clsx);
11
13
  var styles__default = /*#__PURE__*/_interopDefault(styles);
12
14
 
13
15
  var Close = function Close(_ref) {
14
- var onClick = _ref.onClick,
16
+ var className = _ref.className,
17
+ onClick = _ref.onClick,
15
18
  ariaLabel = _ref["aria-label"];
16
19
  return /*#__PURE__*/React__default.default.createElement("button", {
17
20
  type: "button",
18
21
  onClick: onClick,
19
22
  "aria-label": ariaLabel !== null && ariaLabel !== void 0 ? ariaLabel : "Close",
20
- className: styles__default.default["close-button"]
23
+ className: clsx__default.default(styles__default.default["close-button"], className)
21
24
  }, /*#__PURE__*/React__default.default.createElement(Close$1.Close, {
22
25
  width: 18,
23
26
  height: 18
@@ -1,4 +1,5 @@
1
1
  export type CloseButtonProps = {
2
+ className?: string;
2
3
  onClick?: () => void;
3
4
  "aria-label"?: string;
4
5
  };
@@ -0,0 +1,10 @@
1
+ .root {
2
+ align-items: center;
3
+ border-top: var(--border-width-hairline) solid var(--component-modal-border);
4
+ box-sizing: border-box;
5
+ display: flex;
6
+ flex: none;
7
+ gap: var(--space-3);
8
+ justify-content: flex-end;
9
+ padding: var(--space-4) var(--space-5);
10
+ }
@@ -0,0 +1,3 @@
1
+ import type { FC } from "react";
2
+ import type { FooterProps } from "./index.props";
3
+ export declare const Footer: FC<FooterProps>;
@@ -0,0 +1,23 @@
1
+ 'use strict';
2
+
3
+ var tslib = require('tslib');
4
+ var React = require('react');
5
+ var clsx = require('clsx');
6
+ var styles = require('./Footer.module.css');
7
+
8
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
9
+
10
+ var React__default = /*#__PURE__*/_interopDefault(React);
11
+ var clsx__default = /*#__PURE__*/_interopDefault(clsx);
12
+ var styles__default = /*#__PURE__*/_interopDefault(styles);
13
+
14
+ var Footer = function Footer(_a) {
15
+ var children = _a.children,
16
+ className = _a.className,
17
+ props = tslib.__rest(_a, ["children", "className"]);
18
+ return /*#__PURE__*/React__default.default.createElement("div", Object.assign({}, props, {
19
+ className: clsx__default.default(styles__default.default.root, className)
20
+ }), children);
21
+ };
22
+
23
+ exports.Footer = Footer;
@@ -0,0 +1 @@
1
+ export type { ModalFooterProps as FooterProps } from "../../index.props";
@@ -0,0 +1,32 @@
1
+ .root {
2
+ align-items: center;
3
+ border-bottom: var(--border-width-hairline) solid var(--component-modal-border);
4
+ box-sizing: border-box;
5
+ display: flex;
6
+ flex: none;
7
+ gap: var(--space-3);
8
+ padding: var(--space-4) var(--space-5);
9
+ }
10
+ .root_overlay {
11
+ align-items: flex-start;
12
+ background: transparent;
13
+ border-bottom: none;
14
+ left: 0;
15
+ pointer-events: none;
16
+ position: absolute;
17
+ right: 0;
18
+ top: 0;
19
+ z-index: 1;
20
+ }
21
+ .root_overlay > * {
22
+ pointer-events: auto;
23
+ }
24
+
25
+ .close {
26
+ margin-left: auto;
27
+ }
28
+ .root_overlay .close {
29
+ background-color: var(--component-modal-bg);
30
+ border-radius: var(--component-modal-radius);
31
+ box-shadow: var(--shadow-raised);
32
+ }
@@ -0,0 +1,3 @@
1
+ import type { FC } from "react";
2
+ import type { HeaderProps } from "./index.props";
3
+ export declare const Header: FC<HeaderProps>;
@@ -0,0 +1,37 @@
1
+ 'use strict';
2
+
3
+ var _defineProperty = require('@babel/runtime/helpers/defineProperty');
4
+ var tslib = require('tslib');
5
+ var React = require('react');
6
+ var clsx = require('clsx');
7
+ var context = require('../../context.js');
8
+ var index = require('../Close/index.js');
9
+ var styles = require('./Header.module.css');
10
+
11
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
12
+
13
+ var _defineProperty__default = /*#__PURE__*/_interopDefault(_defineProperty);
14
+ var React__default = /*#__PURE__*/_interopDefault(React);
15
+ var clsx__default = /*#__PURE__*/_interopDefault(clsx);
16
+ var styles__default = /*#__PURE__*/_interopDefault(styles);
17
+
18
+ var Header = function Header(_a) {
19
+ var children = _a.children,
20
+ className = _a.className,
21
+ _a$overlay = _a.overlay,
22
+ overlay = _a$overlay === void 0 ? false : _a$overlay,
23
+ _a$closeAriaLabel = _a.closeAriaLabel,
24
+ closeAriaLabel = _a$closeAriaLabel === void 0 ? "Close modal" : _a$closeAriaLabel,
25
+ props = tslib.__rest(_a, ["children", "className", "overlay", "closeAriaLabel"]);
26
+ var _useModalContext = context.useModalContext(),
27
+ onClose = _useModalContext.onClose;
28
+ return /*#__PURE__*/React__default.default.createElement("div", Object.assign({}, props, {
29
+ className: clsx__default.default(styles__default.default.root, _defineProperty__default.default({}, styles__default.default.root_overlay, overlay), className)
30
+ }), children, /*#__PURE__*/React__default.default.createElement(index.Close, {
31
+ className: styles__default.default.close,
32
+ onClick: onClose,
33
+ "aria-label": closeAriaLabel
34
+ }));
35
+ };
36
+
37
+ exports.Header = Header;
@@ -0,0 +1 @@
1
+ export type { ModalHeaderProps as HeaderProps } from "../../index.props";
@@ -1,23 +1,36 @@
1
1
  'use strict';
2
2
 
3
+ var tslib = require('tslib');
3
4
  var React = require('react');
5
+ var clsx = require('clsx');
4
6
  var index = require('../../../Typography/index.js');
7
+ var context = require('../../context.js');
5
8
  var styles = require('./Title.module.css');
6
9
 
7
10
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
11
 
9
12
  var React__default = /*#__PURE__*/_interopDefault(React);
13
+ var clsx__default = /*#__PURE__*/_interopDefault(clsx);
10
14
  var styles__default = /*#__PURE__*/_interopDefault(styles);
11
15
 
12
- var Title = function Title(_ref) {
13
- var children = _ref.children;
16
+ var Title = function Title(_a) {
17
+ var children = _a.children,
18
+ className = _a.className,
19
+ props = tslib.__rest(_a, ["children", "className"]);
20
+ var _useModalContext = context.useModalContext(),
21
+ titleId = _useModalContext.titleId,
22
+ registerTitle = _useModalContext.registerTitle;
23
+ React.useEffect(function () {
24
+ return registerTitle();
25
+ }, [registerTitle]);
14
26
  return /*#__PURE__*/React__default.default.createElement(index.Typography, {
15
- tag: "h3",
16
- size: "h3",
27
+ tag: "h4",
28
+ size: "h4",
17
29
  className: styles__default.default.title
18
- }, /*#__PURE__*/React__default.default.createElement("div", {
19
- className: styles__default.default.wrapper
20
- }, children));
30
+ }, /*#__PURE__*/React__default.default.createElement("div", Object.assign({}, props, {
31
+ id: titleId,
32
+ className: clsx__default.default(styles__default.default.wrapper, className)
33
+ }), children));
21
34
  };
22
35
 
23
36
  exports.Title = Title;
@@ -1,2 +1 @@
1
- import type { PropsWithChildren } from "react";
2
- export type TitleProps = PropsWithChildren;
1
+ export type { ModalTitleProps as TitleProps } from "../../index.props";
@@ -0,0 +1,9 @@
1
+ type ModalContextValue = {
2
+ onClose: () => void;
3
+ titleId: string;
4
+ registerTitle: () => () => void;
5
+ container: HTMLDivElement | null;
6
+ };
7
+ export declare const ModalContext: import("react").Context<ModalContextValue | null>;
8
+ export declare const useModalContext: () => ModalContextValue;
9
+ export {};
@@ -0,0 +1,15 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+
5
+ var ModalContext = /*#__PURE__*/React.createContext(null);
6
+ var useModalContext = function useModalContext() {
7
+ var context = React.useContext(ModalContext);
8
+ if (!context) {
9
+ throw new Error("Modal compound components must be used inside <Modal>");
10
+ }
11
+ return context;
12
+ };
13
+
14
+ exports.ModalContext = ModalContext;
15
+ exports.useModalContext = useModalContext;
package/Modal/index.d.ts CHANGED
@@ -1,3 +1,13 @@
1
- import type { FC, PropsWithChildren } from "react";
1
+ import React from "react";
2
+ import { Body } from "./components/Body";
3
+ import { Footer } from "./components/Footer";
4
+ import { Header } from "./components/Header";
5
+ import { Title } from "./components/Title";
2
6
  import type { ModalProps } from "./index.props";
3
- export declare const Modal: FC<PropsWithChildren<ModalProps>>;
7
+ export declare const Modal: React.FC<React.PropsWithChildren<ModalProps>> & {
8
+ Header: React.FC<import("./index.props").ModalHeaderProps>;
9
+ Title: React.FC<import("./index.props").ModalTitleProps>;
10
+ Body: React.FC<import("./index.props").ModalBodyProps>;
11
+ Footer: React.FC<import("./index.props").ModalFooterProps>;
12
+ };
13
+ export { Header as ModalHeader, Title as ModalTitle, Body as ModalBody, Footer as ModalFooter, };
package/Modal/index.js CHANGED
@@ -1,38 +1,91 @@
1
1
  'use strict';
2
2
 
3
3
  var _defineProperty = require('@babel/runtime/helpers/defineProperty');
4
+ var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
4
5
  var React = require('react');
5
6
  var clsx = require('clsx');
6
- var index$1 = require('../hooks/useScrollLock/index.js');
7
- var index$2 = require('../hooks/useTrapFocus/index.js');
8
- var index$3 = require('../Portal/index.js');
9
- var index = require('../hooks/useMediaSizes/index.js');
10
- var index$6 = require('./components/Content/index.js');
11
- var index$5 = require('./components/Close/index.js');
12
- var index$4 = require('./components/Title/index.js');
7
+ var index$5 = require('../hooks/useScrollLock/index.js');
8
+ var index$6 = require('../hooks/useTrapFocus/index.js');
9
+ var index$9 = require('../Portal/index.js');
10
+ var index$4 = require('../hooks/useMediaSizes/index.js');
11
+ var index = require('./components/Body/index.js');
12
+ var index$7 = require('./components/Close/index.js');
13
+ var index$8 = require('./components/Content/index.js');
14
+ var index$1 = require('./components/Footer/index.js');
15
+ var index$2 = require('./components/Header/index.js');
16
+ var index$3 = require('./components/Title/index.js');
17
+ var context = require('./context.js');
18
+ var useModalStack = require('./useModalStack.js');
13
19
  var styles = require('./Modal.module.css');
14
20
 
15
21
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
16
22
 
17
23
  var _defineProperty__default = /*#__PURE__*/_interopDefault(_defineProperty);
24
+ var _slicedToArray__default = /*#__PURE__*/_interopDefault(_slicedToArray);
18
25
  var React__default = /*#__PURE__*/_interopDefault(React);
19
26
  var clsx__default = /*#__PURE__*/_interopDefault(clsx);
20
27
  var styles__default = /*#__PURE__*/_interopDefault(styles);
21
28
 
22
- var Modal = function Modal(_ref) {
29
+ var compoundParts = [index$2.Header, index.Body, index$1.Footer];
30
+ var isCompoundPart = function isCompoundPart(child) {
31
+ return /*#__PURE__*/React.isValidElement(child) && compoundParts.includes(child.type);
32
+ };
33
+ var hasHeader = function hasHeader(children) {
34
+ return React.Children.toArray(children).some(function (child) {
35
+ return /*#__PURE__*/React.isValidElement(child) && child.type === index$2.Header;
36
+ });
37
+ };
38
+ var ModalRoot = function ModalRoot(_ref) {
23
39
  var children = _ref.children,
24
40
  className = _ref.className,
25
41
  onClose = _ref.onClose,
26
- title = _ref.title;
42
+ title = _ref.title,
43
+ _ref$withinParent = _ref.withinParent,
44
+ withinParent = _ref$withinParent === void 0 ? false : _ref$withinParent;
27
45
  var modalRef = React.useRef(null);
28
- var isDesktop = index.useMediaSizes(function (bp) {
46
+ var _useState = React.useState(null),
47
+ _useState2 = _slicedToArray__default.default(_useState, 2),
48
+ container = _useState2[0],
49
+ setContainer = _useState2[1];
50
+ var parentModal = React.useContext(context.ModalContext);
51
+ var parentContainer = withinParent ? parentModal === null || parentModal === void 0 ? void 0 : parentModal.container : undefined;
52
+ var isContained = Boolean(parentContainer);
53
+ var isDesktop = index$4.useMediaSizes(function (bp) {
29
54
  return bp.up("md");
30
55
  });
31
- index$1.useScrollLock();
32
- index$2.useTrapFocus(modalRef);
56
+ var titleId = React.useId();
57
+ var _useState3 = React.useState(0),
58
+ _useState4 = _slicedToArray__default.default(_useState3, 2),
59
+ titleCount = _useState4[0],
60
+ setTitleCount = _useState4[1];
61
+ var isTopmost = useModalStack.useModalStack(titleId);
62
+ index$5.useScrollLock();
63
+ index$6.useTrapFocus(modalRef, isTopmost);
33
64
  var handleClose = React.useCallback(function () {
34
65
  onClose === null || onClose === void 0 ? void 0 : onClose();
35
66
  }, [onClose]);
67
+ var registerTitle = React.useCallback(function () {
68
+ setTitleCount(function (count) {
69
+ return count + 1;
70
+ });
71
+ return function () {
72
+ return setTitleCount(function (count) {
73
+ return count - 1;
74
+ });
75
+ };
76
+ }, []);
77
+ var setWrapperRef = React.useCallback(function (node) {
78
+ modalRef.current = node;
79
+ setContainer(node);
80
+ }, []);
81
+ var contextValue = React.useMemo(function () {
82
+ return {
83
+ onClose: handleClose,
84
+ titleId: titleId,
85
+ registerTitle: registerTitle,
86
+ container: container
87
+ };
88
+ }, [handleClose, titleId, registerTitle, container]);
36
89
  var handleOverlayClick = React.useCallback(function (event) {
37
90
  if (event.target === event.currentTarget) {
38
91
  handleClose();
@@ -40,7 +93,7 @@ var Modal = function Modal(_ref) {
40
93
  }, [handleClose]);
41
94
  React.useEffect(function () {
42
95
  var handleEscape = function handleEscape(event) {
43
- if (event.key === "Escape") {
96
+ if (event.key === "Escape" && isTopmost()) {
44
97
  handleClose();
45
98
  }
46
99
  };
@@ -48,30 +101,49 @@ var Modal = function Modal(_ref) {
48
101
  return function () {
49
102
  return document.removeEventListener("keydown", handleEscape);
50
103
  };
51
- }, [handleClose]);
52
- return /*#__PURE__*/React__default.default.createElement(index$3.Portal, null, /*#__PURE__*/React__default.default.createElement("div", {
53
- className: styles__default.default.root,
104
+ }, [handleClose, isTopmost]);
105
+ var isCompound = React.Children.toArray(children).some(isCompoundPart);
106
+ var standaloneClose = /*#__PURE__*/React__default.default.createElement("div", {
107
+ className: styles__default.default["close-wrapper"]
108
+ }, /*#__PURE__*/React__default.default.createElement(index$7.Close, {
109
+ onClick: handleClose,
110
+ "aria-label": "Close modal"
111
+ }));
112
+ var content;
113
+ if (isCompound) {
114
+ content = /*#__PURE__*/React__default.default.createElement(React__default.default.Fragment, null, !hasHeader(children) && standaloneClose, children);
115
+ } else {
116
+ content = /*#__PURE__*/React__default.default.createElement(React__default.default.Fragment, null, title ? (/*#__PURE__*/React__default.default.createElement(index$2.Header, null, /*#__PURE__*/React__default.default.createElement(index$3.Title, null, title))) : standaloneClose, /*#__PURE__*/React__default.default.createElement(index$8.Content, null, children));
117
+ }
118
+ // Wait for the parent window node instead of flashing in document.body.
119
+ if (withinParent && parentModal && !parentContainer) return null;
120
+ return /*#__PURE__*/React__default.default.createElement(index$9.Portal, {
121
+ node: parentContainer
122
+ }, /*#__PURE__*/React__default.default.createElement(context.ModalContext.Provider, {
123
+ value: contextValue
124
+ }, /*#__PURE__*/React__default.default.createElement("div", {
125
+ className: clsx__default.default(styles__default.default.root, _defineProperty__default.default({}, styles__default.default.root_contained, isContained)),
54
126
  role: "dialog",
55
127
  "aria-modal": "true",
56
- "aria-labelledby": title ? "modal-title" : undefined
128
+ "aria-labelledby": titleCount > 0 ? titleId : undefined
57
129
  }, /*#__PURE__*/React__default.default.createElement("div", {
58
130
  className: styles__default.default["modal-overlay"],
59
131
  onClick: handleOverlayClick,
60
132
  "aria-hidden": "true"
61
133
  }), /*#__PURE__*/React__default.default.createElement("div", {
62
- className: clsx__default.default(styles__default.default["modal-wrapper"], _defineProperty__default.default(_defineProperty__default.default({}, styles__default.default["modal-wrapper_desktop"], isDesktop), styles__default.default["modal-wrapper_mobile"], !isDesktop), className),
63
- ref: modalRef
64
- }, title ? (/*#__PURE__*/React__default.default.createElement("div", {
65
- className: styles__default.default["title-wrapper"]
66
- }, /*#__PURE__*/React__default.default.createElement(index$4.Title, null, title), /*#__PURE__*/React__default.default.createElement(index$5.Close, {
67
- onClick: handleClose,
68
- "aria-label": "Close modal"
69
- }))) : (/*#__PURE__*/React__default.default.createElement("div", {
70
- className: styles__default.default["close-wrapper"]
71
- }, /*#__PURE__*/React__default.default.createElement(index$5.Close, {
72
- onClick: handleClose,
73
- "aria-label": "Close modal"
74
- }))), /*#__PURE__*/React__default.default.createElement(index$6.Content, null, children))));
134
+ className: clsx__default.default(styles__default.default["modal-wrapper"], _defineProperty__default.default(_defineProperty__default.default(_defineProperty__default.default({}, styles__default.default["modal-wrapper_desktop"], isDesktop), styles__default.default["modal-wrapper_mobile"], !isDesktop), styles__default.default["modal-wrapper_contained"], isContained), className),
135
+ ref: setWrapperRef
136
+ }, content))));
75
137
  };
138
+ var Modal = Object.assign(ModalRoot, {
139
+ Header: index$2.Header,
140
+ Title: index$3.Title,
141
+ Body: index.Body,
142
+ Footer: index$1.Footer
143
+ });
76
144
 
145
+ exports.ModalBody = index.Body;
146
+ exports.ModalFooter = index$1.Footer;
147
+ exports.ModalHeader = index$2.Header;
148
+ exports.ModalTitle = index$3.Title;
77
149
  exports.Modal = Modal;
@@ -1,5 +1,30 @@
1
+ import type { HTMLAttributes } from "react";
1
2
  export type ModalProps = {
2
3
  className?: string;
3
4
  onClose?: () => void;
5
+ /**
6
+ * Legacy shorthand. Used only when children do not contain
7
+ * `Modal.Header`, `Modal.Body` or `Modal.Footer`.
8
+ */
4
9
  title?: string;
10
+ /**
11
+ * Renders the modal inside the parent modal window: the overlay covers
12
+ * only the parent, not the whole viewport. Works when the modal is
13
+ * rendered inside another `Modal`.
14
+ */
15
+ withinParent?: boolean;
5
16
  };
17
+ export interface ModalHeaderProps extends HTMLAttributes<HTMLDivElement> {
18
+ /**
19
+ * Places the header above the body instead of before it.
20
+ * The header becomes transparent and the body takes the whole modal.
21
+ */
22
+ overlay?: boolean;
23
+ closeAriaLabel?: string;
24
+ }
25
+ export type ModalTitleProps = HTMLAttributes<HTMLDivElement>;
26
+ export interface ModalBodyProps extends HTMLAttributes<HTMLDivElement> {
27
+ /** Removes the body padding so content goes edge to edge. */
28
+ bleed?: boolean;
29
+ }
30
+ export type ModalFooterProps = HTMLAttributes<HTMLDivElement>;
@@ -0,0 +1,2 @@
1
+ /** Tracks open modals so only the topmost one reacts to Escape and Tab. */
2
+ export declare const useModalStack: (id: string) => () => boolean;
@@ -0,0 +1,20 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+
5
+ var stack = [];
6
+ /** Tracks open modals so only the topmost one reacts to Escape and Tab. */
7
+ var useModalStack = function useModalStack(id) {
8
+ React.useEffect(function () {
9
+ stack.push(id);
10
+ return function () {
11
+ var index = stack.lastIndexOf(id);
12
+ if (index !== -1) stack.splice(index, 1);
13
+ };
14
+ }, [id]);
15
+ return React.useCallback(function () {
16
+ return stack[stack.length - 1] === id;
17
+ }, [id]);
18
+ };
19
+
20
+ exports.useModalStack = useModalStack;
@@ -24,10 +24,12 @@ declare const _default: {
24
24
  PROMO_NEON: string;
25
25
  STATUS_JP_SUCCESS: string;
26
26
  STATUS_JP_SUCCESS_BG: string;
27
+ STATUS_JP_SUCCESS_BG_HOVER: string;
27
28
  STATUS_JP_WARNING: string;
28
29
  STATUS_JP_WARNING_BG: string;
29
30
  STATUS_JP_ERROR_ACCENT: string;
30
31
  STATUS_JP_ERROR: string;
32
+ STATUS_JP_ERROR_HOVER: string;
31
33
  STATUS_JP_ERROR_BG: string;
32
34
  STATUS_JP_INFO: string;
33
35
  STATUS_JP_INFO_BG: string;
@@ -127,10 +129,12 @@ declare const _default: {
127
129
  PRIMARY_BA_5: string;
128
130
  STATUS_BA_SUCCESS: string;
129
131
  STATUS_BA_SUCCESS_BG: string;
132
+ STATUS_BA_SUCCESS_BG_HOVER: string;
130
133
  STATUS_BA_WARNING: string;
131
134
  STATUS_BA_WARNING_BG: string;
132
135
  STATUS_BA_ERROR_ACCENT: string;
133
136
  STATUS_BA_ERROR: string;
137
+ STATUS_BA_ERROR_HOVER: string;
134
138
  STATUS_BA_ERROR_BG: string;
135
139
  STATUS_BA_INFO: string;
136
140
  STATUS_BA_INFO_BG: string;
@@ -95,10 +95,12 @@ export declare const PurpleBA: {
95
95
  export declare const StatusBA: {
96
96
  STATUS_BA_SUCCESS: string;
97
97
  STATUS_BA_SUCCESS_BG: string;
98
+ STATUS_BA_SUCCESS_BG_HOVER: string;
98
99
  STATUS_BA_WARNING: string;
99
100
  STATUS_BA_WARNING_BG: string;
100
101
  STATUS_BA_ERROR_ACCENT: string;
101
102
  STATUS_BA_ERROR: string;
103
+ STATUS_BA_ERROR_HOVER: string;
102
104
  STATUS_BA_ERROR_BG: string;
103
105
  STATUS_BA_INFO: string;
104
106
  STATUS_BA_INFO_BG: string;
@@ -160,10 +162,12 @@ declare const Color: {
160
162
  PROMO_NEON: string;
161
163
  STATUS_BA_SUCCESS: string;
162
164
  STATUS_BA_SUCCESS_BG: string;
165
+ STATUS_BA_SUCCESS_BG_HOVER: string;
163
166
  STATUS_BA_WARNING: string;
164
167
  STATUS_BA_WARNING_BG: string;
165
168
  STATUS_BA_ERROR_ACCENT: string;
166
169
  STATUS_BA_ERROR: string;
170
+ STATUS_BA_ERROR_HOVER: string;
167
171
  STATUS_BA_ERROR_BG: string;
168
172
  STATUS_BA_INFO: string;
169
173
  STATUS_BA_INFO_BG: string;
@@ -99,10 +99,12 @@ var PurpleBA = {
99
99
  var StatusBA = {
100
100
  STATUS_BA_SUCCESS: "#244F18",
101
101
  STATUS_BA_SUCCESS_BG: "#E4FFD2",
102
+ STATUS_BA_SUCCESS_BG_HOVER: LimeBA.LIME_BA_200,
102
103
  STATUS_BA_WARNING: "#59470C",
103
104
  STATUS_BA_WARNING_BG: "#FFF4BD",
104
105
  STATUS_BA_ERROR_ACCENT: "#E5484D",
105
106
  STATUS_BA_ERROR: "#7A1D21",
107
+ STATUS_BA_ERROR_HOVER: "#5F1519",
106
108
  STATUS_BA_ERROR_BG: "#FFE8E5",
107
109
  STATUS_BA_INFO: "#123B40",
108
110
  STATUS_BA_INFO_BG: "#DDF7F7"
@@ -96,10 +96,12 @@ export declare const YellowJP: {
96
96
  export declare const StatusJP: {
97
97
  STATUS_JP_SUCCESS: string;
98
98
  STATUS_JP_SUCCESS_BG: string;
99
+ STATUS_JP_SUCCESS_BG_HOVER: string;
99
100
  STATUS_JP_WARNING: string;
100
101
  STATUS_JP_WARNING_BG: string;
101
102
  STATUS_JP_ERROR_ACCENT: string;
102
103
  STATUS_JP_ERROR: string;
104
+ STATUS_JP_ERROR_HOVER: string;
103
105
  STATUS_JP_ERROR_BG: string;
104
106
  STATUS_JP_INFO: string;
105
107
  STATUS_JP_INFO_BG: string;
@@ -161,10 +163,12 @@ declare const Color: {
161
163
  PROMO_NEON: string;
162
164
  STATUS_JP_SUCCESS: string;
163
165
  STATUS_JP_SUCCESS_BG: string;
166
+ STATUS_JP_SUCCESS_BG_HOVER: string;
164
167
  STATUS_JP_WARNING: string;
165
168
  STATUS_JP_WARNING_BG: string;
166
169
  STATUS_JP_ERROR_ACCENT: string;
167
170
  STATUS_JP_ERROR: string;
171
+ STATUS_JP_ERROR_HOVER: string;
168
172
  STATUS_JP_ERROR_BG: string;
169
173
  STATUS_JP_INFO: string;
170
174
  STATUS_JP_INFO_BG: string;
@@ -100,10 +100,12 @@ var YellowJP = {
100
100
  var StatusJP = {
101
101
  STATUS_JP_SUCCESS: "#46591B",
102
102
  STATUS_JP_SUCCESS_BG: "#E6FFA9",
103
+ STATUS_JP_SUCCESS_BG_HOVER: LimeJP.LIME_JP_200,
103
104
  STATUS_JP_WARNING: "#624D15",
104
105
  STATUS_JP_WARNING_BG: "#FFF0AD",
105
106
  STATUS_JP_ERROR_ACCENT: "#D94B69",
106
107
  STATUS_JP_ERROR: "#7A263C",
108
+ STATUS_JP_ERROR_HOVER: PinkJP.PINK_JP_600,
107
109
  STATUS_JP_ERROR_BG: "#FFE5EB",
108
110
  STATUS_JP_INFO: "#303F6C",
109
111
  STATUS_JP_INFO_BG: "#E4EDFF"