@ndla/image-search 11.0.111-alpha.0 → 11.0.113-alpha.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.
@@ -15,4 +15,4 @@ var ImageMeta_default = ImageMeta;
15
15
 
16
16
  //#endregion
17
17
  export { ImageMeta_default };
18
- //# sourceMappingURL=ImageMeta.js.map
18
+ //# sourceMappingURL=ImageMeta.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageMeta.mjs","names":[],"sources":["../src/ImageMeta.tsx"],"sourcesContent":["/**\n * Copyright (c) 2022-present, NDLA.\n *\n * This source code is licensed under the GPLv3 license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport { useMemo } from \"react\";\nimport { Text } from \"@ndla/primitives\";\nimport type { IImageDimensionsDTO } from \"@ndla/types-backend/image-api\";\nimport { humanFileSize } from \"@ndla/util\";\n\ninterface Props {\n contentType: string;\n fileSize: number;\n imageDimensions?: IImageDimensionsDTO;\n locale: string;\n}\n\nconst ImageMeta = ({ contentType, fileSize, imageDimensions, locale }: Props) => {\n const prettySize = useMemo(() => {\n return humanFileSize(fileSize, locale);\n }, [fileSize, locale]);\n\n const dimensions = imageDimensions ? ` - ${imageDimensions.width}x${imageDimensions.height} px` : \"\";\n return <Text>{`${contentType} - ${prettySize}${dimensions}`}</Text>;\n};\n\nexport default ImageMeta;\n"],"mappings":";;;;;;AAoBA,MAAM,YAAY,CAAC,EAAE,aAAa,UAAU,iBAAiB,QAAe,KAAK;CAC/E,MAAM,aAAa,QAAQ,MAAM;AAC/B,SAAO,cAAc,UAAU,OAAO;CACvC,GAAE,CAAC,UAAU,MAAO,EAAC;CAEtB,MAAM,aAAa,mBAAmB,KAAK,gBAAgB,MAAM,GAAG,gBAAgB,OAAO,OAAO;AAClG,wBAAO,IAAC,mBAAO,EAAE,YAAY,KAAK,WAAW,EAAE,WAAW,IAAS;AACpE;AAED,wBAAe"}
@@ -1,4 +1,4 @@
1
- import { ImageSearchResult } from "./ImageSearchResult.js";
1
+ import { ImageSearchResult } from "./ImageSearchResult.mjs";
2
2
  import { useEffect, useState } from "react";
3
3
  import { Button, IconButton, Input, PaginationContext, PaginationEllipsis, PaginationItem, PaginationNextTrigger, PaginationPrevTrigger, PaginationRoot, Text } from "@ndla/primitives";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -158,4 +158,4 @@ var ImageSearch_default = ImageSearch;
158
158
 
159
159
  //#endregion
160
160
  export { ImageSearch_default };
