@gooddata/sdk-ui-kit 11.43.0-alpha.0 → 11.43.0-alpha.2

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 (89) 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/UiGeneralAccessRadio/UiGeneralAccessRadio.d.ts +3 -1
  4. package/esm/@ui/UiGeneralAccessRadio/UiGeneralAccessRadio.d.ts.map +1 -1
  5. package/esm/@ui/UiGeneralAccessRadio/UiGeneralAccessRadio.js +2 -2
  6. package/esm/@ui/UiGranteeAsyncPicker/UiGranteeAsyncPicker.d.ts.map +1 -1
  7. package/esm/@ui/UiGranteeAsyncPicker/UiGranteeAsyncPicker.js +7 -4
  8. package/esm/@ui/UiGranteeRow/UiGranteeRow.d.ts +3 -1
  9. package/esm/@ui/UiGranteeRow/UiGranteeRow.d.ts.map +1 -1
  10. package/esm/@ui/UiGranteeRow/UiGranteeRow.js +2 -2
  11. package/esm/@ui/UiGranteeRowControls/UiGranteeRowControls.d.ts +15 -15
  12. package/esm/@ui/UiGranteeRowControls/UiGranteeRowControls.d.ts.map +1 -1
  13. package/esm/@ui/UiGranteeRowControls/UiGranteeRowControls.js +20 -18
  14. package/esm/@ui/UiIcon/icons.d.ts.map +1 -1
  15. package/esm/@ui/UiIcon/icons.js +1 -0
  16. package/esm/@ui/UiLabelsChecklist/UiLabelsChecklist.d.ts +44 -0
  17. package/esm/@ui/UiLabelsChecklist/UiLabelsChecklist.d.ts.map +1 -0
  18. package/esm/@ui/UiLabelsChecklist/UiLabelsChecklist.js +58 -0
  19. package/esm/@ui/UiLabelsList/UiLabelsList.d.ts +6 -1
  20. package/esm/@ui/UiLabelsList/UiLabelsList.d.ts.map +1 -1
  21. package/esm/@ui/UiLabelsList/UiLabelsList.js +2 -3
  22. package/esm/@ui/UiMoreOptionsMenu/UiMoreOptionsMenu.d.ts +23 -0
  23. package/esm/@ui/UiMoreOptionsMenu/UiMoreOptionsMenu.d.ts.map +1 -0
  24. package/esm/@ui/UiMoreOptionsMenu/UiMoreOptionsMenu.js +83 -0
  25. package/esm/@ui/UiObjectShareDialog/UiObjectShareDialogCard.d.ts +14 -1
  26. package/esm/@ui/UiObjectShareDialog/UiObjectShareDialogCard.d.ts.map +1 -1
  27. package/esm/@ui/UiObjectShareDialog/UiObjectShareDialogCard.js +5 -3
  28. package/esm/@ui/UiPermissionMenu/UiPermissionMenu.d.ts +4 -15
  29. package/esm/@ui/UiPermissionMenu/UiPermissionMenu.d.ts.map +1 -1
  30. package/esm/@ui/UiPermissionMenu/UiPermissionMenu.js +11 -23
  31. package/esm/@ui/UiPopover/UiPopover.d.ts +29 -1
  32. package/esm/@ui/UiPopover/UiPopover.d.ts.map +1 -1
  33. package/esm/@ui/UiPopover/UiPopover.js +4 -4
  34. package/esm/@ui/UiTag/UiTag.d.ts +1 -0
  35. package/esm/@ui/UiTag/UiTag.d.ts.map +1 -1
  36. package/esm/@ui/UiTag/UiTag.js +10 -4
  37. package/esm/@ui/UiTags/UiTag.d.ts +0 -2
  38. package/esm/@ui/UiTags/UiTag.d.ts.map +1 -1
  39. package/esm/@ui/UiTags/UiTag.js +14 -9
  40. package/esm/@ui/UiTags/UiTags.d.ts.map +1 -1
  41. package/esm/@ui/UiTags/UiTags.js +38 -24
  42. package/esm/@ui/UiTags/interactions.d.ts +4 -9
  43. package/esm/@ui/UiTags/interactions.d.ts.map +1 -1
  44. package/esm/@ui/UiTags/interactions.js +58 -228
  45. package/esm/@ui/UiTooltip/UiTooltip.d.ts +1 -1
  46. package/esm/@ui/UiTooltip/UiTooltip.d.ts.map +1 -1
  47. package/esm/@ui/UiTooltip/UiTooltip.js +17 -9
  48. package/esm/@ui/UiTooltip/types.d.ts +10 -1
  49. package/esm/@ui/UiTooltip/types.d.ts.map +1 -1
  50. package/esm/Button/Button.d.ts.map +1 -1
  51. package/esm/Button/Button.js +2 -2
  52. package/esm/Datepicker/Datepicker.d.ts.map +1 -1
  53. package/esm/Datepicker/Datepicker.js +1 -1
  54. package/esm/Icon/icons/InsightIcons/Radar.d.ts.map +1 -1
  55. package/esm/Icon/icons/InsightIcons/Radar.js +3 -1
  56. package/esm/List/MenuList.d.ts +2 -1
  57. package/esm/List/MenuList.d.ts.map +1 -1
  58. package/esm/List/MenuList.js +2 -2
  59. package/esm/index.d.ts +2 -1
  60. package/esm/index.d.ts.map +1 -1
  61. package/esm/index.js +2 -1
  62. package/esm/locales.d.ts +11 -4
  63. package/esm/locales.d.ts.map +1 -1
  64. package/esm/locales.js +5 -4
  65. package/esm/sdk-ui-kit.d.ts +139 -85
  66. package/esm/tsdoc-metadata.json +1 -1
  67. package/package.json +11 -11
  68. package/src/@ui/UiGranteeAsyncPicker/UiGranteeAsyncPicker.scss +12 -0
  69. package/src/@ui/UiGranteeRow/UiGranteeRow.scss +5 -0
  70. package/src/@ui/UiGranteeRowControls/UiGranteeRowControls.scss +7 -0
  71. package/src/@ui/UiLabelsChecklist/UiLabelsChecklist.scss +31 -0
  72. package/src/@ui/UiLabelsList/UiLabelsList.scss +3 -0
  73. package/src/@ui/UiModalDialog/UiModalDialog.scss +11 -1
  74. package/src/@ui/UiMoreOptionsMenu/UiMoreOptionsMenu.scss +10 -0
  75. package/src/@ui/UiObjectShareDialog/UiObjectShareDialog.scss +7 -0
  76. package/src/@ui/UiPermissionMenu/UiPermissionMenu.scss +0 -7
  77. package/src/@ui/UiPopover/UiPopover.scss +7 -0
  78. package/src/@ui/UiTabs/UiTabs.scss +0 -1
  79. package/src/@ui/UiTag/UiTag.scss +4 -0
  80. package/src/@ui/UiTags/UiTags.scss +5 -1
  81. package/src/@ui/index.scss +2 -1
  82. package/styles/css/main.css +66 -21
  83. package/styles/css/main.css.map +1 -1
  84. package/styles/images/visualization-types/radar-active.svg +10 -6
  85. package/styles/images/visualization-types/radar.svg +16 -5
  86. package/esm/@ui/UiLabelsPicker/UiLabelsPicker.d.ts +0 -64
  87. package/esm/@ui/UiLabelsPicker/UiLabelsPicker.d.ts.map +0 -1
  88. package/esm/@ui/UiLabelsPicker/UiLabelsPicker.js +0 -89
  89. package/src/@ui/UiLabelsPicker/UiLabelsPicker.scss +0 -29
@@ -19,6 +19,8 @@ export interface IUiObjectShareDialogGrantee {
19
19
  email?: string;
20
20
  /** When true, the row is rendered with the "Owner" tag instead of controls. */
21
21
  isOwner?: boolean;
22
+ /** When true, the row is visually muted to signal an in-flight save. */
23
+ isPending?: boolean;
22
24
  /** Per-row controls — usually `UiGranteeRowControls`. Owner rows leave this empty. */
23
25
  controls?: ReactNode;
24
26
  }
