@semcore/modal 3.3.6 → 3.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  CHANGELOG.md standards are inspired by [keepachangelog.com](https://keepachangelog.com/en/1.0.0/).
4
4
 
5
+ ## [3.4.0] - 2023-01-18
6
+
7
+ ### Added
8
+
9
+ - Added `Modal.Title` component and `aria-labelledby` property for better a11y.
10
+
5
11
  ## [3.3.6] - 2023-01-11
6
12
 
7
13
  ### Changed
package/lib/cjs/Modal.js CHANGED
@@ -55,6 +55,10 @@ var _intergalacticDynamicLocales = require("./translations/__intergalactic-dynam
55
55
 
56
56
  var _i18nEnhance = _interopRequireDefault(require("@semcore/utils/lib/enhances/i18nEnhance"));
57
57
 
58
+ var _typography = require("@semcore/typography");
59
+
60
+ var _uniqueID = _interopRequireDefault(require("@semcore/utils/lib/uniqueID"));
61
+
58
62
  var _excluded = ["tag"];
59
63
 
60
64
  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); }
@@ -74,15 +78,16 @@ var style = (
74
78
  /*__reshadow_css_start__*/
75
79
  _core.sstyled.insert(
76
80
  /*__inner_css_start__*/
77
- ".___SWindow_t07x2_gg_{position:relative;border-radius:var(--intergalactic-rounded-large,12px);background:var(--intergalactic-bg-primary-neutral,#fff);box-sizing:border-box;margin:auto;padding:var(--intergalactic-spacing-10x,40px);box-shadow:var(--intergalactic-box-shadow-modal,0 3px 8px 0 rgba(25,27,35,.2))}.___SWindow_t07x2_gg_:focus{outline:none}.___SOverlay_t07x2_gg_{position:fixed;top:0;bottom:0;left:0;right:0;margin:0;display:flex;justify-content:center;align-items:center;padding:var(--intergalactic-spacing-10x,40px);background:var(--intergalactic-overlay-primary,rgba(25,27,35,.7));overflow:auto;z-index:var(--intergalactic-z-index-modal,600);-webkit-overflow-scrolling:touch}.___SOverlay_t07x2_gg_ .___SOverlay_t07x2_gg_{background:var(--intergalactic-overlay-secondary,rgba(25,27,35,.4))}.___SClose_t07x2_gg_{display:inline-flex;position:absolute;right:0;top:0;padding:var(--intergalactic-spacing-3x,12px);color:var(--intergalactic-icon-secondary-neutral,#a9abb6);cursor:pointer;z-index:1;border:none;background:none;outline:none}.___SClose_t07x2_gg_:hover{color:var(--intergalactic-icon-secondary-neutral-hover-active,#8a8e9b)}.___SClose_t07x2_gg_.__keyboardFocused_t07x2_gg_{box-shadow:var(--intergalactic-keyboard-focus,0 0 0 3px rgba(0,143,248,.3))}@media (max-width:767px){.___SWindow_t07x2_gg_{min-width:60%}.___SOverlay_t07x2_gg_{padding:var(--intergalactic-spacing-3x,12px)}}"
81
+ ".___SWindow_19pry_gg_{position:relative;border-radius:var(--intergalactic-rounded-large,12px);background:var(--intergalactic-bg-primary-neutral,#fff);box-sizing:border-box;margin:auto;padding:var(--intergalactic-spacing-10x,40px);box-shadow:var(--intergalactic-box-shadow-modal,0 3px 8px 0 rgba(25,27,35,.2))}.___SWindow_19pry_gg_:focus{outline:none}.___SOverlay_19pry_gg_{position:fixed;top:0;bottom:0;left:0;right:0;margin:0;display:flex;justify-content:center;align-items:center;padding:var(--intergalactic-spacing-10x,40px);background:var(--intergalactic-overlay-primary,rgba(25,27,35,.7));overflow:auto;z-index:var(--intergalactic-z-index-modal,600);-webkit-overflow-scrolling:touch}.___SOverlay_19pry_gg_ .___SOverlay_19pry_gg_{background:var(--intergalactic-overlay-secondary,rgba(25,27,35,.4))}.___SClose_19pry_gg_{display:inline-flex;position:absolute;right:0;top:0;padding:var(--intergalactic-spacing-3x,12px);color:var(--intergalactic-icon-secondary-neutral,#a9abb6);cursor:pointer;z-index:1;border:none;background:none;outline:none}.___SClose_19pry_gg_:hover{color:var(--intergalactic-icon-secondary-neutral-hover-active,#8a8e9b)}.___SClose_19pry_gg_.__keyboardFocused_19pry_gg_{box-shadow:var(--intergalactic-keyboard-focus,0 0 0 3px rgba(0,143,248,.3))}.___STitle_19pry_gg_{color:var(--intergalactic-text-primary,#191b23);font-size:var(--intergalactic-fs-500,24px);line-height:var(--intergalactic-lh-500,117%);font-weight:var(--intergalactic-semi-bold,600);margin-bottom:var(--intergalactic-spacing-2x,8px)}@media (max-width:767px){.___SWindow_19pry_gg_{min-width:60%}.___SOverlay_19pry_gg_{padding:var(--intergalactic-spacing-3x,12px)}}"
78
82
  /*__inner_css_end__*/
79
- , "t07x2_gg_")
83
+ , "19pry_gg_")
80
84
  /*__reshadow_css_end__*/
81
85
  , {
82
- "__SWindow": "___SWindow_t07x2_gg_",
83
- "__SOverlay": "___SOverlay_t07x2_gg_",
84
- "__SClose": "___SClose_t07x2_gg_",
85
- "_keyboardFocused": "__keyboardFocused_t07x2_gg_"
86
+ "__SWindow": "___SWindow_19pry_gg_",
87
+ "__SOverlay": "___SOverlay_19pry_gg_",
88
+ "__SClose": "___SClose_19pry_gg_",
89
+ "_keyboardFocused": "__keyboardFocused_19pry_gg_",
90
+ "__STitle": "___STitle_19pry_gg_"
86
91
  });
87
92
 
