@gooddata/sdk-ui-kit 11.42.0-alpha.2 → 11.42.0-alpha.4

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 (59) 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/UiAddGranteeDialog/UiAddGranteeDialog.d.ts +6 -31
  4. package/esm/@ui/UiAddGranteeDialog/UiAddGranteeDialog.d.ts.map +1 -1
  5. package/esm/@ui/UiAddGranteeDialog/UiAddGranteeDialog.js +8 -24
  6. package/esm/@ui/UiAddGranteeDialog/UiAddGranteeDialogCard.d.ts +56 -0
  7. package/esm/@ui/UiAddGranteeDialog/UiAddGranteeDialogCard.d.ts.map +1 -0
  8. package/esm/@ui/UiAddGranteeDialog/UiAddGranteeDialogCard.js +40 -0
  9. package/esm/@ui/UiAddGranteeDialog/useGranteeSelection.d.ts +35 -0
  10. package/esm/@ui/UiAddGranteeDialog/useGranteeSelection.d.ts.map +1 -0
  11. package/esm/@ui/UiAddGranteeDialog/useGranteeSelection.js +29 -0
  12. package/esm/@ui/UiAutocomplete/UiAutocomplete.d.ts +9 -0
  13. package/esm/@ui/UiAutocomplete/UiAutocomplete.d.ts.map +1 -0
  14. package/esm/@ui/UiAutocomplete/UiAutocomplete.js +230 -0
  15. package/esm/@ui/UiAutocomplete/types.d.ts +61 -0
  16. package/esm/@ui/UiAutocomplete/types.d.ts.map +1 -0
  17. package/esm/@ui/UiAutocomplete/types.js +2 -0
  18. package/esm/@ui/UiAutocomplete/useAsyncListSource.d.ts +42 -0
  19. package/esm/@ui/UiAutocomplete/useAsyncListSource.d.ts.map +1 -0
  20. package/esm/@ui/UiAutocomplete/useAsyncListSource.js +112 -0
  21. package/esm/@ui/UiCombobox/UiComboboxInput.d.ts +7 -2
  22. package/esm/@ui/UiCombobox/UiComboboxInput.d.ts.map +1 -1
  23. package/esm/@ui/UiCombobox/UiComboboxInput.js +2 -2
  24. package/esm/@ui/UiCombobox/useCombobox.d.ts.map +1 -1
  25. package/esm/@ui/UiCombobox/useCombobox.js +8 -15
  26. package/esm/@ui/UiCombobox/useComboboxChrome.d.ts +16 -5
  27. package/esm/@ui/UiCombobox/useComboboxChrome.d.ts.map +1 -1
  28. package/esm/@ui/UiCombobox/useComboboxChrome.js +53 -25
  29. package/esm/@ui/UiCombobox/useComboboxSelection.d.ts +2 -3
  30. package/esm/@ui/UiCombobox/useComboboxSelection.d.ts.map +1 -1
  31. package/esm/@ui/UiCombobox/useComboboxSelection.js +5 -9
  32. package/esm/@ui/UiGranteeAsyncPicker/UiGranteeAsyncPicker.d.ts +73 -0
  33. package/esm/@ui/UiGranteeAsyncPicker/UiGranteeAsyncPicker.d.ts.map +1 -0
  34. package/esm/@ui/UiGranteeAsyncPicker/UiGranteeAsyncPicker.js +69 -0
  35. package/esm/@ui/UiIcon/icons.d.ts.map +1 -1
  36. package/esm/@ui/UiIcon/icons.js +2 -0
  37. package/esm/@ui/UiTags/UiTags.js +1 -1
  38. package/esm/Dialog/StylingEditorDialog/StylingEditorDialog.d.ts +8 -0
  39. package/esm/Dialog/StylingEditorDialog/StylingEditorDialog.d.ts.map +1 -1
  40. package/esm/Dialog/StylingEditorDialog/StylingEditorDialog.js +28 -3
  41. package/esm/Dropdown/Dropdown.d.ts +4 -2
  42. package/esm/Dropdown/Dropdown.d.ts.map +1 -1
  43. package/esm/Dropdown/Dropdown.js +2 -2
  44. package/esm/WidgetNotice/WidgetNotice.d.ts.map +1 -1
  45. package/esm/WidgetNotice/WidgetNotice.js +1 -1
  46. package/esm/index.d.ts +4 -0
  47. package/esm/index.d.ts.map +1 -1
  48. package/esm/index.js +3 -0
  49. package/esm/locales.d.ts +34 -0
  50. package/esm/locales.d.ts.map +1 -1
  51. package/esm/locales.js +14 -0
  52. package/esm/sdk-ui-kit.d.ts +217 -26
  53. package/package.json +11 -11
  54. package/src/@ui/UiAddGranteeDialog/UiAddGranteeDialog.scss +0 -14
  55. package/src/@ui/UiAutocomplete/UiAutocomplete.scss +53 -0
  56. package/src/@ui/UiGranteeAsyncPicker/UiGranteeAsyncPicker.scss +28 -0
  57. package/src/@ui/index.scss +2 -0
  58. package/styles/css/main.css +65 -5
  59. package/styles/css/main.css.map +1 -1
