@redocly/theme 0.59.0-rc.1 → 0.59.0

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 (195) hide show
  1. package/LICENSE +7 -1
  2. package/lib/components/Buttons/AIAssistantButton.js +6 -2
  3. package/lib/components/Buttons/ConnectMCPButton.d.ts +8 -0
  4. package/lib/components/Buttons/ConnectMCPButton.js +145 -0
  5. package/lib/components/Buttons/variables.d.ts +1 -0
  6. package/lib/components/Buttons/variables.js +42 -2
  7. package/lib/components/Catalog/CatalogEntity/CatalogEntityInfoBar.js +1 -0
  8. package/lib/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityApiDescriptionRelations.js +1 -1
  9. package/lib/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityTeamRelations.js +1 -1
  10. package/lib/components/Catalog/CatalogEntityIcon.js +2 -1
  11. package/lib/components/Catalog/CatalogFilter/CatalogFilter.js +4 -0
  12. package/lib/components/Catalog/CatalogTagsWithTooltip.js +1 -1
  13. package/lib/components/Catalog/variables.js +1 -1
  14. package/lib/components/Dropdown/Dropdown.d.ts +16 -2
  15. package/lib/components/Dropdown/Dropdown.js +5 -5
  16. package/lib/components/Menu/MenuItem.js +1 -1
  17. package/lib/components/Navbar/NavbarItem.js +3 -3
  18. package/lib/components/PageActions/PageActions.js +4 -1
  19. package/lib/components/PageActions/variables.js +2 -0
  20. package/lib/components/Search/FilterFields/SearchFilterFieldTags.js +1 -2
  21. package/lib/components/Search/SearchAiActionButtons.d.ts +10 -0
  22. package/lib/components/Search/SearchAiActionButtons.js +43 -0
  23. package/lib/components/Search/SearchAiConversationInput.d.ts +3 -1
  24. package/lib/components/Search/SearchAiConversationInput.js +39 -7
  25. package/lib/components/Search/SearchAiDialog.d.ts +3 -6
  26. package/lib/components/Search/SearchAiDialog.js +20 -9
  27. package/lib/components/Search/SearchAiMessage.d.ts +9 -5
  28. package/lib/components/Search/SearchAiMessage.js +146 -22
  29. package/lib/components/Search/SearchAiNegativeFeedbackForm.d.ts +8 -0
  30. package/lib/components/Search/SearchAiNegativeFeedbackForm.js +169 -0
  31. package/lib/components/Search/SearchDialog.js +36 -5
  32. package/lib/components/Search/SearchGroups.js +2 -2
  33. package/lib/components/Search/variables.js +36 -64
  34. package/lib/components/Segmented/Segmented.d.ts +1 -8
  35. package/lib/components/Segmented/Segmented.js +3 -1
  36. package/lib/components/Select/SelectInput.js +1 -1
  37. package/lib/components/Select/variables.js +2 -2
  38. package/lib/components/Tag/Tag.d.ts +2 -1
  39. package/lib/components/Tag/Tag.js +66 -17
  40. package/lib/components/Tag/variables.dark.js +135 -36
  41. package/lib/components/Tag/variables.js +78 -61
  42. package/lib/core/constants/index.d.ts +1 -0
  43. package/lib/core/constants/index.js +1 -0
  44. package/lib/core/constants/mcp.d.ts +1 -0
  45. package/lib/core/constants/mcp.js +5 -0
  46. package/lib/core/constants/search.d.ts +5 -4
  47. package/lib/core/constants/search.js +4 -5
  48. package/lib/core/hooks/index.d.ts +3 -0
  49. package/lib/core/hooks/index.js +3 -0
  50. package/lib/core/hooks/menu/use-nested-menu.js +1 -1
  51. package/lib/core/hooks/search/use-feedback-tooltip.d.ts +6 -0
  52. package/lib/core/hooks/search/use-feedback-tooltip.js +26 -0
  53. package/lib/core/hooks/use-connect-mcp-button.d.ts +13 -0
  54. package/lib/core/hooks/use-connect-mcp-button.js +50 -0
  55. package/lib/core/hooks/use-mcp-config.d.ts +9 -0
  56. package/lib/core/hooks/use-mcp-config.js +27 -0
  57. package/lib/core/hooks/use-page-actions.d.ts +1 -1
  58. package/lib/core/hooks/use-page-actions.js +98 -95
  59. package/lib/core/hooks/use-product-picker.js +2 -1
  60. package/lib/core/hooks/use-tabs.d.ts +3 -2
  61. package/lib/core/hooks/use-tabs.js +115 -57
  62. package/lib/core/hooks/use-telemetry-fallback.d.ts +10 -8
  63. package/lib/core/hooks/use-telemetry-fallback.js +10 -8
  64. package/lib/core/openapi/index.d.ts +1 -0
  65. package/lib/core/styles/dark.js +4 -0
  66. package/lib/core/styles/global.js +5 -0
  67. package/lib/core/types/hooks.d.ts +2 -2
  68. package/lib/core/types/index.d.ts +1 -0
  69. package/lib/core/types/index.js +1 -0
  70. package/lib/core/types/l10n.d.ts +1 -1
  71. package/lib/core/types/mcp.d.ts +6 -0
  72. package/lib/core/types/mcp.js +3 -0
  73. package/lib/core/types/search.d.ts +11 -4
  74. package/lib/core/types/search.js +6 -0
  75. package/lib/core/types/segmented.d.ts +12 -0
  76. package/lib/core/types/segmented.js +3 -0
  77. package/lib/core/utils/frontmatter-translate.d.ts +6 -0
  78. package/lib/core/utils/frontmatter-translate.js +14 -0
  79. package/lib/core/utils/index.d.ts +2 -0
  80. package/lib/core/utils/index.js +2 -0
  81. package/lib/core/utils/mcp.d.ts +2 -0
  82. package/lib/core/utils/mcp.js +31 -0
  83. package/lib/icons/AiStarsGradientIcon/AiStarsGradientIcon.js +44 -4
  84. package/lib/icons/AiStarsIcon/AiStarsIcon.js +11 -2
  85. package/lib/icons/ConnectIcon/ConnectIcon.d.ts +9 -0
  86. package/lib/icons/ConnectIcon/ConnectIcon.js +17 -0
  87. package/lib/icons/CubeIcon/CubeIcon.d.ts +9 -0
  88. package/lib/icons/CubeIcon/CubeIcon.js +17 -0
  89. package/lib/icons/HashtagIcon/HashtagIcon.d.ts +9 -0
  90. package/lib/icons/HashtagIcon/HashtagIcon.js +22 -0
  91. package/lib/icons/RedoclyIcon/RedoclyIcon.js +4 -7
  92. package/lib/icons/ThumbDownFilledIcon/ThumbDownFilledIcon.d.ts +9 -0
  93. package/lib/icons/ThumbDownFilledIcon/ThumbDownFilledIcon.js +34 -0
  94. package/lib/icons/ThumbUpFilledIcon/ThumbUpFilledIcon.d.ts +9 -0
  95. package/lib/icons/ThumbUpFilledIcon/ThumbUpFilledIcon.js +34 -0
  96. package/lib/icons/VSCodeIcon/VSCodeIcon.d.ts +9 -0
  97. package/lib/icons/VSCodeIcon/VSCodeIcon.js +17 -0
  98. package/lib/index.d.ts +1 -2
  99. package/lib/index.js +1 -2
  100. package/lib/markdoc/components/Cards/Card.js +1 -28
  101. package/lib/markdoc/components/ConnectMCP/ConnectMCP.d.ts +8 -0
  102. package/lib/markdoc/components/ConnectMCP/ConnectMCP.js +19 -0
  103. package/lib/markdoc/components/Tabs/TabList.d.ts +3 -1
  104. package/lib/markdoc/components/Tabs/TabList.js +197 -47
  105. package/lib/markdoc/components/Tabs/Tabs.d.ts +2 -1
  106. package/lib/markdoc/components/Tabs/Tabs.js +57 -12
  107. package/lib/markdoc/components/default.d.ts +1 -0
  108. package/lib/markdoc/components/default.js +1 -0
  109. package/lib/markdoc/default.d.ts +6 -0
  110. package/lib/markdoc/default.js +2 -0
  111. package/lib/markdoc/tags/card.js +0 -1
  112. package/lib/markdoc/tags/connect-mcp.d.ts +2 -0
  113. package/lib/markdoc/tags/connect-mcp.js +27 -0
  114. package/package.json +6 -6
  115. package/src/components/Buttons/AIAssistantButton.tsx +6 -2
  116. package/src/components/Buttons/ConnectMCPButton.tsx +180 -0
  117. package/src/components/Buttons/variables.ts +42 -1
  118. package/src/components/Catalog/CatalogEntity/CatalogEntityInfoBar.tsx +1 -0
  119. package/src/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityApiDescriptionRelations.tsx +1 -1
  120. package/src/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityTeamRelations.tsx +1 -1
  121. package/src/components/Catalog/CatalogEntityIcon.tsx +2 -1
  122. package/src/components/Catalog/CatalogFilter/CatalogFilter.tsx +5 -0
  123. package/src/components/Catalog/CatalogTagsWithTooltip.tsx +1 -5
  124. package/src/components/Catalog/variables.ts +1 -1
  125. package/src/components/Dropdown/Dropdown.tsx +84 -79
  126. package/src/components/Menu/MenuItem.tsx +1 -0
  127. package/src/components/Navbar/NavbarItem.tsx +6 -5
  128. package/src/components/PageActions/PageActions.tsx +5 -1
  129. package/src/components/PageActions/variables.ts +2 -0
  130. package/src/components/Search/FilterFields/SearchFilterFieldTags.tsx +3 -3
  131. package/src/components/Search/SearchAiActionButtons.tsx +76 -0
  132. package/src/components/Search/SearchAiConversationInput.tsx +61 -18
  133. package/src/components/Search/SearchAiDialog.tsx +52 -23
  134. package/src/components/Search/SearchAiMessage.tsx +172 -43
  135. package/src/components/Search/SearchAiNegativeFeedbackForm.tsx +210 -0
  136. package/src/components/Search/SearchDialog.tsx +49 -13
  137. package/src/components/Search/SearchGroups.tsx +2 -0
  138. package/src/components/Search/variables.ts +36 -64
  139. package/src/components/Segmented/Segmented.tsx +15 -20
  140. package/src/components/Select/SelectInput.tsx +1 -0
  141. package/src/components/Select/variables.ts +2 -2
  142. package/src/components/Tag/Tag.tsx +35 -19
  143. package/src/components/Tag/variables.dark.ts +135 -36
  144. package/src/components/Tag/variables.ts +78 -61
  145. package/src/core/constants/index.ts +1 -0
  146. package/src/core/constants/mcp.ts +1 -0
  147. package/src/core/constants/search.ts +8 -4
  148. package/src/core/hooks/index.ts +3 -0
  149. package/src/core/hooks/menu/use-nested-menu.ts +2 -2
  150. package/src/core/hooks/search/use-feedback-tooltip.ts +32 -0
  151. package/src/core/hooks/use-connect-mcp-button.ts +79 -0
  152. package/src/core/hooks/use-mcp-config.ts +43 -0
  153. package/src/core/hooks/use-page-actions.ts +148 -126
  154. package/src/core/hooks/use-product-picker.ts +2 -1
  155. package/src/core/hooks/use-tabs.ts +168 -86
  156. package/src/core/hooks/use-telemetry-fallback.ts +10 -8
  157. package/src/core/openapi/index.ts +1 -0
  158. package/src/core/styles/dark.ts +4 -0
  159. package/src/core/styles/global.ts +6 -1
  160. package/src/core/types/hooks.ts +5 -1
  161. package/src/core/types/index.ts +1 -0
  162. package/src/core/types/l10n.ts +13 -0
  163. package/src/core/types/mcp.ts +8 -0
  164. package/src/core/types/search.ts +13 -4
  165. package/src/core/types/segmented.ts +14 -0
  166. package/src/core/utils/frontmatter-translate.ts +9 -0
  167. package/src/core/utils/index.ts +2 -0
  168. package/src/core/utils/mcp.ts +34 -0
  169. package/src/icons/AiStarsGradientIcon/AiStarsGradientIcon.tsx +13 -4
  170. package/src/icons/AiStarsIcon/AiStarsIcon.tsx +11 -2
  171. package/src/icons/ConnectIcon/ConnectIcon.tsx +27 -0
  172. package/src/icons/CubeIcon/CubeIcon.tsx +27 -0
  173. package/src/icons/HashtagIcon/HashtagIcon.tsx +23 -0
  174. package/src/icons/RedoclyIcon/RedoclyIcon.tsx +4 -22
  175. package/src/icons/ThumbDownFilledIcon/ThumbDownFilledIcon.tsx +38 -0
  176. package/src/icons/ThumbUpFilledIcon/ThumbUpFilledIcon.tsx +35 -0
  177. package/src/icons/VSCodeIcon/VSCodeIcon.tsx +29 -0
  178. package/src/index.ts +1 -2
  179. package/src/markdoc/components/Cards/Card.tsx +1 -28
  180. package/src/markdoc/components/ConnectMCP/ConnectMCP.tsx +28 -0
  181. package/src/markdoc/components/Tabs/TabList.tsx +312 -105
  182. package/src/markdoc/components/Tabs/Tabs.tsx +136 -11
  183. package/src/markdoc/components/default.ts +1 -0
  184. package/src/markdoc/default.ts +2 -0
  185. package/src/markdoc/tags/card.ts +0 -1
  186. package/src/markdoc/tags/connect-mcp.ts +25 -0
  187. package/lib/components/OpenApiDocs/hooks/AdditionalOverviewInfo.d.ts +0 -1
  188. package/lib/components/OpenApiDocs/hooks/AdditionalOverviewInfo.js +0 -11
  189. package/lib/components/OpenApiDocs/hooks/AfterOpenApiDescription.d.ts +0 -1
  190. package/lib/components/OpenApiDocs/hooks/AfterOpenApiDescription.js +0 -5
  191. package/lib/ext/process-scorecard.d.ts +0 -5
  192. package/lib/ext/process-scorecard.js +0 -11
  193. package/src/components/OpenApiDocs/hooks/AdditionalOverviewInfo.tsx +0 -9
  194. package/src/components/OpenApiDocs/hooks/AfterOpenApiDescription.tsx +0 -1
  195. package/src/ext/process-scorecard.ts +0 -13
