@gooddata/sdk-ui-kit 11.57.0-alpha.3 → 11.57.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 (139) hide show
  1. package/esm/@ui/@utils/keyboardNavigation.d.ts +10 -0
  2. package/esm/@ui/@utils/keyboardNavigation.d.ts.map +1 -1
  3. package/esm/@ui/@utils/keyboardNavigation.js +9 -0
  4. package/esm/@ui/UiAddGranteeDialog/UiAddGranteeDialogCard.d.ts +4 -6
  5. package/esm/@ui/UiAddGranteeDialog/UiAddGranteeDialogCard.d.ts.map +1 -1
  6. package/esm/@ui/UiAddGranteeDialog/UiAddGranteeDialogCard.js +10 -8
  7. package/esm/@ui/UiAutocomplete/useAsyncListSource.js +1 -1
  8. package/esm/@ui/UiGranteeAsyncPicker/UiGranteeAsyncPicker.d.ts +8 -1
  9. package/esm/@ui/UiGranteeAsyncPicker/UiGranteeAsyncPicker.d.ts.map +1 -1
  10. package/esm/@ui/UiGranteeAsyncPicker/UiGranteeAsyncPicker.js +10 -6
  11. package/esm/@ui/UiListbox/defaults/DefaultUiListboxInteractiveItemComponent.d.ts.map +1 -1
  12. package/esm/@ui/UiListbox/defaults/DefaultUiListboxInteractiveItemComponent.js +6 -2
  13. package/esm/@ui/UiMenu/components/defaults/DefaultUiMenuContentItem.d.ts.map +1 -1
  14. package/esm/@ui/UiMenu/components/defaults/DefaultUiMenuContentItem.js +7 -2
  15. package/esm/@ui/UiMenu/components/defaults/DefaultUiMenuInteractiveItem.d.ts.map +1 -1
  16. package/esm/@ui/UiMenu/components/defaults/DefaultUiMenuInteractiveItem.js +7 -2
  17. package/esm/@ui/UiModalDialog/UiDialogHeader.d.ts.map +1 -1
  18. package/esm/@ui/UiModalDialog/UiDialogHeader.js +6 -3
  19. package/esm/@ui/UiObjectShareDialog/UiObjectShareDialogCard.d.ts +16 -3
  20. package/esm/@ui/UiObjectShareDialog/UiObjectShareDialogCard.d.ts.map +1 -1
  21. package/esm/@ui/UiObjectShareDialog/UiObjectShareDialogCard.js +2 -3
  22. package/esm/@ui/UiPermissionMenu/UiPermissionMenu.d.ts +9 -4
  23. package/esm/@ui/UiPermissionMenu/UiPermissionMenu.d.ts.map +1 -1
  24. package/esm/@ui/UiPermissionMenu/UiPermissionMenu.js +20 -29
  25. package/esm/@ui/UiTags/hooks/useResponsiveTags.js +1 -1
  26. package/esm/@ui/UiToolbar/UiToolbar.d.ts +52 -0
  27. package/esm/@ui/UiToolbar/UiToolbar.d.ts.map +1 -0
  28. package/esm/@ui/UiToolbar/UiToolbar.js +44 -0
  29. package/esm/@ui/UiToolbar/UiToolbarChevron.d.ts +8 -0
  30. package/esm/@ui/UiToolbar/UiToolbarChevron.d.ts.map +1 -0
  31. package/esm/@ui/UiToolbar/UiToolbarChevron.js +12 -0
  32. package/esm/@ui/UiToolbar/UiToolbarItemTooltip.d.ts +14 -0
  33. package/esm/@ui/UiToolbar/UiToolbarItemTooltip.d.ts.map +1 -0
  34. package/esm/@ui/UiToolbar/UiToolbarItemTooltip.js +11 -0
  35. package/esm/@ui/UiToolbar/constants.d.ts +5 -0
  36. package/esm/@ui/UiToolbar/constants.d.ts.map +1 -0
  37. package/esm/@ui/UiToolbar/constants.js +6 -0
  38. package/esm/@ui/UiToolbar/context.d.ts +23 -0
  39. package/esm/@ui/UiToolbar/context.d.ts.map +1 -0
  40. package/esm/@ui/UiToolbar/context.js +6 -0
  41. package/esm/@ui/UiToolbar/rovingFocusUtils.d.ts +55 -0
  42. package/esm/@ui/UiToolbar/rovingFocusUtils.d.ts.map +1 -0
  43. package/esm/@ui/UiToolbar/rovingFocusUtils.js +220 -0
  44. package/esm/@ui/UiToolbar/toolbarItemProps.d.ts +35 -0
  45. package/esm/@ui/UiToolbar/toolbarItemProps.d.ts.map +1 -0
  46. package/esm/@ui/UiToolbar/toolbarItemProps.js +2 -0
  47. package/esm/@ui/UiToolbar/useToolbarRovingFocus.d.ts +19 -0
  48. package/esm/@ui/UiToolbar/useToolbarRovingFocus.d.ts.map +1 -0
  49. package/esm/@ui/UiToolbar/useToolbarRovingFocus.js +172 -0
  50. package/esm/@ui/UiToolbarButton/UiToolbarButton.d.ts +19 -0
  51. package/esm/@ui/UiToolbarButton/UiToolbarButton.d.ts.map +1 -0
  52. package/esm/@ui/UiToolbarButton/UiToolbarButton.js +29 -0
  53. package/esm/@ui/UiToolbarButton/useToolbarItemRole.d.ts +38 -0
  54. package/esm/@ui/UiToolbarButton/useToolbarItemRole.d.ts.map +1 -0
  55. package/esm/@ui/UiToolbarButton/useToolbarItemRole.js +67 -0
  56. package/esm/@ui/UiToolbarColorSwatch/UiToolbarColorSwatch.d.ts +38 -0
  57. package/esm/@ui/UiToolbarColorSwatch/UiToolbarColorSwatch.d.ts.map +1 -0
  58. package/esm/@ui/UiToolbarColorSwatch/UiToolbarColorSwatch.js +13 -0
  59. package/esm/@ui/UiToolbarDivider/UiToolbarDivider.d.ts +7 -0
  60. package/esm/@ui/UiToolbarDivider/UiToolbarDivider.d.ts.map +1 -0
  61. package/esm/@ui/UiToolbarDivider/UiToolbarDivider.js +12 -0
  62. package/esm/@ui/UiToolbarIconButton/UiToolbarIconButton.d.ts +34 -0
  63. package/esm/@ui/UiToolbarIconButton/UiToolbarIconButton.d.ts.map +1 -0
  64. package/esm/@ui/UiToolbarIconButton/UiToolbarIconButton.js +34 -0
  65. package/esm/@ui/UiToolbarIconSelect/UiToolbarIconSelect.d.ts +54 -0
  66. package/esm/@ui/UiToolbarIconSelect/UiToolbarIconSelect.d.ts.map +1 -0
  67. package/esm/@ui/UiToolbarIconSelect/UiToolbarIconSelect.js +26 -0
  68. package/esm/@ui/UiToolbarMoreButton/UiToolbarMoreButton.d.ts +41 -0
  69. package/esm/@ui/UiToolbarMoreButton/UiToolbarMoreButton.d.ts.map +1 -0
  70. package/esm/@ui/UiToolbarMoreButton/UiToolbarMoreButton.js +12 -0
  71. package/esm/@ui/UiToolbarSegmentedControl/UiToolbarSegmentedControl.d.ts +37 -0
  72. package/esm/@ui/UiToolbarSegmentedControl/UiToolbarSegmentedControl.d.ts.map +1 -0
  73. package/esm/@ui/UiToolbarSegmentedControl/UiToolbarSegmentedControl.js +145 -0
  74. package/esm/@ui/UiToolbarSegmentedControl/context.d.ts +12 -0
  75. package/esm/@ui/UiToolbarSegmentedControl/context.d.ts.map +1 -0
  76. package/esm/@ui/UiToolbarSegmentedControl/context.js +3 -0
  77. package/esm/@ui/UiToolbarSelect/UiToolbarSelect.d.ts +51 -0
  78. package/esm/@ui/UiToolbarSelect/UiToolbarSelect.d.ts.map +1 -0
  79. package/esm/@ui/UiToolbarSelect/UiToolbarSelect.js +24 -0
  80. package/esm/@ui/UiToolbarStepper/UiToolbarStepper.d.ts +75 -0
  81. package/esm/@ui/UiToolbarStepper/UiToolbarStepper.d.ts.map +1 -0
  82. package/esm/@ui/UiToolbarStepper/UiToolbarStepper.js +85 -0
  83. package/esm/@ui/UiTooltip/UiTooltip.d.ts +1 -1
  84. package/esm/@ui/UiTooltip/UiTooltip.d.ts.map +1 -1
  85. package/esm/@ui/UiTooltip/UiTooltip.js +26 -8
  86. package/esm/@ui/UiTooltip/types.d.ts +12 -0
  87. package/esm/@ui/UiTooltip/types.d.ts.map +1 -1
  88. package/esm/@ui/hooks/useElementSize.d.ts.map +1 -1
  89. package/esm/@ui/hooks/useElementSize.js +2 -1
  90. package/esm/@ui/hooks/useIsTextTruncated.d.ts +12 -0
  91. package/esm/@ui/hooks/useIsTextTruncated.d.ts.map +1 -0
  92. package/esm/@ui/hooks/useIsTextTruncated.js +29 -0
  93. package/esm/Dropdown/Dropdown.js +1 -1
  94. package/esm/EditableLabel/EditableLabel.js +1 -1
  95. package/esm/List/LegacyList.js +1 -1
  96. package/esm/List/List.js +1 -1
  97. package/esm/Messages/toasts/NonContextToastsInterop.js +1 -1
  98. package/esm/Messages/toasts/ToastsCenterMessage.d.ts.map +1 -1
  99. package/esm/Messages/toasts/ToastsCenterMessage.js +1 -1
  100. package/esm/ResponsiveText/ResponsiveText.js +3 -3
  101. package/esm/ShortenedText/ShortenedText.js +1 -1
  102. package/esm/index.d.ts +15 -1
  103. package/esm/index.d.ts.map +1 -1
  104. package/esm/index.js +12 -1
  105. package/esm/locales.d.ts +4 -16
  106. package/esm/locales.d.ts.map +1 -1
  107. package/esm/locales.js +2 -6
  108. package/esm/sdk-ui-kit.d.ts +513 -15
  109. package/esm/syntaxHighlightingInput/hooks/useCodemirror.js +1 -1
  110. package/esm/utils/domUtilities.d.ts +4 -0
  111. package/esm/utils/domUtilities.d.ts.map +1 -1
  112. package/esm/utils/domUtilities.js +4 -1
  113. package/esm/utils/events.d.ts +3 -0
  114. package/esm/utils/events.d.ts.map +1 -1
  115. package/esm/utils/events.js +4 -1
  116. package/package.json +12 -13
  117. package/src/@ui/UiAddGranteeDialog/UiAddGranteeDialog.scss +8 -0
  118. package/src/@ui/UiGranteeAsyncPicker/UiGranteeAsyncPicker.scss +0 -6
  119. package/src/@ui/UiGranteeRow/UiGranteeRow.scss +5 -0
  120. package/src/@ui/UiListbox/UiListbox.scss +4 -0
  121. package/src/@ui/UiMenu/UiMenu.scss +3 -0
  122. package/src/@ui/UiModalDialog/UiModalDialog.scss +16 -3
  123. package/src/@ui/UiObjectShareDialog/UiObjectShareDialog.scss +40 -1
  124. package/src/@ui/UiPermissionMenu/UiPermissionMenu.scss +7 -3
  125. package/src/@ui/UiToolbar/UiToolbar.scss +15 -0
  126. package/src/@ui/UiToolbar/UiToolbarChevron.scss +11 -0
  127. package/src/@ui/UiToolbar/toolbarItem.scss +133 -0
  128. package/src/@ui/UiToolbarButton/UiToolbarButton.scss +15 -0
  129. package/src/@ui/UiToolbarColorSwatch/UiToolbarColorSwatch.scss +66 -0
  130. package/src/@ui/UiToolbarDivider/UiToolbarDivider.scss +11 -0
  131. package/src/@ui/UiToolbarIconButton/UiToolbarIconButton.scss +30 -0
  132. package/src/@ui/UiToolbarIconSelect/UiToolbarIconSelect.scss +12 -0
  133. package/src/@ui/UiToolbarSegmentedControl/UiToolbarSegmentedControl.scss +10 -0
  134. package/src/@ui/UiToolbarSelect/UiToolbarSelect.scss +29 -0
  135. package/src/@ui/UiToolbarStepper/UiToolbarStepper.scss +53 -0
  136. package/src/@ui/defaultTheme.scss +1 -0
  137. package/src/@ui/index.scss +10 -0
  138. package/styles/css/main.css +563 -9
  139. package/styles/css/main.css.map +1 -1
