The fixed wrappers relied on their static position resolving to y=0 as
direct flex children of body; the header landmark added in #3048 made
that position fall below the spacer. Set top-0 on all fixed variants.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Remove the obsolete min-width on thumbnail_card, a leftover from the
old fixed-size background thumbnail, so images shrink with the card
and object-cover crops them centered instead of clipping the right
side once columns drop below 300px.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Add reading progress bar for articles
* Let page-level showReadingProgress override the site setting
Hugo's default treats false as empty, so a page-level false could not
disable the bar once it was enabled site-wide. Resolve the value by
initialising from the site setting and overriding it only when the
front matter parameter is actually present, and use the same resolved
boolean in single.html and head.html.
* Guard the reading progress handler and mark the listener passive
The script loads in the head without defer, so the scroll listener is
registered before the progress bar element exists. A scroll event fired
during parsing, such as when the browser restores the scroll position on
reload, would throw. Bail out when the element is missing, matching the
guard in background-blur.js, and mark the scroll listener passive as
toc.html already does.
Wrap the page header in a header element and the subnavigation menu in
a labelled nav landmark. Addresses #3023.
Co-authored-by: Chris Herborth <chrish@taffer.ca>
Added my personal website as an entry into the "Users" page.
Thank you for creating the Blowfish Theme, I've loved spending time developing my website with your theme!
Cheers! :)
* 📌 Bump vendored mermaid to 11.16.1
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* 🔒️ Fix vulnerable transitive deps in scripts
Refresh brace-expansion to 2.1.4 and protobufjs to 7.6.5, and override
uuid to 11.1.1 to clear the remaining Dependabot alerts.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Tailwind v4.3 introduced built-in scrollbar utilities that conflicted
with the tailwind-scrollbar plugin, causing visual regressions.
Fixed by inlining the pre-v4.3 build output directly into main.css,
which also eliminates the need for the tailwind-scrollbar plugin.
Add chandlerthompson.dev — a personal blog built with Blowfish — to the
exampleSite users showcase.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The Article JSON-LD set "mainEntityOfPage": "true" on every non-home page.
schema.org/mainEntityOfPage expects a CreativeWork or a URL — a boolean
string is invalid. Emit the page's canonical URL, mirroring the adjacent
"url" : {{ .Permalink }}.
Fixes#2971
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
schema.html always read the author from .Site.Params.Author, so the
structured-data author was the site-level author (or empty) regardless of a
post's `authors` front matter — even though the theme supports multiple
authors via data/authors/.
Resolve the first `authors` key against data/authors/ and emit that author's
name, image and sameAs (from their social/links), falling back to the
site-level author. Single-author output is unchanged apart from the additive
image and sameAs fields.
Fixes#2943
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Dynamically update the appearance switcher accessibility labels and tooltips using the native i18n variables so that the UI correctly reflects the user's localized language instead of hardcoded English strings.
Use a new article.reply_to i18n key for the generated reply-by-email subject instead of the hardcoded English prefix.
Add the missing translations across i18n files and keep the existing English subject as fallback.
Fixes#2936
When a user opens the search modal and starts typing immediately, executeQuery() is triggered. Since buildIndex() is asynchronous, the fuse variable might still be undefined when .search() is called. Added safety checks for fuse initialization.
Use a fixed event name (type:view) and pass the title as metadata
instead of embedding it in the event name, which caused issues with
long page titles.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The email obfuscation PR (#2815) incorrectly replaced the "share via
email" link with the author's email as recipient. Sharing links have no
email address to obfuscate — they just open a mailto: with the article
URL and title prefilled.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Remove @iamtraction/google-translate (and undici vulnerability) — translation
no longer needed, language files now copy English content directly
- Upgrade firebase-admin from ^12.0.0 to ^13.8.0
- Pin csv-parse to ~5.5.0 to avoid major version bump
- Use networkidle2 + 2s delay in processUsers.js for reliable screenshots
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
fuse.js 7.3.0 removed dist/fuse.min.js (UMD), shipping only ESM/CJS.
Since Hugo concatenates vendor JS into a plain <script> tag, the ESM
export syntax causes a runtime error and breaks search. Pin to 7.2.0,
the last version with UMD support.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Resolve conflicts in icon sample pages by adopting upstream's {{< icon-ref >}}
shortcode, which dynamically generates the icon table.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Resolve conflicts in icon sample pages by adopting upstream's {{< icon-ref >}}
shortcode, which dynamically generates the icon table (replacing the static
table the PR had added strava to).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Switch all CI, dependabot, and docs references from dev to main
- Update users list and screenshots via processUsers
- Refresh contributors and sponsors data
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add thumbnailAspectRatio site parameter (default '1.5')
- Use decimal values instead of fractions for Hugo compatibility
- Sanitize user input to extract only numeric characters
- Apply to article cards, related cards, and term cards
- Update both source and compiled CSS
Closes#2839
Measure caption heights across slides at runtime and apply a shared min-height so switching between slides with and without caption text does not cause layout jump.
Keep this behavior scoped to carousels with captions and recalculate on load and resize for responsive stability.
Move carousel captions out of absolute positioning so they participate in normal height calculation and no longer overlap content below the carousel.
Constrain indicators and navigation buttons to the image region using container-based sizing, so controls do not extend into the caption area.
Languages with null entries in repoColors.json caused Go's fmt.Sprintf
to emit '%!s(<nil>)' as the color value, producing invalid CSS and
browser parse errors. Add a nil guard to skip those entries, letting
them fall back to the default dot color.
Fixes#2824
"description": "Use the Chart.js library to embed charts into articles using simple structured data. Blowfish chart Shortcode. Documentation: https://blowfish.page/docs/shortcodes/#chart ",
},
},
"email": {
"prefix": ["BFS-email", "HSC-email", "email"],
"body": [
"{{< email email=\"mailto:${1:hello@test.com}\" text=\"${2:text}\" subject=\"${3:Reply to awesome article}\" >}}$0",
],
"description": "Creates an obfuscated mailto link. Documentation: https://blowfish.page/docs/shortcodes/#email ",
- Hugo theme (min Hugo 0.141.0). Templates in `layouts/`, partials in `layouts/partials/`, shortcodes in `layouts/shortcodes/`.
- Tailwind CSS 4 via `@tailwindcss/cli` — source in `assets/css/main.css`, output in `assets/css/compiled/main.css`.
- JS vendored from `node_modules/` into `assets/lib/` via `vendor-copy` (configured in `package.json` under `devVendorCopy`).
- Localisation strings live in `i18n/`. All static text MUST go through `i18n` lookups, never hardcoded.
- `exampleSite/` is the testbed. Run `npm run example` (or `:core` / `:production`) to preview locally.
- `config/` holds default theme config; users override in their own site.
Coding conventions (from CONTRIBUTING.md):
- 2-space indent. Spaces inside Go template tags: `{{< alert >}}` not `{{<alert>}}`.
- Extract repeated template logic into partials.
- Relative asset paths without leading slash; trailing slash for folders (e.g. `static/img/`).
- Prettier config is included; respect it.
PR & commit rules (strict — enforced):
- Single-purpose PRs only. Do NOT bundle unrelated changes (e.g. bug fix + version bump + new user entry). Mixed PRs get closed.
- NO breaking changes unless strictly required by a dependency. Renaming partials, removing config options, or changing template signatures will be rejected — they silently break user customisations.
- Commits: Gitmoji prefix, imperative mood ("Fix bug", not "Fixed"), ≤72-char summary, no trailing period. Reference issue numbers when relevant.
- Commit incrementally rather than one giant commit.
Before marking a task done:
- If templates/CSS/JS changed, run `npm run example` and verify in the browser. Type-checks alone don't validate Hugo theme behavior.
- Check that any new user-facing string is wired through `i18n/` for all supported languages (or at least English with a clear note).
- Don't bump `package.json` version or touch `release-versions/` as part of a feature/fix PR — those are released separately.
All development occurs on the `dev` branch and new PRs should be forked from here.
All development occurs on the `main` branch and new PRs should be forked from here.
### Bugs & other issues
@@ -31,6 +31,17 @@ All development occurs on the `dev` branch and new PRs should be forked from her
- If you have a general question, these should be asked using [GitHub Discussions](https://github.com/nunocoracao/blowfish/discussions). Feel free to open a [new discussion](https://github.com/nunocoracao/blowfish/discussions/new) to ask your question using the "Q&A" category.
- Be sure to check if your question has already been answered by searching [existing Q&A discussions](https://github.com/nunocoracao/blowfish/discussions/categories/q-a).
### Breaking changes
- We do not accept breaking changes unless they are strictly required to keep supporting the project (e.g. a dependency deprecating a feature we rely on).
- Changes that would cause existing user customizations to silently stop working (such as renaming partial paths, removing config options, or changing template signatures) will be rejected.
- If you're unsure whether your change is breaking, open a discussion first.
### Pull request guidelines
- Keep PRs focused on a single change. Do not bundle unrelated modifications (e.g. bug fix + version bump + new user entry) into the same PR.
- PRs that mix multiple unrelated changes will be closed and the author will be asked to split them.
[](https://github.com/gohugoio/hugo/releases/tag/v0.141.0)
[](https://github.com/gohugoio/hugo/releases/tag/v0.158.0)
[](https://github.com/gohugoio/hugo/releases/tag/v0.141.0)
[](https://github.com/gohugoio/hugo/releases/tag/v0.158.0)
[](https://github.com/gohugoio/hugo/releases/tag/v0.141.0)
[](https://github.com/gohugoio/hugo/releases/tag/v0.158.0)
[](https://github.com/gohugoio/hugo/releases/tag/v0.141.0)
[](https://github.com/gohugoio/hugo/releases/tag/v0.158.0)
[](https://github.com/gohugoio/hugo/releases/tag/v0.141.0)
[](https://github.com/gohugoio/hugo/releases/tag/v0.158.0)
[](https://github.com/gohugoio/hugo/releases/tag/v0.141.0)
[](https://github.com/gohugoio/hugo/releases/tag/v0.158.0)
[](https://github.com/gohugoio/hugo/releases/tag/v0.141.0)
[](https://github.com/gohugoio/hugo/releases/tag/v0.158.0)
[](https://github.com/gohugoio/hugo/releases/tag/v0.141.0)
[](https://github.com/gohugoio/hugo/releases/tag/v0.158.0)
[](https://github.com/gohugoio/hugo/releases/tag/v0.141.0)
[](https://github.com/gohugoio/hugo/releases/tag/v0.158.0)
functione(e){returnArray.isArray?Array.isArray(e):u(e)===`[object Array]`}functiont(e){if(typeofe==`string`)returne;if(typeofe==`bigint`)returne.toString();lett=e+``;returnt==`0`&&1/e==-1/0?`-0`:t}functionn(e){returne==null?``:t(e)}functionr(e){returntypeofe==`string`}functioni(e){returntypeofe==`number`}functiona(e){returne===!0||e===!1||s(e)&&u(e)==`[object Boolean]`}functiono(e){returntypeofe==`object`}functions(e){returno(e)&&e!==null}functionc(e){returne!=null}functionl(e){return!e.trim().length}functionu(e){returne==null?e===void0?`[object Undefined]`:`[object Null]`:Object.prototype.toString.call(e)}constd=`Invalid doc index: must be a non-negative integer within the bounds of the docs array`,f=e=>`Invalid value for key ${e}`,p=e=>`Pattern length exceeds max of ${e}.`,m=e=>`Missing ${e} property in key`,h=e=>`Property 'weight' in key '${e}' must be a positive integer`,g=Object.prototype.hasOwnProperty;var_=class{constructor(e){this._keys=[],this._keyMap={};lett=0;e.forEach(e=>{letn=v(e);this._keys.push(n),this._keyMap[n.id]=n,t+=n.weight}),this._keys.forEach(e=>{e.weight/=t})}get(e){returnthis._keyMap[e]}keys(){returnthis._keys}toJSON(){returnJSON.stringify(this._keys)}};functionv(t){letn=null,i=null,a=null,o=1,s=null;if(r(t)||e(t))a=t,n=y(t),i=b(t);else{if(!g.call(t,`name`))throwError(m(`name`));lete=t.name;if(a=e,g.call(t,`weight`)&&t.weight!==void0&&(o=t.weight,o<=0))throwError(h(b(e)));n=y(e),i=b(e),s=t.getFn??null}return{path:n,id:i,weight:o,src:a,getFn:s}}functiony(t){returne(t)?t:t.split(`.`)}functionb(t){returne(t)?t.join(`.`):t}functionx(t,o){lets=[],l=!1,u=(t,o,d,f)=>{if(c(t))if(!o[d])s.push(f===void0?t:{v:t,i:f});else{letp=t[o[d]];if(!c(p))return;if(d===o.length-1&&(r(p)||i(p)||a(p)||typeofp==`bigint`))s.push(f===void0?n(p):{v:n(p),i:f});elseif(e(p)){l=!0;for(lete=0,t=p.length;e<t;e+=1)u(p[e],o,d+1,e)}elseo.length&&u(p,o,d+1,f)}};returnu(t,r(o)?o.split(`.`):o,0),l?s:s[0]}constS={includeMatches:!1,findAllMatches:!1,minMatchCharLength:1},C={isCaseSensitive:!1,ignoreDiacritics:!1,includeScore:!1,keys:[],shouldSort:!0,sortFn:(e,t)=>e.score===t.score?e.idx<t.idx?-1:1:e.score<t.score?-1:1},w={location:0,threshold:.6,distance:100},T={useExtendedSearch:!1,useTokenSearch:!1,tokenize:void0,tokenMatch:`any`,getFn:x,ignoreLocation:!1,ignoreFieldNorm:!1,fieldNormWeight:1},E=Object.freeze({...C,...S,...w,...T});functionD(e){returne>=9&&e<=13||e===32||e===160}functionO(e=1,t=3){letn=newMap,r=10**t;return{get(t){leti=0,a=!1;for(lete=0;e<t.length;e++)D(t.charCodeAt(e))?a=!1:a||(i++,a=!0);if(i===0&&(i=1),n.has(i))returnn.get(i);leto=Math.round(r/i**(.5*e))/r;returnn.set(i,o),o},clear(){n.clear()}}}vark=class{constructor({getFn:e=E.getFn,fieldNormWeight:t=E.fieldNormWeight}={}){this.norm=O(t,3),this.getFn=e,this.isCreated=!1,this.docs=[],this.keys=[],this._keysMap={},this.setIndexRecords()}setSources(e=[]){this.docs=e}setIndexRecords(e=[]){this.records=e}setKeys(e=[]){this.keys=e,this._keysMap={},e.forEach((e,t)=>{this._keysMap[e.id]=t})}create(){if(this.isCreated||!this.docs.length)return;this.isCreated=!0;lete=this.docs.length;this.records=Array(e);lett=0;if(r(this.docs[0]))for(letn=0;n<e;n++){lete=this._createStringRecord(this.docs[n],n);e&&(this.records[t++]=e)}elsefor(letn=0;n<e;n++)this.records[t++]=this._createObjectRecord(this.docs[n],n);this.records.length=t,this.norm.clear()}add(e,t){if(!Number.isInteger(t)||t<0)throwError(d);if(r(e)){letn=this._createStringRecord(e,t);returnn&&this.records.push(n),n}letn=this._createObjectRecord(e,t);returnthis.records.push(n),n}removeAt(e){if(!Number.isInteger(e)||e<0)throwError(d);for(lett=0,n=this.records.length;t<n;t+=1)if(this.records[t].i===e){this.records.splice(t,1);break}for(lett=0,n=this.records.length;t<n;t+=1)this.records[t].i>e&&--this.records[t].i}removeAll(e){lett=newSet;for(letnofe)Number.isInteger(n)&&n>=0&&t.add(n);if(t.size===0)return;this.records=this.records.filter(e=>!t.has(e.i));letn=Array.from(t).sort((e,t)=>e-t);for(leteofthis.records){lett=0,r=n.length;for(;t<r;){leti=t+r>>>1;n[i]<e.i?t=i+1:r=i}e.i-=t}}getValueForItemAtKeyId(e,t){returne[this._keysMap[t]]}size(){returnthis.records.length}_createStringRecord(e,t){return!c(e)||l(e)?null:{v:e,i:t,n:this.norm.get(e)}}_createObjectRecord(t,i){leta={i,$:{}};for(leti=0,o=this.keys.length;i<o;i++){leto=this.keys[i],s=o.getFn?o.getFn(t):this.getFn(t,o.path);if(c(s)){if(e(s)){lete=[];for(lett=0,i=s.length;t<i;t+=1){leti=s[t];if(c(i)){if(r(i)){if(!l(i)){letn={v:i,i:t,n:this.norm.get(i)};e.push(n)}}elseif(c(i.v)){lett=r(i.v)?i.v:n(i.v);if(!l(t)){letn={v:t,i:i.i,n:this.norm.get(t)};e.push(n)}}}}a.$[i]=e}elseif(r(s)&&!l(s)){lete={v:s,n:this.norm.get(s)};a.$[i]=e}}}returna}toJSON(){return{keys:this.keys.map(({getFn:e,...t})=>t),records:this.records}}};functionA(e,t,{getFn:n=E.getFn,fieldNormWeight:r=E.fieldNormWeight}={}){leti=newk({getFn:n,fieldNormWeight:r});returni.setKeys(e.map(v)),i.seLine truncated
vare,t;e=this,t=function(){"use strict";functione(e,t){varn=Object.keys(e);if(Object.getOwnPropertySymbols){varr=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){returnObject.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}returnn}functiont(t){for(varn=1;n<arguments.length;n++){varr=null!=arguments[n]?arguments[n]:{};n%2?e(Object(r),!0).forEach((function(e){o(t,e,r[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):e(Object(r)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}))}returnt}functionn(e){returnn="function"==typeofSymbol&&"symbol"==typeofSymbol.iterator?function(e){returntypeofe}:function(e){returne&&"function"==typeofSymbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeofe},n(e)}functionr(e,t){if(!(einstanceoft))thrownewTypeError("Cannot call a class as a function")}functioni(e,t){for(varn=0;n<t.length;n++){varr=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"inr&&(r.writable=!0),Object.defineProperty(e,v(r.key),r)}}functionu(e,t,n){returnt&&i(e.prototype,t),n&&i(e,n),Object.defineProperty(e,"prototype",{writable:!1}),e}functiono(e,t,n){return(t=v(t))ine?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}functionc(e,t){if("function"!=typeoft&&null!==t)thrownewTypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&s(e,t)}functiona(e){returna=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){returne.__proto__||Object.getPrototypeOf(e)},a(e)}functions(e,t){returns=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){returne.__proto__=t,e},s(e,t)}functionh(e,t){if(t&&("object"==typeoft||"function"==typeoft))returnt;if(void0!==t)thrownewTypeError("Derived constructors may only return object or undefined");returnfunction(e){if(void0===e)thrownewReferenceError("this hasn't been initialised - super() hasn't been called");returne}(e)}functionl(e){vart=function(){if("undefined"==typeofReflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeofProxy)return!0;try{returnBoolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}();returnfunction(){varn,r=a(e);if(t){vari=a(this).constructor;n=Reflect.construct(r,arguments,i)}elsen=r.apply(this,arguments);returnh(this,n)}}functionf(e){returnfunction(e){if(Array.isArray(e))returnd(e)}(e)||function(e){if("undefined"!=typeofSymbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])returnArray.from(e)}(e)||function(e,t){if(e){if("string"==typeofe)returnd(e,t);varn=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?d(e,t):void0}}(e)||function(){thrownewTypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}functiond(e,t){(null==t||t>e.length)&&(t=e.length);for(varn=0,r=newArray(t);n<t;n++)r[n]=e[n];returnr}functionv(e){vart=function(e,t){if("object"!=typeofe||null===e)returne;varn=e[Symbol.toPrimitive];if(void0!==n){varr=n.call(e,t||"default");if("object"!=typeofr)returnr;thrownewTypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeoft?t:String(t)}functiong(e){returnArray.isArray?Array.isArray(e):"[object Array]"===M(e)}vary=1/0;functionp(e){returnnull==e?"":function(e){if("string"==typeofe)returne;vart=e+"";return"0"==t&&1/e==-y?"-0":t}(e)}functionA(e){return"string"==typeofe}functionm(e){return"number"==typeofe}functionC(e){return!0===e||!1===e||function(e){returnk(e)&&null!==e}(e)&&"[object Boolean]"==M(e)}functionk(e){return"object"===n(e)}functionE(e){returnnull!=e}functionF(e){return!e.trim().length}functionM(e){returnnull==e?void0===e?"[object Undefined]":"[object Null]":Object.prototype.toString.call(e)}varb=function(e){return"Missing ".concat(e," property in key")},D=function(e){return"Property 'weight' in key '".concat(e,"' must be a positive integer")},B=Object.prototype.hasOwnProperty,x=function(){functione(t){varn=this;r(this,e),this._keys=[],this._keyMap={};vari=0;t.forEach((function(e){vart=w(e);n._keys.push(t),n._keyMap[t.id]=t,i+=t.weight})),this._keys.forEach((function(e){e.weight/=i}))}returnu(e,[{key:"get",value:function(e){returnthis._keyMap[e]}},{key:"keys",value:function(){returnthis._keys}},{key:"toJSON",value:function(){returnJSON.stringify(this._keys)}}]),e}();functionw(e){vart=null,n=null,r=null,i=1,u=null;if(A(e)||g(e))r=e,t=S(e),n=L(e);else{if(!B.call(e,"name"))thrownewErLine truncated
!function(e,t){"object"==typeofexports&&"object"==typeofmodule?module.exports=t(require("katex")):"function"==typeofdefine&&define.amd?define(["katex"],t):"object"==typeofexports?exports.renderMathInElement=t(require("katex")):e.renderMathInElement=t(e.katex)}("undefined"!=typeofself?self:this,(function(e){returnfunction(){"use strict";vart={757:function(t){t.exports=e}},n={};functionr(e){varo=n[e];if(void0!==o)returno.exports;vari=n[e]={exports:{}};returnt[e](i,i.exports,r),i.exports}r.n=function(e){vart=e&&e.__esModule?function(){returne.default}:function(){returne};returnr.d(t,{a:t}),t},r.d=function(e,t){for(varnint)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=function(e,t){returnObject.prototype.hasOwnProperty.call(e,t)};varo={};r.d(o,{default:function(){returnp}});vari=r(757),a=r.n(i);constl=function(e,t,n){letr=n,o=0;consti=e.length;for(;r<t.length;){constn=t[r];if(o<=0&&t.slice(r,r+i)===e)returnr;"\\"===n?r++:"{"===n?o++:"}"===n&&o--,r++}return-1},s=/^\\begin{/;vard=function(e,t){letn;constr=[],o=newRegExp("("+t.map((e=>e.left.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"))).join("|")+")");for(;n=e.search(o),-1!==n;){n>0&&(r.push({type:"text",data:e.slice(0,n)}),e=e.slice(n));consto=t.findIndex((t=>e.startsWith(t.left)));if(n=l(t[o].right,e,t[o].left.length),-1===n)break;consti=e.slice(0,n+t[o].right.length),a=s.test(i)?i:e.slice(t[o].left.length,n);r.push({type:"math",data:a,rawData:i,display:t[o].display}),e=e.slice(n+t[o].right.length)}return""!==e&&r.push({type:"text",data:e}),r};constc=function(e,t){constn=d(e,t.delimiters);if(1===n.length&&"text"===n[0].type)returnnull;constr=document.createDocumentFragment();for(lete=0;e<n.length;e++)if("text"===n[e].type)r.appendChild(document.createTextNode(n[e].data));else{consto=document.createElement("span");leti=n[e].data;t.displayMode=n[e].display;try{t.preProcess&&(i=t.preProcess(i)),a().render(i,o,t)}catch(o){if(!(oinstanceofa().ParseError))throwo;t.errorCallback("KaTeX auto-render: Failed to parse `"+n[e].data+"` with ",o),r.appendChild(document.createTextNode(n[e].rawData));continue}r.appendChild(o)}returnr},f=function(e,t){for(letn=0;n<e.childNodes.length;n++){constr=e.childNodes[n];if(3===r.nodeType){leto=r.textContent,i=r.nextSibling,a=0;for(;i&&i.nodeType===Node.TEXT_NODE;)o+=i.textContent,i=i.nextSibling,a++;constl=c(o,t);if(l){for(lete=0;e<a;e++)r.nextSibling.remove();n+=l.childNodes.length-1,e.replaceChild(l,r)}elsen+=a}elseif(1===r.nodeType){conste=" "+r.className+" ";-1===t.ignoredTags.indexOf(r.nodeName.toLowerCase())&&t.ignoredClasses.every((t=>-1===e.indexOf(" "+t+" ")))&&f(r,t)}}};varp=function(e,t){if(!e)thrownewError("No element provided to render");constn={};for(consteint)t.hasOwnProperty(e)&&(n[e]=t[e]);n.delimiters=n.delimiters||[{left:"$$",right:"$$",display:!0},{left:"\\(",right:"\\)",display:!1},{left:"\\begin{equation}",right:"\\end{equation}",display:!0},{left:"\\begin{align}",right:"\\end{align}",display:!0},{left:"\\begin{alignat}",right:"\\end{alignat}",display:!0},{left:"\\begin{gather}",right:"\\end{gather}",display:!0},{left:"\\begin{CD}",right:"\\end{CD}",display:!0},{left:"\\[",right:"\\]",display:!0}],n.ignoredTags=n.ignoredTags||["script","noscript","style","textarea","pre","code","option"],n.ignoredClasses=n.ignoredClasses||[],n.errorCallback=n.errorCallback||console.error,n.macros=n.macros||{},f(e,n)};returno=o.default}()}));
!function(e,t){"object"==typeofexports&&"object"==typeofmodule?module.exports=t(require("katex")):"function"==typeofdefine&&define.amd?define(["katex"],t):"object"==typeofexports?exports.renderMathInElement=t(require("katex")):e.renderMathInElement=t(e.katex)}("undefined"!=typeofself?self:this,function(e){returnfunction(){"use strict";vart={757:function(t){t.exports=e}},n={};functionr(e){varo=n[e];if(void0!==o)returno.exports;vari=n[e]={exports:{}};returnt[e](i,i.exports,r),i.exports}r.n=function(e){vart=e&&e.__esModule?function(){returne.default}:function(){returne};returnr.d(t,{a:t}),t},r.d=function(e,t){for(varnint)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=function(e,t){returnObject.prototype.hasOwnProperty.call(e,t)};varo={};r.d(o,{default:function(){returnp}});vari=r(757),a=r.n(i);constl=function(e,t,n){letr=n,o=0;consti=e.length;for(;r<t.length;){constn=t[r];if(o<=0&&t.slice(r,r+i)===e)returnr;"\\"===n?r++:"{"===n?o++:"}"===n&&o--,r++}return-1},s=/^\\begin{/;vard=function(e,t){letn;constr=[],o=newRegExp("("+t.map(e=>e.left.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&")).join("|")+")");for(;n=e.search(o),-1!==n;){n>0&&(r.push({type:"text",data:e.slice(0,n)}),e=e.slice(n));consto=t.findIndex(t=>e.startsWith(t.left));if(n=l(t[o].right,e,t[o].left.length),-1===n)break;consti=e.slice(0,n+t[o].right.length),a=s.test(i)?i:e.slice(t[o].left.length,n);r.push({type:"math",data:a,rawData:i,display:t[o].display}),e=e.slice(n+t[o].right.length)}return""!==e&&r.push({type:"text",data:e}),r};constc=function(e,t){constn=d(e,t.delimiters);if(1===n.length&&"text"===n[0].type)returnnull;constr=document.createDocumentFragment();for(lete=0;e<n.length;e++)if("text"===n[e].type)r.appendChild(document.createTextNode(n[e].data));else{consto=document.createElement("span");leti=n[e].data;t.displayMode=n[e].display;try{t.preProcess&&(i=t.preProcess(i)),a().render(i,o,t)}catch(o){if(!(oinstanceofa().ParseError))throwo;t.errorCallback("KaTeX auto-render: Failed to parse `"+n[e].data+"` with ",o),r.appendChild(document.createTextNode(n[e].rawData));continue}r.appendChild(o)}returnr},f=function(e,t){for(leto=0;o<e.childNodes.length;o++){consti=e.childNodes[o];if(3===i.nodeType){varn;leta=null!=(n=i.textContent)?n:"",l=i.nextSibling,s=0;for(;l&&l.nodeType===Node.TEXT_NODE;){varr;a+=null!=(r=l.textContent)?r:"",l=l.nextSibling,s++}constd=c(a,t);if(d){for(lete=0;e<s;e++)i.nextSibling.remove();o+=d.childNodes.length-1,e.replaceChild(d,i)}elseo+=s}elseif(1===i.nodeType){conste=" "+i.className+" ";!t.ignoredTags.has(i.nodeName.toLowerCase())&&t.ignoredClasses.every(t=>!e.includes(" "+t+" "))&&f(i,t)}}};varp=function(e,t){if(!e)thrownewError("No element provided to render");constn={};Object.assign(n,t),n.delimiters=n.delimiters||[{left:"$$",right:"$$",display:!0},{left:"\\(",right:"\\)",display:!1},{left:"\\begin{equation}",right:"\\end{equation}",display:!0},{left:"\\begin{align}",right:"\\end{align}",display:!0},{left:"\\begin{alignat}",right:"\\end{alignat}",display:!0},{left:"\\begin{gather}",right:"\\end{gather}",display:!0},{left:"\\begin{CD}",right:"\\end{CD}",display:!0},{left:"\\[",right:"\\]",display:!0}],n.ignoredTags=newSet((null==t?void0:t.ignoredTags)||["script","noscript","style","textarea","pre","code","option"]),n.ignoredClasses=n.ignoredClasses||[],n.errorCallback=n.errorCallback||console.error,n.macros=n.macros||{},f(e,n)};returno=o.default}()});
!function(e,t){"object"==typeofexports&&"object"==typeofmodule?module.exports=t():"function"==typeofdefine&&define.amd?define([],t):"object"==typeofexports?exports.katex=t():e.katex=t()}("undefined"!=typeofself?self:this,(function(){returnfunction(){"use strict";vare={d:function(t,r){for(varninr)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},o:function(e,t){returnObject.prototype.hasOwnProperty.call(e,t)}},t={};e.d(t,{default:function(){returnWn}});classr{constructor(e,t){this.name=void0,this.position=void0,this.length=void0,this.rawMessage=void0;letn,o,s="KaTeX parse error: "+e;consti=t&&t.loc;if(i&&i.start<=i.end){conste=i.lexer.input;n=i.start,o=i.end,n===e.length?s+=" at end of input: ":s+=" at position "+(n+1)+": ";constt=e.slice(n,o).replace(/[^]/g,"$&\u0332");letr,a;r=n>15?"\u2026"+e.slice(n-15,n):e.slice(0,n),a=o+15<e.length?e.slice(o,o+15)+"\u2026":e.slice(o),s+=r+t+a}consta=newError(s);returna.name="ParseError",a.__proto__=r.prototype,a.position=n,null!=n&&null!=o&&(a.length=o-n),a.rawMessage=e,a}}r.prototype.__proto__=Error.prototype;varn=r;consto=/([A-Z])/g,s={"&":"&",">":">","<":"<",'"':""","'":"'"},i=/[&><"']/g;consta=function(e){return"ordgroup"===e.type||"color"===e.type?1===e.body.length?a(e.body[0]):e:"font"===e.type?a(e.body):e};varl={deflt:function(e,t){returnvoid0===e?t:e},escape:function(e){returnString(e).replace(i,(e=>s[e]))},hyphenate:function(e){returne.replace(o,"-$1").toLowerCase()},getBaseElem:a,isCharacterBox:function(e){constt=a(e);return"mathord"===t.type||"textord"===t.type||"atom"===t.type},protocolFromUrl:function(e){constt=/^[\x00-\x20]*([^\\/#?]*?)(:|�*58|�*3a|&colon)/i.exec(e);returnt?":"!==t[2]?null:/^[a-zA-Z][a-zA-Z0-9+\-.]*$/.test(t[1])?t[1].toLowerCase():null:"_relative"}};consth={displayMode:{type:"boolean",description:"Render math in display mode, which puts the math in display style (so \\int and \\sum are large, for example), and centers the math on the page on its own line.",cli:"-d, --display-mode"},output:{type:{enum:["htmlAndMathml","html","mathml"]},description:"Determines the markup language of the output.",cli:"-F, --format <type>"},leqno:{type:"boolean",description:"Render display math in leqno style (left-justified tags)."},fleqn:{type:"boolean",description:"Render display math flush left."},throwOnError:{type:"boolean",default:!0,cli:"-t, --no-throw-on-error",cliDescription:"Render errors (in the color given by --error-color) instead of throwing a ParseError exception when encountering an error."},errorColor:{type:"string",default:"#cc0000",cli:"-c, --error-color <color>",cliDescription:"A color string given in the format 'rgb' or 'rrggbb' (no #). This option determines the color of errors rendered by the -t option.",cliProcessor:e=>"#"+e},macros:{type:"object",cli:"-m, --macro <def>",cliDescription:"Define custom macro of the form '\\foo:expansion' (use multiple -m arguments for multiple macros).",cliDefault:[],cliProcessor:(e,t)=>(t.push(e),t)},minRuleThickness:{type:"number",description:"Specifies a minimum thickness, in ems, for fraction lines, `\\sqrt` top lines, `{array}` vertical lines, `\\hline`, `\\hdashline`, `\\underline`, `\\overline`, and the borders of `\\fbox`, `\\boxed`, and `\\fcolorbox`.",processor:e=>Math.max(0,e),cli:"--min-rule-thickness <size>",cliProcessor:parseFloat},colorIsTextColor:{type:"boolean",description:"Makes \\color behave like LaTeX's 2-argument \\textcolor, instead of LaTeX's one-argument \\color mode change.",cli:"-b, --color-is-text-color"},strict:{type:[{enum:["warn","ignore","error"]},"boolean","function"],description:"Turn on strict / LaTeX faithfulness mode, which throws an error if the input uses features that are not supported by LaTeX.",cli:"-S, --strict",cliDefault:!1},trust:{type:["boolean","function"],description:"Trust the input, enabling all HTML features such as \\url.",cli:"-T, --trust"},maxSize:{type:"number",default:1/0,description:"If non-zero, all user-specified sizes, e.g. in \\rule{500em}{500em}, will be capped to maxSize ems. Otherwise, elements and spaces can be arbitrarily large",processor:e=>Math.max(0,e),cli:"-s, --max-size <n>",cliProcessor:parseInt},maxExpand:{type:"number",default:1e3,description:"Limit the number of macro expansions to the specified number, to prevent e.g. infinite macro loops. If set to Infinity, the macro expander will try to fully expand as in LaTeX.",processor:e=>Math.max(0,e),cli:"-e, --max-expand <n>",cliProcessor:e=>"Infinity"===e?1/0:parseInt(e)},globalGroup:{type:"boolean",cli:!1}};functionc(e){if(e.default)returne.default;constt=e.type,r=Array.isArray(t)?t[0]:t;if("string"!=typeofr)returnr.enum[0];switch(r){case"boolean":return!1;case"string":return"";case"number":return0;case"object":return{}}}classm{constructor(e){this.displayMode=void0,this.output=void0,this.leqno=void0,this.fleqn=void0,this.throwOnError=void0,this.errorColor=void0,this.macros=void0,this.Line truncated
!function(e,t){"object"==typeofexports&&"object"==typeofmodule?module.exports=t():"function"==typeofdefine&&define.amd?define([],t):"object"==typeofexports?exports.katex=t():e.katex=t()}("undefined"!=typeofself?self:this,function(){returnfunction(){"use strict";vare={d:function(t,r){for(varninr)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},o:function(e,t){returnObject.prototype.hasOwnProperty.call(e,t)}},t={};e.d(t,{default:function(){returnmo}});classrextendsError{constructor(e,t){letn,o,s="KaTeX parse error: "+e;consti=t&&t.loc;if(i&&i.start<=i.end){conste=i.lexer.input;n=i.start,o=i.end,n===e.length?s+=" at end of input: ":s+=" at position "+(n+1)+": ";constt=e.slice(n,o).replace(/[^]/g,"$&\u0332");letr,l;r=n>15?"\u2026"+e.slice(n-15,n):e.slice(0,n),l=o+15<e.length?e.slice(o,o+15)+"\u2026":e.slice(o),s+=r+t+l}super(s),this.name="ParseError",this.position=void0,this.length=void0,this.rawMessage=void0,Object.setPrototypeOf(this,r.prototype),this.position=n,null!=n&&null!=o&&(this.length=o-n),this.rawMessage=e}}varn=r;consto=/([A-Z])/g,s=e=>e.replace(o,"-$1").toLowerCase(),i={"&":"&",">":">","<":"<",'"':""","'":"'"},l=/[&><"']/g,a=e=>String(e).replace(l,e=>i[e]),c=e=>"ordgroup"===e.type||"color"===e.type?1===e.body.length?c(e.body[0]):e:"font"===e.type?c(e.body):e,h=newSet(["mathord","textord","atom"]),m=e=>h.has(c(e).type),u={displayMode:{type:"boolean",description:"Render math in display mode, which puts the math in display style (so \\int and \\sum are large, for example), and centers the math on the page on its own line.",cli:"-d, --display-mode"},output:{type:{enum:["htmlAndMathml","html","mathml"]},description:"Determines the markup language of the output.",cli:"-F, --format <type>"},leqno:{type:"boolean",description:"Render display math in leqno style (left-justified tags)."},fleqn:{type:"boolean",description:"Render display math flush left."},throwOnError:{type:"boolean",default:!0,cli:"-t, --no-throw-on-error",cliDescription:"Render errors (in the color given by --error-color) instead of throwing a ParseError exception when encountering an error."},errorColor:{type:"string",default:"#cc0000",cli:"-c, --error-color <color>",cliDescription:"A color string given in the format 'rgb' or 'rrggbb' (no #). This option determines the color of errors rendered by the -t option.",cliProcessor:e=>"#"+e},macros:{type:"object",cli:"-m, --macro <def>",cliDescription:"Define custom macro of the form '\\foo:expansion' (use multiple -m arguments for multiple macros).",cliDefault:[],cliProcessor:(e,t)=>(t.push(e),t)},minRuleThickness:{type:"number",description:"Specifies a minimum thickness, in ems, for fraction lines, `\\sqrt` top lines, `{array}` vertical lines, `\\hline`, `\\hdashline`, `\\underline`, `\\overline`, and the borders of `\\fbox`, `\\boxed`, and `\\fcolorbox`.",processor:e=>Math.max(0,e),cli:"--min-rule-thickness <size>",cliProcessor:parseFloat},colorIsTextColor:{type:"boolean",description:"Makes \\color behave like LaTeX's 2-argument \\textcolor, instead of LaTeX's one-argument \\color mode change.",cli:"-b, --color-is-text-color"},strict:{type:[{enum:["warn","ignore","error"]},"boolean","function"],description:"Turn on strict / LaTeX faithfulness mode, which throws an error if the input uses features that are not supported by LaTeX.",cli:"-S, --strict",cliDefault:!1},trust:{type:["boolean","function"],description:"Trust the input, enabling all HTML features such as \\url.",cli:"-T, --trust"},maxSize:{type:"number",default:1/0,description:"If non-zero, all user-specified sizes, e.g. in \\rule{500em}{500em}, will be capped to maxSize ems. Otherwise, elements and spaces can be arbitrarily large",processor:e=>Math.max(0,e),cli:"-s, --max-size <n>",cliProcessor:parseInt},maxExpand:{type:"number",default:1e3,description:"Limit the number of macro expansions to the specified number, to prevent e.g. infinite macro loops. If set to Infinity, the macro expander will try to fully expand as in LaTeX.",processor:e=>Math.max(0,e),cli:"-e, --max-expand <n>",cliProcessor:e=>"Infinity"===e?1/0:parseInt(e)},globalGroup:{type:"boolean",cli:!1}};functionp(e){if(Object.prototype.hasOwnProperty.call(e,"default")&&void0!==e.default)returne.default;returnfunction(e){if("string"!=typeofe)returne.enum[0];switch(e){case"boolean":return!1;case"string":return"";case"number":return0;case"object":return{};default:thrownewError("Unexpected schema type; settings must declare an explicit default.")}}(Array.isArray(e.type)?e.type[0]:e.type)}functiond(e,t,r,n){consto=Object.prototype.hasOwnProperty.call(r,t)?r[t]:void0,s=Object.prototype.hasOwnProperty.call(n,"processor")?n.processor:void0;e[t]=void0!==o?s?s(o):o:p(n)}classg{constructor(e){void0===e&&(e={}),this.displayMode=void0,this.output=void0,this.leqno=void0,this.fleqn=void0,this.throwOnError=void0,this.errorColor=void0,this.macros=void0,this.minRuleThickness=void0,this.colorIsTextCLine truncated
enabled=false# Enable client-side language redirects for multilingual sites.
storageKey="blowfish_preferred_language"# localStorage key for manual language selections.
# fallbackLanguage = "" # Language to use when no browser language matches. Defaults to Hugo's default content language.
browserRedirectHomeOnly=true# Restrict browser-language redirects to home pages.
storedLanguageRedirect=true# Redirect to the stored language when a matching translation exists.
[seo]
# metaDescriptionOrder = ["summary", "description", "site"] # Controls the fallback order for the HTML meta description. Valid values are "summary", "description", and "site".
showTaxonomies=false# use showTaxonomies OR showCategoryOnly, not both
showCategoryOnly=false# use showTaxonomies OR showCategoryOnly, not both
showTaxonomies=false# Enable the display of taxonomies for the related article.
showCategories=true# These will show if showTaxonomies is true.
showTags=true# These will show if showTaxonomies is true.
showCategoriesInSecondaryColor=false# This will change the color of category badges, so the user can better distinguish between the two. Only if showTaxonomies is true.
@@ -115,8 +115,8 @@ Il file predefinito può essere utilizzato come modello per creare lingue aggiun
<!-- prettier-ignore-start -->
| Name | Default | Description |
| --- | --- | --- |
| `languageCode` | `"en"` | Il codice della lingua Hugo per questo file. Può essere una lingua di livello superiore (ad esempio "en") o una variante secondaria (ad esempio "en-au") e deve corrispondere al codice della lingua nel nome del file. Hugo si aspetta che questo valore sia sempre in minuscolo. Per una corretta conformità HTML, imposta il parametro "isoCode" che fa distinzione tra maiuscole e minuscole. |
| `languageName` | `"English"` | Il nome della lingua. |
| `locale` | `"en"` | Il codice della lingua Hugo per questo file. Può essere una lingua di livello superiore (ad esempio "en") o una variante secondaria (ad esempio "en-au") e deve corrispondere al codice della lingua nel nome del file. Hugo si aspetta che questo valore sia sempre in minuscolo. Per una corretta conformità HTML, imposta il parametro "isoCode" che fa distinzione tra maiuscole e minuscole. |
| `label` | `"English"` | Il nome della lingua. |
| `weight` | `1` | Il peso determina l'ordine delle lingue durante la creazione di siti multilingue. |
| `title` | `"Blowfish"` | Il titolo del sito web. Questo verrà visualizzato nell'intestazione e nel piè di pagina del sito. |
@@ -67,6 +67,7 @@ The theme currently supports the following languages by default:
| Language | Code |
| ---------------------------- | ------- |
| Arabic | `ar` |
| Basque | `eu` |
| Bulgarian | `bg` |
| Bengali | `bn` |
| Catalan | `ca` |
@@ -115,8 +116,8 @@ The default file can be used as a template to create additional languages, or re
<!-- prettier-ignore-start -->
| Name | Default | Description |
| --- | --- | --- |
| `languageCode` | `"en"` | The Hugo language code for this file. It can be a top-level language (ie. `en`) or a sub-variant (ie. `en-au`) and should match the language code in the filename. Hugo expects this value to always be in lowercase. For proper HTML compliance, set the `isoCode` parameter which is case-sensitive. |
| `languageName` | `"English"` | The name of the language. |
| `locale` | `"en"` | The Hugo language code for this file. It can be a top-level language (ie. `en`) or a sub-variant (ie. `en-au`) and should match the language code in the filename. Hugo expects this value to always be in lowercase. For proper HTML compliance, set the `isoCode` parameter which is case-sensitive. |
| `label` | `"English"` | The name of the language. |
| `weight` | `1` | The weight determines the order of languages when building multilingual sites. |
| `title` | `"Blowfish"` | The title of the website. This will be displayed in the site header and footer. |
<!-- prettier-ignore-end -->
@@ -150,6 +151,21 @@ The default file can be used as a template to create additional languages, or re
| `params.author.links` | _Not set_ | The links to display alongside the author's details. The config file contains example links which can simply be uncommented to enable. The order that the links are displayed is determined by the order they appear in the array. Custom links can be added by providing corresponding SVG icon assets in `assets/icons/`. |
<!-- prettier-ignore-end -->
### Client-side language redirect
Blowfish can optionally redirect visitors to a matching translated page entirely in the browser. The feature is disabled by default, requires no server-side component, and uses `localStorage` instead of cookies to remember language choices made through the existing language dropdown.
When enabled, the browser-language redirect runs only on home pages by default. If none of the visitor's browser languages match an available translation, Blowfish can redirect to `fallbackLanguage` when that translation exists. If `fallbackLanguage` is not set, Blowfish uses Hugo's default content language. A language chosen manually from the dropdown is stored and preferred on later visits when the current page has a matching translated URL.
```toml
[languageRedirect]
enabled = false
storageKey = "blowfish_preferred_language"
# fallbackLanguage = "en"
browserRedirectHomeOnly = true
storedLanguageRedirect = true
```
### Menus
Blowfish also supports language-specific menu configurations. Menu config files follow the same naming format as the languages file. Simply provide the language code in the file name to tell Hugo which language the file relates to.
@@ -185,6 +201,7 @@ Many of the article defaults here can be overridden on a per article basis by sp
| `showViews` | _Not set_ | Whether or not articles and list views are displayed. This requires firebase integrations to be enabled, look below. |
| `showLikes` | _Not set_ | Whether or not articles and list likes are displayed. This requires firebase integrations to be enabled, look below. |
| `robots` | _Not set_ | String that indicates how robots should handle your site. If set, it will be output in the page head. Refer to [Google's docs](https://developers.google.com/search/docs/advanced/robots/robots_meta_tag#directives) for valid values. |
| `seo.metaDescriptionOrder` | `["summary", "description", "site"]` | Controls the fallback order for the HTML meta description. Valid values are `summary`, `description`, and `site`. Use `["description", "summary", "site"]` if you want front matter `description` to take precedence over `summary`. |
| `disableImageZoom` | `false` | Disables image zoom feature across all the images in the site. |
| `disableImageOptimization` | `false` | Disables image resize and optimization features across all the images in the site, except images using markdown syntax (``) |
| `disableImageOptimizationMD` | `false` | Disables image resize and optimization features only for images using markdown syntax (``). |
@@ -199,6 +216,11 @@ Many of the article defaults here can be overridden on a per article basis by sp
| `smartTOC` | _Not set_ | Activate smart Table of Contents, items in view will be highlighted. |
| `smartTOCHideUnfocusedChildren` | _Not set_ | When smart Table of Contents is turned on, this will hide deeper levels of the table when they are not in focus. |
| `fingerprintAlgorithm` | `"sha512"` | Hash algorithm for CSS/JS file fingerprinting to prevent browser caching issues. Valid values are `sha512` (default), `sha384`, `sha256`. |
| `languageRedirect.enabled` | `false` | Enables client-side language redirects for multilingual sites. Disabled by default for backwards compatibility. |
| `languageRedirect.storageKey` | `"blowfish_preferred_language"` | The `localStorage` key used to persist manual language dropdown selections. |
| `languageRedirect.fallbackLanguage` | Hugo's default content language | Language to redirect to when no browser language matches and that language has a translation for the current page. |
| `languageRedirect.browserRedirectHomeOnly` | `true` | Restricts browser-language redirects to home pages to avoid surprising visitors who open deep links. |
| `languageRedirect.storedLanguageRedirect` | `true` | Allows a stored manual language selection to redirect translated pages when a matching translation exists. |
### Header
@@ -244,8 +266,8 @@ Many of the article defaults here can be overridden on a per article basis by sp
| `article.showAuthorBottom` | `false` | Author boxes are displayed at the bottom of each page instead of the top. |
| `article.showHero` | `false` | Whether the thumbnail image will be shown as a hero image within each article page. |
| `article.heroStyle` | _Not set_ | Style to display the hero image, valid options are: `basic`, `big`, `background`, `thumbAndBackground`. Effective only if `article.showHero = true`. |
| `article.layoutBackgroundBlur` | `true` | Makes the background image in the background article heroStyle blur with the scroll |
| `article.layoutBackgroundHeaderSpace` | `true` | Add space between the header and the body. |
| `article.layoutBackgroundBlur` | `true` | Makes the background image in the background article heroStyle blur with the scroll. Only used when `heroStyle` equals `background` or `thumbAndBackground`. |
| `article.layoutBackgroundHeaderSpace` | `true` | Add space between the header and the body. Only used when `heroStyle` equals `background`. |
| `article.showBreadcrumbs` | `false` | Whether or not breadcrumbs are displayed in the article header. |
| `article.showDraftLabel` | `true` | Whether or not the draft indicator is shown next to articles when site is built with `--buildDrafts`. |
| `article.showEdit` | `false` | Whether or not the link to edit the article content should be displayed. |
@@ -256,11 +278,14 @@ Many of the article defaults here can be overridden on a per article basis by sp
| `article.showPagination` | `true` | Whether or not the next/previous article links are displayed in the article footer. |
| `article.invertPagination` | `false` | Whether or not to flip the direction of the next/previous article links. |
| `article.showReadingTime` | `true` | Whether or not article reading times are displayed. |
| `article.showReadingProgress` | `false` | When set to `true` a reading progress bar is displayed at the top of articles. |
| `article.showTableOfContents` | `false` | Whether or not the table of contents is displayed on articles. |
| `article.showRelatedContent` | `false` | Display related content for each post. Might required additional configuration to your `hugo.toml`. Please check the theme `hugo.toml` if you want to enable this feature and copy all the relevant _related_ entries. Also check [Hugo's docs](https://gohugo.io/content-management/related/) on related content. |
| `article.relatedContentLimit` | `3` | Limit of related articles to display if `showRelatedContent` is turned on. |
| `article.showTaxonomies` | `false` | Whether or not all the taxonomies related to this article are displayed. |
| `article.showCategoryOnly` | `false` | Whether or not the "category" taxonomy is displayed. `showTaxonomies`should be `false` when this param is used, otherwise duplicates will appear. |
| `article.showCategories` | `true` | Whether or not the `category` taxonomies are displayed. Requires`showTaxonomies`to be `true`. |
| `article.showTags` | `true` | Whether or not the `tag` taxonomies are displayed. Requires `showTaxonomies` to be `true`. |
| `article.showCategoriesInSecondaryColor` | `false` | This will make the `category` taxonomy badges to show in a secondary color, so the user can better distinguish between categories and tags. Requires `showTaxonomies` to be `true`. |
| `article.showAuthorsBadges` | `false` | Whether the `authors` taxonomies are are displayed in the article or list header. This requires the setup of `multiple authors` and the `authors` taxonomy. Check [this page]({{< ref "multi-author" >}}) for more details on how to configure that feature. |
| `article.showWordCount` | `false` | Whether or not article word counts are displayed. |
| `article.showComments` | `false` | Whether or not the [comments partial]({{< ref "partials#comments" >}}) is included after the article footer. |
@@ -274,9 +299,9 @@ Many of the article defaults here can be overridden on a per article basis by sp
| --- | --- | --- |
| `list.showHero` | `false` | Whether the thumbnail image will be shown as a hero image within each list page. |
| `list.heroStyle` | _Not set_ | Style to display the hero image, valid options are: `basic`, `big`, `background`, `thumbAndBackground`. Effective only if `list.showHero = true`. |
| `list.layoutBackgroundBlur` | `true` | Makes the background image in the background list heroStyle blur with the scroll. Only used when `heroStyle` equals `background` or `thumbAndBackground`. |
| `list.layoutBackgroundHeaderSpace` | `true` | Add space between the header and the body. Only used when `heroStyle` equals `background`. |
| `list.showBreadcrumbs` | `false` | Whether or not breadcrumbs are displayed in the header on list pages. |
| `list.layoutBackgroundBlur` | `true` | Makes the background image in the background list heroStyle blur with the scroll |
| `list.layoutBackgroundHeaderSpace` | `true` | Add space between the header and the body. |
| `list.showTableOfContents` | `false` | Whether or not the table of contents is displayed on list pages. |
| `list.showSummary` | `false` | Whether or not article summaries are displayed on list pages. If a summary is not provided in the [front matter]({{< ref "front-matter" >}}), one will be auto generated using the `summaryLength` parameter in the [site configuration](#site-configuration). |
| `list.showViews` | `false` | Whether or not list views are displayed. This requires firebase integrations to be enabled, look below. |
@@ -302,6 +327,8 @@ Many of the article defaults here can be overridden on a per article basis by sp
| `taxonomy.showTermCount` | `true` | Whether or not the number of articles within a taxonomy term is displayed on the taxonomy listing. |
| `taxonomy.showHero` | `false` | Whether the thumbnail image will be shown as a hero image within each taxonomy page. |
| `taxonomy.heroStyle` | _Not set_ | Style to display the hero image, valid options are: `basic`, `big`, `background`, `thumbAndBackground`. Effective only if `taxonomy.showHero = true`. |
| `taxonomy.layoutBackgroundBlur` | `true` | Makes the background image in the background taxonomy heroStyle blur with the scroll. Only used when `heroStyle` equals `background` or `thumbAndBackground`. |
| `taxonomy.layoutBackgroundHeaderSpace` | `true` | Add space between the header and the body. Only used when `heroStyle` equals `background`. |
| `taxonomy.showBreadcrumbs` | `false` | Whether or not breadcrumbs are displayed in the taxonomy header. |
| `taxonomy.showViews` | `false` | Whether or not article views are displayed. This requires firebase integrations to be enabled, look below. |
| `taxonomy.showLikes` | `false` | Whether or not article likes are displayed. This requires firebase integrations to be enabled, look below. |
@@ -314,6 +341,8 @@ Many of the article defaults here can be overridden on a per article basis by sp
| --- | --- | --- |
| `term.showHero` | `false` | Whether the thumbnail image will be shown as a hero image within each term page. |
| `term.heroStyle` | _Not set_ | Style to display the hero image, valid options are: `basic`, `big`, `background`, `thumbAndBackground`. Effective only if `term.showHero = true`. |
| `term.layoutBackgroundBlur` | `true` | Makes the background image in the background term heroStyle blur with the scroll. Only used when `heroStyle` equals `background` or `thumbAndBackground`. |
| `term.layoutBackgroundHeaderSpace` | `true` | Add space between the header and the body. Only used when `heroStyle` equals `background`. |
| `term.showBreadcrumbs` | `false` | Whether or not breadcrumbs are displayed in the term header. |
| `term.showViews` | `false` | Whether or not article views are displayed. This requires firebase integrations to be enabled, look below. |
| `term.showLikes` | `false` | Whether or not article likes are displayed. This requires firebase integrations to be enabled, look below. |
@@ -25,13 +25,13 @@ Die mit Blowfish gelieferten Konfigurationsdateien enthalten alle möglichen Ein
## Grundkonfiguration
Bevor Sie Inhalte erstellen, sollten Sie für eine neue Installation einige Dinge festlegen. Beginnen Sie in der Datei `hugo.toml` und setzen Sie die Parameter `baseURL` und `languageCode`. Der `languageCode` sollte auf die Hauptsprache eingestellt werden, in der Sie Ihre Inhalte verfassen werden.
Bevor Sie Inhalte erstellen, sollten Sie für eine neue Installation einige Dinge festlegen. Beginnen Sie in der Datei `hugo.toml` und setzen Sie die Parameter `baseURL` und `locale`. Der `locale` sollte auf die Hauptsprache eingestellt werden, in der Sie Ihre Inhalte verfassen werden.
```toml
# config/_default/hugo.toml
baseURL = "https://your_domain.com/"
languageCode = "de"
locale = "de"
```
Der nächste Schritt ist die Konfiguration der Spracheinstellungen. Obwohl Blowfish mehrsprachige Setups unterstützt, konfigurieren Sie vorerst nur die Hauptsprache.
@@ -39,7 +39,7 @@ Der nächste Schritt ist die Konfiguration der Spracheinstellungen. Obwohl Blowf
Suchen Sie die Datei `languages.en.toml` im Konfigurationsordner. Wenn Ihre Hauptsprache Englisch ist, können Sie diese Datei so verwenden, wie sie ist. Andernfalls benennen Sie sie um, sodass sie den richtigen Sprachcode im Dateinamen enthält. Für Deutsch benennen Sie die Datei beispielsweise in `languages.de.toml` um.
{{< alert >}}
Beachten Sie, dass der Sprachcode im Dateinamen der Sprachkonfiguration mit der Einstellung `languageCode` in `hugo.toml` übereinstimmen sollte.
Beachten Sie, dass der Sprachcode im Dateinamen der Sprachkonfiguration mit der Einstellung `locale` in `hugo.toml` übereinstimmen sollte.
@@ -25,13 +25,13 @@ Los archivos de configuración que vienen con Blowfish contienen todas las confi
## Configuración básica
Antes de crear cualquier contenido, hay algunas cosas que debes configurar para una nueva instalación. Comenzando en el archivo `hugo.toml`, establece los parámetros `baseURL` y `languageCode`. El `languageCode` debe configurarse con el idioma principal que usarás para escribir tu contenido.
Antes de crear cualquier contenido, hay algunas cosas que debes configurar para una nueva instalación. Comenzando en el archivo `hugo.toml`, establece los parámetros `baseURL` y `locale`. El `locale` debe configurarse con el idioma principal que usarás para escribir tu contenido.
```toml
# config/_default/hugo.toml
baseURL = "https://your_domain.com/"
languageCode = "es"
locale = "es"
```
El siguiente paso es configurar los ajustes de idioma. Aunque Blowfish admite configuraciones multilingües, por ahora, solo configura el idioma principal.
@@ -39,7 +39,7 @@ El siguiente paso es configurar los ajustes de idioma. Aunque Blowfish admite co
Localiza el archivo `languages.en.toml` en la carpeta de configuración. Si tu idioma principal es el inglés, puedes usar este archivo tal cual. De lo contrario, renómbralo para que incluya el código de idioma correcto en el nombre del archivo. Por ejemplo, para español, renombra el archivo a `languages.es.toml`.
{{< alert >}}
Ten en cuenta que el código de idioma en el nombre del archivo de configuración de idioma debe coincidir con la configuración `languageCode` en `hugo.toml`.
Ten en cuenta que el código de idioma en el nombre del archivo de configuración de idioma debe coincidir con la configuración `locale` en `hugo.toml`.
@@ -25,13 +25,13 @@ Les fichiers de configuration livrés avec Blowfish contiennent tous les paramè
## Configuration de base
Avant de créer du contenu, il y a quelques éléments à définir pour une nouvelle installation. En commençant par le fichier `hugo.toml`, définissez les paramètres `baseURL` et `languageCode`. Le `languageCode` doit être défini sur la langue principale que vous utiliserez pour rédiger votre contenu.
Avant de créer du contenu, il y a quelques éléments à définir pour une nouvelle installation. En commençant par le fichier `hugo.toml`, définissez les paramètres `baseURL` et `locale`. Le `locale` doit être défini sur la langue principale que vous utiliserez pour rédiger votre contenu.
```toml
# config/_default/hugo.toml
baseURL = "https://your_domain.com/"
languageCode = "fr"
locale = "fr"
```
L'étape suivante consiste à configurer les paramètres de langue. Bien que Blowfish prenne en charge les configurations multilingues, pour l'instant, configurez simplement la langue principale.
@@ -39,7 +39,7 @@ L'étape suivante consiste à configurer les paramètres de langue. Bien que Blo
Localisez le fichier `languages.en.toml` dans le dossier de configuration. Si votre langue principale est l'anglais, vous pouvez utiliser ce fichier tel quel. Sinon, renommez-le pour qu'il inclue le code de langue correct dans le nom du fichier. Par exemple, pour le français, renommez le fichier en `languages.fr.toml`.
{{< alert >}}
Notez que le code de langue dans le nom du fichier de configuration de langue doit correspondre au paramètre `languageCode` dans `hugo.toml`.
Notez que le code de langue dans le nom du fichier de configuration de langue doit correspondre au paramètre `locale` dans `hugo.toml`.
@@ -32,7 +32,7 @@ Prima di creare qualsiasi contenuto, è necessario impostare alcune cose per una
# config/_default/hugo.toml
baseURL = "https://your_domain.com/"
languageCode = "en"
locale = "en"
```
Il passo successivo è configurare le impostazioni della lingua. Sebbene Blowfish supporti le configurazioni multilingue, per ora basta configurare la lingua principale.
@@ -41,7 +41,7 @@ Individua il file "languages.en.toml" nella cartella di configurazione. Se la tu
{{< alert >}}
Tieni presente che il codice della lingua nel nome del file di configurazione della lingua deve corrispondere all'impostazione "languageCode" in "hugo.toml".
Tieni presente che il codice della lingua nel nome del file di configurazione della lingua deve corrispondere all'impostazione "locale" in "hugo.toml".
@@ -25,13 +25,13 @@ The config files that ship with Blowfish contain all of the possible settings th
## Basic configuration
Before creating any content, there are a few things you should set for a new installation. Starting in the `hugo.toml` file, set the `baseURL` and `languageCode` parameters. The `languageCode` should be set to the main language that you will be using to author your content.
Before creating any content, there are a few things you should set for a new installation. Starting in the `hugo.toml` file, set the `baseURL` and `locale` parameters. The `locale` should be set to the main language that you will be using to author your content.
```toml
# config/_default/hugo.toml
baseURL = "https://your_domain.com/"
languageCode = "en"
locale = "en"
```
The next step is to configure the language settings. Although Blowfish supports multilingual setups, for now, just configure the main language.
@@ -39,7 +39,7 @@ The next step is to configure the language settings. Although Blowfish supports
Locate the `languages.en.toml` file in the config folder. If your main language is English you can use this file as is. Otherwise, rename it so that it includes the correct language code in the filename. For example, for French, rename the file to `languages.fr.toml`.
{{< alert >}}
Note that the language code in the language config filename should match the `languageCode` setting in `hugo.toml`.
Note that the language code in the language config filename should match the `locale` setting in `hugo.toml`.
@@ -25,13 +25,13 @@ Os arquivos de configuração que acompanham o Blowfish contêm todas as configu
## Configuração básica
Antes de criar qualquer conteúdo, há algumas coisas que você deve configurar para uma nova instalação. Começando no arquivo `hugo.toml`, defina os parâmetros `baseURL` e `languageCode`. O `languageCode` deve ser definido para o idioma principal que você usará para escrever seu conteúdo.
Antes de criar qualquer conteúdo, há algumas coisas que você deve configurar para uma nova instalação. Começando no arquivo `hugo.toml`, defina os parâmetros `baseURL` e `locale`. O `locale` deve ser definido para o idioma principal que você usará para escrever seu conteúdo.
```toml
# config/_default/hugo.toml
baseURL = "https://your_domain.com/"
languageCode = "pt-br"
locale = "pt-br"
```
O próximo passo é configurar as definições de idioma. Embora o Blowfish suporte configurações multilíngues, por enquanto, apenas configure o idioma principal.
@@ -39,7 +39,7 @@ O próximo passo é configurar as definições de idioma. Embora o Blowfish supo
Localize o arquivo `languages.en.toml` na pasta de configuração. Se seu idioma principal for inglês, você pode usar este arquivo como está. Caso contrário, renomeie-o para incluir o código de idioma correto no nome do arquivo. Por exemplo, para português brasileiro, renomeie o arquivo para `languages.pt-br.toml`.
{{< alert >}}
Note que o código de idioma no nome do arquivo de configuração de idioma deve corresponder à configuração `languageCode` em `hugo.toml`.
Note que o código de idioma no nome do arquivo de configuração de idioma deve corresponder à configuração `locale` em `hugo.toml`.
@@ -25,13 +25,13 @@ Os ficheiros de configuração que acompanham o Blowfish contêm todas as defini
## Configuração básica
Antes de criar qualquer conteúdo, há algumas coisas que deve configurar para uma nova instalação. Começando no ficheiro `hugo.toml`, defina os parâmetros `baseURL` e `languageCode`. O `languageCode` deve ser definido para o idioma principal que utilizará para escrever o seu conteúdo.
Antes de criar qualquer conteúdo, há algumas coisas que deve configurar para uma nova instalação. Começando no ficheiro `hugo.toml`, defina os parâmetros `baseURL` e `locale`. O `locale` deve ser definido para o idioma principal que utilizará para escrever o seu conteúdo.
```toml
# config/_default/hugo.toml
baseURL = "https://your_domain.com/"
languageCode = "pt-pt"
locale = "pt-pt"
```
O próximo passo é configurar as definições de idioma. Embora o Blowfish suporte configurações multilingues, por agora, apenas configure o idioma principal.
@@ -39,7 +39,7 @@ O próximo passo é configurar as definições de idioma. Embora o Blowfish supo
Localize o ficheiro `languages.en.toml` na pasta de configuração. Se o seu idioma principal for inglês, pode utilizar este ficheiro tal como está. Caso contrário, renomeie-o para incluir o código de idioma correto no nome do ficheiro. Por exemplo, para português europeu, renomeie o ficheiro para `languages.pt-pt.toml`.
{{< alert >}}
Note que o código de idioma no nome do ficheiro de configuração de idioma deve corresponder à definição `languageCode` em `hugo.toml`.
Note que o código de idioma no nome do ficheiro de configuração de idioma deve corresponder à definição `locale` em `hugo.toml`.
@@ -22,7 +22,7 @@ Diese Anweisungen bringen Sie von einem komplett leeren Zustand mit Hugo und Blo
Wenn Sie Hugo noch nicht verwendet haben, müssen Sie es [auf Ihrem lokalen Computer installieren](https://gohugo.io/getting-started/installing). Sie können überprüfen, ob es bereits installiert ist, indem Sie den Befehl `hugo version` ausführen.
{{< alert >}}
Stellen Sie sicher, dass Sie **Hugo Version 0.141.0** oder höher verwenden, da das Theme einige der neuesten Hugo-Funktionen nutzt.
Stellen Sie sicher, dass Sie **Hugo Version 0.158.0** oder höher verwenden, da das Theme einige der neuesten Hugo-Funktionen nutzt.
{{< /alert >}}
Sie finden detaillierte Installationsanweisungen für Ihre Plattform in der [Hugo-Dokumentation](https://gohugo.io/getting-started/installing).
@@ -22,7 +22,7 @@ Estas instrucciones te ayudarán a empezar con Hugo y Blowfish desde un estado c
Si nunca has usado Hugo antes, necesitarás [instalarlo en tu máquina local](https://gohugo.io/getting-started/installing). Puedes verificar si ya está instalado ejecutando el comando `hugo version`.
{{< alert >}}
Asegúrate de estar usando **Hugo versión 0.141.0** o posterior, ya que el tema aprovecha algunas de las últimas características de Hugo.
Asegúrate de estar usando **Hugo versión 0.158.0** o posterior, ya que el tema aprovecha algunas de las últimas características de Hugo.
{{< /alert >}}
Puedes encontrar instrucciones de instalación detalladas para tu plataforma en la [documentación de Hugo](https://gohugo.io/getting-started/installing).
@@ -22,7 +22,7 @@ Ces instructions vous permettront de démarrer avec Hugo et Blowfish à partir d
Si vous n'avez jamais utilisé Hugo auparavant, vous devrez [l'installer sur votre machine locale](https://gohugo.io/getting-started/installing). Vous pouvez vérifier s'il est déjà installé en exécutant la commande `hugo version`.
{{< alert >}}
Assurez-vous d'utiliser **Hugo version 0.141.0** ou ultérieure car le thème tire parti de certaines des dernières fonctionnalités de Hugo.
Assurez-vous d'utiliser **Hugo version 0.158.0** ou ultérieure car le thème tire parti de certaines des dernières fonctionnalités de Hugo.
{{< /alert >}}
Vous pouvez trouver des instructions d'installation détaillées pour votre plateforme dans la [documentation Hugo](https://gohugo.io/getting-started/installing).
@@ -23,7 +23,7 @@ Se non hai mai utilizzato Hugo prima, dovrai [installarlo nella tua local machin
Puoi verificare se hai già installato Hugo utilizzando il comando `hugo version`.
{{< alert >}}
Assicurati di usare la **versione 0.141.0 di Hugo** o successiva, poiché il tema sfrutta alcune delle ultime caratteristiche di Hugo.
Assicurati di usare la **versione 0.158.0 di Hugo** o successiva, poiché il tema sfrutta alcune delle ultime caratteristiche di Hugo.
{{< /alert >}}
Puoi trovare le istruzioni dettagliate sull'installazione per la propria piattaforma in [Documenti Hugo](https://gohugo.io/getting-started/installing).
@@ -22,7 +22,7 @@ Hugo の[クイックスタートガイド](https://gohugo.io/getting-started/qu
Hugo を初めて使用する場合は、[公式サイトの手順](https://gohugo.io/getting-started/installing)に従って、ローカルマシンにインストールしてください。すでにインストールされているかどうかは、コマンド `hugo version` を実行して確認できます。
{{< alert >}}
テーマは最新の Hugo の機能を活用しているため、**Hugo バージョン 0.141.0 以降**を使用していることを確認してください。
テーマは最新の Hugo の機能を活用しているため、**Hugo バージョン 0.158.0 以降**を使用していることを確認してください。
@@ -22,7 +22,7 @@ These instructions will get you up and running using Hugo and Blowfish from a co
If you haven't used Hugo before, you will need to [install it onto your local machine](https://gohugo.io/getting-started/installing). You can check if it's already installed by running the command `hugo version`.
{{< alert >}}
Make sure you are using **Hugo version 0.141.0** or later as the theme takes advantage of some of the latest Hugo features.
Make sure you are using **Hugo version 0.158.0** or later as the theme takes advantage of some of the latest Hugo features.
{{< /alert >}}
You can find detailed installation instructions for your platform in the [Hugo docs](https://gohugo.io/getting-started/installing).
@@ -22,7 +22,7 @@ Estas instruções vão te ajudar a começar com Hugo e Blowfish a partir de um
Se você nunca usou Hugo antes, precisará [instalá-lo em sua máquina local](https://gohugo.io/getting-started/installing). Você pode verificar se já está instalado executando o comando `hugo version`.
{{< alert >}}
Certifique-se de estar usando **Hugo versão 0.141.0** ou posterior, pois o tema aproveita alguns dos recursos mais recentes do Hugo.
Certifique-se de estar usando **Hugo versão 0.158.0** ou posterior, pois o tema aproveita alguns dos recursos mais recentes do Hugo.
{{< /alert >}}
Você pode encontrar instruções de instalação detalhadas para sua plataforma na [documentação do Hugo](https://gohugo.io/getting-started/installing).
@@ -22,7 +22,7 @@ Estas instruções irão ajudá-lo a começar com Hugo e Blowfish a partir de um
Se nunca utilizou Hugo antes, precisará de [instalá-lo na sua máquina local](https://gohugo.io/getting-started/installing). Pode verificar se já está instalado executando o comando `hugo version`.
{{< alert >}}
Certifique-se de que está a utilizar **Hugo versão 0.141.0** ou posterior, pois o tema aproveita algumas das funcionalidades mais recentes do Hugo.
Certifique-se de que está a utilizar **Hugo versão 0.158.0** ou posterior, pois o tema aproveita algumas das funcionalidades mais recentes do Hugo.
{{< /alert >}}
Pode encontrar instruções de instalação detalhadas para a sua plataforma na [documentação do Hugo](https://gohugo.io/getting-started/installing).
@@ -46,6 +46,8 @@ Um die Umami Analytics-Unterstützung zu aktivieren, geben Sie einfach Ihren [Um
Wenn Sie auch die benutzerdefinierte Domain-Funktion von Umami verwenden und deren Skript von Ihrer Domain bereitstellen möchten, können Sie zusätzlich den Konfigurationswert `domain` angeben. Wenn Sie keinen `domain`-Wert angeben, wird das Skript direkt von Umami DNS (analytics.umami.is) geladen.
Wenn Sie möchten, dass der Tracker nur auf bestimmten Domains ausgeführt wird, können Sie den Konfigurationswert `dataDomains` angeben. Wenn Sie keinen `dataDomains`-Wert angeben, wird das Skript auf jeder Website ausgeführt, bei der `domain` und `websiteid` übereinstimmen. Wenn die Umgebungsvariable `TRACKER_SCRIPT_NAME` konfiguriert ist, können Sie einen benutzerdefinierten Skriptnamen `scriptName` angeben. Wenn sie nicht konfiguriert ist, kommentieren Sie sie entweder aus oder verwenden Sie den Standard `script.js`.
Wenn Sie die Do Not Track Einstellung im Browser berücksichtigen möchten, dann setzen Sie `doNotTrack` auf `true`, Blowfish berücksichtigt die Do Not Track Einstellung standardmäßig nicht.
{{< alert >}}
**Hinweis:** Wenn Sie Umami Analytics aktivieren, unterstützt Blowfish [Umami Track Event](https://umami.is/docs/track-events) automatisch. Wenn Sie Track Event nicht unterstützen möchten, muss der Parameter `enableTrackEvent` auf `false` gesetzt werden.
{{< /alert >}}
@@ -58,6 +60,7 @@ Wenn Sie möchten, dass der Tracker nur auf bestimmten Domains ausgeführt wird,
@@ -46,6 +46,8 @@ To enable Umami Analytics support, simply provide your [Umami tracking code](htt
If you also use the custom domain feature of Umami and would like to serve their script from your domain, you can also additionally provide the `domain` configuration value. If you don't provide a `domain` value, the script will load directly from Umami DNS (analytics.umami.is).
If you want the tracker to only run on specific domains, you can provide the `dataDomains` configuration value. If you don't provide a `dataDomains` value, the script will run on any website where the `domain` and`websiteid` match. If the environment variable `TRACKER_SCRIPT_NAME` is configured, you can specify a custom script name `scriptName`. If it is not configured, either comment it out or use the default `script.js`.
If you want to honor the Do Not Track setting of the users browser, you have to set `doNotTrack` to `true`. Blowfish does not honor the Do Not Track setting per default.
{{< alert >}}
**Note:** If you enable Umami Analytics, Blowfish will support [Umami Track Event](https://umami.is/docs/track-events) automatically. If you do not want to support Track Event, the param `enableTrackEvent` must set to `false`.
{{< /alert >}}
@@ -59,6 +61,7 @@ If you want the tracker to only run on specific domains, you can provide the `da
> Siehe die [Anleitung zur Anpassung von Admonition](https://github.com/nunocoracao/blowfish/blob/main/layouts/_default/_markup/render-blockquote.html).
@@ -116,6 +116,7 @@ The alert sign (`+` or `-`) is optional to control whether the admonition is fol
| `open` | **Optional.** Set to `true` to have the item open by default. |
| `header` | **Optional.** Alias for `title`, kept for compatibility with other shortcodes. |
| `icon` | **Optional.** Icon name to display before the title. |
| `align` | **Optional.** Align text within the item: `left`, `center`, `right` |
<!-- prettier-ignore-end -->
**Example 1: `mode="open"` (multiple items can be open) + `separated=true`**
@@ -186,6 +187,39 @@ The alert sign (`+` or `-`) is optional to control whether the admonition is fol
<br/><br/><br/>
## Ansible Galaxy Card
`ansible` renders a card for an [Ansible Galaxy](https://galaxy.ansible.com/) entry, fetched at build time. It accepts either a `role` or a `collection` parameter, both in `namespace.name` form.
| `role` | [String] Galaxy role in the format `namespace.name`, e.g. `geerlingguy.docker` |
| `collection` | [String] Galaxy collection in the format `namespace.name`, e.g. `community.general` |
<!-- prettier-ignore-end -->
Set exactly one of `role` or `collection` per call.
All card values are fetched at build time via Hugo's `resources.GetRemote`. Galaxy does not allow cross-origin requests, so the card is not refreshed in the browser — rebuild the site to update the values.
`Article` will embed a single article into a markdown file. The `link` to the file should be the `.RelPermalink` of the file to be embedded. Note that the shortcode will not display anything if it's referencing it's parent. _Note: if you are running your website in a subfolder like Blowfish (i.e. /blowfish/) please include that path in the link._
@@ -228,7 +262,7 @@ New article!
## Button
`button` outputs a styled button component which can be used to highlight a primary action. It has three optional variables `href`, `target` and `rel` which can be used to specify the URL, target and relation of the link.
`button` outputs a styled button component which can be used to highlight a primary action. It has four optional variables `pageRef`, `href`, `target` and `rel`. `pageRef` resolves an internal page reference using the current page context, producing a language- and trailing-slash-aware URL that is consistent with the theme's navigation menus. `href` accepts any URL or path. When both are set, `pageRef` takes precedence.
**Example:**
@@ -242,6 +276,18 @@ Call to action
Call to action
{{< /button >}}
**Example using `pageRef`:**
```md
{{</* button pageRef="docs/getting-started" */>}}
Get started
{{</* /button */>}}
```
{{< button pageRef="docs/getting-started" >}}
Get started
{{< /button >}}
<br/><br/><br/>
## Carousel
@@ -375,6 +421,18 @@ This shortcode is for importing code from external sources easily without copyin
<br/><br/><br/>
## Email
Creates an obfuscated mailto link:
```md
{{</* email email="mailto:hello@test.com" text="text" subject="Reply to awesome article" */>}}
```
{{< email email="mailto:hello@test.com" text="text" subject="Reply to awesome article" >}}
<br/><br/><br/>
## Figure
Blowfish includes a `figure` shortcode for adding images to content. The shortcode replaces the base Hugo functionality in order to provide additional performance benefits.
@@ -878,6 +936,7 @@ The `tabs` shortcode is commonly used to present different variants of a particu
| `default` | **Optional.** Label of the tab to be active by default. If not set, the first tab will be active. |
| `label` | **Required.** The text label displayed on the tab button. |
| `icon` | **Optional.** Icon name to display before the label. |
| `md` | **Optional.** Render tab content as Markdown (default `true`). Set `md=false` to allow nested shortcodes inside tab content. |
**Example 1: Basic Usage**
@@ -904,8 +963,8 @@ The `tabs` shortcode is commonly used to present different variants of a particu
```
{{</* /tab */>}}
{{</* tab label="Linux" */>}}
See [documentation](https://code.visualstudio.com/docs/setup/linux#_install-vs-code-on-linux).
Gracias a las contribuciones de la comunidad, Blowfish ya ha sido traducido a [treinta idiomas](https://github.com/nunocoracao/blowfish/tree/main/i18n), y se añadirán más con el tiempo. Por cierto, ¡los [pull requests](https://github.com/nunocoracao/blowfish/pulls) para nuevos idiomas siempre son bienvenidos!
Gracias a las contribuciones de la comunidad, Blowfish ya ha sido traducido a [treinta y dos idiomas](https://github.com/nunocoracao/blowfish/tree/main/i18n), y se añadirán más con el tiempo. Por cierto, ¡los [pull requests](https://github.com/nunocoracao/blowfish/pulls) para nuevos idiomas siempre son bienvenidos!
Thanks to submissions from the community, Blowfish has already been translated into [thirty languages](https://github.com/nunocoracao/blowfish/tree/main/i18n) with more to be added over time. By the way, [pull requests](https://github.com/nunocoracao/blowfish/pulls) for new languages are always welcome!
Thanks to submissions from the community, Blowfish has already been translated into [thirty-two languages](https://github.com/nunocoracao/blowfish/tree/main/i18n) with more to be added over time. By the way, [pull requests](https://github.com/nunocoracao/blowfish/pulls) for new languages are always welcome!
Loaded 100 of 2506 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.