diff --git a/package-lock.json b/package-lock.json
index 5901e84..b094a30 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -7,6 +7,7 @@
"": {
"version": "0.0.0",
"dependencies": {
+ "@docsearch/react": "^3.8.0",
"@giscus/react": "^3.0.0",
"@next/third-parties": "^14.2.18",
"@vercel/analytics": "^1.4.0",
@@ -40,6 +41,231 @@
"textlint-rule-allowed-uris": "^1.0.5"
}
},
+ "node_modules/@algolia/autocomplete-core": {
+ "version": "1.17.7",
+ "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.7.tgz",
+ "integrity": "sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/autocomplete-plugin-algolia-insights": "1.17.7",
+ "@algolia/autocomplete-shared": "1.17.7"
+ }
+ },
+ "node_modules/@algolia/autocomplete-plugin-algolia-insights": {
+ "version": "1.17.7",
+ "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.7.tgz",
+ "integrity": "sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/autocomplete-shared": "1.17.7"
+ },
+ "peerDependencies": {
+ "search-insights": ">= 1 < 3"
+ }
+ },
+ "node_modules/@algolia/autocomplete-preset-algolia": {
+ "version": "1.17.7",
+ "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.7.tgz",
+ "integrity": "sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/autocomplete-shared": "1.17.7"
+ },
+ "peerDependencies": {
+ "@algolia/client-search": ">= 4.9.1 < 6",
+ "algoliasearch": ">= 4.9.1 < 6"
+ }
+ },
+ "node_modules/@algolia/autocomplete-shared": {
+ "version": "1.17.7",
+ "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.7.tgz",
+ "integrity": "sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@algolia/client-search": ">= 4.9.1 < 6",
+ "algoliasearch": ">= 4.9.1 < 6"
+ }
+ },
+ "node_modules/@algolia/client-abtesting": {
+ "version": "5.14.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.14.0.tgz",
+ "integrity": "sha512-HR4kbCmq4RO8vhafLrVcR11q3BvuPYA4o+Nn8hzJRgpDu2fauIlgIBgVDsoxaK90xuaPLSNdoT5tWXag+L8vCw==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.14.0",
+ "@algolia/requester-browser-xhr": "5.14.0",
+ "@algolia/requester-fetch": "5.14.0",
+ "@algolia/requester-node-http": "5.14.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/client-analytics": {
+ "version": "5.14.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.14.0.tgz",
+ "integrity": "sha512-EnmouGUQdIvwmI8plglt3HP9hXwNNwCJshszfU/Hqi2n21//iwmWLmMb5gXDfiLhyMa6u8eya8c03QT79s3/tQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.14.0",
+ "@algolia/requester-browser-xhr": "5.14.0",
+ "@algolia/requester-fetch": "5.14.0",
+ "@algolia/requester-node-http": "5.14.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/client-common": {
+ "version": "5.14.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.14.0.tgz",
+ "integrity": "sha512-xYaswEqv+mTeazOJV0PELs4LYXaETYGwlntQxvOTHsICaj1e+ylKeMr+C+ZvN74RpCRDoEN3a2n33bRU9/MHTw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/client-insights": {
+ "version": "5.14.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.14.0.tgz",
+ "integrity": "sha512-1dWxjTmpNCgLWLl6GSAaOACs55JvioAIdno7jvq7KVfpLLXehHaSaiij8ssbbIM8HqHZPwC8ShaUHtSt2jLdBg==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.14.0",
+ "@algolia/requester-browser-xhr": "5.14.0",
+ "@algolia/requester-fetch": "5.14.0",
+ "@algolia/requester-node-http": "5.14.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/client-personalization": {
+ "version": "5.14.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.14.0.tgz",
+ "integrity": "sha512-HDOYm38nUwflxaemKrxlV91pYg3L9JkmLnuSQCJ7bzivqP+aBTZ8mGRvanFzwayNMRZWLuGsstJMpGET6FYaDQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.14.0",
+ "@algolia/requester-browser-xhr": "5.14.0",
+ "@algolia/requester-fetch": "5.14.0",
+ "@algolia/requester-node-http": "5.14.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/client-query-suggestions": {
+ "version": "5.14.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.14.0.tgz",
+ "integrity": "sha512-yDPf3E3MS2RUg1br7r1+PEqKOxUftxjLLtD35yW9voZ9oV45XZnAPnHCqgmyzjcK5/dM1dzXHhmZGf4VbjYn7Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.14.0",
+ "@algolia/requester-browser-xhr": "5.14.0",
+ "@algolia/requester-fetch": "5.14.0",
+ "@algolia/requester-node-http": "5.14.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/client-search": {
+ "version": "5.14.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.14.0.tgz",
+ "integrity": "sha512-x5/GVLDyGad8aiWA/vfj8X4NXOZ3FlwXw/gb7t+Mxo3O0g3VxSFQdyrZ8Oduv/Y/Y8cxMVEOx1u3Azs6tlSZbg==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.14.0",
+ "@algolia/requester-browser-xhr": "5.14.0",
+ "@algolia/requester-fetch": "5.14.0",
+ "@algolia/requester-node-http": "5.14.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/ingestion": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.14.0.tgz",
+ "integrity": "sha512-HU9AoZDFMEIT/+xzIa9l1XkPRTH7S0jWbYWrNkeb/62TxQFvL5x/XYEa6Yf/WCFU6Qa0W+ivua8NDzxL15NVGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.14.0",
+ "@algolia/requester-browser-xhr": "5.14.0",
+ "@algolia/requester-fetch": "5.14.0",
+ "@algolia/requester-node-http": "5.14.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/monitoring": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.14.0.tgz",
+ "integrity": "sha512-tGKip5Dvusw8z4ajIJBBYxdPUOGIqV1CGat55eCaAmX97Oko2adIOq9MKvdC3d7SMuQt3j28QIHpV6wvihnsKA==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.14.0",
+ "@algolia/requester-browser-xhr": "5.14.0",
+ "@algolia/requester-fetch": "5.14.0",
+ "@algolia/requester-node-http": "5.14.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/recommend": {
+ "version": "5.14.0",
+ "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.14.0.tgz",
+ "integrity": "sha512-wXOWFG4L0Y/EyWKuDXQA7FoB7Ukuss+O8zaxZSlla4h19UGWak+22RcZ2eDFoAhVOJxC8RoLg9opMfDbZtPW9Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.14.0",
+ "@algolia/requester-browser-xhr": "5.14.0",
+ "@algolia/requester-fetch": "5.14.0",
+ "@algolia/requester-node-http": "5.14.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/requester-browser-xhr": {
+ "version": "5.14.0",
+ "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.14.0.tgz",
+ "integrity": "sha512-5zk1sol+WTDskAx1AMBGGDChCVBHuPTmclGZO844/ljqH7AcJpkFnfUeAMXfx2m4tW3Ax+M+uaC+XjVoQRb9Hg==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.14.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/requester-fetch": {
+ "version": "5.14.0",
+ "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.14.0.tgz",
+ "integrity": "sha512-B9grYSKH34UlJPkUdds14I/m8Yp7/a4PbqRuZsrP1L4kBW2FGinMtpQOK3N6gEy8YkVNA1iKlTC24yro8z8a8A==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.14.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/requester-node-http": {
+ "version": "5.14.0",
+ "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.14.0.tgz",
+ "integrity": "sha512-2EPhRqbxWzrsSXX0/70jIGtjQTj8VILi+uqmgBweyQIzCNlGoNbyMs+E7iwHVtUSrE/9IDd8rrewkVHOI6h2IQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-common": "5.14.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
"node_modules/@azu/format-text": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@azu/format-text/-/format-text-1.0.2.tgz",
@@ -263,6 +489,44 @@
"postcss-selector-parser": "^6.1.0"
}
},
+ "node_modules/@docsearch/css": {
+ "version": "3.8.0",
+ "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.8.0.tgz",
+ "integrity": "sha512-pieeipSOW4sQ0+bE5UFC51AOZp9NGxg89wAlZ1BAQFaiRAGK1IKUaPQ0UGZeNctJXyqZ1UvBtOQh2HH+U5GtmA==",
+ "license": "MIT"
+ },
+ "node_modules/@docsearch/react": {
+ "version": "3.8.0",
+ "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.8.0.tgz",
+ "integrity": "sha512-WnFK720+iwTVt94CxY3u+FgX6exb3BfN5kE9xUY6uuAH/9W/UFboBZFLlrw/zxFRHoHZCOXRtOylsXF+6LHI+Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/autocomplete-core": "1.17.7",
+ "@algolia/autocomplete-preset-algolia": "1.17.7",
+ "@docsearch/css": "3.8.0",
+ "algoliasearch": "^5.12.0"
+ },
+ "peerDependencies": {
+ "@types/react": ">= 16.8.0 < 19.0.0",
+ "react": ">= 16.8.0 < 19.0.0",
+ "react-dom": ">= 16.8.0 < 19.0.0",
+ "search-insights": ">= 1 < 3"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ },
+ "search-insights": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@dual-bundle/import-meta-resolve": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz",
@@ -2167,6 +2431,30 @@
"url": "https://github.com/sponsors/epoberezkin"
}
},
+ "node_modules/algoliasearch": {
+ "version": "5.14.0",
+ "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.14.0.tgz",
+ "integrity": "sha512-qr21NtvIkpptwj9z6W5guICK8yijXIGzw7Ka26zAPofnefofVXoXtuAopjtmk1ZKDu4YpACj38n9mgKKc5Zuhw==",
+ "license": "MIT",
+ "dependencies": {
+ "@algolia/client-abtesting": "5.14.0",
+ "@algolia/client-analytics": "5.14.0",
+ "@algolia/client-common": "5.14.0",
+ "@algolia/client-insights": "5.14.0",
+ "@algolia/client-personalization": "5.14.0",
+ "@algolia/client-query-suggestions": "5.14.0",
+ "@algolia/client-search": "5.14.0",
+ "@algolia/ingestion": "1.14.0",
+ "@algolia/monitoring": "1.14.0",
+ "@algolia/recommend": "5.14.0",
+ "@algolia/requester-browser-xhr": "5.14.0",
+ "@algolia/requester-fetch": "5.14.0",
+ "@algolia/requester-node-http": "5.14.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
"node_modules/ansi-colors": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
@@ -8628,6 +8916,13 @@
"loose-envify": "^1.1.0"
}
},
+ "node_modules/search-insights": {
+ "version": "2.17.2",
+ "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.2.tgz",
+ "integrity": "sha512-zFNpOpUO+tY2D85KrxJ+aqwnIfdEGi06UH2+xEb+Bp9Mwznmauqc9djbnBibJO5mpfUPPa8st6Sx65+vbeO45g==",
+ "license": "MIT",
+ "peer": true
+ },
"node_modules/section-matter": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz",
diff --git a/package.json b/package.json
index 2c9f414..a68ed36 100644
--- a/package.json
+++ b/package.json
@@ -22,6 +22,7 @@
"count-docs": "ls -R src/posts/docs | grep .md | wc -l"
},
"dependencies": {
+ "@docsearch/react": "^3.8.0",
"@giscus/react": "^3.0.0",
"@next/third-parties": "^14.2.18",
"@vercel/analytics": "^1.4.0",
diff --git a/src/app/layout.jsx b/src/app/layout.jsx
index 07fcc6e..b0937ba 100644
--- a/src/app/layout.jsx
+++ b/src/app/layout.jsx
@@ -15,6 +15,8 @@ import Links from '@/components/aside/Links';
import Profile from '@/components/aside/Profile/Profile';
import DarkModeToggle from '@/components/header/DarkModeToggle';
+import DocSearch from '@/components/header/DocSearch';
+import FlexContainer from '@/components/header/FlexContainer';
import Title from '@/components/header/Title';
import { GOOGLE_GA_ID } from '@/constants';
@@ -43,7 +45,10 @@ export default function RootLayout({ children }) {