@gooddata/sdk-ui-kit 10.27.0-alpha.3 → 10.27.0-alpha.31

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 (160) hide show
  1. package/esm/@ui/@types/icon.d.ts +1 -1
  2. package/esm/@ui/@types/icon.d.ts.map +1 -1
  3. package/esm/@ui/@utils/keyboardNavigation.d.ts +23 -12
  4. package/esm/@ui/@utils/keyboardNavigation.d.ts.map +1 -1
  5. package/esm/@ui/@utils/keyboardNavigation.js +58 -16
  6. package/esm/@ui/@utils/keyboardNavigation.js.map +1 -1
  7. package/esm/@ui/UiButton/UiButton.d.ts +2 -0
  8. package/esm/@ui/UiButton/UiButton.d.ts.map +1 -1
  9. package/esm/@ui/UiButton/UiButton.js +2 -2
  10. package/esm/@ui/UiButton/UiButton.js.map +1 -1
  11. package/esm/@ui/UiFocusTrap/UiFocusTrap.d.ts +9 -0
  12. package/esm/@ui/UiFocusTrap/UiFocusTrap.d.ts.map +1 -1
  13. package/esm/@ui/UiFocusTrap/UiFocusTrap.js +82 -71
  14. package/esm/@ui/UiFocusTrap/UiFocusTrap.js.map +1 -1
  15. package/esm/@ui/UiIcon/icons.d.ts.map +1 -1
  16. package/esm/@ui/UiIcon/icons.js +2 -0
  17. package/esm/@ui/UiIcon/icons.js.map +1 -1
  18. package/esm/@ui/UiListbox/UiListbox.d.ts.map +1 -1
  19. package/esm/@ui/UiListbox/UiListbox.js +1 -3
  20. package/esm/@ui/UiListbox/UiListbox.js.map +1 -1
  21. package/esm/@ui/UiListbox/defaults/DefaultUiListboxStaticItemComponent.d.ts +5 -2
  22. package/esm/@ui/UiListbox/defaults/DefaultUiListboxStaticItemComponent.d.ts.map +1 -1
  23. package/esm/@ui/UiListbox/defaults/DefaultUiListboxStaticItemComponent.js.map +1 -1
  24. package/esm/@ui/UiListbox/defaults/firstCharacterSearch.d.ts +2 -2
  25. package/esm/@ui/UiListbox/defaults/firstCharacterSearch.d.ts.map +1 -1
  26. package/esm/@ui/UiListbox/defaults/firstCharacterSearch.js +1 -1
  27. package/esm/@ui/UiListbox/defaults/firstCharacterSearch.js.map +1 -1
  28. package/esm/@ui/UiListbox/types.d.ts +4 -4
  29. package/esm/@ui/UiListbox/types.d.ts.map +1 -1
  30. package/esm/@ui/UiMenu/UiMenu.d.ts +11 -0
  31. package/esm/@ui/UiMenu/UiMenu.d.ts.map +1 -0
  32. package/esm/@ui/UiMenu/UiMenu.js +36 -0
  33. package/esm/@ui/UiMenu/UiMenu.js.map +1 -0
  34. package/esm/@ui/UiMenu/context.d.ts +11 -0
  35. package/esm/@ui/UiMenu/context.d.ts.map +1 -0
  36. package/esm/@ui/UiMenu/context.js +11 -0
  37. package/esm/@ui/UiMenu/context.js.map +1 -0
  38. package/esm/@ui/UiMenu/defaults/DefaultUiMenuGroupItemComponent.d.ts +7 -0
  39. package/esm/@ui/UiMenu/defaults/DefaultUiMenuGroupItemComponent.d.ts.map +1 -0
  40. package/esm/@ui/UiMenu/defaults/DefaultUiMenuGroupItemComponent.js +21 -0
  41. package/esm/@ui/UiMenu/defaults/DefaultUiMenuGroupItemComponent.js.map +1 -0
  42. package/esm/@ui/UiMenu/defaults/DefaultUiMenuHeaderComponent.d.ts +9 -0
  43. package/esm/@ui/UiMenu/defaults/DefaultUiMenuHeaderComponent.d.ts.map +1 -0
  44. package/esm/@ui/UiMenu/defaults/DefaultUiMenuHeaderComponent.js +39 -0
  45. package/esm/@ui/UiMenu/defaults/DefaultUiMenuHeaderComponent.js.map +1 -0
  46. package/esm/@ui/UiMenu/defaults/DefaultUiMenuInteractiveItemComponent.d.ts +11 -0
  47. package/esm/@ui/UiMenu/defaults/DefaultUiMenuInteractiveItemComponent.d.ts.map +1 -0
  48. package/esm/@ui/UiMenu/defaults/DefaultUiMenuInteractiveItemComponent.js +59 -0
  49. package/esm/@ui/UiMenu/defaults/DefaultUiMenuInteractiveItemComponent.js.map +1 -0
  50. package/esm/@ui/UiMenu/defaults/DefaultUiMenuStaticItemComponent.d.ts +8 -0
  51. package/esm/@ui/UiMenu/defaults/DefaultUiMenuStaticItemComponent.d.ts.map +1 -0
  52. package/esm/@ui/UiMenu/defaults/DefaultUiMenuStaticItemComponent.js +14 -0
  53. package/esm/@ui/UiMenu/defaults/DefaultUiMenuStaticItemComponent.js.map +1 -0
  54. package/esm/@ui/UiMenu/hooks.d.ts +16 -0
  55. package/esm/@ui/UiMenu/hooks.d.ts.map +1 -0
  56. package/esm/@ui/UiMenu/hooks.js +173 -0
  57. package/esm/@ui/UiMenu/hooks.js.map +1 -0
  58. package/esm/@ui/UiMenu/itemUtils.d.ts +18 -0
  59. package/esm/@ui/UiMenu/itemUtils.d.ts.map +1 -0
  60. package/esm/@ui/UiMenu/itemUtils.js +101 -0
  61. package/esm/@ui/UiMenu/itemUtils.js.map +1 -0
  62. package/esm/@ui/UiMenu/menuBem.d.ts +2 -0
  63. package/esm/@ui/UiMenu/menuBem.d.ts.map +1 -0
  64. package/esm/@ui/UiMenu/menuBem.js +4 -0
  65. package/esm/@ui/UiMenu/menuBem.js.map +1 -0
  66. package/esm/@ui/UiMenu/types.d.ts +124 -0
  67. package/esm/@ui/UiMenu/types.d.ts.map +1 -0
  68. package/esm/@ui/UiMenu/types.js +3 -0
  69. package/esm/@ui/UiMenu/types.js.map +1 -0
  70. package/esm/Dialog/ConfirmDialogBase.d.ts.map +1 -1
  71. package/esm/Dialog/ConfirmDialogBase.js +1 -1
  72. package/esm/Dialog/ConfirmDialogBase.js.map +1 -1
  73. package/esm/Dialog/DialogBase.d.ts.map +1 -1
  74. package/esm/Dialog/DialogBase.js +2 -2
  75. package/esm/Dialog/DialogBase.js.map +1 -1
  76. package/esm/Dialog/DialogCloseButton.d.ts +1 -1
  77. package/esm/Dialog/DialogCloseButton.d.ts.map +1 -1
  78. package/esm/Dialog/DialogCloseButton.js +11 -2
  79. package/esm/Dialog/DialogCloseButton.js.map +1 -1
  80. package/esm/Dialog/ExportDialogBase.d.ts.map +1 -1
  81. package/esm/Dialog/ExportDialogBase.js +8 -3
  82. package/esm/Dialog/ExportDialogBase.js.map +1 -1
  83. package/esm/Dialog/ShareDialog/ShareDialogBase/AddGranteeBase.d.ts.map +1 -1
  84. package/esm/Dialog/ShareDialog/ShareDialogBase/AddGranteeBase.js +1 -5
  85. package/esm/Dialog/ShareDialog/ShareDialogBase/AddGranteeBase.js.map +1 -1
  86. package/esm/Dialog/ShareDialog/ShareDialogBase/GranteeItem.js +2 -2
  87. package/esm/Dialog/ShareDialog/ShareDialogBase/GranteeItem.js.map +1 -1
  88. package/esm/Dialog/ShareDialog/ShareDialogBase/ShareGranteeBase.d.ts.map +1 -1
  89. package/esm/Dialog/ShareDialog/ShareDialogBase/ShareGranteeBase.js +1 -5
  90. package/esm/Dialog/ShareDialog/ShareDialogBase/ShareGranteeBase.js.map +1 -1
  91. package/esm/Dialog/typings.d.ts +1 -0
  92. package/esm/Dialog/typings.d.ts.map +1 -1
  93. package/esm/Form/Checkbox.d.ts +1 -0
  94. package/esm/Form/Checkbox.d.ts.map +1 -1
  95. package/esm/Form/Checkbox.js +3 -3
  96. package/esm/Form/Checkbox.js.map +1 -1
  97. package/esm/Header/HeaderAccount.d.ts.map +1 -1
  98. package/esm/Header/HeaderAccount.js +2 -3
  99. package/esm/Header/HeaderAccount.js.map +1 -1
  100. package/esm/Header/HeaderHelp.d.ts.map +1 -1
  101. package/esm/Header/HeaderHelp.js +2 -3
  102. package/esm/Header/HeaderHelp.js.map +1 -1
  103. package/esm/Header/HeaderSearchButton.d.ts.map +1 -1
  104. package/esm/Header/HeaderSearchButton.js +2 -3
  105. package/esm/Header/HeaderSearchButton.js.map +1 -1
  106. package/esm/List/ListItem.d.ts +8 -21
  107. package/esm/List/ListItem.d.ts.map +1 -1
  108. package/esm/List/ListItem.js +69 -70
  109. package/esm/List/ListItem.js.map +1 -1
  110. package/esm/List/MenuList.d.ts +3 -0
  111. package/esm/List/MenuList.d.ts.map +1 -1
  112. package/esm/List/MenuList.js +3 -3
  113. package/esm/List/MenuList.js.map +1 -1
  114. package/esm/List/index.d.ts +1 -1
  115. package/esm/List/index.d.ts.map +1 -1
  116. package/esm/List/index.js.map +1 -1
  117. package/esm/RecurrenceForm/DateTime.js +2 -2
  118. package/esm/RecurrenceForm/DateTime.js.map +1 -1
  119. package/esm/RecurrenceForm/Recurrence.js +3 -3
  120. package/esm/RecurrenceForm/Recurrence.js.map +1 -1
  121. package/esm/index.d.ts +8 -1
  122. package/esm/index.d.ts.map +1 -1
  123. package/esm/index.js +5 -0
  124. package/esm/index.js.map +1 -1
  125. package/esm/sdk-ui-kit.d.ts +251 -39
  126. package/esm/typings/accessibility.d.ts +17 -0
  127. package/esm/typings/accessibility.d.ts.map +1 -1
  128. package/esm/typings/accessibility.js +1 -1
  129. package/esm/typings/accessibility.js.map +1 -1
  130. package/esm/utils/domUtilities.d.ts +11 -0
  131. package/esm/utils/domUtilities.d.ts.map +1 -1
  132. package/esm/utils/domUtilities.js +29 -0
  133. package/esm/utils/domUtilities.js.map +1 -1
  134. package/esm/utils/useId.d.ts +6 -0
  135. package/esm/utils/useId.d.ts.map +1 -1
  136. package/esm/utils/useId.js +9 -0
  137. package/esm/utils/useId.js.map +1 -1
  138. package/package.json +10 -9
  139. package/src/@ui/UiChip/UiChip.scss +1 -0
  140. package/src/@ui/UiListbox/UiListbox.scss +2 -4
  141. package/src/@ui/UiMenu/UiMenu.scss +131 -0
  142. package/src/@ui/index.scss +1 -0
  143. package/styles/css/button.css +5 -5
  144. package/styles/css/button.css.map +1 -1
  145. package/styles/css/dialog.css +3 -2
  146. package/styles/css/dialog.css.map +1 -1
  147. package/styles/css/list.css +7 -0
  148. package/styles/css/list.css.map +1 -1
  149. package/styles/css/main.css +132 -9
  150. package/styles/css/main.css.map +1 -1
  151. package/styles/css/menu.css +7 -0
  152. package/styles/css/menu.css.map +1 -1
  153. package/styles/css/typo.css +3 -0
  154. package/styles/css/typo.css.map +1 -1
  155. package/styles/scss/Button/_mixins.scss +1 -1
  156. package/styles/scss/button.scss +4 -4
  157. package/styles/scss/dialog.scss +3 -2
  158. package/styles/scss/list.scss +7 -0
  159. package/styles/scss/mixins.scss +6 -0
  160. package/styles/scss/typo-mixins.scss +2 -1
