diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 54e1ceed6..5451642b3 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -68,3 +68,8 @@ jobs: vercel-args: '--prod --local-config ../vercel.json' # Optional working-directory: docSite/public + - name: Deploy to GitHub Pages + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GH_PAT }} + publish_dir: docSite/public diff --git a/.imgbotconfig b/.imgbotconfig new file mode 100644 index 000000000..fa7ec7313 --- /dev/null +++ b/.imgbotconfig @@ -0,0 +1,9 @@ +{ + "schedule": "daily", // daily|weekly|monthly + "ignoredFiles": [ + "*.svg", + "packages/*", + "projects/*", + ], + "minKBReduced": 200, // delay new prs until size reduction meets this threshold (default to 10) +} \ No newline at end of file diff --git a/docSite/assets/docs/scss/custom/pages/_custom.scss b/docSite/assets/docs/scss/custom/pages/_custom.scss index 02e37e1c1..a82a56596 100644 --- a/docSite/assets/docs/scss/custom/pages/_custom.scss +++ b/docSite/assets/docs/scss/custom/pages/_custom.scss @@ -1,3 +1,7 @@ +#content { + font-family: JetBrains Mono, LXGW WenKai Screen, -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Helvetica Neue", "Ubuntu"; +} + .docs-content .main-content img, .docs-content .main-content svg:not(.gitinfo svg):not(a svg) { max-width: 80% !important; height: auto; diff --git a/docSite/assets/imgs/functional-arch.webp b/docSite/assets/imgs/functional-arch.webp new file mode 100644 index 000000000..24d1eea47 Binary files /dev/null and b/docSite/assets/imgs/functional-arch.webp differ diff --git a/docSite/assets/imgs/sealos-fastgpt.webp b/docSite/assets/imgs/sealos-fastgpt.webp new file mode 100644 index 000000000..f514eff01 Binary files /dev/null and b/docSite/assets/imgs/sealos-fastgpt.webp differ diff --git a/docSite/hugo.toml b/docSite/hugo.toml index 3f8295909..d3f8ca537 100644 --- a/docSite/hugo.toml +++ b/docSite/hugo.toml @@ -55,8 +55,8 @@ defaultContentLanguage = 'zh-cn' ["JetBrains Mono", "500, 700"] ] - sans_serif_font = "LXGW WenKai Screen" # Default is System font - secondary_font = "LXGW WenKai Screen" # Default is System font + #sans_serif_font = "LXGW WenKai Screen" # Default is System font + #secondary_font = "LXGW WenKai Screen" # Default is System font mono_font = "JetBrains Mono" # Default is System font [params.footer] diff --git a/docSite/layouts/partials/docs/footer/footer-scripts.html b/docSite/layouts/partials/docs/footer/footer-scripts.html index a00af0ff8..d3041cac4 100644 --- a/docSite/layouts/partials/docs/footer/footer-scripts.html +++ b/docSite/layouts/partials/docs/footer/footer-scripts.html @@ -58,7 +58,7 @@ diff --git a/docSite/layouts/partials/docs/head.html b/docSite/layouts/partials/docs/head.html index 1c4765b49..db7ba21fa 100644 --- a/docSite/layouts/partials/docs/head.html +++ b/docSite/layouts/partials/docs/head.html @@ -105,5 +105,6 @@ {{- end -}} {{- end -}} - + + \ No newline at end of file diff --git a/docSite/static/js/jsdelivr-auto-fallback.js b/docSite/static/js/jsdelivr-auto-fallback.js new file mode 100644 index 000000000..9d5ac3e80 --- /dev/null +++ b/docSite/static/js/jsdelivr-auto-fallback.js @@ -0,0 +1,182 @@ +((document) => { + 'use strict'; + let fastNode; + let failed; + let isRunning; + const DEST_LIST = [ + 'cdn.jsdelivr.net', + 'jsd.cdn.zzko.cn', + 'cdn.jsdelivr.us', + 'jsd.onmicrosoft.cn', + 'fastly.jsdelivr.net', + 'gcore.jsdelivr.net' + ]; + const PREFIX = '//'; + const SOURCE = DEST_LIST[0]; + const starTime = Date.now(); + const TIMEOUT = 2000; + const STORE_KEY = 'jsdelivr-auto-fallback'; + const TEST_PATH = '/gh/PipecraftNet/jsdelivr-auto-fallback@main/empty.css?'; + const shouldReplace = (text) => text && text.includes(PREFIX + SOURCE); + const replace = (text) => text.replace(PREFIX + SOURCE, PREFIX + fastNode); + const setTimeout = window.setTimeout; + const $ = document.querySelectorAll.bind(document); + + const replaceElementSrc = () => { + let element; + let value; + for (element of $('link[rel="stylesheet"]')) { + value = element.href; + if (shouldReplace(value) && !value.includes(TEST_PATH)) { + element.href = replace(value); + } + } + + for (element of $('script')) { + value = element.src; + if (shouldReplace(value)) { + const newNode = document.createElement('script'); + newNode.src = replace(value); + element.defer = true; + element.src = ''; + element.before(newNode); + element.remove(); + } + } + + for (element of $('img')) { + value = element.src; + if (shouldReplace(value)) { + // Used to cancel loading. Without this line it will remain pending status. + element.src = ''; + element.src = replace(value); + } + } + + // All elements that have a style attribute + for (element of $('*[style]')) { + value = element.getAttribute('style'); + if (shouldReplace(value)) { + element.setAttribute('style', replace(value)); + } + } + + for (element of $('style')) { + value = element.innerHTML; + if (shouldReplace(value)) { + element.innerHTML = replace(value); + } + } + }; + + const tryReplace = () => { + if (!isRunning && failed && fastNode) { + console.warn(SOURCE + ' is not available. Use ' + fastNode); + isRunning = true; + setTimeout(replaceElementSrc, 0); + // Some need to wait for a while + setTimeout(replaceElementSrc, 20); + // Replace dynamically added elements + setInterval(replaceElementSrc, 500); + } + }; + + const checkAvailable = (url, callback) => { + let timeoutId; + const newNode = document.createElement('link'); + const handleResult = (isSuccess) => { + if (!timeoutId) { + return; + } + + clearTimeout(timeoutId); + timeoutId = 0; + // Used to cancel loading. Without this line it will remain pending status. + if (!isSuccess) newNode.href = 'data:text/css;base64,'; + newNode.remove(); + callback(isSuccess); + }; + + timeoutId = setTimeout(handleResult, TIMEOUT); + + newNode.addEventListener('error', () => handleResult(false)); + newNode.addEventListener('load', () => handleResult(true)); + newNode.rel = 'stylesheet'; + newNode.text = 'text/css'; + newNode.href = url + TEST_PATH + starTime; + document.head.insertAdjacentElement('afterbegin', newNode); + }; + + const cached = (() => { + try { + return Object.assign( + {}, + JSON.parse(localStorage.getItem(STORE_KEY) || '{}') + ); + } catch { + return {}; + } + })(); + + const main = () => { + cached.time = starTime; + cached.failed = false; + cached.fastNode = null; + + for (const url of DEST_LIST) { + checkAvailable('https://' + url, (isAvailable) => { + // console.log(url, Date.now() - starTime, Boolean(isAvailable)); + if (!isAvailable && url === SOURCE) { + failed = true; + cached.failed = true; + } + + if (isAvailable && !fastNode) { + fastNode = url; + } + + if (isAvailable && !cached.fastNode) { + cached.fastNode = url; + } + + tryReplace(); + }); + } + + setTimeout(() => { + // If all domains are timeout + if (failed && !fastNode) { + fastNode = DEST_LIST[1]; + tryReplace(); + } + + localStorage.setItem(STORE_KEY, JSON.stringify(cached)); + }, TIMEOUT + 100); + }; + + if ( + cached.time && + starTime - cached.time < 60 * 60 * 1000 && + cached.failed && + cached.fastNode + ) { + failed = true; + fastNode = cached.fastNode; + tryReplace(); + setTimeout(main, 1000); + } else if (document.head) { + main(); + } else { + const observer = new MutationObserver(() => { + if (document.head) { + observer.disconnect(); + main(); + } + }); + const observerOptions = { + childList: true, + subtree: true + }; + observer.observe(document, observerOptions); + } + })(document); \ No newline at end of file