@jobber/components 4.39.0 → 4.40.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.
@@ -29,10 +29,18 @@ var useOnKeyDown = require('@jobber/hooks/useOnKeyDown');
29
29
  var AnimatedSwitcher = require('../AnimatedSwitcher-d1e1ddcf.js');
30
30
  var Icon = require('../Icon-405a216c.js');
31
31
  var useInView = require('@jobber/hooks/useInView');
32
+ var Popover = require('../Popover-bbfc6aa1.js');
33
+ var Content = require('../Content-2ca1ffe1.js');
34
+ var Chip = require('../Chip-4916a642.js');
35
+ require('@jobber/hooks/useAssert');
36
+ require('../Avatar-1aa30ee1.js');
37
+ require('color');
32
38
  var debounce = require('lodash/debounce');
33
39
  var InputText = require('../InputText-d1a52550.js');
34
40
  var Spinner = require('../Spinner-9d8fc7ff.js');
35
- require('../Content-2ca1ffe1.js');
41
+ require('../ButtonDismiss-82680c7d.js');
42
+ require('lodash/sortBy');
43
+ require('@jobber/hooks/useLiveAnnounce');
36
44
  require('../FormField-d6138b7f.js');
37
45
  require('../InputValidation-b5a3d92c.js');
38
46
 
@@ -187,14 +195,14 @@ function DataListHeaderTile({ headers, headerKey, }) {
187
195
  [styles$9.sortable]: isSortable,
188
196
  }), onClick: handleOnClick },
189
197
  React__default["default"].createElement(Text.Text, { maxLines: "single" }, headers[headerKey]),
190
- (sortingState === null || sortingState === void 0 ? void 0 : sortingState.key) === headerKey && (React__default["default"].createElement(DataListSortingArrows, { order: sortingState.direction }))));
198
+ (sortingState === null || sortingState === void 0 ? void 0 : sortingState.key) === headerKey && (React__default["default"].createElement(DataListSortingArrows, { order: sortingState.order }))));
191
199
  function toggleSorting(sortingKey) {
192
- if ((sortingState === null || sortingState === void 0 ? void 0 : sortingState.direction) === "desc") {
200
+ if ((sortingState === null || sortingState === void 0 ? void 0 : sortingState.order) === "desc") {
193
201
  sorting === null || sorting === void 0 ? void 0 : sorting.onSort(undefined);
194
202
  return;
195
203
  }
196
204
  sorting === null || sorting === void 0 ? void 0 : sorting.onSort({
197
- direction: (sortingState === null || sortingState === void 0 ? void 0 : sortingState.direction) === "asc" ? "desc" : "asc",
205
+ order: (sortingState === null || sortingState === void 0 ? void 0 : sortingState.order) === "asc" ? "desc" : "asc",
198
206
  key: sortingKey,
199
207
  });
200
208
  }
@@ -479,14 +487,45 @@ function DataListHeaderCheckbox({ children }) {
479
487
  }
480
488
  }
481
489
 
