construct-hub-webapp 0.1.248 → 0.1.252
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.
- package/build/asset-manifest.json +41 -39
- package/build/index.html +1 -1
- package/build/service-worker.js +1 -1
- package/build/service-worker.js.map +1 -1
- package/build/static/js/{0.3c441159.chunk.js → 0.eac96593.chunk.js} +2 -2
- package/build/static/js/{0.3c441159.chunk.js.map → 0.eac96593.chunk.js.map} +1 -1
- package/build/static/js/1.f1cf5c72.chunk.js +2 -0
- package/build/static/js/1.f1cf5c72.chunk.js.map +1 -0
- package/build/static/js/10.67470f34.chunk.js +2 -0
- package/build/static/js/10.67470f34.chunk.js.map +1 -0
- package/build/static/js/{11.3e7ab347.chunk.js → 11.7a407d94.chunk.js} +3 -3
- package/build/static/js/{11.3e7ab347.chunk.js.LICENSE.txt → 11.7a407d94.chunk.js.LICENSE.txt} +0 -0
- package/build/static/js/{11.3e7ab347.chunk.js.map → 11.7a407d94.chunk.js.map} +1 -1
- package/build/static/js/12.6ec7141c.chunk.js +2 -0
- package/build/static/js/12.6ec7141c.chunk.js.map +1 -0
- package/build/static/js/{12.180c2643.chunk.js → 13.6a8b9e20.chunk.js} +2 -2
- package/build/static/js/{12.180c2643.chunk.js.map → 13.6a8b9e20.chunk.js.map} +1 -1
- package/build/static/js/{13.51138a32.chunk.js → 14.024c1a38.chunk.js} +2 -2
- package/build/static/js/{13.51138a32.chunk.js.map → 14.024c1a38.chunk.js.map} +1 -1
- package/build/static/js/{14.04d06b74.chunk.js → 15.ed72dbe0.chunk.js} +3 -3
- package/build/static/js/{14.04d06b74.chunk.js.LICENSE.txt → 15.ed72dbe0.chunk.js.LICENSE.txt} +0 -0
- package/build/static/js/{14.04d06b74.chunk.js.map → 15.ed72dbe0.chunk.js.map} +1 -1
- package/build/static/js/{15.a6d03254.chunk.js → 16.5f5aad89.chunk.js} +2 -2
- package/build/static/js/{15.a6d03254.chunk.js.map → 16.5f5aad89.chunk.js.map} +1 -1
- package/build/static/js/{3.c48117e3.chunk.js → 4.33ed4462.chunk.js} +3 -3
- package/build/static/js/{3.c48117e3.chunk.js.LICENSE.txt → 4.33ed4462.chunk.js.LICENSE.txt} +0 -0
- package/build/static/js/{3.c48117e3.chunk.js.map → 4.33ed4462.chunk.js.map} +1 -1
- package/build/static/js/{4.07f80d65.chunk.js → 5.31f776a0.chunk.js} +3 -3
- package/build/static/js/{4.07f80d65.chunk.js.LICENSE.txt → 5.31f776a0.chunk.js.LICENSE.txt} +0 -0
- package/build/static/js/5.31f776a0.chunk.js.map +1 -0
- package/build/static/js/6.cb540adf.chunk.js +2 -0
- package/build/static/js/6.cb540adf.chunk.js.map +1 -0
- package/build/static/js/{8.0c7361ec.chunk.js → 7.415d3d06.chunk.js} +2 -2
- package/build/static/js/{8.0c7361ec.chunk.js.map → 7.415d3d06.chunk.js.map} +1 -1
- package/build/static/js/{9.6620eb5b.chunk.js → 8.24ecd2ff.chunk.js} +2 -2
- package/build/static/js/{9.6620eb5b.chunk.js.map → 8.24ecd2ff.chunk.js.map} +1 -1
- package/build/static/js/9.214e3382.chunk.js +2 -0
- package/build/static/js/9.214e3382.chunk.js.map +1 -0
- package/build/static/js/main.e071d0b6.chunk.js +2 -0
- package/build/static/js/{main.809e79d6.chunk.js.map → main.e071d0b6.chunk.js.map} +1 -1
- package/build/static/js/runtime-main.0ec50908.js +2 -0
- package/build/static/js/runtime-main.0ec50908.js.map +1 -0
- package/package.json +4 -4
- package/build/static/js/10.5038f4e4.chunk.js +0 -2
- package/build/static/js/10.5038f4e4.chunk.js.map +0 -1
- package/build/static/js/4.07f80d65.chunk.js.map +0 -1
- package/build/static/js/5.8a1668dc.chunk.js +0 -2
- package/build/static/js/5.8a1668dc.chunk.js.map +0 -1
- package/build/static/js/6.11aee62c.chunk.js +0 -2
- package/build/static/js/6.11aee62c.chunk.js.map +0 -1
- package/build/static/js/7.c53ed1ae.chunk.js +0 -2
- package/build/static/js/7.c53ed1ae.chunk.js.map +0 -1
- package/build/static/js/main.809e79d6.chunk.js +0 -2
- package/build/static/js/runtime-main.1cbbf81f.js +0 -2
- package/build/static/js/runtime-main.1cbbf81f.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["constants/pageInfo.ts","components/Page/Page.tsx","components/Picture/Picture.tsx","components/PackageList/PackageList.tsx","components/PackageList/CompactCardList.tsx","components/PackageList/WideCardList.tsx","../../../src/image.tsx","../../../src/use-image.ts","../../../src/input-group.tsx","../../../src/input-element.tsx","views/HomeRedesign/Hero.tsx","views/HomeRedesign/InfoSection.tsx","views/HomeRedesign/InfoPanel.tsx","views/HomeRedesign/HomeRedesign.tsx"],"names":["pageInfo","home","event","name","faq","packageProfile","search","siteTerms","notFound","page","pageType","Page","children","meta","pageName","trackPageView","usePageView","useEffect","suffix","title","description","formattedTitle","Helmet","process","content","charSet","property","Picture","forwardRef","ref","sources","props","as","map","source","idx","media","srcSet","displayName","listViews","PackageCardType","Compact","items","autoRows","gap","templateColumns","pkg","PackageCard","variant","version","Wide","spacing","PackageList","memo","cardView","loading","size","View","NativeImage","alt","width","height","Image","crossOrigin","shouldIgnore","fallbackSrc","fallback","status","ignoreFallback","useState","setStatus","src","imageRef","useRef","load","useCallback","flush","img","onLoad","error","onError","sizes","useSafeLayoutEffect","useImage","shared","objectFit","objectPosition","align","rest","omit","className","InputGroup","styles","useMultiStyleConfig","omitThemingProps","_className","cx","groupStyles","validChildren","getValidChildren","input","child","clones","theming","React","Object","__css","display","position","value","StyledElement","chakra","baseStyle","alignItems","justifyContent","top","zIndex","InputElement","placement","useStyles","attr","elementStyles","fontSize","InputLeftElement","InputRightElement","Hero","bg","color","direction","justify","py","mt","borderBottom","borderBottomColor","Form","placeholder","Search","InfoSection","InfoPanel","Card","borderRadius","boxShadow","h","p","justifyItems","sx","mr","wrap","HomeRedesign","useCardView","CardViewControls","useCatalogResults","limit","displayable","pl","templateRows","mb"],"mappings":"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","file":"static/js/8.0c7361ec.chunk.js","sourcesContent":["export const pageInfo = {\n home: {\n event: {\n name: \"Home Load\",\n },\n },\n faq: {\n event: {\n name: \"Frequently Asked Questions Load\",\n },\n },\n packageProfile: {\n event: {\n name: \"Package Profile Load\",\n },\n },\n search: {\n event: {\n name: \"Search Load\",\n },\n },\n siteTerms: {\n event: {\n name: \"Site Terms Load\",\n },\n },\n notFound: {\n page: {\n pageType: \"errorPage\",\n },\n event: {\n name: \"404 Page Load\",\n },\n },\n} as const;\n","import { FunctionComponent, useEffect } from \"react\";\nimport { Helmet } from \"react-helmet\";\nimport { pageInfo } from \"../../constants/pageInfo\";\nimport { usePageView } from \"../../contexts/Analytics\";\n\nexport interface PageProps {\n pageName: keyof typeof pageInfo;\n meta: {\n suffix?: boolean;\n title: string;\n description: string;\n };\n}\n\nexport const Page: FunctionComponent<PageProps> = ({\n children,\n meta,\n pageName,\n}) => {\n const trackPageView = usePageView(pageInfo[pageName]);\n\n useEffect(() => {\n trackPageView();\n }, [trackPageView]);\n\n const { suffix = true, title, description } = meta;\n const formattedTitle = suffix ? `${title} - Construct Hub` : title;\n\n return (\n <>\n <Helmet>\n {process.env.NODE_ENV === \"development\" && (\n <meta\n content=\"default-src 'self' 'unsafe-inline' https://*.awsstatic.com https://amazonwebservices.d2.sc.omtrdc.net; connect-src 'self' https://*.shortbread.aws.dev ws://localhost:3000 https://*.awsstatic.com https://amazonwebservices.d2.sc.omtrdc.net; frame-src 'none'; img-src 'self' https://* http://*.omtrdc.net; object-src 'none'; style-src 'self' 'unsafe-inline';\"\n httpEquiv=\"Content-Security-Policy\"\n />\n )}\n\n <meta content=\"width=device-width, initial-scale=1\" name=\"viewport\" />\n <meta charSet=\"utf-8\" />\n\n <title>{formattedTitle}</title>\n <meta content={formattedTitle} property=\"og:title\" />\n <meta content={formattedTitle} name=\"twitter:title\" />\n <meta content=\"summary\" name=\"twitter:card\" />\n\n <meta content={description} name=\"description\" />\n <meta content={description} property=\"og:description\" />\n <meta content={description} name=\"twitter:description\" />\n </Helmet>\n {children}\n </>\n );\n};\n","import { Box, HTMLChakraProps, forwardRef, Image } from \"@chakra-ui/react\";\n\nexport interface PictureProps extends HTMLChakraProps<\"img\"> {\n alt: string;\n src: string;\n sources?: {\n media?: string;\n srcSet: string;\n }[];\n}\n\nexport const Picture = forwardRef<PictureProps, \"img\">(\n ({ sources, ...props }, ref) => (\n <Box as=\"picture\">\n {sources?.map((source, idx) => (\n <source key={idx} media={source.media} srcSet={source.srcSet} />\n ))}\n <Image ref={ref} {...props} />\n </Box>\n )\n);\n\nPicture.displayName = \"Picture\";\n","import { Center, Spinner } from \"@chakra-ui/react\";\nimport { FunctionComponent, memo } from \"react\";\nimport { CatalogPackage } from \"../../api/package/packages\";\nimport { PackageCardType } from \"../PackageCard\";\nimport { CompactCardList } from \"./CompactCardList\";\nimport { WideCardList } from \"./WideCardList\";\n\nconst listViews = {\n [PackageCardType.Compact]: CompactCardList,\n [PackageCardType.Wide]: WideCardList,\n};\n\nexport interface PackageListViewProps {\n items: CatalogPackage[];\n}\n\nexport interface PackageListProps extends Partial<PackageListViewProps> {\n cardView?: PackageCardType;\n loading?: boolean;\n title?: string;\n}\n\nexport const PackageList: FunctionComponent<PackageListProps> = memo(\n ({\n cardView = PackageCardType.Wide,\n items,\n loading,\n // title,\n }) => {\n if (loading || !items) {\n return (\n <Center>\n <Spinner size=\"xl\" />\n </Center>\n );\n }\n\n const View = listViews[cardView];\n\n return <View items={items} />;\n }\n);\n\nPackageList.displayName = \"PackageList\";\n","import { Grid } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { PackageCard, PackageCardType } from \"../PackageCard\";\nimport { PackageListViewProps } from \"./PackageList\";\n\nexport const CompactCardList: FunctionComponent<PackageListViewProps> = ({\n items,\n}) => {\n return (\n <Grid\n autoRows=\"auto\"\n gap={5}\n templateColumns=\"repeat(auto-fit, minmax(320px, 1fr))\"\n >\n {items.map((pkg) => (\n <PackageCard\n key={`${pkg.name}-${pkg.version}`}\n pkg={pkg}\n variant={PackageCardType.Compact}\n />\n ))}\n </Grid>\n );\n};\n","import { Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { PackageCard, PackageCardType } from \"../PackageCard\";\nimport { PackageListViewProps } from \"./PackageList\";\n\nexport const WideCardList: FunctionComponent<PackageListViewProps> = ({\n items,\n}) => {\n return (\n <Stack spacing={4}>\n {items.map((pkg) => (\n <PackageCard\n key={`${pkg.name}-${pkg.version}`}\n pkg={pkg}\n variant={PackageCardType.Wide}\n />\n ))}\n </Stack>\n );\n};\n","import {\n chakra,\n PropsOf,\n SystemProps,\n forwardRef,\n HTMLChakraProps,\n} from \"@chakra-ui/system\"\nimport { omit, __DEV__ } from \"@chakra-ui/utils\"\nimport * as React from \"react\"\nimport { useImage, UseImageProps } from \"./use-image\"\n\ninterface NativeImageOptions {\n /**\n * The native HTML `width` attribute to the passed to the `img`\n */\n htmlWidth?: string | number\n /**\n * The native HTML `height` attribute to the passed to the `img`\n */\n htmlHeight?: string | number\n}\n\ninterface NativeImageProps extends PropsOf<\"img\">, NativeImageOptions {}\n\nconst NativeImage = React.forwardRef(\n (props: NativeImageProps, ref: React.Ref<any>) => {\n const { htmlWidth, htmlHeight, alt, ...rest } = props\n return (\n <img\n width={htmlWidth}\n height={htmlHeight}\n ref={ref}\n alt={alt}\n {...rest}\n />\n )\n },\n)\n\ninterface ImageOptions extends NativeImageOptions {\n /**\n * Fallback image `src` to show if image is loading or image fails.\n *\n * Note 🚨: We recommend you use a local image\n */\n fallbackSrc?: string\n /**\n * Fallback element to show if image is loading or image fails.\n * @type React.ReactElement\n */\n fallback?: React.ReactElement\n /**\n * Defines loading strategy\n */\n loading?: \"eager\" | \"lazy\"\n /**\n * How the image to fit within its bounds.\n * It maps to css `object-fit` property.\n * @type SystemProps[\"objectFit\"]\n */\n fit?: SystemProps[\"objectFit\"]\n /**\n * How to align the image within its bounds.\n * It maps to css `object-position` property.\n * @type SystemProps[\"objectPosition\"]\n */\n align?: SystemProps[\"objectPosition\"]\n /**\n * If `true`, opt out of the `fallbackSrc` logic and use as `img`\n */\n ignoreFallback?: boolean\n}\n\nexport interface ImageProps\n extends UseImageProps,\n Omit<HTMLChakraProps<\"img\">, keyof UseImageProps>,\n ImageOptions {}\n\n/**\n * React component that renders an image with support\n * for fallbacks\n *\n * @see Docs https://chakra-ui.com/image\n */\nexport const Image = forwardRef<ImageProps, \"img\">((props, ref) => {\n const {\n fallbackSrc,\n fallback,\n src,\n srcSet,\n align,\n fit,\n loading,\n ignoreFallback,\n crossOrigin,\n ...rest\n } = props\n\n /**\n * Defer to native `img` tag if `loading` prop is passed\n * @see https://github.com/chakra-ui/chakra-ui/issues/1027\n */\n const shouldIgnore =\n loading != null ||\n ignoreFallback ||\n (fallbackSrc === undefined && fallback === undefined) // if the user doesn't provide any kind of fallback we should ignore it\n\n const status = useImage({\n ...props,\n ignoreFallback: shouldIgnore,\n })\n\n const shared = {\n ref,\n objectFit: fit,\n objectPosition: align,\n ...(shouldIgnore ? rest : omit(rest, [\"onError\", \"onLoad\"])),\n }\n\n if (status !== \"loaded\") {\n /**\n * If user passed a custom fallback component,\n * let's render it here.\n */\n if (fallback) return fallback\n\n return (\n <chakra.img\n as={NativeImage}\n className=\"chakra-image__placeholder\"\n src={fallbackSrc}\n {...shared}\n />\n )\n }\n\n return (\n <chakra.img\n as={NativeImage}\n src={src}\n srcSet={srcSet}\n crossOrigin={crossOrigin}\n loading={loading}\n className=\"chakra-image\"\n {...shared}\n />\n )\n})\n\nexport interface ImgProps extends HTMLChakraProps<\"img\">, NativeImageOptions {}\n\n/**\n * Fallback component for most SSR users who want to use the native `img` with\n * support for chakra props\n */\nexport const Img = forwardRef<ImgProps, \"img\">((props, ref) => (\n <chakra.img ref={ref} as={NativeImage} className=\"chakra-image\" {...props} />\n))\n\nif (__DEV__) {\n Image.displayName = \"Image\"\n}\n","import { useSafeLayoutEffect } from \"@chakra-ui/hooks\"\nimport {\n ImgHTMLAttributes,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\"\n\ntype NativeImageProps = ImgHTMLAttributes<HTMLImageElement>\n\nexport interface UseImageProps {\n /**\n * The image `src` attribute\n */\n src?: string\n /**\n * The image `srcset` attribute\n */\n srcSet?: string\n /**\n * The image `sizes` attribute\n */\n sizes?: string\n /**\n * A callback for when the image `src` has been loaded\n */\n onLoad?: NativeImageProps[\"onLoad\"]\n /**\n * A callback for when there was an error loading the image `src`\n */\n onError?: NativeImageProps[\"onError\"]\n /**\n * If `true`, opt out of the `fallbackSrc` logic and use as `img`\n */\n ignoreFallback?: boolean\n /**\n * The key used to set the crossOrigin on the HTMLImageElement into which the image will be loaded.\n * This tells the browser to request cross-origin access when trying to download the image data.\n */\n crossOrigin?: NativeImageProps[\"crossOrigin\"]\n loading?: NativeImageProps[\"loading\"]\n}\n\ntype Status = \"loading\" | \"failed\" | \"pending\" | \"loaded\"\n\ntype ImageEvent = React.SyntheticEvent<HTMLImageElement, Event>\n\n/**\n * React hook that loads an image in the browser,\n * and let's us know the `status` so we can show image\n * fallback if it is still `pending`\n *\n * @returns the status of the image loading progress\n *\n * @example\n *\n * ```jsx\n * function App(){\n * const status = useImage({ src: \"image.png\" })\n * return status === \"loaded\" ? <img src=\"image.png\" /> : <Placeholder />\n * }\n * ```\n */\nexport function useImage(props: UseImageProps) {\n const {\n loading,\n src,\n srcSet,\n onLoad,\n onError,\n crossOrigin,\n sizes,\n ignoreFallback,\n } = props\n\n const [status, setStatus] = useState<Status>(\"pending\")\n\n useEffect(() => {\n setStatus(src ? \"loading\" : \"pending\")\n }, [src])\n\n const imageRef = useRef<HTMLImageElement | null>()\n\n const load = useCallback(() => {\n if (!src) return\n\n flush()\n\n const img = new Image()\n img.src = src\n if (crossOrigin) img.crossOrigin = crossOrigin\n if (srcSet) img.srcset = srcSet\n if (sizes) img.sizes = sizes\n if (loading) img.loading = loading\n\n img.onload = (event) => {\n flush()\n setStatus(\"loaded\")\n onLoad?.((event as unknown) as ImageEvent)\n }\n img.onerror = (error) => {\n flush()\n setStatus(\"failed\")\n onError?.(error as any)\n }\n\n imageRef.current = img\n }, [src, crossOrigin, srcSet, sizes, onLoad, onError, loading])\n\n const flush = () => {\n if (imageRef.current) {\n imageRef.current.onload = null\n imageRef.current.onerror = null\n imageRef.current = null\n }\n }\n\n useSafeLayoutEffect(() => {\n /**\n * If user opts out of the fallback/placeholder\n * logic, let's bail out.\n */\n if (ignoreFallback) return undefined\n\n if (status === \"loading\") {\n load()\n }\n return () => {\n flush()\n }\n }, [status, load, ignoreFallback])\n\n /**\n * If user opts out of the fallback/placeholder\n * logic, let's just return 'loaded'\n */\n return ignoreFallback ? \"loaded\" : status\n}\n\nexport type UseImageReturn = ReturnType<typeof useImage>\n","import {\n chakra,\n forwardRef,\n omitThemingProps,\n StylesProvider,\n ThemingProps,\n useMultiStyleConfig,\n HTMLChakraProps,\n} from \"@chakra-ui/system\"\nimport { cx, __DEV__ } from \"@chakra-ui/utils\"\nimport { getValidChildren } from \"@chakra-ui/react-utils\"\nimport * as React from \"react\"\n\nexport interface InputGroupProps\n extends HTMLChakraProps<\"div\">,\n ThemingProps<\"Input\"> {}\n\nexport const InputGroup = forwardRef<InputGroupProps, \"div\">((props, ref) => {\n const styles = useMultiStyleConfig(\"Input\", props)\n const { children, className, ...rest } = omitThemingProps(props)\n\n const _className = cx(\"chakra-input__group\", className)\n const groupStyles: InputGroupProps = {}\n\n const validChildren = getValidChildren(children)\n\n const input: any = styles.field\n\n validChildren.forEach((child: any) => {\n if (!styles) return\n\n if (input && child.type.id === \"InputLeftElement\") {\n groupStyles.paddingStart = input.height ?? input.h\n }\n\n if (input && child.type.id === \"InputRightElement\") {\n groupStyles.paddingEnd = input.height ?? input.h\n }\n\n if (child.type.id === \"InputRightAddon\") {\n groupStyles.borderEndRadius = 0\n }\n\n if (child.type.id === \"InputLeftAddon\") {\n groupStyles.borderStartRadius = 0\n }\n })\n\n const clones = validChildren.map((child: any) => {\n /**\n * Make it possible to override the size and variant from `Input`\n */\n const theming = {\n size: child.props?.size || props.size,\n variant: child.props?.variant || props.variant,\n }\n\n return child.type.id !== \"Input\"\n ? React.cloneElement(child, theming)\n : React.cloneElement(\n child,\n Object.assign(theming, groupStyles, child.props),\n )\n })\n\n return (\n <chakra.div\n className={_className}\n ref={ref}\n __css={{\n width: \"100%\",\n display: \"flex\",\n position: \"relative\",\n }}\n {...rest}\n >\n <StylesProvider value={styles}>{clones}</StylesProvider>\n </chakra.div>\n )\n})\n\nif (__DEV__) {\n InputGroup.displayName = \"InputGroup\"\n}\n","import {\n chakra,\n forwardRef,\n SystemStyleObject,\n useStyles,\n HTMLChakraProps,\n} from \"@chakra-ui/system\"\nimport { cx, __DEV__ } from \"@chakra-ui/utils\"\nimport * as React from \"react\"\n\nexport interface InputElementProps extends HTMLChakraProps<\"div\"> {\n placement?: \"left\" | \"right\"\n}\n\nconst StyledElement = chakra(\"div\", {\n baseStyle: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n position: \"absolute\",\n top: \"0\",\n zIndex: 2,\n },\n})\n\nconst InputElement = forwardRef<InputElementProps, \"div\">((props, ref) => {\n const { placement = \"left\", ...rest } = props\n\n const styles = useStyles()\n const input: any = styles.field\n\n const attr = placement === \"left\" ? \"insetStart\" : \"insetEnd\"\n\n const elementStyles: SystemStyleObject = {\n [attr]: \"0\",\n width: input?.height ?? input?.h,\n height: input?.height ?? input?.h,\n fontSize: input?.fontSize,\n }\n\n return <StyledElement ref={ref} __css={elementStyles} {...rest} />\n})\n\n// This is used in `input-group.tsx`\nInputElement.id = \"InputElement\"\n\nif (__DEV__) {\n InputElement.displayName = \"InputElement\"\n}\n\nexport const InputLeftElement = forwardRef<InputElementProps, \"div\">(\n (props, ref) => {\n const { className, ...rest } = props\n const _className = cx(\"chakra-input__left-element\", className)\n\n return (\n <InputElement\n ref={ref}\n placement=\"left\"\n className={_className}\n {...rest}\n />\n )\n },\n)\n\n// This is used in `input-group.tsx`\nInputLeftElement.id = \"InputLeftElement\"\n\nif (__DEV__) {\n InputLeftElement.displayName = \"InputLeftElement\"\n}\n\nexport const InputRightElement = forwardRef<InputElementProps, \"div\">(\n (props, ref) => {\n const { className, ...rest } = props\n const _className = cx(\"chakra-input__right-element\", className)\n\n return (\n <InputElement\n ref={ref}\n placement=\"right\"\n className={_className}\n {...rest}\n />\n )\n },\n)\n\n// This is used in `input-group.tsx`\nInputRightElement.id = \"InputRightElement\"\n\nif (__DEV__) {\n InputRightElement.displayName = \"InputRightElement\"\n}\n","import { SearchIcon } from \"@chakra-ui/icons\";\nimport {\n Box,\n Flex,\n Heading,\n Input,\n InputGroup,\n InputRightElement,\n Link,\n Stack,\n} from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Form } from \"../../components/Form\";\n\n// All elements are currently static / have no real interactions\nexport const Hero: FunctionComponent = () => {\n return (\n <Flex\n align=\"center\"\n bg=\"blue.800\"\n color=\"white\"\n direction=\"column\"\n justify=\"center\"\n py={12}\n >\n <Heading as=\"h1\" size=\"xl\">\n Build cloud infrastructure with reusable components\n </Heading>\n <Heading as=\"h2\" mt={2} size=\"lg\">\n Provided by the{\" \"}\n <Box as=\"span\" color=\"yellow.400\">\n community\n </Box>\n , backed by{\" \"}\n <Box as=\"span\" color=\"yellow.400\">\n AWS\n </Box>\n .\n </Heading>\n <Flex direction=\"column\" mt={8}>\n <Stack direction=\"row\" spacing={7}>\n <Link borderBottom=\"1px solid\" borderBottomColor=\"yellow.400\">\n All CDKs\n </Link>\n <Link>AWS CDK</Link>\n <Link>CDK for Terraform</Link>\n <Link>CDK for Kubernetes</Link>\n </Stack>\n <Form mt={4}>\n <InputGroup>\n <Input\n bg=\"white\"\n placeholder=\"Search over 600 construct libraries for all CDKS\"\n variant=\"filled\"\n />\n <InputRightElement>\n <SearchIcon color=\"gray.500\" />\n </InputRightElement>\n </InputGroup>\n </Form>\n </Flex>\n </Flex>\n );\n};\n","import { Heading, Stack, Text } from \"@chakra-ui/react\";\nimport type { FunctionComponent, ReactNode } from \"react\";\n\nexport interface InfoSectionProps {\n title: string;\n description: ReactNode;\n}\n\nexport const InfoSection: FunctionComponent<InfoSectionProps> = ({\n title,\n description,\n children,\n}) => (\n <Stack color=\"blue.800\" spacing={4}>\n <Heading as=\"h3\" size=\"md\">\n {title}\n </Heading>\n <Text size=\"sm\">{description}</Text>\n {children}\n </Stack>\n);\n","import { Flex, Divider, Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Card } from \"../../components/Card\";\nimport { Picture } from \"../../components/Picture\";\nimport { InfoSection } from \"./InfoSection\";\n\nexport const InfoPanel: FunctionComponent = () => {\n return (\n <Card borderRadius=\"none\" boxShadow=\"none\" h=\"full\" p={8}>\n <Stack spacing={8}>\n <InfoSection\n description={\n <>\n The construct hub is a{\" \"}\n <strong>\n central destination to discover and share cloud application\n design patterns and reference architectures\n </strong>{\" \"}\n defined for the AWS CDK, CDK for Kubernetes (CDK8s), CDK for\n Terraform (CDKtf) and any other construct-based tool.\n </>\n }\n title=\"What is Construct Hub?\"\n >\n <Flex\n align=\"center\"\n justifyItems=\"start\"\n sx={{\n \"& > *\": {\n mt: 4,\n mr: 4,\n },\n }}\n wrap=\"wrap\"\n >\n <Picture alt=\"AWS CDK logo\" src=\"/assets/aws-cdk.png\" />\n <Picture alt=\"Terraform logo\" src=\"/assets/terraform.png\" />\n <Picture alt=\"Kubernetes logo\" src=\"/assets/kubernetes.png\" />\n </Flex>\n </InfoSection>\n <Divider />\n <InfoSection\n description={\n <>\n Constructs are <strong>cloud building blocks</strong> introduced\n by the Constructs Programming Model (CPM) that can be{\" \"}\n <strong>\n used to assemble complete applications of any complexity.\n </strong>{\" \"}\n AWS, enterprises, start-ups, and individual developers use CDK\n constructs to share proven architecture patterns as reusable code\n libraries, so that everyone can benefit from the collective wisdom\n of the community.\n </>\n }\n title=\"What is a construct?\"\n />\n <Divider />\n <InfoSection\n description={\n <>\n Construct Hub is built to <strong>serve the community</strong>{\" \"}\n that uses the constructs programming model (CPM) and to allow them{\" \"}\n <strong>\n find publicly available constructs they can reuse.\n </strong>{\" \"}\n Before the Construct Hub, developers did not have an easy way to\n discover construct libraries created by the community since they\n were published across various package managers and without a\n central index.\n </>\n }\n title=\"Why should I use this?\"\n />\n </Stack>\n </Card>\n );\n};\n","import { Flex, Grid, Heading } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { PackageList } from \"../../components/PackageList\";\nimport { Page } from \"../../components/Page\";\nimport { useCardView } from \"../../contexts/CardView\";\nimport { useCatalogResults } from \"../../hooks/useCatalogResults\";\nimport { Hero } from \"./Hero\";\nimport { InfoPanel } from \"./InfoPanel\";\n\nexport const HomeRedesign: FunctionComponent = () => {\n const { cardView, CardViewControls } = useCardView();\n\n // This hook's usage should eventually be replaced by a newer Search implementation\n const { displayable, loading } = useCatalogResults({\n limit: 10,\n });\n\n return (\n <Page\n meta={{\n title: \"Construct Hub\",\n description:\n \"Construct Hub helps developers find open-source construct libraries for use with AWS CDK, CDK8s, CDKTf and other construct-based tools.\",\n suffix: false,\n }}\n pageName=\"home\"\n >\n <Flex direction=\"column\">\n <Hero />\n <Grid\n gap={3}\n h=\"full\"\n p={3}\n pl={12}\n templateColumns=\"2fr 1fr\"\n templateRows=\"1fr\"\n >\n <Flex direction=\"column\">\n <Flex align=\"center\" justify=\"space-between\" mb={3}>\n <Heading as=\"h3\" color=\"blue.800\" size=\"md\">\n Recently Updated\n </Heading>\n <CardViewControls />\n </Flex>\n\n <PackageList\n cardView={cardView}\n items={displayable}\n loading={loading}\n />\n </Flex>\n <InfoPanel />\n </Grid>\n </Flex>\n </Page>\n );\n};\n"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"sources":["constants/pageInfo.ts","components/Page/Page.tsx","components/Picture/Picture.tsx","components/PackageList/PackageList.tsx","components/PackageList/CompactCardList.tsx","components/PackageList/WideCardList.tsx","../../../src/image.tsx","../../../src/use-image.ts","../../../src/input-group.tsx","../../../src/input-element.tsx","views/HomeRedesign/Hero.tsx","views/HomeRedesign/InfoSection.tsx","views/HomeRedesign/InfoPanel.tsx","views/HomeRedesign/HomeRedesign.tsx"],"names":["pageInfo","home","event","name","faq","packageProfile","search","siteTerms","notFound","page","pageType","Page","children","meta","pageName","trackPageView","usePageView","useEffect","suffix","title","description","formattedTitle","Helmet","process","content","charSet","property","Picture","forwardRef","ref","sources","props","as","map","source","idx","media","srcSet","displayName","listViews","PackageCardType","Compact","items","autoRows","gap","templateColumns","pkg","PackageCard","variant","version","Wide","spacing","PackageList","memo","cardView","loading","size","View","NativeImage","alt","width","height","Image","crossOrigin","shouldIgnore","fallbackSrc","fallback","status","ignoreFallback","useState","setStatus","src","imageRef","useRef","load","useCallback","flush","img","onLoad","error","onError","sizes","useSafeLayoutEffect","useImage","shared","objectFit","objectPosition","align","rest","omit","className","InputGroup","styles","useMultiStyleConfig","omitThemingProps","_className","cx","groupStyles","validChildren","getValidChildren","input","child","clones","theming","React","Object","__css","display","position","value","StyledElement","chakra","baseStyle","alignItems","justifyContent","top","zIndex","InputElement","placement","useStyles","attr","elementStyles","fontSize","InputLeftElement","InputRightElement","Hero","bg","color","direction","justify","py","mt","borderBottom","borderBottomColor","Form","placeholder","Search","InfoSection","InfoPanel","Card","borderRadius","boxShadow","h","p","justifyItems","sx","mr","wrap","HomeRedesign","useCardView","CardViewControls","useCatalogResults","limit","displayable","pl","templateRows","mb"],"mappings":"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","file":"static/js/7.415d3d06.chunk.js","sourcesContent":["export const pageInfo = {\n home: {\n event: {\n name: \"Home Load\",\n },\n },\n faq: {\n event: {\n name: \"Frequently Asked Questions Load\",\n },\n },\n packageProfile: {\n event: {\n name: \"Package Profile Load\",\n },\n },\n search: {\n event: {\n name: \"Search Load\",\n },\n },\n siteTerms: {\n event: {\n name: \"Site Terms Load\",\n },\n },\n notFound: {\n page: {\n pageType: \"errorPage\",\n },\n event: {\n name: \"404 Page Load\",\n },\n },\n} as const;\n","import { FunctionComponent, useEffect } from \"react\";\nimport { Helmet } from \"react-helmet\";\nimport { pageInfo } from \"../../constants/pageInfo\";\nimport { usePageView } from \"../../contexts/Analytics\";\n\nexport interface PageProps {\n pageName: keyof typeof pageInfo;\n meta: {\n suffix?: boolean;\n title: string;\n description: string;\n };\n}\n\nexport const Page: FunctionComponent<PageProps> = ({\n children,\n meta,\n pageName,\n}) => {\n const trackPageView = usePageView(pageInfo[pageName]);\n\n useEffect(() => {\n trackPageView();\n }, [trackPageView]);\n\n const { suffix = true, title, description } = meta;\n const formattedTitle = suffix ? `${title} - Construct Hub` : title;\n\n return (\n <>\n <Helmet>\n {process.env.NODE_ENV === \"development\" && (\n <meta\n content=\"default-src 'self' 'unsafe-inline' https://*.awsstatic.com https://amazonwebservices.d2.sc.omtrdc.net; connect-src 'self' https://*.shortbread.aws.dev ws://localhost:3000 https://*.awsstatic.com https://amazonwebservices.d2.sc.omtrdc.net; frame-src 'none'; img-src 'self' https://* http://*.omtrdc.net; object-src 'none'; style-src 'self' 'unsafe-inline';\"\n httpEquiv=\"Content-Security-Policy\"\n />\n )}\n\n <meta content=\"width=device-width, initial-scale=1\" name=\"viewport\" />\n <meta charSet=\"utf-8\" />\n\n <title>{formattedTitle}</title>\n <meta content={formattedTitle} property=\"og:title\" />\n <meta content={formattedTitle} name=\"twitter:title\" />\n <meta content=\"summary\" name=\"twitter:card\" />\n\n <meta content={description} name=\"description\" />\n <meta content={description} property=\"og:description\" />\n <meta content={description} name=\"twitter:description\" />\n </Helmet>\n {children}\n </>\n );\n};\n","import { Box, HTMLChakraProps, forwardRef, Image } from \"@chakra-ui/react\";\n\nexport interface PictureProps extends HTMLChakraProps<\"img\"> {\n alt: string;\n src: string;\n sources?: {\n media?: string;\n srcSet: string;\n }[];\n}\n\nexport const Picture = forwardRef<PictureProps, \"img\">(\n ({ sources, ...props }, ref) => (\n <Box as=\"picture\">\n {sources?.map((source, idx) => (\n <source key={idx} media={source.media} srcSet={source.srcSet} />\n ))}\n <Image ref={ref} {...props} />\n </Box>\n )\n);\n\nPicture.displayName = \"Picture\";\n","import { Center, Spinner } from \"@chakra-ui/react\";\nimport { FunctionComponent, memo } from \"react\";\nimport { CatalogPackage } from \"../../api/package/packages\";\nimport { PackageCardType } from \"../PackageCard\";\nimport { CompactCardList } from \"./CompactCardList\";\nimport { WideCardList } from \"./WideCardList\";\n\nconst listViews = {\n [PackageCardType.Compact]: CompactCardList,\n [PackageCardType.Wide]: WideCardList,\n};\n\nexport interface PackageListViewProps {\n items: CatalogPackage[];\n}\n\nexport interface PackageListProps extends Partial<PackageListViewProps> {\n cardView?: PackageCardType;\n loading?: boolean;\n title?: string;\n}\n\nexport const PackageList: FunctionComponent<PackageListProps> = memo(\n ({\n cardView = PackageCardType.Wide,\n items,\n loading,\n // title,\n }) => {\n if (loading || !items) {\n return (\n <Center>\n <Spinner size=\"xl\" />\n </Center>\n );\n }\n\n const View = listViews[cardView];\n\n return <View items={items} />;\n }\n);\n\nPackageList.displayName = \"PackageList\";\n","import { Grid } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { PackageCard, PackageCardType } from \"../PackageCard\";\nimport { PackageListViewProps } from \"./PackageList\";\n\nexport const CompactCardList: FunctionComponent<PackageListViewProps> = ({\n items,\n}) => {\n return (\n <Grid\n autoRows=\"auto\"\n gap={5}\n templateColumns=\"repeat(auto-fit, minmax(320px, 1fr))\"\n >\n {items.map((pkg) => (\n <PackageCard\n key={`${pkg.name}-${pkg.version}`}\n pkg={pkg}\n variant={PackageCardType.Compact}\n />\n ))}\n </Grid>\n );\n};\n","import { Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { PackageCard, PackageCardType } from \"../PackageCard\";\nimport { PackageListViewProps } from \"./PackageList\";\n\nexport const WideCardList: FunctionComponent<PackageListViewProps> = ({\n items,\n}) => {\n return (\n <Stack spacing={4}>\n {items.map((pkg) => (\n <PackageCard\n key={`${pkg.name}-${pkg.version}`}\n pkg={pkg}\n variant={PackageCardType.Wide}\n />\n ))}\n </Stack>\n );\n};\n","import {\n chakra,\n PropsOf,\n SystemProps,\n forwardRef,\n HTMLChakraProps,\n} from \"@chakra-ui/system\"\nimport { omit, __DEV__ } from \"@chakra-ui/utils\"\nimport * as React from \"react\"\nimport { useImage, UseImageProps } from \"./use-image\"\n\ninterface NativeImageOptions {\n /**\n * The native HTML `width` attribute to the passed to the `img`\n */\n htmlWidth?: string | number\n /**\n * The native HTML `height` attribute to the passed to the `img`\n */\n htmlHeight?: string | number\n}\n\ninterface NativeImageProps extends PropsOf<\"img\">, NativeImageOptions {}\n\nconst NativeImage = React.forwardRef(\n (props: NativeImageProps, ref: React.Ref<any>) => {\n const { htmlWidth, htmlHeight, alt, ...rest } = props\n return (\n <img\n width={htmlWidth}\n height={htmlHeight}\n ref={ref}\n alt={alt}\n {...rest}\n />\n )\n },\n)\n\ninterface ImageOptions extends NativeImageOptions {\n /**\n * Fallback image `src` to show if image is loading or image fails.\n *\n * Note 🚨: We recommend you use a local image\n */\n fallbackSrc?: string\n /**\n * Fallback element to show if image is loading or image fails.\n * @type React.ReactElement\n */\n fallback?: React.ReactElement\n /**\n * Defines loading strategy\n */\n loading?: \"eager\" | \"lazy\"\n /**\n * How the image to fit within its bounds.\n * It maps to css `object-fit` property.\n * @type SystemProps[\"objectFit\"]\n */\n fit?: SystemProps[\"objectFit\"]\n /**\n * How to align the image within its bounds.\n * It maps to css `object-position` property.\n * @type SystemProps[\"objectPosition\"]\n */\n align?: SystemProps[\"objectPosition\"]\n /**\n * If `true`, opt out of the `fallbackSrc` logic and use as `img`\n */\n ignoreFallback?: boolean\n}\n\nexport interface ImageProps\n extends UseImageProps,\n Omit<HTMLChakraProps<\"img\">, keyof UseImageProps>,\n ImageOptions {}\n\n/**\n * React component that renders an image with support\n * for fallbacks\n *\n * @see Docs https://chakra-ui.com/image\n */\nexport const Image = forwardRef<ImageProps, \"img\">((props, ref) => {\n const {\n fallbackSrc,\n fallback,\n src,\n srcSet,\n align,\n fit,\n loading,\n ignoreFallback,\n crossOrigin,\n ...rest\n } = props\n\n /**\n * Defer to native `img` tag if `loading` prop is passed\n * @see https://github.com/chakra-ui/chakra-ui/issues/1027\n */\n const shouldIgnore =\n loading != null ||\n ignoreFallback ||\n (fallbackSrc === undefined && fallback === undefined) // if the user doesn't provide any kind of fallback we should ignore it\n\n const status = useImage({\n ...props,\n ignoreFallback: shouldIgnore,\n })\n\n const shared = {\n ref,\n objectFit: fit,\n objectPosition: align,\n ...(shouldIgnore ? rest : omit(rest, [\"onError\", \"onLoad\"])),\n }\n\n if (status !== \"loaded\") {\n /**\n * If user passed a custom fallback component,\n * let's render it here.\n */\n if (fallback) return fallback\n\n return (\n <chakra.img\n as={NativeImage}\n className=\"chakra-image__placeholder\"\n src={fallbackSrc}\n {...shared}\n />\n )\n }\n\n return (\n <chakra.img\n as={NativeImage}\n src={src}\n srcSet={srcSet}\n crossOrigin={crossOrigin}\n loading={loading}\n className=\"chakra-image\"\n {...shared}\n />\n )\n})\n\nexport interface ImgProps extends HTMLChakraProps<\"img\">, NativeImageOptions {}\n\n/**\n * Fallback component for most SSR users who want to use the native `img` with\n * support for chakra props\n */\nexport const Img = forwardRef<ImgProps, \"img\">((props, ref) => (\n <chakra.img ref={ref} as={NativeImage} className=\"chakra-image\" {...props} />\n))\n\nif (__DEV__) {\n Image.displayName = \"Image\"\n}\n","import { useSafeLayoutEffect } from \"@chakra-ui/hooks\"\nimport {\n ImgHTMLAttributes,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\"\n\ntype NativeImageProps = ImgHTMLAttributes<HTMLImageElement>\n\nexport interface UseImageProps {\n /**\n * The image `src` attribute\n */\n src?: string\n /**\n * The image `srcset` attribute\n */\n srcSet?: string\n /**\n * The image `sizes` attribute\n */\n sizes?: string\n /**\n * A callback for when the image `src` has been loaded\n */\n onLoad?: NativeImageProps[\"onLoad\"]\n /**\n * A callback for when there was an error loading the image `src`\n */\n onError?: NativeImageProps[\"onError\"]\n /**\n * If `true`, opt out of the `fallbackSrc` logic and use as `img`\n */\n ignoreFallback?: boolean\n /**\n * The key used to set the crossOrigin on the HTMLImageElement into which the image will be loaded.\n * This tells the browser to request cross-origin access when trying to download the image data.\n */\n crossOrigin?: NativeImageProps[\"crossOrigin\"]\n loading?: NativeImageProps[\"loading\"]\n}\n\ntype Status = \"loading\" | \"failed\" | \"pending\" | \"loaded\"\n\ntype ImageEvent = React.SyntheticEvent<HTMLImageElement, Event>\n\n/**\n * React hook that loads an image in the browser,\n * and let's us know the `status` so we can show image\n * fallback if it is still `pending`\n *\n * @returns the status of the image loading progress\n *\n * @example\n *\n * ```jsx\n * function App(){\n * const status = useImage({ src: \"image.png\" })\n * return status === \"loaded\" ? <img src=\"image.png\" /> : <Placeholder />\n * }\n * ```\n */\nexport function useImage(props: UseImageProps) {\n const {\n loading,\n src,\n srcSet,\n onLoad,\n onError,\n crossOrigin,\n sizes,\n ignoreFallback,\n } = props\n\n const [status, setStatus] = useState<Status>(\"pending\")\n\n useEffect(() => {\n setStatus(src ? \"loading\" : \"pending\")\n }, [src])\n\n const imageRef = useRef<HTMLImageElement | null>()\n\n const load = useCallback(() => {\n if (!src) return\n\n flush()\n\n const img = new Image()\n img.src = src\n if (crossOrigin) img.crossOrigin = crossOrigin\n if (srcSet) img.srcset = srcSet\n if (sizes) img.sizes = sizes\n if (loading) img.loading = loading\n\n img.onload = (event) => {\n flush()\n setStatus(\"loaded\")\n onLoad?.((event as unknown) as ImageEvent)\n }\n img.onerror = (error) => {\n flush()\n setStatus(\"failed\")\n onError?.(error as any)\n }\n\n imageRef.current = img\n }, [src, crossOrigin, srcSet, sizes, onLoad, onError, loading])\n\n const flush = () => {\n if (imageRef.current) {\n imageRef.current.onload = null\n imageRef.current.onerror = null\n imageRef.current = null\n }\n }\n\n useSafeLayoutEffect(() => {\n /**\n * If user opts out of the fallback/placeholder\n * logic, let's bail out.\n */\n if (ignoreFallback) return undefined\n\n if (status === \"loading\") {\n load()\n }\n return () => {\n flush()\n }\n }, [status, load, ignoreFallback])\n\n /**\n * If user opts out of the fallback/placeholder\n * logic, let's just return 'loaded'\n */\n return ignoreFallback ? \"loaded\" : status\n}\n\nexport type UseImageReturn = ReturnType<typeof useImage>\n","import {\n chakra,\n forwardRef,\n omitThemingProps,\n StylesProvider,\n ThemingProps,\n useMultiStyleConfig,\n HTMLChakraProps,\n} from \"@chakra-ui/system\"\nimport { cx, __DEV__ } from \"@chakra-ui/utils\"\nimport { getValidChildren } from \"@chakra-ui/react-utils\"\nimport * as React from \"react\"\n\nexport interface InputGroupProps\n extends HTMLChakraProps<\"div\">,\n ThemingProps<\"Input\"> {}\n\nexport const InputGroup = forwardRef<InputGroupProps, \"div\">((props, ref) => {\n const styles = useMultiStyleConfig(\"Input\", props)\n const { children, className, ...rest } = omitThemingProps(props)\n\n const _className = cx(\"chakra-input__group\", className)\n const groupStyles: InputGroupProps = {}\n\n const validChildren = getValidChildren(children)\n\n const input: any = styles.field\n\n validChildren.forEach((child: any) => {\n if (!styles) return\n\n if (input && child.type.id === \"InputLeftElement\") {\n groupStyles.paddingStart = input.height ?? input.h\n }\n\n if (input && child.type.id === \"InputRightElement\") {\n groupStyles.paddingEnd = input.height ?? input.h\n }\n\n if (child.type.id === \"InputRightAddon\") {\n groupStyles.borderEndRadius = 0\n }\n\n if (child.type.id === \"InputLeftAddon\") {\n groupStyles.borderStartRadius = 0\n }\n })\n\n const clones = validChildren.map((child: any) => {\n /**\n * Make it possible to override the size and variant from `Input`\n */\n const theming = {\n size: child.props?.size || props.size,\n variant: child.props?.variant || props.variant,\n }\n\n return child.type.id !== \"Input\"\n ? React.cloneElement(child, theming)\n : React.cloneElement(\n child,\n Object.assign(theming, groupStyles, child.props),\n )\n })\n\n return (\n <chakra.div\n className={_className}\n ref={ref}\n __css={{\n width: \"100%\",\n display: \"flex\",\n position: \"relative\",\n }}\n {...rest}\n >\n <StylesProvider value={styles}>{clones}</StylesProvider>\n </chakra.div>\n )\n})\n\nif (__DEV__) {\n InputGroup.displayName = \"InputGroup\"\n}\n","import {\n chakra,\n forwardRef,\n SystemStyleObject,\n useStyles,\n HTMLChakraProps,\n} from \"@chakra-ui/system\"\nimport { cx, __DEV__ } from \"@chakra-ui/utils\"\nimport * as React from \"react\"\n\nexport interface InputElementProps extends HTMLChakraProps<\"div\"> {\n placement?: \"left\" | \"right\"\n}\n\nconst StyledElement = chakra(\"div\", {\n baseStyle: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n position: \"absolute\",\n top: \"0\",\n zIndex: 2,\n },\n})\n\nconst InputElement = forwardRef<InputElementProps, \"div\">((props, ref) => {\n const { placement = \"left\", ...rest } = props\n\n const styles = useStyles()\n const input: any = styles.field\n\n const attr = placement === \"left\" ? \"insetStart\" : \"insetEnd\"\n\n const elementStyles: SystemStyleObject = {\n [attr]: \"0\",\n width: input?.height ?? input?.h,\n height: input?.height ?? input?.h,\n fontSize: input?.fontSize,\n }\n\n return <StyledElement ref={ref} __css={elementStyles} {...rest} />\n})\n\n// This is used in `input-group.tsx`\nInputElement.id = \"InputElement\"\n\nif (__DEV__) {\n InputElement.displayName = \"InputElement\"\n}\n\nexport const InputLeftElement = forwardRef<InputElementProps, \"div\">(\n (props, ref) => {\n const { className, ...rest } = props\n const _className = cx(\"chakra-input__left-element\", className)\n\n return (\n <InputElement\n ref={ref}\n placement=\"left\"\n className={_className}\n {...rest}\n />\n )\n },\n)\n\n// This is used in `input-group.tsx`\nInputLeftElement.id = \"InputLeftElement\"\n\nif (__DEV__) {\n InputLeftElement.displayName = \"InputLeftElement\"\n}\n\nexport const InputRightElement = forwardRef<InputElementProps, \"div\">(\n (props, ref) => {\n const { className, ...rest } = props\n const _className = cx(\"chakra-input__right-element\", className)\n\n return (\n <InputElement\n ref={ref}\n placement=\"right\"\n className={_className}\n {...rest}\n />\n )\n },\n)\n\n// This is used in `input-group.tsx`\nInputRightElement.id = \"InputRightElement\"\n\nif (__DEV__) {\n InputRightElement.displayName = \"InputRightElement\"\n}\n","import { SearchIcon } from \"@chakra-ui/icons\";\nimport {\n Box,\n Flex,\n Heading,\n Input,\n InputGroup,\n InputRightElement,\n Link,\n Stack,\n} from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Form } from \"../../components/Form\";\n\n// All elements are currently static / have no real interactions\nexport const Hero: FunctionComponent = () => {\n return (\n <Flex\n align=\"center\"\n bg=\"blue.800\"\n color=\"white\"\n direction=\"column\"\n justify=\"center\"\n py={12}\n >\n <Heading as=\"h1\" size=\"xl\">\n Build cloud infrastructure with reusable components\n </Heading>\n <Heading as=\"h2\" mt={2} size=\"lg\">\n Provided by the{\" \"}\n <Box as=\"span\" color=\"yellow.400\">\n community\n </Box>\n , backed by{\" \"}\n <Box as=\"span\" color=\"yellow.400\">\n AWS\n </Box>\n .\n </Heading>\n <Flex direction=\"column\" mt={8}>\n <Stack direction=\"row\" spacing={7}>\n <Link borderBottom=\"1px solid\" borderBottomColor=\"yellow.400\">\n All CDKs\n </Link>\n <Link>AWS CDK</Link>\n <Link>CDK for Terraform</Link>\n <Link>CDK for Kubernetes</Link>\n </Stack>\n <Form mt={4}>\n <InputGroup>\n <Input\n bg=\"white\"\n placeholder=\"Search over 600 construct libraries for all CDKS\"\n variant=\"filled\"\n />\n <InputRightElement>\n <SearchIcon color=\"gray.500\" />\n </InputRightElement>\n </InputGroup>\n </Form>\n </Flex>\n </Flex>\n );\n};\n","import { Heading, Stack, Text } from \"@chakra-ui/react\";\nimport type { FunctionComponent, ReactNode } from \"react\";\n\nexport interface InfoSectionProps {\n title: string;\n description: ReactNode;\n}\n\nexport const InfoSection: FunctionComponent<InfoSectionProps> = ({\n title,\n description,\n children,\n}) => (\n <Stack color=\"blue.800\" spacing={4}>\n <Heading as=\"h3\" size=\"md\">\n {title}\n </Heading>\n <Text size=\"sm\">{description}</Text>\n {children}\n </Stack>\n);\n","import { Flex, Divider, Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Card } from \"../../components/Card\";\nimport { Picture } from \"../../components/Picture\";\nimport { InfoSection } from \"./InfoSection\";\n\nexport const InfoPanel: FunctionComponent = () => {\n return (\n <Card borderRadius=\"none\" boxShadow=\"none\" h=\"full\" p={8}>\n <Stack spacing={8}>\n <InfoSection\n description={\n <>\n The construct hub is a{\" \"}\n <strong>\n central destination to discover and share cloud application\n design patterns and reference architectures\n </strong>{\" \"}\n defined for the AWS CDK, CDK for Kubernetes (CDK8s), CDK for\n Terraform (CDKtf) and any other construct-based tool.\n </>\n }\n title=\"What is Construct Hub?\"\n >\n <Flex\n align=\"center\"\n justifyItems=\"start\"\n sx={{\n \"& > *\": {\n mt: 4,\n mr: 4,\n },\n }}\n wrap=\"wrap\"\n >\n <Picture alt=\"AWS CDK logo\" src=\"/assets/aws-cdk.png\" />\n <Picture alt=\"Terraform logo\" src=\"/assets/terraform.png\" />\n <Picture alt=\"Kubernetes logo\" src=\"/assets/kubernetes.png\" />\n </Flex>\n </InfoSection>\n <Divider />\n <InfoSection\n description={\n <>\n Constructs are <strong>cloud building blocks</strong> introduced\n by the Constructs Programming Model (CPM) that can be{\" \"}\n <strong>\n used to assemble complete applications of any complexity.\n </strong>{\" \"}\n AWS, enterprises, start-ups, and individual developers use CDK\n constructs to share proven architecture patterns as reusable code\n libraries, so that everyone can benefit from the collective wisdom\n of the community.\n </>\n }\n title=\"What is a construct?\"\n />\n <Divider />\n <InfoSection\n description={\n <>\n Construct Hub is built to <strong>serve the community</strong>{\" \"}\n that uses the constructs programming model (CPM) and to allow them{\" \"}\n <strong>\n find publicly available constructs they can reuse.\n </strong>{\" \"}\n Before the Construct Hub, developers did not have an easy way to\n discover construct libraries created by the community since they\n were published across various package managers and without a\n central index.\n </>\n }\n title=\"Why should I use this?\"\n />\n </Stack>\n </Card>\n );\n};\n","import { Flex, Grid, Heading } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { PackageList } from \"../../components/PackageList\";\nimport { Page } from \"../../components/Page\";\nimport { useCardView } from \"../../contexts/CardView\";\nimport { useCatalogResults } from \"../../hooks/useCatalogResults\";\nimport { Hero } from \"./Hero\";\nimport { InfoPanel } from \"./InfoPanel\";\n\nexport const HomeRedesign: FunctionComponent = () => {\n const { cardView, CardViewControls } = useCardView();\n\n // This hook's usage should eventually be replaced by a newer Search implementation\n const { displayable, loading } = useCatalogResults({\n limit: 10,\n });\n\n return (\n <Page\n meta={{\n title: \"Construct Hub\",\n description:\n \"Construct Hub helps developers find open-source construct libraries for use with AWS CDK, CDK8s, CDKTf and other construct-based tools.\",\n suffix: false,\n }}\n pageName=\"home\"\n >\n <Flex direction=\"column\">\n <Hero />\n <Grid\n gap={3}\n h=\"full\"\n p={3}\n pl={12}\n templateColumns=\"2fr 1fr\"\n templateRows=\"1fr\"\n >\n <Flex direction=\"column\">\n <Flex align=\"center\" justify=\"space-between\" mb={3}>\n <Heading as=\"h3\" color=\"blue.800\" size=\"md\">\n Recently Updated\n </Heading>\n <CardViewControls />\n </Flex>\n\n <PackageList\n cardView={cardView}\n items={displayable}\n loading={loading}\n />\n </Flex>\n <InfoPanel />\n </Grid>\n </Flex>\n </Page>\n );\n};\n"],"sourceRoot":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(this["webpackJsonpconstruct-hub-webapp"]=this["webpackJsonpconstruct-hub-webapp"]||[]).push([[9],{232:function(e,t,a){"use strict";a.d(t,"a",(function(){return o}));var n=a(0),c=a(241),r={home:{event:{name:"Home Load"}},faq:{event:{name:"Frequently Asked Questions Load"}},packageProfile:{event:{name:"Package Profile Load"}},search:{event:{name:"Search Load"}},siteTerms:{event:{name:"Site Terms Load"}},notFound:{page:{pageType:"errorPage"},event:{name:"404 Page Load"}}},i=a(112),s=a(1),o=function(e){var t=e.children,a=e.meta,o=e.pageName,u=Object(i.b)(r[o]);Object(n.useEffect)((function(){u()}),[u]);var l=a.suffix,j=void 0===l||l,b=a.title,f=a.description,d=j?"".concat(b," - Construct Hub"):b;return Object(s.jsxs)(s.Fragment,{children:[Object(s.jsxs)(c.a,{children:[!1,Object(s.jsx)("meta",{content:"width=device-width, initial-scale=1",name:"viewport"}),Object(s.jsx)("meta",{charSet:"utf-8"}),Object(s.jsx)("title",{children:d}),Object(s.jsx)("meta",{content:d,property:"og:title"}),Object(s.jsx)("meta",{content:d,name:"twitter:title"}),Object(s.jsx)("meta",{content:"summary",name:"twitter:card"}),Object(s.jsx)("meta",{content:f,name:"description"}),Object(s.jsx)("meta",{content:f,property:"og:description"}),Object(s.jsx)("meta",{content:f,name:"twitter:description"})]}),t]})}},292:function(e,t,a){"use strict";a.d(t,"a",(function(){return i}));var n=a(195),c=a(1),r=function(e){var t=e.children;return Object(c.jsx)(n.a,{as:"em",color:"blue.500",fontWeight:"bold",children:t})},i=function(e){var t=e.limit,a=e.offset,i=e.count,s=e.filtered,o=t*a,u=o+t;return Object(c.jsxs)(n.a,{children:["Displaying"," ",Object(c.jsxs)(r,{children:[i?o+1:i," - ",u>i?i:u]})," ","of ",Object(c.jsx)(r,{children:i})," ",s?"search results":"constructs","."]})}},293:function(e,t,a){"use strict";a.d(t,"a",(function(){return n}));var n=25},295:function(e,t,a){"use strict";a.d(t,"a",(function(){return f}));var n,c=a(5),r=a(215),i=a(197),s=a(0),o=a(69),u=a(145),l=a(1),j=a(229),b=(n={},Object(c.a)(n,o.b.Compact,(function(e){var t=e.items;return Object(l.jsx)(u.a,{autoRows:"auto",gap:5,templateColumns:"repeat(auto-fit, minmax(320px, 1fr))",children:t.map((function(e){return Object(l.jsx)(o.a,{pkg:e,variant:o.b.Compact},"".concat(e.name,"-").concat(e.version))}))})})),Object(c.a)(n,o.b.Wide,(function(e){var t=e.items;return Object(l.jsx)(j.a,{spacing:4,children:t.map((function(e){return Object(l.jsx)(o.a,{pkg:e,variant:o.b.Wide},"".concat(e.name,"-").concat(e.version))}))})})),n),f=Object(s.memo)((function(e){var t=e.cardView,a=void 0===t?o.b.Wide:t,n=e.items;if(e.loading||!n)return Object(l.jsx)(r.a,{children:Object(l.jsx)(i.a,{size:"xl"})});var c=b[a];return Object(l.jsx)(c,{items:n})}));f.displayName="PackageList"},296:function(e,t,a){"use strict";a.d(t,"a",(function(){return y}));var n=a(301),c=a(272),r=a(145),i=a(205),s=a(6),o=a(203),u=a(24),l=a(1),j=function(e){var t=e.icon,a=e.offset,n=e.getPageUrl,c={"aria-label":"Page ".concat(a," link"),borderRadius:"md",borderColor:"blue.500",colorScheme:"blue",icon:Object(l.jsx)(t,{color:"blue.500",h:5,w:5}),mx:2,h:10,w:10,variant:"outline"};return void 0!==a?Object(l.jsx)(o.a,Object(s.a)(Object(s.a)({},c),{},{as:u.b,to:n({offset:a})})):Object(l.jsx)(o.a,Object(s.a)(Object(s.a)({},c),{},{disabled:!0}))},b=a(4),f=a(224),d=a(195),m=a(0),O=a(20),h=function(e){var t=e.pageLimit,a=e.offset,n=e.getPageUrl,c=Object(m.useState)((a+1).toString()),r=Object(b.a)(c,2),s=r[0],o=r[1],u=Object(O.g)().push;Object(m.useEffect)((function(){o((a+1).toString())}),[a]);return Object(l.jsxs)(i.a,{align:"center",as:"form",mx:2,onSubmit:function(e){e.preventDefault(),u(n({offset:parseInt(s)-1}))},children:[Object(l.jsx)(f.a,{colorScheme:"blue",h:10,max:t+1,min:1,name:"page",onChange:function(e){e.preventDefault(),o(e.target.value)},p:0,textAlign:"center",type:"number",value:s,w:10}),Object(l.jsxs)(d.a,{ml:2,w:"max-content",children:["of ",t+1]})]})},p=a(300),v=a(149),g={children:"Next Page",colorScheme:"blue",rightIcon:Object(l.jsx)(p.a,{color:"white"})},x=function(e){var t=e.nextPageUrl;return t?Object(l.jsx)(v.a,Object(s.a)(Object(s.a)({},g),{},{as:u.b,to:t})):Object(l.jsx)(v.a,Object(s.a)(Object(s.a)({},g),{},{disabled:!0}))},y=function(e){var t=e.offset,a=e.pageLimit,s=e.getPageUrl,o=t<a?t+1:void 0,u=t>0?t-1:void 0;return Object(l.jsxs)(r.a,{alignItems:"center",pt:4,templateColumns:"repeat(3, 1fr)",templateRows:"1fr",children:[Object(l.jsx)(r.b,{colStart:2,justifySelf:"center",children:Object(l.jsx)(x,{nextPageUrl:o?s({offset:o}):void 0})}),Object(l.jsx)(r.b,{colStart:3,justifySelf:"end",children:Object(l.jsxs)(i.a,{align:"center",justify:"center",py:4,children:[Object(l.jsx)(h,{getPageUrl:s,offset:t,pageLimit:a}),Object(l.jsx)(j,{getPageUrl:s,icon:n.a,offset:u}),Object(l.jsx)(j,{getPageUrl:s,icon:c.a,offset:o})]})})]})}},592:function(e,t,a){"use strict";a.r(t),a.d(t,"SearchRedesign",(function(){return _})),a.d(t,"default",(function(){return _}));var n,c=a(145),r=a(232),i=a(4),s=a(229),o=a(211),u=a(0),l=a(113),j=a(25),b=a(221),f=a(195),d=a(1),m=function(e){var t=e.name,a=e.options,n=e.value,c=e.onValueChange;return Object(d.jsxs)(s.a,{spacing:2,children:[Object(d.jsx)(o.a,{as:"h4",size:"sm",children:t}),a.map((function(e){var t,a=e.display,r=e.value;return Object(d.jsx)(b.a,{isChecked:r===n,onChange:(t=r,function(){c(t===n?void 0:t)}),children:Object(d.jsx)(f.a,{color:"gray.600",fontSize:"sm",isTruncated:!0,children:a})},r)}))]})},O=Object.entries(j.b).filter((function(e){var t=Object(i.a)(e,1)[0];return j.e.has(t)})).map((function(e){var t=Object(i.a)(e,2),a=t[0];return{display:t[1],value:a}})),h=function(){var e=Object(u.useState)(),t=Object(i.a)(e,2),a=t[0],n=t[1],c=Object(u.useState)(),r=Object(i.a)(c,2),j=r[0],b=r[1],f=Object(u.useState)(),h=Object(i.a)(f,2),p=h[0],v=h[1];return Object(d.jsx)(l.a,{borderRadius:"none",boxShadow:"none",p:4,children:Object(d.jsxs)(s.a,{color:"blue.800",spacing:6,children:[Object(d.jsx)(o.a,{as:"h3",size:"sm",children:"Filters"}),Object(d.jsx)(m,{name:"CDK Type",onValueChange:n,options:[{display:"AWS CDK",value:"awscdk"},{display:"CDK for Terraform",value:"cdktf"},{display:"CDK for Kubernetes",value:"cdk8s"}],value:a}),Object(d.jsx)(m,{name:"Programming Language",onValueChange:b,options:O,value:j}),Object(d.jsx)(m,{name:"Author",onValueChange:v,options:[{display:"Community",value:"community"},{display:"AWS",value:"aws"}],value:p})]})})},p=a(19),v=a(6),g=a(71),x=a(87),y=a(576),w=a.n(y);!function(e){e.NameAsc="NameAsc",e.NameDesc="NameDesc",e.PublishDateAsc="PublishDateAsc",e.PublishDateDesc="PublishDateDesc"}(n||(n={}));var S,C=a(5),P=function(e){return function(t,a){var n=new Date(t.metadata.date),c=new Date(a.metadata.date);return n===c?0:e?c<n?1:-1:n<c?1:-1}},D=function(e){return function(t,a){return t.name.localeCompare(a.name)*(e?1:-1)}},k=(S={},Object(C.a)(S,n.NameAsc,D(!0)),Object(C.a)(S,n.NameDesc,D(!1)),Object(C.a)(S,n.PublishDateAsc,P(!0)),Object(C.a)(S,n.PublishDateDesc,P(!1)),S),L=function(){function e(t){Object(g.a)(this,e),this.map=void 0,this.index=void 0;var a=t.reduce((function(e,t){var a=[t.name,t.version].join("@");return e.set(a,Object(v.a)(Object(v.a)({},t),{},{id:a})),e}),new Map);this.map=this.sort(a,n.PublishDateDesc),this.index=w()((function(){var e=this;this.ref("id"),this.field("name"),this.field("scope"),this.field("packageName"),this.field("description"),this.field("authorName"),this.field("authorEmail"),Object(p.a)(a.values()).forEach((function(t){var a=t.author,n=t.name.split("/"),c=Object(i.a)(n,2),r=c[0],s=c[1];r&&s&&(t.scope=r,t.packageName=s),"string"===typeof a&&(t.authorName=a),(null===a||void 0===a?void 0:a.name)&&(t.authorName=a.name),(null===a||void 0===a?void 0:a.email)&&(t.authorEmail=a.email),e.add(t)}))}))}return Object(x.a)(e,[{key:"search",value:function(e){var t=null!==e&&void 0!==e?e:{},a=t.query,n=t.filters,c=t.sort,r=a?this.query(a):new Map(this.map);return n&&(r=this.filter(r,n)),c&&(r=this.sort(r,c)),r}},{key:"query",value:function(e){var t=this,a=[];try{a=this.index.search(e)}catch(n){console.error(n)}return a.reduce((function(e,a){var n=a.ref,c=t.map.get(n);return c&&e.set(n,c),e}),new Map)}},{key:"filter",value:function(e,t){var a=t.language,n=new Map(e);return n.forEach((function(e){a&&a!==j.d.TypeScript&&void 0===e.languages[a]&&n.delete(e.id)})),n}},{key:"sort",value:function(e,t){return t?new Map(Object(p.a)(e.entries()).sort((function(e,a){var n=Object(i.a)(e,2)[1],c=Object(i.a)(a,2)[1];return k[t](n,c)}))):e}}]),e}(),N=a(89),A=a(83),E=Object(u.createContext)(void 0),U=function(e){var t=e.children,a=Object(A.b)(),n=a.data,c=a.loading,r=Object(u.useState)([]),s=Object(i.a)(r,2),o=s[0],l=s[1],j=Object(u.useMemo)((function(){if(void 0!==(null===n||void 0===n?void 0:n.packages)&&!c){var e=new L(n.packages);return l(Object(p.a)(e.search().values())),e}}),[n,c]),b=Object(u.useCallback)((function(e){if(j){var t=j.search(e);l(Object(p.a)(t.values()))}}),[j]);return j?Object(d.jsx)(E.Provider,{value:{results:o,search:b},children:t}):Object(d.jsx)(N.a,{})},q=a(205),R=a(190),T=a(207),M=a(116),V=a(295),W=a(13),F=a(123),H=a(118),I=function(e,t){var a=t.limit,n=t.offset,c=t.pageLimit,r=(n>c?c:n)*a,i=r+a;return e.slice(r,i)},K=a(115),z=a(56),Q=a(296),G=a(292),J=a(293),Y=function(){var e,t,a=Object(F.b)(),n=a.cardView,c=a.CardViewControls,s=Object(K.a)(),o=Object(u.useContext)(E),l=o.results,j=o.search,b=decodeURIComponent(null!==(e=s.get(W.b.SEARCH_QUERY))&&void 0!==e?e:""),f=s.get(W.b.LANGUAGE),m=Object(H.a)({defaultQuery:b,defaultLanguage:f}),O=function(e){var t=parseInt(e);return"NaN"==="".concat(t)?0:t}(null!==(t=s.get(W.b.OFFSET))&&void 0!==t?t:"0"),h=function(e,t){var a=null!==t&&void 0!==t?t:{},n=a.limit,c=void 0===n?25:n,r=a.offset,s=void 0===r?0:r,o=e?Math.floor(e.length/c):0,l=Object(u.useState)(I(e,{limit:c,offset:s,pageLimit:o})),j=Object(i.a)(l,2),b=j[0],f=j[1];return Object(u.useEffect)((function(){f(I(e,{limit:c,offset:s,pageLimit:o}))}),[c,s,e]),Object(u.useMemo)((function(){return{page:b,pageLimit:o}}),[b,o])}(l,{offset:O,limit:J.a}),p=h.page,g=h.pageLimit;return Object(u.useEffect)((function(){j({query:b,filters:{language:null!==f&&void 0!==f?f:void 0}})}),[f,b]),Object(u.useEffect)((function(){b!==m.query&&m.setQuery(b)}),[b]),Object(d.jsx)(r.a,{meta:{title:b||"Search",description:b?"".concat(l.length," results for ").concat(b," at Construct Hub"):"Search reusable components for your cloud application"},pageName:"search",children:Object(d.jsxs)(q.a,{direction:"column",maxW:"100vw",children:[Object(d.jsx)(R.a,{p:4,children:Object(d.jsx)(M.a,Object(v.a)({},m))}),Object(d.jsx)(T.a,{}),Object(d.jsxs)(R.a,{p:4,children:[Object(d.jsxs)(q.a,{justify:"space-between",pb:4,children:[Object(d.jsx)(G.a,{count:l.length,filtered:!!b,limit:J.a,offset:O}),Object(d.jsx)(c,{})]}),Object(d.jsx)(V.a,{cardView:n,items:p}),Object(d.jsx)(Q.a,{getPageUrl:function(e){var t,a;return Object(z.c)({query:null!==(t=e.q)&&void 0!==t?t:b,language:f,offset:null!==(a=e.offset)&&void 0!==a?a:O})},limit:J.a,offset:O,pageLimit:g})]})]})})},_=function(){return Object(d.jsx)(r.a,{meta:{title:"Search - Construct Hub",description:"This is a placeholder"},pageName:"search",children:Object(d.jsx)(U,{children:Object(d.jsxs)(c.a,{gap:4,p:6,templateColumns:"1fr 3fr",templateRows:"1fr",children:[Object(d.jsx)(h,{}),Object(d.jsx)(Y,{})]})})})}}}]);
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
(this["webpackJsonpconstruct-hub-webapp"]=this["webpackJsonpconstruct-hub-webapp"]||[]).push([[8],{232:function(e,t,a){"use strict";a.d(t,"a",(function(){return o}));var n=a(0),c=a(245),r={home:{event:{name:"Home Load"}},faq:{event:{name:"Frequently Asked Questions Load"}},packageProfile:{event:{name:"Package Profile Load"}},search:{event:{name:"Search Load"}},siteTerms:{event:{name:"Site Terms Load"}},notFound:{page:{pageType:"errorPage"},event:{name:"404 Page Load"}}},i=a(112),s=a(1),o=function(e){var t=e.children,a=e.meta,o=e.pageName,u=Object(i.b)(r[o]);Object(n.useEffect)((function(){u()}),[u]);var l=a.suffix,j=void 0===l||l,b=a.title,f=a.description,d=j?"".concat(b," - Construct Hub"):b;return Object(s.jsxs)(s.Fragment,{children:[Object(s.jsxs)(c.a,{children:[!1,Object(s.jsx)("meta",{content:"width=device-width, initial-scale=1",name:"viewport"}),Object(s.jsx)("meta",{charSet:"utf-8"}),Object(s.jsx)("title",{children:d}),Object(s.jsx)("meta",{content:d,property:"og:title"}),Object(s.jsx)("meta",{content:d,name:"twitter:title"}),Object(s.jsx)("meta",{content:"summary",name:"twitter:card"}),Object(s.jsx)("meta",{content:f,name:"description"}),Object(s.jsx)("meta",{content:f,property:"og:description"}),Object(s.jsx)("meta",{content:f,name:"twitter:description"})]}),t]})}},292:function(e,t,a){"use strict";a.d(t,"a",(function(){return i}));var n=a(195),c=a(1),r=function(e){var t=e.children;return Object(c.jsx)(n.a,{as:"em",color:"blue.500",fontWeight:"bold",children:t})},i=function(e){var t=e.limit,a=e.offset,i=e.count,s=e.filtered,o=t*a,u=o+t;return Object(c.jsxs)(n.a,{children:["Displaying"," ",Object(c.jsxs)(r,{children:[i?o+1:i," - ",u>i?i:u]})," ","of ",Object(c.jsx)(r,{children:i})," ",s?"search results":"constructs","."]})}},293:function(e,t,a){"use strict";a.d(t,"a",(function(){return n}));var n=25},294:function(e,t,a){"use strict";a.d(t,"a",(function(){return f}));var n,c=a(5),r=a(215),i=a(197),s=a(0),o=a(68),u=a(145),l=a(1),j=a(229),b=(n={},Object(c.a)(n,o.b.Compact,(function(e){var t=e.items;return Object(l.jsx)(u.a,{autoRows:"auto",gap:5,templateColumns:"repeat(auto-fit, minmax(320px, 1fr))",children:t.map((function(e){return Object(l.jsx)(o.a,{pkg:e,variant:o.b.Compact},"".concat(e.name,"-").concat(e.version))}))})})),Object(c.a)(n,o.b.Wide,(function(e){var t=e.items;return Object(l.jsx)(j.a,{spacing:4,children:t.map((function(e){return Object(l.jsx)(o.a,{pkg:e,variant:o.b.Wide},"".concat(e.name,"-").concat(e.version))}))})})),n),f=Object(s.memo)((function(e){var t=e.cardView,a=void 0===t?o.b.Wide:t,n=e.items;if(e.loading||!n)return Object(l.jsx)(r.a,{children:Object(l.jsx)(i.a,{size:"xl"})});var c=b[a];return Object(l.jsx)(c,{items:n})}));f.displayName="PackageList"},295:function(e,t,a){"use strict";a.d(t,"a",(function(){return y}));var n=a(352),c=a(298),r=a(145),i=a(205),s=a(6),o=a(203),u=a(24),l=a(1),j=function(e){var t=e.icon,a=e.offset,n=e.getPageUrl,c={"aria-label":"Page ".concat(a," link"),borderRadius:"md",borderColor:"blue.500",colorScheme:"blue",icon:Object(l.jsx)(t,{color:"blue.500",h:5,w:5}),mx:2,h:10,w:10,variant:"outline"};return void 0!==a?Object(l.jsx)(o.a,Object(s.a)(Object(s.a)({},c),{},{as:u.b,to:n({offset:a})})):Object(l.jsx)(o.a,Object(s.a)(Object(s.a)({},c),{},{disabled:!0}))},b=a(4),f=a(224),d=a(195),m=a(0),O=a(20),h=function(e){var t=e.pageLimit,a=e.offset,n=e.getPageUrl,c=Object(m.useState)((a+1).toString()),r=Object(b.a)(c,2),s=r[0],o=r[1],u=Object(O.g)().push;Object(m.useEffect)((function(){o((a+1).toString())}),[a]);return Object(l.jsxs)(i.a,{align:"center",as:"form",mx:2,onSubmit:function(e){e.preventDefault(),u(n({offset:parseInt(s)-1}))},children:[Object(l.jsx)(f.a,{colorScheme:"blue",h:10,max:t+1,min:1,name:"page",onChange:function(e){e.preventDefault(),o(e.target.value)},p:0,textAlign:"center",type:"number",value:s,w:10}),Object(l.jsxs)(d.a,{ml:2,w:"max-content",children:["of ",t+1]})]})},p=a(351),v=a(149),g={children:"Next Page",colorScheme:"blue",rightIcon:Object(l.jsx)(p.a,{color:"white"})},x=function(e){var t=e.nextPageUrl;return t?Object(l.jsx)(v.a,Object(s.a)(Object(s.a)({},g),{},{as:u.b,to:t})):Object(l.jsx)(v.a,Object(s.a)(Object(s.a)({},g),{},{disabled:!0}))},y=function(e){var t=e.offset,a=e.pageLimit,s=e.getPageUrl,o=t<a?t+1:void 0,u=t>0?t-1:void 0;return Object(l.jsxs)(r.a,{alignItems:"center",pt:4,templateColumns:"repeat(3, 1fr)",templateRows:"1fr",children:[Object(l.jsx)(r.b,{colStart:2,justifySelf:"center",children:Object(l.jsx)(x,{nextPageUrl:o?s({offset:o}):void 0})}),Object(l.jsx)(r.b,{colStart:3,justifySelf:"end",children:Object(l.jsxs)(i.a,{align:"center",justify:"center",py:4,children:[Object(l.jsx)(h,{getPageUrl:s,offset:t,pageLimit:a}),Object(l.jsx)(j,{getPageUrl:s,icon:n.a,offset:u}),Object(l.jsx)(j,{getPageUrl:s,icon:c.a,offset:o})]})})]})}},592:function(e,t,a){"use strict";a.r(t),a.d(t,"SearchRedesign",(function(){return _})),a.d(t,"default",(function(){return _}));var n,c=a(145),r=a(232),i=a(4),s=a(229),o=a(211),u=a(0),l=a(114),j=a(25),b=a(221),f=a(195),d=a(1),m=function(e){var t=e.name,a=e.options,n=e.value,c=e.onValueChange;return Object(d.jsxs)(s.a,{spacing:2,children:[Object(d.jsx)(o.a,{as:"h4",size:"sm",children:t}),a.map((function(e){var t,a=e.display,r=e.value;return Object(d.jsx)(b.a,{isChecked:r===n,onChange:(t=r,function(){c(t===n?void 0:t)}),children:Object(d.jsx)(f.a,{color:"gray.600",fontSize:"sm",isTruncated:!0,children:a})},r)}))]})},O=Object.entries(j.b).filter((function(e){var t=Object(i.a)(e,1)[0];return j.e.has(t)})).map((function(e){var t=Object(i.a)(e,2),a=t[0];return{display:t[1],value:a}})),h=function(){var e=Object(u.useState)(),t=Object(i.a)(e,2),a=t[0],n=t[1],c=Object(u.useState)(),r=Object(i.a)(c,2),j=r[0],b=r[1],f=Object(u.useState)(),h=Object(i.a)(f,2),p=h[0],v=h[1];return Object(d.jsx)(l.a,{borderRadius:"none",boxShadow:"none",p:4,children:Object(d.jsxs)(s.a,{color:"blue.800",spacing:6,children:[Object(d.jsx)(o.a,{as:"h3",size:"sm",children:"Filters"}),Object(d.jsx)(m,{name:"CDK Type",onValueChange:n,options:[{display:"AWS CDK",value:"awscdk"},{display:"CDK for Terraform",value:"cdktf"},{display:"CDK for Kubernetes",value:"cdk8s"}],value:a}),Object(d.jsx)(m,{name:"Programming Language",onValueChange:b,options:O,value:j}),Object(d.jsx)(m,{name:"Author",onValueChange:v,options:[{display:"Community",value:"community"},{display:"AWS",value:"aws"}],value:p})]})})},p=a(19),v=a(6),g=a(71),x=a(87),y=a(576),w=a.n(y);!function(e){e.NameAsc="NameAsc",e.NameDesc="NameDesc",e.PublishDateAsc="PublishDateAsc",e.PublishDateDesc="PublishDateDesc"}(n||(n={}));var S,C=a(5),P=function(e){return function(t,a){var n=new Date(t.metadata.date),c=new Date(a.metadata.date);return n===c?0:e?c<n?1:-1:n<c?1:-1}},D=function(e){return function(t,a){return t.name.localeCompare(a.name)*(e?1:-1)}},k=(S={},Object(C.a)(S,n.NameAsc,D(!0)),Object(C.a)(S,n.NameDesc,D(!1)),Object(C.a)(S,n.PublishDateAsc,P(!0)),Object(C.a)(S,n.PublishDateDesc,P(!1)),S),L=function(){function e(t){Object(g.a)(this,e),this.map=void 0,this.index=void 0;var a=t.reduce((function(e,t){var a=[t.name,t.version].join("@");return e.set(a,Object(v.a)(Object(v.a)({},t),{},{id:a})),e}),new Map);this.map=this.sort(a,n.PublishDateDesc),this.index=w()((function(){var e=this;this.ref("id"),this.field("name"),this.field("scope"),this.field("packageName"),this.field("description"),this.field("authorName"),this.field("authorEmail"),Object(p.a)(a.values()).forEach((function(t){var a=t.author,n=t.name.split("/"),c=Object(i.a)(n,2),r=c[0],s=c[1];r&&s&&(t.scope=r,t.packageName=s),"string"===typeof a&&(t.authorName=a),(null===a||void 0===a?void 0:a.name)&&(t.authorName=a.name),(null===a||void 0===a?void 0:a.email)&&(t.authorEmail=a.email),e.add(t)}))}))}return Object(x.a)(e,[{key:"search",value:function(e){var t=null!==e&&void 0!==e?e:{},a=t.query,n=t.filters,c=t.sort,r=a?this.query(a):new Map(this.map);return n&&(r=this.filter(r,n)),c&&(r=this.sort(r,c)),r}},{key:"query",value:function(e){var t=this,a=[];try{a=this.index.search(e)}catch(n){console.error(n)}return a.reduce((function(e,a){var n=a.ref,c=t.map.get(n);return c&&e.set(n,c),e}),new Map)}},{key:"filter",value:function(e,t){var a=t.language,n=new Map(e);return n.forEach((function(e){a&&a!==j.d.TypeScript&&void 0===e.languages[a]&&n.delete(e.id)})),n}},{key:"sort",value:function(e,t){return t?new Map(Object(p.a)(e.entries()).sort((function(e,a){var n=Object(i.a)(e,2)[1],c=Object(i.a)(a,2)[1];return k[t](n,c)}))):e}}]),e}(),N=a(89),A=a(83),E=Object(u.createContext)(void 0),U=function(e){var t=e.children,a=Object(A.b)(),n=a.data,c=a.loading,r=Object(u.useState)([]),s=Object(i.a)(r,2),o=s[0],l=s[1],j=Object(u.useMemo)((function(){if(void 0!==(null===n||void 0===n?void 0:n.packages)&&!c){var e=new L(n.packages);return l(Object(p.a)(e.search().values())),e}}),[n,c]),b=Object(u.useCallback)((function(e){if(j){var t=j.search(e);l(Object(p.a)(t.values()))}}),[j]);return j?Object(d.jsx)(E.Provider,{value:{results:o,search:b},children:t}):Object(d.jsx)(N.a,{})},q=a(205),R=a(190),T=a(207),M=a(116),V=a(294),W=a(13),F=a(121),H=a(118),I=function(e,t){var a=t.limit,n=t.offset,c=t.pageLimit,r=(n>c?c:n)*a,i=r+a;return e.slice(r,i)},K=a(115),z=a(56),Q=a(295),G=a(292),J=a(293),Y=function(){var e,t,a=Object(F.b)(),n=a.cardView,c=a.CardViewControls,s=Object(K.a)(),o=Object(u.useContext)(E),l=o.results,j=o.search,b=decodeURIComponent(null!==(e=s.get(W.b.SEARCH_QUERY))&&void 0!==e?e:""),f=s.get(W.b.LANGUAGE),m=Object(H.a)({defaultQuery:b,defaultLanguage:f}),O=function(e){var t=parseInt(e);return"NaN"==="".concat(t)?0:t}(null!==(t=s.get(W.b.OFFSET))&&void 0!==t?t:"0"),h=function(e,t){var a=null!==t&&void 0!==t?t:{},n=a.limit,c=void 0===n?25:n,r=a.offset,s=void 0===r?0:r,o=e?Math.floor(e.length/c):0,l=Object(u.useState)(I(e,{limit:c,offset:s,pageLimit:o})),j=Object(i.a)(l,2),b=j[0],f=j[1];return Object(u.useEffect)((function(){f(I(e,{limit:c,offset:s,pageLimit:o}))}),[c,s,e]),Object(u.useMemo)((function(){return{page:b,pageLimit:o}}),[b,o])}(l,{offset:O,limit:J.a}),p=h.page,g=h.pageLimit;return Object(u.useEffect)((function(){j({query:b,filters:{language:null!==f&&void 0!==f?f:void 0}})}),[f,b]),Object(u.useEffect)((function(){b!==m.query&&m.setQuery(b)}),[b]),Object(d.jsx)(r.a,{meta:{title:b||"Search",description:b?"".concat(l.length," results for ").concat(b," at Construct Hub"):"Search reusable components for your cloud application"},pageName:"search",children:Object(d.jsxs)(q.a,{direction:"column",maxW:"100vw",children:[Object(d.jsx)(R.a,{p:4,children:Object(d.jsx)(M.a,Object(v.a)({},m))}),Object(d.jsx)(T.a,{}),Object(d.jsxs)(R.a,{p:4,children:[Object(d.jsxs)(q.a,{justify:"space-between",pb:4,children:[Object(d.jsx)(G.a,{count:l.length,filtered:!!b,limit:J.a,offset:O}),Object(d.jsx)(c,{})]}),Object(d.jsx)(V.a,{cardView:n,items:p}),Object(d.jsx)(Q.a,{getPageUrl:function(e){var t,a;return Object(z.c)({query:null!==(t=e.q)&&void 0!==t?t:b,language:f,offset:null!==(a=e.offset)&&void 0!==a?a:O})},limit:J.a,offset:O,pageLimit:g})]})]})})},_=function(){return Object(d.jsx)(r.a,{meta:{title:"Search - Construct Hub",description:"This is a placeholder"},pageName:"search",children:Object(d.jsx)(U,{children:Object(d.jsxs)(c.a,{gap:4,p:6,templateColumns:"1fr 3fr",templateRows:"1fr",children:[Object(d.jsx)(h,{}),Object(d.jsx)(Y,{})]})})})}}}]);
|
|
2
|
+
//# sourceMappingURL=8.24ecd2ff.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["constants/pageInfo.ts","components/Page/Page.tsx","views/SearchResults/components/ShowingDetails.tsx","views/SearchResults/constants.ts","components/PackageList/PackageList.tsx","components/PackageList/CompactCardList.tsx","components/PackageList/WideCardList.tsx","views/SearchResults/components/ArrowButton.tsx","views/SearchResults/components/GoToPage.tsx","views/SearchResults/components/NextPage.tsx","views/SearchResults/components/PageControls.tsx","api/catalog-search/constants.ts","views/SearchRedesign/Filter.tsx","views/SearchRedesign/FilterPanel.tsx","api/catalog-search/util.ts","api/catalog-search/catalog-search.ts","views/SearchRedesign/SearchAPI.tsx","hooks/usePagination/usePagination.ts","views/SearchRedesign/SearchResults.tsx","views/SearchRedesign/SearchRedesign.tsx"],"names":["pageInfo","home","event","name","faq","packageProfile","search","siteTerms","notFound","page","pageType","Page","children","meta","pageName","trackPageView","usePageView","useEffect","suffix","title","description","formattedTitle","Helmet","process","content","charSet","property","Em","as","color","fontWeight","ShowingDetails","limit","offset","count","filtered","first","last","LIMIT","listViews","PackageCardType","Compact","items","autoRows","gap","templateColumns","map","pkg","PackageCard","variant","version","Wide","spacing","PackageList","memo","cardView","loading","size","View","displayName","ArrowButton","Icon","icon","getPageUrl","props","borderRadius","borderColor","colorScheme","h","w","mx","undefined","Link","to","disabled","GoToPage","pageLimit","useState","toString","inputValue","setInputValue","push","useHistory","align","onSubmit","e","preventDefault","parseInt","max","min","onChange","target","value","p","textAlign","type","ml","btnProps","rightIcon","ArrowForward","NextPage","nextPageUrl","PageControls","nextOffset","prevOffset","alignItems","pt","templateRows","colStart","justifySelf","justify","py","ChevronLeftIcon","ChevronRightIcon","CatalogSearchSort","Filter","options","checkedValue","onValueChange","v","display","isChecked","fontSize","isTruncated","languageOptions","Object","entries","LANGUAGE_NAME_MAP","filter","key","TEMP_SUPPORTED_LANGUAGES","has","FilterPanel","cdkType","setCdkType","language","setLanguage","author","setAuthor","Card","boxShadow","getDateSort","isAscending","p1","p2","d1","Date","metadata","date","d2","getStrSort","localeCompare","SORT_FUNCTIONS","NameAsc","NameDesc","PublishDateAsc","PublishDateDesc","CatalogSearchAPI","catalogData","index","catalogMap","reduce","id","join","set","Map","this","sort","lunr","ref","field","values","forEach","split","scope","packageName","authorName","email","authorEmail","add","params","query","filters","results","refs","console","error","packages","get","copiedResults","result","Language","TypeScript","languages","delete","strategy","SearchAPIContext","createContext","SearchAPIProvider","useCatalog","data","setResults","searchAPI","useMemo","instance","useCallback","res","Provider","PageLoader","takePage","opts","start","stop","slice","SearchResults","useCardView","CardViewControls","queryParams","useQueryParams","useContext","searchQuery","decodeURIComponent","QUERY_PARAMS","SEARCH_QUERY","languageQuery","LANGUAGE","useCatalogSearch","defaultQuery","defaultLanguage","val","toNum","OFFSET","Math","floor","length","setPage","usePagination","setQuery","direction","maxW","CatalogSearch","pb","getSearchPath","q","SearchRedesign"],"mappings":"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","file":"static/js/9.6620eb5b.chunk.js","sourcesContent":["export const pageInfo = {\n home: {\n event: {\n name: \"Home Load\",\n },\n },\n faq: {\n event: {\n name: \"Frequently Asked Questions Load\",\n },\n },\n packageProfile: {\n event: {\n name: \"Package Profile Load\",\n },\n },\n search: {\n event: {\n name: \"Search Load\",\n },\n },\n siteTerms: {\n event: {\n name: \"Site Terms Load\",\n },\n },\n notFound: {\n page: {\n pageType: \"errorPage\",\n },\n event: {\n name: \"404 Page Load\",\n },\n },\n} as const;\n","import { FunctionComponent, useEffect } from \"react\";\nimport { Helmet } from \"react-helmet\";\nimport { pageInfo } from \"../../constants/pageInfo\";\nimport { usePageView } from \"../../contexts/Analytics\";\n\nexport interface PageProps {\n pageName: keyof typeof pageInfo;\n meta: {\n suffix?: boolean;\n title: string;\n description: string;\n };\n}\n\nexport const Page: FunctionComponent<PageProps> = ({\n children,\n meta,\n pageName,\n}) => {\n const trackPageView = usePageView(pageInfo[pageName]);\n\n useEffect(() => {\n trackPageView();\n }, [trackPageView]);\n\n const { suffix = true, title, description } = meta;\n const formattedTitle = suffix ? `${title} - Construct Hub` : title;\n\n return (\n <>\n <Helmet>\n {process.env.NODE_ENV === \"development\" && (\n <meta\n content=\"default-src 'self' 'unsafe-inline' https://*.awsstatic.com https://amazonwebservices.d2.sc.omtrdc.net; connect-src 'self' https://*.shortbread.aws.dev ws://localhost:3000 https://*.awsstatic.com https://amazonwebservices.d2.sc.omtrdc.net; frame-src 'none'; img-src 'self' https://* http://*.omtrdc.net; object-src 'none'; style-src 'self' 'unsafe-inline';\"\n httpEquiv=\"Content-Security-Policy\"\n />\n )}\n\n <meta content=\"width=device-width, initial-scale=1\" name=\"viewport\" />\n <meta charSet=\"utf-8\" />\n\n <title>{formattedTitle}</title>\n <meta content={formattedTitle} property=\"og:title\" />\n <meta content={formattedTitle} name=\"twitter:title\" />\n <meta content=\"summary\" name=\"twitter:card\" />\n\n <meta content={description} name=\"description\" />\n <meta content={description} property=\"og:description\" />\n <meta content={description} name=\"twitter:description\" />\n </Helmet>\n {children}\n </>\n );\n};\n","import { Text } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\n\nexport interface ShowingDetailsProps {\n limit: number;\n offset: number;\n count: number;\n filtered: boolean;\n}\n\nconst Em: FunctionComponent = ({ children }) => (\n <Text as=\"em\" color=\"blue.500\" fontWeight=\"bold\">\n {children}\n </Text>\n);\n\nexport const ShowingDetails: FunctionComponent<ShowingDetailsProps> = ({\n limit,\n offset,\n count,\n filtered,\n}) => {\n const first = limit * offset;\n const last = first + limit;\n return (\n <Text>\n Displaying{\" \"}\n <Em>\n {count ? first + 1 : count} - {last > count ? count : last}\n </Em>{\" \"}\n of <Em>{count}</Em> {filtered ? \"search results\" : \"constructs\"}.\n </Text>\n );\n};\n","import type { QueryParamKey } from \"../../constants/url\";\n\nexport const LIMITS = [25, 50, 75, 100];\nexport const LIMIT = LIMITS[0];\n\nexport type SearchQueryParam = Extract<QueryParamKey, \"offset\" | \"q\">;\n","import { Center, Spinner } from \"@chakra-ui/react\";\nimport { FunctionComponent, memo } from \"react\";\nimport { CatalogPackage } from \"../../api/package/packages\";\nimport { PackageCardType } from \"../PackageCard\";\nimport { CompactCardList } from \"./CompactCardList\";\nimport { WideCardList } from \"./WideCardList\";\n\nconst listViews = {\n [PackageCardType.Compact]: CompactCardList,\n [PackageCardType.Wide]: WideCardList,\n};\n\nexport interface PackageListViewProps {\n items: CatalogPackage[];\n}\n\nexport interface PackageListProps extends Partial<PackageListViewProps> {\n cardView?: PackageCardType;\n loading?: boolean;\n title?: string;\n}\n\nexport const PackageList: FunctionComponent<PackageListProps> = memo(\n ({\n cardView = PackageCardType.Wide,\n items,\n loading,\n // title,\n }) => {\n if (loading || !items) {\n return (\n <Center>\n <Spinner size=\"xl\" />\n </Center>\n );\n }\n\n const View = listViews[cardView];\n\n return <View items={items} />;\n }\n);\n\nPackageList.displayName = \"PackageList\";\n","import { Grid } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { PackageCard, PackageCardType } from \"../PackageCard\";\nimport { PackageListViewProps } from \"./PackageList\";\n\nexport const CompactCardList: FunctionComponent<PackageListViewProps> = ({\n items,\n}) => {\n return (\n <Grid\n autoRows=\"auto\"\n gap={5}\n templateColumns=\"repeat(auto-fit, minmax(320px, 1fr))\"\n >\n {items.map((pkg) => (\n <PackageCard\n key={`${pkg.name}-${pkg.version}`}\n pkg={pkg}\n variant={PackageCardType.Compact}\n />\n ))}\n </Grid>\n );\n};\n","import { Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { PackageCard, PackageCardType } from \"../PackageCard\";\nimport { PackageListViewProps } from \"./PackageList\";\n\nexport const WideCardList: FunctionComponent<PackageListViewProps> = ({\n items,\n}) => {\n return (\n <Stack spacing={4}>\n {items.map((pkg) => (\n <PackageCard\n key={`${pkg.name}-${pkg.version}`}\n pkg={pkg}\n variant={PackageCardType.Wide}\n />\n ))}\n </Stack>\n );\n};\n","import { IconButton, IconProps } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\n\nexport interface ArrowButtonProps {\n icon: FunctionComponent<IconProps>;\n offset?: number;\n getPageUrl: (params: { offset: number }) => string;\n}\n\nexport const ArrowButton: FunctionComponent<ArrowButtonProps> = ({\n icon: Icon,\n offset,\n getPageUrl,\n}) => {\n const label = `Page ${offset} link`;\n\n const props = {\n \"aria-label\": label,\n borderRadius: \"md\",\n borderColor: \"blue.500\",\n colorScheme: \"blue\",\n icon: <Icon color=\"blue.500\" h={5} w={5} />,\n mx: 2,\n h: 10,\n w: 10,\n variant: \"outline\",\n };\n\n if (offset !== undefined) {\n return <IconButton {...props} as={Link} to={getPageUrl({ offset })} />;\n }\n\n return <IconButton {...props} disabled />;\n};\n","import { Flex, Input, Text } from \"@chakra-ui/react\";\nimport {\n FormEventHandler,\n FunctionComponent,\n SyntheticEvent,\n useEffect,\n useState,\n} from \"react\";\nimport { useHistory } from \"react-router-dom\";\n\nexport interface GoToPageProps {\n pageLimit: number;\n offset: number;\n getPageUrl: (params: { offset: number }) => string;\n}\n\nexport const GoToPage: FunctionComponent<GoToPageProps> = ({\n pageLimit,\n offset,\n getPageUrl,\n}) => {\n const [inputValue, setInputValue] = useState((offset + 1).toString());\n const { push } = useHistory();\n\n useEffect(() => {\n setInputValue((offset + 1).toString());\n }, [offset]);\n\n const onInputChange = (e: SyntheticEvent<HTMLInputElement>) => {\n e.preventDefault();\n setInputValue((e.target as HTMLInputElement).value);\n };\n\n const onSubmit: FormEventHandler<HTMLInputElement> = (e) => {\n e.preventDefault();\n push(getPageUrl({ offset: parseInt(inputValue) - 1 }));\n };\n\n return (\n <Flex align=\"center\" as=\"form\" mx={2} onSubmit={onSubmit}>\n <Input\n colorScheme=\"blue\"\n h={10}\n max={pageLimit + 1}\n min={1}\n name=\"page\"\n onChange={onInputChange}\n p={0}\n textAlign=\"center\"\n type=\"number\"\n value={inputValue}\n w={10}\n />\n <Text ml={2} w=\"max-content\">\n of {pageLimit + 1}\n </Text>\n </Flex>\n );\n};\n","import { ArrowForwardIcon } from \"@chakra-ui/icons\";\nimport { Button } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\n\nexport interface NextPageProps {\n nextPageUrl?: string;\n}\n\nconst btnProps = {\n children: \"Next Page\",\n colorScheme: \"blue\",\n rightIcon: <ArrowForwardIcon color=\"white\" />,\n};\n\nexport const NextPage: FunctionComponent<NextPageProps> = ({ nextPageUrl }) => {\n if (!nextPageUrl) {\n return <Button {...btnProps} disabled />;\n }\n\n return <Button {...btnProps} as={Link} to={nextPageUrl} />;\n};\n","import { ChevronLeftIcon, ChevronRightIcon } from \"@chakra-ui/icons\";\nimport { Flex, Grid, GridItem } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { ArrowButton } from \"./ArrowButton\";\nimport { GoToPage } from \"./GoToPage\";\nimport { NextPage } from \"./NextPage\";\n\nexport interface PageControlsProps {\n limit: number;\n offset: number;\n pageLimit: number;\n getPageUrl: (params: { offset?: number }) => string;\n}\n\nexport const PageControls: FunctionComponent<PageControlsProps> = ({\n offset,\n pageLimit,\n getPageUrl,\n}) => {\n const nextOffset = offset < pageLimit ? offset + 1 : undefined;\n const prevOffset = offset > 0 ? offset - 1 : undefined;\n\n return (\n <Grid\n alignItems=\"center\"\n pt={4}\n templateColumns=\"repeat(3, 1fr)\"\n templateRows=\"1fr\"\n >\n <GridItem colStart={2} justifySelf=\"center\">\n <NextPage\n nextPageUrl={\n nextOffset ? getPageUrl({ offset: nextOffset }) : undefined\n }\n />\n </GridItem>\n <GridItem colStart={3} justifySelf=\"end\">\n <Flex align=\"center\" justify=\"center\" py={4}>\n <GoToPage\n getPageUrl={getPageUrl}\n offset={offset}\n pageLimit={pageLimit}\n />\n <ArrowButton\n getPageUrl={getPageUrl}\n icon={ChevronLeftIcon}\n offset={prevOffset}\n />\n <ArrowButton\n getPageUrl={getPageUrl}\n icon={ChevronRightIcon}\n offset={nextOffset}\n />\n </Flex>\n </GridItem>\n </Grid>\n );\n};\n","export enum CatalogSearchSort {\n NameAsc = \"NameAsc\",\n NameDesc = \"NameDesc\",\n PublishDateAsc = \"PublishDateAsc\",\n PublishDateDesc = \"PublishDateDesc\",\n}\n","import { Checkbox, Heading, Stack, Text } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport interface FilterProps {\n name: string;\n options: {\n display: string;\n value: string;\n }[];\n value: string | undefined;\n onValueChange: (value: string | undefined) => void;\n}\n\nexport const Filter: FunctionComponent<FilterProps> = ({\n name,\n options,\n value: checkedValue,\n onValueChange,\n}) => {\n const getOnChange = (v: string) => () => {\n onValueChange(v === checkedValue ? undefined : v);\n };\n\n return (\n <Stack spacing={2}>\n <Heading as=\"h4\" size=\"sm\">\n {name}\n </Heading>\n {options.map(({ display, value }) => (\n <Checkbox\n isChecked={value === checkedValue}\n key={value}\n onChange={getOnChange(value)}\n >\n <Text color=\"gray.600\" fontSize=\"sm\" isTruncated>\n {display}\n </Text>\n </Checkbox>\n ))}\n </Stack>\n );\n};\n","import { Heading, Stack } from \"@chakra-ui/react\";\nimport { FunctionComponent, useState } from \"react\";\nimport { Card } from \"../../components/Card\";\nimport {\n Language,\n LANGUAGE_NAME_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\nimport { Filter } from \"./Filter\";\n\nconst languageOptions = Object.entries(LANGUAGE_NAME_MAP)\n .filter(([key]) => TEMP_SUPPORTED_LANGUAGES.has(key as Language))\n .map(([key, value]) => ({\n display: value,\n value: key,\n }));\n\nexport interface FilterPanelProps {}\n\nexport const FilterPanel: FunctionComponent<FilterPanelProps> = () => {\n const [cdkType, setCdkType] = useState<string | undefined>();\n const [language, setLanguage] = useState<string | undefined>();\n const [author, setAuthor] = useState<string | undefined>();\n\n return (\n <Card borderRadius=\"none\" boxShadow=\"none\" p={4}>\n <Stack color=\"blue.800\" spacing={6}>\n <Heading as=\"h3\" size=\"sm\">\n Filters\n </Heading>\n <Filter\n name=\"CDK Type\"\n onValueChange={setCdkType}\n options={[\n {\n display: \"AWS CDK\",\n value: \"awscdk\",\n },\n {\n display: \"CDK for Terraform\",\n value: \"cdktf\",\n },\n {\n display: \"CDK for Kubernetes\",\n value: \"cdk8s\",\n },\n ]}\n value={cdkType}\n />\n <Filter\n name=\"Programming Language\"\n onValueChange={setLanguage}\n options={languageOptions}\n value={language}\n />\n <Filter\n name=\"Author\"\n onValueChange={setAuthor}\n options={[\n {\n display: \"Community\",\n value: \"community\",\n },\n {\n display: \"AWS\",\n value: \"aws\",\n },\n ]}\n value={author}\n />\n </Stack>\n </Card>\n );\n};\n","import { CatalogPackage } from \"../package/packages\";\nimport { CatalogSearchSort } from \"./constants\";\n\ntype SortFunction = (p1: CatalogPackage, p2: CatalogPackage) => number;\n\nconst getDateSort =\n (isAscending: boolean): SortFunction =>\n (p1, p2) => {\n const d1 = new Date(p1.metadata.date);\n const d2 = new Date(p2.metadata.date);\n if (d1 === d2) {\n return 0;\n }\n\n if (isAscending) {\n return d2 < d1 ? 1 : -1;\n }\n\n return d1 < d2 ? 1 : -1;\n };\n\nconst getStrSort = (isAscending: boolean): SortFunction => {\n return (p1, p2) => p1.name.localeCompare(p2.name) * (isAscending ? 1 : -1);\n};\n\nexport const SORT_FUNCTIONS: Record<CatalogSearchSort, SortFunction> = {\n [CatalogSearchSort.NameAsc]: getStrSort(true),\n [CatalogSearchSort.NameDesc]: getStrSort(false),\n [CatalogSearchSort.PublishDateAsc]: getDateSort(true),\n [CatalogSearchSort.PublishDateDesc]: getDateSort(false),\n};\n","import lunr from \"lunr\";\nimport { Language } from \"../../constants/languages\";\nimport { CatalogPackage } from \"../package/packages\";\nimport { CatalogSearchSort } from \"./constants\";\nimport { SORT_FUNCTIONS } from \"./util\";\n\nexport interface CatalogPackageWithId extends CatalogPackage {\n id: string;\n}\n\nexport interface CatalogSearchFilters {\n // TODO: CDK Type & Tag filters\n language?: Language;\n}\n\nexport type CatalogSearchResults = Map<string, CatalogPackageWithId>;\n\nexport class CatalogSearchAPI {\n private readonly map: CatalogSearchResults;\n private index: lunr.Index;\n\n constructor(catalogData: CatalogPackage[]) {\n const catalogMap = catalogData.reduce((map, pkg) => {\n const { name, version } = pkg;\n const id = [name, version].join(\"@\");\n\n map.set(id, {\n ...pkg,\n id,\n });\n\n return map;\n }, new Map());\n\n this.map = this.sort(catalogMap, CatalogSearchSort.PublishDateDesc);\n\n this.index = lunr(function () {\n this.ref(\"id\");\n this.field(\"name\");\n this.field(\"scope\");\n this.field(\"packageName\");\n this.field(\"description\");\n this.field(\"authorName\");\n this.field(\"authorEmail\");\n\n [...catalogMap.values()].forEach((pkg) => {\n const { author, name } = pkg;\n\n const [scope, packageName] = name.split(\"/\");\n\n if (scope && packageName) {\n pkg.scope = scope;\n pkg.packageName = packageName;\n }\n\n if (typeof author === \"string\") {\n pkg.authorName = author;\n }\n\n if (author?.name) {\n pkg.authorName = author.name;\n }\n\n if (author?.email) {\n pkg.authorEmail = author.email;\n }\n\n this.add(pkg);\n });\n });\n }\n\n /**\n * Performs a Search against the catalog and returns a Map with results ordered\n * by search score / relevance\n */\n public search(params?: {\n query?: string;\n filters?: CatalogSearchFilters;\n sort?: CatalogSearchSort;\n }): CatalogSearchResults {\n const { query, filters, sort } = params ?? {};\n\n let results = query ? this.query(query) : new Map(this.map);\n\n if (filters) {\n results = this.filter(results, filters);\n }\n\n if (sort) {\n results = this.sort(results, sort);\n }\n\n return results;\n }\n\n /**\n * This calls the index search method and returns a map of results ordered by relevance.\n */\n private query(query: string): CatalogSearchResults {\n let refs: lunr.Index.Result[] = [];\n\n try {\n refs = this.index.search(query);\n } catch (e) {\n console.error(e);\n }\n\n return refs.reduce((packages, { ref }) => {\n const pkg = this.map.get(ref);\n\n if (pkg) {\n packages.set(ref, pkg);\n }\n\n return packages;\n }, new Map() as CatalogSearchResults);\n }\n\n /**\n * Filters query results. Mutates the passed-in map\n */\n private filter(\n results: CatalogSearchResults,\n filters: CatalogSearchFilters\n ): CatalogSearchResults {\n const { language } = filters;\n const copiedResults = new Map(results);\n\n copiedResults.forEach((result) => {\n if (language && language !== Language.TypeScript) {\n if (result.languages[language] === undefined) {\n copiedResults.delete(result.id);\n return;\n }\n }\n });\n\n return copiedResults;\n }\n\n /**\n * Sort filtered results\n */\n private sort(\n results: CatalogSearchResults,\n strategy: CatalogSearchSort\n ): CatalogSearchResults {\n if (strategy) {\n return new Map(\n [...results.entries()].sort(([, p1], [, p2]) =>\n SORT_FUNCTIONS[strategy](p1, p2)\n )\n );\n } else {\n return results;\n }\n }\n}\n","import {\n createContext,\n FunctionComponent,\n useCallback,\n useContext,\n useMemo,\n useState,\n} from \"react\";\nimport {\n CatalogPackageWithId,\n CatalogSearchAPI,\n} from \"../../api/catalog-search\";\nimport { PageLoader } from \"../../components/PageLoader\";\nimport { useCatalog } from \"../../contexts/Catalog\";\n\ntype SearchFn = (params: Parameters<CatalogSearchAPI[\"search\"]>[0]) => void;\n\ninterface SearchAPI {\n search: SearchFn;\n results: CatalogPackageWithId[];\n}\n\nconst SearchAPIContext = createContext<SearchAPI | undefined>(undefined);\n\nexport const useSearchAPI = () => useContext(SearchAPIContext)!;\n\nexport const SearchAPIProvider: FunctionComponent = ({ children }) => {\n const { data, loading } = useCatalog();\n const [results, setResults] = useState<SearchAPI[\"results\"]>([]);\n\n const searchAPI = useMemo(() => {\n if (data?.packages === undefined || loading) return;\n\n const instance = new CatalogSearchAPI(data.packages);\n setResults([...instance.search().values()]);\n return instance;\n }, [data, loading]);\n\n const search: SearchAPI[\"search\"] = useCallback(\n (params) => {\n if (!searchAPI) {\n return;\n }\n\n const res = searchAPI.search(params);\n setResults([...res.values()]);\n },\n [searchAPI]\n );\n\n if (!searchAPI) {\n return <PageLoader />;\n }\n\n return (\n <SearchAPIContext.Provider value={{ results, search }}>\n {children}\n </SearchAPIContext.Provider>\n );\n};\n","import { useEffect, useMemo, useState } from \"react\";\n\nexport interface UsePaginationOptions {\n limit?: number;\n offset?: number;\n}\n\nconst takePage = <T extends any[]>(\n items: T,\n opts: Required<UsePaginationOptions & { pageLimit: number }>\n) => {\n const { limit, offset, pageLimit } = opts;\n const start = (offset > pageLimit ? pageLimit : offset) * limit;\n const stop = start + limit;\n return items.slice(start, stop);\n};\n\nexport const usePagination = <T extends any[]>(\n data: T,\n options?: UsePaginationOptions\n) => {\n const { limit = 25, offset = 0 } = options ?? {};\n const pageLimit = data ? Math.floor(data.length / limit) : 0;\n\n const [page, setPage] = useState(\n takePage(data, { limit, offset, pageLimit })\n );\n\n useEffect(() => {\n setPage(takePage(data, { limit, offset, pageLimit }));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [limit, offset, data]);\n\n return useMemo(() => ({ page, pageLimit }), [page, pageLimit]);\n};\n","import { Box, Divider, Flex } from \"@chakra-ui/react\";\nimport { FunctionComponent, useEffect } from \"react\";\nimport { CatalogSearch } from \"../../components/CatalogSearch\";\nimport { PackageList } from \"../../components/PackageList\";\nimport { Page } from \"../../components/Page\";\nimport { Language } from \"../../constants/languages\";\nimport { QUERY_PARAMS } from \"../../constants/url\";\nimport { useCardView } from \"../../contexts/CardView\";\nimport { useCatalogSearch } from \"../../hooks/useCatalogSearch\";\nimport { usePagination } from \"../../hooks/usePagination\";\nimport { useQueryParams } from \"../../hooks/useQueryParams\";\nimport { getSearchPath } from \"../../util/url\";\nimport { PageControls } from \"../SearchResults/components/PageControls\";\nimport { ShowingDetails } from \"../SearchResults/components/ShowingDetails\";\nimport { LIMIT, SearchQueryParam } from \"../SearchResults/constants\";\nimport { useSearchAPI } from \"./SearchAPI\";\n\nconst toNum = (val: string) => {\n const result = parseInt(val);\n\n if (`${result}` === \"NaN\") {\n return 0;\n }\n\n return result;\n};\n\nexport const SearchResults: FunctionComponent = () => {\n const { cardView, CardViewControls } = useCardView();\n const queryParams = useQueryParams();\n const { results, search } = useSearchAPI();\n\n const searchQuery = decodeURIComponent(\n queryParams.get(QUERY_PARAMS.SEARCH_QUERY) ?? \"\"\n );\n\n const languageQuery = queryParams.get(\n QUERY_PARAMS.LANGUAGE\n ) as Language | null;\n\n const searchAPI = useCatalogSearch({\n defaultQuery: searchQuery,\n defaultLanguage: languageQuery,\n });\n\n const offset = toNum(queryParams.get(QUERY_PARAMS.OFFSET) ?? \"0\");\n\n const { page, pageLimit } = usePagination(results, { offset, limit: LIMIT });\n\n const getUrl = (\n params: Partial<{ [key in SearchQueryParam]: number | string }>\n ) => {\n return getSearchPath({\n query: (params.q ?? searchQuery) as string,\n language: languageQuery,\n offset: params.offset ?? offset,\n });\n };\n\n useEffect(() => {\n search({\n query: searchQuery,\n filters: { language: languageQuery ?? undefined },\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [languageQuery, searchQuery]);\n\n useEffect(() => {\n // Reflect changes to queryParam to search input (specifically for tag clicks)\n if (searchQuery !== searchAPI.query) {\n searchAPI.setQuery(searchQuery);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [searchQuery]);\n\n return (\n <Page\n meta={{\n title: searchQuery || \"Search\",\n description: searchQuery\n ? `${results.length} results for ${searchQuery} at Construct Hub`\n : \"Search reusable components for your cloud application\",\n }}\n pageName=\"search\"\n >\n <Flex direction=\"column\" maxW=\"100vw\">\n <Box p={4}>\n <CatalogSearch {...searchAPI} />\n </Box>\n <Divider />\n <Box p={4}>\n <Flex justify=\"space-between\" pb={4}>\n <ShowingDetails\n count={results.length}\n filtered={!!searchQuery}\n limit={LIMIT}\n offset={offset}\n />\n <CardViewControls />\n </Flex>\n <PackageList cardView={cardView} items={page} />\n <PageControls\n getPageUrl={getUrl}\n limit={LIMIT}\n offset={offset}\n pageLimit={pageLimit}\n />\n </Box>\n </Flex>\n </Page>\n );\n};\n","import { Grid } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { Page } from \"../../components/Page\";\nimport { FilterPanel } from \"./FilterPanel\";\nimport { SearchAPIProvider } from \"./SearchAPI\";\nimport { SearchResults } from \"./SearchResults\";\n\nexport const SearchRedesign: FunctionComponent = () => {\n return (\n <Page\n meta={{\n title: \"Search - Construct Hub\",\n description: \"This is a placeholder\",\n }}\n pageName=\"search\"\n >\n <SearchAPIProvider>\n <Grid gap={4} p={6} templateColumns=\"1fr 3fr\" templateRows=\"1fr\">\n {/* Filter Panel */}\n <FilterPanel />\n {/* Results, Info, and Controls */}\n\n <SearchResults />\n </Grid>\n </SearchAPIProvider>\n </Page>\n );\n};\n"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"sources":["constants/pageInfo.ts","components/Page/Page.tsx","views/SearchResults/components/ShowingDetails.tsx","views/SearchResults/constants.ts","components/PackageList/PackageList.tsx","components/PackageList/CompactCardList.tsx","components/PackageList/WideCardList.tsx","views/SearchResults/components/ArrowButton.tsx","views/SearchResults/components/GoToPage.tsx","views/SearchResults/components/NextPage.tsx","views/SearchResults/components/PageControls.tsx","api/catalog-search/constants.ts","views/SearchRedesign/Filter.tsx","views/SearchRedesign/FilterPanel.tsx","api/catalog-search/util.ts","api/catalog-search/catalog-search.ts","views/SearchRedesign/SearchAPI.tsx","hooks/usePagination/usePagination.ts","views/SearchRedesign/SearchResults.tsx","views/SearchRedesign/SearchRedesign.tsx"],"names":["pageInfo","home","event","name","faq","packageProfile","search","siteTerms","notFound","page","pageType","Page","children","meta","pageName","trackPageView","usePageView","useEffect","suffix","title","description","formattedTitle","Helmet","process","content","charSet","property","Em","as","color","fontWeight","ShowingDetails","limit","offset","count","filtered","first","last","LIMIT","listViews","PackageCardType","Compact","items","autoRows","gap","templateColumns","map","pkg","PackageCard","variant","version","Wide","spacing","PackageList","memo","cardView","loading","size","View","displayName","ArrowButton","Icon","icon","getPageUrl","props","borderRadius","borderColor","colorScheme","h","w","mx","undefined","Link","to","disabled","GoToPage","pageLimit","useState","toString","inputValue","setInputValue","push","useHistory","align","onSubmit","e","preventDefault","parseInt","max","min","onChange","target","value","p","textAlign","type","ml","btnProps","rightIcon","ArrowForward","NextPage","nextPageUrl","PageControls","nextOffset","prevOffset","alignItems","pt","templateRows","colStart","justifySelf","justify","py","ChevronLeftIcon","ChevronRightIcon","CatalogSearchSort","Filter","options","checkedValue","onValueChange","v","display","isChecked","fontSize","isTruncated","languageOptions","Object","entries","LANGUAGE_NAME_MAP","filter","key","TEMP_SUPPORTED_LANGUAGES","has","FilterPanel","cdkType","setCdkType","language","setLanguage","author","setAuthor","Card","boxShadow","getDateSort","isAscending","p1","p2","d1","Date","metadata","date","d2","getStrSort","localeCompare","SORT_FUNCTIONS","NameAsc","NameDesc","PublishDateAsc","PublishDateDesc","CatalogSearchAPI","catalogData","index","catalogMap","reduce","id","join","set","Map","this","sort","lunr","ref","field","values","forEach","split","scope","packageName","authorName","email","authorEmail","add","params","query","filters","results","refs","console","error","packages","get","copiedResults","result","Language","TypeScript","languages","delete","strategy","SearchAPIContext","createContext","SearchAPIProvider","useCatalog","data","setResults","searchAPI","useMemo","instance","useCallback","res","Provider","PageLoader","takePage","opts","start","stop","slice","SearchResults","useCardView","CardViewControls","queryParams","useQueryParams","useContext","searchQuery","decodeURIComponent","QUERY_PARAMS","SEARCH_QUERY","languageQuery","LANGUAGE","useCatalogSearch","defaultQuery","defaultLanguage","val","toNum","OFFSET","Math","floor","length","setPage","usePagination","setQuery","direction","maxW","CatalogSearch","pb","getSearchPath","q","SearchRedesign"],"mappings":"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","file":"static/js/8.24ecd2ff.chunk.js","sourcesContent":["export const pageInfo = {\n home: {\n event: {\n name: \"Home Load\",\n },\n },\n faq: {\n event: {\n name: \"Frequently Asked Questions Load\",\n },\n },\n packageProfile: {\n event: {\n name: \"Package Profile Load\",\n },\n },\n search: {\n event: {\n name: \"Search Load\",\n },\n },\n siteTerms: {\n event: {\n name: \"Site Terms Load\",\n },\n },\n notFound: {\n page: {\n pageType: \"errorPage\",\n },\n event: {\n name: \"404 Page Load\",\n },\n },\n} as const;\n","import { FunctionComponent, useEffect } from \"react\";\nimport { Helmet } from \"react-helmet\";\nimport { pageInfo } from \"../../constants/pageInfo\";\nimport { usePageView } from \"../../contexts/Analytics\";\n\nexport interface PageProps {\n pageName: keyof typeof pageInfo;\n meta: {\n suffix?: boolean;\n title: string;\n description: string;\n };\n}\n\nexport const Page: FunctionComponent<PageProps> = ({\n children,\n meta,\n pageName,\n}) => {\n const trackPageView = usePageView(pageInfo[pageName]);\n\n useEffect(() => {\n trackPageView();\n }, [trackPageView]);\n\n const { suffix = true, title, description } = meta;\n const formattedTitle = suffix ? `${title} - Construct Hub` : title;\n\n return (\n <>\n <Helmet>\n {process.env.NODE_ENV === \"development\" && (\n <meta\n content=\"default-src 'self' 'unsafe-inline' https://*.awsstatic.com https://amazonwebservices.d2.sc.omtrdc.net; connect-src 'self' https://*.shortbread.aws.dev ws://localhost:3000 https://*.awsstatic.com https://amazonwebservices.d2.sc.omtrdc.net; frame-src 'none'; img-src 'self' https://* http://*.omtrdc.net; object-src 'none'; style-src 'self' 'unsafe-inline';\"\n httpEquiv=\"Content-Security-Policy\"\n />\n )}\n\n <meta content=\"width=device-width, initial-scale=1\" name=\"viewport\" />\n <meta charSet=\"utf-8\" />\n\n <title>{formattedTitle}</title>\n <meta content={formattedTitle} property=\"og:title\" />\n <meta content={formattedTitle} name=\"twitter:title\" />\n <meta content=\"summary\" name=\"twitter:card\" />\n\n <meta content={description} name=\"description\" />\n <meta content={description} property=\"og:description\" />\n <meta content={description} name=\"twitter:description\" />\n </Helmet>\n {children}\n </>\n );\n};\n","import { Text } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\n\nexport interface ShowingDetailsProps {\n limit: number;\n offset: number;\n count: number;\n filtered: boolean;\n}\n\nconst Em: FunctionComponent = ({ children }) => (\n <Text as=\"em\" color=\"blue.500\" fontWeight=\"bold\">\n {children}\n </Text>\n);\n\nexport const ShowingDetails: FunctionComponent<ShowingDetailsProps> = ({\n limit,\n offset,\n count,\n filtered,\n}) => {\n const first = limit * offset;\n const last = first + limit;\n return (\n <Text>\n Displaying{\" \"}\n <Em>\n {count ? first + 1 : count} - {last > count ? count : last}\n </Em>{\" \"}\n of <Em>{count}</Em> {filtered ? \"search results\" : \"constructs\"}.\n </Text>\n );\n};\n","import type { QueryParamKey } from \"../../constants/url\";\n\nexport const LIMITS = [25, 50, 75, 100];\nexport const LIMIT = LIMITS[0];\n\nexport type SearchQueryParam = Extract<QueryParamKey, \"offset\" | \"q\">;\n","import { Center, Spinner } from \"@chakra-ui/react\";\nimport { FunctionComponent, memo } from \"react\";\nimport { CatalogPackage } from \"../../api/package/packages\";\nimport { PackageCardType } from \"../PackageCard\";\nimport { CompactCardList } from \"./CompactCardList\";\nimport { WideCardList } from \"./WideCardList\";\n\nconst listViews = {\n [PackageCardType.Compact]: CompactCardList,\n [PackageCardType.Wide]: WideCardList,\n};\n\nexport interface PackageListViewProps {\n items: CatalogPackage[];\n}\n\nexport interface PackageListProps extends Partial<PackageListViewProps> {\n cardView?: PackageCardType;\n loading?: boolean;\n title?: string;\n}\n\nexport const PackageList: FunctionComponent<PackageListProps> = memo(\n ({\n cardView = PackageCardType.Wide,\n items,\n loading,\n // title,\n }) => {\n if (loading || !items) {\n return (\n <Center>\n <Spinner size=\"xl\" />\n </Center>\n );\n }\n\n const View = listViews[cardView];\n\n return <View items={items} />;\n }\n);\n\nPackageList.displayName = \"PackageList\";\n","import { Grid } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { PackageCard, PackageCardType } from \"../PackageCard\";\nimport { PackageListViewProps } from \"./PackageList\";\n\nexport const CompactCardList: FunctionComponent<PackageListViewProps> = ({\n items,\n}) => {\n return (\n <Grid\n autoRows=\"auto\"\n gap={5}\n templateColumns=\"repeat(auto-fit, minmax(320px, 1fr))\"\n >\n {items.map((pkg) => (\n <PackageCard\n key={`${pkg.name}-${pkg.version}`}\n pkg={pkg}\n variant={PackageCardType.Compact}\n />\n ))}\n </Grid>\n );\n};\n","import { Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { PackageCard, PackageCardType } from \"../PackageCard\";\nimport { PackageListViewProps } from \"./PackageList\";\n\nexport const WideCardList: FunctionComponent<PackageListViewProps> = ({\n items,\n}) => {\n return (\n <Stack spacing={4}>\n {items.map((pkg) => (\n <PackageCard\n key={`${pkg.name}-${pkg.version}`}\n pkg={pkg}\n variant={PackageCardType.Wide}\n />\n ))}\n </Stack>\n );\n};\n","import { IconButton, IconProps } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\n\nexport interface ArrowButtonProps {\n icon: FunctionComponent<IconProps>;\n offset?: number;\n getPageUrl: (params: { offset: number }) => string;\n}\n\nexport const ArrowButton: FunctionComponent<ArrowButtonProps> = ({\n icon: Icon,\n offset,\n getPageUrl,\n}) => {\n const label = `Page ${offset} link`;\n\n const props = {\n \"aria-label\": label,\n borderRadius: \"md\",\n borderColor: \"blue.500\",\n colorScheme: \"blue\",\n icon: <Icon color=\"blue.500\" h={5} w={5} />,\n mx: 2,\n h: 10,\n w: 10,\n variant: \"outline\",\n };\n\n if (offset !== undefined) {\n return <IconButton {...props} as={Link} to={getPageUrl({ offset })} />;\n }\n\n return <IconButton {...props} disabled />;\n};\n","import { Flex, Input, Text } from \"@chakra-ui/react\";\nimport {\n FormEventHandler,\n FunctionComponent,\n SyntheticEvent,\n useEffect,\n useState,\n} from \"react\";\nimport { useHistory } from \"react-router-dom\";\n\nexport interface GoToPageProps {\n pageLimit: number;\n offset: number;\n getPageUrl: (params: { offset: number }) => string;\n}\n\nexport const GoToPage: FunctionComponent<GoToPageProps> = ({\n pageLimit,\n offset,\n getPageUrl,\n}) => {\n const [inputValue, setInputValue] = useState((offset + 1).toString());\n const { push } = useHistory();\n\n useEffect(() => {\n setInputValue((offset + 1).toString());\n }, [offset]);\n\n const onInputChange = (e: SyntheticEvent<HTMLInputElement>) => {\n e.preventDefault();\n setInputValue((e.target as HTMLInputElement).value);\n };\n\n const onSubmit: FormEventHandler<HTMLInputElement> = (e) => {\n e.preventDefault();\n push(getPageUrl({ offset: parseInt(inputValue) - 1 }));\n };\n\n return (\n <Flex align=\"center\" as=\"form\" mx={2} onSubmit={onSubmit}>\n <Input\n colorScheme=\"blue\"\n h={10}\n max={pageLimit + 1}\n min={1}\n name=\"page\"\n onChange={onInputChange}\n p={0}\n textAlign=\"center\"\n type=\"number\"\n value={inputValue}\n w={10}\n />\n <Text ml={2} w=\"max-content\">\n of {pageLimit + 1}\n </Text>\n </Flex>\n );\n};\n","import { ArrowForwardIcon } from \"@chakra-ui/icons\";\nimport { Button } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\n\nexport interface NextPageProps {\n nextPageUrl?: string;\n}\n\nconst btnProps = {\n children: \"Next Page\",\n colorScheme: \"blue\",\n rightIcon: <ArrowForwardIcon color=\"white\" />,\n};\n\nexport const NextPage: FunctionComponent<NextPageProps> = ({ nextPageUrl }) => {\n if (!nextPageUrl) {\n return <Button {...btnProps} disabled />;\n }\n\n return <Button {...btnProps} as={Link} to={nextPageUrl} />;\n};\n","import { ChevronLeftIcon, ChevronRightIcon } from \"@chakra-ui/icons\";\nimport { Flex, Grid, GridItem } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { ArrowButton } from \"./ArrowButton\";\nimport { GoToPage } from \"./GoToPage\";\nimport { NextPage } from \"./NextPage\";\n\nexport interface PageControlsProps {\n limit: number;\n offset: number;\n pageLimit: number;\n getPageUrl: (params: { offset?: number }) => string;\n}\n\nexport const PageControls: FunctionComponent<PageControlsProps> = ({\n offset,\n pageLimit,\n getPageUrl,\n}) => {\n const nextOffset = offset < pageLimit ? offset + 1 : undefined;\n const prevOffset = offset > 0 ? offset - 1 : undefined;\n\n return (\n <Grid\n alignItems=\"center\"\n pt={4}\n templateColumns=\"repeat(3, 1fr)\"\n templateRows=\"1fr\"\n >\n <GridItem colStart={2} justifySelf=\"center\">\n <NextPage\n nextPageUrl={\n nextOffset ? getPageUrl({ offset: nextOffset }) : undefined\n }\n />\n </GridItem>\n <GridItem colStart={3} justifySelf=\"end\">\n <Flex align=\"center\" justify=\"center\" py={4}>\n <GoToPage\n getPageUrl={getPageUrl}\n offset={offset}\n pageLimit={pageLimit}\n />\n <ArrowButton\n getPageUrl={getPageUrl}\n icon={ChevronLeftIcon}\n offset={prevOffset}\n />\n <ArrowButton\n getPageUrl={getPageUrl}\n icon={ChevronRightIcon}\n offset={nextOffset}\n />\n </Flex>\n </GridItem>\n </Grid>\n );\n};\n","export enum CatalogSearchSort {\n NameAsc = \"NameAsc\",\n NameDesc = \"NameDesc\",\n PublishDateAsc = \"PublishDateAsc\",\n PublishDateDesc = \"PublishDateDesc\",\n}\n","import { Checkbox, Heading, Stack, Text } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\nexport interface FilterProps {\n name: string;\n options: {\n display: string;\n value: string;\n }[];\n value: string | undefined;\n onValueChange: (value: string | undefined) => void;\n}\n\nexport const Filter: FunctionComponent<FilterProps> = ({\n name,\n options,\n value: checkedValue,\n onValueChange,\n}) => {\n const getOnChange = (v: string) => () => {\n onValueChange(v === checkedValue ? undefined : v);\n };\n\n return (\n <Stack spacing={2}>\n <Heading as=\"h4\" size=\"sm\">\n {name}\n </Heading>\n {options.map(({ display, value }) => (\n <Checkbox\n isChecked={value === checkedValue}\n key={value}\n onChange={getOnChange(value)}\n >\n <Text color=\"gray.600\" fontSize=\"sm\" isTruncated>\n {display}\n </Text>\n </Checkbox>\n ))}\n </Stack>\n );\n};\n","import { Heading, Stack } from \"@chakra-ui/react\";\nimport { FunctionComponent, useState } from \"react\";\nimport { Card } from \"../../components/Card\";\nimport {\n Language,\n LANGUAGE_NAME_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\nimport { Filter } from \"./Filter\";\n\nconst languageOptions = Object.entries(LANGUAGE_NAME_MAP)\n .filter(([key]) => TEMP_SUPPORTED_LANGUAGES.has(key as Language))\n .map(([key, value]) => ({\n display: value,\n value: key,\n }));\n\nexport interface FilterPanelProps {}\n\nexport const FilterPanel: FunctionComponent<FilterPanelProps> = () => {\n const [cdkType, setCdkType] = useState<string | undefined>();\n const [language, setLanguage] = useState<string | undefined>();\n const [author, setAuthor] = useState<string | undefined>();\n\n return (\n <Card borderRadius=\"none\" boxShadow=\"none\" p={4}>\n <Stack color=\"blue.800\" spacing={6}>\n <Heading as=\"h3\" size=\"sm\">\n Filters\n </Heading>\n <Filter\n name=\"CDK Type\"\n onValueChange={setCdkType}\n options={[\n {\n display: \"AWS CDK\",\n value: \"awscdk\",\n },\n {\n display: \"CDK for Terraform\",\n value: \"cdktf\",\n },\n {\n display: \"CDK for Kubernetes\",\n value: \"cdk8s\",\n },\n ]}\n value={cdkType}\n />\n <Filter\n name=\"Programming Language\"\n onValueChange={setLanguage}\n options={languageOptions}\n value={language}\n />\n <Filter\n name=\"Author\"\n onValueChange={setAuthor}\n options={[\n {\n display: \"Community\",\n value: \"community\",\n },\n {\n display: \"AWS\",\n value: \"aws\",\n },\n ]}\n value={author}\n />\n </Stack>\n </Card>\n );\n};\n","import { CatalogPackage } from \"../package/packages\";\nimport { CatalogSearchSort } from \"./constants\";\n\ntype SortFunction = (p1: CatalogPackage, p2: CatalogPackage) => number;\n\nconst getDateSort =\n (isAscending: boolean): SortFunction =>\n (p1, p2) => {\n const d1 = new Date(p1.metadata.date);\n const d2 = new Date(p2.metadata.date);\n if (d1 === d2) {\n return 0;\n }\n\n if (isAscending) {\n return d2 < d1 ? 1 : -1;\n }\n\n return d1 < d2 ? 1 : -1;\n };\n\nconst getStrSort = (isAscending: boolean): SortFunction => {\n return (p1, p2) => p1.name.localeCompare(p2.name) * (isAscending ? 1 : -1);\n};\n\nexport const SORT_FUNCTIONS: Record<CatalogSearchSort, SortFunction> = {\n [CatalogSearchSort.NameAsc]: getStrSort(true),\n [CatalogSearchSort.NameDesc]: getStrSort(false),\n [CatalogSearchSort.PublishDateAsc]: getDateSort(true),\n [CatalogSearchSort.PublishDateDesc]: getDateSort(false),\n};\n","import lunr from \"lunr\";\nimport { Language } from \"../../constants/languages\";\nimport { CatalogPackage } from \"../package/packages\";\nimport { CatalogSearchSort } from \"./constants\";\nimport { SORT_FUNCTIONS } from \"./util\";\n\nexport interface CatalogPackageWithId extends CatalogPackage {\n id: string;\n}\n\nexport interface CatalogSearchFilters {\n // TODO: CDK Type & Tag filters\n language?: Language;\n}\n\nexport type CatalogSearchResults = Map<string, CatalogPackageWithId>;\n\nexport class CatalogSearchAPI {\n private readonly map: CatalogSearchResults;\n private index: lunr.Index;\n\n constructor(catalogData: CatalogPackage[]) {\n const catalogMap = catalogData.reduce((map, pkg) => {\n const { name, version } = pkg;\n const id = [name, version].join(\"@\");\n\n map.set(id, {\n ...pkg,\n id,\n });\n\n return map;\n }, new Map());\n\n this.map = this.sort(catalogMap, CatalogSearchSort.PublishDateDesc);\n\n this.index = lunr(function () {\n this.ref(\"id\");\n this.field(\"name\");\n this.field(\"scope\");\n this.field(\"packageName\");\n this.field(\"description\");\n this.field(\"authorName\");\n this.field(\"authorEmail\");\n\n [...catalogMap.values()].forEach((pkg) => {\n const { author, name } = pkg;\n\n const [scope, packageName] = name.split(\"/\");\n\n if (scope && packageName) {\n pkg.scope = scope;\n pkg.packageName = packageName;\n }\n\n if (typeof author === \"string\") {\n pkg.authorName = author;\n }\n\n if (author?.name) {\n pkg.authorName = author.name;\n }\n\n if (author?.email) {\n pkg.authorEmail = author.email;\n }\n\n this.add(pkg);\n });\n });\n }\n\n /**\n * Performs a Search against the catalog and returns a Map with results ordered\n * by search score / relevance\n */\n public search(params?: {\n query?: string;\n filters?: CatalogSearchFilters;\n sort?: CatalogSearchSort;\n }): CatalogSearchResults {\n const { query, filters, sort } = params ?? {};\n\n let results = query ? this.query(query) : new Map(this.map);\n\n if (filters) {\n results = this.filter(results, filters);\n }\n\n if (sort) {\n results = this.sort(results, sort);\n }\n\n return results;\n }\n\n /**\n * This calls the index search method and returns a map of results ordered by relevance.\n */\n private query(query: string): CatalogSearchResults {\n let refs: lunr.Index.Result[] = [];\n\n try {\n refs = this.index.search(query);\n } catch (e) {\n console.error(e);\n }\n\n return refs.reduce((packages, { ref }) => {\n const pkg = this.map.get(ref);\n\n if (pkg) {\n packages.set(ref, pkg);\n }\n\n return packages;\n }, new Map() as CatalogSearchResults);\n }\n\n /**\n * Filters query results. Mutates the passed-in map\n */\n private filter(\n results: CatalogSearchResults,\n filters: CatalogSearchFilters\n ): CatalogSearchResults {\n const { language } = filters;\n const copiedResults = new Map(results);\n\n copiedResults.forEach((result) => {\n if (language && language !== Language.TypeScript) {\n if (result.languages[language] === undefined) {\n copiedResults.delete(result.id);\n return;\n }\n }\n });\n\n return copiedResults;\n }\n\n /**\n * Sort filtered results\n */\n private sort(\n results: CatalogSearchResults,\n strategy: CatalogSearchSort\n ): CatalogSearchResults {\n if (strategy) {\n return new Map(\n [...results.entries()].sort(([, p1], [, p2]) =>\n SORT_FUNCTIONS[strategy](p1, p2)\n )\n );\n } else {\n return results;\n }\n }\n}\n","import {\n createContext,\n FunctionComponent,\n useCallback,\n useContext,\n useMemo,\n useState,\n} from \"react\";\nimport {\n CatalogPackageWithId,\n CatalogSearchAPI,\n} from \"../../api/catalog-search\";\nimport { PageLoader } from \"../../components/PageLoader\";\nimport { useCatalog } from \"../../contexts/Catalog\";\n\ntype SearchFn = (params: Parameters<CatalogSearchAPI[\"search\"]>[0]) => void;\n\ninterface SearchAPI {\n search: SearchFn;\n results: CatalogPackageWithId[];\n}\n\nconst SearchAPIContext = createContext<SearchAPI | undefined>(undefined);\n\nexport const useSearchAPI = () => useContext(SearchAPIContext)!;\n\nexport const SearchAPIProvider: FunctionComponent = ({ children }) => {\n const { data, loading } = useCatalog();\n const [results, setResults] = useState<SearchAPI[\"results\"]>([]);\n\n const searchAPI = useMemo(() => {\n if (data?.packages === undefined || loading) return;\n\n const instance = new CatalogSearchAPI(data.packages);\n setResults([...instance.search().values()]);\n return instance;\n }, [data, loading]);\n\n const search: SearchAPI[\"search\"] = useCallback(\n (params) => {\n if (!searchAPI) {\n return;\n }\n\n const res = searchAPI.search(params);\n setResults([...res.values()]);\n },\n [searchAPI]\n );\n\n if (!searchAPI) {\n return <PageLoader />;\n }\n\n return (\n <SearchAPIContext.Provider value={{ results, search }}>\n {children}\n </SearchAPIContext.Provider>\n );\n};\n","import { useEffect, useMemo, useState } from \"react\";\n\nexport interface UsePaginationOptions {\n limit?: number;\n offset?: number;\n}\n\nconst takePage = <T extends any[]>(\n items: T,\n opts: Required<UsePaginationOptions & { pageLimit: number }>\n) => {\n const { limit, offset, pageLimit } = opts;\n const start = (offset > pageLimit ? pageLimit : offset) * limit;\n const stop = start + limit;\n return items.slice(start, stop);\n};\n\nexport const usePagination = <T extends any[]>(\n data: T,\n options?: UsePaginationOptions\n) => {\n const { limit = 25, offset = 0 } = options ?? {};\n const pageLimit = data ? Math.floor(data.length / limit) : 0;\n\n const [page, setPage] = useState(\n takePage(data, { limit, offset, pageLimit })\n );\n\n useEffect(() => {\n setPage(takePage(data, { limit, offset, pageLimit }));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [limit, offset, data]);\n\n return useMemo(() => ({ page, pageLimit }), [page, pageLimit]);\n};\n","import { Box, Divider, Flex } from \"@chakra-ui/react\";\nimport { FunctionComponent, useEffect } from \"react\";\nimport { CatalogSearch } from \"../../components/CatalogSearch\";\nimport { PackageList } from \"../../components/PackageList\";\nimport { Page } from \"../../components/Page\";\nimport { Language } from \"../../constants/languages\";\nimport { QUERY_PARAMS } from \"../../constants/url\";\nimport { useCardView } from \"../../contexts/CardView\";\nimport { useCatalogSearch } from \"../../hooks/useCatalogSearch\";\nimport { usePagination } from \"../../hooks/usePagination\";\nimport { useQueryParams } from \"../../hooks/useQueryParams\";\nimport { getSearchPath } from \"../../util/url\";\nimport { PageControls } from \"../SearchResults/components/PageControls\";\nimport { ShowingDetails } from \"../SearchResults/components/ShowingDetails\";\nimport { LIMIT, SearchQueryParam } from \"../SearchResults/constants\";\nimport { useSearchAPI } from \"./SearchAPI\";\n\nconst toNum = (val: string) => {\n const result = parseInt(val);\n\n if (`${result}` === \"NaN\") {\n return 0;\n }\n\n return result;\n};\n\nexport const SearchResults: FunctionComponent = () => {\n const { cardView, CardViewControls } = useCardView();\n const queryParams = useQueryParams();\n const { results, search } = useSearchAPI();\n\n const searchQuery = decodeURIComponent(\n queryParams.get(QUERY_PARAMS.SEARCH_QUERY) ?? \"\"\n );\n\n const languageQuery = queryParams.get(\n QUERY_PARAMS.LANGUAGE\n ) as Language | null;\n\n const searchAPI = useCatalogSearch({\n defaultQuery: searchQuery,\n defaultLanguage: languageQuery,\n });\n\n const offset = toNum(queryParams.get(QUERY_PARAMS.OFFSET) ?? \"0\");\n\n const { page, pageLimit } = usePagination(results, { offset, limit: LIMIT });\n\n const getUrl = (\n params: Partial<{ [key in SearchQueryParam]: number | string }>\n ) => {\n return getSearchPath({\n query: (params.q ?? searchQuery) as string,\n language: languageQuery,\n offset: params.offset ?? offset,\n });\n };\n\n useEffect(() => {\n search({\n query: searchQuery,\n filters: { language: languageQuery ?? undefined },\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [languageQuery, searchQuery]);\n\n useEffect(() => {\n // Reflect changes to queryParam to search input (specifically for tag clicks)\n if (searchQuery !== searchAPI.query) {\n searchAPI.setQuery(searchQuery);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [searchQuery]);\n\n return (\n <Page\n meta={{\n title: searchQuery || \"Search\",\n description: searchQuery\n ? `${results.length} results for ${searchQuery} at Construct Hub`\n : \"Search reusable components for your cloud application\",\n }}\n pageName=\"search\"\n >\n <Flex direction=\"column\" maxW=\"100vw\">\n <Box p={4}>\n <CatalogSearch {...searchAPI} />\n </Box>\n <Divider />\n <Box p={4}>\n <Flex justify=\"space-between\" pb={4}>\n <ShowingDetails\n count={results.length}\n filtered={!!searchQuery}\n limit={LIMIT}\n offset={offset}\n />\n <CardViewControls />\n </Flex>\n <PackageList cardView={cardView} items={page} />\n <PageControls\n getPageUrl={getUrl}\n limit={LIMIT}\n offset={offset}\n pageLimit={pageLimit}\n />\n </Box>\n </Flex>\n </Page>\n );\n};\n","import { Grid } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { Page } from \"../../components/Page\";\nimport { FilterPanel } from \"./FilterPanel\";\nimport { SearchAPIProvider } from \"./SearchAPI\";\nimport { SearchResults } from \"./SearchResults\";\n\nexport const SearchRedesign: FunctionComponent = () => {\n return (\n <Page\n meta={{\n title: \"Search - Construct Hub\",\n description: \"This is a placeholder\",\n }}\n pageName=\"search\"\n >\n <SearchAPIProvider>\n <Grid gap={4} p={6} templateColumns=\"1fr 3fr\" templateRows=\"1fr\">\n {/* Filter Panel */}\n <FilterPanel />\n {/* Results, Info, and Controls */}\n\n <SearchResults />\n </Grid>\n </SearchAPIProvider>\n </Page>\n );\n};\n"],"sourceRoot":""}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
(this["webpackJsonpconstruct-hub-webapp"]=this["webpackJsonpconstruct-hub-webapp"]||[]).push([[9],{232:function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var a=n(0),r=n(245),c={home:{event:{name:"Home Load"}},faq:{event:{name:"Frequently Asked Questions Load"}},packageProfile:{event:{name:"Package Profile Load"}},search:{event:{name:"Search Load"}},siteTerms:{event:{name:"Site Terms Load"}},notFound:{page:{pageType:"errorPage"},event:{name:"404 Page Load"}}},i=n(112),o=n(1),s=function(e){var t=e.children,n=e.meta,s=e.pageName,l=Object(i.b)(c[s]);Object(a.useEffect)((function(){l()}),[l]);var u=n.suffix,d=void 0===u||u,b=n.title,m=n.description,f=d?"".concat(b," - Construct Hub"):b;return Object(o.jsxs)(o.Fragment,{children:[Object(o.jsxs)(r.a,{children:[!1,Object(o.jsx)("meta",{content:"width=device-width, initial-scale=1",name:"viewport"}),Object(o.jsx)("meta",{charSet:"utf-8"}),Object(o.jsx)("title",{children:f}),Object(o.jsx)("meta",{content:f,property:"og:title"}),Object(o.jsx)("meta",{content:f,name:"twitter:title"}),Object(o.jsx)("meta",{content:"summary",name:"twitter:card"}),Object(o.jsx)("meta",{content:m,name:"description"}),Object(o.jsx)("meta",{content:m,property:"og:description"}),Object(o.jsx)("meta",{content:m,name:"twitter:description"})]}),t]})}},248:function(e,t,n){"use strict";n.d(t,"a",(function(){return u}));var a=n(6),r=n(22),c=n(18),i=n(190),o=n(296),s=n(1),l=["sources"],u=Object(c.a)((function(e,t){var n=e.sources,c=Object(r.a)(e,l);return Object(s.jsxs)(i.a,{as:"picture",children:[null===n||void 0===n?void 0:n.map((function(e,t){return Object(s.jsx)("source",{media:e.media,srcSet:e.srcSet},t)})),Object(s.jsx)(o.a,Object(a.a)({ref:t},c))]})}));u.displayName="Picture"},271:function(e,t,n){"use strict";n.r(t),n.d(t,"NotFound",(function(){return d})),n.d(t,"default",(function(){return d}));var a=n(215),r=n(205),c=n(149),i=n(24),o=n(232),s=n(248),l=n(1),u={optimal:[{media:"(max-width:1024px)",srcSet:"/assets/404-hive@50.webp"},{media:"(min-width:1024px)",srcSet:"/assets/404-hive@100.webp"},{media:"(min-width:1024px)",srcSet:"/assets/404-hive@100.png"}],fallback:"/assets/404-hive@50.png"},d=function(){return Object(l.jsx)(o.a,{meta:{title:"Not Found",description:"Oops! The page you were looking for does not exist"},pageName:"notFound",children:Object(l.jsxs)(a.a,{h:"100%",position:"relative",w:"100%",children:[Object(l.jsx)(s.a,{alt:"",inset:0,position:"absolute",sources:u.optimal,src:u.fallback,zIndex:"hide"}),Object(l.jsxs)(r.a,{align:"center",direction:"column",justify:"center",children:[Object(l.jsx)(s.a,{alt:"404 Image",sources:[{srcSet:"/assets/robot.webp"}],src:"/assets/robot.png"}),Object(l.jsx)(c.a,{as:i.b,colorScheme:"blue",to:"/",children:"Take Me Home"})]})]})})}},296:function(e,t,n){"use strict";n.d(t,"a",(function(){return m}));var a=n(18),r=n(23),c=n(28),i=n(8),o=n(0),s=n(4),l=n(142);function u(){return u=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var a in n)Object.prototype.hasOwnProperty.call(n,a)&&(e[a]=n[a])}return e},u.apply(this,arguments)}function d(e,t){if(null==e)return{};var n,a,r={},c=Object.keys(e);for(a=0;a<c.length;a++)n=c[a],t.indexOf(n)>=0||(r[n]=e[n]);return r}var b=o.forwardRef((function(e,t){var n=e.htmlWidth,a=e.htmlHeight,r=e.alt,c=d(e,["htmlWidth","htmlHeight","alt"]);return o.createElement("img",u({width:n,height:a,ref:t,alt:r},c))})),m=Object(a.a)((function(e,t){var n=e.fallbackSrc,a=e.fallback,i=e.src,m=e.srcSet,f=e.align,j=e.fit,g=e.loading,p=e.ignoreFallback,h=e.crossOrigin,O=d(e,["fallbackSrc","fallback","src","srcSet","align","fit","loading","ignoreFallback","crossOrigin"]),v=null!=g||p||void 0===n&&void 0===a,x=function(e){var t=e.loading,n=e.src,a=e.srcSet,r=e.onLoad,c=e.onError,i=e.crossOrigin,u=e.sizes,d=e.ignoreFallback,b=Object(o.useState)("pending"),m=Object(s.a)(b,2),f=m[0],j=m[1];Object(o.useEffect)((function(){j(n?"loading":"pending")}),[n]);var g=Object(o.useRef)(),p=Object(o.useCallback)((function(){if(n){h();var e=new Image;e.src=n,i&&(e.crossOrigin=i),a&&(e.srcset=a),u&&(e.sizes=u),t&&(e.loading=t),e.onload=function(e){h(),j("loaded"),null==r||r(e)},e.onerror=function(e){h(),j("failed"),null==c||c(e)},g.current=e}}),[n,i,a,u,r,c,t]),h=function(){g.current&&(g.current.onload=null,g.current.onerror=null,g.current=null)};return Object(l.a)((function(){if(!d)return"loading"===f&&p(),function(){h()}}),[f,p,d]),d?"loaded":f}(u({},e,{ignoreFallback:v})),w=u({ref:t,objectFit:j,objectPosition:f},v?O:Object(c.g)(O,["onError","onLoad"]));return"loaded"!==x?a||o.createElement(r.a.img,u({as:b,className:"chakra-image__placeholder",src:n},w)):o.createElement(r.a.img,u({as:b,src:i,srcSet:m,crossOrigin:h,loading:g,className:"chakra-image"},w))}));i.a&&(m.displayName="Image")}}]);
|
|
2
|
+
//# sourceMappingURL=9.214e3382.chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["constants/pageInfo.ts","components/Page/Page.tsx","components/Picture/Picture.tsx","views/NotFound/NotFound.tsx","../../../src/image.tsx","../../../src/use-image.ts"],"names":["pageInfo","home","event","name","faq","packageProfile","search","siteTerms","notFound","page","pageType","Page","children","meta","pageName","trackPageView","usePageView","useEffect","suffix","title","description","formattedTitle","Helmet","process","content","charSet","property","Picture","forwardRef","ref","sources","props","as","map","source","idx","media","srcSet","displayName","bgSources","optimal","fallback","NotFound","h","position","w","alt","inset","src","zIndex","align","direction","justify","Link","colorScheme","to","NativeImage","width","height","Image","crossOrigin","shouldIgnore","loading","fallbackSrc","status","ignoreFallback","useState","setStatus","imageRef","useRef","load","useCallback","flush","img","onLoad","error","onError","sizes","useSafeLayoutEffect","useImage","shared","objectFit","objectPosition","rest","omit","className"],"mappings":"0LAAaA,EAAW,CACtBC,KAAM,CACJC,MAAO,CACLC,KAAM,cAGVC,IAAK,CACHF,MAAO,CACLC,KAAM,oCAGVE,eAAgB,CACdH,MAAO,CACLC,KAAM,yBAGVG,OAAQ,CACNJ,MAAO,CACLC,KAAM,gBAGVI,UAAW,CACTL,MAAO,CACLC,KAAM,oBAGVK,SAAU,CACRC,KAAM,CACJC,SAAU,aAEZR,MAAO,CACLC,KAAM,mB,gBCjBCQ,EAAqC,SAAC,GAI5C,IAHLC,EAGI,EAHJA,SACAC,EAEI,EAFJA,KACAC,EACI,EADJA,SAEMC,EAAgBC,YAAYhB,EAASc,IAE3CG,qBAAU,WACRF,MACC,CAACA,IAEJ,MAA8CF,EAAtCK,cAAR,SAAuBC,EAAuBN,EAAvBM,MAAOC,EAAgBP,EAAhBO,YACxBC,EAAiBH,EAAM,UAAMC,EAAN,oBAAgCA,EAE7D,OACE,qCACE,eAACG,EAAA,EAAD,YACGC,EAOD,sBAAMC,QAAQ,sCAAsCrB,KAAK,aACzD,sBAAMsB,QAAQ,UAEd,gCAAQJ,IACR,sBAAMG,QAASH,EAAgBK,SAAS,aACxC,sBAAMF,QAASH,EAAgBlB,KAAK,kBACpC,sBAAMqB,QAAQ,UAAUrB,KAAK,iBAE7B,sBAAMqB,QAASJ,EAAajB,KAAK,gBACjC,sBAAMqB,QAASJ,EAAaM,SAAS,mBACrC,sBAAMF,QAASJ,EAAajB,KAAK,2BAElCS,O,qICvCMe,EAAUC,aACrB,WAAwBC,GAAxB,IAAGC,EAAH,EAAGA,QAAYC,EAAf,wBACE,eAAC,IAAD,CAAKC,GAAG,UAAR,iBACGF,QADH,IACGA,OADH,EACGA,EAASG,KAAI,SAACC,EAAQC,GAAT,OACZ,wBAAkBC,MAAOF,EAAOE,MAAOC,OAAQH,EAAOG,QAAzCF,MAEf,cAAC,IAAD,aAAON,IAAKA,GAASE,UAK3BJ,EAAQW,YAAc,W,yLChBhBC,EAAY,CAChBC,QAAS,CACP,CAAEJ,MAAO,qBAAsBC,OAAQ,4BACvC,CAAED,MAAO,qBAAsBC,OAAQ,6BACvC,CAAED,MAAO,qBAAsBC,OAAQ,6BAEzCI,SAAU,2BAGCC,EAA8B,WACzC,OACE,cAAC/B,EAAA,EAAD,CACEE,KAAM,CACJM,MAAO,YACPC,YAAa,sDAEfN,SAAS,WALX,SAOE,eAAC,IAAD,CAAQ6B,EAAE,OAAOC,SAAS,WAAWC,EAAE,OAAvC,UACE,cAAClB,EAAA,EAAD,CACEmB,IAAI,GACJC,MAAO,EACPH,SAAS,WACTd,QAASS,EAAUC,QACnBQ,IAAKT,EAAUE,SACfQ,OAAO,SAET,eAAC,IAAD,CAAMC,MAAM,SAASC,UAAU,SAASC,QAAQ,SAAhD,UACE,cAACzB,EAAA,EAAD,CACEmB,IAAI,YACJhB,QAAS,CAAC,CAAEO,OAAQ,uBACpBW,IAAI,sBAEN,cAAC,IAAD,CAAQhB,GAAIqB,IAAMC,YAAY,OAAOC,GAAG,IAAxC,oC,mdCfV,IAAMC,EAAc,cAClB,cACE,IAAM,EAAN,EAAM,YAAN,EAAM,WAAyBV,EAA/B,EAA+BA,IAA/B,wCACA,OACE,yBACEW,MADF,EAEEC,OAFF,EAGE7B,IAHF,EAIEiB,IAAKA,GALT,OAyDSa,EAAQ/B,aAA8B,cACjD,IAAM,EAAN,EAAM,cAAN,EAAM,WAAN,EAAM,MAAN,EAAM,SAAN,EAAM,QAAN,EAAM,MAAN,EAAM,UAAN,EAAM,eASJgC,EATF,EASEA,YATF,wGAiBMC,EACJC,iBAECC,YArB8D,IAqBjCtB,EAE1BuB,EC3CD,SAAkBjC,GACvB,IAAM,EAAN,EAAM,UAAN,EAAM,MAAN,EAAM,SAAN,EAAM,SAAN,EAAM,UAAN,EAAM,cAAN,EAAM,MAQJkC,EARF,EAQEA,eAGF,EAA4BC,mBAA5B,8BAAM,EAAN,KAAM,EAAN,KAEAjD,qBAAU,WACRkD,EAAUnB,EAAM,UAAhBmB,aACC,CAFHlD,IAIA,IAAMmD,EAAWC,mBAEXC,EAAOC,uBAAY,WACvB,MAEAC,IAEA,IAAMC,EAAM,IAAZ,MACAA,QACA,IAAiBA,iBACjB,IAAYA,YACZ,IAAWA,WACX,IAAaA,aAEbA,SAAcvE,YACZsE,IACAL,YACAO,eAEFD,UAAeE,YACbH,IACAL,YACAS,eAGFR,eACC,CAACpB,EAAKY,EAAavB,EAAQwC,EAAOH,EAAQE,EAxB7C,IA0BMJ,EAAQ,WACRJ,EAAJ,UACEA,sBACAA,uBACAA,iBAuBJ,OAnBAU,aAAoB,WAKlB,MAKA,MAHA,YAAId,GACFM,IAEK,WACLE,OAED,CAACR,EAAQM,EAbZQ,IAmBOb,EAAiB,SAAxB,ED9Bec,CAAS,EAAD,MAErBd,eAAgBJ,KAGZmB,EAAS,EAAH,CACVnD,MACAoD,UAFU,EAGVC,eAAgBhC,GACZW,EAAesB,EAAOC,YAAKD,EAAM,CAAC,UAJxC,YAOA,iBAAInB,EAKF,GAGE,gBAAC,IAAD,OACEhC,GADF,EAEEqD,UAFF,4BAGErC,IAAKe,GAJT,IAWA,gBAAC,IAAD,OACE/B,GADF,EAEEgB,IAFF,EAGEX,OAHF,EAIEuB,YAJF,EAKEE,QALF,EAMEuB,UAAU,gBAPd,OAuBE,EAAJ,IACE1B","file":"static/js/9.214e3382.chunk.js","sourcesContent":["export const pageInfo = {\n home: {\n event: {\n name: \"Home Load\",\n },\n },\n faq: {\n event: {\n name: \"Frequently Asked Questions Load\",\n },\n },\n packageProfile: {\n event: {\n name: \"Package Profile Load\",\n },\n },\n search: {\n event: {\n name: \"Search Load\",\n },\n },\n siteTerms: {\n event: {\n name: \"Site Terms Load\",\n },\n },\n notFound: {\n page: {\n pageType: \"errorPage\",\n },\n event: {\n name: \"404 Page Load\",\n },\n },\n} as const;\n","import { FunctionComponent, useEffect } from \"react\";\nimport { Helmet } from \"react-helmet\";\nimport { pageInfo } from \"../../constants/pageInfo\";\nimport { usePageView } from \"../../contexts/Analytics\";\n\nexport interface PageProps {\n pageName: keyof typeof pageInfo;\n meta: {\n suffix?: boolean;\n title: string;\n description: string;\n };\n}\n\nexport const Page: FunctionComponent<PageProps> = ({\n children,\n meta,\n pageName,\n}) => {\n const trackPageView = usePageView(pageInfo[pageName]);\n\n useEffect(() => {\n trackPageView();\n }, [trackPageView]);\n\n const { suffix = true, title, description } = meta;\n const formattedTitle = suffix ? `${title} - Construct Hub` : title;\n\n return (\n <>\n <Helmet>\n {process.env.NODE_ENV === \"development\" && (\n <meta\n content=\"default-src 'self' 'unsafe-inline' https://*.awsstatic.com https://amazonwebservices.d2.sc.omtrdc.net; connect-src 'self' https://*.shortbread.aws.dev ws://localhost:3000 https://*.awsstatic.com https://amazonwebservices.d2.sc.omtrdc.net; frame-src 'none'; img-src 'self' https://* http://*.omtrdc.net; object-src 'none'; style-src 'self' 'unsafe-inline';\"\n httpEquiv=\"Content-Security-Policy\"\n />\n )}\n\n <meta content=\"width=device-width, initial-scale=1\" name=\"viewport\" />\n <meta charSet=\"utf-8\" />\n\n <title>{formattedTitle}</title>\n <meta content={formattedTitle} property=\"og:title\" />\n <meta content={formattedTitle} name=\"twitter:title\" />\n <meta content=\"summary\" name=\"twitter:card\" />\n\n <meta content={description} name=\"description\" />\n <meta content={description} property=\"og:description\" />\n <meta content={description} name=\"twitter:description\" />\n </Helmet>\n {children}\n </>\n );\n};\n","import { Box, HTMLChakraProps, forwardRef, Image } from \"@chakra-ui/react\";\n\nexport interface PictureProps extends HTMLChakraProps<\"img\"> {\n alt: string;\n src: string;\n sources?: {\n media?: string;\n srcSet: string;\n }[];\n}\n\nexport const Picture = forwardRef<PictureProps, \"img\">(\n ({ sources, ...props }, ref) => (\n <Box as=\"picture\">\n {sources?.map((source, idx) => (\n <source key={idx} media={source.media} srcSet={source.srcSet} />\n ))}\n <Image ref={ref} {...props} />\n </Box>\n )\n);\n\nPicture.displayName = \"Picture\";\n","import { Button, Center, Flex } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { Page } from \"../../components/Page\";\nimport { Picture } from \"../../components/Picture\";\n\nconst bgSources = {\n optimal: [\n { media: \"(max-width:1024px)\", srcSet: \"/assets/404-hive@50.webp\" },\n { media: \"(min-width:1024px)\", srcSet: \"/assets/404-hive@100.webp\" },\n { media: \"(min-width:1024px)\", srcSet: \"/assets/404-hive@100.png\" },\n ],\n fallback: \"/assets/404-hive@50.png\",\n};\n\nexport const NotFound: FunctionComponent = () => {\n return (\n <Page\n meta={{\n title: \"Not Found\",\n description: \"Oops! The page you were looking for does not exist\",\n }}\n pageName=\"notFound\"\n >\n <Center h=\"100%\" position=\"relative\" w=\"100%\">\n <Picture\n alt=\"\"\n inset={0}\n position=\"absolute\"\n sources={bgSources.optimal}\n src={bgSources.fallback}\n zIndex=\"hide\"\n />\n <Flex align=\"center\" direction=\"column\" justify=\"center\">\n <Picture\n alt=\"404 Image\"\n sources={[{ srcSet: \"/assets/robot.webp\" }]}\n src=\"/assets/robot.png\"\n />\n <Button as={Link} colorScheme=\"blue\" to=\"/\">\n Take Me Home\n </Button>\n </Flex>\n </Center>\n </Page>\n );\n};\n","import {\n chakra,\n PropsOf,\n SystemProps,\n forwardRef,\n HTMLChakraProps,\n} from \"@chakra-ui/system\"\nimport { omit, __DEV__ } from \"@chakra-ui/utils\"\nimport * as React from \"react\"\nimport { useImage, UseImageProps } from \"./use-image\"\n\ninterface NativeImageOptions {\n /**\n * The native HTML `width` attribute to the passed to the `img`\n */\n htmlWidth?: string | number\n /**\n * The native HTML `height` attribute to the passed to the `img`\n */\n htmlHeight?: string | number\n}\n\ninterface NativeImageProps extends PropsOf<\"img\">, NativeImageOptions {}\n\nconst NativeImage = React.forwardRef(\n (props: NativeImageProps, ref: React.Ref<any>) => {\n const { htmlWidth, htmlHeight, alt, ...rest } = props\n return (\n <img\n width={htmlWidth}\n height={htmlHeight}\n ref={ref}\n alt={alt}\n {...rest}\n />\n )\n },\n)\n\ninterface ImageOptions extends NativeImageOptions {\n /**\n * Fallback image `src` to show if image is loading or image fails.\n *\n * Note 🚨: We recommend you use a local image\n */\n fallbackSrc?: string\n /**\n * Fallback element to show if image is loading or image fails.\n * @type React.ReactElement\n */\n fallback?: React.ReactElement\n /**\n * Defines loading strategy\n */\n loading?: \"eager\" | \"lazy\"\n /**\n * How the image to fit within its bounds.\n * It maps to css `object-fit` property.\n * @type SystemProps[\"objectFit\"]\n */\n fit?: SystemProps[\"objectFit\"]\n /**\n * How to align the image within its bounds.\n * It maps to css `object-position` property.\n * @type SystemProps[\"objectPosition\"]\n */\n align?: SystemProps[\"objectPosition\"]\n /**\n * If `true`, opt out of the `fallbackSrc` logic and use as `img`\n */\n ignoreFallback?: boolean\n}\n\nexport interface ImageProps\n extends UseImageProps,\n Omit<HTMLChakraProps<\"img\">, keyof UseImageProps>,\n ImageOptions {}\n\n/**\n * React component that renders an image with support\n * for fallbacks\n *\n * @see Docs https://chakra-ui.com/image\n */\nexport const Image = forwardRef<ImageProps, \"img\">((props, ref) => {\n const {\n fallbackSrc,\n fallback,\n src,\n srcSet,\n align,\n fit,\n loading,\n ignoreFallback,\n crossOrigin,\n ...rest\n } = props\n\n /**\n * Defer to native `img` tag if `loading` prop is passed\n * @see https://github.com/chakra-ui/chakra-ui/issues/1027\n */\n const shouldIgnore =\n loading != null ||\n ignoreFallback ||\n (fallbackSrc === undefined && fallback === undefined) // if the user doesn't provide any kind of fallback we should ignore it\n\n const status = useImage({\n ...props,\n ignoreFallback: shouldIgnore,\n })\n\n const shared = {\n ref,\n objectFit: fit,\n objectPosition: align,\n ...(shouldIgnore ? rest : omit(rest, [\"onError\", \"onLoad\"])),\n }\n\n if (status !== \"loaded\") {\n /**\n * If user passed a custom fallback component,\n * let's render it here.\n */\n if (fallback) return fallback\n\n return (\n <chakra.img\n as={NativeImage}\n className=\"chakra-image__placeholder\"\n src={fallbackSrc}\n {...shared}\n />\n )\n }\n\n return (\n <chakra.img\n as={NativeImage}\n src={src}\n srcSet={srcSet}\n crossOrigin={crossOrigin}\n loading={loading}\n className=\"chakra-image\"\n {...shared}\n />\n )\n})\n\nexport interface ImgProps extends HTMLChakraProps<\"img\">, NativeImageOptions {}\n\n/**\n * Fallback component for most SSR users who want to use the native `img` with\n * support for chakra props\n */\nexport const Img = forwardRef<ImgProps, \"img\">((props, ref) => (\n <chakra.img ref={ref} as={NativeImage} className=\"chakra-image\" {...props} />\n))\n\nif (__DEV__) {\n Image.displayName = \"Image\"\n}\n","import { useSafeLayoutEffect } from \"@chakra-ui/hooks\"\nimport {\n ImgHTMLAttributes,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\"\n\ntype NativeImageProps = ImgHTMLAttributes<HTMLImageElement>\n\nexport interface UseImageProps {\n /**\n * The image `src` attribute\n */\n src?: string\n /**\n * The image `srcset` attribute\n */\n srcSet?: string\n /**\n * The image `sizes` attribute\n */\n sizes?: string\n /**\n * A callback for when the image `src` has been loaded\n */\n onLoad?: NativeImageProps[\"onLoad\"]\n /**\n * A callback for when there was an error loading the image `src`\n */\n onError?: NativeImageProps[\"onError\"]\n /**\n * If `true`, opt out of the `fallbackSrc` logic and use as `img`\n */\n ignoreFallback?: boolean\n /**\n * The key used to set the crossOrigin on the HTMLImageElement into which the image will be loaded.\n * This tells the browser to request cross-origin access when trying to download the image data.\n */\n crossOrigin?: NativeImageProps[\"crossOrigin\"]\n loading?: NativeImageProps[\"loading\"]\n}\n\ntype Status = \"loading\" | \"failed\" | \"pending\" | \"loaded\"\n\ntype ImageEvent = React.SyntheticEvent<HTMLImageElement, Event>\n\n/**\n * React hook that loads an image in the browser,\n * and let's us know the `status` so we can show image\n * fallback if it is still `pending`\n *\n * @returns the status of the image loading progress\n *\n * @example\n *\n * ```jsx\n * function App(){\n * const status = useImage({ src: \"image.png\" })\n * return status === \"loaded\" ? <img src=\"image.png\" /> : <Placeholder />\n * }\n * ```\n */\nexport function useImage(props: UseImageProps) {\n const {\n loading,\n src,\n srcSet,\n onLoad,\n onError,\n crossOrigin,\n sizes,\n ignoreFallback,\n } = props\n\n const [status, setStatus] = useState<Status>(\"pending\")\n\n useEffect(() => {\n setStatus(src ? \"loading\" : \"pending\")\n }, [src])\n\n const imageRef = useRef<HTMLImageElement | null>()\n\n const load = useCallback(() => {\n if (!src) return\n\n flush()\n\n const img = new Image()\n img.src = src\n if (crossOrigin) img.crossOrigin = crossOrigin\n if (srcSet) img.srcset = srcSet\n if (sizes) img.sizes = sizes\n if (loading) img.loading = loading\n\n img.onload = (event) => {\n flush()\n setStatus(\"loaded\")\n onLoad?.((event as unknown) as ImageEvent)\n }\n img.onerror = (error) => {\n flush()\n setStatus(\"failed\")\n onError?.(error as any)\n }\n\n imageRef.current = img\n }, [src, crossOrigin, srcSet, sizes, onLoad, onError, loading])\n\n const flush = () => {\n if (imageRef.current) {\n imageRef.current.onload = null\n imageRef.current.onerror = null\n imageRef.current = null\n }\n }\n\n useSafeLayoutEffect(() => {\n /**\n * If user opts out of the fallback/placeholder\n * logic, let's bail out.\n */\n if (ignoreFallback) return undefined\n\n if (status === \"loading\") {\n load()\n }\n return () => {\n flush()\n }\n }, [status, load, ignoreFallback])\n\n /**\n * If user opts out of the fallback/placeholder\n * logic, let's just return 'loaded'\n */\n return ignoreFallback ? \"loaded\" : status\n}\n\nexport type UseImageReturn = ReturnType<typeof useImage>\n"],"sourceRoot":""}
|