@@ -144,68 +144,76 @@ export const search = css`
144
144
  /**
145
145
  * @tokens AI Search
146
146
  */
147
-
147
+
148
148
  --search-ai-gradient: linear-gradient(to right, #715efe, #ff5cdc);
149
149
 
150
- --search-ai-spinner-icon-color: var(--icon-color-interactive);
151
- --search-ai-checkmark-icon-color: var(--icon-color-interactive);
152
150
  --search-ai-response-padding: var(--spacing-lg);
153
151
  --search-ai-response-gap: var(--spacing-sm);
154
-
155
152
  --search-ai-response-header-gap: var(--spacing-md);
153
+ --search-ai-response-body-gap: var(--spacing-xl);
154
+ --search-ai-response-body-padding: 0 40px;
156
155
 
157
156
  --search-ai-question-font-size: var(--font-size-xl);
158
157
  --search-ai-question-font-weight: var(--font-weight-semibold);
159
158
  --search-ai-question-line-height: var(--line-height-xl);
160
159
  --search-ai-question-text-color: var(--text-color-primary);
161
160
 
162
- --search-ai-response-body-gap: var(--spacing-xl);
163
- --search-ai-response-body-padding: 0 40px;
164
-
165
161
  --search-ai-text-color: var(--text-color-secondary);
166
162
  --search-ai-text-font-size: var(--font-size-lg);
167
163
  --search-ai-text-line-height: var(--line-height-lg);
164
+ --search-ai-thinking-text-margin: var(--md-pre-margin) 0;
168
165
 
169
166
  --search-ai-user-bg-color: var(--color-blue-6);
170
167
  --search-ai-user-text-color: var(--color-static-white);
171
168
  --search-ai-assistant-bg-color: var(--layer-color);
172
169
  --search-ai-assistant-text-color: var(--text-color-primary);
173
170
  --search-ai-assistant-border: 1px solid var(--border-color-primary);
171
+ --search-ai-assistant-message-max-width: 80%;
174
172
 
175
- --search-ai-resources-gap: var(--spacing-base);
173
+ --search-ai-icon-size: 32px;
174
+ --search-ai-icon-bg-color: var(--search-ai-gradient);
175
+ --search-ai-icon-color: var(--color-static-white);
176
+ --search-ai-icon-wrapper-padding: var(--spacing-xs);
177
+
178
+ --search-ai-resources-gap: var(--spacing-xxs);
176
179
  --search-ai-resources-title-font-weight: var(--font-weight-medium);
177
180
  --search-ai-resources-title-font-size: var(--font-size-lg);
178
181
  --search-ai-resources-title-line-height: var(--line-height-lg);
179
182
 
180
- --search-ai-resource-tags-gap: var(--spacing-base);
183
+ --search-ai-resource-tags-gap: var(--spacing-xxs);
181
184
  --search-ai-resource-tag-text-color: var(--text-color-secondary);
182
185
  --search-ai-resource-tag-icon-color: var(--text-color-secondary);
183
186
  --search-ai-resource-tag-icon-size: 16px;
184
187
 
185
- --search-ai-icon-size: 32px;
186
- --search-ai-icon-bg-color: var(--search-ai-gradient);
187
- --search-ai-icon-color: var(--color-static-white);
188
-
189
- --search-ai-button-icon-color: none;
188
+ --search-ai-suggestions-gap: var(--spacing-sm);
189
+ --search-ai-suggestions-margin-left: var(--spacing-xs);
190
+ --search-ai-suggestion-item-gap: var(--spacing-xxs);
191
+ --search-ai-suggestions-title-text-color: var(--text-color-description);
192
+ --search-ai-suggestions-title-font-size: var(--font-size-base);
193
+ --search-ai-suggestions-title-line-height: var(--line-height-base);
194
+ --search-ai-suggestions-title-font-weight: var(--font-weight-light);
195
+ --search-ai-suggestions-text-color: var(--text-color-description);
190
196
 
191
197
  --search-ai-thinking-dots-gap: 4px;
192
198
  --search-ai-thinking-dots-padding: 4px 0;
193
199
  --search-ai-thinking-dot-size: 6px;
194
200
  --search-ai-thinking-dot-color: var(--search-ai-gradient);
195
201
 
202
+ --search-ai-spinner-icon-color: var(--icon-color-interactive);
203
+ --search-ai-checkmark-icon-color: var(--icon-color-interactive);
204
+
205
+ --search-ai-feedback-gap: var(--spacing-xxs);
206
+
207
+ --search-ai-feedback-form-bg-color: var(--background-color-secondary);
208
+ --search-ai-feedback-form-border-color: var(--border-color-primary);
209
+
196
210
  --search-ai-disclaimer-font-size: var(--font-size-sm);
197
211
  --search-ai-disclaimer-line-height: var(--line-height-sm);
198
212
  --search-ai-disclaimer-text-color: var(--text-color-secondary);
199
213
 
200
-
201
214
  --search-ai-welcome-margin: var(--spacing-md);
202
- --search-ai-icon-wrapper-padding: var(--spacing-xs);
203
215
 
204
- --search-ai-suggestions-title-text-color: var(--text-color-description);
205
- --search-ai-suggestions-title-font-size: var(--font-size-base);
206
- --search-ai-suggestions-title-line-height: var(--line-height-base);
207
- --search-ai-suggestions-title-font-weight: var(--font-weight-light);
208
- --search-ai-suggestions-text-color: var(--text-color-description);
216
+ --search-ai-button-icon-color: none;
209
217
 
210
218
  --search-ai-conversation-input-send-button-bg-color: var(--button-bg-color-primary);
211
219
  --search-ai-conversation-input-send-button-bg-color-hover: var(--button-bg-color-primary-hover);
@@ -232,6 +240,7 @@ export const search = css`
232
240
  * @tokens AI Search Conversation Input
