@redocly/theme 0.65.0-next.5 → 0.66.0-next.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.
@@ -117,6 +117,8 @@ function SearchDialog({ onClose, className, initialMode = 'search', }) {
117
117
  (0, react_1.useEffect)(focusSearchInput, []);
118
118
  const handleOverlayClick = (0, react_1.useCallback)((event) => {
119
119
  var _a;
120
+ if (event.button !== 0)
121
+ return;
120
122
  const target = event.target;
121
123
  if (typeof target.className !== 'string')
122
124
  return;
@@ -171,7 +173,7 @@ function SearchDialog({ onClose, className, initialMode = 'search', }) {
171
173
  const showAiSearchItem = showAiSearchButton && query;
172
174
  const showHeaderButtons = showSearchFilterButton || showAiSearchButton;
173
175
  return (react_1.default.createElement(Portal_1.Portal, null,
174
- react_1.default.createElement(SearchOverlay, { "data-component-name": "Search/SearchDialog", ref: modalRef, onClick: handleOverlayClick, className: (0, utils_1.concatClassNames)('overlay', className) },
176
+ react_1.default.createElement(SearchOverlay, { "data-component-name": "Search/SearchDialog", ref: modalRef, onPointerDown: handleOverlayClick, className: (0, utils_1.concatClassNames)('overlay', className) },
175
177
  react_1.default.createElement(SearchDialogWrapper, { className: "scroll-lock", role: "dialog" },
176
178
  react_1.default.createElement(SearchDialogHeader, null,
177
179
  product && (react_1.default.createElement(SearchProductTag, { color: "product" },
@@ -225,6 +225,8 @@ function brandPaletteDark(palette) {
225
225
  --link-color-primary-legacy: var(--color-blue-7);
226
226
  --link-color-primary-hover-legacy: var(--color-blue-8);
227
227
  --link-color-visited-legacy: var(--color-purple-8);
228
+
229
+ --card-bg-color-hover-legacy: color-mix(in srgb, var(--color-warm-grey-4) 40%, transparent);
228
230
  `;
229
231
  }
230
232
  }
@@ -232,6 +232,11 @@ function brandPaletteLight(palette) {
232
232
 
233
233
  --search-ai-gradient-start-color-legacy: #715efe; // @presenter Color
234
234
  --search-ai-gradient-end-color-legacy: #ff5cdc; // @presenter Color
235
+
236
+ --card-filled-icon-border-color-hover-legacy: var(--color-blue-6); // @presenter Color
237
+ --card-icon-color-legacy: var(--color-blue-6); // @presenter Color
238
+ --card-outlined-border-color-hover-legacy: var(--color-blue-6); // @presenter Color
239
+ --card-link-icon-color-legacy: var(--color-blue-6); // @presenter Color
235
240
  `;
236
241
  }
237
242
  }
@@ -1,5 +1,5 @@
1
1
  import type { TOptions } from 'i18next';
2
- export type TranslationKey = 'dev.newApp' | 'dev.newApp.text' | 'dev.sidebar.header' | 'dev.sidebar.footer.text' | 'dev.create.app.dialog.appName.placeholder' | 'dev.create.app.dialog.appName.error' | 'dev.create.app.dialog.selectAPIs' | 'dev.create.app.dialog.description' | 'dev.create.app.dialog.description.placeholder' | 'dev.create.app.dialog.create' | 'dev.create.app.dialog.cancel' | 'dev.main.tab.appKeys' | 'dev.main.tab.logs' | 'dev.app.description.title' | 'dev.edit.description.dialog.title' | 'dev.edit.description.dialog.save' | 'dev.edit.description.dialog.cancel' | 'dev.create.app.dialog.callbackUrls' | 'dev.create.app.dialog.callbackUrls.placeholder' | 'dev.create.app.dialog.callbackUrls.hint' | 'dev.app.callbackUrls.title' | 'dev.edit.callbackUrls.dialog.title' | 'dev.edit.callbackUrls.dialog.placeholder' | 'dev.edit.callbackUrls.dialog.hint' | 'dev.edit.callbackUrls.dialog.save' | 'dev.edit.callbackUrls.dialog.cancel' | 'dev.edit.apis.dialog.selectedAPIs' | 'dev.app.key.create' | 'dev.create.key.dialog.title' | 'dev.create.key.dialog.create' | 'dev.create.key.dialog.cancel' | 'dev.app.edit' | 'dev.app.delete' | 'dev.edit.app.dialog.title' | 'dev.edit.app.dialog.save' | 'dev.edit.app.dialog.cancel' | 'dev.delete.app.dialog.title' | 'dev.delete.app.dialog.confirmation' | 'dev.delete.app.dialog.delete' | 'dev.delete.app.dialog.cancel' | 'dev.app.key.roll' | 'dev.roll.key.dialog.title' | 'dev.roll.key.dialog.apiKey' | 'dev.roll.key.dialog.expires' | 'dev.roll.key.dialog.confirmation' | 'dev.roll.key.dialog.cancel' | 'dev.roll.key.dialog.roll' | 'dev.update.key.dialog.title' | 'dev.update.key.dialog.update' | 'dev.update.key.dialog.cancel' | 'dev.app.key.api.name' | 'dev.app.key.api.status' | 'dev.app.key.api.edit' | 'dev.edit.apis.dialog.title' | 'dev.edit.apis.dialog.apiKey' | 'dev.edit.apis.dialog.save' | 'dev.edit.apis.dialog.cancel' | 'dev.select.placeholder' | 'dev.app.overview.status.pending' | 'dev.app.overview.status.approved' | 'dev.app.overview.status.revoked' | 'dev.app.overview.status' | 'dev.app.overview.non-production' | 'dev.app.overview.production' | 'dev.app.overview.clientId' | 'dev.app.overview.apiKey' | 'dev.app.key.revoke' | 'dev.revoke.key.dialog.title' | 'dev.revoke.key.dialog.apiKey' | 'dev.revoke.key.dialog.expires' | 'dev.revoke.key.dialog.confirmation' | 'dev.revoke.key.dialog.revoke' | 'dev.revoke.key.dialog.cancel' | 'dev.app.overview.expires' | 'dev.app.overview.created' | 'dev.app.overview.visibilityToggle.hide' | 'dev.app.overview.visibilityToggle.show' | 'search.loading' | 'search.noResults.title' | 'search.keys.navigate' | 'search.keys.select' | 'search.keys.exit' | 'search.label' | 'search.cancel' | 'search.recent' | 'search.navbar.label' | 'search.suggested' | 'search.showMore' | 'search.filter.title' | 'search.filter.reset' | 'search.filter.field.reset' | 'search.ai.welcomeText' | 'search.ai.newConversation' | 'search.ai.backToSearch' | 'search.ai.back' | 'search.ai.assistant' | 'search.ai.placeholder' | 'search.ai.generatingResponse' | 'search.ai.followUpQuestion' | 'search.ai.suggestionsTitle' | 'search.ai.thinkingText' | 'search.ai.resourcesFound' | 'search.ai.resourcesFound.basedOn' | 'search.ai.resourcesFound.resources' | 'search.ai.feedback.title' | 'search.ai.feedback.detailsPlaceholder' | 'search.ai.feedback.thanks' | 'search.ai.toolCall.executed' | 'search.ai.toolCall.executing' | 'search.ai.toolCall.withArgs' | 'search.ai.button' | 'search.ai.label' | 'search.ai.disclaimer' | 'search.ai.error.description' | 'search.ai.error.description.forbidden' | 'search.ai.error.description.unauthorized' | 'search.ai.error.header' | 'search.ai.error.header.forbidden' | 'search.ai.error.header.unauthorized' | 'search.ai.feedback.more' | 'search.searchItem.deprecated' | 'search.groups.all' | 'search.filter.field.footer' | 'aiAssistant.trigger' | 'toc.header' | 'footer.copyrightText' | 'page.homeButton' | 'page.forbidden.title' | 'page.forbidden.description' | 'page.notFound.title' | 'page.notFound.description' | 'page.lastUpdated.timeago' | 'page.lastUpdated.on' | 'catalog.filters.placeholder' | 'catalog.filters.title' | 'catalog.filters.add' | 'catalog.filters.clearAll' | 'catalog.filters.select.addFilter' | 'catalog.filters.select.all' | 'catalog.filters.done' | 'catalog.catalogs.all.title' | 'catalog.catalogs.all.description' | 'catalog.catalogs.all.switcherLabel' | 'catalog.catalogs.service.title' | 'catalog.catalogs.service.description' | 'catalog.catalogs.service.switcherLabel' | 'catalog.catalogs.user.title' | 'catalog.catalogs.user.description' | 'catalog.catalogs.user.switcherLabel' | 'catalog.catalogs.team.title' | 'catalog.catalogs.team.description' | 'catalog.catalogs.team.switcherLabel' | 'catalog.catalogs.domain.title' | 'catalog.catalogs.domain.description' | 'catalog.catalogs.domain.switcherLabel' | 'catalog.catalogs.apiDescription.title' | 'catalog.catalogs.apiDescription.description' | 'catalog.catalogs.apiDescription.switcherLabel' | 'catalog.catalogs.dataSchema.title' | 'catalog.catalogs.dataSchema.description' | 'catalog.catalogs.dataSchema.switcherLabel' | 'catalog.catalogs.apiOperation.title' | 'catalog.catalogs.apiOperation.description' | 'catalog.catalogs.apiOperation.switcherLabel' | 'catalog.entity.metadata.title' | 'catalog.entity.schema.title' | 'catalog.entity.properties.apiDescription.title' | 'catalog.backToAllLabel' | 'catalog.notConnected' | 'catalog.tags.label' | 'catalog.sort' | 'catalog.catalogs.label' | 'catalog.owners.label' | 'catalog.repositories.label' | 'catalog.email.label' | 'catalog.format.label' | 'catalog.entityType.label' | 'catalog.domains.label' | 'catalog.contact.label' | 'catalog.methodAndPath.label' | 'catalog.links.label' | 'catalog.metadata.domains' | 'catalog.metadata.owners' | 'catalog.history.button.label' | 'catalog.history.sidebar.title' | 'catalog.history.sidebar.close' | 'catalog.history.version.label' | 'catalog.filters.close' | 'catalog.history.version.notSpecified' | 'catalog.history.version.default' | 'catalog.history.revisions.limitMessage' | 'catalog.history.revision.current' | 'catalog.history.revisions.showLess' | 'catalog.history.revisions.showMore' | 'sidebar.menu.backLabel' | 'sidebar.menu.backToLabel' | 'sidebar.actions.show' | 'sidebar.actions.hide' | 'sidebar.actions.changeToSingleColumn' | 'sidebar.actions.changeToTwoColumns' | 'sidebar.actions.singleColumn' | 'sidebar.actions.twoColumns' | 'versionPicker.label' | 'versionPicker.unversioned' | 'codeSnippet.copy.buttonText' | 'codeSnippet.copy.tooltipText' | 'codeSnippet.copy.toasterText' | 'markdown.editPage.text' | 'feedback.settings.comment.submitText' | 'feedback.settings.comment.label' | 'feedback.settings.comment.send' | 'feedback.settings.comment.cancel' | 'feedback.settings.comment.maxLength' | 'feedback.settings.comment.satisfiedLabel' | 'feedback.settings.comment.neutralLabel' | 'feedback.settings.comment.dissatisfiedLabel' | 'feedback.settings.submitText' | 'feedback.settings.label' | 'feedback.settings.reasons.label' | 'feedback.submit' | 'feedback.cancel' | 'feedback.settings.comment.likeLabel' | 'feedback.settings.comment.dislikeLabel' | 'feedback.sentiment.thumbUp' | 'feedback.sentiment.thumbDown' | 'feedback.settings.leftScaleLabel' | 'feedback.settings.rightScaleLabel' | 'feedback.settings.optionalEmail.placeholder' | 'feedback.settings.optionalEmail.label' | 'codeSnippet.report.buttonText' | 'codeSnippet.report.tooltipText' | 'codeSnippet.report.label' | 'codeSnippet.expand.tooltipText' | 'codeSnippet.collapse.tooltipText' | 'userMenu.login' | 'userMenu.logout' | 'userMenu.devOnboardingLabel' | 'mobileMenu.mainMenu' | 'mobileMenu.previous' | 'mobileMenu.products' | 'mobileMenu.version' | 'navbar.products' | 'page.nextButton' | 'page.previousButton' | 'page.actions.copyButtonText' | 'page.actions.copyTitle' | 'page.actions.copyDescription' | 'page.actions.viewAsMdTitle' | 'page.actions.viewAsMdButtonText' | 'page.actions.viewAsMdDescription' | 'page.actions.chatGptTitle' | 'page.actions.chatGptButtonText' | 'page.actions.chatGptDescription' | 'page.actions.claudeTitle' | 'page.actions.claudeButtonText' | 'page.actions.claudeDescription' | 'page.actions.cursorMcpButtonText' | 'page.actions.cursorMcpTitle' | 'page.actions.cursorMcpDescription' | 'page.actions.connectMcp' | 'page.actions.connectMcp.cursor' | 'page.actions.connectMcp.cursorDescription' | 'page.actions.connectMcp.vscode' | 'page.actions.connectMcp.vscodeDescription' | 'page.actions.connectMcp.copyConfig' | 'page.actions.connectMcp.copyConfigDescription' | 'openapi.download.description.title' | 'openapi.info.title' | 'openapi.info.contact.url' | 'openapi.info.contact.name' | 'openapi.info.license' | 'openapi.info.termsOfService' | 'openapi.info.metadata.title' | 'openapi.key' | 'openapi.value' | 'openapi.enum' | 'openapi.items' | 'openapi.default' | 'openapi.variable' | 'openapi.variables' | 'openapi.actions.show' | 'openapi.actions.hide' | 'openapi.actions.more' | 'openapi.languages.title' | 'openapi.languages.moreButton.tooltipText' | 'openapi.servers.title' | 'openapi.operations' | 'openapi.webhooks' | 'openapi.description' | 'openapi.badges.deprecated' | 'openapi.badges.required' | 'openapi.badges.webhook' | 'openapi.request' | 'openapi.path' | 'openapi.query' | 'openapi.cookie' | 'openapi.header' | 'openapi.body' | 'openapi.responses' | 'openapi.response' | 'openapi.callbacks' | 'openapi.callbackRequest' | 'openapi.callbackResponse' | 'openapi.payload' | 'openapi.discriminator' | 'openapi.contentType' | 'openapi.tryIt' | 'openapi.loading' | 'openapi.example' | 'openapi.examples' | 'openapi.additionalProperties' | 'openapi.patternProperties' | 'openapi.required' | 'openapi.recursive' | 'openapi.complex' | 'openapi.hideExample' | 'openapi.showExample' | 'openapi.expandAll' | 'openapi.collapseAll' | 'openapi.viewSecurityDetails' | 'openapi.noResponseExample' | 'openapi.discriminator.searchPlaceholder' | 'openapi.discriminator.searchNoResults' | 'openapi.discriminator.defaultMapping' | 'openapi.discriminator.defaultMappingTooltip' | 'openapi.noResponseContent' | 'openapi.noRequestPayload' | 'openapi.hidePattern' | 'openapi.showPattern' | 'openapi.authorizationUrl' | 'openapi.tokenUrl' | 'openapi.refreshUrl' | 'openapi.showOptionalScopes' | 'openapi.hideOptionalScopes' | 'openapi.security' | 'openapi.httpAuthorizationScheme' | 'openapi.bearerFormat' | 'openapi.parameterName' | 'openapi.flowType' | 'openapi.connectUrl' | 'openapi.requiredScopes' | 'openapi.unsupportedLanguage' | 'openapi.failedToGenerateCodeSample' | 'openapi.schemaCatalogLink.title' | 'openapi.schemaCatalogLink.copyButtonTooltip' | 'openapi.schemaCatalogLink.copiedTooltip' | 'openapi.mcp.title' | 'openapi.mcp.endpoint' | 'openapi.mcp.tools' | 'openapi.mcp.protocolVersion' | 'openapi.mcp.capabilities' | 'openapi.mcp.experimentalCapabilities' | 'openapi.mcp.inputSchema' | 'openapi.mcp.inputExample' | 'openapi.mcp.outputSchema' | 'openapi.mcp.outputExample' | 'asyncapi.download.description.title' | 'asyncapi.info.title' | 'graphql.download.description.title' | 'graphql.info.title' | 'graphql.info.contact.url' | 'graphql.info.contact.name' | 'graphql.info.license' | 'graphql.info.termsOfService' | 'graphql.overview' | 'graphql.metadata' | 'graphql.key' | 'graphql.value' | 'graphql.queries' | 'graphql.mutations' | 'graphql.subscriptions' | 'graphql.directives' | 'graphql.objects' | 'graphql.interfaces' | 'graphql.unions' | 'graphql.enums' | 'graphql.inputs' | 'graphql.scalars' | 'graphql.arguments.label' | 'graphql.arguments.show' | 'graphql.arguments.hide' | 'graphql.arguments.here' | 'graphql.returnTypes.label' | 'graphql.returnTypes.show' | 'graphql.returnTypes.hide' | 'graphql.possibleTypes' | 'graphql.defaultValue' | 'graphql.deprecationReason' | 'graphql.requiredScopes' | 'graphql.viewSecurityDetails' | 'graphql.objectScopes' | 'graphql.fieldScopes' | 'graphql.implementedInterfaces' | 'graphql.nonNull' | 'graphql.required' | 'graphql.deprecated' | 'graphql.variables' | 'graphql.querySample' | 'graphql.mutationSample' | 'graphql.subscriptionSample' | 'graphql.responseSample' | 'graphql.locations' | 'graphql.sample' | 'graphql.referenced' | 'graphql.content.fragment' | 'button.copy.tooltipText' | 'button.download.tooltipText' | 'button.externalLink.tooltipText' | 'button.email.tooltipText' | 'codeWalkthrough.download' | 'codeWalkthrough.preview' | 'time.justNow' | 'time.past.second' | 'time.past.seconds' | 'time.past.minute' | 'time.past.minutes' | 'time.past.hour' | 'time.past.hours' | 'time.past.day' | 'time.past.days' | 'time.past.week' | 'time.past.weeks' | 'time.past.month' | 'time.past.months' | 'time.past.year' | 'time.past.years' | 'page.internalServerError.title' | 'page.internalServerError.description' | 'page.skipToContent.label' | 'select.noResults' | 'loaders.loading' | 'filter.dateRange.from' | 'filter.dateRange.to' | 'diagram.openFullscreen' | 'diagram.zoomIn' | 'diagram.zoomOut' | 'diagram.reset' | 'diagram.close' | 'diagram.viewer';
2
+ export type TranslationKey = 'dev.newApp' | 'dev.newApp.text' | 'dev.sidebar.header' | 'dev.sidebar.footer.text' | 'dev.create.app.dialog.appName.placeholder' | 'dev.create.app.dialog.appName.error' | 'dev.create.app.dialog.selectAPIs' | 'dev.create.app.dialog.description' | 'dev.create.app.dialog.description.placeholder' | 'dev.create.app.dialog.create' | 'dev.create.app.dialog.cancel' | 'dev.main.tab.appKeys' | 'dev.main.tab.logs' | 'dev.app.description.title' | 'dev.edit.description.dialog.title' | 'dev.edit.description.dialog.save' | 'dev.edit.description.dialog.cancel' | 'dev.create.app.dialog.callbackUrls' | 'dev.create.app.dialog.callbackUrls.placeholder' | 'dev.create.app.dialog.callbackUrls.hint' | 'dev.app.callbackUrls.title' | 'dev.edit.callbackUrls.dialog.title' | 'dev.edit.callbackUrls.dialog.placeholder' | 'dev.edit.callbackUrls.dialog.hint' | 'dev.edit.callbackUrls.dialog.save' | 'dev.edit.callbackUrls.dialog.cancel' | 'dev.edit.apis.dialog.selectedAPIs' | 'dev.app.key.create' | 'dev.create.key.dialog.title' | 'dev.create.key.dialog.create' | 'dev.create.key.dialog.cancel' | 'dev.app.edit' | 'dev.app.delete' | 'dev.edit.app.dialog.title' | 'dev.edit.app.dialog.save' | 'dev.edit.app.dialog.cancel' | 'dev.delete.app.dialog.title' | 'dev.delete.app.dialog.confirmation' | 'dev.delete.app.dialog.delete' | 'dev.delete.app.dialog.cancel' | 'dev.app.key.roll' | 'dev.roll.key.dialog.title' | 'dev.roll.key.dialog.apiKey' | 'dev.roll.key.dialog.expires' | 'dev.roll.key.dialog.confirmation' | 'dev.roll.key.dialog.cancel' | 'dev.roll.key.dialog.roll' | 'dev.update.key.dialog.title' | 'dev.update.key.dialog.update' | 'dev.update.key.dialog.cancel' | 'dev.app.key.api.name' | 'dev.app.key.api.status' | 'dev.app.key.api.edit' | 'dev.edit.apis.dialog.title' | 'dev.edit.apis.dialog.apiKey' | 'dev.edit.apis.dialog.save' | 'dev.edit.apis.dialog.cancel' | 'dev.select.placeholder' | 'dev.app.overview.status.pending' | 'dev.app.overview.status.approved' | 'dev.app.overview.status.revoked' | 'dev.app.overview.status' | 'dev.app.overview.non-production' | 'dev.app.overview.production' | 'dev.app.overview.clientId' | 'dev.app.overview.apiKey' | 'dev.app.key.revoke' | 'dev.revoke.key.dialog.title' | 'dev.revoke.key.dialog.apiKey' | 'dev.revoke.key.dialog.expires' | 'dev.revoke.key.dialog.confirmation' | 'dev.revoke.key.dialog.revoke' | 'dev.revoke.key.dialog.cancel' | 'dev.app.overview.expires' | 'dev.app.overview.created' | 'dev.app.overview.visibilityToggle.hide' | 'dev.app.overview.visibilityToggle.show' | 'search.loading' | 'search.noResults.title' | 'search.keys.navigate' | 'search.keys.select' | 'search.keys.exit' | 'search.label' | 'search.cancel' | 'search.recent' | 'search.navbar.label' | 'search.suggested' | 'search.showMore' | 'search.filter.title' | 'search.filter.reset' | 'search.filter.field.reset' | 'search.ai.welcomeText' | 'search.ai.newConversation' | 'search.ai.backToSearch' | 'search.ai.back' | 'search.ai.assistant' | 'search.ai.placeholder' | 'search.ai.generatingResponse' | 'search.ai.followUpQuestion' | 'search.ai.suggestionsTitle' | 'search.ai.thinkingText' | 'search.ai.resourcesFound' | 'search.ai.resourcesFound.basedOn' | 'search.ai.resourcesFound.resources' | 'search.ai.feedback.title' | 'search.ai.feedback.detailsPlaceholder' | 'search.ai.feedback.thanks' | 'search.ai.toolCall.executed' | 'search.ai.toolCall.executing' | 'search.ai.toolCall.withArgs' | 'search.ai.button' | 'search.ai.label' | 'search.ai.disclaimer' | 'search.ai.error.description' | 'search.ai.error.description.forbidden' | 'search.ai.error.description.unauthorized' | 'search.ai.error.header' | 'search.ai.error.header.forbidden' | 'search.ai.error.header.unauthorized' | 'search.ai.feedback.more' | 'search.searchItem.deprecated' | 'search.groups.all' | 'search.filter.field.footer' | 'aiAssistant.trigger' | 'toc.header' | 'footer.copyrightText' | 'page.homeButton' | 'page.forbidden.title' | 'page.forbidden.description' | 'page.notFound.title' | 'page.notFound.description' | 'page.lastUpdated.timeago' | 'page.lastUpdated.on' | 'catalog.filters.placeholder' | 'catalog.filters.title' | 'catalog.filters.add' | 'catalog.filters.clearAll' | 'catalog.filters.select.addFilter' | 'catalog.filters.select.all' | 'catalog.filters.done' | 'catalog.catalogs.all.title' | 'catalog.catalogs.all.description' | 'catalog.catalogs.all.switcherLabel' | 'catalog.catalogs.service.title' | 'catalog.catalogs.service.description' | 'catalog.catalogs.service.switcherLabel' | 'catalog.catalogs.user.title' | 'catalog.catalogs.user.description' | 'catalog.catalogs.user.switcherLabel' | 'catalog.catalogs.team.title' | 'catalog.catalogs.team.description' | 'catalog.catalogs.team.switcherLabel' | 'catalog.catalogs.domain.title' | 'catalog.catalogs.domain.description' | 'catalog.catalogs.domain.switcherLabel' | 'catalog.catalogs.apiDescription.title' | 'catalog.catalogs.apiDescription.description' | 'catalog.catalogs.apiDescription.switcherLabel' | 'catalog.catalogs.dataSchema.title' | 'catalog.catalogs.dataSchema.description' | 'catalog.catalogs.dataSchema.switcherLabel' | 'catalog.catalogs.apiOperation.title' | 'catalog.catalogs.apiOperation.description' | 'catalog.catalogs.apiOperation.switcherLabel' | 'catalog.entity.metadata.title' | 'catalog.entity.schema.title' | 'catalog.entity.properties.apiDescription.title' | 'catalog.backToAllLabel' | 'catalog.notConnected' | 'catalog.tags.label' | 'catalog.sort' | 'catalog.catalogs.label' | 'catalog.owners.label' | 'catalog.repositories.label' | 'catalog.email.label' | 'catalog.format.label' | 'catalog.entityType.label' | 'catalog.domains.label' | 'catalog.contact.label' | 'catalog.methodAndPath.label' | 'catalog.links.label' | 'catalog.metadata.domains' | 'catalog.metadata.owners' | 'catalog.history.button.label' | 'catalog.history.sidebar.title' | 'catalog.history.sidebar.close' | 'catalog.history.version.label' | 'catalog.filters.close' | 'catalog.history.version.notSpecified' | 'catalog.history.version.default' | 'catalog.history.revisions.limitMessage' | 'catalog.history.revision.current' | 'catalog.history.revisions.showLess' | 'catalog.history.revisions.showMore' | 'sidebar.menu.backLabel' | 'sidebar.menu.backToLabel' | 'sidebar.actions.show' | 'sidebar.actions.hide' | 'sidebar.actions.changeToSingleColumn' | 'sidebar.actions.changeToTwoColumns' | 'sidebar.actions.singleColumn' | 'sidebar.actions.twoColumns' | 'versionPicker.label' | 'versionPicker.unversioned' | 'codeSnippet.copy.buttonText' | 'codeSnippet.copy.tooltipText' | 'codeSnippet.copy.toasterText' | 'markdown.editPage.text' | 'feedback.settings.comment.submitText' | 'feedback.settings.comment.label' | 'feedback.settings.comment.send' | 'feedback.settings.comment.cancel' | 'feedback.settings.comment.maxLength' | 'feedback.settings.comment.satisfiedLabel' | 'feedback.settings.comment.neutralLabel' | 'feedback.settings.comment.dissatisfiedLabel' | 'feedback.settings.submitText' | 'feedback.settings.label' | 'feedback.settings.reasons.label' | 'feedback.submit' | 'feedback.cancel' | 'feedback.settings.comment.likeLabel' | 'feedback.settings.comment.dislikeLabel' | 'feedback.sentiment.thumbUp' | 'feedback.sentiment.thumbDown' | 'feedback.settings.leftScaleLabel' | 'feedback.settings.rightScaleLabel' | 'feedback.settings.optionalEmail.placeholder' | 'feedback.settings.optionalEmail.label' | 'codeSnippet.report.buttonText' | 'codeSnippet.report.tooltipText' | 'codeSnippet.report.label' | 'codeSnippet.expand.tooltipText' | 'codeSnippet.collapse.tooltipText' | 'userMenu.login' | 'userMenu.logout' | 'userMenu.devOnboardingLabel' | 'mobileMenu.mainMenu' | 'mobileMenu.previous' | 'mobileMenu.products' | 'mobileMenu.version' | 'navbar.products' | 'page.nextButton' | 'page.previousButton' | 'page.actions.copyButtonText' | 'page.actions.copyTitle' | 'page.actions.copyDescription' | 'page.actions.viewAsMdTitle' | 'page.actions.viewAsMdButtonText' | 'page.actions.viewAsMdDescription' | 'page.actions.chatGptTitle' | 'page.actions.chatGptButtonText' | 'page.actions.chatGptDescription' | 'page.actions.claudeTitle' | 'page.actions.claudeButtonText' | 'page.actions.claudeDescription' | 'page.actions.cursorMcpButtonText' | 'page.actions.cursorMcpTitle' | 'page.actions.cursorMcpDescription' | 'page.actions.connectMcp' | 'page.actions.connectMcp.cursor' | 'page.actions.connectMcp.cursorDescription' | 'page.actions.connectMcp.vscode' | 'page.actions.connectMcp.vscodeDescription' | 'page.actions.connectMcp.copyConfig' | 'page.actions.connectMcp.copyConfigDescription' | 'openapi.download.description.title' | 'openapi.info.title' | 'openapi.info.contact.url' | 'openapi.info.contact.name' | 'openapi.info.license' | 'openapi.info.termsOfService' | 'openapi.info.metadata.title' | 'openapi.key' | 'openapi.value' | 'openapi.enum' | 'openapi.items' | 'openapi.default' | 'openapi.variable' | 'openapi.variables' | 'openapi.actions.show' | 'openapi.actions.hide' | 'openapi.actions.more' | 'openapi.languages.title' | 'openapi.languages.moreButton.tooltipText' | 'openapi.servers.title' | 'openapi.operations' | 'openapi.webhooks' | 'openapi.description' | 'openapi.badges.deprecated' | 'openapi.badges.required' | 'openapi.badges.webhook' | 'openapi.request' | 'openapi.path' | 'openapi.query' | 'openapi.cookie' | 'openapi.header' | 'openapi.body' | 'openapi.responses' | 'openapi.response' | 'openapi.callbacks' | 'openapi.callbackRequest' | 'openapi.callbackResponse' | 'openapi.payload' | 'openapi.discriminator' | 'openapi.contentType' | 'openapi.tryIt' | 'openapi.loading' | 'openapi.example' | 'openapi.examples' | 'openapi.additionalProperties' | 'openapi.patternProperties' | 'openapi.required' | 'openapi.recursive' | 'openapi.complex' | 'openapi.hideExample' | 'openapi.showExample' | 'openapi.expandAll' | 'openapi.collapseAll' | 'openapi.viewSecurityDetails' | 'openapi.noResponseExample' | 'openapi.discriminator.searchPlaceholder' | 'openapi.discriminator.searchNoResults' | 'openapi.discriminator.defaultMapping' | 'openapi.discriminator.defaultMappingTooltip' | 'openapi.noResponseContent' | 'openapi.noRequestPayload' | 'openapi.hidePattern' | 'openapi.showPattern' | 'openapi.authorizationUrl' | 'openapi.tokenUrl' | 'openapi.refreshUrl' | 'openapi.showOptionalScopes' | 'openapi.hideOptionalScopes' | 'openapi.security' | 'openapi.httpAuthorizationScheme' | 'openapi.bearerFormat' | 'openapi.parameterName' | 'openapi.flowType' | 'openapi.connectUrl' | 'openapi.requiredScopes' | 'openapi.unsupportedLanguage' | 'openapi.failedToGenerateCodeSample' | 'openapi.schemaCatalogLink.title' | 'openapi.schemaCatalogLink.copyButtonTooltip' | 'openapi.schemaCatalogLink.copiedTooltip' | 'openapi.mcp.title' | 'openapi.mcp.endpoint' | 'openapi.mcp.tools' | 'openapi.mcp.protocolVersion' | 'openapi.mcp.capabilities' | 'openapi.mcp.experimentalCapabilities' | 'openapi.mcp.inputSchema' | 'openapi.mcp.inputExample' | 'openapi.mcp.outputSchema' | 'openapi.mcp.outputExample' | 'asyncapi.download.description.title' | 'asyncapi.info.title' | 'graphql.download.description.title' | 'graphql.info.title' | 'graphql.info.contact.url' | 'graphql.info.contact.name' | 'graphql.info.license' | 'graphql.info.termsOfService' | 'graphql.overview' | 'graphql.metadata' | 'graphql.key' | 'graphql.value' | 'graphql.queries' | 'graphql.mutations' | 'graphql.subscriptions' | 'graphql.directives' | 'graphql.objects' | 'graphql.interfaces' | 'graphql.unions' | 'graphql.enums' | 'graphql.inputs' | 'graphql.scalars' | 'graphql.arguments.label' | 'graphql.arguments.show' | 'graphql.arguments.hide' | 'graphql.arguments.here' | 'graphql.returnTypes.label' | 'graphql.returnTypes.show' | 'graphql.returnTypes.hide' | 'graphql.possibleTypes' | 'graphql.defaultValue' | 'graphql.deprecationReason' | 'graphql.requiredScopes' | 'graphql.viewSecurityDetails' | 'graphql.objectScopes' | 'graphql.fieldScopes' | 'graphql.implementedInterfaces' | 'graphql.implementedBy' | 'graphql.nonNull' | 'graphql.required' | 'graphql.deprecated' | 'graphql.variables' | 'graphql.querySample' | 'graphql.mutationSample' | 'graphql.subscriptionSample' | 'graphql.responseSample' | 'graphql.locations' | 'graphql.sample' | 'graphql.referenced' | 'graphql.content.fragment' | 'button.copy.tooltipText' | 'button.download.tooltipText' | 'button.externalLink.tooltipText' | 'button.email.tooltipText' | 'codeWalkthrough.download' | 'codeWalkthrough.preview' | 'time.justNow' | 'time.past.second' | 'time.past.seconds' | 'time.past.minute' | 'time.past.minutes' | 'time.past.hour' | 'time.past.hours' | 'time.past.day' | 'time.past.days' | 'time.past.week' | 'time.past.weeks' | 'time.past.month' | 'time.past.months' | 'time.past.year' | 'time.past.years' | 'page.internalServerError.title' | 'page.internalServerError.description' | 'page.skipToContent.label' | 'select.noResults' | 'loaders.loading' | 'filter.dateRange.from' | 'filter.dateRange.to' | 'diagram.openFullscreen' | 'diagram.zoomIn' | 'diagram.zoomOut' | 'diagram.reset' | 'diagram.close' | 'diagram.viewer';
3
3
  export type Locale = {
4
4
  code: string;
5
5
  name: string;
@@ -10,13 +10,12 @@ const ChevronRightIcon_1 = require("../../../icons/ChevronRightIcon/ChevronRight
10
10
  const CardImage_1 = require("../../../markdoc/components/Cards/CardImage");
11
11
  const CardIcon_1 = require("../../../markdoc/components/Cards/CardIcon");
12
12
  const Link_1 = require("../../../components/Link/Link");
13
- function Card({ title = '', image, icon, iconRawContent, imagePosition = 'start', iconPosition = 'auto', layout = 'vertical', variant = 'filled', lineClamp, iconVariant, align = 'start', to, children, }) {
13
+ function Card({ title = '', image, icon, iconRawContent, imagePosition = 'start', iconPosition = 'auto', layout = 'vertical', variant = 'filled', lineClamp, iconVariant = 'filled', align = 'start', to, children, }) {
14
14
  const titleNoSpaces = title === null || title === void 0 ? void 0 : title.replace(/\s+/g, '-').toLowerCase();
15
15
  const cardTitleId = `card-title-${titleNoSpaces}`;
16
16
  const justifyContent = align === 'center' ? 'center' : align === 'end' ? 'flex-end' : 'flex-start';
17
17
  const alignItems = align === 'center' ? 'center' : align === 'end' ? 'flex-end' : 'flex-start';
18
18
  const textAlign = align === 'center' ? 'center' : align === 'end' ? 'right' : 'left';
19
- iconVariant = iconVariant !== null && iconVariant !== void 0 ? iconVariant : (variant === 'ghost' ? 'filled' : 'ghost');
20
19
  return (react_1.default.createElement(CardWrapper, { as: to ? Link_1.Link : 'div', to: to, "aria-labelledby": cardTitleId, "$variant": variant, "$layout": layout, "$isCardLink": !!to },
21
20
  react_1.default.createElement(react_1.default.Fragment, null,
22
21
  image ? react_1.default.createElement(CardImage_1.CardImage, { src: image, alt: title, position: imagePosition }) : null,
@@ -25,7 +24,7 @@ function Card({ title = '', image, icon, iconRawContent, imagePosition = 'start'
25
24
  react_1.default.createElement(ContentWrapper, null,
26
25
  react_1.default.createElement(Title, { id: cardTitleId, "$isCardLink": !!to, "$justifyContent": justifyContent },
27
26
  title,
28
- !!to && react_1.default.createElement(CardLinkIcon, null)),
27
+ variant == 'ghost' && !!to && react_1.default.createElement(CardLinkIcon, null)),
29
28
  react_1.default.createElement(Body, { "$lineClamp": lineClamp }, children))))));
30
29
  }
31
30
  const CardContentWrapper = styled_components_1.default.div `
@@ -57,6 +56,7 @@ const Title = styled_components_1.default.h3 `
57
56
  const CardLinkIcon = (0, styled_components_1.default)(ChevronRightIcon_1.ChevronRightIcon) `
58
57
  width: var(--card-link-icon-width);
59
58
  height: var(--card-link-icon-height);
59
+ color: var(--card-link-icon-color);
60
60
  margin-left: var(--spacing-xxs);
61
61
  opacity: 0;
62
62
  transition:
@@ -93,12 +93,10 @@ const CardWrapper = styled_components_1.default.div.attrs(({ $isCardLink, $varia
93
93
  height: 100%;
94
94
  border-radius: var(--card-border-radius);
95
95
  overflow: hidden;
96
- transition: box-shadow 0.3s ease;
96
+ transition: var(--card-hover-transition);
97
97
  position: relative;
98
98
  text-decoration: none;
99
99
  --md-paragraph-margin: 0;
100
- --link-decoration-hover: none;
101
- --link-decoration: none;
102
100
 
103
101
  background-color: var(--card-bg-color);
104
102
  border-width: var(--card-border-width);
@@ -118,6 +116,8 @@ const CardWrapper = styled_components_1.default.div.attrs(({ $isCardLink, $varia
118
116
 
119
117
  &.card-link {
120
118
  cursor: var(--card-link-cursor);
119
+ --link-decoration-hover: none;
120
+ --link-decoration: none;
121
121
 
122
122
  &:hover,
123
123
  &:focus-within {
@@ -125,6 +125,11 @@ const CardWrapper = styled_components_1.default.div.attrs(({ $isCardLink, $varia
125
125
  border-color: var(--card-border-color-hover);
126
126
  box-shadow: var(--card-box-shadow-hover);
127
127
 
128
+ ${CardIcon_1.CardIconWrapper} {
129
+ border-color: var(--card-icon-border-color-hover);
130
+ background-color: var(--card-icon-bg-color-hover);
131
+ }
132
+
128
133
  svg {
129
134
  opacity: 1;
130
135
  }
@@ -6,3 +6,7 @@ export type CardIconProps = {
6
6
  position?: 'auto' | 'start' | 'center' | 'end';
7
7
  };
8
8
  export declare function CardIcon({ variant, src, rawContent, position }: CardIconProps): React.JSX.Element;
9
+ export declare const CardIconWrapper: import("styled-components").StyledComponent<"div", any, {
10
+ $variant?: string;
11
+ $position?: string;
12
+ }, never>;
@@ -3,18 +3,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.CardIconWrapper = void 0;
6
7
  exports.CardIcon = CardIcon;
7
8
  const react_1 = __importDefault(require("react"));
8
9
  const styled_components_1 = __importDefault(require("styled-components"));
9
10
  const GenericIcon_1 = require("../../../icons/GenericIcon/GenericIcon");
10
11
  function CardIcon({ variant, src, rawContent, position }) {
11
- return (react_1.default.createElement(CardIconWrapper, { "$variant": variant, "$position": position },
12
+ return (react_1.default.createElement(exports.CardIconWrapper, { "$variant": variant, "$position": position },
12
13
  react_1.default.createElement(GenericIcon_1.GenericIcon, { icon: src, rawContent: rawContent })));
13
14
  }
14
- const CardIconWrapper = styled_components_1.default.div `
15
+ exports.CardIconWrapper = styled_components_1.default.div `
15
16
  --icon-width: var(--card-icon-width);
16
17
  --icon-height: var(--card-icon-height);
17
- --icon-color: var(--card-icon-color);
18
+ color: var(--card-icon-color);
18
19
 
19
20
  display: flex;
20
21
  align-self: ${({ $position }) => ($position ? $position : 'auto')};
@@ -23,11 +24,11 @@ const CardIconWrapper = styled_components_1.default.div `
23
24
  min-height: var(--card-icon-height);
24
25
  flex-shrink: 0;
25
26
 
26
- padding: ${({ $variant }) => ($variant === 'ghost' ? '0' : `var(--card-icon-padding);`)};
27
+ padding: var(--card-icon-padding);
28
+ border: ${({ $variant }) => $variant !== 'ghost' && `var(--card-icon-border)`};
27
29
  border-radius: var(--card-icon-border-radius);
28
30
  overflow: hidden;
29
31
 
30
32
  background-color: ${({ $variant }) => $variant === 'ghost' ? 'transparent' : 'var(--card-icon-bg-color)'};
31
- border: ${({ $variant }) => $variant === 'ghost' ? 'none' : `1px solid var(--card-icon-border-color)`};
32
33
  `;
33
34
  //# sourceMappingURL=CardIcon.js.map
@@ -11,9 +11,10 @@ function CardImage({ src, alt, position }) {
11
11
  }
12
12
  const Image = styled_components_1.default.img `
13
13
  width: 100%;
14
- height: 100px;
14
+ aspect-ratio: var(--card-image-aspect-ratio);
15
15
  flex-shrink: 0;
16
16
  object-fit: cover;
17
+ border-radius: var(--card-image-border-radius);
17
18
 
18
19
  order: ${({ $position }) => ($position === 'end' ? 1 : 0)};
19
20
  `;
@@ -9,17 +9,16 @@ exports.cardsDarkMode = (0, styled_components_1.css) `
9
9
 
10
10
  .card-variant-filled {
11
11
  --card-bg-color: var(--color-warm-grey-3);
12
- --card-bg-color-hover: var(--color-warm-grey-4);
13
- --card-border-color: var(--color-warm-grey-4);
14
- --card-border-color-hover: var(--color-warm-grey-3);
12
+ --card-bg-color-hover: var(--color-brand-subtle-bg-hover, var(--card-bg-color-hover-legacy));
13
+ --card-border-width: 0;
15
14
  --card-icon-bg-color: var(--card-bg-color);
15
+ --card-icon-bg-color-hover: transparent;
16
16
  }
17
17
 
18
18
  .card-variant-outlined {
19
- --card-border-color: var(--color-warm-grey-4);
20
- --card-border-color-hover: var(--color-warm-grey-5);
19
+ --card-icon-bg-color: var(--color-warm-grey-3);
21
20
  }
22
-
21
+
23
22
  .card-variant-elevated {
24
23
  --card-box-shadow: 0px 8px 24px -4px #00000014, 0px 6px 12px -6px #0000001F;
25
24
  --card-box-shadow-hover: 0px 14px 64px -4px #0000001F, 0px 8px 22px -6px #0000001F;
@@ -9,23 +9,28 @@ exports.cards = (0, styled_components_1.css) `
9
9
  /**
10
10
  * @tokens Card default colors
11
11
  */
12
- --card-icon-bg-color: var(--color-warm-grey-1);
12
+ --card-icon-bg-color: var(--layer-color);
13
13
  --card-icon-border-color: var(--border-color-secondary);
14
14
  --card-text-color: var(--text-color-secondary);
15
15
  --card-title-text-color: var(--h2-text-color);
16
- --card-icon-color: var(--card-title-text-color);
16
+ --card-link-icon-color: var(--color-primary-base, var(--card-link-icon-color-legacy));
17
+ --card-icon-color: var(--color-primary-base, var(--card-icon-color-legacy));
18
+ --card-hover-transition: box-shadow 0.3s ease;
17
19
 
18
20
  /**
19
21
  * @tokens Card default values
20
22
  */
21
- --card-border-radius: var(--border-radius-md);
23
+ --card-border-radius: var(--border-radius-xl);
22
24
  --card-border-style: solid;
23
25
  --card-link-cursor: pointer;
24
26
  --card-link-icon-width: var(--h3-font-size);
25
27
  --card-link-icon-height: var(--h3-font-size);
26
28
  --card-border-width: 1px;
29
+ --card-image-border-radius: var(--border-radius-md);
30
+ --card-image-aspect-ratio: 16 / 9;
27
31
  --card-icon-border-radius: var(--border-radius-md);
28
- --card-icon-padding: var(--spacing-xs);
32
+ --card-icon-border: var(--card-border-width) var(--border-style) var(--card-icon-border-color);
33
+ --card-icon-padding: var(--spacing-sm);
29
34
  --card-icon-size: 24px;
30
35
  --card-icon-height: var(--card-icon-size);
31
36
  --card-icon-width: var(--card-icon-size);
@@ -42,17 +47,19 @@ exports.cards = (0, styled_components_1.css) `
42
47
  */
43
48
  .card-variant-filled {
44
49
  --card-bg-color: var(--color-warm-grey-1);
45
- --card-bg-color-hover: var(--color-warm-grey-2);
46
- --card-border-color: var(--color-warm-grey-2);
47
- --card-border-color-hover: var(--color-warm-grey-1);
50
+ --card-bg-color-hover: var(--color-primary-bg, var(--color-warm-grey-2));
51
+ --card-border-width: 0;
48
52
  --card-icon-bg-color: var(--color-white);
49
- --card-icon-border-color: var(--card-border-color);
53
+ --card-icon-border-color-hover: var(--color-primary-base, var(--card-filled-icon-border-color-hover-legacy));
50
54
  }
51
55
 
52
56
  .card-variant-outlined {
53
57
  --card-bg-color: transparent;
54
- --card-border-color: var(--color-warm-grey-2);
55
- --card-border-color-hover: var(--color-warm-grey-3);
58
+ --card-border-color: var(--border-color-secondary);
59
+ --card-border-color-hover: var(--color-primary-base, var(--card-outlined-border-color-hover-legacy));
60
+ --card-icon-bg-color: var(--color-warm-grey-1);
61
+ --card-icon-border-color-hover: var(--card-icon-border-color);
62
+ --card-icon-bg-color-hover: var(--card-icon-bg-color);
56
63
  }
57
64
 
58
65
  .card-variant-elevated {
@@ -61,11 +68,20 @@ exports.cards = (0, styled_components_1.css) `
61
68
  --card-border-color-hover: transparent;
62
69
  --card-box-shadow: 0px 8px 24px -4px #232A6114, 0px 6px 12px -6px #232A611F;
63
70
  --card-box-shadow-hover: 0px 14px 64px -4px #232A611F, 0px 8px 22px -6px #232A611F;
71
+ --card-icon-border-color-hover: var(--card-icon-border-color);
72
+ --card-icon-bg-color-hover: var(--card-icon-bg-color);
64
73
  }
65
74
 
66
75
  .card-variant-ghost {
67
76
  --card-bg-color: transparent;
77
+ --card-bg-color-hover: var(--layer-color);
68
78
  --card-border-width: 0;
79
+ --card-border-radius: var(--border-radius-md);
80
+ --card-padding: var(--spacing-xs) 0;
81
+ --card-icon-border-color-hover: var(--card-icon-border-color);
82
+ --card-icon-bg-color-hover: var(--card-icon-bg-color);
83
+ --card-box-shadow-hover: 0 0 0 8px var(--layer-color);
84
+ --card-hover-transition: initial;
69
85
  }
70
86
 
71
87
  `;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@redocly/theme",
3
- "version": "0.65.0-next.5",
3
+ "version": "0.66.0-next.0",
4
4
  "description": "Shared UI components lib",
5
5
  "keywords": [
6
6
  "theme",
@@ -63,7 +63,7 @@
63
63
  "vitest": "4.0.10",
64
64
  "vitest-when": "0.6.2",
65
65
  "webpack": "5.105.2",
66
- "@redocly/realm-asyncapi-sdk": "0.11.0-next.3"
66
+ "@redocly/realm-asyncapi-sdk": "0.12.0-next.0"
67
67
  },
68
68
  "dependencies": {
69
69
  "@tanstack/react-query": "5.62.3",
@@ -81,18 +81,14 @@
81
81
  "openapi-sampler": "^1.7.2",
82
82
  "react-calendar": "5.1.0",
83
83
  "react-date-picker": "11.0.0",
84
- "@redocly/config": "0.48.1"
84
+ "@redocly/config": "0.48.2"
85
85
  },
86
86
  "scripts": {
87
87
  "watch": "tsc -p tsconfig.build.json && (concurrently \"tsc -w -p tsconfig.build.json\" \"tsc-alias -w -p tsconfig.build.json\")",
88
88
  "ts:check": "tsc --noEmit --skipLibCheck",
89
89
  "clean": "rimraf lib",
90
90
  "compile": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json",
91
- "build": "pnpm run clean && pnpm run compile",
92
- "test": "vitest run",
93
- "test:update": "vitest run --update",
94
- "test:watch": "vitest",
95
- "test:coverage": "vitest run --coverage",
96
- "test:coverage:html": "vitest run --coverage --reporter=html"
91
+ "test": "nx run vitest:test",
92
+ "build": "pnpm run clean && pnpm run compile"
97
93
  }
98
94
  }
@@ -1,7 +1,7 @@
1
1
  import React, { Fragment, useRef, useState, useEffect, useCallback } from 'react';
2
2
  import styled from 'styled-components';
3
3
 
4
- import type { JSX, MouseEvent } from 'react';
4
+ import type { JSX, PointerEvent } from 'react';
5
5
  import type { SearchFacetCount, SearchItemData } from '@redocly/theme/core/types';
6
6
 
7
7
  import { SearchInput } from '@redocly/theme/components/Search/SearchInput';
@@ -129,7 +129,8 @@ export function SearchDialog({
129
129
  useEffect(focusSearchInput, []);
130
130
 
131
131
  const handleOverlayClick = useCallback(
132
- (event: MouseEvent<HTMLElement>) => {
132
+ (event: PointerEvent<HTMLElement>) => {
133
+ if (event.button !== 0) return;
133
134
  const target = event.target as HTMLElement;
134
135
  if (typeof target.className !== 'string') return;
135
136
  if (target.className?.includes(' overlay')) {
@@ -212,7 +213,7 @@ export function SearchDialog({
212
213
  <SearchOverlay
213
214
  data-component-name="Search/SearchDialog"
214
215
  ref={modalRef}
215
- onClick={handleOverlayClick}
216
+ onPointerDown={handleOverlayClick}
216
217
  className={concatClassNames('overlay', className)}
217
218
  >
218
219
  <SearchDialogWrapper className="scroll-lock" role="dialog">
@@ -223,6 +223,8 @@ function brandPaletteDark(palette: string | undefined): FlattenSimpleInterpolati
223
223
  --link-color-primary-legacy: var(--color-blue-7);
224
224
  --link-color-primary-hover-legacy: var(--color-blue-8);
225
225
  --link-color-visited-legacy: var(--color-purple-8);
226
+
227
+ --card-bg-color-hover-legacy: color-mix(in srgb, var(--color-warm-grey-4) 40%, transparent);
226
228
  `;
227
229
  }
228
230
  }
@@ -230,6 +230,11 @@ function brandPaletteLight(palette: string | undefined): FlattenSimpleInterpolat
230
230
 
231
231
  --search-ai-gradient-start-color-legacy: #715efe; // @presenter Color
232
232
  --search-ai-gradient-end-color-legacy: #ff5cdc; // @presenter Color
233
+
234
+ --card-filled-icon-border-color-hover-legacy: var(--color-blue-6); // @presenter Color
235
+ --card-icon-color-legacy: var(--color-blue-6); // @presenter Color
236
+ --card-outlined-border-color-hover-legacy: var(--color-blue-6); // @presenter Color
237
+ --card-link-icon-color-legacy: var(--color-blue-6); // @presenter Color
233
238
  `;
234
239
  }
235
240
  }
@@ -394,6 +394,7 @@ export type TranslationKey =
394
394
  | 'graphql.objectScopes'
395
395
  | 'graphql.fieldScopes'
396
396
  | 'graphql.implementedInterfaces'
397
+ | 'graphql.implementedBy'
397
398
  | 'graphql.nonNull'
398
399
  | 'graphql.required'
399
400
  | 'graphql.deprecated'
@@ -3,7 +3,7 @@ import styled from 'styled-components';
3
3
 
4
4
  import { ChevronRightIcon } from '@redocly/theme/icons/ChevronRightIcon/ChevronRightIcon';
5
5
  import { CardImage } from '@redocly/theme/markdoc/components/Cards/CardImage';
6
- import { CardIcon } from '@redocly/theme/markdoc/components/Cards/CardIcon';
6
+ import { CardIcon, CardIconWrapper } from '@redocly/theme/markdoc/components/Cards/CardIcon';
7
7
  import { Link } from '@redocly/theme/components/Link/Link';
8
8
 
9
9
  export type CardProps = React.PropsWithChildren<{
@@ -31,7 +31,7 @@ export function Card({
31
31
  layout = 'vertical',
32
32
  variant = 'filled',
33
33
  lineClamp,
34
- iconVariant,
34
+ iconVariant = 'filled',
35
35
  align = 'start',
36
36
  to,
37
37
  children,
@@ -42,7 +42,6 @@ export function Card({
42
42
  align === 'center' ? 'center' : align === 'end' ? 'flex-end' : 'flex-start';
43
43
  const alignItems = align === 'center' ? 'center' : align === 'end' ? 'flex-end' : 'flex-start';
44
44
  const textAlign = align === 'center' ? 'center' : align === 'end' ? 'right' : 'left';
45
- iconVariant = iconVariant ?? (variant === 'ghost' ? 'filled' : 'ghost');
46
45
 
47
46
  return (
48
47
  <CardWrapper
@@ -72,7 +71,7 @@ export function Card({
72
71
  <ContentWrapper>
73
72
  <Title id={cardTitleId} $isCardLink={!!to} $justifyContent={justifyContent}>
74
73
  {title}
75
- {!!to && <CardLinkIcon />}
74
+ {variant == 'ghost' && !!to && <CardLinkIcon />}
76
75
  </Title>
77
76
  <Body $lineClamp={lineClamp}>{children}</Body>
78
77
  </ContentWrapper>
@@ -119,6 +118,7 @@ const Title = styled.h3<{ $isCardLink: boolean; $justifyContent: string }>`
119
118
  const CardLinkIcon = styled(ChevronRightIcon)`
120
119
  width: var(--card-link-icon-width);
121
120
  height: var(--card-link-icon-height);
121
+ color: var(--card-link-icon-color);
122
122
  margin-left: var(--spacing-xxs);
123
123
  opacity: 0;
124
124
  transition:
@@ -165,12 +165,10 @@ const CardWrapper = styled.div.attrs<{
165
165
  height: 100%;
166
166
  border-radius: var(--card-border-radius);
167
167
  overflow: hidden;
168
- transition: box-shadow 0.3s ease;
168
+ transition: var(--card-hover-transition);
169
169
  position: relative;
170
170
  text-decoration: none;
171
171
  --md-paragraph-margin: 0;
172
- --link-decoration-hover: none;
173
- --link-decoration: none;
174
172
 
175
173
  background-color: var(--card-bg-color);
176
174
  border-width: var(--card-border-width);
@@ -191,6 +189,8 @@ const CardWrapper = styled.div.attrs<{
191
189
 
192
190
  &.card-link {
193
191
  cursor: var(--card-link-cursor);
192
+ --link-decoration-hover: none;
193
+ --link-decoration: none;
194
194
 
195
195
  &:hover,
196
196
  &:focus-within {
@@ -198,6 +198,11 @@ const CardWrapper = styled.div.attrs<{
198
198
  border-color: var(--card-border-color-hover);
199
199
  box-shadow: var(--card-box-shadow-hover);
200
200
 
201
+ ${CardIconWrapper} {
202
+ border-color: var(--card-icon-border-color-hover);
203
+ background-color: var(--card-icon-bg-color-hover);
204
+ }
205
+
201
206
  svg {
202
207
  opacity: 1;
203
208
  }
@@ -18,10 +18,10 @@ export function CardIcon({ variant, src, rawContent, position }: CardIconProps)
18
18
  );
19
19
  }
20
20
 
21
- const CardIconWrapper = styled.div<{ $variant?: string; $position?: string }>`
21
+ export const CardIconWrapper = styled.div<{ $variant?: string; $position?: string }>`
22
22
  --icon-width: var(--card-icon-width);
23
23
  --icon-height: var(--card-icon-height);
24
- --icon-color: var(--card-icon-color);
24
+ color: var(--card-icon-color);
25
25
 
26
26
  display: flex;
27
27
  align-self: ${({ $position }) => ($position ? $position : 'auto')};
@@ -30,12 +30,11 @@ const CardIconWrapper = styled.div<{ $variant?: string; $position?: string }>`
30
30
  min-height: var(--card-icon-height);
31
31
  flex-shrink: 0;
32
32
 
33
- padding: ${({ $variant }) => ($variant === 'ghost' ? '0' : `var(--card-icon-padding);`)};
33
+ padding: var(--card-icon-padding);
34
+ border: ${({ $variant }) => $variant !== 'ghost' && `var(--card-icon-border)`};
34
35
  border-radius: var(--card-icon-border-radius);
35
36
  overflow: hidden;
36
37
 
37
38
  background-color: ${({ $variant }) =>
38
39
  $variant === 'ghost' ? 'transparent' : 'var(--card-icon-bg-color)'};
39
- border: ${({ $variant }) =>
40
- $variant === 'ghost' ? 'none' : `1px solid var(--card-icon-border-color)`};
41
40
  `;
@@ -13,9 +13,10 @@ export function CardImage({ src, alt, position }: CardImageProps) {
13
13
 
14
14
  const Image = styled.img<{ $position?: string }>`
15
15
  width: 100%;
16
- height: 100px;
16
+ aspect-ratio: var(--card-image-aspect-ratio);
17
17
  flex-shrink: 0;
18
18
  object-fit: cover;
19
+ border-radius: var(--card-image-border-radius);
19
20
 
20
21
  order: ${({ $position }) => ($position === 'end' ? 1 : 0)};
21
22
  `;
@@ -7,17 +7,16 @@ export const cardsDarkMode = css`
7
7
 
8
8
  .card-variant-filled {
9
9
  --card-bg-color: var(--color-warm-grey-3);
10
- --card-bg-color-hover: var(--color-warm-grey-4);
11
- --card-border-color: var(--color-warm-grey-4);
12
- --card-border-color-hover: var(--color-warm-grey-3);
10
+ --card-bg-color-hover: var(--color-brand-subtle-bg-hover, var(--card-bg-color-hover-legacy));
11
+ --card-border-width: 0;
13
12
  --card-icon-bg-color: var(--card-bg-color);
13
+ --card-icon-bg-color-hover: transparent;
14
14
  }
15
15
 
16
16
  .card-variant-outlined {
17
- --card-border-color: var(--color-warm-grey-4);
18
- --card-border-color-hover: var(--color-warm-grey-5);
17
+ --card-icon-bg-color: var(--color-warm-grey-3);
19
18
  }
20
-
19
+
21
20
  .card-variant-elevated {
22
21
  --card-box-shadow: 0px 8px 24px -4px #00000014, 0px 6px 12px -6px #0000001F;
23
22
  --card-box-shadow-hover: 0px 14px 64px -4px #0000001F, 0px 8px 22px -6px #0000001F;
@@ -7,23 +7,28 @@ export const cards = css`
7
7
  /**
8
8
  * @tokens Card default colors
9
9
  */
10
- --card-icon-bg-color: var(--color-warm-grey-1);
10
+ --card-icon-bg-color: var(--layer-color);
11
11
  --card-icon-border-color: var(--border-color-secondary);
12
12
  --card-text-color: var(--text-color-secondary);
13
13
  --card-title-text-color: var(--h2-text-color);
14
- --card-icon-color: var(--card-title-text-color);
14
+ --card-link-icon-color: var(--color-primary-base, var(--card-link-icon-color-legacy));
15
+ --card-icon-color: var(--color-primary-base, var(--card-icon-color-legacy));
16
+ --card-hover-transition: box-shadow 0.3s ease;
15
17
 
16
18
  /**
17
19
  * @tokens Card default values
18
20
  */
19
- --card-border-radius: var(--border-radius-md);
21
+ --card-border-radius: var(--border-radius-xl);
20
22
  --card-border-style: solid;
21
23
  --card-link-cursor: pointer;
22
24
  --card-link-icon-width: var(--h3-font-size);
23
25
  --card-link-icon-height: var(--h3-font-size);
24
26
  --card-border-width: 1px;
27
+ --card-image-border-radius: var(--border-radius-md);
28
+ --card-image-aspect-ratio: 16 / 9;
25
29
  --card-icon-border-radius: var(--border-radius-md);
26
- --card-icon-padding: var(--spacing-xs);
30
+ --card-icon-border: var(--card-border-width) var(--border-style) var(--card-icon-border-color);
31
+ --card-icon-padding: var(--spacing-sm);
27
32
  --card-icon-size: 24px;
28
33
  --card-icon-height: var(--card-icon-size);
29
34
  --card-icon-width: var(--card-icon-size);
@@ -40,17 +45,19 @@ export const cards = css`
40
45
  */
41
46
  .card-variant-filled {
42
47
  --card-bg-color: var(--color-warm-grey-1);
43
- --card-bg-color-hover: var(--color-warm-grey-2);
44
- --card-border-color: var(--color-warm-grey-2);
45
- --card-border-color-hover: var(--color-warm-grey-1);
48
+ --card-bg-color-hover: var(--color-primary-bg, var(--color-warm-grey-2));
49
+ --card-border-width: 0;
46
50
  --card-icon-bg-color: var(--color-white);
47
- --card-icon-border-color: var(--card-border-color);
51
+ --card-icon-border-color-hover: var(--color-primary-base, var(--card-filled-icon-border-color-hover-legacy));
48
52
  }
49
53
 
50
54
  .card-variant-outlined {
51
55
  --card-bg-color: transparent;
52
- --card-border-color: var(--color-warm-grey-2);
53
- --card-border-color-hover: var(--color-warm-grey-3);
56
+ --card-border-color: var(--border-color-secondary);
57
+ --card-border-color-hover: var(--color-primary-base, var(--card-outlined-border-color-hover-legacy));
58
+ --card-icon-bg-color: var(--color-warm-grey-1);
59
+ --card-icon-border-color-hover: var(--card-icon-border-color);
60
+ --card-icon-bg-color-hover: var(--card-icon-bg-color);
54
61
  }
55
62
 
56
63
  .card-variant-elevated {
@@ -59,11 +66,20 @@ export const cards = css`
59
66
  --card-border-color-hover: transparent;
60
67
  --card-box-shadow: 0px 8px 24px -4px #232A6114, 0px 6px 12px -6px #232A611F;
61
68
  --card-box-shadow-hover: 0px 14px 64px -4px #232A611F, 0px 8px 22px -6px #232A611F;
69
+ --card-icon-border-color-hover: var(--card-icon-border-color);
70
+ --card-icon-bg-color-hover: var(--card-icon-bg-color);
62
71
  }
63
72
 
64
73
  .card-variant-ghost {
65
74
  --card-bg-color: transparent;
75
+ --card-bg-color-hover: var(--layer-color);
66
76
  --card-border-width: 0;
77
+ --card-border-radius: var(--border-radius-md);
78
+ --card-padding: var(--spacing-xs) 0;
79
+ --card-icon-border-color-hover: var(--card-icon-border-color);
80
+ --card-icon-bg-color-hover: var(--card-icon-bg-color);
81
+ --card-box-shadow-hover: 0 0 0 8px var(--layer-color);
82
+ --card-hover-transition: initial;
67
83
  }
68
84
 
69
85
  `;