construct-hub-webapp 0.1.437 → 0.1.441
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 +40 -40
- package/build/index.html +1 -1
- package/build/static/js/0.5d7aa10f.chunk.js +2 -0
- package/build/static/js/{0.2e120b2f.chunk.js.map → 0.5d7aa10f.chunk.js.map} +1 -1
- package/build/static/js/{1.9cc19f93.chunk.js → 1.81b10c86.chunk.js} +2 -2
- package/build/static/js/{1.9cc19f93.chunk.js.map → 1.81b10c86.chunk.js.map} +1 -1
- package/build/static/js/{10.dc8329c6.chunk.js → 10.c1cef902.chunk.js} +2 -2
- package/build/static/js/{10.dc8329c6.chunk.js.map → 10.c1cef902.chunk.js.map} +1 -1
- package/build/static/js/{11.e9698bc0.chunk.js → 11.f17b9786.chunk.js} +2 -2
- package/build/static/js/{11.e9698bc0.chunk.js.map → 11.f17b9786.chunk.js.map} +1 -1
- package/build/static/js/{12.5f44f9cb.chunk.js → 12.058c1e48.chunk.js} +2 -2
- package/build/static/js/{12.5f44f9cb.chunk.js.map → 12.058c1e48.chunk.js.map} +1 -1
- package/build/static/js/{13.edbebe8c.chunk.js → 13.4a6bd352.chunk.js} +2 -2
- package/build/static/js/{13.edbebe8c.chunk.js.map → 13.4a6bd352.chunk.js.map} +1 -1
- package/build/static/js/{14.be59e36b.chunk.js → 14.bc7a075e.chunk.js} +2 -2
- package/build/static/js/{14.be59e36b.chunk.js.map → 14.bc7a075e.chunk.js.map} +1 -1
- package/build/static/js/{15.45c9624b.chunk.js → 15.6ef33063.chunk.js} +3 -3
- package/build/static/js/{15.45c9624b.chunk.js.LICENSE.txt → 15.6ef33063.chunk.js.LICENSE.txt} +0 -0
- package/build/static/js/{15.45c9624b.chunk.js.map → 15.6ef33063.chunk.js.map} +1 -1
- package/build/static/js/{16.185808b7.chunk.js → 16.f993fdf0.chunk.js} +2 -2
- package/build/static/js/{16.185808b7.chunk.js.map → 16.f993fdf0.chunk.js.map} +1 -1
- package/build/static/js/{4.7cdaa0a7.chunk.js → 4.99a7c5e1.chunk.js} +3 -3
- package/build/static/js/{4.7cdaa0a7.chunk.js.LICENSE.txt → 4.99a7c5e1.chunk.js.LICENSE.txt} +0 -0
- package/build/static/js/{4.7cdaa0a7.chunk.js.map → 4.99a7c5e1.chunk.js.map} +1 -1
- package/build/static/js/5.56be1caf.chunk.js +3 -0
- package/build/static/js/{5.a4f881bb.chunk.js.LICENSE.txt → 5.56be1caf.chunk.js.LICENSE.txt} +0 -0
- package/build/static/js/{5.a4f881bb.chunk.js.map → 5.56be1caf.chunk.js.map} +1 -1
- package/build/static/js/6.602ea6c4.chunk.js +2 -0
- package/build/static/js/6.602ea6c4.chunk.js.map +1 -0
- package/build/static/js/7.41bc0560.chunk.js +2 -0
- package/build/static/js/7.41bc0560.chunk.js.map +1 -0
- package/build/static/js/8.d6885f9c.chunk.js +2 -0
- package/build/static/js/8.d6885f9c.chunk.js.map +1 -0
- package/build/static/js/{9.cd98fda9.chunk.js → 9.44832d44.chunk.js} +2 -2
- package/build/static/js/{9.cd98fda9.chunk.js.map → 9.44832d44.chunk.js.map} +1 -1
- package/build/static/js/main.291a3b91.chunk.js +2 -0
- package/build/static/js/main.291a3b91.chunk.js.map +1 -0
- package/build/static/js/runtime-main.305e7aa3.js +2 -0
- package/build/static/js/{runtime-main.ac3364bb.js.map → runtime-main.305e7aa3.js.map} +1 -1
- package/cypress/integration/home.spec.ts +1 -1
- package/cypress/integration/search.spec.ts +2 -2
- package/package.json +1 -1
- package/build/static/js/0.2e120b2f.chunk.js +0 -2
- package/build/static/js/5.a4f881bb.chunk.js +0 -3
- package/build/static/js/6.37c76213.chunk.js +0 -2
- package/build/static/js/6.37c76213.chunk.js.map +0 -1
- package/build/static/js/7.868cb67c.chunk.js +0 -2
- package/build/static/js/7.868cb67c.chunk.js.map +0 -1
- package/build/static/js/8.ddcecc46.chunk.js +0 -2
- package/build/static/js/8.ddcecc46.chunk.js.map +0 -1
- package/build/static/js/main.b05b661e.chunk.js +0 -2
- package/build/static/js/main.b05b661e.chunk.js.map +0 -1
- package/build/static/js/runtime-main.ac3364bb.js +0 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["constants/pageInfo.ts","components/Page/Page.tsx","util/package.ts","hooks/useQueryParams/useQueryParams.ts","hooks/useConfigValue/useConfigValue.ts","hooks/useLanguage/useLanguage.ts","components/PackageCard/constants.ts","components/PackageCard/testIds.ts","components/PackageCard/Details.tsx","components/PackageCard/EditorsNote.tsx","components/PackageCard/Heading.tsx","components/PackageCard/Highlight.tsx","components/PackageLanguages/PackageLanguages.tsx","components/PackageCard/Languages.tsx","components/PackageCard/Tags.tsx","components/PackageCard/WideCard.tsx","components/PackageCard/PackageCard.tsx","components/Time/Time.tsx","components/Highlight/Highlight.tsx","components/PackageTag/PackageTag.tsx","components/LanguageSupportTooltip/LanguageSupportTooltip.tsx","views/Search/constants.ts","views/Search/FilterHeading.tsx","views/Search/testIds.ts","views/Search/RadioFilter.tsx","views/Search/util.ts","views/Search/SearchState.tsx","views/Search/CDKFilter.tsx","views/Search/CheckboxFilter.tsx","views/Search/KeywordsFilter.tsx","views/Search/LanguageFilter.tsx","views/Search/TagFilter.tsx","views/Search/FilterPanel.tsx","components/PackageList/PackageList.tsx","components/PackageList/WideCardList.tsx","views/Search/ArrowButton.tsx","views/Search/GoToPage.tsx","views/Search/PageControls.tsx","views/Search/SearchDetails.tsx","views/Search/SortFilter.tsx","views/Search/SortAndFilterDrawer.tsx","views/Search/SortedBy.tsx","views/Search/SearchResults.tsx","views/Search/Search.tsx"],"names":["pageInfo","contribute","event","name","home","faq","packageProfile","search","siteTerms","notFound","page","pageType","Page","join","children","meta","pageName","trackPageView","usePageView","useEffect","suffix","title","description","formattedTitle","Helmet","process","content","charSet","property","highlightsFrom","packageTags","length","reduce","accum","tag","highlight","tagObjectsFrom","keywords","tagObjects","Array","tagLabels","Set","filter","Boolean","keyword","label","map","id","mapPackageTags","KEYWORD_IGNORE_LIST","has","mapPackageKeywords","toLowerCase","push","add","useQueryParams","useLocation","useMemo","URLSearchParams","useConfigValue","key","data","useConfig","defaultLang","Language","TypeScript","LOCAL_KEY","isValidLang","lang","TEMP_SUPPORTED_LANGUAGES","getInitialLang","langFromParams","storedLang","localStorage","getItem","useLanguage","options","updateUrl","updateSaved","pathname","hash","useHistory","replace","params","get","QUERY_PARAMS","LANGUAGE","useState","language","setLanguage","set","toString","update","useCallback","val","setItem","PackageCardType","testIds","createTestIds","Detail","dataTestid","tooltip","value","hasArrow","isDisabled","placement","fontSize","zIndex","Details","usePackageCard","author","date","metadata","useStats","downloads","packages","npm","authorName","publishDate","Date","undefined","toLocaleString","published","Time","formattedDate","formatDistanceToNowStrict","addSuffix","NavLink","color","to","getSearchPath","query","EditorsNote","comment","lineHeight","noOfLines","as","fontWeight","Heading","currentLanguage","dataEvent","constructFramework","version","cdkType","cdkVersion","majorVersion","Link","eventName","getPackagePath","align","CDKType","mr","wordBreak","Highlight","sizes","sm","md","lg","PackageLanguages","isRounded","languages","packageName","size","targets","Object","keys","entries","LANGUAGE_RENDER_MAP","sort","left","right","LANGUAGES","indexOf","info","isSupportedByLibrary","includes","isSupportedByConstructHub","Icon","icon","borderRadius","h","opacity","w","LanguageSupportTooltip","Languages","pkg","Tags","tags","slice","PackageTag","variant","WideCard","_hover","bg","border","boxShadow","wideContainer","minH","templateColumns","base","direction","justify","overflow","p","sx","gap","spacing","wrap","borderLeft","borderTop","PackageCardContext","createContext","useContext","PackageCard","Wide","Provider","forwardRef","ref","formatString","format","boxProps","dateTime","toISOString","displayName","alt","src","tagProps","textDecoration","isSupported","langName","LANGUAGE_NAME_MAP","message","SORT_RENDER_MAP","CatalogSearchSort","NameAsc","NameDesc","PublishDateAsc","PublishDateDesc","DownloadsDesc","DownloadsAsc","searchEvent","e","SEARCH_ANALYTICS","FILTERS","RESULTS","SEARCH","SORT","FilterHeading","hint","useBreakpointValue","mb","colorScheme","strategy","ml","mx","shadow","RadioFilter","checkedValue","onValueChange","onChange","display","filterItem","isTruncated","toNum","result","parseInt","parseQueryArray","queryString","decodeURIComponent","split","SearchStateContext","useSearchState","state","Error","SearchStateProvider","queryParams","offset","OFFSET","SEARCH_QUERY","tagQuery","TAGS","keywordQuery","KEYWORDS","CDK_TYPE","cdkMajorParam","CDK_MAJOR","cdkMajor","searchAPI","useCatalogSearch","defaultCdkMajor","defaultCdkType","defaultKeywords","defaultLanguages","defaultQuery","defaultSort","defaultTags","setQuery","some","k","setKeywords","t","setTags","setCdkType","setCdkMajor","limit","CDKFilter","useSearchContext","cdkOptions","cdkTypes","constructFrameworks","opts","pkgCount","CDKTYPE_NAME_MAP","majorsOptions","majorVersions","a","b","cdkTypeFilter","type","cdk","values","cdkVersionFilter","major","majorNum","CheckboxItem","disabledHint","isChecked","CheckboxFilter","initialItemCount","checkedValues","collapse","useDisclosure","trackCustomEvent","useAnalytics","getOnChange","item","clickEvent","alwaysShow","showWhenExpanded","isExpandible","mt","animateOpacity","in","isOpen","unmountOnExit","leftIcon","onClick","onToggle","textAlign","KeywordsFilter","keywordMap","keywordOptions","baseOptions","keywordsNotInOptions","opt","languagesFilter","languageOptions","l1","l2","LanguageFilter","setLanguages","l","TagFilter","tagFilterGroups","searchFilter","groupName","groupBy","onTagsChange","tagItems","TOP_OFFSET","FilterPanel","Card","filtersPanel","maxH","maxW","minW","pos","top","listViews","items","PackageList","memo","cardView","loading","View","ArrowButton","getPageUrl","props","borderColor","disabled","GoToPage","pageLimit","inputValue","setInputValue","onSubmit","preventDefault","max","min","target","onFocus","PageControls","nextOffset","prevOffset","prevPage","ChevronLeftIcon","goToPage","nextPage","ChevronRightIcon","Em","Count","first","count","last","SearchDetails","filtered","hasResults","searchDetails","SortFilter","setSort","newSort","SortAndFilterDrawer","drawer","onOpen","rightIcon","borderBottom","pb","SortedBy","selected","Button","sortButton","pl","pr","py","sortDropdown","sortItem","SearchResults","isFirstRender","useRef","onSearch","useCatalogResults","results","getUrl","q","current","window","scrollTo","px","SearchBar","onQueryChange","Search","templateRows"],"mappings":"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","file":"static/js/8.d6885f9c.chunk.js","sourcesContent":["export const pageInfo = {\n contribute: {\n event: {\n name: \"Contribute Load\",\n },\n },\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\n// Should be the same as the \"real\" CSP, except most things come from HTTP\n// instead of HTTPS (because it is protocol-relative, and the dev site is\n// served over plain HTTP).\nconst csp = [\n \"default-src 'self' 'unsafe-inline' http://*.awsstatic.com;\",\n \"connect-src 'self' https://*.shortbread.aws.dev http://*.shortbread.aws.dev http://a0.awsstatic.com/ http://amazonwebservices.d2.sc.omtrdc.net http://aws.demdex.net http://dpm.demdex.net http://cm.everesttech.net;\",\n \"frame-src http://aws.demdex.net http://dpm.demdex.net;\",\n \"img-src 'self' https://* http://a0.awsstatic.com/ http://amazonwebservices.d2.sc.omtrdc.net http://aws.demdex.net http://dpm.demdex.net http://cm.everesttech.net;\",\n \"object-src 'none';\",\n \"style-src 'self' 'unsafe-inline';\",\n].join(\" \");\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 content={csp} httpEquiv=\"Content-Security-Policy\" />\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 { PackageHighlight, PackageTagConfig } from \"../api/config\";\nimport { KEYWORD_IGNORE_LIST } from \"../constants/keywords\";\n\nexport interface TagObject extends PackageTagConfig {}\n\n/**\n * Reduces package tags to only return highlight tags\n */\nexport const highlightsFrom = (packageTags?: PackageTagConfig[]) => {\n if (!packageTags || packageTags.length < 1) return [];\n\n return packageTags.reduce(\n (accum: PackageHighlight[], tag: PackageTagConfig): PackageHighlight[] => {\n if (tag.highlight) {\n return [...accum, tag.highlight];\n }\n\n return accum;\n },\n []\n );\n};\n\n/**\n * Maps packageTags to an array of TagObjects, which can be rendered by the PackageTags Component\n */\nexport const mapPackageTags = (\n packageTags?: PackageTagConfig[]\n): TagObject[] => {\n return (packageTags ?? [])\n .filter((tag) => {\n return Boolean(tag.keyword?.label);\n })\n .map((tag) => ({\n ...tag,\n id: tag.keyword?.label!,\n }));\n};\n\n/**\n * Maps keywords to an array of TagObjects, which can be rendered by the PackageTags component\n */\nexport const mapPackageKeywords = (keywords?: string[]): TagObject[] => {\n if (!keywords || keywords.length < 1) return [];\n\n return keywords\n .filter((label) => Boolean(label) && !KEYWORD_IGNORE_LIST.has(label))\n .map((label) => ({\n id: label,\n keyword: {\n label,\n },\n }));\n};\n\n/**\n * Maps packageTags and keywords to a list of TagObjects, using mapPackageTags and mapPackageKeywords\n */\nexport const tagObjectsFrom = ({\n packageTags,\n keywords,\n}: {\n packageTags?: PackageTagConfig[];\n keywords?: string[];\n}): TagObject[] => {\n const tagObjects = new Array<TagObject>();\n const tagLabels = new Set<string>();\n\n for (const tag of [\n ...mapPackageTags(packageTags),\n ...mapPackageKeywords(keywords),\n ]) {\n const label = tag.keyword!.label.toLowerCase();\n if (!tagLabels.has(label)) {\n tagObjects.push(tag);\n tagLabels.add(label);\n }\n }\n\n return tagObjects;\n};\n","import { useMemo } from \"react\";\nimport { useLocation } from \"react-router-dom\";\n\nexport const useQueryParams = () => {\n const { search } = useLocation();\n\n return useMemo(() => new URLSearchParams(search), [search]);\n};\n","import type { Config } from \"../../api/config\";\nimport { useConfig } from \"../../contexts/Config\";\n\nexport const useConfigValue = <T extends keyof Config>(key: T) => {\n const { data } = useConfig();\n return (data ?? {})[key];\n};\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useLocation, useHistory } from \"react-router-dom\";\nimport { Language, TEMP_SUPPORTED_LANGUAGES } from \"../../constants/languages\";\nimport { QUERY_PARAMS } from \"../../constants/url\";\nimport { useQueryParams } from \"../../hooks/useQueryParams\";\n\n// Only supported language atm\nconst defaultLang = Language.TypeScript;\n\nconst LOCAL_KEY = \"preferred-language\";\n\nconst isValidLang = (lang?: string | Language): lang is Language =>\n lang != null && TEMP_SUPPORTED_LANGUAGES.has(lang as Language);\n\nconst getInitialLang = (langFromParams: string | Language): Language => {\n // First, use language from query params in url\n if (isValidLang(langFromParams)) {\n return langFromParams;\n }\n\n // Next check for one stored in localStorage\n try {\n const storedLang = (localStorage.getItem(LOCAL_KEY) ?? \"\") as Language;\n if (isValidLang(storedLang)) return storedLang;\n } catch {\n // Do nothing, we just don't want to crash if localStorage access is blocked.\n }\n\n // Otherwise fallback to a default\n return defaultLang;\n};\n\nexport interface UseLanguageOptions {\n /**\n * Syncs the preferred language to a query param in URL\n */\n updateUrl?: boolean;\n /**\n * Saves the selected language to localStorage on select\n */\n updateSaved?: boolean;\n}\n\nexport const useLanguage = (options: UseLanguageOptions = {}) => {\n const { updateUrl, updateSaved } = options;\n const { pathname, hash } = useLocation();\n const { replace } = useHistory();\n const params = useQueryParams();\n const langFromParams = params.get(QUERY_PARAMS.LANGUAGE) as Language;\n\n // Passed as function to guarantee it runs on hook mount\n const [language, setLanguage] = useState<Language>(() =>\n getInitialLang(langFromParams)\n );\n\n // State subscribes to query param changes\n useEffect(() => {\n if (isValidLang(langFromParams) && langFromParams !== language) {\n setLanguage(langFromParams);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [langFromParams]);\n\n // Syncs language changes to URL if updateUrl = true\n useEffect(() => {\n if (langFromParams !== language && updateUrl) {\n params.set(QUERY_PARAMS.LANGUAGE, language);\n replace({ pathname, hash, search: params.toString() });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [language, updateUrl]);\n\n const update = useCallback(\n (val: Language) => {\n setLanguage(val);\n\n if (updateSaved) {\n try {\n localStorage.setItem(LOCAL_KEY, val);\n } catch {\n // OK to fail silently\n }\n }\n },\n [updateSaved]\n );\n\n return useMemo(() => [language, update] as const, [language, update]);\n};\n","export enum PackageCardType {\n Wide = \"wide\",\n}\n","import { createTestIds } from \"../../util/createTestIds\";\n\nconst testIds = createTestIds(\"packageCard\", [\n \"author\",\n \"description\",\n \"downloads\",\n \"languages\",\n \"published\",\n \"title\",\n \"version\",\n \"comment\",\n \"wideContainer\",\n] as const);\n\nexport default testIds;\n","import { Text, Tooltip } from \"@chakra-ui/react\";\nimport { formatDistanceToNowStrict } from \"date-fns\";\nimport { FunctionComponent, ReactChild } from \"react\";\nimport { useStats } from \"../../hooks/useStats\";\nimport { getSearchPath } from \"../../util/url\";\nimport { NavLink } from \"../NavLink\";\nimport { Time } from \"../Time\";\nimport { usePackageCard } from \"./PackageCard\";\nimport testIds from \"./testIds\";\n\ninterface DetailProps {\n \"data-testid\": string;\n tooltip?: string;\n value: ReactChild;\n}\n\nconst Detail: FunctionComponent<DetailProps> = ({\n \"data-testid\": dataTestid,\n tooltip,\n value,\n}) => (\n <Tooltip hasArrow isDisabled={!tooltip} label={tooltip} placement=\"left\">\n {/* zIndex required to allow tooltip to display due to card link overlay */}\n <Text data-testid={dataTestid} fontSize=\"xs\" zIndex={1}>\n {value}\n </Text>\n </Tooltip>\n);\n\nexport const Details: FunctionComponent = () => {\n const {\n author,\n metadata: { date },\n name,\n } = usePackageCard();\n\n const { data } = useStats();\n const downloads: number | undefined = data?.packages?.[name]?.downloads?.npm;\n\n const authorName = typeof author === \"string\" ? author : author.name;\n const publishDate = new Date(date);\n\n return (\n <>\n {downloads !== undefined && (\n <Detail\n data-testid={testIds.downloads}\n tooltip=\"Download numbers are periodically sourced from the npm registry\"\n value={`${downloads.toLocaleString()} weekly downloads`}\n />\n )}\n <Detail\n data-testid={testIds.published}\n value={\n <Time\n date={publishDate}\n fontSize=\"xs\"\n formattedDate={formatDistanceToNowStrict(publishDate, {\n addSuffix: true,\n })}\n />\n }\n />\n <Detail\n data-testid={testIds.author}\n value={\n <>\n By{\" \"}\n <NavLink\n color=\"blue.500\"\n to={getSearchPath({\n query: authorName,\n })}\n >\n {authorName}\n </NavLink>\n </>\n }\n />\n </>\n );\n};\n","import { Text } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport testIds from \"./testIds\";\n\nexport const EditorsNote: FunctionComponent<{ comment?: string }> = ({\n comment,\n}) => {\n return (\n <Text\n data-testid={testIds.comment}\n fontSize=\"md\"\n lineHeight=\"tall\"\n noOfLines={4}\n >\n <Text as=\"span\" color=\"blue.500\" fontWeight=\"bold\">\n Editor's note:{\" \"}\n </Text>\n {comment}\n </Text>\n );\n};\n","import {\n Flex,\n Heading as ChakraHeading,\n LinkOverlay,\n Text,\n} from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { eventName } from \"../../contexts/Analytics\";\nimport { useLanguage } from \"../../hooks/useLanguage\";\nimport { getPackagePath } from \"../../util/url\";\nimport { CDKTypeBadge } from \"../CDKType\";\nimport { EditorsNote } from \"./EditorsNote\";\nimport { usePackageCard } from \"./PackageCard\";\nimport testIds from \"./testIds\";\n\nexport const Heading: FunctionComponent = () => {\n const [currentLanguage] = useLanguage();\n const {\n dataEvent,\n description,\n comment,\n metadata: { constructFramework },\n name,\n version,\n } = usePackageCard();\n\n const cdkType = constructFramework?.name;\n const cdkVersion = constructFramework?.majorVersion;\n\n return (\n <>\n <LinkOverlay\n as={Link}\n data-event={\n dataEvent ? eventName(dataEvent, \"Package Card\", name) : undefined\n }\n to={getPackagePath({\n name,\n version,\n language: currentLanguage,\n })}\n >\n <Flex align=\"center\">\n <CDKTypeBadge majorVersion={cdkVersion} mr={2} name={cdkType} />\n <ChakraHeading\n as=\"h3\"\n color=\"blue.800\"\n data-testid={testIds.title}\n fontSize=\"md\"\n fontWeight=\"bold\"\n wordBreak=\"normal\"\n >\n {name}\n </ChakraHeading>\n </Flex>\n </LinkOverlay>\n {comment ? (\n <EditorsNote comment={comment} />\n ) : (\n <Text\n color=\"blue.800\"\n data-testid={testIds.description}\n fontSize=\"md\"\n lineHeight=\"tall\"\n noOfLines={4}\n >\n {description || \"No description available.\"}\n </Text>\n )}\n </>\n );\n};\n","import { Box } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { highlightsFrom } from \"../../util/package\";\nimport { Highlight as HighlightComponent } from \"../Highlight\";\nimport { usePackageCard } from \"./PackageCard\";\n\nexport const Highlight: FunctionComponent = () => {\n const { packageTags = [] } = usePackageCard()?.metadata ?? {};\n const [highlight] = highlightsFrom(packageTags);\n\n if (!highlight) return null;\n\n return (\n <Box fontSize=\"xs\">\n <HighlightComponent {...highlight} />\n </Box>\n );\n};\n","import type { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport {\n Language,\n LANGUAGES,\n LANGUAGE_RENDER_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\nimport { getPackagePath } from \"../../util/url\";\nimport { LanguageSupportTooltip } from \"../LanguageSupportTooltip\";\n\nconst sizes = {\n sm: 5,\n md: 6,\n lg: 8,\n};\n\nexport interface PackageLanguagesProps {\n isRounded?: boolean;\n languages?: Partial<Record<Language, unknown>>;\n name: string;\n size?: \"sm\" | \"md\" | \"lg\";\n version: string;\n}\n\nexport const PackageLanguages: FunctionComponent<PackageLanguagesProps> = ({\n isRounded = false,\n languages,\n name: packageName,\n size = \"md\",\n version,\n}) => {\n const targets = Object.keys(languages ?? {}) as Language[];\n return (\n <>\n {Object.entries(LANGUAGE_RENDER_MAP)\n // Ensure entries are always sorted in a stable way\n .sort(\n ([left], [right]) =>\n LANGUAGES.indexOf(left as Language) -\n LANGUAGES.indexOf(right as Language)\n )\n .map(([lang, info]) => {\n const language = lang as Language;\n\n const isSupportedByLibrary =\n language === Language.TypeScript || targets.includes(language);\n\n const isSupportedByConstructHub =\n language === Language.TypeScript || // TypeScript is always supported\n // Otherwise, the language must be supported by ConstructHub\n TEMP_SUPPORTED_LANGUAGES.has(language);\n\n if (!isSupportedByLibrary) return null;\n\n const { name, icon: Icon } = info;\n\n const icon = (\n <Icon\n aria-label={`Supports ${name}`}\n borderRadius={isRounded ? \"50%\" : 0}\n h={sizes[size]}\n opacity={isSupportedByConstructHub ? 1 : 0.2}\n w={sizes[size]}\n />\n );\n\n return (\n <LanguageSupportTooltip key={language} language={language}>\n {isSupportedByConstructHub ? (\n <Link\n aria-label={`View package docs for ${language}`}\n to={getPackagePath({ name: packageName, version, language })}\n >\n {icon}\n </Link>\n ) : (\n icon\n )}\n </LanguageSupportTooltip>\n );\n })}\n </>\n );\n};\n","import type { FunctionComponent } from \"react\";\nimport { PackageLanguages } from \"../PackageLanguages\";\nimport { usePackageCard } from \"./PackageCard\";\n\nexport const Languages: FunctionComponent = () => {\n const pkg = usePackageCard();\n return <PackageLanguages {...pkg} size=\"sm\" />;\n};\n","import { FunctionComponent } from \"react\";\nimport { tagObjectsFrom } from \"../../util/package\";\nimport { PackageTag } from \"../PackageTag\";\nimport { usePackageCard } from \"./PackageCard\";\n\nexport const Tags: FunctionComponent = () => {\n const {\n keywords = [],\n metadata: { packageTags = [] },\n } = usePackageCard();\n\n const tags = tagObjectsFrom({\n packageTags,\n keywords,\n });\n\n return (\n <>\n {tags.slice(0, 10).map(({ id, keyword: { label, color } = {} }) => (\n <PackageTag key={id} value={id} variant={color}>\n {label}\n </PackageTag>\n ))}\n </>\n );\n};\n","import { Flex, Grid, LinkBox, Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Details } from \"./Details\";\nimport { Heading } from \"./Heading\";\nimport { Highlight } from \"./Highlight\";\nimport { Languages } from \"./Languages\";\nimport { Tags } from \"./Tags\";\nimport testIds from \"./testIds\";\n\nexport const WideCard: FunctionComponent = () => {\n return (\n <LinkBox\n _hover={{\n \"> article\": {\n bg: \"gray.50\",\n },\n }}\n >\n <Grid\n as=\"article\"\n bg=\"white\"\n border=\"base\"\n borderRadius=\"sm\"\n boxShadow=\"base\"\n color=\"blue.800\"\n data-testid={testIds.wideContainer}\n h=\"full\"\n minH=\"12.5rem\"\n templateColumns={{ base: \"1fr\", lg: \"1fr 14rem\" }}\n w=\"full\"\n >\n {/* Top / Left side of card */}\n <Flex\n direction=\"column\"\n justify=\"space-between\"\n overflow=\"hidden\"\n p={5}\n sx={{ gap: \"0.5rem\" }}\n >\n <Stack spacing={3}>\n <Heading />\n </Stack>\n\n <Flex align=\"center\" sx={{ gap: \"0.5rem\" }} wrap=\"wrap\">\n <Tags />\n </Flex>\n </Flex>\n\n {/* Bottom / Right side of card */}\n <Flex\n align={{ base: \"end\", lg: \"initial\" }}\n borderLeft={{ lg: \"base\" }}\n borderTop={{ base: \"base\", lg: \"none\" }}\n direction={{ base: \"row\", lg: \"column\" }}\n justify=\"space-between\"\n p={5}\n sx={{ gap: \"0.5rem\" }}\n >\n <Stack spacing={1}>\n <Highlight />\n <Stack spacing={1}>\n <Details />\n </Stack>\n </Stack>\n\n <Stack data-testid={testIds.languages} direction=\"row\" spacing={2}>\n <Languages />\n </Stack>\n </Flex>\n </Grid>\n </LinkBox>\n );\n};\n","import { createContext, FunctionComponent, useContext } from \"react\";\nimport { CatalogPackage } from \"../../api/package/packages\";\nimport { PackageCardType } from \"./constants\";\nimport { WideCard } from \"./WideCard\";\n\nexport interface PackageCardProps {\n \"data-event\"?: string;\n pkg: CatalogPackage;\n variant?: PackageCardType;\n}\n\ninterface PackageCardState extends CatalogPackage {\n comment?: string;\n dataEvent?: string;\n}\n\nconst PackageCardContext = createContext<PackageCardState | null>(null);\n\nexport const usePackageCard = () => useContext(PackageCardContext)!;\n\nexport const PackageCard: FunctionComponent<PackageCardProps> = ({\n \"data-event\": dataEvent,\n pkg,\n variant = PackageCardType.Wide,\n}) => {\n return (\n <PackageCardContext.Provider value={{ ...pkg, dataEvent }}>\n {variant === PackageCardType.Wide && <WideCard />}\n </PackageCardContext.Provider>\n );\n};\n","import { Box, BoxProps, forwardRef } from \"@chakra-ui/react\";\nimport { format } from \"date-fns\";\n\nexport type TimeOptions = {\n date: Date;\n format?: string;\n formattedDate?: string;\n};\n\nexport interface TimeProps extends BoxProps, TimeOptions {}\n\nexport const Time = forwardRef<TimeProps, \"time\">(\n ({ date, format: formatString, formattedDate, ...boxProps }, ref) => {\n return (\n <Box as=\"time\" dateTime={date.toISOString()} ref={ref} {...boxProps}>\n {formattedDate ?? format(date, formatString ?? \"\")}\n </Box>\n );\n }\n);\n\nTime.displayName = \"Time\";\n","import { Stack, Image, Text } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\n\ninterface HighlightProps {\n label: string;\n color?: string;\n icon?: string;\n}\n\nexport const Highlight: FunctionComponent<HighlightProps> = ({\n label,\n color,\n icon,\n}: HighlightProps) => {\n return (\n <Stack align=\"center\" direction=\"row\" spacing={2}>\n <Image alt={`${label} icon`} src={icon} w={4} />\n <Text color={color} fontWeight=\"bold\">\n {label}\n </Text>\n </Stack>\n );\n};\n","import { Tag, TagLabel, TagProps } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { getSearchPath } from \"../../util/url\";\nimport { NavLink } from \"../NavLink\";\n\nexport interface PackageTagProps extends TagProps {\n value: string;\n label?: string;\n zIndex?: string | number;\n}\n\nexport const PackageTag: FunctionComponent<PackageTagProps> = ({\n children,\n value,\n label = value,\n zIndex,\n ...tagProps\n}) => {\n return (\n <NavLink\n aria-label={`Tag: ${label}`}\n to={getSearchPath({ keywords: [value] })}\n zIndex={zIndex}\n >\n <Tag\n _hover={{\n textDecoration: \"underline\",\n }}\n {...tagProps}\n >\n <TagLabel>{children}</TagLabel>\n </Tag>\n </NavLink>\n );\n};\n","import { Tooltip } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport {\n Language,\n LANGUAGE_NAME_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\n\nexport interface LanguageSupportTooltipProps {\n language: Language;\n}\n\nexport const LanguageSupportTooltip: FunctionComponent<\n LanguageSupportTooltipProps\n> = ({ children, language }) => {\n const isSupported = TEMP_SUPPORTED_LANGUAGES.has(language);\n const langName = LANGUAGE_NAME_MAP[language];\n\n const message = isSupported\n ? `Click to view documentation in ${langName}`\n : `Documentation support for ${langName} is coming soon!`;\n\n return (\n <Tooltip hasArrow label={message} placement=\"top-start\">\n <span>{children}</span>\n </Tooltip>\n );\n};\n","import { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport type { QueryParamKey } from \"../../constants/url\";\nimport { eventName } from \"../../contexts/Analytics\";\n\nconst LIMITS = [25, 50, 75, 100];\nexport const LIMIT = LIMITS[0];\n\nexport type SearchQueryParam = Extract<QueryParamKey, \"offset\" | \"q\">;\n\nexport const SORT_RENDER_MAP = {\n [CatalogSearchSort.NameAsc]: \"A-Z\",\n [CatalogSearchSort.NameDesc]: \"Z-A\",\n [CatalogSearchSort.PublishDateAsc]: \"Oldest first\",\n [CatalogSearchSort.PublishDateDesc]: \"Newest first\",\n [CatalogSearchSort.DownloadsDesc]: \"Most downloads\",\n [CatalogSearchSort.DownloadsAsc]: \"Least downloads\",\n};\n\nconst searchEvent: typeof eventName = (...e) => eventName(\"Search\", ...e);\n\nexport const SEARCH_ANALYTICS = {\n FILTERS: searchEvent(\"Filters\"),\n RESULTS: searchEvent(\"Results\"),\n SEARCH: searchEvent(\"Search\"),\n SORT: searchEvent(\"Sort\"),\n};\n","import { QuestionIcon } from \"@chakra-ui/icons\";\nimport {\n Flex,\n Heading,\n Text,\n Popover,\n PopoverTrigger,\n PopoverBody,\n PopoverArrow,\n PopoverContent,\n useBreakpointValue,\n PlacementWithLogical,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { eventName } from \"../../contexts/Analytics\";\nimport { SEARCH_ANALYTICS } from \"./constants\";\n\nexport interface FilterHeadingProps {\n name: string;\n hint?: string;\n}\n\nexport const FilterHeading: FunctionComponent<FilterHeadingProps> = ({\n name,\n hint,\n}) => {\n const placement = useBreakpointValue<PlacementWithLogical>({\n base: \"auto\",\n md: \"right\",\n });\n\n return (\n <Flex align=\"center\" mb={1}>\n <Heading as=\"h4\" size=\"sm\" w=\"max-content\">\n {name}\n </Heading>\n {hint ? (\n <Popover colorScheme=\"dark\" placement={placement} strategy=\"fixed\">\n <PopoverTrigger>\n <Flex\n aria-label={`Hint: ${name}`}\n as=\"button\"\n data-event={eventName(SEARCH_ANALYTICS.FILTERS, name, \"Popover\")}\n ml={2}\n >\n <QuestionIcon h={3.5} w={3.5} />\n </Flex>\n </PopoverTrigger>\n <PopoverContent\n bg=\"gray.700\"\n borderRadius=\"base\"\n color=\"white\"\n fontSize=\"sm\"\n mx={{ base: \"1rem\", md: \"initial\" }}\n shadow=\"whiteAlpha.300\"\n >\n <PopoverArrow bg=\"gray.700\" />\n <PopoverBody>\n <Text>{hint}</Text>\n </PopoverBody>\n </PopoverContent>\n </Popover>\n ) : null}\n </Flex>\n );\n};\n","import { createTestIds } from \"../../util/createTestIds\";\n\nexport default createTestIds(\"searchRedesign\", [\n \"page\",\n // Results\n \"searchDetails\",\n \"nextPage\",\n \"prevPage\",\n \"goToPage\",\n // Sorting\n \"sortButton\",\n \"sortDropdown\",\n \"sortItem\",\n // Filters Panel\n \"filtersPanel\",\n \"cdkTypeFilter\",\n \"cdkVersionFilter\",\n \"filterItem\",\n \"languagesFilter\",\n] as const);\n","import { Radio, RadioGroup, Stack, Text } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { eventName } from \"../../contexts/Analytics\";\nimport { SEARCH_ANALYTICS } from \"./constants\";\nimport { FilterHeading, FilterHeadingProps } from \"./FilterHeading\";\nimport testIds from \"./testIds\";\n\nexport interface RadioFilterProps extends FilterHeadingProps {\n \"data-testid\"?: string;\n value?: string;\n onValueChange: (value: string) => void;\n options: {\n display: string;\n value: string;\n }[];\n}\n\nexport const RadioFilter: FunctionComponent<RadioFilterProps> = ({\n \"data-testid\": dataTestid,\n value: checkedValue,\n onValueChange,\n options,\n name,\n hint,\n}) => {\n return (\n <Stack data-testid={dataTestid} spacing={1}>\n <FilterHeading hint={hint} name={name} />\n <RadioGroup onChange={onValueChange} value={checkedValue}>\n <Stack spacing={1}>\n {options.map(({ display, value }) => {\n const dataEvent = eventName(\n SEARCH_ANALYTICS.FILTERS,\n name,\n \"Filter\",\n display\n );\n return (\n <Radio data-event={dataEvent} key={value} value={value}>\n <Text\n color=\"gray.600\"\n data-event={dataEvent}\n data-testid={testIds.filterItem}\n data-value={value}\n isTruncated\n >\n {display}\n </Text>\n </Radio>\n );\n })}\n </Stack>\n </RadioGroup>\n </Stack>\n );\n};\n","export const 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 parseQueryArray = <T extends string>(\n queryString: string | null\n) => {\n if (!queryString) return [];\n\n return decodeURIComponent(queryString).split(\",\") as T[];\n};\n","/**\n * @fileoverview Exposes page-level state and setters to all components in the new SearchResults View.\n */\nimport {\n createContext,\n FunctionComponent,\n useContext,\n useEffect,\n useMemo,\n} from \"react\";\nimport { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport { CDKType } from \"../../constants/constructs\";\nimport { Language } from \"../../constants/languages\";\nimport { QUERY_PARAMS } from \"../../constants/url\";\nimport {\n UseCatalogSearchReturn,\n useCatalogSearch,\n} from \"../../hooks/useCatalogSearch\";\nimport { useQueryParams } from \"../../hooks/useQueryParams\";\nimport { LIMIT } from \"./constants\";\nimport { parseQueryArray, toNum } from \"./util\";\n\nexport interface SearchState {\n limit: number;\n offset: number;\n query: string;\n searchAPI: UseCatalogSearchReturn;\n}\n\nconst SearchStateContext = createContext<SearchState | undefined>(undefined);\n\n/**\n * A hook to access Search Page specific state. This can only be in descendants of the new Search Page\n * and will otherwise throw an error.\n */\nexport const useSearchState = () => {\n const state = useContext(SearchStateContext);\n\n if (!state) {\n throw new Error(\n `This hook must be called in a child of <SearchStateProvider />`\n );\n }\n\n return state;\n};\n\nexport const SearchStateProvider: FunctionComponent = ({ children }) => {\n const queryParams = useQueryParams();\n\n const offset = toNum(queryParams.get(QUERY_PARAMS.OFFSET) ?? \"0\");\n\n const query = decodeURIComponent(\n queryParams.get(QUERY_PARAMS.SEARCH_QUERY) ?? \"\"\n );\n\n const languages: Language[] = parseQueryArray(\n queryParams.get(QUERY_PARAMS.LANGUAGES)\n );\n const tagQuery = queryParams.get(QUERY_PARAMS.TAGS);\n const tags = useMemo(() => parseQueryArray(tagQuery), [tagQuery]);\n\n const keywordQuery = queryParams.get(QUERY_PARAMS.KEYWORDS);\n const keywords = useMemo(() => parseQueryArray(keywordQuery), [keywordQuery]);\n\n const sort = (queryParams.get(QUERY_PARAMS.SORT) ?? undefined) as\n | CatalogSearchSort\n | undefined;\n\n const cdkType =\n (queryParams.get(QUERY_PARAMS.CDK_TYPE) as CDKType) ?? undefined;\n\n const cdkMajorParam = queryParams.get(QUERY_PARAMS.CDK_MAJOR);\n const cdkMajor = cdkMajorParam ? toNum(cdkMajorParam) : undefined;\n\n const searchAPI = useCatalogSearch({\n defaultCdkMajor: cdkMajor,\n defaultCdkType: cdkType,\n defaultKeywords: keywords,\n defaultLanguages: languages,\n defaultQuery: query,\n defaultSort: sort,\n defaultTags: tags,\n });\n\n useEffect(() => {\n if (query !== searchAPI.query) {\n searchAPI.setQuery(query);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [query]);\n\n useEffect(() => {\n if (keywords.some((k) => !searchAPI.keywords.includes(k))) {\n searchAPI.setKeywords(keywords);\n }\n\n if (tags.some((t) => !searchAPI.tags.includes(t))) {\n searchAPI.setTags(tags);\n }\n\n if (cdkType !== searchAPI.cdkType) {\n searchAPI.setCdkType(cdkType);\n }\n\n if (cdkMajor !== searchAPI.cdkMajor) {\n searchAPI.setCdkMajor(cdkMajor);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [cdkMajor, cdkType, keywords, tags]);\n\n return (\n <SearchStateContext.Provider\n value={{\n limit: LIMIT,\n offset,\n query,\n searchAPI,\n }}\n >\n {children}\n </SearchStateContext.Provider>\n );\n};\n","import { FunctionComponent, useMemo } from \"react\";\nimport { CatalogConstructFrameworkMeta } from \"../../api/catalog-search\";\nimport { CDKType, CDKTYPE_NAME_MAP } from \"../../constants/constructs\";\nimport { useSearchContext } from \"../../contexts/Search\";\nimport { RadioFilter } from \"./RadioFilter\";\nimport { useSearchState } from \"./SearchState\";\nimport testIds from \"./testIds\";\n\ntype CDKOptions = Partial<{\n [key in CDKType]: CatalogConstructFrameworkMeta & {\n display: string;\n value: key;\n };\n}>;\n\nexport const CDKFilter: FunctionComponent = () => {\n const { cdkType, setCdkType, cdkMajor, setCdkMajor } =\n useSearchState().searchAPI;\n const searchAPI = useSearchContext()!;\n\n // Options with less than one package will be omitted\n const cdkOptions = useMemo(() => {\n const cdkTypes = searchAPI.constructFrameworks;\n const options = Object.entries(cdkTypes).reduce((opts, [name, meta]) => {\n if (meta.pkgCount < 1) {\n return opts;\n }\n\n return {\n ...opts,\n [name]: {\n display: CDKTYPE_NAME_MAP[name as CDKType],\n value: name,\n ...meta,\n },\n };\n }, {});\n\n return Object.keys(options).length ? (options as CDKOptions) : undefined;\n }, [searchAPI]);\n\n const majorsOptions = useMemo(() => {\n if (!cdkOptions || !cdkType) return undefined;\n const majorVersions = cdkOptions[cdkType]?.majorVersions;\n\n if (!majorVersions) return undefined;\n\n return [...majorVersions]\n .sort((a, b) => a - b)\n .map((value) => ({\n value: value.toString(),\n display: `${CDKTYPE_NAME_MAP[cdkType]} v${value}`,\n }));\n }, [cdkOptions, cdkType]);\n\n if (!cdkOptions) {\n return null;\n }\n\n const onCdkTypeChange = (type: string) => {\n const cdk = type as CDKType;\n setCdkMajor(undefined);\n setCdkType(type ? cdk : undefined);\n };\n\n const onCdkMajorChange = (major: string) => {\n if (!major) {\n setCdkMajor(undefined);\n return;\n }\n\n const majorNum = parseInt(major, 10);\n\n setCdkMajor(majorNum);\n };\n\n return (\n <>\n <RadioFilter\n data-testid={testIds.cdkTypeFilter}\n hint=\"Choose the right CDK for your IaC technology: AWS CDK for AWS CloudFormation, CDKtf for Terraform, or CDK8s for Kubernetes.\"\n name=\"CDK Type\"\n onValueChange={onCdkTypeChange}\n options={[\n { display: \"Any CDK Type\", value: \"\" },\n ...Object.values(cdkOptions),\n ]}\n value={cdkType ?? \"\"}\n />\n {/* No point in showing major versions if only a single one is available */}\n {!!(majorsOptions && majorsOptions.length > 1) && (\n <RadioFilter\n data-testid={testIds.cdkVersionFilter}\n hint=\"Choose the major version of the CDK you're using to see only constructs that will work with that version.\"\n name=\"CDK Major Version\"\n onValueChange={onCdkMajorChange}\n options={[\n { display: \"Any Major Version\", value: \"\" },\n ...majorsOptions,\n ]}\n value={cdkMajor?.toString() ?? \"\"}\n />\n )}\n </>\n );\n};\n","import { ChevronDownIcon, ChevronUpIcon } from \"@chakra-ui/icons\";\nimport {\n Flex,\n Button,\n Collapse,\n Checkbox,\n Stack,\n Text,\n Tooltip,\n useDisclosure,\n} from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { clickEvent, eventName, useAnalytics } from \"../../contexts/Analytics\";\nimport { SEARCH_ANALYTICS } from \"./constants\";\nimport { FilterHeading, FilterHeadingProps } from \"./FilterHeading\";\nimport testIds from \"./testIds\";\n\ninterface CheckboxOption {\n display: string;\n value: string;\n isDisabled?: boolean;\n disabledHint?: string;\n}\n\ninterface CheckboxItemProps extends CheckboxOption {\n onChange: () => void;\n isChecked: boolean;\n}\n\nexport interface CheckboxFilterProps extends FilterHeadingProps {\n /**\n * Test ID to select checkbox in tests\n */\n \"data-testid\"?: string;\n /**\n * Number of items that can be initially shown\n */\n initialItemCount?: number;\n /**\n * Defines checkbox items\n */\n options: CheckboxOption[];\n /**\n * Selected values\n */\n values: string[];\n /**\n * Callback triggered when an item is clicked\n */\n onValueChange: (value: string) => void;\n}\n\nconst CheckboxItem: FunctionComponent<CheckboxItemProps> = ({\n display,\n value,\n isDisabled,\n disabledHint,\n isChecked,\n onChange,\n}) => (\n <Checkbox\n isChecked={isChecked}\n isDisabled={isDisabled}\n key={value}\n onChange={onChange}\n >\n <Tooltip\n hasArrow\n isDisabled={!isDisabled && !disabledHint}\n label={disabledHint}\n placement=\"right\"\n >\n <Text\n color=\"gray.600\"\n data-testid={testIds.filterItem}\n data-value={value}\n isTruncated\n >\n {display}\n </Text>\n </Tooltip>\n </Checkbox>\n);\n\nexport const CheckboxFilter: FunctionComponent<CheckboxFilterProps> = ({\n \"data-testid\": dataTestid,\n initialItemCount,\n hint,\n name,\n options,\n values: checkedValues,\n onValueChange,\n}) => {\n const collapse = useDisclosure();\n const { trackCustomEvent } = useAnalytics();\n\n const getOnChange = (item: CheckboxOption) => () => {\n trackCustomEvent(\n clickEvent({\n name: eventName(SEARCH_ANALYTICS.FILTERS, name, \"Filter\", item.display),\n })\n );\n onValueChange(item.value);\n };\n\n let alwaysShow: typeof options = options;\n let showWhenExpanded: typeof options = [];\n\n if (initialItemCount) {\n alwaysShow = options.slice(0, initialItemCount);\n showWhenExpanded = options.slice(initialItemCount, options.length);\n }\n\n const isExpandible = showWhenExpanded.length > 0;\n\n return (\n <Flex data-testid={dataTestid} direction=\"column\">\n <FilterHeading hint={hint} name={name} />\n <Stack mt={1} spacing={1}>\n {alwaysShow.map((item) => (\n <CheckboxItem\n {...item}\n isChecked={checkedValues.includes(item.value)}\n key={item.value}\n onChange={getOnChange(item)}\n />\n ))}\n {isExpandible && (\n <Collapse animateOpacity in={collapse.isOpen} unmountOnExit>\n <Stack spacing={1}>\n {showWhenExpanded.map((item) => (\n <CheckboxItem\n {...item}\n isChecked={checkedValues.includes(item.value)}\n key={item.value}\n onChange={getOnChange(item)}\n />\n ))}\n </Stack>\n </Collapse>\n )}\n </Stack>\n {isExpandible && (\n <Flex align=\"start\" mt={1}>\n <Button\n color=\"gray.600\"\n data-event={eventName(SEARCH_ANALYTICS.FILTERS, name, \"Show More\")}\n fontWeight=\"normal\"\n leftIcon={collapse.isOpen ? <ChevronUpIcon /> : <ChevronDownIcon />}\n onClick={collapse.onToggle}\n size=\"sm\"\n textAlign=\"left\"\n variant=\"link\"\n w=\"auto\"\n >\n {collapse.isOpen\n ? `Show fewer options (${alwaysShow.length})`\n : `Show more options (${showWhenExpanded.length})`}\n </Button>\n </Flex>\n )}\n </Flex>\n );\n};\n","import { FunctionComponent, useMemo } from \"react\";\nimport { useSearchContext } from \"../../contexts/Search\";\nimport { CheckboxFilter } from \"./CheckboxFilter\";\nimport { useSearchState } from \"./SearchState\";\nimport testIds from \"./testIds\";\n\nexport const KeywordsFilter: FunctionComponent = () => {\n const { keywords, setKeywords } = useSearchState().searchAPI;\n const keywordMap = useSearchContext()!.keywords;\n\n const onKeywordChange = (keyword: string) => {\n setKeywords(\n keywords.includes(keyword)\n ? keywords.filter((k) => k !== keyword)\n : [...keywords, keyword]\n );\n };\n\n const keywordOptions = useMemo(() => {\n const baseOptions = [...keywordMap.entries()]\n .sort(([, count1], [, count2]) => {\n return count1 < count2 ? 1 : -1;\n })\n .filter(([keyword]) => !keywords.includes(keyword))\n .map(([keyword]) => ({\n display: keyword,\n value: keyword,\n }))\n .slice(0, 25);\n\n const keywordsNotInOptions = keywords.filter(\n (k) => !baseOptions.some((opt) => opt.value === k)\n );\n\n return [\n ...keywordsNotInOptions.map((k) => ({ display: k, value: k })),\n ...baseOptions,\n ];\n }, [keywordMap, keywords]);\n\n return (\n <CheckboxFilter\n data-testid={testIds.languagesFilter}\n hint=\"Focus the results by choosing one or more keywords reflecting the kind of construct you're looking for. Keywords are provided by construct authors.\"\n initialItemCount={5}\n name=\"Keywords\"\n onValueChange={onKeywordChange}\n options={keywordOptions}\n values={keywords}\n />\n );\n};\n","import { FunctionComponent } from \"react\";\nimport {\n Language,\n LANGUAGE_NAME_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\nimport { CheckboxFilter } from \"./CheckboxFilter\";\nimport { useSearchState } from \"./SearchState\";\nimport testIds from \"./testIds\";\n\nconst languageOptions = Object.entries(LANGUAGE_NAME_MAP)\n .map(([key, value]) => ({\n display: value,\n value: key,\n ...(TEMP_SUPPORTED_LANGUAGES.has(key as Language)\n ? { isDisabled: false }\n : {\n isDisabled: true,\n disabledHint: `${\n LANGUAGE_NAME_MAP[key as Language]\n } support is coming soon!`,\n }),\n }))\n .sort((l1, l2) => {\n // Push disabled languages to back of list\n return l1.isDisabled > l2.isDisabled ? 1 : -1;\n });\n\nexport const LanguageFilter: FunctionComponent = () => {\n const { languages, setLanguages } = useSearchState().searchAPI;\n\n const onLanguagesChange = (lang: string) => {\n const language = lang as Language;\n\n setLanguages(\n languages.includes(language)\n ? languages.filter((l) => l !== language)\n : [...languages, language]\n );\n };\n\n return (\n <CheckboxFilter\n data-testid={testIds.languagesFilter}\n hint=\"Choose one or more languages. Results include constructs for use with at least one of the selected languages.\"\n name=\"Programming Language\"\n onValueChange={onLanguagesChange}\n options={languageOptions}\n values={languages}\n />\n );\n};\n","import { FunctionComponent } from \"react\";\nimport { PackageTagConfig } from \"../../api/config\";\nimport { useConfigValue } from \"../../hooks/useConfigValue\";\nimport { CheckboxFilter } from \"./CheckboxFilter\";\nimport { useSearchState } from \"./SearchState\";\n\ninterface FilterGroups {\n [group: string]: PackageTagConfig[];\n}\n\nexport const TagFilter: FunctionComponent = () => {\n const filterableTags =\n useConfigValue(\"packageTags\")?.filter((tag) => Boolean(tag.searchFilter)) ??\n [];\n\n const tagFilterGroups: FilterGroups = filterableTags.reduce(\n (accum: FilterGroups, tag: PackageTagConfig): FilterGroups => {\n const groupName = tag.searchFilter?.groupBy;\n if (groupName) {\n return {\n ...accum,\n [groupName]: [...(accum[groupName] ?? []), tag],\n };\n }\n return accum;\n },\n {}\n );\n\n const { tags, setTags } = useSearchState().searchAPI;\n\n const onTagsChange = (tag: string) => {\n setTags(\n tags.includes(tag) ? tags.filter((t) => t !== tag) : [...tags, tag]\n );\n };\n\n return (\n <>\n {Object.entries(tagFilterGroups).map(([title, tagItems]) => {\n return (\n <CheckboxFilter\n key={title}\n name={title}\n onValueChange={onTagsChange}\n options={tagItems.map((tag) => {\n return {\n display: tag.searchFilter!.display,\n value: tag.id,\n };\n })}\n values={tags}\n />\n );\n })}\n </>\n );\n};\n","import { Heading, Stack } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { Card } from \"../../components/Card\";\nimport { CDKFilter } from \"./CDKFilter\";\nimport { KeywordsFilter } from \"./KeywordsFilter\";\nimport { LanguageFilter } from \"./LanguageFilter\";\nimport { TagFilter } from \"./TagFilter\";\nimport testIds from \"./testIds\";\n\nexport interface FilterPanelProps {}\n\n// Header height + section padding\nconst TOP_OFFSET = \"5.75rem\";\n\n/**\n * The desktop Resolution Filter Panel\n */\nexport const FilterPanel: FunctionComponent<FilterPanelProps> = () => {\n return (\n <Card\n borderRadius=\"none\"\n boxShadow=\"none\"\n data-testid={testIds.filtersPanel}\n display={{ base: \"none\", md: \"flex\" }}\n maxH={`calc(100vh - ${TOP_OFFSET} - 1.25rem)`}\n maxW=\"23rem\"\n minW=\"100%\"\n overflow=\"hidden auto\"\n p={4}\n pos=\"sticky\"\n top={TOP_OFFSET}\n zIndex=\"docked\"\n >\n <Stack color=\"blue.800\" h=\"max-content\" spacing={4} top={4}>\n <Heading as=\"h3\" size=\"sm\">\n Filters\n </Heading>\n\n <CDKFilter />\n\n <LanguageFilter />\n\n <TagFilter />\n\n <KeywordsFilter />\n </Stack>\n </Card>\n );\n};\n","import { Center, Spinner } from \"@chakra-ui/react\";\nimport { FunctionComponent, memo } from \"react\";\nimport { CatalogPackage } from \"../../api/package/packages\";\nimport { PackageCardType } from \"../PackageCard\";\nimport { WideCardList } from \"./WideCardList\";\n\nconst listViews = {\n [PackageCardType.Wide]: WideCardList,\n};\n\nexport interface PackageListViewProps {\n \"data-event\"?: string;\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 \"data-event\": dataEvent,\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 data-event={dataEvent} items={items} />;\n }\n);\n\nPackageList.displayName = \"PackageList\";\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 \"data-event\": dataEvent,\n items,\n}) => {\n return (\n <Stack spacing={4}>\n {items.map((pkg) => (\n <PackageCard\n data-event={dataEvent}\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 \"data-event\"?: string;\n \"data-testid\"?: string;\n icon: FunctionComponent<IconProps>;\n offset?: number;\n getPageUrl: (params: { offset: number }) => string;\n}\n\nexport const ArrowButton: FunctionComponent<ArrowButtonProps> = ({\n \"data-event\": dataEvent,\n \"data-testid\": dataTestid,\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 \"data-event\": dataEvent,\n \"data-testid\": dataTestid,\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\";\nimport { clickEvent, useAnalytics } from \"../../contexts/Analytics\";\n\nexport interface GoToPageProps {\n \"data-event\"?: string;\n \"data-testid\"?: string;\n pageLimit: number;\n offset: number;\n getPageUrl: (params: { offset: number }) => string;\n}\n\nexport const GoToPage: FunctionComponent<GoToPageProps> = ({\n \"data-event\": dataEvent,\n \"data-testid\": dataTestid,\n pageLimit,\n offset,\n getPageUrl,\n}) => {\n const { trackCustomEvent } = useAnalytics();\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 data-testid={dataTestid}\n h={10}\n max={pageLimit + 1}\n min={1}\n name=\"page\"\n onChange={onInputChange}\n onFocus={() => {\n if (dataEvent) {\n trackCustomEvent(clickEvent({ name: dataEvent }));\n }\n }}\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 { ChevronLeftIcon, ChevronRightIcon } from \"@chakra-ui/icons\";\nimport { Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { eventName } from \"../../contexts/Analytics\";\nimport { ArrowButton } from \"./ArrowButton\";\nimport { SEARCH_ANALYTICS } from \"./constants\";\nimport { GoToPage } from \"./GoToPage\";\nimport testIds from \"./testIds\";\n\nexport interface PageControlsProps {\n offset: number;\n pageLimit: number;\n getPageUrl: (params: { offset?: number }) => string;\n}\n\nexport const PageControls: FunctionComponent<PageControlsProps> = ({\n offset,\n getPageUrl,\n pageLimit,\n}) => {\n const nextOffset = offset < pageLimit ? offset + 1 : undefined;\n const prevOffset = offset > 0 ? offset - 1 : undefined;\n\n return (\n <Stack\n align=\"center\"\n direction=\"row\"\n justify=\"space-between\"\n maxW=\"18rem\"\n mx=\"auto\"\n spacing={4}\n w=\"full\"\n >\n <ArrowButton\n data-event={eventName(SEARCH_ANALYTICS.RESULTS, \"Previous Page\")}\n data-testid={testIds.prevPage}\n getPageUrl={getPageUrl}\n icon={ChevronLeftIcon}\n offset={prevOffset}\n />\n <GoToPage\n data-event={eventName(SEARCH_ANALYTICS.RESULTS, \"Go to Page\")}\n data-testid={testIds.goToPage}\n getPageUrl={getPageUrl}\n offset={offset}\n pageLimit={pageLimit}\n />\n <ArrowButton\n data-event={eventName(SEARCH_ANALYTICS.RESULTS, \"Next Page\")}\n data-testid={testIds.nextPage}\n getPageUrl={getPageUrl}\n icon={ChevronRightIcon}\n offset={nextOffset}\n />\n </Stack>\n );\n};\n","import { Text } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport testIds from \"./testIds\";\n\nexport interface SearchDetailsProps {\n limit: number;\n offset: number;\n count: number;\n filtered: boolean;\n query?: string;\n}\n\nconst Em: FunctionComponent = ({ children }) => (\n <Text as=\"strong\" color=\"gray.700\">\n {children}\n </Text>\n);\n\nconst Count: FunctionComponent<{\n first: number;\n count: number;\n last: number;\n}> = ({ first, count, last }) => {\n if (!first && last >= count) {\n return (\n <>\n <Em>{count}</Em> of <Em>{count}</Em>\n </>\n );\n }\n\n return (\n <>\n <Em>\n {count ? first + 1 : count} - {last > count ? count : last}\n </Em>{\" \"}\n of <Em>{count}</Em>\n </>\n );\n};\n\nexport const SearchDetails: FunctionComponent<SearchDetailsProps> = ({\n limit,\n offset,\n count,\n filtered,\n query,\n}) => {\n const first = limit * offset;\n const last = first + limit;\n const hasResults = count > 0;\n\n return (\n <Text data-testid={testIds.searchDetails}>\n {hasResults ? (\n <>\n Displaying <Count count={count} first={first} last={last} />{\" \"}\n {filtered ? \"search results\" : \"constructs\"}\n </>\n ) : (\n <>{filtered ? \"There were no search results\" : \"No constructs found\"}</>\n )}\n {query && (\n <>\n {\" for \"}\n <Em>{query}</Em>\n </>\n )}\n .{!hasResults && filtered && <> Try a different term.</>}\n </Text>\n );\n};\n","import { FunctionComponent } from \"react\";\nimport { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport { SORT_RENDER_MAP } from \"./constants\";\nimport { RadioFilter } from \"./RadioFilter\";\nimport { useSearchState } from \"./SearchState\";\n\nexport const SortFilter: FunctionComponent = () => {\n const { sort, setSort } = useSearchState().searchAPI;\n\n const onSortChange = (newSort: string) => {\n setSort(newSort ? (newSort as CatalogSearchSort) : undefined);\n };\n\n return (\n <RadioFilter\n hint=\"Sets the order of search results\"\n name=\"Sorted By\"\n onValueChange={onSortChange}\n options={[\n { display: \"Relevance\", value: \"\" },\n ...Object.entries(SORT_RENDER_MAP).map(([value, display]) => ({\n display,\n value,\n })),\n ]}\n value={sort ?? \"\"}\n />\n );\n};\n","import { ChevronDownIcon } from \"@chakra-ui/icons\";\nimport {\n Button,\n Drawer,\n Stack,\n DrawerBody,\n DrawerHeader,\n DrawerOverlay,\n DrawerContent,\n DrawerCloseButton,\n useDisclosure,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { CDKFilter } from \"./CDKFilter\";\nimport { KeywordsFilter } from \"./KeywordsFilter\";\nimport { LanguageFilter } from \"./LanguageFilter\";\nimport { SortFilter } from \"./SortFilter\";\nimport { TagFilter } from \"./TagFilter\";\n\n/**\n * The mobile filter Drawer (Bottomsheet in iOS terminology)\n */\nexport const SortAndFilterDrawer: FunctionComponent = () => {\n const drawer = useDisclosure();\n return (\n <>\n <Button\n colorScheme=\"blue\"\n display={{ md: \"none\" }}\n onClick={drawer.onOpen}\n rightIcon={<ChevronDownIcon />}\n variant=\"link\"\n >\n Sorting and Filters\n </Button>\n <Drawer {...drawer} placement=\"bottom\">\n <DrawerOverlay />\n\n <DrawerContent color=\"blue.800\" maxH=\"full\">\n <DrawerHeader borderBottom=\"base\">Sorting and Filters</DrawerHeader>\n\n <DrawerCloseButton />\n\n <DrawerBody>\n <Stack color=\"blue.800\" pb={4} spacing={4}>\n <SortFilter />\n\n <CDKFilter />\n\n <LanguageFilter />\n\n <TagFilter />\n\n <KeywordsFilter />\n </Stack>\n </DrawerBody>\n </DrawerContent>\n </Drawer>\n </>\n );\n};\n","import { ChevronDownIcon } from \"@chakra-ui/icons\";\nimport {\n Flex,\n Text,\n Menu,\n MenuButton,\n MenuList,\n MenuItem,\n Button,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport { eventName } from \"../../contexts/Analytics\";\nimport { SEARCH_ANALYTICS, SORT_RENDER_MAP } from \"./constants\";\nimport { useSearchState } from \"./SearchState\";\nimport testIds from \"./testIds\";\n\nexport const SortedBy: FunctionComponent = () => {\n const { searchAPI } = useSearchState();\n const { sort, setSort } = searchAPI;\n\n const selected = sort ? SORT_RENDER_MAP[sort] : \"Relevance\";\n\n return (\n <Flex align=\"center\">\n <Text>Sorted by</Text>\n <Menu>\n <MenuButton\n as={Button}\n color=\"blue.500\"\n data-event={eventName(SEARCH_ANALYTICS.SORT, \"Menu\")}\n data-testid={testIds.sortButton}\n ml={2}\n pl={2} // For some reason, the px shorthand doesn't work on this Button\n pr={2}\n py={1}\n rightIcon={<ChevronDownIcon />}\n variant=\"link\"\n >\n {selected}\n </MenuButton>\n <MenuList data-testid={testIds.sortDropdown} minW=\"180\" zIndex=\"sticky\">\n <MenuItem\n data-event={eventName(SEARCH_ANALYTICS.SORT, \"Option\", \"Relevance\")}\n data-testid={testIds.sortItem}\n data-value=\"\"\n key=\"Relevance\"\n onClick={() => setSort(undefined)}\n >\n Relevance\n </MenuItem>\n {Object.entries(SORT_RENDER_MAP).map(([value, display]) => (\n <MenuItem\n data-event={eventName(SEARCH_ANALYTICS.SORT, \"Option\", display)}\n data-testid={testIds.sortItem}\n data-value={value}\n key={value}\n onClick={() => setSort(value as CatalogSearchSort)}\n >\n {display}\n </MenuItem>\n ))}\n </MenuList>\n </Menu>\n </Flex>\n );\n};\n","import { Box, Stack } from \"@chakra-ui/react\";\nimport { FunctionComponent, useEffect, useRef } from \"react\";\nimport { useHistory } from \"react-router-dom\";\nimport { PackageList } from \"../../components/PackageList\";\nimport { Page } from \"../../components/Page\";\nimport { SearchBar } from \"../../components/SearchBar\";\nimport { useCatalogResults } from \"../../hooks/useCatalogResults\";\nimport { getSearchPath } from \"../../util/url\";\nimport { SearchQueryParam, SEARCH_ANALYTICS } from \"./constants\";\nimport { PageControls } from \"./PageControls\";\nimport { SearchDetails } from \"./SearchDetails\";\nimport { useSearchState } from \"./SearchState\";\nimport { SortAndFilterDrawer } from \"./SortAndFilterDrawer\";\nimport { SortedBy } from \"./SortedBy\";\n\nexport const SearchResults: FunctionComponent = () => {\n const isFirstRender = useRef(true);\n const { push } = useHistory();\n\n const { query, searchAPI, offset, limit } = useSearchState();\n const { keywords, languages, sort, cdkType, cdkMajor, onSearch, tags } =\n searchAPI;\n\n const { page, pageLimit, results } = useCatalogResults({\n offset,\n limit,\n query,\n keywords,\n languages,\n cdkMajor,\n cdkType,\n sort,\n tags,\n });\n\n const getUrl = (\n params: Partial<{ [key in SearchQueryParam]: number | string }>\n ) => {\n return getSearchPath({\n cdkMajor,\n cdkType,\n keywords,\n query: (params.q ?? query) as string,\n languages,\n sort,\n offset: params.offset ?? offset,\n tags,\n });\n };\n\n // Resets the page number to 1 if query param offset is below 0, or to the last page if offset is higher than page count\n useEffect(() => {\n // If the query has results but the page has nothing to show...\n if (results.length && (offset < 0 || offset > pageLimit)) {\n // Handle an out of bounds offset\n if (offset < 0) {\n push(getUrl({ offset: 0 }));\n } else {\n // Offset is too large, just take last page\n push(getUrl({ offset: pageLimit }));\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [results, offset, pageLimit]);\n\n // Reset offset and update url when query, filters, or sort change\n // We want to avoid doing this on first render / when a user directly navigates to a search URL\n // so we keep a ref to prevent this\n useEffect(() => {\n if (isFirstRender.current) {\n isFirstRender.current = false;\n } else {\n // Trigger a history replace rather than push to avoid bloating browser history\n onSearch({ replace: true });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [sort, keywords, languages, cdkType, cdkMajor, tags]);\n\n // Scroll to top on page change\n useEffect(() => {\n window.scrollTo(0, 0);\n }, [page]);\n\n return (\n <Page\n meta={{\n title: query || \"Search\",\n description: query\n ? `${results.length} results for ${query} at Construct Hub`\n : \"Search reusable components for your cloud application\",\n }}\n pageName=\"search\"\n >\n <Stack direction=\"column\" maxW=\"100vw\" pb={4} px={4} spacing={4}>\n <SearchBar\n bg=\"white\"\n data-event={SEARCH_ANALYTICS.SEARCH}\n onChange={searchAPI.onQueryChange}\n onSubmit={(e) => {\n searchAPI.setSort(undefined);\n searchAPI.onSubmit(e);\n }}\n value={searchAPI.query}\n />\n\n <Stack\n align={{ base: \"start\", lg: \"center\" }}\n direction={{ base: \"column-reverse\", lg: \"row\" }}\n justify={{ base: \"initial\", lg: \"space-between\" }}\n spacing={4}\n >\n <SearchDetails\n count={results.length}\n filtered={!!query}\n limit={limit}\n offset={offset}\n query={query}\n />\n\n <Box display={{ base: \"none\", md: \"initial\" }}>\n <SortedBy />\n </Box>\n\n <Box display={{ md: \"none\" }}>\n <SortAndFilterDrawer />\n </Box>\n </Stack>\n\n <PackageList data-event={SEARCH_ANALYTICS.RESULTS} items={page} />\n\n <Box w=\"full\">\n <PageControls\n getPageUrl={getUrl}\n offset={offset}\n pageLimit={pageLimit}\n />\n </Box>\n </Stack>\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 { SearchResults } from \"./SearchResults\";\nimport { SearchStateProvider } from \"./SearchState\";\nimport testIds from \"./testIds\";\n\nexport const Search: FunctionComponent = () => {\n return (\n <SearchStateProvider>\n <Page\n meta={{\n title: \"Search - Construct Hub\",\n description:\n \"Search Construct Libraries for AWS CDK, CDK8s, and CDKtf\",\n }}\n pageName=\"search\"\n >\n <Grid\n data-testid={testIds.page}\n gap={4}\n h=\"full\"\n maxW=\"100%\"\n px={{ base: 0, md: 6 }}\n py={6}\n templateColumns={{ base: \"1fr\", md: \"auto 1fr\" }}\n templateRows=\"1fr\"\n >\n {/* Filter Panel Desktop */}\n <FilterPanel />\n\n {/* Results, Info, and Controls */}\n <SearchResults />\n </Grid>\n </Page>\n </SearchStateProvider>\n );\n};\n"],"sourceRoot":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(this["webpackJsonpconstruct-hub-webapp"]=this["webpackJsonpconstruct-hub-webapp"]||[]).push([[9],{147:function(e,n,r){"use strict";r.d(n,"a",(function(){return p}));var t=r(3),o=r(1),a=r(0),i=r.n(a),c=r(90);o.B?a.useLayoutEffect:a.useEffect;o.b;o.b;function u(e,n){if(null==e)return{};var r,t,o={},a=Object.keys(e);for(t=0;t<a.length;t++)r=a[t],n.indexOf(r)>=0||(o[r]=e[r]);return o}function l(){return l=Object.assign||function(e){for(var n=1;n<arguments.length;n++){var r=arguments[n];for(var t in r)Object.prototype.hasOwnProperty.call(r,t)&&(e[t]=r[t])}return e},l.apply(this,arguments)}function s(e){return Object.entries(e).sort((function(e,n){return Number.parseInt(e[1],10)>Number.parseInt(n[1],10)?1:-1})).map((function(e,n,r){var t=e[0],o=e[1],a=r[n+1],i=a?a[1]:void 0,c=function(e,n){if(!(parseInt(e,10)>=0)&&!n)return"";var r="(min-width: "+b(e)+")";if(!n)return r;r&&(r+=" and ");return r+="(max-width: "+b(function(e){return function(e,n){if("number"===typeof e)return""+(e+n);return e.replace(d,(function(e){return""+(parseFloat(e)+n)}))}(e,e.endsWith("px")?-1:-.01)}(n))+")"}(o,i);return{minWidth:o,maxWidth:i,breakpoint:t,query:c}}))}var d=/([0-9]+\.?[0-9]*)/;function b(e){return Object(o.I)(e)?e+"px":e}var f=["query"],v=["query"];function p(e,n){var r=function(e){var n=Object(t.j)().breakpoints,r=Object(c.b)(),o=i.a.useMemo((function(){return s(l({base:"0px"},n))}),[n]),a=i.a.useState((function(){if(e){var n=o.find((function(n){return n.breakpoint===e}));if(n)return n.query,u(n,f)}})),d=a[0],b=a[1],p=null==d?void 0:d.breakpoint,O=i.a.useCallback((function(e,n){e.matches&&p!==n.breakpoint&&b(n)}),[p]);return i.a.useEffect((function(){var e=new Set;return o.forEach((function(n){var t=n.query,o=u(n,v),a=r.window.matchMedia(t);O(a,o);var i=function(){O(a,o)};return a.addListener(i),e.add({mediaQuery:a,handleChange:i}),function(){a.removeListener(i)}})),function(){e.forEach((function(e){var n=e.mediaQuery,r=e.handleChange;n.removeListener(r)})),e.clear()}}),[o,n,O,r.window]),p}(n),a=Object(t.j)();if(r){var d=Object.keys(a.breakpoints);return function(e,n,r){void 0===r&&(r=o.g);var t=Object.keys(e).indexOf(n);if(-1!==t)return e[n];for(var a=r.indexOf(n);a>=0;){if(null!=e[r[a]]){t=a;break}a-=1}return-1!==t?e[r[t]]:void 0}(Object(o.A)(e)?Object(o.q)(Object.entries(Object(o.f)(e,d)).map((function(e){return[e[0],e[1]]}))):e,r,d)}}},151:function(e,n,r){"use strict";r.d(n,"a",(function(){return D})),r.d(n,"b",(function(){return M})),r.d(n,"c",(function(){return _})),r.d(n,"d",(function(){return x})),r.d(n,"e",(function(){return E}));r(91);var t=r(3),o=r(50),a=r.n(o),i=r(1),c=r(0),u=r.n(c),l=r(12),s=r(33),d=r(11),b=r(47);function f(){return f=Object.assign||function(e){for(var n=1;n<arguments.length;n++){var r=arguments[n];for(var t in r)Object.prototype.hasOwnProperty.call(r,t)&&(e[t]=r[t])}return e},f.apply(this,arguments)}function v(e,n){if(null==e)return{};var r,t,o={},a=Object.keys(e);for(t=0;t<a.length;t++)r=a[t],n.indexOf(r)>=0||(o[r]=e[r]);return o}var p=Object(l.a)({name:"PopoverContext",errorMessage:"usePopoverContext: `context` is undefined. Seems you forgot to wrap all popover components within `<Popover />`"}),O=p[0],h=p[1],j=function(e){if(e)return a()(e,{enter:{visibility:"visible"},exit:{transitionEnd:{visibility:"hidden"}}})},m=Object(s.a)(t.d.section),g=u.a.forwardRef((function(e,n){var r=h().isOpen;return u.a.createElement(m,f({ref:n,variants:j(e.variants)},e,{initial:!1,animate:r?"enter":"exit"}))}));g.defaultProps={variants:{exit:{opacity:0,scale:.95,transition:{duration:.1,ease:[.4,0,1,1]}},enter:{scale:1,opacity:1,transition:{duration:.15,ease:[0,0,.2,1]}}}};var y=["closeOnBlur","closeOnEsc","initialFocusRef","id","returnFocusOnClose","autoFocus","arrowSize","arrowShadowColor","trigger","openDelay","closeDelay","isLazy","lazyBehavior","computePositionOnMount"],k="click",w="hover";var C=["children"],P=["rootProps"],D=function(e){var n=Object(t.g)("Popover",e),r=Object(t.f)(e),o=r.children,a=function(e){void 0===e&&(e={});var n=e,r=n.closeOnBlur,t=void 0===r||r,o=n.closeOnEsc,a=void 0===o||o,u=n.initialFocusRef,s=n.id,p=n.returnFocusOnClose,O=void 0===p||p,h=n.autoFocus,j=void 0===h||h,m=n.arrowSize,g=n.arrowShadowColor,C=n.trigger,P=void 0===C?k:C,D=n.openDelay,E=void 0===D?200:D,x=n.closeDelay,R=void 0===x?200:x,_=n.isLazy,M=n.lazyBehavior,N=void 0===M?"unmount":M,S=n.computePositionOnMount,F=v(n,y),I=Object(d.g)(e),B=I.isOpen,T=I.onClose,q=I.onOpen,L=I.onToggle,z=Object(c.useRef)(null),A=Object(c.useRef)(null),K=Object(c.useRef)(!1),U=Object(c.useRef)(!1);B&&(U.current=!0);var H=Object(c.useState)(!1),W=H[0],G=H[1],V=Object(c.useState)(!1),Y=V[0],J=V[1],Q=Object(d.n)(s,"popover-trigger","popover-content","popover-header","popover-body"),X=Q[0],Z=Q[1],$=Q[2],ee=Q[3],ne=Object(b.b)(f({},F,{enabled:B||!!S})),re=ne.referenceRef,te=ne.getArrowProps,oe=ne.getPopperProps,ae=ne.getArrowInnerProps,ie=ne.forceUpdate;Object(d.j)({enabled:B,ref:z}),Object(d.i)(A,{focusRef:z,visible:B,shouldFocus:O&&P===k}),Object(d.k)(A,{focusRef:u,visible:B,shouldFocus:j&&P===k});var ce=Object(i.n)({hasBeenSelected:U.current,isLazy:_,lazyBehavior:N,isSelected:B}),ue=Object(c.useCallback)((function(e,n){var r;void 0===e&&(e={}),void 0===n&&(n=null);var o=f({},e,{style:f({},e.style,(r={transformOrigin:b.a.transformOrigin.varRef},r[b.a.arrowSize.var]=m?Object(i.Y)(m):void 0,r[b.a.arrowShadowColor.var]=g,r)),ref:Object(l.c)(A,n),children:ce?e.children:null,id:Z,tabIndex:-1,role:"dialog",onKeyDown:Object(i.i)(e.onKeyDown,(function(e){a&&"Escape"===e.key&&T()})),onBlur:Object(i.i)(e.onBlur,(function(e){var n=Object(i.x)(e),r=Object(i.j)(A.current,n),o=Object(i.j)(z.current,n);B&&t&&!r&&!o&&T()})),"aria-labelledby":W?$:void 0,"aria-describedby":Y?ee:void 0});return P===w&&(o.role="tooltip",o.onMouseEnter=Object(i.i)(e.onMouseEnter,(function(){K.current=!0})),o.onMouseLeave=Object(i.i)(e.onMouseLeave,(function(){K.current=!1,setTimeout(T,R)}))),o}),[ce,Z,W,$,Y,ee,P,a,T,B,t,R,g,m]),le=Object(c.useCallback)((function(e,n){return void 0===e&&(e={}),void 0===n&&(n=null),oe(f({},e,{style:f({visibility:B?"visible":"hidden"},e.style)}),n)}),[B,oe]),se=Object(c.useRef)(),de=Object(c.useRef)(),be=Object(c.useCallback)((function(e,n){void 0===e&&(e={}),void 0===n&&(n=null);var r=f({},e,{ref:Object(l.c)(z,n,re),id:X,"aria-haspopup":"dialog","aria-expanded":B,"aria-controls":Z});return P===k&&(r.onClick=Object(i.i)(e.onClick,L)),P===w&&(r.onFocus=Object(i.i)(e.onFocus,q),r.onBlur=Object(i.i)(e.onBlur,T),r.onKeyDown=Object(i.i)(e.onKeyDown,(function(e){"Escape"===e.key&&T()})),r.onMouseEnter=Object(i.i)(e.onMouseEnter,(function(){K.current=!0,se.current=window.setTimeout(q,E)})),r.onMouseLeave=Object(i.i)(e.onMouseLeave,(function(){K.current=!1,se.current&&(clearTimeout(se.current),se.current=void 0),de.current=window.setTimeout((function(){!1===K.current&&T()}),R)}))),r}),[X,B,Z,P,re,L,q,T,E,R]);Object(c.useEffect)((function(){return function(){se.current&&clearTimeout(se.current),de.current&&clearTimeout(de.current)}}),[]);var fe=Object(c.useCallback)((function(e,n){return void 0===e&&(e={}),void 0===n&&(n=null),f({},e,{id:$,ref:Object(l.c)(n,(function(e){G(!!e)}))})}),[$]),ve=Object(c.useCallback)((function(e,n){return void 0===e&&(e={}),void 0===n&&(n=null),f({},e,{id:ee,ref:Object(l.c)(n,(function(e){J(!!e)}))})}),[ee]);return{forceUpdate:ie,isOpen:B,onClose:T,getArrowProps:te,getArrowInnerProps:ae,getPopoverPositionerProps:le,getPopoverProps:ue,getTriggerProps:be,getHeaderProps:fe,getBodyProps:ve}}(f({},v(r,C),{direction:Object(t.j)().direction}));return c.createElement(O,{value:a},c.createElement(t.b,{value:n},Object(i.ab)(o,{isOpen:a.isOpen,onClose:a.onClose,forceUpdate:a.forceUpdate})))};i.b&&(D.displayName="Popover");var E=function(e){var n=c.Children.only(e.children),r=h().getTriggerProps;return c.cloneElement(n,r(n.props,n.ref))};i.b&&(E.displayName="PopoverTrigger");var x=Object(t.e)((function(e,n){var r=e.rootProps,o=v(e,P),a=h(),u=a.getPopoverProps,l=a.getPopoverPositionerProps,s=Object(t.i)(),d=f({position:"relative",display:"flex",flexDirection:"column"},s.content);return c.createElement(t.d.div,f({},l(r),{__css:s.popper,className:"chakra-popover__popper"}),c.createElement(g,f({},u(o,n),{className:Object(i.k)("chakra-popover__content",e.className),__css:d})))}));i.b&&(x.displayName="PopoverContent");var R=Object(t.e)((function(e,n){var r=h().getHeaderProps,o=Object(t.i)();return c.createElement(t.d.header,f({},r(e,n),{className:Object(i.k)("chakra-popover__header",e.className),__css:o.header}))}));i.b&&(R.displayName="PopoverHeader");var _=Object(t.e)((function(e,n){var r=h().getBodyProps,o=Object(t.i)();return c.createElement(t.d.div,f({},r(e,n),{className:Object(i.k)("chakra-popover__body",e.className),__css:o.body}))}));i.b&&(_.displayName="PopoverBody");i.b;i.b;var M=function(e){var n,r=e.bg,o=e.bgColor,a=e.backgroundColor,u=h(),l=u.getArrowProps,s=u.getArrowInnerProps,d=Object(t.i)(),b=null!=(n=null!=r?r:o)?n:a;return c.createElement(t.d.div,f({},l(),{className:"chakra-popover__arrow-positioner"}),c.createElement(t.d.div,f({className:Object(i.k)("chakra-popover__arrow",e.className)},s(e),{__css:f({},d.arrow,{"--popper-arrow-bg":b?"colors."+b+", "+b:void 0})})))};i.b&&(M.displayName="PopoverArrow")},152:function(e,n,r){"use strict";r.d(n,"a",(function(){return k})),r.d(n,"b",(function(){return j}));var t=r(3),o=r(55),a=r(1),i=r(0),c=r(12),u=r(11),l=r(85),s=r(60);function d(e,n){if(null==e)return{};var r,t,o={},a=Object.keys(e);for(t=0;t<a.length;t++)r=a[t],n.indexOf(r)>=0||(o[r]=e[r]);return o}function b(){return b=Object.assign||function(e){for(var n=1;n<arguments.length;n++){var r=arguments[n];for(var t in r)Object.prototype.hasOwnProperty.call(r,t)&&(e[t]=r[t])}return e},b.apply(this,arguments)}var f=["onChange","value","defaultValue","name","isDisabled","isFocusable","isNative"];var v=["colorScheme","size","variant","children","className","isDisabled","isFocusable"],p=Object(c.a)({name:"RadioGroupContext",strict:!1}),O=p[0],h=p[1],j=Object(t.e)((function(e,n){var r=e.colorScheme,o=e.size,l=e.variant,s=e.children,p=e.className,h=e.isDisabled,j=e.isFocusable,m=function(e){void 0===e&&(e={});var n=e,r=n.onChange,t=n.value,o=n.defaultValue,l=n.name,s=n.isDisabled,v=n.isFocusable,p=n.isNative,O=d(n,f),h=i.useState(o||""),j=h[0],m=h[1],g=Object(u.e)(t,j),y=g[0],k=g[1],w=i.useRef(null),C=i.useCallback((function(){var e=w.current;if(e){var n="input:not(:disabled):checked",r=e.querySelector(n);if(r)r.focus();else{n="input:not(:disabled)";var t=e.querySelector(n);null==t||t.focus()}}}),[]),P=Object(u.m)(void 0,"radio"),D=l||P,E=i.useCallback((function(e){var n=Object(a.G)(e)?e.target.value:e;y||m(n),null==r||r(String(n))}),[r,y]),x=i.useCallback((function(e,n){return void 0===e&&(e={}),void 0===n&&(n=null),b({},e,{ref:Object(c.c)(n,w),role:"radiogroup"})}),[]),R=i.useCallback((function(e,n){var r;return void 0===e&&(e={}),void 0===n&&(n=null),b({},e,((r={ref:n,name:D})[p?"checked":"isChecked"]=null!=k?e.value===k:void 0,r.onChange=E,r["data-radiogroup"]=!0,r))}),[p,D,E,k]);return{getRootProps:x,getRadioProps:R,name:D,ref:w,focus:C,setValue:m,value:k,onChange:E,isDisabled:s,isFocusable:v,htmlProps:O}}(d(e,v)),g=m.value,y=m.onChange,k=m.getRootProps,w=m.name,C=m.htmlProps,P=i.useMemo((function(){return{name:w,size:o,onChange:y,colorScheme:r,value:g,variant:l,isDisabled:h,isFocusable:j}}),[w,o,y,r,g,l,h,j]),D=k(C,n),E=Object(a.k)("chakra-radio-group",p);return i.createElement(O,{value:P},i.createElement(t.d.div,b({},D,{className:E}),s))}));a.b&&(j.displayName="RadioGroup");var m=["defaultIsChecked","defaultChecked","isChecked","isFocusable","isDisabled","isReadOnly","isRequired","onChange","isInvalid","name","value","id","data-radiogroup"];function g(e){e.preventDefault(),e.stopPropagation()}var y=["spacing","children","isFullWidth","isDisabled","isFocusable"],k=Object(t.e)((function(e,n){var r,c=h(),f=e.onChange,v=e.value,p=Object(t.g)("Radio",b({},c,e)),O=Object(t.f)(e),j=O.spacing,k=void 0===j?"0.5rem":j,w=O.children,C=O.isFullWidth,P=O.isDisabled,D=void 0===P?null==c?void 0:c.isDisabled:P,E=O.isFocusable,x=void 0===E?null==c?void 0:c.isFocusable:E,R=d(O,y),_=e.isChecked;null!=(null==c?void 0:c.value)&&null!=v&&(_=c.value===v);var M=f;null!=c&&c.onChange&&null!=v&&(M=Object(a.h)(c.onChange,f));var N=function(e){void 0===e&&(e={});var n=e,r=n.defaultIsChecked,t=n.defaultChecked,o=void 0===t?r:t,c=n.isChecked,f=n.isFocusable,v=n.isDisabled,p=n.isReadOnly,O=n.isRequired,j=n.onChange,y=n.isInvalid,k=n.name,w=n.value,C=n.id,P=n["data-radiogroup"],D=d(n,m),E=Object(u.m)(void 0,"radio"),x=Object(l.b)(),R=h(),_=!x||R||P?E:x.id;_=null!=C?C:_;var M=null!=v?v:null==x?void 0:x.isDisabled,N=null!=p?p:null==x?void 0:x.isReadOnly,S=null!=O?O:null==x?void 0:x.isRequired,F=null!=y?y:null==x?void 0:x.isInvalid,I=Object(u.b)(),B=I[0],T=I[1],q=Object(u.b)(),L=q[0],z=q[1],A=Object(u.b)(),K=A[0],U=A[1],H=Object(i.useState)(Boolean(o)),W=H[0],G=H[1],V=Object(u.e)(c,W),Y=V[0],J=V[1];Object(a.db)({condition:!!r,message:'The "defaultIsChecked" prop has been deprecated and will be removed in a future version. Please use the "defaultChecked" prop instead, which mirrors default React checkbox behavior.'});var Q=Object(i.useCallback)((function(e){N||M?e.preventDefault():(Y||G(e.target.checked),null==j||j(e))}),[Y,M,N,j]),X=Object(i.useCallback)((function(e){" "===e.key&&U.on()}),[U]),Z=Object(i.useCallback)((function(e){" "===e.key&&U.off()}),[U]),$=Object(i.useCallback)((function(e,n){return void 0===e&&(e={}),void 0===n&&(n=null),b({},e,{ref:n,"data-active":Object(a.l)(K),"data-hover":Object(a.l)(L),"data-disabled":Object(a.l)(M),"data-invalid":Object(a.l)(F),"data-checked":Object(a.l)(J),"data-focus":Object(a.l)(B),"data-readonly":Object(a.l)(N),"aria-hidden":!0,onMouseDown:Object(a.i)(e.onMouseDown,U.on),onMouseUp:Object(a.i)(e.onMouseUp,U.off),onMouseEnter:Object(a.i)(e.onMouseEnter,z.on),onMouseLeave:Object(a.i)(e.onMouseLeave,z.off)})}),[K,L,M,F,J,B,N,U.on,U.off,z.on,z.off]),ee=null!=x?x:{},ne=ee.onFocus,re=ee.onBlur,te=Object(i.useCallback)((function(e,n){void 0===e&&(e={}),void 0===n&&(n=null);var r=M&&!f;return b({},e,{id:_,ref:n,type:"radio",name:k,value:w,onChange:Object(a.i)(e.onChange,Q),onBlur:Object(a.i)(re,e.onBlur,T.off),onFocus:Object(a.i)(ne,e.onFocus,T.on),onKeyDown:Object(a.i)(e.onKeyDown,X),onKeyUp:Object(a.i)(e.onKeyUp,Z),checked:J,disabled:r,readOnly:N,required:S,"aria-invalid":Object(a.e)(F),"aria-disabled":Object(a.e)(r),"aria-required":Object(a.e)(S),"data-readonly":Object(a.l)(N),style:s.b})}),[M,f,_,k,w,Q,re,T,ne,X,Z,J,N,S,F]);return{state:{isInvalid:F,isFocused:B,isChecked:J,isActive:K,isHovered:L,isDisabled:M,isReadOnly:N,isRequired:S},getCheckboxProps:$,getInputProps:te,getLabelProps:function(e,n){return void 0===e&&(e={}),void 0===n&&(n=null),b({},e,{ref:n,onMouseDown:Object(a.i)(e.onMouseDown,g),onTouchStart:Object(a.i)(e.onTouchStart,g),"data-disabled":Object(a.l)(M),"data-checked":Object(a.l)(J),"data-invalid":Object(a.l)(F)})},getRootProps:function(e,n){return void 0===n&&(n=null),b({},e,{ref:n,"data-disabled":Object(a.l)(M),"data-checked":Object(a.l)(J),"data-invalid":Object(a.l)(F)})},htmlProps:D}}(b({},R,{isChecked:_,isFocusable:x,isDisabled:D,onChange:M,name:null!=(r=null==e?void 0:e.name)?r:null==c?void 0:c.name})),S=N.getInputProps,F=N.getCheckboxProps,I=N.getLabelProps,B=N.getRootProps,T=N.htmlProps,q=Object(a.bb)(T,o.c),L=q[0],z=F(q[1]),A=S({},n),K=I(),U=Object.assign({},L,B()),H=b({width:C?"full":void 0,display:"inline-flex",alignItems:"center",verticalAlign:"top",cursor:"pointer"},p.container),W=b({display:"inline-flex",alignItems:"center",justifyContent:"center",flexShrink:0},p.control),G=b({userSelect:"none",marginStart:k},p.label);return i.createElement(t.d.label,b({className:"chakra-radio"},U,{__css:H}),i.createElement("input",b({className:"chakra-radio__input"},A)),i.createElement(t.d.span,b({className:"chakra-radio__control"},z,{__css:W})),w&&i.createElement(t.d.span,b({className:"chakra-radio__label"},K,{__css:G}),w))}));a.b&&(k.displayName="Radio")},593:function(e,n,r){"use strict";r.d(n,"a",(function(){return v}));var t=r(266),o=r(209),a=r(202);function i(e,n){Object(a.a)(2,arguments);var r=Object(o.a)(e),t=Object(o.a)(n),i=r.getTime()-t.getTime();return i<0?-1:i>0?1:i}function c(e){return function(e,n){if(null==e)throw new TypeError("assign requires that input parameter not be null or undefined");for(var r in n=n||{})Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r]);return e}({},e)}var u=r(295),l=6e4,s=1440,d=43200,b=525600;function f(e,n){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object(a.a)(2,arguments);var f=r.locale||u.a;if(!f.formatDistance)throw new RangeError("locale must contain localize.formatDistance property");var v=i(e,n);if(isNaN(v))throw new RangeError("Invalid time value");var p,O,h=c(r);h.addSuffix=Boolean(r.addSuffix),h.comparison=v,v>0?(p=Object(o.a)(n),O=Object(o.a)(e)):(p=Object(o.a)(e),O=Object(o.a)(n));var j,m=null==r.roundingMethod?"round":String(r.roundingMethod);if("floor"===m)j=Math.floor;else if("ceil"===m)j=Math.ceil;else{if("round"!==m)throw new RangeError("roundingMethod must be 'floor', 'ceil' or 'round'");j=Math.round}var g,y=O.getTime()-p.getTime(),k=y/l,w=Object(t.a)(O)-Object(t.a)(p),C=(y-w)/l;if("second"===(g=null==r.unit?k<1?"second":k<60?"minute":k<s?"hour":C<d?"day":C<b?"month":"year":String(r.unit))){var P=j(y/1e3);return f.formatDistance("xSeconds",P,h)}if("minute"===g){var D=j(k);return f.formatDistance("xMinutes",D,h)}if("hour"===g){var E=j(k/60);return f.formatDistance("xHours",E,h)}if("day"===g){var x=j(C/s);return f.formatDistance("xDays",x,h)}if("month"===g){var R=j(C/d);return 12===R&&"month"!==r.unit?f.formatDistance("xYears",1,h):f.formatDistance("xMonths",R,h)}if("year"===g){var _=j(C/b);return f.formatDistance("xYears",_,h)}throw new RangeError("unit must be 'second', 'minute', 'hour', 'day', 'month' or 'year'")}function v(e,n){return Object(a.a)(1,arguments),f(e,Date.now(),n)}}}]);
|
|
2
|
-
//# sourceMappingURL=9.
|
|
1
|
+
(this["webpackJsonpconstruct-hub-webapp"]=this["webpackJsonpconstruct-hub-webapp"]||[]).push([[9],{146:function(e,n,r){"use strict";r.d(n,"a",(function(){return p}));var t=r(3),o=r(1),a=r(0),i=r.n(a),c=r(88);o.B?a.useLayoutEffect:a.useEffect;o.b;o.b;function u(e,n){if(null==e)return{};var r,t,o={},a=Object.keys(e);for(t=0;t<a.length;t++)r=a[t],n.indexOf(r)>=0||(o[r]=e[r]);return o}function l(){return l=Object.assign||function(e){for(var n=1;n<arguments.length;n++){var r=arguments[n];for(var t in r)Object.prototype.hasOwnProperty.call(r,t)&&(e[t]=r[t])}return e},l.apply(this,arguments)}function s(e){return Object.entries(e).sort((function(e,n){return Number.parseInt(e[1],10)>Number.parseInt(n[1],10)?1:-1})).map((function(e,n,r){var t=e[0],o=e[1],a=r[n+1],i=a?a[1]:void 0,c=function(e,n){if(!(parseInt(e,10)>=0)&&!n)return"";var r="(min-width: "+b(e)+")";if(!n)return r;r&&(r+=" and ");return r+="(max-width: "+b(function(e){return function(e,n){if("number"===typeof e)return""+(e+n);return e.replace(d,(function(e){return""+(parseFloat(e)+n)}))}(e,e.endsWith("px")?-1:-.01)}(n))+")"}(o,i);return{minWidth:o,maxWidth:i,breakpoint:t,query:c}}))}var d=/([0-9]+\.?[0-9]*)/;function b(e){return Object(o.I)(e)?e+"px":e}var f=["query"],v=["query"];function p(e,n){var r=function(e){var n=Object(t.j)().breakpoints,r=Object(c.b)(),o=i.a.useMemo((function(){return s(l({base:"0px"},n))}),[n]),a=i.a.useState((function(){if(e){var n=o.find((function(n){return n.breakpoint===e}));if(n)return n.query,u(n,f)}})),d=a[0],b=a[1],p=null==d?void 0:d.breakpoint,O=i.a.useCallback((function(e,n){e.matches&&p!==n.breakpoint&&b(n)}),[p]);return i.a.useEffect((function(){var e=new Set;return o.forEach((function(n){var t=n.query,o=u(n,v),a=r.window.matchMedia(t);O(a,o);var i=function(){O(a,o)};return a.addListener(i),e.add({mediaQuery:a,handleChange:i}),function(){a.removeListener(i)}})),function(){e.forEach((function(e){var n=e.mediaQuery,r=e.handleChange;n.removeListener(r)})),e.clear()}}),[o,n,O,r.window]),p}(n),a=Object(t.j)();if(r){var d=Object.keys(a.breakpoints);return function(e,n,r){void 0===r&&(r=o.g);var t=Object.keys(e).indexOf(n);if(-1!==t)return e[n];for(var a=r.indexOf(n);a>=0;){if(null!=e[r[a]]){t=a;break}a-=1}return-1!==t?e[r[t]]:void 0}(Object(o.A)(e)?Object(o.q)(Object.entries(Object(o.f)(e,d)).map((function(e){return[e[0],e[1]]}))):e,r,d)}}},150:function(e,n,r){"use strict";r.d(n,"a",(function(){return D})),r.d(n,"b",(function(){return M})),r.d(n,"c",(function(){return _})),r.d(n,"d",(function(){return x})),r.d(n,"e",(function(){return E}));r(89);var t=r(3),o=r(48),a=r.n(o),i=r(1),c=r(0),u=r.n(c),l=r(12),s=r(32),d=r(11),b=r(45);function f(){return f=Object.assign||function(e){for(var n=1;n<arguments.length;n++){var r=arguments[n];for(var t in r)Object.prototype.hasOwnProperty.call(r,t)&&(e[t]=r[t])}return e},f.apply(this,arguments)}function v(e,n){if(null==e)return{};var r,t,o={},a=Object.keys(e);for(t=0;t<a.length;t++)r=a[t],n.indexOf(r)>=0||(o[r]=e[r]);return o}var p=Object(l.a)({name:"PopoverContext",errorMessage:"usePopoverContext: `context` is undefined. Seems you forgot to wrap all popover components within `<Popover />`"}),O=p[0],h=p[1],j=function(e){if(e)return a()(e,{enter:{visibility:"visible"},exit:{transitionEnd:{visibility:"hidden"}}})},m=Object(s.a)(t.d.section),g=u.a.forwardRef((function(e,n){var r=h().isOpen;return u.a.createElement(m,f({ref:n,variants:j(e.variants)},e,{initial:!1,animate:r?"enter":"exit"}))}));g.defaultProps={variants:{exit:{opacity:0,scale:.95,transition:{duration:.1,ease:[.4,0,1,1]}},enter:{scale:1,opacity:1,transition:{duration:.15,ease:[0,0,.2,1]}}}};var y=["closeOnBlur","closeOnEsc","initialFocusRef","id","returnFocusOnClose","autoFocus","arrowSize","arrowShadowColor","trigger","openDelay","closeDelay","isLazy","lazyBehavior","computePositionOnMount"],k="click",w="hover";var C=["children"],P=["rootProps"],D=function(e){var n=Object(t.g)("Popover",e),r=Object(t.f)(e),o=r.children,a=function(e){void 0===e&&(e={});var n=e,r=n.closeOnBlur,t=void 0===r||r,o=n.closeOnEsc,a=void 0===o||o,u=n.initialFocusRef,s=n.id,p=n.returnFocusOnClose,O=void 0===p||p,h=n.autoFocus,j=void 0===h||h,m=n.arrowSize,g=n.arrowShadowColor,C=n.trigger,P=void 0===C?k:C,D=n.openDelay,E=void 0===D?200:D,x=n.closeDelay,R=void 0===x?200:x,_=n.isLazy,M=n.lazyBehavior,N=void 0===M?"unmount":M,S=n.computePositionOnMount,F=v(n,y),I=Object(d.g)(e),B=I.isOpen,T=I.onClose,q=I.onOpen,L=I.onToggle,z=Object(c.useRef)(null),A=Object(c.useRef)(null),K=Object(c.useRef)(!1),U=Object(c.useRef)(!1);B&&(U.current=!0);var H=Object(c.useState)(!1),W=H[0],G=H[1],V=Object(c.useState)(!1),Y=V[0],J=V[1],Q=Object(d.n)(s,"popover-trigger","popover-content","popover-header","popover-body"),X=Q[0],Z=Q[1],$=Q[2],ee=Q[3],ne=Object(b.b)(f({},F,{enabled:B||!!S})),re=ne.referenceRef,te=ne.getArrowProps,oe=ne.getPopperProps,ae=ne.getArrowInnerProps,ie=ne.forceUpdate;Object(d.j)({enabled:B,ref:z}),Object(d.i)(A,{focusRef:z,visible:B,shouldFocus:O&&P===k}),Object(d.k)(A,{focusRef:u,visible:B,shouldFocus:j&&P===k});var ce=Object(i.n)({hasBeenSelected:U.current,isLazy:_,lazyBehavior:N,isSelected:B}),ue=Object(c.useCallback)((function(e,n){var r;void 0===e&&(e={}),void 0===n&&(n=null);var o=f({},e,{style:f({},e.style,(r={transformOrigin:b.a.transformOrigin.varRef},r[b.a.arrowSize.var]=m?Object(i.Y)(m):void 0,r[b.a.arrowShadowColor.var]=g,r)),ref:Object(l.c)(A,n),children:ce?e.children:null,id:Z,tabIndex:-1,role:"dialog",onKeyDown:Object(i.i)(e.onKeyDown,(function(e){a&&"Escape"===e.key&&T()})),onBlur:Object(i.i)(e.onBlur,(function(e){var n=Object(i.x)(e),r=Object(i.j)(A.current,n),o=Object(i.j)(z.current,n);B&&t&&!r&&!o&&T()})),"aria-labelledby":W?$:void 0,"aria-describedby":Y?ee:void 0});return P===w&&(o.role="tooltip",o.onMouseEnter=Object(i.i)(e.onMouseEnter,(function(){K.current=!0})),o.onMouseLeave=Object(i.i)(e.onMouseLeave,(function(){K.current=!1,setTimeout(T,R)}))),o}),[ce,Z,W,$,Y,ee,P,a,T,B,t,R,g,m]),le=Object(c.useCallback)((function(e,n){return void 0===e&&(e={}),void 0===n&&(n=null),oe(f({},e,{style:f({visibility:B?"visible":"hidden"},e.style)}),n)}),[B,oe]),se=Object(c.useRef)(),de=Object(c.useRef)(),be=Object(c.useCallback)((function(e,n){void 0===e&&(e={}),void 0===n&&(n=null);var r=f({},e,{ref:Object(l.c)(z,n,re),id:X,"aria-haspopup":"dialog","aria-expanded":B,"aria-controls":Z});return P===k&&(r.onClick=Object(i.i)(e.onClick,L)),P===w&&(r.onFocus=Object(i.i)(e.onFocus,q),r.onBlur=Object(i.i)(e.onBlur,T),r.onKeyDown=Object(i.i)(e.onKeyDown,(function(e){"Escape"===e.key&&T()})),r.onMouseEnter=Object(i.i)(e.onMouseEnter,(function(){K.current=!0,se.current=window.setTimeout(q,E)})),r.onMouseLeave=Object(i.i)(e.onMouseLeave,(function(){K.current=!1,se.current&&(clearTimeout(se.current),se.current=void 0),de.current=window.setTimeout((function(){!1===K.current&&T()}),R)}))),r}),[X,B,Z,P,re,L,q,T,E,R]);Object(c.useEffect)((function(){return function(){se.current&&clearTimeout(se.current),de.current&&clearTimeout(de.current)}}),[]);var fe=Object(c.useCallback)((function(e,n){return void 0===e&&(e={}),void 0===n&&(n=null),f({},e,{id:$,ref:Object(l.c)(n,(function(e){G(!!e)}))})}),[$]),ve=Object(c.useCallback)((function(e,n){return void 0===e&&(e={}),void 0===n&&(n=null),f({},e,{id:ee,ref:Object(l.c)(n,(function(e){J(!!e)}))})}),[ee]);return{forceUpdate:ie,isOpen:B,onClose:T,getArrowProps:te,getArrowInnerProps:ae,getPopoverPositionerProps:le,getPopoverProps:ue,getTriggerProps:be,getHeaderProps:fe,getBodyProps:ve}}(f({},v(r,C),{direction:Object(t.j)().direction}));return c.createElement(O,{value:a},c.createElement(t.b,{value:n},Object(i.ab)(o,{isOpen:a.isOpen,onClose:a.onClose,forceUpdate:a.forceUpdate})))};i.b&&(D.displayName="Popover");var E=function(e){var n=c.Children.only(e.children),r=h().getTriggerProps;return c.cloneElement(n,r(n.props,n.ref))};i.b&&(E.displayName="PopoverTrigger");var x=Object(t.e)((function(e,n){var r=e.rootProps,o=v(e,P),a=h(),u=a.getPopoverProps,l=a.getPopoverPositionerProps,s=Object(t.i)(),d=f({position:"relative",display:"flex",flexDirection:"column"},s.content);return c.createElement(t.d.div,f({},l(r),{__css:s.popper,className:"chakra-popover__popper"}),c.createElement(g,f({},u(o,n),{className:Object(i.k)("chakra-popover__content",e.className),__css:d})))}));i.b&&(x.displayName="PopoverContent");var R=Object(t.e)((function(e,n){var r=h().getHeaderProps,o=Object(t.i)();return c.createElement(t.d.header,f({},r(e,n),{className:Object(i.k)("chakra-popover__header",e.className),__css:o.header}))}));i.b&&(R.displayName="PopoverHeader");var _=Object(t.e)((function(e,n){var r=h().getBodyProps,o=Object(t.i)();return c.createElement(t.d.div,f({},r(e,n),{className:Object(i.k)("chakra-popover__body",e.className),__css:o.body}))}));i.b&&(_.displayName="PopoverBody");i.b;i.b;var M=function(e){var n,r=e.bg,o=e.bgColor,a=e.backgroundColor,u=h(),l=u.getArrowProps,s=u.getArrowInnerProps,d=Object(t.i)(),b=null!=(n=null!=r?r:o)?n:a;return c.createElement(t.d.div,f({},l(),{className:"chakra-popover__arrow-positioner"}),c.createElement(t.d.div,f({className:Object(i.k)("chakra-popover__arrow",e.className)},s(e),{__css:f({},d.arrow,{"--popper-arrow-bg":b?"colors."+b+", "+b:void 0})})))};i.b&&(M.displayName="PopoverArrow")},151:function(e,n,r){"use strict";r.d(n,"a",(function(){return k})),r.d(n,"b",(function(){return j}));var t=r(3),o=r(54),a=r(1),i=r(0),c=r(12),u=r(11),l=r(85),s=r(60);function d(e,n){if(null==e)return{};var r,t,o={},a=Object.keys(e);for(t=0;t<a.length;t++)r=a[t],n.indexOf(r)>=0||(o[r]=e[r]);return o}function b(){return b=Object.assign||function(e){for(var n=1;n<arguments.length;n++){var r=arguments[n];for(var t in r)Object.prototype.hasOwnProperty.call(r,t)&&(e[t]=r[t])}return e},b.apply(this,arguments)}var f=["onChange","value","defaultValue","name","isDisabled","isFocusable","isNative"];var v=["colorScheme","size","variant","children","className","isDisabled","isFocusable"],p=Object(c.a)({name:"RadioGroupContext",strict:!1}),O=p[0],h=p[1],j=Object(t.e)((function(e,n){var r=e.colorScheme,o=e.size,l=e.variant,s=e.children,p=e.className,h=e.isDisabled,j=e.isFocusable,m=function(e){void 0===e&&(e={});var n=e,r=n.onChange,t=n.value,o=n.defaultValue,l=n.name,s=n.isDisabled,v=n.isFocusable,p=n.isNative,O=d(n,f),h=i.useState(o||""),j=h[0],m=h[1],g=Object(u.e)(t,j),y=g[0],k=g[1],w=i.useRef(null),C=i.useCallback((function(){var e=w.current;if(e){var n="input:not(:disabled):checked",r=e.querySelector(n);if(r)r.focus();else{n="input:not(:disabled)";var t=e.querySelector(n);null==t||t.focus()}}}),[]),P=Object(u.m)(void 0,"radio"),D=l||P,E=i.useCallback((function(e){var n=Object(a.G)(e)?e.target.value:e;y||m(n),null==r||r(String(n))}),[r,y]),x=i.useCallback((function(e,n){return void 0===e&&(e={}),void 0===n&&(n=null),b({},e,{ref:Object(c.c)(n,w),role:"radiogroup"})}),[]),R=i.useCallback((function(e,n){var r;return void 0===e&&(e={}),void 0===n&&(n=null),b({},e,((r={ref:n,name:D})[p?"checked":"isChecked"]=null!=k?e.value===k:void 0,r.onChange=E,r["data-radiogroup"]=!0,r))}),[p,D,E,k]);return{getRootProps:x,getRadioProps:R,name:D,ref:w,focus:C,setValue:m,value:k,onChange:E,isDisabled:s,isFocusable:v,htmlProps:O}}(d(e,v)),g=m.value,y=m.onChange,k=m.getRootProps,w=m.name,C=m.htmlProps,P=i.useMemo((function(){return{name:w,size:o,onChange:y,colorScheme:r,value:g,variant:l,isDisabled:h,isFocusable:j}}),[w,o,y,r,g,l,h,j]),D=k(C,n),E=Object(a.k)("chakra-radio-group",p);return i.createElement(O,{value:P},i.createElement(t.d.div,b({},D,{className:E}),s))}));a.b&&(j.displayName="RadioGroup");var m=["defaultIsChecked","defaultChecked","isChecked","isFocusable","isDisabled","isReadOnly","isRequired","onChange","isInvalid","name","value","id","data-radiogroup"];function g(e){e.preventDefault(),e.stopPropagation()}var y=["spacing","children","isFullWidth","isDisabled","isFocusable"],k=Object(t.e)((function(e,n){var r,c=h(),f=e.onChange,v=e.value,p=Object(t.g)("Radio",b({},c,e)),O=Object(t.f)(e),j=O.spacing,k=void 0===j?"0.5rem":j,w=O.children,C=O.isFullWidth,P=O.isDisabled,D=void 0===P?null==c?void 0:c.isDisabled:P,E=O.isFocusable,x=void 0===E?null==c?void 0:c.isFocusable:E,R=d(O,y),_=e.isChecked;null!=(null==c?void 0:c.value)&&null!=v&&(_=c.value===v);var M=f;null!=c&&c.onChange&&null!=v&&(M=Object(a.h)(c.onChange,f));var N=function(e){void 0===e&&(e={});var n=e,r=n.defaultIsChecked,t=n.defaultChecked,o=void 0===t?r:t,c=n.isChecked,f=n.isFocusable,v=n.isDisabled,p=n.isReadOnly,O=n.isRequired,j=n.onChange,y=n.isInvalid,k=n.name,w=n.value,C=n.id,P=n["data-radiogroup"],D=d(n,m),E=Object(u.m)(void 0,"radio"),x=Object(l.b)(),R=h(),_=!x||R||P?E:x.id;_=null!=C?C:_;var M=null!=v?v:null==x?void 0:x.isDisabled,N=null!=p?p:null==x?void 0:x.isReadOnly,S=null!=O?O:null==x?void 0:x.isRequired,F=null!=y?y:null==x?void 0:x.isInvalid,I=Object(u.b)(),B=I[0],T=I[1],q=Object(u.b)(),L=q[0],z=q[1],A=Object(u.b)(),K=A[0],U=A[1],H=Object(i.useState)(Boolean(o)),W=H[0],G=H[1],V=Object(u.e)(c,W),Y=V[0],J=V[1];Object(a.db)({condition:!!r,message:'The "defaultIsChecked" prop has been deprecated and will be removed in a future version. Please use the "defaultChecked" prop instead, which mirrors default React checkbox behavior.'});var Q=Object(i.useCallback)((function(e){N||M?e.preventDefault():(Y||G(e.target.checked),null==j||j(e))}),[Y,M,N,j]),X=Object(i.useCallback)((function(e){" "===e.key&&U.on()}),[U]),Z=Object(i.useCallback)((function(e){" "===e.key&&U.off()}),[U]),$=Object(i.useCallback)((function(e,n){return void 0===e&&(e={}),void 0===n&&(n=null),b({},e,{ref:n,"data-active":Object(a.l)(K),"data-hover":Object(a.l)(L),"data-disabled":Object(a.l)(M),"data-invalid":Object(a.l)(F),"data-checked":Object(a.l)(J),"data-focus":Object(a.l)(B),"data-readonly":Object(a.l)(N),"aria-hidden":!0,onMouseDown:Object(a.i)(e.onMouseDown,U.on),onMouseUp:Object(a.i)(e.onMouseUp,U.off),onMouseEnter:Object(a.i)(e.onMouseEnter,z.on),onMouseLeave:Object(a.i)(e.onMouseLeave,z.off)})}),[K,L,M,F,J,B,N,U.on,U.off,z.on,z.off]),ee=null!=x?x:{},ne=ee.onFocus,re=ee.onBlur,te=Object(i.useCallback)((function(e,n){void 0===e&&(e={}),void 0===n&&(n=null);var r=M&&!f;return b({},e,{id:_,ref:n,type:"radio",name:k,value:w,onChange:Object(a.i)(e.onChange,Q),onBlur:Object(a.i)(re,e.onBlur,T.off),onFocus:Object(a.i)(ne,e.onFocus,T.on),onKeyDown:Object(a.i)(e.onKeyDown,X),onKeyUp:Object(a.i)(e.onKeyUp,Z),checked:J,disabled:r,readOnly:N,required:S,"aria-invalid":Object(a.e)(F),"aria-disabled":Object(a.e)(r),"aria-required":Object(a.e)(S),"data-readonly":Object(a.l)(N),style:s.b})}),[M,f,_,k,w,Q,re,T,ne,X,Z,J,N,S,F]);return{state:{isInvalid:F,isFocused:B,isChecked:J,isActive:K,isHovered:L,isDisabled:M,isReadOnly:N,isRequired:S},getCheckboxProps:$,getInputProps:te,getLabelProps:function(e,n){return void 0===e&&(e={}),void 0===n&&(n=null),b({},e,{ref:n,onMouseDown:Object(a.i)(e.onMouseDown,g),onTouchStart:Object(a.i)(e.onTouchStart,g),"data-disabled":Object(a.l)(M),"data-checked":Object(a.l)(J),"data-invalid":Object(a.l)(F)})},getRootProps:function(e,n){return void 0===n&&(n=null),b({},e,{ref:n,"data-disabled":Object(a.l)(M),"data-checked":Object(a.l)(J),"data-invalid":Object(a.l)(F)})},htmlProps:D}}(b({},R,{isChecked:_,isFocusable:x,isDisabled:D,onChange:M,name:null!=(r=null==e?void 0:e.name)?r:null==c?void 0:c.name})),S=N.getInputProps,F=N.getCheckboxProps,I=N.getLabelProps,B=N.getRootProps,T=N.htmlProps,q=Object(a.bb)(T,o.c),L=q[0],z=F(q[1]),A=S({},n),K=I(),U=Object.assign({},L,B()),H=b({width:C?"full":void 0,display:"inline-flex",alignItems:"center",verticalAlign:"top",cursor:"pointer"},p.container),W=b({display:"inline-flex",alignItems:"center",justifyContent:"center",flexShrink:0},p.control),G=b({userSelect:"none",marginStart:k},p.label);return i.createElement(t.d.label,b({className:"chakra-radio"},U,{__css:H}),i.createElement("input",b({className:"chakra-radio__input"},A)),i.createElement(t.d.span,b({className:"chakra-radio__control"},z,{__css:W})),w&&i.createElement(t.d.span,b({className:"chakra-radio__label"},K,{__css:G}),w))}));a.b&&(k.displayName="Radio")},592:function(e,n,r){"use strict";r.d(n,"a",(function(){return v}));var t=r(265),o=r(208),a=r(201);function i(e,n){Object(a.a)(2,arguments);var r=Object(o.a)(e),t=Object(o.a)(n),i=r.getTime()-t.getTime();return i<0?-1:i>0?1:i}function c(e){return function(e,n){if(null==e)throw new TypeError("assign requires that input parameter not be null or undefined");for(var r in n=n||{})Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r]);return e}({},e)}var u=r(294),l=6e4,s=1440,d=43200,b=525600;function f(e,n){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object(a.a)(2,arguments);var f=r.locale||u.a;if(!f.formatDistance)throw new RangeError("locale must contain localize.formatDistance property");var v=i(e,n);if(isNaN(v))throw new RangeError("Invalid time value");var p,O,h=c(r);h.addSuffix=Boolean(r.addSuffix),h.comparison=v,v>0?(p=Object(o.a)(n),O=Object(o.a)(e)):(p=Object(o.a)(e),O=Object(o.a)(n));var j,m=null==r.roundingMethod?"round":String(r.roundingMethod);if("floor"===m)j=Math.floor;else if("ceil"===m)j=Math.ceil;else{if("round"!==m)throw new RangeError("roundingMethod must be 'floor', 'ceil' or 'round'");j=Math.round}var g,y=O.getTime()-p.getTime(),k=y/l,w=Object(t.a)(O)-Object(t.a)(p),C=(y-w)/l;if("second"===(g=null==r.unit?k<1?"second":k<60?"minute":k<s?"hour":C<d?"day":C<b?"month":"year":String(r.unit))){var P=j(y/1e3);return f.formatDistance("xSeconds",P,h)}if("minute"===g){var D=j(k);return f.formatDistance("xMinutes",D,h)}if("hour"===g){var E=j(k/60);return f.formatDistance("xHours",E,h)}if("day"===g){var x=j(C/s);return f.formatDistance("xDays",x,h)}if("month"===g){var R=j(C/d);return 12===R&&"month"!==r.unit?f.formatDistance("xYears",1,h):f.formatDistance("xMonths",R,h)}if("year"===g){var _=j(C/b);return f.formatDistance("xYears",_,h)}throw new RangeError("unit must be 'second', 'minute', 'hour', 'day', 'month' or 'year'")}function v(e,n){return Object(a.a)(1,arguments),f(e,Date.now(),n)}}}]);
|
|
2
|
+
//# sourceMappingURL=9.44832d44.chunk.js.map
|