@elliemae/ds-legacy-app-picker 1.0.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/cjs/AppPickerImpl.js +165 -0
  2. package/dist/cjs/AppPickerImpl.js.map +7 -0
  3. package/dist/cjs/DSAppPicker.js +175 -0
  4. package/dist/cjs/DSAppPicker.js.map +7 -0
  5. package/dist/cjs/DSAppPickerDefinitions.js +52 -0
  6. package/dist/cjs/DSAppPickerDefinitions.js.map +7 -0
  7. package/dist/cjs/hooks/useKeepTrackButtons.js +70 -0
  8. package/dist/cjs/hooks/useKeepTrackButtons.js.map +7 -0
  9. package/dist/cjs/index.js +43 -0
  10. package/dist/cjs/index.js.map +7 -0
  11. package/dist/cjs/package.json +7 -0
  12. package/dist/cjs/react-desc-prop-types.js +69 -0
  13. package/dist/cjs/react-desc-prop-types.js.map +7 -0
  14. package/dist/cjs/styles.js +77 -0
  15. package/dist/cjs/styles.js.map +7 -0
  16. package/dist/cjs/utils.js +55 -0
  17. package/dist/cjs/utils.js.map +7 -0
  18. package/dist/esm/AppPickerImpl.js +135 -0
  19. package/dist/esm/AppPickerImpl.js.map +7 -0
  20. package/dist/esm/DSAppPicker.js +145 -0
  21. package/dist/esm/DSAppPicker.js.map +7 -0
  22. package/dist/esm/DSAppPickerDefinitions.js +22 -0
  23. package/dist/esm/DSAppPickerDefinitions.js.map +7 -0
  24. package/dist/esm/hooks/useKeepTrackButtons.js +40 -0
  25. package/dist/esm/hooks/useKeepTrackButtons.js.map +7 -0
  26. package/dist/esm/index.js +13 -0
  27. package/dist/esm/index.js.map +7 -0
  28. package/dist/esm/package.json +7 -0
  29. package/dist/esm/react-desc-prop-types.js +39 -0
  30. package/dist/esm/react-desc-prop-types.js.map +7 -0
  31. package/dist/esm/styles.js +47 -0
  32. package/dist/esm/styles.js.map +7 -0
  33. package/dist/esm/utils.js +25 -0
  34. package/dist/esm/utils.js.map +7 -0
  35. package/dist/types/AppPickerImpl.d.ts +11 -0
  36. package/dist/types/DSAppPicker.d.ts +6 -0
  37. package/dist/types/DSAppPickerDefinitions.d.ts +15 -0
  38. package/dist/types/hooks/useKeepTrackButtons.d.ts +13 -0
  39. package/dist/types/index.d.ts +4 -0
  40. package/dist/types/react-desc-prop-types.d.ts +48 -0
  41. package/dist/types/styles.d.ts +8 -0
  42. package/dist/types/tests/AppPicker.test.d.ts +1 -0
  43. package/dist/types/tests/a11y/axe.test.d.ts +1 -0
  44. package/dist/types/utils.d.ts +14 -0
  45. package/package.json +97 -0
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var react_desc_prop_types_exports = {};
30
+ __export(react_desc_prop_types_exports, {
31
+ DSAppPickerPropTypes: () => DSAppPickerPropTypes,
32
+ defaultProps: () => defaultProps
33
+ });
34
+ module.exports = __toCommonJS(react_desc_prop_types_exports);
35
+ var React = __toESM(require("react"));
36
+ var import_jsx_runtime = require("react/jsx-runtime");
37
+ var import_ds_legacy_icons = require("@elliemae/ds-legacy-icons");
38
+ var import_ds_legacy_props_helpers = require("@elliemae/ds-legacy-props-helpers");
39
+ const defaultProps = {
40
+ apps: [],
41
+ customApps: [],
42
+ sectionTitle: "APPLICATIONS",
43
+ customSectionTitle: "CUSTOM APPLICATIONS",
44
+ icon: () => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_ds_legacy_icons.MenuPicker, { color: ["brand-primary", "700"], size: "m" })
45
+ };
46
+ const DSAppPickerPropTypes = {
47
+ apps: import_ds_legacy_props_helpers.PropTypes.array.description(
48
+ "Main items. Format: [{ label:string, icon:component, onClick:func, disabled:bool, selected:bool }]"
49
+ ).isRequired,
50
+ customApps: import_ds_legacy_props_helpers.PropTypes.array.description(
51
+ "Custom items. Format: [{ label:string, icon:component, onClick:func, disabled:bool, selected:bool }]"
52
+ ),
53
+ sectionTitle: import_ds_legacy_props_helpers.PropTypes.string.description("main section title").defaultValue("APPLICATIONS"),
54
+ customSectionTitle: import_ds_legacy_props_helpers.PropTypes.string.description("custom section title").defaultValue("CUSTOM APPLICATIONS"),
55
+ icon: import_ds_legacy_props_helpers.PropTypes.func.description("trigger button s icon").defaultValue(import_ds_legacy_icons.MenuPicker),
56
+ renderTrigger: import_ds_legacy_props_helpers.PropTypes.func.description("Custom trigger component."),
57
+ actionRef: import_ds_legacy_props_helpers.PropTypes.oneOfType([import_ds_legacy_props_helpers.PropTypes.func, import_ds_legacy_props_helpers.PropTypes.shape({ current: import_ds_legacy_props_helpers.PropTypes.any })]).description(
58
+ "Ref containing a focusToIndex method. This method allows you to focus any App inside the AppPicker."
59
+ ),
60
+ isOpen: import_ds_legacy_props_helpers.PropTypes.bool.description("Wether the AppPicker should be open or not."),
61
+ onClose: import_ds_legacy_props_helpers.PropTypes.func.description("Callback function when the AppPicker closes"),
62
+ onKeyDown: import_ds_legacy_props_helpers.PropTypes.func.description("OnKeyDown handler callback."),
63
+ onClick: import_ds_legacy_props_helpers.PropTypes.func.description("Custom onClick for Trigger component."),
64
+ onClickOutside: import_ds_legacy_props_helpers.PropTypes.func.description("Callback event when the user clicks outside the App Picker."),
65
+ triggerRef: import_ds_legacy_props_helpers.PropTypes.oneOfType([import_ds_legacy_props_helpers.PropTypes.func, import_ds_legacy_props_helpers.PropTypes.shape({ current: import_ds_legacy_props_helpers.PropTypes.any })]).description(
66
+ "Ref to the trigger button."
67
+ )
68
+ };
69
+ //# sourceMappingURL=react-desc-prop-types.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/react-desc-prop-types.tsx", "../../../../../scripts/build/transpile/react-shim.js"],
4
+ "sourcesContent": ["import React from 'react';\nimport type { WeakValidationMap } from 'react';\nimport { MenuPicker } from '@elliemae/ds-legacy-icons';\nimport type { SvgIconT } from '@elliemae/ds-legacy-icons';\nimport type { GlobalAttributesT, XstyledProps } from '@elliemae/ds-legacy-props-helpers';\nimport { PropTypes } from '@elliemae/ds-legacy-props-helpers';\n\nexport declare namespace DSAppPickerT {\n export interface AppItem {\n label: string;\n icon: React.ComponentType<{ className: string; size: string }>;\n onClick?: (e: React.MouseEvent, item: AppItem) => void | null;\n disabled?: boolean;\n id?: string;\n selected?: boolean;\n }\n\n export type ActionRef = React.MutableRefObject<{\n focusToIndex?: (index: number) => void;\n focusSelectedOrFirstAvailable?: () => void;\n focusWrapper: () => void;\n }>;\n\n export interface DefaultProps {\n apps: AppItem[];\n customApps: AppItem[];\n sectionTitle: string;\n customSectionTitle: string;\n icon: React.ComponentType<SvgIconT.Props>;\n }\n\n interface RenderTriggerProp {\n ref: React.MutableRefObject<HTMLButtonElement>;\n [key: string]: unknown;\n }\n export interface OptionalProps {\n onClose?: () => void;\n onClick?: (e: React.MouseEvent | React.KeyboardEvent) => void;\n onClickOutside?: (e: React.MouseEvent) => void;\n onKeyDown?: (e: React.KeyboardEvent) => void;\n actionRef?: ActionRef;\n renderTrigger?: React.ComponentType<RenderTriggerProp>;\n isOpen?: boolean;\n triggerRef?: React.RefObject<HTMLButtonElement>;\n }\n\n export interface Props\n extends Partial<DefaultProps>,\n OptionalProps,\n Omit<GlobalAttributesT<HTMLDivElement>, keyof DefaultProps | keyof OptionalProps | keyof XstyledProps>,\n XstyledProps {}\n\n export interface InternalProps\n extends DefaultProps,\n OptionalProps,\n Omit<GlobalAttributesT<HTMLDivElement>, keyof DefaultProps | keyof OptionalProps | keyof XstyledProps>,\n XstyledProps {}\n}\n\nexport const defaultProps: DSAppPickerT.DefaultProps = {\n apps: [],\n customApps: [],\n sectionTitle: 'APPLICATIONS',\n customSectionTitle: 'CUSTOM APPLICATIONS',\n icon: () => <MenuPicker color={['brand-primary', '700']} size=\"m\" />,\n};\n\n// =============================================================================\n// PropTypes\n// =============================================================================\n\nexport const DSAppPickerPropTypes = {\n apps: PropTypes.array.description(\n 'Main items. Format: [{ label:string, icon:component, onClick:func, disabled:bool, selected:bool }]',\n ).isRequired,\n customApps: PropTypes.array.description(\n 'Custom items. Format: [{ label:string, icon:component, onClick:func, disabled:bool, selected:bool }]',\n ),\n sectionTitle: PropTypes.string.description('main section title').defaultValue('APPLICATIONS'),\n customSectionTitle: PropTypes.string.description('custom section title').defaultValue('CUSTOM APPLICATIONS'),\n icon: PropTypes.func.description('trigger button s icon').defaultValue(MenuPicker),\n renderTrigger: PropTypes.func.description('Custom trigger component.'),\n actionRef: PropTypes.oneOfType([PropTypes.func, PropTypes.shape({ current: PropTypes.any })]).description(\n 'Ref containing a focusToIndex method. This method allows you to focus any App inside the AppPicker.',\n ),\n isOpen: PropTypes.bool.description('Wether the AppPicker should be open or not.'),\n onClose: PropTypes.func.description('Callback function when the AppPicker closes'),\n onKeyDown: PropTypes.func.description('OnKeyDown handler callback.'),\n onClick: PropTypes.func.description('Custom onClick for Trigger component.'),\n onClickOutside: PropTypes.func.description('Callback event when the user clicks outside the App Picker.'),\n triggerRef: PropTypes.oneOfType([PropTypes.func, PropTypes.shape({ current: PropTypes.any })]).description(\n 'Ref to the trigger button.',\n ),\n} as WeakValidationMap<unknown>;\n", "import * as React from 'react';\nexport { React };\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACAA,YAAuB;ADgET;AA9Dd,6BAA2B;AAG3B,qCAA0B;AAsDnB,MAAM,eAA0C;AAAA,EACrD,MAAM,CAAC;AAAA,EACP,YAAY,CAAC;AAAA,EACb,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,MAAM,MAAM,4CAAC,qCAAW,OAAO,CAAC,iBAAiB,KAAK,GAAG,MAAK,KAAI;AACpE;AAMO,MAAM,uBAAuB;AAAA,EAClC,MAAM,yCAAU,MAAM;AAAA,IACpB;AAAA,EACF,EAAE;AAAA,EACF,YAAY,yCAAU,MAAM;AAAA,IAC1B;AAAA,EACF;AAAA,EACA,cAAc,yCAAU,OAAO,YAAY,oBAAoB,EAAE,aAAa,cAAc;AAAA,EAC5F,oBAAoB,yCAAU,OAAO,YAAY,sBAAsB,EAAE,aAAa,qBAAqB;AAAA,EAC3G,MAAM,yCAAU,KAAK,YAAY,uBAAuB,EAAE,aAAa,iCAAU;AAAA,EACjF,eAAe,yCAAU,KAAK,YAAY,2BAA2B;AAAA,EACrE,WAAW,yCAAU,UAAU,CAAC,yCAAU,MAAM,yCAAU,MAAM,EAAE,SAAS,yCAAU,IAAI,CAAC,CAAC,CAAC,EAAE;AAAA,IAC5F;AAAA,EACF;AAAA,EACA,QAAQ,yCAAU,KAAK,YAAY,6CAA6C;AAAA,EAChF,SAAS,yCAAU,KAAK,YAAY,6CAA6C;AAAA,EACjF,WAAW,yCAAU,KAAK,YAAY,6BAA6B;AAAA,EACnE,SAAS,yCAAU,KAAK,YAAY,uCAAuC;AAAA,EAC3E,gBAAgB,yCAAU,KAAK,YAAY,6DAA6D;AAAA,EACxG,YAAY,yCAAU,UAAU,CAAC,yCAAU,MAAM,yCAAU,MAAM,EAAE,SAAS,yCAAU,IAAI,CAAC,CAAC,CAAC,EAAE;AAAA,IAC7F;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var styles_exports = {};
30
+ __export(styles_exports, {
31
+ StyledListItem: () => StyledListItem,
32
+ StyledListItemFullRow: () => StyledListItemFullRow,
33
+ StyledSeparator: () => StyledSeparator,
34
+ StyledTitle: () => StyledTitle,
35
+ StyledWrapper: () => StyledWrapper
36
+ });
37
+ module.exports = __toCommonJS(styles_exports);
38
+ var React = __toESM(require("react"));
39
+ var import_ds_legacy_system = require("@elliemae/ds-legacy-system");
40
+ var import_ds_legacy_grid = require("@elliemae/ds-legacy-grid");
41
+ var import_DSAppPickerDefinitions = require("./DSAppPickerDefinitions.js");
42
+ const StyledWrapper = (0, import_ds_legacy_system.styled)(import_ds_legacy_grid.Grid, { name: import_DSAppPickerDefinitions.DSAppPickerName, slot: import_DSAppPickerDefinitions.DSAppPickerSlots.ROOT })`
43
+ align-items: center;
44
+ min-width: 308px;
45
+ min-height: 110px;
46
+ max-height: 449px;
47
+ width: 308px;
48
+ overflow-y: auto;
49
+ overflow-x: hidden;
50
+ margin: 0;
51
+ padding: ${({ isOverflow }) => isOverflow ? "0 0 8px 16px" : "0 16px 8px 16px"};
52
+ &:focus {
53
+ outline: none;
54
+ }
55
+ `;
56
+ const StyledListItem = (0, import_ds_legacy_system.styled)("li", { name: import_DSAppPickerDefinitions.DSAppPickerName, slot: import_DSAppPickerDefinitions.DSAppPickerSlots.ITEM })`
57
+ list-style: none;
58
+ `;
59
+ const StyledListItemFullRow = (0, import_ds_legacy_system.styled)("li", { name: import_DSAppPickerDefinitions.DSAppPickerName, slot: import_DSAppPickerDefinitions.DSAppPickerSlots.ROW })`
60
+ list-style: none;
61
+ grid-column: 1/4;
62
+ `;
63
+ const StyledTitle = (0, import_ds_legacy_system.styled)("h3", { name: import_DSAppPickerDefinitions.DSAppPickerName, slot: import_DSAppPickerDefinitions.DSAppPickerSlots.TITLE })`
64
+ color: ${({ theme }) => theme.colors.neutral[700]};
65
+ font-size: ${({ theme }) => theme.fontSizes.value[400]};
66
+ font-weight: ${({ theme }) => theme.fontWeights.semibold};
67
+ margin: 12px 0 8px 0;
68
+ line-height: 1.385;
69
+ text-transform: uppercase;
70
+ `;
71
+ const StyledSeparator = (0, import_ds_legacy_system.styled)("hr", { name: import_DSAppPickerDefinitions.DSAppPickerName, slot: import_DSAppPickerDefinitions.DSAppPickerSlots.SEPARATOR })`
72
+ border-top: 1px solid ${({ theme }) => theme.colors.neutral[100]};
73
+ border-bottom: none;
74
+ width: 99%;
75
+ margin: 8px 0 0 0;
76
+ `;
77
+ //# sourceMappingURL=styles.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/styles.tsx", "../../../../../scripts/build/transpile/react-shim.js"],
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable max-lines */\nimport { styled } from '@elliemae/ds-legacy-system';\nimport { Grid } from '@elliemae/ds-legacy-grid';\nimport { DSAppPickerName, DSAppPickerSlots } from './DSAppPickerDefinitions.js';\n\nexport const StyledWrapper = styled(Grid, { name: DSAppPickerName, slot: DSAppPickerSlots.ROOT })<{\n isOverflow: boolean;\n}>`\n align-items: center;\n min-width: 308px;\n min-height: 110px;\n max-height: 449px;\n width: 308px;\n overflow-y: auto;\n overflow-x: hidden;\n margin: 0;\n padding: ${({ isOverflow }) => (isOverflow ? '0 0 8px 16px' : '0 16px 8px 16px')};\n &:focus {\n outline: none;\n }\n`;\n\nexport const StyledListItem = styled('li', { name: DSAppPickerName, slot: DSAppPickerSlots.ITEM })`\n list-style: none;\n`;\n\nexport const StyledListItemFullRow = styled('li', { name: DSAppPickerName, slot: DSAppPickerSlots.ROW })`\n list-style: none;\n grid-column: 1/4;\n`;\n\nexport const StyledTitle = styled('h3', { name: DSAppPickerName, slot: DSAppPickerSlots.TITLE })`\n color: ${({ theme }) => theme.colors.neutral[700]};\n font-size: ${({ theme }) => theme.fontSizes.value[400]};\n font-weight: ${({ theme }) => theme.fontWeights.semibold};\n margin: 12px 0 8px 0;\n line-height: 1.385;\n text-transform: uppercase;\n`;\n\nexport const StyledSeparator = styled('hr', { name: DSAppPickerName, slot: DSAppPickerSlots.SEPARATOR })`\n border-top: 1px solid ${({ theme }) => theme.colors.neutral[100]};\n border-bottom: none;\n width: 99%;\n margin: 8px 0 0 0;\n`;\n", "import * as React from 'react';\nexport { React };\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACAA,YAAuB;ADEvB,8BAAuB;AACvB,4BAAqB;AACrB,oCAAkD;AAE3C,MAAM,oBAAgB,gCAAO,4BAAM,EAAE,MAAM,+CAAiB,MAAM,+CAAiB,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAWnF,CAAC,EAAE,WAAW,MAAO,aAAa,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAMzD,MAAM,qBAAiB,gCAAO,MAAM,EAAE,MAAM,+CAAiB,MAAM,+CAAiB,KAAK,CAAC;AAAA;AAAA;AAI1F,MAAM,4BAAwB,gCAAO,MAAM,EAAE,MAAM,+CAAiB,MAAM,+CAAiB,IAAI,CAAC;AAAA;AAAA;AAAA;AAKhG,MAAM,kBAAc,gCAAO,MAAM,EAAE,MAAM,+CAAiB,MAAM,+CAAiB,MAAM,CAAC;AAAA,WACpF,CAAC,EAAE,MAAM,MAAM,MAAM,OAAO,QAAQ,GAAG;AAAA,eACnC,CAAC,EAAE,MAAM,MAAM,MAAM,UAAU,MAAM,GAAG;AAAA,iBACtC,CAAC,EAAE,MAAM,MAAM,MAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAM3C,MAAM,sBAAkB,gCAAO,MAAM,EAAE,MAAM,+CAAiB,MAAM,+CAAiB,UAAU,CAAC;AAAA,0BAC7E,CAAC,EAAE,MAAM,MAAM,MAAM,OAAO,QAAQ,GAAG;AAAA;AAAA;AAAA;AAAA;",
6
+ "names": []
7
+ }
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var utils_exports = {};
30
+ __export(utils_exports, {
31
+ focusSelectedOrFirstAvailable: () => focusSelectedOrFirstAvailable,
32
+ keys: () => keys
33
+ });
34
+ module.exports = __toCommonJS(utils_exports);
35
+ var React = __toESM(require("react"));
36
+ const keys = {
37
+ LEFT: "ArrowLeft",
38
+ UP: "ArrowUp",
39
+ RIGHT: "ArrowRight",
40
+ DOWN: "ArrowDown",
41
+ ENTER: "Enter",
42
+ SPACE: "",
43
+ TAB: "Tab",
44
+ ESC: "Escape",
45
+ HOME: "Home",
46
+ END: "End"
47
+ };
48
+ const focusSelectedOrFirstAvailable = (wrapperRef, allFocusableButtonsRef, selectedButtonRef) => {
49
+ if (selectedButtonRef.current !== null) {
50
+ wrapperRef?.current?.querySelectorAll("button")[selectedButtonRef.current].focus();
51
+ } else {
52
+ allFocusableButtonsRef?.[0]?.focus();
53
+ }
54
+ };
55
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils.tsx", "../../../../../scripts/build/transpile/react-shim.js"],
4
+ "sourcesContent": ["import type React from 'react';\n\nexport const keys = {\n LEFT: 'ArrowLeft',\n UP: 'ArrowUp',\n RIGHT: 'ArrowRight',\n DOWN: 'ArrowDown',\n ENTER: 'Enter',\n SPACE: '',\n TAB: 'Tab',\n ESC: 'Escape',\n HOME: 'Home',\n END: 'End',\n};\n\nexport const focusSelectedOrFirstAvailable = (\n wrapperRef: React.RefObject<HTMLDivElement>,\n allFocusableButtonsRef: HTMLButtonElement[],\n selectedButtonRef: React.MutableRefObject<number | null>,\n) => {\n if (selectedButtonRef.current !== null) {\n wrapperRef?.current?.querySelectorAll('button')[selectedButtonRef.current].focus();\n } else {\n allFocusableButtonsRef?.[0]?.focus();\n }\n};\n", "import * as React from 'react';\nexport { React };\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACAA,YAAuB;ADEhB,MAAM,OAAO;AAAA,EAClB,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AACP;AAEO,MAAM,gCAAgC,CAC3C,YACA,wBACA,sBACG;AACH,MAAI,kBAAkB,YAAY,MAAM;AACtC,gBAAY,SAAS,iBAAiB,QAAQ,EAAE,kBAAkB,OAAO,EAAE,MAAM;AAAA,EACnF,OAAO;AACL,6BAAyB,CAAC,GAAG,MAAM;AAAA,EACrC;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,135 @@
1
+ import * as React from "react";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import { useCallback, useRef, useMemo } from "react";
4
+ import { DSChip } from "@elliemae/ds-legacy-chip";
5
+ import { keys } from "./utils.js";
6
+ import { StyledWrapper, StyledSeparator, StyledListItemFullRow, StyledListItem, StyledTitle } from "./styles.js";
7
+ import { useKeepTrackButtons } from "./hooks/useKeepTrackButtons.js";
8
+ import { DSAppPickerDataTestIds } from "./DSAppPickerDefinitions.js";
9
+ import { useFocusTrap } from "@elliemae/ds-legacy-utilities";
10
+ const AppPickerImpl = ({
11
+ apps,
12
+ customApps,
13
+ sectionTitle,
14
+ customSectionTitle,
15
+ close,
16
+ wrapperRef,
17
+ onKeyDown,
18
+ triggerRef,
19
+ isOverflow,
20
+ actionRef,
21
+ wasOpenedByKeyboardRef,
22
+ triggerIsInternal
23
+ }) => {
24
+ const { allFocusableButtons } = useKeepTrackButtons({
25
+ wrapperRef,
26
+ wasOpenedByKeyboardRef,
27
+ actionRef,
28
+ triggerIsInternal
29
+ });
30
+ const firstElementRef = useRef(null);
31
+ const lastElementRef = useRef(null);
32
+ const handleOnClick = useCallback(
33
+ (app) => (e) => {
34
+ if (app.onClick)
35
+ app.onClick(e, app);
36
+ },
37
+ []
38
+ );
39
+ const handleOnKeyDownWrapper = useCallback(
40
+ (e) => {
41
+ if (onKeyDown)
42
+ onKeyDown(e);
43
+ if (!onKeyDown && e.key === keys.ESC) {
44
+ triggerRef?.current?.focus();
45
+ close();
46
+ }
47
+ },
48
+ [onKeyDown, triggerRef, close]
49
+ );
50
+ firstElementRef.current = allFocusableButtons[0];
51
+ lastElementRef.current = allFocusableButtons[allFocusableButtons.length - 1];
52
+ const handleOnKeyDown = useFocusTrap({
53
+ firstElementRef,
54
+ lastElementRef,
55
+ onKeyDown: handleOnKeyDownWrapper
56
+ });
57
+ const totalAppsLength = useMemo(() => apps.length + customApps.length, [apps.length, customApps.length]);
58
+ const buildRows = useCallback(
59
+ (appList, prevIndex, title) => /* @__PURE__ */ jsx(Fragment, { children: appList.map((app, index) => {
60
+ const { label, disabled, selected, icon: Icon, id } = app;
61
+ const IconComp = () => /* @__PURE__ */ jsx(Icon, { className: "app-picker__icon", size: "m" });
62
+ return /* @__PURE__ */ jsx(StyledListItem, { role: "presentation", children: /* @__PURE__ */ jsx(
63
+ DSChip,
64
+ {
65
+ onClick: handleOnClick(app),
66
+ "data-testid": DSAppPickerDataTestIds.CHIP,
67
+ "aria-disabled": disabled,
68
+ disabled,
69
+ selected,
70
+ "aria-selected": selected,
71
+ role: "option",
72
+ id,
73
+ "aria-label": `${label}. ${title} (${index + prevIndex} of ${totalAppsLength})`,
74
+ icon: IconComp,
75
+ label
76
+ },
77
+ index
78
+ ) });
79
+ }) }),
80
+ [handleOnClick, totalAppsLength]
81
+ );
82
+ const AppsRows = useMemo(() => buildRows(apps, 1, sectionTitle), [apps, buildRows, sectionTitle]);
83
+ const CustomRows = useMemo(
84
+ () => buildRows(customApps, apps.length, customSectionTitle),
85
+ [apps.length, buildRows, customApps, customSectionTitle]
86
+ );
87
+ const layout = useMemo(() => {
88
+ const cols = ["repeat(3, 92px)"];
89
+ let appsRows = 0;
90
+ let customRows = 0;
91
+ const rows = [];
92
+ if (apps.length > 0) {
93
+ appsRows = apps.length / 3;
94
+ rows.push("68px", `repeat(${appsRows}, 68px})`);
95
+ }
96
+ if (customApps.length > 0) {
97
+ customRows = customApps.length / 3;
98
+ rows.push("9px", "68px", `repeat(${customRows}, 68px})`);
99
+ }
100
+ return {
101
+ rows,
102
+ cols
103
+ };
104
+ }, [apps.length, customApps.length]);
105
+ const convertedTypeReference = wrapperRef;
106
+ return /* @__PURE__ */ jsxs(
107
+ StyledWrapper,
108
+ {
109
+ forwardedAs: "ul",
110
+ role: "listbox",
111
+ ref: convertedTypeReference,
112
+ onKeyDown: handleOnKeyDown,
113
+ "data-testid": DSAppPickerDataTestIds.WRAPPER,
114
+ isOverflow,
115
+ cols: layout.cols,
116
+ rows: layout.rows,
117
+ tabIndex: -1,
118
+ "aria-label": `Application picker, ${sectionTitle} (${apps.length} apps)${customApps.length > 0 ? `, ${customSectionTitle} (${customApps.length} apps)` : ""}`,
119
+ children: [
120
+ /* @__PURE__ */ jsx(StyledListItemFullRow, { "aria-hidden": true, role: "group", children: /* @__PURE__ */ jsx(StyledTitle, { "data-testid": DSAppPickerDataTestIds.MAIN_TITLE, role: "presentation", children: sectionTitle }) }),
121
+ AppsRows,
122
+ customApps.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
123
+ /* @__PURE__ */ jsx(StyledListItemFullRow, { "aria-hidden": true, role: "group", children: /* @__PURE__ */ jsx(StyledSeparator, { role: "presentation" }) }),
124
+ /* @__PURE__ */ jsx(StyledListItemFullRow, { "aria-hidden": true, role: "group", children: /* @__PURE__ */ jsx(StyledTitle, { "data-testid": DSAppPickerDataTestIds.CUSTOM_TITLE, role: "presentation", children: customSectionTitle }) }),
125
+ CustomRows
126
+ ] })
127
+ ]
128
+ }
129
+ );
130
+ };
131
+ var AppPickerImpl_default = AppPickerImpl;
132
+ export {
133
+ AppPickerImpl_default as default
134
+ };
135
+ //# sourceMappingURL=AppPickerImpl.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../scripts/build/transpile/react-shim.js", "../../src/AppPickerImpl.tsx"],
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "/* eslint-disable max-lines */\n/* eslint-disable react/no-array-index-key */\nimport React, { useCallback, useRef, useMemo } from 'react';\nimport { DSChip } from '@elliemae/ds-legacy-chip';\nimport { keys } from './utils.js';\nimport { StyledWrapper, StyledSeparator, StyledListItemFullRow, StyledListItem, StyledTitle } from './styles.js';\nimport { useKeepTrackButtons } from './hooks/useKeepTrackButtons.js';\nimport type { DSAppPickerT } from './react-desc-prop-types.js';\nimport { DSAppPickerDataTestIds } from './DSAppPickerDefinitions.js';\nimport { useFocusTrap } from '@elliemae/ds-legacy-utilities';\n\ninterface AppPickerImplProps\n extends Omit<\n DSAppPickerT.InternalProps,\n 'onClose' | 'icon' | 'onClick' | 'onClickOutside' | 'renderTrigger' | 'isOpen'\n > {\n close: () => void;\n wrapperRef: React.RefObject<HTMLDivElement>;\n isOverflow: boolean;\n wasOpenedByKeyboardRef: React.MutableRefObject<boolean>;\n triggerIsInternal: boolean;\n}\n\nconst AppPickerImpl: React.ComponentType<AppPickerImplProps> = ({\n apps,\n customApps,\n sectionTitle,\n customSectionTitle,\n close,\n wrapperRef,\n onKeyDown,\n triggerRef,\n isOverflow,\n actionRef,\n wasOpenedByKeyboardRef,\n triggerIsInternal,\n}) => {\n const { allFocusableButtons } = useKeepTrackButtons({\n wrapperRef,\n wasOpenedByKeyboardRef,\n actionRef,\n triggerIsInternal,\n });\n\n const firstElementRef = useRef<HTMLElement | null>(null);\n const lastElementRef = useRef<HTMLElement | null>(null);\n\n const handleOnClick = useCallback(\n (app: DSAppPickerT.AppItem) => (e: React.MouseEvent) => {\n if (app.onClick) app.onClick(e, app);\n },\n [],\n );\n\n const handleOnKeyDownWrapper: React.KeyboardEventHandler = useCallback(\n (e) => {\n if (onKeyDown) onKeyDown(e);\n if (!onKeyDown && e.key === keys.ESC) {\n triggerRef?.current?.focus();\n close();\n }\n },\n [onKeyDown, triggerRef, close],\n );\n firstElementRef.current = allFocusableButtons[0];\n lastElementRef.current = allFocusableButtons[allFocusableButtons.length - 1];\n\n const handleOnKeyDown = useFocusTrap({\n firstElementRef,\n lastElementRef,\n onKeyDown: handleOnKeyDownWrapper,\n });\n\n const totalAppsLength = useMemo(() => apps.length + customApps.length, [apps.length, customApps.length]);\n\n const buildRows = useCallback(\n (appList: DSAppPickerT.AppItem[], prevIndex: number, title: string): JSX.Element => (\n <>\n {appList.map((app, index) => {\n const { label, disabled, selected, icon: Icon, id } = app;\n\n // eslint-disable-next-line react/no-unstable-nested-components\n const IconComp = () => <Icon className=\"app-picker__icon\" size=\"m\" />;\n\n return (\n <StyledListItem role=\"presentation\">\n <DSChip\n key={index}\n onClick={handleOnClick(app)}\n data-testid={DSAppPickerDataTestIds.CHIP}\n aria-disabled={disabled}\n disabled={disabled}\n selected={selected}\n aria-selected={selected}\n role=\"option\"\n id={id}\n aria-label={`${label}. ${title} (${index + prevIndex} of ${totalAppsLength})`}\n icon={IconComp}\n label={label}\n />\n </StyledListItem>\n );\n })}\n </>\n ),\n [handleOnClick, totalAppsLength],\n );\n\n const AppsRows = useMemo(() => buildRows(apps, 1, sectionTitle), [apps, buildRows, sectionTitle]);\n const CustomRows = useMemo(\n () => buildRows(customApps, apps.length, customSectionTitle),\n [apps.length, buildRows, customApps, customSectionTitle],\n );\n\n const layout = useMemo(() => {\n const cols = ['repeat(3, 92px)'];\n let appsRows = 0;\n let customRows = 0;\n const rows = [];\n if (apps.length > 0) {\n appsRows = apps.length / 3;\n rows.push('68px', `repeat(${appsRows}, 68px})`);\n }\n if (customApps.length > 0) {\n customRows = customApps.length / 3;\n rows.push('9px', '68px', `repeat(${customRows}, 68px})`);\n }\n return {\n rows,\n cols,\n };\n }, [apps.length, customApps.length]);\n\n // Needed just for typescript reasons\n const convertedTypeReference = wrapperRef as unknown as React.RefObject<HTMLDivElement> &\n React.RefObject<HTMLUListElement>;\n\n return (\n <StyledWrapper\n forwardedAs=\"ul\"\n role=\"listbox\"\n ref={convertedTypeReference}\n onKeyDown={handleOnKeyDown}\n data-testid={DSAppPickerDataTestIds.WRAPPER}\n isOverflow={isOverflow}\n cols={layout.cols}\n rows={layout.rows}\n tabIndex={-1}\n aria-label={`Application picker, ${sectionTitle} (${apps.length} apps)${\n customApps.length > 0 ? `, ${customSectionTitle} (${customApps.length} apps)` : ''\n }`}\n >\n <StyledListItemFullRow aria-hidden role=\"group\">\n <StyledTitle data-testid={DSAppPickerDataTestIds.MAIN_TITLE} role=\"presentation\">\n {sectionTitle}\n </StyledTitle>\n </StyledListItemFullRow>\n {AppsRows}\n {customApps.length > 0 && (\n <>\n <StyledListItemFullRow aria-hidden role=\"group\">\n <StyledSeparator role=\"presentation\" />\n </StyledListItemFullRow>\n <StyledListItemFullRow aria-hidden role=\"group\">\n <StyledTitle data-testid={DSAppPickerDataTestIds.CUSTOM_TITLE} role=\"presentation\">\n {customSectionTitle}\n </StyledTitle>\n </StyledListItemFullRow>\n {CustomRows}\n </>\n )}\n </StyledWrapper>\n );\n};\n\nexport default AppPickerImpl;\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,145 @@
1
+ import * as React from "react";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { useState, useEffect, useMemo, useRef, useCallback } from "react";
4
+ import { DSButtonV2 } from "@elliemae/ds-legacy-button-v2";
5
+ import { mergeRefs } from "@elliemae/ds-legacy-utilities";
6
+ import { describe, useMemoMergePropsWithDefault } from "@elliemae/ds-legacy-props-helpers";
7
+ import DSPopover from "@elliemae/ds-legacy-popover";
8
+ import AppPickerImpl from "./AppPickerImpl.js";
9
+ import { DSAppPickerPropTypes, defaultProps } from "./react-desc-prop-types.js";
10
+ import { DSAppPickerDataTestIds, DSAppPickerName } from "./DSAppPickerDefinitions.js";
11
+ const DSAppPicker = (props) => {
12
+ const propsWithDefault = useMemoMergePropsWithDefault(props, defaultProps);
13
+ const {
14
+ apps,
15
+ customApps,
16
+ sectionTitle,
17
+ customSectionTitle,
18
+ icon: Icon,
19
+ renderTrigger,
20
+ isOpen,
21
+ onClose,
22
+ actionRef,
23
+ onKeyDown,
24
+ onClick,
25
+ onClickOutside,
26
+ triggerRef
27
+ } = propsWithDefault;
28
+ const [open, setOpen] = useState(false);
29
+ const [isOverflow, setIsOverflow] = useState(false);
30
+ const wrapperRef = useRef(null);
31
+ const defaultTriggerRef = useRef(null);
32
+ const wasOpenedByKeyboardRef = useRef(false);
33
+ useEffect(() => {
34
+ if (actionRef && actionRef.current) {
35
+ actionRef.current.focusToIndex = (index) => {
36
+ if (wrapperRef.current) {
37
+ const parent = wrapperRef.current;
38
+ const buttons = [...parent.querySelectorAll("button")];
39
+ buttons[index].focus();
40
+ }
41
+ };
42
+ actionRef.current.focusWrapper = () => {
43
+ wrapperRef.current?.focus();
44
+ };
45
+ }
46
+ }, [actionRef, apps, customApps]);
47
+ useEffect(() => {
48
+ setTimeout(() => {
49
+ if (wrapperRef.current) {
50
+ const { scrollHeight, clientHeight } = wrapperRef.current;
51
+ if (scrollHeight > clientHeight)
52
+ return setIsOverflow(true);
53
+ }
54
+ return setIsOverflow(false);
55
+ });
56
+ }, [isOpen, open]);
57
+ const handleOnClose = useCallback(() => {
58
+ setOpen(false);
59
+ onClose?.();
60
+ }, [onClose]);
61
+ const handleOnClickOutside = (e) => {
62
+ setOpen(false);
63
+ onClose?.();
64
+ onClickOutside?.(e);
65
+ };
66
+ const AppPickerContent = useCallback(
67
+ () => /* @__PURE__ */ jsx(
68
+ AppPickerImpl,
69
+ {
70
+ apps,
71
+ customApps,
72
+ sectionTitle,
73
+ customSectionTitle,
74
+ close: handleOnClose,
75
+ wrapperRef,
76
+ onKeyDown,
77
+ triggerRef: triggerRef || defaultTriggerRef,
78
+ actionRef,
79
+ triggerIsInternal: !renderTrigger,
80
+ wasOpenedByKeyboardRef,
81
+ isOverflow
82
+ }
83
+ ),
84
+ [
85
+ actionRef,
86
+ apps,
87
+ customApps,
88
+ customSectionTitle,
89
+ handleOnClose,
90
+ isOverflow,
91
+ onKeyDown,
92
+ renderTrigger,
93
+ sectionTitle,
94
+ triggerRef
95
+ ]
96
+ );
97
+ const RenderTrigger = useMemo(
98
+ () => renderTrigger || (({ ref }) => /* @__PURE__ */ jsx(
99
+ DSButtonV2,
100
+ {
101
+ "data-testid": DSAppPickerDataTestIds.TRIGGER,
102
+ id: "app-picker__button",
103
+ buttonType: "icon",
104
+ "aria-haspopup": "true",
105
+ "aria-expanded": isOpen ?? open,
106
+ "aria-label": "Application picker",
107
+ innerRef: mergeRefs(ref, triggerRef || defaultTriggerRef),
108
+ onClick: (e) => {
109
+ wasOpenedByKeyboardRef.current = e.detail === 0;
110
+ onClick?.(e);
111
+ setOpen(true);
112
+ },
113
+ children: /* @__PURE__ */ jsx(Icon, {})
114
+ }
115
+ )),
116
+ [Icon, isOpen, onClick, open, renderTrigger, triggerRef]
117
+ );
118
+ return /* @__PURE__ */ jsx(
119
+ DSPopover,
120
+ {
121
+ content: /* @__PURE__ */ jsx(AppPickerContent, {}),
122
+ isOpen: typeof isOpen === "boolean" ? isOpen : open,
123
+ onClickOutside: handleOnClickOutside,
124
+ placement: "bottom",
125
+ interactionType: "click",
126
+ renderTrigger: RenderTrigger,
127
+ showArrow: true,
128
+ style: {
129
+ padding: "0",
130
+ maxWidth: "1000px",
131
+ width: "fit-content"
132
+ }
133
+ }
134
+ );
135
+ };
136
+ DSAppPicker.displayName = DSAppPickerName;
137
+ const AppPickerWithSchema = describe(DSAppPicker);
138
+ AppPickerWithSchema.propTypes = DSAppPickerPropTypes;
139
+ var DSAppPicker_default = DSAppPicker;
140
+ export {
141
+ AppPickerWithSchema,
142
+ DSAppPicker,
143
+ DSAppPicker_default as default
144
+ };
145
+ //# sourceMappingURL=DSAppPicker.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../scripts/build/transpile/react-shim.js", "../../src/DSAppPicker.tsx"],
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import React, { useState, useEffect, useMemo, useRef, useCallback } from 'react';\nimport { DSButtonV2 } from '@elliemae/ds-legacy-button-v2';\nimport { mergeRefs } from '@elliemae/ds-legacy-utilities';\nimport { describe, useMemoMergePropsWithDefault } from '@elliemae/ds-legacy-props-helpers';\nimport DSPopover from '@elliemae/ds-legacy-popover';\nimport AppPickerImpl from './AppPickerImpl.js';\nimport type { DSAppPickerT } from './react-desc-prop-types.js';\nimport { DSAppPickerPropTypes, defaultProps } from './react-desc-prop-types.js';\nimport { DSAppPickerDataTestIds, DSAppPickerName } from './DSAppPickerDefinitions.js';\n\nconst DSAppPicker: React.ComponentType<DSAppPickerT.Props> = (props) => {\n const propsWithDefault = useMemoMergePropsWithDefault<DSAppPickerT.InternalProps>(props, defaultProps);\n\n const {\n apps,\n customApps,\n sectionTitle,\n customSectionTitle,\n icon: Icon,\n renderTrigger,\n isOpen,\n onClose,\n actionRef,\n onKeyDown,\n onClick,\n onClickOutside,\n triggerRef,\n } = propsWithDefault;\n\n const [open, setOpen] = useState(false);\n const [isOverflow, setIsOverflow] = useState(false);\n const wrapperRef = useRef<HTMLDivElement>(null);\n const defaultTriggerRef = useRef(null);\n const wasOpenedByKeyboardRef = useRef(false);\n\n useEffect(() => {\n if (actionRef && actionRef.current) {\n actionRef.current.focusToIndex = (index: number) => {\n if (wrapperRef.current) {\n const parent = wrapperRef.current;\n const buttons = [...parent.querySelectorAll('button')];\n buttons[index].focus();\n }\n };\n actionRef.current.focusWrapper = () => {\n wrapperRef.current?.focus();\n };\n }\n }, [actionRef, apps, customApps]);\n\n useEffect(() => {\n setTimeout(() => {\n if (wrapperRef.current) {\n const { scrollHeight, clientHeight } = wrapperRef.current;\n if (scrollHeight > clientHeight) return setIsOverflow(true);\n }\n return setIsOverflow(false);\n });\n }, [isOpen, open]);\n\n const handleOnClose = useCallback(() => {\n setOpen(false);\n onClose?.();\n }, [onClose]);\n\n const handleOnClickOutside = (e: React.MouseEvent) => {\n setOpen(false);\n onClose?.();\n onClickOutside?.(e);\n };\n\n const AppPickerContent = useCallback(\n () => (\n <AppPickerImpl\n apps={apps}\n customApps={customApps}\n sectionTitle={sectionTitle}\n customSectionTitle={customSectionTitle}\n close={handleOnClose}\n wrapperRef={wrapperRef}\n onKeyDown={onKeyDown}\n triggerRef={triggerRef || defaultTriggerRef}\n actionRef={actionRef}\n triggerIsInternal={!renderTrigger}\n wasOpenedByKeyboardRef={wasOpenedByKeyboardRef}\n isOverflow={isOverflow}\n />\n ),\n [\n actionRef,\n apps,\n customApps,\n customSectionTitle,\n handleOnClose,\n isOverflow,\n onKeyDown,\n renderTrigger,\n sectionTitle,\n triggerRef,\n ],\n );\n\n const RenderTrigger = useMemo(\n () =>\n renderTrigger ||\n (({ ref }: { ref: React.RefObject<HTMLButtonElement> }) => (\n <DSButtonV2\n data-testid={DSAppPickerDataTestIds.TRIGGER}\n id=\"app-picker__button\"\n buttonType=\"icon\"\n aria-haspopup=\"true\"\n aria-expanded={isOpen ?? open}\n aria-label=\"Application picker\"\n innerRef={mergeRefs(ref, triggerRef || defaultTriggerRef)}\n onClick={(e: React.MouseEvent | React.KeyboardEvent) => {\n wasOpenedByKeyboardRef.current = e.detail === 0;\n onClick?.(e);\n setOpen(true);\n }}\n >\n <Icon />\n </DSButtonV2>\n )),\n [Icon, isOpen, onClick, open, renderTrigger, triggerRef],\n );\n\n return (\n <DSPopover\n content={<AppPickerContent />}\n isOpen={typeof isOpen === 'boolean' ? isOpen : open}\n onClickOutside={handleOnClickOutside}\n placement=\"bottom\"\n interactionType=\"click\"\n renderTrigger={RenderTrigger}\n showArrow\n style={{\n padding: '0',\n maxWidth: '1000px',\n width: 'fit-content',\n }}\n />\n );\n};\n\nDSAppPicker.displayName = DSAppPickerName;\nconst AppPickerWithSchema = describe(DSAppPicker);\nAppPickerWithSchema.propTypes = DSAppPickerPropTypes;\n\nexport { DSAppPicker, AppPickerWithSchema };\nexport default DSAppPicker;\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,22 @@
1
+ import * as React from "react";
2
+ const DSAppPickerName = "DSAppPicker";
3
+ const DSAppPickerSlots = {
4
+ ROOT: "root",
5
+ TITLE: "title",
6
+ SEPARATOR: "separator",
7
+ ROW: "row",
8
+ ITEM: "item"
9
+ };
10
+ const DSAppPickerDataTestIds = {
11
+ TRIGGER: "app-picker__button",
12
+ WRAPPER: "app-picker__wrapper",
13
+ CHIP: "app-picker__chip",
14
+ MAIN_TITLE: "app-picker__main-title",
15
+ CUSTOM_TITLE: "app-picker__custom-title"
16
+ };
17
+ export {
18
+ DSAppPickerDataTestIds,
19
+ DSAppPickerName,
20
+ DSAppPickerSlots
21
+ };
22
+ //# sourceMappingURL=DSAppPickerDefinitions.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../scripts/build/transpile/react-shim.js", "../../src/DSAppPickerDefinitions.ts"],
4
+ "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "export const DSAppPickerName = 'DSAppPicker';\n\nexport const DSAppPickerSlots = {\n ROOT: 'root',\n TITLE: 'title',\n SEPARATOR: 'separator',\n ROW: 'row',\n ITEM: 'item',\n};\n\nexport const DSAppPickerDataTestIds = {\n TRIGGER: 'app-picker__button',\n WRAPPER: 'app-picker__wrapper',\n CHIP: 'app-picker__chip',\n MAIN_TITLE: 'app-picker__main-title',\n CUSTOM_TITLE: 'app-picker__custom-title',\n};\n"],
5
+ "mappings": "AAAA,YAAY,WAAW;ACAhB,MAAM,kBAAkB;AAExB,MAAM,mBAAmB;AAAA,EAC9B,MAAM;AAAA,EACN,OAAO;AAAA,EACP,WAAW;AAAA,EACX,KAAK;AAAA,EACL,MAAM;AACR;AAEO,MAAM,yBAAyB;AAAA,EACpC,SAAS;AAAA,EACT,SAAS;AAAA,EACT,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,cAAc;AAChB;",
6
+ "names": []
7
+ }
@@ -0,0 +1,40 @@
1
+ import * as React from "react";
2
+ import { useEffect, useRef, useState } from "react";
3
+ import { focusSelectedOrFirstAvailable } from "../utils.js";
4
+ const useKeepTrackButtons = ({
5
+ wrapperRef,
6
+ wasOpenedByKeyboardRef,
7
+ actionRef,
8
+ triggerIsInternal
9
+ }) => {
10
+ const [allFocusableButtons, setAllFocusableButtons] = useState([]);
11
+ const selectedButton = useRef(null);
12
+ useEffect(() => {
13
+ if (actionRef && actionRef.current) {
14
+ actionRef.current.focusSelectedOrFirstAvailable = () => setTimeout(() => {
15
+ focusSelectedOrFirstAvailable(wrapperRef, allFocusableButtons, selectedButton);
16
+ });
17
+ }
18
+ }, [actionRef, allFocusableButtons, wrapperRef]);
19
+ useEffect(() => {
20
+ wrapperRef?.current?.querySelectorAll("button").forEach((e, index) => {
21
+ if (!e.hasAttribute("disabled"))
22
+ setAllFocusableButtons((prev) => [...prev, e]);
23
+ if (e.getAttribute("aria-selected") === "true") {
24
+ selectedButton.current = index;
25
+ }
26
+ });
27
+ }, [wasOpenedByKeyboardRef, wrapperRef, triggerIsInternal]);
28
+ useEffect(() => {
29
+ if (wasOpenedByKeyboardRef?.current || !triggerIsInternal) {
30
+ focusSelectedOrFirstAvailable(wrapperRef, allFocusableButtons, selectedButton);
31
+ } else {
32
+ wrapperRef.current?.focus();
33
+ }
34
+ }, [wasOpenedByKeyboardRef, wrapperRef, triggerIsInternal, allFocusableButtons]);
35
+ return { allFocusableButtons, selectedButton };
36
+ };
37
+ export {
38
+ useKeepTrackButtons
39
+ };
40
+ //# sourceMappingURL=useKeepTrackButtons.js.map