@@ -1 +1 @@
1
- {"version":3,"file":"DefaultUiListboxStaticItemComponent.d.ts","sourceRoot":"","sources":["../../../../src/@ui/UiListbox/defaults/DefaultUiListboxStaticItemComponent.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAE7E;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,oBAAoB,CAAC,KAAK,CAAC,SAAS,CAGrE,CAAC;AAEF;;;GAGG;AACH,wBAAgB,mCAAmC,CAAC,CAAC,EAAE,EACnD,IAAI,GACP,EAAE,wBAAwB,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,CAE/C"}
1
+ {"version":3,"file":"DefaultUiListboxStaticItemComponent.d.ts","sourceRoot":"","sources":["../../../../src/@ui/UiListbox/defaults/DefaultUiListboxStaticItemComponent.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAEvD;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;CAG/B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,mCAAmC,CAAC,CAAC,EAAE,EACnD,IAAI,GACP,EAAE,wBAAwB,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,CAE/C"}
@@ -1 +1 @@
1
- {"version":3,"file":"DefaultUiListboxStaticItemComponent.js","sourceRoot":"","sources":["../../../../src/@ui/UiListbox/defaults/DefaultUiListboxStaticItemComponent.tsx"],"names":[],"mappings":"AAAA,gCAAgC;AAEhC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGnD;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAA0C;IACtE,IAAI,EAAE,oBAAC,SAAS,OAAG;IACnB,IAAI,EAAE,QAAQ;CACjB,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,mCAAmC,CAAI,EACnD,IAAI,GACsB;IAC1B,OAAO,IAAI,CAAC,IAAuB,CAAC;AACxC,CAAC"}
1
+ {"version":3,"file":"DefaultUiListboxStaticItemComponent.js","sourceRoot":"","sources":["../../../../src/@ui/UiListbox/defaults/DefaultUiListboxStaticItemComponent.tsx"],"names":[],"mappings":"AAAA,gCAAgC;AAEhC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGnD;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IAC/B,IAAI,EAAE,oBAAC,SAAS,OAAG;IACnB,IAAI,EAAE,QAAiB;CAC1B,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,mCAAmC,CAAI,EACnD,IAAI,GACsB;IAC1B,OAAO,IAAI,CAAC,IAAuB,CAAC;AACxC,CAAC"}
@@ -1,8 +1,8 @@
1
1
  import React from "react";
2
- import { IListboxContext } from "../types.js";
2
+ import { IUiListboxContext } from "../types.js";
3
3
  /**
4
4
  * This is a basic implementation of moving focus to items on character key press.
5
5
  * Having this functionality is recommended by the listbox spec.
6
6
  */
7
- export declare function firstCharacterSearch<InteractiveItemData, StaticItemData>(event: React.KeyboardEvent, { items, focusedIndex, setFocusedIndex, isItemFocusable, }: IListboxContext<InteractiveItemData, StaticItemData>): void;
7
+ export declare function firstCharacterSearch<InteractiveItemData, StaticItemData>(event: React.KeyboardEvent, { items, focusedIndex, setFocusedIndex, isItemFocusable, }: IUiListboxContext<InteractiveItemData, StaticItemData>): void;
8
8
  //# sourceMappingURL=firstCharacterSearch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"firstCharacterSearch.d.ts","sourceRoot":"","sources":["../../../../src/@ui/UiListbox/defaults/firstCharacterSearch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,mBAAmB,EAAE,cAAc,EACpE,KAAK,EAAE,KAAK,CAAC,aAAa,EAC1B,EACI,KAAK,EACL,YAAY,EACZ,eAAe,EACf,eAAe,GAClB,EAAE,eAAe,CAAC,mBAAmB,EAAE,cAAc,CAAC,QAgC1D"}
1
+ {"version":3,"file":"firstCharacterSearch.d.ts","sourceRoot":"","sources":["../../../../src/@ui/UiListbox/defaults/firstCharacterSearch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,mBAAmB,EAAE,cAAc,EACpE,KAAK,EAAE,KAAK,CAAC,aAAa,EAC1B,EACI,KAAK,EACL,YAAY,EACZ,eAAe,EACf,eAAe,GAClB,EAAE,iBAAiB,CAAC,mBAAmB,EAAE,cAAc,CAAC,QAgC5D"}
@@ -8,7 +8,7 @@ export function firstCharacterSearch(event, { items, focusedIndex, setFocusedInd
8
8
  if (char.length !== 1) {
9
9
  return;
10
10
  }
11
- const itemIndex = items.findIndex((item, index) => index > focusedIndex &&
11
+ const itemIndex = items.findIndex((item, index) => index > (focusedIndex ?? 0) &&
12
12
  isItemFocusable(item) &&
13
13
  item.type === "interactive" &&
14
14
  item.stringTitle.toLowerCase().startsWith(char));
@@ -1 +1 @@
1
- {"version":3,"file":"firstCharacterSearch.js","sourceRoot":"","sources":["../../../../src/@ui/UiListbox/defaults/firstCharacterSearch.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAMhC;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAChC,KAA0B,EAC1B,EACI,KAAK,EACL,YAAY,EACZ,eAAe,EACf,eAAe,GACoC;IAEvD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;IAErC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO;IACX,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAC7B,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACZ,KAAK,GAAG,YAAY;QACpB,eAAe,CAAC,IAAI,CAAC;QACrB,IAAI,CAAC,IAAI,KAAK,aAAa;QAC3B,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CACtD,CAAC;IAEF,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;QACnB,eAAe,CAAC,SAAS,CAAC,CAAC;QAC3B,OAAO;IACX,CAAC;IAED,iEAAiE;IACjE,MAAM,cAAc,GAAG,KAAK,CAAC,SAAS,CAClC,CAAC,IAAI,EAAE,EAAE,CACL,eAAe,CAAC,IAAI,CAAC;QACrB,IAAI,CAAC,IAAI,KAAK,aAAa;QAC3B,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CACtD,CAAC;IAEF,IAAI,cAAc,KAAK,CAAC,CAAC,EAAE,CAAC;QACxB,eAAe,CAAC,cAAc,CAAC,CAAC;IACpC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"firstCharacterSearch.js","sourceRoot":"","sources":["../../../../src/@ui/UiListbox/defaults/firstCharacterSearch.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAMhC;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAChC,KAA0B,EAC1B,EACI,KAAK,EACL,YAAY,EACZ,eAAe,EACf,eAAe,GACsC;IAEzD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;IAErC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO;IACX,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAC7B,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACZ,KAAK,GAAG,CAAC,YAAY,IAAI,CAAC,CAAC;QAC3B,eAAe,CAAC,IAAI,CAAC;QACrB,IAAI,CAAC,IAAI,KAAK,aAAa;QAC3B,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CACtD,CAAC;IAEF,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;QACnB,eAAe,CAAC,SAAS,CAAC,CAAC;QAC3B,OAAO;IACX,CAAC;IAED,iEAAiE;IACjE,MAAM,cAAc,GAAG,KAAK,CAAC,SAAS,CAClC,CAAC,IAAI,EAAE,EAAE,CACL,eAAe,CAAC,IAAI,CAAC;QACrB,IAAI,CAAC,IAAI,KAAK,aAAa;QAC3B,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CACtD,CAAC;IAEF,IAAI,cAAc,KAAK,CAAC,CAAC,EAAE,CAAC;QACxB,eAAe,CAAC,cAAc,CAAC,CAAC;IACpC,CAAC;AACL,CAAC"}
@@ -40,14 +40,14 @@ export interface UiListboxStaticItemProps<T> {
40
40
  /**
41
41
  * @internal
42
42
  */
43
- export interface IListboxContext<InteractiveItemData, StaticItemData = React.ReactNode> {
43
+ export interface IUiListboxContext<InteractiveItemData, StaticItemData = React.ReactNode> {
44
44
  items: IUiListboxItem<InteractiveItemData, StaticItemData>[];
45
45
  itemRefs: React.MutableRefObject<(HTMLLIElement | null)[]>;
46
46
  onSelect: (item: IUiListboxInteractiveItem<InteractiveItemData>) => void;
47
47
  onClose?: () => void;
48
48
  selectedItemId: string | undefined;
49
49
  focusedIndex: number | undefined;
50
- setFocusedIndex: React.Dispatch<React.SetStateAction<number>>;
50
+ setFocusedIndex: React.Dispatch<React.SetStateAction<number | undefined>>;
51
51
  isItemFocusable: (item: IUiListboxItem<InteractiveItemData, StaticItemData>) => boolean;
52
52
  }
53
53
  /**
@@ -60,7 +60,7 @@ export interface UiListboxProps<InteractiveItemData, StaticItemData = React.Reac
60
60
  maxWidth?: number;
61
61
  onSelect?: (item: IUiListboxInteractiveItem<InteractiveItemData>) => void;
62
62
  onClose?: () => void;
63
- onUnhandledKeyDown?: (event: React.KeyboardEvent, context: IListboxContext<InteractiveItemData, StaticItemData>) => void;
63
+ onUnhandledKeyDown?: (event: React.KeyboardEvent, context: IUiListboxContext<InteractiveItemData, StaticItemData>) => void;
64
64
  selectedItemId?: string;
65
65
  InteractiveItemComponent?: React.ComponentType<UiListboxInteractiveItemProps<InteractiveItemData>>;
66
66
  StaticItemComponent?: React.ComponentType<UiListboxStaticItemProps<StaticItemData>>;
@@ -68,6 +68,6 @@ export interface UiListboxProps<InteractiveItemData, StaticItemData = React.Reac
68
68
  shouldKeyboardActionStopPropagation?: boolean;
69
69
  shouldCloseOnSelect?: boolean;
70
70
  isDisabledFocusable?: boolean;
71
- ariaAttributes: IDropdownBodyRenderProps["ariaAttributes"];
71
+ ariaAttributes: Omit<IDropdownBodyRenderProps["ariaAttributes"], "role">;
72
72
  }
73
73
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/@ui/UiListbox/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/@ui/UiListbox/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import React from "react";
2
+ import { IUiMenuItemData, UiMenuProps } from "./types.js";
3
+ /**
4
+ * An accessible menu component that can be navigated by keyboard.
5
+ * Usable in a <Dropdown /> component.
6
+ * Should implement https://www.w3.org/WAI/ARIA/apg/patterns/menubar/
7
+ *
8
+ * @internal
9
+ */
10
+ export declare function UiMenu<T extends IUiMenuItemData = object>(props: UiMenuProps<T>): React.ReactNode;
11
+ //# sourceMappingURL=UiMenu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UiMenu.d.ts","sourceRoot":"","sources":["../../../src/@ui/UiMenu/UiMenu.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAK1D;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,CAAC,SAAS,eAAe,GAAG,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,CAsEjG"}
@@ -0,0 +1,36 @@
1
+ // (C) 2025 GoodData Corporation
2
+ import React from "react";
3
+ import cx from "classnames";
4
+ import { b, e } from "./menuBem.js";
5
+ import { getSiblingItems } from "./itemUtils.js";
6
+ import { useKeyNavigation, useUiMenuContextValue } from "./hooks.js";
7
+ import { typedUiMenuContextStore } from "./context.js";
8
+ /**
9
+ * An accessible menu component that can be navigated by keyboard.
10
+ * Usable in a <Dropdown /> component.
11
+ * Should implement https://www.w3.org/WAI/ARIA/apg/patterns/menubar/
12
+ *
13
+ * @internal
14
+ */
15
+ export function UiMenu(props) {
16
+ const { className, maxWidth, ariaAttributes, onUnhandledKeyDown, shouldKeyboardActionPreventDefault, shouldKeyboardActionStopPropagation, } = props;
17
+ const menuComponentRef = React.useRef(null);
18
+ const itemsContainerRef = React.useRef(null);
19
+ const UiMenuContextStore = typedUiMenuContextStore();
20
+ const contextStoreValue = useUiMenuContextValue(props, menuComponentRef, itemsContainerRef);
21
+ const handleKeyDown = useKeyNavigation({
22
+ menuContextValue: contextStoreValue,
23
+ onUnhandledKeyDown,
24
+ shouldKeyboardActionPreventDefault,
25
+ shouldKeyboardActionStopPropagation,
26
+ });
27
+ const { focusedItem, items, controlType, setControlType, MenuHeaderComponent, ItemComponent, makeItemId, } = contextStoreValue;
28
+ const focusedId = focusedItem?.id;
29
+ const currentMenuLevelItems = React.useMemo(() => (focusedId === undefined ? [] : getSiblingItems(items, focusedId) ?? []), [items, focusedId]);
30
+ return (React.createElement(UiMenuContextStore, { value: contextStoreValue },
31
+ React.createElement("div", { className: cx(b(), b({ controlType }), className), style: { maxWidth }, onKeyDownCapture: () => setControlType("keyboard"), onMouseMoveCapture: () => setControlType("mouse") },
32
+ React.createElement(MenuHeaderComponent, null),
33
+ React.createElement("div", { className: e("items-container"), ref: itemsContainerRef },
34
+ React.createElement("menu", { className: e("items"), tabIndex: 0, onKeyDown: handleKeyDown, "aria-activedescendant": focusedItem ? makeItemId(focusedItem) : undefined, ...ariaAttributes, role: "menu", ref: menuComponentRef }, currentMenuLevelItems.map((item, index) => (React.createElement(ItemComponent, { key: "id" in item ? item.id : index, item: item }))))))));
35
+ }
36
+ //# sourceMappingURL=UiMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UiMenu.js","sourceRoot":"","sources":["../../../src/@ui/UiMenu/UiMenu.tsx"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AAEpC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEvD;;;;;;GAMG;AACH,MAAM,UAAU,MAAM,CAAqC,KAAqB;IAC5E,MAAM,EACF,SAAS,EACT,QAAQ,EACR,cAAc,EACd,kBAAkB,EAClB,kCAAkC,EAClC,mCAAmC,GACtC,GAAG,KAAK,CAAC;IAEV,MAAM,gBAAgB,GAAG,KAAK,CAAC,MAAM,CAAkB,IAAI,CAAC,CAAC;IAC7D,MAAM,iBAAiB,GAAG,KAAK,CAAC,MAAM,CAAiB,IAAI,CAAC,CAAC;IAE7D,MAAM,kBAAkB,GAAG,uBAAuB,EAAK,CAAC;IACxD,MAAM,iBAAiB,GAAG,qBAAqB,CAAC,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,CAAC;IAE5F,MAAM,aAAa,GAAG,gBAAgB,CAAI;QACtC,gBAAgB,EAAE,iBAAiB;QACnC,kBAAkB;QAClB,kCAAkC;QAClC,mCAAmC;KACtC,CAAC,CAAC;IAEH,MAAM,EACF,WAAW,EACX,KAAK,EACL,WAAW,EACX,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,UAAU,GACb,GAAG,iBAAiB,CAAC;IACtB,MAAM,SAAS,GAAG,WAAW,EAAE,EAAE,CAAC;IAElC,MAAM,qBAAqB,GAAG,KAAK,CAAC,OAAO,CACvC,GAAG,EAAE,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,EAC9E,CAAC,KAAK,EAAE,SAAS,CAAC,CACrB,CAAC;IAEF,OAAO,CACH,oBAAC,kBAAkB,IAAC,KAAK,EAAE,iBAAiB;QACxC,6BACI,SAAS,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,CAAC,EACjD,KAAK,EAAE,EAAE,QAAQ,EAAE,EACnB,gBAAgB,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,UAAU,CAAC,EAClD,kBAAkB,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC;YAEjD,oBAAC,mBAAmB,OAAG;YAEvB,6BACI,SAAS,EAAE,CAAC,CAAC,iBAAiB,CAAC,EAC/B,GAAG,EAAE,iBAA2D;gBAEhE,8BACI,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,EACrB,QAAQ,EAAE,CAAC,EACX,SAAS,EAAE,aAAa,2BACD,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,KACpE,cAAc,EAClB,IAAI,EAAC,MAAM,EACX,GAAG,EAAE,gBAAgB,IAEpB,qBAAqB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CACxC,oBAAC,aAAa,IAAC,GAAG,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,GAAI,CACrE,CAAC,CACC,CACL,CACJ,CACW,CACxB,CAAC;AACN,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { IUiMenuContext, IUiMenuItemData } from "./types.js";
2
+ import { IContextStore } from "@gooddata/sdk-ui";
3
+ /**
4
+ * @internal
5
+ */
6
+ export declare const UiMenuContextStore: IContextStore<IUiMenuContext<object>>;
7
+ /**
8
+ * @internal
9
+ */
10
+ export declare const typedUiMenuContextStore: <T extends IUiMenuItemData = object>() => IContextStore<IUiMenuContext<T>>;
11
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/@ui/UiMenu/context.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAsB,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAErE;;GAEG;AACH,eAAO,MAAM,kBAAkB,uCAA+C,CAAC;AAC/E;;GAEG;AACH,eAAO,MAAM,uBAAuB,4EACiC,CAAC"}
@@ -0,0 +1,11 @@
1
+ // (C) 2025 GoodData Corporation
2
+ import { createContextStore } from "@gooddata/sdk-ui";
3
+ /**
4
+ * @internal
5
+ */
6
+ export const UiMenuContextStore = createContextStore("UiMenu");
7
+ /**
8
+ * @internal
9
+ */
10
+ export const typedUiMenuContextStore = () => UiMenuContextStore;
11
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/@ui/UiMenu/context.tsx"],"names":[],"mappings":"AAAA,gCAAgC;AAGhC,OAAO,EAAE,kBAAkB,EAAiB,MAAM,kBAAkB,CAAC;AAErE;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,kBAAkB,CAAiB,QAAQ,CAAC,CAAC;AAC/E;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAuC,EAAE,CAC5E,kBAAiE,CAAC"}
@@ -0,0 +1,7 @@
1
+ import React from "react";
2
+ import { IUiMenuItemData, UiMenuGroupItemProps } from "../types.js";
3
+ /**
4
+ * @internal
5
+ */
6
+ export declare function DefaultUiMenuGroupItemComponent<T extends IUiMenuItemData = object>({ item, }: UiMenuGroupItemProps<T>): React.ReactNode;
7
+ //# sourceMappingURL=DefaultUiMenuGroupItemComponent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DefaultUiMenuGroupItemComponent.d.ts","sourceRoot":"","sources":["../../../../src/@ui/UiMenu/defaults/DefaultUiMenuGroupItemComponent.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGpE;;GAEG;AACH,wBAAgB,+BAA+B,CAAC,CAAC,SAAS,eAAe,GAAG,MAAM,EAAE,EAChF,IAAI,GACP,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,CAsB3C"}
@@ -0,0 +1,21 @@
1
+ // (C) 2025 GoodData Corporation
2
+ import React from "react";
3
+ import { e } from "../menuBem.js";
4
+ import { ShortenedText } from "../../../ShortenedText/index.js";
5
+ import { typedUiMenuContextStore } from "../context.js";
6
+ /**
7
+ * @internal
8
+ */
9
+ export function DefaultUiMenuGroupItemComponent({ item, }) {
10
+ const { createSelector, useContextStore } = typedUiMenuContextStore();
11
+ const selector = createSelector((ctx) => ({
12
+ makeItemId: ctx.makeItemId,
13
+ ItemComponent: ctx.ItemComponent,
14
+ }));
15
+ const { makeItemId, ItemComponent } = useContextStore(selector);
16
+ return (React.createElement("ul", { className: e("group"), role: "group", "aria-labelledby": makeItemId(item) },
17
+ React.createElement("li", { className: e("group-title-container"), role: "presentation", id: makeItemId(item) },
18
+ React.createElement(ShortenedText, { className: e("group-title"), ellipsisPosition: "end" }, item.stringTitle)),
19
+ item.subItems.map((groupItem, index) => (React.createElement(ItemComponent, { key: "id" in groupItem ? groupItem.id : index, item: groupItem })))));
20
+ }
21
+ //# sourceMappingURL=DefaultUiMenuGroupItemComponent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DefaultUiMenuGroupItemComponent.js","sourceRoot":"","sources":["../../../../src/@ui/UiMenu/defaults/DefaultUiMenuGroupItemComponent.tsx"],"names":[],"mappings":"AAAA,gCAAgC;AAEhC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAEhE,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAExD;;GAEG;AACH,MAAM,UAAU,+BAA+B,CAAqC,EAChF,IAAI,GACkB;IACtB,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,GAAG,uBAAuB,EAAK,CAAC;IACzE,MAAM,QAAQ,GAAG,cAAc,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACtC,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,aAAa,EAAE,GAAG,CAAC,aAAa;KACnC,CAAC,CAAC,CAAC;IAEJ,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAEhE,OAAO,CACH,4BAAI,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,qBAAmB,UAAU,CAAC,IAAI,CAAC;QACvE,4BAAI,SAAS,EAAE,CAAC,CAAC,uBAAuB,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC;YACjF,oBAAC,aAAa,IAAC,SAAS,EAAE,CAAC,CAAC,aAAa,CAAC,EAAE,gBAAgB,EAAE,KAAK,IAC9D,IAAI,CAAC,WAAW,CACL,CACf;QAEJ,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,CACrC,oBAAC,aAAa,IAAC,GAAG,EAAE,IAAI,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,GAAI,CACpF,CAAC,CACD,CACR,CAAC;AACN,CAAC"}
@@ -0,0 +1,9 @@
1
+ import React from "react";
2
+ import { IUiMenuItemData } from "../types.js";
3
+ /**
4
+ * Renders the submenu header when in a submenu.
5
+ * If not in a submenu, returns null.
6
+ * @internal
7
+ */
8
+ export declare const DefaultUiMenuHeaderComponent: React.MemoExoticComponent<(<T extends IUiMenuItemData = object>() => React.ReactNode)>;
9
+ //# sourceMappingURL=DefaultUiMenuHeaderComponent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DefaultUiMenuHeaderComponent.d.ts","sourceRoot":"","sources":["../../../../src/@ui/UiMenu/defaults/DefaultUiMenuHeaderComponent.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAO1B,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,uEAEpC,MAAM,SAAS,EAmDlB,CAAC"}
@@ -0,0 +1,39 @@
1
+ // (C) 2025 GoodData Corporation
2
+ import React from "react";
3
+ import { e } from "../menuBem.js";
4
+ import { UiIconButton } from "../../UiIconButton/UiIconButton.js";
5
+ import { useIntl } from "react-intl";
6
+ import { ShortenedText } from "../../../ShortenedText/index.js";
7
+ import { typedUiMenuContextStore } from "../context.js";
8
+ import { getItemInteractiveParent } from "../itemUtils.js";
9
+ /**
10
+ * Renders the submenu header when in a submenu.
11
+ * If not in a submenu, returns null.
12
+ * @internal
13
+ */
14
+ export const DefaultUiMenuHeaderComponent = React.memo(function DefaultUiMenuHeaderComponent() {
15
+ const { formatMessage } = useIntl();
16
+ const { useContextStore, createSelector } = typedUiMenuContextStore();
17
+ const selector = createSelector((ctx) => ({
18
+ setFocusedId: ctx.setFocusedId,
19
+ onClose: ctx.onClose,
20
+ parentItem: ctx.focusedItem ? getItemInteractiveParent(ctx.items, ctx.focusedItem.id) : undefined,
21
+ }));
22
+ const { setFocusedId, onClose, parentItem } = useContextStore(selector);
23
+ const parentItemId = parentItem?.id;
24
+ const handleBack = React.useCallback(() => {
25
+ if (parentItemId === undefined) {
26
+ return;
27
+ }
28
+ setFocusedId(parentItemId);
29
+ }, [setFocusedId, parentItemId]);
30
+ if (!parentItem) {
31
+ return null;
32
+ }
33
+ return (React.createElement("div", { role: "presentation", className: e("menu-header") },
34
+ React.createElement("button", { onClick: handleBack, className: e("menu-header-title"), "aria-label": formatMessage({ id: "menu.back" }) },
35
+ React.createElement("i", { className: "gd-icon-navigateleft" }),
36
+ React.createElement(ShortenedText, { tagName: "h3", ellipsisPosition: "end", className: e("menu-header-title-text") }, parentItem.stringTitle)),
37
+ React.createElement(UiIconButton, { size: "small", variant: "tertiary", icon: "close", label: formatMessage({ id: "menu.close" }), onClick: onClose })));
38
+ });
39
+ //# sourceMappingURL=DefaultUiMenuHeaderComponent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DefaultUiMenuHeaderComponent.js","sourceRoot":"","sources":["../../../../src/@ui/UiMenu/defaults/DefaultUiMenuHeaderComponent.tsx"],"names":[],"mappings":"AAAA,gCAAgC;AAEhC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAG3D;;;;GAIG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,4BAA4B;IAGxF,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IAEpC,MAAM,EAAE,eAAe,EAAE,cAAc,EAAE,GAAG,uBAAuB,EAAK,CAAC;IACzE,MAAM,QAAQ,GAAG,cAAc,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACtC,YAAY,EAAE,GAAG,CAAC,YAAY;QAC9B,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,UAAU,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,wBAAwB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;KACpG,CAAC,CAAC,CAAC;IAEJ,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAExE,MAAM,YAAY,GAAG,UAAU,EAAE,EAAE,CAAC;IAEpC,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QACtC,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO;QACX,CAAC;QAED,YAAY,CAAC,YAAY,CAAC,CAAC;IAC/B,CAAC,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC;IAEjC,IAAI,CAAC,UAAU,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO,CACH,6BAAK,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC,CAAC,aAAa,CAAC;QAClD,gCACI,OAAO,EAAE,UAAU,EACnB,SAAS,EAAE,CAAC,CAAC,mBAAmB,CAAC,gBACrB,aAAa,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC;YAE9C,2BAAG,SAAS,EAAC,sBAAsB,GAAG;YACtC,oBAAC,aAAa,IACV,OAAO,EAAE,IAAI,EACb,gBAAgB,EAAE,KAAK,EACvB,SAAS,EAAE,CAAC,CAAC,wBAAwB,CAAC,IAErC,UAAU,CAAC,WAAW,CACX,CACX;QACT,oBAAC,YAAY,IACT,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,UAAU,EACnB,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,aAAa,CAAC,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,EAC1C,OAAO,EAAE,OAAO,GAClB,CACA,CACT,CAAC;AACN,CAAC,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ import React from "react";
2
+ import { IUiMenuItemData, UiMenuInteractiveItemProps, UiMenuInteractiveItemWrapperProps } from "../types.js";
3
+ /**
4
+ * @internal
5
+ */
6
+ export declare function DefaultUiMenuInteractiveItemWrapperComponent<T extends IUiMenuItemData = object>({ item, }: UiMenuInteractiveItemWrapperProps<T>): React.ReactNode;
7
+ /**
8
+ * @internal
9
+ */
10
+ export declare function DefaultUiMenuInteractiveItemComponent<T extends IUiMenuItemData = object>({ item, isFocused, onSelect, }: UiMenuInteractiveItemProps<T>): React.ReactNode;
11
+ //# sourceMappingURL=DefaultUiMenuInteractiveItemComponent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DefaultUiMenuInteractiveItemComponent.d.ts","sourceRoot":"","sources":["../../../../src/@ui/UiMenu/defaults/DefaultUiMenuInteractiveItemComponent.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAE,eAAe,EAAE,0BAA0B,EAAE,iCAAiC,EAAE,MAAM,aAAa,CAAC;AAI7G;;GAEG;AACH,wBAAgB,4CAA4C,CAAC,CAAC,SAAS,eAAe,GAAG,MAAM,EAAE,EAC7F,IAAI,GACP,EAAE,iCAAiC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,CAqExD;AAED;;GAEG;AACH,wBAAgB,qCAAqC,CAAC,CAAC,SAAS,eAAe,GAAG,MAAM,EAAE,EACtF,IAAI,EACJ,SAAS,EACT,QAAQ,GACX,EAAE,0BAA0B,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,CAgBjD"}
@@ -0,0 +1,59 @@
1
+ // (C) 2025 GoodData Corporation
2
+ import React from "react";
3
+ import { e } from "../menuBem.js";
4
+ import { ShortenedText } from "../../../ShortenedText/index.js";
5
+ import { typedUiMenuContextStore } from "../context.js";
6
+ import cx from "classnames";
7
+ /**
8
+ * @internal
9
+ */
10
+ export function DefaultUiMenuInteractiveItemWrapperComponent({ item, }) {
11
+ const { useContextStore, createSelector } = typedUiMenuContextStore();
12
+ const selector = createSelector((ctx) => ({
13
+ onSelect: ctx.onSelect,
14
+ controlType: ctx.controlType,
15
+ scrollToView: ctx.scrollToView,
16
+ setFocusedId: ctx.setFocusedId,
17
+ makeItemId: ctx.makeItemId,
18
+ itemClassName: ctx.itemClassName,
19
+ InteractiveItemComponent: ctx.InteractiveItemComponent,
20
+ isFocused: ctx.focusedItem?.id === item.id,
21
+ }));
22
+ const { onSelect, scrollToView, controlType, setFocusedId, makeItemId, itemClassName, InteractiveItemComponent, isFocused, } = useContextStore(selector);
23
+ const scrollToItem = (element) => {
24
+ if (!element || !isFocused) {
25
+ return;
26
+ }
27
+ scrollToView(element);
28
+ };
29
+ const handleMouseFocus = React.useCallback(() => {
30
+ if (controlType !== "mouse") {
31
+ return;
32
+ }
33
+ setFocusedId(item.id);
34
+ }, [controlType, item.id, setFocusedId]);
35
+ const handleSelect = React.useCallback(() => {
36
+ if (item.isDisabled) {
37
+ return;
38
+ }
39
+ onSelect(item);
40
+ }, [item, onSelect]);
41
+ const classNames = cx(e("item-wrapper", {
42
+ isFocused,
43
+ isDisabled: !!item.isDisabled,
44
+ }), typeof itemClassName === "function" ? itemClassName(item) : itemClassName);
45
+ return (React.createElement("li", { ref: scrollToItem, role: "menuitem", "aria-haspopup": item.subItems ? "menu" : undefined, "aria-disabled": item.isDisabled, onMouseMove: handleMouseFocus, tabIndex: -1, id: makeItemId(item), className: classNames },
46
+ React.createElement(InteractiveItemComponent, { item: item, isFocused: isFocused, onSelect: handleSelect })));
47
+ }
48
+ /**
49
+ * @internal
50
+ */
51
+ export function DefaultUiMenuInteractiveItemComponent({ item, isFocused, onSelect, }) {
52
+ return (React.createElement("div", { className: e("item", {
53
+ isFocused,
54
+ isDisabled: !!item.isDisabled,
55
+ }), onClick: onSelect },
56
+ React.createElement(ShortenedText, { className: e("item-title"), ellipsisPosition: "end" }, item.stringTitle),
57
+ !!item.subItems && React.createElement("i", { className: "gd-icon-navigateright" })));
58
+ }
59
+ //# sourceMappingURL=DefaultUiMenuInteractiveItemComponent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DefaultUiMenuInteractiveItemComponent.js","sourceRoot":"","sources":["../../../../src/@ui/UiMenu/defaults/DefaultUiMenuInteractiveItemComponent.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import React from "react";
2
+ import { IUiMenuItemData, UiMenuStaticItemProps } from "../types.js";
3
+ /**
4
+ * By default just renders the data.
5
+ * @internal
6
+ */
7
+ export declare const DefaultUiMenuStaticItemComponent: React.MemoExoticComponent<(<T extends IUiMenuItemData = object>({ item }: UiMenuStaticItemProps<T>) => React.ReactElement)>;
8
+ //# sourceMappingURL=DefaultUiMenuStaticItemComponent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DefaultUiMenuStaticItemComponent.d.ts","sourceRoot":"","sources":["../../../../src/@ui/UiMenu/defaults/DefaultUiMenuStaticItemComponent.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGrE;;;GAGG;AACH,eAAO,MAAM,gCAAgC,yGAEN,MAAM,YAAY,EAUvD,CAAC"}
@@ -0,0 +1,14 @@
1
+ // (C) 2025 GoodData Corporation
2
+ import React from "react";
3
+ import { typedUiMenuContextStore } from "../context.js";
4
+ /**
5
+ * By default just renders the data.
6
+ * @internal
7
+ */
8
+ export const DefaultUiMenuStaticItemComponent = React.memo(function DefaultUiMenuStaticItemComponent({ item }) {
9
+ const { itemClassName } = typedUiMenuContextStore().useContextStore((ctx) => ({
10
+ itemClassName: ctx.itemClassName,
11
+ }));
12
+ return (React.createElement("li", { role: "none", className: typeof itemClassName === "function" ? itemClassName(item) : itemClassName }, item.data));
13
+ });
14
+ //# sourceMappingURL=DefaultUiMenuStaticItemComponent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DefaultUiMenuStaticItemComponent.js","sourceRoot":"","sources":["../../../../src/@ui/UiMenu/defaults/DefaultUiMenuStaticItemComponent.tsx"],"names":[],"mappings":"AAAA,gCAAgC;AAEhC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAExD;;;GAGG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,gCAAgC,CAElG,EAAE,IAAI,EAA4B;IAChC,MAAM,EAAE,aAAa,EAAE,GAAG,uBAAuB,EAAK,CAAC,eAAe,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC7E,aAAa,EAAE,GAAG,CAAC,aAAa;KACnC,CAAC,CAAC,CAAC;IAEJ,OAAO,CACH,4BAAI,IAAI,EAAC,MAAM,EAAC,SAAS,EAAE,OAAO,aAAa,KAAK,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,IAC/F,IAAI,CAAC,IAAuB,CAC5B,CACR,CAAC;AACN,CAAC,CAAC,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { IUiMenuContext, UiMenuProps, IUiMenuItemData } from "./types.js";
2
+ import React from "react";
3
+ /**
4
+ * @internal
5
+ */
6
+ export declare function useUiMenuContextValue<T extends IUiMenuItemData = object>(props: UiMenuProps<T>, menuComponentRef: React.RefObject<HTMLElement>, itemsContainerRef: React.RefObject<HTMLElement>): IUiMenuContext<T>;
7
+ /**
8
+ * @internal
9
+ */
10
+ export declare function useKeyNavigation<T extends IUiMenuItemData = object>({ menuContextValue, shouldKeyboardActionPreventDefault, shouldKeyboardActionStopPropagation, onUnhandledKeyDown, }: {
11
+ menuContextValue: IUiMenuContext<T>;
12
+ onUnhandledKeyDown: UiMenuProps<T>["onUnhandledKeyDown"];
13
+ shouldKeyboardActionPreventDefault?: boolean;
14
+ shouldKeyboardActionStopPropagation?: boolean;
15
+ }): (event: React.KeyboardEvent<Element>) => void;
16
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/@ui/UiMenu/hooks.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEH,cAAc,EAId,WAAW,EACX,eAAe,EAClB,MAAM,YAAY,CAAC;AAWpB,OAAO,KAAK,MAAM,OAAO,CAAC;AAW1B;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,eAAe,GAAG,MAAM,EACpE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,EACrB,gBAAgB,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,EAC9C,iBAAiB,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,GAChD,cAAc,CAAC,CAAC,CAAC,CAsHnB;AAwBD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,eAAe,GAAG,MAAM,EAAE,EACjE,gBAAgB,EAChB,kCAAkC,EAClC,mCAAmC,EACnC,kBAAkB,GACrB,EAAE;IACC,gBAAgB,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;IACpC,kBAAkB,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC;IACzD,kCAAkC,CAAC,EAAE,OAAO,CAAC;IAC7C,mCAAmC,CAAC,EAAE,OAAO,CAAC;CACjD,iDAwFA"}
@@ -0,0 +1,173 @@
1
+ // (C) 2022-2025 GoodData Corporation
2
+ import { makeMenuKeyboardNavigation } from "../@utils/keyboardNavigation.js";
3
+ import { getClosestFocusableSibling, getInteractiveItem, getItemInteractiveParent, getItemsByInteractiveParent, getSiblingItems, unwrapGroupItems, } from "./itemUtils.js";
4
+ import { useAutoupdateRef } from "@gooddata/sdk-ui";
5
+ import React from "react";
6
+ import { DefaultUiMenuInteractiveItemComponent, DefaultUiMenuInteractiveItemWrapperComponent, } from "./defaults/DefaultUiMenuInteractiveItemComponent.js";
7
+ import { DefaultUiMenuStaticItemComponent } from "./defaults/DefaultUiMenuStaticItemComponent.js";
8
+ import { DefaultUiMenuGroupItemComponent } from "./defaults/DefaultUiMenuGroupItemComponent.js";
9
+ import { DefaultUiMenuHeaderComponent } from "./defaults/DefaultUiMenuHeaderComponent.js";
10
+ import { v4 as uuid } from "uuid";
11
+ import { typedUiMenuContextStore } from "./context.js";
12
+ /**
13
+ * @internal
14
+ */
15
+ export function useUiMenuContextValue(props, menuComponentRef, itemsContainerRef) {
16
+ const { items, itemClassName, onSelect, onClose, InteractiveItemComponent = DefaultUiMenuInteractiveItemComponent, InteractiveItemWrapperComponent = DefaultUiMenuInteractiveItemWrapperComponent, StaticItemComponent = DefaultUiMenuStaticItemComponent, GroupItemComponent = DefaultUiMenuGroupItemComponent, MenuHeaderComponent = DefaultUiMenuHeaderComponent, shouldCloseOnSelect = true, isDisabledFocusable = true, ariaAttributes, } = props;
17
+ const [controlType, setControlType] = React.useState("unknown");
18
+ const isItemFocusable = React.useCallback((item) => {
19
+ if (!item || item.type !== "interactive") {
20
+ return false;
21
+ }
22
+ return isDisabledFocusable || !item.isDisabled;
23
+ }, [isDisabledFocusable]);
24
+ const [focusedId, setFocusedId_internal] = React.useState(() => unwrapGroupItems(items).find(isItemFocusable)?.id);
25
+ const setFocusedId = React.useCallback((...args) => {
26
+ setFocusedId_internal(...args);
27
+ // Focus is lost when clicking on an item that opens a submenu. We need to refocus the menu.
28
+ menuComponentRef.current?.focus();
29
+ }, [menuComponentRef]);
30
+ const focusedItem = focusedId === undefined ? undefined : getInteractiveItem(items, focusedId);
31
+ const handleSelectItem = React.useCallback((item) => {
32
+ if (!item || item.isDisabled) {
33
+ return;
34
+ }
35
+ // If there is no submenu, select the item
36
+ if (!item.subItems) {
37
+ onSelect?.(item);
38
+ shouldCloseOnSelect && onClose?.();
39
+ return;
40
+ }
41
+ // Otherwise focus the first focusable child
42
+ const itemToFocus = getItemsByInteractiveParent(items, item.id)?.filter(isItemFocusable)[0];
43
+ if (!itemToFocus) {
44
+ return;
45
+ }
46
+ setFocusedId(itemToFocus.id);
47
+ menuComponentRef.current?.focus();
48
+ }, [isItemFocusable, items, menuComponentRef, onClose, onSelect, setFocusedId, shouldCloseOnSelect]);
49
+ const makeItemId = React.useCallback((item) => (item && item.type === "interactive" ? `item-${ariaAttributes.id}-${item.id}` : uuid()), [ariaAttributes.id]);
50
+ const scrollToView = React.useCallback((element) => {
51
+ if (!element) {
52
+ return;
53
+ }
54
+ if (controlType === "keyboard" &&
55
+ itemsContainerRef.current &&
56
+ itemsContainerRef.current.scrollHeight > itemsContainerRef.current.clientHeight) {
57
+ element.scrollIntoView({ block: "nearest", behavior: "smooth" });
58
+ }
59
+ }, [controlType, itemsContainerRef]);
60
+ return {
61
+ controlType,
62
+ setControlType,
63
+ setFocusedId,
64
+ focusedItem,
65
+ onClose,
66
+ items,
67
+ onSelect: handleSelectItem,
68
+ itemClassName,
69
+ isItemFocusable,
70
+ makeItemId,
71
+ scrollToView,
72
+ menuComponentRef,
73
+ itemsContainerRef,
74
+ InteractiveItemWrapperComponent,
75
+ InteractiveItemComponent,
76
+ StaticItemComponent,
77
+ GroupItemComponent,
78
+ MenuHeaderComponent,
79
+ ItemComponent,
80
+ };
81
+ }
82
+ const ItemComponent = React.memo(function ItemComponent({ item, }) {
83
+ const { InteractiveItemWrapperComponent, StaticItemComponent, GroupItemComponent } = typedUiMenuContextStore().useContextStore((ctx) => ({
84
+ InteractiveItemWrapperComponent: ctx.InteractiveItemWrapperComponent,
85
+ StaticItemComponent: ctx.StaticItemComponent,
86
+ GroupItemComponent: ctx.GroupItemComponent,
87
+ }));
88
+ if (item.type === "interactive") {
89
+ return React.createElement(InteractiveItemWrapperComponent, { item: item });
90
+ }
91
+ if (item.type === "static") {
92
+ return React.createElement(StaticItemComponent, { item: item });
93
+ }
94
+ if (item.type === "group") {
95
+ return React.createElement(GroupItemComponent, { item: item });
96
+ }
97
+ return null;
98
+ });
99
+ /**
100
+ * @internal
101
+ */
102
+ export function useKeyNavigation({ menuContextValue, shouldKeyboardActionPreventDefault, shouldKeyboardActionStopPropagation, onUnhandledKeyDown, }) {
103
+ const menuContextRef = useAutoupdateRef(menuContextValue);
104
+ return makeMenuKeyboardNavigation({
105
+ shouldPreventDefault: shouldKeyboardActionPreventDefault,
106
+ shouldStopPropagation: shouldKeyboardActionStopPropagation,
107
+ onFocusPrevious: () => {
108
+ const { setFocusedId, items, isItemFocusable } = menuContextRef.current;
109
+ setFocusedId((prevId) => getClosestFocusableSibling({
110
+ direction: "backward",
111
+ itemId: prevId,
112
+ items,
113
+ isItemFocusable,
114
+ })?.id ?? prevId);
115
+ },
116
+ onFocusNext: () => {
117
+ const { setFocusedId, items, isItemFocusable } = menuContextRef.current;
118
+ setFocusedId((prevId) => getClosestFocusableSibling({
119
+ direction: "forward",
120
+ itemId: prevId,
121
+ items,
122
+ isItemFocusable,
123
+ })?.id ?? prevId);
124
+ },
125
+ onFocusFirst: () => {
126
+ const { items, isItemFocusable, setFocusedId } = menuContextRef.current;
127
+ setFocusedId((prevId) => {
128
+ if (prevId === undefined) {
129
+ return unwrapGroupItems(items).find(isItemFocusable)?.id;
130
+ }
131
+ return unwrapGroupItems(getSiblingItems(items, prevId) ?? []).find(isItemFocusable)?.id;
132
+ });
133
+ },
134
+ onFocusLast: () => {
135
+ const { items, isItemFocusable, setFocusedId } = menuContextRef.current;
136
+ setFocusedId((prevId) => {
137
+ if (prevId === undefined) {
138
+ return [...unwrapGroupItems(items)].reverse().find(isItemFocusable)?.id;
139
+ }
140
+ return [...unwrapGroupItems(getSiblingItems(items, prevId) ?? [])]
141
+ .reverse()
142
+ .find(isItemFocusable)?.id;
143
+ });
144
+ },
145
+ onSelect: () => {
146
+ const { onSelect, focusedItem } = menuContextRef.current;
147
+ onSelect(focusedItem);
148
+ },
149
+ onEnterLevel: () => {
150
+ const { onSelect, focusedItem } = menuContextRef.current;
151
+ if (focusedItem?.type !== "interactive" || !focusedItem.subItems) {
152
+ return;
153
+ }
154
+ onSelect(focusedItem);
155
+ },
156
+ onLeaveLevel: () => {
157
+ const { setFocusedId, items } = menuContextRef.current;
158
+ setFocusedId((prevId) => {
159
+ if (prevId === undefined) {
160
+ return prevId;
161
+ }
162
+ return getItemInteractiveParent(items, prevId)?.id ?? prevId;
163
+ });
164
+ },
165
+ onClose: () => {
166
+ menuContextRef.current.onClose?.();
167
+ },
168
+ onUnhandledKeyDown: (event) => {
169
+ onUnhandledKeyDown?.(event, menuContextRef.current);
170
+ },
171
+ });
172
+ }
173
+ //# sourceMappingURL=hooks.js.map