@@ -34,16 +36,27 @@ export interface IUiObjectShareDialogCardProps {
34
36
  grantees: IUiObjectShareDialogGrantee[];
35
37
  /** Fires when the user clicks the + Add link in the SHARED WITH heading. */
36
38
  onAddClick: () => void;
39
+ /** Disables the + Add action — e.g. while the object's labels are still loading. */
40
+ isAddDisabled?: boolean;
37
41
  /** Selected general-access option. */
38
42
  generalAccess: GeneralAccessValue;
39
43
  /** Fires when the user picks a different general-access option. */
40
44
  onGeneralAccessChange: (value: GeneralAccessValue) => void;
45
+ /** Disables the general-access radio — e.g. while the access list is still loading. */
46
+ isGeneralAccessDisabled?: boolean;
41
47
  /**
42
48
  * Optional slot rendered next to the "All workspace members" row — typically a
43
49
  * `UiGranteeRowControls` pair for the workspace-wide labels picker
44
50
  * and permission level.
45
51
  */
46
52
  workspaceControls?: ReactNode;
53
+ /**
54
+ * Optional error notice. When set, it replaces the grantee list and
55
+ * general-access sections (which can't reflect a real policy on a failed
56
+ * load), so the dialog shows why it's empty instead of a misleading
57
+ * "restricted, no one has access".
58
+ */
59
+ error?: ReactNode;
47
60
  /** Test id forwarded to the root element. */
48
61
  dataTestId?: string;
49
62
  }
