@fluentui-copilot/react-prompt-listbox 0.8.1 → 0.10.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.
Files changed (102) hide show
  1. package/CHANGELOG.json +16 -1
  2. package/CHANGELOG.md +10 -1
  3. package/dist/index.d.ts +0 -252
  4. package/lib/components/utils/useListboxPositioning.js.map +1 -1
  5. package/lib/index.js +0 -3
  6. package/lib/index.js.map +1 -1
  7. package/lib-commonjs/components/utils/useListboxPositioning.js.map +1 -1
  8. package/lib-commonjs/index.js +0 -36
  9. package/lib-commonjs/index.js.map +1 -1
  10. package/package.json +7 -7
  11. package/lib/PromptListbox.js +0 -2
  12. package/lib/PromptListbox.js.map +0 -1
  13. package/lib/PromptOption.js +0 -2
  14. package/lib/PromptOption.js.map +0 -1
  15. package/lib/components/PromptListbox/PromptListbox.js +0 -14
  16. package/lib/components/PromptListbox/PromptListbox.js.map +0 -1
  17. package/lib/components/PromptListbox/PromptListbox.types.js +0 -2
  18. package/lib/components/PromptListbox/PromptListbox.types.js.map +0 -1
  19. package/lib/components/PromptListbox/index.js +0 -5
  20. package/lib/components/PromptListbox/index.js.map +0 -1
  21. package/lib/components/PromptListbox/renderPromptListbox.js +0 -26
  22. package/lib/components/PromptListbox/renderPromptListbox.js.map +0 -1
  23. package/lib/components/PromptListbox/usePromptListbox.js +0 -82
  24. package/lib/components/PromptListbox/usePromptListbox.js.map +0 -1
  25. package/lib/components/PromptListbox/usePromptListboxContextValues.js +0 -33
  26. package/lib/components/PromptListbox/usePromptListboxContextValues.js.map +0 -1
  27. package/lib/components/PromptListbox/usePromptListboxStyles.styles.js +0 -41
  28. package/lib/components/PromptListbox/usePromptListboxStyles.styles.js.map +0 -1
  29. package/lib/components/PromptOption/PromptOption.js +0 -12
  30. package/lib/components/PromptOption/PromptOption.js.map +0 -1
  31. package/lib/components/PromptOption/PromptOption.types.js +0 -4
  32. package/lib/components/PromptOption/PromptOption.types.js.map +0 -1
  33. package/lib/components/PromptOption/index.js +0 -5
  34. package/lib/components/PromptOption/index.js.map +0 -1
  35. package/lib/components/PromptOption/renderPromptOption.js +0 -10
  36. package/lib/components/PromptOption/renderPromptOption.js.map +0 -1
  37. package/lib/components/PromptOption/usePromptOption.js +0 -101
  38. package/lib/components/PromptOption/usePromptOption.js.map +0 -1
  39. package/lib/components/PromptOption/usePromptOptionStyles.styles.js +0 -98
  40. package/lib/components/PromptOption/usePromptOptionStyles.styles.js.map +0 -1
  41. package/lib/components/utils/OptionCollection.types.js +0 -3
  42. package/lib/components/utils/OptionCollection.types.js.map +0 -1
  43. package/lib/components/utils/PromptListboxFunctionality.types.js +0 -2
  44. package/lib/components/utils/PromptListboxFunctionality.types.js.map +0 -1
  45. package/lib/components/utils/Selection.types.js +0 -3
  46. package/lib/components/utils/Selection.types.js.map +0 -1
  47. package/lib/components/utils/dropdownKeyActions.js +0 -68
  48. package/lib/components/utils/dropdownKeyActions.js.map +0 -1
  49. package/lib/components/utils/useOptionCollection.js +0 -39
  50. package/lib/components/utils/useOptionCollection.js.map +0 -1
  51. package/lib/components/utils/usePromptListboxFunctionality.js +0 -143
  52. package/lib/components/utils/usePromptListboxFunctionality.js.map +0 -1
  53. package/lib/components/utils/useSelection.js +0 -54
  54. package/lib/components/utils/useSelection.js.map +0 -1
  55. package/lib/components/utils/useTriggerKeyDown.js +0 -149
  56. package/lib/components/utils/useTriggerKeyDown.js.map +0 -1
  57. package/lib-commonjs/PromptListbox.js +0 -29
  58. package/lib-commonjs/PromptListbox.js.map +0 -1
  59. package/lib-commonjs/PromptOption.js +0 -29
  60. package/lib-commonjs/PromptOption.js.map +0 -1
  61. package/lib-commonjs/components/PromptListbox/PromptListbox.js +0 -23
  62. package/lib-commonjs/components/PromptListbox/PromptListbox.js.map +0 -1
  63. package/lib-commonjs/components/PromptListbox/PromptListbox.types.js +0 -5
  64. package/lib-commonjs/components/PromptListbox/PromptListbox.types.js.map +0 -1
  65. package/lib-commonjs/components/PromptListbox/index.js +0 -32
  66. package/lib-commonjs/components/PromptListbox/index.js.map +0 -1
  67. package/lib-commonjs/components/PromptListbox/renderPromptListbox.js +0 -30
  68. package/lib-commonjs/components/PromptListbox/renderPromptListbox.js.map +0 -1
  69. package/lib-commonjs/components/PromptListbox/usePromptListbox.js +0 -69
  70. package/lib-commonjs/components/PromptListbox/usePromptListbox.js.map +0 -1
  71. package/lib-commonjs/components/PromptListbox/usePromptListboxContextValues.js +0 -36
  72. package/lib-commonjs/components/PromptListbox/usePromptListboxContextValues.js.map +0 -1
  73. package/lib-commonjs/components/PromptListbox/usePromptListboxStyles.styles.js +0 -62
  74. package/lib-commonjs/components/PromptListbox/usePromptListboxStyles.styles.js.map +0 -1
  75. package/lib-commonjs/components/PromptOption/PromptOption.js +0 -21
  76. package/lib-commonjs/components/PromptOption/PromptOption.js.map +0 -1
  77. package/lib-commonjs/components/PromptOption/PromptOption.types.js +0 -7
  78. package/lib-commonjs/components/PromptOption/PromptOption.types.js.map +0 -1
  79. package/lib-commonjs/components/PromptOption/index.js +0 -32
  80. package/lib-commonjs/components/PromptOption/index.js.map +0 -1
  81. package/lib-commonjs/components/PromptOption/renderPromptOption.js +0 -16
  82. package/lib-commonjs/components/PromptOption/renderPromptOption.js.map +0 -1
  83. package/lib-commonjs/components/PromptOption/usePromptOption.js +0 -103
  84. package/lib-commonjs/components/PromptOption/usePromptOption.js.map +0 -1
  85. package/lib-commonjs/components/PromptOption/usePromptOptionStyles.styles.js +0 -188
  86. package/lib-commonjs/components/PromptOption/usePromptOptionStyles.styles.js.map +0 -1
  87. package/lib-commonjs/components/utils/OptionCollection.types.js +0 -6
  88. package/lib-commonjs/components/utils/OptionCollection.types.js.map +0 -1
  89. package/lib-commonjs/components/utils/PromptListboxFunctionality.types.js +0 -5
  90. package/lib-commonjs/components/utils/PromptListboxFunctionality.types.js.map +0 -1
  91. package/lib-commonjs/components/utils/Selection.types.js +0 -6
  92. package/lib-commonjs/components/utils/Selection.types.js.map +0 -1
  93. package/lib-commonjs/components/utils/dropdownKeyActions.js +0 -66
  94. package/lib-commonjs/components/utils/dropdownKeyActions.js.map +0 -1
  95. package/lib-commonjs/components/utils/useOptionCollection.js +0 -46
  96. package/lib-commonjs/components/utils/useOptionCollection.js.map +0 -1
  97. package/lib-commonjs/components/utils/usePromptListboxFunctionality.js +0 -150
  98. package/lib-commonjs/components/utils/usePromptListboxFunctionality.js.map +0 -1
  99. package/lib-commonjs/components/utils/useSelection.js +0 -72
  100. package/lib-commonjs/components/utils/useSelection.js.map +0 -1
  101. package/lib-commonjs/components/utils/useTriggerKeyDown.js +0 -151
  102. package/lib-commonjs/components/utils/useTriggerKeyDown.js.map +0 -1
