Bump transitive deps to patched versions (source-map-js, dompurify,
brace-expansion, @fastify/busboy, @grpc/grpc-js) and add npm overrides
for the two that parents pin to vulnerable ranges: mermaid's nested
katex now dedupes to the root katex, and @tailwindcss/typography uses
postcss-selector-parser ^7.1.6.
Compiled CSS and vendored assets are unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
v3 replaced hero/background.html's persistent full-viewport blur
overlay with hero-scroll-fade.js, which fades the hero band to
nothing after 500px of scroll - reusing the same
layoutBackgroundBlur flag to gate the new behavior, with no way
back to the old look.
Added layoutBackgroundBlurStyle (fade default, classic opt-in)
to restore the pre-v3 persistent blur overlay, reusing the same
background-blur.js still used by hero/thumbAndBackground.html
getActiveAnchorId derives the active entry from scroll position alone,
so on a page short enough that scrollHeight never exceeds
window.innerHeight, the answer can never change. Clicking a TOC entry
still updates location.hash, but nothing ever picks it up as active.
Falls back to the hash when the page can't scroll, honoured only if
it names an entry the TOC actually lists. Pages that do scroll are
unaffected - this only fires when scroll position can't answer the
question at all.
Fixes#3087
The global keydown handler calls event.key.toLowerCase() without checking
that event.key is defined. Some keydown events carry no key property
(browser autofill, IME composition, some mobile virtual keyboards), which
throws TypeError: Cannot read properties of undefined (reading
'toLowerCase') and breaks the handler for that keystroke.
Add a truthiness guard before calling toLowerCase(), matching the style
already used for the other event.key comparisons in the same handler.
No behavior change for real Cmd/Ctrl+K presses.
The floating header's backdrop blur makes the pill a containing block
for fixed-position descendants, so the fullscreen mobile menu rendered
at the pill's height instead of filling the viewport. Lift the filter
while the menu is open. Fixes#3057.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The 3.1.0 and 3.2.0 release bumps used an unanchored replacement that
also rewrote eight dependencies' lockfile version fields. Restore each
to the version embedded in its resolved tarball URL.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The dropdown panel only closed through its own X button. Escape already
dismissed it, so the missing pointer equivalent left the panel stuck open
over the page after a stray tap.
Close it on any click landing outside the panel and outside the labels that
toggle it. Both early returns are load-bearing. A label forwards a synthetic
click to its checkbox, so without skipping the input the menu closes in the
same gesture that opened it. And without skipping the opener, opening then
closing with the hamburger leaves the panel open, because this handler and
the label's default action cancel each other out.
The fullscreen panel needs no special case. It covers the viewport, so
every click lands inside it and the handler stays inert.
The submenu panel carried both `pt-2` and `p-5`. Tailwind emits shorthand
utilities before their longhand counterparts, so `padding-top` resolved to
`0.5rem` while the other three sides stayed at `1.25rem`, regardless of the
order the classes appear in the markup. The first submenu entry sat flush
against the top edge.
This went unnoticed while the panel was translucent. v3 made it opaque, which
draws the edge and exposes the imbalance.
Drop `pt-2` so the panel keeps the uniform `p-5` it was styled for. No new
utility classes, so the compiled stylesheet is unchanged.
* feat: localize 404 page quotes
* 🐛 Fix 404 quote localization: build-time filtering and dub lines
Filter quotes to the page language at build time (case-insensitive,
with base-language and English fallbacks), fixing the double-encoded
language variable that made every locale fall back to English, and
correct several translations to their canonical dub lines.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
---------
Co-authored-by: Friday <friday@openclaw.local>
Co-authored-by: Nuno Coração <nunocoracao@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Extract the comments block into a shared article-comments partial and
include it from both single and simple layouts. Fixes#2938.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Stale marking now warns 14 days before closing instead of closing
immediately, messages invite a comment or reopen, and triaged labels
are exempt.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
JSON-encode i18n strings injected into appearance.js (#3040), resolve
and publish the original author image for the JSON-LD schema (#3037),
and anchor avatar crops to Center so small and zoomed framings match
(#3016).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Port the v3 feature list, AI-agent quick start, neutral CLI wording,
and upgrade section to all translations; bring the Indonesian README
to full structural parity.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Darken burufugu primary-600 to pass 4.5:1 on white, bump the search
shortcut hint to neutral-500, and surface the language switcher in
the visible mobile header row instead of the menu dialog.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
New demo screenshots (old set archived under images/old), README
feature list, AI-agent quick start, and upgrade section.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Bump the Hugo module path to /v3, adopt a rolling latest-4 Hugo
version window (bot keeps it sliding), document new opt-in params,
and set package version to 3.0.0.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The theme homepage no longer renders blowfish.page's sponsor and
contributor sections; the example site overrides index.html instead,
so user sites don't inherit the theme repo's data files.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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
Replace complex title processing (9 lines) with single-line title filter approach.
Changes:
- Simplify $admonitionTitle definition from 5 variables to 1 line
- Remove $titleClass conditional logic (4 lines)
- Replace dynamic CSS class with static "grow" class
- Use Hugo title filter instead of CSS capitalize
- Remove TrimSpace processing per author feedback
This maintains the same visual behavior while significantly reducing code complexity.
Related: PR #2704 feedback from ZhenShuo2021
description:Install, configure, and build sites with the Blowfish Hugo theme — setup methods, updates, configuration files, homepage layouts, front matter, shortcodes, customization, and theme architecture. Use when working on a Hugo site that uses (or wants to use) Blowfish, or when working on the theme itself.
---
# Blowfish theme
Blowfish is a lightweight Hugo theme built with Tailwind CSS. Docs: https://blowfish.page/ · Repo: https://github.com/nunocoracao/blowfish
Requires Hugo **extended** edition, within the version range declared in the theme's `config.toml` under `[module.hugoVersion]` (check that file — the range is a rolling window that tracks recent Hugo releases).
## Installing
Full walkthrough: https://blowfish.page/docs/installation/
1.**Blowfish Tools CLI:**`npx blowfish-tools` — interactive setup that scaffolds the site and config. `npx blowfish-tools new <site>` creates project + theme in one go.
2.**Git submodule:**
```shell
git init # if not already a repo
git submodule add -b main https://github.com/nunocoracao/blowfish.git themes/blowfish
```
Then set `theme = "blowfish"` in the site's `config/_default/hugo.toml`.
3. **Hugo module:** `hugo mod init github.com/<user>/<repo>` then in `config/_default/module.toml`:
```toml
[[imports]]
path = "github.com/nunocoracao/blowfish/v3"
```
4. **Manual:** download the latest release archive, extract to `themes/blowfish/`, set `theme = "blowfish"`.
After installing (any method): delete the site's generated `hugo.toml` in the project root, and copy the theme's `config/_default/*.toml` files into the site's `config/_default/` (don't overwrite `module.toml` if using Hugo modules). A ready-made zip of the config files: https://github.com/nunocoracao/blowfish/releases/latest/download/config-default.zip
- **Hugo module:** `hugo mod get -u` (inspects `module.toml` + `go.mod`)
- **Manual:** download the latest release and replace `themes/blowfish/` entirely (local edits inside the theme folder are lost — site-level overrides are safe).
- **Upgrading v2 → v3:** fully backwards compatible; all new features are opt-in and nothing was removed or renamed. Hugo-module users change the import path `…/blowfish/v2` → `…/blowfish/v3` in `module.toml`, then `hugo mod get -u`. Other methods need no changes. Details: https://blowfish.page/docs/installation/#upgrading-from-v2-to-v3
## Configuration
All config lives in the site's `config/_default/` (reference: https://blowfish.page/docs/configuration/):
- `languages.<code>.toml` — site title, author profile (name, image, headline, bio, `links` social icons). One file per language for multilingual sites.
Understanding the theme's structure makes searching much faster:
- **Template resolution:** Hugo prefers site files over theme files at the same path. `layouts/_default/baseof.html` is the page skeleton (skip link, `<header>` with the configured header layout, `<main>`, footer, search modal, background canvas). `single.html` = articles, `list.html` = section listings, `terms.html` = taxonomy index (e.g. `/tags/`), `term.html` = one term's articles. All taxonomies share the same two templates.
- **Partial naming convention:** `layouts/partials/<area>/<variant>.html`. Header layouts live in `partials/header/` (all variants delegate the actual menu bar to `header/basic.html`; components like `desktop-menu`, `mobile-menu`, `translations` are in `partials/header/components/`). Hero styles in `partials/hero/` (`basic`, `big`, `background`, `thumbAndBackground`). Homepage layouts in `partials/home/`. Article listing cards in `partials/article-link/` (`card`, `simple`, `card-related`); taxonomy term links in `partials/term-link/`. `partials/icon.html` inlines SVGs from `assets/icons/` by name.
- **Param resolution pattern:** templates resolve display flags as front matter → section params → default, e.g. `.Params.showX | default (site.Params.article.showX | default false)`. Page scope is tracked via `.Scratch.Set "scope"` (`single`/`list`/`terms`/`term`) — some partials branch on it.
- **Styling:** Tailwind source is `assets/css/main.css` (plus `assets/css/components/*`), compiled to `assets/css/compiled/main.css` which is **committed** — after changing templates that use new utility classes, run `npm run build` and commit the compiled file. Colour schemes are CSS custom-property files in `assets/css/schemes/<name>.css` defining `--color-neutral/primary/secondary-{50..900}` as RGB triplets; Tailwind maps them via `tailwind.config.js`. Note: the palette has **no 950 shades** — `*-neutral-950` etc. silently compile to nothing.
- **JavaScript:** small feature scripts in `assets/js/` (appearance/dark-mode toggle, search, zen-mode, reading-progress, hero-scroll-fade, background-blur, …). Most are bundled into `main.bundle.js` in `partials/head.html`; page-conditional ones get their own fingerprinted `<script>` tag. Vendored libraries (mermaid, katex, chart.js, fuse, zoom, …) are copied from `node_modules` into `assets/lib/` by `vendor-copy` (config in `package.json` under `devVendorCopy`) — they are committed; heavy ones load only on pages that use them.
- **i18n:** every user-facing string goes through `i18n/<lang>.yaml` lookups (`{{ i18n "key" }}`) — never hardcode text in templates. English is the fallback.
- **Demo/testbed:** `exampleSite/` is both the docs site (blowfish.page) and the test environment. `npm run example` serves it locally at :1313 with the theme mounted via `--themesDir ../..`. Docs content lives in `exampleSite/content/docs/` with one `index.<lang>.md` per language.
- **Icons:** `assets/icons/*.svg` (FontAwesome-derived, `fill="currentColor"`). An icon's filename is its name everywhere: social `links`, menu `pre`, the `icon`/`badge`/`button` shortcodes.
## Working on the theme itself
- `npm install` then `npm run example` — live demo at `http://localhost:1313`.
- `npm run build` — recompile Tailwind into `assets/css/compiled/main.css` (commit it).
- `npm run build-hugo` — production build of the docs site.
- Conventions: 2-space indent, spaces inside template tags (`{{ $x }}`), extract repeated logic into partials, Gitmoji commit prefixes, no breaking changes (never rename partials or remove config options). See `CLAUDE.md` and `CONTRIBUTING.md`.
- When adding/renaming config options, shortcodes, or layouts: update the docs in `exampleSite/content/docs/` (all languages) **and this skill**.
## Troubleshooting
- Blank styling / missing classes → Hugo isn't the extended edition, or `themesDir`/module import is misconfigured.
- New config not applying → the file must be in the **site's** `config/_default/`, not inside the theme.
- Version warnings → keep Hugo within the `[module.hugoVersion]` range in the theme's `config.toml`.
- A Tailwind class "not working" in a custom override → the compiled CSS is generated from the theme's sources; site-level classes need the site's own CSS (e.g. `assets/css/custom.css`, loaded automatically) or the class must already exist in the theme's compiled output.
- Images not appearing as thumbnails → the image must be a page-bundle resource matching `*feature*`, `*cover*`, or `*thumbnail*`, or set `featureimage` in front matter.
"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 ",
},
"figure": {
"prefix": ["BFS-figure", "HSC-figure", "figure"],
"body": [
@@ -178,6 +185,53 @@
],
"description": "Output a set of up to three different colors. Blowfish swatches Shortcode. Documentation: https://blowfish.page/docs/shortcodes/#swatches ",
- 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.
Hugo theme built with Tailwind CSS. Templates in `layouts/`, Tailwind source in `assets/css/main.css` compiled to `assets/css/compiled/main.css` (committed), demo/testbed in `exampleSite/`, localization in `i18n/`.
## Working on the theme
-`npm install`, then `npm run example` to preview the demo site; `npm run build` to recompile Tailwind (commit the compiled CSS with template changes that use new classes).
- All user-facing static text goes through `i18n/` lookups — never hardcode strings in templates.
- 2-space indent; spaces inside Go template tags (`{{ $x }}`); extract repeated template logic into partials; follow the included Prettier config.
- No breaking changes: don't rename partials, remove config options, or change template signatures — users' sites silently depend on them.
- Single-purpose commits/PRs with Gitmoji prefixes and imperative mood (≤72-char summary).
## Agent skill — keep it in sync
`.claude/skills/blowfish/SKILL.md` teaches coding agents how to install, configure, and use Blowfish. **Any PR that adds/renames/removes a config option, shortcode, homepage/hero/header layout, or installation step must update the skill in the same PR.** Treat it like documentation: if `exampleSite/content/docs/` needs updating, the skill probably does too.
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.162.0)
@@ -80,11 +82,22 @@ Blowfish unterstützt mehrere Installationsmethoden - als git submodule, als Hug
Detaillierte Anweisungen für jede Methode finden Sie in der [Installations-Dokumentation](https://blowfish.page/docs/installation). Für die einfachste Einrichtung sollten Sie die Dokumentation konsultieren. Im Folgenden finden Sie eine Schnellstartanleitung mit Submodulen, wenn Sie git verwenden, oder Hugo Modules, wenn Sie bereits Erfahrung mit der Installation von Hugo-Themes haben.
### Schnellstart mit einem KI-Agenten
Blowfish enthält einen [Agent-Skill](https://github.com/nunocoracao/blowfish/tree/main/.claude/skills/blowfish), der KI-Coding-Agenten — wie Claude Code — beibringt, das Theme zu installieren, zu konfigurieren und Websites damit zu erstellen. Installieren Sie ihn über den Blowfish-Plugin-Marketplace in Claude Code:
```shell
/plugin marketplace add nunocoracao/blowfish
/plugin install blowfish@blowfish
```
Oder kopieren Sie einfach den Skill-Ordner in Ihr Website-Repository unter `.claude/skills/blowfish/` — Agenten erkennen Projekt-Skills automatisch. Bitten Sie dann Ihren Agenten, Blowfish für Sie einzurichten.
### Schnellstart mit Blowfish Tools
> **Hinweis:** Stellen Sie sicher, dass Sie **Node.js**, **Git** und **Hugo** installiert haben und dass Sie ein neues Hugo-Projekt erstellt haben, bevor Sie fortfahren.
Wir haben gerade ein neues CLI-Tool gestartet, das Ihnen beim Einstieg in Blowfish hilft. Es erstellt ein neues Hugo-Projekt, installiert das Theme und richtet die Theme-Konfigurationsdateien für Sie ein. Es befindet sich noch in der Beta-Phase, also [melden Sie bitte alle Probleme, die Sie finden](https://github.com/nunocoracao/blowfish-tools).
Blowfish Tools ist ein CLI-Tool, das Ihnen beim Einstieg in Blowfish hilft. Es erstellt ein neues Hugo-Projekt, installiert das Theme und richtet die Theme-Konfigurationsdateien für Sie ein. Bitte [melden Sie alle Probleme, die Sie finden](https://github.com/nunocoracao/blowfish-tools).
Installieren Sie das CLI-Tool global mit npm (oder einem anderen Paketmanager):
```shell
@@ -137,7 +150,7 @@ blowfish-tools new mynewsite
```toml
[[imports]]
path = "github.com/nunocoracao/blowfish/v2"
path = "github.com/nunocoracao/blowfish/v3"
```
3. Starten Sie Ihren Server mit `hugo server` und das Theme wird automatisch heruntergeladen.
@@ -156,6 +169,10 @@ Wenn neue Versionen veröffentlicht werden, können Sie das Theme mit Hugo aktua
Detaillierte [Update-Anweisungen](https://blowfish.page/docs/installation/#installing-updates) sind in der Dokumentation verfügbar.
### Upgrade von v2 auf v3
Blowfish v3 ist vollständig abwärtskompatibel: Jede neue Funktion ist optional und es wurden keine Konfigurationsoptionen oder Templates entfernt. Git-submodule- und manuelle Installationen werden wie gewohnt ohne Änderungen aktualisiert; Hugo-Module-Nutzer ändern lediglich den Importpfad in `config/_default/module.toml` von `github.com/nunocoracao/blowfish/v2` zu `github.com/nunocoracao/blowfish/v3` und führen `hugo mod get -u` aus. Details finden Sie in den [Upgrade-Anweisungen](https://blowfish.page/docs/installation/#upgrading-from-v2-to-v3).
---
## Mitwirken
@@ -172,8 +189,4 @@ Wenn Sie in der Lage sind, einen Fehler zu beheben oder eine neue Funktion zu im
---
## Stargazers im Zeitverlauf
[](https://starchart.cc/nunocoracao/blowfish)
[](https://github.com/gohugoio/hugo/releases/tag/v0.141.0)
[](https://github.com/gohugoio/hugo/releases/tag/v0.162.0)
@@ -13,27 +13,29 @@ Blowfish está diseñado para ser un tema potente y ligero para [Hugo](https://g
🌏 [Sitio de demostración](https://blowfish.page/)
📑 [Documentación del tema](https://blowfish.page/docs/)
💎 [Tienda de merchandising](http://tee.pub/lic/qwSlWVBL5zc)
🐛 [Reportes de errores y problemas](https://github.com/nunocoracao/blowfish/issues)
💡 [Preguntas y solicitudes de funcionalidades](https://github.com/nunocoracao/blowfish/discussions)
<a href="https://www.buymeacoffee.com/nunocoracao" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" style="height: 60px !important;width: 217px !important;" ></a>
<a target="_blank" href="http://tee.pub/lic/qwSlWVBL5zc"><img class="nozoom" src="https://img.buymeacoffee.com/button-api/?text=Merch Store &emoji=💎&slug=nunocoracao&button_colour=5F7FFF&font_colour=ffffff&font_family=Lato&outline_colour=000000&coffee_colour=FFDD00" /></a>
## Características
- Diseño totalmente responsive construido con Tailwind CSS 3.0
- Diseño totalmente responsive construido con Tailwind CSS 4
- Múltiples esquemas de color (o personaliza completamente el tuyo propio)
- Modo oscuro (forzado activado/desactivado o cambio automático con opción de usuario)
- Múltiples diseños de página de inicio, incluyendo una landing page estilo producto con imagen hero, estadísticas y cuadrículas de características
- Encabezado flotante con efecto cristal y atajo de búsqueda ⌘K / Ctrl+K
- Lienzo de fondo global con secciones hero que se disuelven en él al hacer scroll
- Barra de progreso de lectura para artículos
- Selector interactivo de diseños de página de inicio para previsualizaciones en vivo
- Skill de agente para que los agentes de programación con IA (como Claude Code) instalen y configuren el tema por ti
- Páginas aptas para impresión con estilos de impresión dedicados
- Configuración altamente personalizable
- Integración con Firebase para soportar datos dinámicos
- Contador de vistas y mecanismo de likes
- Artículos relacionados
- Múltiples diseños de página de inicio
- Múltiples autores
- Series de artículos
- Ordenación de artículos basada en fecha y peso
@@ -44,9 +46,9 @@ Blowfish está diseñado para ser un tema potente y ligero para [Hugo](https://g
- Tabla de contenidos con desplazamiento
- Soporte de contenido multilingüe incluyendo idiomas RTL
- Capacidad de enlazar a publicaciones en sitios web de terceros
-Soporte para varios shortcodes como Gallery, Timeline, GitHub cards y Carousels
-Más de 40 shortcodes incluyendo Gallery, Timeline, GitHub cards, Carousels, Stats, cuadrículas de características, Steps y botones CTA
- Sintaxis de GitHub Alerts, 15 tipos, soporte plegable
- Integración con Buymeacoffee
- Integración con Buy Me a Coffee y Ko-fi
- Búsqueda en el sitio del lado del cliente impulsada por Fuse.js
- Diagramas y visualizaciones usando Mermaid
- Gráficos usando Chart.js
@@ -80,11 +82,22 @@ Blowfish soporta varios métodos de instalación - como submódulo de git, módu
Las instrucciones detalladas para cada método se pueden encontrar en la documentación de [Instalación](https://blowfish.page/docs/installation). Deberías consultar la documentación para obtener la experiencia de configuración más simple. A continuación se presenta una guía de inicio rápido usando submódulos si estás usando git, o módulos de Hugo si ya tienes confianza instalando temas de Hugo.
### Inicio rápido con un agente de IA
Blowfish incluye un [agent skill](https://github.com/nunocoracao/blowfish/tree/main/.claude/skills/blowfish) que enseña a los agentes de programación con IA — como Claude Code — a instalar, configurar y construir sitios con el tema. Instálalo desde el marketplace de plugins de Blowfish en Claude Code:
```shell
/plugin marketplace add nunocoracao/blowfish
/plugin install blowfish@blowfish
```
O simplemente copia la carpeta del skill en el repositorio de tu sitio en `.claude/skills/blowfish/` — los agentes detectan los skills de proyecto automáticamente. Después pídele a tu agente que configure Blowfish por ti.
### Inicio rápido usando Blowfish Tools
> **Nota:** Asegúrate de tener **Node.js**, **Git** y **Hugo** instalados, y de haber creado un nuevo proyecto Hugo antes de continuar.
Acabamos de lanzar una nueva herramienta CLI para ayudarte a comenzar con Blowfish. Creará un nuevo proyecto Hugo, instalará el tema y configurará los archivos de configuración del tema por ti. Todavía está en beta, así que por favor [reporta cualquier problema que encuentres](https://github.com/nunocoracao/blowfish-tools).
Blowfish Tools es una herramienta CLI que te ayuda a comenzar con Blowfish. Creará un nuevo proyecto Hugo, instalará el tema y configurará los archivos de configuración del tema por ti. Por favor [reporta cualquier problema que encuentres](https://github.com/nunocoracao/blowfish-tools).
Instala la herramienta CLI globalmente usando npm (u otro gestor de paquetes):
```shell
@@ -137,7 +150,7 @@ blowfish-tools new mynewsite
```toml
[[imports]]
path = "github.com/nunocoracao/blowfish/v2"
path = "github.com/nunocoracao/blowfish/v3"
```
3. Inicia tu servidor usando `hugo server` y el tema se descargará automáticamente.
@@ -156,6 +169,10 @@ A medida que se publiquen nuevas versiones, puedes actualizar el tema usando Hug
Las [instrucciones de actualización](https://blowfish.page/docs/installation/#installing-updates) detalladas están disponibles en la documentación.
### Actualización de v2 a v3
Blowfish v3 es totalmente retrocompatible: cada nueva característica es opcional y no se ha eliminado ninguna opción de configuración ni plantilla. Las instalaciones con submódulo de git y manuales se actualizan como de costumbre sin cambios; los usuarios de módulos de Hugo solo tienen que cambiar la ruta de importación en `config/_default/module.toml` de `github.com/nunocoracao/blowfish/v2` a `github.com/nunocoracao/blowfish/v3` y ejecutar `hugo mod get -u`. Consulta las [instrucciones de actualización](https://blowfish.page/docs/installation/#upgrading-from-v2-to-v3) para más detalles.
---
## Contribuciones
@@ -172,8 +189,4 @@ Si puedes corregir un error o implementar una nueva característica, acepto PRs
---
## Stargazers a lo largo del tiempo
[](https://starchart.cc/nunocoracao/blowfish)
[](https://github.com/gohugoio/hugo/releases/tag/v0.141.0)
[](https://github.com/gohugoio/hugo/releases/tag/v0.162.0)
@@ -13,27 +13,29 @@ Blowfish est conçu pour être un thème puissant et léger pour [Hugo](https://
🌏 [Site de démonstration](https://blowfish.page/)
📑 [Documentation du thème](https://blowfish.page/docs/)
💎 [Boutique de produits dérivés](http://tee.pub/lic/qwSlWVBL5zc)
🐛 [Rapports de bugs et problèmes](https://github.com/nunocoracao/blowfish/issues)
💡 [Questions et demandes de fonctionnalités](https://github.com/nunocoracao/blowfish/discussions)
<a href="https://www.buymeacoffee.com/nunocoracao" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" style="height: 60px !important;width: 217px !important;" ></a>
<a target="_blank" href="http://tee.pub/lic/qwSlWVBL5zc"><img class="nozoom" src="https://img.buymeacoffee.com/button-api/?text=Merch Store &emoji=💎&slug=nunocoracao&button_colour=5F7FFF&font_colour=ffffff&font_family=Lato&outline_colour=000000&coffee_colour=FFDD00" /></a>
## Fonctionnalités
- Disposition entièrement responsive construite avec Tailwind CSS 3.0
- Disposition entièrement responsive construite avec Tailwind CSS 4
- Plusieurs palettes de couleurs (ou personnalisez entièrement la vôtre)
- Mode sombre (forcé activé/désactivé ou basculement automatique avec commutateur utilisateur)
- Plusieurs mises en page pour la page d'accueil, y compris une page d'atterrissage de style produit avec image hero, statistiques et grilles de fonctionnalités
- En-tête flottant effet verre avec raccourci de recherche ⌘K / Ctrl+K
- Canevas d'arrière-plan global avec des sections hero qui s'y dissolvent au défilement
- Barre de progression de lecture pour les articles
- Sélecteur interactif de mise en page de la page d'accueil pour des aperçus en direct
- Skill d'agent permettant aux agents de codage IA (comme Claude Code) d'installer et de configurer le thème pour vous
- Pages adaptées à l'impression avec des styles d'impression dédiés
- Configuration hautement personnalisable
- Intégration Firebase pour prendre en charge les données dynamiques
- Compteur de vues et mécanisme de likes
- Articles connexes
- Plusieurs mises en page pour la page d'accueil
- Plusieurs auteurs
- Séries d'articles
- Tri des articles basé sur la date et le poids
@@ -44,9 +46,9 @@ Blowfish est conçu pour être un thème puissant et léger pour [Hugo](https://
- Table des matières défilable
- Support du contenu multilingue incluant la prise en charge des langues RTL
- Possibilité de lier des articles sur des sites web tiers
- Prise en charge de plusieurs shortcodes comme Gallery, Timeline, GitHub cards et Carousels
- Plus de 40 shortcodes incluant Gallery, Timeline, GitHub cards, Carousels, Stats, grilles de fonctionnalités, Steps et boutons CTA
- Syntaxe GitHub Alerts, 15 types, support pliable
- Intégration Buymeacoffee
- Intégration Buy Me a Coffee et Ko-fi
- Recherche côté client alimentée par Fuse.js
- Diagrammes et visualisations utilisant Mermaid
- Graphiques utilisant Chart.js
@@ -80,11 +82,22 @@ Blowfish prend en charge plusieurs méthodes d'installation - en tant que sous-m
Des instructions détaillées pour chaque méthode se trouvent dans la documentation [Installation](https://blowfish.page/docs/installation). Vous devriez consulter la documentation pour l'expérience de configuration la plus simple. Ci-dessous se trouve un guide de démarrage rapide utilisant les sous-modules si vous utilisez git, ou les modules Hugo si vous êtes déjà à l'aise avec l'installation de thèmes Hugo.
### Démarrage rapide avec un agent IA
Blowfish inclut un [agent skill](https://github.com/nunocoracao/blowfish/tree/main/.claude/skills/blowfish) qui apprend aux agents de codage IA — comme Claude Code — à installer, configurer et construire des sites avec le thème. Installez-le depuis la marketplace de plugins Blowfish dans Claude Code :
```shell
/plugin marketplace add nunocoracao/blowfish
/plugin install blowfish@blowfish
```
Ou copiez simplement le dossier du skill dans le dépôt de votre site à l'emplacement `.claude/skills/blowfish/` — les agents détectent automatiquement les skills de projet. Demandez ensuite à votre agent de configurer Blowfish pour vous.
### Démarrage rapide avec Blowfish Tools
> **Note :** Assurez-vous d'avoir **Node.js**, **Git** et **Hugo** installés, et d'avoir créé un nouveau projet Hugo avant de continuer.
Nous venons de lancer un nouvel outil CLI pour vous aider à démarrer avec Blowfish. Il créera un nouveau projet Hugo, installera le thème et configurera les fichiers de configuration du thème pour vous. Il est encore en version bêta, veuillez donc [signaler tout problème que vous rencontrez](https://github.com/nunocoracao/blowfish-tools).
Blowfish Tools est un outil CLI qui vous aide à démarrer avec Blowfish. Il créera un nouveau projet Hugo, installera le thème et configurera les fichiers de configuration du thème pour vous. Veuillez [signaler tout problème que vous rencontrez](https://github.com/nunocoracao/blowfish-tools).
Installez l'outil CLI globalement en utilisant npm (ou un autre gestionnaire de paquets) :
```shell
@@ -137,7 +150,7 @@ blowfish-tools new mynewsite
```toml
[[imports]]
path = "github.com/nunocoracao/blowfish/v2"
path = "github.com/nunocoracao/blowfish/v3"
```
3. Démarrez votre serveur en utilisant `hugo server` et le thème sera téléchargé automatiquement.
@@ -156,6 +169,10 @@ Au fur et à mesure que de nouvelles versions sont publiées, vous pouvez mettre
Des [instructions de mise à jour](https://blowfish.page/docs/installation/#installing-updates) détaillées sont disponibles dans la documentation.
### Mise à niveau de v2 vers v3
Blowfish v3 est entièrement rétrocompatible : chaque nouvelle fonctionnalité est optionnelle et aucune option de configuration ni aucun template n'a été supprimé. Les installations par sous-module git et manuelles se mettent à niveau comme d'habitude, sans aucun changement ; les utilisateurs de modules Hugo doivent simplement changer le chemin d'import dans `config/_default/module.toml` de `github.com/nunocoracao/blowfish/v2` à `github.com/nunocoracao/blowfish/v3` puis exécuter `hugo mod get -u`. Consultez les [instructions de mise à niveau](https://blowfish.page/docs/installation/#upgrading-from-v2-to-v3) pour plus de détails.
---
## Contribuer
@@ -172,8 +189,4 @@ Si vous êtes en mesure de corriger un bug ou de mettre en œuvre une nouvelle f
---
## Évolution des stargazers
[](https://starchart.cc/nunocoracao/blowfish)
[](https://github.com/gohugoio/hugo/releases/tag/v0.141.0)
[](https://github.com/gohugoio/hugo/releases/tag/v0.162.0)
- Tata letak responsif sepenuhnya dengan Tailwind CSS 3.0
- Tata letak responsif sepenuhnya dengan Tailwind CSS 4
- Beragam skema warna (atau sesuaikan sendiri)
- Mode gelap (paksa aktif/nonaktif atau otomatis dengan pengaturan pengguna)
- Beragam tata letak halaman utama, termasuk landing page bergaya produk dengan gambar hero, statistik, dan grid fitur
- Header kaca mengambang dengan pintasan pencarian ⌘K / Ctrl+K
- Kanvas latar belakang global dengan bagian hero yang melebur ke dalamnya saat digulir
- Bilah kemajuan membaca untuk artikel
- Pengalih tata letak halaman utama interaktif untuk pratinjau langsung
- Agent skill agar agen pemrograman AI (seperti Claude Code) dapat menginstal dan mengonfigurasi tema untuk Anda
- Halaman ramah cetak dengan gaya cetak khusus
- Konfigurasi yang sangat dapat disesuaikan
- Integrasi Firebase untuk mendukung data dinamis
- Penghitung tampilan & mekanisme suka
- Artikel terkait
- Beragam tata letak halaman utama
- Dukungan untuk banyak penulis
- Seri artikel
- Penyortiran artikel berdasarkan tanggal dan bobot
@@ -40,9 +44,9 @@ Blowfish dirancang sebagai tema yang kuat dan ringan untuk [Hugo](https://gohugo
- Daftar isi yang dapat digulir
- Dukungan untuk konten multibahasa termasuk bahasa RTL
- Kemampuan untuk menautkan ke artikel di situs web pihak ketiga
-Dukungan untuk beberapa shortcode seperti Galeri, Timeline, Kartu GitHub, dan Carousel
-Lebih dari 40 shortcode termasuk Galeri, Timeline, Kartu GitHub, Carousel, Statistik, Grid fitur, Langkah, dan tombol CTA
- Sintaks GitHub Alerts, 15 jenis, dukungan lipat
- Integrasi BuyMeACoffee
- Integrasi BuyMe a Coffee dan Ko-fi
- Pencarian situs berbasis klien dengan Fuse.js
- Diagram dan visualisasi menggunakan Mermaid
- Grafik menggunakan Chart.js
@@ -74,13 +78,24 @@ Blowfish memiliki [dokumentasi lengkap](https://blowfish.page/docs/) yang mencak
Blowfish mendukung beberapa metode instalasi - sebagai submodul git, Modul Hugo, atau instalasi manual sepenuhnya.
Instruksi terperinci untuk setiap metode dapat ditemukan dalam [dokumentasi instalasi](https://blowfish.page/docs/installation).
Instruksi terperinci untuk setiap metode dapat ditemukan dalam [dokumentasi instalasi](https://blowfish.page/docs/installation). Anda sebaiknya membaca dokumentasi untuk pengalaman penyiapan yang paling sederhana. Berikut ini adalah panduan memulai cepat menggunakan submodul jika Anda menggunakan git, atau modul Hugo jika Anda sudah terbiasa menginstal tema Hugo.
### Instalasi Cepat Menggunakan Agen AI
Blowfish menyertakan sebuah [agent skill](https://github.com/nunocoracao/blowfish/tree/main/.claude/skills/blowfish) yang mengajarkan agen pemrograman AI — seperti Claude Code — cara menginstal, mengonfigurasi, dan membangun situs dengan tema ini. Instal dari marketplace plugin Blowfish di Claude Code:
```shell
/plugin marketplace add nunocoracao/blowfish
/plugin install blowfish@blowfish
```
Atau cukup salin folder skill ke repositori situs Anda di `.claude/skills/blowfish/` — agen akan mengenali skill proyek secara otomatis. Kemudian minta agen Anda untuk menyiapkan Blowfish untuk Anda.
### Instalasi Cepat Menggunakan Blowfish Tools
> **Catatan:** Pastikan Anda sudah menginstal **Node.js**, **Git**, dan **Hugo**, serta telah membuat proyek Hugo sebelum melanjutkan.
Kami baru saja meluncurkan alat CLI baru untuk membantu Anda memulai dengan Blowfish. Ini akan membuat proyek Hugo baru, menginstal tema, dan mengatur file konfigurasi tema untuk Anda.
Blowfish Tools adalah alat CLI yang membantu Anda memulai dengan Blowfish. Alat ini akan membuat proyek Hugo baru, menginstal tema, dan mengatur file konfigurasi tema untuk Anda. Silakan [laporkan masalah apa pun yang Anda temukan](https://github.com/nunocoracao/blowfish-tools).
Instal alat CLI secara global menggunakan npm (atau manajer paket lainnya):
```shell
@@ -113,17 +128,45 @@ blowfish-tools new mynewsite
3. Hapus file `hugo.toml` di root proyek dan salin file `*.toml` dari tema ke dalam folder `config/_default/`.
Anda akan menemukan file konfigurasi tema ini di direktori cache Hugo, atau [unduh salinannya](https://github.com/nunocoracao/blowfish/releases/latest/download/config-default.zip) dari GitHub.
4. Ikuti petunjuk [Memulai](https://blowfish.page/docs/getting-started/) untuk mengonfigurasi situs web Anda.
### Memperbarui Tema
### Instalasi Cepat Menggunakan Hugo
Untuk memperbarui tema ke rilis terbaru, cukup jalankan perintah berikut di direktori proyek Anda:
```shell
hugo mod get -u
```
> **Catatan:** Pastikan Anda sudah menginstal **Go** dan **Hugo**, serta telah membuat proyek Hugo baru sebelum melanjutkan.
1. Dari direktori proyek Anda, inisialisasi Hugo Modules:
```shell
hugo mod init github.com/<username>/<repo-name>
```
2. Buat `config/_default/module.toml` dan tambahkan berikut ini:
```toml
[[imports]]
path = "github.com/nunocoracao/blowfish/v3"
```
3. Jalankan server Anda menggunakan `hugo server` dan tema akan diunduh secara otomatis.
4. Di folder root situs web Anda, hapus file `hugo.toml` yang dibuat oleh Hugo. Salin file konfigurasi `*.toml` dari tema ke folder `config/_default/` Anda.
> **Catatan:** Jangan menimpa file `module.toml` yang Anda buat di atas!
Anda akan menemukan file konfigurasi tema ini di direktori cache Hugo, atau [unduh salinannya](https://github.com/nunocoracao/blowfish/releases/latest/download/config-default.zip) dari GitHub.
5. Ikuti petunjuk [Memulai](https://blowfish.page/docs/getting-started/) untuk mengonfigurasi situs web Anda.
### Menginstal Pembaruan Tema
Saat rilis baru diterbitkan, Anda dapat memperbarui tema menggunakan Hugo. Cukup jalankan `hugo mod get -u` dari direktori proyek Anda dan tema akan diperbarui secara otomatis ke rilis terbaru.
Instruksi pembaruan selengkapnya tersedia dalam [dokumentasi instalasi](https://blowfish.page/docs/installation/#installing-updates).
### Peningkatan dari v2 ke v3
Blowfish v3 sepenuhnya kompatibel dengan versi sebelumnya: setiap fitur baru bersifat opsional dan tidak ada opsi konfigurasi atau templat yang dihapus. Instalasi submodul git dan manual diperbarui seperti biasa tanpa perubahan apa pun; pengguna modul Hugo cukup mengubah jalur impor di `config/_default/module.toml` dari `github.com/nunocoracao/blowfish/v2` menjadi `github.com/nunocoracao/blowfish/v3` lalu menjalankan `hugo mod get -u`. Lihat [instruksi peningkatan](https://blowfish.page/docs/installation/#upgrading-from-v2-to-v3) untuk detailnya.
---
## Kontribusi
@@ -138,8 +181,6 @@ Jika Anda bisa memperbaiki bug atau menambahkan fitur baru, kontribusi dalam ben
---
## Grafik Stargazers
[](https://starchart.cc/nunocoracao/blowfish)
[](https://github.com/gohugoio/hugo/releases/tag/v0.141.0)
[](https://github.com/gohugoio/hugo/releases/tag/v0.162.0)
各方法の詳細な手順は、[インストール](https://blowfish.page/docs/installation)ドキュメントに記載されています。最も簡単なセットアップ方法については、ドキュメントを参照してください。以下にクイックスタートガイドを示します。git を使用している場合はサブモジュール、Hugo テーマのインストールに慣れている場合は Hugo モジュールを使用するのがおすすめです。
[](https://github.com/gohugoio/hugo/releases/tag/v0.141.0)
[](https://github.com/gohugoio/hugo/releases/tag/v0.162.0)
<a href="https://www.buymeacoffee.com/nunocoracao" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" style="height: 60px !important;width: 217px !important;" ></a>
<a target="_blank" href="http://tee.pub/lic/qwSlWVBL5zc"><img class="nozoom" src="https://img.buymeacoffee.com/button-api/?text=Merch Store &emoji=💎&slug=nunocoracao&button_colour=5F7FFF&font_colour=ffffff&font_family=Lato&outline_colour=000000&coffee_colour=FFDD00" /></a>
## Features
- Fully responsive layout built with Tailwind CSS 3.0
- Fully responsive layout built with Tailwind CSS 4
- Multiple colour schemes (or fully customise your own)
- Dark mode (forced on/off or auto-switching with user toggle)
- Multiple homepage layouts including a product-style landing page with hero image, stats, and feature grids
- Floating glass header with ⌘K / Ctrl+K search shortcut
- Global background canvas with heroes that dissolve into it on scroll
- Reading progress bar for articles
- Interactive homepage layout switcher for live previews
- Agent skill so AI coding agents (like Claude Code) can install and configure the theme for you
- Print-friendly pages with dedicated print styles
- Highly customisable configuration
- Firebase integration to support dynamic data
- Views count & like mechanism
- Related articles
- Multiple homepage layouts
- Multiple authors
- Series of articles
- Date and weight based article sorting
@@ -44,9 +46,9 @@ Blowfish is designed to be a powerful, lightweight theme for [Hugo](https://gohu
- Scrollable table of contents
- Multilingual content support including support for RTL languages
- Ability to link to posts on third-party websites
-Support for several shortcodes like Gallery, Timeline, GitHub cards, and Carousels
-40+ shortcodes including Gallery, Timeline, GitHub cards, Carousels, Stats, Feature grids, Steps, and CTA buttons
- GitHub Alerts syntax, 15 types, collapsible support
- Buymeacoffee integration
- Buy Me a Coffee & Ko-fi integration
- Client-side site search powered by Fuse.js
- Diagrams and visualisations using Mermaid
- Charts using Chart.js
@@ -80,11 +82,22 @@ Blowfish supports several installation methods - as a git submodule, a Hugo Modu
Detailed instructions for each method can be found in the [Installation](https://blowfish.page/docs/installation) docs. You should consult the documentation for the simplest setup experience. Below is a quick start guide using submodules if you are using git, or Hugo modules if you're already confident installing Hugo themes.
### Quick start with an AI agent
Blowfish ships an [agent skill](https://github.com/nunocoracao/blowfish/tree/main/.claude/skills/blowfish) that teaches AI coding agents — like Claude Code — how to install, configure, and build sites with the theme. Install it from the Blowfish plugin marketplace in Claude Code:
```shell
/plugin marketplace add nunocoracao/blowfish
/plugin install blowfish@blowfish
```
Or simply copy the skill folder into your site repository at `.claude/skills/blowfish/` — agents pick up project skills automatically. Then ask your agent to set up Blowfish for you.
### Quick start using Blowfish Tools
> **Note:** Ensure you have **Node.js**, **Git** and **Hugo** installed, and that you have created a new Hugo project before proceeding.
We just launched a new CLI tool to help you get started with Blowfish. It will create a new Hugo project, install the theme and set up the theme configuration files for you. It's still in beta so please [report any issues you find](https://github.com/nunocoracao/blowfish-tools).
Blowfish Tools is a CLI that helps you get started with Blowfish. It will create a new Hugo project, install the theme and set up the theme configuration files for you. Please [report any issues you find](https://github.com/nunocoracao/blowfish-tools).
Install the CLI tool globally using npm (or other package manager):
```shell
@@ -137,7 +150,7 @@ blowfish-tools new mynewsite
```toml
[[imports]]
path = "github.com/nunocoracao/blowfish/v2"
path = "github.com/nunocoracao/blowfish/v3"
```
3. Start your server using `hugo server` and the theme will be downloaded automatically.
@@ -156,6 +169,10 @@ As new releases are posted, you can update the theme using Hugo. Simply run `hug
Detailed [update instructions](https://blowfish.page/docs/installation/#installing-updates) are available in the docs.
### Upgrading from v2 to v3
Blowfish v3 is fully backwards compatible: every new feature is opt-in and no configuration options or templates were removed. Git submodule and manual installs upgrade as usual with no changes; Hugo module users just change the import path in `config/_default/module.toml` from `github.com/nunocoracao/blowfish/v2` to `github.com/nunocoracao/blowfish/v3` and run `hugo mod get -u`. See the [upgrade instructions](https://blowfish.page/docs/installation/#upgrading-from-v2-to-v3) for details.
---
## Contributing
@@ -172,8 +189,4 @@ If you're able to fix a bug or implement a new feature, I welcome PRs for this p
---
## Stargazers over time
[](https://starchart.cc/nunocoracao/blowfish)
[](https://github.com/gohugoio/hugo/releases/tag/v0.141.0)
[](https://github.com/gohugoio/hugo/releases/tag/v0.162.0)
@@ -13,27 +13,29 @@ Blowfish foi projetado para ser um tema poderoso e leve para [Hugo](https://gohu
🌏 [Site de demonstração](https://blowfish.page/)
📑 [Documentação do tema](https://blowfish.page/docs/)
💎 [Loja de produtos](http://tee.pub/lic/qwSlWVBL5zc)
🐛 [Relatórios de bugs e problemas](https://github.com/nunocoracao/blowfish/issues)
💡 [Perguntas e solicitações de recursos](https://github.com/nunocoracao/blowfish/discussions)
<a href="https://www.buymeacoffee.com/nunocoracao" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" style="height: 60px !important;width: 217px !important;" ></a>
<a target="_blank" href="http://tee.pub/lic/qwSlWVBL5zc"><img class="nozoom" src="https://img.buymeacoffee.com/button-api/?text=Merch Store &emoji=💎&slug=nunocoracao&button_colour=5F7FFF&font_colour=ffffff&font_family=Lato&outline_colour=000000&coffee_colour=FFDD00" /></a>
## Recursos
- Layout totalmente responsivo construído com Tailwind CSS 3.0
- Layout totalmente responsivo construído com Tailwind CSS 4
- Múltiplos esquemas de cores (ou personalize completamente o seu próprio)
- Modo escuro (forçado ligado/desligado ou alternância automática com botão do usuário)
- Múltiplos layouts de página inicial, incluindo uma landing page estilo produto com imagem hero, estatísticas e grades de recursos
- Cabeçalho flutuante com efeito de vidro e atalho de busca ⌘K / Ctrl+K
- Tela de fundo global com seções hero que se dissolvem nela ao rolar a página
- Barra de progresso de leitura para artigos
- Seletor interativo de layouts da página inicial para pré-visualizações ao vivo
- Skill de agente para que agentes de programação com IA (como o Claude Code) instalem e configurem o tema para você
- Páginas adequadas para impressão com estilos de impressão dedicados
- Configuração altamente personalizável
- Integração com Firebase para suportar dados dinâmicos
- Contagem de visualizações e mecanismo de curtidas
- Artigos relacionados
- Múltiplos layouts de página inicial
- Múltiplos autores
- Séries de artigos
- Ordenação de artigos baseada em data e peso
@@ -44,9 +46,9 @@ Blowfish foi projetado para ser um tema poderoso e leve para [Hugo](https://gohu
- Índice com rolagem
- Suporte a conteúdo multilíngue incluindo suporte para idiomas RTL
- Capacidade de linkar para posts em sites de terceiros
-Suporte para vários shortcodes como Gallery, Timeline, GitHub cards e Carousels
-Mais de 40 shortcodes incluindo Gallery, Timeline, GitHub cards, Carousels, Stats, grades de recursos, Steps e botões CTA
- Sintaxe de alertas do GitHub, 15 tipos, suporte recolhível
- Integração com Buymeacoffee
- Integração com Buy Me a Coffee e Ko-fi
- Busca no site do lado do cliente alimentada por Fuse.js
- Diagramas e visualizações usando Mermaid
- Gráficos usando Chart.js
@@ -80,11 +82,22 @@ Blowfish suporta vários métodos de instalação - como submódulo git, Hugo Mo
Instruções detalhadas para cada método podem ser encontradas na documentação de [Instalação](https://blowfish.page/docs/installation). Você deve consultar a documentação para a experiência de configuração mais simples. Abaixo está um guia de início rápido usando submódulos se você estiver usando git, ou Hugo modules se você já estiver confiante em instalar temas Hugo.
### Início rápido com um agente de IA
Blowfish inclui um [agent skill](https://github.com/nunocoracao/blowfish/tree/main/.claude/skills/blowfish) que ensina agentes de programação com IA — como o Claude Code — a instalar, configurar e construir sites com o tema. Instale-o a partir do marketplace de plugins do Blowfish no Claude Code:
```shell
/plugin marketplace add nunocoracao/blowfish
/plugin install blowfish@blowfish
```
Ou simplesmente copie a pasta do skill para o repositório do seu site em `.claude/skills/blowfish/` — os agentes detectam skills de projeto automaticamente. Depois peça ao seu agente para configurar o Blowfish para você.
### Início rápido usando Blowfish Tools
> **Nota:** Certifique-se de ter **Node.js**, **Git** e **Hugo** instalados, e que você criou um novo projeto Hugo antes de prosseguir.
Acabamos de lançar uma nova ferramenta CLI para ajudá-lo a começar com Blowfish. Ela criará um novo projeto Hugo, instalará o tema e configurará os arquivos de configuração do tema para você. Ainda está em beta, então por favor [reporte quaisquer problemas que encontrar](https://github.com/nunocoracao/blowfish-tools).
Blowfish Tools é uma ferramenta CLI que ajuda você a começar com Blowfish. Ela criará um novo projeto Hugo, instalará o tema e configurará os arquivos de configuração do tema para você. Por favor [reporte quaisquer problemas que encontrar](https://github.com/nunocoracao/blowfish-tools).
Instale a ferramenta CLI globalmente usando npm (ou outro gerenciador de pacotes):
```shell
@@ -137,7 +150,7 @@ blowfish-tools new mynewsite
```toml
[[imports]]
path = "github.com/nunocoracao/blowfish/v2"
path = "github.com/nunocoracao/blowfish/v3"
```
3. Inicie seu servidor usando `hugo server` e o tema será baixado automaticamente.
@@ -156,6 +169,10 @@ blowfish-tools new mynewsite
[Instruções detalhadas de atualização](https://blowfish.page/docs/installation/#installing-updates) estão disponíveis na documentação.
### Atualizando da v2 para a v3
Blowfish v3 é totalmente retrocompatível: todos os novos recursos são opcionais e nenhuma opção de configuração ou template foi removida. As instalações por submódulo git e manuais são atualizadas normalmente, sem alterações; usuários de módulos Hugo só precisam alterar o caminho de importação em `config/_default/module.toml` de `github.com/nunocoracao/blowfish/v2` para `github.com/nunocoracao/blowfish/v3` e executar `hugo mod get -u`. Consulte as [instruções de atualização](https://blowfish.page/docs/installation/#upgrading-from-v2-to-v3) para mais detalhes.
---
## Contribuindo
@@ -172,8 +189,4 @@ Se você for capaz de corrigir um bug ou implementar um novo recurso, dou as boa
---
## Stargazers ao longo do tempo
[](https://starchart.cc/nunocoracao/blowfish)
[](https://github.com/gohugoio/hugo/releases/tag/v0.141.0)
[](https://github.com/gohugoio/hugo/releases/tag/v0.162.0)
@@ -13,27 +13,29 @@ Blowfish foi desenhado para ser um tema poderoso e leve para [Hugo](https://gohu
🌏 [Site de demonstração](https://blowfish.page/)
📑 [Documentação do tema](https://blowfish.page/docs/)
💎 [Loja de merchandising](http://tee.pub/lic/qwSlWVBL5zc)
🐛 [Relatórios de erros & problemas](https://github.com/nunocoracao/blowfish/issues)
💡 [Questões & pedidos de funcionalidades](https://github.com/nunocoracao/blowfish/discussions)
<a href="https://www.buymeacoffee.com/nunocoracao" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" style="height: 60px !important;width: 217px !important;" ></a>
<a target="_blank" href="http://tee.pub/lic/qwSlWVBL5zc"><img class="nozoom" src="https://img.buymeacoffee.com/button-api/?text=Merch Store &emoji=💎&slug=nunocoracao&button_colour=5F7FFF&font_colour=ffffff&font_family=Lato&outline_colour=000000&coffee_colour=FFDD00" /></a>
## Funcionalidades
- Layout totalmente responsivo construído com Tailwind CSS 3.0
- Layout totalmente responsivo construído com Tailwind CSS 4
- Múltiplos esquemas de cores (ou personalize completamente o seu próprio)
- Modo escuro (forçado ligado/desligado ou alternância automática com seletor do utilizador)
- Múltiplos layouts de página inicial, incluindo uma landing page de estilo produto com imagem hero, estatísticas e grelhas de funcionalidades
- Cabeçalho flutuante com efeito de vidro e atalho de pesquisa ⌘K / Ctrl+K
- Tela de fundo global com secções hero que se dissolvem nela ao fazer scroll
- Barra de progresso de leitura para artigos
- Seletor interativo de layouts da página inicial para pré-visualizações em direto
- Skill de agente para que agentes de programação com IA (como o Claude Code) instalem e configurem o tema por si
- Páginas adequadas para impressão com estilos de impressão dedicados
- Configuração altamente personalizável
- Integração com Firebase para suportar dados dinâmicos
- Contagem de visualizações & mecanismo de gostos
- Artigos relacionados
- Múltiplos layouts de página inicial
- Múltiplos autores
- Séries de artigos
- Ordenação de artigos baseada em data e peso
@@ -44,9 +46,9 @@ Blowfish foi desenhado para ser um tema poderoso e leve para [Hugo](https://gohu
- Índice de conteúdos com scroll
- Suporte para conteúdo multilingue incluindo suporte para línguas RTL
- Capacidade de criar links para publicações em sites de terceiros
-Suporte para vários shortcodes como Gallery, Timeline, GitHub cards e Carousels
-Mais de 40 shortcodes incluindo Gallery, Timeline, GitHub cards, Carousels, Stats, grelhas de funcionalidades, Steps e botões CTA
- Sintaxe GitHub Alerts, 15 tipos, suporte para elementos expansíveis
- Integração Buymeacoffee
- Integração Buy Me a Coffee e Ko-fi
- Pesquisa no site do lado do cliente alimentada por Fuse.js
- Diagramas e visualizações usando Mermaid
- Gráficos usando Chart.js
@@ -80,11 +82,22 @@ Blowfish suporta vários métodos de instalação - como um submódulo git, um M
Instruções detalhadas para cada método podem ser encontradas na documentação de [Instalação](https://blowfish.page/docs/installation). Deve consultar a documentação para a experiência de configuração mais simples. Abaixo está um guia de início rápido usando submódulos se estiver a usar git, ou módulos Hugo se já está confiante na instalação de temas Hugo.
### Início rápido com um agente de IA
Blowfish inclui um [agent skill](https://github.com/nunocoracao/blowfish/tree/main/.claude/skills/blowfish) que ensina agentes de programação com IA — como o Claude Code — a instalar, configurar e construir sites com o tema. Instale-o a partir do marketplace de plugins do Blowfish no Claude Code:
```shell
/plugin marketplace add nunocoracao/blowfish
/plugin install blowfish@blowfish
```
Ou simplesmente copie a pasta do skill para o repositório do seu site em `.claude/skills/blowfish/` — os agentes detetam skills de projeto automaticamente. Depois peça ao seu agente para configurar o Blowfish por si.
### Início rápido usando Blowfish Tools
> **Nota:** Certifique-se de que tem **Node.js**, **Git** e **Hugo** instalados, e que criou um novo projeto Hugo antes de continuar.
Acabámos de lançar uma nova ferramenta CLI para ajudá-lo a começar com Blowfish. Ela irá criar um novo projeto Hugo, instalar o tema e configurar os ficheiros de configuração do tema para si. Ainda está em beta por isso [reporte quaisquer problemas que encontrar](https://github.com/nunocoracao/blowfish-tools).
Blowfish Tools é uma ferramenta CLI que o ajuda a começar com Blowfish. Ela irá criar um novo projeto Hugo, instalar o tema e configurar os ficheiros de configuração do tema para si. Por favor [reporte quaisquer problemas que encontrar](https://github.com/nunocoracao/blowfish-tools).
Instale a ferramenta CLI globalmente usando npm (ou outro gestor de pacotes):
```shell
@@ -137,7 +150,7 @@ blowfish-tools new mynewsite
```toml
[[imports]]
path = "github.com/nunocoracao/blowfish/v2"
path = "github.com/nunocoracao/blowfish/v3"
```
3. Inicie o seu servidor usando `hugo server` e o tema será descarregado automaticamente.
@@ -156,6 +169,10 @@ blowfish-tools new mynewsite
[Instruções detalhadas de atualização](https://blowfish.page/docs/installation/#installing-updates) estão disponíveis na documentação.
### Atualização da v2 para a v3
Blowfish v3 é totalmente retrocompatível: todas as novas funcionalidades são opcionais e nenhuma opção de configuração ou template foi removida. As instalações por submódulo git e manuais atualizam-se como habitualmente, sem alterações; os utilizadores de módulos Hugo apenas precisam de alterar o caminho de importação em `config/_default/module.toml` de `github.com/nunocoracao/blowfish/v2` para `github.com/nunocoracao/blowfish/v3` e executar `hugo mod get -u`. Consulte as [instruções de atualização](https://blowfish.page/docs/installation/#upgrading-from-v2-to-v3) para mais detalhes.
---
## Contribuir
@@ -172,8 +189,4 @@ Se conseguir corrigir um erro ou implementar uma nova funcionalidade, aceito PRs
---
## Stargazers ao longo do tempo
[](https://starchart.cc/nunocoracao/blowfish)
[](https://github.com/gohugoio/hugo/releases/tag/v0.141.0)
[](https://github.com/gohugoio/hugo/releases/tag/v0.162.0)
每种方法的详细说明都可以在 [安装](https://blowfish.page/zh-cn/docs/installation) 文档中找到。为了获得最简单的安装体验,请查阅文档。如果你使用的是 git,请阅读下面使用子模块的快速开始指南;如果你能安装 Hugo 主题,请阅读下面 Hugo 模块的快速开始指南。
### 使用 AI 代理快速开始
Blowfish 内置了一个[代理技能(agent skill)](https://github.com/nunocoracao/blowfish/tree/main/.claude/skills/blowfish),可以教 AI 编程代理(如 Claude Code)如何安装、配置主题并用它构建网站。在 Claude Code 中通过 Blowfish 插件市场安装:
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
/*! jQuery v3.7.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-deprecated/ajax-event-alias,-effects,-effects/animatedSelector,-effects/Tween | (c) OpenJS Foundation and other contributors | jquery.org/license */
!function(e,t){"use strict";"object"==typeofmodule&&"object"==typeofmodule.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)thrownewError("jQuery requires a window with a document");returnt(e)}:t(e)}("undefined"!=typeofwindow?window:this,function(ie,e){"use strict";varoe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){returnoe.flat.call(e)}:function(e){returnoe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeofe&&"number"!=typeofe.nodeType&&"function"!=typeofe.item},y=function(e){returnnull!=e&&e===e.window},m=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};functionb(e,t,n){varr,i,o=(n=n||m).createElement("script");if(o.text=e,t)for(rinu)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}functionx(e){returnnull==e?e+"":"object"==typeofe||"function"==typeofe?n[i.call(e)]||"object":typeofe}vart="3.7.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-deprecated/ajax-event-alias,-effects,-effects/animatedSelector,-effects/Tween",l=/HTML$/i,ce=function(e,t){returnnewce.fn.init(e,t)};functionc(e){vart=!!e&&"length"ine&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeoft&&0<t&&t-1ine)}functionfe(e,t){returne.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}ce.fn=ce.prototype={jquery:t,constructor:ce,length:0,toArray:function(){returnae.call(this)},get:function(e){returnnull==e?ae.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){vart=ce.merge(this.constructor(),e);returnt.prevObject=this,t},each:function(e){returnce.each(this,e)},map:function(n){returnthis.pushStack(ce.map(this,function(e,t){returnn.call(e,t,e)}))},slice:function(){returnthis.pushStack(ae.apply(this,arguments))},first:function(){returnthis.eq(0)},last:function(){returnthis.eq(-1)},even:function(){returnthis.pushStack(ce.grep(this,function(e,t){return(t+1)%2}))},odd:function(){returnthis.pushStack(ce.grep(this,function(e,t){returnt%2}))},eq:function(e){vart=this.length,n=+e+(e<0?t:0);returnthis.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){returnthis.prevObject||this.constructor()},push:s,sort:oe.sort,splice:oe.splice},ce.extend=ce.fn.extend=function(){vare,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeofa&&(l=a,a=arguments[s]||{},s++),"object"==typeofa||v(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(tine)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(ce.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||ce.isPlainObject(n)?n:{},i=!1,a[t]=ce.extend(l,o,r)):void0!==r&&(a[t]=r));returna},ce.extend({expando:"jQuery"+(t+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){thrownewError(e)},noop:function(){},isPlainObject:function(e){vart,n;return!(!e||"[object Object]"!==i.call(e))&&(!(t=r(e))||"function"==typeof(n=ue.call(t,"constructor")&&t.constructor)&&o.call(n)===a)},isEmptyObject:function(e){vart;for(tine)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){varn,r=0;if(c(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}elsefor(rine)if(!1===t.call(e[r],r,e[r]))break;returne},text:function(e){vart,n="",r=0,i=e.nodeType;if(!i)while(t=e[r++])n+=ce.text(t);return1===i||11===i?e.textContent:9===i?e.documentElement.textContent:3===i||4===i?e.nodeValue:n},makeArray:function(e,t){varn=t||[];returnnull!=e&&(c(Object(e))?ce.merge(n,"string"==typeofe?[e]:e):s.call(n,e)),n},inArray:function(e,t,n){returnnull==t?-1:se.call(t,e,n)},isXMLDoc:function(e){vart=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!l.test(t||n&&n.nodeName||"HTML")},merge:function(e,t){for(varn=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];returne.length=i,e},grep:function(e,t,n){for(varr=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);returnr},map:function(e,t,n){varr,i,o=0,a=[];if(c(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);elsefor(oine)null!=(i=t(e[o],o,n))&&a.push(i);returng(a)},guid:1,support:le}),"function"==typeofSymbol&&(ce.fn[Symbol.iterator]=oe[Symbol.iterator]),ce.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});varde=oe.pop,pe=oe.sort,he=oe.splice,ge="[\\x20\\t\\r\\n\\f]",ve=newRegExp("^"+ge+"+|((?:^|[^\\\\])(?:\\\\.)*)"+ge+"+$","g");ce.contains=function(e,t){varn=t&&t.parentNode;returne===n||!(!n||1!==n.nodeType||!(e.contains?e.contains(n):e.compareDocumentPosition&&16&e.compareDocumentPosition(n)))};varf=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;functiond(e,t){returnt?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e}ce.escapeSelector=function(e){return(e+Line 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(){returngo}});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,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}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={"&":"&",">":">","<":"<",'"':""","'":"'"},a=/[&><"']/g,l=e=>String(e).replace(a,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.
Loaded 100 of 2951 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.