88
93
  var ModalRoot = /*#__PURE__*/function (_Component) {
@@ -100,6 +105,9 @@ var ModalRoot = /*#__PURE__*/function (_Component) {
100
105
  }
101
106
 
102
107
  _this = _super.call.apply(_super, [this].concat(args));
108
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "state", {
109
+ hasTitle: false
110
+ });
103
111
  (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleKeyDown", function (e) {
104
112
  if (e.key === 'Escape') {
105
113
  e.stopPropagation();
@@ -133,12 +141,15 @@ var ModalRoot = /*#__PURE__*/function (_Component) {
133
141
  var _this$asProps2 = this.asProps,
134
142
  visible = _this$asProps2.visible,
135
143
  closable = _this$asProps2.closable,
136
- getI18nText = _this$asProps2.getI18nText;
144
+ getI18nText = _this$asProps2.getI18nText,
145
+ uid = _this$asProps2.uid;
146
+ var hasTitle = this.state.hasTitle;
137
147
  return {
138
148
  visible: visible,
139
149
  closable: closable,
140
150
  onKeyDown: this.handleKeyDown,
141
- getI18nText: getI18nText
151
+ 'aria-label': hasTitle ? undefined : getI18nText('title'),
152
+ 'aria-labelledby': hasTitle ? "igc-".concat(uid, "-title") : undefined
142
153
  };
143
154
  }
144
155
  }, {
@@ -150,6 +161,24 @@ var ModalRoot = /*#__PURE__*/function (_Component) {
150
161
  getI18nText: getI18nText
151
162
  };
152
163
  }
164
+ }, {
165
+ key: "getTitleProps",
166
+ value: function getTitleProps() {
167
+ var _this2 = this;
168
+
169
+ var uid = this.asProps.uid;
170
+
171
+ var setTitle = function setTitle() {
172
+ return _this2.setState({
173
+ hasTitle: true
174
+ });
175
+ };
176
+
177
+ return {
178
+ id: "igc-".concat(uid, "-title"),
179
+ setTitle: setTitle
180
+ };
181
+ }
153
182
  }, {
154
183
  key: "render",
155
184
  value: function render() {
@@ -168,7 +197,7 @@ var ModalRoot = /*#__PURE__*/function (_Component) {
168
197
 
169
198
  (0, _defineProperty2["default"])(ModalRoot, "displayName", 'Modal');
170
199
  (0, _defineProperty2["default"])(ModalRoot, "style", style);
171
- (0, _defineProperty2["default"])(ModalRoot, "enhance", [(0, _i18nEnhance["default"])(_intergalacticDynamicLocales.localizedMessages)]);
200
+ (0, _defineProperty2["default"])(ModalRoot, "enhance", [(0, _i18nEnhance["default"])(_intergalacticDynamicLocales.localizedMessages), (0, _uniqueID["default"])()]);
172
201
  (0, _defineProperty2["default"])(ModalRoot, "defaultProps", {
173
202
  duration: 200,
174
203
  closable: true,
@@ -176,9 +205,9 @@ var ModalRoot = /*#__PURE__*/function (_Component) {
176
205
  locale: 'en'
177
206
  });
178
207
 
179
- var FocusLockWrapper = /*#__PURE__*/_react["default"].forwardRef(function (_ref8, ref) {
180
- var tag = _ref8.tag,
181
- other = (0, _objectWithoutProperties2["default"])(_ref8, _excluded);
208
+ var FocusLockWrapper = /*#__PURE__*/_react["default"].forwardRef(function (_ref10, ref) {
209
+ var tag = _ref10.tag,
210
+ other = (0, _objectWithoutProperties2["default"])(_ref10, _excluded);
182
211
  return /*#__PURE__*/_react["default"].createElement(_reactFocusLock["default"], (0, _extends2["default"])({
183
212
  ref: ref,
184
213
  as: tag,
@@ -188,33 +217,31 @@ var FocusLockWrapper = /*#__PURE__*/_react["default"].forwardRef(function (_ref8
188
217
 
189
218
  function Window(props) {
190
219
  var _ref2 = arguments[0],
191
- _ref5;
220
+ _ref6;
192
221
 
193
222
  var SWindow = FocusLockWrapper;
194
223
  var Children = props.Children,
195
224
  styles = props.styles,
196
225
  visible = props.visible,
197
- closable = props.closable,
198
- getI18nText = props.getI18nText;
226
+ closable = props.closable;
199
227
  var windowRef = (0, _react.useRef)(null);
200
228
  if (!visible) return null;
201
- return _ref5 = (0, _core.sstyled)(styles), /*#__PURE__*/_react["default"].createElement(SWindow, _ref5.cn("SWindow", _objectSpread({}, (0, _core.assignProps)({
229
+ return _ref6 = (0, _core.sstyled)(styles), /*#__PURE__*/_react["default"].createElement(SWindow, _ref6.cn("SWindow", _objectSpread({}, (0, _core.assignProps)({
202
230
  "tag": _flexBox.Box,
203
231
  "ref": windowRef,
204
232
  "returnFocus": true,
205
233
  "tabIndex": -1,
206
234
  "autoFocus": true,
207
235
  "role": "dialog",
208
- "aria-label": getI18nText('title'),
209
236
  "aria-modal": true
210
- }, _ref2))), /*#__PURE__*/_react["default"].createElement(_portal.PortalProvider, _ref5.cn("PortalProvider", {
237
+ }, _ref2))), /*#__PURE__*/_react["default"].createElement(_portal.PortalProvider, _ref6.cn("PortalProvider", {
211
238
  "value": windowRef
212
- }), closable && /*#__PURE__*/_react["default"].createElement(Modal.Close, null), /*#__PURE__*/_react["default"].createElement(Children, _ref5.cn("Children", {}))));
239
+ }), closable && /*#__PURE__*/_react["default"].createElement(Modal.Close, null), /*#__PURE__*/_react["default"].createElement(Children, _ref6.cn("Children", {}))));
213
240
  }
214
241
 
215
242
  function Overlay(props) {
216
243
  var _ref3 = arguments[0],
217
- _ref6;
244
+ _ref7;
218
245
 
219
246
  var SOverlay = _animation.FadeInOut;
220
247
  var Children = props.Children,
@@ -223,36 +250,53 @@ function Overlay(props) {
223
250
  visible = props.visible;
224
251
  var overlayRef = (0, _react.useRef)(null);
225
252
  (0, _usePreventScroll["default"])(visible);
226
- return _ref6 = (0, _core.sstyled)(styles), /*#__PURE__*/_react["default"].createElement(SOverlay, _ref6.cn("SOverlay", _objectSpread({}, (0, _core.assignProps)({
253
+ return _ref7 = (0, _core.sstyled)(styles), /*#__PURE__*/_react["default"].createElement(SOverlay, _ref7.cn("SOverlay", _objectSpread({}, (0, _core.assignProps)({
227
254
  "ref": overlayRef
228
- }, _ref3))), /*#__PURE__*/_react["default"].createElement(_outsideClick["default"], _ref6.cn("OutsideClick", {
255
+ }, _ref3))), /*#__PURE__*/_react["default"].createElement(_outsideClick["default"], _ref7.cn("OutsideClick", {
229
256
  "root": overlayRef,
230
257
  "onOutsideClick": onOutsideClick
231
- }), /*#__PURE__*/_react["default"].createElement(Children, _ref6.cn("Children", {}))));
258
+ }), /*#__PURE__*/_react["default"].createElement(Children, _ref7.cn("Children", {}))));
232
259
  }
233
260
 
234
261
  function Close(props) {
235
262
  var _ref4 = arguments[0],
236
- _ref7;
263
+ _ref8;
237
264
 
238
265
  var SClose = _flexBox.Box;
239
266
  var Children = props.Children,
240
267
  hasChildren = props.children,
241
268
  getI18nText = props.getI18nText;
242
- return _ref7 = (0, _core.sstyled)(props.styles), /*#__PURE__*/_react["default"].createElement(SClose, _ref7.cn("SClose", _objectSpread({}, (0, _core.assignProps)({
269
+ return _ref8 = (0, _core.sstyled)(props.styles), /*#__PURE__*/_react["default"].createElement(SClose, _ref8.cn("SClose", _objectSpread({}, (0, _core.assignProps)({
243
270
  "tag": "button",
244
271
  "tabIndex": 0,
245
272
  "aria-label": getI18nText('close')
246
- }, _ref4))), hasChildren ? /*#__PURE__*/_react["default"].createElement(Children, _ref7.cn("Children", {})) : /*#__PURE__*/_react["default"].createElement(_l["default"], _ref7.cn("CloseIcon", {
273
+ }, _ref4))), hasChildren ? /*#__PURE__*/_react["default"].createElement(Children, _ref8.cn("Children", {})) : /*#__PURE__*/_react["default"].createElement(_l["default"], _ref8.cn("CloseIcon", {
247
274
  "title": getI18nText('close')
248
275
  })));
249
276
  }
250
277
 
251
278
  Close.enhance = [(0, _keyboardFocusEnhance["default"])()];
279
+
280
+ function Title(props) {
281
+ var _ref5 = arguments[0],
282
+ _ref9;
283
+
284
+ var setTitle = props.setTitle,
285
+ styles = props.styles;
286
+ var STitle = _typography.Text;
287
+ (0, _react.useEffect)(function () {
288
+ return setTitle();
289
+ });
290
+ return _ref9 = (0, _core.sstyled)(styles), /*#__PURE__*/_react["default"].createElement(STitle, _ref9.cn("STitle", _objectSpread({}, (0, _core.assignProps)({
291
+ "tag": "h2"
292
+ }, _ref5))));
293
+ }
294
+
252
295
  var Modal = (0, _core["default"])(ModalRoot, {
253
296
  Window: Window,
254
297
  Overlay: Overlay,
255
- Close: Close
298
+ Close: Close,
299
+ Title: Title
256
300
  });
257
301
  var _default = Modal;
258
302
  exports["default"] = _default;
@@ -1 +1 @@
1
- {"version":3,"file":"Modal.js","names":["ModalRoot","e","key","stopPropagation","fire","asProps","duration","visible","onOutsideClick","handleOutsideClick","closable","getI18nText","onKeyDown","handleKeyDown","onClick","handleIconCloseClick","Children","disablePortal","advanceMode","isAdvanceMode","Modal","Overlay","displayName","Window","Component","style","i18nEnhance","localizedMessages","i18n","locale","FocusLockWrapper","React","forwardRef","ref","tag","other","props","SWindow","styles","windowRef","useRef","sstyled","Box","SOverlay","FadeInOut","overlayRef","usePreventScroll","Close","SClose","hasChildren","children","enhance","keyboardFocusEnhance","createComponent"],"sources":["../../src/Modal.jsx"],"sourcesContent":["import React, { useRef } from 'react';\nimport FocusLock from 'react-focus-lock';\nimport { FadeInOut } from '@semcore/animation';\nimport createComponent, { Component, sstyled, Root } from '@semcore/core';\nimport Portal, { PortalProvider } from '@semcore/portal';\nimport { Box } from '@semcore/flex-box';\nimport OutsideClick from '@semcore/outside-click';\nimport CloseIcon from '@semcore/icon/Close/l';\nimport fire from '@semcore/utils/lib/fire';\nimport usePreventScroll from '@semcore/utils/lib/use/usePreventScroll';\nimport { isAdvanceMode } from '@semcore/utils/lib/findComponent';\nimport keyboardFocusEnhance from '@semcore/utils/lib/enhances/keyboardFocusEnhance';\nimport style from './style/modal.shadow.css';\nimport { localizedMessages } from './translations/__intergalactic-dynamic-locales';\nimport i18nEnhance from '@semcore/utils/lib/enhances/i18nEnhance';\n\nclass ModalRoot extends Component {\n static displayName = 'Modal';\n static style = style;\n static enhance = [i18nEnhance(localizedMessages)];\n static defaultProps = {\n duration: 200,\n closable: true,\n i18n: localizedMessages,\n locale: 'en',\n };\n\n handleKeyDown = (e) => {\n if (e.key === 'Escape') {\n e.stopPropagation();\n fire(this, 'onClose', 'onEscape', e);\n }\n };\n\n handleIconCloseClick = (e) => {\n fire(this, 'onClose', 'onCloseClick', e);\n };\n\n handleOutsideClick = (e) => {\n fire(this, 'onClose', 'onOutsideClick', e);\n };\n\n getOverlayProps() {\n const { duration, visible } = this.asProps;\n return {\n duration,\n visible,\n onOutsideClick: this.handleOutsideClick,\n };\n }\n\n getWindowProps() {\n const { visible, closable, getI18nText } = this.asProps;\n return {\n visible,\n closable,\n onKeyDown: this.handleKeyDown,\n getI18nText,\n };\n }\n\n getCloseProps() {\n const { getI18nText } = this.asProps;\n\n return {\n onClick: this.handleIconCloseClick,\n getI18nText,\n };\n }\n\n render() {\n const { Children, disablePortal } = this.asProps;\n\n const advanceMode = isAdvanceMode(Children, [\n Modal.Overlay.displayName,\n Modal.Window.displayName,\n ]);\n\n return (\n <Portal disablePortal={disablePortal}>\n {advanceMode ? (\n <Children />\n ) : (\n <Modal.Overlay>\n <Root render={Modal.Window} />\n </Modal.Overlay>\n )}\n </Portal>\n );\n }\n}\n\nconst FocusLockWrapper = React.forwardRef(function ({ tag, ...other }, ref) {\n return <FocusLock ref={ref} as={tag} lockProps={other} {...other} />;\n});\n\nfunction Window(props) {\n const SWindow = Root;\n const { Children, styles, visible, closable, getI18nText } = props;\n const windowRef = useRef(null);\n\n if (!visible) return null;\n\n return sstyled(styles)(\n <SWindow\n render={FocusLockWrapper}\n tag={Box}\n ref={windowRef}\n returnFocus={true}\n tabIndex={-1}\n autoFocus={true}\n role=\"dialog\"\n aria-label={getI18nText('title')}\n aria-modal={true}\n >\n <PortalProvider value={windowRef}>\n {closable && <Modal.Close />}\n <Children />\n </PortalProvider>\n </SWindow>,\n );\n}\n\nfunction Overlay(props) {\n const SOverlay = Root;\n const { Children, styles, onOutsideClick, visible } = props;\n const overlayRef = useRef(null);\n usePreventScroll(visible);\n\n return sstyled(styles)(\n <SOverlay render={FadeInOut} ref={overlayRef}>\n <OutsideClick root={overlayRef} onOutsideClick={onOutsideClick}>\n <Children />\n </OutsideClick>\n </SOverlay>,\n );\n}\n\nfunction Close(props) {\n const SClose = Root;\n const { Children, children: hasChildren, getI18nText } = props;\n return sstyled(props.styles)(\n <SClose render={Box} tag=\"button\" tabIndex={0} aria-label={getI18nText('close')}>\n {hasChildren ? <Children /> : <CloseIcon title={getI18nText('close')} />}\n </SClose>,\n );\n}\n\nClose.enhance = [keyboardFocusEnhance()];\n\nconst Modal = createComponent(ModalRoot, {\n Window,\n Overlay,\n Close,\n});\n\nexport default Modal;\n"],"mappings":"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"}
1
+ {"version":3,"file":"Modal.js","names":["ModalRoot","hasTitle","e","key","stopPropagation","fire","asProps","duration","visible","onOutsideClick","handleOutsideClick","closable","getI18nText","uid","state","onKeyDown","handleKeyDown","undefined","onClick","handleIconCloseClick","setTitle","setState","id","Children","disablePortal","advanceMode","isAdvanceMode","Modal","Overlay","displayName","Window","Component","style","i18nEnhance","localizedMessages","uniqueIDEnhancement","i18n","locale","FocusLockWrapper","React","forwardRef","ref","tag","other","props","SWindow","styles","windowRef","useRef","sstyled","Box","SOverlay","FadeInOut","overlayRef","usePreventScroll","Close","SClose","hasChildren","children","enhance","keyboardFocusEnhance","Title","STitle","Text","useEffect","createComponent"],"sources":["../../src/Modal.jsx"],"sourcesContent":["import React, { useRef, useEffect } from 'react';\nimport FocusLock from 'react-focus-lock';\nimport { FadeInOut } from '@semcore/animation';\nimport createComponent, { Component, sstyled, Root } from '@semcore/core';\nimport Portal, { PortalProvider } from '@semcore/portal';\nimport { Box } from '@semcore/flex-box';\nimport OutsideClick from '@semcore/outside-click';\nimport CloseIcon from '@semcore/icon/Close/l';\nimport fire from '@semcore/utils/lib/fire';\nimport usePreventScroll from '@semcore/utils/lib/use/usePreventScroll';\nimport { isAdvanceMode } from '@semcore/utils/lib/findComponent';\nimport keyboardFocusEnhance from '@semcore/utils/lib/enhances/keyboardFocusEnhance';\nimport style from './style/modal.shadow.css';\nimport { localizedMessages } from './translations/__intergalactic-dynamic-locales';\nimport i18nEnhance from '@semcore/utils/lib/enhances/i18nEnhance';\nimport { Text } from '@semcore/typography';\nimport uniqueIDEnhancement from '@semcore/utils/lib/uniqueID';\n\nclass ModalRoot extends Component {\n static displayName = 'Modal';\n static style = style;\n static enhance = [i18nEnhance(localizedMessages), uniqueIDEnhancement()];\n static defaultProps = {\n duration: 200,\n closable: true,\n i18n: localizedMessages,\n locale: 'en',\n };\n state = { hasTitle: false };\n\n handleKeyDown = (e) => {\n if (e.key === 'Escape') {\n e.stopPropagation();\n fire(this, 'onClose', 'onEscape', e);\n }\n };\n\n handleIconCloseClick = (e) => {\n fire(this, 'onClose', 'onCloseClick', e);\n };\n\n handleOutsideClick = (e) => {\n fire(this, 'onClose', 'onOutsideClick', e);\n };\n\n getOverlayProps() {\n const { duration, visible } = this.asProps;\n return {\n duration,\n visible,\n onOutsideClick: this.handleOutsideClick,\n };\n }\n\n getWindowProps() {\n const { visible, closable, getI18nText, uid } = this.asProps;\n const { hasTitle } = this.state;\n return {\n visible,\n closable,\n onKeyDown: this.handleKeyDown,\n 'aria-label': hasTitle ? undefined : getI18nText('title'),\n 'aria-labelledby': hasTitle ? `igc-${uid}-title` : undefined,\n };\n }\n\n getCloseProps() {\n const { getI18nText } = this.asProps;\n\n return {\n onClick: this.handleIconCloseClick,\n getI18nText,\n };\n }\n\n getTitleProps() {\n const { uid } = this.asProps;\n const setTitle = () => this.setState({ hasTitle: true });\n\n return {\n id: `igc-${uid}-title`,\n setTitle,\n };\n }\n\n render() {\n const { Children, disablePortal } = this.asProps;\n\n const advanceMode = isAdvanceMode(Children, [\n Modal.Overlay.displayName,\n Modal.Window.displayName,\n ]);\n\n return (\n <Portal disablePortal={disablePortal}>\n {advanceMode ? (\n <Children />\n ) : (\n <Modal.Overlay>\n <Root render={Modal.Window} />\n </Modal.Overlay>\n )}\n </Portal>\n );\n }\n}\n\nconst FocusLockWrapper = React.forwardRef(function ({ tag, ...other }, ref) {\n return <FocusLock ref={ref} as={tag} lockProps={other} {...other} />;\n});\n\nfunction Window(props) {\n const SWindow = Root;\n const { Children, styles, visible, closable } = props;\n const windowRef = useRef(null);\n\n if (!visible) return null;\n\n return sstyled(styles)(\n <SWindow\n render={FocusLockWrapper}\n tag={Box}\n ref={windowRef}\n returnFocus={true}\n tabIndex={-1}\n autoFocus={true}\n role=\"dialog\"\n aria-modal={true}\n >\n <PortalProvider value={windowRef}>\n {closable && <Modal.Close />}\n <Children />\n </PortalProvider>\n </SWindow>,\n );\n}\n\nfunction Overlay(props) {\n const SOverlay = Root;\n const { Children, styles, onOutsideClick, visible } = props;\n const overlayRef = useRef(null);\n usePreventScroll(visible);\n\n return sstyled(styles)(\n <SOverlay render={FadeInOut} ref={overlayRef}>\n <OutsideClick root={overlayRef} onOutsideClick={onOutsideClick}>\n <Children />\n </OutsideClick>\n </SOverlay>,\n );\n}\n\nfunction Close(props) {\n const SClose = Root;\n const { Children, children: hasChildren, getI18nText } = props;\n return sstyled(props.styles)(\n <SClose render={Box} tag=\"button\" tabIndex={0} aria-label={getI18nText('close')}>\n {hasChildren ? <Children /> : <CloseIcon title={getI18nText('close')} />}\n </SClose>,\n );\n}\n\nClose.enhance = [keyboardFocusEnhance()];\n\nfunction Title(props) {\n const { setTitle, styles } = props;\n const STitle = Root;\n\n useEffect(() => setTitle());\n\n return sstyled(styles)(<STitle render={Text} tag=\"h2\" />);\n}\n\nconst Modal = createComponent(ModalRoot, {\n Window,\n Overlay,\n Close,\n Title,\n});\n\nexport default Modal;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.js","names":[],"sources":["../../src/index.d.ts"],"sourcesContent":["import React, { ComponentProps } from 'react';\nimport { IFadeInOutProps } from '@semcore/animation';\nimport { CProps, PropGetterFn, ReturnEl } from '@semcore/core';\nimport { IPortalProps } from '@semcore/portal';\nimport { Box, IBoxProps } from '@semcore/flex-box';\n\nexport interface IModalProps extends IPortalProps, IBoxProps, IFadeInOutProps {\n /** Duration of animation, ms\n * @default 200\n */\n duration?: number;\n /** This property is responsible for the visibility of the modal window */\n visible?: boolean;\n /** Function called when the component is hidden */\n onClose?: (\n trigger: 'onOutsideClick' | 'onCloseClick' | 'onEscape',\n e?: React.MouseEvent | React.KeyboardEvent,\n ) => void;\n /** Displaying the close button(x) in the upper-right corner of the modal dialog\n * @default true\n * */\n closable?: boolean;\n locale?: string;\n}\n\nexport interface IModalContext {\n getOverlayProps: PropGetterFn;\n getWindowProps: PropGetterFn;\n getCloseProps: PropGetterFn;\n}\n\ndeclare const Modal: (<T>(props: CProps<IModalProps & T, IModalContext>) => ReturnEl) & {\n Window: <T>(props: ComponentProps<typeof Box> & T) => ReturnEl;\n Overlay: <T>(props: ComponentProps<typeof Box> & T) => ReturnEl;\n Close: <T>(props: ComponentProps<typeof Box> & T) => ReturnEl;\n};\n\nexport default Modal;\n"],"mappings":""}
1
+ {"version":3,"file":"index.d.js","names":[],"sources":["../../src/index.d.ts"],"sourcesContent":["import React, { ComponentProps } from 'react';\nimport { IFadeInOutProps } from '@semcore/animation';\nimport { CProps, PropGetterFn, ReturnEl } from '@semcore/core';\nimport { IPortalProps } from '@semcore/portal';\nimport { Box, IBoxProps } from '@semcore/flex-box';\nimport { ITextProps } from '@semcore/typography';\n\nexport interface IModalProps extends IPortalProps, IBoxProps, IFadeInOutProps {\n /** Duration of animation, ms\n * @default 200\n */\n duration?: number;\n /** This property is responsible for the visibility of the modal window */\n visible?: boolean;\n /** Function called when the component is hidden */\n onClose?: (\n trigger: 'onOutsideClick' | 'onCloseClick' | 'onEscape',\n e?: React.MouseEvent | React.KeyboardEvent,\n ) => void;\n /** Displaying the close button(x) in the upper-right corner of the modal dialog\n * @default true\n * */\n closable?: boolean;\n locale?: string;\n}\n\nexport interface IModalContext {\n getOverlayProps: PropGetterFn;\n getWindowProps: PropGetterFn;\n getCloseProps: PropGetterFn;\n}\n\ndeclare const Modal: (<T>(props: CProps<IModalProps & T, IModalContext>) => ReturnEl) & {\n Window: <T>(props: ComponentProps<typeof Box> & T) => ReturnEl;\n Overlay: <T>(props: ComponentProps<typeof Box> & T) => ReturnEl;\n Close: <T>(props: ComponentProps<typeof Box> & T) => ReturnEl;\n Title: <T>(props: ITextProps & T) => ReturnEl;\n};\n\nexport default Modal;\n"],"mappings":""}
@@ -68,7 +68,7 @@ function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyri
68
68
 
69
69
  case 25:
70
70
  _context.t3 = _context.sent;
71
- (0, _context.t2)(_context.t3).toBe('Modal window web dialog with 5 items Close button');
71
+ (0, _context.t2)(_context.t3).toBe('Do you want to save your changes? web dialog with 5 items Close button');
72
72
  _context.next = 29;
73
73
  return voiceOver.next();
74
74
 
@@ -1 +1 @@
1
- {"version":3,"file":"modal.vo-test.js","names":["test","page","pureVoiceOver","voiceOver","standPath","resolvePath","__dirname","reportPath","e2eStandToHtml","htmlContent","setContent","makeVoiceOverReporter","getReport","interact","expect","itemText","toBe","act","lastSpokenPhrase","next","getReportHeader","report","writeFile"],"sources":["../../src/modal.vo-test.ts"],"sourcesContent":["import { expect } from '@playwright/test';\nimport { voTest as test } from '@guidepup/playwright';\nimport { e2eStandToHtml } from '@semcore/jest-preset-ui/e2e-stand';\nimport { resolve as resolvePath } from 'path';\nimport { writeFile } from 'fs/promises';\nimport { getReportHeader, makeVoiceOverReporter } from '@semcore/jest-preset-ui/vo-reporter';\n\ntest('Users can interact with Modal via VoiceOver', async ({ page, voiceOver: pureVoiceOver }) => {\n const standPath = resolvePath(\n __dirname,\n '../../../website/docs/components/modal/examples/modal.jsx',\n );\n const reportPath = resolvePath(\n __dirname,\n '../../../website/docs/components/modal/modal-a11y-report.md',\n );\n const htmlContent = await e2eStandToHtml(standPath, 'en');\n\n await page.setContent(htmlContent);\n const { voiceOver, getReport } = await makeVoiceOverReporter(pureVoiceOver);\n await voiceOver.interact();\n\n expect(await voiceOver.itemText()).toBe('Open modal button');\n await voiceOver.act();\n expect(await voiceOver.lastSpokenPhrase()).toBe(\n 'Modal window web dialog with 5 items Close button',\n );\n await voiceOver.next();\n expect(await voiceOver.itemText()).toBe('Do you want to save your changes? heading level 2');\n await voiceOver.next();\n await voiceOver.next();\n expect(await voiceOver.itemText()).toBe('Save changes button');\n await voiceOver.act();\n expect(await voiceOver.itemText()).toBe('Open modal button');\n\n const report = (await getReportHeader()) + '\\n\\n' + (await getReport(standPath));\n\n await writeFile(reportPath, report);\n});\n"],"mappings":";;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AACA;;+CAJA,oJ;;AAMA,IAAAA,kBAAA,EAAK,6CAAL;EAAA,wFAAoD;IAAA;;IAAA;MAAA;QAAA;UAAA;YAASC,IAAT,QAASA,IAAT,EAA0BC,aAA1B,QAAeC,SAAf;YAC5CC,SAD4C,GAChC,IAAAC,aAAA,EAChBC,SADgB,EAEhB,2DAFgB,CADgC;YAK5CC,UAL4C,GAK/B,IAAAF,aAAA,EACjBC,SADiB,EAEjB,6DAFiB,CAL+B;YAAA;YAAA,OASxB,IAAAE,wBAAA,EAAeJ,SAAf,EAA0B,IAA1B,CATwB;;UAAA;YAS5CK,WAT4C;YAAA;YAAA,OAW5CR,IAAI,CAACS,UAAL,CAAgBD,WAAhB,CAX4C;;UAAA;YAAA;YAAA,OAYX,IAAAE,iCAAA,EAAsBT,aAAtB,CAZW;;UAAA;YAAA;YAY1CC,SAZ0C,yBAY1CA,SAZ0C;YAY/BS,SAZ+B,yBAY/BA,SAZ+B;YAAA;YAAA,OAa5CT,SAAS,CAACU,QAAV,EAb4C;;UAAA;YAAA,cAelDC,YAfkD;YAAA;YAAA,OAerCX,SAAS,CAACY,QAAV,EAfqC;;UAAA;YAAA;YAAA,8BAefC,IAfe,CAeV,mBAfU;YAAA;YAAA,OAgB5Cb,SAAS,CAACc,GAAV,EAhB4C;;UAAA;YAAA,cAiBlDH,YAjBkD;YAAA;YAAA,OAiBrCX,SAAS,CAACe,gBAAV,EAjBqC;;UAAA;YAAA;YAAA,8BAiBPF,IAjBO,CAkBhD,mDAlBgD;YAAA;YAAA,OAoB5Cb,SAAS,CAACgB,IAAV,EApB4C;;UAAA;YAAA,cAqBlDL,YArBkD;YAAA;YAAA,OAqBrCX,SAAS,CAACY,QAAV,EArBqC;;UAAA;YAAA;YAAA,8BAqBfC,IArBe,CAqBV,mDArBU;YAAA;YAAA,OAsB5Cb,SAAS,CAACgB,IAAV,EAtB4C;;UAAA;YAAA;YAAA,OAuB5ChB,SAAS,CAACgB,IAAV,EAvB4C;;UAAA;YAAA,cAwBlDL,YAxBkD;YAAA;YAAA,OAwBrCX,SAAS,CAACY,QAAV,EAxBqC;;UAAA;YAAA;YAAA,8BAwBfC,IAxBe,CAwBV,qBAxBU;YAAA;YAAA,OAyB5Cb,SAAS,CAACc,GAAV,EAzB4C;;UAAA;YAAA,cA0BlDH,YA1BkD;YAAA;YAAA,OA0BrCX,SAAS,CAACY,QAAV,EA1BqC;;UAAA;YAAA;YAAA,8BA0BfC,IA1Be,CA0BV,mBA1BU;YAAA;YAAA,OA4B5B,IAAAI,2BAAA,GA5B4B;;UAAA;YAAA;YAAA,8BA4BP,MA5BO;YAAA;YAAA,OA4BSR,SAAS,CAACR,SAAD,CA5BlB;;UAAA;YAAA;YA4B5CiB,MA5B4C;YAAA;YAAA,OA8B5C,IAAAC,mBAAA,EAAUf,UAAV,EAAsBc,MAAtB,CA9B4C;;UAAA;UAAA;YAAA;QAAA;MAAA;IAAA;EAAA,CAApD;;EAAA;IAAA;EAAA;AAAA"}
1
+ {"version":3,"file":"modal.vo-test.js","names":["test","page","pureVoiceOver","voiceOver","standPath","resolvePath","__dirname","reportPath","e2eStandToHtml","htmlContent","setContent","makeVoiceOverReporter","getReport","interact","expect","itemText","toBe","act","lastSpokenPhrase","next","getReportHeader","report","writeFile"],"sources":["../../src/modal.vo-test.ts"],"sourcesContent":["import { expect } from '@playwright/test';\nimport { voTest as test } from '@guidepup/playwright';\nimport { e2eStandToHtml } from '@semcore/jest-preset-ui/e2e-stand';\nimport { resolve as resolvePath } from 'path';\nimport { writeFile } from 'fs/promises';\nimport { getReportHeader, makeVoiceOverReporter } from '@semcore/jest-preset-ui/vo-reporter';\n\ntest('Users can interact with Modal via VoiceOver', async ({ page, voiceOver: pureVoiceOver }) => {\n const standPath = resolvePath(\n __dirname,\n '../../../website/docs/components/modal/examples/modal.jsx',\n );\n const reportPath = resolvePath(\n __dirname,\n '../../../website/docs/components/modal/modal-a11y-report.md',\n );\n const htmlContent = await e2eStandToHtml(standPath, 'en');\n\n await page.setContent(htmlContent);\n const { voiceOver, getReport } = await makeVoiceOverReporter(pureVoiceOver);\n await voiceOver.interact();\n\n expect(await voiceOver.itemText()).toBe('Open modal button');\n await voiceOver.act();\n expect(await voiceOver.lastSpokenPhrase()).toBe(\n 'Do you want to save your changes? web dialog with 5 items Close button',\n );\n await voiceOver.next();\n expect(await voiceOver.itemText()).toBe('Do you want to save your changes? heading level 2');\n await voiceOver.next();\n await voiceOver.next();\n expect(await voiceOver.itemText()).toBe('Save changes button');\n await voiceOver.act();\n expect(await voiceOver.itemText()).toBe('Open modal button');\n\n const report = (await getReportHeader()) + '\\n\\n' + (await getReport(standPath));\n\n await writeFile(reportPath, report);\n});\n"],"mappings":";;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AACA;;+CAJA,oJ;;AAMA,IAAAA,kBAAA,EAAK,6CAAL;EAAA,wFAAoD;IAAA;;IAAA;MAAA;QAAA;UAAA;YAASC,IAAT,QAASA,IAAT,EAA0BC,aAA1B,QAAeC,SAAf;YAC5CC,SAD4C,GAChC,IAAAC,aAAA,EAChBC,SADgB,EAEhB,2DAFgB,CADgC;YAK5CC,UAL4C,GAK/B,IAAAF,aAAA,EACjBC,SADiB,EAEjB,6DAFiB,CAL+B;YAAA;YAAA,OASxB,IAAAE,wBAAA,EAAeJ,SAAf,EAA0B,IAA1B,CATwB;;UAAA;YAS5CK,WAT4C;YAAA;YAAA,OAW5CR,IAAI,CAACS,UAAL,CAAgBD,WAAhB,CAX4C;;UAAA;YAAA;YAAA,OAYX,IAAAE,iCAAA,EAAsBT,aAAtB,CAZW;;UAAA;YAAA;YAY1CC,SAZ0C,yBAY1CA,SAZ0C;YAY/BS,SAZ+B,yBAY/BA,SAZ+B;YAAA;YAAA,OAa5CT,SAAS,CAACU,QAAV,EAb4C;;UAAA;YAAA,cAelDC,YAfkD;YAAA;YAAA,OAerCX,SAAS,CAACY,QAAV,EAfqC;;UAAA;YAAA;YAAA,8BAefC,IAfe,CAeV,mBAfU;YAAA;YAAA,OAgB5Cb,SAAS,CAACc,GAAV,EAhB4C;;UAAA;YAAA,cAiBlDH,YAjBkD;YAAA;YAAA,OAiBrCX,SAAS,CAACe,gBAAV,EAjBqC;;UAAA;YAAA;YAAA,8BAiBPF,IAjBO,CAkBhD,wEAlBgD;YAAA;YAAA,OAoB5Cb,SAAS,CAACgB,IAAV,EApB4C;;UAAA;YAAA,cAqBlDL,YArBkD;YAAA;YAAA,OAqBrCX,SAAS,CAACY,QAAV,EArBqC;;UAAA;YAAA;YAAA,8BAqBfC,IArBe,CAqBV,mDArBU;YAAA;YAAA,OAsB5Cb,SAAS,CAACgB,IAAV,EAtB4C;;UAAA;YAAA;YAAA,OAuB5ChB,SAAS,CAACgB,IAAV,EAvB4C;;UAAA;YAAA,cAwBlDL,YAxBkD;YAAA;YAAA,OAwBrCX,SAAS,CAACY,QAAV,EAxBqC;;UAAA;YAAA;YAAA,8BAwBfC,IAxBe,CAwBV,qBAxBU;YAAA;YAAA,OAyB5Cb,SAAS,CAACc,GAAV,EAzB4C;;UAAA;YAAA,cA0BlDH,YA1BkD;YAAA;YAAA,OA0BrCX,SAAS,CAACY,QAAV,EA1BqC;;UAAA;YAAA;YAAA,8BA0BfC,IA1Be,CA0BV,mBA1BU;YAAA;YAAA,OA4B5B,IAAAI,2BAAA,GA5B4B;;UAAA;YAAA;YAAA,8BA4BP,MA5BO;YAAA;YAAA,OA4BSR,SAAS,CAACR,SAAD,CA5BlB;;UAAA;YAAA;YA4B5CiB,MA5B4C;YAAA;YAAA,OA8B5C,IAAAC,mBAAA,EAAUf,UAAV,EAAsBc,MAAtB,CA9B4C;;UAAA;UAAA;YAAA;QAAA;MAAA;IAAA;EAAA,CAApD;;EAAA;IAAA;EAAA;AAAA"}
@@ -55,6 +55,14 @@ SClose[keyboardFocused] {
55
55
  box-shadow: var(--intergalactic-keyboard-focus, 0px 0px 0px 3px rgba(0, 143, 248, 0.3));
56
56
  }
57
57
 
58
+ STitle {
59
+ color: var(--intergalactic-text-primary, #191b23);
60
+ font-size: var(--intergalactic-fs-500, 24px);
61
+ line-height: var(--intergalactic-lh-500, 117%);
62
+ font-weight: var(--intergalactic-semi-bold, 600);
63
+ margin-bottom: var(--intergalactic-spacing-2x, 8px);
64
+ }
65
+
58
66
  @media (max-width: 767px) {
59
67
  SWindow {
60
68
  min-width: 60%;
package/lib/es6/Modal.js CHANGED
@@ -8,6 +8,7 @@ import _possibleConstructorReturn from "@babel/runtime/helpers/possibleConstruct
8
8
  import _getPrototypeOf from "@babel/runtime/helpers/getPrototypeOf";
9
9
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
10
10
  import { sstyled as _sstyled } from "@semcore/core";
11
+ import { assignProps as _assignProps5 } from "@semcore/core";
11
12
  import { assignProps as _assignProps4 } from "@semcore/core";
12
13
  import { assignProps as _assignProps3 } from "@semcore/core";
13
14
  import { assignProps as _assignProps2 } from "@semcore/core";
@@ -22,7 +23,7 @@ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflec
22
23
 
23
24
  function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
24
25
 
25
- import React, { useRef } from 'react';
26
+ import React, { useRef, useEffect } from 'react';
26
27
  import FocusLock from 'react-focus-lock';
27
28
  import { FadeInOut } from '@semcore/animation';
28
29
  import createComponent, { Component, sstyled, Root } from '@semcore/core';
@@ -40,18 +41,21 @@ var style = (
40
41
  /*__reshadow_css_start__*/
41
42
  _sstyled.insert(
42
43
  /*__inner_css_start__*/
43
- ".___SWindow_t07x2_gg_{position:relative;border-radius:var(--intergalactic-rounded-large,12px);background:var(--intergalactic-bg-primary-neutral,#fff);box-sizing:border-box;margin:auto;padding:var(--intergalactic-spacing-10x,40px);box-shadow:var(--intergalactic-box-shadow-modal,0 3px 8px 0 rgba(25,27,35,.2))}.___SWindow_t07x2_gg_:focus{outline:none}.___SOverlay_t07x2_gg_{position:fixed;top:0;bottom:0;left:0;right:0;margin:0;display:flex;justify-content:center;align-items:center;padding:var(--intergalactic-spacing-10x,40px);background:var(--intergalactic-overlay-primary,rgba(25,27,35,.7));overflow:auto;z-index:var(--intergalactic-z-index-modal,600);-webkit-overflow-scrolling:touch}.___SOverlay_t07x2_gg_ .___SOverlay_t07x2_gg_{background:var(--intergalactic-overlay-secondary,rgba(25,27,35,.4))}.___SClose_t07x2_gg_{display:inline-flex;position:absolute;right:0;top:0;padding:var(--intergalactic-spacing-3x,12px);color:var(--intergalactic-icon-secondary-neutral,#a9abb6);cursor:pointer;z-index:1;border:none;background:none;outline:none}.___SClose_t07x2_gg_:hover{color:var(--intergalactic-icon-secondary-neutral-hover-active,#8a8e9b)}.___SClose_t07x2_gg_.__keyboardFocused_t07x2_gg_{box-shadow:var(--intergalactic-keyboard-focus,0 0 0 3px rgba(0,143,248,.3))}@media (max-width:767px){.___SWindow_t07x2_gg_{min-width:60%}.___SOverlay_t07x2_gg_{padding:var(--intergalactic-spacing-3x,12px)}}"
44
+ ".___SWindow_19pry_gg_{position:relative;border-radius:var(--intergalactic-rounded-large,12px);background:var(--intergalactic-bg-primary-neutral,#fff);box-sizing:border-box;margin:auto;padding:var(--intergalactic-spacing-10x,40px);box-shadow:var(--intergalactic-box-shadow-modal,0 3px 8px 0 rgba(25,27,35,.2))}.___SWindow_19pry_gg_:focus{outline:none}.___SOverlay_19pry_gg_{position:fixed;top:0;bottom:0;left:0;right:0;margin:0;display:flex;justify-content:center;align-items:center;padding:var(--intergalactic-spacing-10x,40px);background:var(--intergalactic-overlay-primary,rgba(25,27,35,.7));overflow:auto;z-index:var(--intergalactic-z-index-modal,600);-webkit-overflow-scrolling:touch}.___SOverlay_19pry_gg_ .___SOverlay_19pry_gg_{background:var(--intergalactic-overlay-secondary,rgba(25,27,35,.4))}.___SClose_19pry_gg_{display:inline-flex;position:absolute;right:0;top:0;padding:var(--intergalactic-spacing-3x,12px);color:var(--intergalactic-icon-secondary-neutral,#a9abb6);cursor:pointer;z-index:1;border:none;background:none;outline:none}.___SClose_19pry_gg_:hover{color:var(--intergalactic-icon-secondary-neutral-hover-active,#8a8e9b)}.___SClose_19pry_gg_.__keyboardFocused_19pry_gg_{box-shadow:var(--intergalactic-keyboard-focus,0 0 0 3px rgba(0,143,248,.3))}.___STitle_19pry_gg_{color:var(--intergalactic-text-primary,#191b23);font-size:var(--intergalactic-fs-500,24px);line-height:var(--intergalactic-lh-500,117%);font-weight:var(--intergalactic-semi-bold,600);margin-bottom:var(--intergalactic-spacing-2x,8px)}@media (max-width:767px){.___SWindow_19pry_gg_{min-width:60%}.___SOverlay_19pry_gg_{padding:var(--intergalactic-spacing-3x,12px)}}"
44
45
  /*__inner_css_end__*/
45
- , "t07x2_gg_")
46
+ , "19pry_gg_")
46
47
  /*__reshadow_css_end__*/
47
48
  , {
48
- "__SWindow": "___SWindow_t07x2_gg_",
49
- "__SOverlay": "___SOverlay_t07x2_gg_",
50
- "__SClose": "___SClose_t07x2_gg_",
51
- "_keyboardFocused": "__keyboardFocused_t07x2_gg_"
49
+ "__SWindow": "___SWindow_19pry_gg_",
50
+ "__SOverlay": "___SOverlay_19pry_gg_",
51
+ "__SClose": "___SClose_19pry_gg_",
52
+ "_keyboardFocused": "__keyboardFocused_19pry_gg_",
53
+ "__STitle": "___STitle_19pry_gg_"
52
54
  });
53
55
  import { localizedMessages } from './translations/__intergalactic-dynamic-locales';
54
56
  import i18nEnhance from '@semcore/utils/lib/enhances/i18nEnhance';
57
+ import { Text } from '@semcore/typography';
58
+ import uniqueIDEnhancement from '@semcore/utils/lib/uniqueID';
55
59
 
56
60
  var ModalRoot = /*#__PURE__*/function (_Component) {
57
61
  _inherits(ModalRoot, _Component);
@@ -69,6 +73,10 @@ var ModalRoot = /*#__PURE__*/function (_Component) {
69
73
 
70
74
  _this = _super.call.apply(_super, [this].concat(args));
71
75
 
76
+ _defineProperty(_assertThisInitialized(_this), "state", {
77
+ hasTitle: false
78
+ });
79
+
72
80
  _defineProperty(_assertThisInitialized(_this), "handleKeyDown", function (e) {
73
81
  if (e.key === 'Escape') {
74
82
  e.stopPropagation();
@@ -105,12 +113,15 @@ var ModalRoot = /*#__PURE__*/function (_Component) {
105
113
  var _this$asProps2 = this.asProps,
106
114
  visible = _this$asProps2.visible,
107
115
  closable = _this$asProps2.closable,
108
- getI18nText = _this$asProps2.getI18nText;
116
+ getI18nText = _this$asProps2.getI18nText,
117
+ uid = _this$asProps2.uid;
118
+ var hasTitle = this.state.hasTitle;
109
119
  return {
110
120
  visible: visible,
111
121
  closable: closable,
112
122
  onKeyDown: this.handleKeyDown,
113
- getI18nText: getI18nText
123
+ 'aria-label': hasTitle ? undefined : getI18nText('title'),
124
+ 'aria-labelledby': hasTitle ? "igc-".concat(uid, "-title") : undefined
114
125
  };
115
126
  }
116
127
  }, {
@@ -122,6 +133,24 @@ var ModalRoot = /*#__PURE__*/function (_Component) {
122
133
  getI18nText: getI18nText
123
134
  };
124
135
  }
136
+ }, {
137
+ key: "getTitleProps",
138
+ value: function getTitleProps() {
139
+ var _this2 = this;
140
+
141
+ var uid = this.asProps.uid;
142
+
143
+ var setTitle = function setTitle() {
144
+ return _this2.setState({
145
+ hasTitle: true
146
+ });
147
+ };
148
+
149
+ return {
150
+ id: "igc-".concat(uid, "-title"),
151
+ setTitle: setTitle
152
+ };
153
+ }
125
154
  }, {
126
155
  key: "render",
127
156
  value: function render() {
@@ -143,7 +172,7 @@ _defineProperty(ModalRoot, "displayName", 'Modal');
143
172
 
144
173
  _defineProperty(ModalRoot, "style", style);
145
174
 
146
- _defineProperty(ModalRoot, "enhance", [i18nEnhance(localizedMessages)]);
175
+ _defineProperty(ModalRoot, "enhance", [i18nEnhance(localizedMessages), uniqueIDEnhancement()]);
147
176
 
148
177
  _defineProperty(ModalRoot, "defaultProps", {
149
178
  duration: 200,
@@ -152,9 +181,9 @@ _defineProperty(ModalRoot, "defaultProps", {
152
181
  locale: 'en'
153
182
  });
154
183
 
155
- var FocusLockWrapper = /*#__PURE__*/React.forwardRef(function (_ref8, ref) {
156
- var tag = _ref8.tag,
157
- other = _objectWithoutProperties(_ref8, _excluded);
184
+ var FocusLockWrapper = /*#__PURE__*/React.forwardRef(function (_ref10, ref) {
185
+ var tag = _ref10.tag,
186
+ other = _objectWithoutProperties(_ref10, _excluded);
158
187
 
159
188
  return /*#__PURE__*/React.createElement(FocusLock, _extends({
160
189
  ref: ref,
@@ -165,33 +194,31 @@ var FocusLockWrapper = /*#__PURE__*/React.forwardRef(function (_ref8, ref) {
165
194
 
166
195
  function Window(props) {
167
196
  var _ref2 = arguments[0],
168
- _ref5;
197
+ _ref6;
169
198
 
170
199
  var SWindow = FocusLockWrapper;
171
200
  var Children = props.Children,
172
201
  styles = props.styles,
173
202
  visible = props.visible,
174
- closable = props.closable,
175
- getI18nText = props.getI18nText;
203
+ closable = props.closable;
176
204
  var windowRef = useRef(null);
177
205
  if (!visible) return null;
178
- return _ref5 = sstyled(styles), /*#__PURE__*/React.createElement(SWindow, _ref5.cn("SWindow", _objectSpread({}, _assignProps2({
206
+ return _ref6 = sstyled(styles), /*#__PURE__*/React.createElement(SWindow, _ref6.cn("SWindow", _objectSpread({}, _assignProps2({
179
207
  "tag": Box,
180
208
  "ref": windowRef,
181
209
  "returnFocus": true,
182
210
  "tabIndex": -1,
183
211
  "autoFocus": true,
184
212
  "role": "dialog",
185
- "aria-label": getI18nText('title'),
186
213
  "aria-modal": true
187
- }, _ref2))), /*#__PURE__*/React.createElement(PortalProvider, _ref5.cn("PortalProvider", {
214
+ }, _ref2))), /*#__PURE__*/React.createElement(PortalProvider, _ref6.cn("PortalProvider", {
188
215
  "value": windowRef
189
- }), closable && /*#__PURE__*/React.createElement(Modal.Close, null), /*#__PURE__*/React.createElement(Children, _ref5.cn("Children", {}))));
216
+ }), closable && /*#__PURE__*/React.createElement(Modal.Close, null), /*#__PURE__*/React.createElement(Children, _ref6.cn("Children", {}))));
190
217
  }
191
218
 
192
219
  function Overlay(props) {
193
220
  var _ref3 = arguments[0],
194
- _ref6;
221
+ _ref7;
195
222
 
196
223
  var SOverlay = FadeInOut;
197
224
  var Children = props.Children,
@@ -200,36 +227,53 @@ function Overlay(props) {
200
227
  visible = props.visible;
201
228
  var overlayRef = useRef(null);
202
229
  usePreventScroll(visible);
203
- return _ref6 = sstyled(styles), /*#__PURE__*/React.createElement(SOverlay, _ref6.cn("SOverlay", _objectSpread({}, _assignProps3({
230
+ return _ref7 = sstyled(styles), /*#__PURE__*/React.createElement(SOverlay, _ref7.cn("SOverlay", _objectSpread({}, _assignProps3({
204
231
  "ref": overlayRef
205
- }, _ref3))), /*#__PURE__*/React.createElement(OutsideClick, _ref6.cn("OutsideClick", {
232
+ }, _ref3))), /*#__PURE__*/React.createElement(OutsideClick, _ref7.cn("OutsideClick", {
206
233
  "root": overlayRef,
207
234
  "onOutsideClick": onOutsideClick
208
- }), /*#__PURE__*/React.createElement(Children, _ref6.cn("Children", {}))));
235
+ }), /*#__PURE__*/React.createElement(Children, _ref7.cn("Children", {}))));
209
236
  }
210
237
 
211
238
  function Close(props) {
212
239
  var _ref4 = arguments[0],
213
- _ref7;
240
+ _ref8;
214
241
 
215
242
  var SClose = Box;
216
243
  var Children = props.Children,
217
244
  hasChildren = props.children,
218
245
  getI18nText = props.getI18nText;
219
- return _ref7 = sstyled(props.styles), /*#__PURE__*/React.createElement(SClose, _ref7.cn("SClose", _objectSpread({}, _assignProps4({
246
+ return _ref8 = sstyled(props.styles), /*#__PURE__*/React.createElement(SClose, _ref8.cn("SClose", _objectSpread({}, _assignProps4({
220
247
  "tag": "button",
221
248
  "tabIndex": 0,
222
249
  "aria-label": getI18nText('close')
223
- }, _ref4))), hasChildren ? /*#__PURE__*/React.createElement(Children, _ref7.cn("Children", {})) : /*#__PURE__*/React.createElement(CloseIcon, _ref7.cn("CloseIcon", {
250
+ }, _ref4))), hasChildren ? /*#__PURE__*/React.createElement(Children, _ref8.cn("Children", {})) : /*#__PURE__*/React.createElement(CloseIcon, _ref8.cn("CloseIcon", {
224
251
  "title": getI18nText('close')
225
252
  })));
226
253
  }
227
254
 
228
255
  Close.enhance = [keyboardFocusEnhance()];
256
+
257
+ function Title(props) {
258
+ var _ref5 = arguments[0],
259
+ _ref9;
260
+
261
+ var setTitle = props.setTitle,
262
+ styles = props.styles;
263
+ var STitle = Text;
264
+ useEffect(function () {
265
+ return setTitle();
266
+ });
267
+ return _ref9 = sstyled(styles), /*#__PURE__*/React.createElement(STitle, _ref9.cn("STitle", _objectSpread({}, _assignProps5({
268
+ "tag": "h2"
269
+ }, _ref5))));
270
+ }
271
+
229
272
  var Modal = createComponent(ModalRoot, {
230
273
  Window: Window,
231
274
  Overlay: Overlay,
232
- Close: Close
275
+ Close: Close,
276
+ Title: Title
233
277
  });
234
278
  export default Modal;
235
279
  //# sourceMappingURL=Modal.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Modal.js","names":["React","useRef","FocusLock","FadeInOut","createComponent","Component","sstyled","Root","Portal","PortalProvider","Box","OutsideClick","CloseIcon","fire","usePreventScroll","isAdvanceMode","keyboardFocusEnhance","localizedMessages","i18nEnhance","ModalRoot","e","key","stopPropagation","asProps","duration","visible","onOutsideClick","handleOutsideClick","closable","getI18nText","onKeyDown","handleKeyDown","onClick","handleIconCloseClick","Children","disablePortal","advanceMode","Modal","Overlay","displayName","Window","style","i18n","locale","FocusLockWrapper","forwardRef","ref","tag","other","props","SWindow","styles","windowRef","SOverlay","overlayRef","Close","SClose","hasChildren","children","enhance"],"sources":["../../src/Modal.jsx"],"sourcesContent":["import React, { useRef } from 'react';\nimport FocusLock from 'react-focus-lock';\nimport { FadeInOut } from '@semcore/animation';\nimport createComponent, { Component, sstyled, Root } from '@semcore/core';\nimport Portal, { PortalProvider } from '@semcore/portal';\nimport { Box } from '@semcore/flex-box';\nimport OutsideClick from '@semcore/outside-click';\nimport CloseIcon from '@semcore/icon/Close/l';\nimport fire from '@semcore/utils/lib/fire';\nimport usePreventScroll from '@semcore/utils/lib/use/usePreventScroll';\nimport { isAdvanceMode } from '@semcore/utils/lib/findComponent';\nimport keyboardFocusEnhance from '@semcore/utils/lib/enhances/keyboardFocusEnhance';\nimport style from './style/modal.shadow.css';\nimport { localizedMessages } from './translations/__intergalactic-dynamic-locales';\nimport i18nEnhance from '@semcore/utils/lib/enhances/i18nEnhance';\n\nclass ModalRoot extends Component {\n static displayName = 'Modal';\n static style = style;\n static enhance = [i18nEnhance(localizedMessages)];\n static defaultProps = {\n duration: 200,\n closable: true,\n i18n: localizedMessages,\n locale: 'en',\n };\n\n handleKeyDown = (e) => {\n if (e.key === 'Escape') {\n e.stopPropagation();\n fire(this, 'onClose', 'onEscape', e);\n }\n };\n\n handleIconCloseClick = (e) => {\n fire(this, 'onClose', 'onCloseClick', e);\n };\n\n handleOutsideClick = (e) => {\n fire(this, 'onClose', 'onOutsideClick', e);\n };\n\n getOverlayProps() {\n const { duration, visible } = this.asProps;\n return {\n duration,\n visible,\n onOutsideClick: this.handleOutsideClick,\n };\n }\n\n getWindowProps() {\n const { visible, closable, getI18nText } = this.asProps;\n return {\n visible,\n closable,\n onKeyDown: this.handleKeyDown,\n getI18nText,\n };\n }\n\n getCloseProps() {\n const { getI18nText } = this.asProps;\n\n return {\n onClick: this.handleIconCloseClick,\n getI18nText,\n };\n }\n\n render() {\n const { Children, disablePortal } = this.asProps;\n\n const advanceMode = isAdvanceMode(Children, [\n Modal.Overlay.displayName,\n Modal.Window.displayName,\n ]);\n\n return (\n <Portal disablePortal={disablePortal}>\n {advanceMode ? (\n <Children />\n ) : (\n <Modal.Overlay>\n <Root render={Modal.Window} />\n </Modal.Overlay>\n )}\n </Portal>\n );\n }\n}\n\nconst FocusLockWrapper = React.forwardRef(function ({ tag, ...other }, ref) {\n return <FocusLock ref={ref} as={tag} lockProps={other} {...other} />;\n});\n\nfunction Window(props) {\n const SWindow = Root;\n const { Children, styles, visible, closable, getI18nText } = props;\n const windowRef = useRef(null);\n\n if (!visible) return null;\n\n return sstyled(styles)(\n <SWindow\n render={FocusLockWrapper}\n tag={Box}\n ref={windowRef}\n returnFocus={true}\n tabIndex={-1}\n autoFocus={true}\n role=\"dialog\"\n aria-label={getI18nText('title')}\n aria-modal={true}\n >\n <PortalProvider value={windowRef}>\n {closable && <Modal.Close />}\n <Children />\n </PortalProvider>\n </SWindow>,\n );\n}\n\nfunction Overlay(props) {\n const SOverlay = Root;\n const { Children, styles, onOutsideClick, visible } = props;\n const overlayRef = useRef(null);\n usePreventScroll(visible);\n\n return sstyled(styles)(\n <SOverlay render={FadeInOut} ref={overlayRef}>\n <OutsideClick root={overlayRef} onOutsideClick={onOutsideClick}>\n <Children />\n </OutsideClick>\n </SOverlay>,\n );\n}\n\nfunction Close(props) {\n const SClose = Root;\n const { Children, children: hasChildren, getI18nText } = props;\n return sstyled(props.styles)(\n <SClose render={Box} tag=\"button\" tabIndex={0} aria-label={getI18nText('close')}>\n {hasChildren ? <Children /> : <CloseIcon title={getI18nText('close')} />}\n </SClose>,\n );\n}\n\nClose.enhance = [keyboardFocusEnhance()];\n\nconst Modal = createComponent(ModalRoot, {\n Window,\n Overlay,\n Close,\n});\n\nexport default Modal;\n"],"mappings":"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"}
1
+ {"version":3,"file":"Modal.js","names":["React","useRef","useEffect","FocusLock","FadeInOut","createComponent","Component","sstyled","Root","Portal","PortalProvider","Box","OutsideClick","CloseIcon","fire","usePreventScroll","isAdvanceMode","keyboardFocusEnhance","localizedMessages","i18nEnhance","Text","uniqueIDEnhancement","ModalRoot","hasTitle","e","key","stopPropagation","asProps","duration","visible","onOutsideClick","handleOutsideClick","closable","getI18nText","uid","state","onKeyDown","handleKeyDown","undefined","onClick","handleIconCloseClick","setTitle","setState","id","Children","disablePortal","advanceMode","Modal","Overlay","displayName","Window","style","i18n","locale","FocusLockWrapper","forwardRef","ref","tag","other","props","SWindow","styles","windowRef","SOverlay","overlayRef","Close","SClose","hasChildren","children","enhance","Title","STitle"],"sources":["../../src/Modal.jsx"],"sourcesContent":["import React, { useRef, useEffect } from 'react';\nimport FocusLock from 'react-focus-lock';\nimport { FadeInOut } from '@semcore/animation';\nimport createComponent, { Component, sstyled, Root } from '@semcore/core';\nimport Portal, { PortalProvider } from '@semcore/portal';\nimport { Box } from '@semcore/flex-box';\nimport OutsideClick from '@semcore/outside-click';\nimport CloseIcon from '@semcore/icon/Close/l';\nimport fire from '@semcore/utils/lib/fire';\nimport usePreventScroll from '@semcore/utils/lib/use/usePreventScroll';\nimport { isAdvanceMode } from '@semcore/utils/lib/findComponent';\nimport keyboardFocusEnhance from '@semcore/utils/lib/enhances/keyboardFocusEnhance';\nimport style from './style/modal.shadow.css';\nimport { localizedMessages } from './translations/__intergalactic-dynamic-locales';\nimport i18nEnhance from '@semcore/utils/lib/enhances/i18nEnhance';\nimport { Text } from '@semcore/typography';\nimport uniqueIDEnhancement from '@semcore/utils/lib/uniqueID';\n\nclass ModalRoot extends Component {\n static displayName = 'Modal';\n static style = style;\n static enhance = [i18nEnhance(localizedMessages), uniqueIDEnhancement()];\n static defaultProps = {\n duration: 200,\n closable: true,\n i18n: localizedMessages,\n locale: 'en',\n };\n state = { hasTitle: false };\n\n handleKeyDown = (e) => {\n if (e.key === 'Escape') {\n e.stopPropagation();\n fire(this, 'onClose', 'onEscape', e);\n }\n };\n\n handleIconCloseClick = (e) => {\n fire(this, 'onClose', 'onCloseClick', e);\n };\n\n handleOutsideClick = (e) => {\n fire(this, 'onClose', 'onOutsideClick', e);\n };\n\n getOverlayProps() {\n const { duration, visible } = this.asProps;\n return {\n duration,\n visible,\n onOutsideClick: this.handleOutsideClick,\n };\n }\n\n getWindowProps() {\n const { visible, closable, getI18nText, uid } = this.asProps;\n const { hasTitle } = this.state;\n return {\n visible,\n closable,\n onKeyDown: this.handleKeyDown,\n 'aria-label': hasTitle ? undefined : getI18nText('title'),\n 'aria-labelledby': hasTitle ? `igc-${uid}-title` : undefined,\n };\n }\n\n getCloseProps() {\n const { getI18nText } = this.asProps;\n\n return {\n onClick: this.handleIconCloseClick,\n getI18nText,\n };\n }\n\n getTitleProps() {\n const { uid } = this.asProps;\n const setTitle = () => this.setState({ hasTitle: true });\n\n return {\n id: `igc-${uid}-title`,\n setTitle,\n };\n }\n\n render() {\n const { Children, disablePortal } = this.asProps;\n\n const advanceMode = isAdvanceMode(Children, [\n Modal.Overlay.displayName,\n Modal.Window.displayName,\n ]);\n\n return (\n <Portal disablePortal={disablePortal}>\n {advanceMode ? (\n <Children />\n ) : (\n <Modal.Overlay>\n <Root render={Modal.Window} />\n </Modal.Overlay>\n )}\n </Portal>\n );\n }\n}\n\nconst FocusLockWrapper = React.forwardRef(function ({ tag, ...other }, ref) {\n return <FocusLock ref={ref} as={tag} lockProps={other} {...other} />;\n});\n\nfunction Window(props) {\n const SWindow = Root;\n const { Children, styles, visible, closable } = props;\n const windowRef = useRef(null);\n\n if (!visible) return null;\n\n return sstyled(styles)(\n <SWindow\n render={FocusLockWrapper}\n tag={Box}\n ref={windowRef}\n returnFocus={true}\n tabIndex={-1}\n autoFocus={true}\n role=\"dialog\"\n aria-modal={true}\n >\n <PortalProvider value={windowRef}>\n {closable && <Modal.Close />}\n <Children />\n </PortalProvider>\n </SWindow>,\n );\n}\n\nfunction Overlay(props) {\n const SOverlay = Root;\n const { Children, styles, onOutsideClick, visible } = props;\n const overlayRef = useRef(null);\n usePreventScroll(visible);\n\n return sstyled(styles)(\n <SOverlay render={FadeInOut} ref={overlayRef}>\n <OutsideClick root={overlayRef} onOutsideClick={onOutsideClick}>\n <Children />\n </OutsideClick>\n </SOverlay>,\n );\n}\n\nfunction Close(props) {\n const SClose = Root;\n const { Children, children: hasChildren, getI18nText } = props;\n return sstyled(props.styles)(\n <SClose render={Box} tag=\"button\" tabIndex={0} aria-label={getI18nText('close')}>\n {hasChildren ? <Children /> : <CloseIcon title={getI18nText('close')} />}\n </SClose>,\n );\n}\n\nClose.enhance = [keyboardFocusEnhance()];\n\nfunction Title(props) {\n const { setTitle, styles } = props;\n const STitle = Root;\n\n useEffect(() => setTitle());\n\n return sstyled(styles)(<STitle render={Text} tag=\"h2\" />);\n}\n\nconst Modal = createComponent(ModalRoot, {\n Window,\n Overlay,\n Close,\n Title,\n});\n\nexport default Modal;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.js","names":[],"sources":["../../src/index.d.ts"],"sourcesContent":["import React, { ComponentProps } from 'react';\nimport { IFadeInOutProps } from '@semcore/animation';\nimport { CProps, PropGetterFn, ReturnEl } from '@semcore/core';\nimport { IPortalProps } from '@semcore/portal';\nimport { Box, IBoxProps } from '@semcore/flex-box';\n\nexport interface IModalProps extends IPortalProps, IBoxProps, IFadeInOutProps {\n /** Duration of animation, ms\n * @default 200\n */\n duration?: number;\n /** This property is responsible for the visibility of the modal window */\n visible?: boolean;\n /** Function called when the component is hidden */\n onClose?: (\n trigger: 'onOutsideClick' | 'onCloseClick' | 'onEscape',\n e?: React.MouseEvent | React.KeyboardEvent,\n ) => void;\n /** Displaying the close button(x) in the upper-right corner of the modal dialog\n * @default true\n * */\n closable?: boolean;\n locale?: string;\n}\n\nexport interface IModalContext {\n getOverlayProps: PropGetterFn;\n getWindowProps: PropGetterFn;\n getCloseProps: PropGetterFn;\n}\n\ndeclare const Modal: (<T>(props: CProps<IModalProps & T, IModalContext>) => ReturnEl) & {\n Window: <T>(props: ComponentProps<typeof Box> & T) => ReturnEl;\n Overlay: <T>(props: ComponentProps<typeof Box> & T) => ReturnEl;\n Close: <T>(props: ComponentProps<typeof Box> & T) => ReturnEl;\n};\n\nexport default Modal;\n"],"mappings":""}
1
+ {"version":3,"file":"index.d.js","names":[],"sources":["../../src/index.d.ts"],"sourcesContent":["import React, { ComponentProps } from 'react';\nimport { IFadeInOutProps } from '@semcore/animation';\nimport { CProps, PropGetterFn, ReturnEl } from '@semcore/core';\nimport { IPortalProps } from '@semcore/portal';\nimport { Box, IBoxProps } from '@semcore/flex-box';\nimport { ITextProps } from '@semcore/typography';\n\nexport interface IModalProps extends IPortalProps, IBoxProps, IFadeInOutProps {\n /** Duration of animation, ms\n * @default 200\n */\n duration?: number;\n /** This property is responsible for the visibility of the modal window */\n visible?: boolean;\n /** Function called when the component is hidden */\n onClose?: (\n trigger: 'onOutsideClick' | 'onCloseClick' | 'onEscape',\n e?: React.MouseEvent | React.KeyboardEvent,\n ) => void;\n /** Displaying the close button(x) in the upper-right corner of the modal dialog\n * @default true\n * */\n closable?: boolean;\n locale?: string;\n}\n\nexport interface IModalContext {\n getOverlayProps: PropGetterFn;\n getWindowProps: PropGetterFn;\n getCloseProps: PropGetterFn;\n}\n\ndeclare const Modal: (<T>(props: CProps<IModalProps & T, IModalContext>) => ReturnEl) & {\n Window: <T>(props: ComponentProps<typeof Box> & T) => ReturnEl;\n Overlay: <T>(props: ComponentProps<typeof Box> & T) => ReturnEl;\n Close: <T>(props: ComponentProps<typeof Box> & T) => ReturnEl;\n Title: <T>(props: ITextProps & T) => ReturnEl;\n};\n\nexport default Modal;\n"],"mappings":""}
@@ -57,7 +57,7 @@ test('Users can interact with Modal via VoiceOver', /*#__PURE__*/function () {
57
57
 
58
58
  case 25:
59
59
  _context.t3 = _context.sent;
60
- (0, _context.t2)(_context.t3).toBe('Modal window web dialog with 5 items Close button');
60
+ (0, _context.t2)(_context.t3).toBe('Do you want to save your changes? web dialog with 5 items Close button');
61
61
  _context.next = 29;
62
62
  return voiceOver.next();
63
63
 
@@ -1 +1 @@
1
- {"version":3,"file":"modal.vo-test.js","names":["expect","voTest","test","e2eStandToHtml","resolve","resolvePath","writeFile","getReportHeader","makeVoiceOverReporter","page","pureVoiceOver","voiceOver","standPath","__dirname","reportPath","htmlContent","setContent","getReport","interact","itemText","toBe","act","lastSpokenPhrase","next","report"],"sources":["../../src/modal.vo-test.ts"],"sourcesContent":["import { expect } from '@playwright/test';\nimport { voTest as test } from '@guidepup/playwright';\nimport { e2eStandToHtml } from '@semcore/jest-preset-ui/e2e-stand';\nimport { resolve as resolvePath } from 'path';\nimport { writeFile } from 'fs/promises';\nimport { getReportHeader, makeVoiceOverReporter } from '@semcore/jest-preset-ui/vo-reporter';\n\ntest('Users can interact with Modal via VoiceOver', async ({ page, voiceOver: pureVoiceOver }) => {\n const standPath = resolvePath(\n __dirname,\n '../../../website/docs/components/modal/examples/modal.jsx',\n );\n const reportPath = resolvePath(\n __dirname,\n '../../../website/docs/components/modal/modal-a11y-report.md',\n );\n const htmlContent = await e2eStandToHtml(standPath, 'en');\n\n await page.setContent(htmlContent);\n const { voiceOver, getReport } = await makeVoiceOverReporter(pureVoiceOver);\n await voiceOver.interact();\n\n expect(await voiceOver.itemText()).toBe('Open modal button');\n await voiceOver.act();\n expect(await voiceOver.lastSpokenPhrase()).toBe(\n 'Modal window web dialog with 5 items Close button',\n );\n await voiceOver.next();\n expect(await voiceOver.itemText()).toBe('Do you want to save your changes? heading level 2');\n await voiceOver.next();\n await voiceOver.next();\n expect(await voiceOver.itemText()).toBe('Save changes button');\n await voiceOver.act();\n expect(await voiceOver.itemText()).toBe('Open modal button');\n\n const report = (await getReportHeader()) + '\\n\\n' + (await getReport(standPath));\n\n await writeFile(reportPath, report);\n});\n"],"mappings":";;;+CACA,oJ;;AADA,SAASA,MAAT,QAAuB,kBAAvB;AACA,SAASC,MAAM,IAAIC,IAAnB,QAA+B,sBAA/B;AACA,SAASC,cAAT,QAA+B,mCAA/B;AACA,SAASC,OAAO,IAAIC,WAApB,QAAuC,MAAvC;AACA,SAASC,SAAT,QAA0B,aAA1B;AACA,SAASC,eAAT,EAA0BC,qBAA1B,QAAuD,qCAAvD;AAEAN,IAAI,CAAC,6CAAD;EAAA,uEAAgD;IAAA;;IAAA;MAAA;QAAA;UAAA;YAASO,IAAT,QAASA,IAAT,EAA0BC,aAA1B,QAAeC,SAAf;YAC5CC,SAD4C,GAChCP,WAAW,CAC3BQ,SAD2B,EAE3B,2DAF2B,CADqB;YAK5CC,UAL4C,GAK/BT,WAAW,CAC5BQ,SAD4B,EAE5B,6DAF4B,CALoB;YAAA;YAAA,OASxBV,cAAc,CAACS,SAAD,EAAY,IAAZ,CATU;;UAAA;YAS5CG,WAT4C;YAAA;YAAA,OAW5CN,IAAI,CAACO,UAAL,CAAgBD,WAAhB,CAX4C;;UAAA;YAAA;YAAA,OAYXP,qBAAqB,CAACE,aAAD,CAZV;;UAAA;YAAA;YAY1CC,SAZ0C,yBAY1CA,SAZ0C;YAY/BM,SAZ+B,yBAY/BA,SAZ+B;YAAA;YAAA,OAa5CN,SAAS,CAACO,QAAV,EAb4C;;UAAA;YAAA,cAelDlB,MAfkD;YAAA;YAAA,OAerCW,SAAS,CAACQ,QAAV,EAfqC;;UAAA;YAAA;YAAA,8BAefC,IAfe,CAeV,mBAfU;YAAA;YAAA,OAgB5CT,SAAS,CAACU,GAAV,EAhB4C;;UAAA;YAAA,cAiBlDrB,MAjBkD;YAAA;YAAA,OAiBrCW,SAAS,CAACW,gBAAV,EAjBqC;;UAAA;YAAA;YAAA,8BAiBPF,IAjBO,CAkBhD,mDAlBgD;YAAA;YAAA,OAoB5CT,SAAS,CAACY,IAAV,EApB4C;;UAAA;YAAA,cAqBlDvB,MArBkD;YAAA;YAAA,OAqBrCW,SAAS,CAACQ,QAAV,EArBqC;;UAAA;YAAA;YAAA,8BAqBfC,IArBe,CAqBV,mDArBU;YAAA;YAAA,OAsB5CT,SAAS,CAACY,IAAV,EAtB4C;;UAAA;YAAA;YAAA,OAuB5CZ,SAAS,CAACY,IAAV,EAvB4C;;UAAA;YAAA,cAwBlDvB,MAxBkD;YAAA;YAAA,OAwBrCW,SAAS,CAACQ,QAAV,EAxBqC;;UAAA;YAAA;YAAA,8BAwBfC,IAxBe,CAwBV,qBAxBU;YAAA;YAAA,OAyB5CT,SAAS,CAACU,GAAV,EAzB4C;;UAAA;YAAA,cA0BlDrB,MA1BkD;YAAA;YAAA,OA0BrCW,SAAS,CAACQ,QAAV,EA1BqC;;UAAA;YAAA;YAAA,8BA0BfC,IA1Be,CA0BV,mBA1BU;YAAA;YAAA,OA4B5Bb,eAAe,EA5Ba;;UAAA;YAAA;YAAA,8BA4BP,MA5BO;YAAA;YAAA,OA4BSU,SAAS,CAACL,SAAD,CA5BlB;;UAAA;YAAA;YA4B5CY,MA5B4C;YAAA;YAAA,OA8B5ClB,SAAS,CAACQ,UAAD,EAAaU,MAAb,CA9BmC;;UAAA;UAAA;YAAA;QAAA;MAAA;IAAA;EAAA,CAAhD;;EAAA;IAAA;EAAA;AAAA,IAAJ"}
1
+ {"version":3,"file":"modal.vo-test.js","names":["expect","voTest","test","e2eStandToHtml","resolve","resolvePath","writeFile","getReportHeader","makeVoiceOverReporter","page","pureVoiceOver","voiceOver","standPath","__dirname","reportPath","htmlContent","setContent","getReport","interact","itemText","toBe","act","lastSpokenPhrase","next","report"],"sources":["../../src/modal.vo-test.ts"],"sourcesContent":["import { expect } from '@playwright/test';\nimport { voTest as test } from '@guidepup/playwright';\nimport { e2eStandToHtml } from '@semcore/jest-preset-ui/e2e-stand';\nimport { resolve as resolvePath } from 'path';\nimport { writeFile } from 'fs/promises';\nimport { getReportHeader, makeVoiceOverReporter } from '@semcore/jest-preset-ui/vo-reporter';\n\ntest('Users can interact with Modal via VoiceOver', async ({ page, voiceOver: pureVoiceOver }) => {\n const standPath = resolvePath(\n __dirname,\n '../../../website/docs/components/modal/examples/modal.jsx',\n );\n const reportPath = resolvePath(\n __dirname,\n '../../../website/docs/components/modal/modal-a11y-report.md',\n );\n const htmlContent = await e2eStandToHtml(standPath, 'en');\n\n await page.setContent(htmlContent);\n const { voiceOver, getReport } = await makeVoiceOverReporter(pureVoiceOver);\n await voiceOver.interact();\n\n expect(await voiceOver.itemText()).toBe('Open modal button');\n await voiceOver.act();\n expect(await voiceOver.lastSpokenPhrase()).toBe(\n 'Do you want to save your changes? web dialog with 5 items Close button',\n );\n await voiceOver.next();\n expect(await voiceOver.itemText()).toBe('Do you want to save your changes? heading level 2');\n await voiceOver.next();\n await voiceOver.next();\n expect(await voiceOver.itemText()).toBe('Save changes button');\n await voiceOver.act();\n expect(await voiceOver.itemText()).toBe('Open modal button');\n\n const report = (await getReportHeader()) + '\\n\\n' + (await getReport(standPath));\n\n await writeFile(reportPath, report);\n});\n"],"mappings":";;;+CACA,oJ;;AADA,SAASA,MAAT,QAAuB,kBAAvB;AACA,SAASC,MAAM,IAAIC,IAAnB,QAA+B,sBAA/B;AACA,SAASC,cAAT,QAA+B,mCAA/B;AACA,SAASC,OAAO,IAAIC,WAApB,QAAuC,MAAvC;AACA,SAASC,SAAT,QAA0B,aAA1B;AACA,SAASC,eAAT,EAA0BC,qBAA1B,QAAuD,qCAAvD;AAEAN,IAAI,CAAC,6CAAD;EAAA,uEAAgD;IAAA;;IAAA;MAAA;QAAA;UAAA;YAASO,IAAT,QAASA,IAAT,EAA0BC,aAA1B,QAAeC,SAAf;YAC5CC,SAD4C,GAChCP,WAAW,CAC3BQ,SAD2B,EAE3B,2DAF2B,CADqB;YAK5CC,UAL4C,GAK/BT,WAAW,CAC5BQ,SAD4B,EAE5B,6DAF4B,CALoB;YAAA;YAAA,OASxBV,cAAc,CAACS,SAAD,EAAY,IAAZ,CATU;;UAAA;YAS5CG,WAT4C;YAAA;YAAA,OAW5CN,IAAI,CAACO,UAAL,CAAgBD,WAAhB,CAX4C;;UAAA;YAAA;YAAA,OAYXP,qBAAqB,CAACE,aAAD,CAZV;;UAAA;YAAA;YAY1CC,SAZ0C,yBAY1CA,SAZ0C;YAY/BM,SAZ+B,yBAY/BA,SAZ+B;YAAA;YAAA,OAa5CN,SAAS,CAACO,QAAV,EAb4C;;UAAA;YAAA,cAelDlB,MAfkD;YAAA;YAAA,OAerCW,SAAS,CAACQ,QAAV,EAfqC;;UAAA;YAAA;YAAA,8BAefC,IAfe,CAeV,mBAfU;YAAA;YAAA,OAgB5CT,SAAS,CAACU,GAAV,EAhB4C;;UAAA;YAAA,cAiBlDrB,MAjBkD;YAAA;YAAA,OAiBrCW,SAAS,CAACW,gBAAV,EAjBqC;;UAAA;YAAA;YAAA,8BAiBPF,IAjBO,CAkBhD,wEAlBgD;YAAA;YAAA,OAoB5CT,SAAS,CAACY,IAAV,EApB4C;;UAAA;YAAA,cAqBlDvB,MArBkD;YAAA;YAAA,OAqBrCW,SAAS,CAACQ,QAAV,EArBqC;;UAAA;YAAA;YAAA,8BAqBfC,IArBe,CAqBV,mDArBU;YAAA;YAAA,OAsB5CT,SAAS,CAACY,IAAV,EAtB4C;;UAAA;YAAA;YAAA,OAuB5CZ,SAAS,CAACY,IAAV,EAvB4C;;UAAA;YAAA,cAwBlDvB,MAxBkD;YAAA;YAAA,OAwBrCW,SAAS,CAACQ,QAAV,EAxBqC;;UAAA;YAAA;YAAA,8BAwBfC,IAxBe,CAwBV,qBAxBU;YAAA;YAAA,OAyB5CT,SAAS,CAACU,GAAV,EAzB4C;;UAAA;YAAA,cA0BlDrB,MA1BkD;YAAA;YAAA,OA0BrCW,SAAS,CAACQ,QAAV,EA1BqC;;UAAA;YAAA;YAAA,8BA0BfC,IA1Be,CA0BV,mBA1BU;YAAA;YAAA,OA4B5Bb,eAAe,EA5Ba;;UAAA;YAAA;YAAA,8BA4BP,MA5BO;YAAA;YAAA,OA4BSU,SAAS,CAACL,SAAD,CA5BlB;;UAAA;YAAA;YA4B5CY,MA5B4C;YAAA;YAAA,OA8B5ClB,SAAS,CAACQ,UAAD,EAAaU,MAAb,CA9BmC;;UAAA;UAAA;YAAA;QAAA;MAAA;IAAA;EAAA,CAAhD;;EAAA;IAAA;EAAA;AAAA,IAAJ"}
@@ -55,6 +55,14 @@ SClose[keyboardFocused] {
55
55
  box-shadow: var(--intergalactic-keyboard-focus, 0px 0px 0px 3px rgba(0, 143, 248, 0.3));
56
56
  }
57
57
 
58
+ STitle {
59
+ color: var(--intergalactic-text-primary, #191b23);
60
+ font-size: var(--intergalactic-fs-500, 24px);
61
+ line-height: var(--intergalactic-lh-500, 117%);
62
+ font-weight: var(--intergalactic-semi-bold, 600);
63
+ margin-bottom: var(--intergalactic-spacing-2x, 8px);
64
+ }
65
+
58
66
  @media (max-width: 767px) {
59
67
  SWindow {
60
68
  min-width: 60%;
@@ -3,6 +3,7 @@ import { IFadeInOutProps } from '@semcore/animation';
3
3
  import { CProps, PropGetterFn, ReturnEl } from '@semcore/core';
4
4
  import { IPortalProps } from '@semcore/portal';
5
5
  import { Box, IBoxProps } from '@semcore/flex-box';
6
+ import { ITextProps } from '@semcore/typography';
6
7
 
7
8
  export interface IModalProps extends IPortalProps, IBoxProps, IFadeInOutProps {
8
9
  /** Duration of animation, ms
@@ -33,6 +34,7 @@ declare const Modal: (<T>(props: CProps<IModalProps & T, IModalContext>) => Retu
33
34
  Window: <T>(props: ComponentProps<typeof Box> & T) => ReturnEl;
34
35
  Overlay: <T>(props: ComponentProps<typeof Box> & T) => ReturnEl;
35
36
  Close: <T>(props: ComponentProps<typeof Box> & T) => ReturnEl;
37
+ Title: <T>(props: ITextProps & T) => ReturnEl;
36
38
  };
37
39
 
38
40
  export default Modal;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@semcore/modal",
3
3
  "description": "Semrush Modal Component",
4
- "version": "3.3.6",
4
+ "version": "3.4.0",
5
5
  "main": "lib/cjs/index.js",
6
6
  "module": "lib/es6/index.js",
7
7
  "typings": "lib/types/index.d.ts",
@@ -14,6 +14,7 @@
14
14
  "@semcore/icon": "2.16 - 3",
15
15
  "@semcore/outside-click": "^2",
16
16
  "@semcore/portal": "^2",
17
+ "@semcore/typography": "^4",
17
18
  "@semcore/utils": "^3.31.2",
18
19
  "react-focus-lock": "2.9.1"
19
20
  },
@@ -31,10 +32,10 @@
31
32
  "directory": "semcore/modal"
32
33
  },
33
34
  "devDependencies": {
34
- "@types/react": "18.0.21",
35
35
  "@guidepup/playwright": "0.6.1",
36
36
  "@playwright/test": "1.25.1",
37
- "@semcore/jest-preset-ui": "1.0.0"
37
+ "@semcore/jest-preset-ui": "1.0.0",
38
+ "@types/react": "18.0.21"
38
39
  },
39
40
  "scripts": {
40
41
  "build": "pnpm semcore-builder --source=js",