UNPKG

viewport-extra

Version:

Enable setting minimum and maximum viewport width

1 lines 18.6 kB
{"version":3,"file":"viewport-extra.cjs","sources":["../src/internal/Document.ts","../src/internal/string.ts","../src/internal/number.ts","../src/internal/Content.ts","../src/internal/Media.ts","../src/internal/MediaSpecificParameters.ts","../src/internal/HTMLMetaElement.ts","../src/internal/MatchMedia.ts","../src/apis/setMediaSpecificParametersList.ts"],"sourcesContent":["import { arrayFrom } from \"./ArrayLike.js\";\n\nexport const ensureViewportMetaElement = (doc: Document): HTMLMetaElement => {\n const viewportMetaElement = doc.querySelector<HTMLMetaElement>(\n 'meta[name=\"viewport\"]',\n );\n if (viewportMetaElement) return viewportMetaElement;\n const htmlMetaElement = doc.createElement(\"meta\");\n htmlMetaElement.setAttribute(\"name\", \"viewport\");\n doc.head.appendChild(htmlMetaElement);\n return htmlMetaElement;\n};\n\nexport const getMetaElementList = (doc: Document): HTMLMetaElement[] =>\n arrayFrom(\n doc.querySelectorAll<HTMLMetaElement>(\n 'meta[name=\"viewport\"],meta[name=\"viewport-extra\"]',\n ),\n );\n\nexport const getDocumentClientWidth = (doc: Document): number =>\n doc.documentElement.clientWidth;\n","export const camelizeKebabCaseString = (str: string): string =>\n str\n .replace(/\\s+/g, \"\")\n .toLowerCase()\n .replace(/-./g, (s) => s[1].toUpperCase());\n\nexport const kebabizeCamelCaseString = (str: string): string =>\n str\n .replace(/\\s+/g, \"\")\n .replace(/[A-Z]+/g, (s) => `-${s[0]}`)\n .toLowerCase();\n","export const mathTrunc: typeof Math.trunc =\n __TYPESCRIPT_TARGET__ !== \"es5\"\n ? /* eslint-disable-next-line compat/compat */\n Math.trunc\n : (num) => (num < 0 ? Math.ceil : Math.floor)(num);\n\nexport const truncateDecimalNumber = (\n num: number,\n decimalPlaces: number,\n): number =>\n // biome-ignore lint/suspicious/noGlobalIsFinite: isFinite is safe to use here\n isFinite(decimalPlaces)\n ? mathTrunc(num * 10 ** decimalPlaces) / 10 ** decimalPlaces\n : num;\n","import type { ContentAttribute } from \"./ContentAttribute.js\";\nimport type { DecimalPlaces } from \"./DecimalPlaces.js\";\nimport { truncateDecimalNumber } from \"./number.js\";\nimport { kebabizeCamelCaseString } from \"./string.js\";\n\nexport type Content = {\n width: number | \"device-width\";\n initialScale: number;\n minimumWidth: number;\n maximumWidth: number;\n /** Alternative to `minimumWidth` */\n minWidth?: number;\n /** Alternative to `maximumWidth` */\n maxWidth?: number;\n} & {\n [key: string]: string | number;\n};\n\nexport const defaultContent = {\n width: \"device-width\" as const,\n initialScale: 1,\n minimumWidth: 0,\n maximumWidth: Infinity,\n};\n\nexport const createContent = (\n partialContent: Partial<Content> | undefined = {},\n): Content => ({\n ...defaultContent,\n ...partialContent,\n});\n\nexport const mergeOptionalPartialContent = (\n precedingOptionalPartialContent: Partial<Content> | undefined,\n followingOptionalPartialContent: Partial<Content> | undefined,\n): Partial<Content> | undefined =>\n precedingOptionalPartialContent\n ? {\n ...precedingOptionalPartialContent,\n ...(followingOptionalPartialContent ?? {}),\n }\n : followingOptionalPartialContent;\n\nexport const createContentAttribute: {\n (\n content: Content,\n documentClientWidth: number,\n decimalPlaces: DecimalPlaces,\n ): ContentAttribute;\n (): ContentAttribute;\n} = (\n content: Content = { ...defaultContent },\n // biome-ignore lint/style/noInferrableTypes: number type cannot be inferred from initialization\n documentClientWidth: number = 0,\n decimalPlaces: DecimalPlaces = 0,\n) => {\n const { width, initialScale } = content;\n const {\n minimumWidth: _minimumWidth,\n maximumWidth: _maximumWidth,\n minWidth,\n maxWidth,\n ...contentWithoutExtraProperties\n } = content;\n const minimumWidth = minWidth ?? _minimumWidth;\n const maximumWidth = maxWidth ?? _maximumWidth;\n if (minimumWidth <= maximumWidth && width === \"device-width\") {\n if (documentClientWidth < minimumWidth) {\n contentWithoutExtraProperties.width = minimumWidth;\n contentWithoutExtraProperties.initialScale =\n (documentClientWidth / minimumWidth) * initialScale;\n } else if (documentClientWidth > maximumWidth) {\n contentWithoutExtraProperties.width = maximumWidth;\n contentWithoutExtraProperties.initialScale =\n (documentClientWidth / maximumWidth) * initialScale;\n }\n }\n return Object.keys(contentWithoutExtraProperties)\n .map(\n (key) =>\n `${kebabizeCamelCaseString(key)}=${\n typeof contentWithoutExtraProperties[key] === \"number\"\n ? truncateDecimalNumber(\n contentWithoutExtraProperties[key],\n decimalPlaces,\n )\n : contentWithoutExtraProperties[key]\n }`,\n )\n .sort()\n .join(\",\");\n};\n","export type Media = string;\n\nexport const defaultMedia = \"\";\n\nexport const createMedia = (optionalMedia: Media | undefined): Media =>\n optionalMedia ?? defaultMedia;\n\nexport const mergeOptionalMedia = (\n precedingOptionalMedia: Media | undefined,\n followingOptionalMedia: Media | undefined,\n): Media | undefined => followingOptionalMedia ?? precedingOptionalMedia;\n","import * as ContentModule from \"./Content.js\";\nimport {\n type Content,\n createContent,\n mergeOptionalPartialContent,\n} from \"./Content.js\";\nimport type { ContentAttribute } from \"./ContentAttribute.js\";\nimport type { DecimalPlaces } from \"./DecimalPlaces.js\";\nimport type { DeepPartial } from \"./DeepPartial.js\";\nimport { createMedia, type Media, mergeOptionalMedia } from \"./Media.js\";\n\nexport type MediaSpecificParameters = {\n content: Content;\n media: Media;\n};\n\nexport const createMediaSpecificParameters = (\n partialMediaSpecificParameters: DeepPartial<MediaSpecificParameters> = {},\n): MediaSpecificParameters => ({\n content: createContent(partialMediaSpecificParameters.content),\n media: createMedia(partialMediaSpecificParameters.media),\n});\n\nexport const mergePartialMediaSpecificParameters = (\n precedingPartialMediaSpecificParameters: DeepPartial<MediaSpecificParameters>,\n followingPartialMediaSpecificParameters: DeepPartial<MediaSpecificParameters>,\n): DeepPartial<MediaSpecificParameters> => {\n const partialMediaSpecificParameters: DeepPartial<MediaSpecificParameters> =\n {};\n const optionalPartialContent = mergeOptionalPartialContent(\n precedingPartialMediaSpecificParameters.content,\n followingPartialMediaSpecificParameters.content,\n );\n const optionalMedia = mergeOptionalMedia(\n precedingPartialMediaSpecificParameters.media,\n followingPartialMediaSpecificParameters.media,\n );\n if (optionalPartialContent)\n partialMediaSpecificParameters.content = optionalPartialContent;\n if (typeof optionalMedia !== \"undefined\")\n partialMediaSpecificParameters.media = optionalMedia;\n return partialMediaSpecificParameters;\n};\n\nexport const createContentAttribute: {\n (\n optionalMediaSpecificParameters: MediaSpecificParameters,\n optionalDocumentClientWidth: number,\n optionalDecimalPlaces: DecimalPlaces,\n ): ContentAttribute;\n (): ContentAttribute;\n} = (\n optionalMediaSpecificParameters?: MediaSpecificParameters,\n optionalDocumentClientWidth?: number,\n optionalDecimalPlaces?: DecimalPlaces,\n) =>\n optionalMediaSpecificParameters &&\n typeof optionalDocumentClientWidth !== \"undefined\" &&\n typeof optionalDecimalPlaces !== \"undefined\"\n ? ContentModule.createContentAttribute(\n optionalMediaSpecificParameters.content,\n optionalDocumentClientWidth,\n optionalDecimalPlaces,\n )\n : ContentModule.createContentAttribute();\n\nexport const assignOptionalPartialContent = (\n optionalPartialMediaSpecificParameters:\n | DeepPartial<MediaSpecificParameters>\n | undefined,\n optionalPartialContent: Partial<Content> | undefined,\n): DeepPartial<MediaSpecificParameters> =>\n optionalPartialContent\n ? {\n ...(optionalPartialMediaSpecificParameters ?? {}),\n content: optionalPartialContent,\n }\n : (optionalPartialMediaSpecificParameters ?? {});\n\nexport const assignOptionalMedia = (\n optionalPartialMediaSpecificParameters:\n | DeepPartial<MediaSpecificParameters>\n | undefined,\n optionalMedia: Media | undefined,\n): DeepPartial<MediaSpecificParameters> =>\n typeof optionalMedia !== \"undefined\"\n ? {\n ...(optionalPartialMediaSpecificParameters ?? {}),\n media: optionalMedia,\n }\n : (optionalPartialMediaSpecificParameters ?? {});\n\nexport const createPartialMediaSpecificParametersMerger =\n (isMatchingCurrentViewport: (media?: Media) => boolean) =>\n (\n precedingPartialMediaSpecificParameters: DeepPartial<MediaSpecificParameters>,\n followingPartialMediaSpecificParameters: DeepPartial<MediaSpecificParameters>,\n ): DeepPartial<MediaSpecificParameters> =>\n isMatchingCurrentViewport(followingPartialMediaSpecificParameters.media)\n ? mergePartialMediaSpecificParameters(\n precedingPartialMediaSpecificParameters,\n followingPartialMediaSpecificParameters,\n )\n : precedingPartialMediaSpecificParameters;\n","import {\n type ContentAttribute,\n createOptionalPartialContent,\n mergeNullableContentAttributes,\n} from \"./ContentAttribute.js\";\nimport {\n createOptionalDecimalPlaces,\n type DecimalPlacesAttribute,\n mergeNullableDecimalPlacesAttribute,\n} from \"./DecimalPlacesAttribute.js\";\nimport type { DeepPartial } from \"./DeepPartial.js\";\nimport {\n assignOptionalDecimalPlaces,\n type GlobalParameters,\n getDecimalPlaces,\n} from \"./GlobalParameters.js\";\nimport {\n createOptionalMedia,\n type MediaAttribute,\n mergeNullableMediaAttribute,\n} from \"./MediaAttribute.js\";\nimport {\n assignOptionalMedia,\n assignOptionalPartialContent,\n createContentAttribute,\n type MediaSpecificParameters,\n} from \"./MediaSpecificParameters.js\";\n\nexport const getNullableDecimalPlacesAttribute = (\n htmlMetaElement: HTMLMetaElement,\n): DecimalPlacesAttribute | null =>\n mergeNullableDecimalPlacesAttribute(\n htmlMetaElement.getAttribute(\"data-decimal-places\"),\n htmlMetaElement.getAttribute(\"data-extra-decimal-places\"),\n );\n\nexport const createPartialGlobalParameters = (\n htmlMetaElement: HTMLMetaElement,\n): Partial<GlobalParameters> =>\n assignOptionalDecimalPlaces(\n undefined,\n createOptionalDecimalPlaces(\n getNullableDecimalPlacesAttribute(htmlMetaElement),\n ),\n );\n\nexport const getNullableContentAttribute = (\n htmlMetaElement: HTMLMetaElement,\n): ContentAttribute | null =>\n mergeNullableContentAttributes(\n htmlMetaElement.getAttribute(\"content\"),\n htmlMetaElement.getAttribute(\"data-extra-content\"),\n );\n\nexport const getNullableMediaAttribute = (\n htmlMetaElement: HTMLMetaElement,\n): MediaAttribute | null =>\n mergeNullableMediaAttribute(\n htmlMetaElement.getAttribute(\"data-media\"),\n htmlMetaElement.getAttribute(\"data-extra-media\"),\n );\n\nexport const createPartialMediaSpecificParameters = (\n htmlMetaElement: HTMLMetaElement,\n): DeepPartial<MediaSpecificParameters> =>\n assignOptionalMedia(\n assignOptionalPartialContent(\n undefined,\n createOptionalPartialContent(\n getNullableContentAttribute(htmlMetaElement),\n ),\n ),\n createOptionalMedia(getNullableMediaAttribute(htmlMetaElement)),\n );\n\nexport const setContentAttribute = (\n htmlMetaElement: HTMLMetaElement,\n contentAttribute: ContentAttribute,\n): void => htmlMetaElement.setAttribute(\"content\", contentAttribute);\n\nexport const applyMediaSpecificParameters = (\n htmlMetaElement: HTMLMetaElement,\n getDocumentClientWidth: () => number,\n getMediaSpecificParameters: () => MediaSpecificParameters,\n): void => {\n setContentAttribute(htmlMetaElement, createContentAttribute());\n setContentAttribute(\n htmlMetaElement,\n createContentAttribute(\n getMediaSpecificParameters(),\n getDocumentClientWidth(),\n Infinity,\n ),\n );\n};\n\nexport const applyMediaSpecificParametersTruncated = (\n htmlMetaElement: HTMLMetaElement,\n getDocumentClientWidth: () => number,\n getMediaSpecificParameters: () => MediaSpecificParameters,\n globalParameters: GlobalParameters,\n): void => {\n setContentAttribute(htmlMetaElement, createContentAttribute());\n setContentAttribute(\n htmlMetaElement,\n createContentAttribute(\n getMediaSpecificParameters(),\n getDocumentClientWidth(),\n getDecimalPlaces(globalParameters),\n ),\n );\n};\n","import type { Media } from \"./Media.js\";\n\nexport type MatchMedia = (query: string) => MediaQueryList;\n\nexport const createMatchMediaPredicate =\n (mm: MatchMedia) =>\n (media?: Media): boolean =>\n typeof media !== \"undefined\" ? mm(media).matches : true;\n","import type { DeepPartial } from \"../internal/DeepPartial.js\";\nimport {\n ensureViewportMetaElement,\n getDocumentClientWidth,\n} from \"../internal/Document.js\";\nimport { applyMediaSpecificParameters } from \"../internal/HTMLMetaElement.js\";\nimport { createMatchMediaPredicate } from \"../internal/MatchMedia.js\";\nimport {\n createMediaSpecificParameters,\n createPartialMediaSpecificParametersMerger,\n type MediaSpecificParameters,\n} from \"../internal/MediaSpecificParameters.js\";\n\nexport const setMediaSpecificParametersList = (\n partialMediaSpecificParametersList: DeepPartial<MediaSpecificParameters>[],\n): void => {\n if (typeof window === \"undefined\") return;\n applyMediaSpecificParameters(\n ensureViewportMetaElement(document),\n () => getDocumentClientWidth(document),\n () =>\n createMediaSpecificParameters(\n partialMediaSpecificParametersList.reduce(\n createPartialMediaSpecificParametersMerger(\n createMatchMediaPredicate(matchMedia),\n ),\n // Value that does not need to check matching current viewport\n createMediaSpecificParameters(),\n ),\n ),\n );\n};\n"],"names":["createContentAttribute","ContentModule.createContentAttribute"],"mappings":"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"}