diff --git a/packages/next/src/lib/metadata/constants.ts b/packages/next/src/lib/metadata/constants.ts index 2856ee9ae36c8..9118d79fd4488 100644 --- a/packages/next/src/lib/metadata/constants.ts +++ b/packages/next/src/lib/metadata/constants.ts @@ -8,6 +8,7 @@ export const ViewPortKeys: { [k in keyof Viewport]: string } = { minimumScale: 'minimum-scale', maximumScale: 'maximum-scale', viewportFit: 'viewport-fit', + userScalable: 'user-scalable', interactiveWidget: 'interactive-widget', } as const diff --git a/packages/next/src/lib/metadata/resolve-metadata.test.ts b/packages/next/src/lib/metadata/resolve-metadata.test.ts index dd4862a6fe236..d62dfe15ae904 100644 --- a/packages/next/src/lib/metadata/resolve-metadata.test.ts +++ b/packages/next/src/lib/metadata/resolve-metadata.test.ts @@ -195,6 +195,7 @@ describe('accumulateMetadata', () => { minimumScale: 1, maximumScale: 1, viewportFit: 'cover', + userScalable: false, interactiveWidget: 'overlays-content', }, }, @@ -204,7 +205,7 @@ describe('accumulateMetadata', () => { const metadata = await accumulateMetadata(metadataItems) expect(metadata).toMatchObject({ viewport: - 'width=device-width, height=device-height, initial-scale=1, minimum-scale=1, maximum-scale=1, viewport-fit=cover, interactive-widget=overlays-content', + 'width=device-width, height=device-height, initial-scale=1, minimum-scale=1, maximum-scale=1, viewport-fit=cover, user-scalable=no, interactive-widget=overlays-content', }) }) }) diff --git a/packages/next/src/lib/metadata/resolvers/resolve-basics.ts b/packages/next/src/lib/metadata/resolvers/resolve-basics.ts index 9a7a48c68faf0..f0ecaa6c20a4c 100644 --- a/packages/next/src/lib/metadata/resolvers/resolve-basics.ts +++ b/packages/next/src/lib/metadata/resolvers/resolve-basics.ts @@ -36,9 +36,11 @@ export const resolveViewport: FieldResolver<'viewport'> = (viewport) => { resolved = '' for (const viewportKey_ in ViewPortKeys) { const viewportKey = viewportKey_ as keyof Viewport - if (viewport[viewportKey]) { + let value = viewport[viewportKey] + if (typeof value === 'boolean') value = value ? 'yes' : 'no' + if (typeof value !== undefined) { if (resolved) resolved += ', ' - resolved += `${ViewPortKeys[viewportKey]}=${viewport[viewportKey]}` + resolved += `${ViewPortKeys[viewportKey]}=${value}` } } } diff --git a/packages/next/src/lib/metadata/types/extra-types.ts b/packages/next/src/lib/metadata/types/extra-types.ts index e9897bf5471eb..365c3af44319b 100644 --- a/packages/next/src/lib/metadata/types/extra-types.ts +++ b/packages/next/src/lib/metadata/types/extra-types.ts @@ -59,6 +59,7 @@ export type Viewport = { initialScale?: number minimumScale?: number maximumScale?: number + userScalable?: boolean viewportFit?: 'auto' | 'cover' | 'contain' interactiveWidget?: 'resizes-visual' | 'resizes-content' | 'overlays-content' }