construct-hub 0.3.141 → 0.3.145

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. package/.jsii +39 -39
  2. package/lib/construct-hub.js +1 -1
  3. package/lib/package-sources/code-artifact.js +1 -1
  4. package/lib/package-sources/npmjs.js +17 -6
  5. package/lib/package-tag/index.js +2 -2
  6. package/lib/s3/vpc-endpoint-bucket.js +30 -1
  7. package/lib/spdx-license.js +1 -1
  8. package/lib/webapp/index.js +1 -15
  9. package/lib/webapp/response-function/response-function.d.ts +1 -0
  10. package/lib/webapp/response-function/response-function.js +4 -6
  11. package/package.json +2 -2
  12. package/website/android-chrome-192x192.png +0 -0
  13. package/website/apple-touch-icon.png +0 -0
  14. package/website/asset-manifest.json +31 -31
  15. package/website/assets/favicon-16x16.png +0 -0
  16. package/website/assets/favicon-32x32.png +0 -0
  17. package/website/assets/favicon.ico +0 -0
  18. package/website/favicon-16x16.png +0 -0
  19. package/website/favicon-32x32.png +0 -0
  20. package/website/favicon.ico +0 -0
  21. package/website/index.html +1 -1
  22. package/website/manifest.json +3 -8
  23. package/website/mstile-150x150.png +0 -0
  24. package/website/static/js/{10.30ecd71a.chunk.js → 10.5f66f973.chunk.js} +2 -2
  25. package/website/static/js/{10.30ecd71a.chunk.js.map → 10.5f66f973.chunk.js.map} +1 -1
  26. package/website/static/js/11.d6a2b77e.chunk.js +2 -0
  27. package/website/static/js/11.d6a2b77e.chunk.js.map +1 -0
  28. package/website/static/js/12.519faaaf.chunk.js +2 -0
  29. package/website/static/js/12.519faaaf.chunk.js.map +1 -0
  30. package/website/static/js/13.6fe7d275.chunk.js +2 -0
  31. package/website/static/js/13.6fe7d275.chunk.js.map +1 -0
  32. package/website/static/js/14.079eb5e1.chunk.js +2 -0
  33. package/website/static/js/14.079eb5e1.chunk.js.map +1 -0
  34. package/website/static/js/{4.e051c405.chunk.js → 4.862b4ce7.chunk.js} +3 -3
  35. package/website/static/js/{4.e051c405.chunk.js.LICENSE.txt → 4.862b4ce7.chunk.js.LICENSE.txt} +0 -0
  36. package/website/static/js/{4.e051c405.chunk.js.map → 4.862b4ce7.chunk.js.map} +1 -1
  37. package/website/static/js/{5.05213cd1.chunk.js → 5.0e0c97cb.chunk.js} +3 -3
  38. package/website/static/js/{5.05213cd1.chunk.js.LICENSE.txt → 5.0e0c97cb.chunk.js.LICENSE.txt} +0 -0
  39. package/website/static/js/5.0e0c97cb.chunk.js.map +1 -0
  40. package/website/static/js/6.78d88d4c.chunk.js +2 -0
  41. package/website/static/js/6.78d88d4c.chunk.js.map +1 -0
  42. package/website/static/js/7.a053380e.chunk.js +2 -0
  43. package/website/static/js/7.a053380e.chunk.js.map +1 -0
  44. package/website/static/js/8.c99e08cd.chunk.js +2 -0
  45. package/website/static/js/8.c99e08cd.chunk.js.map +1 -0
  46. package/website/static/js/{9.174f64fc.chunk.js → 9.d40d7958.chunk.js} +2 -2
  47. package/website/static/js/{9.174f64fc.chunk.js.map → 9.d40d7958.chunk.js.map} +1 -1
  48. package/website/static/js/main.6de5586a.chunk.js +2 -0
  49. package/website/static/js/main.6de5586a.chunk.js.map +1 -0
  50. package/website/static/js/{runtime-main.3666b7b5.js → runtime-main.2c215cbd.js} +2 -2
  51. package/website/static/js/{runtime-main.3666b7b5.js.map → runtime-main.2c215cbd.js.map} +1 -1
  52. package/lib/webapp/home-response-function/home-response-function.d.ts +0 -8
  53. package/lib/webapp/home-response-function/home-response-function.js +0 -24
  54. package/lib/webapp/home-response-function/index.d.ts +0 -7
  55. package/lib/webapp/home-response-function/index.js +0 -17
  56. package/website/logo192.png +0 -0
  57. package/website/logo512.png +0 -0
  58. package/website/static/js/11.9e53aff3.chunk.js +0 -2
  59. package/website/static/js/11.9e53aff3.chunk.js.map +0 -1
  60. package/website/static/js/12.7d44c985.chunk.js +0 -2
  61. package/website/static/js/12.7d44c985.chunk.js.map +0 -1
  62. package/website/static/js/13.9c0ba67b.chunk.js +0 -2
  63. package/website/static/js/13.9c0ba67b.chunk.js.map +0 -1
  64. package/website/static/js/14.924c14cb.chunk.js +0 -2
  65. package/website/static/js/14.924c14cb.chunk.js.map +0 -1
  66. package/website/static/js/5.05213cd1.chunk.js.map +0 -1
  67. package/website/static/js/6.d05c0b08.chunk.js +0 -2
  68. package/website/static/js/6.d05c0b08.chunk.js.map +0 -1
  69. package/website/static/js/7.ebf6a179.chunk.js +0 -2
  70. package/website/static/js/7.ebf6a179.chunk.js.map +0 -1
  71. package/website/static/js/8.8e96ad43.chunk.js +0 -2
  72. package/website/static/js/8.8e96ad43.chunk.js.map +0 -1
  73. package/website/static/js/main.8038c15f.chunk.js +0 -2
  74. package/website/static/js/main.8038c15f.chunk.js.map +0 -1