@@ -884,7 +884,7 @@ export declare function DomainHomepageLink({ onClick }: IDomainHomepageLinkProps
884
884
  /**
885
885
  * @internal
886
886
  */
887
- export declare function Dropdown({ isOpen: isOpenProp, onToggle, className, openOnInit, closeOnParentScroll, closeOnMouseDrag, closeOnOutsideClick, overlayPositionType, alignPoints, overlayZIndex, ignoreClicksOnByClass, renderBody, renderButton, onOpenStateChanged, fullscreenOnMobile, enableEventPropagation, enableAutoToggle, closeOnEscape, autofocusOnOpen, initialFocus, returnFocusTo, accessibilityConfig, shouldTrapFocus }: IDropdownProps): JSX.Element;
887
+ export declare function Dropdown({ isOpen: isOpenProp, onToggle, className, openOnInit, closeOnParentScroll, closeOnMouseDrag, closeOnOutsideClick, overlayPositionType, alignPoints, overlayZIndex, ignoreClicksOnByClass, renderBody, renderButton, onOpenStateChanged, onAlign, fullscreenOnMobile, enableEventPropagation, enableAutoToggle, closeOnEscape, autofocusOnOpen, initialFocus, returnFocusTo, accessibilityConfig, shouldTrapFocus }: IDropdownProps): JSX.Element;
888
888
 
889
889
  /**
890
890
  * @internal
@@ -2599,7 +2599,7 @@ export declare function IconTreeMap({ className, width, height, color, ariaHidde
2599
2599
  /**
2600
2600
  * @internal
2601
2601
  */
2602
- export declare type IconType = "aiAgent" | "aiAgentDisabled" | "brain" | "brainDisabled" | "check" | "checkCircle" | "certification" | "plus" | "plusCircle" | "sync" | "alert" | "alertPaused" | "close" | "cross" | "edit" | "crossCircle" | "question" | "chevronUp" | "chevronRight" | "chevronDown" | "chevronLeft" | "date" | "navigateUp" | "navigateDown" | "navigateRight" | "navigateLeft" | "download" | "slack" | "expand" | "exclamationCircle" | "infoCircle" | "book" | "visible" | "invisible" | "lock" | "unlock" | "ai" | "aiFill" | "drawer" | "drawerEmpty" | "prohibited" | "dropDown" | "dropRight" | "clock" | "clockPaused" | "questionMark" | "upload" | "expandRectangle" | "file" | "number" | "code" | "user" | "userPlus" | "users" | "magic" | "tab" | "pauseCircle" | "filter" | "timer" | "mail" | "envelope" | "copy" | "rain" | "earth" | "geoCollection" | "geoCollectionUpload" | "minimize" | "shrink" | "copyright" | "ellipsis" | "pencil" | "folder" | "folderSmall" | "folderPlus" | "trash" | "arrowUp" | "arrowRight" | "arrowDown" | "arrowLeft" | "undo" | "redo" | "trendDown" | "trendUp" | "save" | "minus" | "minusCircle" | "percent" | "enter" | "enterRight" | "money" | "ghost" | "warning" | "home" | "settings" | "search" | "university" | "printer" | "picture" | "visualization" | "dashboard" | "metric" | "fact" | "ldmAttribute" | "ldmKey" | "ldmLabel" | "sharp" | "attribute" | "horn" | "cw" | "ccw" | "table" | "directionColumn" | "directionRow" | "header" | "genai" | "genai2" | "explainai" | "hiddenForAi" | "box" | "ellipsisVertical" | "list" | "drillTo" | "hierarchy" | "history" | "history2" | "thumbsUp" | "thumbsDown" | "send" | "visualizationArea" | "visualizationTable" | "visualizationTreemap" | "visualizationScatter" | "visualizationDonut" | "visualizationHeadline" | "visualizationColumn" | "visualizationLine" | "visualizationPyramid" | "visualizationFunnel" | "visualizationHeatmap" | "visualizationBubble" | "visualizationPie" | "visualizationBar" | "visualizationCombo" | "visualizationBullet" | "visualizationWaterfall" | "visualizationDependencywheel" | "visualizationSankey" | "visualizationPushpin" | "visualizationRepeater" | "visualizationXirr" | "link" | "externalLink" | "click" | "fileXlsx" | "filePptx" | "filePdf" | "fileImage" | "fileCsvFormatted" | "fileCsvRaw" | "aiDocument" | "recommendation" | "streamUp" | "streamDown" | "stream" | "density" | "parameter" | "pin" | "unpin";
2602
+ export declare type IconType = "aiAgent" | "aiAgentDisabled" | "brain" | "brainDisabled" | "check" | "checkCircle" | "certification" | "plus" | "plusCircle" | "sync" | "alert" | "alertPaused" | "close" | "cross" | "edit" | "crossCircle" | "question" | "chevronUp" | "chevronRight" | "chevronDown" | "chevronLeft" | "date" | "navigateUp" | "navigateDown" | "navigateRight" | "navigateLeft" | "download" | "slack" | "expand" | "exclamationCircle" | "infoCircle" | "book" | "visible" | "invisible" | "lock" | "unlock" | "ai" | "aiFill" | "drawer" | "drawerEmpty" | "prohibited" | "dropDown" | "dropRight" | "clock" | "clockPaused" | "questionMark" | "upload" | "expandRectangle" | "file" | "number" | "code" | "user" | "userPlus" | "users" | "magic" | "tab" | "pauseCircle" | "filter" | "timer" | "mail" | "envelope" | "copy" | "rain" | "earth" | "geoCollection" | "geoCollectionUpload" | "minimize" | "shrink" | "copyright" | "ellipsis" | "pencil" | "folder" | "folderSmall" | "folderPlus" | "trash" | "arrowUp" | "arrowRight" | "arrowDown" | "arrowLeft" | "undo" | "redo" | "trendDown" | "trendUp" | "save" | "minus" | "minusCircle" | "percent" | "enter" | "enterRight" | "money" | "ghost" | "warning" | "home" | "settings" | "search" | "university" | "printer" | "picture" | "visualization" | "dashboard" | "metric" | "fact" | "ldmAttribute" | "ldmKey" | "ldmLabel" | "sharp" | "attribute" | "horn" | "cw" | "ccw" | "table" | "directionColumn" | "directionRow" | "header" | "genai" | "genai2" | "explainai" | "hiddenForAi" | "box" | "ellipsisVertical" | "list" | "drillTo" | "hierarchy" | "history" | "history2" | "thumbsUp" | "thumbsDown" | "send" | "visualizationArea" | "visualizationTable" | "visualizationTreemap" | "visualizationScatter" | "visualizationDonut" | "visualizationHeadline" | "visualizationColumn" | "visualizationLine" | "visualizationPyramid" | "visualizationFunnel" | "visualizationHeatmap" | "visualizationBubble" | "visualizationPie" | "visualizationBar" | "visualizationCombo" | "visualizationBullet" | "visualizationWaterfall" | "visualizationDependencywheel" | "visualizationSankey" | "visualizationPushpin" | "visualizationRepeater" | "visualizationXirr" | "link" | "externalLink" | "click" | "fileXlsx" | "filePptx" | "filePdf" | "fileImage" | "fileCsvFormatted" | "fileCsvRaw" | "aiDocument" | "recommendation" | "streamUp" | "streamDown" | "stream" | "density" | "parameter" | "pin" | "unpin" | "speechBubble" | "pieChart";
2603
2603
 
2604
2604
  /**
2605
2605
  * @internal
@@ -3265,6 +3265,8 @@ export declare interface IDropdownProps {
3265
3265
  closeOnParentScroll?: boolean;
3266
3266
  ignoreClicksOnByClass?: string[];
3267
3267
  onOpenStateChanged?: (isOpen: boolean) => void;
3268
+ /** Reports the align point the Overlay chose whenever it (re)positions the body. */
3269
+ onAlign?: (alignment: Alignment) => void;
3268
3270
  overlayPositionType?: OverlayPositionType;
3269
3271
  overlayZIndex?: number;
3270
3272
  /**
@@ -6048,6 +6050,14 @@ export declare interface IStylingEditorDialogProps<T extends StylingPickerItemCo
6048
6050
  onExit?: (name: string, definition: string) => void;
6049
6051
  onInvalidDefinition?: (ref: ObjRef) => void;
6050
6052
  showBackButton?: boolean;
6053
+ /**
6054
+ * Optional validation of the parsed definition content (e.g. checking theme color values).
6055
+ *
6056
+ * @remarks
6057
+ * Called only when the definition is valid JSON. Return a localized error message to block
6058
+ * submission and display it, or undefined when the content is valid.
6059
+ */
6060
+ validateDefinition?: (content: T) => string | undefined;
6051
6061
  }
