diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml index 766fce0904e..425f9b5dcfe 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -43,7 +43,9 @@ jobs: - name: Check if PR only changes draft blog posts id: check run: | - CHANGED=$(gh pr diff ${{ github.event.pull_request.number }} --name-only) + CHANGED=$(gh api --paginate \ + "repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/files" \ + --jq '.[].filename') DRAFTS_ONLY=true for file in $CHANGED; do case "$file" in @@ -88,9 +90,21 @@ jobs: run: yarn workspaces foreach --all install - name: Check cache run: yarn check:dependencies + # Antora spends most of the build cloning content repositories: a green + # run measured 426s of 606s in contentAggregated, against 165s of actual + # conversion. Restoring the clones turns those into incremental fetches. + # The key is deliberately stable, so the cache is written once per + # playbook revision rather than on every run, which would churn the + # repository's shared 10 GB cache budget. + - name: Cache Antora content + uses: actions/cache@v6 + with: + path: ${{ github.workspace }}/.antora-cache + key: antora-content-v1-${{ hashFiles('antora-playbook-snippets/antora-playbook.yml') }} - name: Build env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + ANTORA_CACHE_DIR: ${{ github.workspace }}/.antora-cache run: yarn build-all - name: Run checks run: yarn checks @@ -99,7 +113,7 @@ jobs: mkdir pull_request echo ${{ github.event.pull_request.number }} > ./pull_request/number - name: Upload artifacts - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v7 with: name: website path: | diff --git a/.gitignore b/.gitignore index b08e0798411..2ca050f7289 100644 --- a/.gitignore +++ b/.gitignore @@ -29,10 +29,13 @@ resources antora-playbook-*.yml #temporary -local-antora-playbook-* antora-playbook.yml /.hugo_build.lock +/tests/antora-ui/out .playwright-cli/ skills-lock.json build/unused-media.txt + +# CI relocates ANTORA_CACHE_DIR here so it can be cached between runs +/.antora-cache diff --git a/.gitleaks.toml b/.gitleaks.toml new file mode 100644 index 00000000000..c5efc2e8eac --- /dev/null +++ b/.gitleaks.toml @@ -0,0 +1,13 @@ +# Secret-scanner allowlist (gitleaks v8 format; also read by leaktk). +# +# The DocSearch widget needs Algolia's search-only API key in the browser, so +# antora-ui-camel/src/js/08-docsearch.js embeds it and the built bundle under +# antora-ui-camel/public/_/js/ carries it minified. It is a public, read-only +# key by design, not a credential; scanners flag the bundle as a "Generic +# Secret" every time the hashed filename changes. + +[[allowlists]] +description = "Algolia DocSearch search-only API key for the apache_camel index" +condition = "AND" +paths = ['''^antora-ui-camel/(src/js/08-docsearch\.js|public/_/js/site-[0-9a-f]+\.js)$'''] +regexes = ['''1b7e52df4759e32dd49adedb286997f6'''] diff --git a/antora-local-build.sh b/antora-local-build.sh index 1affe0484ed..d344013d601 100755 --- a/antora-local-build.sh +++ b/antora-local-build.sh @@ -35,10 +35,10 @@ antora-playbook-snippets/assemble-playbook.sh antora-playbook-local-quick.yml .. if [ "$2" = "full" ] then - yarn build:antora-local-full2 + yarn build:antora-local-full elif [ "$2" = "quick" ] then yarn build:antora-local-quick else - yarn build:antora-local-partial2 + yarn build:antora-local-partial fi diff --git a/antora-playbook-snippets/antora-playbook.yml b/antora-playbook-snippets/antora-playbook.yml index f56b8713bc1..6d190726098 100644 --- a/antora-playbook-snippets/antora-playbook.yml +++ b/antora-playbook-snippets/antora-playbook.yml @@ -106,6 +106,11 @@ runtime: antora: extensions: + # First, so it times the phases that follow. Antora suppresses its own + # progress output whenever stdout is not a TTY, which is always the case + # under `yarn build-all` and on CI. + - ./extensions/build-progress.js + - ./extensions/promote-deprecated-attribute.js # Registers the [asciinema] block and injects the player assets plus the asciinema-styles, diff --git a/antora-ui-camel/gulpfile.js b/antora-ui-camel/gulpfile.js index 3047682be6c..b0f522c43ea 100644 --- a/antora-ui-camel/gulpfile.js +++ b/antora-ui-camel/gulpfile.js @@ -21,7 +21,8 @@ const glob = { test: 'test/**/*-test.js', formatcss: [ `${srcDir}/css/**/*.css`, - `!${srcDir}/css/**/typeface-droid-sans-mono.css`, + `!${srcDir}/css/**/typeface-archivo.css`, + `!${srcDir}/css/**/typeface-jetbrains-mono.css`, `!${srcDir}/css/**/typeface-open-sans.css`, ], js: ['gulpfile.js', 'gulp.d/**/*.js', `${srcDir}/{helpers,js}/**/*.js`], diff --git a/antora-ui-camel/package.json b/antora-ui-camel/package.json index c244c1dc4b8..a33df3b527c 100644 --- a/antora-ui-camel/package.json +++ b/antora-ui-camel/package.json @@ -12,7 +12,9 @@ "node": ">= 22.12.0" }, "browserslist": [ - "last 2 versions" + "last 2 versions", + "safari >= 16.4", + "ios_saf >= 16.4" ], "scripts": { "build": "gulp bundle", @@ -23,6 +25,8 @@ "devDependencies": { "@asciidoctor/core": "^3.0.2", "@asciidoctor/tabs": "1.0.0-beta.3", + "@fontsource/archivo": "^5.3.0", + "@fontsource/jetbrains-mono": "^5.3.0", "@openfonts/open-sans_latin-ext": "^1.44.0", "@ronilaukkarinen/gulp-stylelint": "^14.1.2", "@vscode/gulp-vinyl-zip": "^2.5.0", @@ -67,7 +71,6 @@ "stylelint-config-standard": "^34.0.0", "svg4everybody": "^2.1.9", "toml": "^4.2.0", - "typeface-droid-sans-mono": "^0.0.44", "undertaker": "^2.0.0", "vinyl-buffer": "~1.0", "vinyl-fs": "^4.0.2" diff --git a/antora-ui-camel/public/_/css/site-74543f5b13.css b/antora-ui-camel/public/_/css/site-74543f5b13.css deleted file mode 100644 index 9c4378654cd..00000000000 --- a/antora-ui-camel/public/_/css/site-74543f5b13.css +++ /dev/null @@ -1,5 +0,0 @@ -@font-face{font-family:Open Sans;font-style:normal;font-display:swap;font-weight:300;src:local("Open Sans Light"),local("OpenSans-Light"),url(../font/open-sans-latin-ext-300.woff2) format("woff2"),url(../font/open-sans-latin-ext-300.woff) format("woff")}@font-face{font-family:Open Sans;font-style:italic;font-display:swap;font-weight:300;src:local("Open Sans Light Italic"),local("OpenSans-LightItalic"),url(../font/open-sans-latin-ext-300-italic.woff2) format("woff2"),url(../font/open-sans-latin-ext-300-italic.woff) format("woff")}@font-face{font-family:Open Sans;font-style:normal;font-display:swap;font-weight:700;src:local("Open Sans Bold"),local("OpenSans-Bold"),url(../font/open-sans-latin-ext-700.woff2) format("woff2"),url(../font/open-sans-latin-ext-700.woff) format("woff")}@font-face{font-family:Open Sans;font-style:italic;font-display:swap;font-weight:700;src:local("Open Sans Bold Italic"),local("OpenSans-BoldItalic"),url(../font/open-sans-latin-ext-700-italic.woff2) format("woff2"),url(../font/open-sans-latin-ext-700-italic.woff) format("woff")}@font-face{font-family:Open Sans;font-style:normal;font-display:swap;font-weight:800;src:local("Open Sans ExtraBold"),local("OpenSans-ExtraBold"),url(../font/open-sans-latin-ext-800.woff2) format("woff2"),url(../font/open-sans-latin-ext-800.woff) format("woff")}@font-face{font-family:Open Sans;font-style:italic;font-display:swap;font-weight:800;src:local("Open Sans ExtraBold Italic"),local("OpenSans-ExtraBoldItalic"),url(../font/open-sans-latin-ext-800-italic.woff2) format("woff2"),url(../font/open-sans-latin-ext-800-italic.woff) format("woff")}@font-face{font-family:Droid Sans Mono;font-style:normal;font-display:swap;font-weight:400;src:local("Droid Sans Mono Regular"),local("Droid Sans Mono-Regular"),url(../font/droid-sans-mono-latin-400.woff2) format("woff2"),url(../font/droid-sans-mono-latin-400.woff) format("woff")}.fa{display:inline-block}.fa-lock::before{content:"🔒"}body,html{height:100%}*,::after,::before{-webkit-box-sizing:inherit;box-sizing:inherit}::-moz-selection{background:#cf7428;color:#fff}::selection{background:#cf7428;color:#fff}html{-webkit-box-sizing:border-box;box-sizing:border-box;font-size:1.0625em;-webkit-text-size-adjust:100%}@media screen and (width >= 1025px){html{font-size:1.125em}}body{background:#fff;color:#333;font-family:Open Sans,sans-serif;line-height:1.15;margin:0}a{text-decoration:none}a:hover{text-decoration:underline}a:active{background-color:none}code,kbd,pre{color:#4f51ae;font-family:Droid Sans Mono,DejaVu Sans Mono,monospace;overflow-wrap:break-word}b,dt,strong,th{font-weight:700}em em{font-style:normal}strong strong{font-weight:400}button{cursor:pointer;font-family:inherit;font-size:1em;line-height:1.15;margin:0}button::-moz-focus-inner{border:none;padding:0}mark{color:#e97826;font-weight:700;background:#fff}.text-center{text-align:center}.body{min-height:calc(100vh - 27.05556rem);word-wrap:break-word}@media screen and (width >= 1025px){.body{display:-webkit-box;display:-ms-flexbox;display:flex}}.nav-container{position:fixed;top:4.05556rem;left:0;width:100%;font-size:.94444rem;z-index:1;visibility:hidden}@media screen and (width >= 769px){.nav-container{width:15rem}}@media screen and (width >= 1025px){.nav-container{font-size:.86111rem;-webkit-box-flex:0;-ms-flex:none;flex:none;position:static;top:0;visibility:visible}}.nav-container.is-active{visibility:visible;padding:0}@media screen and (width <= 1024px){.nav-category{margin-left:1rem}}.nav{background:#fefefe;position:relative;top:2.5rem;height:calc(100vh - 6.55556rem)}@media screen and (width >= 769px){.nav{-webkit-box-shadow:.5px 0 3px #f5f5f5;box-shadow:.5px 0 3px #f5f5f5}}@media screen and (width >= 1025px){.nav{top:4.05556rem;-webkit-box-shadow:none;box-shadow:none;position:sticky;height:calc(100vh - 4.05556rem)}}.nav .panels{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:inherit}html.is-clipped--nav{overflow-y:hidden}.nav-panel-menu{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:calc(100vh - 9.05556rem)}@media screen and (width >= 1025px){.nav-panel-menu{height:calc(100vh - 6.55556rem)}}@media screen and (width <= 1024px){.nav-panel-menu{margin-top:4.05556rem}}.nav-panel-menu:not(.is-active) .nav-menu{opacity:.75}.nav-panel-menu:not(.is-active)::after{content:"";background:rgba(0,0,0,.5);display:block;position:absolute;inset:0}.nav-panel-menu input.search{position:absolute;width:100%;border:1px solid #fefefe;padding:.6rem 1.23rem .5rem 1.7rem;margin:0;background:#fefefe no-repeat .3rem/1.2rem url(../img/search-a73cfec790.svg);z-index:5;font-size:.94444rem;font-family:Open Sans,sans-serif;caret-color:#e97826;-webkit-transition:border-color .2s linear;transition:border-color .2s linear;outline:none}.nav-panel-menu input.search:focus{border-bottom-color:#f5f5f5}.nav-panel-menu input.search:valid~.nav-menu ul{display:block;margin:0;padding:0}.nav-panel-menu input.search:valid~.nav-menu li{display:block;margin:0;padding:0}.nav-panel-menu input.search:valid~.nav-menu button{display:none}.nav-item[data-depth="1"]>.nav-text,.nav-item[data-depth="1"]>a.nav-link{line-height:1.8rem;font-weight:700;color:#303284}.nav-item[data-depth="1"]>.nav-list a{padding-left:10px}.nav-item[data-depth="2"]>a.nav-link{line-height:1.3rem}.nav-item[data-depth="2"]>.nav-item-toggle{margin-left:-.675em}.nav-item[data-depth="2"]>.filtered{display:none}.nav-item[data-depth="2"]>.nav-list a{padding-left:20px}.nav-item[data-depth="3"]>a.nav-link{line-height:1.2rem}.nav-item[data-depth="3"]>.filtered{display:none}.nav-menu{top:2.5rem;min-height:0;width:100%;padding:.5rem .75rem;margin-bottom:2.5rem;line-height:1.35;position:relative;word-break:break-word;overflow-y:auto}.nav-menu::-webkit-scrollbar{width:.425em}.nav-menu::-webkit-scrollbar-track{background:#c1c1c1;border-radius:3.125em}.nav-menu::-webkit-scrollbar-thumb{background:#8e8e8e;border-radius:3.125em}.nav-menu::-webkit-scrollbar-thumb:active,.nav-menu::-webkit-scrollbar-thumb:hover{background:gray}@media screen and (width <= 1024px){.nav-menu::-webkit-scrollbar{width:0;background:transparent}}.nav-menu h3.title{color:#303284;font-size:inherit;font-weight:700;margin:0;padding:.25em 0 .125em}.nav-menu a{color:inherit}.nav-list{margin:0 0 0 .75rem;padding:0}.nav-menu>.nav-list{margin-bottom:.5rem}.nav-item{list-style:none;margin-top:.5em}.nav-item-toggle~.nav-list{padding-bottom:.125rem}.nav-item[data-depth="0"]>.nav-list:first-child{display:block;margin:0}.nav-item:not(.is-active)>.nav-list{display:none}.nav-item-toggle{background:transparent url(../img/caret-d6dacc711e.svg) no-repeat 50%/50%;border:none;outline:none;line-height:inherit;position:absolute;height:1.35em;width:1.35em;margin-top:.3em;margin-left:-1.35em}.nav-item.is-active>.nav-item-toggle{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.is-current-page>.nav-link,.is-current-page>.nav-text{font-weight:700}.breadcrumbs li .image>img,.nav-link .image>img{width:1em}.nav-panel-explore{background:#fefefe;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;position:absolute;right:0;bottom:0;left:0;max-height:calc(50% + 2.5rem)}.nav-panel-explore,.nav-panel-explore .context{display:-webkit-box;display:-ms-flexbox;display:flex}.nav-panel-explore .context{font-size:.83333rem;-ms-flex-negative:0;flex-shrink:0;color:#333;-webkit-box-shadow:0 -1px 0 #f5f5f5;box-shadow:0 -1px 0 #f5f5f5;padding:0 .25rem 0 .5rem;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;cursor:pointer;line-height:1;height:2.5rem}.nav-panel-explore .context .noversion{padding:0 1.5rem 0 .5rem;display:block}.nav-panel-explore .context .noversion,.nav-panel-explore .context .version{background-image:url(../img/chevron-63cb534773.svg);background-repeat:no-repeat;background-position:right .5rem top 50%;background-size:auto .75em}.nav-panel-explore .context .version{padding:0 1.5rem 0 0}.nav-panel-explore .components{line-height:1.6;-webkit-box-shadow:inset 0 1px 5px #f5f5f5;box-shadow:inset 0 1px 5px #f5f5f5;background:#f0f0f0;padding:.5rem .75rem 0;margin:0;overflow-y:auto;max-height:100%;display:block}.nav-panel-explore:not(.is-active) .components{display:none}.nav-panel-explore .component{display:block}.nav-panel-explore .component+.component{margin-top:.5rem}.nav-panel-explore .component:last-child{margin-bottom:.75rem}.nav-panel-explore .component .title{font-weight:700}.nav-panel-explore .versions{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;padding-left:0;margin-top:-.25rem;line-height:1}.nav-panel-explore .component .version{display:block;margin:.375rem .375rem 0 0}.nav-panel-explore .component .title a{color:inherit;display:inherit}.nav-panel-explore .component .version a{border:1px solid #f5f5f5;border-radius:.25rem;color:inherit;opacity:.75;white-space:nowrap;padding:.125em .25em;display:inherit}.nav-panel-explore .component .is-current a{border-color:currentcolor;opacity:.9;font-weight:700}.nav-logo{background-image:url(../img/logo-camel-medium-372cf8688f.png);background-repeat:no-repeat;background-size:9.5rem;background-position-x:10px;background-position-y:10px;width:4rem;-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}@media screen and (width <= 1024px){aside.toc.sidebar{display:none}}@media screen and (width >= 1025px){main{-webkit-box-flex:1;-ms-flex:auto;flex:auto;min-width:0}main>.content{display:-webkit-box;display:-ms-flexbox;display:flex}aside.toc.embedded{display:none}aside.toc.sidebar{-webkit-box-flex:0;-ms-flex:0 0 9rem;flex:0 0 9rem;min-width:15rem}.toc.sidebar .toc-menu ul{scrollbar-width:thin}.toc.sidebar .toc-menu ul::-webkit-scrollbar{width:.425em}.toc.sidebar .toc-menu ul::-webkit-scrollbar-track{background:#c1c1c1;border-radius:3.125em}.toc.sidebar .toc-menu ul::-webkit-scrollbar-thumb{background:#8e8e8e;border-radius:3.125em}.toc.sidebar .toc-menu ul::-webkit-scrollbar-thumb:active,.toc.sidebar .toc-menu ul::-webkit-scrollbar-thumb:hover{background:gray}}@media screen and (width >= 1216px){aside.toc.sidebar{-ms-flex-preferred-size:12rem;flex-basis:12rem}}.toolbar{color:#191919;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:#fefefe;-webkit-box-shadow:0 1px 0 #e1e1e1;box-shadow:0 1px 0 #e1e1e1;display:-webkit-box;display:-ms-flexbox;display:flex;font-size:.83333rem;height:2.5rem;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;position:sticky;top:4.05556rem;z-index:2}.static.toolbar{-webkit-box-shadow:none;box-shadow:none;margin:0;max-width:100vw}@media screen and (width <= 1024px){.toolbar{top:8.05556rem}}.toolbar a{color:inherit}.nav-toggle{background:url(../img/menu-8775cec4be.svg) no-repeat 50% 47.5%;background-size:49%;border:none;outline:none;line-height:inherit;height:2.5rem;padding:0;width:2.5rem;margin-right:-.25rem}@media screen and (width >= 1025px){.nav-toggle{display:none}}.nav-toggle.is-active{background-image:url(../img/back-e8d811f74c.svg);background-size:41.5%}.home-link{background:url(../img/home-o-97a33fc02f.svg) no-repeat 50% 45%;background-size:50%;display:block;height:2.5rem;padding:0;width:2.5rem}.home-link.is-current,.home-link:hover{background-image:url(../img/home-934e2b15ea.svg)}.edit-this-page{display:none;padding-right:.5rem}@media screen and (width >= 1025px){.edit-this-page{display:block}}.toolbar .edit-this-page a{color:#191919}.breadcrumbs{display:none;-webkit-box-flex:1;-ms-flex:1 1;flex:1 1;padding:0 .5rem 0 .75rem;line-height:1.35}@media screen and (width >= 1025px){.breadcrumbs{display:block}}a+.breadcrumbs{padding-left:.05rem}.breadcrumbs ul{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0;padding:0;list-style:none}.breadcrumbs li{display:inline;margin:0}.breadcrumbs li::after{content:"/";padding:0 .5rem}.breadcrumbs li:last-of-type::after{content:none}.page-versions{display:none;margin-right:.7rem;position:relative;line-height:1}@media screen and (width >= 1025px){.page-versions{display:block}}.page-versions .version-menu-toggle{color:inherit;background:url(../img/chevron-63cb534773.svg) no-repeat;background-position:right .5rem top 50%;background-size:auto .75em;border:none;outline:none;line-height:inherit;padding:.5rem 1.5rem .5rem .5rem;position:relative;z-index:3}.page-versions .version-menu{border:1px solid transparent;background-color:#f0f0f0;padding:1.25rem .5rem .5rem;position:absolute;top:0;left:0;width:100%}.page-versions:not(.is-active) .version-menu{display:none}.page-versions .version{display:block;padding-top:.5rem}.page-versions .version.is-current{display:none}.page-versions .version.is-missing{color:#8e8e8e;font-style:italic;text-decoration:none}.toc-menu{color:#333}.toc.sidebar .toc-menu{margin-right:.75rem;position:sticky;top:7.55556rem}.toc .toc-menu h3{color:#333;font-size:.88889rem;font-weight:700;line-height:1.3;margin:0 -.5px;padding-bottom:.25rem}.toc.sidebar .toc-menu h3{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:2.5rem;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.toc .toc-menu ul{font-size:.83333rem;line-height:1.2;list-style:none;margin:0;padding:0}.toc.sidebar .toc-menu ul{max-height:calc(100vh - 10.05556rem);overflow-y:auto}@media screen and (width >= 1025px){.toc .toc-menu h3{font-size:.83333rem}.toc .toc-menu ul{font-size:.75rem}}.toc .toc-menu li{margin:0}.toc .toc-menu li[data-level="2"] a{padding-left:1.25rem}@media screen and (width <= 1024px){.toc .toc-menu ul li ul li ul li a{padding-left:1.25rem}}.toc .toc-menu li[data-level="3"] a{padding-left:2rem}.toc .toc-menu a{color:inherit;border-left:2px solid #e1e1e1;display:inline-block;padding:.25rem 0 .25rem .5rem;text-decoration:none}.sidebar.toc .toc-menu a{display:block;outline:none}.toc .toc-menu a:hover{color:#585ac2}.toc .toc-menu a.is-active{border-left-color:#585ac2;color:#333}.sidebar.toc .toc-menu a:focus{background:#fefefe}.toc .toc-menu .is-hidden-toc{display:none!important}.doc{color:#333;font-size:inherit;-ms-hyphens:auto;hyphens:auto;line-height:1.6;margin:0 auto;padding:0 1rem 4rem}@media screen and (width >= 1025px){.doc{font-size:.94444rem;margin:0 2rem;max-width:75.88889rem;min-width:0}}.doc h1,.doc h2,.doc h3,.doc h4,.doc h5,.doc h6{color:#303284;font-weight:700;-ms-hyphens:none;hyphens:none;line-height:1.3;margin:1rem 0 0;text-transform:uppercase}.doc>h1.page:first-child,.static>h1:first-child{font-size:2rem;margin:1.5rem 0}.doc>h1.page:first-child img{width:2rem}#preamble+.sect1,.doc .sect1+.sect1{margin-top:2rem}.doc h1.sect0{background:#f0f0f0;font-size:1.8em;margin:1.5rem -1rem 0;padding:.5rem 1rem}.doc h2:not(.discrete){margin-top:1rem;margin-left:-1rem;margin-right:-1rem;padding:.4rem 1rem .1rem;overflow-wrap:break-word}.doc h2:not(.discrete)::after{content:"";display:block;position:relative;height:1px;background-color:#e1e1e1}.doc h3:not(.discrete){font-weight:700;overflow-wrap:break-word}.doc h1 .anchor,.doc h2 .anchor,.doc h3 .anchor,.doc h4 .anchor,.doc h5 .anchor,.doc h6 .anchor,.doc td .anchor{position:absolute;text-decoration:none;width:1.75ex;margin-left:-1.5ex;visibility:hidden;font-size:.8em;font-weight:400;padding-top:.05em;background-image:none}.doc h1 .anchor::before,.doc h2 .anchor::before,.doc h3 .anchor::before,.doc h4 .anchor::before,.doc h5 .anchor::before,.doc h6 .anchor::before,.doc td .anchor::before{content:"\00a7"}.doc h1:hover .anchor,.doc h2:hover .anchor,.doc h3:hover .anchor,.doc h4:hover .anchor,.doc h5:hover .anchor,.doc h6:hover .anchor,.doc td:hover .anchor{visibility:visible}.doc p{margin:0}.doc .table-wrapper{overflow-x:auto}.doc .table-wrapper::-webkit-scrollbar{height:.425em}.doc .table-wrapper::-webkit-scrollbar-track{background:#c1c1c1;border-radius:3.125em}.doc .table-wrapper::-webkit-scrollbar-thumb{background:#8e8e8e;border-radius:3.125em}.doc .table-wrapper::-webkit-scrollbar-thumb:active,.doc .table-wrapper::-webkit-scrollbar-thumb:hover{background:gray}.doc .table-wrapper table{width:100%}.doc .tableblock p{font-size:inherit}.doc .tableblock td:not(:first-child)>p,.doc .tableblock thead,.doc :not(td)>.content,.doc :not(td)>p{-ms-hyphens:auto;hyphens:auto}.doc a{color:#585ac2;word-break:break-word;text-decoration:none;background-image:-webkit-gradient(linear,left top,right top,color-stop(50%,#583ac2),color-stop(50%,transparent));background-image:linear-gradient(90deg,#583ac2 50%,transparent 0);background-position:0 1.1em;background-repeat:repeat-x;background-size:7px 1px}.doc .camel-project .links a,.doc .sect2 h3 a,.doc .section .links a,.doc li a,.doc table a{background:none}.doc table.tableblock td a{word-break:normal}.doc table.tableblock tbody tr td:first-child{width:25%;overflow-wrap:anywhere}.doc a:hover{color:#104d92}.doc a.unresolved{color:#d32f2f}.doc i.fa{font-style:normal}.doc p code,.doc thead code{color:#4f51ae;background:#fefefe;border-radius:.2rem;font-size:.77778rem;padding:.075rem .25rem .125rem;overflow-wrap:break-word}.doc pre{font-size:.77778rem;line-height:1.5;margin:0}.doc blockquote{margin:0}.doc .right{float:right}.doc .left{float:left}.doc .underline{text-decoration:underline}.doc .line-through{text-decoration:line-through}.doc .dlist,.doc .exampleblock,.doc .imageblock,.doc .listingblock,.doc .literalblock,.doc .olist,.doc .paragraph,.doc .partintro,.doc .quoteblock,.doc .sidebarblock,.doc .ulist,.doc .verseblock{margin:1rem 0 0;word-break:break-word}.doc table.tableblock{border-collapse:collapse;font-size:.83333rem;margin:2rem 0}.doc table.stretch{width:100%}.doc table.tableblock thead th{border-bottom:2.5px solid #4f51ae;padding:.5rem}.doc table.tableblock td,.doc table.tableblock>:not(thead) th{border-top:1px solid #4f51ae;border-bottom:1px solid #4f51ae;padding:.5rem}.doc .halign-left{text-align:left}.doc .halign-right{text-align:right}.doc .halign-center{text-align:center}.doc .valign-top{vertical-align:top}.doc .valign-bottom{vertical-align:bottom}.doc .valign-middle{vertical-align:middle}.doc .admonitionblock{margin:1.4rem 0 0;-webkit-box-shadow:inset 0 0 1.75px #e1e1e1;box-shadow:inset 0 0 1.75px #e1e1e1}.doc .admonitionblock p,.doc .admonitionblock td.content{font-size:.88889rem}.doc .admonitionblock td.content>:first-child{margin:0}.doc .admonitionblock pre{font-size:.83333rem}.doc .admonitionblock>table{border-collapse:collapse;position:relative;width:100%}.doc .admonitionblock td.content{padding:1rem 1rem .75rem;background:#fefefe;width:100%}.doc .admonitionblock .icon{position:relative;top:0;left:0;font-size:.83333rem;padding:0 .5rem;height:1.25rem;line-height:1;font-weight:700;text-transform:uppercase}.doc .admonitionblock.caution .icon{background-color:#a0439c;color:#fff}.doc .admonitionblock.important .icon{background-color:#d32f2f;color:#fff}.doc .admonitionblock.note .icon{background-color:#217ee7;color:#fff}.doc .admonitionblock.tip .icon{background-color:#4d4fb7;color:#fff}.doc .admonitionblock.warning .icon{background-color:#e18114;color:#fff}.doc .admonitionblock .icon i{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:100%}.doc .admonitionblock .icon i::after{content:attr(title);-ms-hyphens:none;hyphens:none;-webkit-writing-mode:tb-rl;-ms-writing-mode:tb-rl;writing-mode:tb-rl}.doc .imageblock{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.doc .imageblock img{display:block}.doc .image>img,.doc .imageblock img{height:auto;max-width:100%}.doc table.tableblock td .imageblock img{max-width:50px}#preamble .abstract blockquote{background:#f0f0f0;border-left:5px solid #e1e1e1;color:#4a4a4a;font-size:.88889rem;padding:.75em 1em}.doc .quoteblock{background:#fefefe;border-left:5px solid #5d5d5d;color:#5d5d5d;padding:.25rem 2rem 1.25rem}.doc .quoteblock .attribution{color:#8e8e8e;font-size:.83333rem;margin-top:.75rem}.doc .quoteblock blockquote{margin-top:1rem}.doc .quoteblock .paragraph{font-style:italic}.doc .quoteblock cite{padding-left:1em}.doc table.tableblock .paragraph{margin:0;padding:0}.doc .olist .admonitionblock,.doc .ulist .admonitionblock,.doc table.tableblock .admonitionblock{padding:0}.doc ol,.doc ul{margin:0;padding:0 0 0 2rem}.doc ol.arabic{list-style-type:decimal}.doc ol.decimal{list-style-type:decimal-leading-zero}.doc ol.loweralpha{list-style-type:lower-alpha}.doc ol.upperalpha{list-style-type:upper-alpha}.doc ol.lowerroman{list-style-type:lower-roman}.doc ol.upperroman{list-style-type:upper-roman}.doc ol.lowergreek{list-style-type:lower-greek}.doc ul.checklist{padding-left:.5rem;list-style:none}.doc ul.checklist p>i.fa-check-square-o:first-child,.doc ul.checklist p>i.fa-square-o:first-child{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:1.25rem}.doc ul.checklist i.fa-check-square-o::before{content:"\2713"}.doc ul.checklist i.fa-square-o::before{content:"\274f"}.doc .dlist .dlist,.doc .dlist .olist,.doc .dlist .ulist,.doc .olist .dlist,.doc .olist .olist,.doc .olist .ulist,.doc .ulist .dlist,.doc .ulist .olist,.doc .ulist .ulist{margin-top:.5rem}.doc .olist li,.doc .ulist li{margin-bottom:.5rem}.doc .admonitionblock .listingblock,.doc .olist .listingblock,.doc .ulist .listingblock{padding:0}.doc .admonitionblock .title,.doc .exampleblock .title,.doc .imageblock .title,.doc .listingblock .title,.doc .literalblock .title,.doc .openblock .title,.doc .tableblock caption{color:#5d5d5d;font-size:.88889rem;font-weight:700;font-style:italic;-ms-hyphens:none;hyphens:none;letter-spacing:.01em;padding-bottom:.075rem;text-align:left}.doc .imageblock .title{margin-top:.5rem;padding-bottom:0}.doc .admonitionblock .title+.paragraph{margin-top:0}.doc .exampleblock>.content{background:#fff;border:.25rem solid #c1c1c1;border-radius:.5rem;padding:.75rem}.doc .exampleblock>.content>:first-child{margin-top:0}.doc .sidebarblock{background:#f0f0f0;border-radius:.75rem;padding:.75rem 1.5rem}.doc .sidebarblock>.content>.title{font-size:1.25rem;font-weight:700;line-height:1.3;margin-bottom:-.3em;text-align:center}.doc .sidebarblock>.content>:not(.title):first-child{margin-top:0}.doc .listingblock.wrap pre,.doc .tableblock pre{white-space:pre-wrap}.doc pre.highlight code,.doc pre:not(.highlight){background:#fefefe;-webkit-box-shadow:inset 0 0 1.75px #e1e1e1;box-shadow:inset 0 0 1.75px #e1e1e1;display:block;overflow-x:auto;padding:.75rem}.doc pre.highlight code::-webkit-scrollbar{height:.425em}.doc pre.highlight code::-webkit-scrollbar-track{background:#c1c1c1;border-radius:3.125em}.doc pre.highlight code::-webkit-scrollbar-thumb{background:#8e8e8e;border-radius:3.125em}.doc pre.highlight code::-webkit-scrollbar-thumb:active,.doc pre.highlight code::-webkit-scrollbar-thumb:hover{background:gray}.doc pre.highlight{position:relative}.doc .listingblock code[data-lang]::before{content:attr(data-lang);display:none;color:#c1c1c1;font-size:.75rem;letter-spacing:.05em;line-height:1;text-transform:uppercase;position:absolute;top:.25rem;right:.25rem}.doc .listingblock:hover code[data-lang]::before{display:none}.doc .source-toolbox{display:-webkit-box;display:-ms-flexbox;display:flex;visibility:hidden;position:absolute;top:.25rem;right:.5rem;color:#c1c1c1;font-family:Droid Sans Mono,DejaVu Sans Mono,monospace;font-size:.83333rem;font-weight:500;line-height:1.2;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap;z-index:1}.doc .listingblock:hover .source-toolbox{visibility:visible}.doc .source-toolbox .source-lang{text-transform:uppercase}.doc .source-toolbox>:not(:last-child)::after{content:"|";letter-spacing:0;padding:0 1ch}.doc .source-toolbox .copy-button{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background:none;border:none;color:inherit;outline:none;padding:0;font-size:inherit;line-height:inherit;width:1.25em;height:1.25em;cursor:pointer;position:relative}.doc .source-toolbox .copy-button::before{content:"";display:block;width:1.25em;height:1.25em;background-image:url(../img/copy-d7c1e3194d.svg);background-size:contain;background-repeat:no-repeat;background-position:50%;-ms-flex-negative:0;flex-shrink:0}.doc .source-toolbox .copy-button.clicked::before{background-image:url(../img/copy-checkmark-9a4caf1664.svg)}.doc .source-toolbox .copy-toast{-webkit-box-flex:0;-ms-flex:none;flex:none;position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-top:1em;background-color:#333;border-radius:.25em;padding:.5em;color:#fff;cursor:auto;opacity:0;-webkit-transition:opacity .5s ease .5s;transition:opacity .5s ease .5s}.doc .source-toolbox .copy-toast::after{content:"";position:absolute;top:0;width:1em;height:1em;border:.55em solid transparent;border-left-color:#333;-webkit-transform:rotate(-90deg) translateX(50%) translateY(50%);transform:rotate(-90deg) translateX(50%) translateY(50%);-webkit-transform-origin:left;transform-origin:left}.doc .source-toolbox .copy-button.clicked .copy-toast{opacity:1;-webkit-transition:none;transition:none}.doc .language-console .hljs-meta{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.doc .dlist dt{font-style:italic}.doc .dlist dd{margin:0 0 .3rem 1.5rem}.doc .colist{font-size:.88889rem;margin:.25rem 0 -.25rem}.doc .colist>table>tbody>tr>:first-child,.doc .colist>table>tr>:first-child{padding:.25em .5rem 0;vertical-align:top}.doc .colist>table>tbody>tr>:last-child,.doc .colist>table>tr>:last-child{padding:.25rem 0}.doc .conum[data-value]{border:1px solid;border-radius:100%;display:inline-block;font-family:Open Sans,sans-serif;font-size:.75rem;font-style:normal;height:1.25em;line-height:1.2;text-align:center;width:1.25em;letter-spacing:-.25ex;text-indent:-.25ex}.doc .conum[data-value]::after{content:attr(data-value)}.doc .conum[data-value]+b{display:none}.doc b.button{white-space:nowrap}.doc b.button::before{content:"[";padding-right:.25em}.doc b.button::after{content:"]";padding-left:.25em}.doc kbd{display:inline-block;font-size:.66667rem;background:#fefefe;border:1px solid #c1c1c1;border-radius:.25em;-webkit-box-shadow:0 1px 0 #c1c1c1,inset 0 0 0 .1em #fff;box-shadow:0 1px 0 #c1c1c1,inset 0 0 0 .1em #fff;padding:.25em .5em;vertical-align:text-bottom;white-space:nowrap}.doc .keyseq,.doc kbd{line-height:1}.doc .keyseq{font-size:.88889rem}.doc .keyseq kbd{margin:0 .125em}.doc .keyseq kbd:first-child{margin-left:0}.doc .keyseq kbd:last-child{margin-right:0}.doc .menuseq i.caret::before{content:"\203a";font-size:1.1em;font-weight:700;line-height:.90909}.doc .icon i::after,.doc .menuseq,.doc .path,.doc a.bare,.doc b.button,.doc code,.doc kbd{-ms-hyphens:none;hyphens:none}@media screen and (width <= 626px){#preamble+.sect1,.doc .sect1+.sect1{overflow-wrap:break-word}}@media screen and (width <= 1024px) and (width >= 480px){.doc p code,.doc thead code{font-size:1.0625em}}table.tableblock thead{background:#e1e1e1;font-weight:700}div.badges p{text-align:left}div.badges span{color:#fff;padding:.15rem .3rem;font-weight:400;font-style:normal;font-size:.8rem}div.badges span.badge-key{background-color:#555;border-radius:.2rem 0 0 .2rem}div.badges span.badge-version{background-color:#217ee7;border-radius:0 .2rem .2rem 0}div.badges span.badge-supported{background-color:#4d4fb7;border-radius:0 .2rem .2rem 0}div.badges span.badge-unsupported{background-color:#d32f2f;border-radius:0 .2rem .2rem 0}.static{margin:0 auto}.static dl,.static ol,.static p,.static pre,.static ul{margin:1rem 0 0}.static a.icon{margin:2rem;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;text-align:center;background:none}.static .box,.static a.icon{display:-webkit-box;display:-ms-flexbox;display:flex}.static .box{margin:1rem 0}.static .box img{margin-top:1rem;height:6rem;margin-right:.5rem}.static .icon a,.static a.button-dark,.static a.button-light{background-image:none}@media screen and (width >= 1025px){.static{max-width:75.88889rem}}@media screen and (width <= 1024px){.static .box,.static .content,.static .icon{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin:0;padding:0;text-align:center;width:100%}.static .box .content{width:100%}.static .box img{height:6rem;max-width:25vw;margin-left:auto}.static .box img:only-child{margin-left:auto;margin-right:auto}.static .box img+img{margin-left:1rem;margin-right:auto}.static .box.right{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.static .button-light{line-height:4rem}.static a.icon{margin:0;width:100%}}html.is-clipped--navbar{overflow-y:hidden}body{padding-top:4.05556rem}@media screen and (width <= 1024px){body{padding-top:8.05556rem}}.navbar{background:#fff;color:#e97826;font-size:.88889rem;height:4.05556rem;position:fixed;top:0;width:100%;word-wrap:break-word;z-index:4;-webkit-box-shadow:none;box-shadow:none}html:not([data-scroll="0"]) .navbar{-webkit-box-shadow:0 0 30px 0 rgba(0,0,0,.1);box-shadow:0 0 30px 0 rgba(0,0,0,.1)}.navbar a{text-decoration:none}.navbar-brand .separator{padding:0 .375rem}@media screen and (width >= 1025px){.navbar-end>.navbar-item{color:#e97826;text-transform:uppercase}.navbar-end>.navbar-item::after{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;content:"";position:absolute;height:2px;width:0;background-color:#303284}.navbar-end>.navbar-item:hover::after{width:calc(100% - 2rem)}.navbar-item img{display:none}}.navbar-brand{-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;height:4.05556rem}.navbar-burger{color:#e97826;background:none;border:none;outline:none;line-height:1;height:3rem;position:relative;width:2rem;top:.75rem;padding:0;-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.navbar-burger:focus{outline:none}.navbar-burger span{background:#e97826;display:block;height:1px;left:50%;margin-left:-7px;position:absolute;top:60%;width:25px}.navbar-burger span:first-child{margin-top:-10px}.navbar-burger span:nth-child(2){margin-top:-3px}.navbar-burger span:nth-child(3){margin-top:4px}.navbar-burger.is-active span:first-child{-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-transform-origin:left top;transform-origin:left top;margin-top:-.75rem}.navbar-burger.is-active span:nth-child(2){opacity:0}.navbar-burger.is-active span:nth-child(3){-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:left bottom;transform-origin:left bottom}.navbar-menu{display:none;-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.navbar-item{color:#333;display:block;line-height:1.6;position:relative}@media screen and (width <= 1024px){.navbar-menu.is-active{display:block;position:absolute;height:calc(100vh - 8rem);-webkit-box-shadow:0 16px 16px 0 hsla(0,0%,4%,.1);box-shadow:0 16px 16px 0 hsla(0,0%,4%,.1);overflow-y:auto;top:8rem;left:0;right:0;padding:1rem}.navbar-item{width:calc(50% - 1rem);height:10rem;background:#e97826;border-radius:15px;margin:.5rem;font-weight:700;-webkit-box-flex:0;-ms-flex:none;flex:none}.navbar-item img{display:block;margin-left:calc(50% - 2.5rem);margin-top:1.5rem;margin-bottom:1rem;height:5rem;width:5rem}.navbar-item.navbar-topics{text-align:center;color:#fff;text-transform:uppercase;font-size:1.25rem}@media screen and (width >= 480px) and (width <= 626px){.navbar-item.navbar-topics{font-size:1.125rem}}@media screen and (width <= 480px){.navbar-item.navbar-topics{font-size:.9rem}}@media screen and (width <= 375px){.navbar-item.navbar-topics{font-size:.85rem}}a.navbar-item.navbar-topics:hover{text-decoration:underline;text-decoration-color:#e97826}.navbar-menu{background:#fff;padding:.5rem 0}}@media screen and (width >= 1025px){.navbar,.navbar-end,.navbar-menu{-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-box;display:-ms-flexbox;display:flex}.navbar-burger{display:none}.navbar-item{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end;display:-webkit-box;display:-ms-flexbox;display:flex;font-weight:700;padding:1.5rem 1rem 1rem;text-transform:uppercase}.navbar-end{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;margin-left:1rem}}.navbar .button{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background:#fff;border:1px solid #e1e1e1;border-radius:.15rem;height:1.75rem;color:#333;padding:0 .75em;white-space:nowrap}.navbar-fill{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.break-row{display:none;-ms-flex-preferred-size:100%;flex-basis:100%;height:0}.navbar-search{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.navbar-search,.navbar-tools{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end;padding:.5rem}.navbar-tools{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end;-webkit-box-pack:end;line-height:1.6;font-weight:700;-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.navbar-tools .brand-icon{height:1.5em;width:1.5em;margin:.35rem;fill:#e97826}@media (width <= 1024px){.navbar{height:8.05556rem}.navbar-end{display:-webkit-box;display:-ms-flexbox;display:flex}.navbar-brand,.navbar-end{-ms-flex-wrap:wrap;flex-wrap:wrap}.break-row{display:block;-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.navbar-tools{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;padding:.3 .5rem;-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.navbar-tools .brand-icon{height:2rem;width:1.75rem;margin:.75rem .35rem -.5rem}.navbar-search{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.navbar-burger{display:block}}body>footer{background-color:#f5f5f5;color:#5d5d5d;font-size:.83333rem;line-height:1.6;padding:1.5rem;-ms-flex-negative:0;flex-shrink:0;min-height:23rem}body>footer,footer .footer{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}footer .footer{-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:75.88889rem}footer .footer p{-ms-flex-preferred-size:100%;flex-basis:100%;margin:3rem 0 .5rem;padding:0 1rem}footer .footer p.remark::after{content:"";display:block;position:relative;height:1px;width:25rem;margin:2rem auto 1rem;background:gray}footer .footer a{color:#5d5d5d}footer .footer .context{display:inline-block;margin:0 0 1rem}footer .footer .context a{font-size:15px;text-transform:uppercase}footer .footer .context a::after{content:" ";display:inline-block;border-radius:50%;width:8px;height:8px;margin:0 1rem;background:gray}footer .footer .context:last-child a::after{display:none}footer .footer figure.logo{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;place-content:center center;-webkit-margin-start:0;margin-inline-start:0;-webkit-box-align:center;-ms-flex-align:center;align-items:center}footer .footer figure.logo img{width:6rem}footer .footer dl{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin:3rem 0 0 1rem}footer .footer dl:first-child{margin-top:0}footer .footer dl dt{font-size:1.25rem;font-weight:700;margin-bottom:1.5rem}footer .footer dl dt label:first-of-type::after{content:"";display:block;position:relative;bottom:0;left:0;height:2px;width:3rem;background:#5d5d5d}footer .footer dl dd{margin:0}.footer-tools{position:relative;top:-2rem;height:0;text-align:right}.footer-tools a{display:inline-block;padding:.4rem;background-color:#f5f5f5;color:#000;border-radius:.4rem .4rem 0 0;height:2rem}footer .resources{-ms-flex-preferred-size:100%;flex-basis:100%;text-align:center}footer .footer .footer-icons{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;line-height:1.6;padding:.5rem;font-weight:700}footer .footer .footer-icons .brand-icon{height:2em;width:1.75em;margin:.35rem;fill:#e97826}footer .footer dl dt label:nth-child(2),footer .footer input[type=checkbox]{display:none}@media screen and (width <= 1024px){footer{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}footer .footer dl{-ms-flex-preferred-size:100%;flex-basis:100%;margin-top:0}footer .footer dl dt{margin-bottom:1rem;display:-webkit-box;display:-ms-flexbox;display:flex}footer .footer dl dt label{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}footer .footer dl dt label:first-child{-webkit-box-flex:1;-ms-flex:1;flex:1}footer .footer dl dt label:nth-child(2){display:block;height:1.75rem;width:1.75rem;line-height:1.75rem;font-size:1.75rem;-webkit-transition:.2s;transition:.2s}footer .footer input[type=checkbox]:checked+dl dt label:nth-child(2){-webkit-transform:rotate(45deg);transform:rotate(45deg)}footer .footer dl dd:first-of-type{margin-top:1rem}footer .footer figure.logo{margin:.5rem auto;text-align:center;-ms-flex-preferred-size:100%;flex-basis:100%}footer .footer figure.logo img{width:4.5rem}footer .footer p.remark::after{width:auto}footer .footer .footer-icons .brand-icon{height:1.5rem}footer input[type=checkbox]:checked+dl dd{display:block}footer input[type=checkbox]+dl dd{display:none}} - -/*! Adapted from the GitHub style by Vasily Polovnyov */.hljs-comment,.hljs-quote{color:#998;font-style:italic}.hljs-keyword,.hljs-selector-tag,.hljs-subst{color:#333;font-weight:500}.hljs-literal,.hljs-number,.hljs-tag .hljs-attr,.hljs-template-variable,.hljs-variable{color:teal}.hljs-doctag,.hljs-string{color:#d14}.hljs-section,.hljs-selector-id,.hljs-title{color:#900;font-weight:500}.hljs-subst{font-weight:400}.hljs-class .hljs-title,.hljs-type{color:#458;font-weight:500}.hljs-attribute,.hljs-name,.hljs-tag{color:navy;font-weight:400}.hljs-link,.hljs-regexp{color:#009926}.hljs-bullet,.hljs-symbol{color:#990073}.hljs-built_in,.hljs-builtin-name{color:#0086b3}.hljs-meta{color:gray;font-weight:500}.hljs-deletion{background:#fdd}.hljs-addition{background:#dfd}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:500}section.frontpage h1,section.frontpage h2{font-weight:700;color:#303284;line-height:1.3;margin:1rem 0 0;text-transform:uppercase;word-wrap:break-word}section.frontpage{color:#333;font-size:inherit;line-height:1.6;margin:0 auto;max-width:75.88889rem}section.frontpage a{color:#585ac2;text-decoration:none;background-image:-webkit-gradient(linear,left top,right top,color-stop(50%,#583ac2),color-stop(50%,transparent));background-image:linear-gradient(90deg,#583ac2 50%,transparent 0);background-position:0 1.1em;background-repeat:repeat-x;background-size:7px 1px}section.frontpage a:hover{color:#104d92}section.frontpage h1{width:100%;text-align:center;margin-bottom:1rem;font-size:2.5rem}section.frontpage h2{text-align:center}header.frontpage{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;margin:2rem 3rem 2.5rem}header.frontpage img{width:45vw;max-height:50vh}header.frontpage .main-heading{width:50vw;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin-left:2rem}header.frontpage h1{font-size:5vw;color:#303284;margin-bottom:.5rem}header.frontpage p{font-size:1.2rem;margin-bottom:2rem;line-height:1.7rem}a.button,section.frontpage a.button{white-space:nowrap;margin:.5rem;background-image:none;border-radius:3rem;font-weight:700;padding:.4rem 1rem;display:inline-block}header.frontpage a.button{padding:.7rem 1rem}a.button.dark,a.button.dark:hover,section.frontpage a.button.dark,section.frontpage a.button.dark:hover{background-color:#e97826;color:#fff}a.button.light,a.button.light:hover{border:1px solid #5d5d5d;color:#5d5d5d}div.frontpage.news{padding:.2rem 0;width:20%;text-align:center;margin-left:3rem;background-color:#f5f5f5;border-radius:1rem 1rem 0 0}div.frontpage.news h2{margin-bottom:.5rem}section.frontpage.columns.blog-posts{margin:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;padding:1rem 1rem 1rem 3rem;max-width:none;border-top:none;background-color:#f5f5f5}section.frontpage.blog-posts ul{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0;padding:0}li.blog-post .content{padding:1rem .5rem 1rem 1rem}li.blog-post .content h2{text-align:left;margin:0}li.blog-post .content p{margin:.2rem 0}li.blog-post .content a{font-weight:700;white-space:nowrap;background:none}li.blog-post{display:-webkit-box;display:-ms-flexbox;display:flex;width:30vw;margin:0;padding-right:1rem}li.blog-post:last-child{padding-right:0}li.blog-post time.date{margin-top:1rem;text-align:center;color:#303284;text-transform:uppercase}li.blog-post time.date .day{font-size:3.2rem;font-weight:700;padding:0;line-height:1;display:block}li.blog-post time.date .month{font-size:1.5rem;font-weight:700;line-height:1.2;display:block}section.frontpage.columns.functionalities p,section.frontpage.projects .project .content p{margin-bottom:1.5rem}section.frontpage.apache,section.frontpage.functionalities,section.frontpage.projects{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;border-top:1px solid #f5f5f5;padding:2rem 1rem 1rem}section.frontpage.columns.functionalities{border:none}section.frontpage.columns.functionalities h2,section.frontpage.projects .project .content h2,section.frontpage.projects .project .content p{text-align:left;text-transform:none}section.frontpage.columns.functionalities .box{width:70%;display:-webkit-box;display:-ms-flexbox;display:flex;margin:2vw auto}section.frontpage.columns.functionalities .box .content{width:55vw;margin:0 1vw}section.frontpage.columns.functionalities .box .icon{width:30vw;text-align:center}section.frontpage.columns.functionalities img{height:12rem;margin:0 1vw}section.frontpage.projects{width:80%;max-width:none;margin:0 auto}section.frontpage.projects .project{display:-webkit-box;display:-ms-flexbox;display:flex;width:50%;padding:1rem}section.frontpage.projects .project .icon{min-width:8rem;margin-right:1rem;text-align:center}section.frontpage.projects .project img{height:6rem;margin-top:2rem}.split{-webkit-box-flex:50%;-ms-flex:50%;flex:50%;padding:1rem 0 2rem}.split img{max-width:100%}@media screen and (width <= 1024px){header.frontpage h1{font-size:3rem;text-align:center}section.frontpage h1{font-size:2.5rem}.split{margin:0 1rem;-webkit-box-flex:100%;-ms-flex:100%;flex:100%}.split img{display:block;margin:auto}header.frontpage .main-heading,section.frontpage.apache,section.frontpage.blog-posts .blog-post,section.frontpage.columns.functionalities,section.frontpage.columns.projects{width:90%;margin:0 auto}section.frontpage.columns.blog-posts ul{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}section.frontpage.blog-posts .blog-post .date,section.frontpage.projects .project .icon{min-width:25%}section.frontpage.columns.functionalities .box,section.frontpage.projects .project{width:100%}section.frontpage.functionalities .icon img,section.frontpage.projects .icon img{max-width:25vw;margin:auto}section.frontpage.functionalities .content{width:70vw}header.frontpage p{font-size:inherit;text-align:center}header.frontpage{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse;margin:0}header.frontpage img{width:60%;max-height:45vh;margin:0 auto}div.frontpage.news{width:100%;margin:1.5rem 0 0;text-transform:uppercase;border-radius:0}a.button,section.frontpage a.button{line-height:1.5rem}}@media screen and (width <= 626px){header.frontpage .main-heading,section.frontpage.apache,section.frontpage.columns.blog-posts,section.frontpage.columns.functionalities,section.frontpage.projects{width:100%;margin:0;padding:1rem}header.frontpage a.button-light{line-height:5rem}section.frontpage.columns.functionalities .box.left,section.frontpage.projects .project{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin:0;padding:0}section.frontpage.columns.functionalities .box.right{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse;margin:0;padding:0}section.frontpage.columns.functionalities .box .content,section.frontpage.columns.functionalities .box .content h2,section.frontpage.columns.functionalities .box .icon,section.frontpage.columns.functionalities p,section.frontpage.projects .project .content h2,section.frontpage.projects .project .content p,section.frontpage.projects .project .icon{text-align:center;margin:0;width:100%}section.frontpage.columns.functionalities .box .content p,section.frontpage.projects .project .content p{margin:1rem 0 1.5rem}section.frontpage.columns.functionalities .box .icon img{max-width:50%;height:auto;margin-top:2rem}section.frontpage h1{font-size:2rem}header.frontpage h1{font-size:2.5rem}}@page{margin:.5in}@media print{.hide-for-print{display:none!important}html{font-size:.9375em}a{color:inherit!important;text-decoration:underline}a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none}img,object,svg,tr{page-break-inside:avoid}thead{display:table-header-group}pre{-ms-hyphens:none;hyphens:none;white-space:pre-wrap}body{padding-top:2rem}.navbar{background:none;color:inherit;position:absolute}.navbar *{color:inherit!important}#topbar-nav,.nav-container,.toolbar{display:none}.doc{color:inherit;margin:auto;max-width:none;padding-bottom:2rem}.doc .listingblock code[data-lang]::before{display:block}footer.footer{background:none;border-top:1px solid #e1e1e1;color:#8e8e8e;padding:.5rem}.footer *{color:inherit}}nav.pagination{gap:1rem;line-height:1;margin:2rem 0 0}nav.pagination,nav.pagination span{display:-webkit-box;display:-ms-flexbox;display:flex}nav.pagination span{-webkit-box-flex:0;-ms-flex:0 1 calc(50% - 0.5rem);flex:0 1 calc(50% - 0.5rem);-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;gap:.4rem;border:1px solid #e1e1e1;border-radius:.4rem;padding:.75rem 1.25rem}nav.pagination span:hover{border-color:#e97826}nav.pagination .prev{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}nav.pagination .next{margin-left:auto;-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end;text-align:right}nav.pagination span::before{color:#191919;font-size:.75em}nav.pagination .prev::before{content:"Prev"}nav.pagination .next::before{content:"Next"}nav.pagination a{font-weight:700;line-height:1.3;position:relative}nav.pagination a::after,nav.pagination a::before{color:#191919;font-weight:400;font-size:1.5em;line-height:.75;position:absolute;top:0;width:1rem}nav.pagination .prev a::before{content:"\2039";-webkit-transform:translateX(-100%);transform:translateX(-100%)}nav.pagination .next a::after{content:"\203a"}.blog{margin:0 auto}.blog.list{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.blog.list aside{margin-top:2.5rem;padding-right:2rem;line-height:2rem;-ms-flex-item-align:start;align-self:flex-start;position:sticky;top:2rem}@media screen and (width <= 1024px){.blog.list aside{margin-top:0}}.blog.list aside ul{list-style:none;padding:0;margin-top:1rem;max-height:calc(100vh - 300px);overflow-y:auto;display:inline-block}.blog-rss{margin-top:1rem}.blog-rss a{text-decoration:none}.blog-rss .brand-icon{height:1em;width:1em;vertical-align:middle;fill:currentcolor}article.blog:first-child{margin-top:3rem}article.blog,article.blog p{padding-bottom:1rem}.blog a.continue{font-weight:700;text-decoration:none;background:none}.blog header{margin-bottom:.4rem;-o-border-image:linear-gradient(90deg,#303284,#303284 50px,#fff 0) 1 /0 0 1px 0;border-image:linear-gradient(90deg,#303284,#303284 50px,#fff 0) 1 /0 0 1px 0}.blog header h1{font-size:2rem;font-weight:700;padding-bottom:.2rem}.blog header time{color:#555;font-style:italc}.blog .post{margin-top:1rem;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-bottom:2rem}.blog .post aside .summary{font-size:1.2rem;font-style:italic}.blog .post aside time{color:#555}.blog .post aside p{padding-top:1.5rem;color:#555}.blog .post aside p span[rel=author]{display:inline-block}.blog .post aside{width:100%}.blog a.arrow{font-size:1rem;text-decoration:none;background:none}.blog a.arrow.prev::after{content:"\00A0previous"}.blog a.arrow.next::before{content:"next\00A0"}.blog .post .post-content{margin-left:0;width:auto}.blog .post-content img{width:auto;max-width:800px;height:auto;max-height:600px;margin-left:auto;margin-right:auto;display:block}.blog .post-content img:not(.featured){cursor:-webkit-zoom-in;cursor:zoom-in}@media screen and (width <= 1024px){.blog .post-content img{max-width:100%;max-height:none}}.image-zoom-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.7);z-index:1000;opacity:0;visibility:hidden;-webkit-transition:opacity .3s ease-in-out,visibility .3s ease-in-out;transition:opacity .3s ease-in-out,visibility .3s ease-in-out;overflow:auto;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.image-zoom-overlay.active{opacity:1;visibility:visible}.image-zoom-overlay img{cursor:-webkit-zoom-out;cursor:zoom-out}@media screen and (width >= 1025px){.image-zoom-overlay img{max-width:800px;max-height:600px;-webkit-transform:scale(1.5);transform:scale(1.5)}}@media screen and (width <= 1024px){.image-zoom-overlay{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;padding:1rem}.image-zoom-overlay img{max-width:none;max-height:none;width:auto;height:auto}}.blog .post-content figcaption{font-size:.8rem;text-align:center}.blog .post-content pre{max-width:800px}.blog .post .post-content table{width:100%;text-align:center;margin-bottom:1rem}.blog .post .post-content tr:nth-child(2n){background:#f5f5f5}.blog .post .post-content td{padding:.5rem}.blog .post .post-content th{padding:.7rem;background:#e1e1e1}.blog .post aside figure img{margin-right:1rem;vertical-align:middle;width:4rem;height:4rem;border-radius:50%}.blog .post aside figure{margin:1rem 0}.blog .post aside figure figcaption{display:inline}@media screen and (width >= 1025px){.blog{max-width:75.88889rem}.blog .post{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;padding-bottom:2rem}.blog .post aside{width:30rem;min-width:16rem}.blog a.arrow{font-size:3rem}.blog a.arrow.next::before,.blog a.arrow.prev::after{content:""}.blog .post .post-content{margin-left:2rem;width:60%}.blog.list{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}main.blog.list{margin-left:0}}.blog ol,.blog ul{padding-bottom:1rem}.blog li ol,.blog li ul{padding-bottom:0}.blog .pagination{margin:0 auto;list-style:none;padding:1rem}@media screen and (width >= 1025px){.blog .pagination{max-width:75.88889rem}}.blog .page-item{display:inline;padding:0;margin:0}.blog .page-item a{color:#8e8e8e;font-weight:700;padding:.5rem}.blog .page-item.disabled a{color:#8e8e8e}.blog .page-item.active{border-radius:3px;background:#4f51ae}.blog .page-item.active a{color:#fff}@media screen and (width <= 1024px){.blog.list aside{margin-top:4.5rem}}.blog .related{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;border-top:1px solid #e97826;margin-top:3rem}.blog .related>h3{min-width:100%}.blog .related article{padding-right:0;width:50%;margin:0}.blog .related article:nth-child(2n){padding-left:0}.blog .related article header h1{font-size:1rem}@media screen and (width <= 1024px){.blog .related article{width:100%;padding-left:0}}a.category:first-child::before{content:"\2022\00A0\00A0"}a.category:first-child{border-radius:1rem .2rem .2rem 1rem;margin-left:0}a.category{border-radius:.2rem;margin-left:1px;color:#fff;padding:.2rem .5rem;font-weight:700;font-size:.65rem;text-decoration:none}li>a.category{display:block;margin:.2rem;line-height:2}a.category,li>a.category{background-color:#e97826;background-image:none;background-position:0;background-repeat:no-repeat;background-size:0}a.category:hover{color:#fff}a.category span{margin-left:.5rem}.release dl{display:grid;grid-template-columns:-webkit-max-content auto;grid-template-columns:max-content auto}.release dt{grid-column-start:1}.release dd{grid-column-start:2;margin-left:1rem;word-break:break-word}.release .tableblock thead tr th{text-align:left}.release .tableblock tbody tr:nth-child(2n){background:#f5f5f5}.release aside{float:right;margin-left:1rem;width:25rem}@media screen and (width <= 626px){.release aside{width:100%;margin:0 auto}}.misc p{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.misc p img{margin-right:1rem;width:7rem}.column-camel-core-13{float:left;width:33.33%}.row-camel-core-main::after{content:"";display:table;clear:both}.community,.docs{padding:1rem 3rem 2rem;display:-webkit-box;display:-ms-flexbox;display:flex;width:80%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}@media screen and (width <= 1024px){.community,.docs{padding:0 1rem 4rem;width:100%}}.sitemap h1{text-align:center}.sitemap ul.sitemap-list{list-style-type:none;-webkit-columns:2;-moz-columns:2;column-count:2;padding:0;-webkit-column-gap:25%;-moz-column-gap:25%;column-gap:25%;white-space:nowrap}@media screen and (width <= 626px){.sitemap ul.sitemap-list{-webkit-columns:1;-moz-columns:1;column-count:1}}.video{position:relative;overflow:hidden;padding-bottom:52.9986%}.video iframe{position:absolute;top:0;left:0;width:100%;height:100%;border:0}.download thead tr th{text-align:left}.download tr td:first-child{white-space:nowrap}.download tr td:first-child strong{font-size:.9rem}.download tr td em.kind{color:#fff;background:#7375bf;border-radius:3px;font-style:normal;font-size:.75rem;font-weight:700;padding:.1rem .3rem}.download .tableblock tbody tr:nth-child(2n){background:#f5f5f5}.catalog.paragraph{margin:0}.catalog{width:32%;height:9rem;display:inline-block;vertical-align:top;padding:1rem .8rem 0 0}@media screen and (width <= 1024px){.catalog{width:49%}}@media screen and (width <= 626px){.catalog{width:100%}}.catalog p{border:1px solid #e1e1e1;height:100%}.catalog .item{display:block;padding:1rem}.catalog .item a{background-image:none;display:block;text-align:center}.catalog .item .image{display:block}.catalog .item .image img{height:3rem;width:auto;max-width:60%}.resp-sharing-button__icon,.resp-sharing-button__link{display:inline-block}.resp-sharing-button__link{text-decoration:none;color:#fff;margin:.5em}.resp-sharing-button{border-radius:5px;-webkit-transition:25ms ease-out;transition:25ms ease-out;padding:.5em .75em;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}.resp-sharing-button__icon svg{width:1em;height:1em;margin-right:.4em;vertical-align:top}.resp-sharing-button--small svg{margin:0;vertical-align:middle}.resp-sharing-button__icon{stroke:#fff;fill:none}.resp-sharing-button__icon--solid,.resp-sharing-button__icon--solidcircle{fill:#fff;stroke:none}.resp-sharing-button--twitter{background-color:#55acee;border-color:#55acee}.resp-sharing-button--twitter:hover{background-color:#2795e9}.resp-sharing-button--facebook{background-color:#3b5998;border-color:#3b5998}.resp-sharing-button--facebook:hover{background-color:#2d4373}.resp-sharing-button--linkedin{background-color:#0077b5;border-color:#0077b5}.resp-sharing-button--linkedin:hover{background-color:#046293}.resp-sharing-button--facebook:active,.resp-sharing-button--facebook:hover{background-color:#2d4373;border-color:#2d4373}.resp-sharing-button--twitter:active,.resp-sharing-button--twitter:hover{background-color:#2795e9;border-color:#2795e9}.resp-sharing-button--linkedin:active,.resp-sharing-button--linkedin:hover{background-color:#046293;border-color:#046293}.security td:only-child{text-align:center}.security td:first-child{white-space:nowrap} - -/*! Asciidoctor Tabs | Copyright (c) 2018-present Dan Allen | MIT License */.tabs{margin-bottom:1.25em}.tablist>ul{-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0}.tablist>ul,.tablist>ul li{display:-webkit-box;display:-ms-flexbox;display:flex}.tablist>ul li{-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:#fff;cursor:pointer;font-weight:700;line-height:1.5;padding:.25em 1em;position:relative}.tablist>ul li:focus-visible{outline:none}.tablist.ulist,.tablist.ulist>ul li{margin:0}.tablist.ulist>ul li+li{margin-left:.25em}.tabs.is-loading .tablist li:not(:first-child),.tabs:not(.is-loading) .tablist li:not(.is-selected){background-color:#f5f5f5}.tabs.is-loading .tablist li:first-child::after,.tabs:not(.is-loading) .tablist li.is-selected::after{background-color:inherit;content:"";display:block;height:3px;position:absolute;bottom:-1.5px;left:0;right:0}.tablist>ul p{line-height:inherit;margin:0}.tabpanel{background-color:#fff;padding:1.25em}.tablist>ul li,.tabpanel{border:1px solid #dcdcdc}.tablist>ul li{border-bottom:0}.tabs.is-loading .tabpanel+.tabpanel,.tabs:not(.is-loading) .tabpanel.is-hidden{display:none}.tabpanel>:first-child{margin-top:0}#content .tabpanel>:last-child,#content .tabpanel>:last-child>:last-child,#content .tabpanel>:last-child>:last-child>li:last-child>:last-child{margin-bottom:0}.tablecontainer{overflow-x:auto}#content .tablecontainer{margin-bottom:1.25em}#content .tablecontainer>table.tableblock{margin-bottom:0}.tabs{margin-top:1.25em}.tablist>ul li{font-weight:400}.DocSearch{--docsearch-font-family:"Open Sans", sans-serif;--docsearch-primary-color:#e97826;--docsearch-primary-dark-color:#cf7428;--docsearch-highlight-color:#cf7428;--docsearch-focus-color:#e97826;--docsearch-icon-color:#e97826;--docsearch-soft-primary-color:rgba(233,120,38,.1);--docsearch-hit-highlight-color:rgba(233,120,38,.12);--docsearch-chip-background:wheat;--docsearch-text-color:#333;--docsearch-hit-color:#333;--docsearch-secondary-text-color:#5d5d5d;--docsearch-muted-color:#8e8e8e;--docsearch-subtle-color:#e1e1e1;--docsearch-background-color:#f5f5f5;--docsearch-modal-background:#fff;--docsearch-hit-background:#fff;--docsearch-key-background:#fefefe;--docsearch-key-color:#5d5d5d;--docsearch-container-background:rgba(25,25,25,.55);--docsearch-border-radius:0.15rem;--docsearch-modal-radius:0.4rem;--docsearch-searchbox-height:3.75rem;--docsearch-searchbox-initial-height:3.75rem;--docsearch-hit-focus-background:rgb(233 120 38 / 9%);--docsearch-search-button-background:#fff;--docsearch-search-button-text-color:#333;--docsearch-chip-text-color:#cf7428;--docsearch-dropdown-menu-background:#fff;--docsearch-dropdown-menu-item-hover-background:#fefefe;--docsearch-menu-trigger-active-background:rgba(233,120,38,.1);--docsearch-menu-trigger-active-text-color:#cf7428}.navbar-search .DocSearch-Button{border-color:#e1e1e1;border-radius:var(--docsearch-border-radius)}.navbar-search .DocSearch-Button:hover{border-color:#e97826;-webkit-box-shadow:none;box-shadow:none}.DocSearch-Screen-Icon svg{stroke:currentcolor}.DocSearch-Hit-source{color:#303284;font-weight:700} \ No newline at end of file diff --git a/antora-ui-camel/public/_/css/site-fa37b1d407.css b/antora-ui-camel/public/_/css/site-fa37b1d407.css new file mode 100644 index 00000000000..cc1a0bb8b9d --- /dev/null +++ b/antora-ui-camel/public/_/css/site-fa37b1d407.css @@ -0,0 +1,23 @@ +@layer fonts, base, chrome, content, primitives, pages, print;@layer fonts{@font-face{font-family:Open Sans;font-style:normal;font-display:swap;font-weight:300;src:local("Open Sans Light"),local("OpenSans-Light"),url(../font/open-sans-latin-ext-300.woff2) format("woff2"),url(../font/open-sans-latin-ext-300.woff) format("woff")}@font-face{font-family:Open Sans;font-style:italic;font-display:swap;font-weight:300;src:local("Open Sans Light Italic"),local("OpenSans-LightItalic"),url(../font/open-sans-latin-ext-300-italic.woff2) format("woff2"),url(../font/open-sans-latin-ext-300-italic.woff) format("woff")}@font-face{font-family:Open Sans;font-style:normal;font-display:swap;font-weight:400;src:local("Open Sans Regular"),local("OpenSans-Regular"),url(../font/open-sans-latin-ext-400.woff2) format("woff2"),url(../font/open-sans-latin-ext-400.woff) format("woff")}@font-face{font-family:Open Sans;font-style:italic;font-display:swap;font-weight:400;src:local("Open Sans Italic"),local("OpenSans-Italic"),url(../font/open-sans-latin-ext-400-italic.woff2) format("woff2"),url(../font/open-sans-latin-ext-400-italic.woff) format("woff")}@font-face{font-family:Open Sans;font-style:normal;font-display:swap;font-weight:700;src:local("Open Sans Bold"),local("OpenSans-Bold"),url(../font/open-sans-latin-ext-700.woff2) format("woff2"),url(../font/open-sans-latin-ext-700.woff) format("woff")}@font-face{font-family:Open Sans;font-style:italic;font-display:swap;font-weight:700;src:local("Open Sans Bold Italic"),local("OpenSans-BoldItalic"),url(../font/open-sans-latin-ext-700-italic.woff2) format("woff2"),url(../font/open-sans-latin-ext-700-italic.woff) format("woff")}@font-face{font-family:Open Sans;font-style:normal;font-display:swap;font-weight:800;src:local("Open Sans ExtraBold"),local("OpenSans-ExtraBold"),url(../font/open-sans-latin-ext-800.woff2) format("woff2"),url(../font/open-sans-latin-ext-800.woff) format("woff")}@font-face{font-family:Open Sans;font-style:italic;font-display:swap;font-weight:800;src:local("Open Sans ExtraBold Italic"),local("OpenSans-ExtraBoldItalic"),url(../font/open-sans-latin-ext-800-italic.woff2) format("woff2"),url(../font/open-sans-latin-ext-800-italic.woff) format("woff")}}@layer fonts{@font-face{font-family:Archivo;font-style:normal;font-display:swap;font-weight:500;src:local("Archivo Medium"),local("Archivo-Medium"),url(../font/archivo-latin-500-normal.woff2) format("woff2")}@font-face{font-family:Archivo;font-style:normal;font-display:swap;font-weight:600;src:local("Archivo SemiBold"),local("Archivo-SemiBold"),url(../font/archivo-latin-600-normal.woff2) format("woff2")}@font-face{font-family:Archivo;font-style:normal;font-display:swap;font-weight:700;src:local("Archivo Bold"),local("Archivo-Bold"),url(../font/archivo-latin-700-normal.woff2) format("woff2")}@font-face{font-family:Archivo;font-style:normal;font-display:swap;font-weight:800;src:local("Archivo ExtraBold"),local("Archivo-ExtraBold"),url(../font/archivo-latin-800-normal.woff2) format("woff2")}}@layer fonts{@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:400;src:local("JetBrains Mono Regular"),local("JetBrainsMono-Regular"),url(../font/jetbrains-mono-latin-400-normal.woff2) format("woff2")}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:500;src:local("JetBrains Mono Medium"),local("JetBrainsMono-Medium"),url(../font/jetbrains-mono-latin-500-normal.woff2) format("woff2")}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:600;src:local("JetBrains Mono SemiBold"),local("JetBrainsMono-SemiBold"),url(../font/jetbrains-mono-latin-600-normal.woff2) format("woff2")}}@layer fonts{.fa{display:inline-block}.fa-lock::before{content:"🔒"}}@layer base{:root{--color-white:#fff;--color-smoke-50:#f5f5f5;--color-smoke-70:#f0f0f0;--color-smoke-90:#e1e1e1;--color-gray-10:#c1c1c1;--color-gray-30:#8e8e8e;--color-gray-50:gray;--color-gray-60:#555;--color-gray-70:#5d5d5d;--color-jet-20:#4a4a4a;--color-jet-50:#333;--color-camel-orange:#e97826;--color-camel-orange-light:#f39421;--color-highlight:#cf7428;--color-paper:#faf7f1;--color-paper-2:#f4eee3;--color-line:#e7e0d5;--color-line-soft:#f0e9dd;--color-line-hover:#d9ccb8;--color-ink:#211c17;--color-ink-2:#3a332b;--color-ink-soft:#5c554c;--color-ink-muted:#6f675c;--color-orange-deep:#a84e0d;--color-orange-deeper:#853c09;--color-orange-tint:#fbead8;--color-orange-glow:#f2a05a;--color-teal-deep:#1f6858;--color-teal-light:#5cbfa6;--color-teal-tint:#d8efe9;--color-dark-2:#2b2620;--color-dark-3:#1c1813;--color-prompt:#e0805a;--color-dark-line:#34302a;--color-on-dark:#faf7f1;--color-on-dark-soft:#c4bbac;--color-on-dark-muted:#8f867a;--color-button-on-dark-border:#4a443c;--rem-base:18;--body-font-size:1.0625em;--body-font-size--desktop:1.125em;--body-font-size--print:0.9375em;--body-line-height:1.15;--body-font-color:var(--color-ink-2);--body-font-family:"Open Sans", system-ui, sans-serif;--display-font-family:"Archivo", sans-serif;--body-font-weight-bold:bold;--monospace-font-family:"JetBrains Mono", ui-monospace, monospace;--monospace-font-weight-bold:500;--body-background:var(--color-paper);--panel-background:var(--color-paper-2);--panel-border-color:var(--color-line);--scrollbar-track-color:var(--color-gray-10);--scrollbar-thumb-color:var(--color-gray-30);--scrollbar-thumb-active-color:var(--color-gray-50);--scrollbar-thickness:0.425em;--scrollbar-radius:3.125em;--navbar-background:rgba(28,24,19,.96);--navbar-font-color:var(--color-on-dark-soft);--nav-background:var(--panel-background);--nav-border-color:var(--color-line);--nav-line-height:1.35;--nav-heading-font-color:var(--color-ink);--nav-muted-color:var(--color-jet-50);--nav-panel-divider-color:var(--color-smoke-50);--nav-secondary-background:var(--color-smoke-70);--toolbar-background:rgba(250,247,241,.92);--toolbar-border-color:var(--panel-border-color);--page-version-menu-background:var(--color-white);--page-version-missing-font-color:var(--color-gray-30);--toc-font-color:var(--nav-muted-color);--toc-line-height:1.2;--caution-color:#a0439c;--important-color:#d32f2f;--note-color:#217ee7;--tip-color:#4d4fb7;--warning-color:#e18114;--caution-tint:#f7e9f6;--caution-chip-font-color:#8e3b8a;--important-tint:#fce9e9;--important-chip-font-color:#b02525;--warning-tint:#fdf0dc;--warning-chip-font-color:#8a5209;--doc-font-color:var(--color-ink-2);--doc-font-size:inherit;--doc-font-size--desktop:calc(16/var(--rem-base)*1rem);--doc-line-height:1.7;--doc-margin:0 auto;--doc-margin--desktop:0 2rem;--heading-font-color:var(--color-ink);--heading-font-weight:700;--heading-font-weight-display:800;--alt-heading-font-weight:var(--body-font-weight-bold);--link-font-color:var(--color-orange-deep);--link_hover-font-color:var(--color-orange-deeper);--link_unresolved-font-color:var(--important-color);--abstract-background:var(--color-paper-2);--abstract-font-color:var(--color-jet-20);--abstract-border-color:var(--panel-border-color);--caption-font-color:var(--color-gray-70);--caption-font-weight:var(--body-font-weight-bold);--code-background:var(--color-paper-2);--code-font-color:var(--color-ink);--example-background:var(--color-paper);--example-border-color:var(--color-line);--kbd-background:var(--panel-background);--kbd-border-color:var(--color-gray-10);--pre-background:var(--color-ink);--pre-font-color:var(--syntax-text);--pre-annotation-font-color:var(--color-on-dark-muted);--quote-background:var(--panel-background);--quote-border-color:var(--color-gray-70);--quote-font-color:var(--color-gray-70);--quote-attribution-font-color:var(--color-ink-soft);--sidebar-background:var(--color-paper-2);--syntax-text:#f0e9df;--syntax-comment:#8f867a;--syntax-keyword:var(--color-camel-orange);--syntax-string:var(--color-orange-glow);--syntax-number:#e8c87a;--syntax-title:var(--color-on-dark);--syntax-type:#d9b6f0;--syntax-tag:var(--color-on-dark-soft);--syntax-attr:#e8c87a;--syntax-regexp:#9fd3b0;--syntax-symbol:var(--color-orange-glow);--syntax-built-in:#8ec5e6;--syntax-meta:#8f867a;--syntax-prompt:#e0805a;--code-tab-idle-font-color:#a89f92;--syntax-deletion-background:rgba(224,82,58,.25);--syntax-addition-background:rgba(159,211,176,.25);--syntax-font-weight-strong:600;--static-margin:0 auto;--frontpage-max-width:var(--static-max-width--desktop);--footer-line-height:1.6;--footer-background:var(--color-ink);--footer-font-color:var(--color-on-dark-soft);--footer-after-background:var(--color-dark-line);--footer-height:39rem;--navbar-height:calc(66/var(--rem-base)*1rem);--navbar-burger-height:calc(54/var(--rem-base)*1rem);--navbar-mobile-height:var(--navbar-height);--toolbar-height:calc(46/var(--rem-base)*1rem);--drawer-height:var(--toolbar-height);--body-top:calc(var(--navbar-height) + 1rem);--body-min-height:calc(100vh - var(--navbar-height));--nav-height:calc(var(--body-min-height) - var(--toolbar-height));--nav-height--desktop:var(--body-min-height);--nav-width:calc(280/var(--rem-base)*1rem);--toc-top:calc(var(--body-top) + var(--toolbar-height));--toc-height:calc(100vh - var(--toc-top) - 2.5rem);--toc-width:calc(220/var(--rem-base)*1rem);--toc-width--widescreen:calc(220/var(--rem-base)*1rem);--doc-max-width--desktop:none;--static-max-width--desktop:clamp(calc(1200/var(--rem-base)*1rem), 85vw, calc(1800/var(--rem-base)*1rem));--page-padding-x:calc(32/var(--rem-base)*1rem);--z-index-nav:1;--z-index-toolbar:2;--z-index-page-version-menu:3;--z-index-navbar:4}body,html{height:100%}*,::after,::before{-webkit-box-sizing:inherit;box-sizing:inherit}}@layer base{::-moz-selection{background:#cf7428;color:#fff}::selection{background:#cf7428;color:#fff}html{-webkit-box-sizing:border-box;box-sizing:border-box;font-size:1.0625em;-webkit-text-size-adjust:100%}@media screen and (width >= 1025px){html{font-size:1.125em}}body{background:#faf7f1;color:#3a332b;font-family:Open Sans,system-ui,sans-serif;line-height:1.15;margin:0}h1,h2,h3,h4,h5,h6{font-family:Archivo,sans-serif}a{text-decoration:none}a:hover{text-decoration:underline}a:active{background-color:none}code,kbd,pre{color:#211c17;font-family:JetBrains Mono,ui-monospace,monospace;overflow-wrap:break-word}b,dt,strong,th{font-weight:700}em em{font-style:normal}strong strong{font-weight:400}button{cursor:pointer;font-family:inherit;font-size:1em;line-height:1.15;margin:0}button::-moz-focus-inner{border:none;padding:0}mark{color:#a84e0d;font-weight:700;background:#fff}.text-center{text-align:center}.body{min-height:calc(100vh - 42.66667rem);word-wrap:break-word}}@layer base{@media screen and (width >= 1025px){.body{display:-webkit-box;display:-ms-flexbox;display:flex}}}@layer chrome{.nav-container{position:fixed;top:3.66667rem;left:0;width:100%;font-size:.94444rem;z-index:1;visibility:hidden}@media screen and (width >= 769px){.nav-container{width:15.55556rem}}@media screen and (width >= 1025px){.nav-container{font-size:.86111rem;-webkit-box-flex:0;-ms-flex:none;flex:none;position:static;top:0;visibility:visible}}.nav-container.is-active{visibility:visible;padding:0}.nav{background:#f4eee3;border-right:1px solid #e7e0d5;height:calc(100vh - 6.22222rem);position:relative;top:2.55556rem}@media screen and (width >= 769px){.nav{-webkit-box-shadow:none;box-shadow:none}}@media screen and (width >= 1025px){.nav{top:3.66667rem;-webkit-box-shadow:none;box-shadow:none;position:sticky;height:calc(100vh - 3.66667rem)}}.nav .panels{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:inherit}html.is-clipped--nav{overflow-y:hidden}.nav-panel-menu{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;min-height:0;padding-bottom:2.55556rem;position:relative}.nav-panel-menu:not(.is-active) .nav-menu{opacity:.75}.nav-panel-menu:not(.is-active)::after{content:"";background:rgba(0,0,0,.5);display:block;position:absolute;inset:0}.nav-item[data-depth="2"]>.nav-item-toggle{margin-left:-.675em}.nav-item .nav-list{margin-left:1rem}.nav-menu{min-height:0;width:100%;padding:.77778rem .88889rem 1.11111rem;line-height:1.35;position:relative;word-break:break-word;overflow-y:auto;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.nav-menu::-webkit-scrollbar{width:.425em}.nav-menu::-webkit-scrollbar-track{background:#c1c1c1;border-radius:3.125em}.nav-menu::-webkit-scrollbar-thumb{background:#8e8e8e;border-radius:3.125em}.nav-menu::-webkit-scrollbar-thumb:active,.nav-menu::-webkit-scrollbar-thumb:hover{background:gray}@media screen and (width <= 1024px){.nav-menu::-webkit-scrollbar{width:0;background:transparent}}.nav-menu h3.title{color:#211c17;font-family:Archivo,sans-serif;font-size:.77778rem;font-weight:700;margin:0 0 .44444rem;padding:0}.nav-menu a{color:inherit}.nav-list{margin:0;padding:0}.nav-menu>.nav-list{margin-bottom:.5rem}.nav-item{list-style:none;margin-top:0}.nav-item-toggle~.nav-list{padding-bottom:.125rem}.nav-item[data-depth="0"]>.nav-list:first-child{display:block;margin:0}.nav-item:not(.is-active)>.nav-list{display:none}.nav-item-toggle{background:transparent url(../img/caret-8823676a4b.svg) no-repeat 50%/.5rem;border:none;outline:none;line-height:inherit;position:absolute;height:1.33333rem;width:.88889rem;margin-left:-.88889rem}.nav-item.is-active>.nav-item-toggle{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.nav-menu .nav-text,.nav-menu a.nav-link{display:block;padding:.27778rem .44444rem;border-radius:.33333rem;color:#3a332b;font-size:.75rem;font-weight:400;line-height:1.4}.nav-menu .nav-text:hover,.nav-menu a.nav-link:hover{background:#e7e0d5;color:#211c17;text-decoration:none}.is-current-page>.nav-text,.is-current-page>a.nav-link{background:#fbead8;color:#a84e0d;font-weight:700}.nav-menu .is-current-page>.nav-text:hover,.nav-menu .is-current-page>a.nav-link:hover{background:#fbead8;color:#853c09}.breadcrumbs li .image>img,.nav-link .image>img{width:1em}.nav-panel-explore{background:#f4eee3;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;position:absolute;right:0;bottom:0;left:0;max-height:calc(50% + 2.55556rem)}.nav-panel-explore,.nav-panel-explore .context{display:-webkit-box;display:-ms-flexbox;display:flex}.nav-panel-explore .context{-ms-flex-negative:0;flex-shrink:0;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;height:2.55556rem;padding:0 .88889rem;border-top:1px solid #e7e0d5;-webkit-box-shadow:none;box-shadow:none;color:#5c554c;cursor:pointer;font-size:.72222rem;line-height:1}.nav-panel-explore .context .title{font-weight:600}.nav-panel-explore .context .noversion,.nav-panel-explore .context .version{display:block;padding:.16667rem 1.22222rem .16667rem .5rem;border:1px solid #e7e0d5;border-radius:.33333rem;background:#fff url(../img/chevron-63cb534773.svg) no-repeat right .44444rem top 50%/auto .38889rem;font-family:JetBrains Mono,ui-monospace,monospace;font-size:.66667rem}.nav-panel-explore .components{line-height:1.6;-webkit-box-shadow:inset 0 1px 5px #f5f5f5;box-shadow:inset 0 1px 5px #f5f5f5;background:#f0f0f0;padding:.5rem .75rem 0;margin:0;overflow-y:auto;max-height:100%;display:block}.nav-panel-explore:not(.is-active) .components{display:none}.nav-panel-explore .component{display:block}.nav-panel-explore .component+.component{margin-top:.5rem}.nav-panel-explore .component:last-child{margin-bottom:.75rem}.nav-panel-explore .component .title{font-weight:700}.nav-panel-explore .versions{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;padding-left:0;margin-top:-.25rem;line-height:1}.nav-panel-explore .component .version{display:block;margin:.375rem .375rem 0 0}.nav-panel-explore .component .title a{color:inherit;display:inherit}.nav-panel-explore .component .version a{border:1px solid #e7e0d5;border-radius:.25rem;color:inherit;opacity:.75;white-space:nowrap;padding:.125em .25em;display:inherit}.nav-panel-explore .component .is-current a{border-color:currentcolor;opacity:.9;font-weight:700}}@layer chrome{@media screen and (width <= 1024px){aside.toc.sidebar{display:none}}@media screen and (width >= 1025px){main{-webkit-box-flex:1;-ms-flex:auto;flex:auto;min-width:0}main>.content{display:-webkit-box;display:-ms-flexbox;display:flex}main.article>.content{display:grid;grid-template-columns:minmax(0,1fr);gap:3.11111rem;max-width:clamp(74.44444rem,85vw,100rem);padding:2.44444rem 2.22222rem 4.44444rem}main.article>.content:has(>aside.toc.sidebar){grid-template-columns:minmax(0,1fr) 12.22222rem}main.article>.content>.doc{margin:0;max-width:none;padding:0}aside.toc.embedded{display:none}aside.toc.sidebar{-webkit-box-flex:0;-ms-flex:0 0 12.22222rem;flex:0 0 12.22222rem;min-width:0}.toc.sidebar .toc-menu ul{scrollbar-width:thin}.toc.sidebar .toc-menu ul::-webkit-scrollbar{width:.425em}.toc.sidebar .toc-menu ul::-webkit-scrollbar-track{background:#c1c1c1;border-radius:3.125em}.toc.sidebar .toc-menu ul::-webkit-scrollbar-thumb{background:#8e8e8e;border-radius:3.125em}.toc.sidebar .toc-menu ul::-webkit-scrollbar-thumb:active,.toc.sidebar .toc-menu ul::-webkit-scrollbar-thumb:hover{background:gray}}@media screen and (width >= 1216px){aside.toc.sidebar{-ms-flex-preferred-size:12.22222rem;flex-basis:12.22222rem}}}@layer chrome{.toolbar{-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:rgba(250,247,241,.92);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-bottom:1px solid #e7e0d5;color:#5c554c;display:-webkit-box;display:-ms-flexbox;display:flex;font-size:.75rem;gap:1rem;height:2.55556rem;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;padding:0 2.22222rem;position:sticky;top:3.66667rem;z-index:2}.static.toolbar,.toolbar{-webkit-box-shadow:none;box-shadow:none}.static.toolbar{border-bottom:0;margin:0;max-width:100vw}@media screen and (width <= 1024px){.toolbar{top:3.66667rem;padding:0 .88889rem}}.toolbar a{color:inherit}.nav-toggle{background:url(../img/menu-8775cec4be.svg) no-repeat 50% 47.5%;background-size:49%;border:none;outline:none;line-height:inherit;height:2.5rem;padding:0;width:2.5rem;margin-right:-.25rem}@media screen and (width >= 1025px){.nav-toggle{display:none}}.nav-toggle.is-active{background-image:url(../img/back-e8d811f74c.svg);background-size:41.5%}.edit-this-page{display:none;padding:0}@media screen and (width >= 1025px){.edit-this-page{display:block}}.toolbar .edit-this-page a{color:#5c554c;font-weight:600}.toolbar .edit-this-page a:hover{color:#a84e0d}.breadcrumbs{display:none;-webkit-box-flex:1;-ms-flex:1 1;flex:1 1;min-width:0;padding:0;line-height:1.35}}@layer chrome{@media screen and (width >= 1025px){.breadcrumbs{display:block}}.breadcrumbs ul{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0;padding:0;list-style:none}.breadcrumbs li{display:inline;margin:0}.breadcrumbs li::after{content:"/";padding:0 .44444rem}.breadcrumbs li:last-of-type::after{content:none}.toolbar .breadcrumbs a{color:#5c554c}.toolbar .breadcrumbs a:hover{color:#a84e0d}.toolbar .breadcrumbs li:last-of-type a{color:#211c17;font-weight:600;text-decoration:none}.page-versions{display:none;margin:0;position:relative;line-height:1}}@layer chrome{@media screen and (width >= 1025px){.page-versions{display:block}}.page-versions .version-menu-toggle{background:#fff url(../img/chevron-63cb534773.svg) no-repeat right .44444rem top 50%/auto .38889rem;color:#5c554c;cursor:pointer;outline:none;padding:.16667rem 1.22222rem .16667rem .5rem;position:relative;z-index:3}.page-versions .version-menu,.page-versions .version-menu-toggle{border:1px solid #e7e0d5;border-radius:.33333rem;font-family:JetBrains Mono,ui-monospace,monospace;font-size:.66667rem}.page-versions .version-menu{background-color:#fff;padding:1.66667rem .5rem .44444rem;position:absolute;top:0;left:0;min-width:100%}.page-versions:not(.is-active) .version-menu{display:none}.page-versions .version{display:block;padding-top:.5rem}.page-versions .version.is-current{display:none}.page-versions .version.is-missing{color:#8e8e8e;font-style:italic;text-decoration:none}.toc-menu{color:#333}.toc.sidebar .toc-menu{margin-right:0;position:sticky;top:7.22222rem}.toc .toc-menu h3{color:#6f675c;font-family:JetBrains Mono,ui-monospace,monospace;font-size:.66667rem;font-weight:600;letter-spacing:.08em;line-height:1.3;margin:0;padding-bottom:.55556rem;text-transform:uppercase}.toc.sidebar .toc-menu h3{display:block;height:auto}.toc .toc-menu ul{font-size:.75rem;line-height:1.2;list-style:none;margin:0;padding:0}.toc.sidebar .toc-menu ul{max-height:calc(100vh - 9.72222rem);overflow-y:auto}.toc .toc-menu li{margin:0}.toc .toc-menu li[data-level="2"] a{padding-left:1.33333rem}.toc .toc-menu li[data-level="3"] a{padding-left:2rem}}@layer chrome{@media screen and (width <= 1024px){.toc .toc-menu ul li ul li ul li a{padding-left:1.33333rem}}.toc .toc-menu a{border-left:2px solid #e7e0d5;color:#5c554c;display:block;padding:.33333rem 0 .33333rem .66667rem;text-decoration:none}.sidebar.toc .toc-menu a{display:block;outline:none}.toc .toc-menu a:not(.is-active):hover{border-left-color:#d9ccb8;color:#211c17}.toc .toc-menu a.is-active{border-left-color:#e97826;color:#211c17;font-weight:600}.sidebar.toc .toc-menu a:focus{background:#f4eee3}.toc .toc-menu .is-hidden-toc{display:none!important}html.is-clipped--navbar{overflow-y:hidden}body{padding-top:3.66667rem}.navbar{background:rgba(28,24,19,.96);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border-bottom:1px solid #34302a;color:#c4bbac;font-size:.80556rem;height:3.66667rem;position:fixed;top:0;width:100%;z-index:4}.navbar-inner{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:1.55556rem;height:100%;width:100%;max-width:clamp(66.66667rem,85vw,100rem);margin-inline:auto;padding-inline:1.77778rem}.navbar a{text-decoration:none}.navbar-menu{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:1.22222rem}.navbar-item{font-weight:600;font-size:.80556rem;color:#c4bbac;white-space:nowrap}.navbar-item:hover{color:#faf7f1}.navbar-brand{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:.61111rem;-webkit-box-flex:0;-ms-flex:none;flex:none;height:auto}.navbar-logo{width:2rem;height:2rem}.navbar-wordmark{font-family:Archivo,sans-serif;font-weight:800;font-size:1.05556rem;letter-spacing:-.02em;color:#faf7f1;white-space:nowrap}.navbar-burger{color:#c4bbac;background:none;border:none;outline:none;line-height:1;height:3rem;position:relative;width:2rem;-ms-flex-negative:0;flex-shrink:0;top:-2.1px;padding:0}.navbar-burger:focus{outline:none}.navbar-burger span{background:#c4bbac;display:block;height:1px;right:0;position:absolute;top:60%;width:25px}.navbar-burger span:first-child{margin-top:-10px}.navbar-burger span:nth-child(2){margin-top:-3px}.navbar-burger span:nth-child(3){margin-top:4px}.navbar-burger.is-active span:first-child{-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-transform-origin:left top;transform-origin:left top;margin-top:-.75rem}.navbar-burger.is-active span:nth-child(2){opacity:0}.navbar-burger.is-active span:nth-child(3){-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:left bottom;transform-origin:left bottom}}@layer chrome{@media screen and (width <= 1024px){.navbar-menu{display:none}.navbar-menu.is-active{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;gap:0;position:absolute;top:3.66667rem;left:0;right:0;max-height:calc(100vh - 3.66667rem);overflow-y:auto;background:#1c1813;border-bottom:1px solid #34302a;padding:.44444rem 1.77778rem}.navbar-menu.is-active .navbar-item{padding:.66667rem 0;border-bottom:1px solid #34302a}.navbar-burger{display:block}}@media screen and (width >= 1025px){.navbar-burger{display:none}}.navbar-actions{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:.77778rem;margin-left:auto}.navbar-github .brand-icon{height:1.11111rem;width:1.11111rem;fill:#c4bbac;display:block}.navbar-github:hover .brand-icon{fill:#faf7f1}.header .navbar-search{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:0}.header .navbar-search .DocSearch-Button:focus-visible{outline:2px solid #f2a05a!important;outline-offset:2px!important}.header .navbar-search .DocSearch-Search-Icon{width:.77778rem;height:.77778rem}@media (width <= 1024px){.header .navbar-search{min-width:0}}@media (width <= 500px){.navbar-github{display:none}}@media (width <= 540px){.navbar-wordmark{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}}@media (width <= 374px){.navbar-inner{gap:.77778rem}.navbar-actions{gap:.44444rem}}}@layer chrome{body>footer{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;position:relative;background-color:#211c17;color:#c4bbac;font-size:.83333rem;line-height:1.6;padding:0;-ms-flex-negative:0;flex-shrink:0}footer .footer{display:grid;grid-template-columns:1.4fr repeat(4,1fr);gap:2.22222rem;width:100%;max-width:clamp(66.66667rem,85vw,100rem);margin-inline:auto;padding-block:3.11111rem 2.22222rem;padding-inline:1.77778rem}.footer-brand{display:grid;grid-template-columns:auto 1fr;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-column-gap:.61111rem;-moz-column-gap:.61111rem;column-gap:.61111rem}.footer-logo{width:1.88889rem;height:1.88889rem}.footer-wordmark{font-family:Archivo,sans-serif;font-weight:800;font-size:1rem;color:#faf7f1}.footer-blurb{grid-column:1/-1;font-size:.75rem;line-height:1.6;color:#8f867a;margin:.88889rem 0 0;max-width:15.55556rem}footer .footer p.remark{grid-column:1/-1;border-top:1px solid #34302a;margin:0;padding:1.22222rem 0 0;font-size:.69444rem;color:#8f867a}footer .footer a{color:#c4bbac}footer .footer .context{display:inline-block;margin:0 0 1rem}footer .footer .context a{font-size:.83333rem;text-transform:uppercase}footer .footer .context a::after{content:" ";display:inline-block;border-radius:50%;width:8px;height:8px;margin:0 1rem;background:#34302a}footer .footer .context:last-child a::after{display:none}footer .footer .footer-column{margin:0}footer .footer .footer-column dt{font-family:Archivo,sans-serif;font-weight:700;font-size:.72222rem;letter-spacing:.06em;text-transform:uppercase;color:#faf7f1;margin-bottom:.77778rem}footer .footer .footer-column-title::after{content:"";display:block;position:relative;bottom:0;left:0;height:2px;width:3rem;background:#c4bbac}footer .footer .footer-column dd{margin:0 0 .55556rem}footer .footer .footer-column dd a{font-size:.77778rem;color:#c4bbac}footer .footer .footer-column dd a:hover{color:#faf7f1}.footer-tools{position:absolute;top:-2rem;left:0;right:0;height:0;text-align:right;color:#6f675c;font-size:.72222rem}.footer-tools a{display:inline-block;padding:.4rem;border-radius:.4rem .4rem 0 0;height:2rem;color:#5c554c}.footer-tools a:hover{color:#211c17}footer .resources{grid-column:1/-1;text-align:center}footer .footer .footer-icons{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;grid-column:1/-1;line-height:1.6;padding:.5rem;font-weight:700}footer .footer .footer-icons .brand-icon{height:2em;width:1.75em;margin:.35rem;fill:#c4bbac}footer .footer .footer-icons a:hover .brand-icon{fill:#faf7f1}footer .footer .footer-column-plus{display:none}@media screen and (width <= 1024px){footer{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}footer .footer{grid-template-columns:1fr}footer .footer .footer-column dt{margin-bottom:1rem}footer .footer .footer-column-toggle{-webkit-box-align:center;-ms-flex-align:center;align-items:center;background:none;border:0;color:inherit;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;font:inherit;letter-spacing:inherit;margin:0;padding:0;text-align:left;text-transform:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}footer .footer .footer-column-toggle:focus-visible{outline:2px solid #e97826;outline-offset:3px}footer .footer .footer-column-title{-webkit-box-flex:1;-ms-flex:1;flex:1}footer .footer .footer-column-plus{display:block;height:1.75rem;width:1.75rem;line-height:1.75rem;font-size:1.75rem;-webkit-transition:.2s;transition:.2s}footer .footer .footer-column-toggle[aria-expanded=true] .footer-column-plus{-webkit-transform:rotate(45deg);transform:rotate(45deg)}footer .footer dl dd:first-of-type{margin-top:1rem}footer .footer .footer-icons .brand-icon{height:1.5rem}footer .footer .footer-column:has(.footer-column-toggle[aria-expanded=false]) dd{display:none}}}@layer content{ +/*! highlight.js theme for the 2026 redesign, per SCOPE.md section 2a. + Replaces the GitHub light theme; --pre-background is now --color-ink. + Colors live in vars.css as --syntax-*, shared with chroma.css. */.hljs-comment,.hljs-quote{color:#8f867a;font-style:italic}.hljs-keyword,.hljs-selector-tag,.hljs-subst{color:#e97826;font-weight:600}.hljs-attr,.hljs-literal,.hljs-number,.hljs-tag .hljs-attr,.hljs-template-variable,.hljs-variable{color:#e8c87a}.hljs-doctag,.hljs-string{color:#f2a05a}.hljs-section,.hljs-selector-id,.hljs-title{color:#faf7f1;font-weight:600}.hljs-subst{font-weight:400}.hljs-class .hljs-title,.hljs-type{color:#d9b6f0;font-weight:600}.hljs-attribute,.hljs-name,.hljs-tag{color:#c4bbac;font-weight:400}.hljs-link,.hljs-regexp{color:#9fd3b0}.hljs-bullet,.hljs-symbol{color:#f2a05a}.hljs-built_in,.hljs-builtin-name{color:#8ec5e6}.hljs-meta{color:#8f867a;font-weight:600}.doc code.language-console .hljs-meta,.doc code.language-shell .hljs-meta,.doc code.language-shellsession .hljs-meta{color:#e0805a}.hljs-deletion{background:rgba(224,82,58,.25)}.hljs-addition{background:rgba(159,211,176,.25)}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:600}.chroma .c,.chroma .c1,.chroma .ch,.chroma .cm,.chroma .cs{color:#8f867a;font-style:italic}.chroma .cp,.chroma .cpf,.chroma .nd{color:#8f867a;font-weight:600}.chroma .k,.chroma .kd,.chroma .kn,.chroma .kp,.chroma .kr{color:#e97826;font-weight:600}.chroma .kt,.chroma .nc,.chroma .ne{color:#d9b6f0;font-weight:600}.chroma .fm,.chroma .gh,.chroma .gu,.chroma .nf{color:#faf7f1;font-weight:600}.chroma .dl,.chroma .s,.chroma .s1,.chroma .s2,.chroma .sa,.chroma .sb,.chroma .sc,.chroma .sd,.chroma .sh,.chroma .si,.chroma .sx{color:#f2a05a}.chroma .il,.chroma .kc,.chroma .l,.chroma .m,.chroma .mb,.chroma .mf,.chroma .mh,.chroma .mi,.chroma .mo,.chroma .no,.chroma .nv,.chroma .vc,.chroma .vg,.chroma .vi,.chroma .vm{color:#e8c87a}.chroma .nn,.chroma .nt{color:#c4bbac}.chroma .na,.chroma .nl,.chroma .py{color:#e8c87a}.chroma .bp,.chroma .nb{color:#8ec5e6}.chroma code.language-json .nt,.chroma code.language-yaml .nt{color:#e8c87a}.chroma code.language-yaml .l{color:#f2a05a}.chroma .sr{color:#9fd3b0}.chroma .ni,.chroma .se,.chroma .ss{color:#f2a05a}.chroma .gp{color:#e0805a}.chroma .gd{background:rgba(224,82,58,.25)}.chroma .gi{background:rgba(159,211,176,.25)}.chroma .ge{font-style:italic}.chroma .gs{font-weight:600}.doc{color:#3a332b;font-size:inherit;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto;hyphenate-limit-chars:10 4 4;line-height:1.7;margin:0 auto;padding:0 1rem 4rem}}@layer content{ + +/*! Chroma theme for the 2026 redesign, per SCOPE.md section 2a. + Hugo highlights markdown code fences with chroma (noClasses = false in + config.toml), emitting
. Antora
+    uses highlight.js instead, themed in highlight.css. Both bind the same
+    --syntax-* tokens from vars.css so the two systems stay in step.
+
+    pre.chroma already picks up --pre-background and --pre-font-color from
+    doc.css, because blog content carries class="blog doc". Only token colors
+    are set here.
+
+    Chroma classes are mapped to the highlight.js class with the same meaning.
+    Classes left deliberately unstyled, inheriting the base code color, mirror
+    constructs highlight.js also leaves unstyled: .n and .nx (plain
+    identifiers), .o and .ow (operators), .p (punctuation), .w (whitespace),
+    .line and .cl (line wrappers), and .err (a lexer hiccup is not worth a
+    color). .go, generic command output, is content the reader needs rather
+    than chrome, so it stays at the base color too. */}@layer content{@media screen and (width >= 1025px){.doc{font-size:.88889rem;margin:0 2rem;max-width:none;min-width:0}}.doc h1,.doc h2,.doc h3,.doc h4,.doc h5,.doc h6{color:#211c17;font-weight:700;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none;line-height:1.3;margin:1rem 0 0}.doc>h1.page,.static>h1:first-child{font-size:2.33333rem;font-weight:800;letter-spacing:-.03em;line-height:1.05;margin:.55556rem 0 0}.doc>h1.page img{width:2rem}.doc .doc-eyebrow{color:#a84e0d;font-family:JetBrains Mono,ui-monospace,monospace;font-size:.66667rem;font-weight:600;letter-spacing:.08em;text-transform:uppercase}.doc>#preamble>.sectionbody>.paragraph:first-child>p,.doc>h1.page+.paragraph>p{font-size:.91667rem;line-height:1.7;margin:1.11111rem 0 0}#preamble+.sect1,.doc .sect1+.sect1{margin-top:2rem}.doc h1.sect0{background:#f4eee3;font-size:1.8em;margin:1.5rem -1rem 0;padding:.5rem 1rem}.doc h2:not(.discrete){font-size:1.44444rem;letter-spacing:-.02em;margin:2.44444rem 0 0;overflow-wrap:break-word;padding:.44444rem 0 0}.doc h3:not(.discrete){font-weight:700;overflow-wrap:break-word}.doc h1 .anchor,.doc h2 .anchor,.doc h3 .anchor,.doc h4 .anchor,.doc h5 .anchor,.doc h6 .anchor,.doc td .anchor{position:absolute;text-decoration:none;width:1.75ex;margin-left:-1.5ex;visibility:hidden;font-size:.8em;font-weight:400;padding-top:.05em}.doc h1 .anchor::before,.doc h2 .anchor::before,.doc h3 .anchor::before,.doc h4 .anchor::before,.doc h5 .anchor::before,.doc h6 .anchor::before,.doc td .anchor::before{content:"\00a7"}.doc h1:hover .anchor,.doc h2:hover .anchor,.doc h3:hover .anchor,.doc h4:hover .anchor,.doc h5:hover .anchor,.doc h6:hover .anchor,.doc td:hover .anchor{visibility:visible}.doc p{margin:0}.doc .table-wrapper{background:#fff;border:1px solid #e7e0d5;border-radius:.55556rem;margin:.88889rem 0 0;overflow-x:auto}.doc .table-wrapper::-webkit-scrollbar{height:.425em}.doc .table-wrapper::-webkit-scrollbar-track{background:#c1c1c1;border-radius:3.125em}.doc .table-wrapper::-webkit-scrollbar-thumb{background:#8e8e8e;border-radius:3.125em}.doc .table-wrapper::-webkit-scrollbar-thumb:active,.doc .table-wrapper::-webkit-scrollbar-thumb:hover{background:gray}.doc .table-wrapper table{width:100%}.doc .tableblock p{font-size:inherit}.doc .tableblock td:not(:first-child)>p,.doc .tableblock thead,.doc :not(td)>.content,.doc :not(td)>p{-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto}.doc a{color:#a84e0d;word-break:break-word;text-decoration:underline;text-decoration-color:rgba(168,78,13,.4);text-decoration-thickness:1px;text-underline-offset:.2em}.doc .camel-project .links a,.doc .sect2 h3 a,.doc .section .links a,.doc li a,.doc table a{text-decoration:none}.doc table.tableblock td a{word-break:normal}.doc table.tableblock .identifier,.doc table.tableblock tbody tr td:first-child{-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}.doc table.tableblock tbody tr td:first-child{min-width:12.22222rem;overflow-wrap:break-word;font-weight:700}.doc table.tableblock tbody tr td:first-child p code{background:none;border-radius:0;color:inherit;font:inherit;padding:0}.doc a:hover{color:#853c09;text-decoration-color:currentcolor}.doc a.unresolved{color:#d32f2f}.doc i.fa{font-style:normal}.doc p code,.doc thead code{background:#f4eee3;border-radius:.22222rem;color:#211c17;font-size:.80556rem;overflow-wrap:break-word;padding:.11111rem .33333rem}.doc pre{font-size:.75rem;line-height:1.7;margin:0}.doc blockquote{margin:0}.doc .right{float:right}.doc .left{float:left}.doc .underline{text-decoration:underline}.doc .line-through{text-decoration:line-through}.doc .dlist,.doc .exampleblock,.doc .imageblock,.doc .listingblock,.doc .literalblock,.doc .olist,.doc .paragraph,.doc .partintro,.doc .quoteblock,.doc .sidebarblock,.doc .ulist,.doc .verseblock{margin:1rem 0 0;word-break:break-word}.doc table.tableblock{border-collapse:collapse;font-size:.83333rem;margin:0}.doc table.stretch{width:100%}.doc table.tableblock thead th{background:#f4eee3;border-bottom:1px solid #e7e0d5;color:#5c554c;font-family:JetBrains Mono,ui-monospace,monospace;font-size:.63889rem;font-weight:600;letter-spacing:.06em;padding:.61111rem .88889rem;text-align:left;text-transform:uppercase}.doc table.tableblock td,.doc table.tableblock>:not(thead) th{border-top:1px solid #f0e9dd;border-bottom:0;padding:.66667rem .88889rem}.doc table.tableblock tbody tr:first-child>td,.doc table.tableblock tbody tr:first-child>th{border-top:0}.doc .halign-left{text-align:left}.doc .halign-right{text-align:right}.doc .halign-center{text-align:center}.doc .valign-top{vertical-align:top}.doc .valign-bottom{vertical-align:bottom}.doc .valign-middle{vertical-align:middle}.doc .admonitionblock{background:#fff;border:1px solid #e7e0d5;border-left:.16667rem solid #e97826;border-radius:0 .66667rem .66667rem 0;-webkit-box-shadow:none;box-shadow:none;margin:1.55556rem 0 0;padding:.88889rem 1.11111rem}.doc .admonitionblock .table-wrapper,.doc .colist .table-wrapper{background:none;border:0;border-radius:0;margin:0;overflow:visible}.doc .admonitionblock p,.doc .admonitionblock td.content{font-size:.80556rem;line-height:1.6}.doc .admonitionblock td.content>:first-child{margin:0}.doc .admonitionblock pre{font-size:.83333rem}.doc .admonitionblock table{border-collapse:collapse;position:relative;table-layout:auto;width:100%}.doc .admonitionblock td.content{background:none;color:#5c554c;padding:0;width:auto}.doc .admonitionblock td.icon{padding:0 .77778rem 0 0;vertical-align:top;white-space:nowrap;width:1px}.doc .admonitionblock .icon i{background:#fbead8;border-radius:1.11111rem;color:#a84e0d;display:inline-block;font-family:JetBrains Mono,ui-monospace,monospace;font-size:.61111rem;font-style:normal;font-weight:600;height:auto;letter-spacing:.04em;line-height:1.4;padding:.16667rem .44444rem;text-transform:uppercase;vertical-align:top}.doc .admonitionblock .icon i::after{content:attr(title);-webkit-hyphens:none;-ms-hyphens:none;hyphens:none;-webkit-writing-mode:horizontal-tb;-ms-writing-mode:lr-tb;writing-mode:horizontal-tb}.doc .admonitionblock.caution{border-left-color:#a0439c}.doc .admonitionblock.caution .icon i{background:#f7e9f6;color:#8e3b8a}.doc .admonitionblock.important{border-left-color:#d32f2f}.doc .admonitionblock.important .icon i{background:#fce9e9;color:#b02525}.doc .admonitionblock.warning{border-left-color:#e18114}.doc .admonitionblock.warning .icon i{background:#fdf0dc;color:#8a5209}.doc .imageblock{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.doc .imageblock img{display:block}.doc .image>img,.doc .imageblock img{height:auto;max-width:100%}.doc table.tableblock td .imageblock img{max-width:50px}#preamble .abstract blockquote{background:#f4eee3;border-left:5px solid #e7e0d5;color:#4a4a4a;font-size:.88889rem;padding:.75em 1em}.doc .quoteblock{background:#f4eee3;border-left:5px solid #5d5d5d;color:#5d5d5d;padding:.25rem 2rem 1.25rem}.doc .quoteblock .attribution{color:#5c554c;font-size:.83333rem;margin-top:.75rem}.doc .quoteblock blockquote{margin-top:1rem}.doc .quoteblock .paragraph{font-style:italic}.doc .quoteblock cite{padding-left:1em}.doc table.tableblock .paragraph{margin:0;padding:0}.doc .olist .admonitionblock,.doc .ulist .admonitionblock,.doc table.tableblock .admonitionblock{padding:.88889rem 1.11111rem}.doc ol,.doc ul{margin:0;padding:0 0 0 1.22222rem}.doc .olist>ol,.doc .ulist>ul{line-height:1.8}.doc ol.arabic{list-style-type:decimal}.doc ol.decimal{list-style-type:decimal-leading-zero}.doc ol.loweralpha{list-style-type:lower-alpha}.doc ol.upperalpha{list-style-type:upper-alpha}.doc ol.lowerroman{list-style-type:lower-roman}.doc ol.upperroman{list-style-type:upper-roman}.doc ol.lowergreek{list-style-type:lower-greek}.doc ul.checklist{padding-left:.5rem;list-style:none}.doc ul.checklist p>i.fa-check-square-o:first-child,.doc ul.checklist p>i.fa-square-o:first-child{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:1.25rem}.doc ul.checklist i.fa-check-square-o::before{content:"\2713"}.doc ul.checklist i.fa-square-o::before{content:"\274f"}.doc .dlist .dlist,.doc .dlist .olist,.doc .dlist .ulist,.doc .olist .dlist,.doc .olist .olist,.doc .olist .ulist,.doc .ulist .dlist,.doc .ulist .olist,.doc .ulist .ulist{margin-top:.5rem}.doc .olist li,.doc .ulist li{margin-bottom:.5rem}.doc .admonitionblock .listingblock,.doc .olist .listingblock,.doc .ulist .listingblock{padding:0}.doc .admonitionblock .title,.doc .exampleblock .title,.doc .imageblock .title,.doc .listingblock .title,.doc .literalblock .title,.doc .openblock .title,.doc .tableblock caption{color:#5d5d5d;font-size:.88889rem;font-weight:700;font-style:italic;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none;letter-spacing:.01em;padding-bottom:.075rem;text-align:left}.doc .imageblock .title{margin-top:.5rem;padding-bottom:0}.doc .admonitionblock .title+.paragraph{margin-top:0}.doc .exampleblock>.content{background:#faf7f1;border:.25rem solid #e7e0d5;border-radius:.5rem;padding:.75rem}.doc .exampleblock>.content>:first-child{margin-top:0}.doc .sidebarblock{background:#f4eee3;border-radius:.75rem;padding:.75rem 1.5rem}.doc .sidebarblock>.content>.title{font-size:1.25rem;font-weight:700;line-height:1.3;margin-bottom:-.3em;text-align:center}.doc .sidebarblock>.content>:not(.title):first-child{margin-top:0}.doc .listingblock.wrap pre,.doc .tableblock pre{white-space:pre-wrap}.doc pre.highlight code,.doc pre:not(.highlight){background:#211c17;border-radius:.55556rem;-webkit-box-shadow:none;box-shadow:none;color:#f0e9df;display:block;overflow-x:auto;padding:1rem 1.11111rem}.doc .listingblock{margin-top:.77778rem}.doc pre code{color:inherit}.doc pre.highlight code::-webkit-scrollbar{height:.425em}.doc pre.highlight code::-webkit-scrollbar-track{background:#2b2620;border-radius:3.125em}.doc pre.highlight code::-webkit-scrollbar-thumb{background:#34302a;border-radius:3.125em}.doc pre.highlight code::-webkit-scrollbar-thumb:active,.doc pre.highlight code::-webkit-scrollbar-thumb:hover{background:#8f867a}.doc pre.highlight{position:relative}.doc .listingblock code[data-lang]::before{content:attr(data-lang);display:none;color:#8f867a;font-size:.75rem;letter-spacing:.05em;line-height:1;text-transform:uppercase;position:absolute;top:.25rem;right:.25rem}.doc .listingblock:hover code[data-lang]::before{display:none}.doc .source-toolbox{display:-webkit-box;display:-ms-flexbox;display:flex;visibility:hidden;position:absolute;top:.25rem;right:.5rem;color:#8f867a;font-family:JetBrains Mono,ui-monospace,monospace;font-size:.83333rem;font-weight:500;line-height:1.2;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap;z-index:1}.doc .listingblock:hover .source-toolbox{visibility:visible}.doc .source-toolbox .source-lang{text-transform:uppercase}.doc .source-toolbox>:not(:last-child)::after{content:"|";letter-spacing:0;padding:0 1ch}.doc .source-toolbox .copy-button{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background:none;border:none;color:inherit;outline:none;padding:0;font-size:inherit;line-height:inherit;width:1.25em;height:1.25em;cursor:pointer;position:relative}.doc .source-toolbox .copy-button::before{content:"";display:block;width:1.25em;height:1.25em;background-image:url(../img/copy-d7c1e3194d.svg);background-size:contain;background-repeat:no-repeat;background-position:50%;-ms-flex-negative:0;flex-shrink:0}.doc .source-toolbox .copy-button.clicked::before{background-image:url(../img/copy-checkmark-9a4caf1664.svg)}.doc .source-toolbox .copy-toast{-webkit-box-flex:0;-ms-flex:none;flex:none;position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-top:1em;background-color:#3a332b;border-radius:.25em;padding:.5em;color:#fff;cursor:auto;opacity:0;-webkit-transition:opacity .5s ease .5s;transition:opacity .5s ease .5s}.doc .source-toolbox .copy-toast::after{content:"";position:absolute;top:0;width:1em;height:1em;border:.55em solid transparent;border-left-color:#3a332b;-webkit-transform:rotate(-90deg) translateX(50%) translateY(50%);transform:rotate(-90deg) translateX(50%) translateY(50%);-webkit-transform-origin:left;transform-origin:left}.doc .source-toolbox .copy-button.clicked .copy-toast{opacity:1;-webkit-transition:none;transition:none}.doc .language-console .hljs-meta{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.doc .dlist dt{font-style:italic}.doc .dlist dd{margin:0 0 .3rem 1.5rem}.doc .colist{font-size:.88889rem;margin:.25rem 0 -.25rem}.doc .colist>table>tbody>tr>:first-child,.doc .colist>table>tr>:first-child{padding:.25em .5rem 0;vertical-align:top}.doc .colist>table>tbody>tr>:last-child,.doc .colist>table>tr>:last-child{padding:.25rem 0}.doc .conum[data-value]{border:1px solid;border-radius:100%;display:inline-block;font-family:Open Sans,system-ui,sans-serif;font-size:.75rem;font-style:normal;height:1.25em;line-height:1.2;text-align:center;width:1.25em;letter-spacing:-.25ex;text-indent:-.25ex}.doc .conum[data-value]::after{content:attr(data-value)}.doc .conum[data-value]+b{display:none}.doc b.button{white-space:nowrap}.doc b.button::before{content:"[";padding-right:.25em}.doc b.button::after{content:"]";padding-left:.25em}.doc kbd{display:inline-block;font-size:.66667rem;background:#f4eee3;border:1px solid #c1c1c1;border-radius:.25em;-webkit-box-shadow:0 1px 0 #c1c1c1,inset 0 0 0 .1em #faf7f1;box-shadow:0 1px 0 #c1c1c1,inset 0 0 0 .1em #faf7f1;padding:.25em .5em;vertical-align:text-bottom;white-space:nowrap}.doc .keyseq,.doc kbd{line-height:1}.doc .keyseq{font-size:.88889rem}.doc .keyseq kbd{margin:0 .125em}.doc .keyseq kbd:first-child{margin-left:0}.doc .keyseq kbd:last-child{margin-right:0}.doc .menuseq i.caret::before{content:"\203a";font-size:1.1em;font-weight:700;line-height:.90909}.doc .icon i::after,.doc .menuseq,.doc .path,.doc a.bare,.doc b.button,.doc code,.doc kbd{-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}@media screen and (width <= 626px){#preamble+.sect1,.doc .sect1+.sect1{overflow-wrap:break-word}}div.badges p{text-align:left}div.badges span{color:#fff;padding:.15rem .3rem;font-weight:400;font-style:normal;font-size:.8rem}div.badges span.badge-key{background-color:#555;border-radius:.2rem 0 0 .2rem}div.badges span.badge-version{background-color:#217ee7;border-radius:0 .2rem .2rem 0}div.badges span.badge-supported{background-color:#4d4fb7;border-radius:0 .2rem .2rem 0}div.badges span.badge-unsupported{background-color:#d32f2f;border-radius:0 .2rem .2rem 0}.static{margin:0 auto}.static dl,.static ol,.static p,.static pre,.static ul{margin:1rem 0 0}.static a.icon{margin:2rem;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;text-align:center;background:none}.static .box,.static a.icon{display:-webkit-box;display:-ms-flexbox;display:flex}.static .box{margin:1rem 0}.static .box img{margin-top:1rem;height:6rem;margin-right:.5rem}.static .icon a{text-decoration:none}}@layer content{@media screen and (width >= 1025px){.static{max-width:clamp(66.66667rem,85vw,100rem)}}@media screen and (width <= 1024px){.static .box,.static .content,.static .icon{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin:0;padding:0;text-align:center;width:100%}.static .box .content{width:100%}.static .box img{height:6rem;max-width:25vw;margin-left:auto}.static .box img:only-child{margin-left:auto;margin-right:auto}.static .box img+img{margin-left:1rem;margin-right:auto}.static .box.right{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.static a.icon{margin:0;width:100%}}.static.doc:not(.tooling){padding:3.11111rem 1.77778rem 2.22222rem}@media screen and (width <= 1024px){.static.doc:not(.tooling){padding:1.77778rem 1.11111rem 2.66667rem}}.static.doc:not(.tooling)>.table-wrapper,.static.doc:not(.tooling)>h2,.static.doc:not(.tooling)>h3,.static.doc:not(.tooling)>p,.static.doc:not(.tooling)>pre,.static.doc:not(.tooling)>ul{max-width:42.22222rem}@media screen and (width >= 1025px){.community-single{display:grid;grid-template-columns:15.55556rem minmax(0,1fr) 12.22222rem;gap:1.77778rem;max-width:clamp(74.44444rem,85vw,100rem);padding:2.44444rem 2.22222rem 4.44444rem}.community-single>.static.doc{padding:0}}@media screen and (width <= 1024px){.community-nav{display:none}}.community-nav{position:sticky;top:3.66667rem;height:calc(100vh - 5.66667rem);overflow-y:auto;padding:.77778rem 0}.community-nav-title{color:#211c17;font-family:Archivo,sans-serif;font-size:.77778rem;font-weight:700;margin:0 0 .44444rem;padding:0}.community-nav-list{list-style:none;margin:0;padding:0}.community-nav-link{display:block;padding:.27778rem .44444rem;border-radius:.33333rem;color:#3a332b;font-size:.75rem;font-weight:400;line-height:1.4;text-decoration:none;background:none}.community-nav-link:hover{background:#e7e0d5;color:#211c17}.community-nav-link.is-current{background:#fbead8;color:#a84e0d;font-weight:700}.tabs{margin-bottom:1.25em}.tablist>ul{-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0}.tablist>ul,.tablist>ul li{display:-webkit-box;display:-ms-flexbox;display:flex}.tablist>ul li{-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:#fff;cursor:pointer;font-weight:700;line-height:1.5;padding:.25em 1em;position:relative}}@layer content{
+/*! Asciidoctor Tabs | Copyright (c) 2018-present Dan Allen | MIT License */.tablist>ul li:focus-visible{outline:none}.tablist.ulist,.tablist.ulist>ul li{margin:0}.tablist.ulist>ul li+li{margin-left:.25em}.tabs.is-loading .tablist li:not(:first-child),.tabs:not(.is-loading) .tablist li:not(.is-selected){background-color:#f5f5f5}.tabs.is-loading .tablist li:first-child::after,.tabs:not(.is-loading) .tablist li.is-selected::after{background-color:inherit;content:"";display:block;height:3px;position:absolute;bottom:-1.5px;left:0;right:0}.tablist>ul p{line-height:inherit;margin:0}.tabpanel{background-color:#fff;padding:1.25em}.tablist>ul li,.tabpanel{border:1px solid #dcdcdc}.tablist>ul li{border-bottom:0}.tabs.is-loading .tabpanel+.tabpanel,.tabs:not(.is-loading) .tabpanel.is-hidden{display:none}.tabpanel>:first-child{margin-top:0}#content .tabpanel>:last-child,#content .tabpanel>:last-child>:last-child,#content .tabpanel>:last-child>:last-child>li:last-child>:last-child{margin-bottom:0}.tablecontainer{overflow-x:auto}#content .tablecontainer{margin-bottom:1.25em}#content .tablecontainer>table.tableblock{margin-bottom:0}.doc .tabs{margin:.77778rem 0 0}.doc .tabs>.content{background:#211c17;border:1px solid #34302a;border-radius:.55556rem;overflow:hidden}.doc .tabs .tablist>ul{border-bottom:1px solid #34302a;gap:.11111rem;padding:.55556rem .66667rem 0}.doc .tabs .tablist>ul li{background:none;border:0;color:#a89f92;font-family:JetBrains Mono,ui-monospace,monospace;font-size:.69444rem;font-weight:600;padding:.38889rem .77778rem .61111rem}.doc .tabs .tablist.ulist>ul li+li{margin-left:0}.doc .tabs.is-loading .tablist li:not(:first-child),.doc .tabs:not(.is-loading) .tablist li:not(.is-selected){background:none}.doc .tabs.is-loading .tablist li:first-child,.doc .tabs:not(.is-loading) .tablist li.is-selected{color:#f0e9df}.doc .tabs.is-loading .tablist li:first-child::after,.doc .tabs:not(.is-loading) .tablist li.is-selected::after{background:#e97826;bottom:-1px;height:2px;left:.55556rem;right:.55556rem}.doc .tabs .tabpanel{background:none;border:0;padding:0}.doc .tabs .tabpanel .listingblock{margin:0}.doc .tabs .tabpanel pre.highlight code,.doc .tabs .tabpanel pre:not(.highlight){border-radius:0}}@layer content{}@layer primitives{.advisory,.download,.security{width:100%;max-width:clamp(66.66667rem,85vw,100rem);margin:0 auto;padding:3.11111rem 1.77778rem 2.22222rem}.page-hero-title{font-family:Archivo,sans-serif;font-weight:800;font-size:2.55556rem;letter-spacing:-.03em;line-height:1.05;margin:0;color:#211c17}.page-hero-lead{font-size:.97222rem;line-height:1.55;color:#5c554c;margin:.77778rem 0 0;text-wrap:pretty}.detail-lead{font-family:Archivo,sans-serif;font-weight:500;font-size:1.16667rem;line-height:1.4;color:#3a332b;margin:.88889rem 0 0;text-wrap:pretty}.section-label{font-family:Archivo,sans-serif;font-weight:700;font-size:.83333rem;text-transform:uppercase;letter-spacing:.08em;color:#6f675c;margin:3.11111rem 0 0;padding-bottom:.77778rem;border-bottom:1px solid #e7e0d5}.advisory-eyebrow,.blog-rail-eyebrow,.community-cta-eyebrow,.docs-feature-eyebrow,.download-cli-eyebrow,.post-eyebrow,.releases-rail-heading,.security-eyebrow,.tooling .tooling-eyebrow{font-family:JetBrains Mono,ui-monospace,monospace;font-size:.66667rem;font-weight:600;letter-spacing:.08em;text-transform:uppercase}.advisory-eyebrow,.security-eyebrow{color:#a84e0d}.community-cta-eyebrow,.download-cli-eyebrow{color:#e0805a}.blog-rail-eyebrow,.releases-rail-heading{color:#6f675c;padding-bottom:.66667rem;border-bottom:1px solid #e7e0d5}.card{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;background:#fff;border:1px solid #e7e0d5;border-radius:13px;padding:1.33333rem;-webkit-transition:border-color .15s,-webkit-box-shadow .15s,-webkit-transform .15s;transition:border-color .15s,-webkit-box-shadow .15s,-webkit-transform .15s;transition:border-color .15s,box-shadow .15s,transform .15s;transition:border-color .15s,box-shadow .15s,transform .15s,-webkit-box-shadow .15s,-webkit-transform .15s}.card:hover,.home-card:hover,.project-card:hover{border-color:#d9ccb8;-webkit-box-shadow:0 14px 34px -22px rgba(33,28,23,.35);box-shadow:0 14px 34px -22px rgba(33,28,23,.35);-webkit-transform:translateY(-2px);transform:translateY(-2px)}.card--flat{-webkit-transition:none;transition:none}.card--flat:hover{border-color:#e7e0d5;-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;transform:none}.card--lg{border-radius:16px;padding:1.77778rem}.card--dark{background:#211c17;border-color:#34302a;color:#faf7f1}.card-grid{display:grid;list-style:none;margin:0;padding:0;gap:1rem}.card-grid--2{grid-template-columns:repeat(2,minmax(0,1fr))}.card-grid--3{grid-template-columns:repeat(3,minmax(0,1fr))}.card-grid--feature{grid-template-columns:1.2fr 1fr}@media screen and (width <= 1024px){.card-grid--3{grid-template-columns:repeat(2,minmax(0,1fr))}.card-grid--feature{grid-template-columns:1fr}}@media screen and (width <= 626px){.card-grid--2,.card-grid--3,.card-grid--feature{grid-template-columns:minmax(0,1fr)}.page-hero-title{font-size:2rem}}.lts-chip{font-size:.58333rem;color:#fff;background:#a84e0d;padding:.11111rem .38889rem}.lts-chip,.severity-chip{display:inline-block;font-family:JetBrains Mono,ui-monospace,monospace;font-weight:600;border-radius:20px}.severity-chip--low{background:#f4eee3;color:#5c554c}.severity-chip--medium{background:#fbead8;color:#a84e0d}.severity-chip--high{background:#fdf0dc;color:#8a5209}.severity-chip--critical{background:#fce9e9;color:#b02525}.blog-rail,.releases-rail{position:sticky;top:5rem}}@layer pages{a.button{-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-radius:.44444rem;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;font-size:.83333rem;font-weight:700;gap:.44444rem;line-height:1;margin:.5rem;padding:.72222rem 1.33333rem;text-decoration:none;white-space:nowrap}a.button.navbar-cta{border-radius:.38889rem;font-size:.80556rem;margin:0;padding:.5rem 1rem}a.button.dark{background-color:#e97826;color:#211c17}a.button.dark:hover{background-color:#f39421;color:#211c17}a.button.light,a.button.light:hover{background-color:#fff;border:1px solid #e7e0d5;color:#211c17}a.button.on-dark,a.button.on-dark:hover{background-color:transparent;border:1px solid #4a443c;color:#faf7f1}a.button.ink{background-color:#211c17;color:#fff}a.button.ink:hover{background-color:#3a332b}.home{color:#3a332b;padding-bottom:2.66667rem}.home a{text-decoration:none}.home-section{margin:0 auto;max-width:clamp(66.66667rem,85vw,100rem);padding:3.66667rem 1.77778rem 1.11111rem}.home-band{background:#f4eee3;border-bottom:1px solid #e7e0d5;border-top:1px solid #e7e0d5}.home-section-head{margin-bottom:2.44444rem;text-align:center}.home-eyebrow{color:#a84e0d;font-family:JetBrains Mono,ui-monospace,monospace;font-size:.69444rem;font-weight:600;letter-spacing:.08em;margin:0;text-transform:uppercase}.home-section-head h2{font-family:Archivo,sans-serif;font-size:2.11111rem;font-weight:800;letter-spacing:-.025em;line-height:1.15;margin:.66667rem 0 0}.home-section-sub{color:#5c554c;font-size:.88889rem;margin:.33333rem 0 0}.home-grid{display:grid;list-style:none;margin:0;padding:0}.home-card{background:#fff;border:1px solid #e7e0d5;border-radius:.72222rem;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-transition:border-color .15s,-webkit-box-shadow .15s,-webkit-transform .15s;transition:border-color .15s,-webkit-box-shadow .15s,-webkit-transform .15s;transition:border-color .15s,box-shadow .15s,transform .15s;transition:border-color .15s,box-shadow .15s,transform .15s,-webkit-box-shadow .15s,-webkit-transform .15s}.home-lead{background:#1c1813;margin-top:-3.66667rem;overflow:hidden;padding:3.66667rem 0 6.66667rem;position:relative}.home-hero-art{-webkit-filter:drop-shadow(0 40px 80px rgba(233,120,38,.25));filter:drop-shadow(0 40px 80px rgb(233 120 38/25%));pointer-events:none;position:absolute;right:-7.77778rem;top:1.11111rem;width:min(42.22222rem,54vw)}.home-hero{margin:0 auto;max-width:clamp(66.66667rem,85vw,100rem);padding:4rem 1.77778rem 0;position:relative}.home-hero-badge{-webkit-box-align:center;-ms-flex-align:center;align-items:center;background:rgba(233,120,38,.16);border-radius:1.11111rem;color:#f2a05a;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;font-family:JetBrains Mono,ui-monospace,monospace;font-size:.69444rem;font-weight:500;gap:.44444rem;letter-spacing:.02em;margin:0;padding:.33333rem .66667rem}.home-hero h1{color:#faf7f1;font-family:Archivo,sans-serif;font-size:4.66667rem;font-weight:800;letter-spacing:-.035em;line-height:.98;margin:1.22222rem 0 0}.home-hero-tagline{color:#f2a05a;font-family:Archivo,sans-serif;font-size:1.5rem;font-weight:600;line-height:1.2;margin:.88889rem 0 0}.home-hero-lead{color:#c4bbac;font-size:.97222rem;line-height:1.55;margin:1.11111rem 0 0;max-width:30rem;text-wrap:pretty}.home-hero-actions{display:-webkit-box;display:-ms-flexbox;display:flex;gap:.77778rem;margin:1.66667rem 0 0}.home-hero-actions .button{font-size:.86111rem;margin:0;padding:.77778rem 1.44444rem}.home-visually-hidden{clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}.home-stats{border-top:1px solid #e7e0d5}.home-stats-inner{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;gap:.66667rem 2.66667rem;margin:0 auto;max-width:clamp(66.66667rem,85vw,100rem);padding:1.66667rem 1.77778rem}.home-stats-label a{color:#a84e0d}.home-stats-label a:hover{color:#853c09}.home-stats-label{color:#3a332b;font-family:Archivo,sans-serif;font-size:.83333rem;font-weight:700;margin:0 auto 0 0}.home-stats-list{display:-webkit-box;display:-ms-flexbox;display:flex;gap:2.44444rem;list-style:none;margin:0;padding:0}.home-stat-num{color:#1f6858;display:block;font-family:Archivo,sans-serif;font-size:1.44444rem;font-weight:800;letter-spacing:-.02em;line-height:1}.home-stat-label{color:#5c554c;display:block;font-size:.66667rem;font-weight:600;letter-spacing:.06em;margin-top:.27778rem;text-transform:uppercase}.home-grid--three{gap:1.22222rem;grid-template-columns:repeat(3,minmax(0,1fr))}.home-paths{margin:-5.11111rem auto 0;max-width:clamp(66.66667rem,85vw,100rem);padding:0 1.77778rem 3.11111rem;position:relative}.home-paths-tabs{display:grid;gap:.88889rem;grid-template-columns:repeat(3,minmax(0,1fr))}.home-path{background:#fff;border:1px solid #e7e0d5;border-radius:.72222rem;-webkit-box-shadow:0 14px 34px rgba(28,24,19,.16);box-shadow:0 14px 34px rgba(28,24,19,.16);color:inherit;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;font:inherit;padding:1.11111rem 1.22222rem 1.22222rem;position:relative;text-align:left;-webkit-transition:border-color .15s,-webkit-box-shadow .15s;transition:border-color .15s,-webkit-box-shadow .15s;transition:border-color .15s,box-shadow .15s;transition:border-color .15s,box-shadow .15s,-webkit-box-shadow .15s}.home-path:hover{border-color:#d9ccb8}.home-path[aria-selected=true]{border-color:#e97826;-webkit-box-shadow:0 0 0 1px #e97826,0 10px 24px rgba(233,120,38,.14);box-shadow:0 0 0 1px #e97826,0 10px 24px rgba(233,120,38,.14)}.home-path[aria-selected=true]::after{background:#2b2620;border-radius:3px;bottom:-.61111rem;content:"";height:1rem;left:50%;position:absolute;-webkit-transform:translateX(-50%) rotate(45deg);transform:translateX(-50%) rotate(45deg);width:1rem}.home-path:focus-visible{outline:2px solid #a84e0d;outline-offset:3px}.home-path-head{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;gap:.55556rem}.home-path-name{color:#211c17;font-family:Archivo,sans-serif;font-size:1.11111rem;font-weight:700}.home-badge{background:#a84e0d;border-radius:1.11111rem;color:#fff;font-family:JetBrains Mono,ui-monospace,monospace;font-size:.58333rem;font-weight:600;letter-spacing:.04em;padding:.16667rem .44444rem;text-transform:uppercase;white-space:nowrap}.home-path-desc{color:#5c554c;display:block;font-size:.80556rem;line-height:1.55;margin-top:.55556rem;text-wrap:pretty}.home-path-panel{background:#2b2620;border-radius:.72222rem;margin-top:1rem;overflow:hidden}.home-path-bar{-webkit-box-align:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #34302a;gap:.88889rem;padding:.55556rem .77778rem .55556rem 1rem}.home-path-bar,.home-path-dots{display:-webkit-box;display:-ms-flexbox;display:flex}.home-path-dots{gap:.44444rem}.home-path-dots span{background:#4a443c;border-radius:50%;height:.55556rem;width:.55556rem}.home-path-title{color:#c4bbac;font-family:JetBrains Mono,ui-monospace,monospace;font-size:.69444rem;font-weight:600}.home-path-bar .home-path-copy{margin-left:auto;position:static}.home-path-code{color:#f0e9df;font-size:.77778rem;line-height:1.6;margin:0;overflow-x:auto;overflow-wrap:normal;padding:1rem 1.22222rem .33333rem;white-space:pre}.home-path-prompt{color:#e0805a;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.home-path-link{color:#f2a05a;display:inline-block;font-size:.80556rem;font-weight:700;padding:.55556rem 1.22222rem 1rem}.home-path-link:hover{color:#f39421}.home-grid--features{gap:1.11111rem;grid-template-columns:repeat(3,minmax(0,1fr))}.home-feature{padding:1.44444rem}.home-feature-tag{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-item-align:start;align-self:flex-start;background:#fbead8;border-radius:.5rem;color:#a84e0d;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;font-family:Archivo,sans-serif;font-size:.88889rem;font-weight:800;height:2.11111rem;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;min-width:2.11111rem;padding:0 .38889rem}.home-feature h3{color:#211c17;font-family:Archivo,sans-serif;font-size:1rem;font-weight:700;margin:.88889rem 0 0}.home-feature p{color:#5c554c;font-size:.80556rem;line-height:1.55;margin:.5rem 0 0;text-wrap:pretty}.home-example{background:#211c17;border:1px solid #34302a;border-radius:.77778rem;-webkit-box-shadow:0 24px 60px -30px rgba(33,28,23,.5);box-shadow:0 24px 60px -30px rgba(33,28,23,.5);margin:0 auto;max-width:45.55556rem;overflow:hidden}.home-tablist{border-bottom:1px solid #34302a;display:-webkit-box;display:-ms-flexbox;display:flex;gap:.11111rem;padding:.66667rem .77778rem 0}.home-tab{background:none;border:0;color:#a89f92;cursor:pointer;font-family:JetBrains Mono,ui-monospace,monospace;font-size:.72222rem;font-weight:600;padding:.5rem .88889rem .72222rem;position:relative}.home-tab[aria-selected=true]{color:#f0e9df}.home-tab[aria-selected=true]::after{background:#e97826;bottom:-1px;content:"";height:2px;left:.66667rem;position:absolute;right:.66667rem}.home-tabpanel{position:relative}.home-tab-copy{background:#2b2620;border:1px solid #34302a;border-radius:.33333rem;color:#f0e9df;cursor:pointer;font-family:JetBrains Mono,ui-monospace,monospace;font-size:.66667rem;font-weight:600;padding:.22222rem .55556rem;position:absolute;right:.66667rem;top:.66667rem;z-index:1}.home-tab-copy:hover{background:#3a342c}.home-tabpanel pre code{color:#f0e9df}.home-tabpanel pre{color:#f0e9df;font-family:JetBrains Mono,ui-monospace,monospace;font-size:.75rem;line-height:1.7;margin:0;min-height:11.11111rem;overflow-x:auto;padding:2.55556rem 1.33333rem 1.22222rem}.home-example-run{-webkit-box-align:center;-ms-flex-align:center;align-items:center;background:#1c1813;border-top:1px solid #34302a;display:-webkit-box;display:-ms-flexbox;display:flex;gap:.55556rem;margin:0;padding:.77778rem 1.33333rem}.home-example-prompt{color:#e0805a}.home-example-command,.home-example-prompt{font-family:JetBrains Mono,ui-monospace,monospace;font-size:.69444rem}.home-example-command{color:#c4bbac}.home-grid--four{gap:1rem;grid-template-columns:repeat(4,minmax(0,1fr))}.home-tile{padding:1.33333rem}.home-tile-icon{display:block;height:1.88889rem;-o-object-fit:contain;object-fit:contain;width:1.88889rem}.home-tile h3{color:#211c17;font-family:Archivo,sans-serif;font-size:.94444rem;font-weight:700;margin:.88889rem 0 0}.home-tile p{color:#5c554c;-webkit-box-flex:1;-ms-flex:1;flex:1;font-size:.77778rem;line-height:1.5;margin:.44444rem 0 .88889rem;text-wrap:pretty}.home-tile-link{-ms-flex-item-align:start;align-self:flex-start;color:#a84e0d;font-size:.75rem;font-weight:700}.home-tile-link:hover{color:#853c09}.home-news{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding:1.33333rem}.home-news-date{color:#1f6858;display:block;font-size:.72222rem;letter-spacing:.02em;text-transform:uppercase}.home-news-title{font-size:.94444rem;line-height:1.35;margin:.44444rem 0 0}.home-news-title a{color:#211c17}.home-news-title a:hover{color:#a84e0d}.home-news p{color:#5c554c;-webkit-box-flex:1;-ms-flex:1;flex:1;font-size:.77778rem;line-height:1.55;margin:.55556rem 0 0}.home-tiles-cta{margin:1.88889rem 0 0;text-align:center}.home-closing{margin:4rem auto 0;max-width:clamp(66.66667rem,85vw,100rem);padding:0 1.77778rem}.home-closing-inner{-webkit-box-align:center;-ms-flex-align:center;align-items:center;background:#211c17;border-radius:1rem;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;gap:1.33333rem;padding:2.88889rem 2.66667rem}.home-closing-copy{-webkit-box-flex:1;-ms-flex:1;flex:1;min-width:15.55556rem}.home-closing-copy h2{color:#faf7f1;font-family:Archivo,sans-serif;font-size:1.66667rem;font-weight:800;letter-spacing:-.02em;margin:0}.home-closing-copy p{color:#c4bbac;font-size:.88889rem;line-height:1.55;margin:.66667rem 0 0;max-width:31.11111rem}.home-closing-actions{display:-webkit-box;display:-ms-flexbox;display:flex;gap:.77778rem;margin:0}.home-closing-actions .button{margin:0}@media screen and (width <= 1024px){.home-hero{padding-top:2.22222rem}.home-hero h1{font-size:3.11111rem}.home-hero-art{opacity:.3;right:-6.66667rem;top:4.77778rem;width:23.33333rem}.home-section-head h2{font-size:1.66667rem}.home-grid--features,.home-grid--four,.home-grid--three{grid-template-columns:repeat(2,minmax(0,1fr))}.home-closing-inner{padding:2rem 1.77778rem}}@media screen and (width <= 626px){.home-hero h1{font-size:2.22222rem}.home-hero-tagline{font-size:1.16667rem}.home-hero-actions{-ms-flex-wrap:wrap;flex-wrap:wrap}.home-paths-tabs{grid-template-columns:minmax(0,1fr)}.home-path[aria-selected=true]::after{display:none}.home-path-code{font-size:.69444rem}.home-grid--features,.home-grid--four,.home-grid--three{grid-template-columns:minmax(0,1fr)}.home-stats-list{gap:1.33333rem;-ms-flex-wrap:wrap;flex-wrap:wrap}.home-closing-copy{min-width:0}.home-closing-inner{padding:1.55556rem 1.11111rem}.home-closing-actions{-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.home-tabpanel pre{font-size:.66667rem}}}@layer pages{nav.pagination{border-top:1px solid #e7e0d5;line-height:1;margin:3.11111rem 0 0;padding:1.33333rem 0 0}nav.pagination,nav.pagination span{display:-webkit-box;display:-ms-flexbox;display:flex}nav.pagination span{-webkit-box-flex:0;-ms-flex:0 1 calc(50% - 0.5rem);flex:0 1 calc(50% - 0.5rem);-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;gap:.4rem;border:1px solid #e7e0d5;border-radius:.4rem;padding:.75rem 1.25rem}nav.pagination span:hover{border-color:#e97826}nav.pagination .prev{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}nav.pagination .next{margin-left:auto;-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end;text-align:right}nav.pagination span::before{color:#5c554c;font-family:JetBrains Mono,ui-monospace,monospace;font-size:.63889rem;padding-bottom:.22222rem}nav.pagination .prev::before{content:"\2190" " Previous"}nav.pagination .next::before{content:"Next \2192"}nav.pagination a{text-decoration:none;color:#211c17;font-weight:700;line-height:1.3;position:relative}nav.pagination a:hover{color:#a84e0d}.blog-layout{display:grid;grid-template-columns:13.33333rem 1fr;gap:3.11111rem;max-width:clamp(66.66667rem,85vw,100rem);margin:0 auto;padding:3.11111rem 1.77778rem 2.22222rem;-webkit-box-align:start;-ms-flex-align:start;align-items:start}.blog-categories{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin-top:.44444rem}.blog-categories,.blog-category{display:-webkit-box;display:-ms-flexbox;display:flex}.blog-category{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:.44444rem 0;font-size:.77778rem;font-weight:600;color:#3a332b;border-bottom:1px solid #f0e9dd;text-decoration:none}.blog-category:hover{color:#853c09}.blog-category-count{font-family:JetBrains Mono,ui-monospace,monospace;font-size:.63889rem;color:#6f675c}.blog-rss{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:.44444rem;margin-top:1.11111rem;font-size:.75rem;font-weight:700;color:#a84e0d;text-decoration:none}.blog-rss:hover{color:#853c09}.blog-rss .brand-icon{height:1em;width:1em;vertical-align:middle;fill:currentcolor}.blog-main{min-width:0}.blog-back-link{display:inline-block;font-family:JetBrains Mono,ui-monospace,monospace;font-size:.72222rem;font-weight:600;color:#6f675c;margin-bottom:.77778rem;text-decoration:none}.blog-back-link:hover{color:#853c09}.blog-posts{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin-top:2rem}.blog-post{display:grid;grid-template-columns:5.33333rem 1fr;gap:1.55556rem;padding:1.66667rem 0;border-top:1px solid #e7e0d5}.blog-post-date{text-align:center}.blog-post-day{display:block;font-family:Archivo,sans-serif;font-weight:800;font-size:2.22222rem;line-height:1;letter-spacing:-.03em;color:#a84e0d}.blog-post-month{display:block;font-family:JetBrains Mono,ui-monospace,monospace;font-size:.66667rem;font-weight:600;color:#6f675c;text-transform:uppercase;letter-spacing:.06em;margin-top:.33333rem}.blog-post-tags{display:-webkit-box;display:-ms-flexbox;display:flex;gap:.44444rem;-ms-flex-wrap:wrap;flex-wrap:wrap}.tag-chip{display:inline-block;font-family:JetBrains Mono,ui-monospace,monospace;font-size:.61111rem;font-weight:600;color:#a84e0d;background:#fbead8;padding:.16667rem .5rem;border-radius:20px;text-transform:uppercase;letter-spacing:.04em;text-decoration:none}.blog-post-title{font-family:Archivo,sans-serif;font-weight:700;font-size:1.33333rem;letter-spacing:-.02em;line-height:1.2;margin:.66667rem 0 0}.blog-post-title a{color:#211c17;text-decoration:none}.blog-post-title a:hover{color:#853c09}.blog-post-summary{font-size:.86111rem;line-height:1.6;color:#5c554c;margin:.55556rem 0 0;text-wrap:pretty}.blog-post-meta{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:.88889rem;margin-top:.77778rem;font-size:.75rem;color:#6f675c}.blog-post-continue{font-weight:700;color:#a84e0d;text-decoration:none}.blog-post-continue:hover{color:#853c09}.blog-list .pagination{display:-webkit-box;display:-ms-flexbox;display:flex;gap:.33333rem;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin:1.55556rem 0 0;padding:1.55556rem 0 0;border-top:1px solid #e7e0d5;font-family:JetBrains Mono,ui-monospace,monospace;font-size:.72222rem;font-weight:600;list-style:none}.blog-list .page-item{display:contents}.blog-list .page-link{display:inline-block;padding:.44444rem .66667rem;border-radius:6px;color:#5c554c;text-decoration:none}.blog-list .page-link:hover{background:#f0e9dd}.blog-list .page-link--next{color:#a84e0d}.blog-list .page-item.active .page-link{background:#211c17;color:#faf7f1}.blog-list .page-item.active .page-link:hover{background:#211c17}.blog-list .page-item.disabled .page-link{padding:.44444rem .33333rem;color:#6f675c;cursor:default}.blog-list .page-item.disabled .page-link:hover{background:none}}@layer pages{@media screen and (width <= 1024px){.blog-layout{grid-template-columns:minmax(0,1fr);padding:2.22222rem 1.33333rem 1.77778rem}.blog-rail{position:static}}.post{max-width:clamp(66.66667rem,85vw,100rem);margin:0 auto;padding:3.11111rem 1.77778rem 2.22222rem}.post .post-back{font-family:JetBrains Mono,ui-monospace,monospace;font-size:.72222rem;font-weight:600;color:#6f675c;text-decoration:none}.post .post-back:hover{color:#853c09}.post .post-toc a,.post .tag-chip{text-decoration:none}.post .detail-lead{margin-top:.88889rem}.post-hero{max-width:45.55556rem;margin-top:1rem}.post-tags{display:-webkit-box;display:-ms-flexbox;display:flex;gap:.44444rem;-ms-flex-wrap:wrap;flex-wrap:wrap}.post .post-title{font-family:Archivo,sans-serif;font-weight:800;font-size:2.55556rem;letter-spacing:-.03em;line-height:1.05;margin:.88889rem 0 0;color:#211c17}.post-layout{display:grid;grid-template-columns:14.44444rem minmax(0,1fr);gap:3.11111rem;margin-top:2.22222rem;-webkit-box-align:start;-ms-flex-align:start;align-items:start}.post-rail{position:sticky;top:4.66667rem;gap:1.22222rem}.post-authors,.post-rail{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.post-authors{gap:.77778rem}.post-author{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:.66667rem}.post-avatar{width:44px;height:44px;border-radius:50%;background:#e7e0d5}.post-author-name{font-weight:700;font-size:.80556rem}.post-date{font-size:.72222rem;color:#6f675c}.post-eyebrow{color:#6f675c;padding-bottom:.55556rem}.post-share-links{gap:.44444rem;-ms-flex-wrap:wrap;flex-wrap:wrap}.post-adjacent,.post-share-links{display:-webkit-box;display:-ms-flexbox;display:flex}.post-adjacent{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding-top:1rem;border-top:1px solid #e7e0d5;font-size:.72222rem}.post-adjacent a{color:#5c554c;font-weight:600;text-decoration:none}.post-adjacent a:hover{color:#853c09}.post-content{max-width:42.22222rem}.blog .post-content img.featured{aspect-ratio:16/8;-o-object-fit:cover;object-fit:cover;width:100%;height:auto;border-radius:14px;display:block;margin-bottom:1.88889rem}.blog .post-content h2{font-family:Archivo,sans-serif;font-weight:700;font-size:1.55556rem;letter-spacing:-.02em;margin:2.22222rem 0 0;padding-top:0}.blog .post-content p{font-size:.94444rem;line-height:1.75;color:#3a332b}.blog .post-content p+p{margin-top:.66667rem}.blog .post-content ol,.blog .post-content ul{padding-bottom:1rem}.blog .post-content li ol,.blog .post-content li ul{padding-bottom:0}.blog .post-content blockquote{margin:1.33333rem 0 0;padding:1rem 1.22222rem;border-left:3px solid #e97826;background:#fff;border-radius:0 12px 12px 0;font-family:Archivo,sans-serif;font-weight:500;font-size:1.05556rem;line-height:1.45;color:#3a332b}.blog .post-content blockquote p{font-size:inherit;line-height:inherit}.blog .post-content img:not(.featured){width:auto;max-width:800px;height:auto;max-height:600px;margin-left:auto;margin-right:auto;display:block;cursor:-webkit-zoom-in;cursor:zoom-in}@media screen and (width <= 1024px){.blog .post-content img:not(.featured){max-width:100%;max-height:none}}.blog .post-content figcaption{font-size:.8rem;text-align:center}.blog .post-content table{width:100%;text-align:center;margin-bottom:1rem}.blog .post-content tr:nth-child(2n){background:#f5f5f5}.blog .post-content td{padding:.5rem}.blog .post-content th{padding:.7rem;background:#e1e1e1}.image-zoom-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.7);z-index:1000;opacity:0;visibility:hidden;-webkit-transition:opacity .3s ease-in-out,visibility .3s ease-in-out;transition:opacity .3s ease-in-out,visibility .3s ease-in-out;overflow:auto;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.image-zoom-overlay.active{opacity:1;visibility:visible}.image-zoom-overlay img{cursor:-webkit-zoom-out;cursor:zoom-out}@media screen and (width >= 1025px){.image-zoom-overlay img{max-width:800px;max-height:600px;-webkit-transform:scale(1.5);transform:scale(1.5)}}@media screen and (width <= 1024px){.image-zoom-overlay{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;padding:1rem}.image-zoom-overlay img{max-width:none;max-height:none;width:auto;height:auto}}.post-related{margin-top:3.11111rem;padding-top:1.55556rem;border-top:1px solid #e7e0d5}.post .post-related-heading{font-family:Archivo,sans-serif;font-weight:700;font-size:.83333rem;text-transform:uppercase;letter-spacing:.08em;color:#6f675c;margin:0 0 1rem}.post-related-grid{gap:.77778rem}.post .post-related-card,.post .post-related-card:hover{border-radius:12px;padding:1rem 1.11111rem;color:#211c17;text-decoration:none}.post-related-date{font-family:JetBrains Mono,ui-monospace,monospace;font-size:.63889rem;color:#6f675c}.post-related-card-title{font-family:Archivo,sans-serif;font-weight:700;font-size:.91667rem;margin-top:.33333rem;line-height:1.3}@media screen and (width <= 1024px){.post{padding:2.22222rem 1.33333rem 1.77778rem}.post-layout{grid-template-columns:minmax(0,1fr)}.post-rail{position:static}}}@layer pages{.blog-category.is-current{color:#a84e0d;font-weight:700}.releases{display:grid;grid-template-columns:minmax(0,1fr) 12.22222rem;gap:3.11111rem;-webkit-box-align:start;-ms-flex-align:start;align-items:start;padding:3.11111rem 1.77778rem 2.22222rem}.releases-content{grid-column:1}.releases-intro{max-width:40rem}.releases-lead a{color:#a84e0d}.releases-lead a:hover{color:#853c09;text-decoration:none}.releases-group{margin-top:2.66667rem}.releases-content>.releases-group:first-child{margin-top:2.22222rem}.releases-group-title{font-family:Archivo,sans-serif;font-weight:800;font-size:1.44444rem;letter-spacing:-.02em;margin:0 0 .77778rem;color:#211c17}.releases-table{width:100%;font-size:.80556rem;background:#fff;border:1px solid #e7e0d5;border-radius:12px;border-collapse:collapse;overflow:hidden}.releases-table thead tr{background:#f4eee3}.releases-table th{text-align:left;font-family:JetBrains Mono,ui-monospace,monospace;font-size:.63889rem;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:#6f675c;padding:.61111rem .88889rem}.releases-col-version{width:7.77778rem}.releases-col-date{width:8.33333rem}.releases-table tbody tr{border-top:1px solid #f0e9dd}.releases-table tbody tr:first-child{border-top:0}.releases-table td{padding:.66667rem .88889rem}.releases-version{font-family:JetBrains Mono,ui-monospace,monospace;font-weight:600;font-size:.77778rem;color:#a84e0d}.releases-version:hover{color:#853c09;text-decoration:none}.releases-table .lts-chip{margin-left:.44444rem}.releases-date{font-family:JetBrains Mono,ui-monospace,monospace;font-size:.72222rem;color:#5c554c}.releases-desc{color:#5c554c;line-height:1.5}.releases-rail{grid-column:2}.releases-rail-links{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin-top:.55556rem}.releases-rail-link{display:block;padding:.33333rem 0 .33333rem .66667rem;font-size:.75rem;color:#5c554c;border-left:2px solid #e7e0d5;text-decoration:none}}@layer pages{.releases-rail-link:focus-visible,.releases-rail-link:hover{border-left-color:#d9ccb8;color:#211c17}.advisory-back{display:inline-block;font-family:JetBrains Mono,ui-monospace,monospace;font-size:.72222rem;font-weight:600;color:#5c554c;text-decoration:none}.advisory-back:hover{color:#853c09}.advisory-layout{display:grid;grid-template-columns:minmax(0,1fr) 17.77778rem;gap:3.11111rem;-webkit-box-align:start;-ms-flex-align:start;align-items:start;margin-top:1rem}.advisory-article{max-width:42.22222rem}.advisory-title{font-family:Archivo,sans-serif;font-weight:800;font-size:2.33333rem;letter-spacing:-.03em;line-height:1.05;margin:.55556rem 0 0;color:#211c17}.advisory-section{margin-top:2rem}.advisory-section-title{font-family:Archivo,sans-serif;font-weight:700;font-size:.83333rem;text-transform:uppercase;letter-spacing:.08em;color:#6f675c;margin:0 0 .55556rem}.advisory-section-body{font-size:.91667rem;line-height:1.7;color:#3a332b;margin:0;text-wrap:pretty}.advisory-section-body a{color:#a84e0d}.advisory-section-body a:hover{color:#853c09}.advisory-section-body pre{background:#211c17;border-radius:.55556rem;color:#f0e9df;display:block;font-size:.75rem;line-height:1.7;overflow-x:auto;padding:1rem 1.11111rem}.advisory-section-body pre code{color:inherit}.advisory-references{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;gap:.44444rem;font-size:.83333rem}.advisory-reference{font-family:JetBrains Mono,ui-monospace,monospace;font-size:.75rem;color:#a84e0d;text-decoration:none}.advisory-reference:hover{color:#853c09;text-decoration:none}.advisory-facts{position:sticky;top:5rem;background:#fff;border:1px solid #e7e0d5;border-radius:14px;padding:1.33333rem;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;gap:1rem}.advisory-facts-label{font-family:JetBrains Mono,ui-monospace,monospace;font-size:.63889rem;font-weight:600;color:#6f675c;letter-spacing:.06em;text-transform:uppercase}.advisory-severity-chip{margin-top:.44444rem;font-size:.66667rem;padding:.22222rem .55556rem}.advisory-facts-value{margin-top:.33333rem;font-size:.80556rem;line-height:1.6;color:#3a332b}.advisory-facts-value--mono{font-family:JetBrains Mono,ui-monospace,monospace;font-size:.77778rem;line-height:1.7;color:#211c17;font-weight:600}a.advisory-facts-cta{display:block;margin:.22222rem 0 0;padding:.61111rem 1rem;font-size:.77778rem;text-align:center}.release dl{display:grid;grid-template-columns:-webkit-max-content auto;grid-template-columns:max-content auto}.release dt{grid-column-start:1}.release dd{grid-column-start:2;margin-left:1rem;word-break:break-word}.release aside{float:right;margin-left:1rem;width:25rem}@media screen and (width <= 1024px){.releases{grid-template-columns:minmax(0,1fr)}.releases-content,.releases-rail{grid-column:1}.releases-rail{position:static}.advisory-layout{grid-template-columns:minmax(0,1fr)}.advisory-facts{position:static}}@media screen and (width <= 626px){.releases-table{font-size:.72222rem}.release aside{width:100%;margin:0 auto}}}@layer pages{.misc p:has(img){display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.misc p img{margin-right:1rem;width:7rem}.column-camel-core-13{float:left;width:33.33%}.row-camel-core-main::after{content:"";display:table;clear:both}.community,.docs{width:100%;max-width:clamp(66.66667rem,85vw,100rem);margin:0 auto;padding:3.11111rem 1.77778rem 2.22222rem}.community-hero,.docs-hero{max-width:42.22222rem}.docs-features{margin-top:2.22222rem}.docs-feature--dark .docs-feature-eyebrow{color:#e0805a}.docs-feature--light .docs-feature-eyebrow{color:#a84e0d}.docs-feature-title{font-family:Archivo,sans-serif;font-weight:800;font-size:1.66667rem;letter-spacing:-.02em;margin:.66667rem 0 0}.docs-feature--light .docs-feature-title{color:#211c17}.docs-feature-desc{font-size:.86111rem;line-height:1.6;margin:.66667rem 0 1.44444rem;-webkit-box-flex:1;-ms-flex:1;flex:1;text-wrap:pretty}.docs-feature--dark .docs-feature-desc{color:#c4bbac}.docs-feature--light .docs-feature-desc{color:#5c554c}.docs-feature-actions{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;gap:.55556rem;margin:0}.docs-feature-actions .button{margin:0;padding:.61111rem 1.11111rem;font-size:.80556rem}.docs-projects{margin-top:1.11111rem}.docs-project-card-head{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:.66667rem}.docs-project-card-icon{width:1.66667rem;height:1.66667rem;display:block;-webkit-box-flex:0;-ms-flex:none;flex:none;-o-object-fit:contain;object-fit:contain}.docs-project-card-title{font-family:Archivo,sans-serif;font-weight:700;font-size:1rem;margin:0;color:#211c17}.docs-project-card-desc{font-size:.77778rem;line-height:1.55;color:#5c554c;margin:.66667rem 0 1rem;-webkit-box-flex:1;-ms-flex:1;flex:1;text-wrap:pretty}.docs-project-card-links{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;gap:.77778rem;font-size:.75rem;font-weight:700}.docs-project-card-link{color:#a84e0d}.docs-project-card-link:hover{color:#853c09;text-decoration:none}.docs-project-card-link--muted{color:#6f675c}.docs-feature-links{margin-top:1rem}.docs-feature--dark .docs-project-card-link{color:#f2a05a}.docs-feature--dark .docs-project-card-link--muted{color:#c4bbac}.docs-feature--dark .docs-project-card-link:hover{color:#faf7f1}.community-grid{margin-top:2.22222rem}.community-card-tag{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:2.11111rem;height:2.11111rem;border-radius:9px;background:#d8efe9;font-family:Archivo,sans-serif;font-weight:800;font-size:.83333rem;color:#1f6858}.community-card-title{font-family:Archivo,sans-serif;font-weight:700;font-size:1.05556rem;margin:.88889rem 0 0;color:#211c17}.community-card-body{font-size:.80556rem;line-height:1.55;color:#5c554c;margin:.5rem 0 1rem;-webkit-box-flex:1;-ms-flex:1;flex:1;text-wrap:pretty}.community-card-link{color:#a84e0d;font-weight:700;font-size:.75rem}.community-card-link:hover{color:#853c09;text-decoration:none}.community-cta{grid-column:span 2}.community-cta-title{font-family:Archivo,sans-serif;font-weight:800;font-size:1.33333rem;letter-spacing:-.02em;margin:.66667rem 0 0}.community-cta-body{font-size:.80556rem;line-height:1.55;color:#c4bbac;margin:.55556rem 0 1.11111rem;-webkit-box-flex:1;-ms-flex:1;flex:1;max-width:31.11111rem}.community-cta-actions{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;gap:.55556rem;margin:0}.community-cta-actions .button{margin:0;padding:.55556rem 1rem;font-size:.77778rem}}@layer pages{@media screen and (width <= 1024px){.community,.docs{padding:1.77778rem 1.11111rem 2.66667rem}}@media screen and (width <= 626px){.community-cta{grid-column:span 1}}}@layer pages{.projects{width:100%;max-width:clamp(66.66667rem,85vw,100rem);margin:0 auto;padding:3rem 2rem 4rem;color:#211c17;font-size:.83333rem;line-height:1.55}.projects-hero{max-width:44rem;margin-bottom:2.5rem}.projects-back{font-family:JetBrains Mono,ui-monospace,monospace;font-size:.72222rem;font-weight:600;color:#5c554c}.projects-back:hover{color:#853c09;text-decoration:none}.projects h1{margin:1rem 0 0;font-size:2.55556rem;font-weight:800;line-height:1.05;letter-spacing:-.03em;color:#211c17}.projects-intro{margin:.8rem 0 0;font-size:.97222rem;color:#5c554c;text-wrap:pretty}.projects-group+.projects-group{margin-top:2.9rem}.projects-group-title{margin:0 0 1.1rem;padding-bottom:.8rem;border-bottom:1px solid #e7e0d5;font-size:.83333rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:#5c554c}.projects-grid{display:grid;gap:1rem;margin:0;padding:0;list-style:none}.projects-grid--four{grid-template-columns:repeat(4,minmax(0,1fr))}.projects-grid--two{grid-template-columns:repeat(2,minmax(0,1fr))}.project-card{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding:1.35rem;background:#fff;border:1px solid #e7e0d5;border-radius:.72222rem;-webkit-transition:border-color .15s,-webkit-box-shadow .15s,-webkit-transform .15s;transition:border-color .15s,-webkit-box-shadow .15s,-webkit-transform .15s;transition:border-color .15s,box-shadow .15s,transform .15s;transition:border-color .15s,box-shadow .15s,transform .15s,-webkit-box-shadow .15s,-webkit-transform .15s}.project-card--row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;gap:1.1rem;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;padding:1.45rem 1.55rem}.project-card-icon{height:1.88889rem;width:1.88889rem;-webkit-box-flex:0;-ms-flex:none;flex:none;-o-object-fit:contain;object-fit:contain}.project-card-icon--lg{height:2.44444rem;width:2.44444rem}.project-card-body{-webkit-box-flex:1;-ms-flex:1;flex:1;min-width:0}.project-card-title{margin:.9rem 0 0;font-size:.94444rem;font-weight:700;line-height:1.2;color:#211c17}.project-card--row .project-card-title{margin-top:0;font-size:1.05556rem}.project-card-desc{margin:.45rem 0 .8rem;font-size:.75rem;color:#5c554c;text-wrap:pretty}.project-card--row .project-card-desc{font-size:.80556rem}.project-card-stats{margin:0;font-family:JetBrains Mono,ui-monospace,monospace;font-size:.63889rem;line-height:1.7;color:#5c554c}.project-card-meta{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:.9rem}.project-card-link{color:#a84e0d;font-size:.75rem;font-weight:700}.project-card-link:hover{color:#853c09;text-decoration:none}.project-card-link--muted{color:#5c554c}.projects-footnote{margin:1.4rem 0 0;font-size:.77778rem;color:#5c554c;text-wrap:pretty}@media screen and (width <= 1024px){.projects{padding:2rem 1.25rem 3rem}.projects-grid--four{grid-template-columns:repeat(2,minmax(0,1fr))}.projects-grid--two{grid-template-columns:minmax(0,1fr)}.projects h1{font-size:2rem}}@media screen and (width <= 626px){.projects-grid--four{grid-template-columns:minmax(0,1fr)}.project-card--row{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}}}@layer pages{.tooling{width:100%;max-width:clamp(66.66667rem,85vw,100rem);margin:0 auto;padding:3.11111rem 1.77778rem 2.22222rem;display:grid;grid-template-columns:minmax(0,1fr) 12.22222rem;gap:3.11111rem;-webkit-box-align:start;-ms-flex-align:start;align-items:start}.tooling h1{font-weight:800;line-height:1.05;margin:0}.tooling .tooling-lead{max-width:42.22222rem;margin:.77778rem 0 0}.tooling-section{margin-top:2.66667rem}.tooling-cli-section{margin-top:2.88889rem}.tooling .tooling-section h2{font-weight:800;font-size:1.55556rem;letter-spacing:-.02em;margin:0;padding:0}.tooling .tooling-section-intro{font-size:.86111rem;line-height:1.6;color:#5c554c;margin:.55556rem 0 0;max-width:42.22222rem;text-wrap:pretty}.tooling-cli-section .tooling-section-intro{margin-bottom:1.11111rem}.tooling code{padding:.11111rem .33333rem;border-radius:4px}.tooling .tooling-section-intro code,.tooling code{font-size:.77778rem}.tooling-cli{background:#211c17;border:1px solid #34302a;border-radius:12px;overflow:hidden}.tooling-cli-row{display:grid;grid-template-columns:9.44444rem minmax(0,1fr);gap:1.11111rem;padding:.72222rem 1.11111rem;border-top:1px solid #34302a;font-size:.77778rem}.tooling .tooling-cli-cmd{color:#f2a05a;font-weight:600;font-size:.75rem}.tooling-cli-desc{color:#c4bbac;line-height:1.5}.tooling-split{display:grid;grid-template-columns:1fr 1fr;gap:1.55556rem;-webkit-box-align:start;-ms-flex-align:start;align-items:start}.tooling-media{aspect-ratio:16/10;border-radius:12px;background:#211c17;border:1px solid #34302a;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;overflow:hidden}.tooling-media img{width:100%;height:100%;-o-object-fit:contain;object-fit:contain}.tooling .tooling-eyebrow{color:#a84e0d;margin:0}.tooling-mcp .tooling-eyebrow+h2{margin-top:.55556rem}.tooling-ai-grid{display:grid;grid-template-columns:1fr 1fr;gap:.77778rem;margin-top:1.22222rem}.tooling-ai-card{border:1px solid #e7e0d5;border-radius:10px;padding:.88889rem 1rem}.tooling .tooling-ai-name{font-family:Archivo,sans-serif;font-weight:700;font-size:.88889rem;color:#211c17;text-decoration:none;background:none}.tooling .tooling-ai-name:hover{color:#853c09;text-decoration:underline}.tooling .tooling-ai-desc{font-size:.75rem;line-height:1.5;color:#5c554c;margin:.33333rem 0 0}.tooling-rows{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin-top:1rem;border-top:1px solid #e7e0d5}.tooling-row{display:grid;grid-template-columns:14.44444rem minmax(0,1fr);gap:1.33333rem;padding:.88889rem 0;border-bottom:1px solid #f0e9dd}.tooling .tooling-row-name{font-weight:700;font-size:.83333rem;color:#211c17;text-decoration:none;background:none}.tooling .tooling-row-name:hover{color:#853c09;text-decoration:underline}.tooling-row-name--mono{font-family:JetBrains Mono,ui-monospace,monospace}.tooling .tooling-row-desc{font-size:.80556rem;line-height:1.55;color:#5c554c;margin:0;text-wrap:pretty}.tooling .tooling-footnote{font-size:.80556rem;line-height:1.6;color:#6f675c;margin:2.66667rem 0 0;padding-top:1.33333rem;border-top:1px solid #e7e0d5}.tooling .toc.sidebar .toc-menu{top:5rem}@media screen and (width <= 1024px){.tooling{padding:1.77778rem 1.11111rem 2.66667rem}.tooling,.tooling-row,.tooling-split{grid-template-columns:minmax(0,1fr)}.tooling-row{gap:.33333rem}}@media screen and (width <= 626px){.tooling-cli-row{gap:.33333rem}.tooling-ai-grid,.tooling-cli-row{grid-template-columns:minmax(0,1fr)}}}@layer pages{.sitemap h1{text-align:center}.sitemap ul.sitemap-list{list-style-type:none;-webkit-columns:2;-moz-columns:2;column-count:2;padding:0;-webkit-column-gap:25%;-moz-column-gap:25%;column-gap:25%;white-space:nowrap}@media screen and (width <= 626px){.sitemap ul.sitemap-list{-webkit-columns:1;-moz-columns:1;column-count:1}}}@layer pages{.video{position:relative;overflow:hidden;padding-bottom:52.9986%}.video iframe{position:absolute;top:0;left:0;width:100%;height:100%;border:0}.download-hero{display:grid;grid-template-columns:1fr 21.11111rem;gap:3.11111rem;-webkit-box-align:start;-ms-flex-align:start;align-items:start}.download-intro p{font-size:.91667rem;line-height:1.6;color:#5c554c;margin:.77778rem 0 0;text-wrap:pretty}.download-intro p:first-of-type{margin-top:.88889rem}.download-intro strong{color:#211c17}.download-card a,.download-intro a{color:#a84e0d}.download-card a:hover,.download-intro a:hover{color:#853c09}.download-cli-card{background:#211c17;border-radius:16px;padding:1.55556rem;color:#faf7f1}.download-cli-desc{font-size:.80556rem;line-height:1.55;color:#c4bbac;margin:.55556rem 0 .88889rem}.download-cli-bar{display:-webkit-box;display:-ms-flexbox;display:flex;background:#1c1813;border:1px solid #34302a;border-radius:8px;overflow:hidden}.download-cli-command{-webkit-box-flex:1;-ms-flex:1;flex:1;min-width:0;font-family:JetBrains Mono,ui-monospace,monospace;font-size:.69444rem;color:#f0e9df;padding:.66667rem .77778rem;white-space:normal;word-break:break-word}.download-cli-prompt{color:#e0805a}.download-cli-copy{border:0;border-left:1px solid #34302a;background:#2b2620;color:#f0e9df;font-family:JetBrains Mono,ui-monospace,monospace;font-size:.66667rem;font-weight:600;padding:0 .77778rem;cursor:pointer}.download-cli-copy:hover{background:#3a342c}.download-cli-guide{display:inline-block;margin-top:.77778rem;font-size:.75rem;font-weight:700;color:#f2a05a}.download-cli-guide:hover{color:#faf7f1;text-decoration:none}.download-row{display:grid;grid-template-columns:12.22222rem 7.22222rem minmax(11.11111rem,1fr) minmax(0,auto);gap:1.33333rem;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:1.22222rem 0;border-bottom:1px solid #f0e9dd}.download-row-project{font-family:Archivo,sans-serif;font-weight:700;font-size:.94444rem;color:#211c17}.download-row-date{font-size:.72222rem;color:#6f675c;margin-top:.16667rem}.download-row-version{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:.44444rem}.download-row-version-num{font-family:JetBrains Mono,ui-monospace,monospace;font-size:.83333rem;font-weight:600;color:#211c17}.download-row-note{font-size:.77778rem;color:#5c554c}.download-row-links{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;gap:.77778rem;font-size:.75rem;font-weight:700}.download-row-artifact,.download-row-links{-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline}.download-row-artifact{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;gap:.33333rem;white-space:nowrap}.download-row-link{color:#6f675c}.download-row-link:hover{color:#853c09;text-decoration:none}.download-row-link--primary{color:#a84e0d}.download-row-link--primary:hover{color:#853c09}.download-row-sub{font-size:.75rem;font-weight:700;color:#6f675c}.download-row-sub::before{content:"("}.download-row-sub::after{content:")"}.download-row-sublink{color:inherit}.download-row-sublink:hover{color:#a84e0d}.download-row-sublink+.download-row-sublink::before{content:" \00b7 ";color:#6f675c}.download-cards{margin-top:2.66667rem}.download-card{padding:1.44444rem}.download-card h3{font-family:Archivo,sans-serif;font-weight:700;font-size:1rem;margin:0}.download-card p{font-size:.80556rem;line-height:1.6;color:#5c554c;margin:.55556rem 0 0;text-wrap:pretty}}@layer pages{@media screen and (width <= 1024px){.download-cards,.download-hero{grid-template-columns:1fr}.download{padding:2.22222rem 1.33333rem 2.66667rem}.download-row{grid-template-columns:1fr;gap:.44444rem}.download-row-links{margin-top:.22222rem}}}@layer pages{.catalog.paragraph{margin:0}.catalog{width:32%;height:9rem;display:inline-block;vertical-align:top;padding:1rem .8rem 0 0}@media screen and (width <= 1024px){.catalog{width:49%}}@media screen and (width <= 626px){.catalog{width:100%}}.catalog p{border:1px solid #e1e1e1;height:100%}.catalog .item{display:block;padding:1rem}.catalog .item a{text-decoration:none;display:block;text-align:center}.catalog .item .image{display:block}.catalog .item .image img{height:3rem;width:auto;max-width:60%}.post .post-share-link{font-family:inherit;font-size:.72222rem;font-weight:700;color:#5c554c;background:none;border:1px solid #e7e0d5;padding:.33333rem .66667rem;border-radius:6px;text-decoration:none;cursor:pointer}.post .post-share-link:hover{border-color:#d9ccb8;color:#5c554c}.security-hero{max-width:42.22222rem}.security-grid{margin-top:2.22222rem}.security-card--feature{grid-column:1/-1}.security-card--feature h2{font-family:Archivo,sans-serif;font-weight:800;font-size:1.44444rem;letter-spacing:-.02em;margin:.55556rem 0 0}.security-card--feature p{font-size:.86111rem;line-height:1.6;color:#5c554c;margin:.66667rem 0 0;max-width:45.55556rem}.security-card{padding:1.44444rem}.security-card h3{font-family:Archivo,sans-serif;font-weight:700;font-size:1rem;margin:0}.security-card p{font-size:.80556rem;line-height:1.6;color:#5c554c;margin:.55556rem 0 0}.security-band a,.security-card a,.security-card--feature a{color:#a84e0d}.security-band a:hover,.security-card a:hover,.security-card--feature a:hover{color:#853c09}.security-band{grid-column:1/-1;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:1.33333rem;background:#211c17;border-radius:16px;padding:1.77778rem;color:#faf7f1}.security-band-copy{-webkit-box-flex:1;-ms-flex:1;flex:1;min-width:16.66667rem}.security-band-copy h2{font-family:Archivo,sans-serif;font-weight:800;font-size:1.33333rem;letter-spacing:-.02em;margin:0}.security-band-copy p{font-size:.83333rem;line-height:1.6;color:#c4bbac;margin:.55556rem 0 0;max-width:35.55556rem}.security-band .button{white-space:nowrap}.security-advisories{width:100%;font-size:.77778rem;border-collapse:collapse}.security-advisories thead tr{font-family:JetBrains Mono,ui-monospace,monospace;font-size:.63889rem;font-weight:600;color:#6f675c;text-transform:uppercase;letter-spacing:.06em;text-align:left}.security-advisories thead th{padding:.77778rem .66667rem .55556rem}.security-advisories thead th:first-child{padding-left:0}.security-advisories thead th:last-child{padding-right:0}.security-advisories tbody th{text-align:left;padding:1.44444rem 0 .44444rem;font-family:Archivo,sans-serif;font-weight:800;font-size:1.22222rem;letter-spacing:-.02em;color:#211c17}.security-advisories .security-row{border-top:1px solid #f0e9dd}.security-advisories td{padding:.66667rem;color:#5c554c}.security-advisories td:first-child{padding-left:0;font-family:JetBrains Mono,ui-monospace,monospace;font-size:.72222rem;color:#3a332b}.security-advisories td:first-child a{font-weight:600;color:#a84e0d}.security-advisories td:first-child a:hover{color:#853c09;text-decoration:none}.security-advisories td:last-child{padding-right:0;line-height:1.5}.security-severity{font-size:.63889rem;padding:.16667rem .44444rem}.security .table-wrapper{overflow-x:auto}.security td:only-child{text-align:center}.security td:first-child{white-space:nowrap}}@layer pages{}@layer pages{@media screen and (width <= 1024px){.security-grid{grid-template-columns:1fr}}@media screen and (width <= 626px){.security-band{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch}}}@layer pages{.DocSearch{--docsearch-font-family:"Open Sans", system-ui, sans-serif;--docsearch-primary-color:#e97826;--docsearch-primary-dark-color:#a84e0d;--docsearch-highlight-color:#a84e0d;--docsearch-focus-color:#e97826;--docsearch-icon-color:#a84e0d;--docsearch-soft-primary-color:rgba(233,120,38,.1);--docsearch-hit-highlight-color:rgba(233,120,38,.12);--docsearch-chip-background:#fbead8;--docsearch-text-color:#3a332b;--docsearch-hit-color:#3a332b;--docsearch-secondary-text-color:#5c554c;--docsearch-muted-color:#6f675c;--docsearch-subtle-color:#e7e0d5;--docsearch-background-color:#f4eee3;--docsearch-modal-background:#faf7f1;--docsearch-hit-background:#fff;--docsearch-key-background:#fff;--docsearch-key-color:#5c554c;--docsearch-container-background:rgba(33,28,23,.55);--docsearch-border-radius:0.389rem;--docsearch-modal-radius:0.667rem;--docsearch-searchbox-height:3.75rem;--docsearch-searchbox-initial-height:3.75rem;--docsearch-hit-focus-background:rgb(233 120 38 / 9%);--docsearch-search-button-background:#fff;--docsearch-search-button-text-color:#5c554c;--docsearch-chip-text-color:#a84e0d;--docsearch-dropdown-menu-background:#fff;--docsearch-dropdown-menu-item-hover-background:#f4eee3;--docsearch-menu-trigger-active-background:rgba(233,120,38,.1);--docsearch-menu-trigger-active-text-color:#a84e0d}.header .DocSearch-Button{--docsearch-search-button-background:#2b2620;--docsearch-search-button-text-color:#c4bbac;--docsearch-subtle-color:#4a443c;--docsearch-highlight-color:#f2a05a;--docsearch-key-background:#1c1813;--docsearch-key-color:#c4bbac}.DocSearch-Screen-Icon svg{stroke:currentcolor}.DocSearch-Hit-source{color:#211c17;font-weight:700}}@layer print{@page{margin:.5in}@media print{.hide-for-print{display:none!important}html{font-size:.9375em}a{color:inherit!important;text-decoration:underline}a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none}img,object,svg,tr{page-break-inside:avoid}thead{display:table-header-group}pre{-webkit-hyphens:none;-ms-hyphens:none;hyphens:none;white-space:pre-wrap}body{padding-top:2rem}.navbar{background:none;color:inherit;position:absolute}.navbar *{color:inherit!important}#topbar-nav,.nav-container,.toolbar{display:none}.doc{color:inherit;margin:auto;max-width:none;padding-bottom:2rem}.doc .listingblock code[data-lang]::before{display:block}footer{background:none;border-top:1px solid #e7e0d5;color:#5c554c;padding:.5rem}.footer *{color:inherit!important}}}
\ No newline at end of file
diff --git a/antora-ui-camel/public/_/data/rev-manifest.json b/antora-ui-camel/public/_/data/rev-manifest.json
index 97424f23291..2041c7c45a2 100644
--- a/antora-ui-camel/public/_/data/rev-manifest.json
+++ b/antora-ui-camel/public/_/data/rev-manifest.json
@@ -1,37 +1,28 @@
 {
-  "css/site.css": "css/site-74543f5b13.css",
+  "css/site.css": "css/site-fa37b1d407.css",
   "css/vendor/docsearch.css": "css/vendor/docsearch-7619faa207.css",
   "img/algolia.svg": "img/algolia-f4ab98e0de.svg",
   "img/apache-kafka.svg": "img/apache-kafka-88809b7472.svg",
   "img/apache-karaf.svg": "img/apache-karaf-7bdb5ce2e3.svg",
-  "img/articles.svg": "img/articles-88ac404d18.svg",
-  "img/asf_logo_wide.svg": "img/asf_logo_wide-3982e7e19b.svg",
   "img/back.svg": "img/back-e8d811f74c.svg",
-  "img/blog.svg": "img/blog-4c7fa4cb60.svg",
   "img/books.svg": "img/books-77a59b07e1.svg",
   "img/brand-logos.svg": "img/brand-logos-a2b35bbdec.svg",
   "img/bugfix.svg": "img/bugfix-4280bf9490.svg",
   "img/calendar.svg": "img/calendar-b4b3ab1bf7.svg",
-  "img/caret.svg": "img/caret-d6dacc711e.svg",
+  "img/caret.svg": "img/caret-8823676a4b.svg",
   "img/chevron.svg": "img/chevron-63cb534773.svg",
   "img/cli.svg": "img/cli-9cede0128a.svg",
   "img/close.svg": "img/close-af0b99e31b.svg",
   "img/community.svg": "img/community-2ec8a3dc8b.svg",
-  "img/contributing.svg": "img/contributing-107909992d.svg",
   "img/copy-checkmark.svg": "img/copy-checkmark-9a4caf1664.svg",
   "img/copy.svg": "img/copy-d7c1e3194d.svg",
   "img/docs.svg": "img/docs-7d0adf1156.svg",
-  "img/documentation.svg": "img/documentation-abb1b7f8b1.svg",
-  "img/download.svg": "img/download-63cdd75074.svg",
   "img/examples.svg": "img/examples-07d01f2bc0.svg",
   "img/github.svg": "img/github-0cae1e39c4.svg",
-  "img/home-o.svg": "img/home-o-97a33fc02f.svg",
-  "img/home.svg": "img/home-934e2b15ea.svg",
   "img/jbang.svg": "img/jbang-e88e00f7fa.svg",
   "img/karavan.svg": "img/karavan-8621354711.svg",
   "img/knative.svg": "img/knative-5010ee4773.svg",
   "img/kubernetes.svg": "img/kubernetes-07ba46aaa2.svg",
-  "img/logo-camel-medium.png": "img/logo-camel-medium-372cf8688f.png",
   "img/logo-d.svg": "img/logo-d-a567cee6fa.svg",
   "img/menu.svg": "img/menu-8775cec4be.svg",
   "img/quarkus.svg": "img/quarkus-446ffca541.svg",
@@ -40,11 +31,9 @@
   "img/security.svg": "img/security-06abe157b3.svg",
   "img/sparkle.svg": "img/sparkle-da54b1f43c.svg",
   "img/spring-boot.svg": "img/spring-boot-0a7cb95564.svg",
-  "img/support.svg": "img/support-7219bb2f58.svg",
-  "img/team.svg": "img/team-899f1050c2.svg",
   "img/tooling.svg": "img/tooling-f5e235c238.svg",
   "img/user-stories.svg": "img/user-stories-cccc5f7c8f.svg",
-  "js/site.js": "js/site-72c5696123.js",
+  "js/site.js": "js/site-2261680ded.js",
   "js/vendor/docsearch.js": "js/vendor/docsearch-f8ce9408ec.js",
   "js/vendor/highlight.js": "js/vendor/highlight-de2def4bea.js",
   "js/vendor/svg4everybody.js": "js/vendor/svg4everybody-a0c573f2b9.js",
diff --git a/antora-ui-camel/public/_/font/archivo-latin-500-normal.woff2 b/antora-ui-camel/public/_/font/archivo-latin-500-normal.woff2
new file mode 100644
index 00000000000..c0917996a14
Binary files /dev/null and b/antora-ui-camel/public/_/font/archivo-latin-500-normal.woff2 differ
diff --git a/antora-ui-camel/public/_/font/archivo-latin-600-normal.woff2 b/antora-ui-camel/public/_/font/archivo-latin-600-normal.woff2
new file mode 100644
index 00000000000..2e56f9fdef7
Binary files /dev/null and b/antora-ui-camel/public/_/font/archivo-latin-600-normal.woff2 differ
diff --git a/antora-ui-camel/public/_/font/archivo-latin-700-normal.woff2 b/antora-ui-camel/public/_/font/archivo-latin-700-normal.woff2
new file mode 100644
index 00000000000..d8b6a1cecb5
Binary files /dev/null and b/antora-ui-camel/public/_/font/archivo-latin-700-normal.woff2 differ
diff --git a/antora-ui-camel/public/_/font/archivo-latin-800-normal.woff2 b/antora-ui-camel/public/_/font/archivo-latin-800-normal.woff2
new file mode 100644
index 00000000000..f088f005c27
Binary files /dev/null and b/antora-ui-camel/public/_/font/archivo-latin-800-normal.woff2 differ
diff --git a/antora-ui-camel/public/_/font/droid-sans-mono-latin-400.woff b/antora-ui-camel/public/_/font/droid-sans-mono-latin-400.woff
deleted file mode 100644
index 6ec7b335229..00000000000
Binary files a/antora-ui-camel/public/_/font/droid-sans-mono-latin-400.woff and /dev/null differ
diff --git a/antora-ui-camel/public/_/font/droid-sans-mono-latin-400.woff2 b/antora-ui-camel/public/_/font/droid-sans-mono-latin-400.woff2
deleted file mode 100644
index 63eb0dc26fc..00000000000
Binary files a/antora-ui-camel/public/_/font/droid-sans-mono-latin-400.woff2 and /dev/null differ
diff --git a/antora-ui-camel/public/_/font/jetbrains-mono-latin-400-normal.woff2 b/antora-ui-camel/public/_/font/jetbrains-mono-latin-400-normal.woff2
new file mode 100644
index 00000000000..585887339ef
Binary files /dev/null and b/antora-ui-camel/public/_/font/jetbrains-mono-latin-400-normal.woff2 differ
diff --git a/antora-ui-camel/public/_/font/jetbrains-mono-latin-500-normal.woff2 b/antora-ui-camel/public/_/font/jetbrains-mono-latin-500-normal.woff2
new file mode 100644
index 00000000000..be878e68fa7
Binary files /dev/null and b/antora-ui-camel/public/_/font/jetbrains-mono-latin-500-normal.woff2 differ
diff --git a/antora-ui-camel/public/_/font/jetbrains-mono-latin-600-normal.woff2 b/antora-ui-camel/public/_/font/jetbrains-mono-latin-600-normal.woff2
new file mode 100644
index 00000000000..59c24e7cb8b
Binary files /dev/null and b/antora-ui-camel/public/_/font/jetbrains-mono-latin-600-normal.woff2 differ
diff --git a/antora-ui-camel/public/_/font/open-sans-latin-ext-400-italic.woff b/antora-ui-camel/public/_/font/open-sans-latin-ext-400-italic.woff
new file mode 100644
index 00000000000..edac093170e
Binary files /dev/null and b/antora-ui-camel/public/_/font/open-sans-latin-ext-400-italic.woff differ
diff --git a/antora-ui-camel/public/_/font/open-sans-latin-ext-400-italic.woff2 b/antora-ui-camel/public/_/font/open-sans-latin-ext-400-italic.woff2
new file mode 100644
index 00000000000..7584008a531
Binary files /dev/null and b/antora-ui-camel/public/_/font/open-sans-latin-ext-400-italic.woff2 differ
diff --git a/antora-ui-camel/public/_/font/open-sans-latin-ext-400.woff b/antora-ui-camel/public/_/font/open-sans-latin-ext-400.woff
new file mode 100644
index 00000000000..efb8f0d3152
Binary files /dev/null and b/antora-ui-camel/public/_/font/open-sans-latin-ext-400.woff differ
diff --git a/antora-ui-camel/public/_/font/open-sans-latin-ext-400.woff2 b/antora-ui-camel/public/_/font/open-sans-latin-ext-400.woff2
new file mode 100644
index 00000000000..9b582203f24
Binary files /dev/null and b/antora-ui-camel/public/_/font/open-sans-latin-ext-400.woff2 differ
diff --git a/antora-ui-camel/public/_/helpers/asset.js b/antora-ui-camel/public/_/helpers/asset.js
index 8ecd65dbf25..b78893c8441 100644
--- a/antora-ui-camel/public/_/helpers/asset.js
+++ b/antora-ui-camel/public/_/helpers/asset.js
@@ -1,39 +1,30 @@
 'use strict'
 
 const manifest = {
-  "css/site.css": "css/site-74543f5b13.css",
+  "css/site.css": "css/site-fa37b1d407.css",
   "css/vendor/docsearch.css": "css/vendor/docsearch-7619faa207.css",
   "img/algolia.svg": "img/algolia-f4ab98e0de.svg",
   "img/apache-kafka.svg": "img/apache-kafka-88809b7472.svg",
   "img/apache-karaf.svg": "img/apache-karaf-7bdb5ce2e3.svg",
-  "img/articles.svg": "img/articles-88ac404d18.svg",
-  "img/asf_logo_wide.svg": "img/asf_logo_wide-3982e7e19b.svg",
   "img/back.svg": "img/back-e8d811f74c.svg",
-  "img/blog.svg": "img/blog-4c7fa4cb60.svg",
   "img/books.svg": "img/books-77a59b07e1.svg",
   "img/brand-logos.svg": "img/brand-logos-a2b35bbdec.svg",
   "img/bugfix.svg": "img/bugfix-4280bf9490.svg",
   "img/calendar.svg": "img/calendar-b4b3ab1bf7.svg",
-  "img/caret.svg": "img/caret-d6dacc711e.svg",
+  "img/caret.svg": "img/caret-8823676a4b.svg",
   "img/chevron.svg": "img/chevron-63cb534773.svg",
   "img/cli.svg": "img/cli-9cede0128a.svg",
   "img/close.svg": "img/close-af0b99e31b.svg",
   "img/community.svg": "img/community-2ec8a3dc8b.svg",
-  "img/contributing.svg": "img/contributing-107909992d.svg",
   "img/copy-checkmark.svg": "img/copy-checkmark-9a4caf1664.svg",
   "img/copy.svg": "img/copy-d7c1e3194d.svg",
   "img/docs.svg": "img/docs-7d0adf1156.svg",
-  "img/documentation.svg": "img/documentation-abb1b7f8b1.svg",
-  "img/download.svg": "img/download-63cdd75074.svg",
   "img/examples.svg": "img/examples-07d01f2bc0.svg",
   "img/github.svg": "img/github-0cae1e39c4.svg",
-  "img/home-o.svg": "img/home-o-97a33fc02f.svg",
-  "img/home.svg": "img/home-934e2b15ea.svg",
   "img/jbang.svg": "img/jbang-e88e00f7fa.svg",
   "img/karavan.svg": "img/karavan-8621354711.svg",
   "img/knative.svg": "img/knative-5010ee4773.svg",
   "img/kubernetes.svg": "img/kubernetes-07ba46aaa2.svg",
-  "img/logo-camel-medium.png": "img/logo-camel-medium-372cf8688f.png",
   "img/logo-d.svg": "img/logo-d-a567cee6fa.svg",
   "img/menu.svg": "img/menu-8775cec4be.svg",
   "img/quarkus.svg": "img/quarkus-446ffca541.svg",
@@ -42,11 +33,9 @@ const manifest = {
   "img/security.svg": "img/security-06abe157b3.svg",
   "img/sparkle.svg": "img/sparkle-da54b1f43c.svg",
   "img/spring-boot.svg": "img/spring-boot-0a7cb95564.svg",
-  "img/support.svg": "img/support-7219bb2f58.svg",
-  "img/team.svg": "img/team-899f1050c2.svg",
   "img/tooling.svg": "img/tooling-f5e235c238.svg",
   "img/user-stories.svg": "img/user-stories-cccc5f7c8f.svg",
-  "js/site.js": "js/site-72c5696123.js",
+  "js/site.js": "js/site-2261680ded.js",
   "js/vendor/docsearch.js": "js/vendor/docsearch-f8ce9408ec.js",
   "js/vendor/highlight.js": "js/vendor/highlight-de2def4bea.js",
   "js/vendor/svg4everybody.js": "js/vendor/svg4everybody-a0c573f2b9.js",
diff --git a/antora-ui-camel/public/_/helpers/withChromeData.js b/antora-ui-camel/public/_/helpers/withChromeData.js
new file mode 100644
index 00000000000..54330d5215f
--- /dev/null
+++ b/antora-ui-camel/public/_/helpers/withChromeData.js
@@ -0,0 +1,51 @@
+'use strict'
+
+const fs = require('fs')
+const path = require('path')
+const yaml = require('js-yaml')
+
+const absolute = /^(?:https?:)?\/\//
+
+// Antora evaluates UI helpers in its own process, so this runs against the
+// cwd of the Antora (or `gulp preview`) run: the repository root, or
+// antora-ui-camel for the preview.
+const candidates = [
+  path.join(process.cwd(), 'data', 'chrome.yaml'),
+  path.resolve(process.cwd(), '..', 'data', 'chrome.yaml'),
+]
+const dataPath = candidates.find((candidate) => fs.existsSync(candidate))
+if (!dataPath) {
+  throw new Error(
+    'withChromeData: data/chrome.yaml not found; run Antora from the camel-website repository root ' +
+    '(cwd: ' + process.cwd() + ')'
+  )
+}
+
+// js-yaml 4's load() uses the safe schema by default; safeLoad was removed in
+// v4 because it became redundant. This is not PyYAML's unsafe load.
+const chromeData = yaml.load(fs.readFileSync(dataPath, 'utf8'))
+
+const mapLink = (link, siteRootPath) => {
+  return Object.assign({}, link, {
+    url: absolute.test(link.url) ? link.url : siteRootPath + link.url,
+  })
+}
+
+module.exports = (options) => {
+  const siteRootPath = options.data.root.siteRootPath
+  // Merge onto the existing data frame instead of replacing it outright:
+  // replacing it drops inherited private variables such as @root, which
+  // Handlebars templates inside this block need to reach the top-level
+  // context (e.g. uiRootPath) from any depth, including inside {{#each}}.
+  return options.fn(this, {
+    data: Object.assign({}, options.data, {
+      brand: chromeData.brand,
+      columns: chromeData.columns.map((column) => ({
+        title: column.title,
+        links: column.links.map((link) => mapLink(link, siteRootPath)),
+      })),
+      social: chromeData.social.map((link) => mapLink(link, siteRootPath)),
+      legal: chromeData.legal.map((link) => mapLink(link, siteRootPath)),
+    }),
+  })
+}
diff --git a/antora-ui-camel/public/_/helpers/withMenuData.js b/antora-ui-camel/public/_/helpers/withMenuData.js
index a0381d674ff..26d799ce2b8 100644
--- a/antora-ui-camel/public/_/helpers/withMenuData.js
+++ b/antora-ui-camel/public/_/helpers/withMenuData.js
@@ -17,24 +17,38 @@ const data = fs.readFileSync(configPath, 'utf8')
 const hugoConfig = toml.parse(data)
 const mainMenu = hugoConfig.menu.main
 
+// Hugo orders menu.main by weight, not by its position in config.toml. Sort
+// here too, on both levels, so the two renderings cannot silently diverge if
+// a weight is ever reordered without moving the corresponding block.
+const byWeight = (a, b) => (a.weight || 0) - (b.weight || 0)
+
 const createMenu = (item) => {
   return {
     url: item.url || '#',
     name: item.name,
-    pre: item.pre,
-    children: mainMenu.filter((child) => child.parent === item.identifier).map(createMenu),
+    children: mainMenu
+      .filter((child) => child.parent === item.identifier)
+      .sort(byWeight)
+      .map(createMenu),
   }
 }
 
-const menuData = mainMenu.filter((item) => typeof item.parent === 'undefined').map(createMenu)
+const menuData = mainMenu
+  .filter((item) => typeof item.parent === 'undefined')
+  .sort(byWeight)
+  .map(createMenu)
 
 module.exports = (options) => {
   const siteRootPath = options.data.root.siteRootPath
   const mappedMenuData = menuData.map((item) => mapItem(item, siteRootPath))
+  // Merge onto the existing data frame instead of replacing it outright:
+  // replacing it drops inherited private variables such as @root, which
+  // Handlebars templates inside this block need to reach the top-level
+  // context (e.g. uiRootPath) from any depth, including inside {{#each}}.
   return options.fn(this, {
-    data: {
+    data: Object.assign({}, options.data, {
       items: mappedMenuData,
-    },
+    }),
   })
 }
 
@@ -43,7 +57,6 @@ const mapItem = (item, siteRootPath) => {
   return {
     url,
     name: item.name,
-    pre: item.pre,
     children: item.children.map((child) => mapItem(child, siteRootPath)),
   }
 }
diff --git a/antora-ui-camel/public/_/img/articles-88ac404d18.svg b/antora-ui-camel/public/_/img/articles-88ac404d18.svg
deleted file mode 100644
index 92c34d7b837..00000000000
--- a/antora-ui-camel/public/_/img/articles-88ac404d18.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/antora-ui-camel/public/_/img/asf_logo_wide-3982e7e19b.svg b/antora-ui-camel/public/_/img/asf_logo_wide-3982e7e19b.svg
deleted file mode 100644
index 4f37dbde2a3..00000000000
--- a/antora-ui-camel/public/_/img/asf_logo_wide-3982e7e19b.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/antora-ui-camel/public/_/img/blog-4c7fa4cb60.svg b/antora-ui-camel/public/_/img/blog-4c7fa4cb60.svg
deleted file mode 100644
index 677b80ddea3..00000000000
--- a/antora-ui-camel/public/_/img/blog-4c7fa4cb60.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/antora-ui-camel/public/_/img/caret-d6dacc711e.svg b/antora-ui-camel/public/_/img/caret-8823676a4b.svg
similarity index 92%
rename from antora-ui-camel/public/_/img/caret-d6dacc711e.svg
rename to antora-ui-camel/public/_/img/caret-8823676a4b.svg
index ff1490fcb80..6bd9ff39c94 100644
--- a/antora-ui-camel/public/_/img/caret-d6dacc711e.svg
+++ b/antora-ui-camel/public/_/img/caret-8823676a4b.svg
@@ -1 +1 @@
-image/svg+xml
\ No newline at end of file
+image/svg+xml
\ No newline at end of file
diff --git a/antora-ui-camel/public/_/img/contributing-107909992d.svg b/antora-ui-camel/public/_/img/contributing-107909992d.svg
deleted file mode 100644
index 3f83f6fed3a..00000000000
--- a/antora-ui-camel/public/_/img/contributing-107909992d.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/antora-ui-camel/public/_/img/documentation-abb1b7f8b1.svg b/antora-ui-camel/public/_/img/documentation-abb1b7f8b1.svg
deleted file mode 100644
index 868a43209ee..00000000000
--- a/antora-ui-camel/public/_/img/documentation-abb1b7f8b1.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/antora-ui-camel/public/_/img/download-63cdd75074.svg b/antora-ui-camel/public/_/img/download-63cdd75074.svg
deleted file mode 100644
index 4dc39fecbf6..00000000000
--- a/antora-ui-camel/public/_/img/download-63cdd75074.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/antora-ui-camel/public/_/img/home-934e2b15ea.svg b/antora-ui-camel/public/_/img/home-934e2b15ea.svg
deleted file mode 100644
index f0fd7a3e720..00000000000
--- a/antora-ui-camel/public/_/img/home-934e2b15ea.svg
+++ /dev/null
@@ -1 +0,0 @@
-image/svg+xml
\ No newline at end of file
diff --git a/antora-ui-camel/public/_/img/home-o-97a33fc02f.svg b/antora-ui-camel/public/_/img/home-o-97a33fc02f.svg
deleted file mode 100644
index 3ec849f1cae..00000000000
--- a/antora-ui-camel/public/_/img/home-o-97a33fc02f.svg
+++ /dev/null
@@ -1 +0,0 @@
-image/svg+xml
\ No newline at end of file
diff --git a/antora-ui-camel/public/_/img/logo-camel-medium-372cf8688f.png b/antora-ui-camel/public/_/img/logo-camel-medium-372cf8688f.png
deleted file mode 100644
index ab4ed1d9114..00000000000
Binary files a/antora-ui-camel/public/_/img/logo-camel-medium-372cf8688f.png and /dev/null differ
diff --git a/antora-ui-camel/public/_/img/support-7219bb2f58.svg b/antora-ui-camel/public/_/img/support-7219bb2f58.svg
deleted file mode 100644
index a0edf329677..00000000000
--- a/antora-ui-camel/public/_/img/support-7219bb2f58.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/antora-ui-camel/public/_/img/team-899f1050c2.svg b/antora-ui-camel/public/_/img/team-899f1050c2.svg
deleted file mode 100644
index 736e7648cb0..00000000000
--- a/antora-ui-camel/public/_/img/team-899f1050c2.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/antora-ui-camel/public/_/js/site-72c5696123.js b/antora-ui-camel/public/_/js/site-2261680ded.js
similarity index 66%
rename from antora-ui-camel/public/_/js/site-72c5696123.js
rename to antora-ui-camel/public/_/js/site-2261680ded.js
index 6d2e8a742d8..bbdbd9da5af 100644
--- a/antora-ui-camel/public/_/js/site-72c5696123.js
+++ b/antora-ui-camel/public/_/js/site-2261680ded.js
@@ -1,9 +1,11 @@
 !function(){"use strict";var e=/^sect(\d)$/,t=document.querySelector(".nav-container"),n=document.querySelector(".nav-toggle");if(n&&n.addEventListener("click",(function(e){if(n.classList.contains("is-active"))return d(e);var i=document.documentElement;i.classList.add("is-clipped--nav"),n.classList.add("is-active"),t.classList.add("is-active"),i.addEventListener("click",d),u(e)})),t){t.addEventListener("click",u);var i=t.querySelector("[data-panel=menu]");if(i){var a=t.querySelector(".nav"),c=i.querySelector(".is-current-page"),r=c;c?(o(c),v(i,c.querySelector(".nav-link"))):i.scrollTop=0,m(i,".nav-item-toggle").forEach((function(e){var t=e.parentElement;e.addEventListener("click",l.bind(t));var n=function(e,t){var n=e.nextElementSibling;if(!n)return;return t?n[n.matches?"matches":"msMatchesSelector"](t)&&n:n}(e,".nav-text");n&&(n.style.cursor="pointer",n.addEventListener("click",l.bind(t)))})),a.querySelector(".nav-panel-explore").addEventListener("click",(function(){var e=a.querySelector(".is-active[data-panel]"),t=null===e||"menu"===e.dataset.panel?"explore":"menu";a.querySelector(`[data-panel=${t}]`).classList.toggle("is-active"),null!==e&&e.classList.toggle("is-active")})),i.addEventListener("mousedown",(function(e){e.detail>1&&e.preventDefault()})),i.querySelector('.nav-link[href^="#"]')&&(window.location.hash&&s(),window.addEventListener("hashchange",s))}}function s(){var t,n,a=window.location.hash;if(a&&(a.indexOf("%")&&(a=decodeURIComponent(a)),!(t=i.querySelector('.nav-link[href="'+a+'"]')))){var s=document.getElementById(a.slice(1));if(s)for(var l=s,d=document.querySelector("article.doc");(l=l.parentNode)&&l!==d;){var u=l.id;if(!u&&(u=l.className.match(e))&&(u=(l.firstElementChild||{}).id),u&&(t=i.querySelector('.nav-link[href="#'+u+'"]')))break}}if(t)n=t.parentNode;else{if(!r)return;t=(n=r).querySelector(".nav-link")}n!==c&&(m(i,".nav-item.is-active").forEach((function(e){e.classList.remove("is-active","is-current-path","is-current-page")})),n.classList.add("is-current-page"),c=n,o(n),v(i,t))}function o(e){for(var t,n=e.parentNode;!(t=n.classList).contains("nav-menu");)"LI"===n.tagName&&t.contains("nav-item")&&t.add("is-active","is-current-path"),n=n.parentNode;e.classList.add("is-active")}function l(){this.classList.toggle("is-active")}function d(e){var i=document.documentElement;i.classList.remove("is-clipped--nav"),n.classList.remove("is-active"),t.classList.remove("is-active"),i.removeEventListener("click",d),u(e)}function u(e){e.stopPropagation()}function v(e,t){var n=e.getBoundingClientRect(),i=n.height,c=window.getComputedStyle(a);"sticky"===c.position&&(i-=n.top-parseFloat(c.top)),e.scrollTop=Math.max(0,.5*(t.getBoundingClientRect().height-i)+t.offsetTop)}function m(e,t){return[].slice.call(e.querySelectorAll(t))}}();
 !function(){"use strict";var e=document.querySelector("aside.toc.sidebar");if(e){if(document.querySelector("body.-toc"))return e.parentNode.removeChild(e);var t=parseInt(e.dataset.levels||2);if(!(t<0)){for(var n,o,i,r,a=document.querySelector("article.doc"),c=[],d=a.classList.contains("static"),s=0;s<=t;s++)d?c.push(s?"h"+(s+1)+"[id]":"h1[id]"):c.push(s?".sect"+s+">h"+(s+1)+"[id]":"h1[id].sect0");if(!(o=c.join(","),i=a,n=[].slice.call((i||document).querySelectorAll(o))).length)return e.parentNode.removeChild(e);var l={},u=n.reduce((function(e,t){var n=document.createElement("a");n.textContent=t.textContent,l[n.href="#"+t.id]=n;var o=document.createElement("li");return o.dataset.level=parseInt(t.nodeName.slice(1))-1,o.appendChild(n),e.appendChild(o),e}),document.createElement("ul")),f=e.querySelector(".toc-menu");f||((f=document.createElement("div")).className="toc-menu");var m=document.createElement("h3");m.textContent=e.dataset.title||"Contents",f.appendChild(m),f.appendChild(u);var v=!document.getElementById("toc")&&a.querySelector("h1.page ~ :not(.is-before-toc)");if(v){var h=document.createElement("aside");h.className="toc embedded",h.appendChild(f.cloneNode(!0)),v.parentNode.insertBefore(h,v)}window.addEventListener("load",(function(){p(),window.addEventListener("scroll",p)}))}}function p(){var e,t=window.pageYOffset,o=1.15*g(document.documentElement,"fontSize"),i=a.offsetTop;if(t&&window.innerHeight+t+2>=document.documentElement.scrollHeight){r=Array.isArray(r)?r:Array(r||0);var c=[],d=n.length-1;return n.forEach((function(e,t){var n="#"+e.id;t===d||e.getBoundingClientRect().top+g(e,"paddingTop")>i?(c.push(n),r.indexOf(n)<0&&l[n].classList.add("is-active")):~r.indexOf(n)&&l[r.shift()].classList.remove("is-active")})),u.scrollTop=u.scrollHeight-u.offsetHeight,void(r=c.length>1?c:c[0])}if(Array.isArray(r)&&(r.forEach((function(e){l[e].classList.remove("is-active")})),r=void 0),n.some((function(t){if(t.getBoundingClientRect().top+g(t,"paddingTop")-o>i)return!0;e="#"+t.id})),e){if(e===r)return;r&&l[r].classList.remove("is-active");var s=l[e];s.classList.add("is-active"),u.scrollHeight>u.offsetHeight&&(u.scrollTop=Math.max(0,s.offsetTop+s.offsetHeight-u.offsetHeight)),r=e}else r&&(l[r].classList.remove("is-active"),r=void 0)}function g(e,t){return parseFloat(window.getComputedStyle(e)[t])}}();
-!function(){"use strict";var e=document.querySelector("article.doc"),t=document.querySelector(".toolbar");function n(e){return e&&(~e.indexOf("%")?decodeURIComponent(e):e).slice(1)}function o(t,n){return e.contains(t)?o(t.offsetParent,t.offsetTop+n):n}function i(e){e&&(window.location.hash="#"+this.id,e.preventDefault()),window.scrollTo(0,o(this,0)-t.getBoundingClientRect().bottom)}window.addEventListener("load",(function e(t){var o,c;(o=n(window.location.hash))&&(c=document.getElementById(o))&&(i.bind(c)(),setTimeout(i.bind(c),0)),window.removeEventListener("load",e)})),Array.prototype.slice.call(document.querySelectorAll('a[href^="#"]')).forEach((function(e){var t,o;(t=n(e.hash))&&(o=document.getElementById(t))&&e.addEventListener("click",i.bind(o))}))}();
+!function(){"use strict";var e=document.querySelector("article.doc")||document.body,t=document.querySelector(".toolbar")||document.querySelector(".navbar");function n(e){return e&&(~e.indexOf("%")?decodeURIComponent(e):e).slice(1)}function o(t,n){return e.contains(t)?o(t.offsetParent,t.offsetTop+n):n}function c(e){e&&(window.location.hash="#"+this.id,e.preventDefault()),window.scrollTo(0,o(this,0)-(t?t.getBoundingClientRect().bottom:0))}window.addEventListener("load",(function e(t){var o,i;(o=n(window.location.hash))&&(i=document.getElementById(o))&&(c.bind(i)(),setTimeout(c.bind(i),0)),window.removeEventListener("load",e)})),Array.prototype.slice.call(document.querySelectorAll('a[href^="#"]')).forEach((function(e){var t,o;(t=n(e.hash))&&(o=document.getElementById(t))&&e.addEventListener("click",c.bind(o))}))}();
 !function(){"use strict";var e=document.querySelector(".page-versions .version-menu-toggle");if(e){var t=document.querySelector(".page-versions");e.addEventListener("click",(function(e){t.classList.toggle("is-active"),e.stopPropagation()})),document.documentElement.addEventListener("click",(function(){t.classList.remove("is-active")}))}}();
-document.addEventListener("DOMContentLoaded",(function(){var t=Array.prototype.slice.call(document.querySelectorAll(".navbar-burger"),0);0!==t.length&&(t.forEach((function(t){t.addEventListener("click",(function(e){e.stopPropagation(),t.classList.toggle("is-active"),document.getElementById(t.dataset.target).classList.toggle("is-active"),document.documentElement.classList.toggle("is-clipped--navbar")}))})),document.documentElement.dataset.scroll=0,document.addEventListener("scroll",(()=>{document.documentElement.dataset.scroll=window.scrollY})))}));
+document.addEventListener("DOMContentLoaded",(function(){var t=Array.prototype.slice.call(document.querySelectorAll(".navbar-burger"),0);0!==t.length&&(t.forEach((function(t){var e=document.getElementById(t.dataset.target);if(e){t.setAttribute("aria-controls",t.dataset.target),t.setAttribute("aria-expanded","false");var a=function(a){t.classList.toggle("is-active",a),e.classList.toggle("is-active",a),document.documentElement.classList.toggle("is-clipped--navbar",a),t.setAttribute("aria-expanded",a?"true":"false")};t.addEventListener("click",(function(n){n.stopPropagation();var s=!t.classList.contains("is-active");if(a(s),s){var o=e.querySelector('a[href], button:not([disabled]), [tabindex]:not([tabindex="-1"])');o&&o.focus()}}));var n=function(e){var n;"Escape"!==e.key&&"Esc"!==e.key||t.classList.contains("is-active")&&(e.stopPropagation(),n=!0,a(!1),n&&t.focus())};t.addEventListener("keydown",n),e.addEventListener("keydown",n)}})),document.documentElement.dataset.scroll=0,document.addEventListener("scroll",(()=>{document.documentElement.dataset.scroll=window.scrollY})))}));
 !function(){"use strict";var e=/^\$ (\S[^\\\n]*(\\\n(?!\$ )[^\\\n]*)*)(?=\n|$)/gm,t=/( ) *\\\n *|\\\n( ?) */g,a=/ +$/gm,n=window.navigator.clipboard;function i(n){var i=n.innerText.replace(a,"");"console"===n.dataset.lang&&i.startsWith("$ ")&&(i=function(a){for(var n,i=[];n=e.exec(a);)i.push(n[1].replace(t,"$1$2"));return i.join(" && ")}(i)),window.navigator.clipboard.writeText(i).then(function(){this.classList.add("clicked"),setTimeout(function(){this.classList.remove("clicked")}.bind(this),1e3)}.bind(this),(function(){}))}[].slice.call(document.querySelectorAll(".doc pre.highlight, .doc .literalblock pre")).forEach((function(e){var t,a,c,l,o,s;if(e.classList.contains("highlight"))(a=(t=e.querySelector("code")).dataset.lang)&&"console"!==a&&((c=document.createElement("span")).className="source-lang",c.appendChild(document.createTextNode(a)));else{if(!e.innerText.startsWith("$ "))return;var d=e.parentNode.parentNode;d.classList.remove("literalblock"),d.classList.add("listingblock"),e.classList.add("highlightjs","highlight"),(t=document.createElement("code")).className="language-console hljs",t.dataset.lang="console",t.appendChild(e.firstChild),e.appendChild(t)}(s=document.createElement("div")).className="source-toolbox",c&&s.appendChild(c),n&&((l=document.createElement("button")).className="copy-button",l.setAttribute("title","Copy to clipboard"),l.setAttribute("aria-label","Copy to clipboard"),(o=document.createElement("span")).className="copy-toast",o.appendChild(document.createTextNode("Copied!")),l.appendChild(o),s.appendChild(l)),e.appendChild(s),l&&l.addEventListener("click",i.bind(l,t))}))}();
 !function(){"use strict";var e=document.querySelectorAll(".blog .post-content img:not(.featured)");if(e.length){var t=document.createElement("div");t.className="image-zoom-overlay",document.body.appendChild(t),[].slice.call(e).forEach((function(e){e.addEventListener("click",(function(e){e.stopPropagation();var o=this.cloneNode(!0);o.classList.remove("zoomed"),t.innerHTML="",t.appendChild(o),t.classList.add("active"),o.addEventListener("click",(function(e){e.stopPropagation(),n()}))}))})),t.addEventListener("click",(function(e){e.target===t&&n()})),document.addEventListener("keydown",(function(e){"Escape"===e.key&&n()}))}function n(){t.classList.remove("active"),t.innerHTML=""}}();
 !function(){"use strict";var n=["/camel-k/","/camel-quarkus/","/camel-spring-boot/","/camel-kafka-connector/","/camel-kamelets/","/camel-karaf/"],e=["/manual/","/user-guide/","/architecture/","/getting-started/","/faq/"];function r(n,e){return!!n&&e.some((function(e){return-1!==n.indexOf(e)}))}function t(n){return r(n,e)}function c(n){return!!n&&-1!==n.indexOf("/components/")}var a=["lvl6","lvl5","lvl4","lvl3","lvl2","lvl1","lvl0"];document.addEventListener("DOMContentLoaded",(function(){window.docsearch&&document.getElementById("docsearch")&&window.docsearch({container:"#docsearch",appId:"V62SL4FFIW",apiKey:"1b7e52df4759e32dd49adedb286997f6",indices:[{name:"apache_camel",searchParameters:{hitsPerPage:75}}],transformItems:function(e){return function(n){return n.map((function(n){var e=n.hierarchy||{},r=a.find((function(n){return e[n]}));return Object.assign({},n,{type:r||"content"})}))}(function(n){return n.slice().sort((function(n,e){var r=t(n.url);if(r!==t(e.url))return r?-1:1;var a=c(n.url);return a!==c(e.url)?a?1:-1:0}))}(function(n){var e={};return n.filter((function(n){var r=function(n){if(!n)return"";var e=n.split("#")[0];return e.endsWith("/")?e.slice(0,-1):e}(n.url);return e[r]=(e[r]||0)+1,e[r]<=2}))}(e.filter((function(e){return!r(e.url,n)})))))}})}))}();
-document.addEventListener("DOMContentLoaded",(function(){var e=function(e){return".*"+e+".*"},n=document.querySelector(".nav-panel-menu input.search");if(n){var t=document.querySelectorAll(".nav-link");n.addEventListener("keyup",(function(){for(var r=n.value.split(""),i=new RegExp(r.map(e).join(""),"i"),a=0;a"+o[u]+"",l=++u;u footer .footer-column > dt"));if(0!==e.length){var t=function(e){if(!e.querySelector(".footer-column-toggle")){var t=document.createElement("button");for(t.type="button",t.className="footer-column-toggle",t.setAttribute("aria-expanded","false");e.firstChild;)t.appendChild(e.firstChild);t.addEventListener("click",(function(){!function(e){e.setAttribute("aria-expanded","true"===e.getAttribute("aria-expanded")?"false":"true")}(t)})),e.appendChild(t)}},o=function(e){var t=e.querySelector(".footer-column-toggle");if(t){for(;t.firstChild;)e.appendChild(t.firstChild);e.removeChild(t)}},i=window.matchMedia("(width <= 1024px)"),r=function(){e.forEach(i.matches?t:o)};r(),i.addEventListener("change",r)}}();
+!function(){"use strict";var e=/([.,/:_])/,t=/([a-z0-9])(?=[A-Z])/g,n=/[a-z0-9][A-Z]|\S[.,/:_]\S/,c=function(c){var o=c.nodeValue;if(new RegExp("[^\\s]{5,}").test(o)){var r=document.createDocumentFragment(),a=!1;o.split(/(\s+)/).forEach((function(c){if(c.length>=5&&n.test(c)){var o=document.createElement("span");o.className="identifier",c.length>=12?function(n,c){n.split(e).forEach((function(n){if(n)return e.test(n)&&1===n.length?(c.appendChild(document.createTextNode(n)),void c.appendChild(document.createElement("wbr"))):void n.replace(t,"$1\0").split("\0").forEach((function(e,t,n){c.appendChild(document.createTextNode(e)),t
 
{{else}} +{{#with page.component.title}} +
{{this}}
+{{/with}} {{#with page.title}}

{{{this}}}

{{/with}} diff --git a/antora-ui-camel/public/_/partials/footer-content.hbs b/antora-ui-camel/public/_/partials/footer-content.hbs index 04ee38e86c4..c46707101ac 100644 --- a/antora-ui-camel/public/_/partials/footer-content.hbs +++ b/antora-ui-camel/public/_/partials/footer-content.hbs @@ -1,53 +1,30 @@ - diff --git a/antora-ui-camel/public/_/partials/footer-scripts.hbs b/antora-ui-camel/public/_/partials/footer-scripts.hbs index 3b0ab6266e3..e27c27e69df 100644 --- a/antora-ui-camel/public/_/partials/footer-scripts.hbs +++ b/antora-ui-camel/public/_/partials/footer-scripts.hbs @@ -1,5 +1,5 @@ - + diff --git a/antora-ui-camel/public/_/partials/head-styles.hbs b/antora-ui-camel/public/_/partials/head-styles.hbs index c8c25b1e59d..ea9f0cf4aeb 100644 --- a/antora-ui-camel/public/_/partials/head-styles.hbs +++ b/antora-ui-camel/public/_/partials/head-styles.hbs @@ -1,5 +1,5 @@ - + {{!-- NOTE the asciinema partials are injected into the UI catalog by @springio/antora-extensions at Antora build time, so they only exist during a site build. Guarding on the page attribute the extension sets keeps the assets off pages with no cast, diff --git a/antora-ui-camel/public/_/partials/header-content.hbs b/antora-ui-camel/public/_/partials/header-content.hbs index c7607ed53f1..ca6cb8f653c 100644 --- a/antora-ui-camel/public/_/partials/header-content.hbs +++ b/antora-ui-camel/public/_/partials/header-content.hbs @@ -1,29 +1,23 @@ -
+
{{ end }} + - + + + {{ partial "footer.html" . }} diff --git a/layouts/blog/list.html b/layouts/blog/list.html index 791c41bea30..1460599e9e6 100644 --- a/layouts/blog/list.html +++ b/layouts/blog/list.html @@ -1,41 +1,41 @@ {{ partial "header.html" . }}
- - -
-
- {{ $filtered := slice }} - {{ range .Pages }} - {{/* hide posts where Releases is the only category */}} - {{ $cats := default slice .Params.categories }} - {{ if not (and (in $cats "Releases") (eq (len $cats) 1)) }} - {{ $filtered = $filtered | append . }} + + RSS feed → + + +
+

Blog

+

Release notes, roadmap updates, and engineering notes from the Camel team and community.

+ +
+ {{ $filtered := slice }} + {{ range .Pages }} + {{/* hide release posts; they stay listed under the Releases category */}} + {{ $cats := default slice .Params.categories }} + {{ if not (in $cats "Releases") }} + {{ $filtered = $filtered | append . }} + {{ end }} {{ end }} - {{ end }} - {{ $pages := (.Paginate $filtered 3).Pages }} - {{ range $pages }} - {{ .Render "summary" }} - {{ end }} + {{ $pages := (.Paginate $filtered 3).Pages }} + {{ range $pages }} + {{ .Render "summary" }} + {{ end }} +
{{ $page := .Paginator }} {{ if gt $page.TotalPages 1 }} @@ -70,8 +70,7 @@

Categories

{{ if $page.HasNext }}
  • - + Next →
  • {{ end }} @@ -84,8 +83,11 @@

    Categories

    {{ end }} +
    -
    + +
    + {{ partial "footer.html" . }} diff --git a/layouts/blog/post.html b/layouts/blog/post.html index ad17d0b66f3..cbb844001b1 100644 --- a/layouts/blog/post.html +++ b/layouts/blog/post.html @@ -1,70 +1,90 @@ -
    +
    +
    + ← All posts -
    - {{ if .Params.categories }} - {{ range .Params.categories }}{{ upper . }}{{ end }} - {{ end }} -

    {{ .Title }}

    -
    -
    - + +
    {{ $featured := (.Resources.ByType "image").GetMatch "*featured*" }} {{ if not $featured }} {{ $featured = resources.Get "img/default-featured.jpg" }} @@ -79,15 +99,21 @@

    Share this blog

    {{ end }} {{ end }} {{ .Content }} - +
    +
    - -
    diff --git a/layouts/blog/summary.html b/layouts/blog/summary.html index 1241856c4a7..d097ad33e29 100644 --- a/layouts/blog/summary.html +++ b/layouts/blog/summary.html @@ -1,21 +1,26 @@ -
    - -
    -

    {{ .Title }}

    - {{ $headers := dict }} - {{ with os.Getenv "GITHUB_TOKEN" }} - {{ $headers = dict "Authorization" (printf "Bearer %s" .) }} - {{ else }} - {{ $headers = dict "Authorization" (printf "Basic %s" (printf "%s:%s" $.Site.Params.GitHubUsername $.Site.Params.GitHubToken | base64Encode)) }} +
    + +
    + {{ with .Params.categories }} + {{ end }} - , by {{ range $idx, $author := .Params.authors }}{{ if gt $idx 0 }}, {{ end }}{{ end }} -
    -

    {{ .Summary }}

    -

    Continue reading ❯

    -

    - {{ if .Params.categories }} - {{ range .Params.categories }}{{ upper . }}{{ end }} - {{end}} -

    - +

    {{ .Title }}

    +

    {{ with .Params.preview }}{{ . }}{{ else }}{{ $.Summary | plainify }}{{ end }}

    + +
    diff --git a/layouts/community/list.html b/layouts/community/list.html new file mode 100644 index 00000000000..c92b318a1b3 --- /dev/null +++ b/layouts/community/list.html @@ -0,0 +1,41 @@ +{{ partial "header.html" . }} +{{- $data := .Site.Data.community }} + +
    +
    +
    + +
    +
    +
    + +{{ partial "footer.html" . }} diff --git a/layouts/community/single.html b/layouts/community/single.html new file mode 100644 index 00000000000..c0dcb3a5a9d --- /dev/null +++ b/layouts/community/single.html @@ -0,0 +1,52 @@ +{{ partial "header.html" . }} + +
    +
    +
    +
    + +
    + {{ with .Title }} +

    {{ . }}

    + {{ end }} + + {{ .Content }} +
    + +
    +
    +
    + +{{ partial "footer.html" . }} diff --git a/layouts/docs/list.html b/layouts/docs/list.html new file mode 100644 index 00000000000..aa74eb7f97d --- /dev/null +++ b/layouts/docs/list.html @@ -0,0 +1,69 @@ +{{ partial "header.html" . }} +{{- $data := index site.Data "docs-projects" }} + +
    +
    +
    +
    + +
    +

    {{ .Title }}

    +

    {{ $data.lead }}

    +
    + +
    +
    +

    {{ $data.manual.eyebrow }}

    +

    {{ $data.manual.title }}

    +

    {{ $data.manual.desc }}

    +

    + {{ $data.manual.primary_cta.label }} + {{ $data.manual.secondary_cta.label }} +

    + +
    +
    +

    {{ $data.components.eyebrow }}

    +

    {{ $data.components.title }}

    +

    {{ $data.components.desc }}

    +

    + {{ $data.components.primary_cta.label }} + {{ $data.components.secondary_cta.label }} +

    + {{- with $data.components.links }} + + {{- end }} +
    +
    + + +
      + {{- range $data.projects }} + {{- $p := . }} +
    • +
      + +

      {{ .name }}

      +
      +

      {{ .desc }}

      + +
    • + {{- end }} +
    + +
    +
    +
    +
    + +{{ partial "footer.html" . }} diff --git a/layouts/download/list.html b/layouts/download/list.html new file mode 100644 index 00000000000..8c02ff4ce70 --- /dev/null +++ b/layouts/download/list.html @@ -0,0 +1,47 @@ +{{ partial "header.html" . }} + +
    +
    +
    + +
    +
    +

    {{ .Title }}

    + {{ .Content }} +
    + +
    +
    Camel CLI Launcher
    +

    Install on a single machine with a one-line command, without a package manager.

    + {{ with .Params.cli_command }} +
    + $ {{ . }} + +
    + {{ end }} + Installation guide → +
    +
    + + + + {{ range sort (index site.Data "release-categories") "order" }} + {{ partial "download/rows.html" (dict "Category" . "Pages" site.Pages) }} + {{ end }} + +
    +
    +

    SBOMs

    +

    {{ .Params.sbom_card_body | markdownify }}

    +
    +
    +

    Verify your download

    +

    {{ .Params.verify_card_body | markdownify }}

    +
    +
    + +
    +
    +
    + +{{ partial "footer.html" . }} diff --git a/layouts/index.html b/layouts/index.html index fc1a1344f86..0018d2d8552 100644 --- a/layouts/index.html +++ b/layouts/index.html @@ -1,48 +1,252 @@ {{ partial "header.html" . }} +{{- $home := .Site.Data.home }} -
    -
    -

    Apache Camel

    -

    - Camel is an Open Source integration framework that empowers you - to quickly and easily integrate various systems consuming or producing data. -

    -

    - Get Started What is Camel? +

    + + {{/* home-lead is the full-bleed dark band behind the header and hero. It + reaches up under the fixed navbar, which header.css darkens on the home + page to match, and its bottom padding is the ground the get-started + tiles overlap. The logo is decoration here, cropped off the right edge; + the h1 already names the page. */}} + {{- with $home.hero }} +
    + +
    +

    {{ .eyebrow }}

    +

    {{ .title }}

    +

    {{ .tagline }}

    +

    {{ .lead }}

    +

    + {{ .primary_cta.label }} + {{ .secondary_cta.label }} +

    +
    +
    + {{- end }} + + {{/* Three tiles as tabs over one terminal, so every path is visible at once + and each command gets the full width instead of scrolling in a third of + it. Same tab pattern as the route example below: 09-home.js drives every + tablist on the page, and without JS the first panel shows. */}} + {{- with $home.get_started }} +
    +

    {{ .eyebrow }}

    +
    + {{- range $i, $item := .items }} + + {{- end }} +
    + {{- range $i, $item := .items }} + {{- $code := trim .code "\n" }} +
    +
    + + {{ .name }} + +
    + {{/* A prompt on each command, not on the indented lines that continue + one. user-select: none keeps it out of a manual copy. */}} +
    +        {{- range split $code "\n" -}}
    +        {{ if not (hasPrefix . " ") }}$ {{ end }}{{ . }}
    +{{ end -}}
    +      
    + Start with {{ .name }} → +
    + {{- end }} +
    + {{- end }} + + {{- with $home.stats }} +
    +
    + {{/* `if` rather than `with` so . stays bound to the stats map. */}} +

    + {{- if .url }}{{ .label }}{{ else }}{{ .label }}{{ end -}} +

    +
      + {{- range .items }} +
    • + {{ .num }} + {{ .label }} +
    • + {{- end }} +
    +
    +
    + {{- end }} + + {{/* The worked example comes before the feature grid: a visitor who has just + picked a runtime above should see what a route actually looks like + before being asked to read another set of cards. It carries the band so + the cream/sand alternation still runs down the page. */}} + {{- with $home.example }} + {{/* home-band is the full-bleed wrapper: home-section keeps its own max-width + and centring, so the tint has to come from an element outside it. Same + split as home-stats / home-stats-inner. */}} +
    +
    +
    +

    {{ .eyebrow }}

    +

    {{ .heading }}

    +

    {{ .subhead }}

    +
    +
    +
    + {{- range $i, $tab := .tabs }} + + {{- end }} +
    + {{- range $i, $tab := .tabs }} + + {{- end }} +

    + $ + {{ .run_command }} +

    +
    +
    +
    + {{- end }} + + {{- with $home.features }} +
    +
    +

    {{ .eyebrow }}

    +

    {{ .heading }}

    +
    +
      + {{- range .items }} +
    • + {{ .tag }} +

      {{ .title }}

      +

      {{ .body }}

      +
    • + {{- end }} +
    +
    + {{- end }} + + {{- with $home.tiles }} + {{/* + id="apache-camel-projects" is a compatibility anchor, not a styling hook. The old + home page carried a "# Apache Camel Projects" heading, which blackfriday heading + IDs (config.toml autoHeadingIDType) rendered as this id. Inbound links point at + /#apache-camel-projects, including a 2022 post under content/blog/2022/10/ (grep + the tree for the anchor). Dropping it turns `yarn check:links` red. Keep it on + whichever element holds the project tiles. + */}} +
    +
    +
    +

    {{ .eyebrow }}

    +

    {{ .heading }}

    +

    {{ .subhead }}

    +
    +
      + {{- range .items }} +
    • + +

      {{ .name }}

      +

      {{ .description }}

      + Read more → +
    • + {{- end }} +
    +

    + {{ .cta.label }}

    +
    - Computer with gears depicting data processing -
    - -
    -

    What's New?

    -
    - -
    -
      - {{with .Site.GetPage "section" "blog"}} - {{range .Pages | first 3}} - -
    • - -
      -

      {{ .Title }}

      -

      {{ .Params.preview }}... Read More

      -
      + {{- end }} + + {{- with $home.news }} +
      +
      +

      {{ .eyebrow }}

      +

      {{ .heading }}

      +
      +
        + {{- range first 3 (where site.RegularPages "Section" "blog").ByDate.Reverse }} +
      • + +

        {{ .Title }}

        + {{/* Release announcements often set preview to the post title verbatim. + Printing that repeats the heading inside its own card; dropping it + leaves the card visibly shorter than its neighbours. Fall back to + the post's own summary instead, which is the first prose in the + body. Bound to variables because `with` would rebind . and $ is the + home page here, not the post. */}} + {{- $title := trim .Title " " }} + {{- $preview := trim (.Params.preview | default "") " " }} + {{- if or (not $preview) (eq $preview $title) }} + {{- $preview = trim (.Summary | plainify | htmlUnescape) " \n" }} + {{- end }} + {{- if and $preview (ne $preview $title) }} +

        {{ $preview | truncate 150 }}

        + {{- end }}
      • - {{end}} - {{end}} -
      -
      + {{- end }} +
    +

    + {{ .cta.label }} +

    +
    + {{- end }} + + {{- with $home.closing }} +
    +
    +
    +

    {{ .heading }}

    +

    {{ .body }}

    +
    +

    + {{ .primary_cta.label }} + {{ .secondary_cta.label }} +

    +
    +
    + {{- end }} -{{ .Content }} + {{ partial "footer.html" . }} diff --git a/layouts/partials/download/rows.html b/layouts/partials/download/rows.html new file mode 100644 index 00000000000..9bec0881deb --- /dev/null +++ b/layouts/partials/download/rows.html @@ -0,0 +1,159 @@ +{{/* + Renders the "Supported releases" flat row list for a single release category + on the /download/ page. + + This is a deliberate FORK of layouts/partials/releases/downloads.html's + version-selection algorithm, not a call into it: that shared partial is still + used, unmodified, by the per-release "single" page templates + (layouts/partials/releases/camel.html and friends) to render a table on the + release-note detail page, a screen this piece does not touch. Forking here + keeps that screen's behavior byte-for-byte unchanged while letting this + screen emit a completely different row shape (flat rows, no , no + rowspan) around the same underlying data. + + Params: Category (a value from site.Data.release-categories), Pages (site.Pages) +*/}} +{{ $category := .Category }} +{{ $pages := .Pages }} + +{{ $sha1_cutoff := time "2018-11-10" }} +{{ $sbom_cutoff := time "2023-11-14" }} +{{ $artifact_base_url := "https://www.apache.org/dyn/closer.lua/" }} +{{ $meta_base_url := "https://downloads.apache.org/" }} + +{{ $versions := slice }} +{{ $category_releases := where (where $pages "Section" "releases") ".Params.category" $category.id }} + +{{ range $kind := $category.kinds }} + {{ if eq $kind.filter "latest" }} + {{ $released_versions := partial "releases/version_sort.html" $category_releases }} + {{ $version := (index $released_versions 0).Param "version" }} + {{ $versions = $versions | append (dict $kind.name $version) }} + {{ else }} + {{ $released_versions := partial "releases/version_sort.html" $category_releases }} + {{ if $kind.last }} + {{ $last_major_minor := "" }} + {{ $no_last := 0 }} + {{ range $release := where $released_versions ".Params.kind" $kind.filter }} + {{ $version := $release.Param "version" }} + {{ $major_minor := replaceRE "\\.\\d+$" "" $version }} + {{ if (and (ne $last_major_minor $major_minor) (lt $no_last $kind.last)) }} + {{ $versions = $versions | append (dict $kind.name $version) }} + {{ $no_last = $no_last | add 1 }} + {{ end }} + {{ $last_major_minor = $major_minor }} + {{ end }} + {{ else }} + {{ $version := (index (where $released_versions ".Params.kind" $kind.filter) 0).Param "version" }} + {{ $versions = $versions | append (dict $kind.name $version) }} + {{ end }} + {{ end }} +{{ end }} + +{{/* same version can be matched by two kinds (e.g. latest is also the newest LTS); merge */}} +{{ $versions_grouped := slice }} +{{ range $version1 := $versions }} + {{ $groupped := false }} + {{ range $k1, $v1 := $version1 }} + {{ range $version2 := $versions }} + {{ range $k2, $v2 := $version2 }} + {{ if and (eq $v1 $v2) (ne $k1 $k2) }} + {{ $groupped = true }} + {{ $kind := printf "%s, %s" $k1 $k2 }} + {{ $contained := false }} + {{ range $g := $versions_grouped }} + {{ range $x, $v := $g }} + {{ if eq $v $v1 }} + {{ $contained = true }} + {{ end }} + {{ end }} + {{ end }} + {{ if not $contained }} + {{ $versions_grouped = $versions_grouped | append (dict $kind $v1) }} + {{ end }} + {{ end }} + {{ end }} + {{ end }} + {{ end }} + {{ if not $groupped }} + {{ $versions_grouped = $versions_grouped | append $version1 }} + {{ end }} +{{ end }} +{{ $versions = $versions_grouped }} + +{{/* wrapping id preserves the pre-existing per-category anchor (e.g. /download/#camel-k) */}} +
    + {{ range $version := $versions }} + {{ range $kind, $v := $version }} + {{ $release_note := index (where $category_releases ".Params.version" $v) 0 }} + {{ $hash_extension := ".sha512" }} + {{ if le $release_note.Date $sha1_cutoff }} + {{ $hash_extension = ".sha1" }} + {{ end }} + + {{ $downloads := $category.downloads }} + {{ if lt $release_note.Date $sbom_cutoff }} + {{ $downloads = collections.Where $downloads "name" "not in" "SBOM, CycloneDX XML" }} + {{ $downloads = collections.Where $downloads "name" "not in" "SBOM, CycloneDX JSON" }} + {{ $downloads = collections.Where $downloads "name" "not in" "SBOM" }} + {{ end }} + + {{ $is_lts := in $kind "LTS" }} + + {{ $note := "" }} + {{ with $release_note.Params.jdk }} + {{ $note = printf "Supports Java %s" (delimit . ", " " and ") }} + {{ end }} + {{ with $release_note.Params.eol }} + {{ $note = print $note (printf ", end of life %s" (dateFormat "Jan 2006" .)) }} + {{ end }} + +
    +
    +
    {{ $category.name }}
    +
    {{ ($release_note.Param "date").Format "Jan 2006" }}
    +
    +
    + {{ $v }} + {{ if $is_lts }}LTS{{ end }} +
    +
    {{ $note }}
    + +
    + {{ end }} + {{ end }} +
    diff --git a/layouts/partials/footer.html b/layouts/partials/footer.html index 953a85f43db..70b23ba0305 100644 --- a/layouts/partials/footer.html +++ b/layouts/partials/footer.html @@ -1,57 +1,38 @@ -
    + {{/* Inside the footer so this line belongs to the contentinfo landmark + rather than sitting between two of them. It is positioned out of + flow, so it still paints above the footer's dark band. */}} + + {{ range $chrome.columns }} + + {{ end }}

    © 2004-{{ now.Format "2006" }} The Apache Software Foundation.
    Apache Camel, Camel, Apache, the Apache feather logo, and the Apache Camel project logo are trademarks of @@ -62,22 +43,16 @@ {{ end }}

    + {{ range $chrome.legal }} - - + {{ end }}
    diff --git a/layouts/partials/header.html b/layouts/partials/header.html index bd7799c7da3..d7855927b2a 100644 --- a/layouts/partials/header.html +++ b/layouts/partials/header.html @@ -54,31 +54,30 @@ + {{ $ctaLabel := "Download" }} + {{ $ctaURL := "/download/" }} + {{ if or .Page.IsHome (eq .Page.RelPermalink "/projects/") }} + {{ $ctaLabel = "Get Started" }} + {{ $ctaURL = "/manual/getting-started.html" }} + {{ end }}
    - {{ if eq $.Section "download" }} - - - {{ end }} @@ -144,37 +134,6 @@

    { {{ end }}

    - {{ if eq $.Section "download" }} - {{ if gt (len $downloads) 1 }} - - {{ if gt (len $downloads) 1 }} - - {{ end }} {{ range $idx, $download := $downloads }} {{ if ne $idx 0 }} @@ -185,7 +144,7 @@

    {

    {{ else }} - + {{ end }} {{ end }} diff --git a/layouts/partials/releases/release-table.html b/layouts/partials/releases/release-table.html index 7d705621a48..f839734c7de 100644 --- a/layouts/partials/releases/release-table.html +++ b/layouts/partials/releases/release-table.html @@ -1,22 +1,20 @@ -
    VersionNoteDownload Signature and checksum
    - {{ else }} - - {{ end }} - {{ $v }} - {{ with $kind }} -
    - {{ . }} - {{ end }} -
    - {{ else }} - - {{ end }} - Release notes -
    - {{ with (index (where (where (where $.Pages "Section" "releases") ".Params.category" $.Category.id) ".Params.version" $v) 0) }} - - {{ with .Params.jdk }} - Supports Java {{ delimit . ", " " and " }} -
    - {{ end }} - Released in {{ (.Param "date").Format "Jan 2006" }}{{ if .Param "eol" }}, end of life in {{ dateFormat "Jan 2006" (.Param "eol") }} - {{ end }} -
    - {{ end }} -
    {{ $filename }} ({{ $download.name}}) PGP Signature, SHA512 Checksum{{ replace .title "{version}" $v }}{{ replace .title "{version}" $v }}
    - +
    - Releases by release date -
    - - - + + + {{ range . }} - - + + {{ end }} diff --git a/layouts/projects/list.html b/layouts/projects/list.html new file mode 100644 index 00000000000..afa918b8c90 --- /dev/null +++ b/layouts/projects/list.html @@ -0,0 +1,61 @@ +{{ partial "header.html" . }} +{{- $data := .Site.Data.projects }} + +
    +
    +
    +
    + +
    + ← Back to home +

    {{ .Title }}

    +

    {{ $data.intro }}

    +
    + +
    +

    Primary projects

    +
      + {{- range $data.primary }} + {{- $project := . }} +
    • + +

      {{ .name }}

      +

      {{ .description }}

      +

      {{ .stats }}

      +
      + {{- with .docs }}Read more →{{ end }} + {{- with .source }}Source{{ end }} +
      +
    • + {{- end }} +
    +
    + +
    +

    Specialized & ecosystem projects

    +
      + {{- range $data.specialized }} + {{- $project := . }} +
    • + +
      +

      {{ .name }}

      +

      {{ .description }}

      +
      + {{ .stats }} + {{- with .docs }}Read more →{{ end }} + {{- with .source }}Source{{ end }} +
      +
      +
    • + {{- end }} +
    +

    {{ $data.footnote }}

    +
    + +
    +
    +
    +
    + +{{ partial "footer.html" . }} diff --git a/layouts/release-note/single.html b/layouts/release-note/single.html index 389489e250c..36819cbc5f4 100644 --- a/layouts/release-note/single.html +++ b/layouts/release-note/single.html @@ -16,5 +16,5 @@

    Keys

    You can verify your download by following these procedures and using these KEYS.

    - + {{ partial "footer.html" . }} diff --git a/layouts/releases/list.html b/layouts/releases/list.html index 7c6b4905fb6..0f41401c793 100644 --- a/layouts/releases/list.html +++ b/layouts/releases/list.html @@ -1,23 +1,33 @@ {{ partial "header.html" . }} -
    -
    - {{ .Content }} +
    +
    +
    + -

    - On this page you'll find archived releases of: -

    - {{ range $category := sort (index .Site.Data "release-categories") ".order" }} -
    Apache {{ $category.name }}
    - {{ end }} -
    -

    +
    +
    +

    {{ .Title }}

    +

    Every release of every Camel project, newest first. + Supported releases are on the Download page.

    +
    - {{ range $category := sort (index .Site.Data "release-categories") ".order" }} -

    Releases of {{ $category.name }}

    - {{ partial "releases/release-table.html" (where (where $.Site.Pages "Section" "releases") ".Params.category" $category.id) }} - {{ end }} -
    -
    + {{ range $category := sort (index site.Data "release-categories") ".order" }} +
    +

    Releases of {{ $category.name }}

    + {{ partial "releases/release-table.html" (where (where site.Pages "Section" "releases") ".Params.category" $category.id) }} +
    + {{ end }} +
    +
    +
    + {{ partial "footer.html" . }} diff --git a/layouts/security-advisory/single.html b/layouts/security-advisory/single.html index e29c59d27c5..d06d86fb64a 100644 --- a/layouts/security-advisory/single.html +++ b/layouts/security-advisory/single.html @@ -1,36 +1,76 @@ {{ partial "header.html" . }}
    -
    -
    - -

    Apache Camel security advisory: {{ .Params.cve }}

    -

    Severity

    - {{ .Params.severity }} -

    Summary

    - {{ .Params.summary }} -

    Versions affected

    - {{ .Params.affected }} -

    Versions fixed

    - {{ .Params.fixed }} -

    Description

    - {{ .Params.description }} - {{ with .Content }} -

    Notes

    - {{ . }} - {{ end }} -

    Mitigation

    - {{ .Params.mitigation | markdownify }} -

    Credit

    - {{ .Params.credit }} -

    References

    -
    -
    PGP signed advisory data: {{ .Params.cve }}.txt.asc
    -
    Mitre CVE Entry: https://www.cve.org/CVERecord?id={{ .Params.cve }}
    -
    - -
    -
    +
    +
    + ← Security advisories + +
    +
    +
    Apache Camel security advisory
    +

    {{ .Params.cve }}

    +

    {{ .Params.summary }}

    + + {{ with .Params.description }} +
    +

    Description

    +

    {{ . }}

    +
    + {{ end }} + + {{ with .Params.mitigation }} +
    +

    Mitigation

    + {{/* div, not p: markdownify emits block elements for multi-paragraph bodies */}} +
    {{ . | markdownify }}
    +
    + {{ end }} + + {{ with .Params.credit }} +
    +

    Credit

    +

    {{ . }}

    +
    + {{ end }} + + {{ with .Content }} +
    +

    Notes

    +
    {{ . }}
    +
    + {{ end }} + +
    +

    References

    + +
    +
    + + +
    +
    +
    {{ partial "footer.html" . }} diff --git a/layouts/security/list.html b/layouts/security/list.html index e82dc8dcfa3..a265aaa82d6 100644 --- a/layouts/security/list.html +++ b/layouts/security/list.html @@ -2,19 +2,49 @@
    -
    +
    - {{ .Content }} +
    +

    {{ .Title }}

    +

    {{ .Params.lead }}

    +
    + +
    +
    +
    {{ .Params.read_first.eyebrow }}
    +

    {{ .Params.read_first.title }}

    + {{ .Params.read_first.body | markdownify }} +
    + +
    +

    {{ .Params.sbom.title }}

    +

    {{ .Params.sbom.body | markdownify }}

    +
    + +
    +

    {{ .Params.policy_enforcement.title }}

    + {{ .Params.policy_enforcement.body | markdownify }} +
    + +
    +
    +

    {{ .Params.reporting.title }}

    + {{ .Params.reporting.body | markdownify }} +
    + {{ .Params.reporting.cta_label }} → +
    +
    + +
    -
    VersionRelease dateDescriptionVersionRelease dateDescription
    - {{ .Params.version }} + {{ .Params.version }} + {{ if eq .Params.kind "lts" }}LTS{{ end }} {{ .Date | dateFormat "2006-01-02" }}{{ .Params.preview }}{{ .Date | dateFormat "2006-01-02" }}{{ .Params.preview }}
    - +
    Security advisories by year
    - - - - - + + + + + @@ -32,14 +62,14 @@ {{ range $pages }} {{ if eq $year (int .Key) }} - + {{ range .Pages }} - + - + {{ end }} @@ -47,7 +77,7 @@ {{ end }} {{ else }} - + diff --git a/layouts/shortcodes/downloads.html b/layouts/shortcodes/downloads.html deleted file mode 100644 index d7483e7e5c6..00000000000 --- a/layouts/shortcodes/downloads.html +++ /dev/null @@ -1,3 +0,0 @@ -{{ range $x, $category := sort (index $.Site.Data "release-categories") "order" }} - {{ partial "releases/downloads.html" (dict "Category" (index (index $.Site.Data "release-categories") $category.id) "Pages" $.Site.Pages "Section" $.Page.Section) }} -{{ end }} diff --git a/layouts/shortcodes/section.html b/layouts/shortcodes/section.html deleted file mode 100644 index 61e4506fe2b..00000000000 --- a/layouts/shortcodes/section.html +++ /dev/null @@ -1,4 +0,0 @@ -
    - {{ $content := .Inner | markdownify }} - {{ $content | safeHTML }} -
    diff --git a/layouts/sitemap/sitemap.html b/layouts/sitemap/sitemap.html index 4a9d60af0b3..f9a772e4450 100644 --- a/layouts/sitemap/sitemap.html +++ b/layouts/sitemap/sitemap.html @@ -1,7 +1,7 @@ {{ partial "header.html" . }}
    -
    +

    {{ .Title }}

    diff --git a/layouts/tooling/list.html b/layouts/tooling/list.html new file mode 100644 index 00000000000..22cf4a7affc --- /dev/null +++ b/layouts/tooling/list.html @@ -0,0 +1,116 @@ +{{ partial "header.html" . }} +{{- $data := site.Data.tooling }} +{{- $tui := .Resources.GetMatch "camel-tui-overview.png" }} + +
    +
    +
    +
    +
    +

    {{ .Title }}

    +

    {{ $data.lead }}

    + +
    +

    Camel CLI

    +

    + The Camel CLI, powered by JBang, + lets you get started with Camel instantly — no project setup, no + build tool configuration. Install it once, then use the + camel command to develop, run, test, and export your + integrations. +

    +
    + {{- range $data.cliCommands }} +
    + {{ .cmd }} + {{ .desc }} +
    + {{- end }} +
    +

    + See the Camel CLI documentation + for installation instructions and detailed usage. +

    +
    + +
    +
    +

    Camel TUI

    +

    + The camel tui command launches a full terminal-based + UI with route status, message flow, and tracing in a single view + — plus a built-in mini source editor for YAML DSL routes with + context-aware Tab completion, validation on save, and inline + quick docs. +

    +

    + See the Camel TUI documentation for more details. +

    +
    +
    + {{- with $tui }} + Camel TUI Overview — four running integrations with live throughput chart and log + {{- end }} +
    +
    + +
    +

    AI-assisted development

    +

    Camel MCP Server

    +

    + Connects Apache Camel to AI coding assistants through the + Model Context Protocol. + It gives AI tools access to Camel's component catalog, DSL + documentation, and integration patterns — so they can help you + write, debug, and optimize Camel routes with full context. + Supported tools include Claude Code, GitHub Copilot, Gemini CLI, + Cursor, Windsurf, and any MCP-compatible assistant. See the + Camel MCP Server documentation. +

    +
    + {{- range $data.aiTools }} +
    + {{ .name }} +

    {{ .desc }}

    +
    + {{- end }} +
    +
    + + {{- range $data.toolGroups }} + {{- $g := . }} +
    +

    {{ .title }}

    + {{- with .intro }}

    {{ if $g.htmlIntro }}{{ . | safeHTML }}{{ else }}{{ . }}{{ end }}

    {{ end }} +
    + {{- range .items }} +
    + {{- if .url }} + {{ .name }} + {{- else }} + {{ .name }} + {{- end }} +

    {{ if .htmlDesc }}{{ .desc | safeHTML }}{{ else }}{{ .desc }}{{ end }}

    +
    + {{- end }} +
    +
    + {{- end }} + +

    If you are using or have developed + tooling for Apache Camel please add an entry via a + pull request; + or post to the mailing list.

    +
    + + +
    +
    +
    +
    + +{{ partial "footer.html" . }} diff --git a/llms-txt-template.md b/llms-txt-template.md index 179a885ca8a..cf0919d4896 100644 --- a/llms-txt-template.md +++ b/llms-txt-template.md @@ -278,7 +278,7 @@ This is the recommended starting point for all developers, including those who a - [`camel dev`](https://camel.apache.org/manual/camel-jbang.md): **Hot-reload development mode.** Edit a YAML route, save, and the running integration updates in seconds. Live feedback loop — same experience as modern web frameworks (Next.js, Vite). This is the fastest way to build and iterate on integrations. - [`camel run`](https://camel.apache.org/manual/camel-jbang.md): Run one or more Camel routes from YAML, Java, XML, or Groovy files. No Maven, no build step, no project structure required. - [`camel trace`](https://camel.apache.org/manual/camel-jbang.md): **Live message tracing.** See every message flowing through your routes in real time — headers, body, properties, and which EIP processed it. Essential for debugging and understanding message flow. -- [`camel send`](https://camel.apache.org/manual/camel-jbang.md): Send a test message to any endpoint in a running integration. Test routes interactively without writing test code — send a message and watch it flow through `camel trace`. +- [`camel cmd send`](https://camel.apache.org/manual/camel-jbang.md): Send a test message to any endpoint in a running integration. Test routes interactively without writing test code — send a message and watch it flow through `camel trace`. - [`camel test`](https://camel.apache.org/manual/camel-jbang.md): Run integration tests directly from the CLI. Supports JUnit-style assertions, mock endpoints, and test profiles. - [`camel export`](https://camel.apache.org/manual/camel-jbang.md): **Bridge from development to production.** Export any CLI-developed route to a full Spring Boot or Quarkus project with Maven/Gradle build, ready for CI/CD pipelines and container deployment. Start fast with the CLI, ship to production on an enterprise runtime. @@ -291,7 +291,7 @@ This is the recommended starting point for all developers, including those who a ### AI-Assisted Development - [Camel MCP Server](https://camel.apache.org/manual/camel-jbang-mcp.md): Model Context Protocol server for AI coding assistants (Claude Code, GitHub Copilot, Cursor, Gemini CLI). The MCP server gives AI agents access to the full Camel catalog — 350+ component schemas, EIP metadata, and YAML validation — so AI can generate correct, validated Camel routes. -- The CLI and TUI are designed for AI pair programming. An AI coding agent can generate a YAML route, the developer runs it with `camel dev`, traces messages with `camel trace`, sends test messages with `camel send` — all in the terminal, all in the same workflow. The MCP server connects the AI agent to the Camel catalog so generated routes use correct syntax and valid options. +- The CLI and TUI are designed for AI pair programming. An AI coding agent can generate a YAML route, the developer runs it with `camel dev`, traces messages with `camel trace`, sends test messages with `camel cmd send` — all in the terminal, all in the same workflow. The MCP server connects the AI agent to the Camel catalog so generated routes use correct syntax and valid options. ### CLI Examples diff --git a/package.json b/package.json index 0e902c518e0..cb1d4fb0b6b 100644 --- a/package.json +++ b/package.json @@ -15,8 +15,8 @@ "build:minify": "gulp minify", "build:sitemap": "gulp sitemap", "build:htaccess": "gulp htaccess", - "check:html": "html-validate public", - "check:links": "deadlinks-linux public", + "check:html": "node scripts/html-validate.js public", + "check:links": "node scripts/deadlinks.js public", "check:redirects": "tests/redirect.sh -s", "checks": "run-p -l check:links check:html check:redirects", "clean": "gulp clean", @@ -29,17 +29,19 @@ "preview": "run-s -l build:antora preview:hugo", "preview:hugo": "hugo server --bind=0.0.0.0 -D", "preview:netlify": "netlify deploy --dir public --cwd .", - "build:antora-local-full": "antora local-antora-playbook-full.yml --stacktrace --clean --fetch", - "build:antora-local-partial": "antora local-antora-playbook-partial.yml --stacktrace", - "build:antora-local-full2": "antora antora-playbook-local-full.yml --stacktrace --clean --fetch", - "build:antora-local-partial2": "antora antora-playbook-local-partial.yml --stacktrace", - "build:antora-local-quick": "antora antora-playbook-local-quick.yml --stacktrace" + "build:antora-local-full": "antora antora-playbook-local-full.yml --stacktrace --clean --fetch", + "build:antora-local-partial": "antora antora-playbook-local-partial.yml --stacktrace", + "build:antora-local-quick": "antora antora-playbook-local-quick.yml --stacktrace", + "build:antora-ui": "tests/antora-ui/build.sh", + "check:hugo": "bash tests/hugo/build.sh" }, "devDependencies": { "@antora/cli": "^3.1.15", "@antora/site-generator": "^3.1.15", "@asciidoctor/tabs": "^1.0.0-beta.3", "@deadlinks/cargo-deadlinks": "github-release:deadlinks/cargo-deadlinks:0.8.1/deadlinks-linux", + "@deadlinks/cargo-deadlinks-macos": "github-release:deadlinks/cargo-deadlinks:0.8.1/deadlinks-macos", + "@deadlinks/cargo-deadlinks-windows": "github-release:deadlinks/cargo-deadlinks:0.8.1/deadlinks-windows", "@djencks/antora-aggregate-collector": "^0.1.0-beta.1", "@djencks/antora-site-manifest": "^0.0.3-rc.2", "@djencks/antora-source-map": "^0.0.1-rc.2", diff --git a/scripts/deadlinks.js b/scripts/deadlinks.js new file mode 100644 index 00000000000..e63efdb0bbe --- /dev/null +++ b/scripts/deadlinks.js @@ -0,0 +1,33 @@ +const { spawn } = require('child_process'); + +// github-release-binary.js names each bin after the release asset it downloads, +// so there is one bin per platform rather than a single `deadlinks`. Templating +// the asset into the dependency reference is not an option: a platform +// dependent reference changes the package hash and breaks the lockfile, as the +// plugin itself warns. +const BINARIES = { + darwin: 'deadlinks-macos', + linux: 'deadlinks-linux', + win32: 'deadlinks-windows' +}; + +const binary = BINARIES[process.platform]; + +if (!binary) { + console.error(`check:links: cargo-deadlinks publishes no build for ${process.platform}`); + process.exit(1); +} + +// Yarn puts node_modules/.bin on PATH for the scripts it runs, which is how the +// bin resolves. On Windows it is a .cmd shim, and those need a shell. +const child = spawn(binary, process.argv.slice(2), { + stdio: 'inherit', + shell: process.platform === 'win32' +}); + +child.on('error', (err) => { + console.error(`check:links: could not run ${binary}: ${err.message}`); + process.exit(1); +}); + +child.on('exit', (code, signal) => process.exit(signal ? 1 : code)); diff --git a/scripts/html-validate.js b/scripts/html-validate.js new file mode 100644 index 00000000000..9bc162eea57 --- /dev/null +++ b/scripts/html-validate.js @@ -0,0 +1,154 @@ +const { spawn } = require('child_process'); +const fs = require('fs'); +const os = require('os'); +const path = require('path'); + +// html-validate is single threaded and spends its time in the lexer, so a full +// run over the built site is bound by one core. Measured on CI it was the whole +// of the ~14 minute "Run checks" step: 6229 files, 584 MB of HTML, while +// check:links and check:redirects finished inside the first ten seconds. +// +// Splitting the file list across processes is the only lever that pays. Trimming +// rules does not: parse-only config measured 24.96s against 25.56s for the full +// ruleset on the same input, so the rules are ~2% of the cost. +// +// Files excluded by .htmlvalidateignore stay excluded. html-validate applies the +// ignore file even to paths passed explicitly on the command line, so the shards +// do not need to filter anything themselves. + +const FILES_PER_SHARD = 200; +const PROGRESS_INTERVAL_MS = 30000; + +const target = process.argv[2] || 'public'; + +// Yarn puts node_modules/.bin on PATH for the scripts it runs, but resolving the +// binary directly means this also works when invoked as plain `node scripts/...`, +// which is how it gets run when debugging a single directory. +const localBin = path.join( + __dirname, + '..', + 'node_modules', + '.bin', + process.platform === 'win32' ? 'html-validate.cmd' : 'html-validate' +); +const binary = fs.existsSync(localBin) ? localBin : 'html-validate'; + +const scratch = fs.mkdtempSync(path.join(os.tmpdir(), 'check-html-')); +process.on('exit', () => fs.rmSync(scratch, { recursive: true, force: true })); + +const collect = (dir, out) => { + for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { + const full = path.join(dir, entry.name); + if (entry.isDirectory()) collect(full, out); + else if (entry.isFile() && entry.name.endsWith('.html')) out.push(full); + } + return out; +}; + +const chunk = (items, size) => { + const out = []; + for (let i = 0; i < items.length; i += size) out.push(items.slice(i, i + size)); + return out; +}; + +// Each shard writes to its own file rather than to a pipe. html-validate exits +// without flushing a piped stdout, so piping silently truncates its report: a +// 78 file run that writes 12577 lines to a file emits only 570 through `| cat`. +// The exit code survives, so failures are still failures, but most of the +// findings are lost. A file descriptor is written synchronously and keeps the +// whole report. Reading the shards back in order also avoids parallel writers +// interleaving mid-report. +const runShard = (files, index) => + new Promise((resolve) => { + const outPath = path.join(scratch, `shard-${index}.txt`); + const fd = fs.openSync(outPath, 'w'); + + const finish = (code) => { + try { + fs.closeSync(fd); + } catch { + /* already closed */ + } + let out = ''; + try { + out = fs.readFileSync(outPath, 'utf8'); + fs.unlinkSync(outPath); + } catch { + /* nothing was written */ + } + resolve({ code, out }); + }; + + const child = spawn(binary, files, { + shell: process.platform === 'win32', + stdio: ['ignore', fd, fd] + }); + + child.on('error', (err) => { + process.stderr.write(`check:html: could not run html-validate: ${err.message}\n`); + finish(1); + }); + + child.on('close', (code) => finish(code == null ? 1 : code)); + }); + +(async () => { + if (!fs.existsSync(target)) { + process.stderr.write(`check:html: ${target} does not exist; build the site first\n`); + process.exit(1); + } + + const files = collect(target, []); + if (!files.length) { + process.stderr.write(`check:html: no HTML files under ${target}\n`); + process.exit(1); + } + + const shards = chunk(files, FILES_PER_SHARD); + const workers = Math.max(1, Math.min(os.cpus().length, shards.length)); + const started = Date.now(); + + process.stdout.write( + `check:html: ${files.length} files in ${shards.length} shards across ${workers} workers\n` + ); + + let next = 0; + let failed = 0; + let done = 0; + + // A clean run prints nothing between the header and the summary, which on CI + // is around six minutes of dead air and looks identical to a hung job. Report + // progress periodically instead. A line per shard would be 32 lines of noise + // on a green run; a tick is a handful. unref so it can never hold the process + // open on its own. + const ticker = setInterval(() => { + const elapsed = ((Date.now() - started) / 1000).toFixed(0); + const validated = shards.slice(0, done).reduce((n, s) => n + s.length, 0); + process.stdout.write( + `check:html: ${done}/${shards.length} shards, ${validated}/${files.length} files, ${elapsed}s\n` + ); + }, PROGRESS_INTERVAL_MS); + ticker.unref(); + + const worker = async () => { + while (next < shards.length) { + const index = next++; + const { code, out } = await runShard(shards[index], index); + done++; + if (out) process.stdout.write(out); + if (code !== 0) failed++; + } + }; + + await Promise.all(Array.from({ length: workers }, worker)); + clearInterval(ticker); + + const elapsed = ((Date.now() - started) / 1000).toFixed(1); + process.stdout.write(`check:html: ${files.length} files in ${elapsed}s\n`); + + // Set exitCode rather than calling process.exit(): a failing run writes tens of + // thousands of lines, and process.exit() truncates whatever is still queued on + // stdout when it is a pipe. That would drop real findings on CI while still + // reporting failure, which is worse than not sharding at all. + process.exitCode = failed ? 1 : 0; +})(); diff --git a/static/.htaccess b/static/.htaccess index 0acee1df1eb..910ee699a19 100644 --- a/static/.htaccess +++ b/static/.htaccess @@ -878,11 +878,12 @@ Redirect 301 /polling-consumer.html /components/next/eips/polling-consumer.html Redirect 301 /predicate.html /manual/predicate.html Redirect 301 /processor.html /manual/processor.html Redirect 301 /producertemplate.html /manual/producertemplate.html -Redirect 301 /projects/ /docs/ -Redirect 301 /projects/camel-k /docs/#apache-camel-k -Redirect 301 /projects/camel-quarkus /docs/#apache-camel-extensions-for-quarkus -Redirect 301 /projects/camel-kafka-connector /docs/#apache-camel-kafka-connector +# Anchored: a plain Redirect is a prefix match, so /projects/camel-k would also catch +# /projects/camel-kafka-connector and append the remainder to the target. +RedirectMatch 301 ^/projects/camel-(k|quarkus|kafka-connector)/?$ /projects/ Redirect 301 /properties /components/next/properties-component.html +# csimple was deprecated and removed in Camel 4.23, so the "next" page is gone +Redirect 301 /components/next/languages/csimple-language.html /components/4.22.x/languages/csimple-language.html Redirect 301 /properties-2.html /components/next/properties-component.html Redirect 301 /properties.html /components/next/properties-component.html Redirect 301 /protobuf.html /components/next/dataformats/protobuf-dataformat.html diff --git a/static/_headers b/static/_headers new file mode 100644 index 00000000000..34f30b97979 --- /dev/null +++ b/static/_headers @@ -0,0 +1,35 @@ +# Cache policy for Netlify PR previews. +# +# Previews are deployed with `netlify deploy --no-build --dir public`, so Netlify +# treats every file as an unmanaged upload and serves it with +# `cache-control: public, max-age=0, must-revalidate`. That makes the browser +# revalidate each font on every navigation. Measured against a preview, that +# round trip is ~190ms, and because every @font-face here is declared +# `font-display: swap`, the fallback face is painted for its duration. The +# result is a visible font flash on each internal link. +# +# It does not happen in production, which is served by Apache from ASF infra: +# +# /_/css/site-.css cache-control: max-age=31536000 +# /_/font/.woff2 cache-control: max-age=2592000 +# +# Those are the values mirrored below, so a preview behaves like the real site +# instead of being unrepresentative in a way reviewers notice. Apache ignores +# this file, so it changes nothing outside Netlify. +# +# The long lifetime on css and js is safe because gulp fingerprints those +# filenames, so any change ships under a new URL. Font filenames carry a weight +# and style rather than a content hash, which is why they get 30 days and not a +# year: replacing a face in place would otherwise stay stale on a preview. + +/_/css/* + Cache-Control: public, max-age=31536000 + +/_/js/* + Cache-Control: public, max-age=31536000 + +/_/font/* + Cache-Control: public, max-age=2592000 + +/_/img/* + Cache-Control: public, max-age=2592000 diff --git a/static/_redirects b/static/_redirects new file mode 100644 index 00000000000..4bb39fb1a37 --- /dev/null +++ b/static/_redirects @@ -0,0 +1,3 @@ +# Netlify redirects (Apache uses .htaccess; Netlify ignores it) +# "latest" is an Antora version alias that Apache resolves via .htaccess +/components/latest/* /components/4.22.x/:splat 302 diff --git a/static/components/latest/dataformats/index.html b/static/components/latest/dataformats/index.html new file mode 100644 index 00000000000..ca09ad678a6 --- /dev/null +++ b/static/components/latest/dataformats/index.html @@ -0,0 +1,13 @@ + + + + Link checker workaround + + +
    +

    This file exists solely to defeat the limitations of the link checker, that is unaware of the .htaccess redirect from this page to the latest released version.

    +

    If you see this, you are not viewing the site through httpd or there is something wrong with the .htaccess file: in the latter case please let the camel developers know.

    +
    + + + diff --git a/static/img/camel-gears.svg b/static/img/camel-gears.svg deleted file mode 100644 index c4858bc111c..00000000000 --- a/static/img/camel-gears.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/components.svg b/static/img/components.svg deleted file mode 100644 index 9b2e008c955..00000000000 --- a/static/img/components.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/data-formats.svg b/static/img/data-formats.svg deleted file mode 100644 index 34216edb9f8..00000000000 --- a/static/img/data-formats.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/patterns.svg b/static/img/patterns.svg deleted file mode 100644 index 5dcb85b6c39..00000000000 --- a/static/img/patterns.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/img/runtimes.svg b/static/img/runtimes.svg deleted file mode 100644 index 655c4168356..00000000000 --- a/static/img/runtimes.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/antora-ui/build.sh b/tests/antora-ui/build.sh new file mode 100755 index 00000000000..cee97ea5c4e --- /dev/null +++ b/tests/antora-ui/build.sh @@ -0,0 +1,71 @@ +#!/usr/bin/env bash +# Render the Antora UI against a small local fixture, with no network access. +# +# The production playbook is not usable for UI work: it clones ten upstream +# repositories and fails on broken xrefs. This renders real pages in seconds. +# +# The fixture is copied out of the repository before Antora reads it. Antora's +# git layer cannot read a git worktree, whose .git is a file rather than a +# directory, and this redesign is developed in a worktree. +set -euo pipefail + +REPO="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +cd "$REPO" +OUT="$REPO/tests/antora-ui/out" +STAGE="$(mktemp -d)" +trap 'rm -rf "$STAGE"' EXIT + +cp -R "$REPO/tests/antora-ui/fixture" "$STAGE/fixture" +git -C "$STAGE" init -q +git -C "$STAGE" add -A +git -C "$STAGE" -c user.email=fixture@example.invalid -c user.name=fixture \ + -c commit.gpgsign=false commit -q -m fixture --no-verify + +# A second version so the page version switcher and the nav version list have +# something to render. +git -C "$STAGE" checkout -q -b v4.17 +sed -i.bak "s/version: '4.18'/version: '4.17'/" "$STAGE/fixture/antora.yml" +if cmp -s "$STAGE/fixture/antora.yml" "$STAGE/fixture/antora.yml.bak"; then + echo "error: sed did not change antora.yml -- fixture version is no longer '4.18'; update this script" >&2 + exit 1 +fi +rm -f "$STAGE/fixture/antora.yml.bak" +git -C "$STAGE" add -A +git -C "$STAGE" -c user.email=fixture@example.invalid -c user.name=fixture \ + -c commit.gpgsign=false commit -q -m v4.17 --no-verify +git -C "$STAGE" checkout -q - + +cat > "$STAGE/playbook.yml" < + + + +measure + + + + +
    pending
    + + + diff --git a/tests/hugo/build.sh b/tests/hugo/build.sh new file mode 100755 index 00000000000..5e34d6c3fe1 --- /dev/null +++ b/tests/hugo/build.sh @@ -0,0 +1,153 @@ +#!/usr/bin/env bash +# Build the Hugo site, then optionally screenshot or measure pages from it. +# +# The release-note pages call getJSON against the GitHub API. Without a token +# those calls hit the unauthenticated rate limit and the build exits non-zero +# with about 32 errors, so this script resolves a token itself rather than +# making every caller do it. The token is exported to hugo only; it is never +# printed, logged, or passed as an argument. +# +# Usage: +# tests/hugo/build.sh build only +# tests/hugo/build.sh --shots / projects/ build, then screenshot each path +# tests/hugo/build.sh --measure / 'sel@color' build, then print computed styles +# tests/hugo/build.sh --measure / 'sel@color' 'sel-to-click' +# ...after clicking an element first +# tests/hugo/build.sh --measure / 'sel@color' '' 626 +# ...at a given iframe width (default 1440) +# +# Env: HUGO_OUT, HUGO_PORT (default 8899), SHOT_WIDTHS, SHOT_HEIGHT (default 2400), +# HUGO_OPTIONS and HUGO_CACHE_DIR (forwarded to hugo like package.json's +# build:hugo; HUGO_OPTIONS='--buildFuture' reproduces the PR preview, +# HUGO_OPTIONS='-D' the local preview) +set -euo pipefail + +REPO="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +cd "$REPO" + +OUT="${HUGO_OUT:-$(mktemp -d)}" +mkdir -p "$OUT" +SITE="$OUT/site" +LOG="$OUT/hugo-build.log" +SHOTS="$OUT/shots" +PORT="${HUGO_PORT:-8899}" +SHOT_HEIGHT="${SHOT_HEIGHT:-2400}" +CHROME="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" + +# The Hugo output carries a copy of staticDir (documentation/ alone is about +# 500 MB), so a temporary site is removed on exit; a caller-supplied HUGO_OUT +# is kept. The log and screenshots live next to it and survive either way. +cleanup() { + if [ -n "${SERVER_PID:-}" ]; then kill "$SERVER_PID" 2>/dev/null || true; fi + if [ -z "${HUGO_OUT:-}" ]; then rm -rf "$SITE"; fi +} +trap cleanup EXIT + +if [ -z "${GITHUB_TOKEN:-}" ]; then + if command -v gh >/dev/null 2>&1 && _tok="$(gh auth token 2>/dev/null)" && [ -n "$_tok" ]; then + GITHUB_TOKEN="$_tok" + export GITHUB_TOKEN + unset _tok + else + echo "warning: no GITHUB_TOKEN and 'gh auth token' failed." >&2 + echo " Expect ~32 getJSON rate-limit errors and a non-zero exit." >&2 + fi +fi + +# config.toml serves the site's "_" assets from documentation/_ (staticDir and the +# "data" module mount both point there), but `yarn workspace antora-ui-camel run +# build` only writes to antora-ui-camel/public/_. Nothing else connects the two, so +# without this sync the site would silently serve a stale bundle and every --measure +# reading below would be a confident lie. +BUNDLE="$REPO/antora-ui-camel/public/_" +MANIFEST="$BUNDLE/data/rev-manifest.json" + +if [ ! -f "$MANIFEST" ]; then + echo "missing $MANIFEST -- run 'yarn workspace antora-ui-camel run build' first" >&2 + exit 1 +fi + +# git does not restore mtimes, so comparing every source file against the +# manifest flags each fresh checkout as stale; only files git reports as +# modified or untracked can be newer than the committed bundle for a reason. +# Committed source without a committed bundle is not detected here. +stale="$(git -C "$REPO" status --porcelain --untracked-files=all -- antora-ui-camel/src | cut -c4- | while IFS= read -r f; do + if [ "$REPO/$f" -nt "$MANIFEST" ]; then printf '%s\n' "$f"; fi +done)" +if [ -n "$stale" ]; then + echo "antora-ui-camel bundle is stale (uncommitted source newer than rev-manifest.json) -- run 'yarn workspace antora-ui-camel run build'" >&2 + exit 1 +fi + +mkdir -p "$REPO/documentation/_" +for asset_dir in css js img font data; do + if [ -d "$BUNDLE/$asset_dir" ]; then + mkdir -p "$REPO/documentation/_/$asset_dir" + cp -R "$BUNDLE/$asset_dir/." "$REPO/documentation/_/$asset_dir/" + fi +done + +if ! node_modules/.bin/hugo --cacheDir "${HUGO_CACHE_DIR:-$REPO/.hugo_data}" ${HUGO_OPTIONS:-} -d "$SITE" >"$LOG" 2>&1; then + echo "hugo build FAILED. Last 20 lines of $LOG:" >&2 + tail -20 "$LOG" >&2 + exit 1 +fi + +errors="$(grep -c '^ERROR' "$LOG" || true)" +if [ "$errors" != "0" ]; then + echo "hugo exited 0 but logged $errors error(s). See $LOG" >&2 + exit 1 +fi +echo "hugo: 0 errors -> $SITE" +if [ -z "${HUGO_OUT:-}" ]; then echo "(temporary; removed on exit, set HUGO_OUT to keep it)" >&2; fi + +start_server() { + python3 -m http.server "$PORT" --directory "$SITE" >/dev/null 2>&1 & + SERVER_PID=$! + for _ in 1 2 3 4 5 6 7 8 9 10; do + if ! kill -0 "$SERVER_PID" 2>/dev/null; then + echo "server process for port $PORT exited before it became ready (port may already be in use)" >&2 + exit 1 + fi + if curl -fsS -o /dev/null "http://localhost:$PORT/" \ + && lsof -ti tcp:"$PORT" -sTCP:LISTEN 2>/dev/null | grep -qx "$SERVER_PID"; then + return 0 + fi + sleep 0.5 + done + echo "server did not come up on port $PORT" >&2 + exit 1 +} + +case "${1:-}" in + --shots) + shift + cp tests/hugo/_measure.html "$SITE/_measure.html" + mkdir -p "$SHOTS" + start_server + for path in "$@"; do + slug="$(printf '%s' "${path:-index}" | tr '/' '_' | sed 's/^_*//; s/_*$//')" + : "${slug:=index}" + for width in ${SHOT_WIDTHS:-1440 1024 626}; do + "$CHROME" --headless --disable-gpu --hide-scrollbars \ + --screenshot="$SHOTS/${slug}-${width}.png" \ + --window-size="${width},${SHOT_HEIGHT}" \ + --virtual-time-budget=5000 \ + "http://localhost:$PORT/$path" >/dev/null 2>&1 + done + done + echo "shots: $SHOTS" + ;; + --measure) + shift + path="${1:-/}" + query="${2:-}" + click="${3:-}" + width="${4:-1440}" + cp tests/hugo/_measure.html "$SITE/_measure.html" + start_server + "$CHROME" --headless --disable-gpu --virtual-time-budget=5000 --dump-dom \ + "http://localhost:$PORT/_measure.html#$(printf '%s|%s|%s|%s' "$path" "$query" "$click" "$width")" \ + 2>/dev/null | sed -n '/
    /,/<\/pre>/p' | sed 's/<[^>]*>//g'
    +    ;;
    +esac
    diff --git a/tests/redirect.sh b/tests/redirect.sh
    index afbc73029f0..1c4247b88e8 100755
    --- a/tests/redirect.sh
    +++ b/tests/redirect.sh
    @@ -151,6 +151,14 @@ test "$BASE_URL/components" 302 "$BASE_URL/components/${COMPONENTS_VERSION}/"
     test "$BASE_URL/components/" 302 "$BASE_URL/components/${COMPONENTS_VERSION}/"
     test "$BASE_URL/components/next" 301 "$BASE_URL/components/next/"
     test "$BASE_URL/components/next/" 200
    +test "$BASE_URL/components/next/languages/csimple-language.html" 301 "$BASE_URL/components/4.22.x/languages/csimple-language.html"
    +test "$BASE_URL/projects/" 200
    +test "$BASE_URL/projects/camel-k" 301 "$BASE_URL/projects/"
    +test "$BASE_URL/projects/camel-k/" 301 "$BASE_URL/projects/"
    +test "$BASE_URL/projects/camel-quarkus" 301 "$BASE_URL/projects/"
    +test "$BASE_URL/projects/camel-quarkus/" 301 "$BASE_URL/projects/"
    +test "$BASE_URL/projects/camel-kafka-connector" 301 "$BASE_URL/projects/"
    +test "$BASE_URL/projects/camel-kafka-connector/" 301 "$BASE_URL/projects/"
     test "$BASE_URL/components/latest" 302 "$BASE_URL/components/${COMPONENTS_VERSION}"
     test "$BASE_URL/components/latest/" 302 "$BASE_URL/components/${COMPONENTS_VERSION}/"
     test "$BASE_URL/components/jms-component.html" 302 "$BASE_URL/components/${COMPONENTS_VERSION}/jms-component.html"
    diff --git a/yarn.lock b/yarn.lock
    index d2ecabc574f..f831f387a32 100644
    --- a/yarn.lock
    +++ b/yarn.lock
    @@ -862,6 +862,28 @@ __metadata:
       languageName: node
       linkType: hard
     
    +"@deadlinks/cargo-deadlinks-macos@github-release:deadlinks/cargo-deadlinks:0.8.1/deadlinks-macos":
    +  version: 0.8.1
    +  resolution: "@deadlinks/cargo-deadlinks-macos@github-release:deadlinks/cargo-deadlinks:0.8.1/deadlinks-macos"
    +  dependencies:
    +    "@yarnpkg/fslib": "npm:3.0.1"
    +  bin:
    +    deadlinks-macos: exec.js
    +  checksum: 10/22be5262eab401d58b2ee01c048b661eb9251323161c63c80019f30e633b27594db174451d4cb3578770325061eb52126f8150882b1b11290dac2cead6051b0d
    +  languageName: node
    +  linkType: hard
    +
    +"@deadlinks/cargo-deadlinks-windows@github-release:deadlinks/cargo-deadlinks:0.8.1/deadlinks-windows":
    +  version: 0.8.1
    +  resolution: "@deadlinks/cargo-deadlinks-windows@github-release:deadlinks/cargo-deadlinks:0.8.1/deadlinks-windows"
    +  dependencies:
    +    "@yarnpkg/fslib": "npm:3.0.1"
    +  bin:
    +    deadlinks-windows: exec.js
    +  checksum: 10/976428be72ea3b01892c5294862a2075aa02dd2983125c6dd9e31d1192024a4a90797e3706a2355261cc82d0eba0fd2eae2b48632fe1f89f2af47bfaddfb1c7c
    +  languageName: node
    +  linkType: hard
    +
     "@deadlinks/cargo-deadlinks@github-release:deadlinks/cargo-deadlinks:0.8.1/deadlinks-linux":
       version: 0.8.1
       resolution: "@deadlinks/cargo-deadlinks@github-release:deadlinks/cargo-deadlinks:0.8.1/deadlinks-linux"
    @@ -869,7 +891,7 @@ __metadata:
         "@yarnpkg/fslib": "npm:3.0.1"
       bin:
         deadlinks-linux: exec.js
    -  checksum: 10/4f6e38b06d529c9822e50a2ac89bb8d2dee3c4b6658bdfdd043abcd4f0dedbc886667349435eefa81ed56ccb2f8485758b0511412e3d557549828ffb80c17a72
    +  checksum: 10/4372e9fd8c2f626b7d06987c9db2be0ea593a3e93b0b96a6d37f24639fefd05c4340d12d3a60eaa7f811f0d7e874f4e817ae6a02ec846a1b91e75697313bfb55
       languageName: node
       linkType: hard
     
    @@ -1483,6 +1505,20 @@ __metadata:
       languageName: node
       linkType: hard
     
    +"@fontsource/archivo@npm:^5.3.0":
    +  version: 5.3.0
    +  resolution: "@fontsource/archivo@npm:5.3.0"
    +  checksum: 10/778dec06ac9cf0bd44794d42f7d1a56bf5dcd015d948d8a1024f912a73d461561d27c678fdfa08fedffb6f77e9bdca913b05468b7fdcaba30b28bbc7d5bffa88
    +  languageName: node
    +  linkType: hard
    +
    +"@fontsource/jetbrains-mono@npm:^5.3.0":
    +  version: 5.3.0
    +  resolution: "@fontsource/jetbrains-mono@npm:5.3.0"
    +  checksum: 10/8d96ebd4b19639a1988a3004909d454470069315b39b3177dddcc13f0d79570b14ed183abdf36866751d1c34814667ae6c8bbd558e6f366d168f7ec49167a851
    +  languageName: node
    +  linkType: hard
    +
     "@gulpjs/messages@npm:^1.1.0":
       version: 1.1.0
       resolution: "@gulpjs/messages@npm:1.1.0"
    @@ -4247,6 +4283,8 @@ __metadata:
         "@asciidoctor/tabs": "npm:1.0.0-beta.3"
         "@docsearch/css": "npm:^5.0.0"
         "@docsearch/js": "npm:^5.0.0"
    +    "@fontsource/archivo": "npm:^5.3.0"
    +    "@fontsource/jetbrains-mono": "npm:^5.3.0"
         "@openfonts/open-sans_latin-ext": "npm:^1.44.0"
         "@ronilaukkarinen/gulp-stylelint": "npm:^14.1.2"
         "@vscode/gulp-vinyl-zip": "npm:^2.5.0"
    @@ -4291,7 +4329,6 @@ __metadata:
         stylelint-config-standard: "npm:^34.0.0"
         svg4everybody: "npm:^2.1.9"
         toml: "npm:^4.2.0"
    -    typeface-droid-sans-mono: "npm:^0.0.44"
         undertaker: "npm:^2.0.0"
         vinyl-buffer: "npm:~1.0"
         vinyl-fs: "npm:^4.0.2"
    @@ -4326,6 +4363,8 @@ __metadata:
         "@antora/site-generator": "npm:^3.1.15"
         "@asciidoctor/tabs": "npm:^1.0.0-beta.3"
         "@deadlinks/cargo-deadlinks": "github-release:deadlinks/cargo-deadlinks:0.8.1/deadlinks-linux"
    +    "@deadlinks/cargo-deadlinks-macos": "github-release:deadlinks/cargo-deadlinks:0.8.1/deadlinks-macos"
    +    "@deadlinks/cargo-deadlinks-windows": "github-release:deadlinks/cargo-deadlinks:0.8.1/deadlinks-windows"
         "@djencks/antora-aggregate-collector": "npm:^0.1.0-beta.1"
         "@djencks/antora-site-manifest": "npm:^0.0.3-rc.2"
         "@djencks/antora-source-map": "npm:^0.0.1-rc.2"
    @@ -20640,13 +20679,6 @@ __metadata:
       languageName: node
       linkType: hard
     
    -"typeface-droid-sans-mono@npm:^0.0.44":
    -  version: 0.0.44
    -  resolution: "typeface-droid-sans-mono@npm:0.0.44"
    -  checksum: 10/4d9cf9a6fd969972309f194c61e41c62d94223e1f7079b73db5fb2c63f70caa9d7956d5ff3812cade0ecbd4e7bdc99f096e83a6a1aa6681a96bf4a0dd5804f00
    -  languageName: node
    -  linkType: hard
    -
     "typescript@npm:^3.2.1":
       version: 3.9.7
       resolution: "typescript@npm:3.9.7"
    
    ReferenceAffectedFixedCVSS scoreDescriptionReferenceAffectedFixedSeverityDescription
    {{ .Key }}{{ .Key }}
    {{ .Params.cve }} {{ .Params.affected }} {{ .Params.fixed }}{{ .Params.severity }}{{ .Params.severity | lower | title }} {{ .Params.summary }}
    {{ $year }}{{ $year }}
    No issues reported