@arc-ui/components 13.0.0 → 13.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/Alert/styles.css +1 -1
- package/lib/Align/styles.css +1 -1
- package/lib/AppButton/styles.css +1 -1
- package/lib/Avatar/styles.css +1 -1
- package/lib/AvatarGroup/styles.css +1 -1
- package/lib/Badge/styles.css +1 -1
- package/lib/Banner/Banner.cjs +7 -3
- package/lib/Banner/Banner.mjs +7 -3
- package/lib/Box/styles.css +1 -1
- package/lib/BrandLogo/styles.css +1 -1
- package/lib/Breadcrumbs/styles.css +1 -1
- package/lib/Button/styles.css +1 -1
- package/lib/ButtonGroup/styles.css +1 -1
- package/lib/ButtonV2/styles.css +1 -1
- package/lib/Calendar/Calendar.cjs +2 -2
- package/lib/Calendar/Calendar.mjs +2 -2
- package/lib/Calendar/styles.css +1 -1
- package/lib/CardFooter/styles.css +1 -1
- package/lib/CardHeading/styles.css +1 -1
- package/lib/Carousel/Carousel.cjs +26 -14
- package/lib/Carousel/Carousel.mjs +26 -14
- package/lib/Carousel/styles.css +1 -1
- package/lib/Checkbox/styles.css +1 -1
- package/lib/CheckboxIcon/styles.css +1 -1
- package/lib/ClientSideVisible/ClientSideVisible.cjs +1 -0
- package/lib/ClientSideVisible/ClientSideVisible.mjs +1 -0
- package/lib/Columns/styles.css +1 -1
- package/lib/ComboBox/ComboBox.cjs +530 -136
- package/lib/ComboBox/ComboBox.mjs +530 -136
- package/lib/ComboBox/styles.css +1 -1
- package/lib/ConditionalWrapper/ConditionalWrapper.cjs +1 -0
- package/lib/ConditionalWrapper/ConditionalWrapper.mjs +1 -0
- package/lib/ContentSwitcher/styles.css +1 -1
- package/lib/ContentSwitcherDropdown/styles.css +1 -1
- package/lib/DatePicker/DatePicker.cjs +3 -3
- package/lib/DatePicker/DatePicker.mjs +3 -3
- package/lib/DatePicker/styles.css +1 -1
- package/lib/Disclosure/styles.css +1 -1
- package/lib/DisclosureMini/styles.css +1 -1
- package/lib/Download/styles.css +1 -1
- package/lib/Drawer/styles.css +1 -1
- package/lib/Elevation/styles.css +1 -1
- package/lib/Filter/styles.css +1 -1
- package/lib/FormControl/styles.css +1 -1
- package/lib/GhostedHeroBanner/styles.css +1 -1
- package/lib/GradientPageBackground/GradientPageBackground.cjs +2 -2
- package/lib/GradientPageBackground/GradientPageBackground.mjs +2 -2
- package/lib/GradientPageBackground/styles.css +1 -1
- package/lib/Grid/Grid.cjs +1 -0
- package/lib/Grid/Grid.mjs +1 -0
- package/lib/Grid/styles.css +1 -1
- package/lib/Group/styles.css +1 -1
- package/lib/Heading/styles.css +1 -1
- package/lib/HeroBanner/HeroBanner.cjs +7 -3
- package/lib/HeroBanner/HeroBanner.mjs +7 -3
- package/lib/HeroBanner/styles.css +1 -1
- package/lib/HeroButton/styles.css +1 -1
- package/lib/Hidden/styles.css +1 -1
- package/lib/HorizontalCard/styles.css +1 -1
- package/lib/Icon/styles.css +1 -1
- package/lib/Image/styles.css +1 -1
- package/lib/ImpactCard/ImpactCard.cjs +28 -15
- package/lib/ImpactCard/ImpactCard.mjs +29 -16
- package/lib/ImpactCard/styles.css +1 -1
- package/lib/InformationCard/InformationCard.cjs +57 -33
- package/lib/InformationCard/InformationCard.mjs +59 -35
- package/lib/InformationCard/styles.css +1 -1
- package/lib/Link/styles.css +1 -1
- package/lib/Markup/styles.css +1 -1
- package/lib/MediaCard/MediaCard.cjs +40 -21
- package/lib/MediaCard/MediaCard.mjs +41 -22
- package/lib/MediaCard/styles.css +1 -1
- package/lib/Menu/styles.css +1 -1
- package/lib/Modal/styles.css +1 -1
- package/lib/NavigationHeader/NavigationHeader.cjs +2764 -472
- package/lib/NavigationHeader/NavigationHeader.mjs +2707 -436
- package/lib/NavigationHeader/styles.css +1 -1
- package/lib/Pagination/styles.css +1 -1
- package/lib/PaginationSimple/styles.css +1 -1
- package/lib/Popover/Popover.cjs +1 -1
- package/lib/Popover/Popover.mjs +1 -1
- package/lib/Popover/styles.css +1 -1
- package/lib/Poster/styles.css +1 -1
- package/lib/ProgressBar/styles.css +1 -1
- package/lib/ProgressStepper/styles.css +1 -1
- package/lib/ProgressStepperOverflow/styles.css +1 -1
- package/lib/RadioCardGroup/styles.css +1 -1
- package/lib/RadioGroup/RadioGroup.cjs +2 -1
- package/lib/RadioGroup/RadioGroup.mjs +2 -1
- package/lib/RadioGroup/styles.css +1 -1
- package/lib/Rule/styles.css +1 -1
- package/lib/ScrollToTop/styles.css +1 -1
- package/lib/Section/styles.css +1 -1
- package/lib/Select/styles.css +1 -1
- package/lib/SemanticButton/SemanticButton.cjs +10 -0
- package/lib/SemanticButton/SemanticButton.mjs +4 -0
- package/lib/SemanticButton/styles.css +1 -0
- package/lib/SemanticHeading/styles.css +1 -1
- package/lib/SemanticLink/SemanticLink.cjs +10 -0
- package/lib/SemanticLink/SemanticLink.mjs +4 -0
- package/lib/SemanticLink/styles.css +1 -0
- package/lib/SiteFooter/styles.css +1 -1
- package/lib/SiteFooterV2/SiteFooterV2.cjs +3 -2
- package/lib/SiteFooterV2/SiteFooterV2.mjs +3 -2
- package/lib/SiteFooterV2/styles.css +1 -1
- package/lib/SiteHeaderV2/SiteHeaderV2.cjs +1 -1
- package/lib/SiteHeaderV2/SiteHeaderV2.mjs +1 -1
- package/lib/SiteHeaderV2/styles.css +1 -1
- package/lib/Skeleton/styles.css +1 -1
- package/lib/SkipLink/SkipLink.cjs +1 -0
- package/lib/SkipLink/SkipLink.mjs +1 -0
- package/lib/SkipLink/styles.css +1 -1
- package/lib/Spacing/Spacing.cjs +38 -0
- package/lib/Spacing/Spacing.mjs +36 -0
- package/lib/Spacing/styles.css +1 -0
- package/lib/Spinner/styles.css +1 -1
- package/lib/Surface/styles.css +1 -1
- package/lib/Switch/styles.css +1 -1
- package/lib/TabbedBanner/TabbedBanner.cjs +5 -3
- package/lib/TabbedBanner/TabbedBanner.mjs +5 -3
- package/lib/TabbedBanner/styles.css +1 -1
- package/lib/Tabs/Tabs.cjs +57 -25
- package/lib/Tabs/Tabs.mjs +57 -25
- package/lib/Tabs/styles.css +1 -1
- package/lib/Tag/styles.css +1 -1
- package/lib/TemplateBanner/TemplateBanner.cjs +5 -1
- package/lib/TemplateBanner/TemplateBanner.mjs +5 -1
- package/lib/TemplateBanner/styles.css +1 -1
- package/lib/Text/styles.css +1 -1
- package/lib/TextArea/styles.css +1 -1
- package/lib/TextInput/TextInput.cjs +1 -1
- package/lib/TextInput/TextInput.mjs +1 -1
- package/lib/TextInput/styles.css +1 -1
- package/lib/Theme/Theme.cjs +1 -1
- package/lib/Theme/Theme.mjs +1 -1
- package/lib/Theme/styles.css +1 -1
- package/lib/ThemeIcon/styles.css +1 -1
- package/lib/ThumbnailSignpost/styles.css +1 -1
- package/lib/Toast/styles.css +1 -1
- package/lib/Tooltip/styles.css +1 -1
- package/lib/Truncate/styles.css +1 -1
- package/lib/TypographyCard/TypographyCard.cjs +38 -14
- package/lib/TypographyCard/TypographyCard.mjs +39 -15
- package/lib/TypographyCard/styles.css +1 -1
- package/lib/UniversalHeader/UniversalHeader.cjs +10 -8
- package/lib/UniversalHeader/UniversalHeader.mjs +10 -8
- package/lib/UniversalHeader/styles.css +1 -1
- package/lib/VerticalSpace/styles.css +1 -1
- package/lib/VideoPlayer/styles.css +1 -1
- package/lib/Visible/styles.css +1 -1
- package/lib/VisuallyHidden/styles.css +1 -1
- package/lib/_shared/cjs/{Calendar-CdLn9iv6.cjs → Calendar-B-DmNni2.cjs} +1 -1
- package/lib/_shared/cjs/{Popover-BtvRErpC.cjs → Popover-BxuQPltF.cjs} +2 -2
- package/lib/_shared/cjs/SemanticButton-Be0gsNLA.cjs +16 -0
- package/lib/_shared/cjs/SemanticLink-DYO9HLGa.cjs +16 -0
- package/lib/_shared/cjs/{TemplateBanner-DyXBKuMw.cjs → TemplateBanner-DfzDwiVT.cjs} +35 -5
- package/lib/_shared/cjs/{TextInput-C_K2PLf5.cjs → TextInput-CLkhL2KT.cjs} +39 -6
- package/lib/_shared/cjs/{arc-breakpoints-uADxN-b4.cjs → arc-breakpoints-C3HREhvT.cjs} +1 -1
- package/lib/_shared/cjs/{index.es-BAsay4oe.cjs → index.es-D5DdMrn2.cjs} +1 -1
- package/lib/_shared/esm/{Calendar-CzFIMyD1.mjs → Calendar-CfEBiAjy.mjs} +1 -1
- package/lib/_shared/esm/{Popover-DRQSgAog.mjs → Popover-Pjtmu_TN.mjs} +2 -2
- package/lib/_shared/esm/SemanticButton-NGAMAw3m.mjs +14 -0
- package/lib/_shared/esm/SemanticLink-DfJjaHk2.mjs +14 -0
- package/lib/_shared/esm/{TemplateBanner-BPzuH5bz.mjs → TemplateBanner-oQjgkrBQ.mjs} +36 -6
- package/lib/_shared/esm/{TextInput-BCvKXfM_.mjs → TextInput-WczTCUvp.mjs} +40 -7
- package/lib/_shared/esm/{arc-breakpoints-ChQgbftE.mjs → arc-breakpoints-ANMn37k9.mjs} +1 -1
- package/lib/_shared/esm/{index.es-99J0r2va.mjs → index.es-Du5Lyvbp.mjs} +2 -2
- package/lib/index.cjs +9958 -7073
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +560 -203
- package/lib/index.d.mts +560 -203
- package/lib/index.js.map +1 -1
- package/lib/index.mjs +16949 -14068
- package/lib/index.mjs.map +1 -1
- package/lib/styles.css +6 -2
- package/package.json +9 -8
|
@@ -1,32 +1,44 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
2
|
+
import { _ as __rest, a as __assign, b as __spreadArray } from '../_shared/esm/tslib.es6-w7hdJ3oZ.mjs';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import React__default, { useState, useEffect, useId as useId$1, useContext, useRef, createContext, useCallback, useMemo, useLayoutEffect, memo } from 'react';
|
|
4
5
|
import { V as Visible } from '../_shared/esm/Visible-C4eEyTBM.mjs';
|
|
5
6
|
import { c as classNames, g as getDefaultExportFromCjs } from '../_shared/esm/index-5C0-U8cc.mjs';
|
|
7
|
+
import { S as Surface, C as Context } from '../_shared/esm/Surface-C69KVzkY.mjs';
|
|
6
8
|
import { s as suffixModifier } from '../_shared/esm/suffix-modifier-B_pO0UkF.mjs';
|
|
7
|
-
import {
|
|
8
|
-
import { R as Root, P as Portal, O as Overlay, C as Content, T as Title } from '../_shared/esm/index-CjeQnMcn.mjs';
|
|
9
|
-
import { e as useThemeElement } from '../_shared/esm/index-DkAfUbDx.mjs';
|
|
9
|
+
import { S as SemanticLink } from '../_shared/esm/SemanticLink-DfJjaHk2.mjs';
|
|
10
10
|
import { T as Tooltip } from '../_shared/esm/Tooltip-DY8nS1to.mjs';
|
|
11
11
|
import { T as ThemeIcon } from '../_shared/esm/ThemeIcon-B0n6cKRb.mjs';
|
|
12
12
|
import { V as VisuallyHidden } from '../_shared/esm/VisuallyHidden-aSQ4RA1o.mjs';
|
|
13
|
+
import { S as SemanticButton } from '../_shared/esm/SemanticButton-NGAMAw3m.mjs';
|
|
14
|
+
import { R as Root, P as Portal, O as Overlay, C as Content, T as Title } from '../_shared/esm/index-CjeQnMcn.mjs';
|
|
15
|
+
import { e as useThemeElement } from '../_shared/esm/index-DkAfUbDx.mjs';
|
|
13
16
|
import { I as Icon } from '../_shared/esm/Icon-CCUbr_AO.mjs';
|
|
14
17
|
import { T as Text } from '../_shared/esm/Text-BAzOkkzN.mjs';
|
|
15
18
|
import { C as ConditionalWrapper } from '../_shared/esm/ConditionalWrapper-CbEvXHTj.mjs';
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
19
|
+
import { f as filterAttrs } from '../_shared/esm/filter-attrs-v_SweZXP.mjs';
|
|
20
|
+
import { H as Heading } from '../_shared/esm/Heading-Da-o0d5x.mjs';
|
|
21
|
+
import { V as VerticalSpace } from '../_shared/esm/VerticalSpace-BLWB02I7.mjs';
|
|
22
|
+
import { R as Rule } from '../_shared/esm/Rule-Bz3QPezk.mjs';
|
|
23
|
+
import '../_shared/esm/index-Spae4j7j.mjs';
|
|
24
|
+
import { A as ArcBreakpoints } from '../_shared/esm/arc-breakpoints-ANMn37k9.mjs';
|
|
25
|
+
import { P as Popover } from '../_shared/esm/Popover-Pjtmu_TN.mjs';
|
|
26
|
+
import { $ as $69cb30bb0017df05$export$be92b6f5f03c0fe9, c as $69cb30bb0017df05$export$54c2e3dc7acea9f5, a as $69cb30bb0017df05$export$41fb9f06171c75f4, b as $69cb30bb0017df05$export$7c6e2c02157bb7d2 } from '../_shared/esm/index-CfXVJXLq.mjs';
|
|
27
|
+
import { B as ButtonV2 } from '../_shared/esm/ButtonV2-CgjYgfZA.mjs';
|
|
28
|
+
import 'react/jsx-runtime';
|
|
29
|
+
import * as ReactDOM from 'react-dom';
|
|
18
30
|
import { b as require_Symbol, a as requireIsSymbol } from '../_shared/esm/isSymbol-DgWNE2Tm.mjs';
|
|
19
31
|
import { H as Hidden } from '../_shared/esm/Hidden-ByDYDWcI.mjs';
|
|
20
|
-
import '../_shared/esm/
|
|
21
|
-
import '../_shared/esm/index-Spae4j7j.mjs';
|
|
32
|
+
import '../_shared/esm/index-Cgsjp3NL.mjs';
|
|
22
33
|
import '../_shared/esm/Combination-BW0YAEZD.mjs';
|
|
23
|
-
import 'react/jsx-runtime';
|
|
24
|
-
import 'react-dom';
|
|
25
34
|
import '../_shared/esm/index-BMmvMegf.mjs';
|
|
26
|
-
import '../_shared/esm/
|
|
27
|
-
import '../_shared/esm/index.es-
|
|
35
|
+
import '../_shared/esm/SemanticHeading-DpEBq7pG.mjs';
|
|
36
|
+
import '../_shared/esm/index.es-Du5Lyvbp.mjs';
|
|
28
37
|
import '../_shared/esm/index-Dd3yZ_Kk.mjs';
|
|
29
38
|
import '../_shared/esm/index-DNvlT7G_.mjs';
|
|
39
|
+
import '../_shared/esm/index-C_mwuZg6.mjs';
|
|
40
|
+
import '../_shared/esm/index-Drb5ngQr.mjs';
|
|
41
|
+
import '../_shared/esm/Spinner-DvngCIwx.mjs';
|
|
30
42
|
|
|
31
43
|
/**
|
|
32
44
|
* Detect interaction mode
|
|
@@ -58,10 +70,55 @@ var useInteractionMode = function () {
|
|
|
58
70
|
};
|
|
59
71
|
|
|
60
72
|
var useUniqueString = function (value) {
|
|
61
|
-
var id = useId();
|
|
73
|
+
var id = useId$1();
|
|
62
74
|
return "".concat(value, "-").concat(id);
|
|
63
75
|
};
|
|
64
76
|
|
|
77
|
+
var NavigationHeaderContainer = function (_a) {
|
|
78
|
+
var _b = _a.isPill, isPill = _b === void 0 ? false : _b, _c = _a.isExtended, isExtended = _c === void 0 ? false : _c, _d = _a.isFluid, isFluid = _d === void 0 ? false : _d, ref = _a.ref, backgroundColor = _a.backgroundColor, children = _a.children;
|
|
79
|
+
var backgroundColors = {
|
|
80
|
+
light: {
|
|
81
|
+
surface: "light-white",
|
|
82
|
+
classSuffix: "backgroundLight",
|
|
83
|
+
},
|
|
84
|
+
neutral: {
|
|
85
|
+
surface: "light-white",
|
|
86
|
+
classSuffix: "backgroundNeutral",
|
|
87
|
+
},
|
|
88
|
+
lightElevated: {
|
|
89
|
+
surface: "light-white",
|
|
90
|
+
classSuffix: "backgroundLightElevated",
|
|
91
|
+
},
|
|
92
|
+
transparentOnDark: {
|
|
93
|
+
surface: "dark-black",
|
|
94
|
+
classSuffix: "backgroundTransparent",
|
|
95
|
+
},
|
|
96
|
+
transparentOnLight: {
|
|
97
|
+
surface: "light-white",
|
|
98
|
+
classSuffix: "backgroundTransparent",
|
|
99
|
+
},
|
|
100
|
+
ghostedOnLight: {
|
|
101
|
+
surface: "light-white",
|
|
102
|
+
classSuffix: "backgroundGhosted",
|
|
103
|
+
},
|
|
104
|
+
ghostedOnDark: {
|
|
105
|
+
surface: "dark-black",
|
|
106
|
+
classSuffix: "backgroundGhosted",
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
return (React__default.createElement("div", { "data-testid": "NavigationHeader-container", className: classNames("arc-NavigationHeaderContainer--".concat(backgroundColors[backgroundColor].classSuffix), {
|
|
110
|
+
"arc-NavigationHeaderContainer--pill": isPill,
|
|
111
|
+
"arc-NavigationHeaderContainer--fullWidth": !isPill,
|
|
112
|
+
"arc-NavigationHeaderContainer--regular": !isExtended,
|
|
113
|
+
"arc-NavigationHeaderContainer--extended": isExtended,
|
|
114
|
+
"arc-NavigationHeaderContainer--fluid": isFluid,
|
|
115
|
+
}) },
|
|
116
|
+
React__default.createElement("div", { ref: ref, className: "arc-NavigationHeaderContainer-outer" },
|
|
117
|
+
React__default.createElement(Surface, { isTransparent: true, background: backgroundColors[backgroundColor].surface },
|
|
118
|
+
React__default.createElement("div", { className: "arc-NavigationHeaderContainer-inner" },
|
|
119
|
+
React__default.createElement("div", { className: "arc-NavigationHeaderContainer-content" }, children))))));
|
|
120
|
+
};
|
|
121
|
+
|
|
65
122
|
var BtLogo = function () { return (React__default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 50 50" },
|
|
66
123
|
React__default.createElement("path", { d: "M26.225 16.475h12.45v3.65H34.5v13.35h-4.1v-13.35h-4.175v-3.65zM25 46.925c-12.1 0-21.925-9.825-21.925-21.924C3.075 12.9 12.9 3.075 25 3.075 37.1 3.075 46.926 12.9 46.926 25c0 12.1-9.825 21.926-21.926 21.926zM25 50c13.8 0 25-11.2 25-25C50 11.199 38.8 0 25 0S0 11.2 0 25c0 13.801 11.2 25 25 25zm-4.225-21.725c0-1.074-.674-1.8-1.825-1.8H16.2v3.55h2.75c1.15 0 1.825-.725 1.825-1.75zm-.5-6.824c0-.9-.574-1.526-1.55-1.526h-2.524v3.1h2.525c.975 0 1.55-.624 1.55-1.574zm4.65 7.025c0 3.225-2.275 5-5.524 5h-7.246v-17h6.771c3.275 0 5.5 1.674 5.5 4.75 0 1.399-.625 2.649-1.625 3.4 1.15.674 2.124 1.974 2.124 3.85z", fill: "currentColor" }))); };
|
|
67
124
|
|
|
@@ -85,7 +142,46 @@ var NavigationHeaderLogo = function (_a) {
|
|
|
85
142
|
btWholesale: BtWholesaleLogo,
|
|
86
143
|
};
|
|
87
144
|
var icon = svg || React__default.createElement(logos[brand]);
|
|
88
|
-
return (React__default.createElement(
|
|
145
|
+
return (React__default.createElement(SemanticLink, { className: classNames("arc-NavigationHeaderLogo", suffixModifier("arc-NavigationHeaderLogo--on", surface)), "aria-label": ariaLabel, onClick: onClick, href: href }, icon));
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
var DELAY_DURATION = 500;
|
|
149
|
+
|
|
150
|
+
var NavigationHeaderButton = function (_a) {
|
|
151
|
+
var ref = _a.ref, isActive = _a.isActive, children = _a.children, onClick = _a.onClick, href = _a.href, _b = _a.isPadded, isPadded = _b === void 0 ? true : _b, props = __rest(_a, ["ref", "isActive", "children", "onClick", "href", "isPadded"]);
|
|
152
|
+
var surface = useContext(Context).surface;
|
|
153
|
+
var classes = classNames("arc-NavigationHeaderButton", suffixModifier("arc-NavigationHeaderButton--on", surface), {
|
|
154
|
+
"arc-NavigationHeaderButton--active": isActive,
|
|
155
|
+
"arc-NavigationHeaderButton--padded": isPadded,
|
|
156
|
+
});
|
|
157
|
+
var commonProps = {
|
|
158
|
+
className: classes,
|
|
159
|
+
onClick: onClick,
|
|
160
|
+
};
|
|
161
|
+
if (href) {
|
|
162
|
+
return (React__default.createElement(SemanticLink, __assign({}, props, commonProps, { ref: ref, href: href }), children));
|
|
163
|
+
}
|
|
164
|
+
return (React__default.createElement(SemanticButton, __assign({}, props, commonProps, { ref: ref }), children));
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
var getMenuColorConfig = function (background, pathway) {
|
|
168
|
+
var colorConfig = {
|
|
169
|
+
light: {
|
|
170
|
+
surface: "light-white",
|
|
171
|
+
menuColorType: "light",
|
|
172
|
+
},
|
|
173
|
+
dark: {
|
|
174
|
+
surface: "dark-black",
|
|
175
|
+
menuColorType: "dark",
|
|
176
|
+
},
|
|
177
|
+
};
|
|
178
|
+
switch (background) {
|
|
179
|
+
case "transparentOnDark":
|
|
180
|
+
case "ghostedOnDark":
|
|
181
|
+
return pathway === "invert" ? colorConfig.light : colorConfig.dark;
|
|
182
|
+
default:
|
|
183
|
+
return pathway === "invert" ? colorConfig.dark : colorConfig.light;
|
|
184
|
+
}
|
|
89
185
|
};
|
|
90
186
|
|
|
91
187
|
// src/check-element-visibility/check-element-visibility.ts
|
|
@@ -98,31 +194,109 @@ var checkElementVisibility = (element) => {
|
|
|
98
194
|
}
|
|
99
195
|
};
|
|
100
196
|
|
|
101
|
-
var
|
|
197
|
+
var useTriggerHidden = function (_a) {
|
|
198
|
+
var onTriggerHidden = _a.onTriggerHidden, triggerEl = _a.triggerEl;
|
|
199
|
+
useEffect(function () {
|
|
200
|
+
var resizeObserver = new ResizeObserver(function (entries) {
|
|
201
|
+
var entry = entries[0];
|
|
202
|
+
if (!checkElementVisibility(entry.target)) {
|
|
203
|
+
onTriggerHidden();
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
if (triggerEl) {
|
|
207
|
+
resizeObserver.observe(triggerEl);
|
|
208
|
+
}
|
|
209
|
+
return function () {
|
|
210
|
+
if (triggerEl) {
|
|
211
|
+
resizeObserver.unobserve(triggerEl);
|
|
212
|
+
}
|
|
213
|
+
};
|
|
214
|
+
}, [onTriggerHidden, triggerEl]);
|
|
215
|
+
};
|
|
102
216
|
|
|
103
|
-
var
|
|
104
|
-
var
|
|
217
|
+
var SideMenuHeader = function (_a) {
|
|
218
|
+
var children = _a.children, onCloseClick = _a.onCloseClick;
|
|
105
219
|
var surface = useContext(Context).surface;
|
|
106
|
-
|
|
107
|
-
"arc-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
React__default.createElement(Icon, { "aria-hidden": true, icon: icon, size: 28 }),
|
|
113
|
-
React__default.createElement(Text, { size: "l" }, text))));
|
|
220
|
+
return (React__default.createElement("div", { className: "arc-SideMenuHeader" },
|
|
221
|
+
React__default.createElement("div", { className: "arc-SideMenuHeader-closeButtonContainer" },
|
|
222
|
+
React__default.createElement(SemanticButton, { "aria-label": "close", onClick: onCloseClick, className: classNames("arc-SideMenuHeader-closeButton", suffixModifier("arc-SideMenuHeader-closeButton--on", surface)) },
|
|
223
|
+
React__default.createElement(ThemeIcon, { size: 32, icon: "navigationHeaderClose" }))),
|
|
224
|
+
React__default.createElement("div", { className: "arc-SideMenuHeader-logoContainer" },
|
|
225
|
+
React__default.createElement("div", { className: "arc-SideMenuHeader-logoWrapper" }, children))));
|
|
114
226
|
};
|
|
115
227
|
|
|
116
|
-
var
|
|
117
|
-
var
|
|
228
|
+
var SideMenuDrawer = function (_a) {
|
|
229
|
+
var children = _a.children, onCloseAutoFocus = _a.onCloseAutoFocus, onInteractOutside = _a.onInteractOutside, onEscapeKeyDown = _a.onEscapeKeyDown, title = _a.title, drawerType = _a.drawerType, isOpen = _a.isOpen, colorType = _a.colorType, surface = _a.surface, menuPosition = _a.menuPosition;
|
|
230
|
+
var _b = useThemeElement(), themeElement = _b[0], setThemeElement = _b[1];
|
|
231
|
+
return (React__default.createElement("div", { ref: setThemeElement },
|
|
232
|
+
React__default.createElement(Root, { open: isOpen },
|
|
233
|
+
React__default.createElement(Portal, { container: themeElement },
|
|
234
|
+
React__default.createElement(Overlay, { className: "arc-SideMenuDrawer-overlay" },
|
|
235
|
+
React__default.createElement(Content, { "aria-describedby": undefined, className: classNames("arc-SideMenuDrawer-slider", suffixModifier("arc-SideMenuDrawer-slider--position", menuPosition), suffixModifier("arc-SideMenuDrawer-slider--on", colorType), suffixModifier("arc-SideMenuDrawer-slider--type", drawerType)), onCloseAutoFocus: onCloseAutoFocus, onEscapeKeyDown: onEscapeKeyDown, onInteractOutside: onInteractOutside, "aria-modal": "true" },
|
|
236
|
+
React__default.createElement(VisuallyHidden, null,
|
|
237
|
+
React__default.createElement(Title, null, title)),
|
|
238
|
+
React__default.createElement(Surface, { growVertically: true, isTransparent: true, background: surface }, children)))))));
|
|
239
|
+
};
|
|
240
|
+
|
|
241
|
+
var SideMenuNavSection = function (_a) {
|
|
242
|
+
var children = _a.children;
|
|
243
|
+
return (React__default.createElement("div", { className: "arc-SideMenuNavSection" }, children));
|
|
244
|
+
};
|
|
245
|
+
|
|
246
|
+
var getCommonProps = function (_a) {
|
|
247
|
+
var text = _a.text, onClick = _a.onClick;
|
|
248
|
+
return ({
|
|
249
|
+
className: "arc-SideMenuActions-item",
|
|
250
|
+
"aria-label": text,
|
|
251
|
+
onClick: onClick,
|
|
252
|
+
});
|
|
253
|
+
};
|
|
254
|
+
var SideMenuActions = function (_a) {
|
|
255
|
+
var showSeparator = _a.showSeparator, actions = _a.actions;
|
|
256
|
+
var id = useId$1();
|
|
118
257
|
var surface = useContext(Context).surface;
|
|
119
|
-
return (React__default.createElement("
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
258
|
+
return (React__default.createElement("div", { className: classNames("arc-SideMenuActions", suffixModifier("arc-SideMenuActions--on", surface)) },
|
|
259
|
+
React__default.createElement("div", { className: classNames("arc-SideMenuActions-wrapper", {
|
|
260
|
+
"arc-SideMenuActions--seperator": showSeparator,
|
|
261
|
+
}) }, actions.map(function (action, i) { return (React__default.createElement(ConditionalWrapper, { key: "".concat(id, "-action-{").concat(i, "}"), condition: Boolean(action.href), wrapper: function (children) { return (React__default.createElement(SemanticLink, __assign({}, getCommonProps(action), { href: action.href }), children)); }, fallback: function (children) { return (React__default.createElement(SemanticButton, __assign({}, getCommonProps(action)), children)); } },
|
|
262
|
+
React__default.createElement("div", { className: "arc-SideMenuActions-content" },
|
|
263
|
+
React__default.createElement("div", { className: classNames("arc-SideMenuActions-icon", {
|
|
264
|
+
"arc-SideMenuActions-icon--attention": action.isAttention,
|
|
265
|
+
}) },
|
|
266
|
+
React__default.createElement(Icon, { "aria-hidden": true, icon: action.icon, size: 28 })),
|
|
267
|
+
React__default.createElement(Text, { size: "l" }, action.text)))); }))));
|
|
123
268
|
};
|
|
124
269
|
|
|
125
|
-
var
|
|
270
|
+
var SideMenuLink = function (_a) {
|
|
271
|
+
var ref = _a.ref, href = _a.href, onClick = _a.onClick, text = _a.text, props = __rest(_a, ["ref", "href", "onClick", "text"]);
|
|
272
|
+
var surface = useContext(Context).surface;
|
|
273
|
+
var commonProps = __assign({ "aria-label": text, onClick: onClick, className: classNames("arc-SideMenuLink", suffixModifier("arc-SideMenuLink--on", surface)) }, filterAttrs(props));
|
|
274
|
+
return (React__default.createElement(ConditionalWrapper, { condition: Boolean(href), wrapper: function (children) { return (React__default.createElement(SemanticLink, __assign({}, commonProps, { href: href, ref: ref }), children)); }, fallback: function (children) { return (React__default.createElement(SemanticButton, __assign({}, commonProps, { ref: ref }), children)); } },
|
|
275
|
+
React__default.createElement("div", { className: "arc-SideMenuLink-text" }, text),
|
|
276
|
+
React__default.createElement("span", { className: "arc-SideMenuLink-icon" },
|
|
277
|
+
React__default.createElement(ThemeIcon, { icon: "navigationHeaderMenuLinkLarge" }))));
|
|
278
|
+
};
|
|
279
|
+
|
|
280
|
+
// src/get-focusable-elements/get-focusable-elements.ts
|
|
281
|
+
var getFocusableElements = (rootElement) => {
|
|
282
|
+
const nodes = [];
|
|
283
|
+
const walker = document.createTreeWalker(
|
|
284
|
+
rootElement,
|
|
285
|
+
NodeFilter.SHOW_ELEMENT,
|
|
286
|
+
{
|
|
287
|
+
acceptNode: (node) => {
|
|
288
|
+
const isHiddenInput = node.tagName === "INPUT" && node.type === "hidden";
|
|
289
|
+
if (node.disabled || node.hidden || isHiddenInput || !checkElementVisibility(node))
|
|
290
|
+
return NodeFilter.FILTER_SKIP;
|
|
291
|
+
return node.tabIndex >= 0 ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
);
|
|
295
|
+
while (walker.nextNode()) nodes.push(walker.currentNode);
|
|
296
|
+
return nodes;
|
|
297
|
+
};
|
|
298
|
+
|
|
299
|
+
var SideMenuDisclosure = function (_a) {
|
|
126
300
|
var heading = _a.heading, children = _a.children;
|
|
127
301
|
var _b = useState(false), isOpen = _b[0], setIsOpen = _b[1];
|
|
128
302
|
var surface = useContext(Context).surface;
|
|
@@ -132,369 +306,2382 @@ var NavigationHeaderDisclosure = function (_a) {
|
|
|
132
306
|
setIsOpen(function (isOpen) { return !isOpen; });
|
|
133
307
|
};
|
|
134
308
|
useEffect(function () {
|
|
309
|
+
var _a;
|
|
135
310
|
if (containerRef.current && containerRef.current.firstChild && isOpen) {
|
|
136
|
-
containerRef.current.
|
|
311
|
+
(_a = getFocusableElements(containerRef.current)[0]) === null || _a === void 0 ? void 0 : _a.focus();
|
|
137
312
|
}
|
|
138
313
|
}, [isOpen]);
|
|
139
|
-
return (React__default.createElement("details", { className: classNames("arc-
|
|
140
|
-
React__default.createElement("summary", { "aria-expanded": isOpen, onClick: handleOnClick, className: "arc-
|
|
141
|
-
React__default.createElement("span", { className: "arc-
|
|
142
|
-
React__default.createElement("span", { className: "arc-
|
|
143
|
-
React__default.createElement(
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
314
|
+
return (React__default.createElement("details", { className: classNames("arc-SideMenuDisclosure", suffixModifier("arc-SideMenuDisclosure--on", surface)), open: isOpen },
|
|
315
|
+
React__default.createElement("summary", { "aria-expanded": isOpen, onClick: handleOnClick, className: "arc-SideMenuDisclosure-summary" },
|
|
316
|
+
React__default.createElement("span", { className: "arc-SideMenuDisclosure-heading" }, heading),
|
|
317
|
+
React__default.createElement("span", { className: "arc-SideMenuDisclosure-icon" },
|
|
318
|
+
React__default.createElement(ThemeIcon, { size: 20, icon: "navigationHeaderDisclosure" }))),
|
|
319
|
+
React__default.createElement("div", { ref: containerRef, className: "arc-SideMenuDisclosure-content" }, children)));
|
|
320
|
+
};
|
|
321
|
+
|
|
322
|
+
var createNavigationHeaderContext = function (errorMessage) {
|
|
323
|
+
var componentContext = createContext(null);
|
|
324
|
+
var useComponentContext = function () {
|
|
325
|
+
var context = useContext(componentContext);
|
|
326
|
+
if (!context) {
|
|
327
|
+
throw new Error(errorMessage);
|
|
328
|
+
}
|
|
329
|
+
return context;
|
|
330
|
+
};
|
|
331
|
+
return [componentContext, useComponentContext];
|
|
332
|
+
};
|
|
333
|
+
|
|
334
|
+
var _a$2 = createNavigationHeaderContext("NavigationHeaderSideMenu sub components must be used within NavigationHeaderSideMenu"), NavigationHeaderSideMenuContext = _a$2[0], useNavigationHeaderSideMenuContext = _a$2[1];
|
|
335
|
+
|
|
336
|
+
var SideMenuSubMenu = function (_a) {
|
|
337
|
+
var children = _a.children, heading = _a.heading, isOpen = _a.isOpen, onBackClick = _a.onBackClick, onCloseAutoFocus = _a.onCloseAutoFocus, supportingText = _a.supportingText, _b = _a.headingSize, headingSize = _b === void 0 ? "l" : _b, _c = _a.backButtonLabel, backButtonLabel = _c === void 0 ? "Back" : _c, _d = _a.backButtonAriaLabel, backButtonAriaLabel = _d === void 0 ? "Back to main menu" : _d;
|
|
338
|
+
var _e = useNavigationHeaderSideMenuContext(), menuColorConfig = _e.menuColorConfig, menuPosition = _e.menuPosition, onEscapeKeyDown = _e.onEscapeKeyDown, closeMenu = _e.closeMenu;
|
|
339
|
+
return (React__default.createElement(React__default.Fragment, null,
|
|
340
|
+
React__default.createElement(SideMenuDrawer, { drawerType: "sub", title: "Secondary menu", isOpen: isOpen, onCloseAutoFocus: onCloseAutoFocus, colorType: menuColorConfig.menuColorType, surface: menuColorConfig.surface, menuPosition: menuPosition, onEscapeKeyDown: onEscapeKeyDown, onInteractOutside: closeMenu },
|
|
341
|
+
React__default.createElement(SideMenuHeader, { onCloseClick: closeMenu },
|
|
342
|
+
React__default.createElement(SemanticButton, { className: classNames("arc-SideMenuSubMenu-backButton", suffixModifier("arc-SideMenuSubMenu-backButton--on", menuColorConfig.menuColorType)), "aria-label": backButtonAriaLabel, onClick: onBackClick },
|
|
343
|
+
React__default.createElement("div", { className: "arc-SideMenuSubMenu-backButtonIcon" },
|
|
344
|
+
React__default.createElement(ThemeIcon, { icon: "navigationHeaderSideMenuBack", size: 32 })),
|
|
345
|
+
React__default.createElement("div", { className: "arc-SideMenuSubMenu-backButtonText" }, backButtonLabel))),
|
|
346
|
+
React__default.createElement(SideMenuNavSection, null,
|
|
347
|
+
React__default.createElement("div", { className: "arc-SideMenuSubMenu-heading" },
|
|
348
|
+
React__default.createElement(Heading, { size: headingSize }, heading),
|
|
349
|
+
supportingText && (React__default.createElement(React__default.Fragment, null,
|
|
350
|
+
React__default.createElement(VerticalSpace, { size: "4" }),
|
|
351
|
+
React__default.createElement(Text, { tone: "muted", size: "s" }, supportingText)))),
|
|
352
|
+
children))));
|
|
353
|
+
};
|
|
354
|
+
|
|
355
|
+
var ArrowRightIcon = function () { return (React__default.createElement("svg", { width: 16, height: 16, viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
|
|
356
|
+
React__default.createElement("path", { d: "M14.0306 8.52927L9.53063 13.0293C9.38973 13.1702 9.19863 13.2493 8.99938 13.2493C8.80012 13.2493 8.60902 13.1702 8.46813 13.0293C8.32723 12.8884 8.24807 12.6973 8.24807 12.498C8.24807 12.2988 8.32723 12.1077 8.46813 11.9668L11.6875 8.74864H2.5C2.30109 8.74864 2.11032 8.66963 1.96967 8.52897C1.82902 8.38832 1.75 8.19756 1.75 7.99864C1.75 7.79973 1.82902 7.60897 1.96967 7.46831C2.11032 7.32766 2.30109 7.24864 2.5 7.24864H11.6875L8.46937 4.02864C8.32848 3.88775 8.24932 3.69665 8.24932 3.49739C8.24932 3.29814 8.32848 3.10704 8.46937 2.96614C8.61027 2.82525 8.80137 2.74609 9.00062 2.74609C9.19988 2.74609 9.39098 2.82525 9.53187 2.96614L14.0319 7.46614C14.1018 7.53592 14.1573 7.61881 14.1951 7.71008C14.2329 7.80135 14.2523 7.89918 14.2522 7.99797C14.252 8.09675 14.2324 8.19454 14.1944 8.28572C14.1564 8.37689 14.1007 8.45966 14.0306 8.52927Z", fill: "currentColor" }))); };
|
|
357
|
+
|
|
358
|
+
var NavigationHeaderCta = function (_a) {
|
|
359
|
+
var href = _a.href, onClick = _a.onClick, text = _a.text, _b = _a.revealLinkIconOnHover, revealLinkIconOnHover = _b === void 0 ? false : _b;
|
|
360
|
+
var surface = useContext(Context).surface;
|
|
361
|
+
return (React__default.createElement(SemanticLink, { className: classNames("arc-NavigationHeaderCta", suffixModifier("arc-NavigationHeaderCta--on", surface)), onClick: onClick, href: href },
|
|
362
|
+
React__default.createElement("div", { className: "arc-NavigationHeaderCta-heading" },
|
|
363
|
+
React__default.createElement(Heading, { size: "xxs" }, text)),
|
|
364
|
+
React__default.createElement("div", { className: classNames("arc-NavigationHeaderCta-linkIcon", {
|
|
365
|
+
"arc-NavigationHeaderCta-linkIcon--revealLinkIconOnHover": revealLinkIconOnHover,
|
|
366
|
+
}) },
|
|
367
|
+
React__default.createElement(ArrowRightIcon, null))));
|
|
368
|
+
};
|
|
369
|
+
|
|
370
|
+
var NavigationHeaderCollapsingNavList = function (_a) {
|
|
371
|
+
var mainLink = _a.mainLink, description = _a.description, category = _a.category, links = _a.links, revealLinkIconOnHover = _a.revealLinkIconOnHover, _b = _a.autoFocusOnExpand, autoFocusOnExpand = _b === void 0 ? true : _b, _c = _a.background, background = _c === void 0 ? "dark" : _c, _d = _a.defaultOpen, defaultOpen = _d === void 0 ? false : _d;
|
|
372
|
+
var id = useId$1();
|
|
373
|
+
var surface = useContext(Context).surface;
|
|
374
|
+
var _e = useState(defaultOpen), isOpen = _e[0], setIsOpen = _e[1];
|
|
375
|
+
var containerRef = useRef(null);
|
|
376
|
+
var onClick = function (e) {
|
|
377
|
+
setIsOpen(e.currentTarget.open);
|
|
378
|
+
};
|
|
379
|
+
useEffect(function () {
|
|
380
|
+
if (containerRef.current &&
|
|
381
|
+
containerRef.current.firstChild &&
|
|
382
|
+
autoFocusOnExpand &&
|
|
383
|
+
isOpen) {
|
|
384
|
+
getFocusableElements(containerRef.current)[0].focus();
|
|
385
|
+
}
|
|
386
|
+
}, [isOpen, autoFocusOnExpand]);
|
|
387
|
+
return (React__default.createElement("details", { className: classNames("arc-NavigationHeaderCollapsingNavList-disclosure", suffixModifier("arc-NavigationHeaderCollapsingNavList-disclosure--on", surface), {
|
|
388
|
+
"arc-NavigationHeaderCollapsingNavList-disclosure--open": isOpen,
|
|
389
|
+
}), open: isOpen, onToggle: onClick },
|
|
390
|
+
React__default.createElement("summary", { className: classNames("arc-NavigationHeaderCollapsingNavList-disclosureSummary", suffixModifier("arc-NavigationHeaderCollapsingNavList-disclosureSummary--background", background)), "aria-expanded": isOpen },
|
|
391
|
+
React__default.createElement("div", { className: "arc-NavigationHeaderCollapsingNavList-disclosureSummaryHeading" },
|
|
392
|
+
React__default.createElement(Heading, { level: "2" }, category)),
|
|
393
|
+
React__default.createElement("span", { className: "arc-NavigationHeaderCollapsingNavList-disclosureSummaryIcon" },
|
|
394
|
+
React__default.createElement(ThemeIcon, { size: 16, icon: "disclosureExpand" }))),
|
|
395
|
+
React__default.createElement("div", { className: "arc-NavigationHeaderCollapsingNavList-content" },
|
|
396
|
+
React__default.createElement(VerticalSpace, { size: "8" }),
|
|
397
|
+
description && (React__default.createElement("div", { className: "arc-NavigationHeaderCollapsingNavList-description" },
|
|
398
|
+
React__default.createElement(Text, { size: "s", tone: "muted" }, description))),
|
|
399
|
+
React__default.createElement("div", { ref: containerRef },
|
|
400
|
+
mainLink && (React__default.createElement(React__default.Fragment, null,
|
|
401
|
+
React__default.createElement(VerticalSpace, { size: "16" }),
|
|
402
|
+
React__default.createElement(NavigationHeaderCta, __assign({}, mainLink, { revealLinkIconOnHover: revealLinkIconOnHover })),
|
|
403
|
+
React__default.createElement(VerticalSpace, { size: "8" }),
|
|
404
|
+
React__default.createElement(Rule, null))),
|
|
405
|
+
links && (React__default.createElement(React__default.Fragment, null,
|
|
406
|
+
React__default.createElement(VerticalSpace, { size: "8" }),
|
|
407
|
+
React__default.createElement("ul", { className: "arc-NavigationHeaderCollapsingNavList-list" }, links.map(function (link, i) { return (React__default.createElement("li", { key: "".concat(id, "-NavigationHeader-megamenu-link-").concat(i) },
|
|
408
|
+
React__default.createElement(NavigationHeaderCta, __assign({}, link, { revealLinkIconOnHover: revealLinkIconOnHover })))); })))),
|
|
409
|
+
React__default.createElement(VerticalSpace, { size: "24" })))));
|
|
410
|
+
};
|
|
411
|
+
|
|
412
|
+
var SideMenuCategoryLinksItem = function (_a) {
|
|
413
|
+
var items = _a.items, text = _a.text, backButtonLabel = _a.backButtonLabel, backButtonAriaLabel = _a.backButtonAriaLabel, panelHeading = _a.panelHeading;
|
|
414
|
+
var id = useId$1();
|
|
415
|
+
var _b = useState(false), isDrawerOpen = _b[0], setIsDrawerOpen = _b[1];
|
|
416
|
+
var triggerRef = useRef(null);
|
|
417
|
+
var onItemClick = function () {
|
|
418
|
+
setIsDrawerOpen(true);
|
|
419
|
+
};
|
|
420
|
+
var onBackClick = function () {
|
|
421
|
+
setIsDrawerOpen(false);
|
|
422
|
+
};
|
|
423
|
+
var onCloseAutoFocus = function () {
|
|
424
|
+
var _a;
|
|
425
|
+
(_a = triggerRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
426
|
+
};
|
|
427
|
+
return (React__default.createElement(React__default.Fragment, null,
|
|
428
|
+
React__default.createElement(SideMenuLink, { "aria-haspopup": "dialog", "aria-expanded": isDrawerOpen, ref: triggerRef, onClick: onItemClick, text: text }),
|
|
429
|
+
React__default.createElement(SideMenuSubMenu, { isOpen: isDrawerOpen, heading: panelHeading.heading, supportingText: panelHeading.supportingText, onBackClick: onBackClick, onCloseAutoFocus: onCloseAutoFocus, backButtonLabel: backButtonLabel, backButtonAriaLabel: backButtonAriaLabel },
|
|
430
|
+
React__default.createElement("div", { className: "arc-SideMenuCategoryLinksItem-navItems" }, items.map(function (navItem, navItemIndex) { return (React__default.createElement(NavigationHeaderCollapsingNavList, __assign({}, navItem, { key: "".concat(id, "-side-menu-category-link-item-").concat(navItemIndex) }))); })))));
|
|
431
|
+
};
|
|
432
|
+
|
|
433
|
+
var NavigationHeaderFeatureCard = function (_a) {
|
|
434
|
+
var title = _a.title, description = _a.description, href = _a.href, onClick = _a.onClick, img = _a.img, label = _a.label, isFeatured = _a.isFeatured, props = __rest(_a, ["title", "description", "href", "onClick", "img", "label", "isFeatured"]);
|
|
435
|
+
return (React__default.createElement("div", __assign({ className: classNames("arc-NavigationHeaderFeatureCard", {
|
|
436
|
+
"arc-NavigationHeaderFeatureCard--featured": isFeatured,
|
|
437
|
+
}) }, filterAttrs(props)),
|
|
438
|
+
img && (React__default.createElement("div", { className: "arc-NavigationHeaderFeatureCard-imgContainer" },
|
|
439
|
+
React__default.createElement("img", { alt: "", src: img, className: "arc-NavigationHeaderFeatureCard-img" }))),
|
|
440
|
+
React__default.createElement("div", { className: "arc-NavigationHeaderFeatureCard-content" },
|
|
441
|
+
React__default.createElement("div", { className: "arc-NavigationHeaderFeatureCard-header" },
|
|
442
|
+
label && (React__default.createElement("div", { className: "arc-NavigationHeaderFeatureCard-label" },
|
|
443
|
+
React__default.createElement(Heading, { size: "xxxs" }, label))),
|
|
444
|
+
React__default.createElement(Heading, { level: "4", size: "s" },
|
|
445
|
+
React__default.createElement(SemanticLink, { className: "arc-NavigationHeaderFeatureCard-link", href: href, onClick: onClick }, title)),
|
|
446
|
+
React__default.createElement(VerticalSpace, { size: "16" })),
|
|
447
|
+
React__default.createElement("div", { className: "arc-NavigationHeaderFeatureCard-body" }, description && (React__default.createElement(React__default.Fragment, null,
|
|
448
|
+
React__default.createElement(Text, { size: "s" }, description),
|
|
449
|
+
React__default.createElement(VerticalSpace, { size: "16" })))),
|
|
450
|
+
React__default.createElement("div", { className: "arc-NavigationHeaderFeatureCard-footer" },
|
|
451
|
+
React__default.createElement("span", { className: "arc-NavigationHeaderFeatureCard-cta" },
|
|
452
|
+
React__default.createElement(ArrowRightIcon, null))))));
|
|
453
|
+
};
|
|
454
|
+
|
|
455
|
+
var NavigationHeaderPanelLink = function (_a) {
|
|
456
|
+
var icon = _a.icon, href = _a.href, onClick = _a.onClick, heading = _a.heading, description = _a.description;
|
|
457
|
+
var surface = useContext(Context).surface;
|
|
458
|
+
return (React__default.createElement("div", { className: classNames("arc-NavigationHeaderPanelLink", suffixModifier("arc-NavigationHeaderPanelLink--on", surface)) },
|
|
459
|
+
React__default.createElement("div", { className: "arc-NavigationHeaderPanelLink-icon" },
|
|
460
|
+
React__default.createElement(Icon, { color: "brand", icon: icon, size: 88 })),
|
|
461
|
+
React__default.createElement("div", { className: "arc-NavigationHeaderPanelLink-textCol" },
|
|
462
|
+
React__default.createElement("div", { className: "arc-NavigationHeaderPanelLink-heading" },
|
|
463
|
+
React__default.createElement(Heading, { size: "s" },
|
|
464
|
+
React__default.createElement(SemanticLink, { className: "arc-NavigationHeaderPanelLink-link", href: href, onClick: onClick }, heading))),
|
|
465
|
+
React__default.createElement(VerticalSpace, { size: "12" }),
|
|
466
|
+
React__default.createElement("div", { className: "arc-NavigationHeaderPanelLink-description" },
|
|
467
|
+
React__default.createElement(Text, { size: "s" }, description))),
|
|
468
|
+
React__default.createElement("div", { className: "arc-NavigationHeaderPanelLink-ctaCol" },
|
|
469
|
+
React__default.createElement("span", { className: "arc-NavigationHeaderPanelLink-cta" },
|
|
470
|
+
React__default.createElement(ArrowRightIcon, null)))));
|
|
471
|
+
};
|
|
472
|
+
|
|
473
|
+
var MegaMenuSubMenu = function (_a) {
|
|
474
|
+
var item = _a.item, heading = _a.heading, backButtonLabel = _a.backButtonLabel, backButtonAriaLabel = _a.backButtonAriaLabel;
|
|
475
|
+
var id = useId$1();
|
|
476
|
+
var triggerRef = useRef(null);
|
|
477
|
+
var _b = useState(false), isDrawerOpen = _b[0], setIsDrawerOpen = _b[1];
|
|
478
|
+
var menuColorConfig = useNavigationHeaderSideMenuContext().menuColorConfig;
|
|
479
|
+
var onItemClick = function () {
|
|
480
|
+
setIsDrawerOpen(true);
|
|
481
|
+
};
|
|
482
|
+
var onBackClick = function () {
|
|
483
|
+
setIsDrawerOpen(false);
|
|
484
|
+
};
|
|
485
|
+
var onCloseAutoFocus = function () {
|
|
486
|
+
var _a;
|
|
487
|
+
(_a = triggerRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
488
|
+
};
|
|
489
|
+
return (React__default.createElement(React__default.Fragment, null,
|
|
490
|
+
React__default.createElement(SemanticButton, { "aria-haspopup": "dialog", "aria-expanded": isDrawerOpen, ref: triggerRef, "aria-label": item.triggerText, className: classNames("arc-SideMenuMegaMenuItem-button", suffixModifier("arc-SideMenuMegaMenuItem-button--on", menuColorConfig.menuColorType)), onClick: onItemClick },
|
|
491
|
+
React__default.createElement("div", { className: "arc-SideMenuMegaMenuItem-buttonIcon" },
|
|
492
|
+
React__default.createElement(Icon, { icon: item.icon, size: 32 })),
|
|
493
|
+
React__default.createElement("div", { className: "arc-SideMenuMegaMenuItem-buttonText" },
|
|
494
|
+
React__default.createElement(Heading, { size: "xxs" }, item.triggerText))),
|
|
495
|
+
React__default.createElement(SideMenuSubMenu, { isOpen: isDrawerOpen, heading: heading, headingSize: "s", onBackClick: onBackClick, onCloseAutoFocus: onCloseAutoFocus, backButtonLabel: backButtonLabel, backButtonAriaLabel: backButtonAriaLabel },
|
|
496
|
+
React__default.createElement(NavigationHeaderPanelLink, __assign({}, item.panelLink, { icon: item.icon })),
|
|
497
|
+
React__default.createElement(VerticalSpace, { size: "16" }),
|
|
498
|
+
React__default.createElement("div", { className: "arc-SideMenuMegaMenuItem-navItems" }, item.items.map(function (navItem, navItemIndex) { return (React__default.createElement(NavigationHeaderCollapsingNavList, __assign({}, navItem, { key: "".concat(id, "-side-mega-menu-drawer-navItem-").concat(navItemIndex) }))); })))));
|
|
499
|
+
};
|
|
500
|
+
var SideMenuMegaMenuItem = function (_a) {
|
|
501
|
+
var featureCards = _a.featureCards, text = _a.text, panelHeading = _a.panelHeading, tabs = _a.tabs, backButtonLabel = _a.backButtonLabel, backButtonAriaLabel = _a.backButtonAriaLabel;
|
|
502
|
+
var id = useId$1();
|
|
503
|
+
return (React__default.createElement(SideMenuDisclosure, { heading: text },
|
|
504
|
+
tabs.map(function (item, itemIndex) { return (React__default.createElement(MegaMenuSubMenu, { key: "".concat(id, "-side-menu-mega-menu-item-").concat(itemIndex), item: item, heading: panelHeading.heading, backButtonLabel: backButtonLabel, backButtonAriaLabel: backButtonAriaLabel })); }),
|
|
505
|
+
featureCards && (React__default.createElement(Surface, { isTransparent: true, background: "light-white" },
|
|
506
|
+
React__default.createElement("div", { className: "arc-SideMenuMegaMenuItem-featureCards" },
|
|
507
|
+
React__default.createElement("div", { className: "arc-SideMenuMegaMenuItem-featureCardContainer" }, featureCards.map(function (card, cardIndex) { return (React__default.createElement(NavigationHeaderFeatureCard, { title: card.title, href: card.href, isFeatured: card.isFeatured, label: card.label, onClick: card.onClick, key: "".concat(id, "-side-menu-mega-menu-card-").concat(cardIndex) })); })))))));
|
|
150
508
|
};
|
|
151
509
|
|
|
152
|
-
var
|
|
153
|
-
var
|
|
510
|
+
var SideMenuNavItem = function (_a) {
|
|
511
|
+
var navItem = _a.navItem;
|
|
512
|
+
var id = useId$1();
|
|
513
|
+
return (React__default.createElement(React__default.Fragment, null,
|
|
514
|
+
navItem.type === "link" && (React__default.createElement(SideMenuLink, { href: navItem.href, onClick: navItem.onClick, text: navItem.text })),
|
|
515
|
+
navItem.type === "levelTwo" && (React__default.createElement(SideMenuDisclosure, { heading: navItem.text }, navItem.items.map(function (link, linkIndex) { return (React__default.createElement(NavigationHeaderCta, { key: "".concat(id, "-side-menu-level-two-link-item-").concat(linkIndex), href: link.href, onClick: link.onClick, text: link.text })); }))),
|
|
516
|
+
navItem.type === "categoryLinks" && (React__default.createElement(SideMenuCategoryLinksItem, __assign({}, navItem))),
|
|
517
|
+
navItem.type === "megamenu" && React__default.createElement(SideMenuMegaMenuItem, __assign({}, navItem))));
|
|
518
|
+
};
|
|
519
|
+
|
|
520
|
+
var SideMenuNavList = function (_a) {
|
|
521
|
+
var children = _a.children;
|
|
522
|
+
return (React__default.createElement("nav", null,
|
|
523
|
+
React__default.createElement("ul", { className: "arc-SideMenuNavList" }, children)));
|
|
524
|
+
};
|
|
525
|
+
|
|
526
|
+
var NavigationHeaderSideMenu = function (_a) {
|
|
527
|
+
var navItems = _a.navItems, children = _a.children, actions = _a.actions, header = _a.header, footer = _a.footer, logo = _a.logo, background = _a.background, onOpenChange = _a.onOpenChange, trigger = _a.trigger, menuPosition = _a.menuPosition, _b = _a.showLogo, showLogo = _b === void 0 ? true : _b, _c = _a.tooltip, tooltip = _c === void 0 ? "Menu" : _c, _d = _a.pathway, pathway = _d === void 0 ? "invert" : _d, _e = _a.triggerAriaLabel, triggerAriaLabel = _e === void 0 ? "Open menu" : _e;
|
|
528
|
+
var id = useId$1();
|
|
529
|
+
var _f = useState(false), isMenuOpen = _f[0], setIsMenuOpen = _f[1];
|
|
530
|
+
var triggerRef = useRef(null);
|
|
531
|
+
var mainContentRef = useRef(null);
|
|
532
|
+
var _g = useState("pointer"), interactionMode = _g[0], setInterActionMode = _g[1];
|
|
533
|
+
useEffect(function () {
|
|
534
|
+
onOpenChange === null || onOpenChange === void 0 ? void 0 : onOpenChange(isMenuOpen);
|
|
535
|
+
}, [isMenuOpen, onOpenChange]);
|
|
536
|
+
useTriggerHidden({
|
|
537
|
+
triggerEl: triggerRef.current,
|
|
538
|
+
onTriggerHidden: function () {
|
|
539
|
+
closeMenu();
|
|
540
|
+
},
|
|
541
|
+
});
|
|
542
|
+
var closeMenu = useCallback(function () {
|
|
543
|
+
setIsMenuOpen(false);
|
|
544
|
+
}, [setIsMenuOpen]);
|
|
545
|
+
var onEscapeKeyDown = useCallback(function () {
|
|
546
|
+
setInterActionMode("keyboard");
|
|
547
|
+
closeMenu();
|
|
548
|
+
}, [closeMenu]);
|
|
549
|
+
var onSideMenuMouseDown = function () {
|
|
550
|
+
setInterActionMode("pointer");
|
|
551
|
+
};
|
|
552
|
+
var onSideMenuKeyDown = function () {
|
|
553
|
+
setInterActionMode("keyboard");
|
|
554
|
+
};
|
|
555
|
+
var focusTriggerElement = function () {
|
|
556
|
+
var _a;
|
|
557
|
+
interactionMode === "keyboard" && ((_a = triggerRef.current) === null || _a === void 0 ? void 0 : _a.focus());
|
|
558
|
+
};
|
|
559
|
+
var menuColorConfig = getMenuColorConfig(background, pathway);
|
|
560
|
+
var contextValue = useMemo(function () { return ({ menuPosition: menuPosition, menuColorConfig: menuColorConfig, onEscapeKeyDown: onEscapeKeyDown, closeMenu: closeMenu }); }, [menuPosition, menuColorConfig, onEscapeKeyDown, closeMenu]);
|
|
561
|
+
return (React__default.createElement(NavigationHeaderSideMenuContext.Provider, { value: contextValue },
|
|
562
|
+
React__default.createElement("div", { className: "arc-NavigationHeaderSideMenu", onMouseDown: onSideMenuMouseDown, onKeyDown: onSideMenuKeyDown },
|
|
563
|
+
React__default.createElement(Tooltip, { delayDuration: DELAY_DURATION, asChild: true, title: tooltip, side: "bottom" },
|
|
564
|
+
React__default.createElement(NavigationHeaderButton, { ref: triggerRef, isPadded: Boolean(trigger) || false, "aria-expanded": isMenuOpen, "aria-label": isMenuOpen ? "close menu" : triggerAriaLabel, onClick: function () { return setIsMenuOpen(!isMenuOpen); } },
|
|
565
|
+
trigger || (React__default.createElement("div", { className: "arc-NavigationHeaderSideMenu-trigger" }, React__default.createElement(ThemeIcon, { icon: "siteHeaderBurger", size: 24 }))),
|
|
566
|
+
React__default.createElement(VisuallyHidden, null, isMenuOpen ? "close menu" : "open menu"))),
|
|
567
|
+
React__default.createElement(SideMenuDrawer, { drawerType: "main", title: "Navigation menu", menuPosition: menuPosition, isOpen: isMenuOpen, colorType: menuColorConfig.menuColorType, surface: menuColorConfig.surface, onCloseAutoFocus: focusTriggerElement, onEscapeKeyDown: onEscapeKeyDown, onInteractOutside: closeMenu },
|
|
568
|
+
React__default.createElement("div", { className: "arc-NavigationHeaderSideMenu-container" },
|
|
569
|
+
React__default.createElement("div", { className: "arc-NavigationHeaderSideMenu-mainContent" },
|
|
570
|
+
showLogo && (React__default.createElement(SideMenuHeader, { onCloseClick: closeMenu },
|
|
571
|
+
React__default.createElement(NavigationHeaderLogo, __assign({}, logo)))),
|
|
572
|
+
React__default.createElement("div", { ref: mainContentRef },
|
|
573
|
+
header && (React__default.createElement("div", { className: classNames("arc-NavigationHeaderSideMenu-topContent", {
|
|
574
|
+
"arc-NavigationHeaderSideMenu-topContent--bottomSpacing": !navItems,
|
|
575
|
+
}) }, header)),
|
|
576
|
+
navItems && !children && (React__default.createElement(SideMenuNavSection, null,
|
|
577
|
+
React__default.createElement(SideMenuNavList, null, navItems === null || navItems === void 0 ? void 0 : navItems.map(function (navItem, navItemIndex) { return (React__default.createElement(React__default.Fragment, { key: "".concat(id, "-side-nav-item-").concat(navItemIndex) },
|
|
578
|
+
React__default.createElement("li", { className: classNames({
|
|
579
|
+
"arc-NavigationHeaderSideMenu--separator": navItem.isSeparator,
|
|
580
|
+
}, suffixModifier("arc-NavigationHeaderSideMenu--separatorOn", menuColorConfig.menuColorType)) },
|
|
581
|
+
React__default.createElement(SideMenuNavItem, { navItem: navItem })))); })))),
|
|
582
|
+
children && (React__default.createElement(SideMenuNavSection, null, children)),
|
|
583
|
+
actions && (React__default.createElement(SideMenuActions, { showSeparator: Boolean(navItems || header), actions: actions })))),
|
|
584
|
+
footer && (React__default.createElement("div", { className: "arc-NavigationHeaderSideMenu-footer" }, footer)))))));
|
|
585
|
+
};
|
|
586
|
+
|
|
587
|
+
var NavigationHeaderNavLink = function (_a) {
|
|
588
|
+
var ref = _a.ref, text = _a.text, onClick = _a.onClick, href = _a.href, borderRadiusSize = _a.borderRadiusSize;
|
|
154
589
|
var surface = useContext(Context).surface;
|
|
155
|
-
return (React__default.createElement(
|
|
156
|
-
React__default.createElement(
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
590
|
+
return (React__default.createElement(SemanticLink, { ref: ref, href: href, onClick: onClick, className: classNames("arc-NavigationHeaderNavLink", suffixModifier("arc-NavigationHeaderNavLink--borderRadiusSize", borderRadiusSize), suffixModifier("arc-NavigationHeaderNavLink--on", surface)) },
|
|
591
|
+
React__default.createElement(Text, null, text)));
|
|
592
|
+
};
|
|
593
|
+
|
|
594
|
+
var NavigationHeaderDropdown = function (_a) {
|
|
595
|
+
var children = _a.children, trigger = _a.trigger, ariaLabel = _a.ariaLabel, tooltip = _a.tooltip, onClick = _a.onClick;
|
|
596
|
+
var _b = useState(false), isOpen = _b[0], setIsOpen = _b[1];
|
|
597
|
+
var triggerRef = useRef(null);
|
|
598
|
+
var containerRef = useRef(null);
|
|
599
|
+
var interactionMode = useInteractionMode().interactionMode;
|
|
600
|
+
useTriggerHidden({
|
|
601
|
+
triggerEl: triggerRef.current,
|
|
602
|
+
onTriggerHidden: function () {
|
|
603
|
+
setIsOpen(false);
|
|
604
|
+
},
|
|
605
|
+
});
|
|
606
|
+
// if focus isnt going anywhere else and closed via keyboard, return focus to the trigger
|
|
607
|
+
var onCloseAutoFocus = function () {
|
|
608
|
+
var _a, _b;
|
|
609
|
+
if (((_a = document.activeElement) === null || _a === void 0 ? void 0 : _a.tagName) === "BODY" &&
|
|
610
|
+
interactionMode === "keyboard") {
|
|
611
|
+
(_b = triggerRef.current) === null || _b === void 0 ? void 0 : _b.focus();
|
|
612
|
+
}
|
|
613
|
+
};
|
|
614
|
+
// Only count it as an outside interaction if the trigger isnt being clicked.
|
|
615
|
+
var handleOutSideInteraction = function (event) {
|
|
616
|
+
var _a;
|
|
617
|
+
if (!((_a = triggerRef.current) === null || _a === void 0 ? void 0 : _a.contains(event.currentTarget))) {
|
|
618
|
+
setIsOpen(false);
|
|
619
|
+
}
|
|
620
|
+
};
|
|
621
|
+
// Find the first focusable element.
|
|
622
|
+
var focusOnFirstElement = function () {
|
|
623
|
+
var _a;
|
|
624
|
+
(_a = getFocusableElements(containerRef.current)[0]) === null || _a === void 0 ? void 0 : _a.focus({
|
|
625
|
+
preventScroll: true,
|
|
626
|
+
});
|
|
627
|
+
};
|
|
628
|
+
var toggleVisibility = function (e) {
|
|
629
|
+
onClick && onClick(e);
|
|
630
|
+
setIsOpen(function (isOpen) { return !isOpen; });
|
|
631
|
+
};
|
|
632
|
+
return (React__default.createElement(React__default.Fragment, null,
|
|
633
|
+
React__default.createElement(Popover, { useBespokeTrigger: true, constrainToViewport: false, align: "center", background: "light", arrow: true, sideOffset: 12, alignOffset: 0, open: isOpen, onCloseAutoFocus: onCloseAutoFocus, onOpenAutoFocus: focusOnFirstElement, onEscapeKeyDown: handleOutSideInteraction, onFocusOutside: handleOutSideInteraction, onInteractOutside: handleOutSideInteraction, onPointerDownOutside: handleOutSideInteraction, content: React__default.createElement("div", { ref: containerRef }, children), className: "arc-NavigationHeaderDropdown" }, tooltip ? (React__default.createElement(Tooltip, { asChild: true, title: tooltip, alignContent: "center", delayDuration: DELAY_DURATION, side: "bottom" },
|
|
634
|
+
React__default.createElement(NavigationHeaderButton, { isPadded: false, ref: triggerRef, "aria-label": ariaLabel, "aria-expanded": isOpen, "aria-haspopup": "dialog", "aria-describedby": undefined, onClick: toggleVisibility }, trigger))) : (React__default.createElement(NavigationHeaderButton, { ref: triggerRef, "aria-label": ariaLabel, "aria-expanded": isOpen, "aria-haspopup": "dialog", isActive: isOpen, onClick: toggleVisibility }, trigger)))));
|
|
635
|
+
};
|
|
636
|
+
|
|
637
|
+
var NavigationHeaderPanelHeading = function (_a) {
|
|
638
|
+
var heading = _a.heading, supportingText = _a.supportingText, link = _a.link, props = __rest(_a, ["heading", "supportingText", "link"]);
|
|
639
|
+
return (React__default.createElement("div", __assign({ className: "arc-NavigationHeaderPanelHeading" }, filterAttrs(props)),
|
|
640
|
+
React__default.createElement("div", { className: "arc-NavigationHeaderPanelHeading-grid" },
|
|
641
|
+
React__default.createElement("div", { className: "arc-NavigationHeaderPanelHeading-text" },
|
|
642
|
+
React__default.createElement(Heading, { level: "2", size: "m" }, heading)),
|
|
643
|
+
React__default.createElement("div", { className: "arc-NavigationHeaderPanelHeading-cta" }, link && (React__default.createElement(ButtonV2, { buttonStyle: "secondary", ariaLabel: link.ariaLabel, href: link.href, onClick: link.onClick, label: link.text })))),
|
|
644
|
+
React__default.createElement(VerticalSpace, { size: "4" }),
|
|
645
|
+
React__default.createElement(Text, { size: "s", tone: "muted" }, supportingText)));
|
|
646
|
+
};
|
|
647
|
+
|
|
648
|
+
var _a$1 = createNavigationHeaderContext("NavigationHeaderSubnav sub components must be used within NavigationHeaderSubnav"), SubNavContext = _a$1[0], useSubNavContext = _a$1[1];
|
|
649
|
+
|
|
650
|
+
var NavigationHeaderSubnav = function (_a) {
|
|
651
|
+
var children = _a.children, onOpenChange = _a.onOpenChange;
|
|
652
|
+
var id = useUniqueString("subnav");
|
|
653
|
+
var rootRef = useRef(null);
|
|
654
|
+
var triggerRef = useRef(null);
|
|
655
|
+
var _b = useState(false), isOpen = _b[0], setIsOpen = _b[1];
|
|
656
|
+
var value = useMemo(function () { return ({ id: id, triggerRef: triggerRef, rootRef: rootRef, isOpen: isOpen, setIsOpen: setIsOpen, onOpenChange: onOpenChange }); }, [id, isOpen, onOpenChange]);
|
|
657
|
+
return (React__default.createElement(SubNavContext.Provider, { value: value },
|
|
658
|
+
React__default.createElement("div", { ref: rootRef }, children)));
|
|
659
|
+
};
|
|
660
|
+
|
|
661
|
+
var NavigationHeaderSubnavTrigger = function (_a) {
|
|
662
|
+
var _b;
|
|
663
|
+
var children = _a.children, asChild = _a.asChild, onClick = _a.onClick, ariaLabel = _a.ariaLabel, props = __rest(_a, ["children", "asChild", "onClick", "ariaLabel"]);
|
|
664
|
+
var subNavContext = useSubNavContext();
|
|
665
|
+
var onTriggerClick = function (e) {
|
|
666
|
+
var _a;
|
|
667
|
+
onClick && onClick(e);
|
|
668
|
+
subNavContext.setIsOpen(!subNavContext.isOpen);
|
|
669
|
+
(_a = subNavContext.onOpenChange) === null || _a === void 0 ? void 0 : _a.call(subNavContext, !subNavContext.isOpen);
|
|
670
|
+
};
|
|
671
|
+
useTriggerHidden({
|
|
672
|
+
triggerEl: (_b = subNavContext.triggerRef) === null || _b === void 0 ? void 0 : _b.current,
|
|
673
|
+
onTriggerHidden: function () {
|
|
674
|
+
var _a;
|
|
675
|
+
subNavContext.setIsOpen(false);
|
|
676
|
+
(_a = subNavContext.onOpenChange) === null || _a === void 0 ? void 0 : _a.call(subNavContext, false);
|
|
677
|
+
},
|
|
678
|
+
});
|
|
679
|
+
if (asChild) {
|
|
680
|
+
return React__default.cloneElement(children, __assign(__assign({ onClick: function (e) {
|
|
681
|
+
var _a, _b;
|
|
682
|
+
onTriggerClick(e);
|
|
683
|
+
(_b = (_a = children.props).onClick) === null || _b === void 0 ? void 0 : _b.call(_a, e);
|
|
684
|
+
}, ref: subNavContext.triggerRef }, props), children.props));
|
|
685
|
+
}
|
|
686
|
+
return (React__default.createElement(NavigationHeaderButton, { "aria-label": ariaLabel, "aria-haspopup": "dialog", "aria-describedby": undefined, onClick: onTriggerClick, ref: subNavContext.triggerRef, "aria-expanded": subNavContext.isOpen, isActive: subNavContext.isOpen }, children));
|
|
687
|
+
};
|
|
688
|
+
|
|
689
|
+
function hasWindow() {
|
|
690
|
+
return typeof window !== 'undefined';
|
|
691
|
+
}
|
|
692
|
+
function getNodeName(node) {
|
|
693
|
+
if (isNode(node)) {
|
|
694
|
+
return (node.nodeName || '').toLowerCase();
|
|
695
|
+
}
|
|
696
|
+
// Mocked nodes in testing environments may not be instances of Node. By
|
|
697
|
+
// returning `#document` an infinite loop won't occur.
|
|
698
|
+
// https://github.com/floating-ui/floating-ui/issues/2317
|
|
699
|
+
return '#document';
|
|
700
|
+
}
|
|
701
|
+
function getWindow(node) {
|
|
702
|
+
var _node$ownerDocument;
|
|
703
|
+
return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window;
|
|
704
|
+
}
|
|
705
|
+
function getDocumentElement(node) {
|
|
706
|
+
var _ref;
|
|
707
|
+
return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement;
|
|
708
|
+
}
|
|
709
|
+
function isNode(value) {
|
|
710
|
+
if (!hasWindow()) {
|
|
711
|
+
return false;
|
|
712
|
+
}
|
|
713
|
+
return value instanceof Node || value instanceof getWindow(value).Node;
|
|
714
|
+
}
|
|
715
|
+
function isElement(value) {
|
|
716
|
+
if (!hasWindow()) {
|
|
717
|
+
return false;
|
|
718
|
+
}
|
|
719
|
+
return value instanceof Element || value instanceof getWindow(value).Element;
|
|
720
|
+
}
|
|
721
|
+
function isHTMLElement(value) {
|
|
722
|
+
if (!hasWindow()) {
|
|
723
|
+
return false;
|
|
724
|
+
}
|
|
725
|
+
return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement;
|
|
726
|
+
}
|
|
727
|
+
function isShadowRoot(value) {
|
|
728
|
+
if (!hasWindow() || typeof ShadowRoot === 'undefined') {
|
|
729
|
+
return false;
|
|
730
|
+
}
|
|
731
|
+
return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot;
|
|
732
|
+
}
|
|
733
|
+
const invalidOverflowDisplayValues = /*#__PURE__*/new Set(['inline', 'contents']);
|
|
734
|
+
function isOverflowElement(element) {
|
|
735
|
+
const {
|
|
736
|
+
overflow,
|
|
737
|
+
overflowX,
|
|
738
|
+
overflowY,
|
|
739
|
+
display
|
|
740
|
+
} = getComputedStyle$1(element);
|
|
741
|
+
return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && !invalidOverflowDisplayValues.has(display);
|
|
742
|
+
}
|
|
743
|
+
const tableElements = /*#__PURE__*/new Set(['table', 'td', 'th']);
|
|
744
|
+
function isTableElement(element) {
|
|
745
|
+
return tableElements.has(getNodeName(element));
|
|
746
|
+
}
|
|
747
|
+
const topLayerSelectors = [':popover-open', ':modal'];
|
|
748
|
+
function isTopLayer(element) {
|
|
749
|
+
return topLayerSelectors.some(selector => {
|
|
750
|
+
try {
|
|
751
|
+
return element.matches(selector);
|
|
752
|
+
} catch (_e) {
|
|
753
|
+
return false;
|
|
754
|
+
}
|
|
755
|
+
});
|
|
756
|
+
}
|
|
757
|
+
const transformProperties = ['transform', 'translate', 'scale', 'rotate', 'perspective'];
|
|
758
|
+
const willChangeValues = ['transform', 'translate', 'scale', 'rotate', 'perspective', 'filter'];
|
|
759
|
+
const containValues = ['paint', 'layout', 'strict', 'content'];
|
|
760
|
+
function isContainingBlock(elementOrCss) {
|
|
761
|
+
const webkit = isWebKit();
|
|
762
|
+
const css = isElement(elementOrCss) ? getComputedStyle$1(elementOrCss) : elementOrCss;
|
|
763
|
+
|
|
764
|
+
// https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block
|
|
765
|
+
// https://drafts.csswg.org/css-transforms-2/#individual-transforms
|
|
766
|
+
return transformProperties.some(value => css[value] ? css[value] !== 'none' : false) || (css.containerType ? css.containerType !== 'normal' : false) || !webkit && (css.backdropFilter ? css.backdropFilter !== 'none' : false) || !webkit && (css.filter ? css.filter !== 'none' : false) || willChangeValues.some(value => (css.willChange || '').includes(value)) || containValues.some(value => (css.contain || '').includes(value));
|
|
767
|
+
}
|
|
768
|
+
function getContainingBlock(element) {
|
|
769
|
+
let currentNode = getParentNode(element);
|
|
770
|
+
while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) {
|
|
771
|
+
if (isContainingBlock(currentNode)) {
|
|
772
|
+
return currentNode;
|
|
773
|
+
} else if (isTopLayer(currentNode)) {
|
|
774
|
+
return null;
|
|
775
|
+
}
|
|
776
|
+
currentNode = getParentNode(currentNode);
|
|
777
|
+
}
|
|
778
|
+
return null;
|
|
779
|
+
}
|
|
780
|
+
function isWebKit() {
|
|
781
|
+
if (typeof CSS === 'undefined' || !CSS.supports) return false;
|
|
782
|
+
return CSS.supports('-webkit-backdrop-filter', 'none');
|
|
783
|
+
}
|
|
784
|
+
const lastTraversableNodeNames = /*#__PURE__*/new Set(['html', 'body', '#document']);
|
|
785
|
+
function isLastTraversableNode(node) {
|
|
786
|
+
return lastTraversableNodeNames.has(getNodeName(node));
|
|
787
|
+
}
|
|
788
|
+
function getComputedStyle$1(element) {
|
|
789
|
+
return getWindow(element).getComputedStyle(element);
|
|
790
|
+
}
|
|
791
|
+
function getNodeScroll(element) {
|
|
792
|
+
if (isElement(element)) {
|
|
793
|
+
return {
|
|
794
|
+
scrollLeft: element.scrollLeft,
|
|
795
|
+
scrollTop: element.scrollTop
|
|
796
|
+
};
|
|
797
|
+
}
|
|
798
|
+
return {
|
|
799
|
+
scrollLeft: element.scrollX,
|
|
800
|
+
scrollTop: element.scrollY
|
|
801
|
+
};
|
|
802
|
+
}
|
|
803
|
+
function getParentNode(node) {
|
|
804
|
+
if (getNodeName(node) === 'html') {
|
|
805
|
+
return node;
|
|
806
|
+
}
|
|
807
|
+
const result =
|
|
808
|
+
// Step into the shadow DOM of the parent of a slotted node.
|
|
809
|
+
node.assignedSlot ||
|
|
810
|
+
// DOM Element detected.
|
|
811
|
+
node.parentNode ||
|
|
812
|
+
// ShadowRoot detected.
|
|
813
|
+
isShadowRoot(node) && node.host ||
|
|
814
|
+
// Fallback.
|
|
815
|
+
getDocumentElement(node);
|
|
816
|
+
return isShadowRoot(result) ? result.host : result;
|
|
817
|
+
}
|
|
818
|
+
function getNearestOverflowAncestor(node) {
|
|
819
|
+
const parentNode = getParentNode(node);
|
|
820
|
+
if (isLastTraversableNode(parentNode)) {
|
|
821
|
+
return node.ownerDocument ? node.ownerDocument.body : node.body;
|
|
822
|
+
}
|
|
823
|
+
if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {
|
|
824
|
+
return parentNode;
|
|
825
|
+
}
|
|
826
|
+
return getNearestOverflowAncestor(parentNode);
|
|
827
|
+
}
|
|
828
|
+
function getOverflowAncestors(node, list, traverseIframes) {
|
|
829
|
+
var _node$ownerDocument2;
|
|
830
|
+
if (list === void 0) {
|
|
831
|
+
list = [];
|
|
832
|
+
}
|
|
833
|
+
if (traverseIframes === void 0) {
|
|
834
|
+
traverseIframes = true;
|
|
835
|
+
}
|
|
836
|
+
const scrollableAncestor = getNearestOverflowAncestor(node);
|
|
837
|
+
const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body);
|
|
838
|
+
const win = getWindow(scrollableAncestor);
|
|
839
|
+
if (isBody) {
|
|
840
|
+
const frameElement = getFrameElement(win);
|
|
841
|
+
return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []);
|
|
842
|
+
}
|
|
843
|
+
return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes));
|
|
844
|
+
}
|
|
845
|
+
function getFrameElement(win) {
|
|
846
|
+
return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null;
|
|
847
|
+
}
|
|
848
|
+
|
|
849
|
+
/**
|
|
850
|
+
* Custom positioning reference element.
|
|
851
|
+
* @see https://floating-ui.com/docs/virtual-elements
|
|
852
|
+
*/
|
|
853
|
+
|
|
854
|
+
const min = Math.min;
|
|
855
|
+
const max = Math.max;
|
|
856
|
+
const round = Math.round;
|
|
857
|
+
const floor = Math.floor;
|
|
858
|
+
const createCoords = v => ({
|
|
859
|
+
x: v,
|
|
860
|
+
y: v
|
|
861
|
+
});
|
|
862
|
+
function evaluate(value, param) {
|
|
863
|
+
return typeof value === 'function' ? value(param) : value;
|
|
864
|
+
}
|
|
865
|
+
function getSide(placement) {
|
|
866
|
+
return placement.split('-')[0];
|
|
867
|
+
}
|
|
868
|
+
function getAlignment(placement) {
|
|
869
|
+
return placement.split('-')[1];
|
|
870
|
+
}
|
|
871
|
+
function getOppositeAxis(axis) {
|
|
872
|
+
return axis === 'x' ? 'y' : 'x';
|
|
873
|
+
}
|
|
874
|
+
function getAxisLength(axis) {
|
|
875
|
+
return axis === 'y' ? 'height' : 'width';
|
|
876
|
+
}
|
|
877
|
+
const yAxisSides = /*#__PURE__*/new Set(['top', 'bottom']);
|
|
878
|
+
function getSideAxis(placement) {
|
|
879
|
+
return yAxisSides.has(getSide(placement)) ? 'y' : 'x';
|
|
880
|
+
}
|
|
881
|
+
function getAlignmentAxis(placement) {
|
|
882
|
+
return getOppositeAxis(getSideAxis(placement));
|
|
883
|
+
}
|
|
884
|
+
function expandPaddingObject(padding) {
|
|
885
|
+
return {
|
|
886
|
+
top: 0,
|
|
887
|
+
right: 0,
|
|
888
|
+
bottom: 0,
|
|
889
|
+
left: 0,
|
|
890
|
+
...padding
|
|
891
|
+
};
|
|
892
|
+
}
|
|
893
|
+
function getPaddingObject(padding) {
|
|
894
|
+
return typeof padding !== 'number' ? expandPaddingObject(padding) : {
|
|
895
|
+
top: padding,
|
|
896
|
+
right: padding,
|
|
897
|
+
bottom: padding,
|
|
898
|
+
left: padding
|
|
899
|
+
};
|
|
900
|
+
}
|
|
901
|
+
function rectToClientRect(rect) {
|
|
902
|
+
const {
|
|
903
|
+
x,
|
|
904
|
+
y,
|
|
905
|
+
width,
|
|
906
|
+
height
|
|
907
|
+
} = rect;
|
|
908
|
+
return {
|
|
909
|
+
width,
|
|
910
|
+
height,
|
|
911
|
+
top: y,
|
|
912
|
+
left: x,
|
|
913
|
+
right: x + width,
|
|
914
|
+
bottom: y + height,
|
|
915
|
+
x,
|
|
916
|
+
y
|
|
917
|
+
};
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
var isClient$1 = typeof document !== 'undefined';
|
|
921
|
+
|
|
922
|
+
var noop$1 = function noop() {};
|
|
923
|
+
var index$1 = isClient$1 ? useLayoutEffect : noop$1;
|
|
924
|
+
|
|
925
|
+
// https://github.com/mui/material-ui/issues/41190#issuecomment-2040873379
|
|
926
|
+
const SafeReact$1 = {
|
|
927
|
+
...React
|
|
928
|
+
};
|
|
929
|
+
const useInsertionEffect = SafeReact$1.useInsertionEffect;
|
|
930
|
+
const useSafeInsertionEffect = useInsertionEffect || (fn => fn());
|
|
931
|
+
function useEffectEvent(callback) {
|
|
932
|
+
const ref = React.useRef(() => {
|
|
933
|
+
if (process.env.NODE_ENV !== "production") {
|
|
934
|
+
throw new Error('Cannot call an event handler while rendering.');
|
|
935
|
+
}
|
|
936
|
+
});
|
|
937
|
+
useSafeInsertionEffect(() => {
|
|
938
|
+
ref.current = callback;
|
|
939
|
+
});
|
|
940
|
+
return React.useCallback(function () {
|
|
941
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
942
|
+
args[_key] = arguments[_key];
|
|
943
|
+
}
|
|
944
|
+
return ref.current == null ? void 0 : ref.current(...args);
|
|
945
|
+
}, []);
|
|
946
|
+
}
|
|
947
|
+
|
|
948
|
+
function computeCoordsFromPlacement(_ref, placement, rtl) {
|
|
949
|
+
let {
|
|
950
|
+
reference,
|
|
951
|
+
floating
|
|
952
|
+
} = _ref;
|
|
953
|
+
const sideAxis = getSideAxis(placement);
|
|
954
|
+
const alignmentAxis = getAlignmentAxis(placement);
|
|
955
|
+
const alignLength = getAxisLength(alignmentAxis);
|
|
956
|
+
const side = getSide(placement);
|
|
957
|
+
const isVertical = sideAxis === 'y';
|
|
958
|
+
const commonX = reference.x + reference.width / 2 - floating.width / 2;
|
|
959
|
+
const commonY = reference.y + reference.height / 2 - floating.height / 2;
|
|
960
|
+
const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2;
|
|
961
|
+
let coords;
|
|
962
|
+
switch (side) {
|
|
963
|
+
case 'top':
|
|
964
|
+
coords = {
|
|
965
|
+
x: commonX,
|
|
966
|
+
y: reference.y - floating.height
|
|
967
|
+
};
|
|
968
|
+
break;
|
|
969
|
+
case 'bottom':
|
|
970
|
+
coords = {
|
|
971
|
+
x: commonX,
|
|
972
|
+
y: reference.y + reference.height
|
|
973
|
+
};
|
|
974
|
+
break;
|
|
975
|
+
case 'right':
|
|
976
|
+
coords = {
|
|
977
|
+
x: reference.x + reference.width,
|
|
978
|
+
y: commonY
|
|
979
|
+
};
|
|
980
|
+
break;
|
|
981
|
+
case 'left':
|
|
982
|
+
coords = {
|
|
983
|
+
x: reference.x - floating.width,
|
|
984
|
+
y: commonY
|
|
985
|
+
};
|
|
986
|
+
break;
|
|
987
|
+
default:
|
|
988
|
+
coords = {
|
|
989
|
+
x: reference.x,
|
|
990
|
+
y: reference.y
|
|
991
|
+
};
|
|
992
|
+
}
|
|
993
|
+
switch (getAlignment(placement)) {
|
|
994
|
+
case 'start':
|
|
995
|
+
coords[alignmentAxis] -= commonAlign * (rtl && isVertical ? -1 : 1);
|
|
996
|
+
break;
|
|
997
|
+
case 'end':
|
|
998
|
+
coords[alignmentAxis] += commonAlign * (rtl && isVertical ? -1 : 1);
|
|
999
|
+
break;
|
|
1000
|
+
}
|
|
1001
|
+
return coords;
|
|
1002
|
+
}
|
|
1003
|
+
|
|
1004
|
+
/**
|
|
1005
|
+
* Computes the `x` and `y` coordinates that will place the floating element
|
|
1006
|
+
* next to a given reference element.
|
|
1007
|
+
*
|
|
1008
|
+
* This export does not have any `platform` interface logic. You will need to
|
|
1009
|
+
* write one for the platform you are using Floating UI with.
|
|
1010
|
+
*/
|
|
1011
|
+
const computePosition$1 = async (reference, floating, config) => {
|
|
1012
|
+
const {
|
|
1013
|
+
placement = 'bottom',
|
|
1014
|
+
strategy = 'absolute',
|
|
1015
|
+
middleware = [],
|
|
1016
|
+
platform
|
|
1017
|
+
} = config;
|
|
1018
|
+
const validMiddleware = middleware.filter(Boolean);
|
|
1019
|
+
const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating));
|
|
1020
|
+
let rects = await platform.getElementRects({
|
|
1021
|
+
reference,
|
|
1022
|
+
floating,
|
|
1023
|
+
strategy
|
|
1024
|
+
});
|
|
1025
|
+
let {
|
|
1026
|
+
x,
|
|
1027
|
+
y
|
|
1028
|
+
} = computeCoordsFromPlacement(rects, placement, rtl);
|
|
1029
|
+
let statefulPlacement = placement;
|
|
1030
|
+
let middlewareData = {};
|
|
1031
|
+
let resetCount = 0;
|
|
1032
|
+
for (let i = 0; i < validMiddleware.length; i++) {
|
|
1033
|
+
const {
|
|
1034
|
+
name,
|
|
1035
|
+
fn
|
|
1036
|
+
} = validMiddleware[i];
|
|
1037
|
+
const {
|
|
1038
|
+
x: nextX,
|
|
1039
|
+
y: nextY,
|
|
1040
|
+
data,
|
|
1041
|
+
reset
|
|
1042
|
+
} = await fn({
|
|
1043
|
+
x,
|
|
1044
|
+
y,
|
|
1045
|
+
initialPlacement: placement,
|
|
1046
|
+
placement: statefulPlacement,
|
|
1047
|
+
strategy,
|
|
1048
|
+
middlewareData,
|
|
1049
|
+
rects,
|
|
1050
|
+
platform,
|
|
1051
|
+
elements: {
|
|
1052
|
+
reference,
|
|
1053
|
+
floating
|
|
1054
|
+
}
|
|
1055
|
+
});
|
|
1056
|
+
x = nextX != null ? nextX : x;
|
|
1057
|
+
y = nextY != null ? nextY : y;
|
|
1058
|
+
middlewareData = {
|
|
1059
|
+
...middlewareData,
|
|
1060
|
+
[name]: {
|
|
1061
|
+
...middlewareData[name],
|
|
1062
|
+
...data
|
|
1063
|
+
}
|
|
1064
|
+
};
|
|
1065
|
+
if (reset && resetCount <= 50) {
|
|
1066
|
+
resetCount++;
|
|
1067
|
+
if (typeof reset === 'object') {
|
|
1068
|
+
if (reset.placement) {
|
|
1069
|
+
statefulPlacement = reset.placement;
|
|
1070
|
+
}
|
|
1071
|
+
if (reset.rects) {
|
|
1072
|
+
rects = reset.rects === true ? await platform.getElementRects({
|
|
1073
|
+
reference,
|
|
1074
|
+
floating,
|
|
1075
|
+
strategy
|
|
1076
|
+
}) : reset.rects;
|
|
1077
|
+
}
|
|
1078
|
+
({
|
|
1079
|
+
x,
|
|
1080
|
+
y
|
|
1081
|
+
} = computeCoordsFromPlacement(rects, statefulPlacement, rtl));
|
|
1082
|
+
}
|
|
1083
|
+
i = -1;
|
|
1084
|
+
}
|
|
1085
|
+
}
|
|
1086
|
+
return {
|
|
1087
|
+
x,
|
|
1088
|
+
y,
|
|
1089
|
+
placement: statefulPlacement,
|
|
1090
|
+
strategy,
|
|
1091
|
+
middlewareData
|
|
1092
|
+
};
|
|
1093
|
+
};
|
|
1094
|
+
|
|
1095
|
+
/**
|
|
1096
|
+
* Resolves with an object of overflow side offsets that determine how much the
|
|
1097
|
+
* element is overflowing a given clipping boundary on each side.
|
|
1098
|
+
* - positive = overflowing the boundary by that number of pixels
|
|
1099
|
+
* - negative = how many pixels left before it will overflow
|
|
1100
|
+
* - 0 = lies flush with the boundary
|
|
1101
|
+
* @see https://floating-ui.com/docs/detectOverflow
|
|
1102
|
+
*/
|
|
1103
|
+
async function detectOverflow(state, options) {
|
|
1104
|
+
var _await$platform$isEle;
|
|
1105
|
+
if (options === void 0) {
|
|
1106
|
+
options = {};
|
|
1107
|
+
}
|
|
1108
|
+
const {
|
|
1109
|
+
x,
|
|
1110
|
+
y,
|
|
1111
|
+
platform,
|
|
1112
|
+
rects,
|
|
1113
|
+
elements,
|
|
1114
|
+
strategy
|
|
1115
|
+
} = state;
|
|
1116
|
+
const {
|
|
1117
|
+
boundary = 'clippingAncestors',
|
|
1118
|
+
rootBoundary = 'viewport',
|
|
1119
|
+
elementContext = 'floating',
|
|
1120
|
+
altBoundary = false,
|
|
1121
|
+
padding = 0
|
|
1122
|
+
} = evaluate(options, state);
|
|
1123
|
+
const paddingObject = getPaddingObject(padding);
|
|
1124
|
+
const altContext = elementContext === 'floating' ? 'reference' : 'floating';
|
|
1125
|
+
const element = elements[altBoundary ? altContext : elementContext];
|
|
1126
|
+
const clippingClientRect = rectToClientRect(await platform.getClippingRect({
|
|
1127
|
+
element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || (await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating))),
|
|
1128
|
+
boundary,
|
|
1129
|
+
rootBoundary,
|
|
1130
|
+
strategy
|
|
1131
|
+
}));
|
|
1132
|
+
const rect = elementContext === 'floating' ? {
|
|
1133
|
+
x,
|
|
1134
|
+
y,
|
|
1135
|
+
width: rects.floating.width,
|
|
1136
|
+
height: rects.floating.height
|
|
1137
|
+
} : rects.reference;
|
|
1138
|
+
const offsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating));
|
|
1139
|
+
const offsetScale = (await (platform.isElement == null ? void 0 : platform.isElement(offsetParent))) ? (await (platform.getScale == null ? void 0 : platform.getScale(offsetParent))) || {
|
|
1140
|
+
x: 1,
|
|
1141
|
+
y: 1
|
|
1142
|
+
} : {
|
|
1143
|
+
x: 1,
|
|
1144
|
+
y: 1
|
|
1145
|
+
};
|
|
1146
|
+
const elementClientRect = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({
|
|
1147
|
+
elements,
|
|
1148
|
+
rect,
|
|
1149
|
+
offsetParent,
|
|
1150
|
+
strategy
|
|
1151
|
+
}) : rect);
|
|
1152
|
+
return {
|
|
1153
|
+
top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y,
|
|
1154
|
+
bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y,
|
|
1155
|
+
left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x,
|
|
1156
|
+
right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x
|
|
1157
|
+
};
|
|
1158
|
+
}
|
|
1159
|
+
|
|
1160
|
+
const originSides = /*#__PURE__*/new Set(['left', 'top']);
|
|
1161
|
+
|
|
1162
|
+
// For type backwards-compatibility, the `OffsetOptions` type was also
|
|
1163
|
+
// Derivable.
|
|
1164
|
+
|
|
1165
|
+
async function convertValueToCoords(state, options) {
|
|
1166
|
+
const {
|
|
1167
|
+
placement,
|
|
1168
|
+
platform,
|
|
1169
|
+
elements
|
|
1170
|
+
} = state;
|
|
1171
|
+
const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));
|
|
1172
|
+
const side = getSide(placement);
|
|
1173
|
+
const alignment = getAlignment(placement);
|
|
1174
|
+
const isVertical = getSideAxis(placement) === 'y';
|
|
1175
|
+
const mainAxisMulti = originSides.has(side) ? -1 : 1;
|
|
1176
|
+
const crossAxisMulti = rtl && isVertical ? -1 : 1;
|
|
1177
|
+
const rawValue = evaluate(options, state);
|
|
1178
|
+
|
|
1179
|
+
// eslint-disable-next-line prefer-const
|
|
1180
|
+
let {
|
|
1181
|
+
mainAxis,
|
|
1182
|
+
crossAxis,
|
|
1183
|
+
alignmentAxis
|
|
1184
|
+
} = typeof rawValue === 'number' ? {
|
|
1185
|
+
mainAxis: rawValue,
|
|
1186
|
+
crossAxis: 0,
|
|
1187
|
+
alignmentAxis: null
|
|
1188
|
+
} : {
|
|
1189
|
+
mainAxis: rawValue.mainAxis || 0,
|
|
1190
|
+
crossAxis: rawValue.crossAxis || 0,
|
|
1191
|
+
alignmentAxis: rawValue.alignmentAxis
|
|
1192
|
+
};
|
|
1193
|
+
if (alignment && typeof alignmentAxis === 'number') {
|
|
1194
|
+
crossAxis = alignment === 'end' ? alignmentAxis * -1 : alignmentAxis;
|
|
1195
|
+
}
|
|
1196
|
+
return isVertical ? {
|
|
1197
|
+
x: crossAxis * crossAxisMulti,
|
|
1198
|
+
y: mainAxis * mainAxisMulti
|
|
1199
|
+
} : {
|
|
1200
|
+
x: mainAxis * mainAxisMulti,
|
|
1201
|
+
y: crossAxis * crossAxisMulti
|
|
1202
|
+
};
|
|
1203
|
+
}
|
|
1204
|
+
|
|
1205
|
+
/**
|
|
1206
|
+
* Modifies the placement by translating the floating element along the
|
|
1207
|
+
* specified axes.
|
|
1208
|
+
* A number (shorthand for `mainAxis` or distance), or an axes configuration
|
|
1209
|
+
* object may be passed.
|
|
1210
|
+
* @see https://floating-ui.com/docs/offset
|
|
1211
|
+
*/
|
|
1212
|
+
const offset$2 = function (options) {
|
|
1213
|
+
if (options === void 0) {
|
|
1214
|
+
options = 0;
|
|
1215
|
+
}
|
|
1216
|
+
return {
|
|
1217
|
+
name: 'offset',
|
|
1218
|
+
options,
|
|
1219
|
+
async fn(state) {
|
|
1220
|
+
var _middlewareData$offse, _middlewareData$arrow;
|
|
1221
|
+
const {
|
|
1222
|
+
x,
|
|
1223
|
+
y,
|
|
1224
|
+
placement,
|
|
1225
|
+
middlewareData
|
|
1226
|
+
} = state;
|
|
1227
|
+
const diffCoords = await convertValueToCoords(state, options);
|
|
1228
|
+
|
|
1229
|
+
// If the placement is the same and the arrow caused an alignment offset
|
|
1230
|
+
// then we don't need to change the positioning coordinates.
|
|
1231
|
+
if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {
|
|
1232
|
+
return {};
|
|
1233
|
+
}
|
|
1234
|
+
return {
|
|
1235
|
+
x: x + diffCoords.x,
|
|
1236
|
+
y: y + diffCoords.y,
|
|
1237
|
+
data: {
|
|
1238
|
+
...diffCoords,
|
|
1239
|
+
placement
|
|
1240
|
+
}
|
|
1241
|
+
};
|
|
1242
|
+
}
|
|
1243
|
+
};
|
|
1244
|
+
};
|
|
1245
|
+
|
|
1246
|
+
/**
|
|
1247
|
+
* Provides data that allows you to change the size of the floating element —
|
|
1248
|
+
* for instance, prevent it from overflowing the clipping boundary or match the
|
|
1249
|
+
* width of the reference element.
|
|
1250
|
+
* @see https://floating-ui.com/docs/size
|
|
1251
|
+
*/
|
|
1252
|
+
const size$2 = function (options) {
|
|
1253
|
+
if (options === void 0) {
|
|
1254
|
+
options = {};
|
|
1255
|
+
}
|
|
1256
|
+
return {
|
|
1257
|
+
name: 'size',
|
|
1258
|
+
options,
|
|
1259
|
+
async fn(state) {
|
|
1260
|
+
var _state$middlewareData, _state$middlewareData2;
|
|
1261
|
+
const {
|
|
1262
|
+
placement,
|
|
1263
|
+
rects,
|
|
1264
|
+
platform,
|
|
1265
|
+
elements
|
|
1266
|
+
} = state;
|
|
1267
|
+
const {
|
|
1268
|
+
apply = () => {},
|
|
1269
|
+
...detectOverflowOptions
|
|
1270
|
+
} = evaluate(options, state);
|
|
1271
|
+
const overflow = await detectOverflow(state, detectOverflowOptions);
|
|
1272
|
+
const side = getSide(placement);
|
|
1273
|
+
const alignment = getAlignment(placement);
|
|
1274
|
+
const isYAxis = getSideAxis(placement) === 'y';
|
|
1275
|
+
const {
|
|
1276
|
+
width,
|
|
1277
|
+
height
|
|
1278
|
+
} = rects.floating;
|
|
1279
|
+
let heightSide;
|
|
1280
|
+
let widthSide;
|
|
1281
|
+
if (side === 'top' || side === 'bottom') {
|
|
1282
|
+
heightSide = side;
|
|
1283
|
+
widthSide = alignment === ((await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))) ? 'start' : 'end') ? 'left' : 'right';
|
|
1284
|
+
} else {
|
|
1285
|
+
widthSide = side;
|
|
1286
|
+
heightSide = alignment === 'end' ? 'top' : 'bottom';
|
|
1287
|
+
}
|
|
1288
|
+
const maximumClippingHeight = height - overflow.top - overflow.bottom;
|
|
1289
|
+
const maximumClippingWidth = width - overflow.left - overflow.right;
|
|
1290
|
+
const overflowAvailableHeight = min(height - overflow[heightSide], maximumClippingHeight);
|
|
1291
|
+
const overflowAvailableWidth = min(width - overflow[widthSide], maximumClippingWidth);
|
|
1292
|
+
const noShift = !state.middlewareData.shift;
|
|
1293
|
+
let availableHeight = overflowAvailableHeight;
|
|
1294
|
+
let availableWidth = overflowAvailableWidth;
|
|
1295
|
+
if ((_state$middlewareData = state.middlewareData.shift) != null && _state$middlewareData.enabled.x) {
|
|
1296
|
+
availableWidth = maximumClippingWidth;
|
|
1297
|
+
}
|
|
1298
|
+
if ((_state$middlewareData2 = state.middlewareData.shift) != null && _state$middlewareData2.enabled.y) {
|
|
1299
|
+
availableHeight = maximumClippingHeight;
|
|
1300
|
+
}
|
|
1301
|
+
if (noShift && !alignment) {
|
|
1302
|
+
const xMin = max(overflow.left, 0);
|
|
1303
|
+
const xMax = max(overflow.right, 0);
|
|
1304
|
+
const yMin = max(overflow.top, 0);
|
|
1305
|
+
const yMax = max(overflow.bottom, 0);
|
|
1306
|
+
if (isYAxis) {
|
|
1307
|
+
availableWidth = width - 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right));
|
|
1308
|
+
} else {
|
|
1309
|
+
availableHeight = height - 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom));
|
|
1310
|
+
}
|
|
1311
|
+
}
|
|
1312
|
+
await apply({
|
|
1313
|
+
...state,
|
|
1314
|
+
availableWidth,
|
|
1315
|
+
availableHeight
|
|
1316
|
+
});
|
|
1317
|
+
const nextDimensions = await platform.getDimensions(elements.floating);
|
|
1318
|
+
if (width !== nextDimensions.width || height !== nextDimensions.height) {
|
|
1319
|
+
return {
|
|
1320
|
+
reset: {
|
|
1321
|
+
rects: true
|
|
1322
|
+
}
|
|
1323
|
+
};
|
|
1324
|
+
}
|
|
1325
|
+
return {};
|
|
1326
|
+
}
|
|
1327
|
+
};
|
|
1328
|
+
};
|
|
1329
|
+
|
|
1330
|
+
function getCssDimensions(element) {
|
|
1331
|
+
const css = getComputedStyle$1(element);
|
|
1332
|
+
// In testing environments, the `width` and `height` properties are empty
|
|
1333
|
+
// strings for SVG elements, returning NaN. Fallback to `0` in this case.
|
|
1334
|
+
let width = parseFloat(css.width) || 0;
|
|
1335
|
+
let height = parseFloat(css.height) || 0;
|
|
1336
|
+
const hasOffset = isHTMLElement(element);
|
|
1337
|
+
const offsetWidth = hasOffset ? element.offsetWidth : width;
|
|
1338
|
+
const offsetHeight = hasOffset ? element.offsetHeight : height;
|
|
1339
|
+
const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight;
|
|
1340
|
+
if (shouldFallback) {
|
|
1341
|
+
width = offsetWidth;
|
|
1342
|
+
height = offsetHeight;
|
|
1343
|
+
}
|
|
1344
|
+
return {
|
|
1345
|
+
width,
|
|
1346
|
+
height,
|
|
1347
|
+
$: shouldFallback
|
|
1348
|
+
};
|
|
1349
|
+
}
|
|
1350
|
+
|
|
1351
|
+
function unwrapElement(element) {
|
|
1352
|
+
return !isElement(element) ? element.contextElement : element;
|
|
1353
|
+
}
|
|
1354
|
+
|
|
1355
|
+
function getScale(element) {
|
|
1356
|
+
const domElement = unwrapElement(element);
|
|
1357
|
+
if (!isHTMLElement(domElement)) {
|
|
1358
|
+
return createCoords(1);
|
|
1359
|
+
}
|
|
1360
|
+
const rect = domElement.getBoundingClientRect();
|
|
1361
|
+
const {
|
|
1362
|
+
width,
|
|
1363
|
+
height,
|
|
1364
|
+
$
|
|
1365
|
+
} = getCssDimensions(domElement);
|
|
1366
|
+
let x = ($ ? round(rect.width) : rect.width) / width;
|
|
1367
|
+
let y = ($ ? round(rect.height) : rect.height) / height;
|
|
1368
|
+
|
|
1369
|
+
// 0, NaN, or Infinity should always fallback to 1.
|
|
1370
|
+
|
|
1371
|
+
if (!x || !Number.isFinite(x)) {
|
|
1372
|
+
x = 1;
|
|
1373
|
+
}
|
|
1374
|
+
if (!y || !Number.isFinite(y)) {
|
|
1375
|
+
y = 1;
|
|
1376
|
+
}
|
|
1377
|
+
return {
|
|
1378
|
+
x,
|
|
1379
|
+
y
|
|
1380
|
+
};
|
|
1381
|
+
}
|
|
1382
|
+
|
|
1383
|
+
const noOffsets = /*#__PURE__*/createCoords(0);
|
|
1384
|
+
function getVisualOffsets(element) {
|
|
1385
|
+
const win = getWindow(element);
|
|
1386
|
+
if (!isWebKit() || !win.visualViewport) {
|
|
1387
|
+
return noOffsets;
|
|
1388
|
+
}
|
|
1389
|
+
return {
|
|
1390
|
+
x: win.visualViewport.offsetLeft,
|
|
1391
|
+
y: win.visualViewport.offsetTop
|
|
1392
|
+
};
|
|
1393
|
+
}
|
|
1394
|
+
function shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) {
|
|
1395
|
+
if (isFixed === void 0) {
|
|
1396
|
+
isFixed = false;
|
|
1397
|
+
}
|
|
1398
|
+
if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element)) {
|
|
1399
|
+
return false;
|
|
1400
|
+
}
|
|
1401
|
+
return isFixed;
|
|
1402
|
+
}
|
|
1403
|
+
|
|
1404
|
+
function getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) {
|
|
1405
|
+
if (includeScale === void 0) {
|
|
1406
|
+
includeScale = false;
|
|
1407
|
+
}
|
|
1408
|
+
if (isFixedStrategy === void 0) {
|
|
1409
|
+
isFixedStrategy = false;
|
|
1410
|
+
}
|
|
1411
|
+
const clientRect = element.getBoundingClientRect();
|
|
1412
|
+
const domElement = unwrapElement(element);
|
|
1413
|
+
let scale = createCoords(1);
|
|
1414
|
+
if (includeScale) {
|
|
1415
|
+
if (offsetParent) {
|
|
1416
|
+
if (isElement(offsetParent)) {
|
|
1417
|
+
scale = getScale(offsetParent);
|
|
1418
|
+
}
|
|
1419
|
+
} else {
|
|
1420
|
+
scale = getScale(element);
|
|
1421
|
+
}
|
|
1422
|
+
}
|
|
1423
|
+
const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0);
|
|
1424
|
+
let x = (clientRect.left + visualOffsets.x) / scale.x;
|
|
1425
|
+
let y = (clientRect.top + visualOffsets.y) / scale.y;
|
|
1426
|
+
let width = clientRect.width / scale.x;
|
|
1427
|
+
let height = clientRect.height / scale.y;
|
|
1428
|
+
if (domElement) {
|
|
1429
|
+
const win = getWindow(domElement);
|
|
1430
|
+
const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent;
|
|
1431
|
+
let currentWin = win;
|
|
1432
|
+
let currentIFrame = getFrameElement(currentWin);
|
|
1433
|
+
while (currentIFrame && offsetParent && offsetWin !== currentWin) {
|
|
1434
|
+
const iframeScale = getScale(currentIFrame);
|
|
1435
|
+
const iframeRect = currentIFrame.getBoundingClientRect();
|
|
1436
|
+
const css = getComputedStyle$1(currentIFrame);
|
|
1437
|
+
const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x;
|
|
1438
|
+
const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y;
|
|
1439
|
+
x *= iframeScale.x;
|
|
1440
|
+
y *= iframeScale.y;
|
|
1441
|
+
width *= iframeScale.x;
|
|
1442
|
+
height *= iframeScale.y;
|
|
1443
|
+
x += left;
|
|
1444
|
+
y += top;
|
|
1445
|
+
currentWin = getWindow(currentIFrame);
|
|
1446
|
+
currentIFrame = getFrameElement(currentWin);
|
|
1447
|
+
}
|
|
1448
|
+
}
|
|
1449
|
+
return rectToClientRect({
|
|
1450
|
+
width,
|
|
1451
|
+
height,
|
|
1452
|
+
x,
|
|
1453
|
+
y
|
|
1454
|
+
});
|
|
1455
|
+
}
|
|
1456
|
+
|
|
1457
|
+
// If <html> has a CSS width greater than the viewport, then this will be
|
|
1458
|
+
// incorrect for RTL.
|
|
1459
|
+
function getWindowScrollBarX(element, rect) {
|
|
1460
|
+
const leftScroll = getNodeScroll(element).scrollLeft;
|
|
1461
|
+
if (!rect) {
|
|
1462
|
+
return getBoundingClientRect(getDocumentElement(element)).left + leftScroll;
|
|
1463
|
+
}
|
|
1464
|
+
return rect.left + leftScroll;
|
|
1465
|
+
}
|
|
1466
|
+
|
|
1467
|
+
function getHTMLOffset(documentElement, scroll) {
|
|
1468
|
+
const htmlRect = documentElement.getBoundingClientRect();
|
|
1469
|
+
const x = htmlRect.left + scroll.scrollLeft - getWindowScrollBarX(documentElement, htmlRect);
|
|
1470
|
+
const y = htmlRect.top + scroll.scrollTop;
|
|
1471
|
+
return {
|
|
1472
|
+
x,
|
|
1473
|
+
y
|
|
1474
|
+
};
|
|
1475
|
+
}
|
|
1476
|
+
|
|
1477
|
+
function convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {
|
|
1478
|
+
let {
|
|
1479
|
+
elements,
|
|
1480
|
+
rect,
|
|
1481
|
+
offsetParent,
|
|
1482
|
+
strategy
|
|
1483
|
+
} = _ref;
|
|
1484
|
+
const isFixed = strategy === 'fixed';
|
|
1485
|
+
const documentElement = getDocumentElement(offsetParent);
|
|
1486
|
+
const topLayer = elements ? isTopLayer(elements.floating) : false;
|
|
1487
|
+
if (offsetParent === documentElement || topLayer && isFixed) {
|
|
1488
|
+
return rect;
|
|
1489
|
+
}
|
|
1490
|
+
let scroll = {
|
|
1491
|
+
scrollLeft: 0,
|
|
1492
|
+
scrollTop: 0
|
|
1493
|
+
};
|
|
1494
|
+
let scale = createCoords(1);
|
|
1495
|
+
const offsets = createCoords(0);
|
|
1496
|
+
const isOffsetParentAnElement = isHTMLElement(offsetParent);
|
|
1497
|
+
if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {
|
|
1498
|
+
if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {
|
|
1499
|
+
scroll = getNodeScroll(offsetParent);
|
|
1500
|
+
}
|
|
1501
|
+
if (isHTMLElement(offsetParent)) {
|
|
1502
|
+
const offsetRect = getBoundingClientRect(offsetParent);
|
|
1503
|
+
scale = getScale(offsetParent);
|
|
1504
|
+
offsets.x = offsetRect.x + offsetParent.clientLeft;
|
|
1505
|
+
offsets.y = offsetRect.y + offsetParent.clientTop;
|
|
1506
|
+
}
|
|
1507
|
+
}
|
|
1508
|
+
const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);
|
|
1509
|
+
return {
|
|
1510
|
+
width: rect.width * scale.x,
|
|
1511
|
+
height: rect.height * scale.y,
|
|
1512
|
+
x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x + htmlOffset.x,
|
|
1513
|
+
y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y + htmlOffset.y
|
|
1514
|
+
};
|
|
1515
|
+
}
|
|
1516
|
+
|
|
1517
|
+
function getClientRects(element) {
|
|
1518
|
+
return Array.from(element.getClientRects());
|
|
1519
|
+
}
|
|
1520
|
+
|
|
1521
|
+
// Gets the entire size of the scrollable document area, even extending outside
|
|
1522
|
+
// of the `<html>` and `<body>` rect bounds if horizontally scrollable.
|
|
1523
|
+
function getDocumentRect(element) {
|
|
1524
|
+
const html = getDocumentElement(element);
|
|
1525
|
+
const scroll = getNodeScroll(element);
|
|
1526
|
+
const body = element.ownerDocument.body;
|
|
1527
|
+
const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth);
|
|
1528
|
+
const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight);
|
|
1529
|
+
let x = -scroll.scrollLeft + getWindowScrollBarX(element);
|
|
1530
|
+
const y = -scroll.scrollTop;
|
|
1531
|
+
if (getComputedStyle$1(body).direction === 'rtl') {
|
|
1532
|
+
x += max(html.clientWidth, body.clientWidth) - width;
|
|
1533
|
+
}
|
|
1534
|
+
return {
|
|
1535
|
+
width,
|
|
1536
|
+
height,
|
|
1537
|
+
x,
|
|
1538
|
+
y
|
|
1539
|
+
};
|
|
1540
|
+
}
|
|
1541
|
+
|
|
1542
|
+
// Safety check: ensure the scrollbar space is reasonable in case this
|
|
1543
|
+
// calculation is affected by unusual styles.
|
|
1544
|
+
// Most scrollbars leave 15-18px of space.
|
|
1545
|
+
const SCROLLBAR_MAX = 25;
|
|
1546
|
+
function getViewportRect(element, strategy) {
|
|
1547
|
+
const win = getWindow(element);
|
|
1548
|
+
const html = getDocumentElement(element);
|
|
1549
|
+
const visualViewport = win.visualViewport;
|
|
1550
|
+
let width = html.clientWidth;
|
|
1551
|
+
let height = html.clientHeight;
|
|
1552
|
+
let x = 0;
|
|
1553
|
+
let y = 0;
|
|
1554
|
+
if (visualViewport) {
|
|
1555
|
+
width = visualViewport.width;
|
|
1556
|
+
height = visualViewport.height;
|
|
1557
|
+
const visualViewportBased = isWebKit();
|
|
1558
|
+
if (!visualViewportBased || visualViewportBased && strategy === 'fixed') {
|
|
1559
|
+
x = visualViewport.offsetLeft;
|
|
1560
|
+
y = visualViewport.offsetTop;
|
|
1561
|
+
}
|
|
1562
|
+
}
|
|
1563
|
+
const windowScrollbarX = getWindowScrollBarX(html);
|
|
1564
|
+
// <html> `overflow: hidden` + `scrollbar-gutter: stable` reduces the
|
|
1565
|
+
// visual width of the <html> but this is not considered in the size
|
|
1566
|
+
// of `html.clientWidth`.
|
|
1567
|
+
if (windowScrollbarX <= 0) {
|
|
1568
|
+
const doc = html.ownerDocument;
|
|
1569
|
+
const body = doc.body;
|
|
1570
|
+
const bodyStyles = getComputedStyle(body);
|
|
1571
|
+
const bodyMarginInline = doc.compatMode === 'CSS1Compat' ? parseFloat(bodyStyles.marginLeft) + parseFloat(bodyStyles.marginRight) || 0 : 0;
|
|
1572
|
+
const clippingStableScrollbarWidth = Math.abs(html.clientWidth - body.clientWidth - bodyMarginInline);
|
|
1573
|
+
if (clippingStableScrollbarWidth <= SCROLLBAR_MAX) {
|
|
1574
|
+
width -= clippingStableScrollbarWidth;
|
|
1575
|
+
}
|
|
1576
|
+
} else if (windowScrollbarX <= SCROLLBAR_MAX) {
|
|
1577
|
+
// If the <body> scrollbar is on the left, the width needs to be extended
|
|
1578
|
+
// by the scrollbar amount so there isn't extra space on the right.
|
|
1579
|
+
width += windowScrollbarX;
|
|
1580
|
+
}
|
|
1581
|
+
return {
|
|
1582
|
+
width,
|
|
1583
|
+
height,
|
|
1584
|
+
x,
|
|
1585
|
+
y
|
|
1586
|
+
};
|
|
1587
|
+
}
|
|
1588
|
+
|
|
1589
|
+
const absoluteOrFixed = /*#__PURE__*/new Set(['absolute', 'fixed']);
|
|
1590
|
+
// Returns the inner client rect, subtracting scrollbars if present.
|
|
1591
|
+
function getInnerBoundingClientRect(element, strategy) {
|
|
1592
|
+
const clientRect = getBoundingClientRect(element, true, strategy === 'fixed');
|
|
1593
|
+
const top = clientRect.top + element.clientTop;
|
|
1594
|
+
const left = clientRect.left + element.clientLeft;
|
|
1595
|
+
const scale = isHTMLElement(element) ? getScale(element) : createCoords(1);
|
|
1596
|
+
const width = element.clientWidth * scale.x;
|
|
1597
|
+
const height = element.clientHeight * scale.y;
|
|
1598
|
+
const x = left * scale.x;
|
|
1599
|
+
const y = top * scale.y;
|
|
1600
|
+
return {
|
|
1601
|
+
width,
|
|
1602
|
+
height,
|
|
1603
|
+
x,
|
|
1604
|
+
y
|
|
1605
|
+
};
|
|
1606
|
+
}
|
|
1607
|
+
function getClientRectFromClippingAncestor(element, clippingAncestor, strategy) {
|
|
1608
|
+
let rect;
|
|
1609
|
+
if (clippingAncestor === 'viewport') {
|
|
1610
|
+
rect = getViewportRect(element, strategy);
|
|
1611
|
+
} else if (clippingAncestor === 'document') {
|
|
1612
|
+
rect = getDocumentRect(getDocumentElement(element));
|
|
1613
|
+
} else if (isElement(clippingAncestor)) {
|
|
1614
|
+
rect = getInnerBoundingClientRect(clippingAncestor, strategy);
|
|
1615
|
+
} else {
|
|
1616
|
+
const visualOffsets = getVisualOffsets(element);
|
|
1617
|
+
rect = {
|
|
1618
|
+
x: clippingAncestor.x - visualOffsets.x,
|
|
1619
|
+
y: clippingAncestor.y - visualOffsets.y,
|
|
1620
|
+
width: clippingAncestor.width,
|
|
1621
|
+
height: clippingAncestor.height
|
|
1622
|
+
};
|
|
1623
|
+
}
|
|
1624
|
+
return rectToClientRect(rect);
|
|
1625
|
+
}
|
|
1626
|
+
function hasFixedPositionAncestor(element, stopNode) {
|
|
1627
|
+
const parentNode = getParentNode(element);
|
|
1628
|
+
if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) {
|
|
1629
|
+
return false;
|
|
1630
|
+
}
|
|
1631
|
+
return getComputedStyle$1(parentNode).position === 'fixed' || hasFixedPositionAncestor(parentNode, stopNode);
|
|
1632
|
+
}
|
|
1633
|
+
|
|
1634
|
+
// A "clipping ancestor" is an `overflow` element with the characteristic of
|
|
1635
|
+
// clipping (or hiding) child elements. This returns all clipping ancestors
|
|
1636
|
+
// of the given element up the tree.
|
|
1637
|
+
function getClippingElementAncestors(element, cache) {
|
|
1638
|
+
const cachedResult = cache.get(element);
|
|
1639
|
+
if (cachedResult) {
|
|
1640
|
+
return cachedResult;
|
|
1641
|
+
}
|
|
1642
|
+
let result = getOverflowAncestors(element, [], false).filter(el => isElement(el) && getNodeName(el) !== 'body');
|
|
1643
|
+
let currentContainingBlockComputedStyle = null;
|
|
1644
|
+
const elementIsFixed = getComputedStyle$1(element).position === 'fixed';
|
|
1645
|
+
let currentNode = elementIsFixed ? getParentNode(element) : element;
|
|
1646
|
+
|
|
1647
|
+
// https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block
|
|
1648
|
+
while (isElement(currentNode) && !isLastTraversableNode(currentNode)) {
|
|
1649
|
+
const computedStyle = getComputedStyle$1(currentNode);
|
|
1650
|
+
const currentNodeIsContaining = isContainingBlock(currentNode);
|
|
1651
|
+
if (!currentNodeIsContaining && computedStyle.position === 'fixed') {
|
|
1652
|
+
currentContainingBlockComputedStyle = null;
|
|
1653
|
+
}
|
|
1654
|
+
const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === 'static' && !!currentContainingBlockComputedStyle && absoluteOrFixed.has(currentContainingBlockComputedStyle.position) || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode);
|
|
1655
|
+
if (shouldDropCurrentNode) {
|
|
1656
|
+
// Drop non-containing blocks.
|
|
1657
|
+
result = result.filter(ancestor => ancestor !== currentNode);
|
|
1658
|
+
} else {
|
|
1659
|
+
// Record last containing block for next iteration.
|
|
1660
|
+
currentContainingBlockComputedStyle = computedStyle;
|
|
1661
|
+
}
|
|
1662
|
+
currentNode = getParentNode(currentNode);
|
|
1663
|
+
}
|
|
1664
|
+
cache.set(element, result);
|
|
1665
|
+
return result;
|
|
1666
|
+
}
|
|
1667
|
+
|
|
1668
|
+
// Gets the maximum area that the element is visible in due to any number of
|
|
1669
|
+
// clipping ancestors.
|
|
1670
|
+
function getClippingRect(_ref) {
|
|
1671
|
+
let {
|
|
1672
|
+
element,
|
|
1673
|
+
boundary,
|
|
1674
|
+
rootBoundary,
|
|
1675
|
+
strategy
|
|
1676
|
+
} = _ref;
|
|
1677
|
+
const elementClippingAncestors = boundary === 'clippingAncestors' ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary);
|
|
1678
|
+
const clippingAncestors = [...elementClippingAncestors, rootBoundary];
|
|
1679
|
+
const firstClippingAncestor = clippingAncestors[0];
|
|
1680
|
+
const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => {
|
|
1681
|
+
const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy);
|
|
1682
|
+
accRect.top = max(rect.top, accRect.top);
|
|
1683
|
+
accRect.right = min(rect.right, accRect.right);
|
|
1684
|
+
accRect.bottom = min(rect.bottom, accRect.bottom);
|
|
1685
|
+
accRect.left = max(rect.left, accRect.left);
|
|
1686
|
+
return accRect;
|
|
1687
|
+
}, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy));
|
|
1688
|
+
return {
|
|
1689
|
+
width: clippingRect.right - clippingRect.left,
|
|
1690
|
+
height: clippingRect.bottom - clippingRect.top,
|
|
1691
|
+
x: clippingRect.left,
|
|
1692
|
+
y: clippingRect.top
|
|
1693
|
+
};
|
|
1694
|
+
}
|
|
1695
|
+
|
|
1696
|
+
function getDimensions(element) {
|
|
1697
|
+
const {
|
|
1698
|
+
width,
|
|
1699
|
+
height
|
|
1700
|
+
} = getCssDimensions(element);
|
|
1701
|
+
return {
|
|
1702
|
+
width,
|
|
1703
|
+
height
|
|
1704
|
+
};
|
|
1705
|
+
}
|
|
1706
|
+
|
|
1707
|
+
function getRectRelativeToOffsetParent(element, offsetParent, strategy) {
|
|
1708
|
+
const isOffsetParentAnElement = isHTMLElement(offsetParent);
|
|
1709
|
+
const documentElement = getDocumentElement(offsetParent);
|
|
1710
|
+
const isFixed = strategy === 'fixed';
|
|
1711
|
+
const rect = getBoundingClientRect(element, true, isFixed, offsetParent);
|
|
1712
|
+
let scroll = {
|
|
1713
|
+
scrollLeft: 0,
|
|
1714
|
+
scrollTop: 0
|
|
1715
|
+
};
|
|
1716
|
+
const offsets = createCoords(0);
|
|
1717
|
+
|
|
1718
|
+
// If the <body> scrollbar appears on the left (e.g. RTL systems). Use
|
|
1719
|
+
// Firefox with layout.scrollbar.side = 3 in about:config to test this.
|
|
1720
|
+
function setLeftRTLScrollbarOffset() {
|
|
1721
|
+
offsets.x = getWindowScrollBarX(documentElement);
|
|
1722
|
+
}
|
|
1723
|
+
if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {
|
|
1724
|
+
if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {
|
|
1725
|
+
scroll = getNodeScroll(offsetParent);
|
|
1726
|
+
}
|
|
1727
|
+
if (isOffsetParentAnElement) {
|
|
1728
|
+
const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent);
|
|
1729
|
+
offsets.x = offsetRect.x + offsetParent.clientLeft;
|
|
1730
|
+
offsets.y = offsetRect.y + offsetParent.clientTop;
|
|
1731
|
+
} else if (documentElement) {
|
|
1732
|
+
setLeftRTLScrollbarOffset();
|
|
1733
|
+
}
|
|
1734
|
+
}
|
|
1735
|
+
if (isFixed && !isOffsetParentAnElement && documentElement) {
|
|
1736
|
+
setLeftRTLScrollbarOffset();
|
|
1737
|
+
}
|
|
1738
|
+
const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);
|
|
1739
|
+
const x = rect.left + scroll.scrollLeft - offsets.x - htmlOffset.x;
|
|
1740
|
+
const y = rect.top + scroll.scrollTop - offsets.y - htmlOffset.y;
|
|
1741
|
+
return {
|
|
1742
|
+
x,
|
|
1743
|
+
y,
|
|
1744
|
+
width: rect.width,
|
|
1745
|
+
height: rect.height
|
|
1746
|
+
};
|
|
1747
|
+
}
|
|
1748
|
+
|
|
1749
|
+
function isStaticPositioned(element) {
|
|
1750
|
+
return getComputedStyle$1(element).position === 'static';
|
|
1751
|
+
}
|
|
1752
|
+
|
|
1753
|
+
function getTrueOffsetParent(element, polyfill) {
|
|
1754
|
+
if (!isHTMLElement(element) || getComputedStyle$1(element).position === 'fixed') {
|
|
1755
|
+
return null;
|
|
1756
|
+
}
|
|
1757
|
+
if (polyfill) {
|
|
1758
|
+
return polyfill(element);
|
|
1759
|
+
}
|
|
1760
|
+
let rawOffsetParent = element.offsetParent;
|
|
1761
|
+
|
|
1762
|
+
// Firefox returns the <html> element as the offsetParent if it's non-static,
|
|
1763
|
+
// while Chrome and Safari return the <body> element. The <body> element must
|
|
1764
|
+
// be used to perform the correct calculations even if the <html> element is
|
|
1765
|
+
// non-static.
|
|
1766
|
+
if (getDocumentElement(element) === rawOffsetParent) {
|
|
1767
|
+
rawOffsetParent = rawOffsetParent.ownerDocument.body;
|
|
1768
|
+
}
|
|
1769
|
+
return rawOffsetParent;
|
|
1770
|
+
}
|
|
1771
|
+
|
|
1772
|
+
// Gets the closest ancestor positioned element. Handles some edge cases,
|
|
1773
|
+
// such as table ancestors and cross browser bugs.
|
|
1774
|
+
function getOffsetParent(element, polyfill) {
|
|
1775
|
+
const win = getWindow(element);
|
|
1776
|
+
if (isTopLayer(element)) {
|
|
1777
|
+
return win;
|
|
1778
|
+
}
|
|
1779
|
+
if (!isHTMLElement(element)) {
|
|
1780
|
+
let svgOffsetParent = getParentNode(element);
|
|
1781
|
+
while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) {
|
|
1782
|
+
if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) {
|
|
1783
|
+
return svgOffsetParent;
|
|
1784
|
+
}
|
|
1785
|
+
svgOffsetParent = getParentNode(svgOffsetParent);
|
|
1786
|
+
}
|
|
1787
|
+
return win;
|
|
1788
|
+
}
|
|
1789
|
+
let offsetParent = getTrueOffsetParent(element, polyfill);
|
|
1790
|
+
while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) {
|
|
1791
|
+
offsetParent = getTrueOffsetParent(offsetParent, polyfill);
|
|
1792
|
+
}
|
|
1793
|
+
if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) {
|
|
1794
|
+
return win;
|
|
1795
|
+
}
|
|
1796
|
+
return offsetParent || getContainingBlock(element) || win;
|
|
1797
|
+
}
|
|
1798
|
+
|
|
1799
|
+
const getElementRects = async function (data) {
|
|
1800
|
+
const getOffsetParentFn = this.getOffsetParent || getOffsetParent;
|
|
1801
|
+
const getDimensionsFn = this.getDimensions;
|
|
1802
|
+
const floatingDimensions = await getDimensionsFn(data.floating);
|
|
1803
|
+
return {
|
|
1804
|
+
reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy),
|
|
1805
|
+
floating: {
|
|
1806
|
+
x: 0,
|
|
1807
|
+
y: 0,
|
|
1808
|
+
width: floatingDimensions.width,
|
|
1809
|
+
height: floatingDimensions.height
|
|
1810
|
+
}
|
|
1811
|
+
};
|
|
167
1812
|
};
|
|
168
1813
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
1814
|
+
function isRTL(element) {
|
|
1815
|
+
return getComputedStyle$1(element).direction === 'rtl';
|
|
1816
|
+
}
|
|
1817
|
+
|
|
1818
|
+
const platform = {
|
|
1819
|
+
convertOffsetParentRelativeRectToViewportRelativeRect,
|
|
1820
|
+
getDocumentElement,
|
|
1821
|
+
getClippingRect,
|
|
1822
|
+
getOffsetParent,
|
|
1823
|
+
getElementRects,
|
|
1824
|
+
getClientRects,
|
|
1825
|
+
getDimensions,
|
|
1826
|
+
getScale,
|
|
1827
|
+
isElement,
|
|
1828
|
+
isRTL
|
|
1829
|
+
};
|
|
1830
|
+
|
|
1831
|
+
function rectsAreEqual(a, b) {
|
|
1832
|
+
return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;
|
|
1833
|
+
}
|
|
1834
|
+
|
|
1835
|
+
// https://samthor.au/2021/observing-dom/
|
|
1836
|
+
function observeMove(element, onMove) {
|
|
1837
|
+
let io = null;
|
|
1838
|
+
let timeoutId;
|
|
1839
|
+
const root = getDocumentElement(element);
|
|
1840
|
+
function cleanup() {
|
|
1841
|
+
var _io;
|
|
1842
|
+
clearTimeout(timeoutId);
|
|
1843
|
+
(_io = io) == null || _io.disconnect();
|
|
1844
|
+
io = null;
|
|
1845
|
+
}
|
|
1846
|
+
function refresh(skip, threshold) {
|
|
1847
|
+
if (skip === void 0) {
|
|
1848
|
+
skip = false;
|
|
1849
|
+
}
|
|
1850
|
+
if (threshold === void 0) {
|
|
1851
|
+
threshold = 1;
|
|
1852
|
+
}
|
|
1853
|
+
cleanup();
|
|
1854
|
+
const elementRectForRootMargin = element.getBoundingClientRect();
|
|
1855
|
+
const {
|
|
1856
|
+
left,
|
|
1857
|
+
top,
|
|
1858
|
+
width,
|
|
1859
|
+
height
|
|
1860
|
+
} = elementRectForRootMargin;
|
|
1861
|
+
if (!skip) {
|
|
1862
|
+
onMove();
|
|
1863
|
+
}
|
|
1864
|
+
if (!width || !height) {
|
|
1865
|
+
return;
|
|
1866
|
+
}
|
|
1867
|
+
const insetTop = floor(top);
|
|
1868
|
+
const insetRight = floor(root.clientWidth - (left + width));
|
|
1869
|
+
const insetBottom = floor(root.clientHeight - (top + height));
|
|
1870
|
+
const insetLeft = floor(left);
|
|
1871
|
+
const rootMargin = -insetTop + "px " + -insetRight + "px " + -insetBottom + "px " + -insetLeft + "px";
|
|
1872
|
+
const options = {
|
|
1873
|
+
rootMargin,
|
|
1874
|
+
threshold: max(0, min(1, threshold)) || 1
|
|
1875
|
+
};
|
|
1876
|
+
let isFirstUpdate = true;
|
|
1877
|
+
function handleObserve(entries) {
|
|
1878
|
+
const ratio = entries[0].intersectionRatio;
|
|
1879
|
+
if (ratio !== threshold) {
|
|
1880
|
+
if (!isFirstUpdate) {
|
|
1881
|
+
return refresh();
|
|
1882
|
+
}
|
|
1883
|
+
if (!ratio) {
|
|
1884
|
+
// If the reference is clipped, the ratio is 0. Throttle the refresh
|
|
1885
|
+
// to prevent an infinite loop of updates.
|
|
1886
|
+
timeoutId = setTimeout(() => {
|
|
1887
|
+
refresh(false, 1e-7);
|
|
1888
|
+
}, 1000);
|
|
1889
|
+
} else {
|
|
1890
|
+
refresh(false, ratio);
|
|
1891
|
+
}
|
|
1892
|
+
}
|
|
1893
|
+
if (ratio === 1 && !rectsAreEqual(elementRectForRootMargin, element.getBoundingClientRect())) {
|
|
1894
|
+
// It's possible that even though the ratio is reported as 1, the
|
|
1895
|
+
// element is not actually fully within the IntersectionObserver's root
|
|
1896
|
+
// area anymore. This can happen under performance constraints. This may
|
|
1897
|
+
// be a bug in the browser's IntersectionObserver implementation. To
|
|
1898
|
+
// work around this, we compare the element's bounding rect now with
|
|
1899
|
+
// what it was at the time we created the IntersectionObserver. If they
|
|
1900
|
+
// are not equal then the element moved, so we refresh.
|
|
1901
|
+
refresh();
|
|
1902
|
+
}
|
|
1903
|
+
isFirstUpdate = false;
|
|
1904
|
+
}
|
|
1905
|
+
|
|
1906
|
+
// Older browsers don't support a `document` as the root and will throw an
|
|
1907
|
+
// error.
|
|
1908
|
+
try {
|
|
1909
|
+
io = new IntersectionObserver(handleObserve, {
|
|
1910
|
+
...options,
|
|
1911
|
+
// Handle <iframe>s
|
|
1912
|
+
root: root.ownerDocument
|
|
1913
|
+
});
|
|
1914
|
+
} catch (_e) {
|
|
1915
|
+
io = new IntersectionObserver(handleObserve, options);
|
|
1916
|
+
}
|
|
1917
|
+
io.observe(element);
|
|
1918
|
+
}
|
|
1919
|
+
refresh(true);
|
|
1920
|
+
return cleanup;
|
|
1921
|
+
}
|
|
1922
|
+
|
|
1923
|
+
/**
|
|
1924
|
+
* Automatically updates the position of the floating element when necessary.
|
|
1925
|
+
* Should only be called when the floating element is mounted on the DOM or
|
|
1926
|
+
* visible on the screen.
|
|
1927
|
+
* @returns cleanup function that should be invoked when the floating element is
|
|
1928
|
+
* removed from the DOM or hidden from the screen.
|
|
1929
|
+
* @see https://floating-ui.com/docs/autoUpdate
|
|
1930
|
+
*/
|
|
1931
|
+
function autoUpdate(reference, floating, update, options) {
|
|
1932
|
+
if (options === void 0) {
|
|
1933
|
+
options = {};
|
|
1934
|
+
}
|
|
1935
|
+
const {
|
|
1936
|
+
ancestorScroll = true,
|
|
1937
|
+
ancestorResize = true,
|
|
1938
|
+
elementResize = typeof ResizeObserver === 'function',
|
|
1939
|
+
layoutShift = typeof IntersectionObserver === 'function',
|
|
1940
|
+
animationFrame = false
|
|
1941
|
+
} = options;
|
|
1942
|
+
const referenceEl = unwrapElement(reference);
|
|
1943
|
+
const ancestors = ancestorScroll || ancestorResize ? [...(referenceEl ? getOverflowAncestors(referenceEl) : []), ...getOverflowAncestors(floating)] : [];
|
|
1944
|
+
ancestors.forEach(ancestor => {
|
|
1945
|
+
ancestorScroll && ancestor.addEventListener('scroll', update, {
|
|
1946
|
+
passive: true
|
|
1947
|
+
});
|
|
1948
|
+
ancestorResize && ancestor.addEventListener('resize', update);
|
|
1949
|
+
});
|
|
1950
|
+
const cleanupIo = referenceEl && layoutShift ? observeMove(referenceEl, update) : null;
|
|
1951
|
+
let reobserveFrame = -1;
|
|
1952
|
+
let resizeObserver = null;
|
|
1953
|
+
if (elementResize) {
|
|
1954
|
+
resizeObserver = new ResizeObserver(_ref => {
|
|
1955
|
+
let [firstEntry] = _ref;
|
|
1956
|
+
if (firstEntry && firstEntry.target === referenceEl && resizeObserver) {
|
|
1957
|
+
// Prevent update loops when using the `size` middleware.
|
|
1958
|
+
// https://github.com/floating-ui/floating-ui/issues/1740
|
|
1959
|
+
resizeObserver.unobserve(floating);
|
|
1960
|
+
cancelAnimationFrame(reobserveFrame);
|
|
1961
|
+
reobserveFrame = requestAnimationFrame(() => {
|
|
1962
|
+
var _resizeObserver;
|
|
1963
|
+
(_resizeObserver = resizeObserver) == null || _resizeObserver.observe(floating);
|
|
1964
|
+
});
|
|
1965
|
+
}
|
|
1966
|
+
update();
|
|
1967
|
+
});
|
|
1968
|
+
if (referenceEl && !animationFrame) {
|
|
1969
|
+
resizeObserver.observe(referenceEl);
|
|
1970
|
+
}
|
|
1971
|
+
resizeObserver.observe(floating);
|
|
1972
|
+
}
|
|
1973
|
+
let frameId;
|
|
1974
|
+
let prevRefRect = animationFrame ? getBoundingClientRect(reference) : null;
|
|
1975
|
+
if (animationFrame) {
|
|
1976
|
+
frameLoop();
|
|
1977
|
+
}
|
|
1978
|
+
function frameLoop() {
|
|
1979
|
+
const nextRefRect = getBoundingClientRect(reference);
|
|
1980
|
+
if (prevRefRect && !rectsAreEqual(prevRefRect, nextRefRect)) {
|
|
1981
|
+
update();
|
|
1982
|
+
}
|
|
1983
|
+
prevRefRect = nextRefRect;
|
|
1984
|
+
frameId = requestAnimationFrame(frameLoop);
|
|
1985
|
+
}
|
|
1986
|
+
update();
|
|
1987
|
+
return () => {
|
|
1988
|
+
var _resizeObserver2;
|
|
1989
|
+
ancestors.forEach(ancestor => {
|
|
1990
|
+
ancestorScroll && ancestor.removeEventListener('scroll', update);
|
|
1991
|
+
ancestorResize && ancestor.removeEventListener('resize', update);
|
|
1992
|
+
});
|
|
1993
|
+
cleanupIo == null || cleanupIo();
|
|
1994
|
+
(_resizeObserver2 = resizeObserver) == null || _resizeObserver2.disconnect();
|
|
1995
|
+
resizeObserver = null;
|
|
1996
|
+
if (animationFrame) {
|
|
1997
|
+
cancelAnimationFrame(frameId);
|
|
1998
|
+
}
|
|
1999
|
+
};
|
|
2000
|
+
}
|
|
2001
|
+
|
|
2002
|
+
/**
|
|
2003
|
+
* Modifies the placement by translating the floating element along the
|
|
2004
|
+
* specified axes.
|
|
2005
|
+
* A number (shorthand for `mainAxis` or distance), or an axes configuration
|
|
2006
|
+
* object may be passed.
|
|
2007
|
+
* @see https://floating-ui.com/docs/offset
|
|
2008
|
+
*/
|
|
2009
|
+
const offset$1 = offset$2;
|
|
2010
|
+
|
|
2011
|
+
/**
|
|
2012
|
+
* Provides data that allows you to change the size of the floating element —
|
|
2013
|
+
* for instance, prevent it from overflowing the clipping boundary or match the
|
|
2014
|
+
* width of the reference element.
|
|
2015
|
+
* @see https://floating-ui.com/docs/size
|
|
2016
|
+
*/
|
|
2017
|
+
const size$1 = size$2;
|
|
2018
|
+
|
|
2019
|
+
/**
|
|
2020
|
+
* Computes the `x` and `y` coordinates that will place the floating element
|
|
2021
|
+
* next to a given reference element.
|
|
2022
|
+
*/
|
|
2023
|
+
const computePosition = (reference, floating, options) => {
|
|
2024
|
+
// This caches the expensive `getClippingElementAncestors` function so that
|
|
2025
|
+
// multiple lifecycle resets re-use the same result. It only lives for a
|
|
2026
|
+
// single call. If other functions become expensive, we can add them as well.
|
|
2027
|
+
const cache = new Map();
|
|
2028
|
+
const mergedOptions = {
|
|
2029
|
+
platform,
|
|
2030
|
+
...options
|
|
2031
|
+
};
|
|
2032
|
+
const platformWithCache = {
|
|
2033
|
+
...mergedOptions.platform,
|
|
2034
|
+
_c: cache
|
|
2035
|
+
};
|
|
2036
|
+
return computePosition$1(reference, floating, {
|
|
2037
|
+
...mergedOptions,
|
|
2038
|
+
platform: platformWithCache
|
|
2039
|
+
});
|
|
174
2040
|
};
|
|
175
2041
|
|
|
176
|
-
var
|
|
177
|
-
var navItems = _a.navItems, actions = _a.actions, header = _a.header, footer = _a.footer, logo = _a.logo, background = _a.background, onOpenChange = _a.onOpenChange, _b = _a.pathway, pathway = _b === void 0 ? "invert" : _b;
|
|
178
|
-
var id = useId();
|
|
179
|
-
var _c = useState(false), isOpen = _c[0], setIsOpen = _c[1];
|
|
180
|
-
var triggerRef = useRef(null);
|
|
181
|
-
var listRef = useRef(null);
|
|
182
|
-
var interactionMode = useInteractionMode().interactionMode;
|
|
183
|
-
var _d = useThemeElement(), themeElement = _d[0], setThemeElement = _d[1];
|
|
184
|
-
var closeMenu = function () {
|
|
185
|
-
setIsOpen(false);
|
|
186
|
-
};
|
|
187
|
-
var focusTriggerElement = function () {
|
|
188
|
-
if (triggerRef.current && interactionMode === "keyboard") {
|
|
189
|
-
triggerRef.current.focus();
|
|
190
|
-
}
|
|
191
|
-
};
|
|
192
|
-
useEffect(function () {
|
|
193
|
-
onOpenChange === null || onOpenChange === void 0 ? void 0 : onOpenChange(isOpen);
|
|
194
|
-
}, [isOpen, onOpenChange]);
|
|
195
|
-
// Close the menu if the nav or trigger is hidden
|
|
196
|
-
useEffect(function () {
|
|
197
|
-
var trigger = triggerRef.current;
|
|
198
|
-
var resizeObserver = new ResizeObserver(function (entries) {
|
|
199
|
-
var entry = entries[0];
|
|
200
|
-
if (!checkElementVisibility(entry.target) && isOpen) {
|
|
201
|
-
setIsOpen(false);
|
|
202
|
-
}
|
|
203
|
-
});
|
|
204
|
-
if (trigger) {
|
|
205
|
-
resizeObserver.observe(trigger);
|
|
206
|
-
}
|
|
207
|
-
return function () {
|
|
208
|
-
if (trigger) {
|
|
209
|
-
resizeObserver.unobserve(trigger);
|
|
210
|
-
}
|
|
211
|
-
};
|
|
212
|
-
}, [isOpen, setIsOpen]);
|
|
213
|
-
var colorScheme = useMemo(function () {
|
|
214
|
-
var colorConfig = {
|
|
215
|
-
light: {
|
|
216
|
-
surface: "light-white",
|
|
217
|
-
menuColorType: "light",
|
|
218
|
-
},
|
|
219
|
-
dark: {
|
|
220
|
-
surface: "dark-black",
|
|
221
|
-
menuColorType: "dark",
|
|
222
|
-
},
|
|
223
|
-
};
|
|
224
|
-
switch (background) {
|
|
225
|
-
case "transparentOnDark":
|
|
226
|
-
case "ghostedOnDark":
|
|
227
|
-
return pathway === "invert" ? colorConfig.light : colorConfig.dark;
|
|
228
|
-
default:
|
|
229
|
-
return pathway === "invert" ? colorConfig.dark : colorConfig.light;
|
|
230
|
-
}
|
|
231
|
-
}, [pathway, background]);
|
|
232
|
-
return (React__default.createElement(React__default.Fragment, null,
|
|
233
|
-
React__default.createElement(Tooltip, { delayDuration: DELAY_DURATION, asChild: true, title: "Menu", side: "bottom" },
|
|
234
|
-
React__default.createElement(NavigationHeaderButton, { ref: triggerRef, isPadded: false, "aria-expanded": isOpen, "aria-label": isOpen ? "close menu" : "open menu", onClick: function () { return setIsOpen(!isOpen); } },
|
|
235
|
-
React__default.createElement("div", { className: "arc-NavigationHeaderBurgerMenu-trigger" },
|
|
236
|
-
React__default.createElement(ThemeIcon, { icon: "siteHeaderBurger", size: 24 })),
|
|
237
|
-
React__default.createElement(VisuallyHidden, null, isOpen ? "close menu" : "open menu"))),
|
|
238
|
-
React__default.createElement("div", { ref: setThemeElement },
|
|
239
|
-
React__default.createElement(Root, { open: isOpen },
|
|
240
|
-
React__default.createElement(Portal, { container: themeElement },
|
|
241
|
-
React__default.createElement(Overlay, { className: "arc-NavigationHeaderBurgerMenu-overlay" },
|
|
242
|
-
React__default.createElement(Content, { "aria-describedby": undefined, className: classNames("arc-NavigationHeaderBurgerMenu-slider", suffixModifier("arc-NavigationHeaderBurgerMenu-slider--on", colorScheme.menuColorType)), onCloseAutoFocus: focusTriggerElement, onEscapeKeyDown: closeMenu, onInteractOutside: closeMenu, "aria-modal": "true" },
|
|
243
|
-
React__default.createElement(Surface, { growVertically: true, isTransparent: true, background: colorScheme.surface },
|
|
244
|
-
React__default.createElement("div", { className: "arc-NavigationHeaderBurgerMenu-container" },
|
|
245
|
-
React__default.createElement("div", { className: "arc-NavigationHeaderBurgerMenu-mainContent" },
|
|
246
|
-
React__default.createElement("div", { className: "arc-NavigationHeaderBurgerMenu-header" },
|
|
247
|
-
React__default.createElement(Title, null,
|
|
248
|
-
React__default.createElement(VisuallyHidden, null, "Navigation menu")),
|
|
249
|
-
React__default.createElement("div", { className: "arc-NavigationHeaderBurgerMenu-closeButtonContainer" },
|
|
250
|
-
React__default.createElement(NavigationHeaderCloseButton, { onClick: closeMenu })),
|
|
251
|
-
React__default.createElement("div", { className: "arc-NavigationHeaderBurgerMenu-logoContainer" },
|
|
252
|
-
React__default.createElement("div", { className: "arc-NavigationHeaderBurgerMenu-logoWrapper" },
|
|
253
|
-
React__default.createElement(NavigationHeaderLogo, __assign({}, logo))))),
|
|
254
|
-
header && (React__default.createElement("div", { className: classNames("arc-NavigationHeaderBurgerMenu-topContent", {
|
|
255
|
-
"arc-NavigationHeaderBurgerMenu-topContent--bottomSpacing": !navItems,
|
|
256
|
-
}) }, header)),
|
|
257
|
-
navItems && (React__default.createElement("ul", { ref: listRef, className: "arc-NavigationHeaderBurgerMenu-list" }, navItems.map(function (navItem, navItemIndex) { return (React__default.createElement(React__default.Fragment, { key: "".concat(id, "-burger-nav-item-").concat(navItemIndex) },
|
|
258
|
-
React__default.createElement("li", { className: "arc-NavigationHeaderBurgerMenu-listItem" },
|
|
259
|
-
React__default.createElement("div", { className: "arc-NavigationHeaderBurgerMenu-listItemContent" },
|
|
260
|
-
(navItem.type === "link" ||
|
|
261
|
-
navItem.type === "meatball") && (React__default.createElement(NavigationHeaderMenuLink, { href: navItem.href, onClick: navItem.onClick, text: navItem.text })),
|
|
262
|
-
(navItem.type === "subnav" ||
|
|
263
|
-
navItem.type === "dropdown") && (React__default.createElement(NavigationHeaderDisclosure, { heading: navItem.text }, navItem.items.map(function (subNavItem, subNavItemIndex) { return (React__default.createElement(NavigationHeaderMenuLink, { size: "s", key: "".concat(id, "-").concat(navItemIndex, "-burger-sub-nav-item-").concat(subNavItemIndex), href: subNavItem.href, onClick: subNavItem.onClick, text: subNavItem.text })); }))))))); }))),
|
|
264
|
-
actions && (React__default.createElement("div", { className: "arc-NavigationHeaderBurgerMenu-actionsContainer" },
|
|
265
|
-
React__default.createElement("div", { className: classNames("arc-NavigationHeaderBurgerMenu-actions", {
|
|
266
|
-
"arc-NavigationHeaderBurgerMenu-actions--seperator": navItems || header,
|
|
267
|
-
}) }, actions.map(function (props, i) { return (React__default.createElement(NavigationHeaderInlineAction, __assign({ key: "".concat(id, "-action-{").concat(i, "}") }, props))); }))))),
|
|
268
|
-
footer && (React__default.createElement("div", { className: "arc-NavigationHeaderBurgerMenu-footer" }, footer)))))))))));
|
|
269
|
-
};
|
|
2042
|
+
var isClient = typeof document !== 'undefined';
|
|
270
2043
|
|
|
271
|
-
var
|
|
272
|
-
|
|
273
|
-
var surface = useContext(Context).surface;
|
|
274
|
-
return (React__default.createElement("a", { href: href, onClick: onClick, className: classNames("arc-NavigationHeaderNavLink", suffixModifier("arc-NavigationHeaderNavLink--borderRadiusSize", borderRadiusSize), suffixModifier("arc-NavigationHeaderNavLink--on", surface)) },
|
|
275
|
-
React__default.createElement(Text, null, text)));
|
|
276
|
-
};
|
|
2044
|
+
var noop = function noop() {};
|
|
2045
|
+
var index = isClient ? useLayoutEffect : noop;
|
|
277
2046
|
|
|
278
|
-
//
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
2047
|
+
// Fork of `fast-deep-equal` that only does the comparisons we need and compares
|
|
2048
|
+
// functions
|
|
2049
|
+
function deepEqual(a, b) {
|
|
2050
|
+
if (a === b) {
|
|
2051
|
+
return true;
|
|
2052
|
+
}
|
|
2053
|
+
if (typeof a !== typeof b) {
|
|
2054
|
+
return false;
|
|
2055
|
+
}
|
|
2056
|
+
if (typeof a === 'function' && a.toString() === b.toString()) {
|
|
2057
|
+
return true;
|
|
2058
|
+
}
|
|
2059
|
+
let length;
|
|
2060
|
+
let i;
|
|
2061
|
+
let keys;
|
|
2062
|
+
if (a && b && typeof a === 'object') {
|
|
2063
|
+
if (Array.isArray(a)) {
|
|
2064
|
+
length = a.length;
|
|
2065
|
+
if (length !== b.length) return false;
|
|
2066
|
+
for (i = length; i-- !== 0;) {
|
|
2067
|
+
if (!deepEqual(a[i], b[i])) {
|
|
2068
|
+
return false;
|
|
2069
|
+
}
|
|
290
2070
|
}
|
|
2071
|
+
return true;
|
|
291
2072
|
}
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
2073
|
+
keys = Object.keys(a);
|
|
2074
|
+
length = keys.length;
|
|
2075
|
+
if (length !== Object.keys(b).length) {
|
|
2076
|
+
return false;
|
|
2077
|
+
}
|
|
2078
|
+
for (i = length; i-- !== 0;) {
|
|
2079
|
+
if (!{}.hasOwnProperty.call(b, keys[i])) {
|
|
2080
|
+
return false;
|
|
2081
|
+
}
|
|
2082
|
+
}
|
|
2083
|
+
for (i = length; i-- !== 0;) {
|
|
2084
|
+
const key = keys[i];
|
|
2085
|
+
if (key === '_owner' && a.$$typeof) {
|
|
2086
|
+
continue;
|
|
2087
|
+
}
|
|
2088
|
+
if (!deepEqual(a[key], b[key])) {
|
|
2089
|
+
return false;
|
|
2090
|
+
}
|
|
2091
|
+
}
|
|
2092
|
+
return true;
|
|
2093
|
+
}
|
|
2094
|
+
return a !== a && b !== b;
|
|
2095
|
+
}
|
|
296
2096
|
|
|
297
|
-
|
|
2097
|
+
function getDPR(element) {
|
|
2098
|
+
if (typeof window === 'undefined') {
|
|
2099
|
+
return 1;
|
|
2100
|
+
}
|
|
2101
|
+
const win = element.ownerDocument.defaultView || window;
|
|
2102
|
+
return win.devicePixelRatio || 1;
|
|
2103
|
+
}
|
|
298
2104
|
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
2105
|
+
function roundByDPR(element, value) {
|
|
2106
|
+
const dpr = getDPR(element);
|
|
2107
|
+
return Math.round(value * dpr) / dpr;
|
|
2108
|
+
}
|
|
2109
|
+
|
|
2110
|
+
function useLatestRef(value) {
|
|
2111
|
+
const ref = React.useRef(value);
|
|
2112
|
+
index(() => {
|
|
2113
|
+
ref.current = value;
|
|
2114
|
+
});
|
|
2115
|
+
return ref;
|
|
2116
|
+
}
|
|
2117
|
+
|
|
2118
|
+
/**
|
|
2119
|
+
* Provides data to position a floating element.
|
|
2120
|
+
* @see https://floating-ui.com/docs/useFloating
|
|
2121
|
+
*/
|
|
2122
|
+
function useFloating$1(options) {
|
|
2123
|
+
if (options === void 0) {
|
|
2124
|
+
options = {};
|
|
2125
|
+
}
|
|
2126
|
+
const {
|
|
2127
|
+
placement = 'bottom',
|
|
2128
|
+
strategy = 'absolute',
|
|
2129
|
+
middleware = [],
|
|
2130
|
+
platform,
|
|
2131
|
+
elements: {
|
|
2132
|
+
reference: externalReference,
|
|
2133
|
+
floating: externalFloating
|
|
2134
|
+
} = {},
|
|
2135
|
+
transform = true,
|
|
2136
|
+
whileElementsMounted,
|
|
2137
|
+
open
|
|
2138
|
+
} = options;
|
|
2139
|
+
const [data, setData] = React.useState({
|
|
2140
|
+
x: 0,
|
|
2141
|
+
y: 0,
|
|
2142
|
+
strategy,
|
|
2143
|
+
placement,
|
|
2144
|
+
middlewareData: {},
|
|
2145
|
+
isPositioned: false
|
|
2146
|
+
});
|
|
2147
|
+
const [latestMiddleware, setLatestMiddleware] = React.useState(middleware);
|
|
2148
|
+
if (!deepEqual(latestMiddleware, middleware)) {
|
|
2149
|
+
setLatestMiddleware(middleware);
|
|
2150
|
+
}
|
|
2151
|
+
const [_reference, _setReference] = React.useState(null);
|
|
2152
|
+
const [_floating, _setFloating] = React.useState(null);
|
|
2153
|
+
const setReference = React.useCallback(node => {
|
|
2154
|
+
if (node !== referenceRef.current) {
|
|
2155
|
+
referenceRef.current = node;
|
|
2156
|
+
_setReference(node);
|
|
2157
|
+
}
|
|
2158
|
+
}, []);
|
|
2159
|
+
const setFloating = React.useCallback(node => {
|
|
2160
|
+
if (node !== floatingRef.current) {
|
|
2161
|
+
floatingRef.current = node;
|
|
2162
|
+
_setFloating(node);
|
|
2163
|
+
}
|
|
2164
|
+
}, []);
|
|
2165
|
+
const referenceEl = externalReference || _reference;
|
|
2166
|
+
const floatingEl = externalFloating || _floating;
|
|
2167
|
+
const referenceRef = React.useRef(null);
|
|
2168
|
+
const floatingRef = React.useRef(null);
|
|
2169
|
+
const dataRef = React.useRef(data);
|
|
2170
|
+
const hasWhileElementsMounted = whileElementsMounted != null;
|
|
2171
|
+
const whileElementsMountedRef = useLatestRef(whileElementsMounted);
|
|
2172
|
+
const platformRef = useLatestRef(platform);
|
|
2173
|
+
const openRef = useLatestRef(open);
|
|
2174
|
+
const update = React.useCallback(() => {
|
|
2175
|
+
if (!referenceRef.current || !floatingRef.current) {
|
|
2176
|
+
return;
|
|
2177
|
+
}
|
|
2178
|
+
const config = {
|
|
2179
|
+
placement,
|
|
2180
|
+
strategy,
|
|
2181
|
+
middleware: latestMiddleware
|
|
2182
|
+
};
|
|
2183
|
+
if (platformRef.current) {
|
|
2184
|
+
config.platform = platformRef.current;
|
|
2185
|
+
}
|
|
2186
|
+
computePosition(referenceRef.current, floatingRef.current, config).then(data => {
|
|
2187
|
+
const fullData = {
|
|
2188
|
+
...data,
|
|
2189
|
+
// The floating element's position may be recomputed while it's closed
|
|
2190
|
+
// but still mounted (such as when transitioning out). To ensure
|
|
2191
|
+
// `isPositioned` will be `false` initially on the next open, avoid
|
|
2192
|
+
// setting it to `true` when `open === false` (must be specified).
|
|
2193
|
+
isPositioned: openRef.current !== false
|
|
2194
|
+
};
|
|
2195
|
+
if (isMountedRef.current && !deepEqual(dataRef.current, fullData)) {
|
|
2196
|
+
dataRef.current = fullData;
|
|
2197
|
+
ReactDOM.flushSync(() => {
|
|
2198
|
+
setData(fullData);
|
|
316
2199
|
});
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
2200
|
+
}
|
|
2201
|
+
});
|
|
2202
|
+
}, [latestMiddleware, placement, strategy, platformRef, openRef]);
|
|
2203
|
+
index(() => {
|
|
2204
|
+
if (open === false && dataRef.current.isPositioned) {
|
|
2205
|
+
dataRef.current.isPositioned = false;
|
|
2206
|
+
setData(data => ({
|
|
2207
|
+
...data,
|
|
2208
|
+
isPositioned: false
|
|
2209
|
+
}));
|
|
2210
|
+
}
|
|
2211
|
+
}, [open]);
|
|
2212
|
+
const isMountedRef = React.useRef(false);
|
|
2213
|
+
index(() => {
|
|
2214
|
+
isMountedRef.current = true;
|
|
2215
|
+
return () => {
|
|
2216
|
+
isMountedRef.current = false;
|
|
333
2217
|
};
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
2218
|
+
}, []);
|
|
2219
|
+
index(() => {
|
|
2220
|
+
if (referenceEl) referenceRef.current = referenceEl;
|
|
2221
|
+
if (floatingEl) floatingRef.current = floatingEl;
|
|
2222
|
+
if (referenceEl && floatingEl) {
|
|
2223
|
+
if (whileElementsMountedRef.current) {
|
|
2224
|
+
return whileElementsMountedRef.current(referenceEl, floatingEl, update);
|
|
2225
|
+
}
|
|
2226
|
+
update();
|
|
2227
|
+
}
|
|
2228
|
+
}, [referenceEl, floatingEl, update, whileElementsMountedRef, hasWhileElementsMounted]);
|
|
2229
|
+
const refs = React.useMemo(() => ({
|
|
2230
|
+
reference: referenceRef,
|
|
2231
|
+
floating: floatingRef,
|
|
2232
|
+
setReference,
|
|
2233
|
+
setFloating
|
|
2234
|
+
}), [setReference, setFloating]);
|
|
2235
|
+
const elements = React.useMemo(() => ({
|
|
2236
|
+
reference: referenceEl,
|
|
2237
|
+
floating: floatingEl
|
|
2238
|
+
}), [referenceEl, floatingEl]);
|
|
2239
|
+
const floatingStyles = React.useMemo(() => {
|
|
2240
|
+
const initialStyles = {
|
|
2241
|
+
position: strategy,
|
|
2242
|
+
left: 0,
|
|
2243
|
+
top: 0
|
|
340
2244
|
};
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
2245
|
+
if (!elements.floating) {
|
|
2246
|
+
return initialStyles;
|
|
2247
|
+
}
|
|
2248
|
+
const x = roundByDPR(elements.floating, data.x);
|
|
2249
|
+
const y = roundByDPR(elements.floating, data.y);
|
|
2250
|
+
if (transform) {
|
|
2251
|
+
return {
|
|
2252
|
+
...initialStyles,
|
|
2253
|
+
transform: "translate(" + x + "px, " + y + "px)",
|
|
2254
|
+
...(getDPR(elements.floating) >= 1.5 && {
|
|
2255
|
+
willChange: 'transform'
|
|
2256
|
+
})
|
|
2257
|
+
};
|
|
2258
|
+
}
|
|
2259
|
+
return {
|
|
2260
|
+
position: strategy,
|
|
2261
|
+
left: x,
|
|
2262
|
+
top: y
|
|
344
2263
|
};
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
2264
|
+
}, [strategy, transform, elements.floating, data.x, data.y]);
|
|
2265
|
+
return React.useMemo(() => ({
|
|
2266
|
+
...data,
|
|
2267
|
+
update,
|
|
2268
|
+
refs,
|
|
2269
|
+
elements,
|
|
2270
|
+
floatingStyles
|
|
2271
|
+
}), [data, update, refs, elements, floatingStyles]);
|
|
2272
|
+
}
|
|
2273
|
+
|
|
2274
|
+
/**
|
|
2275
|
+
* Modifies the placement by translating the floating element along the
|
|
2276
|
+
* specified axes.
|
|
2277
|
+
* A number (shorthand for `mainAxis` or distance), or an axes configuration
|
|
2278
|
+
* object may be passed.
|
|
2279
|
+
* @see https://floating-ui.com/docs/offset
|
|
2280
|
+
*/
|
|
2281
|
+
const offset = (options, deps) => ({
|
|
2282
|
+
...offset$1(options),
|
|
2283
|
+
options: [options, deps]
|
|
2284
|
+
});
|
|
2285
|
+
|
|
2286
|
+
/**
|
|
2287
|
+
* Provides data that allows you to change the size of the floating element —
|
|
2288
|
+
* for instance, prevent it from overflowing the clipping boundary or match the
|
|
2289
|
+
* width of the reference element.
|
|
2290
|
+
* @see https://floating-ui.com/docs/size
|
|
2291
|
+
*/
|
|
2292
|
+
const size = (options, deps) => ({
|
|
2293
|
+
...size$1(options),
|
|
2294
|
+
options: [options, deps]
|
|
2295
|
+
});
|
|
2296
|
+
|
|
2297
|
+
// https://github.com/mui/material-ui/issues/41190#issuecomment-2040873379
|
|
2298
|
+
const SafeReact = {
|
|
2299
|
+
...React
|
|
349
2300
|
};
|
|
350
2301
|
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
2302
|
+
let serverHandoffComplete = false;
|
|
2303
|
+
let count = 0;
|
|
2304
|
+
const genId = () => // Ensure the id is unique with multiple independent versions of Floating UI
|
|
2305
|
+
// on <React 18
|
|
2306
|
+
"floating-ui-" + Math.random().toString(36).slice(2, 6) + count++;
|
|
2307
|
+
function useFloatingId() {
|
|
2308
|
+
const [id, setId] = React.useState(() => serverHandoffComplete ? genId() : undefined);
|
|
2309
|
+
index$1(() => {
|
|
2310
|
+
if (id == null) {
|
|
2311
|
+
setId(genId());
|
|
2312
|
+
}
|
|
2313
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
2314
|
+
}, []);
|
|
2315
|
+
React.useEffect(() => {
|
|
2316
|
+
serverHandoffComplete = true;
|
|
2317
|
+
}, []);
|
|
2318
|
+
return id;
|
|
2319
|
+
}
|
|
2320
|
+
const useReactId = SafeReact.useId;
|
|
2321
|
+
|
|
2322
|
+
/**
|
|
2323
|
+
* Uses React 18's built-in `useId()` when available, or falls back to a
|
|
2324
|
+
* slightly less performant (requiring a double render) implementation for
|
|
2325
|
+
* earlier React versions.
|
|
2326
|
+
* @see https://floating-ui.com/docs/react-utils#useid
|
|
2327
|
+
*/
|
|
2328
|
+
const useId = useReactId || useFloatingId;
|
|
2329
|
+
|
|
2330
|
+
let devMessageSet;
|
|
2331
|
+
if (process.env.NODE_ENV !== "production") {
|
|
2332
|
+
devMessageSet = /*#__PURE__*/new Set();
|
|
2333
|
+
}
|
|
2334
|
+
function error() {
|
|
2335
|
+
var _devMessageSet3;
|
|
2336
|
+
for (var _len2 = arguments.length, messages = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
|
2337
|
+
messages[_key2] = arguments[_key2];
|
|
2338
|
+
}
|
|
2339
|
+
const message = "Floating UI: " + messages.join(' ');
|
|
2340
|
+
if (!((_devMessageSet3 = devMessageSet) != null && _devMessageSet3.has(message))) {
|
|
2341
|
+
var _devMessageSet4;
|
|
2342
|
+
(_devMessageSet4 = devMessageSet) == null || _devMessageSet4.add(message);
|
|
2343
|
+
console.error(message);
|
|
2344
|
+
}
|
|
2345
|
+
}
|
|
2346
|
+
|
|
2347
|
+
function createEventEmitter() {
|
|
2348
|
+
const map = new Map();
|
|
2349
|
+
return {
|
|
2350
|
+
emit(event, data) {
|
|
2351
|
+
var _map$get;
|
|
2352
|
+
(_map$get = map.get(event)) == null || _map$get.forEach(listener => listener(data));
|
|
2353
|
+
},
|
|
2354
|
+
on(event, listener) {
|
|
2355
|
+
if (!map.has(event)) {
|
|
2356
|
+
map.set(event, new Set());
|
|
2357
|
+
}
|
|
2358
|
+
map.get(event).add(listener);
|
|
2359
|
+
},
|
|
2360
|
+
off(event, listener) {
|
|
2361
|
+
var _map$get2;
|
|
2362
|
+
(_map$get2 = map.get(event)) == null || _map$get2.delete(listener);
|
|
2363
|
+
}
|
|
2364
|
+
};
|
|
2365
|
+
}
|
|
2366
|
+
|
|
2367
|
+
const FloatingNodeContext = /*#__PURE__*/React.createContext(null);
|
|
2368
|
+
const FloatingTreeContext = /*#__PURE__*/React.createContext(null);
|
|
2369
|
+
|
|
2370
|
+
/**
|
|
2371
|
+
* Returns the parent node id for nested floating elements, if available.
|
|
2372
|
+
* Returns `null` for top-level floating elements.
|
|
2373
|
+
*/
|
|
2374
|
+
const useFloatingParentNodeId = () => {
|
|
2375
|
+
var _React$useContext;
|
|
2376
|
+
return ((_React$useContext = React.useContext(FloatingNodeContext)) == null ? void 0 : _React$useContext.id) || null;
|
|
395
2377
|
};
|
|
396
2378
|
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
2379
|
+
/**
|
|
2380
|
+
* Returns the nearest floating tree context, if available.
|
|
2381
|
+
*/
|
|
2382
|
+
const useFloatingTree = () => React.useContext(FloatingTreeContext);
|
|
2383
|
+
|
|
2384
|
+
function useFloatingRootContext(options) {
|
|
2385
|
+
const {
|
|
2386
|
+
open = false,
|
|
2387
|
+
onOpenChange: onOpenChangeProp,
|
|
2388
|
+
elements: elementsProp
|
|
2389
|
+
} = options;
|
|
2390
|
+
const floatingId = useId();
|
|
2391
|
+
const dataRef = React.useRef({});
|
|
2392
|
+
const [events] = React.useState(() => createEventEmitter());
|
|
2393
|
+
const nested = useFloatingParentNodeId() != null;
|
|
2394
|
+
if (process.env.NODE_ENV !== "production") {
|
|
2395
|
+
const optionDomReference = elementsProp.reference;
|
|
2396
|
+
if (optionDomReference && !isElement(optionDomReference)) {
|
|
2397
|
+
error('Cannot pass a virtual element to the `elements.reference` option,', 'as it must be a real DOM element. Use `refs.setPositionReference()`', 'instead.');
|
|
2398
|
+
}
|
|
2399
|
+
}
|
|
2400
|
+
const [positionReference, setPositionReference] = React.useState(elementsProp.reference);
|
|
2401
|
+
const onOpenChange = useEffectEvent((open, event, reason) => {
|
|
2402
|
+
dataRef.current.openEvent = open ? event : undefined;
|
|
2403
|
+
events.emit('openchange', {
|
|
2404
|
+
open,
|
|
2405
|
+
event,
|
|
2406
|
+
reason,
|
|
2407
|
+
nested
|
|
2408
|
+
});
|
|
2409
|
+
onOpenChangeProp == null || onOpenChangeProp(open, event, reason);
|
|
2410
|
+
});
|
|
2411
|
+
const refs = React.useMemo(() => ({
|
|
2412
|
+
setPositionReference
|
|
2413
|
+
}), []);
|
|
2414
|
+
const elements = React.useMemo(() => ({
|
|
2415
|
+
reference: positionReference || elementsProp.reference || null,
|
|
2416
|
+
floating: elementsProp.floating || null,
|
|
2417
|
+
domReference: elementsProp.reference
|
|
2418
|
+
}), [positionReference, elementsProp.reference, elementsProp.floating]);
|
|
2419
|
+
return React.useMemo(() => ({
|
|
2420
|
+
dataRef,
|
|
2421
|
+
open,
|
|
2422
|
+
onOpenChange,
|
|
2423
|
+
elements,
|
|
2424
|
+
events,
|
|
2425
|
+
floatingId,
|
|
2426
|
+
refs
|
|
2427
|
+
}), [open, onOpenChange, elements, events, floatingId, refs]);
|
|
2428
|
+
}
|
|
2429
|
+
|
|
2430
|
+
/**
|
|
2431
|
+
* Provides data to position a floating element and context to add interactions.
|
|
2432
|
+
* @see https://floating-ui.com/docs/useFloating
|
|
2433
|
+
*/
|
|
2434
|
+
function useFloating(options) {
|
|
2435
|
+
if (options === void 0) {
|
|
2436
|
+
options = {};
|
|
2437
|
+
}
|
|
2438
|
+
const {
|
|
2439
|
+
nodeId
|
|
2440
|
+
} = options;
|
|
2441
|
+
const internalRootContext = useFloatingRootContext({
|
|
2442
|
+
...options,
|
|
2443
|
+
elements: {
|
|
2444
|
+
reference: null,
|
|
2445
|
+
floating: null,
|
|
2446
|
+
...options.elements
|
|
2447
|
+
}
|
|
2448
|
+
});
|
|
2449
|
+
const rootContext = options.rootContext || internalRootContext;
|
|
2450
|
+
const computedElements = rootContext.elements;
|
|
2451
|
+
const [_domReference, setDomReference] = React.useState(null);
|
|
2452
|
+
const [positionReference, _setPositionReference] = React.useState(null);
|
|
2453
|
+
const optionDomReference = computedElements == null ? void 0 : computedElements.domReference;
|
|
2454
|
+
const domReference = optionDomReference || _domReference;
|
|
2455
|
+
const domReferenceRef = React.useRef(null);
|
|
2456
|
+
const tree = useFloatingTree();
|
|
2457
|
+
index$1(() => {
|
|
2458
|
+
if (domReference) {
|
|
2459
|
+
domReferenceRef.current = domReference;
|
|
2460
|
+
}
|
|
2461
|
+
}, [domReference]);
|
|
2462
|
+
const position = useFloating$1({
|
|
2463
|
+
...options,
|
|
2464
|
+
elements: {
|
|
2465
|
+
...computedElements,
|
|
2466
|
+
...(positionReference && {
|
|
2467
|
+
reference: positionReference
|
|
2468
|
+
})
|
|
2469
|
+
}
|
|
2470
|
+
});
|
|
2471
|
+
const setPositionReference = React.useCallback(node => {
|
|
2472
|
+
const computedPositionReference = isElement(node) ? {
|
|
2473
|
+
getBoundingClientRect: () => node.getBoundingClientRect(),
|
|
2474
|
+
getClientRects: () => node.getClientRects(),
|
|
2475
|
+
contextElement: node
|
|
2476
|
+
} : node;
|
|
2477
|
+
// Store the positionReference in state if the DOM reference is specified externally via the
|
|
2478
|
+
// `elements.reference` option. This ensures that it won't be overridden on future renders.
|
|
2479
|
+
_setPositionReference(computedPositionReference);
|
|
2480
|
+
position.refs.setReference(computedPositionReference);
|
|
2481
|
+
}, [position.refs]);
|
|
2482
|
+
const setReference = React.useCallback(node => {
|
|
2483
|
+
if (isElement(node) || node === null) {
|
|
2484
|
+
domReferenceRef.current = node;
|
|
2485
|
+
setDomReference(node);
|
|
2486
|
+
}
|
|
2487
|
+
|
|
2488
|
+
// Backwards-compatibility for passing a virtual element to `reference`
|
|
2489
|
+
// after it has set the DOM reference.
|
|
2490
|
+
if (isElement(position.refs.reference.current) || position.refs.reference.current === null ||
|
|
2491
|
+
// Don't allow setting virtual elements using the old technique back to
|
|
2492
|
+
// `null` to support `positionReference` + an unstable `reference`
|
|
2493
|
+
// callback ref.
|
|
2494
|
+
node !== null && !isElement(node)) {
|
|
2495
|
+
position.refs.setReference(node);
|
|
2496
|
+
}
|
|
2497
|
+
}, [position.refs]);
|
|
2498
|
+
const refs = React.useMemo(() => ({
|
|
2499
|
+
...position.refs,
|
|
2500
|
+
setReference,
|
|
2501
|
+
setPositionReference,
|
|
2502
|
+
domReference: domReferenceRef
|
|
2503
|
+
}), [position.refs, setReference, setPositionReference]);
|
|
2504
|
+
const elements = React.useMemo(() => ({
|
|
2505
|
+
...position.elements,
|
|
2506
|
+
domReference: domReference
|
|
2507
|
+
}), [position.elements, domReference]);
|
|
2508
|
+
const context = React.useMemo(() => ({
|
|
2509
|
+
...position,
|
|
2510
|
+
...rootContext,
|
|
2511
|
+
refs,
|
|
2512
|
+
elements,
|
|
2513
|
+
nodeId
|
|
2514
|
+
}), [position, refs, elements, nodeId, rootContext]);
|
|
2515
|
+
index$1(() => {
|
|
2516
|
+
rootContext.dataRef.current.floatingContext = context;
|
|
2517
|
+
const node = tree == null ? void 0 : tree.nodesRef.current.find(node => node.id === nodeId);
|
|
2518
|
+
if (node) {
|
|
2519
|
+
node.context = context;
|
|
2520
|
+
}
|
|
2521
|
+
});
|
|
2522
|
+
return React.useMemo(() => ({
|
|
2523
|
+
...position,
|
|
2524
|
+
context,
|
|
2525
|
+
refs,
|
|
2526
|
+
elements
|
|
2527
|
+
}), [position, refs, elements, context]);
|
|
2528
|
+
}
|
|
2529
|
+
|
|
2530
|
+
var _a = createNavigationHeaderContext("NavigationHeader sub components must be used within NavigationHeader"), NavigationHeaderContext = _a[0], useNavigationHeaderContext = _a[1];
|
|
2531
|
+
|
|
2532
|
+
var NavigationHeaderSubnavContent = function (_a) {
|
|
2533
|
+
var children = _a.children, background = _a.background, menuTitle = _a.menuTitle;
|
|
2534
|
+
var navigationHeaderContext = useNavigationHeaderContext();
|
|
2535
|
+
var subNavContext = useSubNavContext();
|
|
403
2536
|
var dialogRef = useRef(null);
|
|
404
|
-
var
|
|
405
|
-
var
|
|
2537
|
+
var childContainerRef = useRef(null);
|
|
2538
|
+
var _b = useThemeElement(), themeElement = _b[0], setThemeElement = _b[1];
|
|
2539
|
+
var _c = useState("pointer"), interactionMode = _c[0], setInterActionMode = _c[1];
|
|
2540
|
+
var isOpen = subNavContext.isOpen, rootRef = subNavContext.rootRef, setIsOpen = subNavContext.setIsOpen, id = subNavContext.id;
|
|
2541
|
+
var _d = useFloating({
|
|
2542
|
+
whileElementsMounted: autoUpdate,
|
|
2543
|
+
elements: {
|
|
2544
|
+
reference: navigationHeaderContext === null || navigationHeaderContext === void 0 ? void 0 : navigationHeaderContext.navBarEl,
|
|
2545
|
+
},
|
|
2546
|
+
placement: "bottom-end",
|
|
2547
|
+
middleware: [
|
|
2548
|
+
size({
|
|
2549
|
+
apply: function (_a) {
|
|
2550
|
+
var rects = _a.rects, elements = _a.elements;
|
|
2551
|
+
Object.assign(elements.floating.style, {
|
|
2552
|
+
width: "".concat(rects.reference.width, "px"),
|
|
2553
|
+
});
|
|
2554
|
+
},
|
|
2555
|
+
}),
|
|
2556
|
+
offset(navigationHeaderContext.isPill ? 12 : 0),
|
|
2557
|
+
],
|
|
2558
|
+
}), subNavRefs = _d.refs, subNavFloatStyles = _d.floatingStyles;
|
|
406
2559
|
// if focus isnt going anywhere else, return it to the trigger
|
|
407
2560
|
var onCloseAutoFocus = function () {
|
|
408
|
-
var _a, _b;
|
|
409
|
-
if (((_a = document.activeElement) === null || _a === void 0 ? void 0 : _a.tagName) === "BODY"
|
|
410
|
-
|
|
2561
|
+
var _a, _b, _c;
|
|
2562
|
+
if (((_a = document.activeElement) === null || _a === void 0 ? void 0 : _a.tagName) === "BODY" &&
|
|
2563
|
+
interactionMode === "keyboard") {
|
|
2564
|
+
(_c = (_b = subNavContext.triggerRef) === null || _b === void 0 ? void 0 : _b.current) === null || _c === void 0 ? void 0 : _c.focus();
|
|
411
2565
|
}
|
|
412
2566
|
};
|
|
413
2567
|
// close when escape key is pressed
|
|
414
2568
|
var onEscapeKeyDown = function () {
|
|
2569
|
+
var _a;
|
|
2570
|
+
setInterActionMode("keyboard");
|
|
415
2571
|
setIsOpen(false);
|
|
416
|
-
|
|
2572
|
+
(_a = subNavContext.onOpenChange) === null || _a === void 0 ? void 0 : _a.call(subNavContext, false);
|
|
2573
|
+
};
|
|
2574
|
+
// close when escape key is pressed
|
|
2575
|
+
var onInteractOutside = function () {
|
|
2576
|
+
setInterActionMode("pointer");
|
|
417
2577
|
};
|
|
418
2578
|
// Find the first focusable element.
|
|
419
|
-
var onOpenAutoFocus = function () {
|
|
420
|
-
|
|
2579
|
+
var onOpenAutoFocus = function (e) {
|
|
2580
|
+
e.preventDefault();
|
|
2581
|
+
var firstFocusable = getFocusableElements(childContainerRef.current)[0];
|
|
2582
|
+
if (firstFocusable) {
|
|
2583
|
+
firstFocusable.focus({ preventScroll: true });
|
|
2584
|
+
}
|
|
421
2585
|
};
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
2586
|
+
var onContainerMouseDown = function () {
|
|
2587
|
+
setInterActionMode("pointer");
|
|
2588
|
+
};
|
|
2589
|
+
var onContainerKeyDown = function () {
|
|
2590
|
+
setInterActionMode("keyboard");
|
|
426
2591
|
};
|
|
427
2592
|
useEffect(function () {
|
|
428
|
-
|
|
2593
|
+
if (!isOpen)
|
|
2594
|
+
return;
|
|
2595
|
+
var clickListener = function (event) {
|
|
2596
|
+
var _a;
|
|
429
2597
|
var target = event.target;
|
|
430
|
-
var isThisTriggerClicked =
|
|
431
|
-
var
|
|
432
|
-
|
|
433
|
-
dialogRef.current &&
|
|
434
|
-
!dialogRef.current.contains(target);
|
|
435
|
-
// dont do anything if the trigger was clicked, toggling is already handled.
|
|
2598
|
+
var isThisTriggerClicked = rootRef.current && rootRef.current.contains(target);
|
|
2599
|
+
var outSideSubnavClicked = dialogRef.current && !dialogRef.current.contains(target);
|
|
2600
|
+
// dont do anything if the click was on the trigger.
|
|
436
2601
|
if (isThisTriggerClicked) {
|
|
437
2602
|
return;
|
|
438
2603
|
}
|
|
439
|
-
//
|
|
440
|
-
if (otherSubNavItemClicked) {
|
|
441
|
-
setIsOpen(false);
|
|
442
|
-
}
|
|
443
|
-
// close and reset the navbar if clicking outside the dialog
|
|
2604
|
+
// close if clicking outside the dialog
|
|
444
2605
|
if (outSideSubnavClicked) {
|
|
445
2606
|
setIsOpen(false);
|
|
446
|
-
|
|
2607
|
+
(_a = subNavContext.onOpenChange) === null || _a === void 0 ? void 0 : _a.call(subNavContext, false);
|
|
447
2608
|
}
|
|
448
2609
|
};
|
|
449
|
-
document.addEventListener("click",
|
|
450
|
-
return function () {
|
|
451
|
-
document.removeEventListener("click", handleClickOutside);
|
|
452
|
-
};
|
|
453
|
-
}, [setIsOpen, navigationHeaderContext]);
|
|
454
|
-
// Close the subnav if the trigger is hidden and the submenu is open
|
|
455
|
-
useEffect(function () {
|
|
456
|
-
var trigger = triggerRef.current;
|
|
457
|
-
var resizeObserver = new ResizeObserver(function (entries) {
|
|
458
|
-
var entry = entries[0];
|
|
459
|
-
if (!checkElementVisibility(entry.target) && isOpen) {
|
|
460
|
-
setIsOpen(false);
|
|
461
|
-
navigationHeaderContext === null || navigationHeaderContext === void 0 ? void 0 : navigationHeaderContext.setIsSubMenuItemActive(false);
|
|
462
|
-
}
|
|
463
|
-
});
|
|
464
|
-
if (trigger) {
|
|
465
|
-
resizeObserver.observe(trigger);
|
|
466
|
-
}
|
|
2610
|
+
document.addEventListener("click", clickListener);
|
|
467
2611
|
return function () {
|
|
468
|
-
|
|
469
|
-
resizeObserver.unobserve(trigger);
|
|
470
|
-
}
|
|
2612
|
+
document.removeEventListener("click", clickListener);
|
|
471
2613
|
};
|
|
472
|
-
}, [isOpen, setIsOpen,
|
|
473
|
-
return (React__default.createElement("div", { ref:
|
|
474
|
-
React__default.createElement(
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
2614
|
+
}, [isOpen, setIsOpen, rootRef, id, subNavContext]);
|
|
2615
|
+
return (React__default.createElement("div", { ref: setThemeElement, onMouseDown: onContainerMouseDown, onKeyDown: onContainerKeyDown },
|
|
2616
|
+
React__default.createElement(Root, { open: subNavContext.isOpen, modal: false },
|
|
2617
|
+
React__default.createElement(Portal, { container: themeElement },
|
|
2618
|
+
React__default.createElement("div", { className: "arc-NavigationHeaderSubnavContent", ref: subNavRefs.setFloating, style: subNavFloatStyles },
|
|
2619
|
+
React__default.createElement(NavigationHeaderContainer, { isExtended: navigationHeaderContext === null || navigationHeaderContext === void 0 ? void 0 : navigationHeaderContext.isExtended, isFluid: navigationHeaderContext === null || navigationHeaderContext === void 0 ? void 0 : navigationHeaderContext.isFluid, isPill: navigationHeaderContext === null || navigationHeaderContext === void 0 ? void 0 : navigationHeaderContext.isPill, backgroundColor: background },
|
|
2620
|
+
React__default.createElement(Content, { className: "arc-NavigationHeaderSubnavContent-dialog", ref: dialogRef, "aria-describedby": undefined, onInteractOutside: onInteractOutside, onEscapeKeyDown: onEscapeKeyDown, onCloseAutoFocus: onCloseAutoFocus, onOpenAutoFocus: onOpenAutoFocus },
|
|
2621
|
+
React__default.createElement(VisuallyHidden, null,
|
|
2622
|
+
React__default.createElement(Title, null, menuTitle)),
|
|
2623
|
+
React__default.createElement("div", { ref: childContainerRef }, children))),
|
|
2624
|
+
React__default.createElement(VerticalSpace, null))))));
|
|
2625
|
+
};
|
|
2626
|
+
|
|
2627
|
+
var NavigationHeaderMegaMenu = function (_a) {
|
|
2628
|
+
var tabs = _a.tabs, panelHeading = _a.panelHeading, featureCards = _a.featureCards, onClick = _a.onClick, onOpenChange = _a.onOpenChange, ariaLabel = _a.ariaLabel, text = _a.text;
|
|
2629
|
+
var id = useId$1();
|
|
2630
|
+
var getColumns = function (tab) { return [
|
|
2631
|
+
tab.items.filter(function (_, i) { return i % 2 === 0; }),
|
|
2632
|
+
tab.items.filter(function (_, i) { return i % 2 === 1; }),
|
|
2633
|
+
]; };
|
|
2634
|
+
return (React__default.createElement(NavigationHeaderSubnav, { onOpenChange: onOpenChange },
|
|
2635
|
+
React__default.createElement(NavigationHeaderSubnavTrigger, { ariaLabel: ariaLabel, onClick: onClick }, text),
|
|
2636
|
+
React__default.createElement(NavigationHeaderSubnavContent, { background: "lightElevated", menuTitle: "".concat(text, " sub menu}") },
|
|
2637
|
+
React__default.createElement("div", { className: "arc-NavigationHeaderMegaMenu" },
|
|
2638
|
+
React__default.createElement("div", { className: "arc-NavigationHeaderMegaMenu-navCol" },
|
|
2639
|
+
React__default.createElement(NavigationHeaderPanelHeading, __assign({}, panelHeading)),
|
|
2640
|
+
React__default.createElement($69cb30bb0017df05$export$be92b6f5f03c0fe9, { orientation: "vertical", className: "arc-NavigationHeaderMegaMenu-nav", defaultValue: "".concat(tabs[0].triggerText, "-").concat(0) },
|
|
2641
|
+
React__default.createElement("div", { className: "arc-NavigationHeaderMegaMenu-tabs" },
|
|
2642
|
+
React__default.createElement($69cb30bb0017df05$export$54c2e3dc7acea9f5, { className: "arc-NavigationHeaderMegaMenu-tabList" }, tabs.map(function (item, i) { return (React__default.createElement("div", { key: "".concat(id, "-NavigationHeader-megamenu-trigger-").concat(i), className: "arc-NavigationHeaderMegaMenu-tabWrapper" },
|
|
2643
|
+
React__default.createElement($69cb30bb0017df05$export$41fb9f06171c75f4, { className: "arc-NavigationHeaderMegaMenu-tab", "aria-label": item.triggerText, value: "".concat(item.triggerText, "-").concat(i), onClick: item.onClick },
|
|
2644
|
+
React__default.createElement(Heading, { level: "3", size: "xs" }, item.triggerText)))); }))),
|
|
2645
|
+
React__default.createElement("div", { className: "arc-NavigationHeaderMegaMenu-mainContent" },
|
|
2646
|
+
React__default.createElement("div", { className: "arc-NavigationHeaderMegaMenu-linksPanel" }, tabs.map(function (tab, i) { return (React__default.createElement($69cb30bb0017df05$export$7c6e2c02157bb7d2, { tabIndex: -1, className: "arc-NavigationHeaderMegaMenu-content", key: "".concat(id, "-NavigationHeader-megamenu-content-").concat(i), value: "".concat(tab.triggerText, "-").concat(i) },
|
|
2647
|
+
React__default.createElement(NavigationHeaderPanelLink, __assign({}, tab.panelLink, { icon: tab.icon })),
|
|
2648
|
+
React__default.createElement(VerticalSpace, { size: "32" }),
|
|
2649
|
+
React__default.createElement("div", { className: "arc-NavigationHeaderMegaMenu-linksContainer" }, getColumns(tab).map(function (items, itemIndex) { return (React__default.createElement("div", { className: "arc-NavigationHeaderMegaMenu-linksColumn", key: "column-".concat(itemIndex) }, items.map(function (item, i) { return (React__default.createElement(NavigationHeaderCollapsingNavList, __assign({}, item, { defaultOpen: true, revealLinkIconOnHover: true, autoFocusOnExpand: false, background: "light", key: "".concat(id, "-NavigationHeader-megamenu-item-").concat(i) }))); }))); })))); }))))),
|
|
2650
|
+
React__default.createElement("div", { className: "arc-NavigationHeaderMegaMenu-featureCol" }, featureCards && (React__default.createElement("div", { className: classNames("arc-NavigationHeaderMegaMenu-featureCardsPanel", {
|
|
2651
|
+
"arc-NavigationHeaderMegaMenu-featureCardsPanel--equalWidthColumns": featureCards.length <= 3,
|
|
2652
|
+
"arc-NavigationHeaderMegaMenu-featureCardsPanel--manyColumns": featureCards.length > 3,
|
|
2653
|
+
}) }, featureCards.map(function (card, i) { return (React__default.createElement(NavigationHeaderFeatureCard, __assign({ key: "".concat(id, "-NavigationHeader-megamenu-featureCard-").concat(i) }, card))); }))))))));
|
|
2654
|
+
};
|
|
2655
|
+
|
|
2656
|
+
var NavigationHeaderCategoryLinks = function (_a) {
|
|
2657
|
+
var items = _a.items, panelHeading = _a.panelHeading, ariaLabel = _a.ariaLabel, onClick = _a.onClick, text = _a.text, onOpenChange = _a.onOpenChange;
|
|
2658
|
+
var id = useId$1();
|
|
2659
|
+
return (React__default.createElement(NavigationHeaderSubnav, { onOpenChange: onOpenChange },
|
|
2660
|
+
React__default.createElement(NavigationHeaderSubnavTrigger, { ariaLabel: ariaLabel, onClick: onClick }, text),
|
|
2661
|
+
React__default.createElement(NavigationHeaderSubnavContent, { background: "lightElevated", menuTitle: "".concat(text, " sub menu}") },
|
|
2662
|
+
React__default.createElement("div", { className: "arc-NavigationHeaderCategoryLinks" },
|
|
2663
|
+
React__default.createElement(NavigationHeaderPanelHeading, __assign({}, panelHeading)),
|
|
2664
|
+
React__default.createElement("div", { className: "arc-NavigationHeaderCategoryLinks-container" }, items.map(function (item, i) { return (React__default.createElement("div", { key: "".concat(id, "-NavigationHeader-category-link-item-").concat(i) },
|
|
2665
|
+
React__default.createElement(NavigationHeaderCollapsingNavList, __assign({}, item, { defaultOpen: true, revealLinkIconOnHover: true, autoFocusOnExpand: false, background: "light" })))); }))))));
|
|
2666
|
+
};
|
|
2667
|
+
|
|
2668
|
+
var NavigationHeaderLevelTwoLinks = function (_a) {
|
|
2669
|
+
var links = _a.links, children = _a.children;
|
|
2670
|
+
var id = useId$1();
|
|
2671
|
+
return (React__default.createElement("ul", { className: "arc-NavigationHeaderLevelTwoLinks" },
|
|
2672
|
+
links.map(function (navLink, i) { return (React__default.createElement("li", { key: "".concat(id, "-NavigationHeader-subnav-item-").concat(i) },
|
|
2673
|
+
React__default.createElement(NavigationHeaderNavLink, __assign({}, navLink, { borderRadiusSize: "s" })))); }),
|
|
2674
|
+
children));
|
|
487
2675
|
};
|
|
488
2676
|
|
|
489
2677
|
var NavigationHeaderNavItem = function (_a) {
|
|
490
2678
|
var navItem = _a.navItem;
|
|
491
|
-
var id = useId();
|
|
492
2679
|
return (React__default.createElement(React__default.Fragment, null,
|
|
493
2680
|
navItem.type === "link" && (React__default.createElement(NavigationHeaderNavLink, __assign({}, navItem, { borderRadiusSize: "m" }))),
|
|
494
|
-
navItem.type === "
|
|
495
|
-
React__default.createElement(
|
|
496
|
-
navItem.type === "
|
|
497
|
-
|
|
2681
|
+
navItem.type === "levelTwo" && (React__default.createElement(NavigationHeaderDropdown, { trigger: navItem.text, onClick: navItem.onClick, ariaLabel: navItem.ariaLabel },
|
|
2682
|
+
React__default.createElement(NavigationHeaderLevelTwoLinks, { links: navItem.items }))),
|
|
2683
|
+
navItem.type === "categoryLinks" && (React__default.createElement(NavigationHeaderCategoryLinks, { onOpenChange: navItem.onOpenChange, ariaLabel: navItem.ariaLabel, onClick: navItem.onClick, text: navItem.text, panelHeading: navItem.panelHeading, items: navItem.items })),
|
|
2684
|
+
navItem.type === "megamenu" && (React__default.createElement(NavigationHeaderMegaMenu, { onOpenChange: navItem.onOpenChange, panelHeading: navItem.panelHeading, ariaLabel: navItem.ariaLabel, onClick: navItem.onClick, text: navItem.text, tabs: navItem.tabs, featureCards: navItem.featureCards }))));
|
|
498
2685
|
};
|
|
499
2686
|
|
|
500
2687
|
var MeatBall = function () { return (React__default.createElement("svg", { width: 18, "aria-hidden": true, viewBox: "0 0 17 3", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
|
|
@@ -1220,12 +3407,6 @@ var getQuery = function (_a) {
|
|
|
1220
3407
|
return "".concat(isMatchMedia ? "" : "@media", "(").concat(type, "-width: ").concat(breakpointValue, "px)");
|
|
1221
3408
|
};
|
|
1222
3409
|
|
|
1223
|
-
/*
|
|
1224
|
-
This is to ensure there are no cumulative layout shifts on SSR because of the dynamic media queries.
|
|
1225
|
-
matchMedia can cause flickering when it returns a different value than the default state the server used.
|
|
1226
|
-
This is plain old css so the styles will appear correctly on first paint.
|
|
1227
|
-
The items these styles are applied to will still appear in the server rendered HTML for SEO purposes.
|
|
1228
|
-
*/
|
|
1229
3410
|
var NavigationHeaderStyleElement = function (_a) {
|
|
1230
3411
|
var css = _a.css;
|
|
1231
3412
|
var generateCssStyles = function (declarations) {
|
|
@@ -1246,43 +3427,13 @@ var NavigationHeaderStyleElement = function (_a) {
|
|
|
1246
3427
|
return React__default.createElement("style", null, styleStrings.join("").replace(/\s/g, ""));
|
|
1247
3428
|
};
|
|
1248
3429
|
|
|
1249
|
-
var
|
|
1250
|
-
var
|
|
1251
|
-
var id = useId();
|
|
1252
|
-
var meatBallMenuItemClassName = useUniqueString("arc-NavigationHeaderMeatBalllMenu-item");
|
|
1253
|
-
return (React__default.createElement(React__default.Fragment, null,
|
|
1254
|
-
React__default.createElement(NavigationHeaderStyleElement, { css: __spreadArray([
|
|
1255
|
-
{
|
|
1256
|
-
className: meatBallMenuItemClassName,
|
|
1257
|
-
declarations: {
|
|
1258
|
-
display: "none",
|
|
1259
|
-
},
|
|
1260
|
-
}
|
|
1261
|
-
], mainNavItems.map(function (navItem, i) { return ({
|
|
1262
|
-
mediaQuery: { type: "max", breakpoint: navItem.visibleFrom || 0 },
|
|
1263
|
-
className: "".concat(meatBallMenuItemClassName, "-").concat(i),
|
|
1264
|
-
declarations: {
|
|
1265
|
-
display: "block",
|
|
1266
|
-
},
|
|
1267
|
-
}); }), true) }),
|
|
1268
|
-
React__default.createElement("div", { className: "arc-NavigationHeaderMeatBalllMenu-container" },
|
|
1269
|
-
React__default.createElement(NavigationHeaderDropdown, { ariaLabel: ariaLabel, tooltip: tooltip, trigger: React__default.createElement(MeatBall, null) },
|
|
1270
|
-
extraNavItems.map(function (navItem, i) { return (React__default.createElement("li", { key: "".concat(id, "-NavigationHeader-meatball-item-").concat(i) },
|
|
1271
|
-
React__default.createElement(NavigationHeaderNavLink, __assign({}, navItem)))); }),
|
|
1272
|
-
mainNavItems.map(function (navItem, itemIndex) { return (React__default.createElement("li", { key: "".concat(id, "-NavigationHeader-meatball-item-").concat(itemIndex), className: classNames(meatBallMenuItemClassName, "".concat(meatBallMenuItemClassName, "-").concat(itemIndex)) },
|
|
1273
|
-
navItem.type === "link" && (React__default.createElement(NavigationHeaderNavLink, __assign({}, navItem))),
|
|
1274
|
-
(navItem.type === "subnav" || navItem.type === "dropdown") &&
|
|
1275
|
-
navItem.items.map(function (navLink, subItemIndex) { return (React__default.createElement(NavigationHeaderNavLink, __assign({ key: "".concat(id, "-NavigationHeader-meatball-link--").concat(itemIndex, "-").concat(subItemIndex) }, navLink))); }))); })))));
|
|
1276
|
-
};
|
|
1277
|
-
|
|
1278
|
-
var NavigationHeaderNavList = function (_a) {
|
|
1279
|
-
var navItems = _a.navItems, meatBallMenuAriaLabel = _a.meatBallMenuAriaLabel, meatballMenuTooltip = _a.meatballMenuTooltip;
|
|
1280
|
-
var id = useId();
|
|
3430
|
+
var NavigationHeaderNavList = memo(function (_a) {
|
|
3431
|
+
var navItems = _a.navItems, background = _a.background, extraMenuTooltip = _a.extraMenuTooltip, _b = _a.extraNavItems, extraNavItems = _b === void 0 ? [] : _b, extraMenuAriaLabel = _a.extraMenuAriaLabel;
|
|
3432
|
+
var id = useId$1();
|
|
1281
3433
|
var navListItemClassName = useUniqueString("arc-NavigationHeaderNavList-item");
|
|
1282
|
-
var
|
|
3434
|
+
var sideMenuClassName = useUniqueString("arc-NavigationHeaderNavList-sideMenu");
|
|
3435
|
+
var sideMenuNavItemClassName = useUniqueString("arc-NavigationHeaderNavList-sideMenuItem");
|
|
1283
3436
|
var ref = useRef(null);
|
|
1284
|
-
var mainNavItems = navItems.filter(function (navItem) { return navItem.type !== "meatball"; });
|
|
1285
|
-
var meatBallMenuItems = navItems.filter(function (navItem) { return navItem.type === "meatball"; });
|
|
1286
3437
|
var largestElementBreakpoint = function (navItems) {
|
|
1287
3438
|
return Math.max.apply(Math, navItems.map(function (navItem) {
|
|
1288
3439
|
if (navItem.visibleFrom) {
|
|
@@ -1293,14 +3444,14 @@ var NavigationHeaderNavList = function (_a) {
|
|
|
1293
3444
|
return 0;
|
|
1294
3445
|
}));
|
|
1295
3446
|
};
|
|
1296
|
-
var
|
|
3447
|
+
var extraMenuBreakpoint = extraNavItems.length
|
|
1297
3448
|
? { type: "max", breakpoint: 0 }
|
|
1298
|
-
: { type: "min", breakpoint: largestElementBreakpoint(
|
|
3449
|
+
: { type: "min", breakpoint: largestElementBreakpoint(navItems) };
|
|
1299
3450
|
return (React__default.createElement("div", { className: "arc-NavigationHeaderNavList-container" },
|
|
1300
3451
|
React__default.createElement(NavigationHeaderStyleElement, { css: __spreadArray([
|
|
1301
3452
|
{
|
|
1302
|
-
className:
|
|
1303
|
-
mediaQuery:
|
|
3453
|
+
className: sideMenuClassName,
|
|
3454
|
+
mediaQuery: extraMenuBreakpoint,
|
|
1304
3455
|
declarations: {
|
|
1305
3456
|
display: "none",
|
|
1306
3457
|
},
|
|
@@ -1311,25 +3462,45 @@ var NavigationHeaderNavList = function (_a) {
|
|
|
1311
3462
|
display: "none",
|
|
1312
3463
|
},
|
|
1313
3464
|
}
|
|
1314
|
-
],
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
}
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
3465
|
+
], navItems.reduce(function (acc, navItem, i) {
|
|
3466
|
+
return __spreadArray(__spreadArray([], acc, true), [
|
|
3467
|
+
{
|
|
3468
|
+
mediaQuery: {
|
|
3469
|
+
type: "min",
|
|
3470
|
+
breakpoint: navItem.visibleFrom || 0,
|
|
3471
|
+
},
|
|
3472
|
+
className: "".concat(sideMenuNavItemClassName, "-").concat(i),
|
|
3473
|
+
declarations: {
|
|
3474
|
+
display: "none",
|
|
3475
|
+
},
|
|
3476
|
+
},
|
|
3477
|
+
{
|
|
3478
|
+
mediaQuery: {
|
|
3479
|
+
type: "min",
|
|
3480
|
+
breakpoint: navItem.visibleFrom || 0,
|
|
3481
|
+
},
|
|
3482
|
+
className: "".concat(navListItemClassName, "-").concat(i),
|
|
3483
|
+
declarations: {
|
|
3484
|
+
display: "block",
|
|
3485
|
+
},
|
|
3486
|
+
},
|
|
3487
|
+
], false);
|
|
3488
|
+
}, []), true) }),
|
|
3489
|
+
React__default.createElement("ul", { ref: ref, className: "arc-NavigationHeaderNavList" }, navItems.map(function (navItem, i) { return (React__default.createElement("li", { key: "".concat(id, "-navigation-header-navitem-").concat(i), className: classNames(navListItemClassName, "".concat(navListItemClassName, "-").concat(i)) },
|
|
3490
|
+
React__default.createElement("div", { className: classNames({
|
|
3491
|
+
"arc-NavigationHeaderNavList-itemContent--separator": navItem.isSeparator,
|
|
3492
|
+
}) },
|
|
3493
|
+
React__default.createElement(NavigationHeaderNavItem, { navItem: navItem })))); })),
|
|
3494
|
+
React__default.createElement("div", { className: sideMenuClassName },
|
|
3495
|
+
React__default.createElement(NavigationHeaderSideMenu, { showLogo: false, menuPosition: "left", pathway: "match", triggerAriaLabel: extraMenuAriaLabel, trigger: React__default.createElement(MeatBall, null), tooltip: extraMenuTooltip, background: background },
|
|
3496
|
+
React__default.createElement(SideMenuNavList, null, extraNavItems === null || extraNavItems === void 0 ? void 0 :
|
|
3497
|
+
extraNavItems.map(function (navItem, navItemIndex) { return (React__default.createElement(React__default.Fragment, { key: "".concat(id, "-side-nav-item-").concat(navItemIndex) },
|
|
3498
|
+
React__default.createElement("li", null,
|
|
3499
|
+
React__default.createElement(SideMenuNavItem, { navItem: navItem })))); }), navItems === null || navItems === void 0 ? void 0 :
|
|
3500
|
+
navItems.map(function (navItem, navItemIndex) { return (React__default.createElement(React__default.Fragment, { key: "".concat(id, "-side-main-nav-item-").concat(navItemIndex) },
|
|
3501
|
+
React__default.createElement("li", { className: classNames(sideMenuNavItemClassName, "".concat(sideMenuNavItemClassName, "-").concat(navItemIndex)) },
|
|
3502
|
+
React__default.createElement(SideMenuNavItem, { navItem: navItem })))); }))))));
|
|
3503
|
+
});
|
|
1333
3504
|
|
|
1334
3505
|
var defaultHeaderVisibility = {
|
|
1335
3506
|
burgerMenu: {
|
|
@@ -1350,53 +3521,153 @@ var defaultHeaderVisibility = {
|
|
|
1350
3521
|
},
|
|
1351
3522
|
};
|
|
1352
3523
|
|
|
3524
|
+
function defaultEmptyArray(items) {
|
|
3525
|
+
return items || [];
|
|
3526
|
+
}
|
|
3527
|
+
|
|
1353
3528
|
/**
|
|
1354
3529
|
* Use `NavigationHeader` as a Top-level UI element that displays branding, page titles, and primary navigation actions.
|
|
1355
3530
|
*/
|
|
1356
3531
|
var NavigationHeader = function (_a) {
|
|
1357
|
-
var leftSlot = _a.leftSlot, middleSlot = _a.middleSlot, rightSlot = _a.rightSlot, isPill = _a.isPill, isExtended = _a.isExtended, isFluid = _a.isFluid, logo = _a.logo, navItems = _a.navItems,
|
|
1358
|
-
var
|
|
1359
|
-
var _c = useState(false), isSubMenuItemActive = _c[0], setIsSubMenuItemActive = _c[1];
|
|
1360
|
-
var navBarBackground = isSubMenuItemActive ? "lightElevated" : background;
|
|
3532
|
+
var leftSlot = _a.leftSlot, middleSlot = _a.middleSlot, rightSlot = _a.rightSlot, isPill = _a.isPill, isExtended = _a.isExtended, isFluid = _a.isFluid, logo = _a.logo, navItems = _a.navItems, extraNavItems = _a.extraNavItems, extraMenuTooltip = _a.extraMenuTooltip, extraMenuAriaLabel = _a.extraMenuAriaLabel, burgerMenuActions = _a.burgerMenuActions, burgerMenuFooter = _a.burgerMenuFooter, burgerMenuHeader = _a.burgerMenuHeader, burgerMenuVisibility = _a.burgerMenuVisibility, onBurgerMenuOpenChange = _a.onBurgerMenuOpenChange, burgerMenuPathway = _a.burgerMenuPathway, navMenuVisibility = _a.navMenuVisibility, _b = _a.background, background = _b === void 0 ? "transparentOnLight" : _b;
|
|
3533
|
+
var _c = useState(), navBarEl = _c[0], setNavBarEl = _c[1];
|
|
1361
3534
|
var burgerMenuVisibilityProps = __assign(__assign({}, defaultHeaderVisibility.burgerMenu), burgerMenuVisibility);
|
|
1362
3535
|
var navMenuVisibilityProps = __assign(__assign({}, defaultHeaderVisibility.navItems), navMenuVisibility);
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
3536
|
+
var setNavBarRef = function (el) {
|
|
3537
|
+
el && setNavBarEl(el);
|
|
3538
|
+
};
|
|
3539
|
+
var contextValue = useMemo(function () { return ({
|
|
3540
|
+
navBarEl: navBarEl,
|
|
3541
|
+
isPill: isPill,
|
|
3542
|
+
isExtended: isExtended,
|
|
3543
|
+
isFluid: isFluid,
|
|
3544
|
+
}); }, [navBarEl, isPill, isExtended, isFluid]);
|
|
3545
|
+
var allNavItems = __spreadArray(__spreadArray([], defaultEmptyArray(navItems), true), defaultEmptyArray(extraNavItems), true);
|
|
3546
|
+
return (React__default.createElement(NavigationHeaderContext.Provider, { value: contextValue },
|
|
3547
|
+
React__default.createElement("nav", { "aria-label": "primary" },
|
|
3548
|
+
React__default.createElement(NavigationHeaderContainer, { ref: setNavBarRef, isPill: isPill, isExtended: isExtended, isFluid: isFluid, backgroundColor: background },
|
|
3549
|
+
React__default.createElement("div", { className: "arc-NavigationHeader-inner" },
|
|
3550
|
+
React__default.createElement("div", { className: "arc-NavigationHeader-leftSlot" },
|
|
3551
|
+
React__default.createElement(NavigationHeaderLogo, __assign({}, logo)),
|
|
3552
|
+
leftSlot),
|
|
3553
|
+
React__default.createElement("div", { className: "arc-NavigationHeader-navSlot" },
|
|
3554
|
+
navItems && (React__default.createElement(Visible, __assign({}, navMenuVisibilityProps),
|
|
3555
|
+
React__default.createElement(NavigationHeaderNavList, { navItems: navItems, background: background, extraNavItems: extraNavItems, extraMenuAriaLabel: extraMenuAriaLabel, extraMenuTooltip: extraMenuTooltip }))),
|
|
3556
|
+
React__default.createElement("div", { className: "arc-NavigationHeader-middleSlot" }, middleSlot)),
|
|
3557
|
+
rightSlot && (React__default.createElement("div", { className: "arc-NavigationHeader-rightSlot" }, rightSlot)),
|
|
3558
|
+
React__default.createElement(Visible, __assign({}, burgerMenuVisibilityProps),
|
|
3559
|
+
React__default.createElement("div", { className: "arc-NavigationHeader-burgerMenuSlot" },
|
|
3560
|
+
React__default.createElement(NavigationHeaderSideMenu, { menuPosition: "right", logo: logo, background: background, pathway: burgerMenuPathway, navItems: allNavItems, actions: burgerMenuActions, header: burgerMenuHeader, footer: burgerMenuFooter, onOpenChange: onBurgerMenuOpenChange }))))))));
|
|
1383
3561
|
};
|
|
1384
3562
|
|
|
1385
3563
|
var NavigationHeaderAction = function (_a) {
|
|
1386
|
-
var ariaLabel = _a.ariaLabel, icon = _a.icon, onClick = _a.onClick, title = _a.title, supportingCopy = _a.supportingCopy, _b = _a.isAttention, isAttention = _b === void 0 ? false : _b;
|
|
3564
|
+
var ariaLabel = _a.ariaLabel, icon = _a.icon, onClick = _a.onClick, title = _a.title, supportingCopy = _a.supportingCopy, ref = _a.ref, href = _a.href, _b = _a.isAttention, isAttention = _b === void 0 ? false : _b;
|
|
1387
3565
|
return (React__default.createElement("div", { className: classNames("arc-NavigationHeaderAction", {
|
|
1388
3566
|
"arc-NavigationHeaderAction--attention": isAttention,
|
|
1389
3567
|
}) },
|
|
1390
3568
|
React__default.createElement(Tooltip, { asChild: true, title: title, alignContent: "center", supportingCopy: supportingCopy, delayDuration: DELAY_DURATION, side: "bottom" },
|
|
1391
|
-
React__default.createElement(NavigationHeaderButton, { isPadded: false, onClick: onClick },
|
|
3569
|
+
React__default.createElement(NavigationHeaderButton, { href: href, ref: ref, isPadded: false, onClick: onClick },
|
|
1392
3570
|
React__default.createElement("div", { className: "arc-NavigationHeaderAction-content" },
|
|
1393
|
-
React__default.createElement(Icon, { "aria-hidden": true, icon: icon, size: 24 }),
|
|
3571
|
+
typeof icon === "string" ? (React__default.createElement(Icon, { "aria-hidden": true, icon: icon, size: 24 })) : (icon),
|
|
1394
3572
|
React__default.createElement(VisuallyHidden, null, ariaLabel))))));
|
|
1395
3573
|
};
|
|
1396
3574
|
|
|
3575
|
+
var NavigationHeaderSearchMenu = function (_a) {
|
|
3576
|
+
var onSubmit = _a.onSubmit, quickLinks = _a.quickLinks, onInputChange = _a.onInputChange, _b = _a.submitButtonAriaLabel, submitButtonAriaLabel = _b === void 0 ? "Submit search" : _b, _c = _a.panelTitle, panelTitle = _c === void 0 ? "Quick links" : _c, _d = _a.description, description = _d === void 0 ? "Discover our products and how we can help your business grow" : _d, _e = _a.accessibleMenuTitle, accessibleMenuTitle = _e === void 0 ? "Search menu" : _e, _f = _a.label, label = _f === void 0 ? "Search" : _f, _g = _a.triggerTooltip, triggerTooltip = _g === void 0 ? "Search" : _g, _h = _a.triggerAriaLabel, triggerAriaLabel = _h === void 0 ? "Open search menu" : _h;
|
|
3577
|
+
var id = useId$1();
|
|
3578
|
+
var listBoxId = useId$1();
|
|
3579
|
+
var inputId = useId$1();
|
|
3580
|
+
var _j = useState(undefined), highlightedOptionIndex = _j[0], setHighlightedOptionIndex = _j[1];
|
|
3581
|
+
var _k = useState(""), searchTerm = _k[0], setSearchTerm = _k[1];
|
|
3582
|
+
var inputRef = useRef(null);
|
|
3583
|
+
var hasHighlightedOption = typeof highlightedOptionIndex === "number";
|
|
3584
|
+
var onChange = function (e) {
|
|
3585
|
+
onInputChange === null || onInputChange === void 0 ? void 0 : onInputChange(e.target.value);
|
|
3586
|
+
setSearchTerm(e.target.value);
|
|
3587
|
+
setHighlightedOptionIndex(undefined);
|
|
3588
|
+
};
|
|
3589
|
+
var onFormSubmit = function (e) {
|
|
3590
|
+
e.preventDefault();
|
|
3591
|
+
onSubmit && onSubmit(searchTerm);
|
|
3592
|
+
};
|
|
3593
|
+
var onOpenChange = function (isOpen) {
|
|
3594
|
+
if (!isOpen) {
|
|
3595
|
+
setSearchTerm("");
|
|
3596
|
+
setHighlightedOptionIndex(undefined);
|
|
3597
|
+
}
|
|
3598
|
+
};
|
|
3599
|
+
var onInputKeyDown = function (e) {
|
|
3600
|
+
var key = e.key;
|
|
3601
|
+
if (key === KeyNames.Enter || key === KeyNames.Space) {
|
|
3602
|
+
!searchTerm && e.preventDefault();
|
|
3603
|
+
}
|
|
3604
|
+
if (key === KeyNames.ArrowDown) {
|
|
3605
|
+
e.preventDefault();
|
|
3606
|
+
var newIndex = !hasHighlightedOption ||
|
|
3607
|
+
highlightedOptionIndex === quickLinks.length - 1
|
|
3608
|
+
? 0
|
|
3609
|
+
: highlightedOptionIndex + 1;
|
|
3610
|
+
setHighlightedOptionIndex(newIndex);
|
|
3611
|
+
setSearchTerm(quickLinks[newIndex].text);
|
|
3612
|
+
}
|
|
3613
|
+
if (key === KeyNames.ArrowUp) {
|
|
3614
|
+
e.preventDefault();
|
|
3615
|
+
var newIndex = (!hasHighlightedOption || highlightedOptionIndex === 0
|
|
3616
|
+
? quickLinks.length
|
|
3617
|
+
: highlightedOptionIndex) - 1;
|
|
3618
|
+
setHighlightedOptionIndex(newIndex);
|
|
3619
|
+
setSearchTerm(quickLinks[newIndex].text);
|
|
3620
|
+
}
|
|
3621
|
+
};
|
|
3622
|
+
return (React__default.createElement(NavigationHeaderSubnav, { onOpenChange: onOpenChange },
|
|
3623
|
+
React__default.createElement(NavigationHeaderSubnavTrigger, { asChild: true },
|
|
3624
|
+
React__default.createElement(NavigationHeaderAction, { title: triggerTooltip, ariaLabel: triggerAriaLabel, icon: React__default.createElement(ThemeIcon, { icon: "navigationHeaderSearch", size: 24 }) })),
|
|
3625
|
+
React__default.createElement(NavigationHeaderSubnavContent, { background: "lightElevated", menuTitle: accessibleMenuTitle },
|
|
3626
|
+
React__default.createElement("div", { className: "arc-NavigationHeaderSearchMenu" },
|
|
3627
|
+
React__default.createElement("div", { className: "arc-NavigationHeaderSearchMenu-labelContainer" },
|
|
3628
|
+
React__default.createElement("label", { htmlFor: inputId },
|
|
3629
|
+
React__default.createElement(Heading, { size: "m" }, label)),
|
|
3630
|
+
React__default.createElement(Text, null, description)),
|
|
3631
|
+
React__default.createElement("form", { onSubmit: onFormSubmit, className: "arc-NavigationHeaderSearchMenu-form" },
|
|
3632
|
+
React__default.createElement("input", { id: inputId, role: "combobox", autoComplete: "off", "aria-autocomplete": "none", "aria-controls": listBoxId, "aria-activedescendant": hasHighlightedOption
|
|
3633
|
+
? "".concat(listBoxId, "-").concat(highlightedOptionIndex)
|
|
3634
|
+
: undefined, ref: inputRef, value: searchTerm, onChange: onChange, onKeyDown: onInputKeyDown, className: "arc-NavigationHeaderSearchMenu-input", type: "text" }),
|
|
3635
|
+
React__default.createElement("div", { className: "arc-NavigationHeaderSearchMenu-actions" },
|
|
3636
|
+
React__default.createElement(SemanticButton, { "aria-label": submitButtonAriaLabel, className: "arc-NavigationHeaderSearchMenu-submitButton", type: "submit" },
|
|
3637
|
+
React__default.createElement(ThemeIcon, { icon: "navigationHeaderSearch" })))),
|
|
3638
|
+
React__default.createElement("div", { className: "arc-NavigationHeaderSearchMenu-results" },
|
|
3639
|
+
React__default.createElement(Heading, { level: "3", size: "xxxs" }, panelTitle),
|
|
3640
|
+
React__default.createElement("ul", { id: listBoxId, role: "listbox", onMouseLeave: function () { return setHighlightedOptionIndex(undefined); }, className: "arc-NavigationHeaderSearchMenu-resultsList" }, quickLinks === null || quickLinks === void 0 ? void 0 : quickLinks.map(function (_a, i) {
|
|
3641
|
+
var text = _a.text, href = _a.href, onClick = _a.onClick;
|
|
3642
|
+
return (React__default.createElement("li", { className: classNames("arc-NavigationHeaderSearchMenu-listItem", {
|
|
3643
|
+
"arc-NavigationHeaderSearchMenu-listItem--highlighted": highlightedOptionIndex === i,
|
|
3644
|
+
}), role: "option", "aria-label": text, onMouseMove: function () { return setHighlightedOptionIndex(i); }, "aria-selected": highlightedOptionIndex === i, id: "".concat(listBoxId, "-").concat(i), key: "".concat(id, "-search-link-").concat(text, "-").concat(i) },
|
|
3645
|
+
React__default.createElement("div", { className: "arc-NavigationHeaderSearchMenu-linkContainer" },
|
|
3646
|
+
React__default.createElement(Heading, { size: "xxs" },
|
|
3647
|
+
React__default.createElement(SemanticLink, { className: "arc-NavigationHeaderSearchMenu-link", href: href, onClick: onClick, tabIndex: -1 }, text))),
|
|
3648
|
+
React__default.createElement("div", { className: "arc-NavigationHeaderSearchMenu-iconContainer" },
|
|
3649
|
+
React__default.createElement(ArrowRightIcon, null))));
|
|
3650
|
+
})))))));
|
|
3651
|
+
};
|
|
3652
|
+
var KeyNames;
|
|
3653
|
+
(function (KeyNames) {
|
|
3654
|
+
KeyNames["ArrowUp"] = "ArrowUp";
|
|
3655
|
+
KeyNames["ArrowDown"] = "ArrowDown";
|
|
3656
|
+
KeyNames["Home"] = "Home";
|
|
3657
|
+
KeyNames["Enter"] = "Enter";
|
|
3658
|
+
KeyNames["Escape"] = "Escape";
|
|
3659
|
+
KeyNames["Space"] = " ";
|
|
3660
|
+
})(KeyNames || (KeyNames = {}));
|
|
3661
|
+
|
|
3662
|
+
var NavigationHeaderBasket = function (_a) {
|
|
3663
|
+
var supportingCopy = _a.supportingCopy, onClick = _a.onClick, href = _a.href, _b = _a.popoverText, popoverText = _b === void 0 ? "No items in basket" : _b, _c = _a.title, title = _c === void 0 ? "Basket" : _c, _d = _a.ariaLabel, ariaLabel = _d === void 0 ? "Basket, empty" : _d, _e = _a.isAttention, isAttention = _e === void 0 ? false : _e;
|
|
3664
|
+
return isAttention ? (React__default.createElement(NavigationHeaderAction, { isAttention: true, href: href, title: title, onClick: onClick, supportingCopy: supportingCopy, ariaLabel: ariaLabel, icon: React__default.createElement(ThemeIcon, { icon: "navigationHeaderBasket", size: 24 }) })) : (React__default.createElement(NavigationHeaderDropdown, { tooltip: title, ariaLabel: ariaLabel, onClick: onClick, trigger: React__default.createElement("div", { className: "arc-NavigationHeaderBasket-trigger" },
|
|
3665
|
+
React__default.createElement(ThemeIcon, { icon: "navigationHeaderBasket", size: 24 })) }, popoverText));
|
|
3666
|
+
};
|
|
3667
|
+
|
|
1397
3668
|
var NavigationHeaderActionBar = function (_a) {
|
|
1398
3669
|
var children = _a.children;
|
|
1399
|
-
var id = useId();
|
|
3670
|
+
var id = useId$1();
|
|
1400
3671
|
var items = React__default.Children.map(children, function (child, i) { return (React__default.createElement("li", { key: "".concat(id, "-navigation-header-bar-action-item-").concat(i) }, child)); });
|
|
1401
3672
|
return React__default.createElement("ul", { className: "arc-NavigationHeaderActionBar" }, items);
|
|
1402
3673
|
};
|
|
@@ -1415,4 +3686,4 @@ var NavigationHeaderPage = function (_a) {
|
|
|
1415
3686
|
React__default.createElement(Text, null, page))))));
|
|
1416
3687
|
};
|
|
1417
3688
|
|
|
1418
|
-
export { NavigationHeader, NavigationHeaderAction, NavigationHeaderActionBar, NavigationHeaderPage };
|
|
3689
|
+
export { NavigationHeader, NavigationHeaderAction, NavigationHeaderActionBar, NavigationHeaderBasket, NavigationHeaderPage, NavigationHeaderSearchMenu };
|