233
241
  */
234
242
  --search-ai-conversation-input-bg-color: var(--bg-color);
243
+ --search-ai-conversation-input-bg-color-disabled: var(--color-warm-grey-1);
235
244
  --search-ai-conversation-input-padding: var(--spacing-sm) var(--spacing-md);
236
245
  --search-ai-conversation-input-border: 1px solid var(--border-color-secondary);
237
246
  --search-ai-conversation-input-border-radius: var(--border-radius-lg);
@@ -241,51 +250,14 @@ export const search = css`
241
250
  --search-ai-conversation-input-border-color-disabled: var(--border-color-secondary);
242
251
 
243
252
  --search-ai-conversation-input-send-button-right: 12px;
244
- --search-ai-conversation-input-send-button-bg-color: var(--button-bg-color-primary);
245
- --search-ai-conversation-input-send-button-bg-color-hover: var(--button-bg-color-primary-hover);
246
- --search-ai-conversation-input-send-button-bg-color-disabled: var(--button-bg-color-disabled);
253
+ --search-ai-conversation-input-send-button-padding: 5px;
254
+ --search-ai-conversation-input-send-button-border-radius: var(--border-radius);
247
255
  --search-ai-conversation-input-send-button-border-disabled: 1px solid var(--button-border-color-disabled);
248
256
 
249
- /**
250
- * @tokens AI Search Response
251
- */
252
- --search-ai-response-padding: var(--spacing-lg);
253
- --search-ai-response-gap: var(--spacing-sm);
254
- --search-ai-response-header-gap: var(--spacing-md);
255
- --search-ai-response-body-gap: var(--spacing-xl);
256
- --search-ai-response-body-padding: 0 40px;
257
-
258
- --search-ai-text-color: var(--text-color-secondary);
259
- --search-ai-text-font-size: var(--font-size-lg);
260
- --search-ai-text-line-height: var(--line-height-lg);
261
-
262
- --search-ai-thinking-text-margin: var(--md-pre-margin) 0;
263
-
264
- --search-ai-question-font-size: var(--font-size-xl);
265
- --search-ai-question-font-weight: var(--font-weight-semibold);
266
- --search-ai-question-line-height: var(--line-height-xl);
267
- --search-ai-question-text-color: var(--text-color-primary);
268
-
269
- --search-ai-resources-gap: var(--spacing-base);
270
- --search-ai-resources-title-font-weight: var(--font-weight-medium);
271
- --search-ai-resources-title-font-size: var(--font-size-lg);
272
- --search-ai-resources-title-line-height: var(--line-height-lg);
273
-
274
- --search-ai-resource-tags-gap: var(--spacing-base);
275
- --search-ai-resource-tag-text-color: var(--text-color-secondary);
276
- --search-ai-resource-tag-icon-color: var(--text-color-secondary);
277
-
278
- --search-ai-suggestions-gap: var(--spacing-sm);
279
- --search-ai-suggestions-margin-left: var(--spacing-xs);
280
- --search-ai-suggestion-item-gap: var(--spacing-xs);
281
-
282
- --search-ai-suggestions-title-text-color: var(--text-color-description);
283
- --search-ai-suggestions-title-font-size: var(--font-size-base);
284
- --search-ai-suggestions-title-line-height: var(--line-height-base);
285
- --search-ai-suggestions-title-font-weight: var(--font-weight-light);
286
-
287
- --search-ai-spinner-icon-color: var(--icon-color-interactive);
288
- --search-ai-checkmark-icon-color: var(--icon-color-interactive);
257
+ --search-ai-conversation-input-min-height: 48px;
258
+ --search-ai-conversation-input-max-height: 120px;
259
+ --search-ai-conversation-input-padding-right: calc(var(--search-ai-conversation-input-send-button-right) + 30px);
260
+ --search-ai-conversation-input-send-button-bottom: calc(var(--search-ai-conversation-input-min-height) / 2);
289
261
 
290
262
  // @tokens End
291
263
  `;
