@pingux/astro 2.147.0 → 2.147.1-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,17 +1,4 @@
1
- import React, { Key } from 'react';
2
- import { Collection } from 'react-stately';
3
- import type { Node } from '@react-types/shared';
4
- type GridListProps = {
5
- containerProps: object;
6
- rowProps: object;
7
- cellProps: object;
8
- children?: React.ReactNode;
9
- isReorderable?: boolean;
10
- items: Iterable<object>;
11
- keyboardNavigationBehavior?: 'arrow' | 'tab';
12
- onAction?: (key: Key) => void;
13
- onSelectionChange?: (keys: Selection) => void;
14
- collection: Collection<Node<object>>;
15
- };
1
+ import React from 'react';
2
+ import { GridListProps } from '../../types/gridList';
16
3
  declare const GridList: (props: GridListProps) => React.JSX.Element;
17
4
  export default GridList;
@@ -1,18 +1,7 @@
1
1
  import React from 'react';
2
2
  declare const _default: {
3
3
  title: string;
4
- component: (props: {
5
- containerProps: object;
6
- rowProps: object;
7
- cellProps: object;
8
- children?: React.ReactNode;
9
- isReorderable?: boolean | undefined;
10
- items: Iterable<object>;
11
- keyboardNavigationBehavior?: "tab" | "arrow" | undefined;
12
- onAction?: ((key: React.Key) => void) | undefined;
13
- onSelectionChange?: ((keys: Selection) => void) | undefined;
14
- collection: import("react-stately").Collection<import("@react-types/shared").Node<object>>;
15
- }) => React.JSX.Element;
4
+ component: (props: import("../../types/gridList").GridListProps) => React.JSX.Element;
16
5
  argTypes: {
17
6
  isReorderable: {
18
7
  description: string;
@@ -366,7 +366,9 @@ test('should show the menu if label clicked when preview image exists', /*#__PUR
366
366
  // Click on the image preview button
367
367
  imageUploadLabel = _testWrapper.screen.getByText(testLabel);
368
368
  _react2.fireEvent.click(imageUploadLabel);
369
- expect(_testWrapper.screen.getAllByRole('button')[0]).toHaveAttribute('aria-expanded', 'true');
369
+ expect(_testWrapper.screen.getAllByRole('button', {
370
+ hidden: true
371
+ })[0]).toHaveAttribute('aria-expanded', 'true');
370
372
  expect(_testWrapper.screen.getByRole('menu')).toBeInTheDocument();
371
373
  expect(_testWrapper.screen.getByText('Upload New Image')).toBeInTheDocument();
372
374
  expect(_testWrapper.screen.getByText('Remove Image')).toBeInTheDocument();
@@ -5,3 +5,4 @@ export default _default;
5
5
  export declare const Default: StoryFn<ModalProps>;
6
6
  export declare const LargeContent: StoryFn<ModalProps>;
7
7
  export declare const WithInputField: StoryFn<ModalProps>;
8
+ export declare const WithPopoverMenu: StoryFn<ModalProps>;
@@ -8,7 +8,7 @@ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequ
8
8
  _Object$defineProperty(exports, "__esModule", {
9
9
  value: true
10
10
  });
11
- exports["default"] = exports.WithInputField = exports.LargeContent = exports.Default = void 0;
11
+ exports["default"] = exports.WithPopoverMenu = exports.WithInputField = exports.LargeContent = exports.Default = void 0;
12
12
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));
13
13
  var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
14
14
  var _react = _interopRequireWildcard(require("react"));
@@ -248,6 +248,32 @@ var WithInputField = function WithInputField() {
248
248
  }, "Cancel")))));
249
249
  };
250
250
  exports.WithInputField = WithInputField;
251
+ var WithPopoverMenu = function WithPopoverMenu() {
252
+ var state = (0, _hooks.useModalState)();
253
+ return (0, _react2.jsx)(_index.OverlayProvider, null, (0, _react2.jsx)(_index.Button, {
254
+ onPress: state.open,
255
+ "aria-label": "Open modal"
256
+ }, "Open Modal"), state.isOpen && (0, _react2.jsx)(_index.Modal, {
257
+ isOpen: state.isOpen,
258
+ onClose: state.close
259
+ }, (0, _react2.jsx)(_index.Box, {
260
+ gap: "lg"
261
+ }, (0, _react2.jsx)(_index.Text, null, "Lorem ipsum dolor sit amet consectetur"), (0, _react2.jsx)(_index.PopoverMenu, null, (0, _react2.jsx)(_index.Button, null, "Click me"), (0, _react2.jsx)(_index.Menu, {
262
+ onAction: function onAction() {
263
+ return console.log('on action');
264
+ }
265
+ }, (0, _react2.jsx)(_index.Item, {
266
+ key: "edit"
267
+ }, "Edit"), (0, _react2.jsx)(_index.Item, {
268
+ key: "duplicate"
269
+ }, "Duplicate"), (0, _react2.jsx)(_index.Item, {
270
+ key: "delete",
271
+ textValue: "delete"
272
+ }, (0, _react2.jsx)(_index.Text, {
273
+ color: "critical.bright"
274
+ }, "Delete")))))));
275
+ };
276
+ exports.WithPopoverMenu = WithPopoverMenu;
251
277
  WithInputField.parameters = {
252
278
  a11y: {
253
279
  config: {
@@ -1,13 +1,24 @@
1
1
  "use strict";
2
2
 
3
+ var _typeof = require("@babel/runtime-corejs3/helpers/typeof");
4
+ var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
5
+ var _Symbol = require("@babel/runtime-corejs3/core-js-stable/symbol");
6
+ var _Object$create = require("@babel/runtime-corejs3/core-js-stable/object/create");
7
+ var _Object$getPrototypeOf = require("@babel/runtime-corejs3/core-js-stable/object/get-prototype-of");
8
+ var _forEachInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");
9
+ var _Object$setPrototypeOf = require("@babel/runtime-corejs3/core-js-stable/object/set-prototype-of");
10
+ var _Promise = require("@babel/runtime-corejs3/core-js-stable/promise");
11
+ var _reverseInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/reverse");
12
+ var _sliceInstanceProperty = require("@babel/runtime-corejs3/core-js-stable/instance/slice");
3
13
  var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
14
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncToGenerator"));
4
15
  var _react = _interopRequireDefault(require("react"));
5
16
  var _userEvent = _interopRequireDefault(require("@testing-library/user-event"));
6
17
  var _index = require("../../../index");
7
18
  var _testWrapper = require("../../../utils/testUtils/testWrapper");
8
19
  var _universalComponentTest = require("../../../utils/testUtils/universalComponentTest");
9
20
  var _react2 = require("@emotion/react");
10
- // For testing the modal alone
21
+ function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = _Object$defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = "function" == typeof _Symbol ? _Symbol : {}, iteratorSymbol = $Symbol.iterator || "@@iterator", asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator", toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; function define(obj, key, value) { return _Object$defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, ""); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = _Object$create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, "_invoke", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: "normal", arg: fn.call(obj, arg) }; } catch (err) { return { type: "throw", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = _Object$getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = _Object$create(IteratorPrototype); function defineIteratorMethods(prototype) { var _context2; _forEachInstanceProperty(_context2 = ["next", "throw", "return"]).call(_context2, function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if ("throw" !== record.type) { var result = record.arg, value = result.value; return value && "object" == _typeof(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke("next", value, resolve, reject); }, function (err) { invoke("throw", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke("throw", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, "_invoke", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = "suspendedStart"; return function (method, arg) { if ("executing" === state) throw new Error("Generator is already running"); if ("completed" === state) { if ("throw" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) { if ("suspendedStart" === state) throw state = "completed", context.arg; context.dispatchException(context.arg); } else "return" === context.method && context.abrupt("return", context.arg); state = "executing"; var record = tryCatch(innerFn, self, context); if ("normal" === record.type) { if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } "throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, "throw" === methodName && delegate.iterator["return"] && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method) || "return" !== methodName && (context.method = "throw", context.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = "normal", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: "root" }], _forEachInstanceProperty(tryLocsList).call(tryLocsList, pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if ("function" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) { var ctor = "function" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return _Object$setPrototypeOf ? _Object$setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = _Object$create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = _Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, "toString", function () { return "[object Generator]"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) keys.push(key); return _reverseInstanceProperty(keys).call(keys), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { var _context3; if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, _forEachInstanceProperty(_context3 = this.tryEntries).call(_context3, resetTryEntry), !skipTempReset) for (var name in this) "t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+_sliceInstanceProperty(name).call(name, 1)) && (this[name] = undefined); }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if ("throw" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if ("root" === entry.tryLoc) return handle("end"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, "catchLoc"), hasFinally = hasOwn.call(entry, "finallyLoc"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error("try statement without catch or finally"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if ("throw" === record.type) throw record.arg; return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, "catch": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if ("throw" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, "next" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; } // For testing the modal alone
11
22
  var getComponent = function getComponent() {
12
23
  var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
13
24
  return (0, _testWrapper.render)((0, _react2.jsx)(_index.OverlayProvider, null, (0, _react2.jsx)(_index.Modal, props)));
@@ -28,6 +39,24 @@ var getModalWithRadioFieldGroup = function getModalWithRadioFieldGroup() {
28
39
  "data-testid": "option2"
29
40
  })))));
30
41
  };
42
+ var buttonText = 'Click me';
43
+ var onAction = jest.fn();
44
+ var option1 = 'option1';
45
+ var getModalWithPopoverMenu = function getModalWithPopoverMenu() {
46
+ var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
47
+ return (0, _testWrapper.render)((0, _react2.jsx)(_index.OverlayProvider, null, (0, _react2.jsx)(_index.Modal, props, (0, _react2.jsx)(_index.PopoverMenu, null, (0, _react2.jsx)(_index.Button, null, buttonText), (0, _react2.jsx)(_index.Menu, {
48
+ onAction: onAction
49
+ }, (0, _react2.jsx)(_index.Item, {
50
+ key: "edit"
51
+ }, option1), (0, _react2.jsx)(_index.Item, {
52
+ key: "duplicate"
53
+ }, "Duplicate"), (0, _react2.jsx)(_index.Item, {
54
+ key: "delete",
55
+ textValue: "delete"
56
+ }, (0, _react2.jsx)(_index.Text, {
57
+ color: "critical.bright"
58
+ }, "Delete")))))));
59
+ };
31
60
 
32
61
  // **********
33
62
  // Unit tests
@@ -252,4 +281,24 @@ test('should not show focus ring (is-focused class) on radio buttons when clicke
252
281
  expect(radioB).toBeChecked();
253
282
  expect(labelA).not.toHaveClass('is-focused');
254
283
  expect(labelB).not.toHaveClass('is-focused');
255
- });
284
+ });
285
+ test('popover menu onAction is called when menu is inside modal', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
286
+ var button, option1Text;
287
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
288
+ while (1) switch (_context.prev = _context.next) {
289
+ case 0:
290
+ getModalWithPopoverMenu();
291
+ button = _testWrapper.screen.getByText(buttonText);
292
+ _userEvent["default"].click(button);
293
+ _context.next = 5;
294
+ return _testWrapper.screen.findByText(option1);
295
+ case 5:
296
+ option1Text = _context.sent;
297
+ _userEvent["default"].click(option1Text);
298
+ expect(onAction).toHaveBeenCalled();
299
+ case 8:
300
+ case "end":
301
+ return _context.stop();
302
+ }
303
+ }, _callee);
304
+ })));
@@ -1,14 +1,4 @@
1
1
  import * as React from 'react';
2
- import type { OverlayTriggerState } from 'react-stately';
3
- import type { AriaPopoverProps } from '@react-aria/overlays';
4
- export interface PopoverProps extends Omit<AriaPopoverProps, 'popoverRef'> {
5
- children?: React.ReactNode;
6
- state: OverlayTriggerState;
7
- className?: string;
8
- popoverRef?: React.RefObject<HTMLDivElement>;
9
- style?: React.CSSProperties;
10
- width?: string | number;
11
- 'data-testid'?: string;
12
- }
2
+ import { PopoverProps } from '../../types';
13
3
  declare const Popover: (props: PopoverProps) => React.JSX.Element | null;
14
4
  export default Popover;
@@ -22,23 +22,29 @@ var React = _interopRequireWildcard(require("react"));
22
22
  var _overlays = require("@react-aria/overlays");
23
23
  var _hooks = require("../../hooks");
24
24
  var _Box = _interopRequireDefault(require("../Box"));
25
+ var _PopoverContainer = require("../PopoverContainer");
25
26
  var _react2 = require("@emotion/react");
26
- var _excluded = ["popoverRef", "state", "children", "className", "isNonModal", "width"];
27
+ var _excluded = ["arrowProps", "arrowCrossOffset", "direction", "popoverRef", "state", "children", "className", "isNonModal", "hasNoArrow", "width"];
27
28
  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); }
28
29
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { _Object$defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
29
30
  function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
30
31
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var _context, _context2; var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? _forEachInstanceProperty(_context = ownKeys(Object(source), !0)).call(_context, function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context2 = ownKeys(Object(source))).call(_context2, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }
31
32
  var Popover = function Popover(props) {
32
33
  var ref = React.useRef(null);
33
- var _props$popoverRef = props.popoverRef,
34
+ var arrowProps = props.arrowProps,
35
+ arrowCrossOffset = props.arrowCrossOffset,
36
+ direction = props.direction,
37
+ _props$popoverRef = props.popoverRef,
34
38
  popoverRef = _props$popoverRef === void 0 ? ref : _props$popoverRef,
35
39
  state = props.state,
36
40
  children = props.children,
37
41
  className = props.className,
38
42
  isNonModal = props.isNonModal,
43
+ hasNoArrow = props.hasNoArrow,
39
44
  width = props.width,
40
45
  others = (0, _objectWithoutProperties2["default"])(props, _excluded);
41
46
  var _usePopover = (0, _overlays.usePopover)(_objectSpread(_objectSpread({}, props), {}, {
47
+ offset: 5,
42
48
  popoverRef: popoverRef
43
49
  }), state),
44
50
  popoverProps = _usePopover.popoverProps,
@@ -57,9 +63,10 @@ var Popover = function Popover(props) {
57
63
  className: classNames,
58
64
  role: "presentation",
59
65
  width: width
60
- }, popoverProps, others), !isNonModal && (0, _react2.jsx)(_overlays.DismissButton, {
61
- onDismiss: state.close
62
- }), children, (0, _react2.jsx)(_overlays.DismissButton, {
66
+ }, popoverProps, others), children, hasNoArrow ? null : (0, _react2.jsx)(_PopoverContainer.PopoverArrow, (0, _extends2["default"])({}, arrowProps, {
67
+ arrowCrossOffset: arrowCrossOffset,
68
+ direction: direction
69
+ })), (0, _react2.jsx)(_overlays.DismissButton, {
63
70
  onDismiss: state.close
64
71
  })));
65
72
  };
@@ -24,8 +24,7 @@ var _reactAria = require("react-aria");
24
24
  var _reactStately = require("react-stately");
25
25
  var _interactions = require("@react-aria/interactions");
26
26
  var _MenuContext = require("../../context/MenuContext");
27
- var _hooks = require("../../hooks");
28
- var _PopoverContainer = _interopRequireDefault(require("../PopoverContainer"));
27
+ var _Popover = _interopRequireDefault(require("../Popover/Popover"));
29
28
  var _react2 = require("@emotion/react");
30
29
  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); }
31
30
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { _Object$defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -33,7 +32,6 @@ function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (
33
32
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var _context2, _context3; var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? _forEachInstanceProperty(_context2 = ownKeys(Object(source), !0)).call(_context2, function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context3 = ownKeys(Object(source))).call(_context3, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }
34
33
  var PopoverMenu = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
35
34
  var _context;
36
- var menuPopoverRef = (0, _hooks.useLocalOrForwardRef)(ref);
37
35
  var triggerRef = (0, _react.useRef)(null);
38
36
  var menuRef = (0, _react.useRef)(null);
39
37
  var children = props.children,
@@ -57,20 +55,6 @@ var PopoverMenu = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
57
55
  var _useMenuTrigger = (0, _reactAria.useMenuTrigger)({}, state, triggerRef),
58
56
  menuTriggerProps = _useMenuTrigger.menuTriggerProps,
59
57
  menuProps = _useMenuTrigger.menuProps;
60
- var _useOverlayPosition = (0, _reactAria.useOverlayPosition)({
61
- targetRef: triggerRef,
62
- overlayRef: menuPopoverRef,
63
- scrollRef: menuRef,
64
- offset: 5,
65
- placement: (0, _concat["default"])(_context = "".concat(direction, " ")).call(_context, align),
66
- // Our API preference is for default false so we invert this since it should be default true
67
- shouldFlip: !isNotFlippable,
68
- isOpen: state.isOpen,
69
- onClose: state.close,
70
- shouldUpdatePosition: true
71
- }),
72
- positionProps = _useOverlayPosition.overlayProps,
73
- placement = _useOverlayPosition.placement;
74
58
 
75
59
  /* eslint-disable react/jsx-no-constructed-context-values */
76
60
  var menuContext = _objectSpread(_objectSpread({}, menuProps), {}, {
@@ -88,22 +72,23 @@ var PopoverMenu = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
88
72
  }), menu, (0, _react2.jsx)(_reactAria.DismissButton, {
89
73
  onDismiss: state.close
90
74
  }));
75
+ var placement = (0, _concat["default"])(_context = "".concat(direction, " ")).call(_context, align);
91
76
  return (0, _react2.jsx)(_react["default"].Fragment, null, (0, _react2.jsx)(_interactions.PressResponder, (0, _extends2["default"])({}, menuTriggerProps, {
92
77
  ref: triggerRef,
93
78
  isPressed: state.isOpen
94
79
  }), menuTrigger), (0, _react2.jsx)(_MenuContext.MenuContext.Provider, {
95
80
  value: menuContext
96
- }, (0, _react2.jsx)(_PopoverContainer["default"], (0, _extends2["default"])({
97
- isOpen: state.isOpen,
98
- ref: menuPopoverRef,
81
+ }, (0, _react2.jsx)(_reactAria.OverlayContainer, null, (0, _react2.jsx)(_Popover["default"], (0, _extends2["default"])({
99
82
  placement: placement,
100
- onClose: state.close,
101
- hasNoArrow: hasNoArrow,
102
- isDismissable: true,
103
- isNonModal: true
104
- }, positionProps, menuProps, {
105
- role: "dialog"
106
- }), contents)));
83
+ hasNoArrow: hasNoArrow
84
+ }, menuProps, {
85
+ "data-popover-placement": direction,
86
+ "data-testid": "popover-container",
87
+ role: "presentation",
88
+ triggerRef: triggerRef,
89
+ state: state,
90
+ direction: direction
91
+ }), contents))));
107
92
  });