6052
6062
 
6053
6063
  /**
@@ -6301,36 +6311,51 @@ export declare interface ITypographyProps {
6301
6311
  /**
6302
6312
  * @internal
6303
6313
  */
6304
- export declare interface IUiAddGranteeDialogProps {
6305
- /** Whether the dialog is shown. */
6306
- isOpen: boolean;
6314
+ export declare interface IUiAddGranteeDialogCardProps {
6307
6315
  /** Object title shown in the header — wrapped into `Share "\{title\}"`. */
6308
6316
  objectTitle: string;
6309
- /** Current search query. */
6310
- searchQuery: string;
6311
- /** Fires when the user edits the search query. */
6312
- onSearchQueryChange: (next: string) => void;
6317
+ /** Loader passed straight through to the embedded `UiGranteeAsyncPicker`. */
6318
+ loadOptions: (search: string) => Promise<IUiGranteeAsyncOptions>;
6319
+ /**
6320
+ * Grantees currently picked. Single source of truth — the card derives all
6321
+ * row state from it and emits the next list via `onSelectedGranteesChange`.
6322
+ */
6323
+ selectedGrantees: ReadonlyArray<IUiPickedGrantee>;
6324
+ /**
6325
+ * Fires with the next list when the user picks a grantee, changes a row's
6326
+ * permission level, or removes a row. Consumers store the result in their
6327
+ * own state.
6328
+ */
6329
+ onSelectedGranteesChange: (next: IUiPickedGrantee[]) => void;
6313
6330
  /**
6314
- * Optional slot rendered between the search input and the bottom divider.
6315
- * When empty, the screen falls back to a "No user or group selected"
6316
- * placeholder. Callers typically render a single `UiGranteeRow`
6317
- * here to preview the grantee they've picked from the search dropdown.
6331
+ * Permission level used when a grantee is added from the dropdown.
6332
+ * Defaults to `"VIEW"`. Consumers that need a different default (e.g.
6333
+ * "SHARE" for owners) override here.
6318
6334
  */
6319
- selectedGrantee?: ReactNode;
6335
+ initialPermissionLevel?: PermissionMenuLevel;
6320
6336
  /** Fires when the user clicks the header back-arrow button. */
6321
6337
  onBack: () => void;
6322
- /** Fires when the user clicks the header X close button or dismisses the modal. */
6338
+ /** Fires when the user clicks the header X close button. */
6323
6339
  onClose: () => void;
6324
6340
  /** Fires when the user clicks Cancel in the footer. */
6325
6341
  onCancel: () => void;
6326
- /** Fires when the user clicks the primary Add button in the footer. */
6327
- onAdd: () => void;
6328
- /** When true, the primary Add button is disabled. */
6329
- isAddDisabled?: boolean;
6330
- /** Test id forwarded to the modal overlay. */
6342
+ /**
6343
+ * Fires when the user clicks the primary Share button in the footer. The
6344
+ * button is disabled while no grantee has been picked.
6345
+ */
6346
+ onShare: () => void;
6347
+ /** Test id forwarded to the root element. */
6331
6348
  dataTestId?: string;
6332
6349
  }
6333
6350
 
6351
+ /**
6352
+ * @internal
6353
+ */
6354
+ export declare interface IUiAddGranteeDialogProps extends IUiAddGranteeDialogCardProps {
6355
+ /** Whether the dialog is shown. */
6356
+ isOpen: boolean;
6357
+ }
6358
+
6334
6359
  /**
6335
6360
  * @internal
6336
6361
  */
@@ -6490,6 +6515,70 @@ export declare interface IUiAsyncTableTitleProps {
6490
6515
  scrollToStart: () => void;
6491
6516
  }
6492
6517
 
6518
+ /** @internal */
6519
+ export declare interface IUiAutocompleteLoadResult<T extends IUiAutocompleteOption = IUiAutocompleteOption> {
6520
+ sections: IUiAutocompleteSection<T>[];
6521
+ /** Show a "Load more" row whose activation calls the loader with the next page. */
6522
+ hasNextPage?: boolean;
6523
+ }
6524
+
6525
+ /**
6526
+ * User-facing copy overrides. Omitted fields fall back to the kit default.
6527
+ *
6528
+ * @internal
6529
+ */
6530
+ export declare interface IUiAutocompleteMessages {
6531
+ searchPlaceholder?: string;
6532
+ stateLoading?: string;
6533
+ stateError?: string;
6534
+ stateNoMatch?: string;
6535
+ loadMore?: string;
6536
+ }
6537
+
6538
+ /**
6539
+ * Minimal option shape; specialized pickers map their domain objects onto it.
6540
+ *
6541
+ * @internal
6542
+ */
6543
+ export declare interface IUiAutocompleteOption {
6544
+ id: string;
6545
+ label: string;
6546
+ /** Secondary label rendered muted next to the primary label. */
6547
+ secondaryText?: string;
6548
+ }
6549
+
6550
+ /** @internal */
6551
+ export declare interface IUiAutocompleteProps<T extends IUiAutocompleteOption = IUiAutocompleteOption> {
6552
+ /**
6553
+ * Called with the debounced search and zero-based `page` index. Page 0
6554
+ * fires on every query change; subsequent pages fire on Load-more.
6555
+ *
6556
+ * Must be referentially stable (memoize with `useCallback`) — it is a
6557
+ * fetch dependency, so a new identity each render re-runs the page-0 query.
6558
+ */
6559
+ loadOptions: (search: string, page: number) => Promise<IUiAutocompleteLoadResult<T>>;
6560
+ /** Filtered out of the dropdown so the user cannot pick the same option twice. */
6561
+ selectedIds?: ReadonlyArray<string>;
6562
+ onSelect: (option: T) => void;
6563
+ /** Debounce delay for the input → loader path. Defaults to 400 ms. */
6564
+ debounceMs?: number;
6565
+ messages?: IUiAutocompleteMessages;
6566
+ /**
6567
+ * Forwarded to the search input for the accessible name / description.
6568
+ * The combobox-internal attributes (`role`, `ariaExpanded`, `ariaControls`,
6569
+ * `ariaAutocomplete`) are owned by the component and cannot be overridden.
6570
+ */
6571
+ accessibilityConfig?: IAccessibilityConfigBase;
6572
+ dataTestId?: string;
6573
+ }
6574
+
6575
+ /** @internal */
6576
+ export declare interface IUiAutocompleteSection<T extends IUiAutocompleteOption = IUiAutocompleteOption> {
6577
+ id: string;
6578
+ label: string;
6579
+ options: T[];
6580
+ }
6581
+
6493
6582
  /**
6494
6583
  * @internal
6495
6584
  */
@@ -6669,8 +6758,12 @@ export declare interface IUiChipProps {
6669
6758
 
6670
6759
  /** @internal */
6671
6760
  export declare interface IUiComboboxInputProps {
6672
- /** Accessible name for the input. */
6673
- "aria-label"?: string;
6761
+ /**
6762
+ * Accessible name/description for the input (e.g. `ariaLabel`,
6763
+ * `ariaDescribedBy`). The combobox role and listbox-wiring attributes are
6764
+ * owned by the component and override anything passed here.
6765
+ */
6766
+ accessibilityConfig?: IAccessibilityConfigBase;
6674
6767
  /** Visible placeholder. */
6675
6768
  placeholder?: string;
6676
6769
  /** Form field name forwarded to the underlying input. */
@@ -7200,6 +7293,60 @@ export declare interface IUiGeneralAccessRadioProps {
7200
7293
  dataTestId?: string;
7201
7294
  }
7202
7295
 
7296
+ /**
7297
+ * One pickable user or group entry.
7298
+ *
7299
+ * @internal
7300
+ */
7301
+ export declare interface IUiGranteeAsyncOption {
7302
+ /** Stable identifier — used as the React key and as the value passed to `onSelect`. */
7303
+ id: string;
7304
+ /** Avatar variant. */
7305
+ kind: GranteeAvatarKind;
7306
+ /** Display name shown on the row. */
7307
+ name: string;
7308
+ /** Optional email subline (users only). */
7309
+ email?: string;
7310
+ }
7311
+
7312
+ /**
7313
+ * Result returned by the consumer's loader: separate `groups` and `users` arrays
7314
+ * so the dropdown can render the two sections independently. Either may be empty.
7315
+ *
7316
+ * @internal
7317
+ */
7318
+ export declare interface IUiGranteeAsyncOptions {
7319
+ groups: IUiGranteeAsyncOption[];
7320
+ users: IUiGranteeAsyncOption[];
7321
+ }
7322
+
7323
+ /**
7324
+ * @internal
7325
+ */
7326
+ export declare interface IUiGranteeAsyncPickerProps {
7327
+ /**
7328
+ * Loader called whenever the (debounced) search query changes. The empty
7329
+ * string is passed on mount to populate the initial dropdown. Pagination
7330
+ * is intentionally not exposed at this layer — the loader returns the
7331
+ * full search result and the consumer caps backend results elsewhere.
7332
+ */
7333
+ loadOptions: (search: string) => Promise<IUiGranteeAsyncOptions>;
7334
+ /**
7335
+ * Grantees already picked. Rendered below the search input as `UiGranteeRow`s
7336
+ * with a `UiPermissionMenu` trigger and a Remove action. Also filtered out
7337
+ * of the dropdown so the user cannot pick the same grantee twice.
7338
+ */
7339
+ selectedGrantees?: ReadonlyArray<IUiPickedGrantee>;
7340
+ /** Fires when the user picks an option from the dropdown. */
7341
+ onSelect: (option: IUiGranteeAsyncOption) => void;
7342
+ /** Fires when the user changes the permission level on a picked row. */
7343
+ onPermissionChange?: (grantee: IUiPickedGrantee, next: PermissionMenuLevel) => void;
7344
+ /** Fires when the user picks Remove access in the row's permission menu. */
7345
+ onRemove?: (grantee: IUiPickedGrantee) => void;
7346
+ /** Test id forwarded to the root element. */
7347
+ dataTestId?: string;
7348
+ }
7349
+
7203
7350
  /**
7204
7351
  * @internal
7205
7352
  */
@@ -8051,6 +8198,16 @@ export declare interface IUiPermissionMenuProps {
8051
8198
  dataTestId?: string;
8052
8199
  }
8053
8200
 
8201
+ /**
8202
+ * A previously-picked grantee with its current permission level.
8203
+ *
8204
+ * @internal
8205
+ */
8206
+ export declare interface IUiPickedGrantee extends IUiGranteeAsyncOption {
8207
+ /** Permission level chosen for this grantee. Drives the row's permission menu trigger label. */
8208
+ permissionLevel: PermissionMenuLevel;
8209
+ }
8210
+
8054
8211
  /**
8055
8212
  * @internal
8056
8213
  */
@@ -10023,13 +10180,28 @@ export declare function Typography({ tagName: Tag, children, className, title, i
10023
10180
  export declare type TypographyTagName = "h1" | "h2" | "h3" | "p";
10024
10181
 
10025
10182
  /**
10026
- * Modal dialog for adding a grantee, opened from the share dialog's
10027
- * "+ Add" action. Lets the author search for a user or group, preview the
10028
- * grantee they picked, and confirm adding them with the footer Add button.
10183
+ * Add-grantee dialog wraps `UiAddGranteeDialogCard` in `UiModalDialog`
10184
+ * for the full modal contract (portal, dimmed backdrop, focus trap, Esc
10185
+ * and backdrop dismiss).
10186
+ *
10187
+ * @internal
10188
+ */
10189
+ export declare function UiAddGranteeDialog({ isOpen, ...cardProps }: IUiAddGranteeDialogProps): JSX.Element;
10190
+
10191
+ /**
10192
+ * Add-grantee dialog card — header + grantee picker (search input with
10193
+ * sectioned Groups/Users dropdown and picked-rows list) + footer with Cancel
10194
+ * and Share. Renders inline as a plain card. For modal behavior (portal,
10195
+ * backdrop, focus trap, dismiss), use `UiAddGranteeDialog` which wraps this
10196
+ * in `UiModalDialog`.
10197
+ *
10198
+ * The card owns the visual composition (picker layout) but no policy. The
10199
+ * caller controls the picked list via `selectedGrantees` / `onSelectedGranteesChange`,
10200
+ * and may override the initial permission level via `initialPermissionLevel`.
10029
10201
  *
10030
10202
  * @internal
10031
10203
  */
10032
- export declare function UiAddGranteeDialog({ isOpen, objectTitle, searchQuery, onSearchQueryChange, selectedGrantee, onBack, onClose, onCancel, onAdd, isAddDisabled, dataTestId }: IUiAddGranteeDialogProps): JSX.Element;
10204
+ export declare function UiAddGranteeDialogCard({ objectTitle, loadOptions, selectedGrantees, onSelectedGranteesChange, initialPermissionLevel, onBack, onClose, onCancel, onShare, dataTestId }: IUiAddGranteeDialogCardProps): JSX.Element;
10033
10205
 
10034
10206
  /**
10035
10207
  * @internal
@@ -10099,6 +10271,14 @@ export declare function UiAsyncTableTitle({ title, onSearch, renderIcon, actions
10099
10271
  */
10100
10272
  export declare type UiAsyncTableVariant = "regular" | "small";
10101
10273
 
10274
+ /**
10275
+ * Async autocomplete: text input + sectioned listbox driven by a `loadOptions`
10276
+ * loader. Implements the ARIA combobox+listbox APG pattern.
10277
+ *
10278
+ * @internal
10279
+ */
10280
+ export declare function UiAutocomplete<T extends IUiAutocompleteOption = IUiAutocompleteOption>({ loadOptions, selectedIds, onSelect, debounceMs, messages, accessibilityConfig, dataTestId }: IUiAutocompleteProps<T>): JSX.Element;
10281
+
10102
10282
  /**
10103
10283
  * Wrapper that focuses the first focusable child when it mounts, or when `refocusKey` changes.
10104
10284
  *
@@ -10408,6 +10588,17 @@ export declare function UiFocusTrap({ root, children, focusCheckFn }: {
10408
10588
  */
10409
10589
  export declare function UiGeneralAccessRadio({ value, onChange, workspaceControls, dataTestId }: IUiGeneralAccessRadioProps): JSX.Element;
10410
10590
 
10591
+ /**
10592
+ * Sectioned async grantee picker — specialization of `UiAutocomplete` for the
10593
+ * share/access-control domain. Renders a search input with a dropdown split
10594
+ * into `Groups` and `Users` sections, and a list of picked grantees below
10595
+ * (each as a `UiGranteeRow` with a `UiPermissionMenu` trigger). The
10596
+ * permission menu carries the Remove action; consumers wire it via `onRemove`.
10597
+ *
10598
+ * @internal
10599
+ */
10600
+ export declare function UiGranteeAsyncPicker({ loadOptions, selectedGrantees, onSelect, onPermissionChange, onRemove, dataTestId }: IUiGranteeAsyncPickerProps): JSX.Element;
10601
+
10411
10602
  /**
10412
10603
  * 32×32 circle avatar used by the OLP share-dialog grantee list. Thin wrapper
10413
10604
  * over `UiAvatar` that picks the right silhouette and i18n
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gooddata/sdk-ui-kit",
3
- "version": "11.42.0-alpha.2",
3
+ "version": "11.42.0-alpha.4",
4
4
  "description": "GoodData SDK - UI Building Components",
5
5
  "license": "MIT",
6
6
  "author": "GoodData Corporation",
@@ -75,11 +75,11 @@
75
75
  "tslib": "2.8.1",
76
76
  "unified": "^11.0.5",
77
77
  "uuid": "11.1.1",
78
- "@gooddata/sdk-backend-spi": "11.42.0-alpha.2",
79
- "@gooddata/sdk-model": "11.42.0-alpha.2",
80
- "@gooddata/sdk-ui-theme-provider": "11.42.0-alpha.2",
81
- "@gooddata/sdk-ui": "11.42.0-alpha.2",
82
- "@gooddata/util": "11.42.0-alpha.2"
78
+ "@gooddata/sdk-backend-spi": "11.42.0-alpha.4",
79
+ "@gooddata/sdk-model": "11.42.0-alpha.4",
80
+ "@gooddata/sdk-ui": "11.42.0-alpha.4",
81
+ "@gooddata/sdk-ui-theme-provider": "11.42.0-alpha.4",
82
+ "@gooddata/util": "11.42.0-alpha.4"
83
83
  },
84
84
  "devDependencies": {
85
85
  "@microsoft/api-documenter": "^7.17.0",
@@ -128,11 +128,11 @@
128
128
  "typescript": "5.9.3",
129
129
  "vitest": "4.1.8",
130
130
  "vitest-dom": "0.1.1",
131
- "@gooddata/eslint-config": "11.42.0-alpha.2",
132
- "@gooddata/oxlint-config": "11.42.0-alpha.2",
133
- "@gooddata/reference-workspace": "11.42.0-alpha.2",
134
- "@gooddata/sdk-backend-mockingbird": "11.42.0-alpha.2",
135
- "@gooddata/stylelint-config": "11.42.0-alpha.2"
131
+ "@gooddata/eslint-config": "11.42.0-alpha.4",
132
+ "@gooddata/oxlint-config": "11.42.0-alpha.4",
133
+ "@gooddata/reference-workspace": "11.42.0-alpha.4",
134
+ "@gooddata/sdk-backend-mockingbird": "11.42.0-alpha.4",
135
+ "@gooddata/stylelint-config": "11.42.0-alpha.4"
136
136
  },
137
137
  "peerDependencies": {
138
138
  "react": "^18.0.0 || ^19.0.0",
@@ -5,18 +5,4 @@
5
5
  flex-direction: column;
6
6
  gap: var(--gd-spacing-10px);
7
7
  padding-bottom: var(--gd-spacing-5px);
8
-
9
- &__preview {
10
- display: flex;
11
- align-items: center;
12
- min-height: 50px;
13
- }
14
-
15
- &__empty-state {
16
- flex: 1 1 auto;
17
- text-align: center;
18
- font-size: 14px;
19
- line-height: 20px;
20
- color: var(--gd-palette-complementary-6);
21
- }
22
8
  }
@@ -0,0 +1,53 @@
1
+ .gd-ui-kit-autocomplete {
2
+ position: relative;
3
+
4
+ &__list {
5
+ margin: 0;
6
+ padding: 0;
7
+ list-style: none;
8
+ max-height: 320px;
9
+ overflow-y: auto;
10
+ overscroll-behavior: contain;
11
+ }
12
+
13
+ &__section-header {
14
+ padding: 4px 12px;
15
+ }
16
+
17
+ &__option {
18
+ display: flex;
19
+ align-items: baseline;
20
+ gap: 6px;
21
+ padding: 6px 12px;
22
+ line-height: 20px;
23
+ cursor: pointer;
24
+
25
+ &--isActive {
26
+ background: var(--gd-palette-complementary-2);
27
+ }
28
+
29
+ &:hover {
30
+ background: var(--gd-palette-complementary-2);
31
+ }
32
+ }
33
+
34
+ &__option-label {
35
+ color: var(--gd-palette-complementary-9);
36
+ font-size: 14px;
37
+ }
38
+
39
+ &__option-secondary {
40
+ color: var(--gd-palette-complementary-6);
41
+ font-size: 12px;
42
+ overflow: hidden;
43
+ text-overflow: ellipsis;
44
+ white-space: nowrap;
45
+ }
46
+
47
+ &__state {
48
+ padding: 12px;
49
+ color: var(--gd-palette-complementary-6);
50
+ font-size: 14px;
51
+ text-align: center;
52
+ }
53
+ }
@@ -0,0 +1,28 @@
1
+ .gd-ui-kit-grantee-async-picker {
2
+ display: flex;
3
+ flex-direction: column;
4
+ gap: 12px;
5
+
6
+ &__empty-state {
7
+ min-height: 50px;
8
+ display: flex;
9
+ align-items: center;
10
+ justify-content: center;
11
+ text-align: center;
12
+ font-size: 14px;
13
+ line-height: 20px;
14
+ color: var(--gd-palette-complementary-6);
15
+ }
16
+
17
+ &__picked-list {
18
+ margin: 0;
19
+ padding: 0;
20
+ list-style: none;
21
+ display: flex;
22
+ flex-direction: column;
23
+ }
24
+
25
+ &__picked-item {
26
+ display: block;
27
+ }
28
+ }
@@ -10,6 +10,7 @@
10
10
  @use "./UiChip/UiChip.scss";
11
11
  @use "./UiControlButton/UiControlButton.scss";
12
12
  @use "./UiCombobox/UiCombobox.scss";
13
+ @use "./UiAutocomplete/UiAutocomplete.scss";
13
14
  @use "./UiListbox/UiListbox.scss";
14
15
  @use "./UiTreeview/UiTreeview.scss";
15
16
  @use "./UiMenu/UiMenu.scss";
@@ -41,6 +42,7 @@
41
42
  @use "./UiModalDialog/UiModalDialog.scss";
42
43
  @use "./UiObjectShareDialog/UiObjectShareDialog.scss";
43
44
  @use "./UiAddGranteeDialog/UiAddGranteeDialog.scss";
45
+ @use "./UiGranteeAsyncPicker/UiGranteeAsyncPicker.scss";
44
46
  @use "./UiGeneralAccessRadio/UiGeneralAccessRadio.scss";
45
47
  @use "./UiLabelRow/UiLabelRow.scss";
46
48
  @use "./UiLabelsList/UiLabelsList.scss";
@@ -1592,6 +1592,52 @@
1592
1592
  color: var(--gd-palette-complementary-6, #94a1ad);
1593
1593
  }
1594
1594
 
1595
+ .gd-ui-kit-autocomplete {
1596
+ position: relative;
1597
+ }
1598
+ .gd-ui-kit-autocomplete__list {
1599
+ margin: 0;
1600
+ padding: 0;
1601
+ list-style: none;
1602
+ max-height: 320px;
1603
+ overflow-y: auto;
1604
+ overscroll-behavior: contain;
1605
+ }
1606
+ .gd-ui-kit-autocomplete__section-header {
1607
+ padding: 4px 12px;
1608
+ }
1609
+ .gd-ui-kit-autocomplete__option {
1610
+ display: flex;
1611
+ align-items: baseline;
1612
+ gap: 6px;
1613
+ padding: 6px 12px;
1614
+ line-height: 20px;
1615
+ cursor: pointer;
1616
+ }
1617
+ .gd-ui-kit-autocomplete__option--isActive {
1618
+ background: var(--gd-palette-complementary-2);
1619
+ }
1620
+ .gd-ui-kit-autocomplete__option:hover {
1621
+ background: var(--gd-palette-complementary-2);
1622
+ }
1623
+ .gd-ui-kit-autocomplete__option-label {
1624
+ color: var(--gd-palette-complementary-9);
1625
+ font-size: 14px;
1626
+ }
1627
+ .gd-ui-kit-autocomplete__option-secondary {
1628
+ color: var(--gd-palette-complementary-6);
1629
+ font-size: 12px;
1630
+ overflow: hidden;
1631
+ text-overflow: ellipsis;
1632
+ white-space: nowrap;
1633
+ }
1634
+ .gd-ui-kit-autocomplete__state {
1635
+ padding: 12px;
1636
+ color: var(--gd-palette-complementary-6);
1637
+ font-size: 14px;
1638
+ text-align: center;
1639
+ }
1640
+
1595
1641
  .gd-ui-kit-listbox {
1596
1642
  max-height: 300px;
1597
1643
  overflow-y: auto;
@@ -3730,18 +3776,32 @@
3730
3776
  gap: var(--gd-spacing-10px);
3731
3777
  padding-bottom: var(--gd-spacing-5px);
3732
3778
  }
3733
- .gd-ui-kit-add-grantee-dialog__preview {
3779
+
3780
+ .gd-ui-kit-grantee-async-picker {
3734
3781
  display: flex;
3735
- align-items: center;
3736
- min-height: 50px;
3782
+ flex-direction: column;
3783
+ gap: 12px;
3737
3784
  }
3738
- .gd-ui-kit-add-grantee-dialog__empty-state {
3739
- flex: 1 1 auto;
3785
+ .gd-ui-kit-grantee-async-picker__empty-state {
3786
+ min-height: 50px;
3787
+ display: flex;
3788
+ align-items: center;
3789
+ justify-content: center;
3740
3790
  text-align: center;
3741
3791
  font-size: 14px;
3742
3792
  line-height: 20px;
3743
3793
  color: var(--gd-palette-complementary-6);
3744
3794
  }
3795
+ .gd-ui-kit-grantee-async-picker__picked-list {
3796
+ margin: 0;
3797
+ padding: 0;
3798
+ list-style: none;
3799
+ display: flex;
3800
+ flex-direction: column;
3801
+ }
3802
+ .gd-ui-kit-grantee-async-picker__picked-item {
3803
+ display: block;
3804
+ }
3745
3805
 
3746
3806
  .gd-ui-kit-general-access-radio {
3747
3807
  display: flex;