@@ -2,6 +2,9 @@ import { type KeyboardEvent } from "react";
2
2
  /**
3
3
  * Checks if the given keyboard event is an action key = Enter or Space.
4
4
  *
5
+ * Both the produced character and the physical key are accepted, so it agrees with the navigation
6
+ * helpers in `@ui`, which match on `code`.
7
+ *
5
8
  * @param event - The keyboard event to check.
6
9
  * @returns `true` if the event is an action key, `false` otherwise.
7
10
  *
@@ -1 +1 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/utils/events.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,UAAW,aAAa,KAAG,OAElD,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU,UAAW,aAAa,KAAG,OAEjD,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU,UAAW,aAAa,KAAG,OAEjD,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU,UAAW,aAAa,KAAG,OAEjD,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,UAAW,aAAa,KAAG,OAErD,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,UAAW,aAAa,KAAG,OASlD,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,UAAW,aAAa,KAAG,OAElD,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,UAAW,aAAa,KAAG,OAEhD,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,QAAQ,UAAW,aAAa,KAAG,OAE/C,CAAC"}
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/utils/events.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C;;;;;;;;;;GAUG;AACH,eAAO,MAAM,WAAW,UAAW,aAAa,KAAG,OAElD,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU,UAAW,aAAa,KAAG,OAEjD,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU,UAAW,aAAa,KAAG,OAEjD,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU,UAAW,aAAa,KAAG,OAEjD,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,UAAW,aAAa,KAAG,OAErD,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,UAAW,aAAa,KAAG,OASlD,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,UAAW,aAAa,KAAG,OAElD,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,UAAW,aAAa,KAAG,OAEhD,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,QAAQ,UAAW,aAAa,KAAG,OAE/C,CAAC"}
@@ -2,13 +2,16 @@
2
2
  /**
3
3
  * Checks if the given keyboard event is an action key = Enter or Space.
4
4
  *
5
+ * Both the produced character and the physical key are accepted, so it agrees with the navigation
6
+ * helpers in `@ui`, which match on `code`.
7
+ *
5
8
  * @param event - The keyboard event to check.
6
9
  * @returns `true` if the event is an action key, `false` otherwise.
7
10
  *
8
11
  * @internal
9
12
  */
