@launchpad-ui/dropdown 0.5.3 → 0.5.4-alpha.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@launchpad-ui/dropdown",
3
- "version": "0.5.3",
3
+ "version": "0.5.4-alpha.0",
4
4
  "status": "beta",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -26,8 +26,8 @@
26
26
  "source": "src/index.ts",
27
27
  "dependencies": {
28
28
  "@launchpad-ui/button": "~0.7.1",
29
- "@launchpad-ui/icons": "~0.5.3",
30
- "@launchpad-ui/popover": "~0.8.3",
29
+ "@launchpad-ui/icons": "~0.5.4-alpha.0",
30
+ "@launchpad-ui/popover": "~0.8.4-alpha.0",
31
31
  "@launchpad-ui/tokens": "~0.1.5",
32
32
  "classix": "^2.1.13"
33
33
  },
@@ -42,7 +42,6 @@
42
42
  "scripts": {
43
43
  "build": "vite build -c ../../vite.config.ts && tsc --project tsconfig.build.json",
44
44
  "clean": "rm -rf dist",
45
- "e2e": "playwright test --config=../../playwright.config.ct.ts",
46
45
  "lint": "eslint '**/*.{ts,tsx,js}'",
47
46
  "test": "vitest run --coverage"
48
47
  }
@@ -1,13 +0,0 @@
1
- /// <reference types="react" />
2
- import type { PopoverProps } from '@launchpad-ui/popover';
3
- declare type DropdownState = {
4
- isOpen?: boolean;
5
- };
6
- declare type DropdownProps<T extends string | object | number> = PopoverProps & {
7
- onSelect?: (item: T, stateChanges: DropdownState) => void;
8
- onStateChange?: (state: DropdownState) => void;
9
- };
10
- declare const Dropdown: <T extends string | number | object>(props: DropdownProps<T>) => JSX.Element;
11
- export { Dropdown };
12
- export type { DropdownProps };
13
- //# sourceMappingURL=Dropdown.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Dropdown.d.ts","sourceRoot":"","sources":["../src/Dropdown.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAO1D,aAAK,aAAa,GAAG;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,aAAK,aAAa,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,IAAI,YAAY,GAAG;IACtE,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,YAAY,EAAE,aAAa,KAAK,IAAI,CAAC;IAC1D,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;CAChD,CAAC;AAEF,QAAA,MAAM,QAAQ,8EAsGb,CAAC;AAEF,OAAO,EAAE,QAAQ,EAAE,CAAC;AACpB,YAAY,EAAE,aAAa,EAAE,CAAC"}
@@ -1,26 +0,0 @@
1
- /// <reference types="react" />
2
- import type { ButtonProps } from '@launchpad-ui/button';
3
- declare type DropdownButtonProps = ButtonProps & {
4
- hideCaret?: boolean;
5
- };
6
- declare const DropdownButton: import("react").ForwardRefExoticComponent<import("react").ButtonHTMLAttributes<HTMLButtonElement> & {
7
- isLoading?: boolean | undefined;
8
- loadingText?: string | JSX.Element | undefined;
9
- size?: "big" | "small" | "normal" | "tiny" | undefined;
10
- kind?: "link" | "default" | "close" | "primary" | "destructive" | "minimal" | undefined;
11
- fit?: boolean | undefined;
12
- disabled?: boolean | undefined;
13
- icon?: import("react").ReactElement<{
14
- size?: string | undefined;
15
- key: string;
16
- 'aria-hidden': boolean;
17
- }, string | import("react").JSXElementConstructor<any>> | undefined;
18
- renderIconFirst?: boolean | undefined;
19
- asChild?: boolean | undefined;
20
- 'data-test-id'?: string | undefined;
21
- } & {
22
- hideCaret?: boolean | undefined;
23
- } & import("react").RefAttributes<HTMLButtonElement>>;
24
- export { DropdownButton };
25
- export type { DropdownButtonProps };
26
- //# sourceMappingURL=DropdownButton.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DropdownButton.d.ts","sourceRoot":"","sources":["../src/DropdownButton.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAMxD,aAAK,mBAAmB,GAAG,WAAW,GAAG;IACvC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,QAAA,MAAM,cAAc;;;;;;;;;;;;;;;;;qDAQlB,CAAC;AAIH,OAAO,EAAE,cAAc,EAAE,CAAC;AAC1B,YAAY,EAAE,mBAAmB,EAAE,CAAC"}
package/dist/index.d.ts DELETED
@@ -1,5 +0,0 @@
1
- export type { DropdownProps } from './Dropdown';
2
- export type { DropdownButtonProps } from './DropdownButton';
3
- export { Dropdown } from './Dropdown';
4
- export { DropdownButton } from './DropdownButton';
5
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
package/dist/index.es.js DELETED
@@ -1,113 +0,0 @@
1
- import { Popover } from "@launchpad-ui/popover";
2
- import { cx } from "classix";
3
- import { useRef, useState, useEffect, cloneElement, Children, forwardRef } from "react";
4
- import { jsxs, jsx } from "react/jsx-runtime";
5
- import { Button } from "@launchpad-ui/button";
6
- import { ExpandMore } from "@launchpad-ui/icons";
7
- const Dropdown = (props) => {
8
- const {
9
- placement,
10
- disabled,
11
- targetClassName,
12
- popoverClassName,
13
- isOpen: isOpenProp,
14
- onInteraction,
15
- onSelect,
16
- onStateChange,
17
- children,
18
- "data-test-id": testId = "dropdown",
19
- ...rest
20
- } = props;
21
- const triggerRef = useRef(null);
22
- const [isOpen, setIsOpen] = useState(isOpenProp != null ? isOpenProp : false);
23
- const [hasOpened, setHasOpened] = useState(isOpen);
24
- useEffect(() => {
25
- if (isOpenProp !== void 0) {
26
- setIsOpen(isOpenProp);
27
- }
28
- }, [isOpenProp]);
29
- useEffect(() => {
30
- if (hasOpened && isOpen === false) {
31
- setTimeout(() => {
32
- var _a, _b;
33
- const current = triggerRef.current;
34
- if (!current) {
35
- return;
36
- }
37
- const hasModal = (_a = current.closest) == null ? void 0 : _a.call(current, ".has-modal");
38
- !hasModal && ((_b = current.focus) == null ? void 0 : _b.call(current));
39
- });
40
- }
41
- }, [isOpen, hasOpened]);
42
- useEffect(() => {
43
- setHasOpened(isOpen);
44
- onStateChange == null ? void 0 : onStateChange({
45
- isOpen
46
- });
47
- }, [isOpen]);
48
- const renderTrigger = () => {
49
- return cloneElement(parseChildren().target, {
50
- "aria-haspopup": true,
51
- "aria-expanded": isOpen ? true : false,
52
- ref: triggerRef,
53
- isopen: isOpen == null ? void 0 : isOpen.toString()
54
- });
55
- };
56
- const renderContent = () => {
57
- return cloneElement(parseChildren().content, {
58
- onSelect: handleSelect
59
- });
60
- };
61
- const handleSelect = (item) => {
62
- setIsOpen(false);
63
- onSelect == null ? void 0 : onSelect(item, {
64
- isOpen: false
65
- });
66
- };
67
- const handlePopoverInteraction = (nextIsOpen) => {
68
- setIsOpen(nextIsOpen);
69
- };
70
- const parseChildren = () => {
71
- const [targetChild, contentChild] = Children.toArray(children);
72
- return {
73
- target: targetChild,
74
- content: contentChild
75
- };
76
- };
77
- const popoverTargetClasses = cx("Dropdown-target", targetClassName);
78
- const popoverClasses = cx("Dropdown", popoverClassName);
79
- return /* @__PURE__ */ jsxs(Popover, {
80
- isOpen,
81
- placement,
82
- onInteraction: onInteraction || handlePopoverInteraction,
83
- restrictHeight: false,
84
- disabled,
85
- targetClassName: popoverTargetClasses,
86
- popoverClassName: popoverClasses,
87
- "data-test-id": testId,
88
- ...rest,
89
- children: [renderTrigger(), renderContent()]
90
- });
91
- };
92
- const DropdownButton = forwardRef((props, ref) => {
93
- const {
94
- children,
95
- hideCaret,
96
- "data-test-id": testId = "dropdown-button",
97
- ...rest
98
- } = props;
99
- return /* @__PURE__ */ jsxs(Button, {
100
- ...rest,
101
- "data-test-id": testId,
102
- ref,
103
- children: [children, " ", !hideCaret && /* @__PURE__ */ jsx(ExpandMore, {
104
- size: "small"
105
- })]
106
- });
107
- });
108
- DropdownButton.displayName = "DropdownButton";
109
- export {
110
- Dropdown,
111
- DropdownButton
112
- };
113
- //# sourceMappingURL=index.es.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.es.js","sources":["../src/Dropdown.tsx","../src/DropdownButton.tsx"],"sourcesContent":["import type { PopoverProps } from '@launchpad-ui/popover';\nimport type { ReactElement } from 'react';\n\nimport { Popover } from '@launchpad-ui/popover';\nimport { cx } from 'classix';\nimport { Children, cloneElement, useEffect, useRef, useState } from 'react';\n\ntype DropdownState = {\n isOpen?: boolean;\n};\n\ntype DropdownProps<T extends string | object | number> = PopoverProps & {\n onSelect?: (item: T, stateChanges: DropdownState) => void;\n onStateChange?: (state: DropdownState) => void;\n};\n\nconst Dropdown = <T extends string | object | number>(props: DropdownProps<T>) => {\n const {\n placement,\n disabled,\n targetClassName,\n popoverClassName,\n isOpen: isOpenProp,\n onInteraction,\n onSelect,\n onStateChange,\n children,\n 'data-test-id': testId = 'dropdown',\n ...rest\n } = props;\n\n const triggerRef = useRef<HTMLElement>(null);\n const [isOpen, setIsOpen] = useState(isOpenProp ?? false);\n const [hasOpened, setHasOpened] = useState(isOpen);\n\n useEffect(() => {\n if (isOpenProp !== undefined) {\n setIsOpen(isOpenProp);\n }\n }, [isOpenProp]);\n\n useEffect(() => {\n // Focus the button upon closing for convenient tabbing\n if (hasOpened && isOpen === false) {\n setTimeout(() => {\n const current = triggerRef.current;\n if (!current) {\n return;\n }\n\n // If a dropdown menu item triggers a modal, we do not want to focus the trigger. Instead\n // we let the modal components control their own focus.\n // Note that this is not ideal since closing the modal will not cause the dropdown trigger\n // to regain focus.\n const hasModal = current.closest?.('.has-modal');\n\n !hasModal && current.focus?.();\n });\n }\n }, [isOpen, hasOpened]);\n\n useEffect(() => {\n setHasOpened(isOpen);\n onStateChange?.({ isOpen });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen]);\n\n const renderTrigger = () => {\n return cloneElement(parseChildren().target, {\n 'aria-haspopup': true,\n 'aria-expanded': isOpen ? true : false,\n ref: triggerRef,\n isopen: isOpen?.toString(),\n });\n };\n\n const renderContent = () => {\n return cloneElement(parseChildren().content, {\n onSelect: handleSelect,\n });\n };\n\n const handleSelect = (item: T) => {\n setIsOpen(false);\n onSelect?.(item, { isOpen: false });\n };\n\n const handlePopoverInteraction = (nextIsOpen: boolean) => {\n setIsOpen(nextIsOpen);\n };\n\n const parseChildren = () => {\n const [targetChild, contentChild] = Children.toArray(children);\n return {\n target: targetChild as ReactElement,\n content: contentChild as ReactElement,\n };\n };\n\n const popoverTargetClasses = cx('Dropdown-target', targetClassName);\n const popoverClasses = cx('Dropdown', popoverClassName);\n\n return (\n <Popover\n isOpen={isOpen}\n placement={placement}\n onInteraction={onInteraction || handlePopoverInteraction}\n restrictHeight={false}\n disabled={disabled}\n targetClassName={popoverTargetClasses}\n popoverClassName={popoverClasses}\n data-test-id={testId}\n {...rest}\n >\n {renderTrigger()}\n {renderContent()}\n </Popover>\n );\n};\n\nexport { Dropdown };\nexport type { DropdownProps };\n","import type { ButtonProps } from '@launchpad-ui/button';\n\nimport { Button } from '@launchpad-ui/button';\nimport { ExpandMore } from '@launchpad-ui/icons';\nimport { forwardRef } from 'react';\n\ntype DropdownButtonProps = ButtonProps & {\n hideCaret?: boolean;\n};\n\nconst DropdownButton = forwardRef<HTMLButtonElement, DropdownButtonProps>((props, ref) => {\n const { children, hideCaret, 'data-test-id': testId = 'dropdown-button', ...rest } = props;\n\n return (\n <Button {...rest} data-test-id={testId} ref={ref}>\n {children} {!hideCaret && <ExpandMore size=\"small\" />}\n </Button>\n );\n});\n\nDropdownButton.displayName = 'DropdownButton';\n\nexport { DropdownButton };\nexport type { DropdownButtonProps };\n"],"names":["Dropdown","props","placement","disabled","targetClassName","popoverClassName","isOpen","isOpenProp","onInteraction","onSelect","onStateChange","children","testId","rest","triggerRef","useRef","setIsOpen","useState","hasOpened","setHasOpened","useEffect","undefined","setTimeout","current","hasModal","closest","focus","renderTrigger","cloneElement","parseChildren","target","ref","isopen","toString","renderContent","content","handleSelect","item","handlePopoverInteraction","nextIsOpen","targetChild","contentChild","Children","toArray","popoverTargetClasses","cx","popoverClasses","DropdownButton","forwardRef","hideCaret","displayName"],"mappings":"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"}
package/dist/index.js DELETED
@@ -1,113 +0,0 @@
1
- "use strict";
2
- Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
- const popover = require("@launchpad-ui/popover");
4
- const classix = require("classix");
5
- const react = require("react");
6
- const jsxRuntime = require("react/jsx-runtime");
7
- const button = require("@launchpad-ui/button");
8
- const icons = require("@launchpad-ui/icons");
9
- const Dropdown = (props) => {
10
- const {
11
- placement,
12
- disabled,
13
- targetClassName,
14
- popoverClassName,
15
- isOpen: isOpenProp,
16
- onInteraction,
17
- onSelect,
18
- onStateChange,
19
- children,
20
- "data-test-id": testId = "dropdown",
21
- ...rest
22
- } = props;
23
- const triggerRef = react.useRef(null);
24
- const [isOpen, setIsOpen] = react.useState(isOpenProp != null ? isOpenProp : false);
25
- const [hasOpened, setHasOpened] = react.useState(isOpen);
26
- react.useEffect(() => {
27
- if (isOpenProp !== void 0) {
28
- setIsOpen(isOpenProp);
29
- }
30
- }, [isOpenProp]);
31
- react.useEffect(() => {
32
- if (hasOpened && isOpen === false) {
33
- setTimeout(() => {
34
- var _a, _b;
35
- const current = triggerRef.current;
36
- if (!current) {
37
- return;
38
- }
39
- const hasModal = (_a = current.closest) == null ? void 0 : _a.call(current, ".has-modal");
40
- !hasModal && ((_b = current.focus) == null ? void 0 : _b.call(current));
41
- });
42
- }
43
- }, [isOpen, hasOpened]);
44
- react.useEffect(() => {
45
- setHasOpened(isOpen);
46
- onStateChange == null ? void 0 : onStateChange({
47
- isOpen
48
- });
49
- }, [isOpen]);
50
- const renderTrigger = () => {
51
- return react.cloneElement(parseChildren().target, {
52
- "aria-haspopup": true,
53
- "aria-expanded": isOpen ? true : false,
54
- ref: triggerRef,
55
- isopen: isOpen == null ? void 0 : isOpen.toString()
56
- });
57
- };
58
- const renderContent = () => {
59
- return react.cloneElement(parseChildren().content, {
60
- onSelect: handleSelect
61
- });
62
- };
63
- const handleSelect = (item) => {
64
- setIsOpen(false);
65
- onSelect == null ? void 0 : onSelect(item, {
66
- isOpen: false
67
- });
68
- };
69
- const handlePopoverInteraction = (nextIsOpen) => {
70
- setIsOpen(nextIsOpen);
71
- };
72
- const parseChildren = () => {
73
- const [targetChild, contentChild] = react.Children.toArray(children);
74
- return {
75
- target: targetChild,
76
- content: contentChild
77
- };
78
- };
79
- const popoverTargetClasses = classix.cx("Dropdown-target", targetClassName);
80
- const popoverClasses = classix.cx("Dropdown", popoverClassName);
81
- return /* @__PURE__ */ jsxRuntime.jsxs(popover.Popover, {
82
- isOpen,
83
- placement,
84
- onInteraction: onInteraction || handlePopoverInteraction,
85
- restrictHeight: false,
86
- disabled,
87
- targetClassName: popoverTargetClasses,
88
- popoverClassName: popoverClasses,
89
- "data-test-id": testId,
90
- ...rest,
91
- children: [renderTrigger(), renderContent()]
92
- });
93
- };
94
- const DropdownButton = react.forwardRef((props, ref) => {
95
- const {
96
- children,
97
- hideCaret,
98
- "data-test-id": testId = "dropdown-button",
99
- ...rest
100
- } = props;
101
- return /* @__PURE__ */ jsxRuntime.jsxs(button.Button, {
102
- ...rest,
103
- "data-test-id": testId,
104
- ref,
105
- children: [children, " ", !hideCaret && /* @__PURE__ */ jsxRuntime.jsx(icons.ExpandMore, {
106
- size: "small"
107
- })]
108
- });
109
- });
110
- DropdownButton.displayName = "DropdownButton";
111
- exports.Dropdown = Dropdown;
112
- exports.DropdownButton = DropdownButton;
113
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":["../src/Dropdown.tsx","../src/DropdownButton.tsx"],"sourcesContent":["import type { PopoverProps } from '@launchpad-ui/popover';\nimport type { ReactElement } from 'react';\n\nimport { Popover } from '@launchpad-ui/popover';\nimport { cx } from 'classix';\nimport { Children, cloneElement, useEffect, useRef, useState } from 'react';\n\ntype DropdownState = {\n isOpen?: boolean;\n};\n\ntype DropdownProps<T extends string | object | number> = PopoverProps & {\n onSelect?: (item: T, stateChanges: DropdownState) => void;\n onStateChange?: (state: DropdownState) => void;\n};\n\nconst Dropdown = <T extends string | object | number>(props: DropdownProps<T>) => {\n const {\n placement,\n disabled,\n targetClassName,\n popoverClassName,\n isOpen: isOpenProp,\n onInteraction,\n onSelect,\n onStateChange,\n children,\n 'data-test-id': testId = 'dropdown',\n ...rest\n } = props;\n\n const triggerRef = useRef<HTMLElement>(null);\n const [isOpen, setIsOpen] = useState(isOpenProp ?? false);\n const [hasOpened, setHasOpened] = useState(isOpen);\n\n useEffect(() => {\n if (isOpenProp !== undefined) {\n setIsOpen(isOpenProp);\n }\n }, [isOpenProp]);\n\n useEffect(() => {\n // Focus the button upon closing for convenient tabbing\n if (hasOpened && isOpen === false) {\n setTimeout(() => {\n const current = triggerRef.current;\n if (!current) {\n return;\n }\n\n // If a dropdown menu item triggers a modal, we do not want to focus the trigger. Instead\n // we let the modal components control their own focus.\n // Note that this is not ideal since closing the modal will not cause the dropdown trigger\n // to regain focus.\n const hasModal = current.closest?.('.has-modal');\n\n !hasModal && current.focus?.();\n });\n }\n }, [isOpen, hasOpened]);\n\n useEffect(() => {\n setHasOpened(isOpen);\n onStateChange?.({ isOpen });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen]);\n\n const renderTrigger = () => {\n return cloneElement(parseChildren().target, {\n 'aria-haspopup': true,\n 'aria-expanded': isOpen ? true : false,\n ref: triggerRef,\n isopen: isOpen?.toString(),\n });\n };\n\n const renderContent = () => {\n return cloneElement(parseChildren().content, {\n onSelect: handleSelect,\n });\n };\n\n const handleSelect = (item: T) => {\n setIsOpen(false);\n onSelect?.(item, { isOpen: false });\n };\n\n const handlePopoverInteraction = (nextIsOpen: boolean) => {\n setIsOpen(nextIsOpen);\n };\n\n const parseChildren = () => {\n const [targetChild, contentChild] = Children.toArray(children);\n return {\n target: targetChild as ReactElement,\n content: contentChild as ReactElement,\n };\n };\n\n const popoverTargetClasses = cx('Dropdown-target', targetClassName);\n const popoverClasses = cx('Dropdown', popoverClassName);\n\n return (\n <Popover\n isOpen={isOpen}\n placement={placement}\n onInteraction={onInteraction || handlePopoverInteraction}\n restrictHeight={false}\n disabled={disabled}\n targetClassName={popoverTargetClasses}\n popoverClassName={popoverClasses}\n data-test-id={testId}\n {...rest}\n >\n {renderTrigger()}\n {renderContent()}\n </Popover>\n );\n};\n\nexport { Dropdown };\nexport type { DropdownProps };\n","import type { ButtonProps } from '@launchpad-ui/button';\n\nimport { Button } from '@launchpad-ui/button';\nimport { ExpandMore } from '@launchpad-ui/icons';\nimport { forwardRef } from 'react';\n\ntype DropdownButtonProps = ButtonProps & {\n hideCaret?: boolean;\n};\n\nconst DropdownButton = forwardRef<HTMLButtonElement, DropdownButtonProps>((props, ref) => {\n const { children, hideCaret, 'data-test-id': testId = 'dropdown-button', ...rest } = props;\n\n return (\n <Button {...rest} data-test-id={testId} ref={ref}>\n {children} {!hideCaret && <ExpandMore size=\"small\" />}\n </Button>\n );\n});\n\nDropdownButton.displayName = 'DropdownButton';\n\nexport { DropdownButton };\nexport type { DropdownButtonProps };\n"],"names":["Dropdown","props","placement","disabled","targetClassName","popoverClassName","isOpen","isOpenProp","onInteraction","onSelect","onStateChange","children","testId","rest","triggerRef","useRef","setIsOpen","useState","hasOpened","setHasOpened","useEffect","undefined","setTimeout","current","hasModal","closest","focus","renderTrigger","cloneElement","parseChildren","target","ref","isopen","toString","renderContent","content","handleSelect","item","handlePopoverInteraction","nextIsOpen","targetChild","contentChild","Children","toArray","popoverTargetClasses","cx","popoverClasses","Popover","DropdownButton","forwardRef","hideCaret","Button","ExpandMore","displayName"],"mappings":"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"}