@@ -2,18 +2,10 @@ import React, { forwardRef } from 'react';
2
2
  import styled, { css } from 'styled-components';
3
3
 
4
4
  import type { ForwardedRef, ReactElement } from 'react';
5
- import type { SelectOption } from '@redocly/theme/core/types/select';
5
+ import type { SegmentedProps } from '@redocly/theme/core/types/segmented';
6
6
 
7
7
  import { typedMemo } from '@redocly/theme/core/hoc/typedMemo';
8
8
 
9
- export type SegmentedProps<T> = {
10
- options: SelectOption<T>[];
11
- value: T;
12
- onChange: ({ label, value }: SelectOption<T>) => void;
13
- className?: string;
14
- size?: 'regular' | 'small';
15
- };
16
-
17
9
  function SegmentedComponent<T>(
18
10
  { options, onChange, value, className = '', size = 'regular' }: SegmentedProps<T>,
19
11
  ref?: ForwardedRef<HTMLDivElement>,
@@ -25,17 +17,20 @@ function SegmentedComponent<T>(
25
17
  className={`tag-grey ${size} ${className}`}
26
18
  role="tablist"
27
19
  >
28
- {options.map((opt) => (
29
- <SegmentedItem
30
- key={opt.label}
31
- role="tab"
32
- title={opt.label}
33
- onClick={() => onChange(opt)}
34
- $isActive={value == opt.value}
35
- $size={size}
36
- >
37
- {opt.label}
38
- </SegmentedItem>
20
+ {options.map((opt, index) => (
21
+ <React.Fragment key={index}>
22
+ {opt.divider}
23
+ <SegmentedItem
24
+ key={opt.label}
25
+ role="tab"
26
+ title={opt.label}
27
+ onClick={() => onChange(opt)}
28
+ $isActive={value == opt.value}
29
+ $size={size}
30
+ >
31
+ {opt.element || opt.label}
32
+ </SegmentedItem>
33
+ </React.Fragment>
39
34
  ))}
40
35
  </SegmentedGroup>
41
36
  );
@@ -83,6 +83,7 @@ export function SelectInput<T>(props: SelectInputProps<T>): React.ReactNode {
83
83
  const selectTags = selectedOptions.map((option, index) => (
84
84
  <SelectInputTag
85
85
  closable
86
+ tabIndex={0}
86
87
  key={index}
87
88
  onClose={() => {
88
89
  clearHandler?.(option);
@@ -10,7 +10,7 @@ export const select = css`
10
10
  --select-text-color: var(--text-color-secondary); // @presenter Color
11
11
  --select-border-radius: var(--border-radius); // @presenter BorderRadius
12
12
  --select-border: var(--border-width) var(--border-style) var(--border-color-primary); // @presenter Border
13
-
13
+
14
14
  --select-input-padding-vertical: 6px; // @presenter Spacing
15
15
  --select-input-padding-horizontal: 6px; // @presenter Spacing
16
16
  --select-input-padding: var(--select-input-padding-vertical) var(--select-input-padding-horizontal);
@@ -38,7 +38,7 @@ export const select = css`
38
38
  --select-list-item-border-radius: var(--border-radius); // @presenter BorderRadius
39
39
  --select-list-item-bg-color-active: transparent; // @presenter Color
40
40
  --select-list-item-bg-color-hover: var(--menu-item-bg-color-hover); // @presenter Color
41
- --select-list-item-font-weight-active: var(--font-weight-medium); // @presenter Color
41
+ --select-list-item-font-weight-active: var(--font-weight-medium); // @presenter Color
42
42
 
43
43
  --select-placeholder-color: var(--color-warm-grey-6); // @presenter Color
44
44
  // @tokens End
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import styled from 'styled-components';
2
+ import styled, { css } from 'styled-components';
3
3
 
4
4
  import type { JSX } from 'react';
5
5
 
@@ -56,6 +56,7 @@ export type TagProps = {
56
56
  maxLength?: number;
57
57
  textTransform?: 'uppercase' | 'lowercase' | 'capitalize' | 'none';
58
58
  variant?: 'outline' | 'filled';
59
+ selectable?: boolean;
59
60
  };
60
61
 
61
62
  export function Tag({
@@ -75,6 +76,7 @@ export function Tag({
75
76
  maxLength,
76
77
  textTransform,
77
78
  variant = 'filled',
79
+ selectable,
78
80
  ...otherProps
79
81
  }: TagProps): JSX.Element {
80
82
  const truncateText = (text: string, maxLen: number): string => {
@@ -152,6 +154,7 @@ export function Tag({
152
154
  hasCloseButton={closable}
153
155
  textTransform={textTransform}
154
156
  variant={variant}
157
+ selectable={selectable}
155
158
  {...otherProps}
156
159
  >
157
160
  {withStatusDot ? <StatusDot color={statusDotColor} /> : icon ? icon : null}
@@ -186,16 +189,28 @@ const CloseButton = styled.div`
186
189
  justify-content: center;
187
190
  align-self: stretch;
188
191
  border-radius: 0 var(--tag-border-radius) var(--tag-border-radius) 0;
192
+ margin: calc(-1 * var(--tag-border-width));
193
+ padding: var(--tag-border-width);
189
194
 
190
195
  &:hover {
191
196
  background: var(--tag-close-button-bg-color-hover);
192
197
  }
198
+
199
+ &:focus-visible {
200
+ background: var(--tag-close-button-bg-color-focus);
201
+ }
193
202
  `;
194
203
 
195
- const TagWrapper = styled.div.attrs(({ className, color, size }: TagProps) => ({
196
- className:
197
- (className || '') +
198
- ` tag-default ${color ? `tag-${color}` : ''} ${size ? `tag-size-${size}` : ''}`,
204
+ const TagWrapper = styled.div.attrs(({ className, color, size, variant }: TagProps) => ({
205
+ className: [
206
+ className,
207
+ 'tag-default',
208
+ color && `tag-${color}`,
209
+ size && `tag-size-${size}`,
210
+ `tag-variant-${variant || 'filled'}`,
211
+ ]
212
+ .filter(Boolean)
213
+ .join(' '),
199
214
  }))<
200
215
  TagProps & {
201
216
  hasCloseButton?: boolean;
@@ -227,8 +242,7 @@ const TagWrapper = styled.div.attrs(({ className, color, size }: TagProps) => ({
227
242
  `text-transform: ${textTransform ? `${textTransform}` : 'var(--tag-text-transform)'};`}
228
243
 
229
244
  color: var(--tag-color);
230
- background-color: ${({ variant }) =>
231
- variant === 'filled' ? 'var(--tag-bg-color)' : 'transparent'};
245
+ background-color: var(--tag-bg-color);
232
246
  ${({ borderless }) =>
233
247
  borderless
234
248
  ? ''
@@ -239,19 +253,21 @@ const TagWrapper = styled.div.attrs(({ className, color, size }: TagProps) => ({
239
253
  width: var(--tag-icon-width);
240
254
  height: var(--tag-icon-height);
241
255
  }
242
- /*
243
- &:hover {
244
- background-color: ${({ variant }) =>
245
- variant === 'filled' ? 'var(--tag-bg-color-hover)' : 'transparent'};
246
- border-color: ${({ variant }) =>
247
- variant === 'outline' ? 'var(--tag-border-color-hover)' : 'transparent'};
248
- } */
249
256
 
250
- &:focus-visible {
251
- outline: 1px solid var(--tag-border-color-focused);
252
- outline-offset: 2px;
253
- border-radius: var(--tag-border-radius-focused);
254
- }
257
+ ${({ selectable }) =>
258
+ selectable &&
259
+ css`
260
+ &:hover {
261
+ background-color: var(--tag-bg-color-hover);
262
+ border-color: var(--tag-border-color-hover);
263
+ }
264
+
265
+ &:focus-visible {
266
+ outline: 1px solid var(--tag-border-color-focused);
267
+ outline-offset: 2px;
268
+ border-radius: var(--tag-border-radius-focused);
269
+ }
270
+ `};
255
271
  `;
256
272
 
257
273
  const StatusDot = styled.div<{ color: string }>`
@@ -1,43 +1,11 @@
1
1
  import { css } from 'styled-components';
2
2
 
3
3
  export const tagDarkMode = css`
4
+ --tag-close-button-bg-color-focus: var(--color-warm-grey-6); // @presenter Color
5
+
4
6
  --tag-border-color-focused: var(--color-blue-8); // @presenter Color
5
7
  --tag-badge-border-color: var(--border-color-secondary);
6
8
 
7
- --tag-operation-color-delete: #fa82a2; // @presenter Color
8
- --tag-operation-bg-color-delete: #77214C; // @presenter Color
9
-
10
- --tag-operation-color-get: #68cc97; // @presenter Color
11
- --tag-operation-bg-color-get: #1F4D2D; // @presenter Color
12
-
13
- --tag-operation-color-post: #90b0f0; // @presenter Color
14
- --tag-operation-bg-color-post: #233061; // @presenter Color
15
-
16
- --tag-operation-color-put: #e0a663; // @presenter Color
17
- --tag-operation-bg-color-put: #612729; // @presenter Color
18
-
19
- --tag-operation-color-patch: #e0c363; // @presenter Color
20
- --tag-operation-bg-color-patch: #5C3721; // @presenter Color
21
-
22
- --tag-operation-color-head: #e6e1fe; // @presenter Color
23
- --tag-operation-bg-color-head: #5b4ccc; // @presenter Color
24
-
25
- --tag-operation-color-options: #1a1c21; // @presenter Color
26
- --tag-operation-bg-color-options: #2a2b33; // @presenter Color
27
-
28
- --tag-action-color-receive: #88CF82; // @presenter Color
29
- --tag-action-color-sub: #88CF82; // @presenter Color
30
- --tag-action-color-cons: #88CF82; // @presenter Color
31
-
32
- --tag-action-color-send: #7779F8; // @presenter Color
33
- --tag-action-color-pub: #7779F8; // @presenter Color
34
- --tag-action-color-publish: #7779F8; // @presenter Color
35
-
36
- --tag-action-color-channel: #F5AD5B; // @presenter Color
37
- --tag-action-color-topic: #F5AD5B; // @presenter Color
38
- --tag-action-color-queue: #F7A7CF; // @presenter Color
39
- --tag-action-color-exchange: #C79CF2; // @presenter Color
40
-
41
9
  .tag-grey,
42
10
  .tag-draft,
43
11
  .tag-schema,
@@ -45,6 +13,7 @@ export const tagDarkMode = css`
45
13
  --tag-color: var(--color-warm-grey-8); // @presenter Color
46
14
  --tag-bg-color: var(--color-warm-grey-4); // @presenter Color
47
15
  --tag-bg-color-hover: var(--color-warm-grey-5); // @presenter Color
16
+ --tag-close-button-bg-color-hover: var(--color-warm-grey-5); // @presenter Color
48
17
  }
49
18
 
50
19
  .tag-red {
@@ -52,6 +21,7 @@ export const tagDarkMode = css`
52
21
  --tag-bg-color: var(--color-red-1); // @presenter Color
53
22
  --tag-border-color: var(--color-red-8); // @presenter Color
54
23
  --tag-border-color-hover: var(--color-red-6); // @presenter Color
24
+ --tag-close-button-bg-color-hover: var(--color-red-2); // @presenter Color
55
25
  }
56
26
 
57
27
  .tag-green {
@@ -60,6 +30,7 @@ export const tagDarkMode = css`
60
30
  --tag-border-color: var(--color-green-3); // @presenter Color
61
31
  --tag-border-color-hover: var(--color-green-5); // @presenter Color
62
32
  --tag-bg-color-hover: var(--color-green-2); // @presenter Color
33
+ --tag-close-button-bg-color-hover: var(--color-green-2); // @presenter Color
63
34
  }
64
35
 
65
36
  .tag-blue {
@@ -67,6 +38,7 @@ export const tagDarkMode = css`
67
38
  --tag-bg-color: var(--color-blue-1); // @presenter Color
68
39
  --tag-border-color-hover: var(--color-blue-5); // @presenter Color
69
40
  --tag-bg-color-hover: var(--color-blue-2); // @presenter Color
41
+ --tag-close-button-bg-color-hover: var(--color-blue-2); // @presenter Color
70
42
  }
71
43
 
72
44
  .tag-magenta,
@@ -74,14 +46,15 @@ export const tagDarkMode = css`
74
46
  --tag-color: var(--color-magenta-4); // @presenter Color
75
47
  --tag-bg-color: var(--color-magenta-1); // @presenter Color
76
48
  --tag-bg-color-hover: var(--color-magenta-2); // @presenter Color
49
+ --tag-close-button-bg-color-hover: var(--color-magenta-2); // @presenter Color
77
50
  }
78
51
 
79
- .tag-purple,
80
- .tag-head {
52
+ .tag-purple {
81
53
  --tag-color: var(--color-purple-7); // @presenter Color
82
54
  --tag-bg-color: var(--color-purple-1); // @presenter Color
83
55
  --tag-bg-color-hover: var(--color-purple-2); // @presenter Color
84
56
  --tag-border-color-hover: var(--color-purple-5); // @presenter Color
57
+ --tag-close-button-bg-color-hover: var(--color-purple-2); // @presenter Color
85
58
  }
86
59
 
87
60
  .tag-carrot {
@@ -89,12 +62,14 @@ export const tagDarkMode = css`
89
62
  --tag-bg-color: var(--color-carrot-1); // @presenter Color
90
63
  --tag-bg-color-hover: var(--color-carrot-2); // @presenter Color
91
64
  --tag-border-color: var(--color-carrot-4); // @presenter Color
65
+ --tag-close-button-bg-color-hover: var(--color-carrot-2); // @presenter Color
92
66
  }
93
67
 
94
68
  .tag-raspberry {
95
69
  --tag-color: var(--color-raspberry-7); // @presenter Color
96
70
  --tag-bg-color: var(--color-raspberry-1); // @presenter Color
97
71
  --tag-bg-color-hover: var(--color-raspberry-2); // @presenter Color
72
+ --tag-close-button-bg-color-hover: var(--color-raspberry-2); // @presenter Color
98
73
  }
99
74
 
100
75
  .tag-orange {
@@ -103,6 +78,7 @@ export const tagDarkMode = css`
103
78
  --tag-bg-color-hover: var(--color-orange-2); // @presenter Color
104
79
  --tag-border-color: var(--color-orange-3); // @presenter Color
105
80
  --tag-border-color-hover: var(--color-orange-5); // @presenter Color
81
+ --tag-close-button-bg-color-hover: var(--color-orange-2); // @presenter Color
106
82
  }
107
83
 
108
84
  .tag-grass {
@@ -111,6 +87,7 @@ export const tagDarkMode = css`
111
87
  --tag-color: var(--color-grass-7); // @presenter Color
112
88
  --tag-border-color: var(--color-grass-3); // @presenter Color
113
89
  --tag-border-color-hover: var(--color-grass-5); // @presenter Color
90
+ --tag-close-button-bg-color-hover: var(--color-grass-2); // @presenter Color
114
91
  }
115
92
 
116
93
  .tag-persian-green {
@@ -119,6 +96,7 @@ export const tagDarkMode = css`
119
96
  --tag-bg-color-hover: var(--color-persian-green-2); // @presenter Color
120
97
  --tag-border-color: var(--color-persian-green-3); // @presenter Color
121
98
  --tag-border-color-hover: var(--color-persian-green-5); // @presenter Color
99
+ --tag-close-button-bg-color-hover: var(--color-persian-green-2); // @presenter Color
122
100
  }
123
101
 
124
102
  .tag-turquoise,
@@ -127,6 +105,7 @@ export const tagDarkMode = css`
127
105
  --tag-bg-color: var(--color-turquoise-1); // @presenter Color
128
106
  --tag-bg-color-hover: var(--color-turquoise-2); // @presenter Color
129
107
  --tag-border-color: var(--color-turquoise-4); // @presenter Color
108
+ --tag-close-button-bg-color-hover: var(--color-turquoise-2); // @presenter Color
130
109
  }
131
110
 
132
111
  .tag-sky {
@@ -134,6 +113,7 @@ export const tagDarkMode = css`
134
113
  --tag-bg-color: var(--color-sky-1); // @presenter Color
135
114
  --tag-border-color: var(--color-sky-4); // @presenter Color
136
115
  --tag-bg-color-hover: var(--color-sky-2); // @presenter Color
116
+ --tag-close-button-bg-color-hover: var(--color-sky-2); // @presenter Color
137
117
  }
138
118
 
139
119
  .tag-blueberry {
@@ -141,6 +121,7 @@ export const tagDarkMode = css`
141
121
  --tag-bg-color: var(--color-blueberry-1); // @presenter Color
142
122
  --tag-border-color-hover: var(--color-blueberry-5); // @presenter Color
143
123
  --tag-bg-color-hover: var(--color-blueberry-2); // @presenter Color
124
+ --tag-close-button-bg-color-hover: var(--color-blueberry-2); // @presenter Color
144
125
  }
145
126
 
146
127
  .tag-warning,
@@ -148,6 +129,7 @@ export const tagDarkMode = css`
148
129
  --tag-color: var(--color-warning-active); // @presenter Color
149
130
  --tag-bg-color: var(--color-warning-bg); // @presenter Color
150
131
  --tag-bg-color-hover: var(--color-warning-bg-hover); // @presenter Color
132
+ --tag-close-button-bg-color-hover: var(--color-warning-hover); // @presenter Color
151
133
  }
152
134
 
153
135
  .tag-processing,
@@ -155,6 +137,7 @@ export const tagDarkMode = css`
155
137
  --tag-color: var(--color-info-active); // @presenter Color
156
138
  --tag-bg-color: var(--color-info-bg); // @presenter Color
157
139
  --tag-bg-color-hover: var(--color-info-bg-hover); // @presenter Color
140
+ --tag-close-button-bg-color-hover: var(--color-info-hover); // @presenter Color
158
141
  }
159
142
 
160
143
  .tag-error,
@@ -162,6 +145,7 @@ export const tagDarkMode = css`
162
145
  --tag-color: var(--color-error-active); // @presenter Color
163
146
  --tag-bg-color: var(--color-error-bg); // @presenter Color
164
147
  --tag-bg-color-hover: var(--color-error-bg-hover); // @presenter Color
148
+ --tag-close-button-bg-color-hover: var(--color-error-hover); // @presenter Color
165
149
  }
166
150
 
167
151
  .tag-success,
@@ -169,11 +153,126 @@ export const tagDarkMode = css`
169
153
  --tag-color: var(--color-success-active); // @presenter Color
170
154
  --tag-bg-color: var(--color-success-bg); // @presenter Color
171
155
  --tag-bg-color-hover: var(--color-success-bg-hover); // @presenter Color
156
+ --tag-close-button-bg-color-hover: var(--color-success-bg-hover); // @presenter Color
172
157
  }
173
158
 
174
159
  .tag-link {
175
160
  --tag-color: var(--color-info-active); // @presenter Color
176
161
  --tag-bg-color: var(--color-info-bg); // @presenter Color
177
162
  --tag-bg-color-hover: var(--color-info-bg-hover); // @presenter Color
163
+ --tag-close-button-bg-color-hover: var(--color-info-hover); // @presenter Color
164
+ }
165
+
166
+ .tag-delete {
167
+ --tag-color: #fa82a2; // @presenter Color
168
+ --tag-bg-color: #47252E; // @presenter Color
169
+ --tag-bg-color-hover: #653441; // @presenter Color
170
+ }
171
+
172
+ .tag-get {
173
+ --tag-color: #68cc97; // @presenter Color
174
+ --tag-bg-color: #1F3D2D; // @presenter Color
175
+ --tag-bg-color-hover: #34654B; // @presenter Color
176
+ }
177
+
178
+ .tag-post {
179
+ --tag-color: #90b0f0; // @presenter Color
180
+ --tag-bg-color: #2B3447; // @presenter Color
181
+ --tag-bg-color-hover: #3A465F; // @presenter Color
182
+ }
183
+
184
+ .tag-put {
185
+ --tag-color: #e0a663; // @presenter Color
186
+ --tag-bg-color: #3D2D1B; // @presenter Color
187
+ --tag-bg-color-hover: #674C2D; // @presenter Color
188
+ }
189
+
190
+ .tag-patch {
191
+ --tag-color: #e0c363; // @presenter Color
192
+ --tag-bg-color: #3D351B; // @presenter Color
193
+ --tag-bg-color-hover: #67592D; // @presenter Color
194
+ }
195
+
196
+ .tag-head {
197
+ --tag-color: var(--color-purple-7); // @presenter Color
198
+ --tag-bg-color: #312B5A; // @presenter Color
199
+ --tag-bg-color-hover: #413875; // @presenter Color
200
+ }
201
+
202
+ .tag-channel {
203
+ --tag-color: #F5AD5B; // @presenter Color
204
+ --tag-bg-color: #4A3721; // @presenter Color
205
+ --tag-bg-color-hover: #64492B; // @presenter Color
206
+ }
207
+
208
+ .tag-topic {
209
+ --tag-color: #F5AD5B; // @presenter Color
210
+ --tag-bg-color: #4A3721; // @presenter Color
211
+ --tag-bg-color-hover: #64492B; // @presenter Color
212
+ }
213
+
214
+ .tag-send {
215
+ --tag-color: #7779F8; // @presenter Color
216
+ --tag-bg-color: #272754; // @presenter Color
217
+ --tag-bg-color-hover: #373776; // @presenter Color
218
+ }
219
+
220
+ .tag-pub {
221
+ --tag-color: #7779F8; // @presenter Color
222
+ --tag-bg-color: #272754; // @presenter Color
223
+ --tag-bg-color-hover: #373776; // @presenter Color
224
+ }
225
+
226
+ .tag-publish {
227
+ --tag-color: #7779F8; // @presenter Color
228
+ --tag-bg-color: #272754; // @presenter Color
229
+ --tag-bg-color-hover: #373776; // @presenter Color
230
+ }
231
+
232
+ .tag-receive {
233
+ --tag-color: #88CF82; // @presenter Color
234
+ --tag-bg-color: #23421F; // @presenter Color
235
+ --tag-bg-color-hover: #305A2A; // @presenter Color
236
+ }
237
+
238
+ .tag-sub {
239
+ --tag-color: #88CF82; // @presenter Color
240
+ --tag-bg-color: #23421F; // @presenter Color
241
+ --tag-bg-color-hover: #305A2A; // @presenter Color
242
+ }
243
+
244
+ .tag-cons {
245
+ --tag-color: #88CF82; // @presenter Color
246
+ --tag-bg-color: #23421F; // @presenter Color
247
+ --tag-bg-color-hover: #305A2A; // @presenter Color
248
+ }
249
+
250
+ .tag-exchange {
251
+ --tag-color: #C79CF2; // @presenter Color
252
+ --tag-bg-color: #472669; // @presenter Color
253
+ --tag-bg-color-hover: #5C3187; // @presenter Color
254
+ }
255
+
256
+ // shorten alias for exchange tag:
257
+ .tag-exch {
258
+ --tag-color: #C79CF2; // @presenter Color
259
+ --tag-bg-color: #472669; // @presenter Color
260
+ --tag-bg-color-hover: #5C3187; // @presenter Color
261
+ }
262
+
263
+ .tag-queue {
264
+ --tag-color: #F7A7CF; // @presenter Color
265
+ --tag-bg-color: #622242; // @presenter Color
266
+ --tag-bg-color-hover: #882F5C; // @presenter Color
267
+ }
268
+
269
+ .tag-variant-filled {
270
+ --tag-border-color: transparent;
271
+ --tag-border-color-hover: transparent;
272
+ }
273
+
274
+ .tag-variant-outline {
275
+ --tag-bg-color: transparent;
276
+ --tag-bg-color-hover: transparent;
178
277
  }
179
278
  `;