10
13
  export const isActionKey = (event) => {
11
- return event.key === "Enter" || event.key === " ";
14
+ return event.key === "Enter" || event.key === " " || event.code === "Enter" || event.code === "Space";
12
15
  };
13
16
  /**
14
17
  * Checks if the given keyboard event is triggered by a Space key.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gooddata/sdk-ui-kit",
3
- "version": "11.57.0-alpha.3",
3
+ "version": "11.57.0-alpha.4",
4
4
  "description": "GoodData SDK - UI Building Components",
5
5
  "license": "MIT",
6
6
  "author": "GoodData Corporation",
@@ -79,11 +79,11 @@
79
79
  "unified": "^11.0.5",
80
80
  "uuid": "11.1.1",
81
81
  "yaml": "2.8.3",
82
- "@gooddata/sdk-model": "11.57.0-alpha.3",
83
- "@gooddata/sdk-backend-spi": "11.57.0-alpha.3",
84
- "@gooddata/util": "11.57.0-alpha.3",
85
- "@gooddata/sdk-ui-theme-provider": "11.57.0-alpha.3",
86
- "@gooddata/sdk-ui": "11.57.0-alpha.3"
82
+ "@gooddata/sdk-model": "11.57.0-alpha.4",
83
+ "@gooddata/sdk-backend-spi": "11.57.0-alpha.4",
84
+ "@gooddata/sdk-ui-theme-provider": "11.57.0-alpha.4",
85
+ "@gooddata/sdk-ui": "11.57.0-alpha.4",
86
+ "@gooddata/util": "11.57.0-alpha.4"
87
87
  },
88
88
  "devDependencies": {
89
89
  "@microsoft/api-documenter": "7.30.10",
@@ -111,13 +111,12 @@
111
111
  "eslint-plugin-no-barrel-files": "1.2.2",
112
112
  "eslint-plugin-no-only-tests": "3.3.0",
113
113
  "eslint-plugin-react": "7.37.5",
114
- "eslint-plugin-react-hooks": "5.2.0",
115
114
  "eslint-plugin-sonarjs": "3.0.6",
116
115
  "happy-dom": "20.12.0",
117
116
  "kefir": "3.8.8",
118
117
  "npm-run-all": "4.1.5",
119
118
  "oxfmt": "0.66.0",
120
- "oxlint": "1.67.0",
119
+ "oxlint": "1.82.0",
121
120
  "oxlint-plugin-eslint": "1.82.0",
122
121
  "oxlint-tsgolint": "0.22.1",
123
122
  "raf": "3.4.1",
@@ -129,11 +128,11 @@
129
128
  "typescript": "7.0.2",
130
129
  "vitest": "4.1.8",
131
130
  "vitest-dom": "0.1.1",
132
- "@gooddata/eslint-config": "11.57.0-alpha.3",
133
- "@gooddata/oxlint-config": "11.57.0-alpha.3",
134
- "@gooddata/reference-workspace": "11.57.0-alpha.3",
135
- "@gooddata/sdk-backend-mockingbird": "11.57.0-alpha.3",
136
- "@gooddata/stylelint-config": "11.57.0-alpha.3"
131
+ "@gooddata/eslint-config": "11.57.0-alpha.4",
132
+ "@gooddata/sdk-backend-mockingbird": "11.57.0-alpha.4",
133
+ "@gooddata/oxlint-config": "11.57.0-alpha.4",
134
+ "@gooddata/stylelint-config": "11.57.0-alpha.4",
135
+ "@gooddata/reference-workspace": "11.57.0-alpha.4"
137
136
  },
138
137
  "peerDependencies": {
139
138
  "react": "^18.0.0 || ^19.0.0",
@@ -4,5 +4,13 @@
4
4
  display: flex;
5
5
  flex-direction: column;
6
6
  gap: var(--gd-spacing-10px);
7
+
8
+ // This card spaces its children with a gap of its own, which stacks with the shared
9
+ // header's bottom margin. Halve the margin so the two together come to the 20px the
10
+ // design puts between the header and the first content. Cards with no gap of their own
11
+ // (the confirm dialog, the report dialogs) keep the full margin and need no override.
12
+ .gd-ui-kit-dialog-header {
13
+ margin-bottom: var(--gd-spacing-10px);
14
+ }
7
15
  padding-bottom: var(--gd-spacing-5px);
8
16
  }
@@ -9,12 +9,6 @@
9
9
  gap: var(--gd-spacing-5px);
10
10
  }
11
11
 
12
- &__field-label {
13
- font-size: 14px;
14
- line-height: 21px;
15
- color: var(--gd-palette-complementary-7);
16
- }
17
-
18
12
  &__empty-state {
19
13
  min-height: 50px;
20
14
  display: flex;
@@ -9,6 +9,11 @@
9
9
  padding: var(--gd-spacing-5px) 0;
10
10
  box-sizing: border-box;
11
11
 
12
+ // Row-wide hover highlight, the same one list items use elsewhere.
13
+ &:hover {
14
+ background: var(--gd-palette-complementary-2);
15
+ }
16
+
12
17
  // Muted while a change for this row is being saved (its controls are disabled too).
13
18
  &--pending {
14
19
  opacity: 0.6;
@@ -81,7 +81,11 @@
81
81
  }
82
82
 
83
83
  &__item-title {
84
+ display: block;
84
85
  width: 100%;
86
+ min-width: 0;
87
+ overflow: hidden;
88
+ text-overflow: ellipsis;
85
89
  white-space: nowrap;
86
90
  }
87
91
 
@@ -201,8 +201,11 @@
201
201
  }
202
202
 
203
203
  &__item-title {
204
+ display: block;
204
205
  width: 100%;
205
206
  min-width: 0;
207
+ overflow: hidden;
208
+ text-overflow: ellipsis;
206
209
  white-space: nowrap;
207
210
  }
208
211
  }
@@ -32,7 +32,9 @@
32
32
  .gd-ui-kit-dialog-header {
33
33
  display: flex;
34
34
  align-items: center;
35
- gap: var(--gd-spacing-15px);
35
+ // 10px between the leading slot (the back button) and the title, per the design.
36
+ // The title flexes, so this is also the minimum before the trailing close button.
37
+ gap: var(--gd-spacing-10px);
36
38
  margin-bottom: var(--gd-spacing-20px);
37
39
 
38
40
  &__leading {
@@ -41,6 +43,17 @@
41
43
  flex-shrink: 0;
42
44
  }
43
45
 
46
+ // The close button's 32px hit area is taller than the title's 23px line box. Left to
47
+ // stretch the row it would push the title down and the content below further away than
48
+ // the design places them, so pull the extra back at both ends. The target size itself
49
+ // is untouched: only the button's contribution to the row's height changes.
50
+ &__close {
51
+ display: inline-flex;
52
+ align-items: center;
53
+ flex-shrink: 0;
54
+ margin-block: calc((23px - 32px) / 2);
55
+ }
56
+
44
57
  &__title {
45
58
  flex: 1 1 auto;
46
59
  min-width: 0;
@@ -52,8 +65,8 @@
52
65
  white-space: nowrap;
53
66
 
54
67
  &--size-default {
55
- font-size: 18px;
56
- line-height: 26px;
68
+ font-size: 17px;
69
+ line-height: 23px;
57
70
  }
58
71
 
59
72
  &--size-large {
@@ -5,14 +5,53 @@
5
5
  flex-direction: column;
6
6
  gap: var(--gd-spacing-10px);
7
7
 
8
+ // This card spaces its children with a gap of its own, which stacks with the shared
9
+ // header's bottom margin. Halve the margin so the two together come to the 20px the
10
+ // design puts between the header and the first content. Cards with no gap of their own
11
+ // (the confirm dialog, the report dialogs) keep the full margin and need no override.
12
+ .gd-ui-kit-dialog-header {
13
+ margin-bottom: var(--gd-spacing-10px);
14
+ }
15
+
16
+ &__note {
17
+ // Stacks with the card's gap to set the note a design-standard 20px apart from the
18
+ // section below it, where the gap alone would leave it half that.
19
+ margin-bottom: var(--gd-spacing-10px);
20
+ padding: var(--gd-spacing-5px) var(--gd-spacing-10px);
21
+ border-radius: 3px;
22
+ background: var(--gd-palette-primary-dimmed);
23
+ color: var(--gd-palette-primary-base);
24
+ font-size: 14px;
25
+ line-height: 20px;
26
+ }
27
+
28
+ &__note-prefix {
29
+ font-weight: 700;
30
+ }
31
+
8
32
  &__grantees {
9
33
  display: flex;
10
34
  flex-direction: column;
35
+ // Stacks with the card's gap to set the list 20px apart from the section that
36
+ // follows it, while the section heading above it keeps the tighter 10px.
37
+ padding-bottom: var(--gd-spacing-10px);
38
+ }
39
+
40
+ &__empty {
41
+ padding-block: var(--gd-spacing-10px);
42
+ color: var(--gd-palette-complementary-6);
43
+ font-size: 14px;
44
+ line-height: 20px;
45
+ text-align: center;
46
+
47
+ p {
48
+ margin: 0;
49
+ }
11
50
  }
12
51
 
13
52
  &__error {
14
53
  padding-block: var(--gd-spacing-20px);
15
- color: var(--gd-palette-complementary-6, #94a1ad);
54
+ color: var(--gd-palette-complementary-6);
16
55
  font-size: 14px;
17
56
  text-align: center;
18
57
  }
@@ -30,9 +30,8 @@
30
30
  display: flex;
31
31
  align-items: stretch;
32
32
 
33
- // Hover/focus highlight covers the full row (label button + adjacent
34
- // tooltip-icon button), not just the label button. The two buttons
35
- // are siblings — a partial highlight would look broken.
33
+ // Hover/focus highlight on the row wrapper, so it also covers the tooltip
34
+ // anchor wrapper a disabled row is nested in.
36
35
  &:hover,
37
36
  &:focus-within {
38
37
  background: var(--gd-palette-complementary-2);
@@ -70,6 +69,11 @@
70
69
  }
71
70
  }
72
71
 
72
+ // Explanations are sentences; keep them from stretching into one long line.
73
+ &__item-tooltip {
74
+ max-width: 220px;
75
+ }
76
+
73
77
  &__item-label {
74
78
  flex: 1 1 auto;
75
79
  min-width: 0;
@@ -0,0 +1,15 @@
1
+ // (C) 2026 GoodData Corporation
2
+
3
+ @use "./toolbarItem";
4
+
5
+ .gd-ui-kit-toolbar {
6
+ display: inline-flex;
7
+ align-items: center;
8
+ gap: toolbarItem.$toolbar-gap;
9
+ box-sizing: border-box;
10
+ padding: toolbarItem.$toolbar-padding;
11
+ border: 1px solid var(--gd-palette-complementary-3);
12
+ border-radius: var(--gd-button-borderRadius);
13
+ background-color: var(--gd-palette-complementary-0);
14
+ box-shadow: 0 2px 10px var(--gd-shadow-color);
15
+ }
@@ -0,0 +1,11 @@
1
+ // (C) 2026 GoodData Corporation
2
+
3
+ .gd-ui-kit-toolbar-chevron {
4
+ display: inline-flex;
5
+ flex-shrink: 0;
6
+ transition: var(--gd-transition-all);
7
+
8
+ &--isOpen {
9
+ transform: rotate(180deg);
10
+ }
11
+ }
@@ -0,0 +1,133 @@
1
+ // (C) 2026 GoodData Corporation
2
+
3
+ // Toolbar-only dimensions from the design library. They are not theme variables.
4
+ $toolbar-item-size: 28px;
5
+ $toolbar-item-padding: 4px;
6
+ $toolbar-item-gap: 4px;
7
+ $toolbar-padding: 8px;
8
+ $toolbar-gap: 8px;
9
+ $toolbar-icon-size-medium: 20px;
10
+ $toolbar-icon-size-small: 14px;
11
+ $toolbar-hit-area: 24px;
12
+
13
+ @mixin toolbar-item-base {
14
+ display: inline-flex;
15
+ align-items: center;
16
+ justify-content: center;
17
+ gap: $toolbar-item-gap;
18
+ box-sizing: border-box;
19
+ height: $toolbar-item-size;
20
+ margin: 0;
21
+ padding: 0 $toolbar-item-padding;
22
+ border: 0;
23
+ border-radius: var(--gd-toolbar-borderRadius);
24
+ background-color: transparent;
25
+ font-family: var(--gd-font-family);
26
+ font-size: 14px;
27
+ line-height: normal;
28
+ white-space: nowrap;
29
+ cursor: pointer;
30
+ outline: none;
31
+ transition: var(--gd-transition-all);
32
+ }
33
+
34
+ @mixin toolbar-focus-ring {
35
+ &:focus-visible {
36
+ box-shadow: inset 0 0 0 2px var(--gd-palette-primary-base);
37
+ }
38
+ }
39
+
40
+ // The toolbar colour ladder. `$root` is the block selector of the component.
41
+ @mixin toolbar-item-ladder($root) {
42
+ --gd-icon-fill-color: var(--gd-palette-complementary-7);
43
+
44
+ color: var(--gd-palette-complementary-7);
45
+
46
+ @include toolbar-focus-ring;
47
+
48
+ &:not([aria-disabled="true"]) {
49
+ &:hover {
50
+ --gd-icon-fill-color: var(--gd-palette-complementary-8);
51
+
52
+ color: var(--gd-palette-complementary-8);
53
+ background-color: var(--gd-palette-complementary-2);
54
+ }
55
+
56
+ &:active,
57
+ &#{$root}--isActive {
58
+ --gd-icon-fill-color: var(--gd-palette-complementary-8);
59
+
60
+ color: var(--gd-palette-complementary-8);
61
+ background-color: var(--gd-palette-complementary-4);
62
+ }
63
+
64
+ &#{$root}--isSelected {
65
+ --gd-icon-fill-color: var(--gd-palette-primary-base);
66
+
67
+ color: var(--gd-palette-primary-base);
68
+ background-color: transparent;
69
+
70
+ &:hover {
71
+ --gd-icon-fill-color: var(--gd-palette-primary-base-d12);
72
+
73
+ color: var(--gd-palette-primary-base-d12);
74
+ background-color: var(--gd-palette-primary-dimmed);
75
+ }
76
+
77
+ &:active,
78
+ &#{$root}--isActive {
79
+ --gd-icon-fill-color: var(--gd-palette-primary-base-d12);
80
+
81
+ color: var(--gd-palette-primary-base-d12);
82
+ background-color: var(--gd-palette-primary-base-dimmed-darken03);
83
+ }
84
+ }
85
+
86
+ &#{$root}--isDestructive {
87
+ &:hover {
88
+ --gd-icon-fill-color: var(--gd-palette-error-base);
89
+
90
+ color: var(--gd-palette-error-base);
91
+ background-color: var(--gd-palette-error-dimmed);
92
+ }
93
+
94
+ &:active,
95
+ &#{$root}--isActive {
96
+ --gd-icon-fill-color: var(--gd-palette-error-base-d10);
97
+
98
+ color: var(--gd-palette-error-base-d10);
99
+ background-color: var(--gd-palette-error-disabled);
100
+ }
101
+
102
+ &#{$root}--isSelected {
103
+ --gd-icon-fill-color: var(--gd-palette-error-base);
104
+
105
+ color: var(--gd-palette-error-base);
106
+ background-color: transparent;
107
+
108
+ &:hover {
109
+ --gd-icon-fill-color: var(--gd-palette-error-base);
110
+
111
+ color: var(--gd-palette-error-base);
112
+ background-color: var(--gd-palette-error-dimmed);
113
+ }
114
+
115
+ &:active,
116
+ &#{$root}--isActive {
117
+ --gd-icon-fill-color: var(--gd-palette-error-base-d10);
118
+
119
+ color: var(--gd-palette-error-base-d10);
120
+ background-color: var(--gd-palette-error-disabled);
121
+ }
122
+ }
123
+ }
124
+ }
125
+
126
+ &[aria-disabled="true"] {
127
+ --gd-icon-fill-color: var(--gd-palette-complementary-4);
128
+
129
+ color: var(--gd-palette-complementary-5);
130
+ background-color: transparent;
131
+ cursor: default;
132
+ }
133
+ }
@@ -0,0 +1,15 @@
1
+ // (C) 2026 GoodData Corporation
2
+
3
+ @use "../UiToolbar/toolbarItem";
4
+
5
+ .gd-ui-kit-toolbar-button {
6
+ $root: &;
7
+
8
+ @include toolbarItem.toolbar-item-base;
9
+ @include toolbarItem.toolbar-item-ladder($root);
10
+
11
+ &__label {
12
+ overflow: hidden;
13
+ text-overflow: ellipsis;
14
+ }
15
+ }
@@ -0,0 +1,66 @@
1
+ // (C) 2026 GoodData Corporation
2
+
3
+ @use "../UiToolbar/toolbarItem";
4
+
5
+ .gd-ui-kit-toolbar-color-swatch {
6
+ $root: &;
7
+ $bar-height: 5px;
8
+ $glyph-size: 12px;
9
+
10
+ display: inline-flex;
11
+ flex-direction: column;
12
+ align-items: center;
13
+ justify-content: center;
14
+ gap: 2px;
15
+ flex-shrink: 0;
16
+ box-sizing: border-box;
17
+ width: toolbarItem.$toolbar-icon-size-medium;
18
+ height: toolbarItem.$toolbar-icon-size-medium;
19
+ overflow: hidden;
20
+
21
+ &__fill {
22
+ position: relative;
23
+ box-sizing: border-box;
24
+ width: 100%;
25
+ height: 100%;
26
+ background-color: var(--gd-palette-complementary-0);
27
+ }
28
+
29
+ &__transparent {
30
+ position: absolute;
31
+ inset: 0;
32
+ background: repeating-conic-gradient(var(--gd-palette-complementary-3) 0 25%, transparent 0 50%) 0 0 /
33
+ 6px 6px;
34
+ }
35
+
36
+ &__glyph {
37
+ display: inline-flex;
38
+ align-items: center;
39
+ justify-content: center;
40
+ width: $glyph-size;
41
+ height: $glyph-size;
42
+ font-family: var(--gd-font-family);
43
+ font-size: $glyph-size;
44
+ font-weight: 700;
45
+ line-height: 1;
46
+ color: currentColor;
47
+ }
48
+
49
+ &__bar {
50
+ box-sizing: border-box;
51
+ width: 100%;
52
+ height: $bar-height;
53
+ border-radius: var(--gd-button-borderRadius);
54
+ background-color: var(--gd-palette-primary-base);
55
+ }
56
+
57
+ &--hasBorder {
58
+ &#{$root}--variant-fill #{$root}__fill {
59
+ box-shadow: inset 0 0 0 1px var(--gd-palette-complementary-5);
60
+ }
61
+
62
+ &#{$root}--variant-text #{$root}__bar {
63
+ box-shadow: inset 0 0 0 1px var(--gd-palette-complementary-4);
64
+ }
65
+ }
66
+ }
@@ -0,0 +1,11 @@
1
+ // (C) 2026 GoodData Corporation
2
+
3
+ @use "../UiToolbar/toolbarItem";
4
+
5
+ .gd-ui-kit-toolbar-divider {
6
+ flex-shrink: 0;
7
+ box-sizing: border-box;
8
+ width: 1px;
9
+ height: toolbarItem.$toolbar-item-size;
10
+ background-color: var(--gd-palette-complementary-3);
11
+ }
@@ -0,0 +1,30 @@
1
+ // (C) 2026 GoodData Corporation
2
+
3
+ @use "../UiToolbar/toolbarItem";
4
+
5
+ .gd-ui-kit-toolbar-icon-button {
6
+ $root: &;
7
+
8
+ @include toolbarItem.toolbar-item-base;
9
+ @include toolbarItem.toolbar-item-ladder($root);
10
+
11
+ position: relative;
12
+ flex-shrink: 0;
13
+
14
+ &--size-medium {
15
+ width: toolbarItem.$toolbar-item-size;
16
+ }
17
+
18
+ &--size-small {
19
+ width: toolbarItem.$toolbar-icon-size-small;
20
+ height: toolbarItem.$toolbar-icon-size-small;
21
+ padding: 0;
22
+
23
+ // The visible box is 14px; the pointer target is widened to 24px.
24
+ &::before {
25
+ content: "";
26
+ position: absolute;
27
+ inset: calc((toolbarItem.$toolbar-icon-size-small - toolbarItem.$toolbar-hit-area) / 2);
28
+ }
29
+ }
30
+ }
@@ -0,0 +1,12 @@
1
+ // (C) 2026 GoodData Corporation
2
+
3
+ @use "../UiToolbar/toolbarItem";
4
+
5
+ .gd-ui-kit-toolbar-icon-select {
6
+ $root: &;
7
+
8
+ @include toolbarItem.toolbar-item-base;
9
+ @include toolbarItem.toolbar-item-ladder($root);
10
+
11
+ flex-shrink: 0;
12
+ }
@@ -0,0 +1,10 @@
1
+ // (C) 2026 GoodData Corporation
2
+
3
+ @use "../UiToolbar/toolbarItem";
4
+
5
+ .gd-ui-kit-toolbar-segmented-control {
6
+ display: inline-flex;
7
+ align-items: center;
8
+ gap: 0;
9
+ height: toolbarItem.$toolbar-item-size;
10
+ }
@@ -0,0 +1,29 @@
1
+ // (C) 2026 GoodData Corporation
2
+
3
+ @use "../UiToolbar/toolbarItem";
4
+
5
+ .gd-ui-kit-toolbar-select {
6
+ $root: &;
7
+ $fixed-width: 240px;
8
+
9
+ @include toolbarItem.toolbar-item-base;
10
+ @include toolbarItem.toolbar-item-ladder($root);
11
+
12
+ justify-content: flex-start;
13
+
14
+ &--width-fixed {
15
+ width: $fixed-width;
16
+ }
17
+
18
+ &__label {
19
+ flex: 1 1 auto;
20
+ min-width: 0;
21
+ overflow: hidden;
22
+ text-overflow: ellipsis;
23
+ text-align: left;
24
+ }
25
+
26
+ &--isPlaceholder:not([aria-disabled="true"]) #{$root}__label {
27
+ color: var(--gd-palette-complementary-6);
28
+ }
29
+ }
@@ -0,0 +1,53 @@
1
+ // (C) 2026 GoodData Corporation
2
+
3
+ @use "../UiToolbar/toolbarItem";
4
+
5
+ .gd-ui-kit-toolbar-stepper {
6
+ $root: &;
7
+
8
+ display: inline-flex;
9
+ align-items: center;
10
+ gap: toolbarItem.$toolbar-item-gap;
11
+ box-sizing: border-box;
12
+ height: toolbarItem.$toolbar-item-size;
13
+ padding: 0 toolbarItem.$toolbar-item-padding;
14
+
15
+ &__value {
16
+ @include toolbarItem.toolbar-item-base;
17
+
18
+ --gd-icon-fill-color: var(--gd-palette-complementary-7);
19
+
20
+ min-width: 0;
21
+ color: var(--gd-palette-complementary-7);
22
+ text-align: center;
23
+ cursor: default;
24
+
25
+ &--isEditable {
26
+ // A constant width so the toolbar does not move while the value is typed or stepped.
27
+ // Fits four characters: percentages up to "100%" and whole numbers up to four digits.
28
+ width: calc(4.5ch + 2 * #{toolbarItem.$toolbar-item-padding});
29
+ text-align: center;
30
+ cursor: text;
31
+
32
+ @include toolbarItem.toolbar-focus-ring;
33
+
34
+ &:not([aria-disabled="true"]) {
35
+ &:hover {
36
+ color: var(--gd-palette-complementary-8);
37
+ background-color: var(--gd-palette-complementary-2);
38
+ }
39
+
40
+ &:active,
41
+ &#{$root}__value--isActive {
42
+ color: var(--gd-palette-complementary-8);
43
+ background-color: var(--gd-palette-complementary-4);
44
+ }
45
+ }
46
+
47
+ &[aria-disabled="true"] {
48
+ color: var(--gd-palette-complementary-4);
49
+ cursor: default;
50
+ }
51
+ }
52
+ }
53
+ }