@@ -1,6 +0,0 @@
1
- // Brought from Fluent UI
2
- /** Possible event types for onOptionSelect */ "use strict";
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- //# sourceMappingURL=Selection.types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["Selection.types.ts"],"sourcesContent":["// Brought from Fluent UI\n\nimport type * as React from 'react';\nimport type { OptionValue } from './OptionCollection.types';\n\nexport type SelectionProps = {\n /**\n * For an uncontrolled component, sets the initial selection.\n * If this is set, the `defaultValue` prop MUST also be set.\n */\n defaultSelectedOptions?: string[];\n\n /**\n * Sets the selection type to multiselect.\n * Set this to true for multiselect, even if fully controlling selection state.\n * This enables styles and accessibility properties to be set.\n * @default false\n */\n multiselect?: boolean;\n\n /** Callback when an option is selected */\n onOptionSelect?: (event: SelectionEvents, data: OptionOnSelectData) => void;\n\n /**\n * An array of selected option keys.\n * Use this with `onOptionSelect` to directly control the selected option(s)\n * If this is set, the `value` prop MUST also be controlled.\n */\n selectedOptions?: string[];\n};\n\n/** Values returned by the useSelection hook */\nexport type SelectionState = {\n clearSelection: (event: SelectionEvents) => void;\n selectedOptions: string[];\n selectOption: (event: SelectionEvents, option: OptionValue) => void;\n};\n\n/**\n * Data for the onOptionSelect callback.\n * `optionValue` and `optionText` will be undefined if multiple options are modified at once.\n */\nexport type OptionOnSelectData = {\n optionValue: string | undefined;\n optionText: string | undefined;\n selectedOptions: string[];\n};\n\n/** Possible event types for onOptionSelect */\nexport type SelectionEvents =\n | React.ChangeEvent<HTMLElement>\n | React.KeyboardEvent<HTMLElement>\n | React.MouseEvent<HTMLElement>;\n"],"names":[],"rangeMappings":";","mappings":"AAAA,yBAAyB;AAgDzB,4CAA4C"}
@@ -1,66 +0,0 @@
1
- /**
2
- * Note, this is mainly brought from Fluent UI, only removed the closing and
3
- * opening logic since that's not needed for this use case.
4
- */ "use strict";
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- Object.defineProperty(exports, "getDropdownActionFromKey", {
9
- enumerable: true,
10
- get: function() {
11
- return getDropdownActionFromKey;
12
- }
13
- });
14
- const _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard");
15
- const _keyboardkeys = /*#__PURE__*/ _interop_require_wildcard._(require("@fluentui/keyboard-keys"));
16
- function getDropdownActionFromKey(e, options) {
17
- const { cursorPosition, allowArrowUpNavigation, isInSelectionMode } = options;
18
- const code = e.key;
19
- const { altKey, ctrlKey, key, metaKey } = e;
20
- // typing action occurs whether open or closed
21
- if (key.length === 1 && code !== _keyboardkeys.Space && !altKey && !ctrlKey && !metaKey) {
22
- return 'Type';
23
- }
24
- // select or close actions
25
- if (code === _keyboardkeys.ArrowUp && altKey || code === _keyboardkeys.Enter) {
26
- return 'CloseSelect';
27
- }
28
- // navigation interactions
29
- const atStart = allowArrowUpNavigation && (cursorPosition === 'start' || cursorPosition === 'start-end');
30
- const atEnd = cursorPosition === 'end' || cursorPosition === 'start-end';
31
- if (code === _keyboardkeys.ArrowDown) {
32
- if (atEnd) {
33
- return 'Next';
34
- } else if (atStart && isInSelectionMode) {
35
- return 'Next';
36
- }
37
- return 'Type';
38
- }
39
- if (code === _keyboardkeys.ArrowUp) {
40
- if (atEnd && isInSelectionMode) {
41
- return 'Previous';
42
- } else if (atStart && !isInSelectionMode) {
43
- return 'Next';
44
- } else if (atStart && isInSelectionMode) {
45
- return 'Previous';
46
- }
47
- return 'Type';
48
- }
49
- if (code === _keyboardkeys.Home) {
50
- return atEnd || atStart ? 'First' : 'Type';
51
- }
52
- if (code === _keyboardkeys.End) {
53
- return atEnd || atStart ? 'Last' : 'Type';
54
- }
55
- if (code === _keyboardkeys.PageUp) {
56
- return 'PageUp';
57
- }
58
- if (code === _keyboardkeys.PageDown) {
59
- return 'PageDown';
60
- }
61
- if (code === _keyboardkeys.Tab) {
62
- return 'Tab';
63
- }
64
- // if nothing matched, return none
65
- return 'None';
66
- } //# sourceMappingURL=dropdownKeyActions.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["dropdownKeyActions.ts"],"sourcesContent":["/**\n * Note, this is mainly brought from Fluent UI, only removed the closing and\n * opening logic since that's not needed for this use case.\n */\n\nimport * as keys from '@fluentui/keyboard-keys';\nimport type * as React from 'react';\nimport type { CursorPosition } from '../../plugins/CursorPositionPlugin';\n\n/**\n * enum of actions available in any type of managed dropdown control\n * e.g. combobox, select, datepicker, menu\n */\nexport type DropdownActions =\n | 'CloseSelect'\n | 'First'\n | 'Last'\n | 'Next'\n | 'None'\n | 'PageDown'\n | 'PageUp'\n | 'Previous'\n | 'Select'\n | 'Tab'\n | 'Type';\n\nexport interface DropdownActionOptions {\n open?: boolean;\n multiselect?: boolean;\n cursorPosition: CursorPosition;\n allowArrowUpNavigation: boolean;\n isInSelectionMode: boolean;\n}\n\n/**\n * Converts a keyboard interaction into a defined action\n */\nexport function getDropdownActionFromKey(\n e: KeyboardEvent | React.KeyboardEvent,\n options: DropdownActionOptions,\n): DropdownActions {\n const { cursorPosition, allowArrowUpNavigation, isInSelectionMode } = options;\n const code = e.key;\n const { altKey, ctrlKey, key, metaKey } = e;\n\n // typing action occurs whether open or closed\n if (key.length === 1 && code !== keys.Space && !altKey && !ctrlKey && !metaKey) {\n return 'Type';\n }\n\n // select or close actions\n if ((code === keys.ArrowUp && altKey) || code === keys.Enter) {\n return 'CloseSelect';\n }\n\n // navigation interactions\n const atStart = allowArrowUpNavigation && (cursorPosition === 'start' || cursorPosition === 'start-end');\n const atEnd = cursorPosition === 'end' || cursorPosition === 'start-end';\n if (code === keys.ArrowDown) {\n if (atEnd) {\n return 'Next';\n } else if (atStart && isInSelectionMode) {\n return 'Next';\n }\n return 'Type';\n }\n if (code === keys.ArrowUp) {\n if (atEnd && isInSelectionMode) {\n return 'Previous';\n } else if (atStart && !isInSelectionMode) {\n return 'Next';\n } else if (atStart && isInSelectionMode) {\n return 'Previous';\n }\n return 'Type';\n }\n if (code === keys.Home) {\n return atEnd || atStart ? 'First' : 'Type';\n }\n if (code === keys.End) {\n return atEnd || atStart ? 'Last' : 'Type';\n }\n if (code === keys.PageUp) {\n return 'PageUp';\n }\n if (code === keys.PageDown) {\n return 'PageDown';\n }\n if (code === keys.Tab) {\n return 'Tab';\n }\n\n // if nothing matched, return none\n return 'None';\n}\n"],"names":["cursorPosition","keys","allowArrowUpNavigation","isInSelectionMode","code","e","key","altKey","metaKey","ArrowDown","Space","ctrlKey","atStart","ArrowUp","Enter","atEnd","Home","End","PageUp"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA;;;CAGC;;;;+BAsCSA;;;eAAAA;;;;wEApCEC;AAoCV,SAAQD,yBAAgBE,CAAAA,EAAAA,OAAsB;UAC9C,EACAF,cAAc,EAEdE,sBAAA,EACAC,iBAAc;UAEdC,OAAAC,EAAAC,GAAA;UAEA,EACAC,MAAKH,SACH,EACFE,GAAA,EAEAE,OAAA,KACAH;kDAC0CL;QAC1CM,IAAIF,MAAAA,KAASH,KAAKQ,SAAWR,cAAAS,KAAA,IAAA,CAAAH,UAAA,CAAAI,WAAA,CAAAH,SAAA;eAC3B;;8BAEWI;iBACTX,cAAOY,OAAA,IAAAN,UAAAH,SAAAH,cAAAa,KAAA,EAAA;eACT;;8BAEF;UACIV,UAASH,0BAAcD,CAAAA,mBAAA,WAAAA,mBAAA,WAAA;UACzBe,QAAIA,mBAASZ,SAAmBH,mBAAA;iBAC9BC,cAAOQ,SAAA,EAAA;YACTM,OAAO;mBACL;eACF,IAAOH,WAAIA,mBAAWT;mBACpB;;eAEF;;QAEFC,SAAIA,cAASH,OAAS,EAAE;YACtBc,SAAOA,mBAAmB;YAC5B,OAAA;QACA,OAAIX,IAAAA,WAAiB,CAAED,mBAAA;mBACrB;QACF,OAAA,IAAAS,WAAAT,mBAAA;YACA,OAAIC;;QAEJ,OAAA;;iBAESH,cAAAe,IAAA,EAAA;QACT,OAAAD,SAAAH,UAAA,UAAA;;iBAESX,cAAAgB,GAAA,EAAA;QACT,OAAAF,SAAAH,UAAA,SAAA;;QAGAR,SAAOH,cAAAiB,MAAA,EAAA;QACT,OAAA"}
@@ -1,46 +0,0 @@
1
- // Brought from Fluent UI
2
- "use strict";
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- Object.defineProperty(exports, "useOptionCollection", {
7
- enumerable: true,
8
- get: function() {
9
- return useOptionCollection;
10
- }
11
- });
12
- const _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard");
13
- const _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
14
- const useOptionCollection = ()=>{
15
- const optionsById = _react.useRef(new Map());
16
- const collectionAPI = _react.useMemo(()=>{
17
- const getCount = ()=>optionsById.current.size;
18
- // index searches are no longer used
19
- const getOptionById = (id)=>{
20
- return optionsById.current.get(id);
21
- };
22
- const getOptionsMatchingValue = (matcher)=>{
23
- const matches = [];
24
- for (const option of optionsById.current.values()){
25
- if (matcher(option.value)) {
26
- matches.push(option);
27
- }
28
- }
29
- return matches;
30
- };
31
- return {
32
- getCount,
33
- getOptionById,
34
- getOptionsMatchingValue
35
- };
36
- }, []);
37
- const registerOption = _react.useCallback((option)=>{
38
- optionsById.current.set(option.id, option);
39
- return ()=>optionsById.current.delete(option.id);
40
- }, []);
41
- return {
42
- ...collectionAPI,
43
- options: Array.from(optionsById.current.values()),
44
- registerOption
45
- };
46
- }; //# sourceMappingURL=useOptionCollection.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["useOptionCollection.ts"],"sourcesContent":["// Brought from Fluent UI\n\nimport * as React from 'react';\nimport type { OptionCollectionState, OptionValue } from './OptionCollection.types';\n\n/**\n * A hook for managing a collection of child Options\n */\nexport const useOptionCollection = (): OptionCollectionState => {\n const optionsById = React.useRef(new Map<string, OptionValue>());\n\n const collectionAPI = React.useMemo(() => {\n const getCount = () => optionsById.current.size;\n\n // index searches are no longer used\n\n const getOptionById = (id: string) => {\n return optionsById.current.get(id);\n };\n\n const getOptionsMatchingValue = (matcher: (value: string) => boolean) => {\n const matches: OptionValue[] = [];\n for (const option of optionsById.current.values()) {\n if (matcher(option.value)) {\n matches.push(option);\n }\n }\n\n return matches;\n };\n\n return {\n getCount,\n getOptionById,\n getOptionsMatchingValue,\n };\n }, []);\n\n const registerOption = React.useCallback((option: OptionValue) => {\n optionsById.current.set(option.id, option);\n\n return () => optionsById.current.delete(option.id);\n }, []);\n\n return {\n ...collectionAPI,\n options: Array.from(optionsById.current.values()),\n registerOption,\n };\n};\n"],"names":["optionsById","useRef","collectionAPI","React","useMemo","Map","getCount","current","size","id","get","matcher","matches","option","value","values","push","useCallback","delete","Array","registerOption"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,yBAAyB;;;;;+BASjBA;;;eAAAA;;;;iEAPe;AAOrB,MAAMA,sBAAoBC;UAE1BD,cAAME,OAAgBC,MAAMC,CAAAA,IAAOC;UACjCH,gBAAMI,OAAiBN,OAAAA,CAAAA;cAEvBM,WAAA,IAAAN,YAAAO,OAAoC,CAAAC,IAAA;4CAEbC;8BACdT,CAAAA;mBACTA,YAAAO,OAAA,CAAAG,GAAA,CAAAD;;wCAGmCE,CAAAA;kBACjCC,UAAK,EAAMC;uBACTA,UAAIF,YAAeG,OAAQ,CAAAC,MAAA,GAAA;4BACzBH,OAAAA,KAAY,GAACC;4BACfG,IAAA,CAAAH;;;mBAIJD;;;;;;QAOF;OAEA,EAAA;UACEZ,iBAAYO,OAAWU,WAAU,CAAEJ,CAAAA;oBAE5BN,OAAMP,CAAAA,GAAAA,CAAAA,OAAYO,EAAAA,EAAQW;QACnC,OAAK,IAAAlB,YAAAO,OAAA,CAAAW,MAAA,CAAAL,OAAAJ,EAAA;OAEL,EAAA;WACE;wBACSU;iBACTC,MAAAA,IAAAA,CAAAA,YAAAA,OAAAA,CAAAA,MAAAA;QACFA;IACA"}
@@ -1,150 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "usePromptListboxFunctionality", {
6
- enumerable: true,
7
- get: function() {
8
- return usePromptListboxFunctionality;
9
- }
10
- });
11
- const _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard");
12
- const _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
13
- const _reactaria = require("@fluentui/react-aria");
14
- const _reactutilities = require("@fluentui/react-utilities");
15
- const _CursorPositionPlugin = require("../../plugins/CursorPositionPlugin");
16
- const _useOptionCollection = require("./useOptionCollection");
17
- const _useSelection = require("./useSelection");
18
- const _useListboxPositioning = require("./useListboxPositioning");
19
- const _useTriggerKeyDown = require("./useTriggerKeyDown");
20
- const _PromptListbox = require("../PromptListbox");
21
- const _PromptOption = require("../PromptOption");
22
- const _PromptListboxMotion = require("../motion/PromptListboxMotion");
23
- function usePromptListboxFunctionality(params) {
24
- const { positioning, onOpenChange, onSelectionModeChange, listboxProps, fluid = false, allowArrowUpNavigation = false } = params;
25
- const { listboxRef: activeDescendantListboxRef, activeParentRef, controller: activeDescendantController } = (0, _reactaria.useActiveDescendant)({
26
- matchOption: (el)=>el.classList.contains(_PromptOption.promptOptionClassNames.root)
27
- });
28
- // useMergedRefs to normalize the ref into a React.RefObject type
29
- const triggerRef = (0, _reactutilities.useMergedRefs)(activeParentRef);
30
- const selectionState = (0, _useSelection.useSelection)(listboxProps !== null && listboxProps !== void 0 ? listboxProps : {});
31
- const { selectOption } = selectionState;
32
- const optionCollection = (0, _useOptionCollection.useOptionCollection)();
33
- const { getOptionById } = optionCollection;
34
- const [cursorPosition, setCursorPosition] = _react.useState('end');
35
- const [isInSelectionMode, setIsInSelectionMode] = _react.useState(false);
36
- const [open, setOpen] = (0, _reactutilities.useControllableState)({
37
- state: params.open,
38
- defaultState: params.defaultOpen,
39
- initialState: false
40
- });
41
- const setSelectionMode = _react.useCallback((selectionMode)=>{
42
- if (selectionMode === false) {
43
- activeDescendantController.blur();
44
- setHideActiveDescendant(true);
45
- } else {
46
- setHideActiveDescendant(false);
47
- }
48
- setIsInSelectionMode(selectionMode);
49
- onSelectionModeChange === null || onSelectionModeChange === void 0 ? void 0 : onSelectionModeChange(selectionMode);
50
- }, [
51
- activeDescendantController,
52
- onSelectionModeChange
53
- ]);
54
- const onBlur = (event)=>{
55
- setOpen(false);
56
- onOpenChange === null || onOpenChange === void 0 ? void 0 : onOpenChange(event, {
57
- event,
58
- type: 'focus',
59
- open: false
60
- });
61
- setSelectionMode(false);
62
- };
63
- const onFocus = (event)=>{
64
- if (event.target === event.currentTarget) {
65
- setOpen(true);
66
- onOpenChange === null || onOpenChange === void 0 ? void 0 : onOpenChange(event, {
67
- event,
68
- type: 'focus',
69
- open: true
70
- });
71
- }
72
- };
73
- const cursorPositionPlugin = /*#__PURE__*/ _react.createElement(_CursorPositionPlugin.CursorPositionPlugin, {
74
- setCursorPosition: setCursorPosition
75
- });
76
- const onListboxBlur = _react.useCallback(()=>{
77
- setSelectionMode(false);
78
- onSelectionModeChange === null || onSelectionModeChange === void 0 ? void 0 : onSelectionModeChange(false);
79
- }, [
80
- onSelectionModeChange,
81
- setSelectionMode
82
- ]);
83
- // handle combobox keyboard interaction
84
- const onKeyDown = (0, _useTriggerKeyDown.useTriggerKeydown)({
85
- ...optionCollection,
86
- allowArrowUpNavigation,
87
- activeDescendantController,
88
- getOptionById,
89
- onBlur: onListboxBlur,
90
- selectOption,
91
- cursorPosition,
92
- open,
93
- multiselect: false,
94
- isInSelectionMode,
95
- setSelectionMode
96
- });
97
- // NVDA and JAWS have bugs that suppress reading the input value text when aria-activedescendant is set
98
- // To prevent this, we clear the HTML attribute (but save the state) when a user presses left/right arrows
99
- // ref: https://github.com/microsoft/fluentui/issues/26359#issuecomment-1397759888
100
- const [hideActiveDescendant, setHideActiveDescendant] = _react.useState(false);
101
- _react.useEffect(()=>{
102
- if (hideActiveDescendant) {
103
- var _triggerRef_current;
104
- (_triggerRef_current = triggerRef.current) === null || _triggerRef_current === void 0 ? void 0 : _triggerRef_current.removeAttribute('aria-activedescendant');
105
- }
106
- // We only want to run this when the hideActiveDescendant changes, if the triggerRef
107
- // is undefined, there's no need to remove theAttribute and we shouldn't be adding
108
- // refs as dependencies since it can blow up the number of runs.
109
- // eslint-disable-next-line react-compiler/react-compiler
110
- // eslint-disable-next-line react-hooks/exhaustive-deps
111
- }, [
112
- hideActiveDescendant
113
- ]);
114
- const [comboboxPopupRef, comboboxTargetRef] = (0, _useListboxPositioning.useListboxPositioning)({
115
- positioning,
116
- fluid
117
- });
118
- const listboxMergedRef = (0, _reactutilities.useMergedRefs)(comboboxPopupRef, activeDescendantListboxRef, listboxProps === null || listboxProps === void 0 ? void 0 : listboxProps.ref);
119
- const listbox = _react.useMemo(()=>{
120
- return /*#__PURE__*/ _react.createElement(_PromptListboxMotion.PromptListboxMotion, {
121
- visible: open
122
- }, /*#__PURE__*/ _react.createElement(_PromptListbox.PromptListbox, {
123
- open: open,
124
- ...listboxProps,
125
- ...optionCollection,
126
- ...selectionState,
127
- ref: listboxMergedRef,
128
- activeDescendantController: activeDescendantController
129
- }));
130
- }, [
131
- activeDescendantController,
132
- listboxMergedRef,
133
- listboxProps,
134
- open,
135
- optionCollection,
136
- selectionState
137
- ]);
138
- return {
139
- promptListbox: listbox,
140
- triggerProps: {
141
- ref: triggerRef,
142
- onBlur,
143
- onFocus,
144
- onKeyDown,
145
- isInSelectionMode
146
- },
147
- containerRef: comboboxTargetRef,
148
- cursorPositionPlugin
149
- };
150
- } //# sourceMappingURL=usePromptListboxFunctionality.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["usePromptListboxFunctionality.tsx"],"sourcesContent":["import * as React from 'react';\nimport { useActiveDescendant } from '@fluentui/react-aria';\nimport { useControllableState, useMergedRefs } from '@fluentui/react-utilities';\nimport { CursorPositionPlugin } from '../../plugins/CursorPositionPlugin';\nimport { useOptionCollection } from './useOptionCollection';\nimport { useSelection } from './useSelection';\nimport { useListboxPositioning } from './useListboxPositioning';\nimport { useTriggerKeydown } from './useTriggerKeyDown';\nimport { PromptListbox } from '../PromptListbox';\nimport { promptOptionClassNames } from '../PromptOption';\nimport { PromptListboxMotion } from '../motion/PromptListboxMotion';\nimport type { CursorPosition } from '../../plugins/CursorPositionPlugin';\nimport type {\n UsePromptListboxFunctionalityParams,\n UsePromptListboxFunctionality,\n} from './PromptListboxFunctionality.types';\n\n/**\n * @deprecated -- use usePromptListboxFunctionality from usePromptListboxFunctionalityV2.tsx instead\n */\nexport function usePromptListboxFunctionality(\n params: UsePromptListboxFunctionalityParams,\n): UsePromptListboxFunctionality {\n const {\n positioning,\n onOpenChange,\n onSelectionModeChange,\n listboxProps,\n fluid = false,\n allowArrowUpNavigation = false,\n } = params;\n const {\n listboxRef: activeDescendantListboxRef,\n activeParentRef,\n controller: activeDescendantController,\n } = useActiveDescendant<HTMLSpanElement, HTMLDivElement>({\n matchOption: el => el.classList.contains(promptOptionClassNames.root),\n });\n // useMergedRefs to normalize the ref into a React.RefObject type\n const triggerRef = useMergedRefs(activeParentRef);\n const selectionState = useSelection(listboxProps ?? {});\n const { selectOption } = selectionState;\n const optionCollection = useOptionCollection();\n const { getOptionById } = optionCollection;\n const [cursorPosition, setCursorPosition] = React.useState<CursorPosition>('end');\n const [isInSelectionMode, setIsInSelectionMode] = React.useState(false);\n const [open, setOpen] = useControllableState({\n state: params.open,\n defaultState: params.defaultOpen,\n initialState: false,\n });\n\n const setSelectionMode = React.useCallback(\n (selectionMode: boolean) => {\n if (selectionMode === false) {\n activeDescendantController.blur();\n setHideActiveDescendant(true);\n } else {\n setHideActiveDescendant(false);\n }\n\n setIsInSelectionMode(selectionMode);\n onSelectionModeChange?.(selectionMode);\n },\n [activeDescendantController, onSelectionModeChange],\n );\n\n const onBlur = (event: React.FocusEvent<HTMLSpanElement>) => {\n setOpen(false);\n onOpenChange?.(event, { event, type: 'focus', open: false });\n setSelectionMode(false);\n };\n\n const onFocus = (event: React.FocusEvent<HTMLSpanElement>) => {\n if (event.target === event.currentTarget) {\n setOpen(true);\n onOpenChange?.(event, { event, type: 'focus', open: true });\n }\n };\n\n const cursorPositionPlugin = <CursorPositionPlugin setCursorPosition={setCursorPosition} />;\n\n const onListboxBlur = React.useCallback(() => {\n setSelectionMode(false);\n onSelectionModeChange?.(false);\n }, [onSelectionModeChange, setSelectionMode]);\n\n // handle combobox keyboard interaction\n const onKeyDown = useTriggerKeydown({\n ...optionCollection,\n allowArrowUpNavigation,\n activeDescendantController,\n getOptionById,\n onBlur: onListboxBlur,\n selectOption,\n cursorPosition,\n open,\n multiselect: false,\n isInSelectionMode,\n setSelectionMode,\n });\n\n // NVDA and JAWS have bugs that suppress reading the input value text when aria-activedescendant is set\n // To prevent this, we clear the HTML attribute (but save the state) when a user presses left/right arrows\n // ref: https://github.com/microsoft/fluentui/issues/26359#issuecomment-1397759888\n const [hideActiveDescendant, setHideActiveDescendant] = React.useState(false);\n\n React.useEffect(() => {\n if (hideActiveDescendant) {\n triggerRef.current?.removeAttribute('aria-activedescendant');\n }\n // We only want to run this when the hideActiveDescendant changes, if the triggerRef\n // is undefined, there's no need to remove theAttribute and we shouldn't be adding\n // refs as dependencies since it can blow up the number of runs.\n // eslint-disable-next-line react-compiler/react-compiler\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [hideActiveDescendant]);\n\n const [comboboxPopupRef, comboboxTargetRef] = useListboxPositioning({ positioning, fluid });\n\n const listboxMergedRef = useMergedRefs(comboboxPopupRef, activeDescendantListboxRef, listboxProps?.ref);\n const listbox = React.useMemo(() => {\n return (\n <PromptListboxMotion visible={open}>\n <PromptListbox\n open={open}\n {...listboxProps}\n {...optionCollection}\n {...selectionState}\n ref={listboxMergedRef}\n activeDescendantController={activeDescendantController}\n />\n </PromptListboxMotion>\n );\n }, [activeDescendantController, listboxMergedRef, listboxProps, open, optionCollection, selectionState]);\n\n return {\n promptListbox: listbox,\n triggerProps: {\n ref: triggerRef,\n onBlur,\n onFocus,\n onKeyDown,\n isInSelectionMode,\n },\n containerRef: comboboxTargetRef,\n cursorPositionPlugin,\n };\n}\n"],"names":["positioning","onSelectionModeChange","matchOption","onOpenChange","listboxProps","triggerRef","fluid","selectionState","allowArrowUpNavigation","params","listboxRef","cursorPosition","setCursorPosition","activeParentRef","isInSelectionMode","controller","open","useControllableState","defaultState","defaultOpen","promptOptionClassNames","root","setSelectionMode","React","useCallback","selectionMode","setHideActiveDescendant","setIsInSelectionMode","useState","activeDescendantController","onBlur","event","blur","onFocus","onListboxBlur","currentTarget","selectOption","getOptionById","hideActiveDescendant","useEffect","_triggerRef_current","comboboxTargetRef","useListboxPositioning","removeAttribute","activeDescendantListboxRef","PromptListboxMotion","PromptListbox","comboboxPopupRef","ref","listboxMergedRef","createElement","optionCollection","promptListbox","triggerProps","cursorPositionPlugin"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
@@ -1,72 +0,0 @@
1
- // Brought from Fluent UI
2
- "use strict";
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- Object.defineProperty(exports, "useSelection", {
7
- enumerable: true,
8
- get: function() {
9
- return useSelection;
10
- }
11
- });
12
- const _react = require("react");
13
- const _reactutilities = require("@fluentui/react-utilities");
14
- const useSelection = (props)=>{
15
- const { defaultSelectedOptions, multiselect, onOptionSelect } = props;
16
- const [selectedOptions, setSelectedOptions] = (0, _reactutilities.useControllableState)({
17
- state: props.selectedOptions,
18
- defaultState: defaultSelectedOptions,
19
- initialState: []
20
- });
21
- const selectOption = (0, _react.useCallback)((event, option)=>{
22
- // if the option is disabled, do nothing
23
- if (option.disabled) {
24
- return;
25
- }
26
- // for single-select, always return the selected option
27
- let newSelection = [
28
- option.value
29
- ];
30
- // toggle selected state of the option for multiselect
31
- if (multiselect) {
32
- const selectedIndex = selectedOptions.findIndex((o)=>o === option.value);
33
- if (selectedIndex > -1) {
34
- // deselect option
35
- newSelection = [
36
- ...selectedOptions.slice(0, selectedIndex),
37
- ...selectedOptions.slice(selectedIndex + 1)
38
- ];
39
- } else {
40
- // select option
41
- newSelection = [
42
- ...selectedOptions,
43
- option.value
44
- ];
45
- }
46
- }
47
- setSelectedOptions(newSelection);
48
- onOptionSelect === null || onOptionSelect === void 0 ? void 0 : onOptionSelect(event, {
49
- optionValue: option.value,
50
- optionText: option.text,
51
- selectedOptions: newSelection
52
- });
53
- }, [
54
- onOptionSelect,
55
- multiselect,
56
- selectedOptions,
57
- setSelectedOptions
58
- ]);
59
- const clearSelection = (event)=>{
60
- setSelectedOptions([]);
61
- onOptionSelect === null || onOptionSelect === void 0 ? void 0 : onOptionSelect(event, {
62
- optionValue: undefined,
63
- optionText: undefined,
64
- selectedOptions: []
65
- });
66
- };
67
- return {
68
- clearSelection,
69
- selectOption,
70
- selectedOptions
71
- };
72
- }; //# sourceMappingURL=useSelection.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["useSelection.ts"],"sourcesContent":["// Brought from Fluent UI\n\nimport { useCallback } from 'react';\nimport { useControllableState } from '@fluentui/react-utilities';\nimport type { OptionValue } from './OptionCollection.types';\nimport type { SelectionEvents, SelectionProps, SelectionState } from './Selection.types';\n\nexport const useSelection = (props: SelectionProps): SelectionState => {\n const { defaultSelectedOptions, multiselect, onOptionSelect } = props;\n\n const [selectedOptions, setSelectedOptions] = useControllableState({\n state: props.selectedOptions,\n defaultState: defaultSelectedOptions,\n initialState: [],\n });\n\n const selectOption = useCallback(\n (event: SelectionEvents, option: OptionValue) => {\n // if the option is disabled, do nothing\n if (option.disabled) {\n return;\n }\n\n // for single-select, always return the selected option\n let newSelection = [option.value];\n\n // toggle selected state of the option for multiselect\n if (multiselect) {\n const selectedIndex = selectedOptions.findIndex(o => o === option.value);\n if (selectedIndex > -1) {\n // deselect option\n newSelection = [...selectedOptions.slice(0, selectedIndex), ...selectedOptions.slice(selectedIndex + 1)];\n } else {\n // select option\n newSelection = [...selectedOptions, option.value];\n }\n }\n\n setSelectedOptions(newSelection);\n onOptionSelect?.(event, { optionValue: option.value, optionText: option.text, selectedOptions: newSelection });\n },\n [onOptionSelect, multiselect, selectedOptions, setSelectedOptions],\n );\n\n const clearSelection = (event: SelectionEvents) => {\n setSelectedOptions([]);\n onOptionSelect?.(event, { optionValue: undefined, optionText: undefined, selectedOptions: [] });\n };\n\n return { clearSelection, selectOption, selectedOptions };\n};\n"],"names":["useSelection","props","defaultSelectedOptions","selectedOptions","defaultState","setSelectedOptions","useControllableState","state","selectOption","useCallback","option","disabled","event","newSelection","multiselect","value","findIndex","selectedIndex","o","slice","onOptionSelect","text","optionValue","undefined","clearSelection"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,yBAAyB;;;;;+BAOZA;;;eAAAA;;;uBALe;gCACS;AAI9B,MAAMA,eAAeC,CAAAA;UAC1B,EAEAC,sBAAOC,aACEF,gBACPG;UAEF,CAAAD,iBAAAE,mBAAA,GAAAC,IAAAA,oCAAA,EAAA;QAEAC,OAAMC,MAAAA,eAAeC;sBAEjBP;sBACIQ,EAAOC;;UAEXH,eAAAC,IAAAA,kBAAA,EAAA,CAAAG,OAAAF;gDAEA;YACAA,OAAIG,QAAAA,EAAAA;;;+DAEJ;YACAA,eAAIC;YAAAA,OAAaC,KAAA;SAAA;8DACuBC;yBAClCC;kCACFd,gBAAkBa,SAAA,CAAAE,CAAAA,IAAAA,MAAAR,OAAAK,KAAA;gCAClBF,CAAAA,GAAAA;kCAAmBV;+BAA4CA;uBAAAA,gBAAgBgB,KAAMF,CAAAA,GAAAA;uBAAgBd,gBAAAgB,KAAA,CAAAF,gBAAA;iBAAA;;gCAChG;+BACL;uBAAAd;oBAAgBO,OAAAK,KAAA;iBAAA;;;2BACoBL;2BAAa,QAAAU,mBAAA,KAAA,IAAA,KAAA,IAAAA,eAAAR,OAAA;yBACnDF,OAAAK,KAAA;wBACFL,OAAAW,IAAA;6BAEAhB;;;;QAC0BiB;QAAoBP;QAAKV;KAAA;2BAAcK,CAAAA;2BAAaP,EAAAA;2BAA8B,QAAAiB,mBAAA,KAAA,IAAA,KAAA,IAAAA,eAAAR,OAAA;YAC9GU,aACAC;wBAACH;6BAAgBN,EAAAA;;;WAAiD;QAGpEU;;;;2CAE8F"}
@@ -1,151 +0,0 @@
1
- /**
2
- * Note, this is mainly brought from Fluent UI, only removed the closing and
3
- * opening logic since that's not needed for this use case and added the bluring
4
- * functionality.
5
- */ "use strict";
6
- Object.defineProperty(exports, "__esModule", {
7
- value: true
8
- });
9
- Object.defineProperty(exports, "useTriggerKeydown", {
10
- enumerable: true,
11
- get: function() {
12
- return useTriggerKeydown;
13
- }
14
- });
15
- const _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard");
16
- const _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
17
- const _reacttabster = require("@fluentui/react-tabster");
18
- const _reactutilities = require("@fluentui/react-utilities");
19
- const _dropdownKeyActions = require("./dropdownKeyActions");
20
- const _keyboardkeys = require("@fluentui/keyboard-keys");
21
- function useTriggerKeydown(options) {
22
- const { activeDescendantController, getOptionById, selectOption, multiselect, open, cursorPosition, onBlur, allowArrowUpNavigation, isInSelectionMode, setSelectionMode } = options;
23
- const getActiveOption = _react.useCallback(()=>{
24
- const activeOptionId = activeDescendantController.active();
25
- return activeOptionId ? getOptionById(activeOptionId) : undefined;
26
- }, [
27
- activeDescendantController,
28
- getOptionById
29
- ]);
30
- const first = ()=>{
31
- activeDescendantController.first();
32
- };
33
- const last = ()=>{
34
- activeDescendantController.last();
35
- };
36
- const blur = ()=>{
37
- activeDescendantController.blur();
38
- onBlur();
39
- };
40
- const next = (activeOption)=>{
41
- if (activeOption) {
42
- activeDescendantController.next();
43
- } else {
44
- activeDescendantController.first();
45
- }
46
- };
47
- const previous = (activeOption)=>{
48
- if (activeOption) {
49
- activeDescendantController.prev();
50
- } else {
51
- activeDescendantController.first();
52
- }
53
- };
54
- const pageUp = ()=>{
55
- for(let i = 0; i < 10; i++){
56
- activeDescendantController.prev();
57
- }
58
- };
59
- const pageDown = ()=>{
60
- for(let i = 0; i < 10; i++){
61
- activeDescendantController.next();
62
- }
63
- };
64
- const setKeyboardNavigation = (0, _reacttabster.useSetKeyboardNavigation)();
65
- return (0, _reactutilities.useEventCallback)((e)=>{
66
- const action = (0, _dropdownKeyActions.getDropdownActionFromKey)(e, {
67
- open,
68
- multiselect,
69
- cursorPosition,
70
- allowArrowUpNavigation,
71
- isInSelectionMode
72
- });
73
- const activeOption = getActiveOption();
74
- const firstOption = activeDescendantController.first({
75
- passive: true
76
- });
77
- if (e.key === _keyboardkeys.ArrowLeft || e.key === _keyboardkeys.ArrowRight || action === 'Type') {
78
- setSelectionMode(false);
79
- } else if (action === 'Next' || action === 'Previous' || action === 'First' || action === 'Last' || action === 'PageUp' || action === 'PageDown') {
80
- setSelectionMode(true);
81
- }
82
- switch(action){
83
- case 'Last':
84
- case 'First':
85
- case 'PageDown':
86
- case 'PageUp':
87
- case 'CloseSelect':
88
- case 'Select':
89
- e.preventDefault();
90
- break;
91
- case 'Previous':
92
- e.preventDefault();
93
- break;
94
- case 'Next':
95
- e.preventDefault();
96
- break;
97
- }
98
- setKeyboardNavigation(true);
99
- switch(action){
100
- case 'First':
101
- first();
102
- if (!isInSelectionMode) {
103
- setSelectionMode(true);
104
- }
105
- break;
106
- case 'Last':
107
- last();
108
- if (!isInSelectionMode) {
109
- setSelectionMode(true);
110
- }
111
- break;
112
- case 'Next':
113
- next(activeOption);
114
- if (!isInSelectionMode) {
115
- setSelectionMode(true);
116
- }
117
- break;
118
- case 'Previous':
119
- // when active option is the first option and the action was "Previous",
120
- // this means we were in the first option and we are "leaving" the listbox
121
- if (activeOption && activeOption.id !== firstOption) {
122
- previous(activeOption);
123
- if (!isInSelectionMode) {
124
- setSelectionMode(true);
125
- }
126
- } else {
127
- blur();
128
- setSelectionMode(false);
129
- }
130
- break;
131
- case 'PageDown':
132
- pageDown();
133
- break;
134
- case 'PageUp':
135
- pageUp();
136
- break;
137
- case 'CloseSelect':
138
- if (!multiselect && !(activeOption === null || activeOption === void 0 ? void 0 : activeOption.disabled)) {
139
- blur();
140
- setSelectionMode(false);
141
- }
142
- // fallthrough
143
- case 'Select':
144
- activeOption && selectOption(e, activeOption);
145
- break;
146
- case 'Tab':
147
- !multiselect && activeOption && selectOption(e, activeOption);
148
- break;
149
- }
150
- });
151
- } //# sourceMappingURL=useTriggerKeyDown.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["useTriggerKeyDown.ts"],"sourcesContent":["/**\n * Note, this is mainly brought from Fluent UI, only removed the closing and\n * opening logic since that's not needed for this use case and added the bluring\n * functionality.\n */\n\nimport * as React from 'react';\nimport { useSetKeyboardNavigation } from '@fluentui/react-tabster';\nimport { useEventCallback } from '@fluentui/react-utilities';\nimport { getDropdownActionFromKey } from './dropdownKeyActions';\nimport { ArrowLeft, ArrowRight } from '@fluentui/keyboard-keys';\nimport type { ActiveDescendantImperativeRef } from '@fluentui/react-aria';\nimport type { OptionCollectionState, OptionValue } from './OptionCollection.types';\nimport type { SelectionProps, SelectionState } from './Selection.types';\nimport type { CursorPosition } from '../../plugins/CursorPositionPlugin';\n\nexport function useTriggerKeydown(\n options: {\n activeDescendantController: ActiveDescendantImperativeRef;\n cursorPosition: CursorPosition;\n open: boolean;\n onBlur: () => void;\n allowArrowUpNavigation: boolean;\n isInSelectionMode: boolean;\n setSelectionMode: (selectionMode: boolean) => void;\n } & OptionCollectionState &\n Pick<SelectionProps, 'multiselect'> &\n Pick<SelectionState, 'selectOption'>,\n) {\n const {\n activeDescendantController,\n getOptionById,\n selectOption,\n multiselect,\n open,\n cursorPosition,\n onBlur,\n allowArrowUpNavigation,\n isInSelectionMode,\n setSelectionMode,\n } = options;\n\n const getActiveOption = React.useCallback(() => {\n const activeOptionId = activeDescendantController.active();\n return activeOptionId ? getOptionById(activeOptionId) : undefined;\n }, [activeDescendantController, getOptionById]);\n\n const first = () => {\n activeDescendantController.first();\n };\n\n const last = () => {\n activeDescendantController.last();\n };\n\n const blur = () => {\n activeDescendantController.blur();\n onBlur();\n };\n\n const next = (activeOption: OptionValue | undefined) => {\n if (activeOption) {\n activeDescendantController.next();\n } else {\n activeDescendantController.first();\n }\n };\n\n const previous = (activeOption: OptionValue | undefined) => {\n if (activeOption) {\n activeDescendantController.prev();\n } else {\n activeDescendantController.first();\n }\n };\n\n const pageUp = () => {\n for (let i = 0; i < 10; i++) {\n activeDescendantController.prev();\n }\n };\n\n const pageDown = () => {\n for (let i = 0; i < 10; i++) {\n activeDescendantController.next();\n }\n };\n\n const setKeyboardNavigation = useSetKeyboardNavigation();\n return useEventCallback((e: React.KeyboardEvent<HTMLSpanElement>) => {\n const action = getDropdownActionFromKey(e, {\n open,\n multiselect,\n cursorPosition,\n allowArrowUpNavigation,\n isInSelectionMode,\n });\n const activeOption = getActiveOption();\n const firstOption = activeDescendantController.first({ passive: true });\n\n if (e.key === ArrowLeft || e.key === ArrowRight || action === 'Type') {\n setSelectionMode(false);\n } else if (\n action === 'Next' ||\n action === 'Previous' ||\n action === 'First' ||\n action === 'Last' ||\n action === 'PageUp' ||\n action === 'PageDown'\n ) {\n setSelectionMode(true);\n }\n\n switch (action) {\n case 'Last':\n case 'First':\n case 'PageDown':\n case 'PageUp':\n case 'CloseSelect':\n case 'Select':\n e.preventDefault();\n break;\n case 'Previous':\n e.preventDefault();\n break;\n case 'Next':\n e.preventDefault();\n break;\n }\n\n setKeyboardNavigation(true);\n\n switch (action) {\n case 'First':\n first();\n if (!isInSelectionMode) {\n setSelectionMode(true);\n }\n break;\n case 'Last':\n last();\n if (!isInSelectionMode) {\n setSelectionMode(true);\n }\n break;\n case 'Next':\n next(activeOption);\n if (!isInSelectionMode) {\n setSelectionMode(true);\n }\n break;\n case 'Previous':\n // when active option is the first option and the action was \"Previous\",\n // this means we were in the first option and we are \"leaving\" the listbox\n if (activeOption && activeOption.id !== firstOption) {\n previous(activeOption);\n if (!isInSelectionMode) {\n setSelectionMode(true);\n }\n } else {\n blur();\n setSelectionMode(false);\n }\n break;\n case 'PageDown':\n pageDown();\n break;\n case 'PageUp':\n pageUp();\n break;\n case 'CloseSelect':\n if (!multiselect && !activeOption?.disabled) {\n blur();\n setSelectionMode(false);\n }\n // fallthrough\n case 'Select':\n activeOption && selectOption(e, activeOption);\n break;\n case 'Tab':\n !multiselect && activeOption && selectOption(e, activeOption);\n break;\n }\n });\n}\n"],"names":["useTriggerKeydown","React","options","activeDescendantController","activeOptionId","multiselect","getOptionById","allowArrowUpNavigation","setSelectionMode","active","blur","undefined","onBlur","first","last","activeOption","next","previous","i","prev","pageUp","setKeyboardNavigation","useSetKeyboardNavigation","open","cursorPosition","useEventCallback","action","firstOption","getActiveOption","ArrowLeft","e","key","ArrowRight","preventDefault","isInSelectionMode","id","pageDown","disabled"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA;;;;CAIC;;;;+BAYeA;;;eAAAA;;;;iEAVJC;8BAC6B;gCACR;oCACQ;8BACH;AAM/B,SAASD,kBACdE,OAUsC;UAEtC,EAaAC,0BAAwBF,eAChBG,cACCA,EACTC,WAAG,MAACF,gBAA4BG,QAAc,EAE9CC,sBAAc,mBACZJ,EACFK,gBAAA,KAEAN;UACEC,kBAAAA,OAAAA,WAA+B,CAAA;QACjC,MAAAC,iBAAAD,2BAAAM,MAAA;QAEA,OAAMC,iBAAOJ,cAAAF,kBAAAO;;;QACXR;KAA+B;UAC/BS,QAAAA;QACFT,2BAAAU,KAAA;;UAGEC,OAAIC;mCACFZ,IAAAA;;iBAEAA;mCACFO,IAAA;QACFE;;UAGEI,OAAID,CAAAA;0BACFZ;uCACKa,IAAA;;uCAEPH,KAAA;QACF;;UAGEI,WAASC,CAAAA;0BACPf;uCACFgB,IAAA;QACF,OAAA;YAEAhB,2BAAiBU,KAAA;;;UAGfO,SAAA;QACF,IAAA,IAAAF,IAAA,GAAAA,IAAA,IAAAA,IAAA;YAEAf,2BAAMkB,IAAwBC;QAC9B;;qBAEIC;gBACAlB,IAAAA,GAAAA,IAAAA,IAAAA,IAAAA;uCACAmB,IAAAA;;;UAGFH,wBAAAC,IAAAA,sCAAA;WACAG,IAAAA,gCAAMV,EAAAA,CAAAA;cACNW,SAAMC,IAAAA,4CAAcxB,EAAAA,GAAAA;;;;;;;cAapBY,eAAAa;cAEAD,cAAQD,2BAAAA,KAAAA,CAAAA;qBACN;;iBAEA,KAAKG,uBAAA,IAAAC,EAAAC,GAAA,KAAAC,wBAAA,IAAAN,WAAA,QAAA;6BACA;mBACLA,WAAK,UAAAA,WAAA,cAAAA,WAAA,WAAAA,WAAA,UAAAA,WAAA,YAAAA,WAAA,YAAA;6BACA;;;;;;;;;gBASPI,EAAAG,cAAA;gBAEAZ;iBAEA;gCACO;;;gCAGDb;;;8BAGC;;;;wCAIH;qCACA;;;;;wCAKA;qCACA;;;;;wCAKWO;qCACJmB;;;;wFAILxB;0FACiB;oCACnBK,aAAAoB,EAAA,KAAAR,aAAA;6BACAZ;wBACF,CAAAmB,mBAAK;yCACHE;;uBAEF;;qCAEE;;;;;;;;;;oBAUF,CAAA/B,eAAK,CAAAU,CAAAA,iBAAA,QAAAA,iBAAA,KAAA,IAAA,KAAA,IAAAA,aAAAsB,QAAA,GAAA;;qCAEH;gBACJ;YACF,cAAA;YACF,KAAA"}