import * as React from 'react'; import styled from 'styled-components'; import type { Version } from '@redocly/config'; import type { SelectProps } from '@redocly/theme/core/types'; import { useThemeHooks, useThemeConfig } from '@redocly/theme/core/hooks'; import { Select } from '@redocly/theme/components/Select/Select'; import { SelectInputWrapper } from '@redocly/theme/components/Select/SelectInput'; export function VersionPicker(props: { versions?: Version[]; onChange: (v: Version) => void }) { const themeConfig = useThemeConfig(); const { versionPicker } = themeConfig; const { useTranslate } = useThemeHooks(); const { translate } = useTranslate(); const { versions = [], onChange } = props; const options = versions.map(({ label, version, active }) => ({ element: label || version, value: version, active: active, })); const value = options.find((item) => item.active); if (versionPicker?.hide) { return null; } const handleOnChange = (value: SelectProps['value']) => { const selectedVersion = versions.find((v) => v.version === value); onChange(selectedVersion as Version); }; if (!options.length && !versionPicker?.showForUnversioned) return null; return ( {translate('versionPicker.label', 'Version:')} {/* eslint-disable-next-line theme/require-translate */} This is version picker select, using it you can select a version of the API. ); } const VersionPickerLabel = styled.label` font-size: var(--version-picker-label-font-size); font-weight: var(--version-picker-label-font-weight); `; export const VersionPickerSelect = styled(Select)` --select-list-item-bg-color-active: var(--version-picker-list-item-bg-color-active); --select-list-item-bg-color-hover: var(--version-picker-list-item-bg-color-hover); flex: 1; font-size: var(--version-picker-font-size); font-weight: var(--version-picker-font-weight); border-radius: var(--version-picker-border-radius); line-height: var(--version-picker-line-height); color: var(--version-picker-text-color); ${SelectInputWrapper} { border: var(--version-picker-input-border); border-radius: var(--version-picker-input-border-radius); padding: var(--version-picker-input-padding-vertical) var(--version-picker-input-padding-horizontal); &:focus-within { outline: 1px solid var(--version-picker-focus-outline-color); } } `; const VersionsPickerWrapper = styled.div` display: flex; gap: 10px; flex-direction: row; align-items: center; justify-content: space-between; padding: var(--version-picker-padding-vertical) var(--version-picker-padding-horizontal); border-bottom: var(--version-picker-border-bottom); &:focus-visible { outline: 1px solid var(--version-picker-focus-outline-color); } `; const SrOnly = styled.span` position: absolute; width: 0; height: 0; overflow: hidden; `;