From 25f47263ca8234d5c321857acfa0deef85e75ba2 Mon Sep 17 00:00:00 2001 From: Vitalii Perehonchuk Date: Fri, 30 Aug 2024 09:23:11 +0300 Subject: [PATCH 1/4] feat: Algolia search (recreated) --- .env.example | 6 +- .env.local.example | 6 +- .github/workflows/main.yml | 10 + components/layoutHeader.tsx | 5 +- components/search.tsx | 168 -------- components/search/algoliaSearch.tsx | 121 ++++++ components/search/context.ts | 8 + components/search/dummy.tsx | 62 +++ components/search/hit.tsx | 31 ++ components/search/index.tsx | 18 + components/search/noResults.tsx | 13 + components/search/noResultsBoundary.tsx | 25 ++ components/search/sectionIcon.tsx | 60 +++ components/search/useHit.ts | 26 ++ components/search/useSearch.ts | 49 +++ components/search/validation.ts | 8 + components/search/withInstantSearch.tsx | 38 ++ hashes.json | 524 ++++++++++++++++++++++- next.config.js | 4 +- package.json | 5 +- populate-algolia/extractTextFromHtml.mts | 37 ++ populate-algolia/getAlgoliaClient.mts | 18 + populate-algolia/getAlgoliaIndex.mts | 11 - populate-algolia/hashes.mts | 2 +- populate-algolia/index.mts | 11 +- pre-build/index.mts | 17 +- pre-build/searchIndex.mts | 118 ----- styles/globals.scss | 2 + styles/search.scss | 148 +++++++ tsconfig.json | 23 +- utils/algolia.ts | 22 + yarn.lock | 353 +++++++++------ 32 files changed, 1479 insertions(+), 470 deletions(-) delete mode 100644 components/search.tsx create mode 100644 components/search/algoliaSearch.tsx create mode 100644 components/search/context.ts create mode 100644 components/search/dummy.tsx create mode 100644 components/search/hit.tsx create mode 100644 components/search/index.tsx create mode 100644 components/search/noResults.tsx create mode 100644 components/search/noResultsBoundary.tsx create mode 100644 components/search/sectionIcon.tsx create mode 100644 components/search/useHit.ts create mode 100644 components/search/useSearch.ts create mode 100644 components/search/validation.ts create mode 100644 components/search/withInstantSearch.tsx create mode 100644 populate-algolia/getAlgoliaClient.mts delete mode 100644 populate-algolia/getAlgoliaIndex.mts delete mode 100644 pre-build/searchIndex.mts create mode 100644 styles/search.scss create mode 100644 utils/algolia.ts diff --git a/.env.example b/.env.example index f1d0a2f..6bf42e8 100644 --- a/.env.example +++ b/.env.example @@ -7,7 +7,7 @@ NEXT_PUBLIC_GOOGLE_ANALYTICS_ID= LOG_PERF_METRICS=true HOST_NAME=webdoky.org DNS_EMAIL= -NEXT_ALGOLIA_APP_ID= -NEXT_ALGOLIA_INDEX=articles +NEXT_PUBLIC_ALGOLIA_APP_ID= +NEXT_PUBLIC_ALGOLIA_INDEX=articles ALGOLIA_ADMIN_KEY= -NEXT_ALGOLIA_SEARCH_KEY= +NEXT_PUBLIC_ALGOLIA_SEARCH_KEY= diff --git a/.env.local.example b/.env.local.example index 5a383dd..3c27853 100644 --- a/.env.local.example +++ b/.env.local.example @@ -10,7 +10,7 @@ NEXT_PUBLIC_GOOGLE_ANALYTICS_ID="" LOG_PERF_METRICS=true HOST_NAME=webdoky.org DNS_EMAIL=webdoky.org@gmail.com -NEXT_ALGOLIA_APP_ID= -NEXT_ALGOLIA_INDEX=articles +NEXT_PUBLIC_ALGOLIA_APP_ID= +NEXT_PUBLIC_ALGOLIA_INDEX=articles ALGOLIA_ADMIN_KEY= -NEXT_ALGOLIA_SEARCH_KEY= +NEXT_PUBLIC_ALGOLIA_SEARCH_KEY= diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 117dc48..be0dbbe 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -47,6 +47,13 @@ jobs: PATH_TO_LOCALIZED_CONTENT: "./external/translated-content/files" PATH_TO_ORIGINAL_CONTENT: "./external/original-content/files" + - name: Populates Algolia index + run: yarn populate-algolia + env: + NEXT_PUBLIC_ALGOLIA_APP_ID: ${{ vars.NEXT_PUBLIC_ALGOLIA_APP_ID }} + NEXT_PUBLIC_ALGOLIA_INDEX: ${{ vars.NEXT_PUBLIC_ALGOLIA_INDEX }} + ALGOLIA_ADMIN_KEY: ${{ secrets.ALGOLIA_ADMIN_KEY }} + - name: Builds static app run: yarn build env: @@ -56,6 +63,9 @@ jobs: PATH_TO_LOCALIZED_CONTENT: "./external/translated-content/files" PATH_TO_ORIGINAL_CONTENT: "./external/original-content/files" NEXT_PUBLIC_GOOGLE_ANALYTICS_ID: ${{ secrets.GOOGLE_ANALYTICS_ID }} + NEXT_PUBLIC_ALGOLIA_APP_ID: ${{ vars.NEXT_PUBLIC_ALGOLIA_APP_ID }} + NEXT_PUBLIC_ALGOLIA_INDEX: ${{ vars.NEXT_PUBLIC_ALGOLIA_INDEX }} + NEXT_PUBLIC_ALGOLIA_SEARCH_KEY: ${{ vars.NEXT_PUBLIC_ALGOLIA_SEARCH_KEY }} - name: Pushes to deployment repository uses: cpina/github-action-push-to-another-repository@main diff --git a/components/layoutHeader.tsx b/components/layoutHeader.tsx index 6b12a56..7a1d71e 100644 --- a/components/layoutHeader.tsx +++ b/components/layoutHeader.tsx @@ -9,8 +9,9 @@ import classNames from 'classnames'; export default function LayoutHeader() { const router = useRouter(); const currentRoute = router.asPath; - const nav: { path: string; title: string }[] = process.env - .mainNav as unknown as { + const nav: { path: string; title: string }[] = JSON.parse( + process.env.mainNav + ) as { path: string; title: string; }[]; diff --git a/components/search.tsx b/components/search.tsx deleted file mode 100644 index fa0a267..0000000 --- a/components/search.tsx +++ /dev/null @@ -1,168 +0,0 @@ -import Fuse from 'fuse.js'; -import { SearchIcon } from './icons'; -import { useEffect, useRef, useState } from 'react'; -import { useRouter } from 'next/router'; -import classNames from 'classnames'; -import Link from 'next/link'; -import { ChevronRightIcon } from './icons'; - -interface FuseInterface { - search: (_query: string) => unknown[]; -} - -export default function Search() { - const [searchData, setSearchData] = useState(null); - const router = useRouter(); - const [query, setQuery] = useState(''); - const [focusIndex, setFocusIndex] = useState(-1); - const [focused, setFocused] = useState(false); - const [results, setResults] = useState([]); - const [searchIndex, setSearchIndex] = useState(); - const searchInput = useRef(); - - useEffect(() => { - if (searchData) { - setSearchIndex( - new Fuse(searchData, { - keys: ['slug', 'title', 'path'], - threshold: 0.25, - }) - ); - } else { - fetch('/_data/search-index.json') - .then((res) => res.json()) - .then(({ data }) => { - setSearchData(data); - }); - } - }, [searchData]); - - useEffect(() => { - if (searchIndex) { - const searchResults = searchIndex.search(query).slice(0, 15); - setResults(searchResults); - } - }, [searchIndex, query]); - - const increment = () => { - if (focusIndex < results.length - 1) { - setFocusIndex(focusIndex + 1); - } - }; - const decrement = () => { - if (focusIndex >= 0) { - setFocusIndex(focusIndex - 1); - } - }; - - const go = () => { - // Do nothing if we don't have results. - if (results.length === 0) { - return; - } - - let result; - - // If we don't have focus on a result, just navigate to the first one. - if (focusIndex === -1) { - result = results[0]; - } else { - result = results[focusIndex]; - } - - router.push(result.path); - - // Unfocus the input and reset the query. - searchInput?.current?.blur(); - // this.$refs.input.blur(); - setQuery(''); - }; - - const showResult = focused && query.length > 0; - - const keybrControlsHandler = (evt) => { - if (evt.key === 'ArrowDown') { - increment(); - } - if (evt.key === 'ArrowUp') { - decrement(); - } - if (evt.key === 'Enter') { - go(); - } - }; - - return ( -
- - {showResult && ( -
-
    - {results.length === 0 ? ( -
  • - Немає результату для запиту{' '} - {query}. -
  • - ) : ( - results.map((result, index) => ( -
  • setFocusIndex(index)} - onMouseDown={() => go()} - > - - - {result.title} - - - {result.path} - - - -
  • - )) - )} -
-
- )} -
- ); -} diff --git a/components/search/algoliaSearch.tsx b/components/search/algoliaSearch.tsx new file mode 100644 index 0000000..d9e15d6 --- /dev/null +++ b/components/search/algoliaSearch.tsx @@ -0,0 +1,121 @@ +import classNames from 'classnames'; +import type { MenuItem } from 'instantsearch.js/es/connectors/menu/connectMenu'; +import { useMemo } from 'react'; +import { + Hits, + type HitsProps, + Menu, + PoweredBy, + SearchBox, + type SearchBoxProps, + useInstantSearch, +} from 'react-instantsearch'; + +import Hit from './hit'; +import NoResults from './noResults'; +import NoResultsBoundary from './noResultsBoundary'; +import type { Hit as HitType } from './validation'; + +import 'instantsearch.css/themes/satellite.css'; + +const SEARCH_BOX_CLASS_NAMES: SearchBoxProps['classNames'] = { + input: + 'block w-full py-2 pl-10 pr-4 border-2 rounded-lg bg-ui-sidebar border-ui-sidebar focus:bg-ui-background', + submitIcon: + 'absolute inset-y-0 left-0 flex items-center justify-center px-3 py-2 opacity-50', +}; + +const SECTION_LABELS: Record = { + css: 'CSS', + glossary: 'Глосарій', + guide: 'Посібники', + html: 'HTML', + javascript: 'JavaScript', + svg: 'SVG', +}; + +const PAGE_TYPE_LABELS: Record = { + 'css-at-rule': 'Директиви CSS', + 'css-function': 'Функції CSS', + 'css-module': 'Модулі CSS', + 'css-property': 'Властивості CSS', + 'css-pseudo-class': 'Псевдокласи CSS', + 'css-pseudo-element': 'Псевдоелементи CSS', + 'css-selector': 'Селектори CSS', + 'css-shorthand-property': 'Властивості-скорочення CSS', + 'css-type': 'Типи CSS', + 'glossary-definition': 'Визначення глосарія', + 'glossary-disambiguation': 'Уоднозначнення глосарія', + guide: 'Посібники', + 'javascript-class': 'Класи JavaScript', + 'javascript-constructor': 'Конструктори JavaScript', + 'javascript-instance-method': 'Методи примірників JavaScript', + 'javascript-language-feature': 'Мовні особливості JavaScript', + 'javascript-namespace': 'Простори імен JavaScript', + 'javascript-operator': 'Оператори JavaScript', + 'javascript-statement': 'Інструкції JavaScript', + 'javascript-static-method': 'Статичні методи JavaScript', + 'html-attribute': 'Атрибути HTML', + 'html-attribute-value': 'Значення атрибутів HTML', + 'html-element': 'Елементи HTML', + 'landing-page': 'Цільові сторінки', +}; + +function transformSectionItems(items: MenuItem[]) { + return items.map((item) => ({ + ...item, + label: SECTION_LABELS[item.label] || item.label, + })); +} + +function transformPageTypeItems(items: MenuItem[]) { + return items.map((item) => ({ + ...item, + label: PAGE_TYPE_LABELS[item.label] || item.label, + })); +} + +export default function AlgoliaSearch({ isFocused }: { isFocused: boolean }) { + const hitsClassNames = useMemo['classNames']>( + () => ({ + item: 'border-ui-sidebar border-b', + list: 'px-4 py-2 m-0', + }), + [] + ); + const { + indexUiState: { menu: { section } = {} }, + } = useInstantSearch(); + return ( + <> + +
+ + + {section && ( + + )} + }> + + +
+ + ); +} diff --git a/components/search/context.ts b/components/search/context.ts new file mode 100644 index 0000000..75a03e4 --- /dev/null +++ b/components/search/context.ts @@ -0,0 +1,8 @@ +import { type Dispatch, type SetStateAction, createContext } from 'react'; + +const SearchFocusedContext = createContext<{ + isFocused: boolean; + setIsFocused: Dispatch>; +}>({ isFocused: false, setIsFocused: () => {} }); + +export default SearchFocusedContext; diff --git a/components/search/dummy.tsx b/components/search/dummy.tsx new file mode 100644 index 0000000..41ecf6b --- /dev/null +++ b/components/search/dummy.tsx @@ -0,0 +1,62 @@ +import { useCallback, useContext } from 'react'; + +import SearchFocusedContext from './context'; + +export default function SearchDummy() { + const { isFocused, setIsFocused } = useContext(SearchFocusedContext); + const handleFocus = useCallback(() => setIsFocused(true), [setIsFocused]); + return ( +
+
+ + + +
+
+ ); +} diff --git a/components/search/hit.tsx b/components/search/hit.tsx new file mode 100644 index 0000000..b801c82 --- /dev/null +++ b/components/search/hit.tsx @@ -0,0 +1,31 @@ +import classNames from 'classnames'; +import type { Hit as HitType } from 'instantsearch.js'; +import Link from 'next/link'; +import { Highlight, Snippet } from 'react-instantsearch'; + +import SectionIcon from './sectionIcon'; +import useHit from './useHit'; +import type { Hit } from './validation'; + +export default function Hit({ hit }: { hit: Hit & HitType }) { + const { handleClick, isLoading } = useHit(); + return ( + +
+

+ + +

+ + +
+ + ); +} diff --git a/components/search/index.tsx b/components/search/index.tsx new file mode 100644 index 0000000..79d9ff7 --- /dev/null +++ b/components/search/index.tsx @@ -0,0 +1,18 @@ +import SearchDummy from './dummy'; +import useSearch from './useSearch'; +import withInstantSearch from './withInstantSearch'; + +function Search() { + const { AlgoliaSearch, handleFocus, isFocused, rootReference } = useSearch(); + return ( +
+ {typeof AlgoliaSearch === 'function' ? ( + + ) : ( + + )} +
+ ); +} + +export default withInstantSearch(Search); diff --git a/components/search/noResults.tsx b/components/search/noResults.tsx new file mode 100644 index 0000000..28f6176 --- /dev/null +++ b/components/search/noResults.tsx @@ -0,0 +1,13 @@ +import { useInstantSearch } from 'react-instantsearch'; + +export default function NoResults() { + const { indexUiState } = useInstantSearch(); + + return ( +
+

+ На запит {indexUiState.query} нічого не знайдено. +

+
+ ); +} diff --git a/components/search/noResultsBoundary.tsx b/components/search/noResultsBoundary.tsx new file mode 100644 index 0000000..26694f7 --- /dev/null +++ b/components/search/noResultsBoundary.tsx @@ -0,0 +1,25 @@ +import type { ReactNode } from 'react'; +import { useInstantSearch } from 'react-instantsearch'; + +export default function NoResultsBoundary({ + children, + fallback, +}: { + children: ReactNode; + fallback: ReactNode; +}) { + const { results } = useInstantSearch(); + + // The `__isArtificial` flag makes sure not to display the No Results message + // when no hits have been returned. + if (!results.__isArtificial && results.nbHits === 0) { + return ( + <> + {fallback} + + + ); + } + + return <>{children}; +} diff --git a/components/search/sectionIcon.tsx b/components/search/sectionIcon.tsx new file mode 100644 index 0000000..466c068 --- /dev/null +++ b/components/search/sectionIcon.tsx @@ -0,0 +1,60 @@ +const icons: { [key: string]: JSX.Element } = { + css: ( + + + + ), + glossary: ( + + + + ), + guide: ( + + + + ), + html: ( + + + + ), + javascript: ( + + + + ), + svg: ( + + + + ), +}; + +export default function SectionIcon({ sectionName }: { sectionName: string }) { + return icons[sectionName] || null; +} diff --git a/components/search/useHit.ts b/components/search/useHit.ts new file mode 100644 index 0000000..479c51a --- /dev/null +++ b/components/search/useHit.ts @@ -0,0 +1,26 @@ +import { useRouter } from 'next/router'; +import { useCallback, useContext, useEffect, useState } from 'react'; + +import SearchFocusedContext from './context'; + +export default function useHit() { + const router = useRouter(); + const { setIsFocused } = useContext(SearchFocusedContext); + const [isLoading, setIsLoading] = useState(false); + const handleLoadingEnded = useCallback(() => { + setIsLoading(false); + router.events.off('routeChangeComplete', handleLoadingEnded); + setIsFocused(false); + }, [router.events, setIsFocused]); + const handleClick = useCallback(() => { + setIsLoading(true); + router.events.on('routeChangeComplete', handleLoadingEnded); + }, [router.events, handleLoadingEnded]); + useEffect( + () => () => { + router.events.off('routeChangeComplete', handleLoadingEnded); + }, + [router.events, handleLoadingEnded] + ); + return { handleClick, isLoading }; +} diff --git a/components/search/useSearch.ts b/components/search/useSearch.ts new file mode 100644 index 0000000..7e9ddf6 --- /dev/null +++ b/components/search/useSearch.ts @@ -0,0 +1,49 @@ +import { + type FC, + useCallback, + useContext, + useEffect, + useRef, + useState, +} from 'react'; + +import SearchFocusedContext from './context'; + +export default function useSearch() { + const rootReference = useRef(null); + const [AlgoliaSearch, setAlgoliaSearch] = useState | null>(null); + const { isFocused, setIsFocused } = useContext(SearchFocusedContext); + useEffect(() => { + if (AlgoliaSearch || !isFocused) { + return; + } + import('./algoliaSearch') + .then((mod) => { + setAlgoliaSearch(() => mod.default); + }) + .catch(console.error); + }, [AlgoliaSearch, isFocused]); + const handleOutsideClick = useCallback( + (event) => { + if ( + !rootReference.current || + !rootReference.current.contains(event.target) + ) { + setIsFocused(false); + } + }, + [setIsFocused] + ); + useEffect(() => { + if (isFocused) { + document.addEventListener('click', handleOutsideClick); + } + return () => { + document.removeEventListener('click', handleOutsideClick); + }; + }, [handleOutsideClick, isFocused]); + const handleFocus = useCallback(() => setIsFocused(true), [setIsFocused]); + return { AlgoliaSearch, handleFocus, isFocused, rootReference }; +} diff --git a/components/search/validation.ts b/components/search/validation.ts new file mode 100644 index 0000000..5574b5e --- /dev/null +++ b/components/search/validation.ts @@ -0,0 +1,8 @@ +export interface Hit { + content: string; + description: string; + section: string; + slug: string; + title: string; + [key: string]: unknown; +} diff --git a/components/search/withInstantSearch.tsx b/components/search/withInstantSearch.tsx new file mode 100644 index 0000000..3410498 --- /dev/null +++ b/components/search/withInstantSearch.tsx @@ -0,0 +1,38 @@ +import { type FC, useMemo, useState } from 'react'; +import { InstantSearch } from 'react-instantsearch'; + +import { getAlgoliaIndexName, getAlgoliaClient } from '../../utils/algolia'; +import SearchFocusedContext from './context'; + +const FUTURE = { + preserveSharedStateOnUnmount: true, +}; + +export default function withInstantSearch>( + Component: FC +) { + function WithInstantSearch(props: T) { + const searchClient = useMemo(() => getAlgoliaClient(), []); + const indexName = useMemo(() => getAlgoliaIndexName(), []); + const [isFocused, setIsFocused] = useState(false); + const searchFocusedValue = useMemo( + () => ({ isFocused, setIsFocused }), + [isFocused, setIsFocused] + ); + return ( + + + + + + ); + } + WithInstantSearch.displayName = `withInstantSearch(${ + Component.displayName || Component.name || 'Component' + })`; + return WithInstantSearch; +} diff --git a/hashes.json b/hashes.json index 29da831..c1de66a 100644 --- a/hashes.json +++ b/hashes.json @@ -1 +1,523 @@ -{"Web":"a4438dc79c873e12e8c755cc3777cb2e571d360057874ca9d2d22138827bf68b","Web/HTML":"3cc99b6bd6ed25eba04d45c9db8327219522299871118edc9f44690c293651a2","Web/JavaScript":"a8d0fd64998e5f4deee8f90a4db0e19c8bbe742e126fd3503372a2beccfa7d24","Web/SVG":"c9288364726045ee96a77b948d3ab79b1b231064432df237648e01ef69059b19","Glossary":"a5b2955105615ee9a2806cf0ccb7f090ba8ad97ceaee0f2da81a5bd81f3e571f","Web/CSS":"af01ffa1cd5d24e6869f50a1c9ceb18f198323eb06c5fe5bfa784fea8018ca14","Web/HTML/Block-level_elements":"889bc45ba96428e67566d7afb4ccf6e15f7b513e7a0397c4e94147b438bcbffd","Web/HTML/Global_attributes":"2fcbf7eb3250f5b45eb9821411e8a317d0041ac37a42a43a2aa8085ee0d41c1b","Web/HTML/Element":"a4c6d7f979c2fad47634dfa3d17c4a3fa2a02188f33f295cf0406d3819575deb","Web/JavaScript/Closures":"66262715ecd3fa043afa72aee653d9532a03a8b113280d40277facfa3ea0ae9d","Web/JavaScript/Data_structures":"68c8a7249c00af753b9d2a528ad5d79352993b0872514372d2767e6103df8e48","Web/JavaScript/Guide":"75152928dfd095e30dfa03be9696fd27118205e720a6a869005b27ed0e40b55e","Web/JavaScript/Reference":"dd6fa8c6ebc4f8eff16667d7f09dc495ab5a1c357998856e533c5648e40b0737","Web/CSS/-moz-float-edge":"bd404409da8441a85631c018f55f1edcc8756913c4acfe6f86886760bb670479","Web/CSS/--*":"68ea26e5e7e4e5fe3d1a1a3eb97d646f52d885701f16847a95ba5f0e7a626000","Web/CSS/-moz-force-broken-image-icon":"927d36d975b3455ec13759bed760751b514d3a230219963b5c8f8414621f3de0","Web/CSS/-moz-image-rect":"cf00a463d084baeeaec662bd0c7204ae1d5e60895231370f4b7d832cb08009a5","Web/CSS/-moz-image-region":"1ee6373680166a33bebe0eb8e0325c18fe391661b7dd2000f92acfe35d889bf0","Web/CSS/-moz-orient":"1ca8cba4e11e8fb6b5317dc63bd72570bccec4e54e94eeeaefc5b665da3c897a","Web/CSS/-moz-outline-radius-bottomleft":"bfb2683202d527f43c795fc716309b386d0f96fbc7b47e6adeb5a6c818578fbf","Web/CSS/-moz-outline-radius-bottomright":"1ba6bab0ff38cc984bc18f57aa4f00e6097b1c066cd5b7c1d7fc339c7ffa3062","Web/CSS/-moz-outline-radius-topleft":"15cd1b2d424b6c6e51efef947459ce1c6cfe0b295eef674f92268b6d046d25dc","Web/CSS/-moz-outline-radius-topright":"137989425d2f0c72c17c40e88e06fd4228908b8b0a6d79d5534958152dd3fb25","Web/CSS/:nth-child":"7890c981218f9dfcdb69d129f55d95c0d0bfae845aaea8cff1e067dc49ab3fc9","Web/CSS/CSS_Grid_Layout":"4e5bc9e404c83159f849efa5ff662f3f23e12af83281821eff8735e6a2e06e2e","Web/CSS/Reference":"43e30eddcd9a21e121cbfcf526b5204aecc2f54a02ba74d0736cc32532d8da34","Web/CSS/Specificity":"bad9fca456773afdae587d996d7ea620afa8d8f426a14c9352a6a2c83ff44608","Web/CSS/Using_CSS_custom_properties":"86dbe818f986e2ce902497dae227f3cf59de17268d22cebeedf338143e005318","Web/CSS/Value_definition_syntax":"878575a8dd7c10531c8e5c49811088516c2c6d1a0b2a3c071897ad39174739d9","Web/CSS/align-items":"fa950fbe938807997fccf1590fb6c2db13d6dab6addeda1de622ce22a12d4a24","Web/CSS/background":"4be7a77edd9647385bd1a0ba20c6db635b2bb8e4ac7bee0405656066048f801e","Web/CSS/background-color":"0526fabd687b8bfecebd3420ab48e36cdd010a06f46764f80ca1d0854763e55c","Web/CSS/background-image":"42e279aac722a20e0546aeab2ebe9248ec1047c8021dddd867a3f6246a6f911d","Web/CSS/background-size":"8d465874300bda14beb88a5ed9917763049c2fc0a23ecc900a40ced2879bca11","Web/CSS/border":"59dbc5dd0b5c55a382d16630be2fa72db2e0407343057987c93a00850f6f80df","Web/CSS/border-radius":"aafd691940175bbba9701bf67e3207b0e357bc4191b23697c5e86fd3d0c3827a","Web/CSS/box-shadow":"0a2179a22f6a329c135b992d5b4d298e4382d1b433cc0515655b19649d17bd40","Web/CSS/box-sizing":"a8ad3e1bf8928e8f5b4d3c7386ce6768480d6e0246cdede59e1d15aca6489e3f","Web/CSS/color":"ffc45524dbba1de4a76578ae65ccac485dc84902dfe658b6782d9434d9b32f56","Web/CSS/color_value":"9fc36aaca9890f23358e57baf120a61fe66cf75fb7ab0b7f1da3966b3e88d93b","Web/CSS/cursor":"921c8c03f4622ef94bf957bbe2db1d9d5f3f87d33690ad0bb0a34d5774825ae0","Web/CSS/display":"dafc3ef8f76ff139b958cc3efd23aa188c42ad3c8948aeb5b0dd96442492b66e","Web/CSS/flex":"fe6f56b962a5e699aad39c4142c5c5107e83528a19149fac7b60277adc5238fa","Web/CSS/font-family":"415d4a4dcea0dce89f813d1ff0cd23b277f7e2433858f835e57e70833029bd47","Web/CSS/font-size":"f2c81c32bd3dd297b8f4bfc7a5f6366c4a68e517b847c4d268020e487a7d1a67","Web/CSS/font-weight":"4f8ffeab40c70a041361cc49b0133489aa7c260f025e1b68922f106899b40432","Web/CSS/grid-template-columns":"05f5d2fcb7f8092fbb956327d0db3268f8694ded5b92500724129a318bfafe02","Web/CSS/height":"36c39b03e47440b1d3bbc0e839d70b39b3a391b01e6e1aceff474abdd281aa62","Web/CSS/justify-content":"63e0dd876a4d008bd1c42084c83b4cc4f8504b0e284d17a1b2ee6091d892c9b6","Web/CSS/line-height":"aae8acb9639981b07f205282303000ff885b83c0eed7c47561fd974c7b2f932a","Web/CSS/margin":"27e9b94e2357cf508a8305aeec84a5e29da3a92f266fa5f8867688d036271305","Web/CSS/object-fit":"632d9558100488debcb8fe58f1ced33fc0bd2f9b2ae7730d86475be73464e71d","Web/CSS/overflow":"9fc6a15afdf0f6071ed63f9ffac3b95196151d6f53cbbc6b7f6f2064f634105f","Web/CSS/padding":"b6366ac445b5b20cabf968c0b09f62112a53b10e62f6752061ccaabf818b8969","Web/CSS/percentage":"ebccc67d8e4db1301432706eb6ebc4ee290777933a0769a2672f3afb674c2da8","Web/CSS/position":"eefa923ac58d790460943ffdf93efe1cc1d35e3448bc60dab44d3695734f9b7e","Web/CSS/text-align":"48ec7e513e9ca0a14477f7f9554e5c2acdcb2dac0211f22ae6d76e2b19e91b2d","Web/CSS/text-decoration":"206c4d3053c5cda7321a21efc569c8db6ed636c7a0c792cae317bf1925b76701","Web/CSS/text-overflow":"f8f307432e067e094003d6af2518bfbc8d91878d6e09c76c4e9c08dca0cb4725","Web/CSS/transform":"4207b7485a846ab35c9bb0a9abd60af3b1db48f95f7f5eecba3b254a1cade02f","Web/CSS/vertical-align":"d75eb92dc26a0628c8280852d1e1a2ded3aaae9e1cfee9413f7a08c59b1dad63","Web/CSS/width":"28bcc7f7c3334b4e0cc160d7c23bf54d351968d47067776d3b80104c9324e386","Web/HTML/Global_attributes/class":"7920f9ee3fc034805191ac13d330b32adf9c79e4b2269e9c32920724ad7610cf","Web/HTML/Element/Heading_Elements":"181376568a2e60c2bea3c6719c0f7a7e66f7b2433b42e6e063e6b856cab3f7ae","Web/HTML/Element/a":"b42ae5bb527c15f185757d2c49eafaa45391b20e8eacddb0b3d5e71450c972fc","Web/HTML/Element/br":"37e2638109550fae389c905f37b7b13318a685f522d19751c76fb15eb8cd96e7","Web/HTML/Element/button":"3a2589449778ee986fafd87b692ea5109469b06a4d51098dfe33eacca18ad757","Web/HTML/Element/div":"70c8d2e91ee051345d96e7f0e82cfea7251311f2e71b37fe40051f9cd2a5e3d7","Web/HTML/Element/form":"e02fa66b8f1edeead93a40601420fef90fc121a645b7994b31d0def64f4ff18f","Web/HTML/Element/hr":"c7e6d31783c9cd0b6dace71d236f59b3f3424936af617b795e5a95a4b114a77d","Web/HTML/Element/iframe":"a578f519a255386d010900ad7e5ebb5cc1486f8bff6c333ff844305b4a05ca80","Web/HTML/Element/img":"a34ccd3c3085e83059307dde400c94a428cc9acadb09b77b0941aeb374dbf497","Web/HTML/Element/input":"9e87a3e4e12f40d8733b75c15f984705c89f0683943bd25cb276c7f7fdbb0453","Web/HTML/Element/label":"90d58fcb4b54c7e3f03cf615b587adf5c774cbb80077e08dd1a85dca9f2fe5ad","Web/HTML/Element/link":"770b30ee63929198438fbd44feb171c4ec9610f765852e6db98da6c1847119f0","Web/HTML/Element/p":"e89ea1447124553cad0307ac916add313e06913884034d6322e241a2f88f4d0c","Web/HTML/Element/script":"9ecbcf7bf3d6ce47f1fed0f90b9547feff0646e56ea3e88026009e86e2294594","Web/HTML/Element/select":"d13925a89bd0775a95eec45cef50e0efde10be47bc778eebaeba672d293901ae","Web/HTML/Element/span":"3ed5811aaca143e946f21854b1998b5854d568687768c11064e0ee8bcc3be207","Web/HTML/Element/table":"e2928c11f09a5913cdd401c738883d9270c9986dfb0dc25af9ed7126429a138c","Web/HTML/Element/textarea":"11015f91fb852f76acb8470511c6aef16f64d5229e75d53cf5e606524ff0f512","Web/HTML/Element/ul":"a818b0def0d3da00023fbcdc9bab4b89102ce3afdc248f95f6f4ec056bf51ff4","Web/HTML/Element/video":"42fd80e1a69ea16ebcd4ced6ceec2c64f0d9ca97d8a1dacc31891773d3119dad","Web/JavaScript/Guide/Functions":"042500a37250e7fdf0764818a2a0da8e5e955643e7063a27930aeb1723b8c4c7","Web/JavaScript/Guide/Loops_and_iteration":"c6e09761ba7fe210c5b83217247693e55e77a54f969bb110b9c001724972a1fb","Web/JavaScript/Guide/Modules":"83ec44a5e88215d640e677f34b8a4f5f690aa259bd424cac66ca1304c0ba4b7a","Web/JavaScript/Guide/Regular_Expressions":"67e6e639a60613659974c1dce7df6dffa52e38e3f6e72ea2ed5638779552a540","Web/JavaScript/Guide/Using_promises":"6747f7f133ab10c20b0e3ed3c9eecc95683abdc417f27f37ed9563d1f132e30c","Web/JavaScript/Reference/Classes":"f97a9163455fb0e62b742cc65e74e3bc634cfda3ac3fbcf5494548aac02873b5","Web/JavaScript/Guide/Working_with_Objects":"d0ebc2f6042cc35a93a406d8eeabf47d7cd77e43085eea922d8d6cbedc572b45","Web/JavaScript/Reference/Global_Objects":"61eb207442ee48d50b500958aa9ec1d20bfb771792ee4af3514d56b4769c09c3","Web/JavaScript/Reference/Statements":"066d5b0eb198adf95e7ac13b4f180710be44d95565f3e6c33d7ea474a1b78df1","Web/JavaScript/Reference/Operators":"331e9230e7551b5e54d6305e03a5ad8ed07539e16fc0cc4088bab42383f7f133","Web/JavaScript/Reference/Template_literals":"d7d245b26ee262df83fc582ccbb26c08e2314d8d8d041836b585d4f170171d1f","Web/CSS/CSS_Animations/Using_CSS_animations":"5b2490f7e563ccf54fcdfa3eca30fe98f1cb3fdcd5e21a3d16c9e5fd5f800920","Web/CSS/CSS_Backgrounds_and_Borders/Resizing_background_images":"4ee3a0d5196d8e346c569d605a32684cd9a81fc319a87a571c31fd860f0cec77","Web/CSS/CSS_Flexible_Box_Layout/Basic_Concepts_of_Flexbox":"8eba021e65244bf980b2b0e1d11e609414ebb0b5032e5ce90cca4f0788906acd","Web/CSS/CSS_Flexible_Box_Layout/Aligning_Items_in_a_Flex_Container":"483c2bdea58c7f872776b26ddef560f00c1d153650c6ea4c18c56f8d9c5d853e","Web/CSS/CSS_Grid_Layout/Basic_Concepts_of_Grid_Layout":"d17f0fd2f3eab4af081819dd9ccaa815ccc72e00d41473cd0ae04535100ec08c","Web/CSS/CSS_Transitions/Using_CSS_transitions":"65341a0c6e3b631ec40df96fe04c802db1be31250dfa5039b420496254c585d5","Web/CSS/Media_Queries/Using_media_queries":"df2e6e5b3c9a69a1d76b8402421d37dcbdce6be3716994f2a16dac44c9821592","Web/CSS/gradient/linear-gradient":"a76edbf3a1143adf3a22fb9b422d6ac3b626c5b97cfca669ea662613ebf4b456","Web/CSS/transform-function/translate":"905c2c7551bc16e3fde57068e8950ab0f063c681c61036e2968cc9238d47d1e5","Web/HTML/Element/input/checkbox":"bb6e57719d7fee8323a815bb54e7f0852097caa2658bdf5ca2182532c1e634b7","Web/HTML/Element/input/date":"69ab3183b48b68b4d0d9d11bb54e4b49a0ecced0e6cdf4328681d237b6ed7c4e","Web/HTML/Element/input/file":"f25a2b7aeab4a4c07c6c4b479e0a9e371085f8543c6fa474de6362aa2254ea6a","Web/HTML/Element/input/number":"2e6e04ef5082e7067a4bd56608b73093bbda94feb8170ad5b115a11262deca35","Web/HTML/Element/input/radio":"70a7628d38ebc0236d737dae58e2b4b638c64f6eda2ec99ca14b339d55b065e9","Web/JavaScript/Reference/Functions/Arrow_functions":"5be6190aed6bdeb1b4d6b76e4d6162ec3cb7e9aa3ba053881a08b667e4d95f94","Web/JavaScript/Reference/Global_Objects/Array":"6ec0ff308ea967b7a6f34ace7bd9bbe390690161d09ba75a6e91e4c3e71cfbe0","Web/JavaScript/Reference/Global_Objects/Date":"736646280283c4f06be458e83d73d94526494255ee206a726a9b0e7199bd1597","Web/JavaScript/Reference/Global_Objects/Map":"07d89f178632edf9b651a3b2c36c55251d25bb10fe96aeb5c9010adb7dcf2acb","Web/JavaScript/Reference/Global_Objects/Math":"4ac1a127c536dfed26ff8c9f7871e39ae890464f6dc38fd1b61cf75ccb152051","Web/JavaScript/Reference/Global_Objects/Number":"f7d5381082cf30d8ace8ca6b6af6ed8bd3fb0b3819d39a0c13515f433bf2e597","Web/JavaScript/Reference/Global_Objects/Object":"9d1f5f257d6add21011be1f522efde82152adca5ab0ce371074fee2b4f1d7af0","Web/JavaScript/Reference/Global_Objects/Promise":"6f09ad8e55e519e9b626dea9469c6a36f73ad6026b0b0be20ae9659f4a4ee392","Web/JavaScript/Reference/Global_Objects/Set":"ee1cc32404c3f3b0dbc8d521204951920e6ac94bed8808af5807fe3dc2dab30a","Web/JavaScript/Reference/Global_Objects/RegExp":"301c904788109dfc88f6a2b622792adf75b501af60d850b3593270c749b46b27","Web/JavaScript/Reference/Global_Objects/String":"acfcbb413a33ccc82c0190b5d6f0d909ccee87ce277c7fd208c43ed9894f040e","Web/JavaScript/Reference/Global_Objects/TypeError":"f300b6ee32909a4f433c1d684def811009e2c70d4778896ef00f9421eea3d551","Web/JavaScript/Reference/Global_Objects/encodeURIComponent":"ecc5b0f8d679bceac043fb9975ba84cf028ad5a3ef938e133a35449179ed10b0","Web/JavaScript/Reference/Global_Objects/parseInt":"0b57d1b649c4b4089cf4896c4cf0b8ab9ba4e1c7fb69f89c86c8ed73ff1043da","Web/JavaScript/Reference/Statements/async_function":"0ca2914416d72efa6a0c06fcb5404f03863b68c41ff65334f674b51ba89192de","Web/JavaScript/Reference/Statements/for...in":"004e6906515d18cfb2c30a50abbbd4eacbbe19e8c6b1e675cf52f7b9e5c1e318","Web/JavaScript/Reference/Statements/for...of":"9ac89722ee399896cd3c93fe6c94e1306970116e884833470464d1db83023734","Web/JavaScript/Reference/Statements/import":"3302f5f4fd16326fc40545f9c0fb4247a816adb3c7229d4ed6a4b14f2ec8ce8f","Web/JavaScript/Reference/Statements/switch":"a0169a16e1dde0b4ea43ee7b699960bcf1b0e50f53aa157882fa6f03b1e6db1f","Web/JavaScript/Reference/Statements/try...catch":"2fee7bf71e0d5e76ffcca8af40d8e8d799b3375607a7ad5ecab29631dfb6bfa1","Web/JavaScript/Reference/Operators/Conditional_Operator":"7315ad2734f43ded4cf2a9e1a12b0a7dbc713a3a51df6cbe18a6b7d4fa99adb1","Web/JavaScript/Reference/Operators/Destructuring_assignment":"33301d01f19575793f68bf16359203c0216d02bd94b9c8c3c4c4eb514028e652","Web/JavaScript/Reference/Operators/Optional_chaining":"4f82bac94770de426eb64bb4cbbd51b72271a1844632fb077d44047cbbe4b6b3","Web/JavaScript/Reference/Operators/Spread_syntax":"114d81991ea4b7da6941b6bc5426224f6b7df10a21018cac71b18ecc54fd209e","Web/JavaScript/Reference/Operators/typeof":"97a5310c11449caf7faad73248d23a6433e2eddf39f0148b142efcd8f24f16b1","Web/JavaScript/Reference/Global_Objects/Array/concat":"175778b6062a6acf119704895d72fc857a823cc7b0530ebc7db1e636751a16b5","Web/JavaScript/Reference/Global_Objects/Array/every":"9e914ea9f6e8d838851eefec1fc1101180433480164391fde855782e8fab8b12","Web/JavaScript/Reference/Global_Objects/Array/filter":"362a060f2a1601dd34809f436b410541e4ee5f172fda1182688eba7e003cd136","Web/JavaScript/Reference/Global_Objects/Array/find":"b869829bcc0f240ce0776add0ab519365984084faa3e6cbc5c52f8ce715f9223","Web/JavaScript/Reference/Global_Objects/Array/findIndex":"ca91101fe660b799b28bd6e65b9d27b978db0f7ccfa4ded20470f5466555758b","Web/JavaScript/Reference/Global_Objects/Array/flat":"345189d6535bb0bf6a0966f58173142e70a137ac143d408b96c3b86f1459baed","Web/JavaScript/Reference/Global_Objects/Array/forEach":"863fd08701be18b16d9a4bc134fa6e00cdff90cec5c9c3f8fbdb3c70e921217e","Web/JavaScript/Reference/Global_Objects/Array/from":"32f48ef231e940ab594aa71e99cb33391bfc682e3638b54deae3b07a6a092339","Web/JavaScript/Reference/Global_Objects/Array/includes":"b53bdf60090576fff7165d93794a0c1e2911f30e752602bc4405826f54c52d80","Web/JavaScript/Reference/Global_Objects/Array/indexOf":"6acfc013534ff199fddd80642c6e74e96ddcc9e6497399584597c278d96b4af6","Web/JavaScript/Reference/Global_Objects/Array/join":"29d32b2fd042358023e2ee5a1c9407c9fba83426f78905552d8601e915da8104","Web/JavaScript/Reference/Global_Objects/Array/isArray":"55c0453b77105d0dd8da27b7d2e5bef0627a960ff4551b98c80988a7e064b660","Web/JavaScript/Reference/Global_Objects/Array/length":"bdce4737b2d909c202b92db6553818fd1454cd85736245591c98c5bd3eb55e55","Web/JavaScript/Reference/Global_Objects/Array/map":"3ecc33bc0e977aefac470cb0d4fcbe5ef430cbac42cd0a2fd32a7a9e3aafda20","Web/JavaScript/Reference/Global_Objects/Array/pop":"275f512314ebee44305c214476b458abe3d61779670c5255b858bba0d6548212","Web/JavaScript/Reference/Global_Objects/Array/push":"bb8f8c42610dad2ea96c2c8efef7fc300762c2523bf41842b0e6446e391544d9","Web/JavaScript/Reference/Global_Objects/Array/reduce":"44ddd4675000e6d109c7e0e79d3ae8d2ebcb8840811dbd46109b411f8cdb3607","Web/JavaScript/Reference/Global_Objects/Array/shift":"cf095ddb4d0d9b8e27bfd08a6769815a5b68b9655ec5a7f596f228a798773cd6","Web/JavaScript/Reference/Global_Objects/Array/slice":"3564592eb019e3215461ef8b99ed8ec468b7974a764d1dc05d751103215ccd43","Web/JavaScript/Reference/Global_Objects/Array/some":"95baf2604c15ef5b60e4d9fde49db1690d4063f2ed02fafbbea2614f319b9dd5","Web/JavaScript/Reference/Global_Objects/Array/sort":"ec90f1bb49300fd7a1cdd199cd0f481ce15a841b071e812329fa272f4aad7bd1","Web/JavaScript/Reference/Global_Objects/Array/splice":"b2c39bfc86d0bebad304fee7d13157a0b7b418a2a8b947aaa7d5eafcc1b2e92e","Web/JavaScript/Reference/Global_Objects/Date/Date":"d60f3c09dd8ea527169f7d890b3648d31732564195266677a3321fd82b7875c1","Web/JavaScript/Reference/Global_Objects/Date/now":"bd76db0c80de07ef3e3b1b9fafe0b126cdc3ac69f2047790c444b197853d14d9","Web/JavaScript/Reference/Global_Objects/Date/parse":"212141c7147a5400c78337884380fe4fb211df65fd02279a56785edbded15239","Web/JavaScript/Reference/Global_Objects/Date/toISOString":"7aeea53036c3d7f540ed4d81c1bd74baa519b45621c8e8ac58ac5ee81b8cf6e1","Web/JavaScript/Reference/Global_Objects/JSON/parse":"408bf211025be5f70bd8545c0076222d8f4a0ab1200bf515fd4036cfa542c16b","Web/JavaScript/Reference/Global_Objects/JSON/stringify":"fbc5dd5e64c06bf56a7dd4fb332179e9f666e3dc9a25eb95d936bb9472e5be13","Web/JavaScript/Reference/Global_Objects/Math/E":"23a61815fae2c2834054f88be39eb78436a5cf4f7db393bb18814b4b84179698","Web/JavaScript/Reference/Global_Objects/Math/LN10":"5cc2654c52ef0a0d1dc18e77cd1a555b361382778b2bb2712300d8e748857b87","Web/JavaScript/Reference/Global_Objects/Math/LN2":"7f1f46a65c1e6ad4a4c5d80e3bf984e05c163932c90a75622aea00c1d7370865","Web/JavaScript/Reference/Global_Objects/Math/LOG10E":"066d55ea70cba9f1baa02bf6c3fa1e40e9df6b257bfdaa81ad340e315ce4e43b","Web/JavaScript/Reference/Global_Objects/Math/LOG2E":"b1f2db6aa91d5fc27e4e6372f06f9dfdf382814b27cdcf41b7bfc023fffb431f","Web/JavaScript/Reference/Global_Objects/Math/PI":"e1f91783001b9c06a6d92b415df0ba56ee382649f9a14a0d8a26169a4514adb2","Web/JavaScript/Reference/Global_Objects/Math/SQRT1_2":"971a03a127a9f44f960cd7f4b6208c4b211f136e4d5f81879bb002248241fcd2","Web/JavaScript/Reference/Global_Objects/Math/SQRT2":"3344265ba1a4ba0e9ee0470341aa3103f190c41cdbb26c78bf20e32d05d20350","Web/JavaScript/Reference/Global_Objects/Math/abs":"80e0ac8740a50846ebb72e24f115aeedf89d357e59eda554b59c2152882705a3","Web/JavaScript/Reference/Global_Objects/Math/acos":"dfcfc5910cf4a342d42d10e43f43d3c953a788a74ff3398f3a27b27ebfecd4aa","Web/JavaScript/Reference/Global_Objects/Math/acosh":"66958a4ae7cfd4e3364879b65e49cc1fd11258a08f749e296c01dbb8a2cb2cef","Web/JavaScript/Reference/Global_Objects/Math/asin":"46c7980708aad4ac9eccb8fba17fdcfc574f9249eea02c8ffe96eb01054b93a2","Web/JavaScript/Reference/Global_Objects/Math/asinh":"a9c4c004fa7fa747dee2148936e5662fe8ec7124ad2e5fc048681d1a575c260f","Web/JavaScript/Reference/Global_Objects/Math/atan":"1c2e7d9e570f913f65abcb76b3655dcc224e2a31bc914e0ea378f9df9877ddeb","Web/JavaScript/Reference/Global_Objects/Math/atan2":"20ce96921decf78d474db1c08c38cd4065cfc96342ebec41ac924d81c4c8f934","Web/JavaScript/Reference/Global_Objects/Math/atanh":"e2e7e080be9612e33ae4cee3e22d92fea71370f5ee0a2472f6e26ecbd1ebd302","Web/JavaScript/Reference/Global_Objects/Math/cbrt":"54904f2f8095ecd71e560a1c02bf29888003f81197b7772ce10757a14910c6bf","Web/JavaScript/Reference/Global_Objects/Math/ceil":"9fbe0948d4c4cad2db8553b1f7ac8c86ab7ab1436d4c5889e3a56e7755b02bd3","Web/JavaScript/Reference/Global_Objects/Math/clz32":"e01404454098999780ba42fdd45196193d2e3a0fdff836e376d1c417012464b0","Web/JavaScript/Reference/Global_Objects/Math/cos":"1bca3a1b755bcc67f07746a0f89cb9fd0dc27b0d676111603a67a35034ce9b44","Web/JavaScript/Reference/Global_Objects/Math/cosh":"7615dd5e59b13773b49de653d1d5808e169a33fc7f0726e4861e295be0f8b23a","Web/JavaScript/Reference/Global_Objects/Math/exp":"fc936f0008876bfdd00daa24d937056ff5d78b3b54a85952ac471b978797f6ce","Web/JavaScript/Reference/Global_Objects/Math/expm1":"8a1067ea736767351ce5077b62be1c733e10a6e148f5318ec221d1524a22a997","Web/JavaScript/Reference/Global_Objects/Math/floor":"0f12856a0fb1435a94ae94a96d01b092d0c81b9bf0736c6aff98be525e8948de","Web/JavaScript/Reference/Global_Objects/Math/fround":"0ddf3de2ca53f08d216b242f4c411b9570752d9d2d86292ebceba57705e40d80","Web/JavaScript/Reference/Global_Objects/Math/hypot":"b99ace143f3fffceba3ef4e4c5c1d4491d6cbe3ccb164d9e83e2ccadcf86c96f","Web/JavaScript/Reference/Global_Objects/Math/imul":"6792f3465a67425d3c22f422bddbca677bdb4a09031be10254df5f3dbf5d624c","Web/JavaScript/Reference/Global_Objects/Math/log":"a336ee412d350735073870c9c0abca774bfe21e04a7d8bc429e0a224ee83efd2","Web/JavaScript/Reference/Global_Objects/Math/log10":"6dbc2df2f44a6d7bb1ba954c1c6517543ec997b7f571f3a57a8043a7bab0aed7","Web/JavaScript/Reference/Global_Objects/Math/log1p":"8d29ed6c792e40b996a0fd4b0425bc31c947fb5a4ce243e020093d34ce3d58c2","Web/JavaScript/Reference/Global_Objects/Math/log2":"f0e0fa595bbfb49ddbb2a5202c72a9b16ac9b8aa0e0760568c2170d8e462051d","Web/JavaScript/Reference/Global_Objects/Math/max":"d0e0095c0d3d06d6148d9a8f98344c4e063ff4596d37d377de0cdfa2000a8095","Web/JavaScript/Reference/Global_Objects/Math/min":"eadc193313904a1324c79d26e896be2e9017ae082b35b95e4c94dbe05ae30fcd","Web/JavaScript/Reference/Global_Objects/Math/pow":"3e8f7384cca03d5c9f50b421083287f83fec2529daf71cbe862a3326b2a3110d","Web/JavaScript/Reference/Global_Objects/Math/random":"558c5e9362310f38ac026994b862477d4688b743d653b09efd87bf6d0908a87d","Web/JavaScript/Reference/Global_Objects/Math/round":"def0d79f94b100a1b1e1da752f50470d86835d5a262b32d18d72250d641f3240","Web/JavaScript/Reference/Global_Objects/Math/sign":"9626b861397e9469bdd20c5c30de0ea45c61bcd08273c532a955fc9383e33ba8","Web/JavaScript/Reference/Global_Objects/Math/sin":"d45b935a2bca03149b1ce5ad06b8530546fbf5c83f4555994834d653e64cbb12","Web/JavaScript/Reference/Global_Objects/Math/sqrt":"003a4034eb1a94c48e4df00114be53a2f3951a150e5a5add21f9fe3161475e0a","Web/JavaScript/Reference/Global_Objects/Math/sinh":"fb88dd2cf6c47d31bf060cae73df730c88872c46c24f37d3cf47728991d48dad","Web/JavaScript/Reference/Global_Objects/Math/tan":"81d0143b6fedccecea551ab6e27a48a6f48bc0a3b572ec0597cb2b730ce4bc17","Web/JavaScript/Reference/Global_Objects/Math/tanh":"532215b7d88ddaae00e6115140558e0e04d15d822da83cf979ab528645e3c366","Web/JavaScript/Reference/Global_Objects/Math/trunc":"1cd304162d48f930aac93d7f4e4bd210c641ca488f2cfe0739fdfa8973c7be42","Web/JavaScript/Reference/Global_Objects/Object/assign":"dd7f577720921953432f963d25c5ea07fe3103e102890b6753c049388c92c9e4","Web/JavaScript/Reference/Global_Objects/Object/entries":"35d7dbebf09e9bf4c57fb952d8c04ae9c70754751a6fd5f622b45fd045f0947c","Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty":"4e6a04ee63fc7a98ad59cb88953f81673833cfd37bc5767fc4a7042134b75756","Web/JavaScript/Reference/Global_Objects/Object/keys":"be3f278a198c4ca6986a1c84575592aa58c6e9ca9a88415e6468ff34ac9b5aa1","Web/JavaScript/Reference/Global_Objects/Object/values":"1aebbf2b1174a8f0cb6d1ea1233d46503345a0b118f074cc1d90b3ce9b6dd49b","Web/JavaScript/Reference/Global_Objects/Promise/all":"41bad369c6ee19710aa1531400d442f5e48ba8f6459aaf745a9317196b40a39e","Web/JavaScript/Reference/Global_Objects/Promise/then":"cc44642a77a78ee9dcd2cd0f6948cd3de3a5a8c94c73e79784685dbe020420c3","Web/JavaScript/Reference/Global_Objects/String/@@iterator":"69c0fc90094bf0094228a5df93eb48a878e6409b3cb91403b013efe30ead5efc","Web/JavaScript/Reference/Global_Objects/String/String":"6cc8c30a16516cbd7750e4ae507197109e07594cfdbbc2050a345bf103a65d87","Web/JavaScript/Reference/Global_Objects/String/Trim":"1c97ea8446a978dde07a95623ab42aaf9057d48f4b3852c4e02f3bfa7cfcb8ca","Web/JavaScript/Reference/Global_Objects/String/anchor":"0e97f3e132137653a366c6aa91343196f470fc78c458e9740678b35d59c8ffc9","Web/JavaScript/Reference/Global_Objects/String/at":"f4fc2bcb73599c4f42364d49ef8582fe9d9678fe95b40781198ef5beae5e39f1","Web/JavaScript/Reference/Global_Objects/String/big":"c42905a297bbdb9238a604548d20f16e0d4b9258947997fc1697e950b12eb9c9","Web/JavaScript/Reference/Global_Objects/String/blink":"f9615606f8531dbcd9135487d57bb0029cf3f58f5e6bbf812550828940fff998","Web/JavaScript/Reference/Global_Objects/String/charAt":"48f3c075eff875ee7aa972692f1c6a4fb61a4011e4a0881fcf087e5d0606480c","Web/JavaScript/Reference/Global_Objects/String/bold":"8d819a99baaa4945309a86bfec997b1c4d4b91291758ec3b70b69e206b0a83f1","Web/JavaScript/Reference/Global_Objects/String/charCodeAt":"b9798029f2b512aaedc49ba3c4b33e03f89521077f6a2caab4952c0261786991","Web/JavaScript/Reference/Global_Objects/String/endsWith":"cacea00cf2c36be2de3e09e666122047776afc572e4465d43e8581c6326cc2b8","Web/JavaScript/Reference/Global_Objects/String/concat":"ffbac14db7ad14fcfb2d21d2ee9f1d227f6d3886e890e8fe7c55c737823aeaab","Web/JavaScript/Reference/Global_Objects/String/fixed":"bc614af58a76bff5785b0c454573755e06e7b21d75a18428063bdb70bbef7ae3","Web/JavaScript/Reference/Global_Objects/String/codePointAt":"141402969908a4156bce55c1eddda41c71c14e2f2676d0d0f1c4598c41b82201","Web/JavaScript/Reference/Global_Objects/String/fontcolor":"1a38b4c3e8be556f9299ba74fed83fc9f4a8914b5c3dc670643b1ebe25299ac4","Web/JavaScript/Reference/Global_Objects/String/fontsize":"265e44cd2673502ba6dc4b86e38a264cddf97196a15fabe232ced1854967bb07","Web/JavaScript/Reference/Global_Objects/String/fromCharCode":"1539a6009517e29b9979794a7a208a8008163dbc8085b8d287ae68cfb50aa994","Web/JavaScript/Reference/Global_Objects/String/fromCodePoint":"120845c83b339a85380b8d2645d002ad0f5d1a20e69a4534ff2f175df8988cac","Web/JavaScript/Reference/Global_Objects/String/includes":"206c9dd79921ce1cf44c1a3b5503e522cb40b9530b4ae5a79ea78d20ea9eebef","Web/JavaScript/Reference/Global_Objects/String/indexOf":"5eb12c3b3f91784a0dd0fc9105b7d19a027157644b34cca96406335e69f76f6c","Web/JavaScript/Reference/Global_Objects/String/italics":"03d62665c6fec1ba5a890e2e9aee4b30a2825cc8dc14eb6f7f038dae9a702b3b","Web/JavaScript/Reference/Global_Objects/String/lastIndexOf":"0d287bbcd8d54aba7c7305e88cea020669a84762c22e6942245989e69e76177f","Web/JavaScript/Reference/Global_Objects/String/length":"8747fa56d8d1127de9164c03eed8b333809cfcd44c28a52999da853258511501","Web/JavaScript/Reference/Global_Objects/String/link":"e62d4003c05f2f035d247a31975ed031aad3561ab57624098a9db21749d0e76a","Web/JavaScript/Reference/Global_Objects/String/localeCompare":"d48bd28dd42475f7367ca11bc7abe209c876f7ab7b36fcdd06d78a67fa739d24","Web/JavaScript/Reference/Global_Objects/String/match":"d20978813e9e8927e545f0543fc62de75c5523bc4ec4e0bdc205973561156761","Web/JavaScript/Reference/Global_Objects/String/matchAll":"4802602a267fa426b44ba6ab2e7077cb454a7a72bb7d46120cbf906c2d3236df","Web/JavaScript/Reference/Global_Objects/String/normalize":"bb92e06d8f05bd11767bacadc9b12a16ebb53b760cf6cb1c64bcbed665f4c10e","Web/JavaScript/Reference/Global_Objects/String/padStart":"ffb5fd76f61a81fbce1ce6f2e6bc07a60dedd0cbc75de67f6ca443be5325e7d0","Web/JavaScript/Reference/Global_Objects/String/padEnd":"f9d7c9ef2014ac54d6573e3712da86fb2fbdc0ea4afb030beb1e3e6eb0a49df0","Web/JavaScript/Reference/Global_Objects/String/repeat":"0fd9ef3ee932b8192ece871109adc7e241c23e2ff65834df3455745460eef727","Web/JavaScript/Reference/Global_Objects/String/replace":"780b3c13a442f072139e3a54a5c1d31dd0f01475a7153c1ffc9d1be8b10b774a","Web/JavaScript/Reference/Global_Objects/String/raw":"43e0b450d2a40056191d970c87f2f2059a997708f25d4ed2c9876116e0ee0bd0","Web/JavaScript/Reference/Global_Objects/String/replaceAll":"763cfbe0e09f92a766caa879a69416be699eadddb006528ca44fd1d4309be9bb","Web/JavaScript/Reference/Global_Objects/String/search":"44dc5b5d097d7ab7ad835a74de47df9336bafc8ea4f865353431a8767a40ef31","Web/JavaScript/Reference/Global_Objects/String/slice":"c3c96ce3356454d35746df0a12c9c1b27f8fa440e72e240ccdb78dbdccadb797","Web/JavaScript/Reference/Global_Objects/String/small":"2a93f47466a7eabfba376657c2df2cdfb0b90ad032364322aa95ccd160a3a8c2","Web/JavaScript/Reference/Global_Objects/String/startsWith":"1aaa93681205f7197b2ff638384b17477c33b24d88f4601b68500c7c3066599b","Web/JavaScript/Reference/Global_Objects/String/split":"ad6ef5c1deeeaa0a6f272fd824eb1d340e3a61d17d610cb864e86e4786986022","Web/JavaScript/Reference/Global_Objects/String/strike":"48908be24be00d2b5cbbf4e6f5f7c7f3c5c0567a64893ba93a2170f54a41187e","Web/JavaScript/Reference/Global_Objects/String/sub":"d7992b85cbb591ef67a3c729c62ef46835fc9f3eb0ceaf4237752575c66ea407","Web/JavaScript/Reference/Global_Objects/String/substr":"0425cc2ccbdef95d5289c09266cd7756d2f370dc370a0bf81ca92ebee9ed4732","Web/JavaScript/Reference/Global_Objects/String/substring":"82968da1306838235cdfeb77779dad007834f5b130497394b23949018a5f198c","Web/JavaScript/Reference/Global_Objects/String/sup":"96c204029fc160f853ee20cda57b53fae8d5d51e6b784f5e12756331a4ef2c03","Web/JavaScript/Reference/Global_Objects/String/toLocaleLowerCase":"9542c069df16b1112fbfdfc219b06a403c64b0f4250ff90f65116536c03f812a","Web/JavaScript/Reference/Global_Objects/String/toLocaleUpperCase":"9b9c2021d59730b059633df020800454bffb7a73fc2a0bb0de230e5cc28aef99","Web/JavaScript/Reference/Global_Objects/String/toString":"5709d2c5fcccee2709a75680f8ca3fccf20e7c27ec3960b35b1b039309b7f4d0","Web/JavaScript/Reference/Global_Objects/String/toUpperCase":"a32d349e1fbc76559368332941ea5feec5aab8cda2370f38eabc3ecf0776b8cd","Web/JavaScript/Reference/Global_Objects/String/toLowerCase":"29fd42aef13546267979336feffc47e79784d80de95768ce97fc73762ce6f939","Web/JavaScript/Reference/Global_Objects/String/trimStart":"87e94102cd705d4184fe6e897b2c3074594ef7c9c9f929de6788c39c9083bd3c","Web/JavaScript/Reference/Global_Objects/String/valueOf":"77adc466201a6cbfb8ebe159f4a4aaaa6901b4aae20726f586ac380b5a54475b","Web/JavaScript/Reference/Global_Objects/String/trimEnd":"acd095c8fe9bc8a80301971972bc9db3b5cd403b0338ad0522fe051d645d95eb"} \ No newline at end of file +{ + "Web": "58f6242847efb8013167f11b56bff0279ba41b00d7a01fe22aed2a7051b2c04b", + "Web/HTML": "6cb00705a6002fc3afd8ee40fdf10a370a0f8071e22f86e80e62e592c897b63b", + "Web/JavaScript": "154e5d301937e54407c4d56e45b768bddbbfec55cfc6ee376c1d6954b9e042f8", + "Web/SVG": "2126bfcea5b57690c437e7e73ff077fa7e73f2a13f3d9cbfda51e3935dd98e11", + "Glossary": "6a0cc24ed14595f893fba3343cfdcfbeedcc4644b6d2a4bf2780bc08b83b4734", + "Web/CSS": "0d2352a52af3e07018793b00a914713083f30305b0eb35afbc466ca38d8879ff", + "Web/HTML/Block-level_elements": "889bc45ba96428e67566d7afb4ccf6e15f7b513e7a0397c4e94147b438bcbffd", + "Web/HTML/Global_attributes": "4bda3568088489e0b8b66a82ff467b3f0e6c7a3a6de40371950f1eae4e054ca2", + "Web/HTML/Element": "121b715b29addc20a88cac4f23640ceb3b0b844225d607a76b8d810cf11bedb4", + "Web/JavaScript/Closures": "d943bd3a067e2b44ff6c2ad2c99d4564b6ba47299063a70330393850cddd8bf1", + "Web/JavaScript/Data_structures": "021fc0ddb58330e1bd9f5bc34b03e4cc8368154aa13ce38f978a664f052e4bcb", + "Web/JavaScript/Guide": "b6ff7aef774037176c55c7364dbf76baa15c61422c057be0887b75deb0a6840a", + "Web/JavaScript/Reference": "88ffc6079888c8ab9a8c190e5865f4dc3516dcb457819ed68df931bc3230bebb", + "Web/CSS/-moz-float-edge": "d61393f5c35c665860c9c458e6ad1301acc73c48a07ccb32fc2d58e1d1e2c1b4", + "Web/CSS/--*": "15b8d89596b4d71363636734da56186d660b286ab2da99e5985f09c8294d9523", + "Web/CSS/-moz-force-broken-image-icon": "161f59d8e3d15948d0c399684b1c436cdb73a1a6be505fd83e223124b780a83d", + "Web/CSS/-moz-image-rect": "be406346ad815d7b81b53a9243474c795ad8c9cfff70ee2d94d2431ae911626d", + "Web/CSS/-moz-image-region": "f9bee2c1effc64282b6c44050647bab84d68f18fc87330145a27974fbe597e37", + "Web/CSS/-moz-orient": "74c729a72a8b69768375d728c6f39ed3512814412075862d8f21e1092f5fe899", + "Web/CSS/-moz-outline-radius-bottomleft": "bfb2683202d527f43c795fc716309b386d0f96fbc7b47e6adeb5a6c818578fbf", + "Web/CSS/-moz-outline-radius-bottomright": "1ba6bab0ff38cc984bc18f57aa4f00e6097b1c066cd5b7c1d7fc339c7ffa3062", + "Web/CSS/-moz-outline-radius-topleft": "15cd1b2d424b6c6e51efef947459ce1c6cfe0b295eef674f92268b6d046d25dc", + "Web/CSS/-moz-outline-radius-topright": "137989425d2f0c72c17c40e88e06fd4228908b8b0a6d79d5534958152dd3fb25", + "Web/CSS/:nth-child": "c4b0be4d0f7b1d34093f081cecf3d1f2f47586b1bfd4f9c87159f0a8f39153ce", + "Web/CSS/CSS_Grid_Layout": "4e5bc9e404c83159f849efa5ff662f3f23e12af83281821eff8735e6a2e06e2e", + "Web/CSS/Reference": "a2e2d9004f499cbbfe78d7a64bbb71c7a5a80dbd53866216a6b99d899570a13b", + "Web/CSS/Specificity": "22b07a589d49f18ac964d48bec474bd06cccf27ef6fca3d036ec150563613c5d", + "Web/CSS/Using_CSS_custom_properties": "b06644bddaac41d60a340c3c43a1cb83b27b697f98bc5fc5133cdb5ffb2ce22f", + "Web/CSS/Value_definition_syntax": "8dbb3daf1e28fd91cb27067cdcdf8e6d46bd4cbb4e7959746f1c81be8ca13df6", + "Web/CSS/align-items": "94012a248af6317c8870c8bec0a5b6031c43bb7d177235590f36f11550283184", + "Web/CSS/background": "a7c696f8eb6f3fcf809d37659ac1c89a68f58c566d76120f8c1bd8ea7de89b52", + "Web/CSS/background-color": "23b4b930928b39938304dd3ed08f3428983035d35fcd9d505670eba66358b811", + "Web/CSS/background-image": "310f9e764e0f5b1b2ddfdd114e08730500f6aaf7ea0b646e899af85b2e73ad59", + "Web/CSS/background-size": "8d465874300bda14beb88a5ed9917763049c2fc0a23ecc900a40ced2879bca11", + "Web/CSS/border": "6ba2305d41ad9971bcd7263be9d010aa060f74746825ce977170228a58970d82", + "Web/CSS/border-radius": "3e19a94a2642c22ab7db03c3318d2d73e875a436348145236ae4306cbfff8183", + "Web/CSS/box-shadow": "47e526a5a0c712dd016f90953a11bc1037648ffb63c40ab4f6608b0463ed7674", + "Web/CSS/box-sizing": "a8ad3e1bf8928e8f5b4d3c7386ce6768480d6e0246cdede59e1d15aca6489e3f", + "Web/CSS/color": "ea83a4f5af370c3dce3417a5775cadd3ca8b9d3a404acbaf3c73b020130e38f8", + "Web/CSS/color_value": "1b0d814fd05ea7b26686e41cc36f318b2cb3d23512750da6e3374b14cfefca27", + "Web/CSS/cursor": "80cc5ac39daef9d6f67d099ac799bf0b8d037d3942818bf0c3602c5051afa1bc", + "Web/CSS/display": "3e3ac083d74f986d40fe292a928d93ac917eb5d10dc0114032acacae63f0f786", + "Web/CSS/flex": "7018341fa9a009b97fcc180d5c901a3e7c36bd86b681ae2821cb6796fa01c64d", + "Web/CSS/font-family": "556d576fb0ae517b409345ad48e914ad41f3217750b5efac36c4b58c080b35b6", + "Web/CSS/font-size": "e6bcb138ea242820f34c724d94ea91ee5d06bf8a83a866b6b9541baac1d0dda5", + "Web/CSS/font-weight": "1b030814c2c0499c4964780b62e08d9dcd27f197cc95119448fcf6dfc051688e", + "Web/CSS/grid-template-columns": "863d6ced132cdb547da816303c9f79394b4b93c6113f2f8efc879d46112826f3", + "Web/CSS/height": "1e44d5a7764888f9048de22f29dbbf35309ef04367e4ccc45717b71cd8095bff", + "Web/CSS/justify-content": "b4b38bfc34e2c21b7b09c8e4b8f90ef0d4e14f8c714405dd731d60e3ccfe1ee3", + "Web/CSS/line-height": "7cadd35393b682e5a9a00dbf9c7f0e5f191dace348f21ef632db2abdc4ef14a4", + "Web/CSS/margin": "de79a0043de96bed4f72779bd4dad12f96e33727e524263453d7cfa187bd98f1", + "Web/CSS/object-fit": "c09b415738c209bde57cab7250bb31525d1fd16cb1d9022bcaa9f100e7affebe", + "Web/CSS/overflow": "e9691255adfabdf39062de584c8d0bab011b747a03728944648df1472138317c", + "Web/CSS/padding": "ae7e1f1293c95ae6bc2a02a7021b767ea6b0936088d01bc70240dac46e52de68", + "Web/CSS/percentage": "15c8a138b165e3beb17cae74e7fa2b871e5a486b9ad5f0132d10e98899bad31b", + "Web/CSS/position": "6909e29fe622a964c6c6e2cdee9929e38dce50a11539c993fff6e1636bc12ce8", + "Web/CSS/text-align": "9621e776ff4c394710d0dbd4ab15e7253fe547c27936eb287c60d04dbb06e22d", + "Web/CSS/text-decoration": "cc2c7507d9f7f20f2b90bfb9b2fea8369c815a4b2cda4a0adaf380493af35219", + "Web/CSS/text-overflow": "6b3d32f7e65c517eb6b3f4181797a282aaf74b394816d6eecfde772a0dc8719f", + "Web/CSS/transform": "bca3bec64cef691f4db6a9b682af469023083efa9667764ea350bda2220ee484", + "Web/CSS/vertical-align": "1de6ec24385c6ae2e686d51f9609706802220349fb614bf472dd62f12cbfcf69", + "Web/CSS/width": "57c959dc1e6c85b77701ceb9ccf2b5760bcca6ad6d494a2fa8a3fabddcc85594", + "Web/HTML/Global_attributes/class": "f541fe583203dcfb5d11661f10e499ae86e8950a16fbb6d6c9c0069eb2c3fed9", + "Web/HTML/Element/Heading_Elements": "ade2a80d346bb6d24cac48f3bbfced3adc67ab23beeea9f7dbe5e99290674809", + "Web/HTML/Element/a": "fbc2ec3e8f103cdf0d4590de22aeb0a2db796c62562760612d1416b2596f0ba7", + "Web/HTML/Element/br": "3c8df0d0e72c0501af4ff737f2ebd866b7673617292b3f5ce0c5daa7f1ea5e3b", + "Web/HTML/Element/button": "3453a0ea9ae911289f4201e645593126fcecce428a810741eb8b8c685cdbc6cc", + "Web/HTML/Element/div": "0b7ab67b9237c32fbfba62e26385c9b5c658e846afe836c7bc07da373290a6a7", + "Web/HTML/Element/form": "504989b06656fcae7c58dfcba9d90f9b866222b1fe3235889eac4e065c44e656", + "Web/HTML/Element/hr": "43f58d756434895acd6e9b57488caf00bfabaeac61701143431d39395689089a", + "Web/HTML/Element/iframe": "e14b1bc28070ccf1e027ff8c65622d31f09cc23345b20b4e5e22592aaa98840d", + "Web/HTML/Element/img": "0d52f318ed1d99597601815295da406a1c803d16b3e643fd10c27010fe55ec1d", + "Web/HTML/Element/input": "78ba1ff368bb9d5f04c83ab111e18f1ba168ccb6decfe514ac05cafbcec5a274", + "Web/HTML/Element/label": "ef5202dab7bf384d76a7393190f5223faa79f8c6320470dd9dbc9ccd9717e30a", + "Web/HTML/Element/link": "fade423231e863b3e0f9cef0f4c79cd4469f07100edc3b8e968b4b9189977c42", + "Web/HTML/Element/p": "dd3e6a5e7a9da6083e979923e3608863af8cd7c396d1daf620646e90142a06b7", + "Web/HTML/Element/script": "bfb5e16efc527544f890044c2140ac2032e469858ca612620941d76882ce1f9f", + "Web/HTML/Element/select": "9412dff1d1e1bddb70f9ea1e97954a62937400a4a5210e22ab09e5b02ddc6313", + "Web/HTML/Element/span": "3871dee8164f01e0c096a546705015517e6b374b9acee493511288f2b4bfa881", + "Web/HTML/Element/table": "96a0a53917d6449de4674025f7148d5613f399959f9e14437a3fe3ee7a850fbe", + "Web/HTML/Element/textarea": "909f66fa83d4154867b8af7aab292a4be73f5d294a085c8eb11e9c8f066ecb74", + "Web/HTML/Element/ul": "889107cb83f0026bf5ac600c6d21c4a0c3e1a3ecbd34b0537be2d1f58fd82d1b", + "Web/HTML/Element/video": "e024d67df9a59141829fd64e5bb01b220f217e248a7e6070ffcb65015fa722e9", + "Web/JavaScript/Guide/Functions": "ac2f590c24a5dcd240d7a67384e9ef9e4242239f1778070246b3a59f39dc3015", + "Web/JavaScript/Guide/Loops_and_iteration": "ba70b4862c1dd238bda9841938e390c230777d13a04c2a6f69545e26379da60b", + "Web/JavaScript/Guide/Modules": "c6c2e9b3e082edce195942115cd6b91b6c1047ecd89919bb6138a50f9736e182", + "Web/JavaScript/Guide/Regular_Expressions": "67e6e639a60613659974c1dce7df6dffa52e38e3f6e72ea2ed5638779552a540", + "Web/JavaScript/Guide/Using_promises": "7ff98fdc07394868da4bbe33955e2ef9cbd3598927ec34569e591e1a1b487d94", + "Web/JavaScript/Reference/Classes": "88228423220051ebf0797d7d3a87497c02ad83c506821fbed8b00f9aef09a719", + "Web/JavaScript/Guide/Working_with_Objects": "d0ebc2f6042cc35a93a406d8eeabf47d7cd77e43085eea922d8d6cbedc572b45", + "Web/JavaScript/Reference/Global_Objects": "f18c1b2c12c0f0b7f94d71ce198da6870c9afd67abd3fe345567cb38f6194b73", + "Web/JavaScript/Reference/Statements": "78950152d4294b811e7f4d2c4b21c22032597f9b7da630e02a2a1dc8fee9165a", + "Web/JavaScript/Reference/Operators": "f1f12d800736ffb6fdd971e3f77b8c11eb215f7233f85ecfa2d9904138667d6d", + "Web/JavaScript/Reference/Template_literals": "a77331703b5bab3783faedcd55de14b9611608093a80442fa168a872e98e58a5", + "Web/CSS/CSS_Animations/Using_CSS_animations": "5b2490f7e563ccf54fcdfa3eca30fe98f1cb3fdcd5e21a3d16c9e5fd5f800920", + "Web/CSS/CSS_Backgrounds_and_Borders/Resizing_background_images": "4ee3a0d5196d8e346c569d605a32684cd9a81fc319a87a571c31fd860f0cec77", + "Web/CSS/CSS_Flexible_Box_Layout/Basic_Concepts_of_Flexbox": "8eba021e65244bf980b2b0e1d11e609414ebb0b5032e5ce90cca4f0788906acd", + "Web/CSS/CSS_Flexible_Box_Layout/Aligning_Items_in_a_Flex_Container": "483c2bdea58c7f872776b26ddef560f00c1d153650c6ea4c18c56f8d9c5d853e", + "Web/CSS/CSS_Grid_Layout/Basic_Concepts_of_Grid_Layout": "d17f0fd2f3eab4af081819dd9ccaa815ccc72e00d41473cd0ae04535100ec08c", + "Web/CSS/CSS_Transitions/Using_CSS_transitions": "65341a0c6e3b631ec40df96fe04c802db1be31250dfa5039b420496254c585d5", + "Web/CSS/Media_Queries/Using_media_queries": "df2e6e5b3c9a69a1d76b8402421d37dcbdce6be3716994f2a16dac44c9821592", + "Web/CSS/gradient/linear-gradient": "3faa1b7f4e1a12296341c35026c2eba969d31e78ac585bf96586b5b338b082f9", + "Web/CSS/transform-function/translate": "dd33dfe8a1baeb099279592d870cbf80acd0fdc2d37532b33cdfa7de12b46b66", + "Web/HTML/Element/input/checkbox": "da099793634687ee928ee0e2b03e2ac48aefc75930540ee2453d2bdd1b207142", + "Web/HTML/Element/input/date": "9d0f3d5e12d60d941a4f1d5c571c183c31f33cd9848e8eac0b01acf158382d4d", + "Web/HTML/Element/input/file": "971c6a697152594d1657b24ccbd32a497b902658c7ebaba3d83e65be3b5546bc", + "Web/HTML/Element/input/number": "cfd398a42ed54489af91a568dd003054cdaf46714e2de0bd52cd8e639c9b46ac", + "Web/HTML/Element/input/radio": "0c081296cc821d570e4ac38e72a670ce19a1f5496e871da33af91890a048761e", + "Web/JavaScript/Reference/Functions/Arrow_functions": "7a050d3095f50512156beffdf638cdefd88cb1ac6f3b4b917f61177de9b8c711", + "Web/JavaScript/Reference/Global_Objects/Array": "240a9954c8208e923951462e3027726149a1d5541e9e04e3702826472ef25029", + "Web/JavaScript/Reference/Global_Objects/Date": "d51401ebc6ab7d64d15e8f4a42285093aac0e12d82a90c1a072e6e40c2efb303", + "Web/JavaScript/Reference/Global_Objects/Map": "356c2a02fbe61fb7ff12ff74765efa3bf8b74d297c6a9713288de92f6b468a3c", + "Web/JavaScript/Reference/Global_Objects/Math": "0c9e37d4b13f22b6c52c4b94370d9884683220a474d5e35883ff4502d20b64f4", + "Web/JavaScript/Reference/Global_Objects/Number": "604bad8bc80f2e7ae6c779887dd8e058a26cf679178e85887b775a33b7f02355", + "Web/JavaScript/Reference/Global_Objects/Object": "8ff0e49e18e3f2be632da3f4e1f68f6d0407a4101ce6899e7a15a36a5c492ecb", + "Web/JavaScript/Reference/Global_Objects/Promise": "65892d637c64e2b2a2990e71c3bba3662f4259211ec6cfe3a046dbf1376ce274", + "Web/JavaScript/Reference/Global_Objects/Set": "2a2e3a99f87c210e73bd945119cc9694bb020642de1cff76c10f78c8bf440a4d", + "Web/JavaScript/Reference/Global_Objects/RegExp": "b53d1906ef56b6e11ffbf3d71cb22585ae942a331e2bf50c976bdd0599a32819", + "Web/JavaScript/Reference/Global_Objects/String": "558e9dc533f0d41af9891445ce7964e09f54b5d327e744ebe0ad38273da24f4e", + "Web/JavaScript/Reference/Global_Objects/TypeError": "66ed832b239ef3f795896651cb25acf873a04680e662aa8c67411c7a97fe9f25", + "Web/JavaScript/Reference/Global_Objects/encodeURIComponent": "93698541ba8c1587992c25d0f701ff1b169ece5e7ad34f56b7534f937cb68854", + "Web/JavaScript/Reference/Global_Objects/parseInt": "22843eaa96e1c6074d4b004b40b2813bb2c9bf4ef9d7a4524ece740224620373", + "Web/JavaScript/Reference/Statements/async_function": "df9f78f27d102768f0d12839708317a600e696a71db1903c22b64e280aa54869", + "Web/JavaScript/Reference/Statements/for...in": "f7dc6f60ccaa4700cbb35c0e0e1e7cf8968d36089f7dc502f86c268adc182135", + "Web/JavaScript/Reference/Statements/for...of": "52479f3ad46d7336368b85eeace026bf41b46edb83ee049b949841404db2c260", + "Web/JavaScript/Reference/Statements/import": "5466a5150ad4dfa538e60cdca38dfd13bd405cf0729bb914dfc242e60977c072", + "Web/JavaScript/Reference/Statements/switch": "dec942dd1226ab9928431f0ff58fcf28b018a07c8dc1eb05fd6ed3a359f20851", + "Web/JavaScript/Reference/Statements/try...catch": "4134c93b4588475ba1bbda2302ae077b9ae160c5d85d7b3d135483739092e9e3", + "Web/JavaScript/Reference/Operators/Conditional_Operator": "7315ad2734f43ded4cf2a9e1a12b0a7dbc713a3a51df6cbe18a6b7d4fa99adb1", + "Web/JavaScript/Reference/Operators/Destructuring_assignment": "1d3b2bd348285cbcb964b7303398bb9d7d1f75aa38881f702be55373573fc1ce", + "Web/JavaScript/Reference/Operators/Optional_chaining": "66cbdabbfeb3a5b90eac1977626f94e29511ba0955d2ee12b4527ff8d13e7a91", + "Web/JavaScript/Reference/Operators/Spread_syntax": "eeb2cd7b3bb20003367002031d2c7d7c988ad6b396b8447d7dfdc4181a03a587", + "Web/JavaScript/Reference/Operators/typeof": "f33d4e4246bbf5b0997663a04d9c0080be6ea8bbdc7cf999c476dfe2a510abee", + "Web/JavaScript/Reference/Global_Objects/Array/concat": "333cdea519a8540ce73d5295555eedf1d114ced98e51e3a9d1f78319f191d0be", + "Web/JavaScript/Reference/Global_Objects/Array/every": "ffc38b7b2270f7baed92d75da8e0acdab6621146c6b4199be823156b972a203a", + "Web/JavaScript/Reference/Global_Objects/Array/filter": "9c09fc9b24ce5c3d750f670d456fed24e8324dca147296890414d6c634c0f809", + "Web/JavaScript/Reference/Global_Objects/Array/find": "d768f459d4e8fef2b27399f286591c09ac21fc7f2a0d14783170a1dfe0ed9462", + "Web/JavaScript/Reference/Global_Objects/Array/findIndex": "cac7249602ff5f583b4b2893165832273363b1e452f8a80f5ec8e3cad3b0ce73", + "Web/JavaScript/Reference/Global_Objects/Array/flat": "ccbf56353bcb112efe1b21ada52cb9cfe19fc979a4155e49d5f5175036460b40", + "Web/JavaScript/Reference/Global_Objects/Array/forEach": "a215617d5e1e97c85b19823e82cb2ef7c840d615452e447f7e07ef20504c1f22", + "Web/JavaScript/Reference/Global_Objects/Array/from": "e939b227010fc24ce955759817559752df66ffe46b6b0c4af376f546d31345ab", + "Web/JavaScript/Reference/Global_Objects/Array/includes": "615eced65446c49272d828cc7941b20c2e91c0138c14838f1f1fcf16be1a61a3", + "Web/JavaScript/Reference/Global_Objects/Array/indexOf": "924c76a923a38a0a256457c57b6685ae01027ad9e5deee881608ffea18fddcb9", + "Web/JavaScript/Reference/Global_Objects/Array/join": "ea86e8109d7c77075df5ea303b0ce7772db5fb1edb250135edda82961eec57f6", + "Web/JavaScript/Reference/Global_Objects/Array/isArray": "70afdd74608e6682fe89d509c00830b9e409ebbee0464fa1d49f54c1c1226d5a", + "Web/JavaScript/Reference/Global_Objects/Array/length": "b1fdc63e770b473690bdb1dbcae678762fed8143ee97053e837073cb9ffc305f", + "Web/JavaScript/Reference/Global_Objects/Array/map": "bdda2827f47027fd14d0fbc91b12531732a14ec1678bcd574d4e1980735b6e8f", + "Web/JavaScript/Reference/Global_Objects/Array/pop": "293c48ca78dc8b9516613603c52339a73efb2080ad293b854177e77cc350e5fe", + "Web/JavaScript/Reference/Global_Objects/Array/push": "bf03423300b2ceffcc314188f69298860c5bc45f81cdd67e2e1ce6d9a618243f", + "Web/JavaScript/Reference/Global_Objects/Array/reduce": "c0c8a1d863d42bb38e58f53f5afad2755027454f8d7f53f02f7c3ce53276c08b", + "Web/JavaScript/Reference/Global_Objects/Array/shift": "2793c870de4bba83756443473709dc3c9b01c6f331725dc38b99c52fc22d115d", + "Web/JavaScript/Reference/Global_Objects/Array/slice": "625393a9d92ed1ec4c61bf9c5ae4d2bbc0e14c727bf4f5426416c206ddcbf1fe", + "Web/JavaScript/Reference/Global_Objects/Array/some": "2a0d22774fd40bb0568eb757a24694adb4611a614c81bfb3a4123c12c34baeac", + "Web/JavaScript/Reference/Global_Objects/Array/sort": "b400bd8a81a03854c0f9f68b7412a6d0c499669da4f8f03ce03cd2a3d3d18c4d", + "Web/JavaScript/Reference/Global_Objects/Array/splice": "531611cf155873a878f29398ec209bf0ce2dd28f26ffdb9f3a5ccd859bfae47e", + "Web/JavaScript/Reference/Global_Objects/Date/Date": "b6f48e06e2cc51bde1a1019e74c5211944b36042f5b9425a2454d2fd5102bc7e", + "Web/JavaScript/Reference/Global_Objects/Date/now": "ff343899586c4e7eb3f0b9528a505b04e36a14b10e0a227d703f559c9142d2d8", + "Web/JavaScript/Reference/Global_Objects/Date/parse": "00df70a89440fb411972141bd7176b61996168f6dc5d5cb37b56a7883337d06b", + "Web/JavaScript/Reference/Global_Objects/Date/toISOString": "bfcff349bb56eaa38faec900ade735b9496d26ac90ddd6a9e0fe53a372d0ba57", + "Web/JavaScript/Reference/Global_Objects/JSON/parse": "3b70223ae4f3f512eaecd4e998a75e82397ca3a5938771f532ab52132b8f2304", + "Web/JavaScript/Reference/Global_Objects/JSON/stringify": "23d8a8c7d9745682a360cc61ac0a97658e3077ece202468548b49cfa876b2305", + "Web/JavaScript/Reference/Global_Objects/Math/E": "d34b5f6cb541015fd79e840fe9f464b2810215d4c46a090708388575b5042633", + "Web/JavaScript/Reference/Global_Objects/Math/LN10": "dec830df7395f5c4af46fe08cb9399197d5839303e5a6196d5f7ec8b4b54af99", + "Web/JavaScript/Reference/Global_Objects/Math/LN2": "96cc6354f3cca9b4c5c7a6d49293a0b148143a93c31f6b60a9322f7e4257ddba", + "Web/JavaScript/Reference/Global_Objects/Math/LOG10E": "12a563115bec37324a32e4b4c64005a7ecc1939e993a630fc69ce23bba85a23d", + "Web/JavaScript/Reference/Global_Objects/Math/LOG2E": "6b1edc52e0934171114e4bc35d71a050dfb129498a3ffbe27f2e7175517499e3", + "Web/JavaScript/Reference/Global_Objects/Math/PI": "6c6a86a247c2cc4effe6cf600a83e2ac36339c12633d63bc7e8d97dbc5353eb8", + "Web/JavaScript/Reference/Global_Objects/Math/SQRT1_2": "b3cd3ac1a85a4dba190713fc6893b5c733c70c81571f404808f89d66298bbea1", + "Web/JavaScript/Reference/Global_Objects/Math/SQRT2": "c1820aa8aa9bc131b648242a6c16b2063cbcf2663bdf6c61a9743f469ed619a2", + "Web/JavaScript/Reference/Global_Objects/Math/abs": "cb4e4e9fa93d25c3c3e0d36513daae37125d4d875326345d5e793d85c9fe8f29", + "Web/JavaScript/Reference/Global_Objects/Math/acos": "d5eac03a4f737f4956be546b3e9ea9241e5bfb00187e88f8c1606a5d7891a5ab", + "Web/JavaScript/Reference/Global_Objects/Math/acosh": "10704d4d847e48c40d2bd91b76aa9394285cb826017cf480e117bc3f9e8984e7", + "Web/JavaScript/Reference/Global_Objects/Math/asin": "01c444d3428791afb6b8fe399380b83c08f3d37a48102e7a5a9b80bc73436011", + "Web/JavaScript/Reference/Global_Objects/Math/asinh": "7c8831d70cfe21a6310dd83b2ed1ab8f84dc20e30dc4a0197f67fbb110e7b5c1", + "Web/JavaScript/Reference/Global_Objects/Math/atan": "bbe2e1804021d00d17618af2c31222cd25c62a800055de77d07eedc75a426ae6", + "Web/JavaScript/Reference/Global_Objects/Math/atan2": "969503a7d44e4b94a81415a3e2b04135f7ed7a780cc1a610b62a05d9eed77790", + "Web/JavaScript/Reference/Global_Objects/Math/atanh": "46701847559d161dd59b7fdc4e2231ac800eeb3e790e6781a49d4df891e3a6b1", + "Web/JavaScript/Reference/Global_Objects/Math/cbrt": "e3c400e4804e9428f988aec6b8b3d38bc009dc2f0fb1d05022490e3d3c2ef0c1", + "Web/JavaScript/Reference/Global_Objects/Math/ceil": "90c9879592933d7b076c35dc8eca311f4841266af44b9f73372a32ad63a28571", + "Web/JavaScript/Reference/Global_Objects/Math/clz32": "4dc0ce665b35197377ba40352e6954f50b072b168bd65bf3669ce6e09e918508", + "Web/JavaScript/Reference/Global_Objects/Math/cos": "435697540bdb04f55df7c62cf13bd17764be09029bc78f1a6678510671b6d80e", + "Web/JavaScript/Reference/Global_Objects/Math/cosh": "54f117a20736af7173a6e61db6f5c5617b35604f383cca6c0c13bbdf43beb77a", + "Web/JavaScript/Reference/Global_Objects/Math/exp": "b92d669ff1248b66358020536973ed949dc74f1ec7b2b15908795cd9db1957c1", + "Web/JavaScript/Reference/Global_Objects/Math/expm1": "d2e9c9c73cae1904497935746487ac49cca246a7690b92f6b110d4ddb1299f69", + "Web/JavaScript/Reference/Global_Objects/Math/floor": "89b9086fdaf51884334150fdd055d6f1343769b90946b4c6af043437b7f30742", + "Web/JavaScript/Reference/Global_Objects/Math/fround": "a0fe847acceab104fe79e4397e08c9ea76b0ef4b5e740d95c15ac23a31733a76", + "Web/JavaScript/Reference/Global_Objects/Math/hypot": "f25f25387d821d46bb92cc34f3d5df9dbc72f858377e3ecb346ca6f49d3ebc9c", + "Web/JavaScript/Reference/Global_Objects/Math/imul": "00e39cd8e6a83ff69c7245da3abf6847e3282ff02e0ab57601676759344ebcb1", + "Web/JavaScript/Reference/Global_Objects/Math/log": "16802f2f61adc42e2e629cc67cfccaaf64bf711a278ecf550803a86a8ee4c5d1", + "Web/JavaScript/Reference/Global_Objects/Math/log10": "2ea5109a4cc197d069df8a71555c56609eb427410e42d13bf65467207e7cbbf1", + "Web/JavaScript/Reference/Global_Objects/Math/log1p": "a7f1b45c9ff561c754c93512a7d7db18225f21692bd468702e07fb49348777c9", + "Web/JavaScript/Reference/Global_Objects/Math/log2": "3e2e49d16cf13745bf50d41553db4b5195a30682726770ea7a7dc02ebb811ca7", + "Web/JavaScript/Reference/Global_Objects/Math/max": "f948964cd7847e3f90327def607ab6f9424eb2ece418ae5e38e766362917b103", + "Web/JavaScript/Reference/Global_Objects/Math/min": "50e54f27310079d8d03facc80e17469960b04a824cea4b8a870827e6f6871c47", + "Web/JavaScript/Reference/Global_Objects/Math/pow": "1792652357ab468c1a55d18f0b90b3bd4a0f97649967bf2c623cd164906bd2dd", + "Web/JavaScript/Reference/Global_Objects/Math/random": "f2eadd8c43a18e127b3cd5d38a67c4d6589d4162ede8bafc4a5e1c3adb9a3d14", + "Web/JavaScript/Reference/Global_Objects/Math/round": "1bb2ef1b2c984fb4c32015251963820df5d0fd2487ba6d5bd7de741fab530584", + "Web/JavaScript/Reference/Global_Objects/Math/sign": "9860849bac49d3255215292276afaf179821b8e0a8cabef484eedd604a434012", + "Web/JavaScript/Reference/Global_Objects/Math/sin": "781738fc496a838a9a02674633bb90481127fe064421604118ba4da79f3782ab", + "Web/JavaScript/Reference/Global_Objects/Math/sqrt": "789c3509a2bc18c5ec70088b501e109e7496b44935825e75c656f1e0f83c3fb5", + "Web/JavaScript/Reference/Global_Objects/Math/sinh": "aa3ed7e1535d61bf5af1b7d56337e627bdddead7228f34cab5687dafe8fd248a", + "Web/JavaScript/Reference/Global_Objects/Math/tan": "12eacdf452e6462998199d6b4b7a47a43662cf32a213328e56c14fb9022617e7", + "Web/JavaScript/Reference/Global_Objects/Math/tanh": "00566e123121a971f21c5b8afead0e06269cff69df51ef0dd4a23f1e941ce6a0", + "Web/JavaScript/Reference/Global_Objects/Math/trunc": "8606c976af814944f76939b0025477a5326cb8f14c927440a24d32d2328663bf", + "Web/JavaScript/Reference/Global_Objects/Object/assign": "291c46218eb4d4378fd9fa510e5b8928c24016417157c14040697fc26221cf92", + "Web/JavaScript/Reference/Global_Objects/Object/entries": "053943ea74d0ce54b00720ed80f38a9a2fc1251643d9110e84c7059c7cbf5760", + "Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty": "f1187657b4075cf21da77864c5ceeff4778740e0edb0a50c5554edc66ab3a8ee", + "Web/JavaScript/Reference/Global_Objects/Object/keys": "0605f689a00059e3f604205930d4dad26c2b6c1e80735eeea71a5ffa91e3bcd1", + "Web/JavaScript/Reference/Global_Objects/Object/values": "fec4eef2229373e893bb91cfb04523f71b86f964ddcc68feccf941457181c2fd", + "Web/JavaScript/Reference/Global_Objects/Promise/all": "fd8f4e209b05d9d8bc7bbbf3f49d25f7217b2456c0c82286efe641ed3a9f2f1d", + "Web/JavaScript/Reference/Global_Objects/Promise/then": "2ec28169c58ba80b5f04d8abad5259a79f53c9255e52fff17655930bf38536ed", + "Web/JavaScript/Reference/Global_Objects/String/@@iterator": "69c0fc90094bf0094228a5df93eb48a878e6409b3cb91403b013efe30ead5efc", + "Web/JavaScript/Reference/Global_Objects/String/String": "72b572e67fda4b7154d9cf934c4f6564cabea8ba83be73232e754010f9fb009e", + "Web/JavaScript/Reference/Global_Objects/String/Trim": "1c97ea8446a978dde07a95623ab42aaf9057d48f4b3852c4e02f3bfa7cfcb8ca", + "Web/JavaScript/Reference/Global_Objects/String/anchor": "33fdf86c109ac333c5a4b19265945afa542b7c1a51c90a745da933d3128a094f", + "Web/JavaScript/Reference/Global_Objects/String/at": "2f5e240976cb71debe0c9073b9fbae37a9f4b3c9281b3b59b1e209dc9f59a563", + "Web/JavaScript/Reference/Global_Objects/String/big": "1d523bc1d7fcebb3f5f0ee771a2e7f93dc457c33648cf4eba43bb5de5cc72dee", + "Web/JavaScript/Reference/Global_Objects/String/blink": "b12a01ba3217b4b6c8c465c5c3f32f851dbf48321514dff89d15df14784b5b77", + "Web/JavaScript/Reference/Global_Objects/String/charAt": "1f57566a47162f45d1bbf62f5e36fb63a10fd1421aaf892c9dde8aa0d945dc98", + "Web/JavaScript/Reference/Global_Objects/String/bold": "dac672f3849966a5310c466aedf1eddd46bc7f387a679860446771e4e55a77e1", + "Web/JavaScript/Reference/Global_Objects/String/charCodeAt": "c0e59e5f07f044502bf3b2686a2b5cba8cf71129fdf6de2c4a6d7b1300e20411", + "Web/JavaScript/Reference/Global_Objects/String/endsWith": "5e7b6b9ce5db03e3a6a8aea2a3e02a762d644bebdccf088441cfe1de6b6ba6bd", + "Web/JavaScript/Reference/Global_Objects/String/concat": "9b31b710bded88f0ad8b56f0a50bfda25dfced9cd343b88ddc4e54e4a8c53306", + "Web/JavaScript/Reference/Global_Objects/String/fixed": "8259878e7ec3b0eacbd2a1e1b1cbe0dd20c5ef71c3ee1744e3530f283f13b002", + "Web/JavaScript/Reference/Global_Objects/String/codePointAt": "a6ece2f0bea28af29a37f2f3990027a2b2a35ddd74a90d7fbc90d3ad4b169d98", + "Web/JavaScript/Reference/Global_Objects/String/fontcolor": "8c910180b30ad5c4cf8de3cbdc8209c08a8e10ed5ffca59aa2b53370cd082014", + "Web/JavaScript/Reference/Global_Objects/String/fontsize": "cc7c05632eaca9c8cf96cda2c6b91c46ca8c5deb8d3c8c257529a8b07ca66111", + "Web/JavaScript/Reference/Global_Objects/String/fromCharCode": "ef3aed94d214b811c72354d6bee0c4e7327c0979e48462137f66da6b223b0e88", + "Web/JavaScript/Reference/Global_Objects/String/fromCodePoint": "726564d9420f2a7feed00d090de6591972aa0486c159b12af9adcec97dd30a50", + "Web/JavaScript/Reference/Global_Objects/String/includes": "462e337bf198a0d3ee6f08e1b42b76feb190c446e93d91f7e9c952286a9cffe4", + "Web/JavaScript/Reference/Global_Objects/String/indexOf": "915731d71af3dc3836a28f16c50d870ebcace4f8129e203c90b38b9fdb41e8df", + "Web/JavaScript/Reference/Global_Objects/String/italics": "da17e27f6c7423e8ddfcbf1b7fae026892c48190642785472b5bd0557d8ca855", + "Web/JavaScript/Reference/Global_Objects/String/lastIndexOf": "5414db933b2c8e63ecee4d8a0a854b49d93ef02b71d9cd100dd11e9183051538", + "Web/JavaScript/Reference/Global_Objects/String/length": "05082b0457bb0e8c6b9b1d492e27454e4c1d5649737c3154f12390bff648bd59", + "Web/JavaScript/Reference/Global_Objects/String/link": "64ce6e094c6678bd4f2772e1f042c48fd3ad322c33a246e1d8b144ee43b76ff7", + "Web/JavaScript/Reference/Global_Objects/String/localeCompare": "31090a530785d02344c34aedac654eb271a3e29ea17ae382dae6f1dbb9d66d66", + "Web/JavaScript/Reference/Global_Objects/String/match": "57187165a2b28d0fbf4596df4e648ab48823e3c50d24140df9b1cd880a1900f6", + "Web/JavaScript/Reference/Global_Objects/String/matchAll": "39c92118ddc2cc66359ae12e3a66ff8eb37a7e5e4371976cb2c4720e9256d0aa", + "Web/JavaScript/Reference/Global_Objects/String/normalize": "ece23ab8ecf366de188768753fe4096c53db34dfb31c2b565cc1964f1fdb4686", + "Web/JavaScript/Reference/Global_Objects/String/padStart": "2f1108e70c86f19b416475b975aae219be82c6b56231b85131457697f9c66f58", + "Web/JavaScript/Reference/Global_Objects/String/padEnd": "38359aec3f8afef0ef19adc08cd06794fc8554376e25100771b214eeb139db09", + "Web/JavaScript/Reference/Global_Objects/String/repeat": "21e620aaef9d2987201563dd27c38bc24cae85f51644a6d630c964e6bf554405", + "Web/JavaScript/Reference/Global_Objects/String/replace": "b0e3ce5ac90127797ec9f4f28b3a3d6456db07267b4585a4ec0d9740e4ef65e2", + "Web/JavaScript/Reference/Global_Objects/String/raw": "fe7b3984731116fbe31a4f50fa65d87aa13c4291c4580c6a238cab80451cf9bf", + "Web/JavaScript/Reference/Global_Objects/String/replaceAll": "585f970490cd3d0a546a2e0fabf4b55a1d15faa9cd5b241f05a23797f05dacb4", + "Web/JavaScript/Reference/Global_Objects/String/search": "79b20d3aad88bb0344ece148370bc60fb60abb04240081a275ee344813a9d6bc", + "Web/JavaScript/Reference/Global_Objects/String/slice": "c847081346f52b27fd6608c06846f6255850d6c7825da1a48d151b5d75bde746", + "Web/JavaScript/Reference/Global_Objects/String/small": "89c37fcb0bb84f8336ab410d2d94115683aa03203fed1c36452cfc84cc76e14c", + "Web/JavaScript/Reference/Global_Objects/String/startsWith": "6f3c1aaaac36f8079df1d03e21c2838bf00a56faf92513b2d09c21d96540ada7", + "Web/JavaScript/Reference/Global_Objects/String/split": "915a71d3f931cbf6a78b7d3e133144ac17c658310fb088c33cffa3c65de65149", + "Web/JavaScript/Reference/Global_Objects/String/strike": "74a1a4e2d8ff954eb0b84cce3c75b2970d1b7b290758726b14e1ba7614f2a391", + "Web/JavaScript/Reference/Global_Objects/String/sub": "df3bcd550179f4cff6706e8723b74e07e703b3caf753ab505a846b4365606a74", + "Web/JavaScript/Reference/Global_Objects/String/substr": "cac962e9dbb7ccdb2bb628c57e799fdae9b79c2b424d21c71c3070903837c301", + "Web/JavaScript/Reference/Global_Objects/String/substring": "3784bd1fb8ecf44af0a8c38f081726bce9c8bb6316e278bfb556634ffc6072ee", + "Web/JavaScript/Reference/Global_Objects/String/sup": "f034c677bec3f7631b254189ebd8da5cf55204bddf0ccfe76040bb38f78033e8", + "Web/JavaScript/Reference/Global_Objects/String/toLocaleLowerCase": "2d4682428e6e9f981c895b62dbd6624646a298ef20e5ed948b0f98c64c22a1ce", + "Web/JavaScript/Reference/Global_Objects/String/toLocaleUpperCase": "59aaffb17c11156347da65b26c5740edf30e419e490231e67e472d7e2957e286", + "Web/JavaScript/Reference/Global_Objects/String/toString": "ec87abdd021100ef833ee74e6fcc200f66def7d86b9ba96987e0716d22b446e5", + "Web/JavaScript/Reference/Global_Objects/String/toUpperCase": "d6087348f2c4da506d0a5d4bb82ec70423a171483e1f598972a6174f144319f3", + "Web/JavaScript/Reference/Global_Objects/String/toLowerCase": "22d3a8337c198a47fc7068f7ea1bc5c73ff70fed5360c9c6c7f476e8c2183e7c", + "Web/JavaScript/Reference/Global_Objects/String/trimStart": "d294ce734c106eb3f4281ec649e565af66aca5a8e88c8d894138dc5aee32be1f", + "Web/JavaScript/Reference/Global_Objects/String/valueOf": "90e6fc8ddd983e118033eb0dca1d5e40f315ad0b3d25c2876b90a122bff450ba", + "Web/JavaScript/Reference/Global_Objects/String/trimEnd": "ddf1b81ffe699718bd050bc7b3947bd8825b134c910a03a38ac0ff8d441c8290", + "Web/Guide": "1617c61cf19c97403a842cb4fbf08a4f1ced6206ec854f49b266fb08d58bafde", + "Web/HTML/Attributes": "eb967dcaa77a544f1bfbdb2b5e38c0eb22345b348366dfcb1afae06787231671", + "Web/HTML/Constraint_validation": "216ff82f8cf7fb53473f4d699a78217435b7aa99e14f932df3a4ea1962f8766e", + "Web/HTML/Content_categories": "549c7d3ffb385b971900a004408d68c424f893a09013d5b9b9efce4bb0851750", + "Web/HTML/Viewport_meta_tag": "2bbf961a44e82356409268b35b579c7c9eb8c22e4294ccdd0441e09c0f7a61b5", + "Web/JavaScript/Enumerability_and_ownership_of_properties": "767888c2eac7c3ff3234f8a4bbead1d981056f2e6b98e42de6aefa574dbfdf62", + "Web/JavaScript/Inheritance_and_the_prototype_chain": "e6f0cb1e027ef1a35640e2ab95eead12e6ec49836cd63f2943b553f76883d529", + "Web/JavaScript/Language_overview": "148092df7aba477db33ec9e8a218fa901bb5e0af7496028b6287f2f5c6c11d03", + "Web/SVG/Attribute": "7253a0e0ad317afc0d2d13e67e48a398677083131c6cd3ba352e14642cc3f417", + "Glossary/ASCII": "e8ec2cd67f6c91326ae8da5d05896f26ebb853b956d393cf78e447752e79bfac", + "Glossary/Accessibility": "b12b7769e706872dec0deb91a896679b3096ce0beb11645b773c59366791eed6", + "Glossary/Base64": "f3f6bf6d31bef6e25b227eb94e835149a943cb09dd5b28bf5865d911c4ebce78", + "Glossary/Baseline": "8f3f4741546ce6e6ac4e005b42b59d853a130a0bc1c196012369a3d57bb559d0", + "Glossary/Block-level_content": "e6a9f2b03f44650eed2b6ec072142916d267f5ee3740d2ecaebd3ec1834298b3", + "Glossary/Boolean": "48cf71900e1423736d2210a48460db411148f11f36d0b9c9153b32f0712b20c8", + "Glossary/Callback_function": "7f3bf30cd76ae6636f7b6a4f34708216c95685f18fe4a296a198502d0b3e99c8", + "Glossary/Camel_case": "5a224b09088787e26a17dd766ed2ebe8378ae8d722f31040920465e7fb28fa44", + "Glossary/Deep_copy": "77684722625af9ed34d52528daa555f0fed681e62cd57e6f0d62ba80de4948b7", + "Glossary/Falsy": "153b82841a41e95c9a7e388e3ae65b671a4ceb7a20a5a8ecb469be0f9465723c", + "Glossary/First-class_Function": "2e9c457f202af9f1bf8698e85d59f4cc19ae0fc07ec5e904d6187ee0e49083b9", + "Glossary/Hoisting": "3d10d10bed50464c901495758b3527299993e9243ead9e94c35d8c40c4c2758c", + "Glossary/IIFE": "48ce58197e7f9d16157cfc3d18d63f22ca4d40c8a039eed2a6b13f3cfc131e59", + "Glossary/Internationalization": "4a5b78d08340577e7ece79303e577d5a74603645bcc4eae1808b663cecc590be", + "Glossary/JSON_type_representation": "d77dd2849ec15c24c0aa83c141f747b71a32e72466d5d5212f4e904ed391a669", + "Glossary/Kebab_case": "ac91a7d2f8b6cd1caacda5ee0fcf3230c19e79fc44191bc43f3390e2e2300438", + "Glossary/Media_query": "a0bf0c4e1b52dfff9a0b7406b1c20ed4d8959687773d2ede170e566959357a25", + "Glossary/Preflight_request": "632e6d256aff155ce6bc5572cb61dce8b6ebfe94cae49b890c7047c49d2c3186", + "Glossary/Primitive": "709ce1b67448fee9f13d77a792c474f4f0228b85182f272c6a636b5ba85975cd", + "Glossary/Render_blocking": "647b846de0861a5a582725ceebf0eb0c6c44a5bbd2a1ea75dbba5c2f42653bdc", + "Glossary/Repaint": "2a774683337df3457a0f9e5db126d9b60da68292bbdb2cae0561abe43057d370", + "Glossary/Request_header": "a31086de85a7deaa1f1d7eab276fba2c58243c8120b7303ecc3118ef8b4bf9ab", + "Glossary/Scroll_container": "bbe14a3beba97101e64bf570e6a27a4cd3256a7a6a8f9048f993c034124374db", + "Glossary/Semantics": "d1bd311af8accd71d1e500fbba623e413b08ddaada896313bf599b8cd84ed106", + "Glossary/Shallow_copy": "b7085904d3de135dd94672bea71339a1d164681c3de8b45a2a1fc2c9c7dc3a02", + "Glossary/Snake_case": "0518c2de271492e6c570e1c06126628a0139d42282b68c0330805f38e2d43590", + "Glossary/Symbol": "41ae16030a533ee6e0aec5c1c1a639a552c4e0fb42a7250940de6a201f4bb3b1", + "Glossary/Truthy": "1c68fead6dec76fee95aa7805f2bdfa3f77346459dab40e56c90ff8c0ad45678", + "Glossary/User_agent": "7d3003324eeaa168dd7759774ef57628c5ef7d0139bf057a8bc67f258ae68558", + "Glossary/Void_element": "7ff61ebfb3fdddcde38fffe09d4cb09ec2e721f258fc3cac547f58fa84d5bcbc", + "Glossary/World_Wide_Web": "185b8c49ffa903cdb5c0b308851d25f18e2b14b81cbc10e759a2a7137158adf7", + "Web/CSS/::before": "ba8fd4f60ba6b27e50f1896f5ca99c3f0b66ef9454e09b52d761bef0d3524593", + "Web/CSS/::first-line": "798c6ffb532288dcee79e3ab1bcc27441c00f0df1be71ae3d4e5c7055abc0379", + "Web/CSS/::placeholder": "e0b8d2b586056438ce8201dbbc313a40fef81ed1a9378390f3093c2b9361b5ed", + "Web/CSS/:blank": "b252307cc769234626c58f7588a9633428d6fac243e79c5c815e4339a36aed38", + "Web/CSS/:checked": "d7087712902d60e391e485213d06249cc91af09f7558a3ea29b5f6d26fc1e64f", + "Web/CSS/:default": "8f1a388c8a50d2f447d92fb3d114896128f778c5b28e3c4d02d0ef6b71609430", + "Web/CSS/:disabled": "9bf58ad43689b343eb8ac0ef60a2401dce14b5d84de3c50cda0f43fe2bb8fd3d", + "Web/CSS/:enabled": "53aefe6a482ae380a28531d864c9f2927ed4a50bddac6a6b76aedbe337e443b5", + "Web/CSS/:in-range": "5244b61d0a75adfe0fd2b3e3bf163554fd20c69c193225d6c32bd96673abc85d", + "Web/CSS/:indeterminate": "a7714e2ab84fcb044abe9f4de615524388518c5e540d5db70ce37bed0310921a", + "Web/CSS/:invalid": "315fff3572195658b331a2f851f961f493b9f45f335a35f0493ea1048c3c3de7", + "Web/CSS/:not": "9ead49fadd5b632a9079fafe41ffd6cc121a31173f01987b42e5c3e47faee608", + "Web/CSS/:optional": "5eb57e1ce497da220e36ea6437ce99ff5e625ba4f78b95897c5f3dc85c9183d1", + "Web/CSS/:out-of-range": "2ef659df90cf8b3ad080a20ff11c2156b10b5b1fc079eee7f054dbb3c05a333b", + "Web/CSS/:placeholder-shown": "aa745379abe740527e84e75e9ffc7c2f0835b77d979a7647f3de120fce7c0704", + "Web/CSS/:read-only": "29dd923a53ab85e9fe23cd181a2b3f4f1b47f39c88d7d36a17751c6e0d88f817", + "Web/CSS/:read-write": "b84d0478fca68a7b5dbc60a02353c988b189bd1501041db9db5d5a9a797e4d22", + "Web/CSS/:required": "8e9de3aaf09757d8d61fe481d1271f0c6a8f4fcead2c2fa969272b3af9820395", + "Web/CSS/:user-invalid": "6377b1f2336feb24e00fb3ce8b35e6bc4c1bfeb322dd147a877f4cdd8ec6a5ad", + "Web/CSS/:valid": "688738001c766f4d68604131bf40500c8ce6030c03dc39ab85049921bd6f82fd", + "Web/CSS/@font-face": "506984750e8d57637d706e9aecfac8f7f9c555713e30a21ade1824cd02f7efaa", + "Web/CSS/@layer": "6bfe9bb5c75066219e3689e9b8bb06db436377234a46f5f793527bd7efc8bd53", + "Web/CSS/@media": "3a0bb3f68001512be5ca87c87d5b8858f222beae112b144b89663760b03046bb", + "Web/CSS/@starting-style": "2d0a098a3b9701289b8ba7d93fee40a741d1e60e1515237b5b9d0bd490a27179", + "Web/CSS/At-rule": "b81223750f11a86e1454a9dde35f7669388e411c53e0bc52fa6ab7764042465a", + "Web/CSS/CSS_animations": "8a1e15e3e853d5ee87193e9a91b3a977d62aa7603966f4ab896a42d2c0ddfe5b", + "Web/CSS/CSS_backgrounds_and_borders": "48c80335e01a14bd1efbf92ba162edc20365720ca3b26c024631a22d8da7739e", + "Web/CSS/CSS_box_model": "d63d4c21bda46b439e11be40d469e5dead9dc3a13122f7be6e5dc603c9c50177", + "Web/CSS/CSS_cascading_variables": "111595e9857243fcb303e674d318bed82561f78e4ba684e2f0b983a2ef2a78d9", + "Web/CSS/CSS_colors": "9e2d627f8da60b079fe04ddf8acdea0b6da5aaf5a3a2a5a5c149abc1024d32f2", + "Web/CSS/CSS_flexible_box_layout": "e9e9cd05def5764e3991cbb3f2964825ce62c4591dbc90ed72c62ecd617dc381", + "Web/CSS/CSS_grid_layout": "faae291184bbbaca13881cd6c3e22bd38cdc1f177ec9bbcf74ef707620f85311", + "Web/CSS/CSS_media_queries": "55ad7165cc445423e6df0cc9c0331fbf797f4cb7ed27b9c3a9d6a187d38d7238", + "Web/CSS/CSS_nesting": "a10671e5aaceea2888765edf0d096fe96a25c97f8f0dd94c6a83315a881af427", + "Web/CSS/CSS_pseudo-elements": "366b8229845ea058f47933d42bcb51361cc859712bf18afc6ec699a795953cad", + "Web/CSS/CSS_selectors": "5de54a53db25a9786180093fa2d15c377010458be2d1a6e22acaeb1d7b78991f", + "Web/CSS/CSS_syntax": "bd983150b7cd6f21b727949b64a347c5c76a17167750f0f62256b1da94502514", + "Web/CSS/CSS_text": "1a9742e49751671849f3bc75af259e55ca19775da64ebd37a6b22dd63c8eec1c", + "Web/CSS/CSS_transitions": "b10918f37574cb294f9ef7f94e46be9ab5479505e4d04172b05d80ef8b7c5b71", + "Web/CSS/Class_selectors": "3c7de9686c2a9accc578dfdb6a09453fec17d9a29934e9e29b0dd7ba56f0317b", + "Web/CSS/Containing_block": "41d5d32fa6e724fc20e34c54367bc10ae9ea462974b9dd0b4a5b983506c445bc", + "Web/CSS/ID_selectors": "732d80ad464d98e46ba239de2ee958cfd1248d56ebeaa05038989bde51b53437", + "Web/CSS/Inheritance": "15b62b1b3c570f34f88c3d0ab6bfce8cdc6902f70b140adf055b04a2c50dd2c0", + "Web/JavaScript/Guide/Expressions_and_operators": "0ab5ef6554422522fcca5759c2a0bd8bcc06730065bb072e671982c7e5f952ec", + "Web/JavaScript/Guide/Grammar_and_types": "0b67b0c09d82586e2cb0a4c3dc1dee824117367e2044902eb7ed99ab4005e544", + "Web/JavaScript/Guide/Indexed_collections": "685788d9fcf1b4240158d921d31c9025a20ddd8b3dfdbc01bd8d85bf846a4fd7", + "Web/JavaScript/Guide/Regular_expressions": "722a5afa20d423ad4a5f2bd5ffd03524690591dd7fe11c55328dd563f56b6ae8", + "Web/JavaScript/Guide/Using_classes": "6ab7a782c6a6726a369d26b95dbfe480590b48f509f8d85e841057f7fbbb5e67", + "Web/JavaScript/Guide/Working_with_objects": "3da4cbf0d31f059143fa48001b4dc29872ff4da9a9fd4596b17ca83e6774eee4", + "Web/JavaScript/Reference/Functions": "daf152f0dcbb47292c3f7eb6384a80cf33b3704ac72f0a504f1469f5639bf443", + "Web/JavaScript/Reference/Iteration_protocols": "edceffc0bdcc2ae396dd443fc0deef393ca837b8584f695f1eb2c5c73b8c5334", + "Web/JavaScript/Reference/Lexical_grammar": "6dcd23be861cfde764db79d0e03eccccfed1657507c696e7fc6fb9e20dc7cb5f", + "Web/JavaScript/Reference/Regular_expressions": "12e0800e2499f16624adc73dba2cd48e65135bd0cfd55187e7c93ba69c3065b3", + "Web/JavaScript/Reference/Errors": "68af9a33e2669381df50682df012f68db133a0d7e0fa9d9243f2bd68ef739451", + "Web/SVG/Attribute/decoding": "e0363c0ed636c3a7ea74ab9b2e9d6235800fc6783142c705bd3c234ca4c732bf", + "Web/CSS/Replaced_element": "a7e34961eab402576e5010233c3d6dbb1e75ab2bcfe24bbfefc21cbc44e32329", + "Web/CSS/Shorthand_properties": "18a1da7b7c9ca1976aa9ca59eddd68f1f26374eae2adbafc439944f6dc37728b", + "Web/CSS/Syntax": "57fe7dcce5ff6785a49777b01a58f532691ededc365eed7e959ac115ff99c0d3", + "Web/CSS/Type_selectors": "3d75465923e30357a237c9e0d975571301df51635fc7522565559cf0f731116b", + "Web/CSS/Universal_selectors": "7bd29c64fda0f241102f6852da689c04e5c03e62caa3c9f5d241e074fb041f1d", + "Web/CSS/angle": "3265a88fab529faef3ae3e345fe5acae2aeaefa30d28beb6613f4c9d4c4b6249", + "Web/CSS/animation-range": "d9bd3587afaa8960c8c7d0ef36cc09c8a72702ef9715ede149984d5564d6d155", + "Web/CSS/appearance": "56fc63cd602730a2b1e6cd87d8f7b579ce7311bb9615d9283cc748af05c8dcbc", + "Web/CSS/backdrop-filter": "bc9dfccd02a589b17c113196fa521db8960df92975669fa41884547ab040f5b3", + "Web/CSS/background-position": "6777cdbe556fc927b4e70a10f4d9e36bb361355b927285eabe670c574316a21a", + "Web/CSS/border-color": "fdf397e0116e83f0b7fcf0bfc8d86f783ca4120b926ab8faedcca848b477bdb9", + "Web/CSS/border-style": "a37f51f5cf0ab8304f2dfd4786cb8fbf579b233b6e6651d793b594362d086e7d", + "Web/CSS/border-width": "cf68205ddae369b3e29a81af339bd8ab7fad95541064648b9bbe173496107d01", + "Web/CSS/calc": "7776ef2ccef69b1b7d71965f7ec7cafe1035e2e3779473425cc9c6f0a738b871", + "Web/CSS/caret-color": "2e1337ec6042144148e30ec7a6210fc5214a4ce7843f3326a42950ddd7864ca6", + "Web/CSS/color-interpolation-method": "f764f1dc09bf700b6bec676eb95daadf821b9a3f3776443b54fcf0361d00a74a", + "Web/CSS/computed_value": "b8e4f50f0b628ca360c027be4641ba9a13e24fc2b5cd0c2327de3da7bd924b22", + "Web/CSS/counters": "0a0811db802ded17553a049728552c12ba545520cbdee5f5c6fae2ae92f10da1", + "Web/CSS/flex-basis": "c5862f98f20a0077b615165a5aaa21af4fb3812abd3d1158f5afba2020c63529", + "Web/CSS/flex-direction": "540e5a1de67415d3347086589c9c389f9b1fbc93cad81dc49458c15c9b8439b6", + "Web/CSS/flex-grow": "9cd1ecc74384a388e13c64f64991bcac9302d8159743f33ea2df3b1322e30cd3", + "Web/CSS/flex-wrap": "f75a9d1ac3f4600f841905224e4deebe6a892dae064d924a9806053a15e51cd0", + "Web/CSS/font": "7b866799983cde76f7bcdc2c12f3750397f2a29c18e1b65e17f2377291d0b360", + "Web/CSS/font-synthesis-position": "730092806a4747e722678477e612b2868a93896c87c2f4627778efe4b8c8993a", + "Web/CSS/gradient": "ccb3a18709636afee97bbdb86dddff0e1248ecc8f043f2242689a5878ea24203", + "Web/CSS/image": "49fd752584ddba1e713563f7080b45151f0db0a6dae0a08b50b6f2830c1f3e11", + "Web/CSS/initial_value": "66f368f2a48699748024fba648aeb6ad780a1bd84edb0a353d1517ff84bea2da", + "Web/CSS/length": "d5f00f815636b274ce39db6d7b6c057c78d0450fe3b47fcf268b6625a9a6a2a3", + "Web/CSS/number": "1952011abab673c82b465de12bb27c315461d48611e28723a8a2cc95cf7cf4c6", + "Web/CSS/object-position": "5281a8b8a56fd9cda4b8ead1b9535cf368493ae516d7bd551deae0eb8d951c39", + "Web/CSS/overlay": "9eaca56c3679d490b9cad843214060fc85667bf7820e4feb8ba9648dbcf3b51d", + "Web/CSS/text-transform": "49e959da0c0ee28beabb3b86ca1265d3ef972c65f97a41bdaeb410b87d1f86b7", + "Web/CSS/transform-function": "c0e4f869b2bd662d2618ae2f94377f0aed49e5f5195d617faa472af47135f1c3", + "Web/CSS/used_value": "a001909bb748d891a641a9e67728a91dce27effecb3b36784c82c4029e5e5aeb", + "Web/CSS/white-space": "f618d20be14f17f4d25bfe12b35a92f0c7d4c70c594b5358354ca8a08bb2da2d", + "Web/CSS/z-index": "7dbafb4ef0e24bc7e4138e65e99abd46ac00aee793a94e8b69c73599454eddec", + "Web/HTML/Attributes/autocomplete": "2391361d8483daa08b214b2adfa999c8ed88ada1ae7768cc1856bd3081ca088f", + "Web/HTML/Attributes/dirname": "95cbaf4ab15e19b43f75ee54c42064291b9dfdc9c501e909b8dcc4ca9a6aad40", + "Web/HTML/Attributes/max": "c482ad6343dc8ea21b9ab4c80bfaac456226068912fc8face00ce1b31abf82d9", + "Web/HTML/Attributes/min": "152dbcfff0a05e64e8d73980a0d08091debd2b0ff79b8027bf9d349df76fff4a", + "Web/HTML/Attributes/readonly": "5a0611ee0adeeebeb0d19161331c037e81ae5d92c37904f568bbef06b76abbb1", + "Web/HTML/Attributes/rel": "1c03ded1761c35cddce17cad4e8f37b6b30d4e6661f688e7e8165c83cf5419f8", + "Web/HTML/Attributes/required": "fc8bfa0c7e908d3f1201e76abf3d4ef5750a3b93c52d36605f51b1fd5c6b72cc", + "Web/HTML/Attributes/step": "b6ccafe1ce72259a4ffb55b382a9a718d7379842be3c4d2fe9184d198bb7f925", + "Web/HTML/Global_attributes/enterkeyhint": "4c587c9807f9f5eb5f62618c605a8da8b6fc9b94cfe6af5009401e8408eaaa1f", + "Web/HTML/Element/area": "97bd8645ddd18968e268b7b0cd441204234b40fe3d78db027ec770919b51c367", + "Web/HTML/Element/article": "3a676cbb13c36212e8b889c6ed1574ddbe757d0c1f32cba2668764abdd82a5b4", + "Web/HTML/Element/audio": "285648c9979f98e2364f98cbf7a625208cb2a89734870628ddae3836a146a6f4", + "Web/HTML/Element/canvas": "1dec7cf846d197a5fc7fb8dfd51412f431ea49b0c08ad82cff950c9a621146ac", + "Web/HTML/Element/datalist": "e0d378a546db0036cf3aeb064602c97d5cf43b3b87d9c3b18b42b26ff0f6244d", + "Web/HTML/Element/fieldset": "a858009b4f009748d3865f54b9c6a689f953382b8618b00b9252924f3cfe04d9", + "Web/HTML/Element/header": "10c44cd76f229ab00a235c7eb380dfb6636cac690cc15f4ed0621fe0e4c64539", + "Web/HTML/Element/i": "8ea3e8f789a0ca3d126af36b61fe9e5be633214b754f2d56233f824e1cd7baf8", + "Web/HTML/Element/li": "37a7c7f001fcb3b921c8c837f27fd97b7a1d5854dd9974732c7e31b2e2ef573c", + "Web/HTML/Element/meter": "597fa48416c5e9b966900d4f7ab60a0da7029c8fc4e9c92fd829bce1762e7c17", + "Web/HTML/Element/object": "370e59aa77c152cd9672844cfedc1e74446471f272fe1de25d69c04743537f08", + "Web/HTML/Element/ol": "5d814e4f20d0598b8d66c5571b9c70d8fe99313b7e94d440b34362d55a4d3412", + "Web/HTML/Element/optgroup": "497cd07a0fab37a9f5d70f8a8f73253111797b972fff5dd4ad43263b844bf2ae", + "Web/HTML/Element/option": "26d1a2bee73052f8ef408345f5cb374445d250b5722b22919a17299459b90c3a", + "Web/HTML/Element/picture": "674d4bffa1a11cd4acb90496d479bbdfea466b728a586fd0ac33006ec5e0a428", + "Web/HTML/Element/progress": "3988e08b84e01dec10641899407261838ea53dd527d009a29265b2f9c176061a", + "Web/HTML/Element/source": "6dd7eb54108a6cf1e35f8627a130053b12e759cc9dc97521f996090347c6ad9e", + "Web/HTML/Element/tr": "4f23e9efc44f16f925fac4892db443145e44250eeb90ecb4c025ca7b3baa34ee", + "Glossary/Baseline/Compatibility": "5d33e3577b0361f36ec9bcfeeeebfe3f76560574c55ec7f7fcf570ad3e61ee32", + "Glossary/Baseline/Typography": "357fe7e5047e81e4f3624cbd70286e9e305e1a025a55c74886fd185269d10568", + "Glossary/Boolean/HTML": "29caca453284b87530fff2e215508a3c7bf817cb1c0356e14d4d5b7a01f71fe9", + "Web/CSS/@media/prefers-reduced-transparency": "dedcf730cce29d5d0f9f0ddf691293c339b0af7a6f22adad7689dd99d9598ef8", + "Web/CSS/CSS_animations/Using_CSS_animations": "6080fc283e1085f69e3d3a0e53a85a8a00ac02293e52d13555dbadaf10e7d244", + "Web/CSS/CSS_backgrounds_and_borders/Resizing_background_images": "462523586eb23fd9a3a3e64a4704309ad5010d17b8b32fdbfece1e1e75e3da45", + "Web/CSS/CSS_box_model/Introduction_to_the_CSS_box_model": "3e581c14b180a62a508d1a2d545a18f1e4a97a7476ecd6862edb01b289e68dae", + "Web/CSS/CSS_box_model/Mastering_margin_collapsing": "39d1d1a21dafbd939750eb62594974b2444c801046a05c9a836c15a777b72f1b", + "Web/CSS/CSS_colors/Applying_color": "8151a18e29c1264bc5295578b32d5c94c732d2fc4f42a8c273c77be4fa9a9ecf", + "Web/CSS/CSS_flexible_box_layout/Aligning_items_in_a_flex_container": "8330a877829c604abaf8de8b76f87ad284a517932469eeb9047a61807f52ba01", + "Web/CSS/CSS_flexible_box_layout/Basic_concepts_of_flexbox": "f82b788a171506c9b8d3564eaaa3776442888b89223d78b70cc540886c9d5963", + "Web/CSS/CSS_grid_layout/Basic_concepts_of_grid_layout": "ffdebba7ea2e2246c6f391ab73742f099cca41d947036c226deb124a73ce0065", + "Web/CSS/CSS_media_queries/Using_media_queries": "9b2f4fd73a4c9bbf63d2b22748d6c8378d83bb8927c66cec8067e4fbba12a022", + "Web/CSS/CSS_nesting/Nesting_and_specificity": "aa618eadd9974969ee9461c7061f7db58d49868a89788bfef139c3b76e6e2c14", + "Web/CSS/CSS_syntax/Error_handling": "5e4ecc757e631d03ed1d63537854b062e5d77003fbef59b553a3114108bed68a", + "Web/CSS/CSS_text/Wrapping_breaking_text": "c531eaa158251581c59f63612d44c075cb1103a367a0d3059c0dfbf9ac4e6a9e", + "Web/CSS/CSS_transitions/Using_CSS_transitions": "8ddb432ae2b9d7e4271f013c935c2edd6db0ed905060c4621b447042eb06fb8b", + "Web/CSS/color_value/light-dark": "b83a541bd34fdf5936b4bee860479b8bb593508d3ae524849e63d8fbb3eb9efe", + "Web/CSS/transform-function/rotate": "019001bd3fc980d4443d1f121e5a67349786a80b2229af702ef56f2005f4530b", + "Web/CSS/transform-function/scale": "567eef96782112776a9ae938855796bd3cde2ea28579d6087a79afed803cc0d3", + "Web/HTML/Element/input/button": "d3b148f0907f130105a1105c71074ad6e877464cbc3adf88647cbc533ec08475", + "Web/HTML/Element/input/color": "69c88156a1004291e3813cf846536f8f6cbd775e622010e180c15ef188cdc09d", + "Web/HTML/Element/input/datetime-local": "82cf622ee08ebb6277a4ffdd79015ea5353b4421ae0b75051faf3c3c3dc972d6", + "Web/HTML/Element/input/email": "49e870642c96f3ff4783e46cfd315b882dbed62daa7a6c2a8495953b76c99e47", + "Web/HTML/Element/input/hidden": "1497af0edcf9836f482709af857c62d86ba58b5d5a8a24b3a115ed6e068ff093", + "Web/HTML/Element/input/image": "5ee1792bdea7484c8a05dca9fd5bdccf506503337a812b27b57d25671577ed04", + "Web/HTML/Element/input/month": "084b244faf1c6e6ae26e0bc07c4605e9bdd353393b690e71752c5eeb2e73a136", + "Web/HTML/Element/input/password": "8ab9e2e2f47d450658552a27d2534201eeaf6b67459e7f7370befa893acddc1e", + "Web/HTML/Element/input/range": "9903fc16be3388ae3a18ec4265b8587b71c68e8dc8a850620741662ddb753c8e", + "Web/HTML/Element/input/reset": "6aa72ef8a2903a4fe48b569839c7c7135a5778652696afd68fcf477fbbfd0bb3", + "Web/HTML/Element/input/search": "7f3d9463589f1e0435efa74f7e2dc8a4ef7721f6dad98affbf4ddc82aa447cd8", + "Web/HTML/Element/input/submit": "6187cd28c8995605903553a374f9ce2fc7093bb75d39a739c5cefd3ca742f7d8", + "Web/HTML/Element/input/tel": "82274077781d00f1e66de2ad478a79c89db288dc1a1fe4c6efbab544f2788f12", + "Web/HTML/Element/input/text": "2096e2ac29192162c1434013ddd5adf4ecbeff21edaa850d3c262a0d84a14471", + "Web/HTML/Element/input/time": "ee7ee7114ad307b89394e15140eed5e08ec81e81d1d8e5f8cf9a357aa3a1e678", + "Web/HTML/Element/input/url": "9681e933afdebd3d7dc8f89d720d98cd88e0aa50c0b61852f3befa1521036e5d", + "Web/HTML/Element/input/week": "850fe829fd19334b4b13e59674c8727978010255d0497eceb259df2aaab5a608", + "Web/HTML/Element/script/type": "74beaf7a923e81daa5c313ea82842148d9511cb1d735b9e36e6b9725ad49495d", + "Web/JavaScript/Guide/Regular_expressions/Cheatsheet": "13c0195f72d6921ddb6997417e1185cc5ff1c0ea90d6004b855a0578314bf1f2", + "Web/JavaScript/Reference/Functions/arguments": "7db22f8a7f3a197f741afb5dd5262456290be35c476c254cb549d235b009d69a", + "Web/JavaScript/Reference/Global_Objects/ArrayBuffer": "bc64be53b759f2fe00d31faff9e4acf14fd075bc465040e0a7625c4a7b7b3cbe", + "Web/JavaScript/Reference/Global_Objects/BigInt": "f64b7d6da1378009447b925eba390c8a9a81a93d148a460ffe5ed14dc74c140c", + "Web/JavaScript/Reference/Global_Objects/Boolean": "cb3429f8233b7dafd2673d18d5cb05962bec4da84a9e31e4ca0badd7709d6779", + "Web/JavaScript/Reference/Global_Objects/Error": "8eefd4d57a78affafbab325a6f61ef518c0a8c4684fa4c398edf7147a59b9d09", + "Web/JavaScript/Reference/Global_Objects/Infinity": "9c134256484e50681c1b6794efab0dd7d406374ccf9ed316950e1cf698878eb8", + "Web/JavaScript/Reference/Global_Objects/Intl": "c5b61e2c0277c97b3cbb460e5d5ba58a6b3530a7cd855a66fc75ec10de7aaeb4", + "Web/JavaScript/Reference/Global_Objects/JSON": "50dd268151a066ccbd000755576fc911b6900675bb67d85cca792745859f176b", + "Web/JavaScript/Reference/Global_Objects/NaN": "e48c4254898c5665c4185961df4e23ac1e65d10c7154f6e5b50db156d269d7ab", + "Web/JavaScript/Reference/Global_Objects/Proxy": "debf1dfae2cf48faca135a71a7ae2d4f8d9afe7da2e2c81a27d27cafffb9ca53", + "Web/JavaScript/Reference/Global_Objects/Symbol": "860388a14c180911fccc7c0419eb52b2ffafba090441cfc16ae5f0316ab06c36", + "Web/JavaScript/Reference/Global_Objects/undefined": "861c8848becf49e7941ee5c3852d6ef44d4b23c1eb2b16ddc965c448421cc963", + "Web/JavaScript/Reference/Regular_expressions/Backreference": "bbb03316ac5ce35173a4cef4e050ead94041c8b529433974d74ccc55438b1113", + "Web/JavaScript/Reference/Regular_expressions/Capturing_group": "a2cfc35a9bef7e5e8318e10028e3e9986950db9637e954ac8f66dbe55acb6d93", + "Web/JavaScript/Reference/Regular_expressions/Character_class": "06afe3e86a3734e74b60d04fb0b42c8e61488f00f28f233d44988702365e728c", + "Web/JavaScript/Reference/Regular_expressions/Character_class_escape": "8cb3dfcf716b87147884b124210a943d9698baa61a04ee5b01c1883331422fd8", + "Web/JavaScript/Reference/Regular_expressions/Character_escape": "c610a478763ca08d6234399dca9b3730c2bdecd8bf7f0bf2f0fed78bf345014f", + "Web/JavaScript/Reference/Errors/Not_defined": "3cf239a277826911099c6b059a6db986eebcf8ef39d6c6a7ef56824b6489f473", + "Web/JavaScript/Reference/Statements/const": "ab2a21903a3478fb6b6921a3abb80fb257f202d791159c44cb1f1f7085966f18", + "Web/JavaScript/Reference/Statements/if...else": "ae00e0071db049297fac01b9def534db3061ba934e397b05af97f74f55d4c4a1", + "Web/JavaScript/Reference/Statements/let": "8699a773f3653a275f480ddadd868e8d2fda99079cbcaa98915c1e02213322c5", + "Web/JavaScript/Reference/Statements/var": "fa58ab04f446201d516b742cbec88b064d0b82ea0242e6c0311136b941b9d3c4", + "Web/JavaScript/Reference/Operators/Conditional_operator": "7315ad2734f43ded4cf2a9e1a12b0a7dbc713a3a51df6cbe18a6b7d4fa99adb1", + "Web/JavaScript/Reference/Operators/Logical_AND": "d72cb13cf9d4425c984af55697bcaaeb7816e1b52943ab6d748e87ecd112b30d", + "Web/JavaScript/Reference/Operators/Logical_OR": "08095094c72e7b3aaecb5d839de33254ce891daf6f494d8b05fddae12c08f91d", + "Web/JavaScript/Reference/Operators/Nullish_coalescing": "83342f0fa2460dc39dceede5c8b952a94286804542526725f4b25be15d82959c", + "Web/JavaScript/Reference/Operators/Object_initializer": "08da266bd5a688b1c213985cd7286382efcecb9d90cd1326a0e745db606c7869", + "Web/JavaScript/Reference/Operators/Property_accessors": "f31f2a89137b45d8807413f3c35b76fc81f6265e6342f99ee4273f8da6e49beb", + "Web/JavaScript/Reference/Operators/await": "ca8d1d4dff51ef1880ac9437dce31c2ebfd85b4c5607f43757d77f46953fd4fe", + "Web/JavaScript/Reference/Operators/function": "8f938415a34fb9054bb87eb8643e90a58b2ffde11b009b6d9a3cf64cf75fbacd", + "Web/JavaScript/Reference/Operators/delete": "835a054ee6878d7fa50f5756a00edae74d015bb61407ddf2f7a1f3efa8e4d311", + "Web/JavaScript/Reference/Operators/new": "60e3fd0227d637ec17120d613a26d6b1991bb7e3d78c016dcd9b13d183edf2b9", + "Web/JavaScript/Reference/Operators/null": "fc84140908f1be4ae43e2a0a38fdc4f93a40d95070b4ad7204db7c979e84b53b", + "Web/JavaScript/Reference/Operators/this": "bf27827ed90e60ea54da8d64083e7f5fe059284cb6f820ad8e4226939f363534", + "Web/HTML/Element/script/type/speculationrules": "01b42c6dde0f7f93df648ea06891485870b92eb6ca319037b8380993c9a2affb", + "Web/JavaScript/Reference/Global_Objects/ArrayBuffer/detached": "bf865d72b2a34b8b55e920e099d4057bae2cfd1952d1c03ae91ec4ef8b22bdb2", + "Web/JavaScript/Reference/Global_Objects/Array/at": "f396b141214cf576bb70564d5cbef2852da5a5b20ce9f3ffe075f197149f91da", + "Web/JavaScript/Reference/Global_Objects/Array/reverse": "759b44d5bba84fac3ac1a524b4271459dcb270609971b1abd37d7e769efb48c3", + "Web/JavaScript/Reference/Global_Objects/Array/unshift": "f23d4874d7f58b40afa754655bef2234b35bc91343a036767c0cbf5849a88e73", + "Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString": "22967276e0b5a2fe4a4b6e9ac283b3c54c5be654fd626538d6c2936c52915d8d", + "Web/JavaScript/Reference/Global_Objects/Date/toLocaleString": "6e215c8acc78bec034893ede7b03c04e3a486d92a3d999f3a96adfcefc8a5870", + "Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat": "c59451fb743a74aa52f495ed8ad18ba1618dce57153e8b29943e92f498f1519d", + "Web/JavaScript/Reference/Global_Objects/Promise/Promise": "6f8f348e7dc5115b360500b41826d7f2b66c25d5684a37d3bfb07c9a2cc6f3ae", + "Web/JavaScript/Reference/Global_Objects/Promise/resolve": "759d05b602002eb5e366829f198256771f940b9913ba58abb5feb7a502e97fc5", + "Web/JavaScript/Reference/Global_Objects/Promise/withResolvers": "432f9e97b75bf49deabdb001cfe04c9fba181866e82f2dd27b6768e88d1b27a5", + "Web/JavaScript/Reference/Global_Objects/Object/constructor": "cd3811964e426f5f8d05c78f6375b208a5269162bb33b33e310df1c772f05d69", + "Web/JavaScript/Reference/Global_Objects/Object/create": "b839d6e25ad3d748dc93df7abc573221592db4584c5e815d7a6356d5a6c05f16", + "Web/JavaScript/Reference/Global_Objects/Object/defineProperty": "3766a22249ba24f092da590da7713ab0b9c20147e375c2c494e6a1b6f891357f", + "Web/JavaScript/Reference/Global_Objects/Object/freeze": "3459fc40c80d47a8f9bd00a4f2304df236b57aec46bc8e1eebe467ec36e17dab", + "Web/JavaScript/Reference/Global_Objects/Object/fromEntries": "fdc24beaa68dd3ad48a64aa55134b90f5322cb214206e8685105b6abc4b2ed14", + "Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames": "44d8b893d539b6c0ecb16249a209503e9cc9af5971e1df0c12ce1da2621ca070", + "Web/JavaScript/Reference/Global_Objects/Object/hasOwn": "5b22c8a759015e7e0375642a2bc18651ee00cac7b48519b8436b0c52bb6f43ca", + "Web/JavaScript/Reference/Global_Objects/Object/is": "5e04c38ed1226e79ba045c8d081777a161597e72ae19de4ec9fe6633d183ad61", + "Web/JavaScript/Reference/Global_Objects/Object/valueOf": "442de4fedb51c7f10fa286a8d41149c1db82ee9dbfa5240157d1c63c2a8f8c99", + "Web/JavaScript/Reference/Global_Objects/Object/toString": "b5d1a84c749c68db1d983ba5777f4e7c8281d51a1b79913702188806cdbab001", + "Web/JavaScript/Reference/Global_Objects/RegExp/exec": "9b6ec9cc931e98d5f6a73b562129e15a40b339b7c645a321512f4b9099655110", + "Web/JavaScript/Reference/Global_Objects/RegExp/lastIndex": "b112c3e9e940baeca13d1a7836fb86e9e11d774519c7b50e89f01f3ab436b37e", + "Web/JavaScript/Reference/Global_Objects/RegExp/test": "32c63ea4166ed1d4b5e5cc4a8fb710932e7105b26e4aed436e7440b1f4737aca", + "Web/JavaScript/Reference/Global_Objects/Set/difference": "3ab8b99f6a088c99fb9060b1c54953d5d3bfe5addfacd37fd2ba03030c581a8d", + "Web/JavaScript/Reference/Global_Objects/String/Symbol.iterator": "d103e1e3f96b3935ed15994c2c05fe496ba8a6874d16a56b38de65ce4c551f06", + "Web/JavaScript/Reference/Global_Objects/String/trim": "e13ab8b171db53c0c6c5416cc4968025c013d20ecb6687edef50239a8011fe2c" +} \ No newline at end of file diff --git a/next.config.js b/next.config.js index 3c1330f..6d3c604 100644 --- a/next.config.js +++ b/next.config.js @@ -1,12 +1,12 @@ module.exports = { env: { - mainNav: [ + mainNav: JSON.stringify([ { path: '/uk/docs/Web/', title: 'Технології', }, { path: '/docs/', title: 'Про проєкт' }, - ], + ]), licenseLink: '/docs/licensing/', ourGithub: 'https://github.com/webdoky', }, diff --git a/package.json b/package.json index 46a9d1a..c3a24c4 100644 --- a/package.json +++ b/package.json @@ -4,17 +4,17 @@ "@mdn/browser-compat-data": "^4.1.2", "@mdn/yari": "^1.29.2", "@webdoky/content-processor": "^1.24.1", - "algoliasearch": "^4.22.1", + "algoliasearch": "~5.2.1", "classnames": "^2.3.1", "cyrillic-to-translit-js": "^3.2.1", "dotenv": "^16.0.1", "esm-resolve": "^1.0.8", "fast-glob": "^3.3.2", "fs-extra": "^10.1.0", - "fuse.js": "^3.6.1", "github-slugger": "^1.4.0", "glossary-content": "https://github.com/webdoky/glossary-content.git#main", "gray-matter": "^4.0.3", + "instantsearch.css": "~8.5.0", "is-absolute-url": "^4.0.1", "lodash": "^4.17.21", "mdast-util-to-hast": "^12.1.1", @@ -26,6 +26,7 @@ "react": "^18.2.0", "react-copy-to-clipboard": "^5.1.0", "react-dom": "^18.2.0", + "react-instantsearch": "~7.13.0", "rehype-autolink-headings": "^6.1.1", "rehype-external-links": "^1.0.1", "rehype-parse": "^8.0.4", diff --git a/populate-algolia/extractTextFromHtml.mts b/populate-algolia/extractTextFromHtml.mts index 813be9d..3557941 100644 --- a/populate-algolia/extractTextFromHtml.mts +++ b/populate-algolia/extractTextFromHtml.mts @@ -16,6 +16,8 @@ const NO_GO_TAGS: string[] = [ '.bc-data', '.bc-specs', 'iframe', + '#Quick_links', + '.index', ]; const CUT_MARKERS: string[] = [ @@ -24,6 +26,41 @@ const CUT_MARKERS: string[] = [ '#sumisnist-z-brauzeramy', ]; +const BLANK_REGEXP = /^\s+$/; + +// export default function extractTextFromHtml(htmlCode: string): string { +// if (!htmlCode) { +// throw new Error(`No HTML code provided`); +// } +// const $ = load(htmlCode); +// NO_GO_TAGS.forEach((noGoTag) => { +// $(noGoTag).remove(); +// }); +// CUT_MARKERS.forEach((cutMarker) => { +// const cutMarkerElement = $(cutMarker); +// cutMarkerElement.nextAll().remove(); +// cutMarkerElement.remove(); +// }); +// const linesArray = $.root() +// .children() +// .map((_, element) => { +// if (element.tagName === 'UL') { +// return element.children; +// } +// return [element]; +// }) +// .toArray() +// .flat() +// .map((element) => $.text([element])); +// console.log('linesArray', linesArray); +// let text = linesArray.filter((line) => !line.match(BLANK_REGEXP)).join('\n'); +// text = text.replace(/(\s)+/g, '$1').trim(); +// if (!text) { +// throw new Error(`No text found in HTML`); +// } +// return text; +// } + export default function extractTextFromHtml(htmlCode: string): string { if (!htmlCode) { throw new Error(`No HTML code provided`); diff --git a/populate-algolia/getAlgoliaClient.mts b/populate-algolia/getAlgoliaClient.mts new file mode 100644 index 0000000..286bf64 --- /dev/null +++ b/populate-algolia/getAlgoliaClient.mts @@ -0,0 +1,18 @@ +import { algoliasearch } from 'algoliasearch'; + +export default function getAlgoliaClient() { + const { + ALGOLIA_ADMIN_KEY, + NEXT_PUBLIC_ALGOLIA_APP_ID, + NEXT_PUBLIC_ALGOLIA_INDEX, + } = process.env; + if ( + !ALGOLIA_ADMIN_KEY || + !NEXT_PUBLIC_ALGOLIA_APP_ID || + !NEXT_PUBLIC_ALGOLIA_INDEX + ) { + throw new Error('Algolia credentials are missing'); + } + const client = algoliasearch(NEXT_PUBLIC_ALGOLIA_APP_ID, ALGOLIA_ADMIN_KEY); + return client; +} diff --git a/populate-algolia/getAlgoliaIndex.mts b/populate-algolia/getAlgoliaIndex.mts deleted file mode 100644 index d87fe63..0000000 --- a/populate-algolia/getAlgoliaIndex.mts +++ /dev/null @@ -1,11 +0,0 @@ -import algoliasearch from 'algoliasearch'; - -export default function getAlgoliaIndex() { - const { ALGOLIA_ADMIN_KEY, NEXT_ALGOLIA_APP_ID, NEXT_ALGOLIA_INDEX } = - process.env; - if (!ALGOLIA_ADMIN_KEY || !NEXT_ALGOLIA_APP_ID || !NEXT_ALGOLIA_INDEX) { - throw new Error('Algolia credentials are missing'); - } - const client = algoliasearch(NEXT_ALGOLIA_APP_ID, ALGOLIA_ADMIN_KEY); - return client.initIndex(NEXT_ALGOLIA_INDEX); -} diff --git a/populate-algolia/hashes.mts b/populate-algolia/hashes.mts index 523c17d..ca527bf 100644 --- a/populate-algolia/hashes.mts +++ b/populate-algolia/hashes.mts @@ -7,7 +7,7 @@ export function getHash(slug: string): string | undefined { export async function saveHash(slug: string, hashValue: string): Promise { hashes[slug] = hashValue; - const json = JSON.stringify(hashes); + const json = JSON.stringify(hashes, null, 2); await writeFile('hashes.json', json, 'utf8'); } diff --git a/populate-algolia/index.mts b/populate-algolia/index.mts index 5eb39a5..d7ec13f 100644 --- a/populate-algolia/index.mts +++ b/populate-algolia/index.mts @@ -1,16 +1,17 @@ +import { writeFile } from 'fs/promises'; + import * as dotenv from 'dotenv'; import fg from 'fast-glob'; +import extractPrebuildResultItem from './extractPrebuildResultItem.mjs'; import extractTextFromHtml from './extractTextFromHtml.mjs'; -import getAlgoliaIndex from './getAlgoliaIndex.mjs'; +import getAlgoliaClient from './getAlgoliaClient.mjs'; import hash from './hash.mjs'; import { getHash, initHashes, saveHash } from './hashes.mjs'; -import extractPrebuildResultItem from './extractPrebuildResultItem.mjs'; import saveResultItemToAlgolia from './saveResultItemToAlgolia.mjs'; -import { writeFile } from 'fs/promises'; dotenv.config({ path: '.env.local' }); -const index = getAlgoliaIndex(); +const client = getAlgoliaClient(); async function run() { try { @@ -41,7 +42,7 @@ async function run() { if (process.env.NODE_ENV !== 'production') { await writeFile('debug.txt', text, 'utf8'); } - await saveResultItemToAlgolia(resultItem, text, index); + await saveResultItemToAlgolia(resultItem, text, client); await saveHash(slug, newHash); filesProcessed++; } diff --git a/pre-build/index.mts b/pre-build/index.mts index 738305c..df1fb4b 100644 --- a/pre-build/index.mts +++ b/pre-build/index.mts @@ -1,15 +1,18 @@ import extractLiveExamples from './extractLiveExamples.mjs'; import extractEmbeddedSamples from './extractSamples.mjs'; import refreshInternalImages from './internalImages.mjs'; -import prepareSearchIndex from './searchIndex.mjs'; import processContent from './processContent.mjs'; import refreshExternalImages from './externalImages.mjs'; (async function () { - await processContent(); - await prepareSearchIndex(); - await refreshInternalImages(); - await extractEmbeddedSamples(); - await refreshExternalImages(); - await extractLiveExamples(); + try { + await processContent(); + await refreshInternalImages(); + await extractEmbeddedSamples(); + await refreshExternalImages(); + await extractLiveExamples(); + } catch (error) { + console.error(error); + process.exit(1); + } })(); diff --git a/pre-build/searchIndex.mts b/pre-build/searchIndex.mts deleted file mode 100644 index 97d3c3e..0000000 --- a/pre-build/searchIndex.mts +++ /dev/null @@ -1,118 +0,0 @@ -import matter from 'gray-matter'; -import { promises as fs } from 'fs'; -import path from 'path'; -import { unified } from 'unified'; -import remarkParse from 'remark-parse'; -import { Node, visit } from 'unist-util-visit'; -import { readIndex } from './utils/readContent.mjs'; - -const pathToInternalContent = `docs/`; -const dataOutputDir = 'public/_data'; - -type MdNode = Node & { - type: string; - depth?: number; - children?: MdNode[]; - value?: string; -}; - -const changelogProcessor = unified().use(remarkParse); - -const trailingIndex = '/index'; - -const stripTrailingIndex = (urlString: string) => { - if (urlString.endsWith(trailingIndex)) { - return urlString.slice(0, urlString.length - trailingIndex.length); - } - return urlString; -}; - -interface SearchIndexData { - title: string; - path: string; - slug: string; -} - -const prepareSearchIndex = async () => { - const contentIndex = await readIndex(); - const pages = contentIndex.index; - if (pages.length === 0) { - throw new Error('Failed to collect data for search index: no pages found'); - } - const wdSearchData: SearchIndexData[] = pages - .filter(({ hasContent }) => hasContent) - .map(({ title, path, slug }) => ({ - title, - path, - slug, - })); - if (wdSearchData.length === 0) { - throw new Error('Failed to collect data for search index: no pages with content found'); - } - - console.info( - 'Collected search data for WebDocs articles...', - `${wdSearchData.length} entries.` - ); - - // Internal docs - const articles = await fs.readdir(path.resolve(pathToInternalContent)); - const internalDocSearchData: SearchIndexData[] = []; - - const processing = articles.map(async (articleName) => { - const articlePath = path.resolve(pathToInternalContent, articleName); - - const fileObject = await fs.stat(articlePath); - const contentPath = fileObject.isDirectory() - ? `${articlePath}/index.md` - : articlePath; - - const fileContent = await fs.readFile(contentPath); - - const { content: markdownInput } = matter(fileContent); - - const ast = await changelogProcessor.parse(markdownInput); - let articleTitle = ''; - - visit( - ast, - (node: MdNode) => node.type === 'heading' && node.depth === 1, - (node: MdNode) => { - articleTitle = node.children - .filter((child) => child.type === 'text') - .map((child) => child.value) - .join(' '); - } - ); - - const slug = stripTrailingIndex(`docs/${articleName.replace('.md', '')}`); - - internalDocSearchData.push({ - title: articleTitle, - slug, - path: `/${slug}`, - }); - }); - - await Promise.all(processing); - - console.info( - 'Collected search data for internal articles...', - `${internalDocSearchData.length} entries.` - ); - - // Writing into file - try { - await fs.access(dataOutputDir); - } catch (error) { - if (error.code === 'ENOENT') { - await fs.mkdir(dataOutputDir); - } - } - fs.writeFile( - path.resolve(dataOutputDir, 'search-index.json'), - JSON.stringify({ data: [...wdSearchData, ...internalDocSearchData] }) - ); -}; - -export default prepareSearchIndex; diff --git a/styles/globals.scss b/styles/globals.scss index 85111c8..a36e626 100644 --- a/styles/globals.scss +++ b/styles/globals.scss @@ -215,3 +215,5 @@ blockquote { } } } + +@import "./search.scss"; diff --git a/styles/search.scss b/styles/search.scss new file mode 100644 index 0000000..2630a8d --- /dev/null +++ b/styles/search.scss @@ -0,0 +1,148 @@ +.disabled { + cursor: not-allowed; + filter: opacity(0.5); + pointer-events: none; +} + +.hit-link { + color: currentColor; + padding: 1.5rem; + text-decoration: none; + width: 100%; +} + +.search-hits { + max-height: calc(100vh - 120px); +} + +.search-dummy { + max-height: 40px; +} + +.ais-SearchBox-form::before { + background: rgba(0, 0, 0, 0) + url(data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22%235a5e9a%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%3Ccircle%20cx%3D%2211%22%20cy%3D%2211%22%20r%3D%228%22%3E%3C%2Fcircle%3E%3Cline%20x1%3D%2221%22%20y1%3D%2221%22%20x2%3D%2216.65%22%20y2%3D%2216.65%22%3E%3C%2Fline%3E%3C%2Fsvg%3E) + repeat scroll 0% 0%; + content: ""; + height: 1rem; + left: 1rem; + margin-top: -0.5rem; + position: absolute; + top: 50%; + width: 1rem; +} + +.ais-PoweredBy { + text-align: center; + justify-content: center; + min-height: 1.6em; +} + +.ais-Hits-item.ais-Hits-item { + background-color: var(--color-ui-background); + color: var(--color-ui-typo); + padding: 0; + + &:hover { + filter: contrast(1.2); + + h4 { + text-decoration: underline; + } + } + h4 svg { + display: inline; + margin-right: 0.5em; + max-height: 1em; + } +} + +.ais-SearchBox-input.ais-SearchBox-input { + background-color: var(--color-ui-sidebar); + color: var(--color-ui-typo); +} + +.ais-Menu-list.ais-Menu-list { + display: flex; + flex-wrap: wrap; + gap: 0 1rem; + padding: 0 0.5rem; +} + +.hit-css { + color: color-mix( + in oklab, + theme("colors.orange.500") 20%, + var(--color-ui-typo) + ); + background-color: color-mix( + in oklab, + theme("colors.orange.500") 20%, + var(--color-ui-background) + ); +} + +.hit-glossary { + color: color-mix( + in oklab, + theme("colors.gray.500") 20%, + var(--color-ui-typo) + ); + background-color: color-mix( + in oklab, + theme("colors.gray.500") 20%, + var(--color-ui-background) + ); +} + +.hit-guide { + color: color-mix( + in oklab, + theme("colors.purple.500") 20%, + var(--color-ui-typo) + ); + background-color: color-mix( + in oklab, + theme("colors.purple.500") 20%, + var(--color-ui-background) + ); +} + +.hit-html { + color: color-mix( + in oklab, + theme("colors.green.500") 20%, + var(--color-ui-typo) + ); + background-color: color-mix( + in oklab, + theme("colors.green.500") 20%, + var(--color-ui-background) + ); +} + +.hit-javascript { + color: color-mix( + in oklab, + theme("colors.yellow.500") 20%, + var(--color-ui-typo) + ); + background-color: color-mix( + in oklab, + theme("colors.yellow.500") 20%, + var(--color-ui-background) + ); +} + +.hit-svg { + color: color-mix( + in oklab, + theme("colors.pink.500") 20%, + var(--color-ui-typo) + ); + background-color: color-mix( + in oklab, + theme("colors.pink.500") 20%, + var(--color-ui-background) + ); +} diff --git a/tsconfig.json b/tsconfig.json index d48749a..73dc20a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,16 +1,11 @@ { "ts-node": { - "include": [ - "**/*.mts", - ], + "include": ["**/*.mts"], + "transpileOnly": true }, "compilerOptions": { "target": "es5", - "lib": [ - "dom", - "dom.iterable", - "esnext" - ], + "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, "strict": false, @@ -24,12 +19,6 @@ "isolatedModules": true, "jsx": "preserve" }, - "include": [ - "next-env.d.ts", - "**/*.ts", - "**/*.tsx" - ], - "exclude": [ - "node_modules" - ] -} \ No newline at end of file + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], + "exclude": ["node_modules"] +} diff --git a/utils/algolia.ts b/utils/algolia.ts new file mode 100644 index 0000000..9904f41 --- /dev/null +++ b/utils/algolia.ts @@ -0,0 +1,22 @@ +import { liteClient as algoliasearch } from 'algoliasearch/lite'; + +export function getAlgoliaClient() { + if ( + !process.env.NEXT_PUBLIC_ALGOLIA_APP_ID || + !process.env.NEXT_PUBLIC_ALGOLIA_SEARCH_KEY + ) { + throw new Error('Algolia credentials are missing'); + } + + return algoliasearch( + process.env.NEXT_PUBLIC_ALGOLIA_APP_ID, + process.env.NEXT_PUBLIC_ALGOLIA_SEARCH_KEY + ); +} + +export function getAlgoliaIndexName() { + if (!process.env.NEXT_PUBLIC_ALGOLIA_INDEX) { + throw new Error('Algolia credentials are missing'); + } + return process.env.NEXT_PUBLIC_ALGOLIA_INDEX; +} diff --git a/yarn.lock b/yarn.lock index 216d774..7aa2c38 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,109 +2,74 @@ # yarn lockfile v1 -"@algolia/cache-browser-local-storage@4.22.1": - version "4.22.1" - resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.22.1.tgz#14b6dc9abc9e3a304a5fffb063d15f30af1032d1" - integrity sha512-Sw6IAmOCvvP6QNgY9j+Hv09mvkvEIDKjYW8ow0UDDAxSXy664RBNQk3i/0nt7gvceOJ6jGmOTimaZoY1THmU7g== - dependencies: - "@algolia/cache-common" "4.22.1" - -"@algolia/cache-common@4.22.1": - version "4.22.1" - resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.22.1.tgz#c625dff4bc2a74e79f9aed67b4e053b0ef1b3ec1" - integrity sha512-TJMBKqZNKYB9TptRRjSUtevJeQVXRmg6rk9qgFKWvOy8jhCPdyNZV1nB3SKGufzvTVbomAukFR8guu/8NRKBTA== - -"@algolia/cache-in-memory@4.22.1": - version "4.22.1" - resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.22.1.tgz#858a3d887f521362e87d04f3943e2810226a0d71" - integrity sha512-ve+6Ac2LhwpufuWavM/aHjLoNz/Z/sYSgNIXsinGofWOysPilQZPUetqLj8vbvi+DHZZaYSEP9H5SRVXnpsNNw== - dependencies: - "@algolia/cache-common" "4.22.1" - -"@algolia/client-account@4.22.1": - version "4.22.1" - resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.22.1.tgz#a7fb8b66b9a4f0a428e1426b2561144267d76d43" - integrity sha512-k8m+oegM2zlns/TwZyi4YgCtyToackkOpE+xCaKCYfBfDtdGOaVZCM5YvGPtK+HGaJMIN/DoTL8asbM3NzHonw== - dependencies: - "@algolia/client-common" "4.22.1" - "@algolia/client-search" "4.22.1" - "@algolia/transporter" "4.22.1" - -"@algolia/client-analytics@4.22.1": - version "4.22.1" - resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.22.1.tgz#506558740b4d49b1b1e3393861f729a8ce921851" - integrity sha512-1ssi9pyxyQNN4a7Ji9R50nSdISIumMFDwKNuwZipB6TkauJ8J7ha/uO60sPJFqQyqvvI+px7RSNRQT3Zrvzieg== - dependencies: - "@algolia/client-common" "4.22.1" - "@algolia/client-search" "4.22.1" - "@algolia/requester-common" "4.22.1" - "@algolia/transporter" "4.22.1" - -"@algolia/client-common@4.22.1": - version "4.22.1" - resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.22.1.tgz#042b19c1b6157c485fa1b551349ab313944d2b05" - integrity sha512-IvaL5v9mZtm4k4QHbBGDmU3wa/mKokmqNBqPj0K7lcR8ZDKzUorhcGp/u8PkPC/e0zoHSTvRh7TRkGX3Lm7iOQ== - dependencies: - "@algolia/requester-common" "4.22.1" - "@algolia/transporter" "4.22.1" - -"@algolia/client-personalization@4.22.1": - version "4.22.1" - resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-4.22.1.tgz#ff088d797648224fb582e9fe5828f8087835fa3d" - integrity sha512-sl+/klQJ93+4yaqZ7ezOttMQ/nczly/3GmgZXJ1xmoewP5jmdP/X/nV5U7EHHH3hCUEHeN7X1nsIhGPVt9E1cQ== - dependencies: - "@algolia/client-common" "4.22.1" - "@algolia/requester-common" "4.22.1" - "@algolia/transporter" "4.22.1" - -"@algolia/client-search@4.22.1": - version "4.22.1" - resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.22.1.tgz#508cc6ab3d1f4e9c02735a630d4dff6fbb8514a2" - integrity sha512-yb05NA4tNaOgx3+rOxAmFztgMTtGBi97X7PC3jyNeGiwkAjOZc2QrdZBYyIdcDLoI09N0gjtpClcackoTN0gPA== - dependencies: - "@algolia/client-common" "4.22.1" - "@algolia/requester-common" "4.22.1" - "@algolia/transporter" "4.22.1" - -"@algolia/logger-common@4.22.1": - version "4.22.1" - resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.22.1.tgz#79cf4cd295de0377a94582c6aaac59b1ded731d9" - integrity sha512-OnTFymd2odHSO39r4DSWRFETkBufnY2iGUZNrMXpIhF5cmFE8pGoINNPzwg02QLBlGSaLqdKy0bM8S0GyqPLBg== - -"@algolia/logger-console@4.22.1": - version "4.22.1" - resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.22.1.tgz#0355345f6940f67aaa78ae9b81c06e44e49f2336" - integrity sha512-O99rcqpVPKN1RlpgD6H3khUWylU24OXlzkavUAMy6QZd1776QAcauE3oP8CmD43nbaTjBexZj2nGsBH9Tc0FVA== - dependencies: - "@algolia/logger-common" "4.22.1" - -"@algolia/requester-browser-xhr@4.22.1": - version "4.22.1" - resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.22.1.tgz#f04df6fe9690a071b267c77d26b83a3be9280361" - integrity sha512-dtQGYIg6MteqT1Uay3J/0NDqD+UciHy3QgRbk7bNddOJu+p3hzjTRYESqEnoX/DpEkaNYdRHUKNylsqMpgwaEw== - dependencies: - "@algolia/requester-common" "4.22.1" - -"@algolia/requester-common@4.22.1": - version "4.22.1" - resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.22.1.tgz#27be35f3718aafcb6b388ff9c3aa2defabd559ff" - integrity sha512-dgvhSAtg2MJnR+BxrIFqlLtkLlVVhas9HgYKMk2Uxiy5m6/8HZBL40JVAMb2LovoPFs9I/EWIoFVjOrFwzn5Qg== - -"@algolia/requester-node-http@4.22.1": - version "4.22.1" - resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.22.1.tgz#589a6fa828ad0f325e727a6fcaf4e1a2343cc62b" - integrity sha512-JfmZ3MVFQkAU+zug8H3s8rZ6h0ahHZL/SpMaSasTCGYR5EEJsCc8SI5UZ6raPN2tjxa5bxS13BRpGSBUens7EA== - dependencies: - "@algolia/requester-common" "4.22.1" - -"@algolia/transporter@4.22.1": - version "4.22.1" - resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.22.1.tgz#8843841b857dc021668f31647aa557ff19cd9cb1" - integrity sha512-kzWgc2c9IdxMa3YqA6TN0NW5VrKYYW/BELIn7vnLyn+U/RFdZ4lxxt9/8yq3DKV5snvoDzzO4ClyejZRdV3lMQ== - dependencies: - "@algolia/cache-common" "4.22.1" - "@algolia/logger-common" "4.22.1" - "@algolia/requester-common" "4.22.1" +"@algolia/client-abtesting@5.2.3": + version "5.2.3" + resolved "https://registry.yarnpkg.com/@algolia/client-abtesting/-/client-abtesting-5.2.3.tgz#08706d535feb69271371368cab2f9d32e0f4a32a" + integrity sha512-YGBK07pVEheCqI32qXDCsCyztvaa8M+MRzjGmdaOylfhDRFsyuGeAENBLQHppGRIKhR75VqWAUTsFb6Dq7IrJA== + dependencies: + "@algolia/client-common" "5.2.3" + "@algolia/requester-browser-xhr" "5.2.3" + "@algolia/requester-node-http" "5.2.3" + +"@algolia/client-analytics@5.2.3": + version "5.2.3" + resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-5.2.3.tgz#2278c9ca0e8541a60331b86efeebec6363a41708" + integrity sha512-1mwi1J0imohlz4QfTTlwxkAZeNgCTfc4KaI0XFacazTTdSlVPtzHYKgA2mLOCRmKJ0Bm5aoylNexcfkfBy3acw== + dependencies: + "@algolia/client-common" "5.2.3" + "@algolia/requester-browser-xhr" "5.2.3" + "@algolia/requester-node-http" "5.2.3" + +"@algolia/client-common@5.2.3": + version "5.2.3" + resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-5.2.3.tgz#8671f4755287beee5fb0d70c4f399ca124f4548e" + integrity sha512-zqfcbgjYR72Y/rx/+/6g5Li/eV33yhRq5mkGbU06JYBzvGq6viy0gZl1ckCFhLLifKzXZ4yzUQTw/KG6FV+smg== + +"@algolia/client-personalization@5.2.3": + version "5.2.3" + resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-5.2.3.tgz#87c7d4ba3c5cd667d7d20455e0ac6c32e1247d4a" + integrity sha512-DBMQjOwKl2r/bzDLTS2sgXuorXNkEifVqWrKr7Gj0poU8fp8Oj8K2FQ/mc6o7PCIOVLwjchRYBkeCdxavakwmA== + dependencies: + "@algolia/client-common" "5.2.3" + "@algolia/requester-browser-xhr" "5.2.3" + "@algolia/requester-node-http" "5.2.3" + +"@algolia/client-search@5.2.3": + version "5.2.3" + resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-5.2.3.tgz#27fe0bc50d6a74a3b543302b1b5d0d91a5c80f25" + integrity sha512-xXdCg8vpiwE8gqSyvjxq8V3qbFa+gHasY5epIz718IByWv3WKLLi/n4SMIfB/zRwXTLVWeGOH/UJSz5VCnAAqg== + dependencies: + "@algolia/client-common" "5.2.3" + "@algolia/requester-browser-xhr" "5.2.3" + "@algolia/requester-node-http" "5.2.3" + +"@algolia/events@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@algolia/events/-/events-4.0.1.tgz#fd39e7477e7bc703d7f893b556f676c032af3950" + integrity sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ== + +"@algolia/recommend@5.2.3": + version "5.2.3" + resolved "https://registry.yarnpkg.com/@algolia/recommend/-/recommend-5.2.3.tgz#c2ae7e59ababe5b570e8c2006ab7d8e78805500f" + integrity sha512-Ad+KrWPldCq8/INnpGJ6pxEwLCtU/vb2wZjy9V3CnSmxAxJ8kdCsbAdIsb8BxVR/Opgc62FwPKzkYEtp/AaDyw== + dependencies: + "@algolia/client-common" "5.2.3" + "@algolia/requester-browser-xhr" "5.2.3" + "@algolia/requester-node-http" "5.2.3" + +"@algolia/requester-browser-xhr@5.2.3": + version "5.2.3" + resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.2.3.tgz#1312b5fb0052a795a6241d92150155c7287678f6" + integrity sha512-lezcE4E7ax7JkDGDKA/xAnyAY9p9LZ4AxzsyL0pksqUpOvn4U0msP553M2yJRfsxxdGDp15noCnPuRsh7u8dMg== + dependencies: + "@algolia/client-common" "5.2.3" + +"@algolia/requester-node-http@5.2.3": + version "5.2.3" + resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-5.2.3.tgz#42a7a12ae532dfcced47fb930eb2f932b9fa183e" + integrity sha512-xTxsRnJqxG1dylIkxmflrHO9LJfJKjSHqEF5yGdRrtnqIEvb2hiQPCHm2XwqxMa3NBcf6lmydGfJqhPLnRJwtw== + dependencies: + "@algolia/client-common" "5.2.3" "@babel/runtime-corejs3@^7.10.2": version "7.20.6" @@ -114,6 +79,13 @@ core-js-pure "^3.25.1" regenerator-runtime "^0.13.11" +"@babel/runtime@^7.1.2": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.6.tgz#9afc3289f7184d8d7f98b099884c26317b9264d2" + integrity sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/runtime@^7.10.2", "@babel/runtime@^7.18.9": version "7.20.6" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.6.tgz#facf4879bfed9b5326326273a64220f099b0fce3" @@ -579,6 +551,11 @@ dependencies: "@types/ms" "*" +"@types/dom-speech-recognition@^0.0.1": + version "0.0.1" + resolved "https://registry.yarnpkg.com/@types/dom-speech-recognition/-/dom-speech-recognition-0.0.1.tgz#e326761a04b4a49c0eec2ac7948afc1c6aa12baa" + integrity sha512-udCxb8DvjcDKfk1WTBzDsxFbLgYxmQGKrE/ricoMqHRNjSlSUCcamVTA5lIQqzY10mY5qCY0QDwBfFEwhfoDPw== + "@types/estree@*": version "1.0.0" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" @@ -597,6 +574,11 @@ "@types/minimatch" "*" "@types/node" "*" +"@types/google.maps@^3.55.12": + version "3.57.0" + resolved "https://registry.yarnpkg.com/@types/google.maps/-/google.maps-3.57.0.tgz#3ed0290126a90fa95587de02babab25b1ab34559" + integrity sha512-8X/HqaUXob25aVslslO84p9ESInpOQd3lMxW085IxqZZ1opRuFfwx2/c1JIUFVvCkkK+sCQHFDJ+Kw60Gsi1qA== + "@types/hast@*", "@types/hast@^2.0.0": version "2.3.4" resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.4.tgz#8aa5ef92c117d20d974a82bdfb6a648b08c0bafc" @@ -604,6 +586,11 @@ dependencies: "@types/unist" "*" +"@types/hogan.js@^3.0.0": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/hogan.js/-/hogan.js-3.0.5.tgz#09f5b916ad88e1975b093ab7a25a37ffc0418be5" + integrity sha512-/uRaY3HGPWyLqOyhgvW9Aa43BNnLZrNeQxl2p8wqId4UHMfPKolSB+U7BlZyO1ng7MkLnyEAItsBzCG0SDhqrA== + "@types/http-cache-semantics@*": version "4.0.1" resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" @@ -695,6 +682,11 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== +"@types/qs@^6.5.3": + version "6.9.15" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.15.tgz#adde8a060ec9c305a82de1babc1056e73bd64dce" + integrity sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg== + "@types/react@^17.0.38": version "17.0.52" resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.52.tgz#10d8b907b5c563ac014a541f289ae8eaa9bf2e9b" @@ -856,6 +848,11 @@ resolved "https://registry.yarnpkg.com/@zeit/schemas/-/schemas-2.6.0.tgz#004e8e553b4cd53d538bd38eac7bcbf58a867fe3" integrity sha512-uUrgZ8AxS+Lio0fZKAipJjAh415JyrOZowliZAzmnJSsf7piVL5w+G0+gFJ0KSu3QRhvui/7zuvpLz03YjXAhg== +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + accept-language-parser@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/accept-language-parser/-/accept-language-parser-1.5.0.tgz#8877c54040a8dcb59e0a07d9c1fde42298334791" @@ -936,25 +933,26 @@ ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -algoliasearch@^4.22.1: - version "4.22.1" - resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.22.1.tgz#f10fbecdc7654639ec20d62f109c1b3a46bc6afc" - integrity sha512-jwydKFQJKIx9kIZ8Jm44SdpigFwRGPESaxZBaHSV0XWN2yBJAOT4mT7ppvlrpA4UGzz92pqFnVKr/kaZXrcreg== - dependencies: - "@algolia/cache-browser-local-storage" "4.22.1" - "@algolia/cache-common" "4.22.1" - "@algolia/cache-in-memory" "4.22.1" - "@algolia/client-account" "4.22.1" - "@algolia/client-analytics" "4.22.1" - "@algolia/client-common" "4.22.1" - "@algolia/client-personalization" "4.22.1" - "@algolia/client-search" "4.22.1" - "@algolia/logger-common" "4.22.1" - "@algolia/logger-console" "4.22.1" - "@algolia/requester-browser-xhr" "4.22.1" - "@algolia/requester-common" "4.22.1" - "@algolia/requester-node-http" "4.22.1" - "@algolia/transporter" "4.22.1" +algoliasearch-helper@3.22.4: + version "3.22.4" + resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.22.4.tgz#a9de9b69a79528c65d0149978c0d5bece7240484" + integrity sha512-fvBCywguW9f+939S6awvRMstqMF1XXcd2qs1r1aGqL/PJ1go/DqN06tWmDVmhCDqBJanm++imletrQWf0G2S1g== + dependencies: + "@algolia/events" "^4.0.1" + +algoliasearch@~5.2.1: + version "5.2.3" + resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-5.2.3.tgz#f0089afcc28f70590ac53914569240c419f7ab57" + integrity sha512-TPXs3MErOL2vdPwlXL71DnjISWuVgtOvv4CGErovXX32MyOT1oSwD1WXDjxZeY2LgVMYbIuPXwbi51AK3aATSQ== + dependencies: + "@algolia/client-abtesting" "5.2.3" + "@algolia/client-analytics" "5.2.3" + "@algolia/client-common" "5.2.3" + "@algolia/client-personalization" "5.2.3" + "@algolia/client-search" "5.2.3" + "@algolia/recommend" "5.2.3" + "@algolia/requester-browser-xhr" "5.2.3" + "@algolia/requester-node-http" "5.2.3" ansi-align@^2.0.0: version "2.0.0" @@ -1441,9 +1439,9 @@ camelcase@^4.0.0: integrity sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw== caniuse-lite@^1.0.30001400, caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001426: - version "1.0.30001436" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001436.tgz#22d7cbdbbbb60cdc4ca1030ccd6dea9f5de4848b" - integrity sha512-ZmWkKsnC2ifEPoWUvSAIGyOYwT+keAaaWPHiQ9DfMqS1t6tfuyFYoWR78TeZtznkEQ64+vGXH9cZrElwR2Mrxg== + version "1.0.30001653" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001653.tgz" + integrity sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw== caw@^2.0.0, caw@^2.0.1: version "2.0.1" @@ -3192,11 +3190,6 @@ functions-have-names@^1.2.2: resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== -fuse.js@^3.6.1: - version "3.6.1" - resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-3.6.1.tgz#7de85fdd6e1b3377c23ce010892656385fd9b10c" - integrity sha512-hT9yh/tiinkmirKrlv4KWOjztdoZo1mx9Qh4KvWqC7isoXwdUY3PNWUxceF4/qO9R6riA2C29jdTOeQOIROjgw== - get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" @@ -3752,6 +3745,19 @@ hastscript@^7.0.0: property-information "^6.0.0" space-separated-tokens "^2.0.0" +hogan.js@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/hogan.js/-/hogan.js-3.0.2.tgz#4cd9e1abd4294146e7679e41d7898732b02c7bfd" + integrity sha512-RqGs4wavGYJWE07t35JQccByczmNUXQT0E12ZYV1VKYu5UiAU9lsos/yBAcf840+zrUQQxgVduCR5/B8nNtibg== + dependencies: + mkdirp "0.3.0" + nopt "1.0.10" + +htm@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/htm/-/htm-3.1.1.tgz#49266582be0dc66ed2235d5ea892307cc0c24b78" + integrity sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ== + html-dom-parser@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/html-dom-parser/-/html-dom-parser-3.1.2.tgz#c137c42df80e17d185ff35a806925d96cc73f408" @@ -4026,6 +4032,36 @@ inquirer@^8.2.5: through "^2.3.6" wrap-ansi "^7.0.0" +instantsearch-ui-components@0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/instantsearch-ui-components/-/instantsearch-ui-components-0.9.0.tgz#f7ae71fe623d18eff32b73071749f31826cb7b89" + integrity sha512-ugQ+XdPx3i3Sxu+woRo6tPE0Fz/kWd4KblTUfZD1TZZBsm/8qFvcbg5dVBDvXX9v7ntoyugXCzC/XCZMzrSkig== + dependencies: + "@babel/runtime" "^7.1.2" + +instantsearch.css@~8.5.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/instantsearch.css/-/instantsearch.css-8.5.0.tgz#f6a2e4345d5fab81fcf25a0d5d15006afd6992bc" + integrity sha512-nw7VPo/KglBWXHSuoSjf0UH8A6aVtYhkphPA4HWnQ7gtgejFBOlKmPKX/0OQI0JA+aIc6x5pyAKvZAzKyOuggQ== + +instantsearch.js@4.74.0: + version "4.74.0" + resolved "https://registry.yarnpkg.com/instantsearch.js/-/instantsearch.js-4.74.0.tgz#af5205c40c3b49daec29bf977cb30e19893257e0" + integrity sha512-IbKAvnQ03cxb1Ni1OpLv6Yuu1W7Cu1zGru77rvgzYyPsurknpjQHdBicszSZlKaK/zND7D5vhSNZoliiz9nuEQ== + dependencies: + "@algolia/events" "^4.0.1" + "@types/dom-speech-recognition" "^0.0.1" + "@types/google.maps" "^3.55.12" + "@types/hogan.js" "^3.0.0" + "@types/qs" "^6.5.3" + algoliasearch-helper "3.22.4" + hogan.js "^3.0.2" + htm "^3.0.0" + instantsearch-ui-components "0.9.0" + preact "^10.10.0" + qs "^6.5.1 < 6.10" + search-insights "^2.15.0" + internal-slot@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" @@ -5373,6 +5409,11 @@ minimist@^1.2.0, minimist@^1.2.6: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== +mkdirp@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" + integrity sha512-OHsdUcVAQ6pOtg5JYWpCBo9W/GySVuwvP9hueRMW7UqshC0tbfzLv8wjySTPm3tfUZ/21CE9E1pJagOA91Pxew== + mkdirp@^0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" @@ -5481,6 +5522,13 @@ node-releases@^2.0.6: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== +nopt@1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg== + dependencies: + abbrev "1" + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -6016,6 +6064,11 @@ postcss@8.4.31, postcss@^8.4.18, postcss@^8.4.31: picocolors "^1.0.0" source-map-js "^1.0.2" +preact@^10.10.0: + version "10.23.2" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.23.2.tgz#52deec92796ae0f0cc6b034d9c66e0fbc1b837dc" + integrity sha512-kKYfePf9rzKnxOAKDpsWhg/ysrHPqT+yQ7UW4JjdnqjFIeNUnNcEJvhuA8fDenxAGWzUqtd51DfVg7xp/8T9NA== + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -6122,6 +6175,11 @@ qs@6.11.0: dependencies: side-channel "^1.0.4" +"qs@^6.5.1 < 6.10": + version "6.9.7" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.7.tgz#4610846871485e1e048f44ae3b94033f0e675afe" + integrity sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw== + query-string@^5.0.1: version "5.1.1" resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" @@ -6194,6 +6252,26 @@ react-dom@^18.2.0: loose-envify "^1.1.0" scheduler "^0.23.0" +react-instantsearch-core@7.13.0: + version "7.13.0" + resolved "https://registry.yarnpkg.com/react-instantsearch-core/-/react-instantsearch-core-7.13.0.tgz#1541931fe1ce071cbc8e91a1f30092190500559b" + integrity sha512-2LMhGJISWnbC1bbewqKQ1MimF1iGwtd0ezqGeWSNy1Ld6Eh1Dj2r1FAn0Wow30rC91oWkPj6/rLUKz9ibzabrA== + dependencies: + "@babel/runtime" "^7.1.2" + algoliasearch-helper "3.22.4" + instantsearch.js "4.74.0" + use-sync-external-store "^1.0.0" + +react-instantsearch@~7.13.0: + version "7.13.0" + resolved "https://registry.yarnpkg.com/react-instantsearch/-/react-instantsearch-7.13.0.tgz#ead207c6a2970704ee7c745e65b41c9d1a595d81" + integrity sha512-12auG0AI4oS8yuu2IfA61JjmTNk+pd9KkKvCJukMI+3t6U16sHUJsPMj9/zAHrDm+Zgdgr9ZsszIKtr9/VQ/CQ== + dependencies: + "@babel/runtime" "^7.1.2" + instantsearch-ui-components "0.9.0" + instantsearch.js "4.74.0" + react-instantsearch-core "7.13.0" + react-is@^16.13.1: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" @@ -6282,6 +6360,11 @@ regenerator-runtime@^0.13.11: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + regexp.prototype.flags@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" @@ -6670,6 +6753,11 @@ scheduler@^0.23.0: dependencies: loose-envify "^1.1.0" +search-insights@^2.15.0: + version "2.17.0" + resolved "https://registry.yarnpkg.com/search-insights/-/search-insights-2.17.0.tgz#34db501d51d493a2a3d8ef50a852c2002f17eade" + integrity sha512-AskayU3QNsXQzSL6v4LTYST7NNfs2HWyHHB+sdORP9chsytAhro5XRfToAMI/LAVYgNbzowVZTMfBRodgbUHKg== + section-matter@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" @@ -7678,6 +7766,11 @@ url-to-options@^1.0.1: resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" integrity sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A== +use-sync-external-store@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz#c3b6390f3a30eba13200d2302dcdf1e7b57b2ef9" + integrity sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw== + utf8-byte-length@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61" From b3139c1a4ccbf18ef87a56990d86384ac618c63e Mon Sep 17 00:00:00 2001 From: Vitalii Perehonchuk Date: Sun, 1 Sep 2024 09:37:45 +0300 Subject: [PATCH 2/4] Apply suggestions from code review --- components/search/dummy.tsx | 2 +- populate-algolia/extractTextFromHtml.mts | 35 ------------------------ 2 files changed, 1 insertion(+), 36 deletions(-) diff --git a/components/search/dummy.tsx b/components/search/dummy.tsx index 41ecf6b..6e05f20 100644 --- a/components/search/dummy.tsx +++ b/components/search/dummy.tsx @@ -31,7 +31,7 @@ export default function SearchDummy() {