108
93
  PopoverMenu.defaultProps = {
109
94
  align: 'middle',
@@ -67,7 +67,9 @@ describe('useOverlappingMenuHoverState', function () {
67
67
  case 0:
68
68
  getComponent();
69
69
  _context.next = 3;
70
- return _userEvent["default"].hover(_react2.screen.getByRole('listitem'));
70
+ return _userEvent["default"].hover(_react2.screen.getByRole('listitem', {
71
+ hidden: true
72
+ }));
71
73
  case 3:
72
74
  _react2.screen.getByText(IS_HOVERED);
73
75
  case 4:
@@ -106,7 +108,9 @@ describe('useOverlappingMenuHoverState', function () {
106
108
  return _userEvent["default"].click(_react2.screen.getByRole('button'));
107
109
  case 3:
108
110
  _context3.next = 5;
109
- return _userEvent["default"].unhover(_react2.screen.getByRole('listitem'));
111
+ return _userEvent["default"].unhover(_react2.screen.getByRole('listitem', {
112
+ hidden: true
113
+ }));
110
114
  case 5:
111
115
  expect(_react2.screen.queryByText(IS_HOVERED)).not.toBeInTheDocument();
112
116
  case 6:
@@ -151,7 +155,9 @@ describe('useOverlappingMenuHoverState', function () {
151
155
  return _userEvent["default"].hover(_react2.screen.getByRole('menu'));
152
156
  case 5:
153
157
  _context5.next = 7;
154
- return _userEvent["default"].hover(_react2.screen.getByRole('listitem'));
158
+ return _userEvent["default"].hover(_react2.screen.getByRole('listitem', {
159
+ hidden: true
160
+ }));
155
161
  case 7:
156
162
  _react2.screen.getByText(IS_HOVERED);
157
163
  case 8:
@@ -197,10 +203,14 @@ describe('useOverlappingMenuHoverState', function () {
197
203
  return _userEvent["default"].hover(_react2.screen.getByRole('menu'));
198
204
  case 5:
199
205
  _context7.next = 7;
200
- return _userEvent["default"].hover(_react2.screen.getByRole('listitem'));
206
+ return _userEvent["default"].hover(_react2.screen.getByRole('listitem', {
207
+ hidden: true
208
+ }));
201
209
  case 7:
202
210
  _context7.next = 9;
203
- return _userEvent["default"].unhover(_react2.screen.getByRole('listitem'));
211
+ return _userEvent["default"].unhover(_react2.screen.getByRole('listitem', {
212
+ hidden: true
213
+ }));
204
214
  case 9:
205
215
  expect(_react2.screen.queryByText(IS_HOVERED)).not.toBeInTheDocument();
206
216
  case 10:
@@ -3,8 +3,17 @@ import { Collection, DisabledBehavior, ListState, SelectionBehavior } from 'reac
3
3
  import { DraggableCollectionState, DroppableCollectionState } from '@react-stately/dnd';
4
4
  import type { FocusStrategy, KeyboardDelegate, Node } from '@react-types/shared';
5
5
  import { DraggableCollectionStateOptions, DroppableCollectionOptions, DroppableCollectionStateOptions } from './dnd';
6
- export interface GridListProps extends SharedGridProps {
6
+ export interface GridListProps {
7
7
  isReorderable?: boolean;
8
+ rowProps?: object;
9
+ cellProps?: object;
10
+ containerProps?: object;
11
+ items: Iterable<object>;
12
+ children?: React.ReactNode;
13
+ keyboardNavigationBehavior?: 'arrow' | 'tab';
14
+ onAction?: (key: Key) => void;
15
+ onSelectionChange?: (keys: Selection) => void;
16
+ collection?: Collection<Node<object>>;
8
17
  }
9
18
  export type GridListRowProps = SharedGridListItemProps;
10
19
  export interface GridRowProps {
@@ -20,9 +29,6 @@ interface SharedGridListItemProps {
20
29
  item: Node<object>;
21
30
  state: ListState<object>;
22
31
  }
23
- interface SharedGridProps {
24
- isReorderable?: boolean;
25
- }
26
32
  export interface UseGridListItemProps extends SharedGridListItemProps {
27
33
  cellRef: React.Ref<HTMLDivElement>;
28
34
  ref: RefObject<HTMLElement>;
@@ -31,7 +37,7 @@ export interface UseGridListProps extends ReorderableProps {
31
37
  shouldAllowDuplicateSelectionEvents?: boolean;
32
38
  hasAutoFocus?: boolean | FocusStrategy;
33
39
  children?: React.ReactNode;
34
- collection: Collection<Node<object>>;
40
+ collection?: Collection<Node<object>>;
35
41
  defaultSelectedKeys?: Iterable<Key> | 'all';
36
42
  disabledBehavior?: DisabledBehavior;
37
43
  disabledKeys?: Iterable<Key>;
@@ -1,3 +1,6 @@
1
+ /// <reference types="react" />
2
+ import type { OverlayTriggerState } from 'react-stately';
3
+ import type { AriaPopoverProps } from '@react-aria/overlays';
1
4
  import { TestingAttributes } from './shared/test';
2
5
  import { DOMAttributes, Modify, StyleProps } from './shared';
3
6
  type PopoverPlacement = 'top' | 'right' | 'bottom' | 'left';
@@ -22,4 +25,19 @@ export interface PopoverContainerProps extends StylePropsExtended, DOMAttributes
22
25
  export interface PopoverWrapperProps extends PopoverContainerProps {
23
26
  isOpen?: boolean;
24
27
  }
28
+ export interface PopoverProps extends Omit<AriaPopoverProps, 'popoverRef'> {
29
+ children?: React.ReactNode;
30
+ state: OverlayTriggerState;
31
+ direction?: PopoverPlacement;
32
+ className?: string;
33
+ popoverRef?: React.RefObject<HTMLDivElement>;
34
+ style?: React.CSSProperties;
35
+ width?: string | number;
36
+ 'data-testid'?: string;
37
+ hasNoArrow?: boolean;
38
+ arrowProps?: PopoverArrowProps;
39
+ arrowCrossOffset?: string;
40
+ isDismissable?: boolean;
41
+ role?: string;
42
+ }
25
43
  export {};
@@ -356,6 +356,7 @@ var universalFieldComponentTests = function universalFieldComponentTests(_ref3)
356
356
  }
357
357
  });
358
358
  _react2.fireEvent.submit(_react2.screen.getByRole('form', {
359
+ hidden: true,
359
360
  name: /test form 2/i
360
361
  }));
361
362
  expect(handleFormSubmit).toHaveBeenCalledWith({
@@ -376,6 +377,7 @@ var universalFieldComponentTests = function universalFieldComponentTests(_ref3)
376
377
  }
377
378
  });
378
379
  _react2.fireEvent.submit(_react2.screen.getByRole('form', {
380
+ hidden: true,
379
381
  name: /test form 2/i
380
382
  }));
381
383
  expect(handleFormSubmit).toHaveBeenCalledWith({
@@ -426,6 +428,7 @@ var universalFieldComponentTests = function universalFieldComponentTests(_ref3)
426
428
  });
427
429
  }
428
430
  _react2.fireEvent.submit(_react2.screen.getByRole('form', {
431
+ hidden: true,
429
432
  name: /test form 2/i
430
433
  }));
431
434
  expect(handleFormSubmit).toHaveBeenCalledWith({
@@ -363,7 +363,9 @@ test('should show the menu if label clicked when preview image exists', /*#__PUR
363
363
  // Click on the image preview button
364
364
  imageUploadLabel = screen.getByText(testLabel);
365
365
  fireEvent.click(imageUploadLabel);
366
- expect(screen.getAllByRole('button')[0]).toHaveAttribute('aria-expanded', 'true');
366
+ expect(screen.getAllByRole('button', {
367
+ hidden: true
368
+ })[0]).toHaveAttribute('aria-expanded', 'true');
367
369
  expect(screen.getByRole('menu')).toBeInTheDocument();
368
370
  expect(screen.getByText('Upload New Image')).toBeInTheDocument();
369
371
  expect(screen.getByText('Remove Image')).toBeInTheDocument();
@@ -4,7 +4,7 @@ import React, { useState } from 'react';
4
4
  import { withDesign } from 'storybook-addon-designs';
5
5
  import DocsLayout from '../../../.storybook/storybookDocsLayout';
6
6
  import { useModalState } from '../../hooks';
7
- import { Box, Button, Item, Modal, OverlayProvider, RadioField, RadioGroupField, SearchField, SelectField, Text } from '../../index';
7
+ import { Box, Button, Item, Menu, Modal, OverlayProvider, PopoverMenu, RadioField, RadioGroupField, SearchField, SelectField, Text } from '../../index';
8
8
  import { FIGMA_LINKS } from '../../utils/designUtils/figmaLinks';
9
9
  import { modalSizes } from '../../utils/devUtils/constants/modalSizes';
10
10
  import ModalReadme from './Modal.mdx';
@@ -231,6 +231,31 @@ export var WithInputField = function WithInputField() {
231
231
  "aria-label": "Cancel"
232
232
  }, "Cancel")))));
233
233
  };
234
+ export var WithPopoverMenu = function WithPopoverMenu() {
235
+ var state = useModalState();
236
+ return ___EmotionJSX(OverlayProvider, null, ___EmotionJSX(Button, {
237
+ onPress: state.open,
238
+ "aria-label": "Open modal"
239
+ }, "Open Modal"), state.isOpen && ___EmotionJSX(Modal, {
240
+ isOpen: state.isOpen,
241
+ onClose: state.close
242
+ }, ___EmotionJSX(Box, {
243
+ gap: "lg"
244
+ }, ___EmotionJSX(Text, null, "Lorem ipsum dolor sit amet consectetur"), ___EmotionJSX(PopoverMenu, null, ___EmotionJSX(Button, null, "Click me"), ___EmotionJSX(Menu, {
245
+ onAction: function onAction() {
246
+ return console.log('on action');
247
+ }
248
+ }, ___EmotionJSX(Item, {
249
+ key: "edit"
250
+ }, "Edit"), ___EmotionJSX(Item, {
251
+ key: "duplicate"
252
+ }, "Duplicate"), ___EmotionJSX(Item, {
253
+ key: "delete",
254
+ textValue: "delete"
255
+ }, ___EmotionJSX(Text, {
256
+ color: "critical.bright"
257
+ }, "Delete")))))));
258
+ };
234
259
  WithInputField.parameters = {
235
260
  a11y: {
236
261
  config: {
@@ -1,6 +1,18 @@
1
+ import _Object$defineProperty from "@babel/runtime-corejs3/core-js-stable/object/define-property";
2
+ import _Symbol from "@babel/runtime-corejs3/core-js-stable/symbol";
3
+ import _Object$create from "@babel/runtime-corejs3/core-js-stable/object/create";
4
+ import _Object$getPrototypeOf from "@babel/runtime-corejs3/core-js-stable/object/get-prototype-of";
5
+ import _forEachInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/for-each";
6
+ import _Object$setPrototypeOf from "@babel/runtime-corejs3/core-js-stable/object/set-prototype-of";
7
+ import _Promise from "@babel/runtime-corejs3/core-js-stable/promise";
8
+ import _reverseInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/reverse";
9
+ import _sliceInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/slice";
10
+ import _typeof from "@babel/runtime-corejs3/helpers/esm/typeof";
11
+ import _asyncToGenerator from "@babel/runtime-corejs3/helpers/esm/asyncToGenerator";
12
+ function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = _Object$defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = "function" == typeof _Symbol ? _Symbol : {}, iteratorSymbol = $Symbol.iterator || "@@iterator", asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator", toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; function define(obj, key, value) { return _Object$defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, ""); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = _Object$create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, "_invoke", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: "normal", arg: fn.call(obj, arg) }; } catch (err) { return { type: "throw", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = _Object$getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = _Object$create(IteratorPrototype); function defineIteratorMethods(prototype) { var _context2; _forEachInstanceProperty(_context2 = ["next", "throw", "return"]).call(_context2, function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if ("throw" !== record.type) { var result = record.arg, value = result.value; return value && "object" == _typeof(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke("next", value, resolve, reject); }, function (err) { invoke("throw", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke("throw", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, "_invoke", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = "suspendedStart"; return function (method, arg) { if ("executing" === state) throw new Error("Generator is already running"); if ("completed" === state) { if ("throw" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) { if ("suspendedStart" === state) throw state = "completed", context.arg; context.dispatchException(context.arg); } else "return" === context.method && context.abrupt("return", context.arg); state = "executing"; var record = tryCatch(innerFn, self, context); if ("normal" === record.type) { if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } "throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, "throw" === methodName && delegate.iterator["return"] && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method) || "return" !== methodName && (context.method = "throw", context.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = "normal", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: "root" }], _forEachInstanceProperty(tryLocsList).call(tryLocsList, pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if ("function" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) { var ctor = "function" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return _Object$setPrototypeOf ? _Object$setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = _Object$create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = _Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, "toString", function () { return "[object Generator]"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) keys.push(key); return _reverseInstanceProperty(keys).call(keys), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { var _context3; if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, _forEachInstanceProperty(_context3 = this.tryEntries).call(_context3, resetTryEntry), !skipTempReset) for (var name in this) "t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+_sliceInstanceProperty(name).call(name, 1)) && (this[name] = undefined); }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if ("throw" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if ("root" === entry.tryLoc) return handle("end"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, "catchLoc"), hasFinally = hasOwn.call(entry, "finallyLoc"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error("try statement without catch or finally"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if ("throw" === record.type) throw record.arg; return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, "catch": function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if ("throw" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, "next" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }
1
13
  import React from 'react';
2
14
  import userEvent from '@testing-library/user-event';
3
- import { Modal, OverlayProvider, RadioField, RadioGroupField } from '../../../index';
15
+ import { Button, Item, Menu, Modal, OverlayProvider, PopoverMenu, RadioField, RadioGroupField, Text } from '../../../index';
4
16
  import { render, screen } from '../../../utils/testUtils/testWrapper';
5
17
  import { universalComponentTests } from '../../../utils/testUtils/universalComponentTest';
6
18
 
@@ -26,6 +38,24 @@ var getModalWithRadioFieldGroup = function getModalWithRadioFieldGroup() {
26
38
  "data-testid": "option2"
27
39
  })))));
28
40
  };
41
+ var buttonText = 'Click me';
42
+ var onAction = jest.fn();
43
+ var option1 = 'option1';
44
+ var getModalWithPopoverMenu = function getModalWithPopoverMenu() {
45
+ var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
46
+ return render(___EmotionJSX(OverlayProvider, null, ___EmotionJSX(Modal, props, ___EmotionJSX(PopoverMenu, null, ___EmotionJSX(Button, null, buttonText), ___EmotionJSX(Menu, {
47
+ onAction: onAction
48
+ }, ___EmotionJSX(Item, {
49
+ key: "edit"
50
+ }, option1), ___EmotionJSX(Item, {
51
+ key: "duplicate"
52
+ }, "Duplicate"), ___EmotionJSX(Item, {
53
+ key: "delete",
54
+ textValue: "delete"
55
+ }, ___EmotionJSX(Text, {
56
+ color: "critical.bright"
57
+ }, "Delete")))))));
58
+ };
29
59
 
30
60
  // **********
31
61
  // Unit tests
@@ -250,4 +280,24 @@ test('should not show focus ring (is-focused class) on radio buttons when clicke
250
280
  expect(radioB).toBeChecked();
251
281
  expect(labelA).not.toHaveClass('is-focused');
252
282
  expect(labelB).not.toHaveClass('is-focused');
253
- });
283
+ });
284
+ test('popover menu onAction is called when menu is inside modal', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
285
+ var button, option1Text;
286
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
287
+ while (1) switch (_context.prev = _context.next) {
288
+ case 0:
289
+ getModalWithPopoverMenu();
290
+ button = screen.getByText(buttonText);
291
+ userEvent.click(button);
292
+ _context.next = 5;
293
+ return screen.findByText(option1);
294
+ case 5:
295
+ option1Text = _context.sent;
296
+ userEvent.click(option1Text);
297
+ expect(onAction).toHaveBeenCalled();
298
+ case 8:
299
+ case "end":
300
+ return _context.stop();
301
+ }
302
+ }, _callee);
303
+ })));
@@ -9,25 +9,31 @@ import _Object$defineProperty from "@babel/runtime-corejs3/core-js-stable/object
9
9
  import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
10
10
  import _defineProperty from "@babel/runtime-corejs3/helpers/esm/defineProperty";
11
11
  import _objectWithoutProperties from "@babel/runtime-corejs3/helpers/esm/objectWithoutProperties";
12
- var _excluded = ["popoverRef", "state", "children", "className", "isNonModal", "width"];
12
+ var _excluded = ["arrowProps", "arrowCrossOffset", "direction", "popoverRef", "state", "children", "className", "isNonModal", "hasNoArrow", "width"];
13
13
  function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
14
14
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var _context, _context2; var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? _forEachInstanceProperty(_context = ownKeys(Object(source), !0)).call(_context, function (key) { _defineProperty(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context2 = ownKeys(Object(source))).call(_context2, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }
15
15
  import * as React from 'react';
16
16
  import { DismissButton, Overlay, usePopover } from '@react-aria/overlays';
17
17
  import { useStatusClasses } from '../../hooks';
18
18
  import Box from '../Box';
19
+ import { PopoverArrow } from '../PopoverContainer';
19
20
  import { jsx as ___EmotionJSX } from "@emotion/react";
20
21
  var Popover = function Popover(props) {
21
22
  var ref = React.useRef(null);
22
- var _props$popoverRef = props.popoverRef,
23
+ var arrowProps = props.arrowProps,
24
+ arrowCrossOffset = props.arrowCrossOffset,
25
+ direction = props.direction,
26
+ _props$popoverRef = props.popoverRef,
23
27
  popoverRef = _props$popoverRef === void 0 ? ref : _props$popoverRef,
24
28
  state = props.state,
25
29
  children = props.children,
26
30
  className = props.className,
27
31
  isNonModal = props.isNonModal,
32
+ hasNoArrow = props.hasNoArrow,
28
33
  width = props.width,
29
34
  others = _objectWithoutProperties(props, _excluded);
30
35
  var _usePopover = usePopover(_objectSpread(_objectSpread({}, props), {}, {
36
+ offset: 5,
31
37
  popoverRef: popoverRef
32
38
  }), state),
33
39
  popoverProps = _usePopover.popoverProps,
@@ -46,9 +52,10 @@ var Popover = function Popover(props) {
46
52
  className: classNames,
47
53
  role: "presentation",
48
54
  width: width
49
- }, popoverProps, others), !isNonModal && ___EmotionJSX(DismissButton, {
50
- onDismiss: state.close
51
- }), children, ___EmotionJSX(DismissButton, {
55
+ }, popoverProps, others), children, hasNoArrow ? null : ___EmotionJSX(PopoverArrow, _extends({}, arrowProps, {
56
+ arrowCrossOffset: arrowCrossOffset,
57
+ direction: direction
58
+ })), ___EmotionJSX(DismissButton, {
52
59
  onDismiss: state.close
53
60
  })));
54
61
  };
@@ -13,16 +13,14 @@ import _concatInstanceProperty from "@babel/runtime-corejs3/core-js-stable/insta
13
13
  function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
14
14
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var _context2, _context3; var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? _forEachInstanceProperty(_context2 = ownKeys(Object(source), !0)).call(_context2, function (key) { _defineProperty(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context3 = ownKeys(Object(source))).call(_context3, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }
15
15
  import React, { forwardRef, useRef } from 'react';
16
- import { DismissButton, FocusScope, useMenuTrigger, useOverlayPosition } from 'react-aria';
16
+ import { DismissButton, FocusScope, OverlayContainer, useMenuTrigger } from 'react-aria';
17
17
  import { useMenuTriggerState } from 'react-stately';
18
18
  import { PressResponder } from '@react-aria/interactions';
19
19
  import { MenuContext } from '../../context/MenuContext';
20
- import { useLocalOrForwardRef } from '../../hooks';
21
- import PopoverContainer from '../PopoverContainer';
20
+ import Popover from '../Popover/Popover';
22
21
  import { jsx as ___EmotionJSX } from "@emotion/react";
23
22
  var PopoverMenu = /*#__PURE__*/forwardRef(function (props, ref) {
24
23
  var _context;
25
- var menuPopoverRef = useLocalOrForwardRef(ref);
26
24
  var triggerRef = useRef(null);
27
25
  var menuRef = useRef(null);
28
26
  var children = props.children,
@@ -46,20 +44,6 @@ var PopoverMenu = /*#__PURE__*/forwardRef(function (props, ref) {
46
44
  var _useMenuTrigger = useMenuTrigger({}, state, triggerRef),
47
45
  menuTriggerProps = _useMenuTrigger.menuTriggerProps,
48
46
  menuProps = _useMenuTrigger.menuProps;
49
- var _useOverlayPosition = useOverlayPosition({
50
- targetRef: triggerRef,
51
- overlayRef: menuPopoverRef,
52
- scrollRef: menuRef,
53
- offset: 5,
54
- placement: _concatInstanceProperty(_context = "".concat(direction, " ")).call(_context, align),
55
- // Our API preference is for default false so we invert this since it should be default true
56
- shouldFlip: !isNotFlippable,
57
- isOpen: state.isOpen,
58
- onClose: state.close,
59
- shouldUpdatePosition: true
60
- }),
61
- positionProps = _useOverlayPosition.overlayProps,
62
- placement = _useOverlayPosition.placement;
63
47
 
64
48
  /* eslint-disable react/jsx-no-constructed-context-values */
65
49
  var menuContext = _objectSpread(_objectSpread({}, menuProps), {}, {
@@ -77,22 +61,23 @@ var PopoverMenu = /*#__PURE__*/forwardRef(function (props, ref) {
77
61
  }), menu, ___EmotionJSX(DismissButton, {
78
62
  onDismiss: state.close
79
63
  }));
64
+ var placement = _concatInstanceProperty(_context = "".concat(direction, " ")).call(_context, align);
80
65
  return ___EmotionJSX(React.Fragment, null, ___EmotionJSX(PressResponder, _extends({}, menuTriggerProps, {
81
66
  ref: triggerRef,
82
67
  isPressed: state.isOpen
83
68
  }), menuTrigger), ___EmotionJSX(MenuContext.Provider, {
84
69
  value: menuContext
85
- }, ___EmotionJSX(PopoverContainer, _extends({
86
- isOpen: state.isOpen,
87
- ref: menuPopoverRef,
70
+ }, ___EmotionJSX(OverlayContainer, null, ___EmotionJSX(Popover, _extends({
88
71
  placement: placement,
89
- onClose: state.close,
90
- hasNoArrow: hasNoArrow,
91
- isDismissable: true,
92
- isNonModal: true
93
- }, positionProps, menuProps, {
94
- role: "dialog"
95
- }), contents)));
72
+ hasNoArrow: hasNoArrow
73
+ }, menuProps, {
74
+ "data-popover-placement": direction,
75
+ "data-testid": "popover-container",
76
+ role: "presentation",
77
+ triggerRef: triggerRef,
78
+ state: state,
79
+ direction: direction
80
+ }), contents))));
96
81
  });
97
82
  PopoverMenu.defaultProps = {
98
83
  align: 'middle',
@@ -60,7 +60,9 @@ describe('useOverlappingMenuHoverState', function () {
60
60
  case 0:
61
61
  getComponent();
62
62
  _context.next = 3;
63
- return userEvent.hover(screen.getByRole('listitem'));
63
+ return userEvent.hover(screen.getByRole('listitem', {
64
+ hidden: true
65
+ }));
64
66
  case 3:
65
67
  screen.getByText(IS_HOVERED);
66
68
  case 4:
@@ -99,7 +101,9 @@ describe('useOverlappingMenuHoverState', function () {
99
101
  return userEvent.click(screen.getByRole('button'));
100
102
  case 3:
101
103
  _context3.next = 5;
102
- return userEvent.unhover(screen.getByRole('listitem'));
104
+ return userEvent.unhover(screen.getByRole('listitem', {
105
+ hidden: true
106
+ }));
103
107
  case 5:
104
108
  expect(screen.queryByText(IS_HOVERED)).not.toBeInTheDocument();
105
109
  case 6:
@@ -144,7 +148,9 @@ describe('useOverlappingMenuHoverState', function () {
144
148
  return userEvent.hover(screen.getByRole('menu'));
145
149
  case 5:
146
150
  _context5.next = 7;
147
- return userEvent.hover(screen.getByRole('listitem'));
151
+ return userEvent.hover(screen.getByRole('listitem', {
152
+ hidden: true
153
+ }));
148
154
  case 7:
149
155
  screen.getByText(IS_HOVERED);
150
156
  case 8:
@@ -190,10 +196,14 @@ describe('useOverlappingMenuHoverState', function () {
190
196
  return userEvent.hover(screen.getByRole('menu'));
191
197
  case 5:
192
198
  _context7.next = 7;
193
- return userEvent.hover(screen.getByRole('listitem'));
199
+ return userEvent.hover(screen.getByRole('listitem', {
200
+ hidden: true
201
+ }));
194
202
  case 7:
195
203
  _context7.next = 9;
196
- return userEvent.unhover(screen.getByRole('listitem'));
204
+ return userEvent.unhover(screen.getByRole('listitem', {
205
+ hidden: true
206
+ }));
197
207
  case 9:
198
208
  expect(screen.queryByText(IS_HOVERED)).not.toBeInTheDocument();
199
209
  case 10:
@@ -345,6 +345,7 @@ export var universalFieldComponentTests = function universalFieldComponentTests(
345
345
  }
346
346
  });
347
347
  fireEvent.submit(screen.getByRole('form', {
348
+ hidden: true,
348
349
  name: /test form 2/i
349
350
  }));
350
351
  expect(handleFormSubmit).toHaveBeenCalledWith({
@@ -365,6 +366,7 @@ export var universalFieldComponentTests = function universalFieldComponentTests(
365
366
  }
366
367
  });
367
368
  fireEvent.submit(screen.getByRole('form', {
369
+ hidden: true,
368
370
  name: /test form 2/i
369
371
  }));
370
372
  expect(handleFormSubmit).toHaveBeenCalledWith({
@@ -415,6 +417,7 @@ export var universalFieldComponentTests = function universalFieldComponentTests(
415
417
  });
416
418
  }
417
419
  fireEvent.submit(screen.getByRole('form', {
420
+ hidden: true,
418
421
  name: /test form 2/i
419
422
  }));
420
423
  expect(handleFormSubmit).toHaveBeenCalledWith({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pingux/astro",
3
- "version": "2.147.0",
3
+ "version": "2.147.1-alpha.1",
4
4
  "description": "React component library for Ping Identity's design system",
5
5
  "repository": {
6
6
  "type": "git",