From 84be05d6bf126fe6fadcd6f7746083c07cf16550 Mon Sep 17 00:00:00 2001 From: Othmane Ataallah <”othmane.ataallah.triztech@gmail.com”> Date: Wed, 29 Apr 2026 14:30:42 +0100 Subject: [PATCH] feat: search --- docusaurus.config.js | 17 ++ package-lock.json | 421 +++++++++++++++++++++++++++++++ package.json | 1 + src/clientModules/searchFocus.js | 35 +++ src/css/custom.css | 56 ++++ 5 files changed, 530 insertions(+) create mode 100644 src/clientModules/searchFocus.js diff --git a/docusaurus.config.js b/docusaurus.config.js index fea63f7..264c9cc 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -11,6 +11,10 @@ const config = { v4: true, }, + clientModules: [ + require.resolve('./src/clientModules/searchFocus.js'), + ], + url: 'https://150.triztech.pro', baseUrl: '/docs/', @@ -101,6 +105,19 @@ const config = { additionalLanguages: ['java', 'properties', 'bash'], }, }), + + plugins: [ + [ + require.resolve('@cmfcmf/docusaurus-search-local'), + { + language: 'en', + indexDocs: true, + indexBlog: false, + indexPages: true, + maxSearchResults: 8, + }, + ], + ], }; export default config; diff --git a/package-lock.json b/package-lock.json index ae06061..ba90eef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "triz-docs", "version": "0.0.0", "dependencies": { + "@cmfcmf/docusaurus-search-local": "^2.0.1", "@docusaurus/core": "3.10.0", "@docusaurus/faster": "3.10.0", "@docusaurus/preset-classic": "3.10.0", @@ -50,6 +51,23 @@ "@algolia/autocomplete-shared": "1.19.8" } }, + "node_modules/@algolia/autocomplete-js": { + "version": "1.19.8", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-js/-/autocomplete-js-1.19.8.tgz", + "integrity": "sha512-9Sfr9Un3vObdtnj6IqzxoD9XisjFJxA9WAyVxmOkwTD9aVluyNwDeEWeGLy12xhRyILjA5C7byto159cZcdEEA==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-core": "1.19.8", + "@algolia/autocomplete-preset-algolia": "1.19.8", + "@algolia/autocomplete-shared": "1.19.8", + "htm": "^3.1.1", + "preact": "^10.13.2" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.5.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, "node_modules/@algolia/autocomplete-plugin-algolia-insights": { "version": "1.19.8", "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.8.tgz", @@ -62,6 +80,19 @@ "search-insights": ">= 1 < 3" } }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.19.8", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.19.8.tgz", + "integrity": "sha512-5XhJe5uXXLrt+C1MjIv1/BfGNHZyD1xkAYMVANTjdY+PXwO4o+3YIK2XGU0MxHTGryy70G6+xVO9TB7xA+3hGQ==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.19.8" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, "node_modules/@algolia/autocomplete-shared": { "version": "1.19.8", "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.8.tgz", @@ -72,6 +103,36 @@ "algoliasearch": ">= 4.9.1 < 6" } }, + "node_modules/@algolia/autocomplete-theme-classic": { + "version": "1.19.8", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-theme-classic/-/autocomplete-theme-classic-1.19.8.tgz", + "integrity": "sha512-FYmpeOyL5Wy444ZGp1IW57fevpMSBMewN37j+0WULMTJZGobnvTgVEKjYIgtv5Ku4/RNNp54rtEx2/OU6l8GYA==", + "license": "MIT" + }, + "node_modules/@algolia/cache-browser-local-storage": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.27.0.tgz", + "integrity": "sha512-YGog2s57sO20lvpa+hv5XLAAmiTI1kHsCMRtPVfiaOdIQnvRla21lfH08onqEbZihOPVI8GULwt79zQB2ymKzg==", + "license": "MIT", + "dependencies": { + "@algolia/cache-common": "4.27.0" + } + }, + "node_modules/@algolia/cache-common": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.27.0.tgz", + "integrity": "sha512-Sr8zjNXj82p6lO4W9CdzfF0m0/9h/H6VAdSHOTtimm/cTzXIYXRI2IZq7+Nt2ljJ7Ukx+7dIFcxQjE57eQSPsw==", + "license": "MIT" + }, + "node_modules/@algolia/cache-in-memory": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.27.0.tgz", + "integrity": "sha512-abgMRTcVD0IllNvMM9JFhxtyLn1v6Ey7mQ7+BGS3JCzvkCX7KZqlS0BIuVUDgx9sPIfOeNsG/awGzMmP50TwZw==", + "license": "MIT", + "dependencies": { + "@algolia/cache-common": "4.27.0" + } + }, "node_modules/@algolia/client-abtesting": { "version": "5.51.0", "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.51.0.tgz", @@ -87,6 +148,38 @@ "node": ">= 14.0.0" } }, + "node_modules/@algolia/client-account": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.27.0.tgz", + "integrity": "sha512-sSHxwrKTKJrwfoR/LcQJZfmiWJcM5d9Rp7afMChxOcdGdkSdIwrNBC8SCcHRenA3GsZ6mg+j6px7KWYxJ34btA==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.27.0", + "@algolia/client-search": "4.27.0", + "@algolia/transporter": "4.27.0" + } + }, + "node_modules/@algolia/client-account/node_modules/@algolia/client-common": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.27.0.tgz", + "integrity": "sha512-ZrT6l/YPQgyIUuBCxcYPeXol2VBLUMuNb1rKXrm6z1f/iTiwqtnEEb16/6CC11+Re0ZGXrdcMVrgDRrzveQ1aQ==", + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.27.0", + "@algolia/transporter": "4.27.0" + } + }, + "node_modules/@algolia/client-account/node_modules/@algolia/client-search": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.27.0.tgz", + "integrity": "sha512-qmX/f67ay0eZ4V5Io8fWWOcUVo/gqre2yei1PnmEhQU2Gul6ushg25QnNrfu4BODiRrw1rwYveZaLCiHvcUxrQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.27.0", + "@algolia/requester-common": "4.27.0", + "@algolia/transporter": "4.27.0" + } + }, "node_modules/@algolia/client-analytics": { "version": "5.51.0", "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.51.0.tgz", @@ -192,6 +285,21 @@ "node": ">= 14.0.0" } }, + "node_modules/@algolia/logger-common": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.27.0.tgz", + "integrity": "sha512-pIrmQRXtDV+zTMVXKtKCosC2rWhn0F0TdUeb9etA6RiAz6jY6bY6f0+JX7YekDK09SnmZMLIyUa7Jci+Ied9bw==", + "license": "MIT" + }, + "node_modules/@algolia/logger-console": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.27.0.tgz", + "integrity": "sha512-UWvta8BxsR/u5z9eI088mOSLQaGtmoCtXeN3DYJurlxAdJwPuKtEb5+433kxA6/E9f2/JgoW89KZ1vNP9pcHBQ==", + "license": "MIT", + "dependencies": { + "@algolia/logger-common": "4.27.0" + } + }, "node_modules/@algolia/monitoring": { "version": "1.51.0", "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.51.0.tgz", @@ -234,6 +342,12 @@ "node": ">= 14.0.0" } }, + "node_modules/@algolia/requester-common": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.27.0.tgz", + "integrity": "sha512-VC3prAQVgWTubMStb3mJz6i61Hqbtagi2LeIbgNtoFJFff3XZDcAaO1D5r0GYl2+DrB2VzUHnQXbkiuI+HHYyg==", + "license": "MIT" + }, "node_modules/@algolia/requester-fetch": { "version": "5.51.0", "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.51.0.tgz", @@ -258,6 +372,17 @@ "node": ">= 14.0.0" } }, + "node_modules/@algolia/transporter": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.27.0.tgz", + "integrity": "sha512-PvSbELU4VjN3xSX79ki+zIdOGhTxyJXWvRDzkUjfTx2iNfPWDdTjzKbP1o+268coJztxrkuBwJz90Urek7o1Kw==", + "license": "MIT", + "dependencies": { + "@algolia/cache-common": "4.27.0", + "@algolia/logger-common": "4.27.0", + "@algolia/requester-common": "4.27.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", @@ -1959,6 +2084,194 @@ "node": ">=6.9.0" } }, + "node_modules/@cmfcmf/docusaurus-search-local": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@cmfcmf/docusaurus-search-local/-/docusaurus-search-local-2.0.1.tgz", + "integrity": "sha512-4Gk313a+9HGetIFB9f087Qrmba5svx0zY9xZ10QKd79Nic0IsY0/JktDqFMZ51IDuL+9yIMOsdeKb313ce2mnw==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-js": "^1.8.2", + "@algolia/autocomplete-theme-classic": "^1.8.2", + "@algolia/client-search": "^4.12.0", + "algoliasearch": "^4.12.0", + "cheerio": "^1.0.0", + "clsx": "^2.0.0", + "lunr-languages": "^1.4.0", + "mark.js": "^8.11.1", + "tslib": "^2.6.3" + }, + "peerDependencies": { + "@docusaurus/core": "^3.0.0", + "nodejieba": "^2.5.0 || ^3.0.0", + "react": "^18 || ^19", + "react-dom": "^18 || ^19" + }, + "peerDependenciesMeta": { + "nodejieba": { + "optional": true + } + } + }, + "node_modules/@cmfcmf/docusaurus-search-local/node_modules/@algolia/client-analytics": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.27.0.tgz", + "integrity": "sha512-MqIDyxODljn9ZC4oqjQD0kez2a4zjIJ9ywA/b7cIiUiK/tDjZNTVjYd9WXMKQlXnWUwfrfXJZClVVqN1iCXS+Q==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.27.0", + "@algolia/client-search": "4.27.0", + "@algolia/requester-common": "4.27.0", + "@algolia/transporter": "4.27.0" + } + }, + "node_modules/@cmfcmf/docusaurus-search-local/node_modules/@algolia/client-common": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.27.0.tgz", + "integrity": "sha512-ZrT6l/YPQgyIUuBCxcYPeXol2VBLUMuNb1rKXrm6z1f/iTiwqtnEEb16/6CC11+Re0ZGXrdcMVrgDRrzveQ1aQ==", + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.27.0", + "@algolia/transporter": "4.27.0" + } + }, + "node_modules/@cmfcmf/docusaurus-search-local/node_modules/@algolia/client-personalization": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.27.0.tgz", + "integrity": "sha512-OZqaFFVm+10hAlmxpiTWi/o2n+YKBESbSqSy2yXAumPH/kaK4moJHFblbh8IkV3KZR0lLm4hzPtn8Q2nWNiDUA==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.27.0", + "@algolia/requester-common": "4.27.0", + "@algolia/transporter": "4.27.0" + } + }, + "node_modules/@cmfcmf/docusaurus-search-local/node_modules/@algolia/client-search": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.27.0.tgz", + "integrity": "sha512-qmX/f67ay0eZ4V5Io8fWWOcUVo/gqre2yei1PnmEhQU2Gul6ushg25QnNrfu4BODiRrw1rwYveZaLCiHvcUxrQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.27.0", + "@algolia/requester-common": "4.27.0", + "@algolia/transporter": "4.27.0" + } + }, + "node_modules/@cmfcmf/docusaurus-search-local/node_modules/@algolia/recommend": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-4.27.0.tgz", + "integrity": "sha512-CFy54xDjrsazPi3KN04yPmLRDT72AKokc3RLOdWQvG0/uEUjj7dhWqe9qenxpL4ydsjO7S1eY5YqmX+uMGonlg==", + "license": "MIT", + "dependencies": { + "@algolia/cache-browser-local-storage": "4.27.0", + "@algolia/cache-common": "4.27.0", + "@algolia/cache-in-memory": "4.27.0", + "@algolia/client-common": "4.27.0", + "@algolia/client-search": "4.27.0", + "@algolia/logger-common": "4.27.0", + "@algolia/logger-console": "4.27.0", + "@algolia/requester-browser-xhr": "4.27.0", + "@algolia/requester-common": "4.27.0", + "@algolia/requester-node-http": "4.27.0", + "@algolia/transporter": "4.27.0" + } + }, + "node_modules/@cmfcmf/docusaurus-search-local/node_modules/@algolia/requester-browser-xhr": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.27.0.tgz", + "integrity": "sha512-dTenMBIIpyp5o3C2ZnfbsuSlD/lL9jPkk6T+2+qm38fyw2nf49ANbcHFE79NgiGrnmw7QrYveCs9NIP3Wk4v6g==", + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.27.0" + } + }, + "node_modules/@cmfcmf/docusaurus-search-local/node_modules/@algolia/requester-node-http": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.27.0.tgz", + "integrity": "sha512-y8nUqaUQeSOQ5oaNo0b2QPznyBFW9LoIwljyUphJ+gUZpU6O/j2/C8ovoqDpIe6J0etqHg5RCcBizrCFZuLpyw==", + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.27.0" + } + }, + "node_modules/@cmfcmf/docusaurus-search-local/node_modules/algoliasearch": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.27.0.tgz", + "integrity": "sha512-C88C5grLa5VOCp9eYZJt+q99ik7yNdm92l7Q9+4XK0Md8kL05Lg8l2v9ZVX0uMW3mH9pAFxMMXlLOvqNumA4lw==", + "license": "MIT", + "dependencies": { + "@algolia/cache-browser-local-storage": "4.27.0", + "@algolia/cache-common": "4.27.0", + "@algolia/cache-in-memory": "4.27.0", + "@algolia/client-account": "4.27.0", + "@algolia/client-analytics": "4.27.0", + "@algolia/client-common": "4.27.0", + "@algolia/client-personalization": "4.27.0", + "@algolia/client-search": "4.27.0", + "@algolia/logger-common": "4.27.0", + "@algolia/logger-console": "4.27.0", + "@algolia/recommend": "4.27.0", + "@algolia/requester-browser-xhr": "4.27.0", + "@algolia/requester-common": "4.27.0", + "@algolia/requester-node-http": "4.27.0", + "@algolia/transporter": "4.27.0" + } + }, + "node_modules/@cmfcmf/docusaurus-search-local/node_modules/cheerio": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz", + "integrity": "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==", + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "encoding-sniffer": "^0.2.1", + "htmlparser2": "^10.1.0", + "parse5": "^7.3.0", + "parse5-htmlparser2-tree-adapter": "^7.1.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^7.19.0", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=20.18.1" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/@cmfcmf/docusaurus-search-local/node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@cmfcmf/docusaurus-search-local/node_modules/htmlparser2": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", + "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "entities": "^7.0.1" + } + }, "node_modules/@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", @@ -8887,6 +9200,31 @@ "node": ">= 0.8" } }, + "node_modules/encoding-sniffer": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", + "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + } + }, + "node_modules/encoding-sniffer/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/enhanced-resolve": { "version": "5.21.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.0.tgz", @@ -10298,6 +10636,12 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/htm": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/htm/-/htm-3.1.1.tgz", + "integrity": "sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ==", + "license": "Apache-2.0" + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -11615,6 +11959,18 @@ "yallist": "^3.0.2" } }, + "node_modules/lunr-languages": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/lunr-languages/-/lunr-languages-1.14.0.tgz", + "integrity": "sha512-hWUAb2KqM3L7J5bcrngszzISY4BxrXn/Xhbb9TTCJYEGqlR1nG67/M14sp09+PTIRklobrn57IAxcdcO/ZFyNA==", + "license": "MPL-1.1" + }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "license": "MIT" + }, "node_modules/markdown-extensions": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", @@ -14575,6 +14931,18 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "license": "MIT", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/parse5/node_modules/entities": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", @@ -16167,6 +16535,16 @@ "postcss": "^8.4.31" } }, + "node_modules/preact": { + "version": "10.29.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.29.1.tgz", + "integrity": "sha512-gQCLc/vWroE8lIpleXtdJhTFDogTdZG9AjMUpVkDf2iTCNwYNWA+u16dL41TqUDJO4gm2IgrcMv3uTpjd4Pwmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, "node_modules/pretty-error": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", @@ -18383,6 +18761,15 @@ "is-typedarray": "^1.0.0" } }, + "node_modules/undici": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.25.0.tgz", + "integrity": "sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==", + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, "node_modules/undici-types": { "version": "7.19.2", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz", @@ -19289,6 +19676,40 @@ "node": ">=0.8.0" } }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index b09d62a..825f4ed 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { + "@cmfcmf/docusaurus-search-local": "^2.0.1", "@docusaurus/core": "3.10.0", "@docusaurus/faster": "3.10.0", "@docusaurus/preset-classic": "3.10.0", diff --git a/src/clientModules/searchFocus.js b/src/clientModules/searchFocus.js new file mode 100644 index 0000000..cfcfb46 --- /dev/null +++ b/src/clientModules/searchFocus.js @@ -0,0 +1,35 @@ +import ExecutionEnvironment from '@docusaurus/ExecutionEnvironment'; + +/** + * TrizTech Search UX Helper (Native Algolia Edition) + * This script ensures the search text is cleared when dismissing the modal, + * strictly using Algolia's native buttons to prevent React state crashes. + */ +if (ExecutionEnvironment.canUseDOM) { + // Use mousedown with capture phase to intercept before Algolia closes the modal + window.addEventListener('mousedown', (e) => { + // 1. Identify what the user is clicking + const isCancelButton = !!e.target.closest('.aa-DetachedCancelButton'); + const isOverlay = e.target.classList.contains('aa-DetachedOverlay'); + + // 2. Apply Desired Behaviors: + // - If clicking "x" (.aa-ClearButton), we do NOTHING. Algolia natively handles this + // by clearing the text and keeping the modal open. (If it was quitting before, + // it was because our previous artificial events crashed the component). + + // - If clicking "Cancel" or "Background Overlay", we want to clear the text AND quit. + if (isCancelButton || isOverlay) { + // Find Algolia's native Clear Button (the "x" inside the search input) + const clearButton = document.querySelector('.aa-ClearButton'); + + // If the clear button exists, it means there is text in the input + if (clearButton) { + // Programmatically click the native clear button to safely reset Algolia's internal React state + clearButton.click(); + } + + // We don't stop propagation. The event will continue down to the Cancel button + // or Overlay, allowing Algolia to natively close the modal. + } + }, { capture: true }); +} diff --git a/src/css/custom.css b/src/css/custom.css index d0663c5..15f7e97 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -308,6 +308,62 @@ code { box-shadow: 0 0 0 1px var(--ifm-color-primary); } +/* ======================================== + Search Bar (Local Search) + ======================================== */ +.navbar__search { + padding-left: 0.5rem; +} + +.aa-DetachedSearchButton { + background-color: var(--tt-bg-surface-raised) !important; + border: 1px solid var(--tt-border-color) !important; + border-radius: 0.5rem !important; + padding: 0 0.75rem !important; + font-size: 0.85rem !important; + transition: all 0.2s ease !important; + color: var(--ifm-font-color-base) !important; + width: 12rem !important; + height: 36px !important; +} + +.aa-DetachedSearchButton:hover { + border-color: var(--ifm-color-primary) !important; + background-color: var(--ifm-background-surface-color) !important; +} + +[data-theme='dark'] .aa-DetachedSearchButton { + background-color: var(--ifm-background-surface-color) !important; +} + +.aa-DetachedSearchButtonIcon { + color: var(--ifm-font-color-base) !important; + opacity: 0.6; +} + +.aa-DetachedSearchButtonPlaceholder { + color: var(--ifm-font-color-base) !important; + opacity: 0.6; +} + +/* Mobile Responsiveness for Search Button */ +@media (max-width: 996px) { + .aa-DetachedSearchButton { + width: 36px !important; + padding: 0 !important; + justify-content: center !important; + } + + .aa-DetachedSearchButtonPlaceholder { + display: none !important; + } + + .aa-DetachedSearchButtonIcon { + width: 20px !important; + margin: 0 !important; + } +} + /* ======================================== Search & DocCard (category index pages) ======================================== */