@gooddata/sdk-ui-kit 11.55.0-alpha.1 → 11.55.0-alpha.3

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 (60) 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/UiChip/ChipActionButton.d.ts +3 -0
  4. package/esm/@ui/UiChip/ChipActionButton.d.ts.map +1 -0
  5. package/esm/@ui/UiChip/ChipActionButton.js +8 -0
  6. package/esm/@ui/UiChip/ChipContent.d.ts +1 -1
  7. package/esm/@ui/UiChip/ChipContent.d.ts.map +1 -1
  8. package/esm/@ui/UiChip/ChipContent.js +6 -4
  9. package/esm/@ui/UiChip/ChipDeleteButton.d.ts +1 -1
  10. package/esm/@ui/UiChip/ChipDeleteButton.d.ts.map +1 -1
  11. package/esm/@ui/UiChip/ChipDeleteButton.js +2 -2
  12. package/esm/@ui/UiChip/UiChip.d.ts +1 -1
  13. package/esm/@ui/UiChip/UiChip.d.ts.map +1 -1
  14. package/esm/@ui/UiChip/UiChip.js +8 -5
  15. package/esm/@ui/UiChip/types.d.ts +19 -1
  16. package/esm/@ui/UiChip/types.d.ts.map +1 -1
  17. package/esm/@ui/UiColorPicker/UiColorPicker.d.ts +6 -0
  18. package/esm/@ui/UiColorPicker/UiColorPicker.d.ts.map +1 -0
  19. package/esm/@ui/UiColorPicker/UiColorPicker.js +49 -0
  20. package/esm/@ui/UiColorPicker/colorValue.d.ts +58 -0
  21. package/esm/@ui/UiColorPicker/colorValue.d.ts.map +1 -0
  22. package/esm/@ui/UiColorPicker/colorValue.js +90 -0
  23. package/esm/@ui/UiColorPicker/components/UiColorSlider.d.ts +19 -0
  24. package/esm/@ui/UiColorPicker/components/UiColorSlider.d.ts.map +1 -0
  25. package/esm/@ui/UiColorPicker/components/UiColorSlider.js +35 -0
  26. package/esm/@ui/UiColorPicker/components/UiColorValueField.d.ts +12 -0
  27. package/esm/@ui/UiColorPicker/components/UiColorValueField.d.ts.map +1 -0
  28. package/esm/@ui/UiColorPicker/components/UiColorValueField.js +40 -0
  29. package/esm/@ui/UiColorPicker/components/UiColorWheel.d.ts +9 -0
  30. package/esm/@ui/UiColorPicker/components/UiColorWheel.d.ts.map +1 -0
  31. package/esm/@ui/UiColorPicker/components/UiColorWheel.js +43 -0
  32. package/esm/@ui/UiColorPicker/types.d.ts +70 -0
  33. package/esm/@ui/UiColorPicker/types.d.ts.map +1 -0
  34. package/esm/@ui/UiColorPicker/types.js +2 -0
  35. package/esm/@ui/UiFloatingElement/UiFloatingElement.d.ts +1 -1
  36. package/esm/@ui/UiFloatingElement/UiFloatingElement.d.ts.map +1 -1
  37. package/esm/@ui/UiFloatingElement/UiFloatingElement.js +3 -1
  38. package/esm/@ui/UiFloatingElement/types.d.ts +19 -0
  39. package/esm/@ui/UiFloatingElement/types.d.ts.map +1 -1
  40. package/esm/@ui/UiFloatingElement/types.js +1 -1
  41. package/esm/@ui/UiFloatingElement/useFloatingPosition.d.ts +1 -1
  42. package/esm/@ui/UiFloatingElement/useFloatingPosition.d.ts.map +1 -1
  43. package/esm/@ui/UiFloatingElement/useFloatingPosition.js +17 -4
  44. package/esm/@ui/UiIcon/icons.d.ts.map +1 -1
  45. package/esm/@ui/UiIcon/icons.js +27 -0
  46. package/esm/@ui/hooks/useCloseOnOutsideClick.d.ts.map +1 -1
  47. package/esm/@ui/hooks/useCloseOnOutsideClick.js +2 -1
  48. package/esm/@ui/hooks/usePointerTrack.d.ts +23 -0
  49. package/esm/@ui/hooks/usePointerTrack.d.ts.map +1 -0
  50. package/esm/@ui/hooks/usePointerTrack.js +45 -0
  51. package/esm/index.d.ts +3 -0
  52. package/esm/index.d.ts.map +1 -1
  53. package/esm/index.js +2 -0
  54. package/esm/sdk-ui-kit.d.ts +136 -5
  55. package/package.json +13 -15
  56. package/src/@ui/UiChip/UiChip.scss +110 -15
  57. package/src/@ui/UiColorPicker/UiColorPicker.scss +120 -0
  58. package/src/@ui/index.scss +1 -0
  59. package/styles/css/main.css +167 -13
  60. package/styles/css/main.css.map +1 -1
