diff --git a/packages/oc-docs/src/components/MethodBadge/MethodBadge.spec.tsx b/packages/oc-docs/src/components/MethodBadge/MethodBadge.spec.tsx index 1fed42bf..81424585 100644 --- a/packages/oc-docs/src/components/MethodBadge/MethodBadge.spec.tsx +++ b/packages/oc-docs/src/components/MethodBadge/MethodBadge.spec.tsx @@ -3,6 +3,12 @@ import { renderToStaticMarkup } from 'react-dom/server'; import { describe, it, expect } from 'vitest'; import { MethodBadge } from './MethodBadge'; +const badgeText = (element: React.ReactElement): string => + renderToStaticMarkup(element) + .replace(/]*>[\s\S]*?<\/style>/g, '') + .replace(/<[^>]*>/g, '') + .trim(); + describe('MethodBadge', () => { it('renders the method uppercased', () => { expect(renderToStaticMarkup()).toContain('POST'); @@ -11,4 +17,12 @@ describe('MethodBadge', () => { it('defaults to GET when no method is given', () => { expect(renderToStaticMarkup()).toContain('GET'); }); + + it('renders the abbreviated method when short is set', () => { + expect(badgeText()).toBe('DEL'); + }); + + it('keeps short methods intact when short is set', () => { + expect(badgeText()).toBe('GET'); + }); }); diff --git a/packages/oc-docs/src/components/MethodBadge/MethodBadge.tsx b/packages/oc-docs/src/components/MethodBadge/MethodBadge.tsx index 1a2e385d..26aa260b 100644 --- a/packages/oc-docs/src/components/MethodBadge/MethodBadge.tsx +++ b/packages/oc-docs/src/components/MethodBadge/MethodBadge.tsx @@ -1,19 +1,26 @@ import React from 'react'; +import cx from '../../utils/cx'; import { getMethodColorVar } from '../../theme/methodColors'; +import { getShortMethod } from '../../utils/request'; import { StyledWrapper } from './StyledWrapper'; interface MethodBadgeProps { method: string; className?: string; + /** Render the abbreviated method (DELETE -> DEL, OPTIONS -> OPT) for tight spaces like the query bar. */ + short?: boolean; } -export const MethodBadge: React.FC = ({ method, className }) => ( - - {(method || 'GET').toUpperCase()} - -); +export const MethodBadge: React.FC = ({ method, className, short = false }) => { + const resolvedMethod = method || 'GET'; + return ( + + {short ? getShortMethod(resolvedMethod) : resolvedMethod.toUpperCase()} + + ); +}; export default MethodBadge; diff --git a/packages/oc-docs/src/components/Playground/Content/Views/PlaygroundView/QueryBar/QueryBar.tsx b/packages/oc-docs/src/components/Playground/Content/Views/PlaygroundView/QueryBar/QueryBar.tsx index 3226b248..9182baf1 100644 --- a/packages/oc-docs/src/components/Playground/Content/Views/PlaygroundView/QueryBar/QueryBar.tsx +++ b/packages/oc-docs/src/components/Playground/Content/Views/PlaygroundView/QueryBar/QueryBar.tsx @@ -4,7 +4,7 @@ import { StyledWrapper } from './StyledWrapper'; import MenuDropdown from '../../../../../../ui/MenuDropdown'; import { getHttpMethod, getRequestUrl, getHttpParams } from '../../../../../../utils/schemaHelpers'; import { syncPathParams, syncQueryParams } from '../../../../../../utils/pathParams'; -import { availableMethods, getMethodColorVar } from '../../../../../../theme/methodColors'; +import { availableMethods } from '../../../../../../theme/methodColors'; import { MethodBadge } from '../../../../../MethodBadge/MethodBadge'; import { CopyButton } from '../../../../../../ui/CopyButton/CopyButton'; import { SendIcon } from '../../../../../../assets/icons'; @@ -56,24 +56,23 @@ const QueryBar: React.FC = ({ item, onSendRequest, isLoading, onI return ( -
- ({ - id: m, - label: {m}, - ariaLabel: m, - onClick: () => handleMethodChange(m) - }))} - > - - -
+ ({ + id: m, + label: , + ariaLabel: m, + onClick: () => handleMethodChange(m) + }))} + > + + ( children, placement = 'bottom-end', className, + size = 'lg', selectedItemId, role = 'menu', opened, @@ -556,7 +560,7 @@ const MenuDropdown = forwardRef( onCreate={onDropdownCreate} icon={triggerElement} placement={placement} - className={className} + className={cx(className, { 'menu-dropdown-sm': size === 'sm' })} visible={isOpen} onClickOutside={handleClickOutside} {...dropdownProps} diff --git a/packages/oc-docs/src/ui/MenuDropdown/StyledWrapper.ts b/packages/oc-docs/src/ui/MenuDropdown/StyledWrapper.ts index 91bf9490..436f65e7 100644 --- a/packages/oc-docs/src/ui/MenuDropdown/StyledWrapper.ts +++ b/packages/oc-docs/src/ui/MenuDropdown/StyledWrapper.ts @@ -24,6 +24,21 @@ export const StyledWrapper = styled.div` max-width: unset !important; padding: 0.25rem; + &.menu-dropdown-sm { + min-width: 6.875rem; + max-width: 9.375rem !important; + padding: 0.125rem; + background-color: var(--oc-background-base); + border-color: var(--border-color); + margin-top: 2px; + + .dropdown-item { + padding: 0.25rem 0.6rem 0.25rem 0.25rem; + margin: 1px 0; + line-height: 1; + } + } + .menu-dropdown-list { outline: none; &:focus {