161
- //# sourceMappingURL=ImageSearch.js.map
161
+ //# sourceMappingURL=ImageSearch.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageSearch.mjs","names":["image: IImageMetaInformationV3DTO | undefined","saveAsMetaImage?: boolean","queryObject: ISearchParamsDTO","queryObject","e: KeyboardEvent<HTMLInputElement | HTMLButtonElement>","image","page"],"sources":["../src/ImageSearch.tsx"],"sourcesContent":["/**\n * Copyright (c) 2017-present, NDLA.\n *\n * This source code is licensed under the GPLv3 license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport { type ChangeEvent, type ReactNode, type KeyboardEvent, useEffect, useState } from \"react\";\nimport { ArrowLeftShortLine, ArrowRightShortLine, SearchLine } from \"@ndla/icons\";\nimport {\n Button,\n IconButton,\n Input,\n PaginationContext,\n PaginationEllipsis,\n PaginationItem,\n PaginationNextTrigger,\n PaginationPrevTrigger,\n PaginationRoot,\n Text,\n type PaginationRootProps,\n} from \"@ndla/primitives\";\nimport { styled } from \"@ndla/styled-system/jsx\";\nimport type { IImageMetaInformationV3DTO, ISearchResultV3DTO, ISearchParamsDTO } from \"@ndla/types-backend/image-api\";\nimport ImageSearchResult from \"./ImageSearchResult\";\n\nconst ImageSearchWrapper = styled(\"div\", {\n base: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"small\",\n },\n});\n\nconst StyledSearchResults = styled(\"div\", {\n base: {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fit, minmax(200px, 1fr))\",\n gridGap: \"xsmall\",\n gridAutoFlow: \"dense\",\n },\n});\n\nconst InputWrapper = styled(\"div\", {\n base: {\n display: \"flex\",\n gap: \"xsmall\",\n },\n});\n\nconst StyledPaginationRoot = styled(PaginationRoot, {\n base: {\n flexWrap: \"wrap\",\n },\n});\n\nconst StyledButton = styled(Button, {\n base: {\n tabletWideDown: {\n paddingInline: \"xsmall\",\n \"& span\": {\n display: \"none\",\n },\n },\n },\n});\n\nconst StyledPaginationItem = styled(PaginationItem, {\n base: {\n tabletWideDown: {\n \"&:nth-child(2)\": {\n display: \"none\",\n },\n \"&:nth-last-child(2)\": {\n display: \"none\",\n },\n },\n },\n});\n\nexport interface PreviewTranslations {\n creatorsLabel: string;\n license: string;\n caption: string;\n altText: string;\n modelRelease: string;\n tags: string;\n close: string;\n checkboxLabel?: string;\n missingTitleFallback?: string;\n useImageTitle: string;\n}\n\nexport interface ImageSearchTranslations {\n searchPlaceholder: string;\n searchButtonTitle: string;\n imagePreview: PreviewTranslations;\n paginationTranslations: PaginationRootProps[\"translations\"];\n}\n\nexport interface ImageSearchProps {\n onImageSelect: (image: IImageMetaInformationV3DTO) => void;\n searchImages: (query: string | undefined, page: number | undefined) => Promise<ISearchResultV3DTO>;\n onError?: (err: any) => void;\n locale: string;\n noResults?: ReactNode;\n checkboxAction?: (image: IImageMetaInformationV3DTO) => void;\n showCheckbox?: boolean;\n translations: ImageSearchTranslations;\n}\n\nconst ImageSearch = ({\n onImageSelect,\n searchImages: search,\n onError,\n locale,\n noResults,\n checkboxAction,\n showCheckbox,\n translations,\n}: ImageSearchProps) => {\n const [queryObject, setQueryObject] = useState<ISearchParamsDTO>({\n query: undefined,\n page: 1,\n pageSize: 16,\n });\n const [selectedImage, setSelectedImage] = useState<IImageMetaInformationV3DTO | undefined>();\n const [searching, setSearching] = useState<boolean>(false);\n const [searchResult, setSearchResult] = useState<ISearchResultV3DTO | undefined>();\n\n const { page } = queryObject;\n const noResultsFound = !searching && searchResult?.results.length === 0;\n\n const onSelectImage = (image: IImageMetaInformationV3DTO | undefined, saveAsMetaImage?: boolean) => {\n setSelectedImage(undefined);\n if (!image) return;\n onImageSelect(image);\n if (saveAsMetaImage) {\n checkboxAction?.(image);\n }\n };\n\n const searchImages = (queryObject: ISearchParamsDTO) => {\n setSearching(true);\n search(queryObject.query, queryObject.page)\n .then((result) => {\n setQueryObject({\n query: queryObject.query,\n pageSize: result.pageSize,\n page: queryObject.page,\n });\n setSearchResult(result);\n setSearching(false);\n })\n .catch((err) => {\n onError?.(err);\n setSearching(false);\n });\n };\n\n const handleQueryChange = ({ target: { value } }: ChangeEvent<HTMLInputElement>) => {\n setQueryObject((prevState) => ({\n ...prevState,\n query: value,\n }));\n };\n\n const onEnter = (e: KeyboardEvent<HTMLInputElement | HTMLButtonElement>) => {\n if (e.key === \"Enter\") {\n searchImages(queryObject);\n }\n };\n\n useEffect(() => {\n searchImages(queryObject);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <ImageSearchWrapper>\n <InputWrapper role=\"search\">\n <Input\n type=\"search\"\n placeholder={translations.searchPlaceholder}\n value={queryObject?.query ?? \"\"}\n onChange={handleQueryChange}\n onKeyDown={onEnter}\n />\n <IconButton\n variant=\"primary\"\n aria-label={translations.searchButtonTitle}\n title={translations.searchButtonTitle}\n onKeyDown={onEnter}\n onClick={() => searchImages(queryObject)}\n >\n <SearchLine />\n </IconButton>\n </InputWrapper>\n {!!noResultsFound && noResults}\n <StyledSearchResults>\n {searchResult?.results.map((image) => (\n <ImageSearchResult\n key={image.id}\n image={image}\n onImageClick={(image) => setSelectedImage(image)}\n selectedImage={selectedImage}\n onSelectImage={onSelectImage}\n showCheckbox={!!showCheckbox}\n translations={translations.imagePreview}\n locale={locale}\n />\n ))}\n </StyledSearchResults>\n <StyledPaginationRoot\n page={page ?? 1}\n onPageChange={(details) => searchImages({ ...queryObject, page: details.page })}\n translations={translations.paginationTranslations}\n count={searchResult?.totalCount ?? 0}\n pageSize={searchResult?.pageSize}\n hidden={noResultsFound}\n >\n <PaginationPrevTrigger asChild>\n <StyledButton\n variant=\"tertiary\"\n aria-label={translations.paginationTranslations?.prevTriggerLabel}\n title={translations.paginationTranslations?.prevTriggerLabel}\n >\n <ArrowLeftShortLine />\n <span>{translations.paginationTranslations?.prevTriggerLabel}</span>\n </StyledButton>\n </PaginationPrevTrigger>\n <PaginationContext>\n {(pagination) =>\n pagination.pages.map((page, index, full) => {\n // Hide last page to not trigger RESULT_WINDOW_TOO_LARGE error\n if (index === full.length - 1) return null;\n return page.type === \"page\" ? (\n <StyledPaginationItem key={index} {...page} asChild>\n <Button variant={page.value === pagination.page ? \"primary\" : \"tertiary\"}>{page.value}</Button>\n </StyledPaginationItem>\n ) : (\n <PaginationEllipsis key={index} index={index} asChild>\n <Text asChild consumeCss>\n <div>&#8230;</div>\n </Text>\n </PaginationEllipsis>\n );\n })\n }\n </PaginationContext>\n <PaginationNextTrigger asChild>\n <StyledButton\n variant=\"tertiary\"\n aria-label={translations.paginationTranslations?.nextTriggerLabel}\n title={translations.paginationTranslations?.nextTriggerLabel}\n >\n <span>{translations.paginationTranslations?.nextTriggerLabel}</span>\n <ArrowRightShortLine />\n </StyledButton>\n </PaginationNextTrigger>\n </StyledPaginationRoot>\n </ImageSearchWrapper>\n );\n};\n\nexport default ImageSearch;\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { getPreviewSrcSets } from "./util/imageUtil.js";
2
- import { PreviewImage_default } from "./PreviewImage.js";
1
+ import { getPreviewSrcSets } from "./util/imageUtil.mjs";
2
+ import { PreviewImage_default } from "./PreviewImage.mjs";
3
3
  import { Button, Image, Text } from "@ndla/primitives";
4
4
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
5
  import { styled } from "@ndla/styled-system/jsx";