@@ -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/SearchRedesign/FilterHeading.tsx","views/SearchRedesign/testIds.ts","views/SearchRedesign/RadioFilter.tsx","views/SearchRedesign/constants.ts","views/SearchRedesign/util.ts","views/SearchRedesign/SearchState.tsx","views/SearchRedesign/CDKFilter.tsx","views/SearchRedesign/CheckboxFilter.tsx","views/SearchRedesign/KeywordsFilter.tsx","views/SearchRedesign/LanguageFilter.tsx","views/SearchRedesign/TagFilter.tsx","views/SearchRedesign/FilterPanel.tsx","components/PackageList/PackageList.tsx","components/PackageList/WideCardList.tsx","views/SearchRedesign/ArrowButton.tsx","views/SearchRedesign/GoToPage.tsx","views/SearchRedesign/PageControls.tsx","views/SearchRedesign/SearchDetails.tsx","views/SearchRedesign/SortFilter.tsx","views/SearchRedesign/SortAndFilterDrawer.tsx","views/SearchRedesign/SortedBy.tsx","views/SearchRedesign/SearchResults.tsx","views/SearchRedesign/SearchRedesign.tsx"],"names":["pageInfo","contribute","event","name","home","faq","packageProfile","search","siteTerms","notFound","page","pageType","Page","children","meta","pageName","trackPageView","usePageView","useEffect","suffix","title","description","formattedTitle","join","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","constructFramework","version","cdkType","cdkVersion","majorVersion","Link","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","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","FilterHeading","hint","mb","colorScheme","strategy","ml","shadow","RadioFilter","checkedValue","onValueChange","onChange","display","filterItem","isTruncated","SORT_RENDER_MAP","CatalogSearchSort","NameAsc","NameDesc","PublishDateAsc","PublishDateDesc","DownloadsDesc","DownloadsAsc","toNum","result","parseInt","parseQueryArray","queryString","decodeURIComponent","split","SearchStateContext","useSearchState","state","Error","SearchStateProvider","queryParams","offset","OFFSET","SEARCH_QUERY","tagQuery","TAGS","keywordQuery","KEYWORDS","SORT","CDK_TYPE","cdkMajorParam","CDK_MAJOR","cdkMajor","searchAPI","useCatalogSearch","defaultCdkMajor","defaultCdkType","defaultKeywords","defaultLanguages","defaultQuery","defaultSort","defaultTags","setQuery","some","k","setKeywords","t","setTags","limit","CDKFilter","setCdkType","setCdkMajor","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","getOnChange","alwaysShow","showWhenExpanded","isExpandible","mt","item","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","overflow","pos","top","listViews","items","PackageList","memo","cardView","loading","View","ArrowButton","getPageUrl","props","borderColor","mx","disabled","GoToPage","pageLimit","inputValue","setInputValue","onSubmit","e","preventDefault","max","min","target","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","SearchRedesign","templateRows"],"mappings":"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","file":"static/js/8.c99e08cd.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\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 // 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).\n const 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\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 \"../../contexts/Stats\";\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\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&apos;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 { 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 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 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 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 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 pkg: CatalogPackage;\n variant?: PackageCardType;\n}\n\nconst PackageCardContext = createContext<\n (CatalogPackage & { comment?: string }) | null\n>(null);\n\nexport const usePackageCard = () => useContext(PackageCardContext)!;\n\nexport const PackageCard: FunctionComponent<PackageCardProps> = ({\n pkg,\n variant = PackageCardType.Wide,\n}) => {\n return (\n <PackageCardContext.Provider value={pkg}>\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<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 { QuestionIcon } from \"@chakra-ui/icons\";\nimport {\n Flex,\n Heading,\n Text,\n Popover,\n PopoverTrigger,\n PopoverBody,\n PopoverArrow,\n PopoverContent,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\n\nexport interface FilterHeadingProps {\n name: string;\n hint?: string;\n}\n\nexport const FilterHeading: FunctionComponent<FilterHeadingProps> = ({\n name,\n hint,\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=\"right\" strategy=\"fixed\">\n <PopoverTrigger>\n <Flex aria-label={`Hint: ${name}`} as=\"button\" ml={2}>\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 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 { 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 <Radio key={value} value={value}>\n <Text\n color=\"gray.600\"\n data-testid={testIds.filterItem}\n data-value={value}\n isTruncated\n >\n {display}\n </Text>\n </Radio>\n ))}\n </Stack>\n </RadioGroup>\n </Stack>\n );\n};\n","import { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport type { QueryParamKey } from \"../../constants/url\";\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","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 \"../SearchRedesign/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 // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [keywords]);\n\n useEffect(() => {\n if (tags.some((t) => !searchAPI.tags.includes(t))) {\n searchAPI.setTags(tags);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [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 { 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\n const getOnChange = (value: string) => () => {\n onValueChange(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.value)}\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.value)}\n />\n ))}\n </Stack>\n </Collapse>\n )}\n </Stack>\n {isExpandible && (\n <Flex align=\"start\" mt={1}>\n <Button\n color=\"gray.600\"\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 items: CatalogPackage[];\n}\n\nexport interface PackageListProps extends Partial<PackageListViewProps> {\n cardView?: PackageCardType;\n loading?: boolean;\n title?: string;\n}\n\nexport const PackageList: FunctionComponent<PackageListProps> = memo(\n ({\n cardView = PackageCardType.Wide,\n items,\n loading,\n // title,\n }) => {\n if (loading || !items) {\n return (\n <Center>\n <Spinner size=\"xl\" />\n </Center>\n );\n }\n\n const View = listViews[cardView];\n\n return <View items={items} />;\n }\n);\n\nPackageList.displayName = \"PackageList\";\n","import { Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { PackageCard, PackageCardType } from \"../PackageCard\";\nimport { PackageListViewProps } from \"./PackageList\";\n\nexport const WideCardList: FunctionComponent<PackageListViewProps> = ({\n items,\n}) => {\n return (\n <Stack spacing={4}>\n {items.map((pkg) => (\n <PackageCard\n key={`${pkg.name}-${pkg.version}`}\n pkg={pkg}\n variant={PackageCardType.Wide}\n />\n ))}\n </Stack>\n );\n};\n","import { IconButton, IconProps } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\n\nexport interface ArrowButtonProps {\n \"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-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-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\";\n\nexport interface GoToPageProps {\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-testid\": dataTestid,\n pageLimit,\n offset,\n getPageUrl,\n}) => {\n const [inputValue, setInputValue] = useState((offset + 1).toString());\n const { push } = useHistory();\n\n useEffect(() => {\n setInputValue((offset + 1).toString());\n }, [offset]);\n\n const onInputChange = (e: SyntheticEvent<HTMLInputElement>) => {\n e.preventDefault();\n setInputValue((e.target as HTMLInputElement).value);\n };\n\n const onSubmit: FormEventHandler<HTMLInputElement> = (e) => {\n e.preventDefault();\n push(getPageUrl({ offset: parseInt(inputValue) - 1 }));\n };\n\n return (\n <Flex align=\"center\" as=\"form\" mx={2} onSubmit={onSubmit}>\n <Input\n colorScheme=\"blue\"\n data-testid={dataTestid}\n h={10}\n max={pageLimit + 1}\n min={1}\n name=\"page\"\n onChange={onInputChange}\n p={0}\n textAlign=\"center\"\n type=\"number\"\n value={inputValue}\n w={10}\n />\n <Text ml={2} w=\"max-content\">\n of {pageLimit + 1}\n </Text>\n </Flex>\n );\n};\n","import { ChevronLeftIcon, ChevronRightIcon } from \"@chakra-ui/icons\";\nimport { Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { ArrowButton } from \"./ArrowButton\";\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-testid={testIds.prevPage}\n getPageUrl={getPageUrl}\n icon={ChevronLeftIcon}\n offset={prevOffset}\n />\n <GoToPage\n data-testid={testIds.goToPage}\n getPageUrl={getPageUrl}\n offset={offset}\n pageLimit={pageLimit}\n />\n <ArrowButton\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<{ first: number; count: number; 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 { 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-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-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-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 } from \"../SearchRedesign/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 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 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 SearchRedesign: 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],{12:function(e,t,a){"use strict";var n=a(66);a.o(n,"layoutPropNames")&&a.d(t,"layoutPropNames",(function(){return n.layoutPropNames})),a.o(n,"tokenToCSSVar")&&a.d(t,"tokenToCSSVar",(function(){return n.tokenToCSSVar}));var r=a(273);a.o(r,"layoutPropNames")&&a.d(t,"layoutPropNames",(function(){return r.layoutPropNames})),a.o(r,"tokenToCSSVar")&&a.d(t,"tokenToCSSVar",(function(){return r.tokenToCSSVar}))},273:function(e,t){},392:function(e,t,a){"use strict";a.d(t,"b",(function(){return l})),a.d(t,"a",(function(){return u}));var n=a(17),r=a(21),i=a(15),o=a(0);function c(){return c=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var n in a)Object.prototype.hasOwnProperty.call(a,n)&&(e[n]=a[n])}return e},c.apply(this,arguments)}function s(e,t){if(null==e)return{};var a,n,r={},i=Object.keys(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}var l=Object(n.a)((function(e,t){var a=e.isExternal,n=e.target,l=e.rel,u=e.className,d=s(e,["isExternal","target","rel","className"]);return o.createElement(r.a.a,c({},d,{ref:t,className:Object(i.d)("chakra-linkbox__overlay",u),rel:a?"noopener noreferrer":l,target:a?"_blank":n,__css:{position:"static","&::before":{content:"''",cursor:"inherit",display:"block",position:"absolute",top:0,left:0,zIndex:0,width:"100%",height:"100%"}}}))})),u=Object(n.a)((function(e,t){var a=e.className,n=s(e,["className"]);return o.createElement(r.a.div,c({ref:t,position:"relative"},n,{className:Object(i.d)("chakra-linkbox",a),__css:{"a[href]:not(.chakra-linkbox__overlay), abbr[title]":{position:"relative",zIndex:1}}}))}))},393:function(e,t,a){"use strict";function n(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}a.d(t,"a",(function(){return n}))},638:function(e,t,a){"use strict";a.d(t,"a",(function(){return m}));var n=a(307),r=a(249),i=a(242);function o(e,t){Object(i.a)(2,arguments);var a=Object(r.a)(e),n=Object(r.a)(t),o=a.getTime()-n.getTime();return o<0?-1:o>0?1:o}function c(e){return function(e,t){if(null==e)throw new TypeError("assign requires that input parameter not be null or undefined");for(var a in t=t||{})Object.prototype.hasOwnProperty.call(t,a)&&(e[a]=t[a]);return e}({},e)}var s=a(336),l=6e4,u=1440,d=43200,f=525600;function b(e,t){var a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object(i.a)(2,arguments);var b=a.locale||s.a;if(!b.formatDistance)throw new RangeError("locale must contain localize.formatDistance property");var m=o(e,t);if(isNaN(m))throw new RangeError("Invalid time value");var p,v,h=c(a);h.addSuffix=Boolean(a.addSuffix),h.comparison=m,m>0?(p=Object(r.a)(t),v=Object(r.a)(e)):(p=Object(r.a)(e),v=Object(r.a)(t));var O,j=null==a.roundingMethod?"round":String(a.roundingMethod);if("floor"===j)O=Math.floor;else if("ceil"===j)O=Math.ceil;else{if("round"!==j)throw new RangeError("roundingMethod must be 'floor', 'ceil' or 'round'");O=Math.round}var y,g=v.getTime()-p.getTime(),x=g/l,w=Object(n.a)(v)-Object(n.a)(p),N=(g-w)/l;if("second"===(y=null==a.unit?x<1?"second":x<60?"minute":x<u?"hour":N<d?"day":N<f?"month":"year":String(a.unit))){var _=O(g/1e3);return b.formatDistance("xSeconds",_,h)}if("minute"===y){var k=O(x);return b.formatDistance("xMinutes",k,h)}if("hour"===y){var S=O(x/60);return b.formatDistance("xHours",S,h)}if("day"===y){var E=O(N/u);return b.formatDistance("xDays",E,h)}if("month"===y){var T=O(N/d);return 12===T&&"month"!==a.unit?b.formatDistance("xYears",1,h):b.formatDistance("xMonths",T,h)}if("year"===y){var I=O(N/f);return b.formatDistance("xYears",I,h)}throw new RangeError("unit must be 'second', 'minute', 'hour', 'day', 'month' or 'year'")}function m(e,t){return Object(i.a)(1,arguments),b(e,Date.now(),t)}},640:function(e,t,a){"use strict";a.d(t,"e",(function(){return R})),a.d(t,"a",(function(){return W})),a.d(t,"b",(function(){return H})),a.d(t,"c",(function(){return q})),a.d(t,"d",(function(){return J}));var n=a(17),r=a(55),i=a(36),o=a(54),c=a(21),s=a(29),l=a(15),u=a(8),d=a(0),f=a(4),b=a(5),m=a(241),p=a(233),v=a(153),h=a(118),O=a(152),j=a(120),y=a(163),g=a(161),x=a(185),w=a(32),N=a(218);function _(){return _=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var n in a)Object.prototype.hasOwnProperty.call(a,n)&&(e[n]=a[n])}return e},_.apply(this,arguments)}function k(e,t){if(null==e)return{};var a,n,r={},i=Object.keys(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}var S=Object(p.a)(),E=Object(b.a)(S,4),T=E[0],I=E[1],C=E[2],D=E[3];var z=Object(j.a)({name:"TabsContext",errorMessage:"useTabsContext: `context` is undefined. Seems you forgot to wrap all tabs components within <Tabs />"}),P=Object(b.a)(z,2),M=P[0],F=P[1];function L(e,t){return e+"--tab-"+t}function A(e,t){return e+"--tabpanel-"+t}function V(){return V=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var n in a)Object.prototype.hasOwnProperty.call(a,n)&&(e[n]=a[n])}return e},V.apply(this,arguments)}function B(e,t){if(null==e)return{};var a,n,r={},i=Object.keys(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}var R=Object(n.a)((function(e,t){var a=Object(r.a)("Tabs",e),n=Object(i.b)(e),u=n.children,f=n.className,m=function(e){var t=e.defaultIndex,a=e.onChange,n=e.index,r=e.isManual,i=e.isLazy,o=e.lazyBehavior,c=void 0===o?"unmount":o,s=e.orientation,l=void 0===s?"horizontal":s,u=e.direction,f=void 0===u?"ltr":u,m=k(e,["defaultIndex","onChange","index","isManual","isLazy","lazyBehavior","orientation","direction"]),p=d.useState(null!=t?t:0),O=Object(b.a)(p,2),j=O[0],y=O[1],g=Object(v.b)({defaultValue:null!=t?t:0,value:n,onChange:a}),x=Object(b.a)(g,2),w=x[0],N=x[1];d.useEffect((function(){null!=n&&y(n)}),[n]);var _=C();return{id:Object(h.b)(e.id,"tabs"),selectedIndex:w,focusedIndex:j,setSelectedIndex:N,setFocusedIndex:y,isManual:r,isLazy:i,lazyBehavior:c,orientation:l,descendants:_,direction:f,htmlProps:m}}(B(n,["children","className"])),p=m.htmlProps,O=m.descendants,j=B(m,["htmlProps","descendants"]),y=d.useMemo((function(){return j}),[j]),g=Object(s.g)(p,["isFitted"]);return d.createElement(T,{value:O},d.createElement(M,{value:y},d.createElement(o.b,{value:a},d.createElement(c.a.div,V({className:Object(l.d)("chakra-tabs",f),ref:t},g,{__css:a.root}),u))))}));u.a&&(R.displayName="Tabs");var W=Object(n.a)((function(e,t){var a=Object(o.d)(),n=function(e){var t=e.isDisabled,a=e.isFocusable,n=k(e,["isDisabled","isFocusable"]),r=F(),i=r.setSelectedIndex,o=r.isManual,c=r.id,s=r.setFocusedIndex,l=r.selectedIndex,u=D({disabled:t&&!a}),d=u.index,f=u.register,b=d===l,p=Object(m.a)(_({},n,{ref:Object(y.a)(f,e.ref),isDisabled:t,isFocusable:a,onClick:Object(w.b)(e.onClick,(function(){i(d)}))}));return _({},p,{id:L(c,d),role:"tab",tabIndex:b?0:-1,type:"button","aria-selected":b,"aria-controls":A(c,d),onFocus:t?void 0:Object(w.b)(e.onFocus,(function(){s(d),!o&&(!t||!a)&&i(d)}))})}(V({},e,{ref:t})),r=V({outline:"0",display:"flex",alignItems:"center",justifyContent:"center"},a.tab);return d.createElement(c.a.button,V({},n,{className:Object(l.d)("chakra-tabs__tab",e.className),__css:r}))}));u.a&&(W.displayName="Tab");var H=Object(n.a)((function(e,t){var a=function(e){var t=F(),a=t.focusedIndex,n=t.orientation,r=t.direction,i=I(),o=d.useCallback((function(e){var t,o=function(){var e=i.nextEnabled(a);e&&Object(x.a)(e.node)},c=function(){var e=i.prevEnabled(a);e&&Object(x.a)(e.node)},s="horizontal"===n,u="vertical"===n,d=Object(l.m)(e),b="ltr"===r?"ArrowLeft":"ArrowRight",m="ltr"===r?"ArrowRight":"ArrowLeft",p=(t={},Object(f.a)(t,b,(function(){return s&&c()})),Object(f.a)(t,m,(function(){return s&&o()})),Object(f.a)(t,"ArrowDown",(function(){return u&&o()})),Object(f.a)(t,"ArrowUp",(function(){return u&&c()})),Object(f.a)(t,"Home",(function(){var e=i.firstEnabled();e&&Object(x.a)(e.node)})),Object(f.a)(t,"End",(function(){var e=i.lastEnabled();e&&Object(x.a)(e.node)})),t)[d];p&&(e.preventDefault(),p(e))}),[i,a,n,r]);return _({},e,{role:"tablist","aria-orientation":n,onKeyDown:Object(w.b)(e.onKeyDown,o)})}(V({},e,{ref:t})),n=V({display:"flex"},Object(o.d)().tablist);return d.createElement(c.a.div,V({},a,{className:Object(l.d)("chakra-tabs__tablist",e.className),__css:n}))}));u.a&&(H.displayName="TabList");var q=Object(n.a)((function(e,t){var a=function(e){var t=e.isSelected,a=e.id,n=e.children,r=k(e,["isSelected","id","children"]),i=F(),o=i.isLazy,c=i.lazyBehavior,s=d.useRef(!1);return t&&(s.current=!0),_({tabIndex:0},r,{children:Object(N.a)({hasBeenSelected:s.current,isSelected:t,isLazy:o,lazyBehavior:c})?n:null,role:"tabpanel",hidden:!t,id:a})}(V({},e,{ref:t})),n=Object(o.d)();return d.createElement(c.a.div,V({outline:"0"},a,{className:Object(l.d)("chakra-tabs__tab-panel",e.className),__css:n.tabpanel}))}));u.a&&(q.displayName="TabPanel");var J=Object(n.a)((function(e,t){var a=function(e){var t=F(),a=t.id,n=t.selectedIndex;return _({},e,{children:Object(g.a)(e.children).map((function(e,t){return d.cloneElement(e,{isSelected:t===n,id:A(a,t),"aria-labelledby":L(a,t)})}))})}(e),n=Object(o.d)();return d.createElement(c.a.div,V({},a,{width:"100%",ref:t,className:Object(l.d)("chakra-tabs__tab-panels",e.className),__css:n.tabpanels}))}));u.a&&(J.displayName="TabPanels");var K=Object(n.a)((function(e,t){var a=function(){var e=F(),t=I(),a=e.selectedIndex,n=e.orientation,r="horizontal"===n,i="vertical"===n,o=d.useState((function(){return r?{left:0,width:0}:i?{top:0,height:0}:void 0})),c=Object(b.a)(o,2),s=c[0],l=c[1],f=d.useState(!1),m=Object(b.a)(f,2),p=m[0],v=m[1];return Object(O.a)((function(){if(!Object(u.l)(a)){var e=t.item(a);if(!Object(u.l)(e)){r&&l({left:e.node.offsetLeft,width:e.node.offsetWidth}),i&&l({top:e.node.offsetTop,height:e.node.offsetHeight});var n=requestAnimationFrame((function(){v(!0)}));return function(){n&&cancelAnimationFrame(n)}}}}),[a,r,i,t]),_({position:"absolute",transitionProperty:"left, right, top, bottom",transitionDuration:p?"200ms":"0ms",transitionTimingFunction:"cubic-bezier(0, 0, 0.2, 1)"},s)}(),n=V({},e.style,a),r=Object(o.d)();return d.createElement(c.a.div,V({ref:t},e,{className:Object(l.d)("chakra-tabs__tab-indicator",e.className),style:n,__css:r.indicator}))}));u.a&&(K.displayName="TabIndicator")},641:function(e,t,a){"use strict";a.d(t,"a",(function(){return f})),a.d(t,"b",(function(){return b}));var n=a(17),r=a(12),i=a(21),o=a(121),c=a(15),s=a(8),l=a(0);function u(){return u=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var n in a)Object.prototype.hasOwnProperty.call(a,n)&&(e[n]=a[n])}return e},u.apply(this,arguments)}function d(e,t){if(null==e)return{};var a,n,r={},i=Object.keys(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}var f=Object(n.a)((function(e,t){var a=e.spacing,n=void 0===a?"0.5rem":a,s=e.children,f=e.justify,m=e.direction,p=e.align,v=e.className,h=e.shouldWrapChildren,O=d(e,["spacing","children","justify","direction","align","className","shouldWrapChildren"]),j=l.useMemo((function(){return{"--chakra-wrap-spacing":function(e){return Object(o.c)(n,(function(t){return Object(r.tokenToCSSVar)("space",t)(e)}))},"--wrap-spacing":"calc(var(--chakra-wrap-spacing) / 2)",display:"flex",flexWrap:"wrap",justifyContent:f,alignItems:p,flexDirection:m,listStyleType:"none",padding:"0",margin:"calc(var(--wrap-spacing) * -1)","& > *:not(style)":{margin:"var(--wrap-spacing)"}}}),[n,f,p,m]),y=h?l.Children.map(s,(function(e,t){return l.createElement(b,{key:t},e)})):s;return l.createElement(i.a.div,u({ref:t,className:Object(c.d)("chakra-wrap",v)},O),l.createElement(i.a.ul,{className:"chakra-wrap__list",__css:j},y))}));s.a&&(f.displayName="Wrap");var b=Object(n.a)((function(e,t){var a=e.className,n=d(e,["className"]);return l.createElement(i.a.li,u({ref:t,__css:{display:"flex",alignItems:"flex-start"},className:Object(c.d)("chakra-wrap__listitem",a)},n))}));s.a&&(b.displayName="WrapItem")}}]);
2
- //# sourceMappingURL=9.174f64fc.chunk.js.map
1
+ (this["webpackJsonpconstruct-hub-webapp"]=this["webpackJsonpconstruct-hub-webapp"]||[]).push([[9],{12:function(e,t,a){"use strict";var n=a(66);a.o(n,"layoutPropNames")&&a.d(t,"layoutPropNames",(function(){return n.layoutPropNames})),a.o(n,"tokenToCSSVar")&&a.d(t,"tokenToCSSVar",(function(){return n.tokenToCSSVar}));var r=a(273);a.o(r,"layoutPropNames")&&a.d(t,"layoutPropNames",(function(){return r.layoutPropNames})),a.o(r,"tokenToCSSVar")&&a.d(t,"tokenToCSSVar",(function(){return r.tokenToCSSVar}))},273:function(e,t){},392:function(e,t,a){"use strict";a.d(t,"b",(function(){return l})),a.d(t,"a",(function(){return u}));var n=a(17),r=a(21),i=a(15),o=a(0);function c(){return c=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var n in a)Object.prototype.hasOwnProperty.call(a,n)&&(e[n]=a[n])}return e},c.apply(this,arguments)}function s(e,t){if(null==e)return{};var a,n,r={},i=Object.keys(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}var l=Object(n.a)((function(e,t){var a=e.isExternal,n=e.target,l=e.rel,u=e.className,d=s(e,["isExternal","target","rel","className"]);return o.createElement(r.a.a,c({},d,{ref:t,className:Object(i.d)("chakra-linkbox__overlay",u),rel:a?"noopener noreferrer":l,target:a?"_blank":n,__css:{position:"static","&::before":{content:"''",cursor:"inherit",display:"block",position:"absolute",top:0,left:0,zIndex:0,width:"100%",height:"100%"}}}))})),u=Object(n.a)((function(e,t){var a=e.className,n=s(e,["className"]);return o.createElement(r.a.div,c({ref:t,position:"relative"},n,{className:Object(i.d)("chakra-linkbox",a),__css:{"a[href]:not(.chakra-linkbox__overlay), abbr[title]":{position:"relative",zIndex:1}}}))}))},393:function(e,t,a){"use strict";function n(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}a.d(t,"a",(function(){return n}))},638:function(e,t,a){"use strict";a.d(t,"a",(function(){return m}));var n=a(307),r=a(249),i=a(242);function o(e,t){Object(i.a)(2,arguments);var a=Object(r.a)(e),n=Object(r.a)(t),o=a.getTime()-n.getTime();return o<0?-1:o>0?1:o}function c(e){return function(e,t){if(null==e)throw new TypeError("assign requires that input parameter not be null or undefined");for(var a in t=t||{})Object.prototype.hasOwnProperty.call(t,a)&&(e[a]=t[a]);return e}({},e)}var s=a(336),l=6e4,u=1440,d=43200,f=525600;function b(e,t){var a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object(i.a)(2,arguments);var b=a.locale||s.a;if(!b.formatDistance)throw new RangeError("locale must contain localize.formatDistance property");var m=o(e,t);if(isNaN(m))throw new RangeError("Invalid time value");var p,v,h=c(a);h.addSuffix=Boolean(a.addSuffix),h.comparison=m,m>0?(p=Object(r.a)(t),v=Object(r.a)(e)):(p=Object(r.a)(e),v=Object(r.a)(t));var O,j=null==a.roundingMethod?"round":String(a.roundingMethod);if("floor"===j)O=Math.floor;else if("ceil"===j)O=Math.ceil;else{if("round"!==j)throw new RangeError("roundingMethod must be 'floor', 'ceil' or 'round'");O=Math.round}var y,g=v.getTime()-p.getTime(),x=g/l,w=Object(n.a)(v)-Object(n.a)(p),N=(g-w)/l;if("second"===(y=null==a.unit?x<1?"second":x<60?"minute":x<u?"hour":N<d?"day":N<f?"month":"year":String(a.unit))){var _=O(g/1e3);return b.formatDistance("xSeconds",_,h)}if("minute"===y){var k=O(x);return b.formatDistance("xMinutes",k,h)}if("hour"===y){var S=O(x/60);return b.formatDistance("xHours",S,h)}if("day"===y){var E=O(N/u);return b.formatDistance("xDays",E,h)}if("month"===y){var T=O(N/d);return 12===T&&"month"!==a.unit?b.formatDistance("xYears",1,h):b.formatDistance("xMonths",T,h)}if("year"===y){var I=O(N/f);return b.formatDistance("xYears",I,h)}throw new RangeError("unit must be 'second', 'minute', 'hour', 'day', 'month' or 'year'")}function m(e,t){return Object(i.a)(1,arguments),b(e,Date.now(),t)}},640:function(e,t,a){"use strict";a.d(t,"e",(function(){return R})),a.d(t,"a",(function(){return W})),a.d(t,"b",(function(){return H})),a.d(t,"c",(function(){return q})),a.d(t,"d",(function(){return J}));var n=a(17),r=a(55),i=a(36),o=a(54),c=a(21),s=a(28),l=a(15),u=a(8),d=a(0),f=a(4),b=a(5),m=a(241),p=a(233),v=a(153),h=a(118),O=a(152),j=a(120),y=a(163),g=a(161),x=a(185),w=a(31),N=a(218);function _(){return _=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var n in a)Object.prototype.hasOwnProperty.call(a,n)&&(e[n]=a[n])}return e},_.apply(this,arguments)}function k(e,t){if(null==e)return{};var a,n,r={},i=Object.keys(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}var S=Object(p.a)(),E=Object(b.a)(S,4),T=E[0],I=E[1],C=E[2],D=E[3];var z=Object(j.a)({name:"TabsContext",errorMessage:"useTabsContext: `context` is undefined. Seems you forgot to wrap all tabs components within <Tabs />"}),P=Object(b.a)(z,2),M=P[0],F=P[1];function L(e,t){return e+"--tab-"+t}function A(e,t){return e+"--tabpanel-"+t}function V(){return V=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var n in a)Object.prototype.hasOwnProperty.call(a,n)&&(e[n]=a[n])}return e},V.apply(this,arguments)}function B(e,t){if(null==e)return{};var a,n,r={},i=Object.keys(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}var R=Object(n.a)((function(e,t){var a=Object(r.a)("Tabs",e),n=Object(i.b)(e),u=n.children,f=n.className,m=function(e){var t=e.defaultIndex,a=e.onChange,n=e.index,r=e.isManual,i=e.isLazy,o=e.lazyBehavior,c=void 0===o?"unmount":o,s=e.orientation,l=void 0===s?"horizontal":s,u=e.direction,f=void 0===u?"ltr":u,m=k(e,["defaultIndex","onChange","index","isManual","isLazy","lazyBehavior","orientation","direction"]),p=d.useState(null!=t?t:0),O=Object(b.a)(p,2),j=O[0],y=O[1],g=Object(v.b)({defaultValue:null!=t?t:0,value:n,onChange:a}),x=Object(b.a)(g,2),w=x[0],N=x[1];d.useEffect((function(){null!=n&&y(n)}),[n]);var _=C();return{id:Object(h.b)(e.id,"tabs"),selectedIndex:w,focusedIndex:j,setSelectedIndex:N,setFocusedIndex:y,isManual:r,isLazy:i,lazyBehavior:c,orientation:l,descendants:_,direction:f,htmlProps:m}}(B(n,["children","className"])),p=m.htmlProps,O=m.descendants,j=B(m,["htmlProps","descendants"]),y=d.useMemo((function(){return j}),[j]),g=Object(s.g)(p,["isFitted"]);return d.createElement(T,{value:O},d.createElement(M,{value:y},d.createElement(o.b,{value:a},d.createElement(c.a.div,V({className:Object(l.d)("chakra-tabs",f),ref:t},g,{__css:a.root}),u))))}));u.a&&(R.displayName="Tabs");var W=Object(n.a)((function(e,t){var a=Object(o.d)(),n=function(e){var t=e.isDisabled,a=e.isFocusable,n=k(e,["isDisabled","isFocusable"]),r=F(),i=r.setSelectedIndex,o=r.isManual,c=r.id,s=r.setFocusedIndex,l=r.selectedIndex,u=D({disabled:t&&!a}),d=u.index,f=u.register,b=d===l,p=Object(m.a)(_({},n,{ref:Object(y.a)(f,e.ref),isDisabled:t,isFocusable:a,onClick:Object(w.b)(e.onClick,(function(){i(d)}))}));return _({},p,{id:L(c,d),role:"tab",tabIndex:b?0:-1,type:"button","aria-selected":b,"aria-controls":A(c,d),onFocus:t?void 0:Object(w.b)(e.onFocus,(function(){s(d),!o&&(!t||!a)&&i(d)}))})}(V({},e,{ref:t})),r=V({outline:"0",display:"flex",alignItems:"center",justifyContent:"center"},a.tab);return d.createElement(c.a.button,V({},n,{className:Object(l.d)("chakra-tabs__tab",e.className),__css:r}))}));u.a&&(W.displayName="Tab");var H=Object(n.a)((function(e,t){var a=function(e){var t=F(),a=t.focusedIndex,n=t.orientation,r=t.direction,i=I(),o=d.useCallback((function(e){var t,o=function(){var e=i.nextEnabled(a);e&&Object(x.a)(e.node)},c=function(){var e=i.prevEnabled(a);e&&Object(x.a)(e.node)},s="horizontal"===n,u="vertical"===n,d=Object(l.m)(e),b="ltr"===r?"ArrowLeft":"ArrowRight",m="ltr"===r?"ArrowRight":"ArrowLeft",p=(t={},Object(f.a)(t,b,(function(){return s&&c()})),Object(f.a)(t,m,(function(){return s&&o()})),Object(f.a)(t,"ArrowDown",(function(){return u&&o()})),Object(f.a)(t,"ArrowUp",(function(){return u&&c()})),Object(f.a)(t,"Home",(function(){var e=i.firstEnabled();e&&Object(x.a)(e.node)})),Object(f.a)(t,"End",(function(){var e=i.lastEnabled();e&&Object(x.a)(e.node)})),t)[d];p&&(e.preventDefault(),p(e))}),[i,a,n,r]);return _({},e,{role:"tablist","aria-orientation":n,onKeyDown:Object(w.b)(e.onKeyDown,o)})}(V({},e,{ref:t})),n=V({display:"flex"},Object(o.d)().tablist);return d.createElement(c.a.div,V({},a,{className:Object(l.d)("chakra-tabs__tablist",e.className),__css:n}))}));u.a&&(H.displayName="TabList");var q=Object(n.a)((function(e,t){var a=function(e){var t=e.isSelected,a=e.id,n=e.children,r=k(e,["isSelected","id","children"]),i=F(),o=i.isLazy,c=i.lazyBehavior,s=d.useRef(!1);return t&&(s.current=!0),_({tabIndex:0},r,{children:Object(N.a)({hasBeenSelected:s.current,isSelected:t,isLazy:o,lazyBehavior:c})?n:null,role:"tabpanel",hidden:!t,id:a})}(V({},e,{ref:t})),n=Object(o.d)();return d.createElement(c.a.div,V({outline:"0"},a,{className:Object(l.d)("chakra-tabs__tab-panel",e.className),__css:n.tabpanel}))}));u.a&&(q.displayName="TabPanel");var J=Object(n.a)((function(e,t){var a=function(e){var t=F(),a=t.id,n=t.selectedIndex;return _({},e,{children:Object(g.a)(e.children).map((function(e,t){return d.cloneElement(e,{isSelected:t===n,id:A(a,t),"aria-labelledby":L(a,t)})}))})}(e),n=Object(o.d)();return d.createElement(c.a.div,V({},a,{width:"100%",ref:t,className:Object(l.d)("chakra-tabs__tab-panels",e.className),__css:n.tabpanels}))}));u.a&&(J.displayName="TabPanels");var K=Object(n.a)((function(e,t){var a=function(){var e=F(),t=I(),a=e.selectedIndex,n=e.orientation,r="horizontal"===n,i="vertical"===n,o=d.useState((function(){return r?{left:0,width:0}:i?{top:0,height:0}:void 0})),c=Object(b.a)(o,2),s=c[0],l=c[1],f=d.useState(!1),m=Object(b.a)(f,2),p=m[0],v=m[1];return Object(O.a)((function(){if(!Object(u.l)(a)){var e=t.item(a);if(!Object(u.l)(e)){r&&l({left:e.node.offsetLeft,width:e.node.offsetWidth}),i&&l({top:e.node.offsetTop,height:e.node.offsetHeight});var n=requestAnimationFrame((function(){v(!0)}));return function(){n&&cancelAnimationFrame(n)}}}}),[a,r,i,t]),_({position:"absolute",transitionProperty:"left, right, top, bottom",transitionDuration:p?"200ms":"0ms",transitionTimingFunction:"cubic-bezier(0, 0, 0.2, 1)"},s)}(),n=V({},e.style,a),r=Object(o.d)();return d.createElement(c.a.div,V({ref:t},e,{className:Object(l.d)("chakra-tabs__tab-indicator",e.className),style:n,__css:r.indicator}))}));u.a&&(K.displayName="TabIndicator")},641:function(e,t,a){"use strict";a.d(t,"a",(function(){return f})),a.d(t,"b",(function(){return b}));var n=a(17),r=a(12),i=a(21),o=a(121),c=a(15),s=a(8),l=a(0);function u(){return u=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var n in a)Object.prototype.hasOwnProperty.call(a,n)&&(e[n]=a[n])}return e},u.apply(this,arguments)}function d(e,t){if(null==e)return{};var a,n,r={},i=Object.keys(e);for(n=0;n<i.length;n++)a=i[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}var f=Object(n.a)((function(e,t){var a=e.spacing,n=void 0===a?"0.5rem":a,s=e.children,f=e.justify,m=e.direction,p=e.align,v=e.className,h=e.shouldWrapChildren,O=d(e,["spacing","children","justify","direction","align","className","shouldWrapChildren"]),j=l.useMemo((function(){return{"--chakra-wrap-spacing":function(e){return Object(o.c)(n,(function(t){return Object(r.tokenToCSSVar)("space",t)(e)}))},"--wrap-spacing":"calc(var(--chakra-wrap-spacing) / 2)",display:"flex",flexWrap:"wrap",justifyContent:f,alignItems:p,flexDirection:m,listStyleType:"none",padding:"0",margin:"calc(var(--wrap-spacing) * -1)","& > *:not(style)":{margin:"var(--wrap-spacing)"}}}),[n,f,p,m]),y=h?l.Children.map(s,(function(e,t){return l.createElement(b,{key:t},e)})):s;return l.createElement(i.a.div,u({ref:t,className:Object(c.d)("chakra-wrap",v)},O),l.createElement(i.a.ul,{className:"chakra-wrap__list",__css:j},y))}));s.a&&(f.displayName="Wrap");var b=Object(n.a)((function(e,t){var a=e.className,n=d(e,["className"]);return l.createElement(i.a.li,u({ref:t,__css:{display:"flex",alignItems:"flex-start"},className:Object(c.d)("chakra-wrap__listitem",a)},n))}));s.a&&(b.displayName="WrapItem")}}]);
2
+ //# sourceMappingURL=9.d40d7958.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/index.ts","../../../src/link-box.tsx","../node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteral.js","../node_modules/date-fns/esm/compareAsc/index.js","../node_modules/date-fns/esm/_lib/cloneObject/index.js","../node_modules/date-fns/esm/_lib/assign/index.js","../node_modules/date-fns/esm/formatDistanceStrict/index.js","../node_modules/date-fns/esm/formatDistanceToNowStrict/index.js","../../../src/use-tabs.ts","../../../src/tabs.tsx","../../../src/wrap.tsx"],"names":["LinkOverlay","forwardRef","className","ref","cx","rel","isExternal","target","__css","position","content","cursor","display","top","left","zIndex","width","height","LinkBox","_taggedTemplateLiteral","strings","raw","slice","Object","freeze","defineProperties","value","compareAsc","dirtyDateLeft","dirtyDateRight","requiredArgs","arguments","dateLeft","toDate","dateRight","diff","getTime","cloneObject","dirtyObject","TypeError","property","prototype","hasOwnProperty","call","assign","MILLISECONDS_IN_MINUTE","MINUTES_IN_DAY","MINUTES_IN_MONTH","MINUTES_IN_YEAR","formatDistanceStrict","dirtyDate","dirtyBaseDate","options","length","undefined","locale","defaultLocale","formatDistance","RangeError","comparison","isNaN","localizeOptions","addSuffix","Boolean","roundingMethodFn","roundingMethod","String","Math","floor","ceil","round","unit","milliseconds","minutes","timezoneOffset","getTimezoneOffsetInMilliseconds","dstNormalizedMinutes","seconds","roundedMinutes","hours","days","months","years","formatDistanceToNowStrict","dirtyOptions","Date","now","createDescendantContext","createContext","name","errorMessage","makeTabId","id","makeTabPanelId","Tabs","styles","useMultiStyleConfig","omitThemingProps","props","lazyBehavior","orientation","direction","React","defaultIndex","useControllableState","defaultValue","onChange","index","setFocusedIndex","descendants","useTabsDescendants","useId","selectedIndex","focusedIndex","setSelectedIndex","isManual","isLazy","htmlProps","useTabs","context","rootProps","omit","root","Tab","useStyles","tabProps","isFocusable","useTabsContext","useTabsDescendant","disabled","isDisabled","register","isSelected","clickableProps","useClickable","mergeRefs","onClick","callAllHandlers","role","tabIndex","type","onFocus","useTab","tabStyles","outline","alignItems","justifyContent","TabList","tablistProps","useTabsDescendantsContext","onKeyDown","event","nextTab","next","focus","prevTab","prev","isHorizontal","isVertical","eventKey","normalizeEventKey","ArrowStart","ArrowEnd","action","first","last","useTabList","tablistStyles","TabPanel","panelProps","children","hasBeenSelected","determineLazyBehavior","hidden","useTabPanel","tabpanel","TabPanels","panelsProps","getValidChildren","useTabPanels","tabpanels","TabIndicator","indicatorStyle","useSafeLayoutEffect","isUndefined","tab","setRect","offsetWidth","offsetHeight","requestAnimationFrame","setHasMeasured","cancelAnimationFrame","transitionProperty","transitionDuration","hasMeasured","transitionTimingFunction","useTabIndicator","style","indicator","Wrap","spacing","shouldWrapChildren","theme","mapResponsive","tokenToCSSVar","flexWrap","flexDirection","listStyleType","padding","margin","justify","align","childrenToRender","key","WrapItem"],"mappings":"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","file":"static/js/9.174f64fc.chunk.js","sourcesContent":["export * from \"@chakra-ui/color-mode\"\nexport * from \"@chakra-ui/styled-system\"\nexport { keyframes } from \"@emotion/react\"\nexport type { Interpolation } from \"@emotion/react\"\nexport * from \"./hooks\"\nexport * from \"./system.types\"\nexport * from \"./providers\"\nexport { omitThemingProps } from \"./system.utils\"\nexport * from \"./system\"\nexport * from \"./forward-ref\"\nexport * from \"./use-style-config\"\nexport { shouldForwardProp } from \"./should-forward-prop\"\n","import { chakra, forwardRef, HTMLChakraProps } from \"@chakra-ui/system\"\nimport { cx } from \"@chakra-ui/utils\"\nimport * as React from \"react\"\n\nexport interface LinkOverlayProps extends HTMLChakraProps<\"a\"> {\n /**\n * If `true`, the link will open in new tab\n */\n isExternal?: boolean\n}\n\nexport const LinkOverlay = forwardRef<LinkOverlayProps, \"a\">((props, ref) => {\n const { isExternal, target, rel, className, ...rest } = props\n return (\n <chakra.a\n {...rest}\n ref={ref}\n className={cx(\"chakra-linkbox__overlay\", className)}\n rel={isExternal ? \"noopener noreferrer\" : rel}\n target={isExternal ? \"_blank\" : target}\n __css={{\n position: \"static\",\n \"&::before\": {\n content: \"''\",\n cursor: \"inherit\",\n display: \"block\",\n position: \"absolute\",\n top: 0,\n left: 0,\n zIndex: 0,\n width: \"100%\",\n height: \"100%\",\n },\n }}\n />\n )\n})\n\nexport interface LinkBoxProps extends HTMLChakraProps<\"div\"> {}\n\n/**\n * `LinkBox` is used to wrap content areas within a link while ensuring semantic html\n *\n * @see Docs https://chakra-ui.com/docs/navigation/link-overlay\n * @see Resources https://www.sarasoueidan.com/blog/nested-links\n */\nexport const LinkBox = forwardRef<LinkBoxProps, \"div\">((props, ref) => {\n const { className, ...rest } = props\n\n return (\n <chakra.div\n ref={ref}\n position=\"relative\"\n {...rest}\n className={cx(\"chakra-linkbox\", className)}\n __css={{\n /* Elevate the links and abbreviations up */\n \"a[href]:not(.chakra-linkbox__overlay), abbr[title]\": {\n position: \"relative\",\n zIndex: 1,\n },\n }}\n />\n )\n})\n","export default function _taggedTemplateLiteral(strings, raw) {\n if (!raw) {\n raw = strings.slice(0);\n }\n\n return Object.freeze(Object.defineProperties(strings, {\n raw: {\n value: Object.freeze(raw)\n }\n }));\n}","import toDate from \"../toDate/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\n/**\n * @name compareAsc\n * @category Common Helpers\n * @summary Compare the two dates and return -1, 0 or 1.\n *\n * @description\n * Compare the two dates and return 1 if the first date is after the second,\n * -1 if the first date is before the second or 0 if dates are equal.\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * @param {Date|Number} dateLeft - the first date to compare\n * @param {Date|Number} dateRight - the second date to compare\n * @returns {Number} the result of the comparison\n * @throws {TypeError} 2 arguments required\n *\n * @example\n * // Compare 11 February 1987 and 10 July 1989:\n * const result = compareAsc(new Date(1987, 1, 11), new Date(1989, 6, 10))\n * //=> -1\n *\n * @example\n * // Sort the array of dates:\n * const result = [\n * new Date(1995, 6, 2),\n * new Date(1987, 1, 11),\n * new Date(1989, 6, 10)\n * ].sort(compareAsc)\n * //=> [\n * // Wed Feb 11 1987 00:00:00,\n * // Mon Jul 10 1989 00:00:00,\n * // Sun Jul 02 1995 00:00:00\n * // ]\n */\n\nexport default function compareAsc(dirtyDateLeft, dirtyDateRight) {\n requiredArgs(2, arguments);\n var dateLeft = toDate(dirtyDateLeft);\n var dateRight = toDate(dirtyDateRight);\n var diff = dateLeft.getTime() - dateRight.getTime();\n\n if (diff < 0) {\n return -1;\n } else if (diff > 0) {\n return 1; // Return 0 if diff is 0; return NaN if diff is NaN\n } else {\n return diff;\n }\n}","import assign from \"../assign/index.js\";\nexport default function cloneObject(dirtyObject) {\n return assign({}, dirtyObject);\n}","export default function assign(target, dirtyObject) {\n if (target == null) {\n throw new TypeError('assign requires that input parameter not be null or undefined');\n }\n\n dirtyObject = dirtyObject || {};\n\n for (var property in dirtyObject) {\n if (Object.prototype.hasOwnProperty.call(dirtyObject, property)) {\n target[property] = dirtyObject[property];\n }\n }\n\n return target;\n}","import getTimezoneOffsetInMilliseconds from \"../_lib/getTimezoneOffsetInMilliseconds/index.js\";\nimport compareAsc from \"../compareAsc/index.js\";\nimport toDate from \"../toDate/index.js\";\nimport cloneObject from \"../_lib/cloneObject/index.js\";\nimport defaultLocale from \"../locale/en-US/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\nvar MILLISECONDS_IN_MINUTE = 1000 * 60;\nvar MINUTES_IN_DAY = 60 * 24;\nvar MINUTES_IN_MONTH = MINUTES_IN_DAY * 30;\nvar MINUTES_IN_YEAR = MINUTES_IN_DAY * 365;\n/**\n * @name formatDistanceStrict\n * @category Common Helpers\n * @summary Return the distance between the given dates in words.\n *\n * @description\n * Return the distance between the given dates in words, using strict units.\n * This is like `formatDistance`, but does not use helpers like 'almost', 'over',\n * 'less than' and the like.\n *\n * | Distance between dates | Result |\n * |------------------------|---------------------|\n * | 0 ... 59 secs | [0..59] seconds |\n * | 1 ... 59 mins | [1..59] minutes |\n * | 1 ... 23 hrs | [1..23] hours |\n * | 1 ... 29 days | [1..29] days |\n * | 1 ... 11 months | [1..11] months |\n * | 1 ... N years | [1..N] years |\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * - The function was renamed from `distanceInWordsStrict` to `formatDistanceStrict`\n * to make its name consistent with `format` and `formatRelative`.\n *\n * - The order of arguments is swapped to make the function\n * consistent with `differenceIn...` functions.\n *\n * ```javascript\n * // Before v2.0.0\n *\n * distanceInWordsStrict(\n * new Date(2015, 0, 2),\n * new Date(2014, 6, 2)\n * ) //=> '6 months'\n *\n * // v2.0.0 onward\n *\n * formatDistanceStrict(\n * new Date(2014, 6, 2),\n * new Date(2015, 0, 2)\n * ) //=> '6 months'\n * ```\n *\n * - `partialMethod` option is renamed to `roundingMethod`.\n *\n * ```javascript\n * // Before v2.0.0\n *\n * distanceInWordsStrict(\n * new Date(1986, 3, 4, 10, 32, 0),\n * new Date(1986, 3, 4, 10, 33, 1),\n * { partialMethod: 'ceil' }\n * ) //=> '2 minutes'\n *\n * // v2.0.0 onward\n *\n * formatDistanceStrict(\n * new Date(1986, 3, 4, 10, 33, 1),\n * new Date(1986, 3, 4, 10, 32, 0),\n * { roundingMethod: 'ceil' }\n * ) //=> '2 minutes'\n * ```\n *\n * - If `roundingMethod` is not specified, it now defaults to `round` instead of `floor`.\n *\n * - `unit` option now accepts one of the strings:\n * 'second', 'minute', 'hour', 'day', 'month' or 'year' instead of 's', 'm', 'h', 'd', 'M' or 'Y'\n *\n * ```javascript\n * // Before v2.0.0\n *\n * distanceInWordsStrict(\n * new Date(1986, 3, 4, 10, 32, 0),\n * new Date(1986, 3, 4, 10, 33, 1),\n * { unit: 'm' }\n * )\n *\n * // v2.0.0 onward\n *\n * formatDistanceStrict(\n * new Date(1986, 3, 4, 10, 33, 1),\n * new Date(1986, 3, 4, 10, 32, 0),\n * { unit: 'minute' }\n * )\n * ```\n *\n * @param {Date|Number} date - the date\n * @param {Date|Number} baseDate - the date to compare with\n * @param {Object} [options] - an object with options.\n * @param {Boolean} [options.addSuffix=false] - result indicates if the second date is earlier or later than the first\n * @param {'second'|'minute'|'hour'|'day'|'month'|'year'} [options.unit] - if specified, will force a unit\n * @param {'floor'|'ceil'|'round'} [options.roundingMethod='round'] - which way to round partial units\n * @param {Locale} [options.locale=defaultLocale] - the locale object. See [Locale]{@link https://date-fns.org/docs/Locale}\n * @returns {String} the distance in words\n * @throws {TypeError} 2 arguments required\n * @throws {RangeError} `date` must not be Invalid Date\n * @throws {RangeError} `baseDate` must not be Invalid Date\n * @throws {RangeError} `options.roundingMethod` must be 'floor', 'ceil' or 'round'\n * @throws {RangeError} `options.unit` must be 'second', 'minute', 'hour', 'day', 'month' or 'year'\n * @throws {RangeError} `options.locale` must contain `formatDistance` property\n *\n * @example\n * // What is the distance between 2 July 2014 and 1 January 2015?\n * const result = formatDistanceStrict(new Date(2014, 6, 2), new Date(2015, 0, 2))\n * //=> '6 months'\n *\n * @example\n * // What is the distance between 1 January 2015 00:00:15\n * // and 1 January 2015 00:00:00?\n * const result = formatDistanceStrict(\n * new Date(2015, 0, 1, 0, 0, 15),\n * new Date(2015, 0, 1, 0, 0, 0)\n * )\n * //=> '15 seconds'\n *\n * @example\n * // What is the distance from 1 January 2016\n * // to 1 January 2015, with a suffix?\n * const result = formatDistanceStrict(new Date(2015, 0, 1), new Date(2016, 0, 1), {\n * addSuffix: true\n * })\n * //=> '1 year ago'\n *\n * @example\n * // What is the distance from 1 January 2016\n * // to 1 January 2015, in minutes?\n * const result = formatDistanceStrict(new Date(2016, 0, 1), new Date(2015, 0, 1), {\n * unit: 'minute'\n * })\n * //=> '525600 minutes'\n *\n * @example\n * // What is the distance from 1 January 2015\n * // to 28 January 2015, in months, rounded up?\n * const result = formatDistanceStrict(new Date(2015, 0, 28), new Date(2015, 0, 1), {\n * unit: 'month',\n * roundingMethod: 'ceil'\n * })\n * //=> '1 month'\n *\n * @example\n * // What is the distance between 1 August 2016 and 1 January 2015 in Esperanto?\n * import { eoLocale } from 'date-fns/locale/eo'\n * const result = formatDistanceStrict(new Date(2016, 7, 1), new Date(2015, 0, 1), {\n * locale: eoLocale\n * })\n * //=> '1 jaro'\n */\n\nexport default function formatDistanceStrict(dirtyDate, dirtyBaseDate) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n requiredArgs(2, arguments);\n var locale = options.locale || defaultLocale;\n\n if (!locale.formatDistance) {\n throw new RangeError('locale must contain localize.formatDistance property');\n }\n\n var comparison = compareAsc(dirtyDate, dirtyBaseDate);\n\n if (isNaN(comparison)) {\n throw new RangeError('Invalid time value');\n }\n\n var localizeOptions = cloneObject(options);\n localizeOptions.addSuffix = Boolean(options.addSuffix);\n localizeOptions.comparison = comparison;\n var dateLeft;\n var dateRight;\n\n if (comparison > 0) {\n dateLeft = toDate(dirtyBaseDate);\n dateRight = toDate(dirtyDate);\n } else {\n dateLeft = toDate(dirtyDate);\n dateRight = toDate(dirtyBaseDate);\n }\n\n var roundingMethod = options.roundingMethod == null ? 'round' : String(options.roundingMethod);\n var roundingMethodFn;\n\n if (roundingMethod === 'floor') {\n roundingMethodFn = Math.floor;\n } else if (roundingMethod === 'ceil') {\n roundingMethodFn = Math.ceil;\n } else if (roundingMethod === 'round') {\n roundingMethodFn = Math.round;\n } else {\n throw new RangeError(\"roundingMethod must be 'floor', 'ceil' or 'round'\");\n }\n\n var milliseconds = dateRight.getTime() - dateLeft.getTime();\n var minutes = milliseconds / MILLISECONDS_IN_MINUTE;\n var timezoneOffset = getTimezoneOffsetInMilliseconds(dateRight) - getTimezoneOffsetInMilliseconds(dateLeft); // Use DST-normalized difference in minutes for years, months and days;\n // use regular difference in minutes for hours, minutes and seconds.\n\n var dstNormalizedMinutes = (milliseconds - timezoneOffset) / MILLISECONDS_IN_MINUTE;\n var unit;\n\n if (options.unit == null) {\n if (minutes < 1) {\n unit = 'second';\n } else if (minutes < 60) {\n unit = 'minute';\n } else if (minutes < MINUTES_IN_DAY) {\n unit = 'hour';\n } else if (dstNormalizedMinutes < MINUTES_IN_MONTH) {\n unit = 'day';\n } else if (dstNormalizedMinutes < MINUTES_IN_YEAR) {\n unit = 'month';\n } else {\n unit = 'year';\n }\n } else {\n unit = String(options.unit);\n } // 0 up to 60 seconds\n\n\n if (unit === 'second') {\n var seconds = roundingMethodFn(milliseconds / 1000);\n return locale.formatDistance('xSeconds', seconds, localizeOptions); // 1 up to 60 mins\n } else if (unit === 'minute') {\n var roundedMinutes = roundingMethodFn(minutes);\n return locale.formatDistance('xMinutes', roundedMinutes, localizeOptions); // 1 up to 24 hours\n } else if (unit === 'hour') {\n var hours = roundingMethodFn(minutes / 60);\n return locale.formatDistance('xHours', hours, localizeOptions); // 1 up to 30 days\n } else if (unit === 'day') {\n var days = roundingMethodFn(dstNormalizedMinutes / MINUTES_IN_DAY);\n return locale.formatDistance('xDays', days, localizeOptions); // 1 up to 12 months\n } else if (unit === 'month') {\n var months = roundingMethodFn(dstNormalizedMinutes / MINUTES_IN_MONTH);\n return months === 12 && options.unit !== 'month' ? locale.formatDistance('xYears', 1, localizeOptions) : locale.formatDistance('xMonths', months, localizeOptions); // 1 year up to max Date\n } else if (unit === 'year') {\n var years = roundingMethodFn(dstNormalizedMinutes / MINUTES_IN_YEAR);\n return locale.formatDistance('xYears', years, localizeOptions);\n }\n\n throw new RangeError(\"unit must be 'second', 'minute', 'hour', 'day', 'month' or 'year'\");\n}","import formatDistanceStrict from \"../formatDistanceStrict/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\n/**\n * @name formatDistanceToNowStrict\n * @category Common Helpers\n * @summary Return the distance between the given date and now in words.\n * @pure false\n *\n * @description\n * Return the distance between the given dates in words, using strict units.\n * This is like `formatDistance`, but does not use helpers like 'almost', 'over',\n * 'less than' and the like.\n *\n * | Distance between dates | Result |\n * |------------------------|---------------------|\n * | 0 ... 59 secs | [0..59] seconds |\n * | 1 ... 59 mins | [1..59] minutes |\n * | 1 ... 23 hrs | [1..23] hours |\n * | 1 ... 29 days | [1..29] days |\n * | 1 ... 11 months | [1..11] months |\n * | 1 ... N years | [1..N] years |\n *\n * @param {Date|Number} date - the given date\n * @param {Object} [options] - an object with options.\n * @param {Boolean} [options.addSuffix=false] - result indicates if the second date is earlier or later than the first\n * @param {'second'|'minute'|'hour'|'day'|'month'|'year'} [options.unit] - if specified, will force a unit\n * @param {'floor'|'ceil'|'round'} [options.roundingMethod='round'] - which way to round partial units\n * @param {Locale} [options.locale=defaultLocale] - the locale object. See [Locale]{@link https://date-fns.org/docs/Locale}\n * @returns {String} the distance in words\n * @throws {TypeError} 1 argument required\n * @throws {RangeError} `date` must not be Invalid Date\n * @throws {RangeError} `options.locale` must contain `formatDistance` property\n *\n * @example\n * // If today is 1 January 2015, what is the distance to 2 July 2014?\n * var result = formatDistanceToNowStrict(\n * new Date(2014, 6, 2)\n * )\n * //=> '6 months'\n *\n * @example\n * // If now is 1 January 2015 00:00:00,\n * // what is the distance to 1 January 2015 00:00:15, including seconds?\n * var result = formatDistanceToNowStrict(\n * new Date(2015, 0, 1, 0, 0, 15)\n * )\n * //=> '20 seconds'\n *\n * @example\n * // If today is 1 January 2015,\n * // what is the distance to 1 January 2016, with a suffix?\n * var result = formatDistanceToNowStrict(\n * new Date(2016, 0, 1),\n * {addSuffix: true}\n * )\n * //=> 'in 1 year'\n *\n * @example\n * // If today is 28 January 2015,\n * // what is the distance to 1 January 2015, in months, rounded up??\n * var result = formatDistanceToNowStrict(new Date(2015, 0, 1), {\n * unit: 'month',\n * roundingMethod: 'ceil'\n * })\n * //=> '1 month'\n *\n * @example\n * // If today is 1 January 2015,\n * // what is the distance to 1 August 2016 in Esperanto?\n * var eoLocale = require('date-fns/locale/eo')\n * var result = formatDistanceToNowStrict(\n * new Date(2016, 7, 1),\n * {locale: eoLocale}\n * )\n * //=> '1 jaro'\n */\n\nexport default function formatDistanceToNowStrict(dirtyDate, dirtyOptions) {\n requiredArgs(1, arguments);\n return formatDistanceStrict(dirtyDate, Date.now(), dirtyOptions);\n}","import { useClickable, UseClickableProps } from \"@chakra-ui/clickable\"\nimport { createDescendantContext } from \"@chakra-ui/descendant\"\nimport {\n useControllableState,\n useId,\n useSafeLayoutEffect,\n} from \"@chakra-ui/hooks\"\nimport {\n createContext,\n EventKeyMap,\n getValidChildren,\n mergeRefs,\n} from \"@chakra-ui/react-utils\"\nimport {\n callAllHandlers,\n determineLazyBehavior,\n Dict,\n focus,\n isUndefined,\n LazyBehavior,\n normalizeEventKey,\n} from \"@chakra-ui/utils\"\nimport * as React from \"react\"\n\n/* -------------------------------------------------------------------------------------------------\n * Create context to track descendants and their indices\n * -----------------------------------------------------------------------------------------------*/\n\nexport const [\n TabsDescendantsProvider,\n useTabsDescendantsContext,\n useTabsDescendants,\n useTabsDescendant,\n] = createDescendantContext<HTMLButtonElement>()\n\n/* -------------------------------------------------------------------------------------------------\n * useTabs - The root react hook that manages all tab items\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface UseTabsProps {\n /**\n * The orientation of the tab list.\n */\n orientation?: \"vertical\" | \"horizontal\"\n /**\n * If `true`, the tabs will be manually activated and\n * display its panel by pressing Space or Enter.\n *\n * If `false`, the tabs will be automatically activated\n * and their panel is displayed when they receive focus.\n */\n isManual?: boolean\n /**\n * Callback when the index (controlled or un-controlled) changes.\n */\n onChange?: (index: number) => void\n /**\n * The index of the selected tab (in controlled mode)\n */\n index?: number\n /**\n * The initial index of the selected tab (in uncontrolled mode)\n */\n defaultIndex?: number\n /**\n * The id of the tab\n */\n id?: string\n /**\n * Performance 🚀:\n * If `true`, rendering of the tab panel's will be deferred until it is selected.\n */\n isLazy?: boolean\n /**\n * Performance 🚀:\n * The lazy behavior of tab panels' content when not active.\n * Only works when `isLazy={true}`\n *\n * - \"unmount\": The content of inactive tab panels are always unmounted.\n * - \"keepMounted\": The content of inactive tab panels is initially unmounted,\n * but stays mounted when selected.\n *\n * @default \"unmount\"\n */\n lazyBehavior?: LazyBehavior\n /**\n * The writing mode direction.\n *\n * - When in RTL, the left and right navigation is flipped\n */\n direction?: \"rtl\" | \"ltr\"\n}\n\n/**\n * Tabs hooks that provides all the states, and accessibility\n * helpers to keep all things working properly.\n *\n * Its returned object will be passed unto a Context Provider\n * so all child components can read from it.\n * There is no document link yet\n * @see Docs https://chakra-ui.com/docs/components/useTabs\n */\nexport function useTabs(props: UseTabsProps) {\n const {\n defaultIndex,\n onChange,\n index,\n isManual,\n isLazy,\n lazyBehavior = \"unmount\",\n orientation = \"horizontal\",\n direction = \"ltr\",\n ...htmlProps\n } = props\n\n /**\n * We use this to keep track of the index of the focused tab.\n *\n * Tabs can be automatically activated, this means selection follows focus.\n * When we navigate with the arrow keys, we move focus and selection to next/prev tab\n *\n * Tabs can also be manually activated, this means selection does not follow focus.\n * When we navigate with the arrow keys, we only move focus NOT selection. The user\n * will need not manually activate the tab using `Enter` or `Space`.\n *\n * This is why we need to keep track of the `focusedIndex` and `selectedIndex`\n */\n const [focusedIndex, setFocusedIndex] = React.useState(defaultIndex ?? 0)\n\n const [selectedIndex, setSelectedIndex] = useControllableState({\n defaultValue: defaultIndex ?? 0,\n value: index,\n onChange,\n })\n\n /**\n * Sync focused `index` with controlled `selectedIndex` (which is the `props.index`)\n */\n React.useEffect(() => {\n if (index != null) {\n setFocusedIndex(index)\n }\n }, [index])\n\n /**\n * Think of `useDescendants` as a register for the tab nodes.\n */\n const descendants = useTabsDescendants()\n\n /**\n * Generate a unique id or use user-provided id for the tabs widget\n */\n const id = useId(props.id, `tabs`)\n\n return {\n id,\n selectedIndex,\n focusedIndex,\n setSelectedIndex,\n setFocusedIndex,\n isManual,\n isLazy,\n lazyBehavior,\n orientation,\n descendants,\n direction,\n htmlProps,\n }\n}\n\nexport type UseTabsReturn = Omit<\n ReturnType<typeof useTabs>,\n \"htmlProps\" | \"descendants\"\n>\n\nexport const [TabsProvider, useTabsContext] = createContext<UseTabsReturn>({\n name: \"TabsContext\",\n errorMessage:\n \"useTabsContext: `context` is undefined. Seems you forgot to wrap all tabs components within <Tabs />\",\n})\n\ntype Child = React.ReactElement<any>\n\nexport interface UseTabListProps {\n children?: React.ReactNode\n onKeyDown?: React.KeyboardEventHandler\n ref?: React.Ref<any>\n}\n\n/**\n * Tabs hook to manage multiple tab buttons,\n * and ensures only one tab is selected per time.\n *\n * @param props props object for the tablist\n */\nexport function useTabList<P extends UseTabListProps>(props: P) {\n const { focusedIndex, orientation, direction } = useTabsContext()\n\n const descendants = useTabsDescendantsContext()\n\n const onKeyDown = React.useCallback(\n (event: React.KeyboardEvent) => {\n const nextTab = () => {\n const next = descendants.nextEnabled(focusedIndex)\n if (next) focus(next.node)\n }\n const prevTab = () => {\n const prev = descendants.prevEnabled(focusedIndex)\n if (prev) focus(prev.node)\n }\n const firstTab = () => {\n const first = descendants.firstEnabled()\n if (first) focus(first.node)\n }\n const lastTab = () => {\n const last = descendants.lastEnabled()\n if (last) focus(last.node)\n }\n\n const isHorizontal = orientation === \"horizontal\"\n const isVertical = orientation === \"vertical\"\n\n const eventKey = normalizeEventKey(event)\n\n const ArrowStart = direction === \"ltr\" ? \"ArrowLeft\" : \"ArrowRight\"\n const ArrowEnd = direction === \"ltr\" ? \"ArrowRight\" : \"ArrowLeft\"\n\n const keyMap: EventKeyMap = {\n [ArrowStart]: () => isHorizontal && prevTab(),\n [ArrowEnd]: () => isHorizontal && nextTab(),\n ArrowDown: () => isVertical && nextTab(),\n ArrowUp: () => isVertical && prevTab(),\n Home: firstTab,\n End: lastTab,\n }\n\n const action = keyMap[eventKey]\n\n if (action) {\n event.preventDefault()\n action(event)\n }\n },\n [descendants, focusedIndex, orientation, direction],\n )\n\n return {\n ...props,\n role: \"tablist\",\n \"aria-orientation\": orientation,\n onKeyDown: callAllHandlers(props.onKeyDown, onKeyDown),\n }\n}\n\nexport type UseTabListReturn = ReturnType<typeof useTabList>\n\nexport interface UseTabOptions {\n id?: string\n isSelected?: boolean\n panelId?: string\n /**\n * If `true`, the `Tab` won't be toggleable\n */\n isDisabled?: boolean\n}\n\nexport interface UseTabProps\n extends Omit<UseClickableProps, \"color\">,\n UseTabOptions {}\n\n/**\n * Tabs hook to manage each tab button.\n *\n * A tab can be disabled and focusable, or both,\n * hence the use of `useClickable` to handle this scenario\n */\nexport function useTab<P extends UseTabProps>(props: P) {\n const { isDisabled, isFocusable, ...htmlProps } = props\n\n const {\n setSelectedIndex,\n isManual,\n id,\n setFocusedIndex,\n selectedIndex,\n } = useTabsContext()\n\n const { index, register } = useTabsDescendant({\n disabled: isDisabled && !isFocusable,\n })\n\n const isSelected = index === selectedIndex\n\n const onClick = () => {\n setSelectedIndex(index)\n }\n\n const onFocus = () => {\n setFocusedIndex(index)\n const isDisabledButFocusable = isDisabled && isFocusable\n const shouldSelect = !isManual && !isDisabledButFocusable\n if (shouldSelect) {\n setSelectedIndex(index)\n }\n }\n\n const clickableProps = useClickable({\n ...htmlProps,\n ref: mergeRefs(register, props.ref),\n isDisabled,\n isFocusable,\n onClick: callAllHandlers(props.onClick, onClick),\n })\n\n const type: \"button\" | \"submit\" | \"reset\" = \"button\"\n\n return {\n ...clickableProps,\n id: makeTabId(id, index),\n role: \"tab\",\n tabIndex: isSelected ? 0 : -1,\n type,\n \"aria-selected\": isSelected,\n \"aria-controls\": makeTabPanelId(id, index),\n onFocus: isDisabled ? undefined : callAllHandlers(props.onFocus, onFocus),\n }\n}\n\nexport interface UseTabPanelsProps {\n children?: React.ReactNode\n}\n\n/**\n * Tabs hook for managing the visibility of multiple tab panels.\n *\n * Since only one panel can be show at a time, we use `cloneElement`\n * to inject `selected` panel to each TabPanel.\n *\n * It returns a cloned version of its children with\n * all functionality included.\n */\nexport function useTabPanels<P extends UseTabPanelsProps>(props: P) {\n const context = useTabsContext()\n\n const { id, selectedIndex } = context\n\n const validChildren = getValidChildren(props.children)\n\n const children = validChildren.map((child, index) =>\n React.cloneElement(child as Child, {\n isSelected: index === selectedIndex,\n id: makeTabPanelId(id, index),\n // Refers to the associated tab element, and also provides an accessible name to the tab panel.\n \"aria-labelledby\": makeTabId(id, index),\n }),\n )\n\n return { ...props, children }\n}\n\n/**\n * Tabs hook for managing the visible/hidden states\n * of the tab panel.\n *\n * @param props props object for the tab panel\n */\nexport function useTabPanel(props: Dict) {\n const { isSelected, id, children, ...htmlProps } = props\n const { isLazy, lazyBehavior } = useTabsContext()\n\n const hasBeenSelected = React.useRef(false)\n if (isSelected) {\n hasBeenSelected.current = true\n }\n\n const shouldRenderChildren = determineLazyBehavior({\n hasBeenSelected: hasBeenSelected.current,\n isSelected,\n isLazy,\n lazyBehavior,\n })\n\n return {\n // Puts the tabpanel in the page `Tab` sequence.\n tabIndex: 0,\n ...htmlProps,\n children: shouldRenderChildren ? children : null,\n role: \"tabpanel\",\n hidden: !isSelected,\n id,\n }\n}\n\n/**\n * Tabs hook to show an animated indicators that\n * follows the active tab.\n *\n * The way we do it is by measuring the DOM Rect (or dimensions)\n * of the active tab, and return that as CSS style for\n * the indicator.\n */\nexport function useTabIndicator(): React.CSSProperties {\n const context = useTabsContext()\n const descendants = useTabsDescendantsContext()\n\n const { selectedIndex, orientation } = context\n\n const isHorizontal = orientation === \"horizontal\"\n const isVertical = orientation === \"vertical\"\n\n // Get the clientRect of the selected tab\n const [rect, setRect] = React.useState(() => {\n if (isHorizontal) return { left: 0, width: 0 }\n if (isVertical) return { top: 0, height: 0 }\n return undefined\n })\n\n const [hasMeasured, setHasMeasured] = React.useState(false)\n\n // Update the selected tab rect when the selectedIndex changes\n useSafeLayoutEffect(() => {\n if (isUndefined(selectedIndex)) return undefined\n\n const tab = descendants.item(selectedIndex)\n if (isUndefined(tab)) return undefined\n\n // Horizontal Tab: Calculate width and left distance\n if (isHorizontal) {\n setRect({ left: tab.node.offsetLeft, width: tab.node.offsetWidth })\n }\n\n // Vertical Tab: Calculate height and top distance\n if (isVertical) {\n setRect({ top: tab.node.offsetTop, height: tab.node.offsetHeight })\n }\n\n // Prevent unwanted transition from 0 to measured rect\n // by setting the measured state in the next tick\n const id = requestAnimationFrame(() => {\n setHasMeasured(true)\n })\n\n return () => {\n if (id) {\n cancelAnimationFrame(id)\n }\n }\n }, [selectedIndex, isHorizontal, isVertical, descendants])\n\n return {\n position: \"absolute\",\n transitionProperty: \"left, right, top, bottom\",\n transitionDuration: hasMeasured ? \"200ms\" : \"0ms\",\n transitionTimingFunction: \"cubic-bezier(0, 0, 0.2, 1)\",\n ...rect,\n }\n}\n\nfunction makeTabId(id: string, index: number) {\n return `${id}--tab-${index}`\n}\n\nfunction makeTabPanelId(id: string, index: number) {\n return `${id}--tabpanel-${index}`\n}\n","import {\n chakra,\n forwardRef,\n omitThemingProps,\n StylesProvider,\n SystemStyleObject,\n ThemingProps,\n useMultiStyleConfig,\n useStyles,\n HTMLChakraProps,\n} from \"@chakra-ui/system\"\nimport { cx, omit, __DEV__ } from \"@chakra-ui/utils\"\nimport * as React from \"react\"\nimport {\n TabsDescendantsProvider,\n TabsProvider,\n useTab,\n useTabIndicator,\n useTabList,\n UseTabListProps,\n UseTabOptions,\n useTabPanel,\n useTabPanels,\n useTabs,\n UseTabsProps,\n} from \"./use-tabs\"\n\ninterface TabsOptions {\n /**\n * If `true`, tabs will stretch to width of the tablist.\n */\n isFitted?: boolean\n /**\n * The alignment of the tabs\n */\n align?: \"start\" | \"end\" | \"center\"\n}\n\nexport interface TabsProps\n extends UseTabsProps,\n ThemingProps<\"Tabs\">,\n Omit<HTMLChakraProps<\"div\">, \"onChange\">,\n TabsOptions {\n children: React.ReactNode\n}\n\n/**\n * Tabs\n *\n * Provides context and logic for all tabs components.\n */\nexport const Tabs = forwardRef<TabsProps, \"div\">((props, ref) => {\n const styles = useMultiStyleConfig(\"Tabs\", props)\n const { children, className, ...rest } = omitThemingProps(props)\n\n const { htmlProps, descendants, ...ctx } = useTabs(rest)\n const context = React.useMemo(() => ctx, [ctx])\n\n const rootProps = omit(htmlProps as any, [\"isFitted\"])\n\n return (\n <TabsDescendantsProvider value={descendants}>\n <TabsProvider value={context}>\n <StylesProvider value={styles}>\n <chakra.div\n className={cx(\"chakra-tabs\", className)}\n ref={ref}\n {...rootProps}\n __css={styles.root}\n >\n {children}\n </chakra.div>\n </StylesProvider>\n </TabsProvider>\n </TabsDescendantsProvider>\n )\n})\n\nif (__DEV__) {\n Tabs.displayName = \"Tabs\"\n}\n\nexport interface TabProps extends UseTabOptions, HTMLChakraProps<\"button\"> {}\n\n/**\n * Tab button used to activate a specific tab panel. It renders a `button`,\n * and is responsible for automatic and manual selection modes.\n */\nexport const Tab = forwardRef<TabProps, \"button\">((props, ref) => {\n const styles = useStyles()\n const tabProps = useTab({ ...props, ref })\n\n const tabStyles: SystemStyleObject = {\n outline: \"0\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n ...styles.tab,\n }\n\n return (\n <chakra.button\n {...tabProps}\n className={cx(\"chakra-tabs__tab\", props.className)}\n __css={tabStyles}\n />\n )\n})\n\nif (__DEV__) {\n Tab.displayName = \"Tab\"\n}\n\nexport interface TabListProps\n extends UseTabListProps,\n Omit<HTMLChakraProps<\"div\">, \"onKeyDown\" | \"ref\"> {}\n\n/**\n * TabList is used to manage a list of tab buttons. It renders a `div` by default,\n * and is responsible the keyboard interaction between tabs.\n */\nexport const TabList = forwardRef<TabListProps, \"div\">((props, ref) => {\n const tablistProps = useTabList({ ...props, ref })\n\n const styles = useStyles()\n\n const tablistStyles: SystemStyleObject = {\n display: \"flex\",\n ...styles.tablist,\n }\n\n return (\n <chakra.div\n {...tablistProps}\n className={cx(\"chakra-tabs__tablist\", props.className)}\n __css={tablistStyles}\n />\n )\n})\n\nif (__DEV__) {\n TabList.displayName = \"TabList\"\n}\n\nexport interface TabPanelProps extends HTMLChakraProps<\"div\"> {}\n\n/**\n * TabPanel\n * Used to render the content for a specific tab.\n */\nexport const TabPanel = forwardRef<TabPanelProps, \"div\">((props, ref) => {\n const panelProps = useTabPanel({ ...props, ref })\n const styles = useStyles()\n\n return (\n <chakra.div\n outline=\"0\"\n {...panelProps}\n className={cx(\"chakra-tabs__tab-panel\", props.className)}\n __css={styles.tabpanel}\n />\n )\n})\n\nif (__DEV__) {\n TabPanel.displayName = \"TabPanel\"\n}\n\nexport interface TabPanelsProps extends HTMLChakraProps<\"div\"> {}\n\n/**\n * TabPanel\n *\n * Used to manage the rendering of multiple tab panels. It uses\n * `cloneElement` to hide/show tab panels.\n *\n * It renders a `div` by default.\n */\nexport const TabPanels = forwardRef<TabPanelsProps, \"div\">((props, ref) => {\n const panelsProps = useTabPanels(props)\n const styles = useStyles()\n\n return (\n <chakra.div\n {...panelsProps}\n width=\"100%\"\n ref={ref}\n className={cx(\"chakra-tabs__tab-panels\", props.className)}\n __css={styles.tabpanels}\n />\n )\n})\n\nif (__DEV__) {\n TabPanels.displayName = \"TabPanels\"\n}\n\nexport interface TabIndicatorProps extends HTMLChakraProps<\"div\"> {}\n\n/**\n * TabIndicator\n *\n * Used to render an active tab indicator that animates between\n * selected tabs.\n */\nexport const TabIndicator = forwardRef<TabIndicatorProps, \"div\">(\n (props, ref) => {\n const indicatorStyle = useTabIndicator()\n const style = {\n ...props.style,\n ...indicatorStyle,\n }\n\n const styles = useStyles()\n\n return (\n <chakra.div\n ref={ref}\n {...props}\n className={cx(\"chakra-tabs__tab-indicator\", props.className)}\n style={style}\n __css={styles.indicator}\n />\n )\n },\n)\n\nif (__DEV__) {\n TabIndicator.displayName = \"TabIndicator\"\n}\n","import {\n chakra,\n forwardRef,\n HTMLChakraProps,\n SystemProps,\n tokenToCSSVar,\n} from \"@chakra-ui/system\"\nimport { cx, Dict, mapResponsive, __DEV__ } from \"@chakra-ui/utils\"\nimport * as React from \"react\"\n\nexport interface WrapProps extends HTMLChakraProps<\"div\"> {\n /**\n * The space between the each child (even if it wraps)\n * @type SystemProps[\"margin\"]\n */\n spacing?: SystemProps[\"margin\"]\n /**\n * The `justify-content` value (for cross-axis alignment)\n * @type SystemProps[\"justifyContent\"]\n */\n justify?: SystemProps[\"justifyContent\"]\n /**\n * The `align-items` value (for main axis alignment)\n * @type SystemProps[\"alignItems\"]\n */\n align?: SystemProps[\"alignItems\"]\n /**\n * The `flex-direction` value\n * @type SystemProps[\"flexDirection\"]\n */\n direction?: SystemProps[\"flexDirection\"]\n /**\n * If `true`, the children will be wrapped in a `WrapItem`\n */\n shouldWrapChildren?: boolean\n}\n\n/**\n * Layout component used to stack elements that differ in length\n * and are liable to wrap.\n *\n * Common use cases:\n * - Buttons that appear together at the end of forms\n * - Lists of tags and chips\n *\n * @see Docs https://chakra-ui.com/wrap\n */\nexport const Wrap = forwardRef<WrapProps, \"div\">((props, ref) => {\n const {\n spacing = \"0.5rem\",\n children,\n justify,\n direction,\n align,\n className,\n shouldWrapChildren,\n ...rest\n } = props\n\n const styles = React.useMemo(\n () => ({\n \"--chakra-wrap-spacing\": (theme: Dict) =>\n mapResponsive(spacing, (value) => tokenToCSSVar(\"space\", value)(theme)),\n \"--wrap-spacing\": \"calc(var(--chakra-wrap-spacing) / 2)\",\n display: \"flex\",\n flexWrap: \"wrap\",\n justifyContent: justify,\n alignItems: align,\n flexDirection: direction,\n listStyleType: \"none\",\n padding: \"0\",\n margin: \"calc(var(--wrap-spacing) * -1)\",\n \"& > *:not(style)\": {\n margin: \"var(--wrap-spacing)\",\n },\n }),\n [spacing, justify, align, direction],\n )\n\n const childrenToRender = shouldWrapChildren\n ? React.Children.map(children, (child, index) => (\n <WrapItem key={index}>{child}</WrapItem>\n ))\n : children\n\n return (\n <chakra.div ref={ref} className={cx(\"chakra-wrap\", className)} {...rest}>\n <chakra.ul className=\"chakra-wrap__list\" __css={styles}>\n {childrenToRender}\n </chakra.ul>\n </chakra.div>\n )\n})\n\nif (__DEV__) {\n Wrap.displayName = \"Wrap\"\n}\n\nexport interface WrapItemProps extends HTMLChakraProps<\"li\"> {}\n\nexport const WrapItem = forwardRef<WrapItemProps, \"li\">((props, ref) => {\n const { className, ...rest } = props\n return (\n <chakra.li\n ref={ref}\n __css={{ display: \"flex\", alignItems: \"flex-start\" }}\n className={cx(\"chakra-wrap__listitem\", className)}\n {...rest}\n />\n )\n})\n\nif (__DEV__) {\n WrapItem.displayName = \"WrapItem\"\n}\n"],"sourceRoot":""}
1
+ {"version":3,"sources":["../../../src/index.ts","../../../src/link-box.tsx","../node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteral.js","../node_modules/date-fns/esm/compareAsc/index.js","../node_modules/date-fns/esm/_lib/cloneObject/index.js","../node_modules/date-fns/esm/_lib/assign/index.js","../node_modules/date-fns/esm/formatDistanceStrict/index.js","../node_modules/date-fns/esm/formatDistanceToNowStrict/index.js","../../../src/use-tabs.ts","../../../src/tabs.tsx","../../../src/wrap.tsx"],"names":["LinkOverlay","forwardRef","className","ref","cx","rel","isExternal","target","__css","position","content","cursor","display","top","left","zIndex","width","height","LinkBox","_taggedTemplateLiteral","strings","raw","slice","Object","freeze","defineProperties","value","compareAsc","dirtyDateLeft","dirtyDateRight","requiredArgs","arguments","dateLeft","toDate","dateRight","diff","getTime","cloneObject","dirtyObject","TypeError","property","prototype","hasOwnProperty","call","assign","MILLISECONDS_IN_MINUTE","MINUTES_IN_DAY","MINUTES_IN_MONTH","MINUTES_IN_YEAR","formatDistanceStrict","dirtyDate","dirtyBaseDate","options","length","undefined","locale","defaultLocale","formatDistance","RangeError","comparison","isNaN","localizeOptions","addSuffix","Boolean","roundingMethodFn","roundingMethod","String","Math","floor","ceil","round","unit","milliseconds","minutes","timezoneOffset","getTimezoneOffsetInMilliseconds","dstNormalizedMinutes","seconds","roundedMinutes","hours","days","months","years","formatDistanceToNowStrict","dirtyOptions","Date","now","createDescendantContext","createContext","name","errorMessage","makeTabId","id","makeTabPanelId","Tabs","styles","useMultiStyleConfig","omitThemingProps","props","lazyBehavior","orientation","direction","React","defaultIndex","useControllableState","defaultValue","onChange","index","setFocusedIndex","descendants","useTabsDescendants","useId","selectedIndex","focusedIndex","setSelectedIndex","isManual","isLazy","htmlProps","useTabs","context","rootProps","omit","root","Tab","useStyles","tabProps","isFocusable","useTabsContext","useTabsDescendant","disabled","isDisabled","register","isSelected","clickableProps","useClickable","mergeRefs","onClick","callAllHandlers","role","tabIndex","type","onFocus","useTab","tabStyles","outline","alignItems","justifyContent","TabList","tablistProps","useTabsDescendantsContext","onKeyDown","event","nextTab","next","focus","prevTab","prev","isHorizontal","isVertical","eventKey","normalizeEventKey","ArrowStart","ArrowEnd","action","first","last","useTabList","tablistStyles","TabPanel","panelProps","children","hasBeenSelected","determineLazyBehavior","hidden","useTabPanel","tabpanel","TabPanels","panelsProps","getValidChildren","useTabPanels","tabpanels","TabIndicator","indicatorStyle","useSafeLayoutEffect","isUndefined","tab","setRect","offsetWidth","offsetHeight","requestAnimationFrame","setHasMeasured","cancelAnimationFrame","transitionProperty","transitionDuration","hasMeasured","transitionTimingFunction","useTabIndicator","style","indicator","Wrap","spacing","shouldWrapChildren","theme","mapResponsive","tokenToCSSVar","flexWrap","flexDirection","listStyleType","padding","margin","justify","align","childrenToRender","key","WrapItem"],"mappings":"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","file":"static/js/9.d40d7958.chunk.js","sourcesContent":["export * from \"@chakra-ui/color-mode\"\nexport * from \"@chakra-ui/styled-system\"\nexport { keyframes } from \"@emotion/react\"\nexport type { Interpolation } from \"@emotion/react\"\nexport * from \"./hooks\"\nexport * from \"./system.types\"\nexport * from \"./providers\"\nexport { omitThemingProps } from \"./system.utils\"\nexport * from \"./system\"\nexport * from \"./forward-ref\"\nexport * from \"./use-style-config\"\nexport { shouldForwardProp } from \"./should-forward-prop\"\n","import { chakra, forwardRef, HTMLChakraProps } from \"@chakra-ui/system\"\nimport { cx } from \"@chakra-ui/utils\"\nimport * as React from \"react\"\n\nexport interface LinkOverlayProps extends HTMLChakraProps<\"a\"> {\n /**\n * If `true`, the link will open in new tab\n */\n isExternal?: boolean\n}\n\nexport const LinkOverlay = forwardRef<LinkOverlayProps, \"a\">((props, ref) => {\n const { isExternal, target, rel, className, ...rest } = props\n return (\n <chakra.a\n {...rest}\n ref={ref}\n className={cx(\"chakra-linkbox__overlay\", className)}\n rel={isExternal ? \"noopener noreferrer\" : rel}\n target={isExternal ? \"_blank\" : target}\n __css={{\n position: \"static\",\n \"&::before\": {\n content: \"''\",\n cursor: \"inherit\",\n display: \"block\",\n position: \"absolute\",\n top: 0,\n left: 0,\n zIndex: 0,\n width: \"100%\",\n height: \"100%\",\n },\n }}\n />\n )\n})\n\nexport interface LinkBoxProps extends HTMLChakraProps<\"div\"> {}\n\n/**\n * `LinkBox` is used to wrap content areas within a link while ensuring semantic html\n *\n * @see Docs https://chakra-ui.com/docs/navigation/link-overlay\n * @see Resources https://www.sarasoueidan.com/blog/nested-links\n */\nexport const LinkBox = forwardRef<LinkBoxProps, \"div\">((props, ref) => {\n const { className, ...rest } = props\n\n return (\n <chakra.div\n ref={ref}\n position=\"relative\"\n {...rest}\n className={cx(\"chakra-linkbox\", className)}\n __css={{\n /* Elevate the links and abbreviations up */\n \"a[href]:not(.chakra-linkbox__overlay), abbr[title]\": {\n position: \"relative\",\n zIndex: 1,\n },\n }}\n />\n )\n})\n","export default function _taggedTemplateLiteral(strings, raw) {\n if (!raw) {\n raw = strings.slice(0);\n }\n\n return Object.freeze(Object.defineProperties(strings, {\n raw: {\n value: Object.freeze(raw)\n }\n }));\n}","import toDate from \"../toDate/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\n/**\n * @name compareAsc\n * @category Common Helpers\n * @summary Compare the two dates and return -1, 0 or 1.\n *\n * @description\n * Compare the two dates and return 1 if the first date is after the second,\n * -1 if the first date is before the second or 0 if dates are equal.\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * @param {Date|Number} dateLeft - the first date to compare\n * @param {Date|Number} dateRight - the second date to compare\n * @returns {Number} the result of the comparison\n * @throws {TypeError} 2 arguments required\n *\n * @example\n * // Compare 11 February 1987 and 10 July 1989:\n * const result = compareAsc(new Date(1987, 1, 11), new Date(1989, 6, 10))\n * //=> -1\n *\n * @example\n * // Sort the array of dates:\n * const result = [\n * new Date(1995, 6, 2),\n * new Date(1987, 1, 11),\n * new Date(1989, 6, 10)\n * ].sort(compareAsc)\n * //=> [\n * // Wed Feb 11 1987 00:00:00,\n * // Mon Jul 10 1989 00:00:00,\n * // Sun Jul 02 1995 00:00:00\n * // ]\n */\n\nexport default function compareAsc(dirtyDateLeft, dirtyDateRight) {\n requiredArgs(2, arguments);\n var dateLeft = toDate(dirtyDateLeft);\n var dateRight = toDate(dirtyDateRight);\n var diff = dateLeft.getTime() - dateRight.getTime();\n\n if (diff < 0) {\n return -1;\n } else if (diff > 0) {\n return 1; // Return 0 if diff is 0; return NaN if diff is NaN\n } else {\n return diff;\n }\n}","import assign from \"../assign/index.js\";\nexport default function cloneObject(dirtyObject) {\n return assign({}, dirtyObject);\n}","export default function assign(target, dirtyObject) {\n if (target == null) {\n throw new TypeError('assign requires that input parameter not be null or undefined');\n }\n\n dirtyObject = dirtyObject || {};\n\n for (var property in dirtyObject) {\n if (Object.prototype.hasOwnProperty.call(dirtyObject, property)) {\n target[property] = dirtyObject[property];\n }\n }\n\n return target;\n}","import getTimezoneOffsetInMilliseconds from \"../_lib/getTimezoneOffsetInMilliseconds/index.js\";\nimport compareAsc from \"../compareAsc/index.js\";\nimport toDate from \"../toDate/index.js\";\nimport cloneObject from \"../_lib/cloneObject/index.js\";\nimport defaultLocale from \"../locale/en-US/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\nvar MILLISECONDS_IN_MINUTE = 1000 * 60;\nvar MINUTES_IN_DAY = 60 * 24;\nvar MINUTES_IN_MONTH = MINUTES_IN_DAY * 30;\nvar MINUTES_IN_YEAR = MINUTES_IN_DAY * 365;\n/**\n * @name formatDistanceStrict\n * @category Common Helpers\n * @summary Return the distance between the given dates in words.\n *\n * @description\n * Return the distance between the given dates in words, using strict units.\n * This is like `formatDistance`, but does not use helpers like 'almost', 'over',\n * 'less than' and the like.\n *\n * | Distance between dates | Result |\n * |------------------------|---------------------|\n * | 0 ... 59 secs | [0..59] seconds |\n * | 1 ... 59 mins | [1..59] minutes |\n * | 1 ... 23 hrs | [1..23] hours |\n * | 1 ... 29 days | [1..29] days |\n * | 1 ... 11 months | [1..11] months |\n * | 1 ... N years | [1..N] years |\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * - The function was renamed from `distanceInWordsStrict` to `formatDistanceStrict`\n * to make its name consistent with `format` and `formatRelative`.\n *\n * - The order of arguments is swapped to make the function\n * consistent with `differenceIn...` functions.\n *\n * ```javascript\n * // Before v2.0.0\n *\n * distanceInWordsStrict(\n * new Date(2015, 0, 2),\n * new Date(2014, 6, 2)\n * ) //=> '6 months'\n *\n * // v2.0.0 onward\n *\n * formatDistanceStrict(\n * new Date(2014, 6, 2),\n * new Date(2015, 0, 2)\n * ) //=> '6 months'\n * ```\n *\n * - `partialMethod` option is renamed to `roundingMethod`.\n *\n * ```javascript\n * // Before v2.0.0\n *\n * distanceInWordsStrict(\n * new Date(1986, 3, 4, 10, 32, 0),\n * new Date(1986, 3, 4, 10, 33, 1),\n * { partialMethod: 'ceil' }\n * ) //=> '2 minutes'\n *\n * // v2.0.0 onward\n *\n * formatDistanceStrict(\n * new Date(1986, 3, 4, 10, 33, 1),\n * new Date(1986, 3, 4, 10, 32, 0),\n * { roundingMethod: 'ceil' }\n * ) //=> '2 minutes'\n * ```\n *\n * - If `roundingMethod` is not specified, it now defaults to `round` instead of `floor`.\n *\n * - `unit` option now accepts one of the strings:\n * 'second', 'minute', 'hour', 'day', 'month' or 'year' instead of 's', 'm', 'h', 'd', 'M' or 'Y'\n *\n * ```javascript\n * // Before v2.0.0\n *\n * distanceInWordsStrict(\n * new Date(1986, 3, 4, 10, 32, 0),\n * new Date(1986, 3, 4, 10, 33, 1),\n * { unit: 'm' }\n * )\n *\n * // v2.0.0 onward\n *\n * formatDistanceStrict(\n * new Date(1986, 3, 4, 10, 33, 1),\n * new Date(1986, 3, 4, 10, 32, 0),\n * { unit: 'minute' }\n * )\n * ```\n *\n * @param {Date|Number} date - the date\n * @param {Date|Number} baseDate - the date to compare with\n * @param {Object} [options] - an object with options.\n * @param {Boolean} [options.addSuffix=false] - result indicates if the second date is earlier or later than the first\n * @param {'second'|'minute'|'hour'|'day'|'month'|'year'} [options.unit] - if specified, will force a unit\n * @param {'floor'|'ceil'|'round'} [options.roundingMethod='round'] - which way to round partial units\n * @param {Locale} [options.locale=defaultLocale] - the locale object. See [Locale]{@link https://date-fns.org/docs/Locale}\n * @returns {String} the distance in words\n * @throws {TypeError} 2 arguments required\n * @throws {RangeError} `date` must not be Invalid Date\n * @throws {RangeError} `baseDate` must not be Invalid Date\n * @throws {RangeError} `options.roundingMethod` must be 'floor', 'ceil' or 'round'\n * @throws {RangeError} `options.unit` must be 'second', 'minute', 'hour', 'day', 'month' or 'year'\n * @throws {RangeError} `options.locale` must contain `formatDistance` property\n *\n * @example\n * // What is the distance between 2 July 2014 and 1 January 2015?\n * const result = formatDistanceStrict(new Date(2014, 6, 2), new Date(2015, 0, 2))\n * //=> '6 months'\n *\n * @example\n * // What is the distance between 1 January 2015 00:00:15\n * // and 1 January 2015 00:00:00?\n * const result = formatDistanceStrict(\n * new Date(2015, 0, 1, 0, 0, 15),\n * new Date(2015, 0, 1, 0, 0, 0)\n * )\n * //=> '15 seconds'\n *\n * @example\n * // What is the distance from 1 January 2016\n * // to 1 January 2015, with a suffix?\n * const result = formatDistanceStrict(new Date(2015, 0, 1), new Date(2016, 0, 1), {\n * addSuffix: true\n * })\n * //=> '1 year ago'\n *\n * @example\n * // What is the distance from 1 January 2016\n * // to 1 January 2015, in minutes?\n * const result = formatDistanceStrict(new Date(2016, 0, 1), new Date(2015, 0, 1), {\n * unit: 'minute'\n * })\n * //=> '525600 minutes'\n *\n * @example\n * // What is the distance from 1 January 2015\n * // to 28 January 2015, in months, rounded up?\n * const result = formatDistanceStrict(new Date(2015, 0, 28), new Date(2015, 0, 1), {\n * unit: 'month',\n * roundingMethod: 'ceil'\n * })\n * //=> '1 month'\n *\n * @example\n * // What is the distance between 1 August 2016 and 1 January 2015 in Esperanto?\n * import { eoLocale } from 'date-fns/locale/eo'\n * const result = formatDistanceStrict(new Date(2016, 7, 1), new Date(2015, 0, 1), {\n * locale: eoLocale\n * })\n * //=> '1 jaro'\n */\n\nexport default function formatDistanceStrict(dirtyDate, dirtyBaseDate) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n requiredArgs(2, arguments);\n var locale = options.locale || defaultLocale;\n\n if (!locale.formatDistance) {\n throw new RangeError('locale must contain localize.formatDistance property');\n }\n\n var comparison = compareAsc(dirtyDate, dirtyBaseDate);\n\n if (isNaN(comparison)) {\n throw new RangeError('Invalid time value');\n }\n\n var localizeOptions = cloneObject(options);\n localizeOptions.addSuffix = Boolean(options.addSuffix);\n localizeOptions.comparison = comparison;\n var dateLeft;\n var dateRight;\n\n if (comparison > 0) {\n dateLeft = toDate(dirtyBaseDate);\n dateRight = toDate(dirtyDate);\n } else {\n dateLeft = toDate(dirtyDate);\n dateRight = toDate(dirtyBaseDate);\n }\n\n var roundingMethod = options.roundingMethod == null ? 'round' : String(options.roundingMethod);\n var roundingMethodFn;\n\n if (roundingMethod === 'floor') {\n roundingMethodFn = Math.floor;\n } else if (roundingMethod === 'ceil') {\n roundingMethodFn = Math.ceil;\n } else if (roundingMethod === 'round') {\n roundingMethodFn = Math.round;\n } else {\n throw new RangeError(\"roundingMethod must be 'floor', 'ceil' or 'round'\");\n }\n\n var milliseconds = dateRight.getTime() - dateLeft.getTime();\n var minutes = milliseconds / MILLISECONDS_IN_MINUTE;\n var timezoneOffset = getTimezoneOffsetInMilliseconds(dateRight) - getTimezoneOffsetInMilliseconds(dateLeft); // Use DST-normalized difference in minutes for years, months and days;\n // use regular difference in minutes for hours, minutes and seconds.\n\n var dstNormalizedMinutes = (milliseconds - timezoneOffset) / MILLISECONDS_IN_MINUTE;\n var unit;\n\n if (options.unit == null) {\n if (minutes < 1) {\n unit = 'second';\n } else if (minutes < 60) {\n unit = 'minute';\n } else if (minutes < MINUTES_IN_DAY) {\n unit = 'hour';\n } else if (dstNormalizedMinutes < MINUTES_IN_MONTH) {\n unit = 'day';\n } else if (dstNormalizedMinutes < MINUTES_IN_YEAR) {\n unit = 'month';\n } else {\n unit = 'year';\n }\n } else {\n unit = String(options.unit);\n } // 0 up to 60 seconds\n\n\n if (unit === 'second') {\n var seconds = roundingMethodFn(milliseconds / 1000);\n return locale.formatDistance('xSeconds', seconds, localizeOptions); // 1 up to 60 mins\n } else if (unit === 'minute') {\n var roundedMinutes = roundingMethodFn(minutes);\n return locale.formatDistance('xMinutes', roundedMinutes, localizeOptions); // 1 up to 24 hours\n } else if (unit === 'hour') {\n var hours = roundingMethodFn(minutes / 60);\n return locale.formatDistance('xHours', hours, localizeOptions); // 1 up to 30 days\n } else if (unit === 'day') {\n var days = roundingMethodFn(dstNormalizedMinutes / MINUTES_IN_DAY);\n return locale.formatDistance('xDays', days, localizeOptions); // 1 up to 12 months\n } else if (unit === 'month') {\n var months = roundingMethodFn(dstNormalizedMinutes / MINUTES_IN_MONTH);\n return months === 12 && options.unit !== 'month' ? locale.formatDistance('xYears', 1, localizeOptions) : locale.formatDistance('xMonths', months, localizeOptions); // 1 year up to max Date\n } else if (unit === 'year') {\n var years = roundingMethodFn(dstNormalizedMinutes / MINUTES_IN_YEAR);\n return locale.formatDistance('xYears', years, localizeOptions);\n }\n\n throw new RangeError(\"unit must be 'second', 'minute', 'hour', 'day', 'month' or 'year'\");\n}","import formatDistanceStrict from \"../formatDistanceStrict/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\n/**\n * @name formatDistanceToNowStrict\n * @category Common Helpers\n * @summary Return the distance between the given date and now in words.\n * @pure false\n *\n * @description\n * Return the distance between the given dates in words, using strict units.\n * This is like `formatDistance`, but does not use helpers like 'almost', 'over',\n * 'less than' and the like.\n *\n * | Distance between dates | Result |\n * |------------------------|---------------------|\n * | 0 ... 59 secs | [0..59] seconds |\n * | 1 ... 59 mins | [1..59] minutes |\n * | 1 ... 23 hrs | [1..23] hours |\n * | 1 ... 29 days | [1..29] days |\n * | 1 ... 11 months | [1..11] months |\n * | 1 ... N years | [1..N] years |\n *\n * @param {Date|Number} date - the given date\n * @param {Object} [options] - an object with options.\n * @param {Boolean} [options.addSuffix=false] - result indicates if the second date is earlier or later than the first\n * @param {'second'|'minute'|'hour'|'day'|'month'|'year'} [options.unit] - if specified, will force a unit\n * @param {'floor'|'ceil'|'round'} [options.roundingMethod='round'] - which way to round partial units\n * @param {Locale} [options.locale=defaultLocale] - the locale object. See [Locale]{@link https://date-fns.org/docs/Locale}\n * @returns {String} the distance in words\n * @throws {TypeError} 1 argument required\n * @throws {RangeError} `date` must not be Invalid Date\n * @throws {RangeError} `options.locale` must contain `formatDistance` property\n *\n * @example\n * // If today is 1 January 2015, what is the distance to 2 July 2014?\n * var result = formatDistanceToNowStrict(\n * new Date(2014, 6, 2)\n * )\n * //=> '6 months'\n *\n * @example\n * // If now is 1 January 2015 00:00:00,\n * // what is the distance to 1 January 2015 00:00:15, including seconds?\n * var result = formatDistanceToNowStrict(\n * new Date(2015, 0, 1, 0, 0, 15)\n * )\n * //=> '20 seconds'\n *\n * @example\n * // If today is 1 January 2015,\n * // what is the distance to 1 January 2016, with a suffix?\n * var result = formatDistanceToNowStrict(\n * new Date(2016, 0, 1),\n * {addSuffix: true}\n * )\n * //=> 'in 1 year'\n *\n * @example\n * // If today is 28 January 2015,\n * // what is the distance to 1 January 2015, in months, rounded up??\n * var result = formatDistanceToNowStrict(new Date(2015, 0, 1), {\n * unit: 'month',\n * roundingMethod: 'ceil'\n * })\n * //=> '1 month'\n *\n * @example\n * // If today is 1 January 2015,\n * // what is the distance to 1 August 2016 in Esperanto?\n * var eoLocale = require('date-fns/locale/eo')\n * var result = formatDistanceToNowStrict(\n * new Date(2016, 7, 1),\n * {locale: eoLocale}\n * )\n * //=> '1 jaro'\n */\n\nexport default function formatDistanceToNowStrict(dirtyDate, dirtyOptions) {\n requiredArgs(1, arguments);\n return formatDistanceStrict(dirtyDate, Date.now(), dirtyOptions);\n}","import { useClickable, UseClickableProps } from \"@chakra-ui/clickable\"\nimport { createDescendantContext } from \"@chakra-ui/descendant\"\nimport {\n useControllableState,\n useId,\n useSafeLayoutEffect,\n} from \"@chakra-ui/hooks\"\nimport {\n createContext,\n EventKeyMap,\n getValidChildren,\n mergeRefs,\n} from \"@chakra-ui/react-utils\"\nimport {\n callAllHandlers,\n determineLazyBehavior,\n Dict,\n focus,\n isUndefined,\n LazyBehavior,\n normalizeEventKey,\n} from \"@chakra-ui/utils\"\nimport * as React from \"react\"\n\n/* -------------------------------------------------------------------------------------------------\n * Create context to track descendants and their indices\n * -----------------------------------------------------------------------------------------------*/\n\nexport const [\n TabsDescendantsProvider,\n useTabsDescendantsContext,\n useTabsDescendants,\n useTabsDescendant,\n] = createDescendantContext<HTMLButtonElement>()\n\n/* -------------------------------------------------------------------------------------------------\n * useTabs - The root react hook that manages all tab items\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface UseTabsProps {\n /**\n * The orientation of the tab list.\n */\n orientation?: \"vertical\" | \"horizontal\"\n /**\n * If `true`, the tabs will be manually activated and\n * display its panel by pressing Space or Enter.\n *\n * If `false`, the tabs will be automatically activated\n * and their panel is displayed when they receive focus.\n */\n isManual?: boolean\n /**\n * Callback when the index (controlled or un-controlled) changes.\n */\n onChange?: (index: number) => void\n /**\n * The index of the selected tab (in controlled mode)\n */\n index?: number\n /**\n * The initial index of the selected tab (in uncontrolled mode)\n */\n defaultIndex?: number\n /**\n * The id of the tab\n */\n id?: string\n /**\n * Performance 🚀:\n * If `true`, rendering of the tab panel's will be deferred until it is selected.\n */\n isLazy?: boolean\n /**\n * Performance 🚀:\n * The lazy behavior of tab panels' content when not active.\n * Only works when `isLazy={true}`\n *\n * - \"unmount\": The content of inactive tab panels are always unmounted.\n * - \"keepMounted\": The content of inactive tab panels is initially unmounted,\n * but stays mounted when selected.\n *\n * @default \"unmount\"\n */\n lazyBehavior?: LazyBehavior\n /**\n * The writing mode direction.\n *\n * - When in RTL, the left and right navigation is flipped\n */\n direction?: \"rtl\" | \"ltr\"\n}\n\n/**\n * Tabs hooks that provides all the states, and accessibility\n * helpers to keep all things working properly.\n *\n * Its returned object will be passed unto a Context Provider\n * so all child components can read from it.\n * There is no document link yet\n * @see Docs https://chakra-ui.com/docs/components/useTabs\n */\nexport function useTabs(props: UseTabsProps) {\n const {\n defaultIndex,\n onChange,\n index,\n isManual,\n isLazy,\n lazyBehavior = \"unmount\",\n orientation = \"horizontal\",\n direction = \"ltr\",\n ...htmlProps\n } = props\n\n /**\n * We use this to keep track of the index of the focused tab.\n *\n * Tabs can be automatically activated, this means selection follows focus.\n * When we navigate with the arrow keys, we move focus and selection to next/prev tab\n *\n * Tabs can also be manually activated, this means selection does not follow focus.\n * When we navigate with the arrow keys, we only move focus NOT selection. The user\n * will need not manually activate the tab using `Enter` or `Space`.\n *\n * This is why we need to keep track of the `focusedIndex` and `selectedIndex`\n */\n const [focusedIndex, setFocusedIndex] = React.useState(defaultIndex ?? 0)\n\n const [selectedIndex, setSelectedIndex] = useControllableState({\n defaultValue: defaultIndex ?? 0,\n value: index,\n onChange,\n })\n\n /**\n * Sync focused `index` with controlled `selectedIndex` (which is the `props.index`)\n */\n React.useEffect(() => {\n if (index != null) {\n setFocusedIndex(index)\n }\n }, [index])\n\n /**\n * Think of `useDescendants` as a register for the tab nodes.\n */\n const descendants = useTabsDescendants()\n\n /**\n * Generate a unique id or use user-provided id for the tabs widget\n */\n const id = useId(props.id, `tabs`)\n\n return {\n id,\n selectedIndex,\n focusedIndex,\n setSelectedIndex,\n setFocusedIndex,\n isManual,\n isLazy,\n lazyBehavior,\n orientation,\n descendants,\n direction,\n htmlProps,\n }\n}\n\nexport type UseTabsReturn = Omit<\n ReturnType<typeof useTabs>,\n \"htmlProps\" | \"descendants\"\n>\n\nexport const [TabsProvider, useTabsContext] = createContext<UseTabsReturn>({\n name: \"TabsContext\",\n errorMessage:\n \"useTabsContext: `context` is undefined. Seems you forgot to wrap all tabs components within <Tabs />\",\n})\n\ntype Child = React.ReactElement<any>\n\nexport interface UseTabListProps {\n children?: React.ReactNode\n onKeyDown?: React.KeyboardEventHandler\n ref?: React.Ref<any>\n}\n\n/**\n * Tabs hook to manage multiple tab buttons,\n * and ensures only one tab is selected per time.\n *\n * @param props props object for the tablist\n */\nexport function useTabList<P extends UseTabListProps>(props: P) {\n const { focusedIndex, orientation, direction } = useTabsContext()\n\n const descendants = useTabsDescendantsContext()\n\n const onKeyDown = React.useCallback(\n (event: React.KeyboardEvent) => {\n const nextTab = () => {\n const next = descendants.nextEnabled(focusedIndex)\n if (next) focus(next.node)\n }\n const prevTab = () => {\n const prev = descendants.prevEnabled(focusedIndex)\n if (prev) focus(prev.node)\n }\n const firstTab = () => {\n const first = descendants.firstEnabled()\n if (first) focus(first.node)\n }\n const lastTab = () => {\n const last = descendants.lastEnabled()\n if (last) focus(last.node)\n }\n\n const isHorizontal = orientation === \"horizontal\"\n const isVertical = orientation === \"vertical\"\n\n const eventKey = normalizeEventKey(event)\n\n const ArrowStart = direction === \"ltr\" ? \"ArrowLeft\" : \"ArrowRight\"\n const ArrowEnd = direction === \"ltr\" ? \"ArrowRight\" : \"ArrowLeft\"\n\n const keyMap: EventKeyMap = {\n [ArrowStart]: () => isHorizontal && prevTab(),\n [ArrowEnd]: () => isHorizontal && nextTab(),\n ArrowDown: () => isVertical && nextTab(),\n ArrowUp: () => isVertical && prevTab(),\n Home: firstTab,\n End: lastTab,\n }\n\n const action = keyMap[eventKey]\n\n if (action) {\n event.preventDefault()\n action(event)\n }\n },\n [descendants, focusedIndex, orientation, direction],\n )\n\n return {\n ...props,\n role: \"tablist\",\n \"aria-orientation\": orientation,\n onKeyDown: callAllHandlers(props.onKeyDown, onKeyDown),\n }\n}\n\nexport type UseTabListReturn = ReturnType<typeof useTabList>\n\nexport interface UseTabOptions {\n id?: string\n isSelected?: boolean\n panelId?: string\n /**\n * If `true`, the `Tab` won't be toggleable\n */\n isDisabled?: boolean\n}\n\nexport interface UseTabProps\n extends Omit<UseClickableProps, \"color\">,\n UseTabOptions {}\n\n/**\n * Tabs hook to manage each tab button.\n *\n * A tab can be disabled and focusable, or both,\n * hence the use of `useClickable` to handle this scenario\n */\nexport function useTab<P extends UseTabProps>(props: P) {\n const { isDisabled, isFocusable, ...htmlProps } = props\n\n const {\n setSelectedIndex,\n isManual,\n id,\n setFocusedIndex,\n selectedIndex,\n } = useTabsContext()\n\n const { index, register } = useTabsDescendant({\n disabled: isDisabled && !isFocusable,\n })\n\n const isSelected = index === selectedIndex\n\n const onClick = () => {\n setSelectedIndex(index)\n }\n\n const onFocus = () => {\n setFocusedIndex(index)\n const isDisabledButFocusable = isDisabled && isFocusable\n const shouldSelect = !isManual && !isDisabledButFocusable\n if (shouldSelect) {\n setSelectedIndex(index)\n }\n }\n\n const clickableProps = useClickable({\n ...htmlProps,\n ref: mergeRefs(register, props.ref),\n isDisabled,\n isFocusable,\n onClick: callAllHandlers(props.onClick, onClick),\n })\n\n const type: \"button\" | \"submit\" | \"reset\" = \"button\"\n\n return {\n ...clickableProps,\n id: makeTabId(id, index),\n role: \"tab\",\n tabIndex: isSelected ? 0 : -1,\n type,\n \"aria-selected\": isSelected,\n \"aria-controls\": makeTabPanelId(id, index),\n onFocus: isDisabled ? undefined : callAllHandlers(props.onFocus, onFocus),\n }\n}\n\nexport interface UseTabPanelsProps {\n children?: React.ReactNode\n}\n\n/**\n * Tabs hook for managing the visibility of multiple tab panels.\n *\n * Since only one panel can be show at a time, we use `cloneElement`\n * to inject `selected` panel to each TabPanel.\n *\n * It returns a cloned version of its children with\n * all functionality included.\n */\nexport function useTabPanels<P extends UseTabPanelsProps>(props: P) {\n const context = useTabsContext()\n\n const { id, selectedIndex } = context\n\n const validChildren = getValidChildren(props.children)\n\n const children = validChildren.map((child, index) =>\n React.cloneElement(child as Child, {\n isSelected: index === selectedIndex,\n id: makeTabPanelId(id, index),\n // Refers to the associated tab element, and also provides an accessible name to the tab panel.\n \"aria-labelledby\": makeTabId(id, index),\n }),\n )\n\n return { ...props, children }\n}\n\n/**\n * Tabs hook for managing the visible/hidden states\n * of the tab panel.\n *\n * @param props props object for the tab panel\n */\nexport function useTabPanel(props: Dict) {\n const { isSelected, id, children, ...htmlProps } = props\n const { isLazy, lazyBehavior } = useTabsContext()\n\n const hasBeenSelected = React.useRef(false)\n if (isSelected) {\n hasBeenSelected.current = true\n }\n\n const shouldRenderChildren = determineLazyBehavior({\n hasBeenSelected: hasBeenSelected.current,\n isSelected,\n isLazy,\n lazyBehavior,\n })\n\n return {\n // Puts the tabpanel in the page `Tab` sequence.\n tabIndex: 0,\n ...htmlProps,\n children: shouldRenderChildren ? children : null,\n role: \"tabpanel\",\n hidden: !isSelected,\n id,\n }\n}\n\n/**\n * Tabs hook to show an animated indicators that\n * follows the active tab.\n *\n * The way we do it is by measuring the DOM Rect (or dimensions)\n * of the active tab, and return that as CSS style for\n * the indicator.\n */\nexport function useTabIndicator(): React.CSSProperties {\n const context = useTabsContext()\n const descendants = useTabsDescendantsContext()\n\n const { selectedIndex, orientation } = context\n\n const isHorizontal = orientation === \"horizontal\"\n const isVertical = orientation === \"vertical\"\n\n // Get the clientRect of the selected tab\n const [rect, setRect] = React.useState(() => {\n if (isHorizontal) return { left: 0, width: 0 }\n if (isVertical) return { top: 0, height: 0 }\n return undefined\n })\n\n const [hasMeasured, setHasMeasured] = React.useState(false)\n\n // Update the selected tab rect when the selectedIndex changes\n useSafeLayoutEffect(() => {\n if (isUndefined(selectedIndex)) return undefined\n\n const tab = descendants.item(selectedIndex)\n if (isUndefined(tab)) return undefined\n\n // Horizontal Tab: Calculate width and left distance\n if (isHorizontal) {\n setRect({ left: tab.node.offsetLeft, width: tab.node.offsetWidth })\n }\n\n // Vertical Tab: Calculate height and top distance\n if (isVertical) {\n setRect({ top: tab.node.offsetTop, height: tab.node.offsetHeight })\n }\n\n // Prevent unwanted transition from 0 to measured rect\n // by setting the measured state in the next tick\n const id = requestAnimationFrame(() => {\n setHasMeasured(true)\n })\n\n return () => {\n if (id) {\n cancelAnimationFrame(id)\n }\n }\n }, [selectedIndex, isHorizontal, isVertical, descendants])\n\n return {\n position: \"absolute\",\n transitionProperty: \"left, right, top, bottom\",\n transitionDuration: hasMeasured ? \"200ms\" : \"0ms\",\n transitionTimingFunction: \"cubic-bezier(0, 0, 0.2, 1)\",\n ...rect,\n }\n}\n\nfunction makeTabId(id: string, index: number) {\n return `${id}--tab-${index}`\n}\n\nfunction makeTabPanelId(id: string, index: number) {\n return `${id}--tabpanel-${index}`\n}\n","import {\n chakra,\n forwardRef,\n omitThemingProps,\n StylesProvider,\n SystemStyleObject,\n ThemingProps,\n useMultiStyleConfig,\n useStyles,\n HTMLChakraProps,\n} from \"@chakra-ui/system\"\nimport { cx, omit, __DEV__ } from \"@chakra-ui/utils\"\nimport * as React from \"react\"\nimport {\n TabsDescendantsProvider,\n TabsProvider,\n useTab,\n useTabIndicator,\n useTabList,\n UseTabListProps,\n UseTabOptions,\n useTabPanel,\n useTabPanels,\n useTabs,\n UseTabsProps,\n} from \"./use-tabs\"\n\ninterface TabsOptions {\n /**\n * If `true`, tabs will stretch to width of the tablist.\n */\n isFitted?: boolean\n /**\n * The alignment of the tabs\n */\n align?: \"start\" | \"end\" | \"center\"\n}\n\nexport interface TabsProps\n extends UseTabsProps,\n ThemingProps<\"Tabs\">,\n Omit<HTMLChakraProps<\"div\">, \"onChange\">,\n TabsOptions {\n children: React.ReactNode\n}\n\n/**\n * Tabs\n *\n * Provides context and logic for all tabs components.\n */\nexport const Tabs = forwardRef<TabsProps, \"div\">((props, ref) => {\n const styles = useMultiStyleConfig(\"Tabs\", props)\n const { children, className, ...rest } = omitThemingProps(props)\n\n const { htmlProps, descendants, ...ctx } = useTabs(rest)\n const context = React.useMemo(() => ctx, [ctx])\n\n const rootProps = omit(htmlProps as any, [\"isFitted\"])\n\n return (\n <TabsDescendantsProvider value={descendants}>\n <TabsProvider value={context}>\n <StylesProvider value={styles}>\n <chakra.div\n className={cx(\"chakra-tabs\", className)}\n ref={ref}\n {...rootProps}\n __css={styles.root}\n >\n {children}\n </chakra.div>\n </StylesProvider>\n </TabsProvider>\n </TabsDescendantsProvider>\n )\n})\n\nif (__DEV__) {\n Tabs.displayName = \"Tabs\"\n}\n\nexport interface TabProps extends UseTabOptions, HTMLChakraProps<\"button\"> {}\n\n/**\n * Tab button used to activate a specific tab panel. It renders a `button`,\n * and is responsible for automatic and manual selection modes.\n */\nexport const Tab = forwardRef<TabProps, \"button\">((props, ref) => {\n const styles = useStyles()\n const tabProps = useTab({ ...props, ref })\n\n const tabStyles: SystemStyleObject = {\n outline: \"0\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n ...styles.tab,\n }\n\n return (\n <chakra.button\n {...tabProps}\n className={cx(\"chakra-tabs__tab\", props.className)}\n __css={tabStyles}\n />\n )\n})\n\nif (__DEV__) {\n Tab.displayName = \"Tab\"\n}\n\nexport interface TabListProps\n extends UseTabListProps,\n Omit<HTMLChakraProps<\"div\">, \"onKeyDown\" | \"ref\"> {}\n\n/**\n * TabList is used to manage a list of tab buttons. It renders a `div` by default,\n * and is responsible the keyboard interaction between tabs.\n */\nexport const TabList = forwardRef<TabListProps, \"div\">((props, ref) => {\n const tablistProps = useTabList({ ...props, ref })\n\n const styles = useStyles()\n\n const tablistStyles: SystemStyleObject = {\n display: \"flex\",\n ...styles.tablist,\n }\n\n return (\n <chakra.div\n {...tablistProps}\n className={cx(\"chakra-tabs__tablist\", props.className)}\n __css={tablistStyles}\n />\n )\n})\n\nif (__DEV__) {\n TabList.displayName = \"TabList\"\n}\n\nexport interface TabPanelProps extends HTMLChakraProps<\"div\"> {}\n\n/**\n * TabPanel\n * Used to render the content for a specific tab.\n */\nexport const TabPanel = forwardRef<TabPanelProps, \"div\">((props, ref) => {\n const panelProps = useTabPanel({ ...props, ref })\n const styles = useStyles()\n\n return (\n <chakra.div\n outline=\"0\"\n {...panelProps}\n className={cx(\"chakra-tabs__tab-panel\", props.className)}\n __css={styles.tabpanel}\n />\n )\n})\n\nif (__DEV__) {\n TabPanel.displayName = \"TabPanel\"\n}\n\nexport interface TabPanelsProps extends HTMLChakraProps<\"div\"> {}\n\n/**\n * TabPanel\n *\n * Used to manage the rendering of multiple tab panels. It uses\n * `cloneElement` to hide/show tab panels.\n *\n * It renders a `div` by default.\n */\nexport const TabPanels = forwardRef<TabPanelsProps, \"div\">((props, ref) => {\n const panelsProps = useTabPanels(props)\n const styles = useStyles()\n\n return (\n <chakra.div\n {...panelsProps}\n width=\"100%\"\n ref={ref}\n className={cx(\"chakra-tabs__tab-panels\", props.className)}\n __css={styles.tabpanels}\n />\n )\n})\n\nif (__DEV__) {\n TabPanels.displayName = \"TabPanels\"\n}\n\nexport interface TabIndicatorProps extends HTMLChakraProps<\"div\"> {}\n\n/**\n * TabIndicator\n *\n * Used to render an active tab indicator that animates between\n * selected tabs.\n */\nexport const TabIndicator = forwardRef<TabIndicatorProps, \"div\">(\n (props, ref) => {\n const indicatorStyle = useTabIndicator()\n const style = {\n ...props.style,\n ...indicatorStyle,\n }\n\n const styles = useStyles()\n\n return (\n <chakra.div\n ref={ref}\n {...props}\n className={cx(\"chakra-tabs__tab-indicator\", props.className)}\n style={style}\n __css={styles.indicator}\n />\n )\n },\n)\n\nif (__DEV__) {\n TabIndicator.displayName = \"TabIndicator\"\n}\n","import {\n chakra,\n forwardRef,\n HTMLChakraProps,\n SystemProps,\n tokenToCSSVar,\n} from \"@chakra-ui/system\"\nimport { cx, Dict, mapResponsive, __DEV__ } from \"@chakra-ui/utils\"\nimport * as React from \"react\"\n\nexport interface WrapProps extends HTMLChakraProps<\"div\"> {\n /**\n * The space between the each child (even if it wraps)\n * @type SystemProps[\"margin\"]\n */\n spacing?: SystemProps[\"margin\"]\n /**\n * The `justify-content` value (for cross-axis alignment)\n * @type SystemProps[\"justifyContent\"]\n */\n justify?: SystemProps[\"justifyContent\"]\n /**\n * The `align-items` value (for main axis alignment)\n * @type SystemProps[\"alignItems\"]\n */\n align?: SystemProps[\"alignItems\"]\n /**\n * The `flex-direction` value\n * @type SystemProps[\"flexDirection\"]\n */\n direction?: SystemProps[\"flexDirection\"]\n /**\n * If `true`, the children will be wrapped in a `WrapItem`\n */\n shouldWrapChildren?: boolean\n}\n\n/**\n * Layout component used to stack elements that differ in length\n * and are liable to wrap.\n *\n * Common use cases:\n * - Buttons that appear together at the end of forms\n * - Lists of tags and chips\n *\n * @see Docs https://chakra-ui.com/wrap\n */\nexport const Wrap = forwardRef<WrapProps, \"div\">((props, ref) => {\n const {\n spacing = \"0.5rem\",\n children,\n justify,\n direction,\n align,\n className,\n shouldWrapChildren,\n ...rest\n } = props\n\n const styles = React.useMemo(\n () => ({\n \"--chakra-wrap-spacing\": (theme: Dict) =>\n mapResponsive(spacing, (value) => tokenToCSSVar(\"space\", value)(theme)),\n \"--wrap-spacing\": \"calc(var(--chakra-wrap-spacing) / 2)\",\n display: \"flex\",\n flexWrap: \"wrap\",\n justifyContent: justify,\n alignItems: align,\n flexDirection: direction,\n listStyleType: \"none\",\n padding: \"0\",\n margin: \"calc(var(--wrap-spacing) * -1)\",\n \"& > *:not(style)\": {\n margin: \"var(--wrap-spacing)\",\n },\n }),\n [spacing, justify, align, direction],\n )\n\n const childrenToRender = shouldWrapChildren\n ? React.Children.map(children, (child, index) => (\n <WrapItem key={index}>{child}</WrapItem>\n ))\n : children\n\n return (\n <chakra.div ref={ref} className={cx(\"chakra-wrap\", className)} {...rest}>\n <chakra.ul className=\"chakra-wrap__list\" __css={styles}>\n {childrenToRender}\n </chakra.ul>\n </chakra.div>\n )\n})\n\nif (__DEV__) {\n Wrap.displayName = \"Wrap\"\n}\n\nexport interface WrapItemProps extends HTMLChakraProps<\"li\"> {}\n\nexport const WrapItem = forwardRef<WrapItemProps, \"li\">((props, ref) => {\n const { className, ...rest } = props\n return (\n <chakra.li\n ref={ref}\n __css={{ display: \"flex\", alignItems: \"flex-start\" }}\n className={cx(\"chakra-wrap__listitem\", className)}\n {...rest}\n />\n )\n})\n\nif (__DEV__) {\n WrapItem.displayName = \"WrapItem\"\n}\n"],"sourceRoot":""}