@@ -87,6 +87,7 @@ import { OnError } from '@gooddata/sdk-ui';
87
87
  import { OnLoadingChanged } from '@gooddata/sdk-ui';
88
88
  import { ParameterValue } from '@gooddata/sdk-model';
89
89
  import { Placement } from '@floating-ui/react';
90
+ import { PointerEvent as PointerEvent_2 } from 'react';
90
91
  import { PrimitiveType } from 'react-intl';
91
92
  import { PropsWithChildren } from 'react';
92
93
  import { PropsWithoutRef } from 'react';
@@ -2720,7 +2721,7 @@ export declare function IconTreeMap({ className, width, height, color, ariaHidde
2720
2721
  /**
2721
2722
  * @internal
2722
2723
  */
2723
- 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" | "building" | "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" | "timezone";
2724
+ 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" | "building" | "printer" | "picture" | "visualization" | "dashboard" | "metric" | "fact" | "ldmAttribute" | "ldmKey" | "ldmLabel" | "sharp" | "attribute" | "horn" | "cw" | "ccw" | "table" | "directionColumn" | "directionRow" | "alignLeft" | "alignCenter" | "alignRight" | "alignTop" | "alignMiddle" | "alignBottom" | "imageContain" | "imageCover" | "imageFill" | "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" | "timezone";
2724
2725
 
2725
2726
  /**
2726
2727
  * @internal
@@ -5349,6 +5350,17 @@ export declare interface IParameterPickerProps {
5349
5350
  onCancel: () => void;
5350
5351
  }
5351
5352
 
5353
+ /**
5354
+ * @internal
5355
+ */
5356
+ export declare interface IPointerTrackHandlers {
5357
+ onPointerDown: (event: PointerEvent_2<HTMLElement>) => void;
5358
+ onPointerMove: (event: PointerEvent_2<HTMLElement>) => void;
5359
+ onPointerUp: (event: PointerEvent_2<HTMLElement>) => void;
5360
+ onPointerCancel: (event: PointerEvent_2<HTMLElement>) => void;
5361
+ onLostPointerCapture: (event: PointerEvent_2<HTMLElement>) => void;
5362
+ }
5363
+
5352
5364
  /**
5353
5365
  * @internal
5354
5366
  */
@@ -7048,6 +7060,9 @@ export declare interface IUiChipAccessibilityConfig extends IAccessibilityConfig
7048
7060
  deleteAriaLabel?: string;
7049
7061
  deleteAriaDescribedBy?: string;
7050
7062
  iconBeforeAriaLabel?: string;
7063
+ iconAfterAriaLabel?: string;
7064
+ actionAriaLabel?: string;
7065
+ actionAriaDescribedBy?: string;
7051
7066
  }
7052
7067
 
7053
7068
  /**
@@ -7057,23 +7072,103 @@ export declare interface IUiChipProps {
7057
7072
  label: string;
7058
7073
  tag?: string;
7059
7074
  isDeletable?: boolean;
7075
+ isActionable?: boolean;
7060
7076
  isActive?: boolean;
7061
7077
  isLocked?: boolean;
7062
7078
  isExpandable?: boolean;
7063
7079
  isDisabled?: boolean;
7064
7080
  maxWidth?: number;
7081
+ iconAction?: IconType;
7065
7082
  iconBefore?: IconType;
7066
7083
  iconAfter?: IconType;
7067
7084
  iconColor?: ThemeColor | "currentColor";
7085
+ variant?: "normal" | "inactive";
7068
7086
  onClick?: () => void;
7069
7087
  onDelete?: () => void;
7070
7088
  onKeyDown?: KeyboardEventHandler<HTMLButtonElement>;
7071
7089
  onDeleteKeyDown?: KeyboardEventHandler<HTMLButtonElement>;
7090
+ onAction?: () => void;
7091
+ onActionKeyDown?: KeyboardEventHandler<HTMLButtonElement>;
7072
7092
  accessibilityConfig?: IUiChipAccessibilityConfig;
7073
7093
  dataTestId?: string;
7074
7094
  buttonRef?: MutableRefObject<HTMLButtonElement>;
7075
7095
  renderChipContent?: (content: ReactNode) => ReactNode;
7076
- renderDeleteButton?: (button: ReactNode) => ReactNode;
7096
+ renderActionButton?: (button: ReactNode) => ReactNode;
7097
+ }
7098
+
7099
+ /**
7100
+ * What every picker takes, whichever way it reports the color it gathers.
7101
+ *
7102
+ * @internal
7103
+ */
7104
+ export declare interface IUiColorPickerBaseProps {
7105
+ /**
7106
+ * The color to start from. The picker follows it when it changes.
7107
+ *
7108
+ * @remarks
7109
+ * Never feed the picker the color it just reported: read in again it loses the hue that a gray,
7110
+ * black or white cannot carry, and the handle jumps off the wheel mid-drag. A caller applying
7111
+ * changes live should hold the color it seeds the picker with apart from the one it stores.
7112
+ */
7113
+ initialRgbColor: IUiColorPickerRgb | IUiColorPickerRgba;
7114
+ /**
7115
+ * Adds an opacity control and lets the reported color carry one.
7116
+ *
7117
+ * @remarks
7118
+ * Off by default: a consumer that stores a color without an opacity would drop the one the user
7119
+ * had set, without saying so.
7120
+ */
7121
+ supportsAlpha?: boolean;
7122
+ }
7123
+
7124
+ /**
7125
+ * A picker that gathers a color and reports it once, when confirmed.
7126
+ *
7127
+ * @internal
7128
+ */
7129
+ export declare interface IUiColorPickerCommitProps extends IUiColorPickerBaseProps {
7130
+ onSubmit: (color: IUiColorPickerRgba) => void;
7131
+ /**
7132
+ * Dismisses the picker, leaving the color as it was.
7133
+ */
7134
+ onCancel: () => void;
7135
+ onChange?: never;
7136
+ }
7137
+
7138
+ /**
7139
+ * A picker that reports every change as it is made, and so has nothing to confirm or take back: the
7140
+ * color is already applied, and going back from it is the caller's to offer.
7141
+ *
7142
+ * @internal
7143
+ */
7144
+ export declare interface IUiColorPickerLiveProps extends IUiColorPickerBaseProps {
7145
+ onChange: (color: IUiColorPickerRgba) => void;
7146
+ onSubmit?: never;
7147
+ }
7148
+
7149
+ /**
7150
+ * @internal
7151
+ */
7152
+ export declare type IUiColorPickerProps = IUiColorPickerCommitProps | IUiColorPickerLiveProps;
7153
+
7154
+ /**
7155
+ * Channels, each 0 to 255.
7156
+ *
7157
+ * @internal
7158
+ */
7159
+ export declare interface IUiColorPickerRgb {
7160
+ r: number;
7161
+ g: number;
7162
+ b: number;
7163
+ }
7164
+
7165
+ /**
7166
+ * Channels, each 0 to 255, with opacity from 0 (transparent) to 1 (opaque).
7167
+ *
7168
+ * @internal
7169
+ */
7170
+ export declare interface IUiColorPickerRgba extends IUiColorPickerRgb {
7171
+ a: number;
7077
7172
  }
7078
7173
 
7079
7174
  /** @internal */
@@ -7686,6 +7781,23 @@ export declare interface IUiFloatingElementProps {
7686
7781
  strategy?: Strategy;
7687
7782
  offset?: OffsetOptions;
7688
7783
  autoFlip?: boolean;
7784
+ /**
7785
+ * Whether the floating element may slide over its anchor to stay in view.
7786
+ *
7787
+ * @remarks
7788
+ * By default it only slides along the side it is placed on. An anchor taller than the viewport
7789
+ * has room on neither side, which leaves the element off the screen.
7790
+ */
7791
+ allowOverlapAnchor?: boolean;
7792
+ /**
7793
+ * Element the floating element is kept inside of, instead of the window.
7794
+ *
7795
+ * @remarks
7796
+ * The portal puts it outside whatever the anchor scrolls in, so by default only the window
7797
+ * constrains it. Pass the element rather than its rect, so the position is measured again as
7798
+ * the element moves.
7799
+ */
7800
+ overflowBoundary?: Element;
7689
7801
  closeOnOutsideClick?: boolean;
7690
7802
  closeOnEscape?: boolean;
7691
7803
  closeOnParentScroll?: boolean;
@@ -9629,6 +9741,8 @@ export declare interface IUseFloatingPositionOptions {
9629
9741
  strategy?: Strategy;
9630
9742
  offset?: OffsetOptions;
9631
9743
  autoFlip?: boolean;
9744
+ allowOverlapAnchor?: boolean;
9745
+ overflowBoundary?: Element;
9632
9746
  fallbackPlacements?: Placement[];
9633
9747
  arrowRef?: RefObject<SVGSVGElement | null>;
9634
9748
  customMiddleware?: Middleware[];
@@ -11020,7 +11134,12 @@ export declare function UiCheckbox({ checked, onChange, preventDefault, stopProp
11020
11134
  /**
11021
11135
  * @internal
11022
11136
  */
11023
- export declare function UiChip({ label, tag, isDeletable, isActive, isLocked, isExpandable, isDisabled, maxWidth, iconBefore, iconAfter, iconColor, onClick, onDelete, onKeyDown, onDeleteKeyDown, accessibilityConfig, dataTestId, buttonRef, renderChipContent, renderDeleteButton }: IUiChipProps): JSX.Element;
11137
+ export declare function UiChip({ label, tag, isDeletable, isActionable, isActive, isLocked, isExpandable, isDisabled, maxWidth, iconBefore, iconAfter, iconColor, onClick, onKeyDown, onDelete, onDeleteKeyDown, onAction, onActionKeyDown, accessibilityConfig, dataTestId, buttonRef, iconAction, variant, renderChipContent, renderActionButton }: IUiChipProps): JSX.Element;
11138
+
11139
+ /**
11140
+ * @internal
11141
+ */
11142
+ export declare function UiColorPicker(props: IUiColorPickerProps): JSX.Element;
11024
11143
 
11025
11144
  /**
11026
11145
  * A composable combobox component that enables users to select from a filtered list of options.
@@ -11225,7 +11344,7 @@ export declare function UiErrorPage({ title, description, dataTestId, accessibil
11225
11344
  *
11226
11345
  * @internal
11227
11346
  */
11228
- export declare function UiFloatingElement({ children, anchor, isOpen, onClose, placement, alignPoints, strategy, offset, autoFlip, closeOnOutsideClick, closeOnEscape, closeOnParentScroll, closeOnMouseDrag, ignoreClicksOn, shouldCloseOnClick, zIndex: zIndexProp, className, contentClassName, style, width, maxWidth, maxHeight, accessibilityConfig, onPlacementChange }: IUiFloatingElementProps): JSX.Element | null;
11347
+ export declare function UiFloatingElement({ children, anchor, isOpen, onClose, placement, alignPoints, strategy, offset, autoFlip, allowOverlapAnchor, overflowBoundary, closeOnOutsideClick, closeOnEscape, closeOnParentScroll, closeOnMouseDrag, ignoreClicksOn, shouldCloseOnClick, zIndex: zIndexProp, className, contentClassName, style, width, maxWidth, maxHeight, accessibilityConfig, onPlacementChange }: IUiFloatingElementProps): JSX.Element | null;
11229
11348
 
11230
11349
  /**
11231
11350
  * `UiFloatingElement` plus the kit's canonical popup chrome (background,
@@ -11874,7 +11993,7 @@ export declare function useFileSelection({ rules, multiple, onValidateFile, onFi
11874
11993
  *
11875
11994
  * @internal
11876
11995
  */
11877
- export declare function useFloatingPosition({ isOpen, onOpenChange, placement: placementProp, alignPoints, strategy, offset: offsetProp, autoFlip, fallbackPlacements: fallbackPlacementsProp, arrowRef, customMiddleware, maxWidth, maxHeight, zIndex: zIndexProp, shiftPadding }: IUseFloatingPositionOptions): IUseFloatingPositionResult;
11996
+ export declare function useFloatingPosition({ isOpen, onOpenChange, placement: placementProp, alignPoints, strategy, offset: offsetProp, autoFlip, allowOverlapAnchor, overflowBoundary, fallbackPlacements: fallbackPlacementsProp, arrowRef, customMiddleware, maxWidth, maxHeight, zIndex: zIndexProp, shiftPadding }: IUseFloatingPositionOptions): IUseFloatingPositionResult;
11878
11997
 
11879
11998
  /**
11880
11999
  * @internal
@@ -12065,6 +12184,18 @@ export declare const useOverlayZIndex: (uuid: string) => number | undefined;
12065
12184
  */
12066
12185
  export declare function useOverlayZIndexWithRegister(): number;
12067
12186
 
12187
+ /**
12188
+ * Follows a press and everything it drags through.
12189
+ *
12190
+ * @remarks
12191
+ * The handlers must be spread on the element the gesture is measured against: they report
12192
+ * `currentTarget`, and a caller that reads a child's or a parent's size instead will place the value
12193
+ * somewhere the pointer is not.
12194
+ *
12195
+ * @internal
12196
+ */
12197
+ export declare function usePointerTrack(track: (event: PointerEvent_2<HTMLElement>) => void): IPointerTrackHandlers;
12198
+
12068
12199
  /**
12069
12200
  * Hook to consume responsive context.
12070
12201
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gooddata/sdk-ui-kit",
3
- "version": "11.55.0-alpha.1",
3
+ "version": "11.55.0-alpha.3",
4
4
  "description": "GoodData SDK - UI Building Components",
5
5
  "license": "MIT",
6
6
  "author": "GoodData Corporation",
@@ -51,7 +51,7 @@
51
51
  "@lezer/highlight": "~1.2.3",
52
52
  "@tanstack/react-virtual": "^3.11.1",
53
53
  "@types/mdast": "^4.0.4",
54
- "@types/unist": "^3.0.3",
54
+ "@types/unist": "3.0.3",
55
55
  "classnames": "2.5.1",
56
56
  "copy-to-clipboard": "^3.3.3",
57
57
  "cron-parser": "5.9.0",
@@ -78,11 +78,11 @@
78
78
  "unified": "^11.0.5",
79
79
  "uuid": "11.1.1",
80
80
  "yaml": "2.8.3",
81
- "@gooddata/sdk-backend-spi": "11.55.0-alpha.1",
82
- "@gooddata/sdk-model": "11.55.0-alpha.1",
83
- "@gooddata/sdk-ui-theme-provider": "11.55.0-alpha.1",
84
- "@gooddata/util": "11.55.0-alpha.1",
85
- "@gooddata/sdk-ui": "11.55.0-alpha.1"
81
+ "@gooddata/sdk-backend-spi": "11.55.0-alpha.3",
82
+ "@gooddata/sdk-model": "11.55.0-alpha.3",
83
+ "@gooddata/sdk-ui": "11.55.0-alpha.3",
84
+ "@gooddata/sdk-ui-theme-provider": "11.55.0-alpha.3",
85
+ "@gooddata/util": "11.55.0-alpha.3"
86
86
  },
87
87
  "devDependencies": {
88
88
  "@microsoft/api-documenter": "7.30.10",
@@ -106,10 +106,8 @@
106
106
  "@vitest/eslint-plugin": "1.6.19",
107
107
  "dependency-cruiser": "17.3.10",
108
108
  "eslint": "^9.39.2",
109
- "eslint-import-resolver-typescript": "4.4.4",
110
109
  "eslint-plugin-headers": "1.3.3",
111
110
  "eslint-plugin-import-esm": "1.2.1",
112
- "eslint-plugin-import-x": "4.16.1",
113
111
  "eslint-plugin-jsdoc": "62.1.0",
114
112
  "eslint-plugin-no-barrel-files": "1.2.2",
115
113
  "eslint-plugin-no-only-tests": "3.3.0",
@@ -120,7 +118,7 @@
120
118
  "kefir": "3.8.8",
121
119
  "npm-run-all": "4.1.5",
122
120
  "oxfmt": "0.52.0",
123
- "oxlint": "1.51.0",
121
+ "oxlint": "1.57.0",
124
122
  "oxlint-tsgolint": "0.15.0",
125
123
  "raf": "3.4.1",
126
124
  "react": "19.1.1",
@@ -131,11 +129,11 @@
131
129
  "typescript": "5.9.3",
132
130
  "vitest": "4.1.8",
133
131
  "vitest-dom": "0.1.1",
134
- "@gooddata/eslint-config": "11.55.0-alpha.1",
135
- "@gooddata/oxlint-config": "11.55.0-alpha.1",
136
- "@gooddata/reference-workspace": "11.55.0-alpha.1",
137
- "@gooddata/sdk-backend-mockingbird": "11.55.0-alpha.1",
138
- "@gooddata/stylelint-config": "11.55.0-alpha.1"
132
+ "@gooddata/eslint-config": "11.55.0-alpha.3",
133
+ "@gooddata/reference-workspace": "11.55.0-alpha.3",
134
+ "@gooddata/oxlint-config": "11.55.0-alpha.3",
135
+ "@gooddata/sdk-backend-mockingbird": "11.55.0-alpha.3",
136
+ "@gooddata/stylelint-config": "11.55.0-alpha.3"
139
137
  },
140
138
  "peerDependencies": {
141
139
  "react": "^18.0.0 || ^19.0.0",
@@ -7,9 +7,13 @@ $box-shadow: var(--gd-button-dropShadow, 0 -1px 0 0) var(--gd-palette-complement
7
7
 
8
8
  $active-background-color: var(--gd-palette-complementary-2);
9
9
 
10
- $action-border-color: var(--gd-palette-error-base-t50);
11
- $action-background-color: var(--gd-palette-error-lightest);
12
- $action-box-shadow: var(--gd-button-dropShadow, 0 -1px 0 0) var(--gd-palette-error-base-t50) inset;
10
+ $delete-border-color: var(--gd-palette-error-base-t50);
11
+ $delete-background-color: var(--gd-palette-error-lightest);
12
+ $delete-box-shadow: var(--gd-button-dropShadow, 0 -1px 0 0) var(--gd-palette-error-base-t50) inset;
13
+
14
+ $action-border-color: var(--gd-palette-complementary-4);
15
+ $action-background-color: var(--gd-palette-complementary-2);
16
+ $action-box-shadow: var(--gd-button-dropShadow, 0 -1px 0 0) var(--gd-palette-complementary-5-t40) inset;
13
17
 
14
18
  .gd-ui-kit-chip {
15
19
  $root: &;
@@ -50,6 +54,15 @@ $action-box-shadow: var(--gd-button-dropShadow, 0 -1px 0 0) var(--gd-palette-err
50
54
  #{$root}__trigger--isDeletable:not(:disabled) {
51
55
  border-right: 1px solid $border-color;
52
56
  }
57
+ #{$root}__trigger--isDeletable#{$root}__trigger--variant-inactive:not(:disabled) {
58
+ border-right: 1px dashed $border-color;
59
+ }
60
+ #{$root}__trigger--isActionable:not(:disabled) {
61
+ border-right: 1px solid $border-color;
62
+ }
63
+ #{$root}__trigger--isActionable#{$root}__trigger--variant-inactive:not(:disabled) {
64
+ border-right: 1px dashed $border-color;
65
+ }
53
66
 
54
67
  &:has(#{$root}__trigger--isLocked:hover) {
55
68
  &::after {
@@ -64,45 +77,94 @@ $action-box-shadow: var(--gd-button-dropShadow, 0 -1px 0 0) var(--gd-palette-err
64
77
  }
65
78
 
66
79
  &:has(#{$root}__delete:hover) {
80
+ border-color: $delete-border-color;
81
+ background-color: $delete-background-color;
82
+
83
+ &::after {
84
+ box-shadow: $delete-box-shadow;
85
+ }
86
+
87
+ #{$root}__trigger:not(#{$root}__trigger--isLocked:disabled) {
88
+ border-color: $delete-border-color;
89
+ border-right: 1px solid $delete-border-color;
90
+ }
91
+ #{$root}__trigger#{$root}__trigger--variant-inactive:not(#{$root}__trigger--isLocked:disabled) {
92
+ border-right: 1px dashed $delete-border-color;
93
+ }
94
+
95
+ #{$root}__trigger--isActive {
96
+ background-color: $delete-background-color;
97
+ }
98
+ }
99
+
100
+ &:has(#{$root}__action:hover) {
67
101
  border-color: $action-border-color;
68
102
  background-color: $action-background-color;
69
103
 
70
104
  &::after {
71
- content: "";
72
- border-radius: inherit;
73
105
  box-shadow: $action-box-shadow;
74
- position: absolute;
75
- width: 100%;
76
- height: 100%;
77
- left: 0;
78
- top: 0;
79
- pointer-events: none;
80
106
  }
81
107
 
82
108
  #{$root}__trigger:not(#{$root}__trigger--isLocked:disabled) {
83
109
  border-color: $action-border-color;
84
110
  border-right: 1px solid $action-border-color;
85
111
  }
112
+ #{$root}__trigger#{$root}__trigger--variant-inactive:not(#{$root}__trigger--isLocked:disabled) {
113
+ border-right: 1px dashed $action-border-color;
114
+ }
86
115
 
87
116
  #{$root}__trigger--isActive {
88
117
  background-color: $action-background-color;
89
118
  }
119
+ }
120
+
121
+ &:has(#{$root}__delete:hover),
122
+ &:has(#{$root}__action:hover) {
123
+ &::after {
124
+ content: "";
125
+ border-radius: inherit;
126
+ position: absolute;
127
+ width: 100%;
128
+ height: 100%;
129
+ left: 0;
130
+ top: 0;
131
+ pointer-events: none;
132
+ }
90
133
 
91
134
  #{$root}__delete {
92
135
  color: var(--gd-palette-error-base);
93
136
  }
137
+ #{$root}__action {
138
+ color: var(--gd-palette-complementary-2);
139
+ }
140
+ }
141
+
142
+ &--variant-inactive {
143
+ border-style: dashed;
94
144
  }
95
145
 
96
146
  #{$root}__trigger--isDeletable {
97
147
  border-right: 1px solid transparent;
98
148
  }
99
-
149
+ #{$root}__trigger--isDeletable#{$root}__trigger--variant-inactive {
150
+ border-right: 1px dashed transparent;
151
+ }
100
152
  #{$root}__trigger--hasIconAfter#{$root}__trigger--isDeletable {
101
153
  padding-right: 3px;
102
154
  }
155
+ #{$root}__trigger--isActionable {
156
+ border-right: 1px solid transparent;
157
+ }
158
+ #{$root}__trigger--isActionable#{$root}__trigger--variant-inactive {
159
+ border-right: 1px dashed transparent;
160
+ }
161
+ #{$root}__trigger--hasIconAfter#{$root}__trigger--isActionable {
162
+ padding-right: 3px;
163
+ }
103
164
 
104
165
  &__trigger,
105
- &__delete {
166
+ &__delete,
167
+ &__action {
106
168
  color: var(--gd-palette-complementary-7);
107
169
  background-color: transparent;
108
170
  border-radius: var(--gd-button-borderRadius);
@@ -129,11 +191,19 @@ $action-box-shadow: var(--gd-button-dropShadow, 0 -1px 0 0) var(--gd-palette-err
129
191
  border-radius: $border-radius 0 0 $border-radius;
130
192
  border-right: 1px solid transparent;
131
193
 
194
+ &--variant-inactive {
195
+ border-right: 1px dashed transparent;
196
+ color: var(--gd-palette-complementary-6);
197
+ }
198
+
132
199
  &--isActive {
133
200
  color: var(--gd-palette-complementary-8);
134
201
  background-color: $active-background-color;
135
202
  border-right: 1px solid $border-color;
136
203
  }
204
+ &--isActive#{$root}__trigger--variant-inactive {
205
+ border-right: 1px dashed $border-color;
206
+ }
137
207
 
138
208
  &--isLocked {
139
209
  cursor: default;
@@ -147,7 +217,7 @@ $action-box-shadow: var(--gd-button-dropShadow, 0 -1px 0 0) var(--gd-palette-err
147
217
  }
148
218
  }
149
219
 
150
- &:not(&:disabled) {
220
+ &:not(&:disabled):not(#{$root}__trigger--variant-inactive) {
151
221
  &:hover,
152
222
  &:focus,
153
223
  &:active {
@@ -159,7 +229,7 @@ $action-box-shadow: var(--gd-button-dropShadow, 0 -1px 0 0) var(--gd-palette-err
159
229
  }
160
230
  }
161
231
 
162
- &:not(&--isDeletable) {
232
+ &:not(&--isDeletable):not(&--isActionable) {
163
233
  border-radius: $border-radius;
164
234
  border: none;
165
235
  }
@@ -183,6 +253,24 @@ $action-box-shadow: var(--gd-button-dropShadow, 0 -1px 0 0) var(--gd-palette-err
183
253
  }
184
254
  }
185
255
 
256
+ &__action {
257
+ flex-shrink: 0;
258
+ border-radius: 0 $border-radius $border-radius 0;
259
+ padding: 0 7px 0 3px;
260
+
261
+ &:not(&:disabled) {
262
+ &:hover,
263
+ &:focus,
264
+ &:active {
265
+ svg {
266
+ color: var(--gd-palette-complementary-2);
267
+ }
268
+
269
+ color: var(--gd-palette-complementary-8);
270
+ }
271
+ }
272
+ }
273
+
186
274
  &__label {
187
275
  transition: var(--gd-transition-all);
188
276
  white-space: nowrap;
@@ -242,4 +330,11 @@ $action-box-shadow: var(--gd-button-dropShadow, 0 -1px 0 0) var(--gd-palette-err
242
330
  justify-content: center;
243
331
  transition: var(--gd-transition-all);
244
332
  }
333
+
334
+ &__icon-action {
335
+ display: flex;
336
+ align-items: center;
337
+ justify-content: center;
338
+ transition: var(--gd-transition-all);
339
+ }
245
340
  }
@@ -0,0 +1,120 @@
1
+ // (C) 2007-2026 GoodData Corporation
2
+
3
+ .gd-ui-kit-color-picker {
4
+ --color-picker-handle: 14px;
5
+
6
+ width: 200px;
7
+ padding: 15px;
8
+ }
9
+
10
+ // Hue runs around the wheel and saturation out from the middle, which the geometry in UiColorWheel.tsx
11
+ // reads back. The two agree only because the conic gradient starts where the screen angle is
12
+ // measured from - at 3 o'clock, running clockwise - so a gradient position is a hue is an angle.
13
+ //
14
+ // Painted at a fixed lightness, not the one being edited: at either extreme every hue renders the
15
+ // same white or black, and a wheel that followed it would leave nothing to aim at.
16
+ .gd-ui-kit-color-picker__wheel {
17
+ position: relative;
18
+ width: 100%;
19
+ aspect-ratio: 1;
20
+ margin-bottom: 15px;
21
+ border-radius: 50%;
22
+ cursor: crosshair;
23
+ // Without this a drag on a touch screen scrolls the page instead of picking a color.
24
+ touch-action: none;
25
+ user-select: none;
26
+ background:
27
+ radial-gradient(circle closest-side, hsl(0deg 0% 50%) 0%, transparent 100%),
28
+ conic-gradient(
29
+ from 90deg,
30
+ hsl(0deg 100% 50%),
31
+ hsl(60deg 100% 50%),
32
+ hsl(120deg 100% 50%),
33
+ hsl(180deg 100% 50%),
34
+ hsl(240deg 100% 50%),
35
+ hsl(300deg 100% 50%),
36
+ hsl(360deg 100% 50%)
37
+ );
38
+
39
+ &:focus-visible {
40
+ outline: 2px solid var(--gd-palette-primary-base);
41
+ outline-offset: 2px;
42
+ }
43
+ }
44
+
45
+ .gd-ui-kit-color-picker__slider {
46
+ position: relative;
47
+ height: var(--color-picker-handle);
48
+ margin-bottom: 15px;
49
+ border-radius: calc(var(--color-picker-handle) / 2);
50
+ cursor: pointer;
51
+ touch-action: none;
52
+ // A drag would otherwise select the labels around the control and show an I-beam over it.
53
+ user-select: none;
54
+ // Shows through wherever a track is not fully opaque, which is what marks it as see-through.
55
+ background: repeating-conic-gradient(
56
+ var(--gd-palette-complementary-2) 0% 25%,
57
+ var(--gd-palette-complementary-0) 0% 50%
58
+ )
59
+ 50% / 8px 8px;
60
+
61
+ &:focus-visible {
62
+ outline: 2px solid var(--gd-palette-primary-base);
63
+ outline-offset: 2px;
64
+ }
65
+ }
66
+
67
+ .gd-ui-kit-color-picker__slider-track {
68
+ position: absolute;
69
+ inset: 0;
70
+ border-radius: inherit;
71
+ }
72
+
73
+ // Placed by its middle, which is what the positions the controls set mean. The border counts
74
+ // towards its size, or the offset that centres it would be short by the border on each side.
75
+ .gd-ui-kit-color-picker__wheel-thumb,
76
+ .gd-ui-kit-color-picker__slider-thumb {
77
+ position: absolute;
78
+ box-sizing: border-box;
79
+ width: var(--color-picker-handle);
80
+ height: var(--color-picker-handle);
81
+ margin: calc(var(--color-picker-handle) / -2) 0 0 calc(var(--color-picker-handle) / -2);
82
+ border: 2px solid var(--gd-palette-complementary-0);
83
+ border-radius: 50%;
84
+ box-shadow: 0 0 2px var(--gd-palette-complementary-6);
85
+ // The handle only reports where the value is; the gesture belongs to the control under it.
86
+ pointer-events: none;
87
+ }
88
+
89
+ .gd-ui-kit-color-picker__slider-thumb {
90
+ top: 50%;
91
+ // Stops half a handle short of each end, so it stays inside the track it reads against.
92
+ left: calc(
93
+ var(--color-picker-handle) / 2 + (100% - var(--color-picker-handle)) *
94
+ var(--color-picker-slider-position)
95
+ );
96
+ }
97
+
98
+ .gd-ui-kit-color-picker__value {
99
+ display: flex;
100
+ align-items: center;
101
+ gap: 5px;
102
+
103
+ // A text input asks for a width of its own and a flex item will not shrink below what it asks
104
+ // for, so without this the notation button is pushed out of the panel.
105
+ .gd-ui-kit-text-input {
106
+ flex: 1;
107
+ min-width: 0;
108
+ }
109
+ }
110
+
111
+ .gd-ui-kit-color-picker__actions {
112
+ display: flex;
113
+ justify-content: space-between;
114
+ gap: 10px;
115
+ padding: 15px 0 0;
116
+
117
+ .gd-ui-kit-button {
118
+ flex: 1;
119
+ }
120
+ }
@@ -8,6 +8,7 @@
8
8
  @use "./UiSkeleton/UiSkeleton.scss";
9
9
  @use "./UiPagedVirtualList/UiPagedVirtualList.scss";
10
10
  @use "./UiChip/UiChip.scss";
11
+ @use "./UiColorPicker/UiColorPicker.scss";
11
12
  @use "./UiControlButton/UiControlButton.scss";
12
13
  @use "./UiCombobox/UiCombobox.scss";
13
14
  @use "./UiAutocomplete/UiAutocomplete.scss";