482
- function DataListHeader({ layouts, mediaMatches, headerData, headerVisibility, }) {
483
- const matchingMediaQueries = Object.keys(mediaMatches || {}).filter((key) => !!(mediaMatches === null || mediaMatches === void 0 ? void 0 : mediaMatches[key]));
484
- const sortedVisibleBreakpoints = sortSizeProp(matchingMediaQueries);
485
- // Determines if the header should be visible based on the headerVisibility
486
- const showHeader = sortedVisibleBreakpoints.reduce((previousVisibility, breakpoint) => {
487
- var _a;
488
- return (_a = headerVisibility[breakpoint]) !== null && _a !== void 0 ? _a : previousVisibility;
489
- }, true);
490
+ function useMediaQuery(CSSMediaQuery) {
491
+ const [matches, setMatches] = React.useState(window.matchMedia(CSSMediaQuery).matches);
492
+ React.useEffect(() => {
493
+ const media = window.matchMedia(CSSMediaQuery);
494
+ if (media.matches !== matches) {
495
+ setMatches(media.matches);
496
+ }
497
+ const listener = () => setMatches(media.matches);
498
+ media.addEventListener("change", listener);
499
+ return () => media.removeEventListener("change", listener);
500
+ }, [CSSMediaQuery]);
501
+ return matches;
502
+ }
503
+
504
+ function useResponsiveSizing() {
505
+ const xs = useMediaQuery(`(width > ${BREAKPOINT_SIZES.xs}px)`);
506
+ const sm = useMediaQuery(`(width >= ${BREAKPOINT_SIZES.sm}px)`);
507
+ const md = useMediaQuery(`(width >= ${BREAKPOINT_SIZES.md}px)`);
508
+ const lg = useMediaQuery(`(width >= ${BREAKPOINT_SIZES.lg}px)`);
509
+ const xl = useMediaQuery(`(width >= ${BREAKPOINT_SIZES.xl}px)`);
510
+ return { xs, sm, md, lg, xl };
511
+ }
512
+
513
+ function useShowHeader() {
514
+ const { headerVisibility } = useDataListContext();
515
+ if (headerVisibility === undefined)
516
+ return true;
517
+ const sizes = useResponsiveSizing();
518
+ const sizeKeys = Object.keys(sizes);
519
+ const showHeader = sizeKeys.reduce((previous, breakpoint) => {
520
+ const isHeaderVisible = headerVisibility[breakpoint] || false;
521
+ const isBreakpointTriggered = sizes[breakpoint];
522
+ return previous || (isBreakpointTriggered && isHeaderVisible);
523
+ }, false);
524
+ return showHeader;
525
+ }
526
+
527
+ function DataListHeader({ layouts, mediaMatches, headerData, }) {
528
+ const showHeader = useShowHeader();
490
529
  if (!showHeader || !headerData)
491
530
  return null;
492
531
  return (React__default["default"].createElement(DataListLayoutInternal, { layouts: layouts, mediaMatches: mediaMatches, renderLayout: layout => (React__default["default"].createElement("div", { className: classnames__default["default"](styles$d.headerTitles) },
@@ -528,6 +567,59 @@ styleInject_es.styleInject(css_248z$4);
528
567
 
529
568
  const CONTAINER_TEST_ID = "ATL-DataListFilters-Container";
530
569
 
570
+ function DataListSort() {
571
+ const { sorting, headers } = useDataListContext();
572
+ const divRef = React.useRef(null);
573
+ const [showPopover, setShowPopover] = React.useState(false);
574
+ if (!sorting)
575
+ return null;
576
+ const { sortable, state, onSort } = sorting;
577
+ const sortByOptions = getSortByOptions();
578
+ const canChangeOrder = !(state === null || state === void 0 ? void 0 : state.key);
579
+ return (React__default["default"].createElement(React__default["default"].Fragment, null,
580
+ React__default["default"].createElement("span", { ref: divRef },
581
+ React__default["default"].createElement(Button.Button, Object.assign({}, (!state && { icon: "add", iconOnRight: true }), { label: getButtonLabel(), variation: "subtle", onClick: () => setShowPopover(!showPopover) }))),
582
+ React__default["default"].createElement(Popover.Popover, { attachTo: divRef, open: showPopover, onRequestClose: () => setShowPopover(false) },
583
+ React__default["default"].createElement(Content.Content, null,
584
+ React__default["default"].createElement(Heading.Heading, { level: 5 }, "Sort by"),
585
+ React__default["default"].createElement(Chip.Chips, { selected: (state === null || state === void 0 ? void 0 : state.key) || "none", onChange: handleKeyChange }, sortByOptions.map(({ label, value }) => (React__default["default"].createElement(Chip.Chip, { key: label, label: label, value: value })))),
586
+ React__default["default"].createElement(Heading.Heading, { level: 5 }, "Ordered by"),
587
+ React__default["default"].createElement(Chip.Chips, { selected: state === null || state === void 0 ? void 0 : state.order, onChange: handleSortingChange },
588
+ React__default["default"].createElement(Chip.Chip, { label: "Ascending", value: "asc", disabled: canChangeOrder }),
589
+ React__default["default"].createElement(Chip.Chip, { label: "Descending", value: "desc", disabled: canChangeOrder }))))));
590
+ function getSortByOptions() {
591
+ const options = sortable.reduce((acc, sort) => {
592
+ const label = headers[sort];
593
+ if (!label)
594
+ return acc;
595
+ acc.push({ label, value: sort.toString() });
596
+ return acc;
597
+ }, []);
598
+ // Inject a none option as the first option
599
+ options.unshift({ label: "None", value: "none" });
600
+ return options;
601
+ }
602
+ function getButtonLabel() {
603
+ const label = state && headers[state.key];
604
+ if (!label)
605
+ return "Sort by";
606
+ return `Sort by: ${label}, ${state.order}`;
607
+ }
608
+ function handleKeyChange(value) {
609
+ if (value && value !== "none") {
610
+ onSort({ key: value, order: (state === null || state === void 0 ? void 0 : state.order) || "asc" });
611
+ return;
612
+ }
613
+ onSort(undefined);
614
+ }
615
+ function handleSortingChange(value) {
616
+ if ((state === null || state === void 0 ? void 0 : state.key) && value) {
617
+ onSort({ key: state.key, order: value });
618
+ return;
619
+ }
620
+ }
621
+ }
622
+
531
623
  // This component is meant to capture the props of the DataList.Filters
532
624
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
533
625
  function DataListFilters(_) {
@@ -538,19 +630,22 @@ function DataListFilters(_) {
538
630
  */
539
631
  function InternalDataListFilters() {
540
632
  const { children: parentChildren } = useDataListContext();
633
+ const showHeader = useShowHeader();
634
+ const showSortButton = !showHeader;
541
635
  const component = getCompoundComponent(parentChildren, DataListFilters);
542
636
  const [leftRef, isLeftVisible] = useInView.useInView();
543
637
  const [rightRef, isRightVisible] = useInView.useInView();
544
- if (!component)
638
+ if (!showSortButton && !component)
545
639
  return null;
546
- const { children } = component.props;
640
+ const children = component === null || component === void 0 ? void 0 : component.props.children;
547
641
  return (React__default["default"].createElement("div", { "data-testid": CONTAINER_TEST_ID, className: classnames__default["default"](styles$4.filters, {
548
642
  [styles$4.overflowLeft]: !isLeftVisible,
549
643
  [styles$4.overflowRight]: !isRightVisible,
550
644
  }) },
551
645
  React__default["default"].createElement("div", { className: styles$4.filterActions },
552
646
  React__default["default"].createElement("span", { ref: leftRef, className: styles$4.overflowTrigger }),
553
- children,
647
+ children && children,
648
+ showSortButton && React__default["default"].createElement(DataListSort, null),
554
649
  React__default["default"].createElement("span", { ref: rightRef, className: styles$4.overflowTrigger }))));
555
650
  }
556
651
 
@@ -574,7 +669,7 @@ function DataListStickyHeader({ children }) {
574
669
  return (React__default["default"].createElement("div", { ref: ref, className: classnames__default["default"](styles$3.header, { [styles$3.stuck]: isStuck }) }, children));
575
670
  }
576
671
 
577
- var css_248z$2 = ".SaPMOnvw-3c- {\n --transition-properties: var(--timing-base) ease-in-out;\n --button-offset: calc(var(--space-largest) - var(--space-smallest));\n\n position: absolute;\n /* Inputs are off by 1 when put beside a button */\n top: calc((16px / 2) - 1px);\n top: calc(calc(16px / 2) - 1px);\n top: calc(var(--space-small) - 1px);\n right: calc((16px * 3) - (16px / 8));\n right: calc(calc(16px * 3) - calc(16px / 8));\n right: var(--button-offset);\n visibility: hidden;\n width: 0;\n opacity: 0;\n transition: opacity 200ms ease-in-out,\n width 200ms ease-in-out, visibility 200ms ease-in-out;\n transition: opacity var(--transition-properties),\n width var(--transition-properties), visibility var(--transition-properties);\n}\n\n._3S1-91v2SYI- {\n visibility: visible;\n width: calc(100% - var(--button-offset));\n opacity: 1;\n}\n\n@media (min-width: 768px) {\n\n.SaPMOnvw-3c-,\n._3S1-91v2SYI- {\n position: static;\n visibility: visible;\n width: auto;\n opacity: 1;\n transition: none;\n}\n }\n\n@media (--medium-screens-and-up) {\n\n.SaPMOnvw-3c-,\n._3S1-91v2SYI- {\n position: static;\n visibility: visible;\n width: auto;\n opacity: 1;\n transition: none;\n}\n }\n\n._9GlBktsUALw- {\n display: block;\n}\n\n@media (min-width: 768px) {\n\n._9GlBktsUALw- {\n display: none;\n}\n }\n\n@media (--medium-screens-and-up) {\n\n._9GlBktsUALw- {\n display: none;\n}\n }\n\n/*\n * No Filters Styling\n *\n * When there are no filters, the search input is always visible.\n * ------------------------------------------------------------------------- */\n\n._3Pjrt42x454- .SaPMOnvw-3c- {\n position: static;\n visibility: visible;\n width: auto;\n opacity: 1;\n transition: none;\n}\n\n@media (min-width: 768px) {\n\n._3Pjrt42x454- .SaPMOnvw-3c- {\n max-width: 30%;\n}\n }\n\n@media (--medium-screens-and-up) {\n\n._3Pjrt42x454- .SaPMOnvw-3c- {\n max-width: 30%;\n}\n }\n\n._3Pjrt42x454- ._9GlBktsUALw- {\n display: none;\n}\n";
672
+ var css_248z$2 = ".SaPMOnvw-3c- {\n --transition-properties: var(--timing-base) ease-in-out;\n --button-offset: calc(var(--space-largest) - var(--space-smallest));\n\n position: absolute;\n /* Inputs are off by 1 when put beside a button */\n top: calc((16px / 2) + 1px);\n top: calc(calc(16px / 2) + 1px);\n top: calc(var(--space-small) + 1px);\n right: calc((16px * 3) - (16px / 8));\n right: calc(calc(16px * 3) - calc(16px / 8));\n right: var(--button-offset);\n visibility: hidden;\n width: 0;\n opacity: 0;\n transition: opacity 200ms ease-in-out,\n width 200ms ease-in-out, visibility 200ms ease-in-out;\n transition: opacity var(--transition-properties),\n width var(--transition-properties), visibility var(--transition-properties);\n}\n\n._3S1-91v2SYI- {\n visibility: visible;\n width: calc(100% - var(--button-offset));\n opacity: 1;\n}\n\n@media (min-width: 768px) {\n\n.SaPMOnvw-3c-,\n._3S1-91v2SYI- {\n position: static;\n visibility: visible;\n width: auto;\n opacity: 1;\n transition: none;\n}\n }\n\n@media (--medium-screens-and-up) {\n\n.SaPMOnvw-3c-,\n._3S1-91v2SYI- {\n position: static;\n visibility: visible;\n width: auto;\n opacity: 1;\n transition: none;\n}\n }\n\n._9GlBktsUALw- {\n display: block;\n}\n\n@media (min-width: 768px) {\n\n._9GlBktsUALw- {\n display: none;\n}\n }\n\n@media (--medium-screens-and-up) {\n\n._9GlBktsUALw- {\n display: none;\n}\n }\n\n/*\n * No Filters Styling\n *\n * When there are no filters, the search input is always visible.\n * ------------------------------------------------------------------------- */\n\n._3Pjrt42x454- .SaPMOnvw-3c- {\n position: static;\n visibility: visible;\n width: auto;\n opacity: 1;\n transition: none;\n}\n\n@media (min-width: 768px) {\n\n._3Pjrt42x454- .SaPMOnvw-3c- {\n max-width: 30%;\n}\n }\n\n@media (--medium-screens-and-up) {\n\n._3Pjrt42x454- .SaPMOnvw-3c- {\n max-width: 30%;\n}\n }\n\n._3Pjrt42x454- ._9GlBktsUALw- {\n display: none;\n}\n";
578
673
  var styles$2 = {"searchInput":"SaPMOnvw-3c-","searchInputVisible":"_3S1-91v2SYI-","searchButton":"_9GlBktsUALw-","withNoFilters":"_3Pjrt42x454-"};
579
674
  styleInject_es.styleInject(css_248z$2);
580
675
 
@@ -590,12 +685,14 @@ function DataListSearch(_) {
590
685
  function InternalDataListSearch() {
591
686
  const inputRef = React.useRef(null);
592
687
  const [visible, setVisible] = React.useState(false);
593
- const { searchComponent, filterComponent, title } = useDataListContext();
688
+ const { searchComponent, filterComponent, sorting, title } = useDataListContext();
594
689
  const debouncedSearch = React.useCallback(debounce__default["default"]((value) => { var _a; return (_a = searchComponent === null || searchComponent === void 0 ? void 0 : searchComponent.props) === null || _a === void 0 ? void 0 : _a.onSearch(value); }, SEARCH_DEBOUNCE_DELAY), [searchComponent === null || searchComponent === void 0 ? void 0 : searchComponent.props.onSearch]);
595
690
  if (!searchComponent)
596
691
  return null;
597
692
  const { placeholder } = searchComponent.props;
598
- return (React__default["default"].createElement("div", { className: classnames__default["default"]({ [styles$2.withNoFilters]: !filterComponent }) },
693
+ return (React__default["default"].createElement("div", { className: classnames__default["default"]({
694
+ [styles$2.withNoFilters]: !filterComponent && !sorting,
695
+ }) },
599
696
  React__default["default"].createElement("div", { "data-testid": DATA_LIST_SEARCH_TEST_ID, className: classnames__default["default"](styles$2.searchInput, {
600
697
  [styles$2.searchInputVisible]: visible,
601
698
  }) },
@@ -2,11 +2,12 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var React = require('react');
6
- var reactPopper = require('react-popper');
7
- var useRefocusOnActivator = require('@jobber/hooks/useRefocusOnActivator');
8
- var styleInject_es = require('../style-inject.es-9d2f5f4e.js');
9
- var ButtonDismiss = require('../ButtonDismiss-82680c7d.js');
5
+ var Popover = require('../Popover-bbfc6aa1.js');
6
+ require('react');
7
+ require('react-popper');
8
+ require('@jobber/hooks/useRefocusOnActivator');
9
+ require('../style-inject.es-9d2f5f4e.js');
10
+ require('../ButtonDismiss-82680c7d.js');
10
11
  require('../Button-fd8413b2.js');
11
12
  require('classnames');
12
13
  require('react-router-dom');
@@ -14,48 +15,6 @@ require('../Icon-405a216c.js');
14
15
  require('@jobber/design');
15
16
  require('../Typography-fd6f932a.js');
16
17
 
17
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
18
18
 
19
- var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
20
19
 
21
- var css_248z = ":root {\n --card--base-padding: var(--space-base);\n --popover--padding: var(--space-base);\n --popover--width: calc(var(--base-unit) * 21.875);\n --dismiss--button-padding: calc(var(--base-unit) / 4);\n}\n\n.oSlK4rLUvzE- {\n display: -ms-flexbox;\n display: flex;\n position: \"relative\";\n padding: calc(16px * 1);\n padding: var(--popover--padding);\n -ms-flex-pack: justify;\n justify-content: space-between;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.XVPpPb-7e30- {\n float: right;\n padding: calc(16px / 4);\n padding: var(--dismiss--button-padding);\n text-align: right;\n}\n\n.TDuYbqXaLW0- {\n z-index: 1002;\n z-index: var(--elevation-tooltip);\n width: -webkit-max-content;\n width: max-content;\n max-width: calc(16px * 21.875);\n max-width: var(--popover--width);\n box-shadow: 0px calc(16px / 16) calc(16px / 4) 0px\n rgba(0, 0, 0, 0.1),\n 0px calc(16px / 4) 12px 0px rgba(0, 0, 0, 0.05);\n box-shadow: var(--shadow-base);\n border: calc(16px / 16) solid rgb(225, 225, 225);\n border: var(--border-base) solid var(--color-border);\n border-radius: calc(16px / 8);\n border-radius: var(--radius-base);\n font-size: calc((16px * 1) * 0.875);\n font-size: calc(calc(16px * 1) * 0.875);\n font-size: var(--typography--fontSize-base);\n line-height: normal;\n background: rgba(255, 255, 255, 1);\n background: var(--color-surface);\n}\n\n.TDuYbqXaLW0- > * {\n --public-content--padding: var(--card--base-padding);\n}\n\n.LJCpn0zf1e8- {\n visibility: hidden;\n}\n\n.LJCpn0zf1e8-,\n.LJCpn0zf1e8-::before {\n position: absolute;\n width: 16px;\n width: var(--base-unit);\n height: 16px;\n height: var(--base-unit);\n background: inherit;\n}\n\n.LJCpn0zf1e8-::before {\n content: \"\";\n visibility: visible;\n border: calc(16px / 16) solid rgb(225, 225, 225);\n border: var(--border-base) solid var(--color-border);\n -webkit-transform: rotate(45deg);\n transform: rotate(45deg);\n -webkit-transform-origin: center;\n transform-origin: center;\n -webkit-clip-path: polygon(-4px -4px, 15.3px 0, 0 15.3px);\n clip-path: polygon(-4px -4px, 15.3px 0, 0 15.3px);\n}\n\n.TDuYbqXaLW0-[data-popper-placement^=\"top\"] > .LJCpn0zf1e8- {\n bottom: -5px;\n}\n\n.TDuYbqXaLW0-[data-popper-placement^=\"top\"] > .LJCpn0zf1e8-::before {\n -webkit-transform: rotate(-135deg);\n transform: rotate(-135deg);\n}\n\n.TDuYbqXaLW0-[data-popper-placement^=\"bottom\"] > .LJCpn0zf1e8- {\n top: -7px;\n}\n\n.TDuYbqXaLW0-[data-popper-placement^=\"left\"] > .LJCpn0zf1e8- {\n right: -5px;\n}\n\n.TDuYbqXaLW0-[data-popper-placement^=\"left\"] > .LJCpn0zf1e8-::before {\n -webkit-transform: rotate(135deg);\n transform: rotate(135deg);\n}\n\n.TDuYbqXaLW0-[data-popper-placement^=\"right\"] > .LJCpn0zf1e8- {\n left: -7px;\n}\n\n.TDuYbqXaLW0-[data-popper-placement^=\"right\"] > .LJCpn0zf1e8-::before {\n -webkit-transform: rotate(-45deg);\n transform: rotate(-45deg);\n}\n";
22
- var classes = {"header":"oSlK4rLUvzE-","dismissButton":"XVPpPb-7e30-","popover":"TDuYbqXaLW0-","arrow":"LJCpn0zf1e8-"};
23
- styleInject_es.styleInject(css_248z);
24
-
25
- function Popover({ onRequestClose, children, attachTo, open, preferredPlacement = "auto", }) {
26
- const [popperElement, setPopperElement] = React.useState();
27
- const [arrowElement, setArrowElement] = React.useState();
28
- const { styles: popperStyles, attributes } = reactPopper.usePopper(attachTo instanceof Element ? attachTo : attachTo.current, popperElement, {
29
- modifiers: buildModifiers(arrowElement),
30
- placement: preferredPlacement,
31
- });
32
- useRefocusOnActivator.useRefocusOnActivator(open);
33
- return (React__default["default"].createElement(React__default["default"].Fragment, null, open && (React__default["default"].createElement("div", Object.assign({ role: "dialog", ref: setPopperElement, style: popperStyles.popper, className: classes.popover }, attributes.popper),
34
- React__default["default"].createElement("div", { className: classes.dismissButton },
35
- React__default["default"].createElement(ButtonDismiss.ButtonDismiss, { onClick: onRequestClose, ariaLabel: "Close dialog" })),
36
- children,
37
- React__default["default"].createElement("div", { ref: setArrowElement, className: classes.arrow, style: popperStyles.arrow })))));
38
- }
39
- function buildModifiers(arrowElement) {
40
- const modifiers = [
41
- {
42
- name: "arrow",
43
- options: { element: arrowElement, padding: 10 },
44
- },
45
- {
46
- name: "offset",
47
- options: {
48
- offset: [0, 10],
49
- },
50
- },
51
- {
52
- name: "flip",
53
- options: {
54
- fallbackPlacements: ["auto"],
55
- },
56
- },
57
- ];
58
- return modifiers;
59
- }
60
-
61
- exports.Popover = Popover;
20
+ exports.Popover = Popover.Popover;
@@ -0,0 +1,53 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var reactPopper = require('react-popper');
5
+ var useRefocusOnActivator = require('@jobber/hooks/useRefocusOnActivator');
6
+ var styleInject_es = require('./style-inject.es-9d2f5f4e.js');
7
+ var ButtonDismiss = require('./ButtonDismiss-82680c7d.js');
8
+
9
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
10
+
11
+ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
12
+
13
+ var css_248z = ":root {\n --card--base-padding: var(--space-base);\n --popover--padding: var(--space-base);\n --popover--width: calc(var(--base-unit) * 21.875);\n --dismiss--button-padding: calc(var(--base-unit) / 4);\n}\n\n.oSlK4rLUvzE- {\n display: -ms-flexbox;\n display: flex;\n position: \"relative\";\n padding: calc(16px * 1);\n padding: var(--popover--padding);\n -ms-flex-pack: justify;\n justify-content: space-between;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.XVPpPb-7e30- {\n float: right;\n padding: calc(16px / 4);\n padding: var(--dismiss--button-padding);\n text-align: right;\n}\n\n.TDuYbqXaLW0- {\n z-index: 1002;\n z-index: var(--elevation-tooltip);\n width: -webkit-max-content;\n width: max-content;\n max-width: calc(16px * 21.875);\n max-width: var(--popover--width);\n box-shadow: 0px calc(16px / 16) calc(16px / 4) 0px\n rgba(0, 0, 0, 0.1),\n 0px calc(16px / 4) 12px 0px rgba(0, 0, 0, 0.05);\n box-shadow: var(--shadow-base);\n border: calc(16px / 16) solid rgb(225, 225, 225);\n border: var(--border-base) solid var(--color-border);\n border-radius: calc(16px / 8);\n border-radius: var(--radius-base);\n font-size: calc((16px * 1) * 0.875);\n font-size: calc(calc(16px * 1) * 0.875);\n font-size: var(--typography--fontSize-base);\n line-height: normal;\n background: rgba(255, 255, 255, 1);\n background: var(--color-surface);\n}\n\n.TDuYbqXaLW0- > * {\n --public-content--padding: var(--card--base-padding);\n}\n\n.LJCpn0zf1e8- {\n visibility: hidden;\n}\n\n.LJCpn0zf1e8-,\n.LJCpn0zf1e8-::before {\n position: absolute;\n width: 16px;\n width: var(--base-unit);\n height: 16px;\n height: var(--base-unit);\n background: inherit;\n}\n\n.LJCpn0zf1e8-::before {\n content: \"\";\n visibility: visible;\n border: calc(16px / 16) solid rgb(225, 225, 225);\n border: var(--border-base) solid var(--color-border);\n -webkit-transform: rotate(45deg);\n transform: rotate(45deg);\n -webkit-transform-origin: center;\n transform-origin: center;\n -webkit-clip-path: polygon(-4px -4px, 15.3px 0, 0 15.3px);\n clip-path: polygon(-4px -4px, 15.3px 0, 0 15.3px);\n}\n\n.TDuYbqXaLW0-[data-popper-placement^=\"top\"] > .LJCpn0zf1e8- {\n bottom: -5px;\n}\n\n.TDuYbqXaLW0-[data-popper-placement^=\"top\"] > .LJCpn0zf1e8-::before {\n -webkit-transform: rotate(-135deg);\n transform: rotate(-135deg);\n}\n\n.TDuYbqXaLW0-[data-popper-placement^=\"bottom\"] > .LJCpn0zf1e8- {\n top: -7px;\n}\n\n.TDuYbqXaLW0-[data-popper-placement^=\"left\"] > .LJCpn0zf1e8- {\n right: -5px;\n}\n\n.TDuYbqXaLW0-[data-popper-placement^=\"left\"] > .LJCpn0zf1e8-::before {\n -webkit-transform: rotate(135deg);\n transform: rotate(135deg);\n}\n\n.TDuYbqXaLW0-[data-popper-placement^=\"right\"] > .LJCpn0zf1e8- {\n left: -7px;\n}\n\n.TDuYbqXaLW0-[data-popper-placement^=\"right\"] > .LJCpn0zf1e8-::before {\n -webkit-transform: rotate(-45deg);\n transform: rotate(-45deg);\n}\n";
14
+ var classes = {"header":"oSlK4rLUvzE-","dismissButton":"XVPpPb-7e30-","popover":"TDuYbqXaLW0-","arrow":"LJCpn0zf1e8-"};
15
+ styleInject_es.styleInject(css_248z);
16
+
17
+ function Popover({ onRequestClose, children, attachTo, open, preferredPlacement = "auto", }) {
18
+ const [popperElement, setPopperElement] = React.useState();
19
+ const [arrowElement, setArrowElement] = React.useState();
20
+ const { styles: popperStyles, attributes } = reactPopper.usePopper(attachTo instanceof Element ? attachTo : attachTo.current, popperElement, {
21
+ modifiers: buildModifiers(arrowElement),
22
+ placement: preferredPlacement,
23
+ });
24
+ useRefocusOnActivator.useRefocusOnActivator(open);
25
+ return (React__default["default"].createElement(React__default["default"].Fragment, null, open && (React__default["default"].createElement("div", Object.assign({ role: "dialog", ref: setPopperElement, style: popperStyles.popper, className: classes.popover }, attributes.popper),
26
+ React__default["default"].createElement("div", { className: classes.dismissButton },
27
+ React__default["default"].createElement(ButtonDismiss.ButtonDismiss, { onClick: onRequestClose, ariaLabel: "Close dialog" })),
28
+ children,
29
+ React__default["default"].createElement("div", { ref: setArrowElement, className: classes.arrow, style: popperStyles.arrow })))));
30
+ }
31
+ function buildModifiers(arrowElement) {
32
+ const modifiers = [
33
+ {
34
+ name: "arrow",
35
+ options: { element: arrowElement, padding: 10 },
36
+ },
37
+ {
38
+ name: "offset",
39
+ options: {
40
+ offset: [0, 10],
41
+ },
42
+ },
43
+ {
44
+ name: "flip",
45
+ options: {
46
+ fallbackPlacements: ["auto"],
47
+ },
48
+ },
49
+ ];
50
+ return modifiers;
51
+ }
52
+
53
+ exports.Popover = Popover;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jobber/components",
3
- "version": "4.39.0",
3
+ "version": "4.40.0",
4
4
  "license": "MIT",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -84,5 +84,5 @@
84
84
  "> 1%",
85
85
  "IE 10"
86
86
  ],
87
- "gitHead": "3ebee9c0f86bbe3a2fe26bf09572a5b4599a9a0c"
87
+ "gitHead": "621f279e8f27d74e69fd76f63b763e38196cd000"
88
88
  }