@@ -55,5 +68,5 @@ export interface IUiObjectShareDialogCardProps {
55
68
  *
56
69
  * @internal
57
70
  */
58
- export declare function UiObjectShareDialogCard({ objectTitle, onClose, grantees, onAddClick, generalAccess, onGeneralAccessChange, workspaceControls, dataTestId }: IUiObjectShareDialogCardProps): import("react/jsx-runtime").JSX.Element;
71
+ export declare function UiObjectShareDialogCard({ objectTitle, onClose, grantees, onAddClick, isAddDisabled, generalAccess, onGeneralAccessChange, isGeneralAccessDisabled, workspaceControls, error, dataTestId }: IUiObjectShareDialogCardProps): import("react/jsx-runtime").JSX.Element;
59
72
  //# sourceMappingURL=UiObjectShareDialogCard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"UiObjectShareDialogCard.d.ts","sourceRoot":"","sources":["../../../src/@ui/UiObjectShareDialog/UiObjectShareDialogCard.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAOvC,OAAO,EACH,KAAK,kBAAkB,EAE1B,MAAM,iDAAiD,CAAC;AACzD,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAQ/E;;;;;;GAMG;AACH,MAAM,WAAW,2BAA2B;IACxC,+DAA6D;IAC7D,EAAE,EAAE,MAAM,CAAC;IACX,sBAAsB;IACtB,IAAI,EAAE,iBAAiB,CAAC;IACxB,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wFAAsF;IACtF,QAAQ,CAAC,EAAE,SAAS,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC1C,6EAA2E;IAC3E,WAAW,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,OAAO,EAAE,MAAM,IAAI,CAAC;IAEpB,0EAA0E;IAC1E,QAAQ,EAAE,2BAA2B,EAAE,CAAC;IACxC,4EAA4E;IAC5E,UAAU,EAAE,MAAM,IAAI,CAAC;IAEvB,sCAAsC;IACtC,aAAa,EAAE,kBAAkB,CAAC;IAClC,mEAAmE;IACnE,qBAAqB,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC3D;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,SAAS,CAAC;IAE9B,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,EACpC,WAAW,EACX,OAAO,EACP,QAAQ,EACR,UAAU,EACV,aAAa,EACb,qBAAqB,EACrB,iBAAiB,EACjB,UAAU,EACb,EAAE,6BAA6B,2CAiD/B"}
1
+ {"version":3,"file":"UiObjectShareDialogCard.d.ts","sourceRoot":"","sources":["../../../src/@ui/UiObjectShareDialog/UiObjectShareDialogCard.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAOvC,OAAO,EACH,KAAK,kBAAkB,EAE1B,MAAM,iDAAiD,CAAC;AACzD,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAQ/E;;;;;;GAMG;AACH,MAAM,WAAW,2BAA2B;IACxC,+DAA6D;IAC7D,EAAE,EAAE,MAAM,CAAC;IACX,sBAAsB;IACtB,IAAI,EAAE,iBAAiB,CAAC;IACxB,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wEAAwE;IACxE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,wFAAsF;IACtF,QAAQ,CAAC,EAAE,SAAS,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC1C,6EAA2E;IAC3E,WAAW,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,OAAO,EAAE,MAAM,IAAI,CAAC;IAEpB,0EAA0E;IAC1E,QAAQ,EAAE,2BAA2B,EAAE,CAAC;IACxC,4EAA4E;IAC5E,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,sFAAoF;IACpF,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,sCAAsC;IACtC,aAAa,EAAE,kBAAkB,CAAC;IAClC,mEAAmE;IACnE,qBAAqB,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC3D,yFAAuF;IACvF,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,SAAS,CAAC;IAE9B;;;;;OAKG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAElB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,EACpC,WAAW,EACX,OAAO,EACP,QAAQ,EACR,UAAU,EACV,aAAa,EACb,aAAa,EACb,qBAAqB,EACrB,uBAAuB,EACvB,iBAAiB,EACjB,KAAK,EACL,UAAU,EACb,EAAE,6BAA6B,2CA8D/B"}
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useIntl } from "react-intl";
3
3
  import { commonDialogMessages, olpObjectShareDialogMessages } from "../../locales.js";
4
4
  import { bem } from "../@utils/bem.js";
@@ -17,10 +17,12 @@ const { b, e } = bem("gd-ui-kit-object-share-dialog");
17
17
  *
18
18
  * @internal
19
19
  */
20
- export function UiObjectShareDialogCard({ objectTitle, onClose, grantees, onAddClick, generalAccess, onGeneralAccessChange, workspaceControls, dataTestId, }) {
20
+ export function UiObjectShareDialogCard({ objectTitle, onClose, grantees, onAddClick, isAddDisabled, generalAccess, onGeneralAccessChange, isGeneralAccessDisabled, workspaceControls, error, dataTestId, }) {
21
21
  const intl = useIntl();
22
22
  const dialogTitle = intl.formatMessage(olpObjectShareDialogMessages.title, { title: objectTitle });
23
23
  return (_jsxs("div", { className: b(), "data-testid": dataTestId, children: [
24
- _jsx(UiDialogHeader, { title: dialogTitle, onClose: onClose }), _jsx(UiSectionHeading, { label: intl.formatMessage(olpObjectShareDialogMessages.sharedWith), action: _jsx(UiButton, { label: intl.formatMessage(olpObjectShareDialogMessages.add), variant: "popout", size: "small", iconBefore: "plus", onClick: onAddClick }) }), _jsx("div", { className: e("grantees"), children: grantees.map((grantee) => (_jsx(UiGranteeRow, { kind: grantee.kind, name: grantee.name, email: grantee.email, isOwner: grantee.isOwner, controls: grantee.controls }, grantee.id))) }), _jsx(UiSectionHeading, { label: intl.formatMessage(olpObjectShareDialogMessages.generalAccess) }), _jsx(UiGeneralAccessRadio, { value: generalAccess, onChange: onGeneralAccessChange, workspaceControls: workspaceControls }), _jsx(UiDialogFooter, { divider: true, children: _jsx(UiButton, { label: intl.formatMessage(commonDialogMessages.close), variant: "secondary", size: "medium", onClick: onClose }) })
24
+ _jsx(UiDialogHeader, { title: dialogTitle, onClose: onClose }), error ? (_jsx("div", { className: e("error"), role: "alert", children: error })) : (_jsxs(_Fragment, { children: [
25
+ _jsx(UiSectionHeading, { label: intl.formatMessage(olpObjectShareDialogMessages.sharedWith), action: _jsx(UiButton, { label: intl.formatMessage(olpObjectShareDialogMessages.add), variant: "popout", size: "small", iconBefore: "plus", isDisabled: isAddDisabled, onClick: onAddClick }) }), _jsx("div", { className: e("grantees"), children: grantees.map((grantee) => (_jsx(UiGranteeRow, { kind: grantee.kind, name: grantee.name, email: grantee.email, isOwner: grantee.isOwner, isPending: grantee.isPending, controls: grantee.controls }, grantee.id))) }), _jsx(UiSectionHeading, { label: intl.formatMessage(olpObjectShareDialogMessages.generalAccess) }), _jsx(UiGeneralAccessRadio, { value: generalAccess, onChange: onGeneralAccessChange, disabled: isGeneralAccessDisabled, workspaceControls: workspaceControls })
26
+ ] })), _jsx(UiDialogFooter, { divider: true, children: _jsx(UiButton, { label: intl.formatMessage(commonDialogMessages.close), variant: "secondary", size: "medium", onClick: onClose }) })
25
27
  ] }));
26
28
  }
@@ -15,18 +15,6 @@ export interface IUiPermissionMenuProps {
15
15
  selectedLevel?: PermissionMenuLevel;
16
16
  /** Fires when the user picks a permission level. */
17
17
  onPermissionChange: (level: PermissionMenuLevel) => void;
18
- /** Fires when the user picks Transfer ownership. */
19
- onTransferOwnership?: () => void;
20
- /**
21
- * Fires when the user picks the Labels entry. Display the count via
22
- * `labelsCounter`.
23
- */
24
- onLabelsClick?: () => void;
25
- /**
26
- * Counter shown next to the Labels row (e.g. `"4/4"`). Hidden
27
- * if omitted.
28
- */
29
- labelsCounter?: string;
30
18
  /** Fires when the user picks Remove access. */
31
19
  onRemoveAccess?: () => void;
32
20
  /** Test id forwarded to the menu body. */
@@ -35,10 +23,11 @@ export interface IUiPermissionMenuProps {
35
23
  /**
36
24
  * Per-grantee permission popover. Renders a fixed set of rows — two
37
25
  * permission levels (Can view & share / Can view), an optional divider,
38
- * and optional Transfer ownership / Labels / Remove access action rows.
39
- * Each level row carries an `infoCircle` tooltip.
26
+ * and an optional Remove access action row. Each level row carries an
27
+ * `infoCircle` tooltip. Labels and Transfer ownership live in the separate
28
+ * {@link UiMoreOptionsMenu}.
40
29
  *
41
30
  * @internal
42
31
  */
43
- export declare function UiPermissionMenu({ anchor, selectedLevel, onPermissionChange, onTransferOwnership, onLabelsClick, labelsCounter, onRemoveAccess, dataTestId }: IUiPermissionMenuProps): import("react/jsx-runtime").JSX.Element;
32
+ export declare function UiPermissionMenu({ anchor, selectedLevel, onPermissionChange, onRemoveAccess, dataTestId }: IUiPermissionMenuProps): import("react/jsx-runtime").JSX.Element;
44
33
  //# sourceMappingURL=UiPermissionMenu.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"UiPermissionMenu.d.ts","sourceRoot":"","sources":["../../../src/@ui/UiPermissionMenu/UiPermissionMenu.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAsB,KAAK,YAAY,EAAU,MAAM,OAAO,CAAC;AAYtE;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,OAAO,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACnC,4CAA4C;IAC5C,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC;IAC1B,qEAAmE;IACnE,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC,oDAAoD;IACpD,kBAAkB,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACzD,oDAAoD;IACpD,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAC;IACjC;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+CAA+C;IAC/C,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,0CAA0C;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAiBD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,EAC7B,MAAM,EACN,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,cAAc,EACd,UAAU,EACb,EAAE,sBAAsB,2CAoBxB"}
1
+ {"version":3,"file":"UiPermissionMenu.d.ts","sourceRoot":"","sources":["../../../src/@ui/UiPermissionMenu/UiPermissionMenu.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAsB,KAAK,YAAY,EAAU,MAAM,OAAO,CAAC;AActE;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,OAAO,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACnC,4CAA4C;IAC5C,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC;IAC1B,qEAAmE;IACnE,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC,oDAAoD;IACpD,kBAAkB,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACzD,+CAA+C;IAC/C,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,0CAA0C;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAkBD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,EAC7B,MAAM,EACN,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,UAAU,EACb,EAAE,sBAAsB,2CAiBxB"}
@@ -4,6 +4,7 @@ import { useRef } from "react";
4
4
  import { useIntl } from "react-intl";
5
5
  import { olpPermissionMessages } from "../../locales.js";
6
6
  import { bem } from "../@utils/bem.js";
7
+ import { UiIcon } from "../UiIcon/UiIcon.js";
7
8
  import { UiIconButton } from "../UiIconButton/UiIconButton.js";
8
9
  import { UiPopover } from "../UiPopover/UiPopover.js";
9
10
  import { UiTooltip } from "../UiTooltip/UiTooltip.js";
@@ -11,15 +12,16 @@ const { b, e } = bem("gd-ui-kit-permission-menu");
11
12
  /**
12
13
  * Per-grantee permission popover. Renders a fixed set of rows — two
13
14
  * permission levels (Can view & share / Can view), an optional divider,
14
- * and optional Transfer ownership / Labels / Remove access action rows.
15
- * Each level row carries an `infoCircle` tooltip.
15
+ * and an optional Remove access action row. Each level row carries an
16
+ * `infoCircle` tooltip. Labels and Transfer ownership live in the separate
17
+ * {@link UiMoreOptionsMenu}.
16
18
  *
17
19
  * @internal
18
20
  */
19
- export function UiPermissionMenu({ anchor, selectedLevel, onPermissionChange, onTransferOwnership, onLabelsClick, labelsCounter, onRemoveAccess, dataTestId, }) {
20
- return (_jsx(UiPopover, { anchor: anchor, anchorAccessibilityConfig: { ariaHaspopup: "menu" }, width: 180, content: ({ onClose }) => (_jsx(MenuBody, { selectedLevel: selectedLevel, onPermissionChange: onPermissionChange, onTransferOwnership: onTransferOwnership, onLabelsClick: onLabelsClick, labelsCounter: labelsCounter, onRemoveAccess: onRemoveAccess, onClose: onClose, dataTestId: dataTestId })) }));
21
+ export function UiPermissionMenu({ anchor, selectedLevel, onPermissionChange, onRemoveAccess, dataTestId, }) {
22
+ return (_jsx(UiPopover, { anchor: anchor, anchorAccessibilityConfig: { ariaHaspopup: "menu" }, width: 180, content: ({ onClose }) => (_jsx(MenuBody, { selectedLevel: selectedLevel, onPermissionChange: onPermissionChange, onRemoveAccess: onRemoveAccess, onClose: onClose, dataTestId: dataTestId })) }));
21
23
  }
22
- function MenuBody({ selectedLevel, onPermissionChange, onTransferOwnership, onLabelsClick, labelsCounter, onRemoveAccess, onClose, dataTestId, }) {
24
+ function MenuBody({ selectedLevel, onPermissionChange, onRemoveAccess, onClose, dataTestId, }) {
23
25
  const intl = useIntl();
24
26
  const choose = (next) => () => {
25
27
  next();
@@ -42,25 +44,11 @@ function MenuBody({ selectedLevel, onPermissionChange, onTransferOwnership, onLa
42
44
  },
43
45
  ];
44
46
  const actionItems = [];
45
- if (onTransferOwnership) {
46
- actionItems.push({
47
- key: "transfer",
48
- label: intl.formatMessage(olpPermissionMessages.transferOwnership),
49
- onClick: choose(onTransferOwnership),
50
- });
51
- }
52
- if (onLabelsClick) {
53
- actionItems.push({
54
- key: "labels",
55
- label: intl.formatMessage(olpPermissionMessages.labels),
56
- counter: labelsCounter,
57
- onClick: choose(onLabelsClick),
58
- });
59
- }
60
47
  if (onRemoveAccess) {
61
48
  actionItems.push({
62
49
  key: "remove",
63
50
  label: intl.formatMessage(olpPermissionMessages.removeAccess),
51
+ icon: "trash",
64
52
  onClick: choose(onRemoveAccess),
65
53
  });
66
54
  }
@@ -99,13 +87,13 @@ function PermissionMenuItem({ item, selectedLevel }) {
99
87
  const intl = useIntl();
100
88
  // Tooltip anchor must live OUTSIDE the menu-item button so we don't nest an
101
89
  // interactive element inside a button (invalid HTML, breaks focus). The row
102
- // wrapper provides the flex layout; the button covers label + counter; the
90
+ // wrapper provides the flex layout; the button covers the label; the
103
91
  // tooltip sits next to the button.
104
92
  const isRadio = !!item.radioValue;
105
93
  const isChecked = isRadio && item.radioValue === selectedLevel;
106
94
  return (_jsxs("div", { className: e("item-row"), children: [
107
- _jsxs("button", { type: "button", role: isRadio ? "menuitemradio" : "menuitem", "aria-checked": isRadio ? isChecked : undefined, className: e("item"), onClick: item.onClick, children: [
108
- _jsx("span", { className: e("item-label"), children: item.label }), item.counter ? _jsx("span", { className: e("item-counter"), children: item.counter }) : null] }), item.tooltip ? (_jsx(UiTooltip, { triggerBy: ["hover", "focus"], content: item.tooltip, anchor: _jsx(UiIconButton, { icon: "infoCircle", variant: "tertiary", size: "small", accessibilityConfig: {
95
+ _jsxs("button", { type: "button", role: isRadio ? "menuitemradio" : "menuitem", "aria-checked": isRadio ? isChecked : undefined, className: e("item"), onClick: item.onClick, children: [item.icon ? _jsx(UiIcon, { type: item.icon, size: 16, color: "complementary-7" }) : null, _jsx("span", { className: e("item-label"), children: item.label })
96
+ ] }), item.tooltip ? (_jsx(UiTooltip, { triggerBy: ["hover", "focus"], content: item.tooltip, anchor: _jsx(UiIconButton, { icon: "infoCircle", variant: "tertiary", size: "small", accessibilityConfig: {
109
97
  ariaLabel: intl.formatMessage(olpPermissionMessages.moreInfoAriaLabel, {
110
98
  label: item.label,
111
99
  }),
@@ -27,10 +27,29 @@ export interface IUiPopoverProps {
27
27
  content?: ReactNode | ((args: {
28
28
  onClose: () => void;
29
29
  }) => ReactNode);
30
+ /**
31
+ * Padding around the content surface. Defaults to `"default"`. Use `"none"`
32
+ * for edge-to-edge content whose own children carry their inset (e.g. a list
33
+ * of full-bleed rows); the surface then also stretches the content to its
34
+ * full width.
35
+ */
36
+ contentPadding?: "default" | "none";
30
37
  footer?: ReactNode | ((args: {
31
38
  onClose: () => void;
32
39
  }) => ReactNode);
33
40
  triggerBy?: IUiTooltipProps["triggerBy"];
41
+ /**
42
+ * Where the popover sits relative to its anchor (the arrow side; the panel
43
+ * opens on the opposite side). Defaults to `"top-start"` — i.e. the panel
44
+ * opens below the anchor, left-aligned.
45
+ */
46
+ arrowPlacement?: IUiTooltipProps["arrowPlacement"];
47
+ /**
48
+ * Allow the popover to flip to the opposite side when the preferred side
49
+ * would overflow. Defaults to `true`. Set `false` to pin it to
50
+ * `arrowPlacement` (e.g. an anchor that should always open downward).
51
+ */
52
+ optimalPlacement?: boolean;
34
53
  closeText?: string;
35
54
  closeVisible?: boolean;
36
55
  initialFocus?: RefObject<HTMLElement> | string;
@@ -46,11 +65,20 @@ export interface IUiPopoverProps {
46
65
  * When true, uses UiFocusManager's focus trap instead of tabOutHandler
47
66
  */
48
67
  enableFocusTrap?: boolean;
68
+ /**
69
+ * Controls the open state. When set, the popover ignores anchor clicks and
70
+ * opens/closes purely from this prop; pair with `onOpenChange` to
71
+ * react to outside-click / Escape. When omitted the popover stays
72
+ * uncontrolled and opens on anchor click as before.
73
+ */
74
+ isOpen?: boolean;
75
+ /** Fires when an interaction (outside-click, Escape) requests an open-state change. */
76
+ onOpenChange?: (open: boolean) => void;
49
77
  onOpen?: () => void;
50
78
  onClose?: () => void;
51
79
  }
52
80
  /**
53
81
  * @internal
54
82
  */
55
- export declare function UiPopover({ id, accessibilityConfig, anchor, anchorAccessibilityConfig, width, title, tabIndex, disabled, content, footer, closeText, closeVisible, initialFocus, returnFocusTo, triggerBy, returnFocusAfterClose, focusCheckFn, enableFocusTrap, onOpen, onClose }: IUiPopoverProps): import("react/jsx-runtime").JSX.Element;
83
+ export declare function UiPopover({ id, accessibilityConfig, anchor, anchorAccessibilityConfig, width, title, tabIndex, disabled, content, contentPadding, footer, closeText, closeVisible, initialFocus, returnFocusTo, triggerBy, arrowPlacement, optimalPlacement, returnFocusAfterClose, focusCheckFn, enableFocusTrap, isOpen, onOpenChange, onOpen, onClose }: IUiPopoverProps): import("react/jsx-runtime").JSX.Element;
56
84
  //# sourceMappingURL=UiPopover.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"UiPopover.d.ts","sourceRoot":"","sources":["../../../src/@ui/UiPopover/UiPopover.tsx"],"names":[],"mappings":"AAEA,OAAO,EACH,KAAK,cAAc,EAEnB,KAAK,YAAY,EACjB,KAAK,SAAS,EAGd,KAAK,SAAS,EAIjB,MAAM,OAAO,CAAC;AAEf,OAAO,EAAE,KAAK,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAM/E,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAqB7D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC;IAC1B;;;;;;;OAOG;IACH,yBAAyB,CAAC,EAAE;QACxB,YAAY,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;QACvE,YAAY,CAAC,EAAE,cAAc,CAAC,eAAe,CAAC,CAAC;KAClD,CAAC;IACF,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,wBAAwB,CAAC;IAC/C,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,OAAO,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,IAAI,CAAA;KAAE,KAAK,SAAS,CAAC,CAAC;IACrE,MAAM,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,IAAI,CAAA;KAAE,KAAK,SAAS,CAAC,CAAC;IACpE,SAAS,CAAC,EAAE,eAAe,CAAC,WAAW,CAAC,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,SAAS,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC;IAC/C,aAAa,CAAC,EAAE,SAAS,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC;IAChD,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC;IACjD;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,EACtB,EAAE,EACF,mBAAgD,EAChD,MAAM,EACN,yBAAyB,EACzB,KAAiB,EACjB,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,MAAM,EACN,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,SAAqB,EACrB,qBAA4B,EAC5B,YAAkC,EAClC,eAAuB,EACvB,MAAM,EACN,OAAO,EACV,EAAE,eAAe,2CA4GjB"}
1
+ {"version":3,"file":"UiPopover.d.ts","sourceRoot":"","sources":["../../../src/@ui/UiPopover/UiPopover.tsx"],"names":[],"mappings":"AAEA,OAAO,EACH,KAAK,cAAc,EAEnB,KAAK,YAAY,EACjB,KAAK,SAAS,EAGd,KAAK,SAAS,EAIjB,MAAM,OAAO,CAAC;AAEf,OAAO,EAAE,KAAK,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAM/E,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAqB7D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC;IAC1B;;;;;;;OAOG;IACH,yBAAyB,CAAC,EAAE;QACxB,YAAY,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;QACvE,YAAY,CAAC,EAAE,cAAc,CAAC,eAAe,CAAC,CAAC;KAClD,CAAC;IACF,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,wBAAwB,CAAC;IAC/C,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,OAAO,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,IAAI,CAAA;KAAE,KAAK,SAAS,CAAC,CAAC;IACrE;;;;;OAKG;IACH,cAAc,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IACpC,MAAM,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,IAAI,CAAA;KAAE,KAAK,SAAS,CAAC,CAAC;IACpE,SAAS,CAAC,EAAE,eAAe,CAAC,WAAW,CAAC,CAAC;IACzC;;;;OAIG;IACH,cAAc,CAAC,EAAE,eAAe,CAAC,gBAAgB,CAAC,CAAC;IACnD;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,SAAS,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC;IAC/C,aAAa,CAAC,EAAE,SAAS,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC;IAChD,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC;IACjD;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,uFAAuF;IACvF,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,EACtB,EAAE,EACF,mBAAgD,EAChD,MAAM,EACN,yBAAyB,EACzB,KAAiB,EACjB,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,cAA0B,EAC1B,MAAM,EACN,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,SAAqB,EACrB,cAA4B,EAC5B,gBAAuB,EACvB,qBAA4B,EAC5B,YAAkC,EAClC,eAAuB,EACvB,MAAM,EACN,YAAY,EACZ,MAAM,EACN,OAAO,EACV,EAAE,eAAe,2CA8GjB"}
@@ -23,7 +23,7 @@ function buildAnchorAriaAttrs(cfg) {
23
23
  /**
24
24
  * @internal
25
25
  */
26
- export function UiPopover({ id, accessibilityConfig = defaultAccessibilityConfig, anchor, anchorAccessibilityConfig, width = "default", title, tabIndex, disabled, content, footer, closeText, closeVisible, initialFocus, returnFocusTo, triggerBy = ["click"], returnFocusAfterClose = true, focusCheckFn = defaultFocusCheckFn, enableFocusTrap = false, onOpen, onClose, }) {
26
+ export function UiPopover({ id, accessibilityConfig = defaultAccessibilityConfig, anchor, anchorAccessibilityConfig, width = "default", title, tabIndex, disabled, content, contentPadding = "default", footer, closeText, closeVisible, initialFocus, returnFocusTo, triggerBy = ["click"], arrowPlacement = "top-start", optimalPlacement = true, returnFocusAfterClose = true, focusCheckFn = defaultFocusCheckFn, enableFocusTrap = false, isOpen, onOpenChange, onOpen, onClose, }) {
27
27
  const ref = useRef(null);
28
28
  const returnFocus = useMemo(() => {
29
29
  return returnFocusTo ?? ref;
@@ -35,7 +35,7 @@ export function UiPopover({ id, accessibilityConfig = defaultAccessibilityConfig
35
35
  // popovers (e.g. UiPermissionMenu) emit a dangling reference. Caller-supplied
36
36
  // ariaLabel / ariaLabelledBy in accessibilityConfig still takes precedence.
37
37
  const titleLabelledBy = title ? titleId : undefined;
38
- return (_jsx(UiTooltip, { onOpen: onOpen, onClose: onClose, accessibilityConfig: {
38
+ return (_jsx(UiTooltip, { isOpen: isOpen, onOpenChange: onOpenChange, onOpen: onOpen, onClose: onClose, accessibilityConfig: {
39
39
  ariaLabelledBy: titleLabelledBy,
40
40
  ...accessibilityConfig,
41
41
  role: "dialog",
@@ -56,8 +56,8 @@ export function UiPopover({ id, accessibilityConfig = defaultAccessibilityConfig
56
56
  onClose();
57
57
  }, children: _jsxs("div", { id: id ?? currentId, tabIndex: 0, className: b(), style: { width: width === "default" ? undefined : width }, children: [title || closeVisible ? (_jsxs("div", { className: e("header"), children: [title ? (typeof title === "string" ? (_jsx("div", { id: titleId, className: e("header-title"), children: title })) : (_jsx("div", { id: titleId, children: title }))) : null, closeVisible ? (_jsx("div", { className: e("header-close"), children: _jsx(UiButton, { label: "", size: "small", variant: "tertiary", iconBefore: "close", accessibilityConfig: {
58
58
  ariaLabel: closeText,
59
- }, onClick: onClose }) })) : null] })) : null, content ? (_jsx("div", { className: e("content"), children: typeof content === "function" ? content({ onClose }) : content })) : null, footer ? (_jsx("div", { className: e("footer"), children: typeof footer === "function" ? footer({ onClose }) : footer })) : null] }) }));
60
- }, variant: "none", behaviour: "popover", triggerBy: triggerBy, showArrow: false, optimalPlacement: true, arrowPlacement: "top-start", disabled: disabled }));
59
+ }, onClick: onClose }) })) : null] })) : null, content ? (_jsx("div", { className: e("content", { padding: contentPadding }), children: typeof content === "function" ? content({ onClose }) : content })) : null, footer ? (_jsx("div", { className: e("footer"), children: typeof footer === "function" ? footer({ onClose }) : footer })) : null] }) }));
60
+ }, variant: "none", behaviour: "popover", triggerBy: triggerBy, showArrow: false, optimalPlacement: optimalPlacement, arrowPlacement: arrowPlacement, disabled: disabled }));
61
61
  }
62
62
  function mergeRefs(...refs) {
63
63
  return (value) => {
@@ -26,6 +26,7 @@ export type UiTagProps = {
26
26
  onDeleteKeyDown?: (event: KeyboardEvent<HTMLButtonElement>) => void;
27
27
  tabIndex?: number;
28
28
  deleteTabIndex?: number;
29
+ labelAs?: "button" | "span";
29
30
  };
30
31
  /**
31
32
  * @internal
@@ -1 +1 @@
1
- {"version":3,"file":"UiTag.d.ts","sourceRoot":"","sources":["../../../src/@ui/UiTag/UiTag.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,EAAyC,MAAM,OAAO,CAAC;AAEnG,OAAO,EAAE,KAAK,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAO3D;;GAEG;AACH,MAAM,WAAW,yBAA0B,SAAQ,wBAAwB;IACvE,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,WAAW,CAAC;IAC7C,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,QAAQ,CAAC;IACtB,eAAe,CAAC,EAAE,UAAU,CAAC;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,yBAAyB,CAAC;IAChD,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IACrD,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IACtD,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,KAAK,0GA0FhB,CAAC"}
1
+ {"version":3,"file":"UiTag.d.ts","sourceRoot":"","sources":["../../../src/@ui/UiTag/UiTag.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,EAAyC,MAAM,OAAO,CAAC;AAEnG,OAAO,EAAE,KAAK,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAO3D;;GAEG;AACH,MAAM,WAAW,yBAA0B,SAAQ,wBAAwB;IACvE,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,WAAW,CAAC;IAC7C,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,QAAQ,CAAC;IACtB,eAAe,CAAC,EAAE,UAAU,CAAC;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,yBAAyB,CAAC;IAChD,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IACrD,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IACtD,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;CAC/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,KAAK,0GA8GhB,CAAC"}
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  // (C) 2025-2026 GoodData Corporation
3
3
  import { forwardRef, useLayoutEffect, useState } from "react";
4
4
  import { bem } from "../@utils/bem.js";
@@ -8,7 +8,7 @@ const { b, e } = bem("gd-ui-kit-tag");
8
8
  /**
9
9
  * @internal
10
10
  */
11
- export const UiTag = forwardRef(function UiTag({ label, size = "small", variant = "solid", iconBefore, iconBeforeColor, tabIndex, deleteTabIndex, accessibilityConfig, isDisabled, isDeletable, dataTestId, onClick, onDelete, onDeleteKeyDown, }, ref) {
11
+ export const UiTag = forwardRef(function UiTag({ label, size = "small", variant = "solid", iconBefore, iconBeforeColor, tabIndex, deleteTabIndex, accessibilityConfig, isDisabled, isDeletable, dataTestId, labelAs, onClick, onDelete, onDeleteKeyDown, }, ref) {
12
12
  const [labelRef, setLabelRef] = useState(null);
13
13
  const [hasTooltip, setHasTooltip] = useState(false);
14
14
  const { ariaLabel, ariaLabelledBy, deleteAriaLabel } = accessibilityConfig ?? {};
@@ -23,7 +23,13 @@ export const UiTag = forwardRef(function UiTag({ label, size = "small", variant
23
23
  const iconSize = size === "small" ? 14 : 16;
24
24
  const defaultIconColor = variant === "decorated" ? "complementary-0" : "complementary-6";
25
25
  const iconColor = iconBeforeColor ?? defaultIconColor;
26
- const button = (_jsxs("button", { ref: ref, tabIndex: tabIndex, "data-testid": dataTestId, className: e("trigger", { isDeletable: isDeletable ?? false, isDisabled: isDisabled ?? false }), disabled: isDisabled, "aria-disabled": isDisabled, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, onClick: onClick, children: [iconBefore ? (_jsx("span", { className: e("icon-before"), children: _jsx(UiIcon, { type: iconBefore, size: iconSize, color: iconColor }) })) : null, _jsx("span", { className: e("label"), ref: setLabelRef, children: label })
26
+ const labelIsButton = labelAs ? labelAs === "button" : onClick !== undefined;
27
+ const labelClassName = e("trigger", {
28
+ isDeletable: isDeletable ?? false,
29
+ isDisabled: isDisabled ?? false,
30
+ });
31
+ const labelInner = (_jsxs(_Fragment, { children: [iconBefore ? (_jsx("span", { className: e("icon-before"), children: _jsx(UiIcon, { type: iconBefore, size: iconSize, color: iconColor }) })) : null, _jsx("span", { className: e("label"), ref: setLabelRef, children: label })
27
32
  ] }));
28
- return (_jsxs("div", { className: b({ size, variant }), children: [hasTooltip ? (_jsx(UiTooltip, { anchor: button, content: _jsx("div", { className: e("tooltip"), children: label }), triggerBy: ["hover"], arrowPlacement: "top" })) : (button), isDeletable && !isDisabled ? (_jsx("button", { tabIndex: deleteTabIndex, "data-testid": dataTestId ? `${dataTestId}-delete-button` : undefined, "aria-label": deleteAriaLabel, className: e("delete"), onClick: onDelete, onKeyDown: onDeleteKeyDown, children: _jsx("span", { className: e("icon-delete"), children: _jsx(UiIcon, { size: 14, type: "cross", color: variant === "decorated" ? "complementary-0" : "complementary-6" }) }) })) : null] }));
33
+ const labelElement = labelIsButton ? (_jsx("button", { ref: ref, tabIndex: tabIndex, "data-testid": dataTestId, className: labelClassName, disabled: isDisabled, "aria-disabled": isDisabled, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, onClick: onClick, children: labelInner })) : (_jsx("span", { className: labelClassName, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, "data-testid": dataTestId, children: labelInner }));
34
+ return (_jsxs("div", { className: b({ size, variant }), children: [hasTooltip ? (_jsx(UiTooltip, { anchor: labelElement, content: _jsx("div", { className: e("tooltip"), children: label }), triggerBy: ["hover"], arrowPlacement: "top" })) : (labelElement), isDeletable && !isDisabled ? (_jsx("button", { tabIndex: deleteTabIndex, "data-testid": dataTestId ? `${dataTestId}-delete-button` : undefined, "aria-label": deleteAriaLabel, className: e("delete"), onClick: onDelete, onKeyDown: onDeleteKeyDown, children: _jsx("span", { className: e("icon-delete"), children: _jsx(UiIcon, { size: 14, type: "cross", color: variant === "decorated" ? "complementary-0" : "complementary-6" }) }) })) : null] }));
29
35
  });
@@ -3,9 +3,7 @@ export interface IUiTagProps {
3
3
  tag: IUiTagDef;
4
4
  isDeletable: boolean;
5
5
  deleteLabel?: string;
6
- isReadOnly?: boolean;
7
6
  isDisabled?: boolean;
8
- isFocused?: boolean;
9
7
  size?: "small" | "large";
10
8
  onDelete?: (tag: IUiTagDef) => void;
11
9
  onClick?: (tag: IUiTagDef) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"UiTag.d.ts","sourceRoot":"","sources":["../../../src/@ui/UiTags/UiTag.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAI5C,MAAM,WAAW,WAAW;IACxB,GAAG,EAAE,SAAS,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,IAAI,CAAC;IACpC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC9B;AAED,eAAO,MAAM,KAAK,2GA+BhB,CAAC"}
1
+ {"version":3,"file":"UiTag.d.ts","sourceRoot":"","sources":["../../../src/@ui/UiTags/UiTag.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAI5C,MAAM,WAAW,WAAW;IACxB,GAAG,EAAE,SAAS,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,IAAI,CAAC;IACpC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC9B;AAED,eAAO,MAAM,KAAK,2GA6ChB,CAAC"}
@@ -4,16 +4,21 @@ import { forwardRef } from "react";
4
4
  import { bem } from "../@utils/bem.js";
5
5
  import { UiTag as UiTagComponent } from "../UiTag/UiTag.js";
6
6
  const { e } = bem("gd-ui-kit-tags");
7
- export const UiTag = forwardRef(function UiTag({ tag, maxWidth, isDeletable, isDisabled, isFocused, size, deleteLabel, onDelete, onClick }, ref) {
7
+ export const UiTag = forwardRef(function UiTag({ tag, maxWidth, isDeletable, isDisabled, size, deleteLabel, onDelete, onClick }, ref) {
8
8
  const canBeDeleted = isDeletable && (tag.isDeletable ?? true);
9
- return (_jsx("div", { className: e("tag", { isFocused: isFocused ?? false }), role: "listitem", style: { maxWidth }, children: _jsx(UiTagComponent, { ref: ref, tabIndex: -1, deleteTabIndex: -1, label: `${tag.label}`, size: size, iconBefore: tag.iconBefore, isDeletable: canBeDeleted, isDisabled: isDisabled, accessibilityConfig: {
9
+ const isClickable = onClick !== undefined;
10
+ return (_jsx("div", { className: e("tag"), style: { maxWidth }, "data-tag-id": tag.id, tabIndex: -1, "aria-label": tag.label, children: _jsx(UiTagComponent, { ref: isClickable ? ref : undefined, labelAs: isClickable ? "button" : "span", label: `${tag.label}`, size: size, iconBefore: tag.iconBefore, isDeletable: canBeDeleted, isDisabled: isDisabled, accessibilityConfig: {
10
11
  ariaLabel: tag.label,
11
12
  deleteAriaLabel: `${deleteLabel ?? "Delete"} ${tag.label}`,
12
- }, onDelete: (e) => {
13
- onDelete?.(tag);
14
- e.stopPropagation();
15
- }, onClick: (e) => {
16
- onClick?.(tag);
17
- e.stopPropagation();
18
- } }) }));
13
+ }, onDelete: canBeDeleted
14
+ ? (e) => {
15
+ onDelete?.(tag);
16
+ e.stopPropagation();
17
+ }
18
+ : undefined, onClick: isClickable
19
+ ? (e) => {
20
+ onClick(tag);
21
+ e.stopPropagation();
22
+ }
23
+ : undefined }) }));
19
24
  });
@@ -1 +1 @@
1
- {"version":3,"file":"UiTags.d.ts","sourceRoot":"","sources":["../../../src/@ui/UiTags/UiTags.tsx"],"names":[],"mappings":"AAqBA,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAO/D;;GAEG;AACH,wBAAgB,MAAM,CAAC,EACnB,IAAI,EACJ,UAAU,EACV,QAAoB,EACpB,SAAkB,EAClB,WAAsB,EACtB,UAAoB,EACpB,SAAkB,EAClB,WAAuB,EACvB,SAAuB,EACvB,WAAsB,EACtB,cAA+B,EAC/B,IAAoB,EACpB,IAAc,EACd,aAAoB,EACpB,YAAmB,EACnB,QAAgB,EAChB,UAAqB,EACrB,QAAmB,EACnB,WAAsB,EACtB,mBAAgD,EAChD,eAAe,EAClB,EAAE,YAAY,2CAmUd"}
1
+ {"version":3,"file":"UiTags.d.ts","sourceRoot":"","sources":["../../../src/@ui/UiTags/UiTags.tsx"],"names":[],"mappings":"AAsBA,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAO/D;;GAEG;AACH,wBAAgB,MAAM,CAAC,EACnB,IAAI,EACJ,UAAU,EACV,QAAoB,EACpB,SAAkB,EAClB,WAAsB,EACtB,UAAoB,EACpB,SAAkB,EAClB,WAAuB,EACvB,SAAuB,EACvB,WAAsB,EACtB,cAA+B,EAC/B,IAAoB,EACpB,IAAc,EACd,aAAoB,EACpB,YAAmB,EACnB,QAAgB,EAChB,UAAU,EACV,QAAmB,EACnB,WAAsB,EACtB,mBAAgD,EAChD,eAAe,EAClB,EAAE,YAAY,2CAuVd"}
@@ -9,6 +9,7 @@ import { UiComboboxList } from "../UiCombobox/UiComboboxList.js";
9
9
  import { UiComboboxListItem, UiComboboxListItemCreatableLabel, UiComboboxListItemLabel, } from "../UiCombobox/UiComboboxListItem.js";
10
10
  import { UiComboboxPopup } from "../UiCombobox/UiComboboxPopup.js";
11
11
  import { UiPopover } from "../UiPopover/UiPopover.js";
12
+ import { UiTooltip } from "../UiTooltip/UiTooltip.js";
12
13
  import { useResponsiveTags } from "./hooks/useResponsiveTags.js";
13
14
  import { useTagsInteractions } from "./interactions.js";
14
15
  import { UiTag } from "./UiTag.js";
@@ -17,7 +18,7 @@ const defaultAccessibilityConfig = {};
17
18
  /**
18
19
  * @internal
19
20
  */
20
- export function UiTags({ tags, tagOptions, addLabel = "Add tag", nameLabel = "Name", cancelLabel = "Cancel", closeLabel = "Close", saveLabel = "Save", noTagsLabel = "No tags", moreLabel = "More tags", removeLabel = "Remove", creatableLabel = "(Create new)", mode = "single-line", size = "small", canDeleteTags = true, canCreateTag = true, readOnly = false, onTagClick = () => { }, onTagAdd = () => { }, onTagRemove = () => { }, accessibilityConfig = defaultAccessibilityConfig, renderAddButton, }) {
21
+ export function UiTags({ tags, tagOptions, addLabel = "Add tag", nameLabel = "Name", cancelLabel = "Cancel", closeLabel = "Close", saveLabel = "Save", noTagsLabel = "No tags", moreLabel = "More tags", removeLabel = "Remove", creatableLabel = "(Create new)", mode = "single-line", size = "small", canDeleteTags = true, canCreateTag = true, readOnly = false, onTagClick, onTagAdd = () => { }, onTagRemove = () => { }, accessibilityConfig = defaultAccessibilityConfig, renderAddButton, }) {
21
22
  const inputRef = useRef(null);
22
23
  const [popupOpen, setPopupOpen] = useState(false);
23
24
  const popupId = useId();
@@ -27,7 +28,13 @@ export function UiTags({ tags, tagOptions, addLabel = "Add tag", nameLabel = "Na
27
28
  const isAddable = canCreateTag && !readOnly && !hasCustomAddButton;
28
29
  const { rootRef, showedTags, hiddenTags, tagsContainerRef, hiddenTagsContainerRef, tooltipTagsContainerRef, addButtonRef, allContainerRef, tooltipWidth, availableWidth, lastAvailableWidth, setTooltipContainer, } = useResponsiveTags(tags, mode, [canCreateTag, canDeleteTags, readOnly, hasCustomAddButton]);
29
30
  const items = [...showedTags, hiddenTags];
30
- const { handleKeyDown, interactionState, onMoreOpen, onMoreClose, onAddOpen, onAddClose, showedFocusedIndex, hiddenFocusedIndex, tag, setTag, onTagClickHandler, onTagRemoveHandler, onTagAddHandler, } = useTagsInteractions(rootRef, tooltipTagsContainerRef, showedTags, hiddenTags, onTagClick, onTagAdd, onTagRemove);
31
+ const { interactionState, onAddOpen, onAddClose, onMoreOpen, onMoreClose, tag, setTag, onTagClickHandler, onTagRemoveHandler, onTagAddHandler, } = useTagsInteractions(tagsContainerRef, tooltipTagsContainerRef, showedTags, hiddenTags, onTagAdd, onTagRemove, onTagClick);
32
+ const [morePopoverOpen, setMorePopoverOpen] = useState(false);
33
+ const morePopoverId = useId();
34
+ const groupLabelId = useId();
35
+ const hasTagClickHandler = onTagClick !== undefined;
36
+ const groupLabelledBy = accessibilityConfig?.ariaLabelledBy ?? groupLabelId;
37
+ const groupLabelText = accessibilityConfig?.ariaLabel ?? (tags.length === 1 ? "Tags, 1" : `Tags, ${tags.length}`);
31
38
  const comboboxOptions = useMemo(() => {
32
39
  if (!tagOptions) {
33
40
  return [];
@@ -37,36 +44,44 @@ export function UiTags({ tags, tagOptions, addLabel = "Add tag", nameLabel = "Na
37
44
  .filter((tagOption) => !tagIds.has(tagOption.id))
38
45
  .map((tagOption) => ({ id: tagOption.id, label: tagOption.label }));
39
46
  }, [tagOptions, tags]);
40
- return (_jsxs("div", { ref: rootRef, tabIndex: tags.length === 0 ? -1 : 0, onKeyDown: handleKeyDown, className: b({ readOnly, mode }), "aria-label": accessibilityConfig?.ariaLabel, "aria-labelledby": accessibilityConfig?.ariaLabelledBy, "aria-describedby": accessibilityConfig?.ariaDescribedBy, role: accessibilityConfig?.role ?? "list", children: [
41
- _jsx("div", { className: e("shadow-container"), ref: allContainerRef, children: tags.map((tag) => {
47
+ return (_jsxs("div", { ref: rootRef, className: b({ readOnly, mode }), "aria-labelledby": groupLabelledBy, "aria-describedby": accessibilityConfig?.ariaDescribedBy, role: accessibilityConfig?.role ?? "group", children: [accessibilityConfig?.ariaLabelledBy ? null : (_jsx("span", { className: "sr-only", id: groupLabelId, children: groupLabelText })), _jsx("div", { className: e("shadow-container"), ref: allContainerRef, children: tags.map((tag) => {
42
48
  return (_jsx(UiTag, { tag: tag, isDeletable: isDeletable, size: size }, getKey(tag, isDeletable, readOnly)));
43
49
  }) }), _jsxs("div", { className: e("tags-container"), ref: tagsContainerRef, children: [items.map((tag, i) => {
44
50
  if (Array.isArray(tag)) {
45
51
  if (hiddenTags.length === 0) {
46
52
  return null;
47
53
  }
48
- return (_jsx("div", { role: "listitem", className: e("hidden-tags", { isFocused: showedFocusedIndex === i }), onClick: (e) => {
54
+ return (_jsx("div", { className: e("hidden-tags"), onClick: (e) => {
49
55
  e.stopPropagation();
50
56
  e.preventDefault();
51
- }, children: hiddenTags.length > 0 ? (_jsx(UiPopover, { onOpen: onMoreOpen, onClose: onMoreClose, enableFocusTrap: true, initialFocus: tooltipTagsContainerRef, returnFocusTo: rootRef, anchor: _jsx(UiButton, { tabIndex: -1, label: `+${hiddenTags.length}`, size: "small", variant: "tertiary", ref: (ref) => {
57
+ }, children: hiddenTags.length > 0 ? (_jsx(UiPopover, { id: morePopoverId, onOpen: () => {
58
+ setMorePopoverOpen(true);
59
+ onMoreOpen();
60
+ }, onClose: () => {
61
+ setMorePopoverOpen(false);
62
+ onMoreClose();
63
+ }, enableFocusTrap: true, initialFocus: tooltipTagsContainerRef, returnFocusTo: hiddenTagsContainerRef, anchorAccessibilityConfig: {
64
+ ariaHaspopup: "dialog",
65
+ ariaControls: morePopoverId,
66
+ }, anchor: _jsx(UiButton, { label: `+${hiddenTags.length}`, size: "small", variant: "tertiary", accessibilityConfig: {
67
+ ariaLabel: moreLabel,
68
+ ariaExpanded: morePopoverOpen,
69
+ }, ref: (ref) => {
52
70
  hiddenTagsContainerRef.current = ref;
53
- interactionState.current.more = ref;
54
- } }), width: 300, title: moreLabel, content: () => (_jsx("div", { onKeyDown: handleKeyDown, className: e("tags-more-tooltip"), ref: (ref) => {
71
+ } }), width: 300, title: moreLabel, content: () => (_jsx("div", { className: e("tags-more-tooltip"), ref: (ref) => {
55
72
  tooltipTagsContainerRef.current = ref;
56
73
  setTooltipContainer(ref);
57
- }, tabIndex: 0, children: hiddenTags.map((tag, i) => {
58
- return (_jsx(UiTag, { tag: tag, deleteLabel: removeLabel, ref: (ref) => {
59
- interactionState.current.tags[tag.id] = ref;
60
- }, isDeletable: isDeletable, isDisabled: readOnly, isFocused: hiddenFocusedIndex === i, size: size, maxWidth: tooltipWidth, onDelete: onTagRemoveHandler, onClick: onTagClickHandler }, i));
74
+ }, children: hiddenTags.map((tag, i) => {
75
+ return (_jsx(UiTag, { tag: tag, deleteLabel: removeLabel, isDeletable: isDeletable, isDisabled: readOnly, size: size, maxWidth: tooltipWidth, onDelete: onTagRemoveHandler, onClick: hasTagClickHandler
76
+ ? onTagClickHandler
77
+ : undefined }, i));
61
78
  }) })), footer: ({ onClose }) => (_jsx(_Fragment, { children: _jsx(UiButton, { ref: (ref) => {
62
79
  interactionState.current.close = ref;
63
80
  }, label: closeLabel, variant: "secondary", onClick: () => {
64
81
  onClose();
65
82
  } }) })) })) : null }, i));
66
83
  }
67
- return (_jsx(UiTag, { tag: tag, ref: (ref) => {
68
- interactionState.current.tags[tag.id] = ref;
69
- }, isDeletable: isDeletable, isDisabled: readOnly, deleteLabel: removeLabel, isFocused: showedFocusedIndex === i, size: size, onDelete: onTagRemoveHandler, onClick: onTagClickHandler, maxWidth: i === showedTags.length - 1 ? lastAvailableWidth : availableWidth }, getKey(tag, isDeletable, readOnly)));
84
+ return (_jsx(UiTag, { tag: tag, isDeletable: isDeletable, isDisabled: readOnly, deleteLabel: removeLabel, size: size, onDelete: onTagRemoveHandler, onClick: hasTagClickHandler ? onTagClickHandler : undefined, maxWidth: i === showedTags.length - 1 ? lastAvailableWidth : availableWidth }, getKey(tag, isDeletable, readOnly)));
70
85
  }), hasCustomAddButton ? (_jsx("div", { className: e("add-button"), ref: addButtonRef, onClick: (e) => {
71
86
  e.stopPropagation();
72
87
  e.preventDefault();
@@ -82,15 +97,14 @@ export function UiTags({ tags, tagOptions, addLabel = "Add tag", nameLabel = "Na
82
97
  setTag("");
83
98
  onAddClose();
84
99
  setPopupOpen(false);
85
- }, enableFocusTrap: true, anchor: _jsx(UiButton, { label: showedTags.length > 0 ? "" : addLabel, accessibilityConfig: {
86
- ariaHaspopup: true,
87
- ariaControls: popupId,
88
- ariaLabel: showedTags.length > 0 ? addLabel : undefined,
89
- ariaExpanded: popupOpen,
90
- role: "listitem",
91
- }, size: "small", iconBefore: "plus", variant: "tertiary", ref: (ref) => {
92
- interactionState.current.add = ref;
93
- } }), title: addLabel, initialFocus: inputRef, content: ({ onClose }) => (_jsxs(UiCombobox, { options: comboboxOptions, value: tag, onValueChange: setTag, creatable: true, children: [
100
+ }, enableFocusTrap: true, anchor: _jsx(UiTooltip, { content: addLabel, triggerBy: ["hover", "focus"], anchorWrapperStyles: { display: "flex", alignItems: "center" }, anchor: _jsx(UiButton, { label: showedTags.length > 0 ? "" : addLabel, accessibilityConfig: {
101
+ ariaHaspopup: true,
102
+ ariaControls: popupId,
103
+ ariaLabel: addLabel,
104
+ ariaExpanded: popupOpen,
105
+ }, size: "small", iconBefore: "plus", variant: "tertiary", ref: (ref) => {
106
+ interactionState.current.add = ref;
107
+ } }) }), title: addLabel, initialFocus: inputRef, content: ({ onClose }) => (_jsxs(UiCombobox, { options: comboboxOptions, value: tag, onValueChange: setTag, creatable: true, children: [
94
108
  _jsx(UiComboboxInput, { ref: (node) => {
95
109
  inputRef.current = node;
96
110
  interactionState.current.input = node;
@@ -3,27 +3,22 @@ import { type IUiTagDef, type IUiTagsProps } from "./types.js";
3
3
  type InteractionState = {
4
4
  moreOpen: boolean;
5
5
  addOpen: boolean;
6
- tags: Record<string, HTMLButtonElement>;
7
- more: HTMLButtonElement | null;
8
6
  add: HTMLButtonElement | null;
9
7
  close: HTMLButtonElement | null;
10
8
  save: HTMLButtonElement | null;
11
9
  input: HTMLInputElement | null;
12
10
  };
13
- export declare function useTagsInteractions(rootRef: MutableRefObject<HTMLDivElement | null>, hiddenTagsRef: MutableRefObject<HTMLDivElement | null>, showedTags: IUiTagDef[], hiddenTags: IUiTagDef[], onTagClick: IUiTagsProps["onTagClick"], onTagAdd: IUiTagsProps["onTagAdd"], onTagRemove: IUiTagsProps["onTagRemove"]): {
11
+ export declare function useTagsInteractions(tagsContainerRef: MutableRefObject<HTMLDivElement | null>, tooltipTagsContainerRef: MutableRefObject<HTMLDivElement | null>, showedTags: IUiTagDef[], hiddenTags: IUiTagDef[], onTagAdd: IUiTagsProps["onTagAdd"], onTagRemove: IUiTagsProps["onTagRemove"], onTagClick: IUiTagsProps["onTagClick"]): {
14
12
  tag: string;
15
13
  setTag: import("react").Dispatch<import("react").SetStateAction<string>>;
16
14
  onAddOpen: () => void;
17
15
  onAddClose: () => void;
18
16
  onMoreOpen: () => void;
19
17
  onMoreClose: () => void;
20
- handleKeyDown: (event: import("react").KeyboardEvent<Element>) => void;
21
- interactionState: import("react").RefObject<InteractionState>;
22
- showedFocusedIndex: number;
23
- hiddenFocusedIndex: number;
24
18
  onTagAddHandler: () => void;
25
- onTagRemoveHandler: (tag: IUiTagDef) => void;
26
- onTagClickHandler: (tag: IUiTagDef) => void;
19
+ onTagRemoveHandler: (removedTag: IUiTagDef) => void;
20
+ onTagClickHandler: (clickedTag: IUiTagDef) => void;
21
+ interactionState: import("react").RefObject<InteractionState>;
27
22
  };
28
23
  export {};
29
24
  //# sourceMappingURL=interactions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"interactions.d.ts","sourceRoot":"","sources":["../../../src/@ui/UiTags/interactions.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,gBAAgB,EAA0C,MAAM,OAAO,CAAC;AAItF,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/D,KAAK,gBAAgB,GAAG;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACxC,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC/B,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC9B,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAChC,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC/B,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAClC,CAAC;AAEF,wBAAgB,mBAAmB,CAC/B,OAAO,EAAE,gBAAgB,CAAC,cAAc,GAAG,IAAI,CAAC,EAChD,aAAa,EAAE,gBAAgB,CAAC,cAAc,GAAG,IAAI,CAAC,EACtD,UAAU,EAAE,SAAS,EAAE,EACvB,UAAU,EAAE,SAAS,EAAE,EACvB,UAAU,EAAE,YAAY,CAAC,YAAY,CAAC,EACtC,QAAQ,EAAE,YAAY,CAAC,UAAU,CAAC,EAClC,WAAW,EAAE,YAAY,CAAC,aAAa,CAAC;;;;;;;;;;;;;;EA8R3C"}
1
+ {"version":3,"file":"interactions.d.ts","sourceRoot":"","sources":["../../../src/@ui/UiTags/interactions.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,gBAAgB,EAAkD,MAAM,OAAO,CAAC;AAI9F,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/D,KAAK,gBAAgB,GAAG;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC9B,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAChC,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC/B,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAClC,CAAC;AAmBF,wBAAgB,mBAAmB,CAC/B,gBAAgB,EAAE,gBAAgB,CAAC,cAAc,GAAG,IAAI,CAAC,EACzD,uBAAuB,EAAE,gBAAgB,CAAC,cAAc,GAAG,IAAI,CAAC,EAChE,UAAU,EAAE,SAAS,EAAE,EACvB,UAAU,EAAE,SAAS,EAAE,EACvB,QAAQ,EAAE,YAAY,CAAC,UAAU,CAAC,EAClC,WAAW,EAAE,YAAY,CAAC,aAAa,CAAC,EACxC,UAAU,EAAE,YAAY,CAAC,YAAY,CAAC;;;;;;;;;;;EAiHzC"}