@@ -47,4 +47,4 @@ function ImageSearchResult({ image, onImageClick, selectedImage, onSelectImage,
47
47
 
48
48
  //#endregion
49
49
  export { ImageSearchResult };
50
- //# sourceMappingURL=ImageSearchResult.js.map
50
+ //# sourceMappingURL=ImageSearchResult.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageSearchResult.mjs","names":["PreviewImage"],"sources":["../src/ImageSearchResult.tsx"],"sourcesContent":["/**\n * Copyright (c) 2017-present, NDLA.\n *\n * This source code is licensed under the GPLv3 license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport { Text, Image, Button } from \"@ndla/primitives\";\nimport { styled } from \"@ndla/styled-system/jsx\";\nimport type { IImageMetaInformationV3DTO } from \"@ndla/types-backend/image-api\";\nimport type { PreviewTranslations } from \"./ImageSearch\";\nimport PreviewImage from \"./PreviewImage\";\nimport { getPreviewSrcSets } from \"./util/imageUtil\";\n\nconst StyledButton = styled(Button, {\n base: {\n display: \"flex\",\n flexDirection: \"column\",\n borderColor: \"stroke.subtle\",\n },\n});\n\nconst StyledImage = styled(Image, {\n base: {\n maxHeight: \"135px\",\n width: \"100%\",\n height: \"100%\",\n },\n});\n\nconst StyledText = styled(Text, {\n base: {\n lineClamp: \"3\",\n },\n});\n\ninterface Props {\n image: IImageMetaInformationV3DTO;\n onImageClick: (image: IImageMetaInformationV3DTO) => void;\n selectedImage?: IImageMetaInformationV3DTO;\n onSelectImage: (image: IImageMetaInformationV3DTO | undefined, saveAsMetaImage?: boolean) => void;\n showCheckbox: boolean;\n translations: PreviewTranslations;\n locale: string;\n}\n\nexport default function ImageSearchResult({\n image,\n onImageClick,\n selectedImage,\n onSelectImage,\n showCheckbox,\n translations,\n locale,\n}: Props) {\n const isSelectedImage = selectedImage?.id === image.id;\n return (\n <>\n <StyledButton\n variant={isSelectedImage ? \"secondary\" : \"tertiary\"}\n data-testid=\"select-image-from-list\"\n onClick={() => onImageClick(image)}\n aria-expanded={isSelectedImage}\n aria-controls={`image-preview-${image.id}`}\n >\n <StyledImage\n alt=\"\"\n srcSet={getPreviewSrcSets(image.image.imageUrl)}\n src={image.image.imageUrl}\n variant=\"rounded\"\n />\n <StyledText textStyle=\"label.medium\" asChild consumeCss>\n <span>\n {image.title.title.trim() ? image.title.title : (translations.missingTitleFallback ?? `ID: ${image.id}`)}\n </span>\n </StyledText>\n </StyledButton>\n {isSelectedImage ? (\n <PreviewImage\n id={`image-preview-${image.id}`}\n image={selectedImage}\n onSelectImage={onSelectImage}\n translations={translations}\n showCheckbox={showCheckbox}\n locale={locale}\n />\n ) : null}\n </>\n );\n}\n"],"mappings":";;;;;;;AAeA,MAAM,eAAe,OAAO,QAAQ,EAClC,MAAM;CACJ,SAAS;CACT,eAAe;CACf,aAAa;AACd,EACF,EAAC;AAEF,MAAM,cAAc,OAAO,OAAO,EAChC,MAAM;CACJ,WAAW;CACX,OAAO;CACP,QAAQ;AACT,EACF,EAAC;AAEF,MAAM,aAAa,OAAO,MAAM,EAC9B,MAAM,EACJ,WAAW,IACZ,EACF,EAAC;AAYF,SAAwB,kBAAkB,EACxC,OACA,cACA,eACA,eACA,cACA,cACA,QACM,EAAE;CACR,MAAM,kBAAkB,eAAe,OAAO,MAAM;AACpD,wBACE,4CACE,KAAC;EACC,SAAS,kBAAkB,cAAc;EACzC,eAAY;EACZ,SAAS,MAAM,aAAa,MAAM;EAClC,iBAAe;EACf,kBAAgB,gBAAgB,MAAM,GAAG;6BAEzC,IAAC;GACC,KAAI;GACJ,QAAQ,kBAAkB,MAAM,MAAM,SAAS;GAC/C,KAAK,MAAM,MAAM;GACjB,SAAQ;IACR,kBACF,IAAC;GAAW,WAAU;GAAe;GAAQ;6BAC3C,IAAC,oBACE,MAAM,MAAM,MAAM,MAAM,GAAG,MAAM,MAAM,QAAS,aAAa,yBAAyB,MAAM,MAAM,GAAG,IACjG;IACI;GACA,EACd,kCACC,IAACA;EACC,KAAK,gBAAgB,MAAM,GAAG;EAC9B,OAAO;EACQ;EACD;EACA;EACN;GACR,GACA,QACH;AAEN"}
@@ -1,5 +1,5 @@
1
- import { ImageMeta_default } from "./ImageMeta.js";
2
- import { getSrcSets } from "./util/imageUtil.js";
1
+ import { ImageMeta_default } from "./ImageMeta.mjs";
2
+ import { getSrcSets } from "./util/imageUtil.mjs";
3
3
  import { useState } from "react";
4
4
  import { Button, CheckboxControl, CheckboxHiddenInput, CheckboxIndicator, CheckboxLabel, CheckboxRoot, FieldRoot, IconButton, Image, Text } from "@ndla/primitives";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -122,4 +122,4 @@ var PreviewImage_default = PreviewImage;
122
122
 
123
123
  //#endregion
124
124
  export { PreviewImage_default };
125
- //# sourceMappingURL=PreviewImage.js.map
125
+ //# sourceMappingURL=PreviewImage.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PreviewImage.mjs","names":["ImageMeta"],"sources":["../src/PreviewImage.tsx"],"sourcesContent":["/**\n * Copyright (c) 2017-present, NDLA.\n *\n * This source code is licensed under the GPLv3 license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport { useState } from \"react\";\nimport { CloseLine, HashTag, CheckLine } from \"@ndla/icons\";\nimport { getModelReleaseValue } from \"@ndla/licenses\";\nimport {\n Button,\n CheckboxControl,\n CheckboxHiddenInput,\n CheckboxIndicator,\n CheckboxLabel,\n CheckboxRoot,\n Text,\n Image,\n IconButton,\n FieldRoot,\n} from \"@ndla/primitives\";\nimport { styled } from \"@ndla/styled-system/jsx\";\nimport type { IImageMetaInformationV3DTO } from \"@ndla/types-backend/image-api\";\nimport ImageMeta from \"./ImageMeta\";\nimport type { PreviewTranslations } from \"./ImageSearch\";\nimport { getSrcSets } from \"./util/imageUtil\";\n\nconst ImageContainer = styled(\"div\", {\n base: {\n flexShrink: \"0\",\n },\n});\n\nconst StyledImage = styled(Image, {\n base: {\n maxHeight: \"surface.xsmall\",\n },\n});\n\nconst StyledImageMetadata = styled(\"div\", {\n base: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"xxsmall\",\n },\n});\n\nconst HashTagWrapper = styled(\"ul\", {\n base: {\n display: \"flex\",\n gap: \"xxsmall\",\n flexWrap: \"wrap\",\n },\n});\n\nconst HashTagGroup = styled(\"div\", {\n base: {\n display: \"flex\",\n gap: \"xxsmall\",\n flexWrap: \"wrap\",\n },\n});\n\nconst StyledTagItem = styled(\"li\", {\n base: {\n display: \"flex\",\n alignItems: \"center\",\n },\n});\n\nconst StyledPreview = styled(\"div\", {\n base: {\n display: \"flex\",\n gridColumn: \"1 / -1\",\n borderColor: \"stroke.default\",\n border: \"1px solid\",\n borderRadius: \"xsmall\",\n gap: \"small\",\n padding: \"small\",\n flexWrap: \"wrap\",\n overflow: \"hidden\",\n },\n});\n\nconst StyledTopRow = styled(\"div\", {\n base: {\n display: \"flex\",\n justifyContent: \"space-between\",\n },\n});\n\nconst ContentWrapper = styled(\"div\", {\n base: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"medium\",\n flex: \"2\",\n },\n});\n\nconst ActionsWrapper = styled(\"div\", {\n base: {\n display: \"flex\",\n gap: \"small\",\n marginBlockEnd: \"medium\",\n },\n});\n\nconst StyledFieldRoot = styled(FieldRoot, {\n base: { alignSelf: \"center\" },\n});\n\ninterface Props {\n id: string;\n image: IImageMetaInformationV3DTO;\n onSelectImage: (image: IImageMetaInformationV3DTO | undefined, saveAsMetaImage?: boolean) => void;\n showCheckbox: boolean;\n translations: PreviewTranslations;\n locale: string;\n}\n\nconst PreviewImage = ({ id, image, onSelectImage, showCheckbox, translations, locale }: Props) => {\n const [saveAsMetaImage, setSaveAsMetaImage] = useState(false);\n\n return (\n <StyledPreview id={id}>\n <ImageContainer>\n <StyledImage\n alt=\"\"\n srcSet={getSrcSets(image.image.imageUrl)}\n sizes=\"(min-width: 800px) 360px, (min-width: 400px) 300px, 100vw\"\n src={image.image.imageUrl}\n aria-label={image.title.title}\n variant=\"rounded\"\n />\n </ImageContainer>\n <ContentWrapper>\n <StyledImageMetadata>\n <StyledTopRow>\n <Text textStyle=\"title.medium\">\n {image.title.title.trim() ? image.title.title : (translations.missingTitleFallback ?? `ID: ${image.id}`)}\n </Text>\n <IconButton\n variant=\"tertiary\"\n onClick={() => onSelectImage(undefined)}\n aria-label={translations.close}\n title={translations.close}\n >\n <CloseLine />\n </IconButton>\n </StyledTopRow>\n {!!image.copyright.creators.length && (\n <Text>\n <b>{`${translations.creatorsLabel}: `}</b>\n {image.copyright.creators.map((creator) => creator.name).join(\", \")}\n </Text>\n )}\n {!!image.copyright.license.description?.trim() && (\n <Text>\n <b>{`${translations.license}: `}</b>\n {image.copyright.license.description}\n </Text>\n )}\n {!!image.caption.caption.trim() && (\n <Text>\n <b>{`${translations.caption}: `}</b>\n {image.caption.caption}\n </Text>\n )}\n {!!image.alttext.alttext.trim() && (\n <Text>\n <b>{`${translations.altText}:`}</b> {image.alttext.alttext}\n </Text>\n )}\n {!!image.modelRelease.trim() && (\n <Text>\n <b>{`${translations.modelRelease}: `}</b>\n {getModelReleaseValue(image.modelRelease, locale)}\n </Text>\n )}\n <ImageMeta\n contentType={image.image.contentType}\n fileSize={image.image.size}\n imageDimensions={image.image.dimensions}\n locale={locale}\n />\n {!!image.tags.tags.length && (\n <HashTagGroup>\n <Text id=\"tags-title\">\n <b>{`${translations.tags}: `}</b>\n </Text>\n <HashTagWrapper aria-describedby=\"tags-title\">\n {image.tags.tags.map((tag) => (\n <StyledTagItem key={tag}>\n <HashTag size=\"small\" />\n {tag}\n </StyledTagItem>\n ))}\n </HashTagWrapper>\n </HashTagGroup>\n )}\n </StyledImageMetadata>\n <ActionsWrapper>\n <Button data-testid=\"use-image\" onClick={() => onSelectImage(image, saveAsMetaImage)}>\n {translations.useImageTitle}\n </Button>\n {!!showCheckbox && (\n <StyledFieldRoot>\n <CheckboxRoot checked={saveAsMetaImage} onCheckedChange={() => setSaveAsMetaImage((prev) => !prev)}>\n <CheckboxControl>\n <CheckboxIndicator asChild>\n <CheckLine />\n </CheckboxIndicator>\n </CheckboxControl>\n <CheckboxLabel>{translations.checkboxLabel}</CheckboxLabel>\n <CheckboxHiddenInput />\n </CheckboxRoot>\n </StyledFieldRoot>\n )}\n </ActionsWrapper>\n </ContentWrapper>\n </StyledPreview>\n );\n};\n\nexport default PreviewImage;\n"],"mappings":"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"}
package/es/index.mjs ADDED
@@ -0,0 +1,4 @@
1
+ import { ImageMeta_default } from "./ImageMeta.mjs";
2
+ import { ImageSearch_default } from "./ImageSearch.mjs";
3
+
4
+ export { ImageMeta_default as ImageMeta, ImageSearch_default as ImageSearch };
@@ -24,4 +24,4 @@ const getPreviewSrcSets = (imageUrl) => [
24
24
 
25
25
  //#endregion
26
26
  export { getPreviewSrcSets, getSrcSets };
27
- //# sourceMappingURL=imageUtil.js.map
27
+ //# sourceMappingURL=imageUtil.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imageUtil.mjs","names":["imageUrl: string"],"sources":["../../src/util/imageUtil.ts"],"sourcesContent":["/**\n * Copyright (c) 2017-present, NDLA.\n *\n * This source code is licensed under the GPLv3 license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n/* - Source sets for gallery search is retina-display optimized\n - Based on: https://www.smashingmagazine.com/2014/05/responsive-images-done-right-guide-picture-srcset/ */\n\nexport const getSrcSets = (imageUrl: string) =>\n [\n `${imageUrl}?width=1440 1440w`,\n `${imageUrl}?width=1120 1120w`,\n `${imageUrl}?width=1000 1000w`,\n `${imageUrl}?width=960 960w`,\n `${imageUrl}?width=800 800w`,\n `${imageUrl}?width=640 640w`,\n `${imageUrl}?width=480 480w`,\n `${imageUrl}?width=320 320w`,\n ].join(\", \");\n\nexport const getPreviewSrcSets = (imageUrl: string) =>\n [`${imageUrl}?width=480 3x`, `${imageUrl}?width=320 2x`, `${imageUrl}?width=160 1x`].join(\", \");\n"],"mappings":";;;;;;;;AAWA,MAAa,aAAa,CAACA,aACzB;EACG,EAAE,SAAS;EACX,EAAE,SAAS;EACX,EAAE,SAAS;EACX,EAAE,SAAS;EACX,EAAE,SAAS;EACX,EAAE,SAAS;EACX,EAAE,SAAS;EACX,EAAE,SAAS;AACb,EAAC,KAAK,KAAK;AAEd,MAAa,oBAAoB,CAACA,aAChC;EAAE,EAAE,SAAS;EAAiB,EAAE,SAAS;EAAiB,EAAE,SAAS;AAAe,EAAC,KAAK,KAAK"}
package/package.json CHANGED
@@ -1,11 +1,14 @@
1
1
  {
2
2
  "name": "@ndla/image-search",
3
- "version": "11.0.111-alpha.0",
3
+ "type": "module",
4
+ "version": "11.0.113-alpha.0",
4
5
  "description": "A simple library for searching images from NDLA",
5
6
  "license": "GPL-3.0",
6
- "main": "lib/index.js",
7
- "module": "es/index.js",
8
- "types": "lib/index.d.ts",
7
+ "exports": {
8
+ "types": "./lib/index.d.ts",
9
+ "import": "./es/index.mjs",
10
+ "require": "./lib/index.js"
11
+ },
9
12
  "scripts": {
10
13
  "build": "tsdown",
11
14
  "dev": "tsdown --watch ./src",
@@ -27,14 +30,14 @@
27
30
  "es"
28
31
  ],
29
32
  "dependencies": {
30
- "@ndla/icons": "^8.0.61-alpha.0",
31
- "@ndla/licenses": "^9.0.5",
32
- "@ndla/primitives": "^1.0.94-alpha.0",
33
- "@ndla/styled-system": "^0.0.35",
34
- "@ndla/util": "^5.0.9-alpha.0"
33
+ "@ndla/icons": "^8.0.63-alpha.0",
34
+ "@ndla/licenses": "^9.0.7",
35
+ "@ndla/primitives": "^1.0.96-alpha.0",
36
+ "@ndla/styled-system": "^0.0.37",
37
+ "@ndla/util": "^5.0.11-alpha.0"
35
38
  },
36
39
  "devDependencies": {
37
- "@ndla/preset-panda": "^0.0.56",
40
+ "@ndla/preset-panda": "^0.0.58",
38
41
  "@ndla/types-backend": "^1.0.50",
39
42
  "@pandacss/dev": "^0.53.6"
40
43
  },
@@ -45,5 +48,5 @@
45
48
  "publishConfig": {
46
49
  "access": "public"
47
50
  },
48
- "gitHead": "46128a37bf64bc68a8e25f6bda3453f3d35368d2"
51
+ "gitHead": "b9a3643909ea7b1b5c5d6799ae4b74914099d7bb"
49
52
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"ImageMeta.js","names":[],"sources":["../src/ImageMeta.tsx"],"sourcesContent":["/**\n * Copyright (c) 2022-present, NDLA.\n *\n * This source code is licensed under the GPLv3 license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport { useMemo } from \"react\";\nimport { Text } from \"@ndla/primitives\";\nimport type { IImageDimensionsDTO } from \"@ndla/types-backend/image-api\";\nimport { humanFileSize } from \"@ndla/util\";\n\ninterface Props {\n contentType: string;\n fileSize: number;\n imageDimensions?: IImageDimensionsDTO;\n locale: string;\n}\n\nconst ImageMeta = ({ contentType, fileSize, imageDimensions, locale }: Props) => {\n const prettySize = useMemo(() => {\n return humanFileSize(fileSize, locale);\n }, [fileSize, locale]);\n\n const dimensions = imageDimensions ? ` - ${imageDimensions.width}x${imageDimensions.height} px` : \"\";\n return <Text>{`${contentType} - ${prettySize}${dimensions}`}</Text>;\n};\n\nexport default ImageMeta;\n"],"mappings":";;;;;;AAoBA,MAAM,YAAY,CAAC,EAAE,aAAa,UAAU,iBAAiB,QAAe,KAAK;CAC/E,MAAM,aAAa,QAAQ,MAAM;AAC/B,SAAO,cAAc,UAAU,OAAO;CACvC,GAAE,CAAC,UAAU,MAAO,EAAC;CAEtB,MAAM,aAAa,mBAAmB,KAAK,gBAAgB,MAAM,GAAG,gBAAgB,OAAO,OAAO;AAClG,wBAAO,IAAC,mBAAO,EAAE,YAAY,KAAK,WAAW,EAAE,WAAW,IAAS;AACpE;AAED,wBAAe"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ImageSearch.js","names":["image: IImageMetaInformationV3DTO | undefined","saveAsMetaImage?: boolean","queryObject: ISearchParamsDTO","queryObject","e: KeyboardEvent<HTMLInputElement | HTMLButtonElement>","image","page"],"sources":["../src/ImageSearch.tsx"],"sourcesContent":["/**\n * Copyright (c) 2017-present, NDLA.\n *\n * This source code is licensed under the GPLv3 license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport { type ChangeEvent, type ReactNode, type KeyboardEvent, useEffect, useState } from \"react\";\nimport { ArrowLeftShortLine, ArrowRightShortLine, SearchLine } from \"@ndla/icons\";\nimport {\n Button,\n IconButton,\n Input,\n PaginationContext,\n PaginationEllipsis,\n PaginationItem,\n PaginationNextTrigger,\n PaginationPrevTrigger,\n PaginationRoot,\n Text,\n type PaginationRootProps,\n} from \"@ndla/primitives\";\nimport { styled } from \"@ndla/styled-system/jsx\";\nimport type { IImageMetaInformationV3DTO, ISearchResultV3DTO, ISearchParamsDTO } from \"@ndla/types-backend/image-api\";\nimport ImageSearchResult from \"./ImageSearchResult\";\n\nconst ImageSearchWrapper = styled(\"div\", {\n base: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"small\",\n },\n});\n\nconst StyledSearchResults = styled(\"div\", {\n base: {\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fit, minmax(200px, 1fr))\",\n gridGap: \"xsmall\",\n gridAutoFlow: \"dense\",\n },\n});\n\nconst InputWrapper = styled(\"div\", {\n base: {\n display: \"flex\",\n gap: \"xsmall\",\n },\n});\n\nconst StyledPaginationRoot = styled(PaginationRoot, {\n base: {\n flexWrap: \"wrap\",\n },\n});\n\nconst StyledButton = styled(Button, {\n base: {\n tabletWideDown: {\n paddingInline: \"xsmall\",\n \"& span\": {\n display: \"none\",\n },\n },\n },\n});\n\nconst StyledPaginationItem = styled(PaginationItem, {\n base: {\n tabletWideDown: {\n \"&:nth-child(2)\": {\n display: \"none\",\n },\n \"&:nth-last-child(2)\": {\n display: \"none\",\n },\n },\n },\n});\n\nexport interface PreviewTranslations {\n creatorsLabel: string;\n license: string;\n caption: string;\n altText: string;\n modelRelease: string;\n tags: string;\n close: string;\n checkboxLabel?: string;\n missingTitleFallback?: string;\n useImageTitle: string;\n}\n\nexport interface ImageSearchTranslations {\n searchPlaceholder: string;\n searchButtonTitle: string;\n imagePreview: PreviewTranslations;\n paginationTranslations: PaginationRootProps[\"translations\"];\n}\n\nexport interface ImageSearchProps {\n onImageSelect: (image: IImageMetaInformationV3DTO) => void;\n searchImages: (query: string | undefined, page: number | undefined) => Promise<ISearchResultV3DTO>;\n onError?: (err: any) => void;\n locale: string;\n noResults?: ReactNode;\n checkboxAction?: (image: IImageMetaInformationV3DTO) => void;\n showCheckbox?: boolean;\n translations: ImageSearchTranslations;\n}\n\nconst ImageSearch = ({\n onImageSelect,\n searchImages: search,\n onError,\n locale,\n noResults,\n checkboxAction,\n showCheckbox,\n translations,\n}: ImageSearchProps) => {\n const [queryObject, setQueryObject] = useState<ISearchParamsDTO>({\n query: undefined,\n page: 1,\n pageSize: 16,\n });\n const [selectedImage, setSelectedImage] = useState<IImageMetaInformationV3DTO | undefined>();\n const [searching, setSearching] = useState<boolean>(false);\n const [searchResult, setSearchResult] = useState<ISearchResultV3DTO | undefined>();\n\n const { page } = queryObject;\n const noResultsFound = !searching && searchResult?.results.length === 0;\n\n const onSelectImage = (image: IImageMetaInformationV3DTO | undefined, saveAsMetaImage?: boolean) => {\n setSelectedImage(undefined);\n if (!image) return;\n onImageSelect(image);\n if (saveAsMetaImage) {\n checkboxAction?.(image);\n }\n };\n\n const searchImages = (queryObject: ISearchParamsDTO) => {\n setSearching(true);\n search(queryObject.query, queryObject.page)\n .then((result) => {\n setQueryObject({\n query: queryObject.query,\n pageSize: result.pageSize,\n page: queryObject.page,\n });\n setSearchResult(result);\n setSearching(false);\n })\n .catch((err) => {\n onError?.(err);\n setSearching(false);\n });\n };\n\n const handleQueryChange = ({ target: { value } }: ChangeEvent<HTMLInputElement>) => {\n setQueryObject((prevState) => ({\n ...prevState,\n query: value,\n }));\n };\n\n const onEnter = (e: KeyboardEvent<HTMLInputElement | HTMLButtonElement>) => {\n if (e.key === \"Enter\") {\n searchImages(queryObject);\n }\n };\n\n useEffect(() => {\n searchImages(queryObject);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <ImageSearchWrapper>\n <InputWrapper role=\"search\">\n <Input\n type=\"search\"\n placeholder={translations.searchPlaceholder}\n value={queryObject?.query ?? \"\"}\n onChange={handleQueryChange}\n onKeyDown={onEnter}\n />\n <IconButton\n variant=\"primary\"\n aria-label={translations.searchButtonTitle}\n title={translations.searchButtonTitle}\n onKeyDown={onEnter}\n onClick={() => searchImages(queryObject)}\n >\n <SearchLine />\n </IconButton>\n </InputWrapper>\n {!!noResultsFound && noResults}\n <StyledSearchResults>\n {searchResult?.results.map((image) => (\n <ImageSearchResult\n key={image.id}\n image={image}\n onImageClick={(image) => setSelectedImage(image)}\n selectedImage={selectedImage}\n onSelectImage={onSelectImage}\n showCheckbox={!!showCheckbox}\n translations={translations.imagePreview}\n locale={locale}\n />\n ))}\n </StyledSearchResults>\n <StyledPaginationRoot\n page={page ?? 1}\n onPageChange={(details) => searchImages({ ...queryObject, page: details.page })}\n translations={translations.paginationTranslations}\n count={searchResult?.totalCount ?? 0}\n pageSize={searchResult?.pageSize}\n hidden={noResultsFound}\n >\n <PaginationPrevTrigger asChild>\n <StyledButton\n variant=\"tertiary\"\n aria-label={translations.paginationTranslations?.prevTriggerLabel}\n title={translations.paginationTranslations?.prevTriggerLabel}\n >\n <ArrowLeftShortLine />\n <span>{translations.paginationTranslations?.prevTriggerLabel}</span>\n </StyledButton>\n </PaginationPrevTrigger>\n <PaginationContext>\n {(pagination) =>\n pagination.pages.map((page, index, full) => {\n // Hide last page to not trigger RESULT_WINDOW_TOO_LARGE error\n if (index === full.length - 1) return null;\n return page.type === \"page\" ? (\n <StyledPaginationItem key={index} {...page} asChild>\n <Button variant={page.value === pagination.page ? \"primary\" : \"tertiary\"}>{page.value}</Button>\n </StyledPaginationItem>\n ) : (\n <PaginationEllipsis key={index} index={index} asChild>\n <Text asChild consumeCss>\n <div>&#8230;</div>\n </Text>\n </PaginationEllipsis>\n );\n })\n }\n </PaginationContext>\n <PaginationNextTrigger asChild>\n <StyledButton\n variant=\"tertiary\"\n aria-label={translations.paginationTranslations?.nextTriggerLabel}\n title={translations.paginationTranslations?.nextTriggerLabel}\n >\n <span>{translations.paginationTranslations?.nextTriggerLabel}</span>\n <ArrowRightShortLine />\n </StyledButton>\n </PaginationNextTrigger>\n </StyledPaginationRoot>\n </ImageSearchWrapper>\n );\n};\n\nexport default ImageSearch;\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ImageSearchResult.js","names":["PreviewImage"],"sources":["../src/ImageSearchResult.tsx"],"sourcesContent":["/**\n * Copyright (c) 2017-present, NDLA.\n *\n * This source code is licensed under the GPLv3 license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport { Text, Image, Button } from \"@ndla/primitives\";\nimport { styled } from \"@ndla/styled-system/jsx\";\nimport type { IImageMetaInformationV3DTO } from \"@ndla/types-backend/image-api\";\nimport type { PreviewTranslations } from \"./ImageSearch\";\nimport PreviewImage from \"./PreviewImage\";\nimport { getPreviewSrcSets } from \"./util/imageUtil\";\n\nconst StyledButton = styled(Button, {\n base: {\n display: \"flex\",\n flexDirection: \"column\",\n borderColor: \"stroke.subtle\",\n },\n});\n\nconst StyledImage = styled(Image, {\n base: {\n maxHeight: \"135px\",\n width: \"100%\",\n height: \"100%\",\n },\n});\n\nconst StyledText = styled(Text, {\n base: {\n lineClamp: \"3\",\n },\n});\n\ninterface Props {\n image: IImageMetaInformationV3DTO;\n onImageClick: (image: IImageMetaInformationV3DTO) => void;\n selectedImage?: IImageMetaInformationV3DTO;\n onSelectImage: (image: IImageMetaInformationV3DTO | undefined, saveAsMetaImage?: boolean) => void;\n showCheckbox: boolean;\n translations: PreviewTranslations;\n locale: string;\n}\n\nexport default function ImageSearchResult({\n image,\n onImageClick,\n selectedImage,\n onSelectImage,\n showCheckbox,\n translations,\n locale,\n}: Props) {\n const isSelectedImage = selectedImage?.id === image.id;\n return (\n <>\n <StyledButton\n variant={isSelectedImage ? \"secondary\" : \"tertiary\"}\n data-testid=\"select-image-from-list\"\n onClick={() => onImageClick(image)}\n aria-expanded={isSelectedImage}\n aria-controls={`image-preview-${image.id}`}\n >\n <StyledImage\n alt=\"\"\n srcSet={getPreviewSrcSets(image.image.imageUrl)}\n src={image.image.imageUrl}\n variant=\"rounded\"\n />\n <StyledText textStyle=\"label.medium\" asChild consumeCss>\n <span>\n {image.title.title.trim() ? image.title.title : (translations.missingTitleFallback ?? `ID: ${image.id}`)}\n </span>\n </StyledText>\n </StyledButton>\n {isSelectedImage ? (\n <PreviewImage\n id={`image-preview-${image.id}`}\n image={selectedImage}\n onSelectImage={onSelectImage}\n translations={translations}\n showCheckbox={showCheckbox}\n locale={locale}\n />\n ) : null}\n </>\n );\n}\n"],"mappings":";;;;;;;AAeA,MAAM,eAAe,OAAO,QAAQ,EAClC,MAAM;CACJ,SAAS;CACT,eAAe;CACf,aAAa;AACd,EACF,EAAC;AAEF,MAAM,cAAc,OAAO,OAAO,EAChC,MAAM;CACJ,WAAW;CACX,OAAO;CACP,QAAQ;AACT,EACF,EAAC;AAEF,MAAM,aAAa,OAAO,MAAM,EAC9B,MAAM,EACJ,WAAW,IACZ,EACF,EAAC;AAYF,SAAwB,kBAAkB,EACxC,OACA,cACA,eACA,eACA,cACA,cACA,QACM,EAAE;CACR,MAAM,kBAAkB,eAAe,OAAO,MAAM;AACpD,wBACE,4CACE,KAAC;EACC,SAAS,kBAAkB,cAAc;EACzC,eAAY;EACZ,SAAS,MAAM,aAAa,MAAM;EAClC,iBAAe;EACf,kBAAgB,gBAAgB,MAAM,GAAG;6BAEzC,IAAC;GACC,KAAI;GACJ,QAAQ,kBAAkB,MAAM,MAAM,SAAS;GAC/C,KAAK,MAAM,MAAM;GACjB,SAAQ;IACR,kBACF,IAAC;GAAW,WAAU;GAAe;GAAQ;6BAC3C,IAAC,oBACE,MAAM,MAAM,MAAM,MAAM,GAAG,MAAM,MAAM,QAAS,aAAa,yBAAyB,MAAM,MAAM,GAAG,IACjG;IACI;GACA,EACd,kCACC,IAACA;EACC,KAAK,gBAAgB,MAAM,GAAG;EAC9B,OAAO;EACQ;EACD;EACA;EACN;GACR,GACA,QACH;AAEN"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"PreviewImage.js","names":["ImageMeta"],"sources":["../src/PreviewImage.tsx"],"sourcesContent":["/**\n * Copyright (c) 2017-present, NDLA.\n *\n * This source code is licensed under the GPLv3 license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport { useState } from \"react\";\nimport { CloseLine, HashTag, CheckLine } from \"@ndla/icons\";\nimport { getModelReleaseValue } from \"@ndla/licenses\";\nimport {\n Button,\n CheckboxControl,\n CheckboxHiddenInput,\n CheckboxIndicator,\n CheckboxLabel,\n CheckboxRoot,\n Text,\n Image,\n IconButton,\n FieldRoot,\n} from \"@ndla/primitives\";\nimport { styled } from \"@ndla/styled-system/jsx\";\nimport type { IImageMetaInformationV3DTO } from \"@ndla/types-backend/image-api\";\nimport ImageMeta from \"./ImageMeta\";\nimport type { PreviewTranslations } from \"./ImageSearch\";\nimport { getSrcSets } from \"./util/imageUtil\";\n\nconst ImageContainer = styled(\"div\", {\n base: {\n flexShrink: \"0\",\n },\n});\n\nconst StyledImage = styled(Image, {\n base: {\n maxHeight: \"surface.xsmall\",\n },\n});\n\nconst StyledImageMetadata = styled(\"div\", {\n base: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"xxsmall\",\n },\n});\n\nconst HashTagWrapper = styled(\"ul\", {\n base: {\n display: \"flex\",\n gap: \"xxsmall\",\n flexWrap: \"wrap\",\n },\n});\n\nconst HashTagGroup = styled(\"div\", {\n base: {\n display: \"flex\",\n gap: \"xxsmall\",\n flexWrap: \"wrap\",\n },\n});\n\nconst StyledTagItem = styled(\"li\", {\n base: {\n display: \"flex\",\n alignItems: \"center\",\n },\n});\n\nconst StyledPreview = styled(\"div\", {\n base: {\n display: \"flex\",\n gridColumn: \"1 / -1\",\n borderColor: \"stroke.default\",\n border: \"1px solid\",\n borderRadius: \"xsmall\",\n gap: \"small\",\n padding: \"small\",\n flexWrap: \"wrap\",\n overflow: \"hidden\",\n },\n});\n\nconst StyledTopRow = styled(\"div\", {\n base: {\n display: \"flex\",\n justifyContent: \"space-between\",\n },\n});\n\nconst ContentWrapper = styled(\"div\", {\n base: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"medium\",\n flex: \"2\",\n },\n});\n\nconst ActionsWrapper = styled(\"div\", {\n base: {\n display: \"flex\",\n gap: \"small\",\n marginBlockEnd: \"medium\",\n },\n});\n\nconst StyledFieldRoot = styled(FieldRoot, {\n base: { alignSelf: \"center\" },\n});\n\ninterface Props {\n id: string;\n image: IImageMetaInformationV3DTO;\n onSelectImage: (image: IImageMetaInformationV3DTO | undefined, saveAsMetaImage?: boolean) => void;\n showCheckbox: boolean;\n translations: PreviewTranslations;\n locale: string;\n}\n\nconst PreviewImage = ({ id, image, onSelectImage, showCheckbox, translations, locale }: Props) => {\n const [saveAsMetaImage, setSaveAsMetaImage] = useState(false);\n\n return (\n <StyledPreview id={id}>\n <ImageContainer>\n <StyledImage\n alt=\"\"\n srcSet={getSrcSets(image.image.imageUrl)}\n sizes=\"(min-width: 800px) 360px, (min-width: 400px) 300px, 100vw\"\n src={image.image.imageUrl}\n aria-label={image.title.title}\n variant=\"rounded\"\n />\n </ImageContainer>\n <ContentWrapper>\n <StyledImageMetadata>\n <StyledTopRow>\n <Text textStyle=\"title.medium\">\n {image.title.title.trim() ? image.title.title : (translations.missingTitleFallback ?? `ID: ${image.id}`)}\n </Text>\n <IconButton\n variant=\"tertiary\"\n onClick={() => onSelectImage(undefined)}\n aria-label={translations.close}\n title={translations.close}\n >\n <CloseLine />\n </IconButton>\n </StyledTopRow>\n {!!image.copyright.creators.length && (\n <Text>\n <b>{`${translations.creatorsLabel}: `}</b>\n {image.copyright.creators.map((creator) => creator.name).join(\", \")}\n </Text>\n )}\n {!!image.copyright.license.description?.trim() && (\n <Text>\n <b>{`${translations.license}: `}</b>\n {image.copyright.license.description}\n </Text>\n )}\n {!!image.caption.caption.trim() && (\n <Text>\n <b>{`${translations.caption}: `}</b>\n {image.caption.caption}\n </Text>\n )}\n {!!image.alttext.alttext.trim() && (\n <Text>\n <b>{`${translations.altText}:`}</b> {image.alttext.alttext}\n </Text>\n )}\n {!!image.modelRelease.trim() && (\n <Text>\n <b>{`${translations.modelRelease}: `}</b>\n {getModelReleaseValue(image.modelRelease, locale)}\n </Text>\n )}\n <ImageMeta\n contentType={image.image.contentType}\n fileSize={image.image.size}\n imageDimensions={image.image.dimensions}\n locale={locale}\n />\n {!!image.tags.tags.length && (\n <HashTagGroup>\n <Text id=\"tags-title\">\n <b>{`${translations.tags}: `}</b>\n </Text>\n <HashTagWrapper aria-describedby=\"tags-title\">\n {image.tags.tags.map((tag) => (\n <StyledTagItem key={tag}>\n <HashTag size=\"small\" />\n {tag}\n </StyledTagItem>\n ))}\n </HashTagWrapper>\n </HashTagGroup>\n )}\n </StyledImageMetadata>\n <ActionsWrapper>\n <Button data-testid=\"use-image\" onClick={() => onSelectImage(image, saveAsMetaImage)}>\n {translations.useImageTitle}\n </Button>\n {!!showCheckbox && (\n <StyledFieldRoot>\n <CheckboxRoot checked={saveAsMetaImage} onCheckedChange={() => setSaveAsMetaImage((prev) => !prev)}>\n <CheckboxControl>\n <CheckboxIndicator asChild>\n <CheckLine />\n </CheckboxIndicator>\n </CheckboxControl>\n <CheckboxLabel>{translations.checkboxLabel}</CheckboxLabel>\n <CheckboxHiddenInput />\n </CheckboxRoot>\n </StyledFieldRoot>\n )}\n </ActionsWrapper>\n </ContentWrapper>\n </StyledPreview>\n );\n};\n\nexport default PreviewImage;\n"],"mappings":"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"}
package/es/index.js DELETED
@@ -1,4 +0,0 @@
1
- import { ImageMeta_default } from "./ImageMeta.js";
2
- import { ImageSearch_default } from "./ImageSearch.js";
3
-
4
- export { ImageMeta_default as ImageMeta, ImageSearch_default as ImageSearch };
@@ -1 +0,0 @@
1
- {"version":3,"file":"imageUtil.js","names":["imageUrl: string"],"sources":["../../src/util/imageUtil.ts"],"sourcesContent":["/**\n * Copyright (c) 2017-present, NDLA.\n *\n * This source code is licensed under the GPLv3 license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n/* - Source sets for gallery search is retina-display optimized\n - Based on: https://www.smashingmagazine.com/2014/05/responsive-images-done-right-guide-picture-srcset/ */\n\nexport const getSrcSets = (imageUrl: string) =>\n [\n `${imageUrl}?width=1440 1440w`,\n `${imageUrl}?width=1120 1120w`,\n `${imageUrl}?width=1000 1000w`,\n `${imageUrl}?width=960 960w`,\n `${imageUrl}?width=800 800w`,\n `${imageUrl}?width=640 640w`,\n `${imageUrl}?width=480 480w`,\n `${imageUrl}?width=320 320w`,\n ].join(\", \");\n\nexport const getPreviewSrcSets = (imageUrl: string) =>\n [`${imageUrl}?width=480 3x`, `${imageUrl}?width=320 2x`, `${imageUrl}?width=160 1x`].join(\", \");\n"],"mappings":";;;;;;;;AAWA,MAAa,aAAa,CAACA,aACzB;EACG,EAAE,SAAS;EACX,EAAE,SAAS;EACX,EAAE,SAAS;EACX,EAAE,SAAS;EACX,EAAE,SAAS;EACX,EAAE,SAAS;EACX,EAAE,SAAS;EACX,EAAE,SAAS;AACb,EAAC,KAAK,KAAK;AAEd,MAAa,oBAAoB,CAACA,aAChC;EAAE,EAAE,SAAS;EAAiB,EAAE,SAAS;EAAiB,EAAE,SAAS;AAAe,EAAC,KAAK,KAAK"}