mirror of
https://github.com/tiennm99/HugoBlox-kit.git
synced 2026-10-04 12:13:01 +00:00
chore: adopt Biome + Stylelint, modernize CI/CD, add security/support docs, minor JS fixes
- Linting/format - Replace ESLint/Prettier with Biome; remove old configs; add `biome.json`; update scripts - Tailwind-friendly `.stylelintrc.yaml`; Stylelint and Biome pass - Enable Biome across `modules/**`; prune legacy JS globals; ignore oversized `devicon.json` - Code fixes - `hb-theme.js`: avoid assignment-in-expressions; clearer dataset updates - `hugoblox-slides.js`: fix inner var scope (var → let); apply formatting - CI/CD - Split lint/build workflows; add path filters; Node via Corepack (pnpm from package.json) - Hugo pinned to env `HUGO_VERSION`; add consistency check vs `starters/academic-cv/hugoblox.yaml` - Nightly starters matrix build (academic-cv, landing-page); CodeQL weekly; resource caches - Workflows/Community - Greeter: switch to `pull_request_target`; add Contributor Guide to PR message - PR labeler for path-based labels - Repo policies/docs - `CODEOWNERS` for `@gcushen` - `SECURITY.md`, `SUPPORT.md` - Documented branch protection in `.github/settings.yml` - Move `CODE_OF_CONDUCT.md` to `.github/` - docs(zh): update `README.zh.md` translation Notes: - pnpm is sourced from `package.json: packageManager` via Corepack; no hard-coded pnpm versions in CI.
This commit is contained in:
1 parent
db8a975a9f
commit
d5d2f04c2d
91 files changed
+2957
-1993
No files matched your search
@@ -1,6 +0,0 @@
|
||||
**/*.min.js
|
||||
**/_vendor/
|
||||
**/vendor/
|
||||
public/
|
||||
**/assets/dist/**
|
||||
**/pagefind/**
|
||||
@@ -1,22 +0,0 @@
|
||||
env:
|
||||
browser: true
|
||||
es6: true
|
||||
node: true
|
||||
extends:
|
||||
- 'eslint:recommended'
|
||||
- 'prettier' # Prevent Prettier conflicts
|
||||
parserOptions:
|
||||
ecmaVersion: 12
|
||||
sourceType: module
|
||||
rules:
|
||||
no-unused-vars:
|
||||
- error
|
||||
globals:
|
||||
hljs: true
|
||||
imagesLoaded: true
|
||||
Isotope: true
|
||||
L: true # Global from maps library
|
||||
GMaps: true
|
||||
Fuse: true
|
||||
instantsearch: true
|
||||
PagefindUI: readonly
|
||||
@@ -0,0 +1,12 @@
|
||||
# CODEOWNERS helps route reviews automatically.
|
||||
# Update these owners to the correct team(s) as needed.
|
||||
|
||||
* @gcushen
|
||||
|
||||
# Core theme and modules
|
||||
modules/** @gcushen
|
||||
|
||||
# Starters
|
||||
starters/** @gcushen
|
||||
|
||||
|
||||
File renamed without changes.
@@ -0,0 +1,294 @@
|
||||
# Contributing to Hugo Blox 🚀
|
||||
|
||||
> **Welcome, researchers and academics!** Whether you're a professor sharing your publications, a PhD student building your first portfolio, or an AI researcher showcasing your work — this guide will help you contribute to the tool that powers 100,000s of researcher and lab websites worldwide.
|
||||
|
||||
[](https://hugoblox.com/all-access)
|
||||
[](https://github.com/sponsors/gcushen)
|
||||
[](https://github.com/HugoBlox/hugo-blox-builder)
|
||||
[](https://discord.gg/z8wNYzb)
|
||||
|
||||
## ❤️ Love Hugo Blox? Help keep it thriving.
|
||||
|
||||
> If Hugo Blox has saved you hours, taught you something, or helped you share your work, please take 2 minutes to give back. Most people won't — but if a small part of the community pitches in today, we can ship faster, fix more bugs, and keep the project healthy for everyone.
|
||||
|
||||
We want contributing to Hugo Blox to be fun, enjoyable, and educational for anyone and everyone. All contributions are welcome, including new plugins (such as new widgets, shortcodes, theme packs, and language packs), templates, features, documentation as well as updates and tweaks, blog posts, YouTube tutorials, live streaming customizations, meetups, and more.
|
||||
|
||||
## 🎯 Why Contribute?
|
||||
|
||||
### For Your Career
|
||||
|
||||
- **📝 Add to your CV**: Open source contributions demonstrate technical skills and collaboration
|
||||
- **🌍 Build your reputation**: Your contributions are publicly visible and credited
|
||||
- **🤝 Network with peers**: Connect with researchers and developers worldwide
|
||||
- **📚 Learn modern web tech**: Gain experience with Hugo, Tailwind CSS, and modern web development
|
||||
|
||||
### For the Community
|
||||
|
||||
- **🔬 Shape the tool you use**: Directly influence features that matter to academics
|
||||
- **⚡ Get fixes faster**: Contributing means your needs get addressed sooner
|
||||
- **🌱 Support open research**: Keep academic tools free and accessible to all
|
||||
- **🏆 Join 9k+ stars**: Be part of a thriving academic community
|
||||
|
||||
## 🚀 Quick Wins (Pick One!)
|
||||
|
||||
### ⏱️ 30 Seconds
|
||||
|
||||
- **⭐ Star the repository**: [github.com/HugoBlox/hugo-blox-builder](https://github.com/HugoBlox/hugo-blox-builder)
|
||||
- **👍 Vote on issues**: Shape the roadmap by [upvoting features](https://github.com/HugoBlox/hugo-blox-builder/issues) you need
|
||||
- **💡 Suggest an enhancement**: Have an idea? [Create a GitHub Issue](https://github.com/HugoBlox/hugo-blox-builder/issues) for the community to vote on
|
||||
- **📢 Share your site**: Post your Hugo Blox site on X/LinkedIn/Reddit with #HugoBlox
|
||||
|
||||
### 🕐 5-10 Minutes
|
||||
|
||||
- **📸 Share a screenshot**: Show your beautiful site in [Discussions](https://github.com/HugoBlox/hugo-blox-builder/discussions)
|
||||
- **🐛 Report issues clearly**: Found a bug? Help us fix it with clear steps to reproduce
|
||||
- **💬 Help in Discord**: Answer a question in our [Discord community](https://discord.gg/z8wNYzb)
|
||||
- **✏️ Fix documentation typos**: Spot an error? Fix it directly on GitHub (no setup needed!)
|
||||
|
||||
### 🕓 ~1 Hour
|
||||
|
||||
- **🔧 Implement a small issue**: See [help-wanted issues](https://github.com/HugoBlox/hugo-blox-builder/labels/help%20wanted)
|
||||
- **📚 Write documentation**: Help keep the documentation complete and up-to-date
|
||||
|
||||
### 🕘 A Few Hours
|
||||
|
||||
- **🧩 Take a larger issue**: Contribute a significant feature or improvement
|
||||
- **🎥 Create tutorials**: Record a YouTube video or write a detailed blog post
|
||||
|
||||
## Where to Start
|
||||
|
||||
Join the **Contributing** channel on the **[community Discord](https://discord.gg/z8wNYzb)**.
|
||||
|
||||
## General ways to help
|
||||
|
||||
Whether or not you're a developer, there are plenty of non-technical ways that you can help. We always need help with:
|
||||
|
||||
- Helping the Hugo Blox community via the live [chat](https://discord.gg/z8wNYzb) and [forum](https://github.com/HugoBlox/hugo-blox-builder/discussions)
|
||||
- Investigating and reviewing open [Issues](https://github.com/HugoBlox/hugo-blox-builder/issues) and [Pull Requests](https://github.com/HugoBlox/hugo-blox-builder/pulls)
|
||||
- Influence the roadmap! Give a thumbs up 👍 to upvote a feature request you would like to use
|
||||
- Improving the [documentation](https://docs.hugoblox.com/) and writing tutorials
|
||||
- Just click the _Edit_ button at the bottom of pages or open an issue with your proposed improvement
|
||||
- Testing and quality assurance, such as checking the latest version of the templates work as you expect and fixing any dead-links etc.
|
||||
- Translating the Hugo Blox templates or the Hugo Blox documentation
|
||||
- Hosting local Hugo Blox themed events or meetups
|
||||
- Promoting Hugo Blox to others by blogging, vlogging, code streaming, talking etc.
|
||||
|
||||
### For technical contributions
|
||||
|
||||
## 🛠️ Development Setup
|
||||
|
||||
> **No Go experience needed!** Most contributions only require basic HTML/CSS knowledge.
|
||||
|
||||
### Prerequisites
|
||||
|
||||
1. **Install Node.js** (for Tailwind CSS v4)
|
||||
|
||||
```bash
|
||||
# macOS/Linux (using Homebrew)
|
||||
brew install node
|
||||
|
||||
# Windows (download from nodejs.org)
|
||||
# Or use WSL2 for a Linux environment
|
||||
```
|
||||
|
||||
2. **Install pnpm** (our package manager)
|
||||
|
||||
```bash
|
||||
npm install -g pnpm
|
||||
```
|
||||
|
||||
3. **Install Hugo Extended** (latest version)
|
||||
|
||||
```bash
|
||||
# macOS
|
||||
brew install hugo
|
||||
|
||||
# Windows (using Chocolatey)
|
||||
choco install hugo-extended
|
||||
|
||||
# Linux
|
||||
snap install hugo --channel=extended
|
||||
```
|
||||
|
||||
### Getting Started
|
||||
|
||||
1. **Fork & Clone**
|
||||
|
||||
```bash
|
||||
# Fork on GitHub first, then:
|
||||
git clone https://github.com/YOUR-USERNAME/hugo-blox-builder.git
|
||||
cd hugo-blox-builder
|
||||
```
|
||||
|
||||
2. **Install Dependencies**
|
||||
|
||||
```bash
|
||||
pnpm install
|
||||
```
|
||||
|
||||
3. **View a Starter Site**
|
||||
|
||||
```bash
|
||||
# View the academic-cv starter (most popular)
|
||||
./scripts/view-starter-dev.sh academic-cv
|
||||
|
||||
# Site opens at http://localhost:8081
|
||||
```
|
||||
|
||||
That's it! You're ready to contribute. 🎉
|
||||
|
||||
### Repository structure
|
||||
|
||||
```
|
||||
hugo-blox-builder/
|
||||
├── modules/
|
||||
│ └── blox-tailwind/ # Main theme module
|
||||
│ ├── layouts/ # HTML templates (easy to edit!)
|
||||
│ ├── assets/css/ # Tailwind CSS v4 styles
|
||||
│ └── i18n/ # Translations (help translate!)
|
||||
├── starters/
|
||||
│ ├── academic-cv/ # CV/Resume template
|
||||
│ ├── blog/ # Blog template
|
||||
│ └── documentation/ # Docs template
|
||||
└── scripts/ # Helper scripts
|
||||
```
|
||||
|
||||
**Note**: To contribute an improvement to a starter template, make your changes to the relevant template within the `starters/` folder. **Do not submit PRs to the dedicated template repositories as they are read-only (changes are automatically propagated there from this mono-repository).**
|
||||
|
||||
#### What are some good issues to contribute to?
|
||||
|
||||
If you're a developer looking to contribute, but you're not sure where to begin, check out the [help wanted](https://github.com/HugoBlox/hugo-blox-builder/labels/help%20wanted) label on Github, which contains issues which need some love.
|
||||
|
||||
#### How can I propose an improvement?
|
||||
|
||||
If you have a straightforward bug fix or improvement, feel free to contribute it in a [Pull Request](https://github.com/HugoBlox/hugo-blox-builder/pulls) for the community to review.
|
||||
|
||||
If you have an idea for a new feature, please start by [searching the issues](https://github.com/HugoBlox/hugo-blox-builder/issues) to check that the feature has not already been suggested and then suggest it by [opening a new issue](https://github.com/HugoBlox/hugo-blox-builder/issues/new/choose), as adding new features to Hugo Blox first requires some analysis around the design and spec.
|
||||
|
||||
Please be mindful of the project [scope](#scope).
|
||||
|
||||
### Contribute Blox
|
||||
|
||||
[Create and publish your own blox](https://github.com/HugoBlox/create-blox)
|
||||
|
||||
### Contribute a shortcode
|
||||
|
||||
[Create and publish your own shortcode](https://github.com/HugoBlox/create-shortcode)
|
||||
|
||||
### Contribute a language pack
|
||||
|
||||
To contribute a **new language pack** or an improvement to a language pack, refer to the [language pack guide](https://docs.hugoblox.com/reference/language/#create-or-modify-a-language-pack). Once created, [fork Hugo Blox Builder](https://github.com/HugoBlox/hugo-blox-builder), place your language pack in `modules/blox-tailwind/i18n/`, add the language metadata to `modules/blox-tailwind/data/languages.yaml`, and open a Pull Request on Github with these two files.
|
||||
|
||||
### Contribute a theme pack
|
||||
|
||||
[View the guide](https://docs.hugoblox.com/getting-started/customize/#appearance) to contributing a color and font theme pack.
|
||||
|
||||
### Contribute a template
|
||||
|
||||
Consider duplicating a bare-bones template, such as the [Link In Bio](https://github.com/HugoBlox/hugo-blox-builder/tree/main/starters/link-in-bio) folder, and building up your own template using the Hugo Blox. Reach out on the **Contributing** channel in Discord to submit your template.
|
||||
|
||||
### Contribute to the Publication importer
|
||||
|
||||
To contribute to **Hugo Academic CLI**, the automatic publication and blog post importer, refer to [its dedicated Github repository](https://github.com/GetRD/academic-file-converter) and Issue queue.
|
||||
|
||||
## 🤝 Getting Help
|
||||
|
||||
### Where to Ask Questions
|
||||
|
||||
- **🗣️ Discord**: Real-time chat in [#contributing channel](https://discord.gg/z8wNYzb)
|
||||
- **💬 Discussions**: Async help in [GitHub Discussions](https://github.com/HugoBlox/hugo-blox-builder/discussions)
|
||||
- **🐛 Issues**: Bug reports and feature requests
|
||||
|
||||
### Tips for Getting Quick Help
|
||||
|
||||
1. **Share your environment**: Hugo version, HugoBlox version in `go.mod`, OS, browser
|
||||
2. **Provide minimal reproduction**: Smallest example showing the issue
|
||||
3. **Check existing issues**: Your question might be answered
|
||||
4. **Be specific**: "Publications not showing" → "BibTeX import fails with DOI links"
|
||||
|
||||
## 🏆 Recognition & Rewards
|
||||
|
||||
### How We Thank Contributors
|
||||
|
||||
- **🎖️ Credits**: Named in release notes
|
||||
- **🏷️ Contributor badge**: On your GitHub profile
|
||||
- **📣 Social shoutouts**: Featured on our social media
|
||||
- **🎯 Direct impact**: Your needs prioritized
|
||||
- **🤝 Network access**: Connect with core team
|
||||
|
||||
### Hall of Fame
|
||||
|
||||
Check our [Contributors page](https://github.com/HugoBlox/hugo-blox-builder/graphs/contributors) to see everyone who's helped!
|
||||
|
||||
## 💚 Can't Contribute Code? Support the Project!
|
||||
|
||||
### Other Ways to Help
|
||||
|
||||
- **💰 Sponsor**:
|
||||
- [All Access](https://hugoblox.com/all-access) - One-time payment for exclusive Pro templates and blocks
|
||||
- [GitHub Sponsors](https://github.com/sponsors/gcushen) - Monthly donation to support open source development
|
||||
- ☕️ [Donate a coffee](https://github.com/sponsors/gcushen?frequency=one-time)
|
||||
- **📢 Spread the Word**: Share your Hugo Blox site and experience
|
||||
- **📝 Write Tutorials**: Blog about your Hugo Blox setup
|
||||
- **🎥 Create Videos**: YouTube tutorials help many researchers
|
||||
- **🌍 Translate**: Help make Hugo Blox accessible globally
|
||||
|
||||
## Best practices
|
||||
|
||||
To create a consistent experience for all contributors and help prevent bugs, we have some best practices.
|
||||
|
||||
### Conventional Commits Specification
|
||||
|
||||
Please follow the [Conventional Commits Specification](https://www.conventionalcommits.org/en/v1.0.0/).
|
||||
|
||||
For example:
|
||||
|
||||
- new feature: `feat: add the X parameter`
|
||||
- bug fix: `fix: typo in implementation of X parameter`
|
||||
- performance: `perf: speed up init by pre-warming only pages`
|
||||
- refactor: `refactor: simplify citation logic`
|
||||
- docs: `docs: document the X parameter`
|
||||
- style: `style: change font color from black to blue`
|
||||
- build-related: `chore: rebuild JS assets`
|
||||
|
||||
### Linting and formatting
|
||||
|
||||
```sh
|
||||
pnpm install
|
||||
pnpm run lint
|
||||
pnpm run format
|
||||
```
|
||||
|
||||
## Scope
|
||||
|
||||
Please be _mindful_ that although we encourage feature requests, we cannot expand the scope of the project in every possible direction. There will be feature requests that don't make the roadmap.
|
||||
|
||||
Every feature requires effort not just to analyse the requirements, design it, implement it, test it, document it, merge it, write release notes for it, and release it, but also to continuously support users with it and maintain it (fixing and refactoring the feature as the project and its dependencies evolve).
|
||||
|
||||
The more regular active volunteers (rather than one-off contributors) we have supporting users and maintaining the project, the more feasible it becomes to expand the scope of the project.
|
||||
|
||||
The project's scope also has to be constrained so that it doesn't get too complex and unwieldy, from an architectural perspective, a testing perspective, and from a usability perspective.
|
||||
|
||||
Plugins (widgets, shortcodes, theme packs, language packs, and third-party JavaScript integrations) as well as templates allow the community to add major features without needing to contribute to Hugo Blox itself.
|
||||
|
||||
## 📋 Contribution Checklist
|
||||
|
||||
Before submitting a PR:
|
||||
|
||||
- [ ] **Test locally**: Run `./scripts/view-starter-dev.sh academic-cv`
|
||||
- [ ] **Check formatting**: Run `pnpm run lint:js` (if you edited JS)
|
||||
- [ ] **Update docs**: If adding features, document them in the code and in the PR
|
||||
- [ ] **Add examples**: Show how to use new features
|
||||
- [ ] **Write clear commit messages**: Help future contributors understand changes
|
||||
|
||||
## 🙏 Thank You!
|
||||
|
||||
Every contribution matters — whether it's fixing a typo, adding a translation, or building a new feature. You're helping thousands of researchers share their work with the world.
|
||||
|
||||
**Welcome to the Hugo Blox community!** 🎉
|
||||
|
||||
---
|
||||
|
||||
_Questions? Join our [Discord](https://discord.gg/z8wNYzb) or start a [Discussion](https://github.com/HugoBlox/hugo-blox-builder/discussions)._
|
||||
|
||||
_This project follows the [Contributor Covenant Code of Conduct](CODE_OF_CONDUCT.md)._
|
||||
@@ -0,0 +1,28 @@
|
||||
# Security Policy
|
||||
|
||||
We take security seriously and appreciate responsible disclosures.
|
||||
|
||||
## Supported Versions
|
||||
|
||||
We generally support the latest release of Hugo Blox modules and starters. Security fixes may be backported at the maintainers' discretion.
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
- Do not open a public issue.
|
||||
- Instead, open a private GitHub Security Advisory for this repository (Security tab → Report a vulnerability).
|
||||
- If you cannot access advisories, email the maintainers via the repository's contact links on GitHub.
|
||||
|
||||
Please include:
|
||||
|
||||
- A clear description and minimal reproduction
|
||||
- Impact assessment and potential exploit scenario
|
||||
- Suggested remediation, if known
|
||||
|
||||
We will acknowledge receipt within 72 hours and keep you updated.
|
||||
|
||||
## Scope
|
||||
|
||||
- This repository and official Hugo Blox modules/starters
|
||||
- Third-party templates and plugins are out of scope
|
||||
|
||||
Thank you for helping keep the community safe.
|
||||
@@ -0,0 +1,20 @@
|
||||
# Support
|
||||
|
||||
Need help? Here’s how to get support efficiently:
|
||||
|
||||
- Discord: https://discord.gg/z8wNYzb
|
||||
- GitHub Discussions: https://github.com/HugoBlox/hugo-blox-builder/discussions
|
||||
- Docs & Guides: https://docs.hugoblox.com/
|
||||
- Issues: use for confirmed bugs or well-scoped feature requests only
|
||||
|
||||
Tips for fast responses:
|
||||
|
||||
- Share versions (Hugo, module, OS) and a minimal reproduction
|
||||
- Paste relevant logs/console output
|
||||
- State expected vs actual behavior
|
||||
- Attach screenshots to visually explain the issue
|
||||
|
||||
Pro support & templates:
|
||||
|
||||
- Pro templates: https://hugoblox.com/pro
|
||||
- Pro Discord Channel (request to be added): https://discord.gg/z8wNYzb
|
||||
@@ -0,0 +1,14 @@
|
||||
documentation:
|
||||
- "**/*.md"
|
||||
ci:
|
||||
- ".github/workflows/**"
|
||||
modules:
|
||||
- "modules/**"
|
||||
starters:
|
||||
- "starters/**"
|
||||
config:
|
||||
- "package.json"
|
||||
- "pnpm-lock.yaml"
|
||||
- "biome.json"
|
||||
- ".stylelintrc.yaml"
|
||||
- "vite.config.js"
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 165 KiB |
@@ -0,0 +1,97 @@
|
||||
name: CI - Build Starters Matrix
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: "0 2 * * *"
|
||||
workflow_dispatch:
|
||||
push:
|
||||
branches: [main]
|
||||
paths:
|
||||
- "modules/**"
|
||||
- "starters/**"
|
||||
pull_request:
|
||||
paths:
|
||||
- "modules/**"
|
||||
- "starters/**"
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
concurrency:
|
||||
group: starters-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
env:
|
||||
NODE_VERSION: "22"
|
||||
HUGO_VERSION: "0.150.0"
|
||||
|
||||
jobs:
|
||||
build-starters:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
starter:
|
||||
- name: academic-cv
|
||||
path: starters/academic-cv
|
||||
- name: landing-page
|
||||
path: starters/landing-page
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
submodules: true
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Compute resources cache key
|
||||
id: reskey
|
||||
run: |
|
||||
set -euo pipefail
|
||||
P=${{ matrix.starter.path }}
|
||||
# Hash tracked files under assets/config and key files for invalidation
|
||||
HASH=$(git ls-files -s "$P/assets" "$P/config" "$P/hugo.yaml" "$P/package.json" 2>/dev/null | sha256sum | cut -d' ' -f1 || true)
|
||||
if [ -z "$HASH" ]; then HASH="nohash"; fi
|
||||
echo "key=${{ runner.os }}-hugo-resources-${{ matrix.starter.name }}-$HASH" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Cache Hugo resources (starter)
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ${{ matrix.starter.path }}/resources/
|
||||
key: ${{ steps.reskey.outputs.key }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-hugo-resources-${{ matrix.starter.name }}-
|
||||
|
||||
- name: Validate Hugo version consistency
|
||||
run: |
|
||||
set -euo pipefail
|
||||
EXPECTED=$(grep -E "^\s*hugo_version:\s*['\"]?" starters/academic-cv/hugoblox.yaml | sed -E "s/.*hugo_version:\s*['\"]?([^'\"]+)['\"]?.*/\1/")
|
||||
echo "Expected Hugo from starter: $EXPECTED"
|
||||
echo "Hugo in CI: $HUGO_VERSION"
|
||||
if [ "$EXPECTED" != "$HUGO_VERSION" ]; then
|
||||
echo "::error::HUGO_VERSION ($HUGO_VERSION) does not match starters/academic-cv/hugoblox.yaml ($EXPECTED). Update .github/workflows env or starter version."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: "${{ env.NODE_VERSION }}"
|
||||
cache: "pnpm"
|
||||
|
||||
- name: Enable Corepack (use pnpm from package.json)
|
||||
run: corepack enable
|
||||
|
||||
- name: Install starter dependencies
|
||||
working-directory: ${{ matrix.starter.path }}
|
||||
run: pnpm install --frozen-lockfile
|
||||
|
||||
- name: Setup Hugo
|
||||
uses: peaceiris/actions-hugo@v3
|
||||
with:
|
||||
hugo-version: "${{ env.HUGO_VERSION }}"
|
||||
extended: true
|
||||
|
||||
- name: Build ${{ matrix.starter.name }}
|
||||
working-directory: ${{ matrix.starter.path }}
|
||||
run: hugo --minify --panicOnWarning
|
||||
@@ -1,12 +1,39 @@
|
||||
name: Continuous Integration
|
||||
name: CI - Build Test Site
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
branches: [main]
|
||||
paths:
|
||||
- "modules/**"
|
||||
- "test/**"
|
||||
- "scripts/**"
|
||||
- "package.json"
|
||||
- "pnpm-lock.yaml"
|
||||
- "biome.json"
|
||||
- ".stylelintrc.yaml"
|
||||
- "vite.config.js"
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
branches: [main]
|
||||
paths:
|
||||
- "modules/**"
|
||||
- "test/**"
|
||||
- "scripts/**"
|
||||
- "package.json"
|
||||
- "pnpm-lock.yaml"
|
||||
- "biome.json"
|
||||
- ".stylelintrc.yaml"
|
||||
- "vite.config.js"
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
concurrency:
|
||||
group: build-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
env:
|
||||
NODE_VERSION: "22"
|
||||
HUGO_VERSION: "0.150.0"
|
||||
|
||||
jobs:
|
||||
build:
|
||||
@@ -15,7 +42,7 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
os: [ubuntu-latest]
|
||||
# node-version: [18.x]
|
||||
# node-version: [22.x]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
@@ -23,16 +50,28 @@ jobs:
|
||||
submodules: true # Fetch any Git submodules (true OR recursive)
|
||||
fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod
|
||||
|
||||
# - name: Use Node.js ${{ matrix.node-version }}
|
||||
# uses: actions/setup-node@v3
|
||||
# with:
|
||||
# node-version: ${{ matrix.node-version }}
|
||||
- name: Validate Hugo version consistency
|
||||
run: |
|
||||
set -euo pipefail
|
||||
EXPECTED=$(grep -E "^\s*hugo_version:\s*['\"]?" starters/academic-cv/hugoblox.yaml | sed -E "s/.*hugo_version:\s*['\"]?([^'\"]+)['\"]?.*/\1/")
|
||||
echo "Expected Hugo from starter: $EXPECTED"
|
||||
echo "Hugo in CI: $HUGO_VERSION"
|
||||
if [ "$EXPECTED" != "$HUGO_VERSION" ]; then
|
||||
echo "::error::HUGO_VERSION ($HUGO_VERSION) does not match starters/academic-cv/hugoblox.yaml ($EXPECTED). Update .github/workflows env or starter version."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- uses: pnpm/action-setup@v4
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
run_install: |
|
||||
- recursive: false
|
||||
args: [--frozen-lockfile]
|
||||
node-version: "${{ env.NODE_VERSION }}"
|
||||
cache: "pnpm"
|
||||
|
||||
- name: Enable Corepack (use pnpm from package.json)
|
||||
run: corepack enable
|
||||
|
||||
- name: Install root dependencies
|
||||
run: pnpm install --frozen-lockfile
|
||||
|
||||
- name: Install Tailwind v4 dependencies for test site
|
||||
run: |
|
||||
@@ -40,33 +79,20 @@ jobs:
|
||||
pnpm install --frozen-lockfile
|
||||
cd ..
|
||||
|
||||
- name: Check for linting errors
|
||||
run: pnpm run lint:js # TODO: also lint styles again once new rule errors resolved
|
||||
- name: Cache Hugo resources (test)
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: test/resources/
|
||||
key: ${{ runner.os }}-hugo-resources-test-${{ hashFiles('test/assets/**/*', 'test/config/**/*', 'test/hugo.yaml', 'test/package.json') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-hugo-resources-test-
|
||||
|
||||
- name: Setup Hugo
|
||||
uses: peaceiris/actions-hugo@v3
|
||||
with:
|
||||
hugo-version: '0.148.2'
|
||||
hugo-version: "${{ env.HUGO_VERSION }}"
|
||||
extended: true
|
||||
|
||||
- name: Build
|
||||
run: hugo --minify --templateMetrics --templateMetricsHints
|
||||
run: hugo --minify --panicOnWarning --templateMetrics --templateMetricsHints
|
||||
working-directory: test
|
||||
# format:
|
||||
# runs-on: ubuntu-latest
|
||||
#
|
||||
# steps:
|
||||
# - name: Checkout
|
||||
# uses: actions/checkout@v2
|
||||
# with:
|
||||
# # Make sure the actual branch is checked out when running on pull requests
|
||||
# ref: ${{ github.head_ref }}
|
||||
#
|
||||
# - name: Prettify code
|
||||
# uses: creyD/prettier_action@v3.1
|
||||
# with:
|
||||
# prettier_options: '--write blox-tailwind/*.{css,js,json,md,scss} blox-tailwind/**/*.{css,js,json,md,scss}' # Match package.json
|
||||
# prettier_version: '2.2.1' # Match package.json
|
||||
# commit_message: 'refactor: format code'
|
||||
# env:
|
||||
# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -0,0 +1,50 @@
|
||||
name: Security - CodeQL
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: "0 3 * * 0"
|
||||
push:
|
||||
branches: [main]
|
||||
paths:
|
||||
- "**/*.js"
|
||||
- "**/*.jsx"
|
||||
- "**/*.ts"
|
||||
- "**/*.tsx"
|
||||
- "**/*.py"
|
||||
- ".github/workflows/codeql.yml"
|
||||
pull_request:
|
||||
branches: [main]
|
||||
paths:
|
||||
- "**/*.js"
|
||||
- "**/*.jsx"
|
||||
- "**/*.ts"
|
||||
- "**/*.tsx"
|
||||
- "**/*.py"
|
||||
|
||||
permissions:
|
||||
actions: read
|
||||
contents: read
|
||||
security-events: write
|
||||
|
||||
jobs:
|
||||
analyze:
|
||||
name: Analyze (CodeQL)
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
fail-fast: false
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v3
|
||||
with:
|
||||
languages: "javascript-typescript,python"
|
||||
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@v3
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v3
|
||||
with:
|
||||
category: "/language:javascript-typescript"
|
||||
@@ -1,19 +1,21 @@
|
||||
name: Welcome New Contributor
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
pull_request_target:
|
||||
types:
|
||||
- opened
|
||||
issues:
|
||||
types:
|
||||
- opened
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
issues: write
|
||||
pull-requests: write
|
||||
|
||||
jobs:
|
||||
greeting:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
issues: write
|
||||
pull-requests: write
|
||||
steps:
|
||||
- uses: actions/first-interaction@v3
|
||||
with:
|
||||
@@ -33,6 +35,9 @@ jobs:
|
||||
Thank you for this contribution to open source and open research. It makes a huge impact for the thousands of innovators building with Hugo Blox.
|
||||
|
||||
|
||||
If you're wondering about next steps, please read our [Contributor Guide](https://github.com/HugoBlox/hugo-blox-builder/blob/main/CONTRIBUTING.md) for coding standards, how to run the project locally, and how to get help.
|
||||
|
||||
|
||||
We hope this is just the start of your journey with us. Let's build the future together! Join us on [Discord](https://discord.gg/z8wNYzb) to connect with the team and community.
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
name: CI - PR Labeler
|
||||
|
||||
on:
|
||||
pull_request_target:
|
||||
types: [opened, synchronize]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: write
|
||||
|
||||
jobs:
|
||||
label:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/labeler@v5
|
||||
with:
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
configuration-path: .github/labeler.yml
|
||||
@@ -0,0 +1,51 @@
|
||||
name: CI - Lint
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
paths:
|
||||
- "modules/**"
|
||||
- "test/**"
|
||||
- "scripts/**"
|
||||
- "package.json"
|
||||
- "pnpm-lock.yaml"
|
||||
- "biome.json"
|
||||
- ".stylelintrc.yaml"
|
||||
- "vite.config.js"
|
||||
pull_request:
|
||||
branches: [main]
|
||||
paths:
|
||||
- "modules/**"
|
||||
- "test/**"
|
||||
- "scripts/**"
|
||||
- "package.json"
|
||||
- "pnpm-lock.yaml"
|
||||
- "biome.json"
|
||||
- ".stylelintrc.yaml"
|
||||
- "vite.config.js"
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
concurrency:
|
||||
group: lint-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
env:
|
||||
NODE_VERSION: "22"
|
||||
|
||||
jobs:
|
||||
lint:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: "${{ env.NODE_VERSION }}"
|
||||
cache: "pnpm"
|
||||
- name: Enable Corepack (use pnpm from package.json)
|
||||
run: corepack enable
|
||||
- name: Install dependencies
|
||||
run: pnpm install --frozen-lockfile
|
||||
- name: Lint (Biome + Stylelint)
|
||||
run: pnpm run lint
|
||||
@@ -1,14 +0,0 @@
|
||||
_vendor/
|
||||
vendor/
|
||||
blox-bootstrapassets/css/libs/
|
||||
|
||||
public/
|
||||
resources/
|
||||
|
||||
*.html
|
||||
|
||||
blox-bootstrapassets/css/reveal.css
|
||||
blox-bootstrapassets/scss/main.scss
|
||||
|
||||
blox-bootstraplayouts/index.json
|
||||
blox-bootstraplayouts/index.webmanifest
|
||||
@@ -1,17 +0,0 @@
|
||||
'use strict';
|
||||
|
||||
module.exports = {
|
||||
bracketSpacing: false,
|
||||
singleQuote: true,
|
||||
jsxBracketSameLine: true,
|
||||
trailingComma: 'all',
|
||||
printWidth: 120,
|
||||
overrides: [
|
||||
{
|
||||
files: ['*.html'],
|
||||
options: {
|
||||
parser: 'go-template',
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
+34
-22
@@ -1,25 +1,37 @@
|
||||
# PREVIOUS PLUGINS - no longer needed now porting from Bootstrap to Tailwind
|
||||
#plugins:
|
||||
# - stylelint-scss
|
||||
extends:
|
||||
- stylelint-config-standard
|
||||
- stylelint-config-prettier
|
||||
# PREVIOUS EXTENDS - no longer needed now porting from Bootstrap to Tailwind
|
||||
# - stylelint-config-standard-scss
|
||||
# - stylelint-config-prettier-scss
|
||||
rules:
|
||||
comment-empty-line-before: null # Allow more compact comments
|
||||
property-no-vendor-prefix: null # Necessary unless postcss prefix
|
||||
value-no-vendor-prefix: null # Necessary unless postcss prefix
|
||||
at-rule-no-unknown: null # Use PostCSS "at" rules
|
||||
no-descending-specificity: null # Allow nested and grouped rules without false positives
|
||||
# PREVIOUS RULES - no longer needed now porting from Bootstrap to Tailwind
|
||||
# at-rule-no-unknown: null # Use SCSS "at" rules
|
||||
# scss/at-rule-no-unknown: true # Use SCSS "at" rules
|
||||
# color-function-notation: null # Todo: refactor code
|
||||
# alpha-value-notation: null # Todo: refactor code
|
||||
# number-max-precision: null # Todo: refactor code
|
||||
# font-family-no-missing-generic-family-keyword:
|
||||
# - true
|
||||
# - ignoreFontFamilies:
|
||||
# - Font Awesome 5 Free
|
||||
at-rule-no-unknown:
|
||||
- true
|
||||
- ignoreAtRules:
|
||||
- tailwind
|
||||
- apply
|
||||
- layer
|
||||
- screen
|
||||
- responsive
|
||||
- variants
|
||||
- theme
|
||||
- utility
|
||||
- plugin
|
||||
- source
|
||||
- custom-variant
|
||||
no-descending-specificity: null
|
||||
comment-empty-line-before: null
|
||||
property-no-vendor-prefix: null
|
||||
value-no-vendor-prefix: null
|
||||
string-quotes: null
|
||||
max-empty-lines: null
|
||||
indentation: null
|
||||
max-line-length: null
|
||||
no-eol-whitespace: null
|
||||
declaration-empty-line-before: null
|
||||
declaration-colon-newline-after: null
|
||||
value-list-comma-newline-after: null
|
||||
alpha-value-notation: null
|
||||
hue-degree-notation: null
|
||||
length-zero-no-unit: null
|
||||
custom-property-empty-line-before: null
|
||||
at-rule-empty-line-before: null
|
||||
declaration-block-no-redundant-longhand-properties: null
|
||||
no-duplicate-selectors: null
|
||||
color-function-notation: null
|
||||
+1
-1
@@ -291,4 +291,4 @@ Every contribution matters — whether it's fixing a typo, adding a translation,
|
||||
|
||||
_Questions? Join our [Discord](https://discord.gg/z8wNYzb) or start a [Discussion](https://github.com/HugoBlox/hugo-blox-builder/discussions)._
|
||||
|
||||
_This project follows the [Contributor Covenant Code of Conduct](CODE_OF_CONDUCT.md)._
|
||||
_This project follows the [Contributor Covenant Code of Conduct](.github/CODE_OF_CONDUCT.md)._
|
||||
@@ -1,4 +1,5 @@
|
||||
[**中文**](./README.zh.md)
|
||||
|
||||
<p align="center">
|
||||
<a href="https://hugoblox.com/start?utm_source=github&utm_medium=readme">
|
||||
<img src="./.github/media/hero.png" alt="Build world-class sites with Hugo Blox" width="100%">
|
||||
@@ -15,7 +16,7 @@
|
||||
<p align="center">
|
||||
<a href="https://hugoblox.com/start?utm_source=github&utm_medium=readme"><b>🚀 Get Started Free</b></a>
|
||||
•
|
||||
<a href="https://hugoblox.com/all-access?utm_source=github&utm_medium=readme">Explore All Access</a>
|
||||
<a href="https://hugoblox.com/pro?utm_source=github&utm_medium=readme">Go Pro</a>
|
||||
<!-- •
|
||||
<a href="https://discord.gg/z8wNYzb">Join Discord</a> -->
|
||||
</p>
|
||||
@@ -54,7 +55,7 @@
|
||||
## Get started
|
||||
|
||||
**Recommended (fastest, no install):**
|
||||
👉 <a href="https://hugoblox.com/start?utm_source=github&utm_medium=readme"><b>Start free in your browser</b></a> — pick a template, customize blocks, and publish to GitHub Pages.
|
||||
👉 [**Start free in your browser**](https://hugoblox.com/start?utm_source=github&utm_medium=readme) — pick a template, customize blocks, and publish to GitHub Pages.
|
||||
|
||||
**Prefer the CLI?**
|
||||
Use the local quickstart:
|
||||
@@ -70,20 +71,20 @@ cd my-site
|
||||
pnpm install && hugo server -D
|
||||
```
|
||||
|
||||
For more guides, visit our documentation at **https://docs.hugoblox.com/**.
|
||||
For more guides, visit our documentation at [**https://docs.hugoblox.com/**](https://docs.hugoblox.com/?utm_source=github&utm_medium=readme).
|
||||
|
||||
---
|
||||
|
||||
## Free vs. All Access
|
||||
## Free vs. Pro
|
||||
|
||||
Hugo Blox ships with a library of **free blocks** for heroes, features, testimonials, FAQs, and more. **All Access** is a one-time donation that adds **exclusive, professionally designed blocks** and full site templates to help you launch even faster.
|
||||
Hugo Blox ships with a library of **free blocks** for heroes, features, testimonials, FAQs, and more. **Pro** is a one-time donation that adds **exclusive, professionally designed blocks** and full site templates to help you launch even faster.
|
||||
|
||||
<!-- <p align="center">
|
||||
<img src="./.github/media/blocks-strip.png" alt="Premium blocks preview" width="900">
|
||||
</p> -->
|
||||
|
||||
- Free templates & blocks: <a href="https://hugoblox.com/templates?utm_source=github&utm_medium=readme"><b>Templates Catalog</b></a>
|
||||
- Premium catalog & lifetime updates: <a href="https://hugoblox.com/all-access?utm_source=github&utm_medium=readme"><b>All Access Pass</b></a>
|
||||
- Free templates & blocks: [**Templates Catalog**](https://hugoblox.com/templates?utm_source=github&utm_medium=readme)
|
||||
- Pro catalog & lifetime updates: [**Go Pro**](https://hugoblox.com/pro?utm_source=github&utm_medium=readme)
|
||||
|
||||
---
|
||||
|
||||
@@ -99,14 +100,14 @@ Hugo Blox ships with a library of **free blocks** for heroes, features, testimon
|
||||
|
||||
## Support the Project
|
||||
|
||||
- 💎 **All Access (one-time donation)** — Get lifetime access to all premium templates, blocks, and updates.
|
||||
<br/><a href="https://hugoblox.com/all-access?utm_source=github&utm_medium=readme"><b>Get All Access →</b></a>
|
||||
- 💎 **Pro (one-time donation)** — Get lifetime access to all premium templates, blocks, and updates.
|
||||
<br/>[**Go Pro →**](https://hugoblox.com/pro?utm_source=github&utm_medium=readme)
|
||||
|
||||
- ☕️ **Donate a Coffee** — Support open source and open research.
|
||||
<br/><a href="https://github.com/sponsors/gcushen"><b>Sponsor on GitHub →</b></a>
|
||||
<br/>[**Sponsor on GitHub →**](https://github.com/sponsors/gcushen)
|
||||
|
||||
- 🤝 **Corporate Sponsors** — Reach thousands of developers and researchers. Get your logo and link in this README.
|
||||
<br/><a href="https://github.com/sponsors/gcushen"><b>Become a Partner →</b></a>
|
||||
<br/>[**Become a Partner →**](https://github.com/sponsors/gcushen)
|
||||
|
||||
---
|
||||
|
||||
@@ -114,16 +115,16 @@ Hugo Blox ships with a library of **free blocks** for heroes, features, testimon
|
||||
|
||||
Join the community to ask questions, share your work, and help us improve.
|
||||
|
||||
- 💬 <a href="https://discord.gg/z8wNYzb">Discord</a>
|
||||
- 📚 <a href="https://docs.hugoblox.com/">Docs & Guides</a>
|
||||
- 🐦 <a href="https://twitter.com/GetResearchDev">X / Twitter</a>
|
||||
- ⭐ <a href="https://github.com/HugoBlox/hugo-blox-builder">Star on GitHub</a>
|
||||
- 💬 [Discord](https://discord.gg/z8wNYzb)
|
||||
- 📚 [Docs & Guides](https://docs.hugoblox.com/?utm_source=github&utm_medium=readme)
|
||||
- 🐦 [X / Twitter](https://twitter.com/GetResearchDev)
|
||||
- ⭐ [Star on GitHub](https://github.com/HugoBlox/hugo-blox-builder)
|
||||
|
||||
---
|
||||
|
||||
## License
|
||||
|
||||
MIT © 2016–Present <a href="https://georgecushen.com">George Cushen</a> — <a href="./LICENSE.md">License Details</a>
|
||||
MIT © 2016–Present [George Cushen](https://georgecushen.com/?utm_source=github&utm_medium=hbb-readme) — [License Details](./LICENSE.md)
|
||||
|
||||
<p align="center">
|
||||
<sub>No tracking. No lock-in. Your content stays yours.</sub>
|
||||
|
||||
+88
-72
@@ -1,111 +1,127 @@
|
||||
[**English**](./README.md)
|
||||
[_English_](./README.md)
|
||||
|
||||
<p align="center"><a href="https://hugoblox.com/templates/" target="_blank" rel="noopener"><img src="./.github/media/sharing.png" alt="Hugo Blox Builder 网站构建工具"></a></p>
|
||||
<p align="center">
|
||||
<a href="https://hugoblox.com/start?utm_source=github&utm_medium=readme">
|
||||
<img src="./.github/media/zh-hero.png" alt="用 Hugo Blox 打造世界级站点" width="100%">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
[](https://hugoblox.com/templates/)
|
||||
[](https://discord.com/channels/722225264733716590/742892432458252370/742895548159492138)
|
||||
[](https://github.com/sponsors/gcushen)
|
||||
[](https://twitter.com/GetResearchDev)
|
||||
[](https://github.com/gcushen)
|
||||
<h1 align="center">技术/学术网站的开源王牌工具箱</h1>
|
||||
|
||||
# [Hugo Blox Builder](https://hugoblox.com): 全能网站构建工具
|
||||
<p align="center">
|
||||
<strong>效率拉满:</strong> 几分钟上线,性能和 SEO 都很能打。<br/>
|
||||
<!-- 受到 250,000+ 创新者青睐(Meta、Stanford、Google、MIT、OpenAI 等)。 -->
|
||||
</p>
|
||||
|
||||
### 加入 750,000+ 站点。零代码。轻松创建面向未来的网站✏️ 📰 🚀
|
||||
<p align="center">
|
||||
<a href="https://hugoblox.com/start?utm_source=github&utm_medium=readme"><b>🚀 免费开始</b></a>
|
||||
•
|
||||
<a href="https://hugoblox.com/pro?utm_source=github&utm_medium=readme"><b>立即升级 Pro(终身)</b></a>
|
||||
<!-- •
|
||||
<a href="https://discord.gg/z8wNYzb">加入 Discord</a> -->
|
||||
</p>
|
||||
|
||||
🔥 **1. 使用 [Hugo](https://github.com/gohugoio/hugo) 引擎支持的模块,免费创建_任何_类型的网站** - 从登录页面、知识库和课程到专业简历、会议和技术博客
|
||||
<p align="center">
|
||||
<a href="https://discord.gg/z8wNYzb">
|
||||
<img src="https://img.shields.io/discord/722225264733716590?label=%E5%8A%A0%E5%85%A5%20Discord&style=social" alt="Discord">
|
||||
</a>
|
||||
<a href="https://github.com/HugoBlox/hugo-blox-builder">
|
||||
<img src="https://img.shields.io/github/stars/HugoBlox/hugo-blox-builder?label=%E4%B8%BA%20Hugo%20Blox%20%E5%8A%A0%E6%98%9F&style=social" alt="为 Hugo Blox 加星">
|
||||
</a>
|
||||
<a href="https://github.com/gcushen">
|
||||
<img src="https://img.shields.io/github/followers/gcushen?label=%E5%85%B3%E6%B3%A8&style=social" alt="在 GitHub 关注">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
🎨 **2. 个性化**漂亮的起始模板,享有**50+种浅色/深色主题、多语言包和模块**
|
||||
---
|
||||
|
||||
🛋 **3. 可选地,使用基于 [Decap CMS](https://docs.hugoblox.com/getting-started/cms/decap/) 的开源内容管理系统(CMS),随时随地从沙发上或外出写作**
|
||||
## 为什么选 Hugo Blox?
|
||||
|
||||
<p style="text-align: center"><a href="https://hugoblox.com/templates/" target="_blank" rel="noopener"><img src="./.github/media/write-from-phone.gif" alt="Decap CMS"></a></p>
|
||||
- **分钟级上线,不再内耗:** 选模板 → 拖拽积木 → 发布。SaaS 落地页、在线课程、学术简历、实验室主页… 都能一把梭。
|
||||
- **完全掌控内容与品牌:** 纯静态输出,无厂商锁定,轻松冲 100/100 Lighthouse 分数。内容归你,你做主。
|
||||
- **技术范儿十足:** Hugo + Tailwind CSS 现代栈。支持 Markdown、Jupyter、BibTeX,出版物自动同步,工作流丝滑顺手。
|
||||
- **开源且可扩展:** MIT 核心慷慨开源。可用 React “小岛”增强交互,或升级 Pro 解锁更多专业模板与积木。
|
||||
|
||||
[查看最新的 **演示**](https://hugoblox.com/templates/),在不到 60 秒内获取您将获得的内容,或者获得其他创作者的 [**灵感**](https://hugoblox.com/creators/)。
|
||||
<p align="center">
|
||||
<img src="./.github/media/templates.webp" alt="模板预览" width="900">
|
||||
</p>
|
||||
|
||||
- 👉 [**开始使用**](https://hugoblox.com/templates/)
|
||||
- 📚 [查看 **文档**](https://docs.hugoblox.com/)
|
||||
- 🙋♀️ **有问题吗?**
|
||||
- **立即在 [Discord](https://discord.gg/z8wNYzb) 上与我们聊天**,或浏览 [故障排除指南](https://docs.hugoblox.com/reference/troubleshooting/) 和 [问答论坛](https://github.com/HugoBlox/hugo-blox-builder/discussions)
|
||||
- _此外,查看 [Hugo 论坛](https://discourse.gohugo.io) 解决 Hugo 相关问题,以及 [Netlify 论坛](https://answers.netlify.com/) 解答 Netlify 相关问题_
|
||||
- 🐦 与社区共享您的 Hugo Blox Builder 网站:[@GetResearchDev](https://twitter.com/GetResearchDev) [@GeorgeCushen](https://twitter.com/GeorgeCushen) [#MadeWithHugoBlox](https://twitter.com/search?q=%23MadeWithHugoBlox&src=typed_query)
|
||||
- 🗳 [参加调查,帮助我们改进 #开源](https://forms.gle/NioD9VhUg7PNmdCAA)
|
||||
- ⬆️ **更新?** 查看 [更新指南](https://docs.hugoblox.com/reference/update/) 和 [发布说明](https://github.com/HugoBlox/hugo-blox-builder/releases)
|
||||
- 🚀 [贡献改进](CONTRIBUTING.md) 或 [建议改进](https://github.com/HugoBlox/hugo-blox-builder/issues)
|
||||
<p align="center">
|
||||
<a href="https://hugoblox.com/templates?utm_source=github&utm_medium=readme"><b>浏览模板 →</b></a>
|
||||
</p>
|
||||
|
||||
## 💙 我们向您恳请支持这个开源运动
|
||||
---
|
||||
|
||||
今天我们请求您捍卫 Hugo Blox Builder 网站构建工具和主题的开源独立性 🐧
|
||||
## 快速上手
|
||||
|
||||
我们是一个**开源和开放科学的运动**,依靠您的支持来保持在线和繁荣,但我们的 99.9% 的创作者没有做出贡献,他们只是选择置之不理 🤦🏻♀️
|
||||
**推荐(最快、零安装):**
|
||||
👉 [**浏览器里直接开干**](https://hugoblox.com/start?utm_source=github&utm_medium=readme) — 选模板、改积木、发布到 GitHub Pages。
|
||||
|
||||
### [😍️ 点击此处成为 GitHub 赞助者,解锁令人惊叹的特权,如 _独家模板、小部件和教程_](https://github.com/sponsors/gcushen)
|
||||
**命令行选手?**
|
||||
使用本地快速开始:
|
||||
|
||||
### 商业赞助者
|
||||
```bash
|
||||
# 1) 安装 Hugo Extended → https://docs.hugoblox.com/getting-started/install-hugo/#prerequisites
|
||||
|
||||
<div style="display: grid; column-gap: 50px; grid-template-columns: repeat(3, 1fr);">
|
||||
<div style="display: flex; align-items: center;">
|
||||
<a href="https://www.netlify.com/" target="_blank"><img src=".github/media/sponsors/netlify.svg" alt="" height="40" width="147" style="display: inline-block;"></a>
|
||||
</div>
|
||||
<div>
|
||||
<a href="https://github.com/sponsors/gcushen"><img src=".github/media/sponsors/your-logo-here.png" alt="" style="display: inline-block;"></a>
|
||||
</div>
|
||||
</div>
|
||||
# 2) 克隆一个起步模板(示例:Academic CV)- 更多模板见 https://hugoblox.com/templates
|
||||
git clone https://github.com/HugoBlox/theme-academic-cv my-site
|
||||
cd my-site
|
||||
|
||||
## 起始模板
|
||||
# 3) 本地运行
|
||||
pnpm install && hugo server -D
|
||||
```
|
||||
|
||||
Hugo Blox Builder 是一个使用**小部件**创建_任何_类型网站的**零代码**框架。每个网站都是 100% 可自定义,使其成为您的专属网站!
|
||||
更多指南请访问文档 [**https://docs.hugoblox.com/**](https://docs.hugoblox.com/?utm_source=github&utm_medium=readme)。
|
||||
|
||||
选择一个起始模板,轻松上手:
|
||||
---
|
||||
|
||||
[](https://hugoblox.com/templates/)
|
||||
## Free vs. Pro
|
||||
|
||||
## 技术内容撰写的未来
|
||||
Hugo Blox 自带一套用于 Hero、Features、Testimonials、FAQs 等的**免费积木**。**Pro** 为一次性捐赠,解锁**独家、专业设计的高级积木**与整站模板,助你更快更稳地上线。
|
||||
|
||||
使用标准化的 Markdown 和捆绑的扩展(包括数学和图表)**编写丰富、具备未来性的内容**。可以在开源 CMS 中编辑,也可以通过在线的 GitHub 编辑器、Jupyter Notebook 或 RStudio 进行编辑
|
||||
- 免费模板与积木:[**模板目录**](https://hugoblox.com/templates?utm_source=github&utm_medium=readme)
|
||||
- Pro 目录与终身更新:[**立即升级 Pro(终身)**](https://hugoblox.com/pro?utm_source=github&utm_medium=readme)
|
||||
|
||||
[](https://academic-demo.netlify.app/post/writing-technical-content/)
|
||||
---
|
||||
|
||||
## 特点
|
||||
## 创作者怎么说
|
||||
|
||||
[](https://hugoblox.com/templates/)
|
||||
> “Hugo Blox 直接帮我省了 40+ 小时做实验室网站。BibTeX 自动同步出版物 —— **引用量提升了 3×**。”
|
||||
> —— **Sarah Yang 博士**,AI 研究者
|
||||
|
||||
**主要特点:**- **页面构建器** - 使用[小部件](https://docs.hugoblox.com/getting-started/page-builder/)和[元素](https://docs.hugoblox.com/reference/markdown/)创建_任何东西_
|
||||
- **编辑任何类型的内容** - 博客文章、出版物、演讲、幻灯片、项目等等!
|
||||
- 使用 [**Markdown**](https://docs.hugoblox.com/reference/markdown/)、[**Jupyter**](https://docs.hugoblox.com/getting-started/cms/) 或 [**RStudio**](https://docs.hugoblox.com/getting-started/cms/rstudio/) 创建内容
|
||||
- **插件系统** - 完全可定制的[**颜色**和**字体主题**](https://docs.hugoblox.com/getting-started/customize/#appearance)
|
||||
- **显示代码和数学公式** - 支持代码高亮和[LaTeX数学](https://docs.hugoblox.com/reference/markdown/#math)
|
||||
- **集成** - [Google Analytics](https://analytics.google.com)、[Disqus评论](https://disqus.com)、地图、联系表单等等!
|
||||
- **美丽的网站** - 简单清爽的单页设计
|
||||
- **行业领先的SEO** - 帮助您的网站在搜索引擎和社交媒体上被发现
|
||||
- **媒体图库** - 在可定制的图库中显示带标题的图像和视频
|
||||
- **移动友好** - 适用于各种屏幕的移动友好版本,外观令人惊艳
|
||||
- **多语言** - 35+语言包,包括英文、中文和葡萄牙文
|
||||
- **多用户** - 每个作者都有自己的个人资料页面
|
||||
- **隐私保护套件** - 协助符合GDPR
|
||||
- **脱颖而出** - 使用动画、视差背景和滚动效果使您的网站生动起来
|
||||
- **一键部署** - 无需服务器、无需数据库,只有文件。
|
||||
> “我们 10 分钟就把文档站点上线了。积木系统太妙了;**新同学上手时间缩短了 60%**。”
|
||||
> —— **Alexandre Rodrigues**,创始人
|
||||
|
||||
## 主题
|
||||
---
|
||||
|
||||
Hugo Blox Builder内置了**自动白天(浅色)和黑夜(暗色)模式**。或者,单击[Demos](https://hugoblox.com/templates/)右上角的月亮图标设置您喜欢的模式!
|
||||
## 支持这个项目
|
||||
|
||||
为您的网站选择一个惊艳的主题,并[自定义它](https://docs.hugoblox.com/getting-started/customize/#custom-theme)以满足您的喜好:
|
||||
- 💎 **Pro(一次性捐赠)** — 终身获取全部高级模板、积木与更新。
|
||||
<br/>[**立即升级 Pro(终身)→**](https://hugoblox.com/pro?utm_source=github&utm_medium=readme)
|
||||
|
||||
[](https://hugoblox.com/templates/)
|
||||
- ☕️ **请我们喝杯咖啡** — 支持开源与开放科研。
|
||||
<br/>[**GitHub 赞助 →**](https://github.com/sponsors/gcushen)
|
||||
|
||||
[浏览更多模板和主题...](https://hugoblox.com/templates/)
|
||||
- 🤝 **企业赞助** — 触达成千上万开发者与研究者。你的 Logo 将展示在此 README。
|
||||
<br/>[**成为合作伙伴 →**](https://github.com/sponsors/gcushen)
|
||||
|
||||
## 生态系统
|
||||
---
|
||||
|
||||
- [**Academic File Converter**](https://github.com/GetRD/academic-file-converter):自动将学术出版物从BibTeX导入到Markdown文件
|
||||
- [**Awesome Hugo**](https://github.com/HugoBlox/awesome-hugo):帮助将内容迁移到Hugo的新版本的脚本
|
||||
## 社区
|
||||
|
||||
## 加入社区
|
||||
欢迎加入社区提问、分享与共建。
|
||||
|
||||
请随意在Github上[_star_该项目](https://github.com/HugoBlox/hugo-blox-builder),在Discord上[join the community](https://discord.gg/z8wNYzb),并关注Twitter上的[@GetResearchDev](https://twitter.com/GetResearchDev),第一时间获取新功能的消息。
|
||||
- 💬 [Discord](https://discord.gg/z8wNYzb)
|
||||
- 📚 [文档与指南](https://docs.hugoblox.com/?utm_source=github&utm_medium=readme)
|
||||
- 🐦 [X / Twitter](https://twitter.com/GetResearchDev)
|
||||
- ⭐ [为 Hugo Blox 加星](https://github.com/HugoBlox/hugo-blox-builder)
|
||||
|
||||
---
|
||||
|
||||
## 许可证
|
||||
|
||||
版权所有 2016-present [George Cushen](https://georgecushen.com)。
|
||||
MIT © 2016–至今 [George Cushen](https://georgecushen.com?utm_source=github&utm_medium=hbb-readme) — [License 详情](./LICENSE.md)
|
||||
|
||||
[Hugo Blox Builder](https://github.com/HugoBlox/hugo-blox-builder/)存储库根据[MIT](https://github.com/HugoBlox/hugo-blox-builder/blob/main/LICENSE.md)许可证发布。
|
||||
<p align="center">
|
||||
<sub>无追踪。无锁定。你的内容,始终属于你。</sub>
|
||||
</p>
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
{
|
||||
"$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",
|
||||
"files": {
|
||||
"ignore": [
|
||||
"node_modules/**",
|
||||
"public/**",
|
||||
"resources/**",
|
||||
"**/_gen/**",
|
||||
"**/assets/dist/**",
|
||||
"**/*.min.js",
|
||||
"**/pagefind/**",
|
||||
"**/_vendor/**",
|
||||
"**/vendor/**",
|
||||
"**/*.html",
|
||||
"**/*.webmanifest",
|
||||
"**/*.backlinks.json",
|
||||
"**/hugo_stats.json",
|
||||
"**/*.code-workspace",
|
||||
"modules/blox-tailwind/data/icons/devicon.json",
|
||||
"starters/**",
|
||||
"test/**",
|
||||
"modules/**/package.json",
|
||||
"**/assets/jsconfig.json"
|
||||
]
|
||||
},
|
||||
"formatter": {
|
||||
"enabled": true,
|
||||
"indentStyle": "space"
|
||||
},
|
||||
"linter": {
|
||||
"enabled": true,
|
||||
"rules": {
|
||||
"recommended": true,
|
||||
"style": { "all": false },
|
||||
"complexity": { "all": false },
|
||||
"suspicious": {
|
||||
"noEmptyBlock": "off"
|
||||
}
|
||||
}
|
||||
},
|
||||
"organizeImports": {
|
||||
"enabled": true
|
||||
},
|
||||
"javascript": {
|
||||
"globals": ["PagefindUI"]
|
||||
}
|
||||
}
|
||||
@@ -1,85 +1,256 @@
|
||||
/* Background */ .bg { color: #f8f8f2; background-color: #282a36 }
|
||||
/* PreWrapper */ .chroma { color: #f8f8f2; background-color: #282a36; }
|
||||
/* Other */ .chroma .x { }
|
||||
/* Error */ .chroma .err { }
|
||||
/* CodeLine */ .chroma .cl { }
|
||||
/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; }
|
||||
/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; }
|
||||
/* LineHighlight */ .chroma .hl { background-color: #ffc }
|
||||
/* LineNumbersTable */ .chroma .lnt { white-space: pre; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f }
|
||||
/* LineNumbers */ .chroma .ln { white-space: pre; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f }
|
||||
/* Line */ .chroma .line { display: flex; }
|
||||
/* Keyword */ .chroma .k { color: #ff79c6 }
|
||||
/* KeywordConstant */ .chroma .kc { color: #ff79c6 }
|
||||
/* KeywordDeclaration */ .chroma .kd { color: #8be9fd; font-style: italic }
|
||||
/* KeywordNamespace */ .chroma .kn { color: #ff79c6 }
|
||||
/* KeywordPseudo */ .chroma .kp { color: #ff79c6 }
|
||||
/* KeywordReserved */ .chroma .kr { color: #ff79c6 }
|
||||
/* KeywordType */ .chroma .kt { color: #8be9fd }
|
||||
/* Name */ .chroma .n { }
|
||||
/* NameAttribute */ .chroma .na { color: #50fa7b }
|
||||
/* NameBuiltin */ .chroma .nb { color: #8be9fd; font-style: italic }
|
||||
/* NameBuiltinPseudo */ .chroma .bp { }
|
||||
/* NameClass */ .chroma .nc { color: #50fa7b }
|
||||
/* NameConstant */ .chroma .no { }
|
||||
/* NameDecorator */ .chroma .nd { }
|
||||
/* NameEntity */ .chroma .ni { }
|
||||
/* NameException */ .chroma .ne { }
|
||||
/* NameFunction */ .chroma .nf { color: #50fa7b }
|
||||
/* NameFunctionMagic */ .chroma .fm { }
|
||||
/* NameLabel */ .chroma .nl { color: #8be9fd; font-style: italic }
|
||||
/* NameNamespace */ .chroma .nn { }
|
||||
/* NameOther */ .chroma .nx { }
|
||||
/* NameProperty */ .chroma .py { }
|
||||
/* NameTag */ .chroma .nt { color: #ff79c6 }
|
||||
/* NameVariable */ .chroma .nv { color: #8be9fd; font-style: italic }
|
||||
/* NameVariableClass */ .chroma .vc { color: #8be9fd; font-style: italic }
|
||||
/* NameVariableGlobal */ .chroma .vg { color: #8be9fd; font-style: italic }
|
||||
/* NameVariableInstance */ .chroma .vi { color: #8be9fd; font-style: italic }
|
||||
/* NameVariableMagic */ .chroma .vm { }
|
||||
/* Literal */ .chroma .l { }
|
||||
/* LiteralDate */ .chroma .ld { }
|
||||
/* LiteralString */ .chroma .s { color: #f1fa8c }
|
||||
/* LiteralStringAffix */ .chroma .sa { color: #f1fa8c }
|
||||
/* LiteralStringBacktick */ .chroma .sb { color: #f1fa8c }
|
||||
/* LiteralStringChar */ .chroma .sc { color: #f1fa8c }
|
||||
/* LiteralStringDelimiter */ .chroma .dl { color: #f1fa8c }
|
||||
/* LiteralStringDoc */ .chroma .sd { color: #f1fa8c }
|
||||
/* LiteralStringDouble */ .chroma .s2 { color: #f1fa8c }
|
||||
/* LiteralStringEscape */ .chroma .se { color: #f1fa8c }
|
||||
/* LiteralStringHeredoc */ .chroma .sh { color: #f1fa8c }
|
||||
/* LiteralStringInterpol */ .chroma .si { color: #f1fa8c }
|
||||
/* LiteralStringOther */ .chroma .sx { color: #f1fa8c }
|
||||
/* LiteralStringRegex */ .chroma .sr { color: #f1fa8c }
|
||||
/* LiteralStringSingle */ .chroma .s1 { color: #f1fa8c }
|
||||
/* LiteralStringSymbol */ .chroma .ss { color: #f1fa8c }
|
||||
/* LiteralNumber */ .chroma .m { color: #bd93f9 }
|
||||
/* LiteralNumberBin */ .chroma .mb { color: #bd93f9 }
|
||||
/* LiteralNumberFloat */ .chroma .mf { color: #bd93f9 }
|
||||
/* LiteralNumberHex */ .chroma .mh { color: #bd93f9 }
|
||||
/* LiteralNumberInteger */ .chroma .mi { color: #bd93f9 }
|
||||
/* LiteralNumberIntegerLong */ .chroma .il { color: #bd93f9 }
|
||||
/* LiteralNumberOct */ .chroma .mo { color: #bd93f9 }
|
||||
/* Operator */ .chroma .o { color: #ff79c6 }
|
||||
/* OperatorWord */ .chroma .ow { color: #ff79c6 }
|
||||
/* Punctuation */ .chroma .p { }
|
||||
/* Comment */ .chroma .c { color: #6272a4 }
|
||||
/* CommentHashbang */ .chroma .ch { color: #6272a4 }
|
||||
/* CommentMultiline */ .chroma .cm { color: #6272a4 }
|
||||
/* CommentSingle */ .chroma .c1 { color: #6272a4 }
|
||||
/* CommentSpecial */ .chroma .cs { color: #6272a4 }
|
||||
/* CommentPreproc */ .chroma .cp { color: #ff79c6 }
|
||||
/* CommentPreprocFile */ .chroma .cpf { color: #ff79c6 }
|
||||
/* Generic */ .chroma .g { }
|
||||
/* GenericDeleted */ .chroma .gd { color: #f55 }
|
||||
/* GenericEmph */ .chroma .ge { text-decoration: underline }
|
||||
/* GenericError */ .chroma .gr { }
|
||||
/* GenericHeading */ .chroma .gh { font-weight: bold }
|
||||
/* GenericInserted */ .chroma .gi { color: #50fa7b; font-weight: bold }
|
||||
/* GenericOutput */ .chroma .go { color: #44475a }
|
||||
/* GenericPrompt */ .chroma .gp { }
|
||||
/* GenericStrong */ .chroma .gs { }
|
||||
/* GenericSubheading */ .chroma .gu { font-weight: bold }
|
||||
/* GenericTraceback */ .chroma .gt { }
|
||||
/* GenericUnderline */ .chroma .gl { text-decoration: underline }
|
||||
/* TextWhitespace */ .chroma .w { }
|
||||
/* Background */ .bg {
|
||||
color: #f8f8f2;
|
||||
background-color: #282a36;
|
||||
}
|
||||
/* PreWrapper */ .chroma {
|
||||
color: #f8f8f2;
|
||||
background-color: #282a36;
|
||||
}
|
||||
/* Other */ .chroma .x {
|
||||
}
|
||||
/* Error */ .chroma .err {
|
||||
}
|
||||
/* CodeLine */ .chroma .cl {
|
||||
}
|
||||
/* LineTableTD */ .chroma .lntd {
|
||||
vertical-align: top;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
border: 0;
|
||||
}
|
||||
/* LineTable */ .chroma .lntable {
|
||||
border-spacing: 0;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
border: 0;
|
||||
}
|
||||
/* LineHighlight */ .chroma .hl {
|
||||
background-color: #ffc;
|
||||
}
|
||||
/* LineNumbersTable */ .chroma .lnt {
|
||||
white-space: pre;
|
||||
user-select: none;
|
||||
margin-right: 0.4em;
|
||||
padding: 0 0.4em 0 0.4em;
|
||||
color: #7f7f7f;
|
||||
}
|
||||
/* LineNumbers */ .chroma .ln {
|
||||
white-space: pre;
|
||||
user-select: none;
|
||||
margin-right: 0.4em;
|
||||
padding: 0 0.4em 0 0.4em;
|
||||
color: #7f7f7f;
|
||||
}
|
||||
/* Line */ .chroma .line {
|
||||
display: flex;
|
||||
}
|
||||
/* Keyword */ .chroma .k {
|
||||
color: #ff79c6;
|
||||
}
|
||||
/* KeywordConstant */ .chroma .kc {
|
||||
color: #ff79c6;
|
||||
}
|
||||
/* KeywordDeclaration */ .chroma .kd {
|
||||
color: #8be9fd;
|
||||
font-style: italic;
|
||||
}
|
||||
/* KeywordNamespace */ .chroma .kn {
|
||||
color: #ff79c6;
|
||||
}
|
||||
/* KeywordPseudo */ .chroma .kp {
|
||||
color: #ff79c6;
|
||||
}
|
||||
/* KeywordReserved */ .chroma .kr {
|
||||
color: #ff79c6;
|
||||
}
|
||||
/* KeywordType */ .chroma .kt {
|
||||
color: #8be9fd;
|
||||
}
|
||||
/* Name */ .chroma .n {
|
||||
}
|
||||
/* NameAttribute */ .chroma .na {
|
||||
color: #50fa7b;
|
||||
}
|
||||
/* NameBuiltin */ .chroma .nb {
|
||||
color: #8be9fd;
|
||||
font-style: italic;
|
||||
}
|
||||
/* NameBuiltinPseudo */ .chroma .bp {
|
||||
}
|
||||
/* NameClass */ .chroma .nc {
|
||||
color: #50fa7b;
|
||||
}
|
||||
/* NameConstant */ .chroma .no {
|
||||
}
|
||||
/* NameDecorator */ .chroma .nd {
|
||||
}
|
||||
/* NameEntity */ .chroma .ni {
|
||||
}
|
||||
/* NameException */ .chroma .ne {
|
||||
}
|
||||
/* NameFunction */ .chroma .nf {
|
||||
color: #50fa7b;
|
||||
}
|
||||
/* NameFunctionMagic */ .chroma .fm {
|
||||
}
|
||||
/* NameLabel */ .chroma .nl {
|
||||
color: #8be9fd;
|
||||
font-style: italic;
|
||||
}
|
||||
/* NameNamespace */ .chroma .nn {
|
||||
}
|
||||
/* NameOther */ .chroma .nx {
|
||||
}
|
||||
/* NameProperty */ .chroma .py {
|
||||
}
|
||||
/* NameTag */ .chroma .nt {
|
||||
color: #ff79c6;
|
||||
}
|
||||
/* NameVariable */ .chroma .nv {
|
||||
color: #8be9fd;
|
||||
font-style: italic;
|
||||
}
|
||||
/* NameVariableClass */ .chroma .vc {
|
||||
color: #8be9fd;
|
||||
font-style: italic;
|
||||
}
|
||||
/* NameVariableGlobal */ .chroma .vg {
|
||||
color: #8be9fd;
|
||||
font-style: italic;
|
||||
}
|
||||
/* NameVariableInstance */ .chroma .vi {
|
||||
color: #8be9fd;
|
||||
font-style: italic;
|
||||
}
|
||||
/* NameVariableMagic */ .chroma .vm {
|
||||
}
|
||||
/* Literal */ .chroma .l {
|
||||
}
|
||||
/* LiteralDate */ .chroma .ld {
|
||||
}
|
||||
/* LiteralString */ .chroma .s {
|
||||
color: #f1fa8c;
|
||||
}
|
||||
/* LiteralStringAffix */ .chroma .sa {
|
||||
color: #f1fa8c;
|
||||
}
|
||||
/* LiteralStringBacktick */ .chroma .sb {
|
||||
color: #f1fa8c;
|
||||
}
|
||||
/* LiteralStringChar */ .chroma .sc {
|
||||
color: #f1fa8c;
|
||||
}
|
||||
/* LiteralStringDelimiter */ .chroma .dl {
|
||||
color: #f1fa8c;
|
||||
}
|
||||
/* LiteralStringDoc */ .chroma .sd {
|
||||
color: #f1fa8c;
|
||||
}
|
||||
/* LiteralStringDouble */ .chroma .s2 {
|
||||
color: #f1fa8c;
|
||||
}
|
||||
/* LiteralStringEscape */ .chroma .se {
|
||||
color: #f1fa8c;
|
||||
}
|
||||
/* LiteralStringHeredoc */ .chroma .sh {
|
||||
color: #f1fa8c;
|
||||
}
|
||||
/* LiteralStringInterpol */ .chroma .si {
|
||||
color: #f1fa8c;
|
||||
}
|
||||
/* LiteralStringOther */ .chroma .sx {
|
||||
color: #f1fa8c;
|
||||
}
|
||||
/* LiteralStringRegex */ .chroma .sr {
|
||||
color: #f1fa8c;
|
||||
}
|
||||
/* LiteralStringSingle */ .chroma .s1 {
|
||||
color: #f1fa8c;
|
||||
}
|
||||
/* LiteralStringSymbol */ .chroma .ss {
|
||||
color: #f1fa8c;
|
||||
}
|
||||
/* LiteralNumber */ .chroma .m {
|
||||
color: #bd93f9;
|
||||
}
|
||||
/* LiteralNumberBin */ .chroma .mb {
|
||||
color: #bd93f9;
|
||||
}
|
||||
/* LiteralNumberFloat */ .chroma .mf {
|
||||
color: #bd93f9;
|
||||
}
|
||||
/* LiteralNumberHex */ .chroma .mh {
|
||||
color: #bd93f9;
|
||||
}
|
||||
/* LiteralNumberInteger */ .chroma .mi {
|
||||
color: #bd93f9;
|
||||
}
|
||||
/* LiteralNumberIntegerLong */ .chroma .il {
|
||||
color: #bd93f9;
|
||||
}
|
||||
/* LiteralNumberOct */ .chroma .mo {
|
||||
color: #bd93f9;
|
||||
}
|
||||
/* Operator */ .chroma .o {
|
||||
color: #ff79c6;
|
||||
}
|
||||
/* OperatorWord */ .chroma .ow {
|
||||
color: #ff79c6;
|
||||
}
|
||||
/* Punctuation */ .chroma .p {
|
||||
}
|
||||
/* Comment */ .chroma .c {
|
||||
color: #6272a4;
|
||||
}
|
||||
/* CommentHashbang */ .chroma .ch {
|
||||
color: #6272a4;
|
||||
}
|
||||
/* CommentMultiline */ .chroma .cm {
|
||||
color: #6272a4;
|
||||
}
|
||||
/* CommentSingle */ .chroma .c1 {
|
||||
color: #6272a4;
|
||||
}
|
||||
/* CommentSpecial */ .chroma .cs {
|
||||
color: #6272a4;
|
||||
}
|
||||
/* CommentPreproc */ .chroma .cp {
|
||||
color: #ff79c6;
|
||||
}
|
||||
/* CommentPreprocFile */ .chroma .cpf {
|
||||
color: #ff79c6;
|
||||
}
|
||||
/* Generic */ .chroma .g {
|
||||
}
|
||||
/* GenericDeleted */ .chroma .gd {
|
||||
color: #f55;
|
||||
}
|
||||
/* GenericEmph */ .chroma .ge {
|
||||
text-decoration: underline;
|
||||
}
|
||||
/* GenericError */ .chroma .gr {
|
||||
}
|
||||
/* GenericHeading */ .chroma .gh {
|
||||
font-weight: bold;
|
||||
}
|
||||
/* GenericInserted */ .chroma .gi {
|
||||
color: #50fa7b;
|
||||
font-weight: bold;
|
||||
}
|
||||
/* GenericOutput */ .chroma .go {
|
||||
color: #44475a;
|
||||
}
|
||||
/* GenericPrompt */ .chroma .gp {
|
||||
}
|
||||
/* GenericStrong */ .chroma .gs {
|
||||
}
|
||||
/* GenericSubheading */ .chroma .gu {
|
||||
font-weight: bold;
|
||||
}
|
||||
/* GenericTraceback */ .chroma .gt {
|
||||
}
|
||||
/* GenericUnderline */ .chroma .gl {
|
||||
text-decoration: underline;
|
||||
}
|
||||
/* TextWhitespace */ .chroma .w {
|
||||
}
|
||||
@@ -29,7 +29,7 @@
|
||||
.chroma .hl {
|
||||
width: 100%;
|
||||
display: block;
|
||||
background-color: rgba(110,118,129,0.1);
|
||||
background-color: rgba(110, 118, 129, 0.1);
|
||||
}
|
||||
.chroma .lnt {
|
||||
color: #8b949e;
|
||||
|
||||
@@ -1,85 +1,286 @@
|
||||
/* Background */ .bg { background-color: #fff }
|
||||
/* PreWrapper */ .chroma { background-color: #fff; }
|
||||
/* Other */ .chroma .x { }
|
||||
/* Error */ .chroma .err { color: #a61717; background-color: #e3d2d2 }
|
||||
/* CodeLine */ .chroma .cl { }
|
||||
/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; }
|
||||
/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; }
|
||||
/* LineHighlight */ .chroma .hl { background-color: #ffc }
|
||||
/* LineNumbersTable */ .chroma .lnt { white-space: pre; user-select: none; margin-right: 0.4em; padding: 0 0.4em;color: #7f7f7f }
|
||||
/* LineNumbers */ .chroma .ln { white-space: pre; user-select: none; margin-right: 0.4em; padding: 0 0.4em;color: #7f7f7f }
|
||||
/* Line */ .chroma .line { display: flex; }
|
||||
/* Keyword */ .chroma .k { color: #000; font-weight: bold }
|
||||
/* KeywordConstant */ .chroma .kc { color: #000; font-weight: bold }
|
||||
/* KeywordDeclaration */ .chroma .kd { color: #000; font-weight: bold }
|
||||
/* KeywordNamespace */ .chroma .kn { color: #000; font-weight: bold }
|
||||
/* KeywordPseudo */ .chroma .kp { color: #000; font-weight: bold }
|
||||
/* KeywordReserved */ .chroma .kr { color: #000; font-weight: bold }
|
||||
/* KeywordType */ .chroma .kt { color: #458; font-weight: bold }
|
||||
/* Name */ .chroma .n { }
|
||||
/* NameAttribute */ .chroma .na { color: #008080 }
|
||||
/* NameBuiltin */ .chroma .nb { color: #0086b3 }
|
||||
/* NameBuiltinPseudo */ .chroma .bp { color: #999 }
|
||||
/* NameClass */ .chroma .nc { color: #458; font-weight: bold }
|
||||
/* NameConstant */ .chroma .no { color: #008080 }
|
||||
/* NameDecorator */ .chroma .nd { color: #3c5d5d; font-weight: bold }
|
||||
/* NameEntity */ .chroma .ni { color: #800080 }
|
||||
/* NameException */ .chroma .ne { color: #900; font-weight: bold }
|
||||
/* NameFunction */ .chroma .nf { color: #900; font-weight: bold }
|
||||
/* NameFunctionMagic */ .chroma .fm { }
|
||||
/* NameLabel */ .chroma .nl { color: #900; font-weight: bold }
|
||||
/* NameNamespace */ .chroma .nn { color: #555 }
|
||||
/* NameOther */ .chroma .nx { }
|
||||
/* NameProperty */ .chroma .py { }
|
||||
/* NameTag */ .chroma .nt { color: #000080 }
|
||||
/* NameVariable */ .chroma .nv { color: #008080 }
|
||||
/* NameVariableClass */ .chroma .vc { color: #008080 }
|
||||
/* NameVariableGlobal */ .chroma .vg { color: #008080 }
|
||||
/* NameVariableInstance */ .chroma .vi { color: #008080 }
|
||||
/* NameVariableMagic */ .chroma .vm { }
|
||||
/* Literal */ .chroma .l { }
|
||||
/* LiteralDate */ .chroma .ld { }
|
||||
/* LiteralString */ .chroma .s { color: #d14 }
|
||||
/* LiteralStringAffix */ .chroma .sa { color: #d14 }
|
||||
/* LiteralStringBacktick */ .chroma .sb { color: #d14 }
|
||||
/* LiteralStringChar */ .chroma .sc { color: #d14 }
|
||||
/* LiteralStringDelimiter */ .chroma .dl { color: #d14 }
|
||||
/* LiteralStringDoc */ .chroma .sd { color: #d14 }
|
||||
/* LiteralStringDouble */ .chroma .s2 { color: #d14 }
|
||||
/* LiteralStringEscape */ .chroma .se { color: #d14 }
|
||||
/* LiteralStringHeredoc */ .chroma .sh { color: #d14 }
|
||||
/* LiteralStringInterpol */ .chroma .si { color: #d14 }
|
||||
/* LiteralStringOther */ .chroma .sx { color: #d14 }
|
||||
/* LiteralStringRegex */ .chroma .sr { color: #009926 }
|
||||
/* LiteralStringSingle */ .chroma .s1 { color: #d14 }
|
||||
/* LiteralStringSymbol */ .chroma .ss { color: #990073 }
|
||||
/* LiteralNumber */ .chroma .m { color: #099 }
|
||||
/* LiteralNumberBin */ .chroma .mb { color: #099 }
|
||||
/* LiteralNumberFloat */ .chroma .mf { color: #099 }
|
||||
/* LiteralNumberHex */ .chroma .mh { color: #099 }
|
||||
/* LiteralNumberInteger */ .chroma .mi { color: #099 }
|
||||
/* LiteralNumberIntegerLong */ .chroma .il { color: #099 }
|
||||
/* LiteralNumberOct */ .chroma .mo { color: #099 }
|
||||
/* Operator */ .chroma .o { color: #000; font-weight: bold }
|
||||
/* OperatorWord */ .chroma .ow { color: #000; font-weight: bold }
|
||||
/* Punctuation */ .chroma .p { }
|
||||
/* Comment */ .chroma .c { color: #998; font-style: italic }
|
||||
/* CommentHashbang */ .chroma .ch { color: #998; font-style: italic }
|
||||
/* CommentMultiline */ .chroma .cm { color: #998; font-style: italic }
|
||||
/* CommentSingle */ .chroma .c1 { color: #998; font-style: italic }
|
||||
/* CommentSpecial */ .chroma .cs { color: #999; font-weight: bold; font-style: italic }
|
||||
/* CommentPreproc */ .chroma .cp { color: #999; font-weight: bold; font-style: italic }
|
||||
/* CommentPreprocFile */ .chroma .cpf { color: #999; font-weight: bold; font-style: italic }
|
||||
/* Generic */ .chroma .g { }
|
||||
/* GenericDeleted */ .chroma .gd { color: #000; background-color: #fdd }
|
||||
/* GenericEmph */ .chroma .ge { color: #000; font-style: italic }
|
||||
/* GenericError */ .chroma .gr { color: #a00 }
|
||||
/* GenericHeading */ .chroma .gh { color: #999 }
|
||||
/* GenericInserted */ .chroma .gi { color: #000; background-color: #dfd }
|
||||
/* GenericOutput */ .chroma .go { color: #888 }
|
||||
/* GenericPrompt */ .chroma .gp { color: #555 }
|
||||
/* GenericStrong */ .chroma .gs { font-weight: bold }
|
||||
/* GenericSubheading */ .chroma .gu { color: #aaa }
|
||||
/* GenericTraceback */ .chroma .gt { color: #a00 }
|
||||
/* GenericUnderline */ .chroma .gl { text-decoration: underline }
|
||||
/* TextWhitespace */ .chroma .w { color: #bbb }
|
||||
/* Background */ .bg {
|
||||
background-color: #fff;
|
||||
}
|
||||
/* PreWrapper */ .chroma {
|
||||
background-color: #fff;
|
||||
}
|
||||
/* Other */ .chroma .x {
|
||||
}
|
||||
/* Error */ .chroma .err {
|
||||
color: #a61717;
|
||||
background-color: #e3d2d2;
|
||||
}
|
||||
/* CodeLine */ .chroma .cl {
|
||||
}
|
||||
/* LineTableTD */ .chroma .lntd {
|
||||
vertical-align: top;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
border: 0;
|
||||
}
|
||||
/* LineTable */ .chroma .lntable {
|
||||
border-spacing: 0;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
border: 0;
|
||||
}
|
||||
/* LineHighlight */ .chroma .hl {
|
||||
background-color: #ffc;
|
||||
}
|
||||
/* LineNumbersTable */ .chroma .lnt {
|
||||
white-space: pre;
|
||||
user-select: none;
|
||||
margin-right: 0.4em;
|
||||
padding: 0 0.4em;
|
||||
color: #7f7f7f;
|
||||
}
|
||||
/* LineNumbers */ .chroma .ln {
|
||||
white-space: pre;
|
||||
user-select: none;
|
||||
margin-right: 0.4em;
|
||||
padding: 0 0.4em;
|
||||
color: #7f7f7f;
|
||||
}
|
||||
/* Line */ .chroma .line {
|
||||
display: flex;
|
||||
}
|
||||
/* Keyword */ .chroma .k {
|
||||
color: #000;
|
||||
font-weight: bold;
|
||||
}
|
||||
/* KeywordConstant */ .chroma .kc {
|
||||
color: #000;
|
||||
font-weight: bold;
|
||||
}
|
||||
/* KeywordDeclaration */ .chroma .kd {
|
||||
color: #000;
|
||||
font-weight: bold;
|
||||
}
|
||||
/* KeywordNamespace */ .chroma .kn {
|
||||
color: #000;
|
||||
font-weight: bold;
|
||||
}
|
||||
/* KeywordPseudo */ .chroma .kp {
|
||||
color: #000;
|
||||
font-weight: bold;
|
||||
}
|
||||
/* KeywordReserved */ .chroma .kr {
|
||||
color: #000;
|
||||
font-weight: bold;
|
||||
}
|
||||
/* KeywordType */ .chroma .kt {
|
||||
color: #458;
|
||||
font-weight: bold;
|
||||
}
|
||||
/* Name */ .chroma .n {
|
||||
}
|
||||
/* NameAttribute */ .chroma .na {
|
||||
color: #008080;
|
||||
}
|
||||
/* NameBuiltin */ .chroma .nb {
|
||||
color: #0086b3;
|
||||
}
|
||||
/* NameBuiltinPseudo */ .chroma .bp {
|
||||
color: #999;
|
||||
}
|
||||
/* NameClass */ .chroma .nc {
|
||||
color: #458;
|
||||
font-weight: bold;
|
||||
}
|
||||
/* NameConstant */ .chroma .no {
|
||||
color: #008080;
|
||||
}
|
||||
/* NameDecorator */ .chroma .nd {
|
||||
color: #3c5d5d;
|
||||
font-weight: bold;
|
||||
}
|
||||
/* NameEntity */ .chroma .ni {
|
||||
color: #800080;
|
||||
}
|
||||
/* NameException */ .chroma .ne {
|
||||
color: #900;
|
||||
font-weight: bold;
|
||||
}
|
||||
/* NameFunction */ .chroma .nf {
|
||||
color: #900;
|
||||
font-weight: bold;
|
||||
}
|
||||
/* NameFunctionMagic */ .chroma .fm {
|
||||
}
|
||||
/* NameLabel */ .chroma .nl {
|
||||
color: #900;
|
||||
font-weight: bold;
|
||||
}
|
||||
/* NameNamespace */ .chroma .nn {
|
||||
color: #555;
|
||||
}
|
||||
/* NameOther */ .chroma .nx {
|
||||
}
|
||||
/* NameProperty */ .chroma .py {
|
||||
}
|
||||
/* NameTag */ .chroma .nt {
|
||||
color: #000080;
|
||||
}
|
||||
/* NameVariable */ .chroma .nv {
|
||||
color: #008080;
|
||||
}
|
||||
/* NameVariableClass */ .chroma .vc {
|
||||
color: #008080;
|
||||
}
|
||||
/* NameVariableGlobal */ .chroma .vg {
|
||||
color: #008080;
|
||||
}
|
||||
/* NameVariableInstance */ .chroma .vi {
|
||||
color: #008080;
|
||||
}
|
||||
/* NameVariableMagic */ .chroma .vm {
|
||||
}
|
||||
/* Literal */ .chroma .l {
|
||||
}
|
||||
/* LiteralDate */ .chroma .ld {
|
||||
}
|
||||
/* LiteralString */ .chroma .s {
|
||||
color: #d14;
|
||||
}
|
||||
/* LiteralStringAffix */ .chroma .sa {
|
||||
color: #d14;
|
||||
}
|
||||
/* LiteralStringBacktick */ .chroma .sb {
|
||||
color: #d14;
|
||||
}
|
||||
/* LiteralStringChar */ .chroma .sc {
|
||||
color: #d14;
|
||||
}
|
||||
/* LiteralStringDelimiter */ .chroma .dl {
|
||||
color: #d14;
|
||||
}
|
||||
/* LiteralStringDoc */ .chroma .sd {
|
||||
color: #d14;
|
||||
}
|
||||
/* LiteralStringDouble */ .chroma .s2 {
|
||||
color: #d14;
|
||||
}
|
||||
/* LiteralStringEscape */ .chroma .se {
|
||||
color: #d14;
|
||||
}
|
||||
/* LiteralStringHeredoc */ .chroma .sh {
|
||||
color: #d14;
|
||||
}
|
||||
/* LiteralStringInterpol */ .chroma .si {
|
||||
color: #d14;
|
||||
}
|
||||
/* LiteralStringOther */ .chroma .sx {
|
||||
color: #d14;
|
||||
}
|
||||
/* LiteralStringRegex */ .chroma .sr {
|
||||
color: #009926;
|
||||
}
|
||||
/* LiteralStringSingle */ .chroma .s1 {
|
||||
color: #d14;
|
||||
}
|
||||
/* LiteralStringSymbol */ .chroma .ss {
|
||||
color: #990073;
|
||||
}
|
||||
/* LiteralNumber */ .chroma .m {
|
||||
color: #099;
|
||||
}
|
||||
/* LiteralNumberBin */ .chroma .mb {
|
||||
color: #099;
|
||||
}
|
||||
/* LiteralNumberFloat */ .chroma .mf {
|
||||
color: #099;
|
||||
}
|
||||
/* LiteralNumberHex */ .chroma .mh {
|
||||
color: #099;
|
||||
}
|
||||
/* LiteralNumberInteger */ .chroma .mi {
|
||||
color: #099;
|
||||
}
|
||||
/* LiteralNumberIntegerLong */ .chroma .il {
|
||||
color: #099;
|
||||
}
|
||||
/* LiteralNumberOct */ .chroma .mo {
|
||||
color: #099;
|
||||
}
|
||||
/* Operator */ .chroma .o {
|
||||
color: #000;
|
||||
font-weight: bold;
|
||||
}
|
||||
/* OperatorWord */ .chroma .ow {
|
||||
color: #000;
|
||||
font-weight: bold;
|
||||
}
|
||||
/* Punctuation */ .chroma .p {
|
||||
}
|
||||
/* Comment */ .chroma .c {
|
||||
color: #998;
|
||||
font-style: italic;
|
||||
}
|
||||
/* CommentHashbang */ .chroma .ch {
|
||||
color: #998;
|
||||
font-style: italic;
|
||||
}
|
||||
/* CommentMultiline */ .chroma .cm {
|
||||
color: #998;
|
||||
font-style: italic;
|
||||
}
|
||||
/* CommentSingle */ .chroma .c1 {
|
||||
color: #998;
|
||||
font-style: italic;
|
||||
}
|
||||
/* CommentSpecial */ .chroma .cs {
|
||||
color: #999;
|
||||
font-weight: bold;
|
||||
font-style: italic;
|
||||
}
|
||||
/* CommentPreproc */ .chroma .cp {
|
||||
color: #999;
|
||||
font-weight: bold;
|
||||
font-style: italic;
|
||||
}
|
||||
/* CommentPreprocFile */ .chroma .cpf {
|
||||
color: #999;
|
||||
font-weight: bold;
|
||||
font-style: italic;
|
||||
}
|
||||
/* Generic */ .chroma .g {
|
||||
}
|
||||
/* GenericDeleted */ .chroma .gd {
|
||||
color: #000;
|
||||
background-color: #fdd;
|
||||
}
|
||||
/* GenericEmph */ .chroma .ge {
|
||||
color: #000;
|
||||
font-style: italic;
|
||||
}
|
||||
/* GenericError */ .chroma .gr {
|
||||
color: #a00;
|
||||
}
|
||||
/* GenericHeading */ .chroma .gh {
|
||||
color: #999;
|
||||
}
|
||||
/* GenericInserted */ .chroma .gi {
|
||||
color: #000;
|
||||
background-color: #dfd;
|
||||
}
|
||||
/* GenericOutput */ .chroma .go {
|
||||
color: #888;
|
||||
}
|
||||
/* GenericPrompt */ .chroma .gp {
|
||||
color: #555;
|
||||
}
|
||||
/* GenericStrong */ .chroma .gs {
|
||||
font-weight: bold;
|
||||
}
|
||||
/* GenericSubheading */ .chroma .gu {
|
||||
color: #aaa;
|
||||
}
|
||||
/* GenericTraceback */ .chroma .gt {
|
||||
color: #a00;
|
||||
}
|
||||
/* GenericUnderline */ .chroma .gl {
|
||||
text-decoration: underline;
|
||||
}
|
||||
/* TextWhitespace */ .chroma .w {
|
||||
color: #bbb;
|
||||
}
|
||||
@@ -9,13 +9,19 @@
|
||||
global RevealMarkdown, RevealSearch, RevealNotes, RevealMath, RevealZoom, Reveal, mermaid, RevealMenu
|
||||
*/
|
||||
|
||||
import * as params from '@params';
|
||||
import * as params from "@params";
|
||||
|
||||
// Enable core slide features.
|
||||
var enabledPlugins = [RevealMarkdown, RevealSearch, RevealNotes, RevealMath.KaTeX, RevealZoom];
|
||||
var enabledPlugins = [
|
||||
RevealMarkdown,
|
||||
RevealSearch,
|
||||
RevealNotes,
|
||||
RevealMath.KaTeX,
|
||||
RevealZoom,
|
||||
];
|
||||
|
||||
const isObject = function (o) {
|
||||
return o === Object(o) && !isArray(o) && typeof o !== 'function';
|
||||
return o === Object(o) && !isArray(o) && typeof o !== "function";
|
||||
};
|
||||
|
||||
const isArray = function (a) {
|
||||
@@ -24,7 +30,7 @@ const isArray = function (a) {
|
||||
|
||||
const toCamelCase = function (s) {
|
||||
return s.replace(/([-_][a-z])/gi, function (term) {
|
||||
return term.toUpperCase().replace('-', '').replace('_', '');
|
||||
return term.toUpperCase().replace("-", "").replace("_", "");
|
||||
});
|
||||
};
|
||||
|
||||
@@ -48,14 +54,14 @@ const keysToCamelCase = function (o) {
|
||||
|
||||
// reveal configurations can be included in front matter under slides.reveal
|
||||
var pluginOptions = {};
|
||||
if (typeof params.slides.reveal_options !== 'undefined') {
|
||||
if (typeof params.slides.reveal_options !== "undefined") {
|
||||
pluginOptions = params.slides.reveal_options;
|
||||
}
|
||||
|
||||
pluginOptions = keysToCamelCase(pluginOptions);
|
||||
|
||||
//enable menu by default if not set
|
||||
if (typeof pluginOptions.menu_enabled === 'undefined') {
|
||||
if (typeof pluginOptions.menu_enabled === "undefined") {
|
||||
pluginOptions.menu_enabled = true;
|
||||
}
|
||||
|
||||
@@ -64,12 +70,12 @@ if (pluginOptions.menu_enabled) {
|
||||
enabledPlugins.push(RevealMenu);
|
||||
}
|
||||
|
||||
pluginOptions['plugins'] = enabledPlugins;
|
||||
pluginOptions["plugins"] = enabledPlugins;
|
||||
|
||||
Reveal.initialize(pluginOptions);
|
||||
|
||||
// Disable Mermaid by default.
|
||||
if (typeof params.slides.diagram === 'undefined') {
|
||||
if (typeof params.slides.diagram === "undefined") {
|
||||
params.slides.diagram = false;
|
||||
}
|
||||
|
||||
@@ -78,36 +84,40 @@ if (params.slides.diagram) {
|
||||
//mermaid options
|
||||
// mermaid: front matter configuration can be used to set mermaid options
|
||||
// You can also use directives (see mermaid documentation)
|
||||
var mermaidOptions = {};
|
||||
if (typeof params.slides.diagram_options !== 'undefined') {
|
||||
let mermaidOptions = {};
|
||||
if (typeof params.slides.diagram_options !== "undefined") {
|
||||
mermaidOptions = params.slides.diagram_options;
|
||||
}
|
||||
|
||||
// `startOnLoad` must be false since diagrams are lazily rendered.
|
||||
mermaidOptions['startOnLoad'] = false;
|
||||
mermaidOptions["startOnLoad"] = false;
|
||||
|
||||
mermaid.initialize(mermaidOptions);
|
||||
|
||||
// Lazily render Mermaid diagrams within Reveal.JS slides
|
||||
// See: https://github.com/hakimel/reveal.js/issues/2863#issuecomment-1107444425
|
||||
let renderMermaidDiagrams = function renderMermaidDiagrams(event) {
|
||||
|
||||
let mermaidDivs = event.currentSlide.querySelectorAll('.mermaid:not(.done)');
|
||||
let mermaidDivs = event.currentSlide.querySelectorAll(
|
||||
".mermaid:not(.done)",
|
||||
);
|
||||
let indices = Reveal.getIndices();
|
||||
let pageno = `${indices.h}-${indices.v}`
|
||||
let pageno = `${indices.h}-${indices.v}`;
|
||||
|
||||
mermaidDivs.forEach(function (mermaidDiv, i) {
|
||||
|
||||
let insertSvg = function (svgCode) {
|
||||
mermaidDiv.innerHTML = svgCode;
|
||||
mermaidDiv.classList.add('done');
|
||||
mermaidDiv.classList.add("done");
|
||||
};
|
||||
let graphDefinition = mermaidDiv.textContent;
|
||||
mermaid.mermaidAPI.render(`mermaid${pageno}-${i}`, graphDefinition, insertSvg);
|
||||
mermaid.mermaidAPI.render(
|
||||
`mermaid${pageno}-${i}`,
|
||||
graphDefinition,
|
||||
insertSvg,
|
||||
);
|
||||
});
|
||||
Reveal.layout();
|
||||
};
|
||||
|
||||
Reveal.on('ready', event => renderMermaidDiagrams(event));
|
||||
Reveal.on('slidechanged', event => renderMermaidDiagrams(event));
|
||||
Reveal.on("ready", (event) => renderMermaidDiagrams(event));
|
||||
Reveal.on("slidechanged", (event) => renderMermaidDiagrams(event));
|
||||
}
|
||||
@@ -87,7 +87,7 @@
|
||||
|
||||
/* Enhanced backdrop blur support */
|
||||
@supports (backdrop-filter: blur(10px)) {
|
||||
.resume-biography-modern [class*='backdrop-blur'] {
|
||||
.resume-biography-modern [class*="backdrop-blur"] {
|
||||
backdrop-filter: blur(10px);
|
||||
}
|
||||
}
|
||||
@@ -152,12 +152,14 @@
|
||||
font-size: 20px;
|
||||
background-color: #fff;
|
||||
color: #000; /* override parent alpha */
|
||||
box-shadow: 0 10px 20px rgb(0 0 0 / 4%), 0 2px 6px rgb(0 0 0 / 4%), 0 0 1px rgb(0 0 0 / 4%);
|
||||
box-shadow: 0 10px 20px rgb(0 0 0 / 4%), 0 2px 6px rgb(0 0 0 / 4%), 0 0 1px
|
||||
rgb(0 0 0 / 4%);
|
||||
}
|
||||
|
||||
.dark .avatar-emoji {
|
||||
background-color: #000;
|
||||
box-shadow: 0 10px 20px rgb(0 0 0 / 4%), 0 2px 6px rgb(0 0 0 / 4%), 0 0 1px rgb(255 255 255 / 96%);
|
||||
box-shadow: 0 10px 20px rgb(0 0 0 / 4%), 0 2px 6px rgb(0 0 0 / 4%), 0 0 1px
|
||||
rgb(255 255 255 / 96%);
|
||||
}
|
||||
|
||||
/* Biography Block */
|
||||
@@ -168,7 +170,7 @@
|
||||
}
|
||||
|
||||
.hbx-bg-gradient::before {
|
||||
content: '';
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
@@ -182,16 +184,22 @@
|
||||
|
||||
/* Light Mode Gradient */
|
||||
.hbx-bg-gradient::before {
|
||||
background-image: radial-gradient(at 20% 25%, hsla(212, 80%, 95%, 1) 0px, transparent 50%),
|
||||
radial-gradient(at 75% 30%, hsla(160, 80%, 95%, 1) 0px, transparent 50%),
|
||||
background-image: radial-gradient(
|
||||
at 20% 25%,
|
||||
hsla(212, 80%, 95%, 1) 0px,
|
||||
transparent 50%
|
||||
), radial-gradient(at 75% 30%, hsla(160, 80%, 95%, 1) 0px, transparent 50%),
|
||||
radial-gradient(at 25% 80%, hsla(280, 80%, 95%, 1) 0px, transparent 50%),
|
||||
radial-gradient(at 75% 85%, hsla(30, 80%, 95%, 1) 0px, transparent 50%);
|
||||
}
|
||||
|
||||
/* Dark Mode Gradient */
|
||||
.dark .hbx-bg-gradient::before {
|
||||
background-image: radial-gradient(at 20% 25%, hsla(212, 35%, 15%, 1) 0px, transparent 50%),
|
||||
radial-gradient(at 75% 30%, hsla(160, 35%, 15%, 1) 0px, transparent 50%),
|
||||
background-image: radial-gradient(
|
||||
at 20% 25%,
|
||||
hsla(212, 35%, 15%, 1) 0px,
|
||||
transparent 50%
|
||||
), radial-gradient(at 75% 30%, hsla(160, 35%, 15%, 1) 0px, transparent 50%),
|
||||
radial-gradient(at 25% 80%, hsla(280, 35%, 15%, 1) 0px, transparent 50%),
|
||||
radial-gradient(at 75% 85%, hsla(30, 35%, 15%, 1) 0px, transparent 50%);
|
||||
}
|
||||
@@ -22,7 +22,7 @@
|
||||
[data-search-toggle],
|
||||
#search-toggle,
|
||||
[data-te-collapse-init],
|
||||
.nav-dropdown > .nav-link[role='button'] {
|
||||
.nav-dropdown > .nav-link[role="button"] {
|
||||
@apply cursor-pointer;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
@import './libs/chroma/light.css';
|
||||
@import './libs/chroma/dark.css';
|
||||
@import "./libs/chroma/light.css";
|
||||
@import "./libs/chroma/dark.css";
|
||||
|
||||
/* Code Blocks: Apply theme background */
|
||||
/* Requires relative position for Code Copy button */
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
@import 'page.css';
|
||||
@import 'task-list.css';
|
||||
@import 'copy.css';
|
||||
@import 'sidebar-left.css';
|
||||
@import 'charts.css';
|
||||
@import 'steps.css';
|
||||
@import 'cards.css';
|
||||
@import 'math.css';
|
||||
@import 'author-notes.css';
|
||||
@import 'glassmorphism.css';
|
||||
@import "page.css";
|
||||
@import "task-list.css";
|
||||
@import "copy.css";
|
||||
@import "sidebar-left.css";
|
||||
@import "charts.css";
|
||||
@import "steps.css";
|
||||
@import "cards.css";
|
||||
@import "math.css";
|
||||
@import "author-notes.css";
|
||||
@import "glassmorphism.css";
|
||||
@@ -35,7 +35,7 @@
|
||||
.author-notes {
|
||||
display: none;
|
||||
}
|
||||
|
||||
|
||||
/* Show author notes as superscript numbers in print */
|
||||
.author-notes::after {
|
||||
display: inline;
|
||||
|
||||
@@ -2,9 +2,11 @@
|
||||
--hb-cols: 2;
|
||||
}
|
||||
|
||||
|
||||
.hb-cards {
|
||||
grid-template-columns: repeat(auto-fill, minmax(max(250px, calc((100% - 1rem * 2) / var(--hb-cols))), 1fr));
|
||||
grid-template-columns: repeat(
|
||||
auto-fill,
|
||||
minmax(max(250px, calc((100% - 1rem * 2) / var(--hb-cols))), 1fr)
|
||||
);
|
||||
}
|
||||
|
||||
.hb-card {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/**
|
||||
* 2025 Hugo Blox Glassmorphism Utility Classes
|
||||
*
|
||||
*
|
||||
* Modern glassmorphism effects for Hugo Blox CTA cards and other components
|
||||
*/
|
||||
|
||||
@@ -21,9 +21,14 @@
|
||||
}
|
||||
|
||||
.glassmorphism-primary::before {
|
||||
content: '';
|
||||
content: "";
|
||||
@apply absolute inset-0 pointer-events-none;
|
||||
background: linear-gradient(45deg, rgb(0 0 0 / 0.1), transparent, rgb(255 255 255 / 0.1));
|
||||
background: linear-gradient(
|
||||
45deg,
|
||||
rgb(0 0 0 / 0.1),
|
||||
transparent,
|
||||
rgb(255 255 255 / 0.1)
|
||||
);
|
||||
mix-blend-mode: overlay;
|
||||
}
|
||||
|
||||
@@ -40,37 +45,62 @@
|
||||
}
|
||||
|
||||
.glassmorphism-secondary::before {
|
||||
content: '';
|
||||
content: "";
|
||||
@apply absolute inset-0 pointer-events-none;
|
||||
background: linear-gradient(45deg, rgb(0 0 0 / 0.1), transparent, rgb(255 255 255 / 0.1));
|
||||
background: linear-gradient(
|
||||
45deg,
|
||||
rgb(0 0 0 / 0.1),
|
||||
transparent,
|
||||
rgb(255 255 255 / 0.1)
|
||||
);
|
||||
mix-blend-mode: overlay;
|
||||
}
|
||||
|
||||
.glassmorphism-dark {
|
||||
@apply relative overflow-hidden;
|
||||
background: linear-gradient(135deg, rgb(0 0 0 / 0.7), rgb(31 41 55 / 0.8), rgb(0 0 0 / 0.9));
|
||||
background: linear-gradient(
|
||||
135deg,
|
||||
rgb(0 0 0 / 0.7),
|
||||
rgb(31 41 55 / 0.8),
|
||||
rgb(0 0 0 / 0.9)
|
||||
);
|
||||
backdrop-filter: blur(20px);
|
||||
-webkit-backdrop-filter: blur(20px);
|
||||
}
|
||||
|
||||
.glassmorphism-dark::before {
|
||||
content: '';
|
||||
content: "";
|
||||
@apply absolute inset-0 pointer-events-none;
|
||||
background: linear-gradient(45deg, rgb(255 255 255 / 0.05), transparent, rgb(255 255 255 / 0.1));
|
||||
background: linear-gradient(
|
||||
45deg,
|
||||
rgb(255 255 255 / 0.05),
|
||||
transparent,
|
||||
rgb(255 255 255 / 0.1)
|
||||
);
|
||||
mix-blend-mode: overlay;
|
||||
}
|
||||
|
||||
.glassmorphism-light {
|
||||
@apply relative overflow-hidden;
|
||||
background: linear-gradient(135deg, rgb(255 255 255 / 0.9), rgb(248 250 252 / 0.95), rgb(241 245 249 / 0.9));
|
||||
background: linear-gradient(
|
||||
135deg,
|
||||
rgb(255 255 255 / 0.9),
|
||||
rgb(248 250 252 / 0.95),
|
||||
rgb(241 245 249 / 0.9)
|
||||
);
|
||||
backdrop-filter: blur(20px);
|
||||
-webkit-backdrop-filter: blur(20px);
|
||||
}
|
||||
|
||||
.glassmorphism-light::before {
|
||||
content: '';
|
||||
content: "";
|
||||
@apply absolute inset-0 pointer-events-none;
|
||||
background: linear-gradient(45deg, rgb(0 0 0 / 0.02), transparent, rgb(255 255 255 / 0.05));
|
||||
background: linear-gradient(
|
||||
45deg,
|
||||
rgb(0 0 0 / 0.02),
|
||||
transparent,
|
||||
rgb(255 255 255 / 0.05)
|
||||
);
|
||||
mix-blend-mode: overlay;
|
||||
}
|
||||
|
||||
@@ -83,9 +113,9 @@
|
||||
}
|
||||
|
||||
.noise-texture::after {
|
||||
content: '';
|
||||
content: "";
|
||||
@apply absolute inset-0 pointer-events-none;
|
||||
background-image: url('/media/textures/noise-pattern.svg');
|
||||
background-image: url("/media/textures/noise-pattern.svg");
|
||||
background-size: 100px 100px;
|
||||
background-repeat: repeat;
|
||||
opacity: 0.03;
|
||||
@@ -106,13 +136,13 @@
|
||||
}
|
||||
|
||||
.glass-shadow {
|
||||
box-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25), 0 0 0 1px rgb(255 255 255 / 0.1),
|
||||
inset 0 1px 0 rgb(255 255 255 / 0.1);
|
||||
box-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25), 0 0 0 1px
|
||||
rgb(255 255 255 / 0.1), inset 0 1px 0 rgb(255 255 255 / 0.1);
|
||||
}
|
||||
|
||||
.dark .glass-shadow {
|
||||
box-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.5), 0 0 0 1px rgb(255 255 255 / 0.05),
|
||||
inset 0 1px 0 rgb(255 255 255 / 0.05);
|
||||
box-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.5), 0 0 0 1px
|
||||
rgb(255 255 255 / 0.05), inset 0 1px 0 rgb(255 255 255 / 0.05);
|
||||
}
|
||||
|
||||
/* ==========================================================================
|
||||
@@ -139,8 +169,8 @@
|
||||
|
||||
/* Modern border and shadow for light mode */
|
||||
border: 1px solid rgb(255 255 255 / calc(var(--glassmorphism-opacity) + 0.1));
|
||||
box-shadow: 0 32px 64px -12px rgb(0 0 0 / 0.25),
|
||||
inset 0 1px 0 rgb(255 255 255 / calc(var(--glassmorphism-opacity) + 0.05));
|
||||
box-shadow: 0 32px 64px -12px rgb(0 0 0 / 0.25), inset 0 1px 0
|
||||
rgb(255 255 255 / calc(var(--glassmorphism-opacity) + 0.05));
|
||||
}
|
||||
|
||||
.cta-glassmorphism:hover {
|
||||
@@ -153,8 +183,8 @@
|
||||
);
|
||||
|
||||
border: 1px solid rgb(255 255 255 / calc(var(--glassmorphism-opacity) + 0.2));
|
||||
box-shadow: 0 40px 80px -16px rgb(0 0 0 / 0.3),
|
||||
inset 0 1px 0 rgb(255 255 255 / calc(var(--glassmorphism-opacity) + 0.1));
|
||||
box-shadow: 0 40px 80px -16px rgb(0 0 0 / 0.3), inset 0 1px 0
|
||||
rgb(255 255 255 / calc(var(--glassmorphism-opacity) + 0.1));
|
||||
}
|
||||
|
||||
/* Dark mode adjustments for CTA glassmorphism */
|
||||
@@ -167,8 +197,8 @@
|
||||
);
|
||||
|
||||
border: 1px solid rgb(255 255 255 / var(--glassmorphism-opacity));
|
||||
box-shadow: 0 32px 64px -12px rgb(0 0 0 / 0.4),
|
||||
inset 0 1px 0 rgb(255 255 255 / calc(var(--glassmorphism-opacity) * 0.5));
|
||||
box-shadow: 0 32px 64px -12px rgb(0 0 0 / 0.4), inset 0 1px 0
|
||||
rgb(255 255 255 / calc(var(--glassmorphism-opacity) * 0.5));
|
||||
}
|
||||
|
||||
.dark .cta-glassmorphism:hover {
|
||||
@@ -201,20 +231,23 @@
|
||||
/* Light mode button background */
|
||||
background: rgb(255 255 255 / 0.9);
|
||||
border: 1px solid rgb(0 0 0 / 0.1);
|
||||
box-shadow: 0 10px 25px -5px rgb(0 0 0 / 0.1), 0 4px 6px -2px rgb(0 0 0 / 0.1), inset 0 1px 0 rgb(255 255 255 / 0.3);
|
||||
box-shadow: 0 10px 25px -5px rgb(0 0 0 / 0.1), 0 4px 6px -2px rgb(0 0 0 / 0.1),
|
||||
inset 0 1px 0 rgb(255 255 255 / 0.3);
|
||||
}
|
||||
|
||||
.dark .cta-glassmorphism .group > div:first-child {
|
||||
/* Dark mode button background */
|
||||
background: rgb(0 0 0 / 0.4);
|
||||
border: 1px solid rgb(255 255 255 / 0.2);
|
||||
box-shadow: 0 10px 25px -5px rgb(0 0 0 / 0.3), 0 4px 6px -2px rgb(0 0 0 / 0.2), inset 0 1px 0 rgb(255 255 255 / 0.1);
|
||||
box-shadow: 0 10px 25px -5px rgb(0 0 0 / 0.3), 0 4px 6px -2px rgb(0 0 0 / 0.2),
|
||||
inset 0 1px 0 rgb(255 255 255 / 0.1);
|
||||
}
|
||||
|
||||
.cta-glassmorphism .group:hover > div:first-child {
|
||||
background: rgb(255 255 255);
|
||||
border: 1px solid rgb(0 0 0 / 0.15);
|
||||
box-shadow: 0 20px 40px -8px rgb(0 0 0 / 0.15), 0 8px 12px -4px rgb(0 0 0 / 0.1), inset 0 1px 0 rgb(255 255 255 / 0.4);
|
||||
box-shadow: 0 20px 40px -8px rgb(0 0 0 / 0.15), 0 8px 12px -4px
|
||||
rgb(0 0 0 / 0.1), inset 0 1px 0 rgb(255 255 255 / 0.4);
|
||||
}
|
||||
|
||||
.dark .cta-glassmorphism .group:hover > div:first-child {
|
||||
|
||||
@@ -1,2 +1,4 @@
|
||||
/* Prevent long equations overflowing on small screens by scrolling horizontally instead. */
|
||||
.katex-display { overflow: auto hidden; }
|
||||
.katex-display {
|
||||
overflow: auto hidden;
|
||||
}
|
||||
@@ -7,11 +7,11 @@ ul.task-list {
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
ul.task-list li input[type='checkbox'] {
|
||||
ul.task-list li input[type="checkbox"] {
|
||||
margin-right: 0.5rem;
|
||||
}
|
||||
|
||||
ul.task-list input[type='checkbox']:checked {
|
||||
ul.task-list input[type="checkbox"]:checked {
|
||||
appearance: none;
|
||||
width: 1em;
|
||||
height: 1em;
|
||||
@@ -20,11 +20,11 @@ ul.task-list input[type='checkbox']:checked {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
ul.task-list input[type='checkbox']:not(:checked) {
|
||||
ul.task-list input[type="checkbox"]:not(:checked) {
|
||||
width: 0.9em;
|
||||
height: 0.9em;
|
||||
}
|
||||
|
||||
ul.task-list input[type='checkbox']:checked::after {
|
||||
content: '✅';
|
||||
ul.task-list input[type="checkbox"]:checked::after {
|
||||
content: "✅";
|
||||
}
|
||||
@@ -220,11 +220,11 @@
|
||||
|
||||
/* Support for dual light/dark background colors in parse_block_v2.html */
|
||||
@media (prefers-color-scheme: dark) {
|
||||
.home-section-bg[style*='--dark-bg-color'] {
|
||||
.home-section-bg[style*="--dark-bg-color"] {
|
||||
background-color: var(--dark-bg-color) !important;
|
||||
}
|
||||
}
|
||||
|
||||
.dark .home-section-bg[style*='--dark-bg-color'] {
|
||||
.dark .home-section-bg[style*="--dark-bg-color"] {
|
||||
background-color: var(--dark-bg-color) !important;
|
||||
}
|
||||
@@ -320,7 +320,8 @@
|
||||
/* Note: Providing these palettes in @theme ensures theme-pack mappings like var(--color-rose-600) always resolve */
|
||||
|
||||
/* Font family */
|
||||
--font-family-sans: inter var, ui-sans-serif, system-ui, sans-serif, apple color emoji, segoe ui emoji,
|
||||
--font-family-sans:
|
||||
inter var, ui-sans-serif, system-ui, sans-serif, apple color emoji, segoe ui emoji,
|
||||
segoe ui symbol, noto color emoji;
|
||||
|
||||
/* Font sizes */
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
text-rendering: optimizelegibility;
|
||||
}
|
||||
|
||||
|
||||
body {
|
||||
line-height: 1.5;
|
||||
}
|
||||
@@ -25,28 +25,28 @@
|
||||
text-decoration-color: rgb(var(--color-primary-300));
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
|
||||
.prose a:hover {
|
||||
color: rgb(var(--color-primary-600));
|
||||
text-decoration: none;
|
||||
border-radius: 0.09rem;
|
||||
}
|
||||
|
||||
|
||||
.prose mark {
|
||||
color: rgb(var(--color-neutral-900));
|
||||
background-color: rgb(var(--color-primary-200));
|
||||
padding: 0.1rem 0.2rem;
|
||||
border-radius: 0.25rem;
|
||||
}
|
||||
|
||||
|
||||
.dark .prose-invert a {
|
||||
text-decoration-color: rgb(var(--color-neutral-500));
|
||||
}
|
||||
|
||||
|
||||
.dark .prose-invert a:hover {
|
||||
color: rgb(var(--color-primary-300));
|
||||
}
|
||||
|
||||
|
||||
.dark .prose-invert mark {
|
||||
background-color: rgb(var(--color-primary-400));
|
||||
color: black;
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
}
|
||||
|
||||
/* 2025 Glassmorphism texture support - disable conflicting defaults */
|
||||
.home-section-bg.bg-image[style*='background-size'][style*='background-repeat'] {
|
||||
.home-section-bg.bg-image[style*="background-size"][style*="background-repeat"] {
|
||||
background-size: revert !important;
|
||||
background-repeat: revert !important;
|
||||
background-position: revert !important;
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
/* LineHighlight */
|
||||
|
||||
.chroma .hl {
|
||||
background-color: #ffc
|
||||
background-color: #ffc;
|
||||
}
|
||||
|
||||
/* LineNumbersTable */
|
||||
@@ -49,7 +49,7 @@
|
||||
user-select: none;
|
||||
margin-right: 0.4em;
|
||||
padding: 0 0.4em 0 0.4em;
|
||||
color: #7f7f7f
|
||||
color: #7f7f7f;
|
||||
}
|
||||
|
||||
/* LineNumbers */
|
||||
@@ -59,7 +59,7 @@
|
||||
user-select: none;
|
||||
margin-right: 0.4em;
|
||||
padding: 0 0.4em 0 0.4em;
|
||||
color: #7f7f7f
|
||||
color: #7f7f7f;
|
||||
}
|
||||
|
||||
/* Line */
|
||||
@@ -71,44 +71,44 @@
|
||||
/* Keyword */
|
||||
|
||||
.chroma .k {
|
||||
color: #ff79c6
|
||||
color: #ff79c6;
|
||||
}
|
||||
|
||||
/* KeywordConstant */
|
||||
|
||||
.chroma .kc {
|
||||
color: #ff79c6
|
||||
color: #ff79c6;
|
||||
}
|
||||
|
||||
/* KeywordDeclaration */
|
||||
|
||||
.chroma .kd {
|
||||
color: #8be9fd;
|
||||
font-style: italic
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
/* KeywordNamespace */
|
||||
|
||||
.chroma .kn {
|
||||
color: #ff79c6
|
||||
color: #ff79c6;
|
||||
}
|
||||
|
||||
/* KeywordPseudo */
|
||||
|
||||
.chroma .kp {
|
||||
color: #ff79c6
|
||||
color: #ff79c6;
|
||||
}
|
||||
|
||||
/* KeywordReserved */
|
||||
|
||||
.chroma .kr {
|
||||
color: #ff79c6
|
||||
color: #ff79c6;
|
||||
}
|
||||
|
||||
/* KeywordType */
|
||||
|
||||
.chroma .kt {
|
||||
color: #8be9fd
|
||||
color: #8be9fd;
|
||||
}
|
||||
|
||||
/* Name */
|
||||
@@ -119,14 +119,14 @@
|
||||
/* NameAttribute */
|
||||
|
||||
.chroma .na {
|
||||
color: #50fa7b
|
||||
color: #50fa7b;
|
||||
}
|
||||
|
||||
/* NameBuiltin */
|
||||
|
||||
.chroma .nb {
|
||||
color: #8be9fd;
|
||||
font-style: italic
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
/* NameBuiltinPseudo */
|
||||
@@ -137,7 +137,7 @@
|
||||
/* NameClass */
|
||||
|
||||
.chroma .nc {
|
||||
color: #50fa7b
|
||||
color: #50fa7b;
|
||||
}
|
||||
|
||||
/* NameConstant */
|
||||
@@ -163,7 +163,7 @@
|
||||
/* NameFunction */
|
||||
|
||||
.chroma .nf {
|
||||
color: #50fa7b
|
||||
color: #50fa7b;
|
||||
}
|
||||
|
||||
/* NameFunctionMagic */
|
||||
@@ -175,7 +175,7 @@
|
||||
|
||||
.chroma .nl {
|
||||
color: #8be9fd;
|
||||
font-style: italic
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
/* NameNamespace */
|
||||
@@ -196,35 +196,35 @@
|
||||
/* NameTag */
|
||||
|
||||
.chroma .nt {
|
||||
color: #ff79c6
|
||||
color: #ff79c6;
|
||||
}
|
||||
|
||||
/* NameVariable */
|
||||
|
||||
.chroma .nv {
|
||||
color: #8be9fd;
|
||||
font-style: italic
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
/* NameVariableClass */
|
||||
|
||||
.chroma .vc {
|
||||
color: #8be9fd;
|
||||
font-style: italic
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
/* NameVariableGlobal */
|
||||
|
||||
.chroma .vg {
|
||||
color: #8be9fd;
|
||||
font-style: italic
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
/* NameVariableInstance */
|
||||
|
||||
.chroma .vi {
|
||||
color: #8be9fd;
|
||||
font-style: italic
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
/* NameVariableMagic */
|
||||
@@ -245,139 +245,139 @@
|
||||
/* LiteralString */
|
||||
|
||||
.chroma .s {
|
||||
color: #f1fa8c
|
||||
color: #f1fa8c;
|
||||
}
|
||||
|
||||
/* LiteralStringAffix */
|
||||
|
||||
.chroma .sa {
|
||||
color: #f1fa8c
|
||||
color: #f1fa8c;
|
||||
}
|
||||
|
||||
/* LiteralStringBacktick */
|
||||
|
||||
.chroma .sb {
|
||||
color: #f1fa8c
|
||||
color: #f1fa8c;
|
||||
}
|
||||
|
||||
/* LiteralStringChar */
|
||||
|
||||
.chroma .sc {
|
||||
color: #f1fa8c
|
||||
color: #f1fa8c;
|
||||
}
|
||||
|
||||
/* LiteralStringDelimiter */
|
||||
|
||||
.chroma .dl {
|
||||
color: #f1fa8c
|
||||
color: #f1fa8c;
|
||||
}
|
||||
|
||||
/* LiteralStringDoc */
|
||||
|
||||
.chroma .sd {
|
||||
color: #f1fa8c
|
||||
color: #f1fa8c;
|
||||
}
|
||||
|
||||
/* LiteralStringDouble */
|
||||
|
||||
.chroma .s2 {
|
||||
color: #f1fa8c
|
||||
color: #f1fa8c;
|
||||
}
|
||||
|
||||
/* LiteralStringEscape */
|
||||
|
||||
.chroma .se {
|
||||
color: #f1fa8c
|
||||
color: #f1fa8c;
|
||||
}
|
||||
|
||||
/* LiteralStringHeredoc */
|
||||
|
||||
.chroma .sh {
|
||||
color: #f1fa8c
|
||||
color: #f1fa8c;
|
||||
}
|
||||
|
||||
/* LiteralStringInterpol */
|
||||
|
||||
.chroma .si {
|
||||
color: #f1fa8c
|
||||
color: #f1fa8c;
|
||||
}
|
||||
|
||||
/* LiteralStringOther */
|
||||
|
||||
.chroma .sx {
|
||||
color: #f1fa8c
|
||||
color: #f1fa8c;
|
||||
}
|
||||
|
||||
/* LiteralStringRegex */
|
||||
|
||||
.chroma .sr {
|
||||
color: #f1fa8c
|
||||
color: #f1fa8c;
|
||||
}
|
||||
|
||||
/* LiteralStringSingle */
|
||||
|
||||
.chroma .s1 {
|
||||
color: #f1fa8c
|
||||
color: #f1fa8c;
|
||||
}
|
||||
|
||||
/* LiteralStringSymbol */
|
||||
|
||||
.chroma .ss {
|
||||
color: #f1fa8c
|
||||
color: #f1fa8c;
|
||||
}
|
||||
|
||||
/* LiteralNumber */
|
||||
|
||||
.chroma .m {
|
||||
color: #bd93f9
|
||||
color: #bd93f9;
|
||||
}
|
||||
|
||||
/* LiteralNumberBin */
|
||||
|
||||
.chroma .mb {
|
||||
color: #bd93f9
|
||||
color: #bd93f9;
|
||||
}
|
||||
|
||||
/* LiteralNumberFloat */
|
||||
|
||||
.chroma .mf {
|
||||
color: #bd93f9
|
||||
color: #bd93f9;
|
||||
}
|
||||
|
||||
/* LiteralNumberHex */
|
||||
|
||||
.chroma .mh {
|
||||
color: #bd93f9
|
||||
color: #bd93f9;
|
||||
}
|
||||
|
||||
/* LiteralNumberInteger */
|
||||
|
||||
.chroma .mi {
|
||||
color: #bd93f9
|
||||
color: #bd93f9;
|
||||
}
|
||||
|
||||
/* LiteralNumberIntegerLong */
|
||||
|
||||
.chroma .il {
|
||||
color: #bd93f9
|
||||
color: #bd93f9;
|
||||
}
|
||||
|
||||
/* LiteralNumberOct */
|
||||
|
||||
.chroma .mo {
|
||||
color: #bd93f9
|
||||
color: #bd93f9;
|
||||
}
|
||||
|
||||
/* Operator */
|
||||
|
||||
.chroma .o {
|
||||
color: #ff79c6
|
||||
color: #ff79c6;
|
||||
}
|
||||
|
||||
/* OperatorWord */
|
||||
|
||||
.chroma .ow {
|
||||
color: #ff79c6
|
||||
color: #ff79c6;
|
||||
}
|
||||
|
||||
/* Punctuation */
|
||||
@@ -388,43 +388,43 @@
|
||||
/* Comment */
|
||||
|
||||
.chroma .c {
|
||||
color: #6272a4
|
||||
color: #6272a4;
|
||||
}
|
||||
|
||||
/* CommentHashbang */
|
||||
|
||||
.chroma .ch {
|
||||
color: #6272a4
|
||||
color: #6272a4;
|
||||
}
|
||||
|
||||
/* CommentMultiline */
|
||||
|
||||
.chroma .cm {
|
||||
color: #6272a4
|
||||
color: #6272a4;
|
||||
}
|
||||
|
||||
/* CommentSingle */
|
||||
|
||||
.chroma .c1 {
|
||||
color: #6272a4
|
||||
color: #6272a4;
|
||||
}
|
||||
|
||||
/* CommentSpecial */
|
||||
|
||||
.chroma .cs {
|
||||
color: #6272a4
|
||||
color: #6272a4;
|
||||
}
|
||||
|
||||
/* CommentPreproc */
|
||||
|
||||
.chroma .cp {
|
||||
color: #ff79c6
|
||||
color: #ff79c6;
|
||||
}
|
||||
|
||||
/* CommentPreprocFile */
|
||||
|
||||
.chroma .cpf {
|
||||
color: #ff79c6
|
||||
color: #ff79c6;
|
||||
}
|
||||
|
||||
/* Generic */
|
||||
@@ -435,13 +435,13 @@
|
||||
/* GenericDeleted */
|
||||
|
||||
.chroma .gd {
|
||||
color: #f55
|
||||
color: #f55;
|
||||
}
|
||||
|
||||
/* GenericEmph */
|
||||
|
||||
.chroma .ge {
|
||||
text-decoration: underline
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/* GenericError */
|
||||
@@ -452,20 +452,20 @@
|
||||
/* GenericHeading */
|
||||
|
||||
.chroma .gh {
|
||||
font-weight: bold
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* GenericInserted */
|
||||
|
||||
.chroma .gi {
|
||||
color: #50fa7b;
|
||||
font-weight: bold
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* GenericOutput */
|
||||
|
||||
.chroma .go {
|
||||
color: #44475a
|
||||
color: #44475a;
|
||||
}
|
||||
|
||||
/* GenericPrompt */
|
||||
@@ -481,7 +481,7 @@
|
||||
/* GenericSubheading */
|
||||
|
||||
.chroma .gu {
|
||||
font-weight: bold
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* GenericTraceback */
|
||||
@@ -492,7 +492,7 @@
|
||||
/* GenericUnderline */
|
||||
|
||||
.chroma .gl {
|
||||
text-decoration: underline
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/* TextWhitespace */
|
||||
|
||||
@@ -12,7 +12,7 @@ html:not(.dark) .highlight {
|
||||
|
||||
.chroma .err {
|
||||
color: #a61717;
|
||||
background-color: #e3d2d2
|
||||
background-color: #e3d2d2;
|
||||
}
|
||||
|
||||
/* CodeLine */
|
||||
@@ -41,7 +41,7 @@ html:not(.dark) .highlight {
|
||||
/* LineHighlight */
|
||||
|
||||
.chroma .hl {
|
||||
background-color: #ffc
|
||||
background-color: #ffc;
|
||||
}
|
||||
|
||||
/* LineNumbersTable */
|
||||
@@ -51,7 +51,7 @@ html:not(.dark) .highlight {
|
||||
user-select: none;
|
||||
margin-right: 0.4em;
|
||||
padding: 0 0.4em;
|
||||
color: #7f7f7f
|
||||
color: #7f7f7f;
|
||||
}
|
||||
|
||||
/* LineNumbers */
|
||||
@@ -61,7 +61,7 @@ html:not(.dark) .highlight {
|
||||
user-select: none;
|
||||
margin-right: 0.4em;
|
||||
padding: 0 0.4em;
|
||||
color: #7f7f7f
|
||||
color: #7f7f7f;
|
||||
}
|
||||
|
||||
/* Line */
|
||||
@@ -74,49 +74,49 @@ html:not(.dark) .highlight {
|
||||
|
||||
.chroma .k {
|
||||
color: #000;
|
||||
font-weight: bold
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* KeywordConstant */
|
||||
|
||||
.chroma .kc {
|
||||
color: #000;
|
||||
font-weight: bold
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* KeywordDeclaration */
|
||||
|
||||
.chroma .kd {
|
||||
color: #000;
|
||||
font-weight: bold
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* KeywordNamespace */
|
||||
|
||||
.chroma .kn {
|
||||
color: #000;
|
||||
font-weight: bold
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* KeywordPseudo */
|
||||
|
||||
.chroma .kp {
|
||||
color: #000;
|
||||
font-weight: bold
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* KeywordReserved */
|
||||
|
||||
.chroma .kr {
|
||||
color: #000;
|
||||
font-weight: bold
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* KeywordType */
|
||||
|
||||
.chroma .kt {
|
||||
color: #458;
|
||||
font-weight: bold
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* Name */
|
||||
@@ -127,59 +127,59 @@ html:not(.dark) .highlight {
|
||||
/* NameAttribute */
|
||||
|
||||
.chroma .na {
|
||||
color: #008080
|
||||
color: #008080;
|
||||
}
|
||||
|
||||
/* NameBuiltin */
|
||||
|
||||
.chroma .nb {
|
||||
color: #0086b3
|
||||
color: #0086b3;
|
||||
}
|
||||
|
||||
/* NameBuiltinPseudo */
|
||||
|
||||
.chroma .bp {
|
||||
color: #999
|
||||
color: #999;
|
||||
}
|
||||
|
||||
/* NameClass */
|
||||
|
||||
.chroma .nc {
|
||||
color: #458;
|
||||
font-weight: bold
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* NameConstant */
|
||||
|
||||
.chroma .no {
|
||||
color: #008080
|
||||
color: #008080;
|
||||
}
|
||||
|
||||
/* NameDecorator */
|
||||
|
||||
.chroma .nd {
|
||||
color: #3c5d5d;
|
||||
font-weight: bold
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* NameEntity */
|
||||
|
||||
.chroma .ni {
|
||||
color: #800080
|
||||
color: #800080;
|
||||
}
|
||||
|
||||
/* NameException */
|
||||
|
||||
.chroma .ne {
|
||||
color: #900;
|
||||
font-weight: bold
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* NameFunction */
|
||||
|
||||
.chroma .nf {
|
||||
color: #900;
|
||||
font-weight: bold
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* NameFunctionMagic */
|
||||
@@ -191,13 +191,13 @@ html:not(.dark) .highlight {
|
||||
|
||||
.chroma .nl {
|
||||
color: #900;
|
||||
font-weight: bold
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* NameNamespace */
|
||||
|
||||
.chroma .nn {
|
||||
color: #555
|
||||
color: #555;
|
||||
}
|
||||
|
||||
/* NameOther */
|
||||
@@ -213,31 +213,31 @@ html:not(.dark) .highlight {
|
||||
/* NameTag */
|
||||
|
||||
.chroma .nt {
|
||||
color: #000080
|
||||
color: #000080;
|
||||
}
|
||||
|
||||
/* NameVariable */
|
||||
|
||||
.chroma .nv {
|
||||
color: #008080
|
||||
color: #008080;
|
||||
}
|
||||
|
||||
/* NameVariableClass */
|
||||
|
||||
.chroma .vc {
|
||||
color: #008080
|
||||
color: #008080;
|
||||
}
|
||||
|
||||
/* NameVariableGlobal */
|
||||
|
||||
.chroma .vg {
|
||||
color: #008080
|
||||
color: #008080;
|
||||
}
|
||||
|
||||
/* NameVariableInstance */
|
||||
|
||||
.chroma .vi {
|
||||
color: #008080
|
||||
color: #008080;
|
||||
}
|
||||
|
||||
/* NameVariableMagic */
|
||||
@@ -258,141 +258,141 @@ html:not(.dark) .highlight {
|
||||
/* LiteralString */
|
||||
|
||||
.chroma .s {
|
||||
color: #d14
|
||||
color: #d14;
|
||||
}
|
||||
|
||||
/* LiteralStringAffix */
|
||||
|
||||
.chroma .sa {
|
||||
color: #d14
|
||||
color: #d14;
|
||||
}
|
||||
|
||||
/* LiteralStringBacktick */
|
||||
|
||||
.chroma .sb {
|
||||
color: #d14
|
||||
color: #d14;
|
||||
}
|
||||
|
||||
/* LiteralStringChar */
|
||||
|
||||
.chroma .sc {
|
||||
color: #d14
|
||||
color: #d14;
|
||||
}
|
||||
|
||||
/* LiteralStringDelimiter */
|
||||
|
||||
.chroma .dl {
|
||||
color: #d14
|
||||
color: #d14;
|
||||
}
|
||||
|
||||
/* LiteralStringDoc */
|
||||
|
||||
.chroma .sd {
|
||||
color: #d14
|
||||
color: #d14;
|
||||
}
|
||||
|
||||
/* LiteralStringDouble */
|
||||
|
||||
.chroma .s2 {
|
||||
color: #d14
|
||||
color: #d14;
|
||||
}
|
||||
|
||||
/* LiteralStringEscape */
|
||||
|
||||
.chroma .se {
|
||||
color: #d14
|
||||
color: #d14;
|
||||
}
|
||||
|
||||
/* LiteralStringHeredoc */
|
||||
|
||||
.chroma .sh {
|
||||
color: #d14
|
||||
color: #d14;
|
||||
}
|
||||
|
||||
/* LiteralStringInterpol */
|
||||
|
||||
.chroma .si {
|
||||
color: #d14
|
||||
color: #d14;
|
||||
}
|
||||
|
||||
/* LiteralStringOther */
|
||||
|
||||
.chroma .sx {
|
||||
color: #d14
|
||||
color: #d14;
|
||||
}
|
||||
|
||||
/* LiteralStringRegex */
|
||||
|
||||
.chroma .sr {
|
||||
color: #009926
|
||||
color: #009926;
|
||||
}
|
||||
|
||||
/* LiteralStringSingle */
|
||||
|
||||
.chroma .s1 {
|
||||
color: #d14
|
||||
color: #d14;
|
||||
}
|
||||
|
||||
/* LiteralStringSymbol */
|
||||
|
||||
.chroma .ss {
|
||||
color: #990073
|
||||
color: #990073;
|
||||
}
|
||||
|
||||
/* LiteralNumber */
|
||||
|
||||
.chroma .m {
|
||||
color: #099
|
||||
color: #099;
|
||||
}
|
||||
|
||||
/* LiteralNumberBin */
|
||||
|
||||
.chroma .mb {
|
||||
color: #099
|
||||
color: #099;
|
||||
}
|
||||
|
||||
/* LiteralNumberFloat */
|
||||
|
||||
.chroma .mf {
|
||||
color: #099
|
||||
color: #099;
|
||||
}
|
||||
|
||||
/* LiteralNumberHex */
|
||||
|
||||
.chroma .mh {
|
||||
color: #099
|
||||
color: #099;
|
||||
}
|
||||
|
||||
/* LiteralNumberInteger */
|
||||
|
||||
.chroma .mi {
|
||||
color: #099
|
||||
color: #099;
|
||||
}
|
||||
|
||||
/* LiteralNumberIntegerLong */
|
||||
|
||||
.chroma .il {
|
||||
color: #099
|
||||
color: #099;
|
||||
}
|
||||
|
||||
/* LiteralNumberOct */
|
||||
|
||||
.chroma .mo {
|
||||
color: #099
|
||||
color: #099;
|
||||
}
|
||||
|
||||
/* Operator */
|
||||
|
||||
.chroma .o {
|
||||
color: #000;
|
||||
font-weight: bold
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* OperatorWord */
|
||||
|
||||
.chroma .ow {
|
||||
color: #000;
|
||||
font-weight: bold
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* Punctuation */
|
||||
@@ -404,28 +404,28 @@ html:not(.dark) .highlight {
|
||||
|
||||
.chroma .c {
|
||||
color: #998;
|
||||
font-style: italic
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
/* CommentHashbang */
|
||||
|
||||
.chroma .ch {
|
||||
color: #998;
|
||||
font-style: italic
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
/* CommentMultiline */
|
||||
|
||||
.chroma .cm {
|
||||
color: #998;
|
||||
font-style: italic
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
/* CommentSingle */
|
||||
|
||||
.chroma .c1 {
|
||||
color: #998;
|
||||
font-style: italic
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
/* CommentSpecial */
|
||||
@@ -433,7 +433,7 @@ html:not(.dark) .highlight {
|
||||
.chroma .cs {
|
||||
color: #999;
|
||||
font-weight: bold;
|
||||
font-style: italic
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
/* CommentPreproc */
|
||||
@@ -441,7 +441,7 @@ html:not(.dark) .highlight {
|
||||
.chroma .cp {
|
||||
color: #999;
|
||||
font-weight: bold;
|
||||
font-style: italic
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
/* CommentPreprocFile */
|
||||
@@ -449,7 +449,7 @@ html:not(.dark) .highlight {
|
||||
.chroma .cpf {
|
||||
color: #999;
|
||||
font-weight: bold;
|
||||
font-style: italic
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
/* Generic */
|
||||
@@ -461,74 +461,74 @@ html:not(.dark) .highlight {
|
||||
|
||||
.chroma .gd {
|
||||
color: #000;
|
||||
background-color: #fdd
|
||||
background-color: #fdd;
|
||||
}
|
||||
|
||||
/* GenericEmph */
|
||||
|
||||
.chroma .ge {
|
||||
color: #000;
|
||||
font-style: italic
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
/* GenericError */
|
||||
|
||||
.chroma .gr {
|
||||
color: #a00
|
||||
color: #a00;
|
||||
}
|
||||
|
||||
/* GenericHeading */
|
||||
|
||||
.chroma .gh {
|
||||
color: #999
|
||||
color: #999;
|
||||
}
|
||||
|
||||
/* GenericInserted */
|
||||
|
||||
.chroma .gi {
|
||||
color: #000;
|
||||
background-color: #dfd
|
||||
background-color: #dfd;
|
||||
}
|
||||
|
||||
/* GenericOutput */
|
||||
|
||||
.chroma .go {
|
||||
color: #888
|
||||
color: #888;
|
||||
}
|
||||
|
||||
/* GenericPrompt */
|
||||
|
||||
.chroma .gp {
|
||||
color: #555
|
||||
color: #555;
|
||||
}
|
||||
|
||||
/* GenericStrong */
|
||||
|
||||
.chroma .gs {
|
||||
font-weight: bold
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* GenericSubheading */
|
||||
|
||||
.chroma .gu {
|
||||
color: #aaa
|
||||
color: #aaa;
|
||||
}
|
||||
|
||||
/* GenericTraceback */
|
||||
|
||||
.chroma .gt {
|
||||
color: #a00
|
||||
color: #a00;
|
||||
}
|
||||
|
||||
/* GenericUnderline */
|
||||
|
||||
.chroma .gl {
|
||||
text-decoration: underline
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/* TextWhitespace */
|
||||
|
||||
.chroma .w {
|
||||
color: #bbb
|
||||
color: #bbb;
|
||||
}
|
||||
}
|
||||
@@ -11,26 +11,26 @@
|
||||
*/
|
||||
|
||||
/* Tailwind CSS v4 Base */
|
||||
@import 'tailwindcss';
|
||||
@import "tailwindcss";
|
||||
|
||||
/* Configuration */
|
||||
@import 'config/tailwind.css';
|
||||
@import 'config/theme.css';
|
||||
@import "config/tailwind.css";
|
||||
@import "config/theme.css";
|
||||
|
||||
/* Base styles and utilities */
|
||||
@import 'framework/base.css';
|
||||
@import "framework/base.css";
|
||||
|
||||
/* Hugo Blox theme system (color utilities) */
|
||||
@import 'color-utilities.css';
|
||||
@import "color-utilities.css";
|
||||
|
||||
/* Hugo Blox framework components */
|
||||
@import 'framework/components.css';
|
||||
@import "framework/components.css";
|
||||
|
||||
/* Hugo Blox module components */
|
||||
@import 'components/all.css';
|
||||
@import 'blox/all.css';
|
||||
@import 'views/all.css';
|
||||
@import 'chroma.css';
|
||||
@import "components/all.css";
|
||||
@import "blox/all.css";
|
||||
@import "views/all.css";
|
||||
@import "chroma.css";
|
||||
|
||||
/* Safelist for dynamic classes */
|
||||
@import 'config/safelist.css';
|
||||
@import "config/safelist.css";
|
||||
@@ -3,31 +3,31 @@
|
||||
* Copies BibTeX citation to clipboard when cite button is clicked
|
||||
*/
|
||||
|
||||
import { hugoEnvironment, i18n } from '@params';
|
||||
import { showNotification } from './hb-notifier.js';
|
||||
import { copyToClipboardSync, ClipboardCache } from './hb-clipboard.js';
|
||||
import { hugoEnvironment, i18n } from "@params";
|
||||
import { ClipboardCache, copyToClipboardSync } from "./hb-clipboard.js";
|
||||
import { showNotification } from "./hb-notifier.js";
|
||||
|
||||
// Debug mode based on environment
|
||||
const isDebugMode = hugoEnvironment === 'development';
|
||||
const isDebugMode = hugoEnvironment === "development";
|
||||
|
||||
// Cache for citation content
|
||||
const citationCache = new ClipboardCache();
|
||||
|
||||
// Initialize citation handlers when DOM is ready
|
||||
if (document.readyState === 'loading') {
|
||||
document.addEventListener('DOMContentLoaded', initializeCitation);
|
||||
if (document.readyState === "loading") {
|
||||
document.addEventListener("DOMContentLoaded", initializeCitation);
|
||||
} else {
|
||||
initializeCitation();
|
||||
}
|
||||
|
||||
function initializeCitation() {
|
||||
// Handle citation button clicks using event delegation
|
||||
document.addEventListener('click', handleCiteClick);
|
||||
|
||||
document.addEventListener("click", handleCiteClick);
|
||||
|
||||
// Prefetch citations on hover/focus for better UX and Safari compatibility
|
||||
document.addEventListener('mouseover', prefetchOnHover);
|
||||
document.addEventListener('focusin', prefetchOnHover);
|
||||
|
||||
document.addEventListener("mouseover", prefetchOnHover);
|
||||
document.addEventListener("focusin", prefetchOnHover);
|
||||
|
||||
// Prefetch all citations on page load
|
||||
prefetchAllCitations();
|
||||
}
|
||||
@@ -36,9 +36,11 @@ function initializeCitation() {
|
||||
* Prefetch all citations on page load
|
||||
*/
|
||||
function prefetchAllCitations() {
|
||||
const citeButtons = document.querySelectorAll('.js-cite-clipboard[data-filename]');
|
||||
citeButtons.forEach(button => {
|
||||
const filename = button.getAttribute('data-filename');
|
||||
const citeButtons = document.querySelectorAll(
|
||||
".js-cite-clipboard[data-filename]",
|
||||
);
|
||||
citeButtons.forEach((button) => {
|
||||
const filename = button.getAttribute("data-filename");
|
||||
if (filename && !citationCache.has(filename)) {
|
||||
// Fetch in background, don't await
|
||||
fetchAndCacheCitation(filename);
|
||||
@@ -51,10 +53,10 @@ function prefetchAllCitations() {
|
||||
* @param {Event} e - Hover or focus event
|
||||
*/
|
||||
function prefetchOnHover(e) {
|
||||
const citeButton = e.target.closest('.js-cite-clipboard');
|
||||
const citeButton = e.target.closest(".js-cite-clipboard");
|
||||
if (!citeButton) return;
|
||||
|
||||
const filename = citeButton.getAttribute('data-filename');
|
||||
|
||||
const filename = citeButton.getAttribute("data-filename");
|
||||
if (filename && !citationCache.has(filename)) {
|
||||
// Fetch in background, don't await
|
||||
fetchAndCacheCitation(filename);
|
||||
@@ -89,32 +91,32 @@ async function fetchAndCacheCitation(filename) {
|
||||
*/
|
||||
function handleCiteClick(e) {
|
||||
// Check if clicked element or its parent is a cite button
|
||||
const citeButton = e.target.closest('.js-cite-clipboard');
|
||||
const citeButton = e.target.closest(".js-cite-clipboard");
|
||||
if (!citeButton) return;
|
||||
|
||||
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
|
||||
const filename = citeButton.getAttribute('data-filename');
|
||||
|
||||
const filename = citeButton.getAttribute("data-filename");
|
||||
if (!filename) {
|
||||
if (isDebugMode) {
|
||||
console.error('No filename specified for citation');
|
||||
console.error("No filename specified for citation");
|
||||
}
|
||||
showNotification('Citation file not found', 'error');
|
||||
showNotification("Citation file not found", "error");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// Check if citation is cached
|
||||
const cachedCitation = citationCache.get(filename);
|
||||
|
||||
|
||||
if (cachedCitation) {
|
||||
// Citation is cached, copy immediately (synchronous for Safari)
|
||||
copyToClipboardSync(cachedCitation).then(success => {
|
||||
copyToClipboardSync(cachedCitation).then((success) => {
|
||||
if (success) {
|
||||
showNotification(i18n?.copied || 'Citation copied!', 'success');
|
||||
showNotification(i18n?.copied || "Citation copied!", "success");
|
||||
updateButtonText(citeButton);
|
||||
} else {
|
||||
showNotification('Failed to copy citation', 'error');
|
||||
showNotification("Failed to copy citation", "error");
|
||||
}
|
||||
});
|
||||
} else {
|
||||
@@ -135,23 +137,26 @@ async function fetchAndCopyWithFallback(filename, button) {
|
||||
// Try to copy (might fail in Safari due to lost user activation)
|
||||
const success = await copyToClipboardSync(citation);
|
||||
if (success) {
|
||||
showNotification(i18n?.copied || 'Citation copied!', 'success');
|
||||
showNotification(i18n?.copied || "Citation copied!", "success");
|
||||
updateButtonText(button);
|
||||
} else {
|
||||
showNotification('Failed to copy citation', 'error');
|
||||
showNotification("Failed to copy citation", "error");
|
||||
}
|
||||
} else {
|
||||
showNotification('Failed to load citation', 'error');
|
||||
showNotification("Failed to load citation", "error");
|
||||
}
|
||||
} catch (error) {
|
||||
if (isDebugMode) {
|
||||
console.error('Failed to copy citation:', error);
|
||||
console.error("Failed to copy citation:", error);
|
||||
}
|
||||
// If it's a NotAllowedError, suggest hovering first
|
||||
if (error.name === 'NotAllowedError') {
|
||||
showNotification('Please hover over the button first, then click', 'info');
|
||||
if (error.name === "NotAllowedError") {
|
||||
showNotification(
|
||||
"Please hover over the button first, then click",
|
||||
"info",
|
||||
);
|
||||
} else {
|
||||
showNotification('Failed to copy citation', 'error');
|
||||
showNotification("Failed to copy citation", "error");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -161,29 +166,29 @@ async function fetchAndCopyWithFallback(filename, button) {
|
||||
* @param {HTMLElement} button - The cite button element
|
||||
*/
|
||||
function updateButtonText(button) {
|
||||
const copiedText = i18n?.copied || 'Copied!';
|
||||
|
||||
const copiedText = i18n?.copied || "Copied!";
|
||||
|
||||
// Find text element to update (skip icon)
|
||||
const textElement = button.querySelector('span');
|
||||
const textElement = button.querySelector("span");
|
||||
if (!textElement) {
|
||||
if (isDebugMode) {
|
||||
console.warn('Could not find text element in cite button');
|
||||
console.warn("Could not find text element in cite button");
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
const originalText = textElement.textContent;
|
||||
textElement.textContent = copiedText;
|
||||
|
||||
|
||||
// Add visual feedback
|
||||
button.classList.add('opacity-70');
|
||||
|
||||
button.classList.add("opacity-70");
|
||||
|
||||
// Revert after 2 seconds
|
||||
setTimeout(() => {
|
||||
textElement.textContent = originalText;
|
||||
button.classList.remove('opacity-70');
|
||||
button.classList.remove("opacity-70");
|
||||
}, 2000);
|
||||
}
|
||||
|
||||
// Export functions for potential reuse
|
||||
export { handleCiteClick, prefetchAllCitations };
|
||||
export { handleCiteClick, prefetchAllCitations };
|
||||
@@ -3,10 +3,10 @@
|
||||
* Provides cross-browser clipboard functionality
|
||||
*/
|
||||
|
||||
import { hugoEnvironment } from '@params';
|
||||
import { hugoEnvironment } from "@params";
|
||||
|
||||
// Debug mode based on environment
|
||||
const isDebugMode = hugoEnvironment === 'development';
|
||||
const isDebugMode = hugoEnvironment === "development";
|
||||
|
||||
/**
|
||||
* Copy text to clipboard with multiple fallback methods
|
||||
@@ -19,16 +19,16 @@ export async function copyToClipboard(text) {
|
||||
try {
|
||||
await navigator.clipboard.writeText(text);
|
||||
if (isDebugMode) {
|
||||
console.log('Copied using Clipboard API');
|
||||
console.log("Copied using Clipboard API");
|
||||
}
|
||||
return true;
|
||||
} catch (err) {
|
||||
if (isDebugMode) {
|
||||
console.warn('Clipboard API failed:', err);
|
||||
console.warn("Clipboard API failed:", err);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Method 2: execCommand fallback
|
||||
return copyUsingExecCommand(text);
|
||||
}
|
||||
@@ -42,16 +42,17 @@ export function copyToClipboardSync(text) {
|
||||
return new Promise((resolve) => {
|
||||
// Try modern clipboard API first
|
||||
if (navigator.clipboard && window.isSecureContext) {
|
||||
navigator.clipboard.writeText(text)
|
||||
navigator.clipboard
|
||||
.writeText(text)
|
||||
.then(() => {
|
||||
if (isDebugMode) {
|
||||
console.log('Copied using Clipboard API (sync)');
|
||||
console.log("Copied using Clipboard API (sync)");
|
||||
}
|
||||
resolve(true);
|
||||
})
|
||||
.catch(err => {
|
||||
.catch((err) => {
|
||||
if (isDebugMode) {
|
||||
console.warn('Clipboard API failed:', err);
|
||||
console.warn("Clipboard API failed:", err);
|
||||
}
|
||||
// Fallback to execCommand
|
||||
resolve(copyUsingExecCommand(text));
|
||||
@@ -69,30 +70,30 @@ export function copyToClipboardSync(text) {
|
||||
* @returns {boolean} - Success status
|
||||
*/
|
||||
export function copyUsingExecCommand(text) {
|
||||
const textarea = document.createElement('textarea');
|
||||
const textarea = document.createElement("textarea");
|
||||
textarea.value = text;
|
||||
|
||||
|
||||
// Make it invisible but copyable
|
||||
Object.assign(textarea.style, {
|
||||
position: 'fixed',
|
||||
top: '0',
|
||||
left: '0',
|
||||
width: '2em',
|
||||
height: '2em',
|
||||
padding: '0',
|
||||
border: 'none',
|
||||
outline: 'none',
|
||||
boxShadow: 'none',
|
||||
background: 'transparent',
|
||||
fontSize: '16px', // Prevent zoom on iOS
|
||||
position: "fixed",
|
||||
top: "0",
|
||||
left: "0",
|
||||
width: "2em",
|
||||
height: "2em",
|
||||
padding: "0",
|
||||
border: "none",
|
||||
outline: "none",
|
||||
boxShadow: "none",
|
||||
background: "transparent",
|
||||
fontSize: "16px", // Prevent zoom on iOS
|
||||
});
|
||||
|
||||
|
||||
document.body.appendChild(textarea);
|
||||
|
||||
|
||||
// Select the text
|
||||
textarea.focus();
|
||||
textarea.select();
|
||||
|
||||
|
||||
// For iOS
|
||||
if (navigator.userAgent.match(/ipad|iphone/i)) {
|
||||
const range = document.createRange();
|
||||
@@ -102,19 +103,19 @@ export function copyUsingExecCommand(text) {
|
||||
selection.addRange(range);
|
||||
textarea.setSelectionRange(0, 999999);
|
||||
}
|
||||
|
||||
|
||||
let success = false;
|
||||
try {
|
||||
success = document.execCommand('copy');
|
||||
success = document.execCommand("copy");
|
||||
if (isDebugMode) {
|
||||
console.log(`execCommand copy ${success ? 'succeeded' : 'failed'}`);
|
||||
console.log(`execCommand copy ${success ? "succeeded" : "failed"}`);
|
||||
}
|
||||
} catch (err) {
|
||||
if (isDebugMode) {
|
||||
console.error('execCommand failed:', err);
|
||||
console.error("execCommand failed:", err);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
document.body.removeChild(textarea);
|
||||
return success;
|
||||
}
|
||||
@@ -135,7 +136,7 @@ export class ClipboardCache {
|
||||
constructor() {
|
||||
this.cache = new Map();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Add content to cache
|
||||
* @param {string} key - Cache key
|
||||
@@ -147,7 +148,7 @@ export class ClipboardCache {
|
||||
console.log(`Cached clipboard content for: ${key}`);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get content from cache
|
||||
* @param {string} key - Cache key
|
||||
@@ -156,7 +157,7 @@ export class ClipboardCache {
|
||||
get(key) {
|
||||
return this.cache.get(key) || null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Check if content is cached
|
||||
* @param {string} key - Cache key
|
||||
@@ -165,14 +166,14 @@ export class ClipboardCache {
|
||||
has(key) {
|
||||
return this.cache.has(key);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Clear the cache
|
||||
*/
|
||||
clear() {
|
||||
this.cache.clear();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get cache size
|
||||
* @returns {number} - Number of cached items
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
import { hugoEnvironment, i18n } from '@params';
|
||||
import { hugoEnvironment, i18n } from "@params";
|
||||
|
||||
// Constants
|
||||
const NOTIFICATION_DURATION = 2000; // milliseconds
|
||||
const DEBOUNCE_DELAY = 300; // milliseconds
|
||||
|
||||
// Debug mode based on environment
|
||||
const isDebugMode = hugoEnvironment === 'development';
|
||||
const isDebugMode = hugoEnvironment === "development";
|
||||
|
||||
/**
|
||||
* Debounce function to prevent rapid clicking
|
||||
@@ -33,37 +33,37 @@ const debounce = (func, wait) => {
|
||||
*/
|
||||
async function copyCodeToClipboard(button, codeWrapper) {
|
||||
if (!button || !(button instanceof HTMLElement)) {
|
||||
throw new Error('Invalid button element');
|
||||
throw new Error("Invalid button element");
|
||||
}
|
||||
if (!codeWrapper || !(codeWrapper instanceof HTMLElement)) {
|
||||
throw new Error('Invalid code wrapper element');
|
||||
throw new Error("Invalid code wrapper element");
|
||||
}
|
||||
|
||||
// Clone the wrapper to avoid modifying the displayed content
|
||||
const tempWrapper = codeWrapper.cloneNode(true);
|
||||
|
||||
// Remove the copy button from the cloned wrapper
|
||||
const copyButton = tempWrapper.querySelector('.copy-button');
|
||||
const copyButton = tempWrapper.querySelector(".copy-button");
|
||||
if (copyButton) {
|
||||
copyButton.remove();
|
||||
}
|
||||
|
||||
const codeToCopy = tempWrapper.textContent?.trim() ?? '';
|
||||
const codeToCopy = tempWrapper.textContent?.trim() ?? "";
|
||||
|
||||
if (!codeToCopy) {
|
||||
throw new Error('No code content found to copy');
|
||||
throw new Error("No code content found to copy");
|
||||
}
|
||||
|
||||
try {
|
||||
await navigator.clipboard.writeText(codeToCopy);
|
||||
copiedNotification(button);
|
||||
isDebugMode && console.debug('Code copied successfully');
|
||||
isDebugMode && console.debug("Code copied successfully");
|
||||
} catch (err) {
|
||||
const errorMessage = err instanceof Error ? err.message : 'Unknown error';
|
||||
console.error('Failed to copy:', errorMessage);
|
||||
button.innerHTML = i18n['copyFailed'] || 'Failed';
|
||||
const errorMessage = err instanceof Error ? err.message : "Unknown error";
|
||||
console.error("Failed to copy:", errorMessage);
|
||||
button.innerHTML = i18n["copyFailed"] || "Failed";
|
||||
setTimeout(() => {
|
||||
button.innerHTML = i18n['copy'];
|
||||
button.innerHTML = i18n["copy"];
|
||||
}, NOTIFICATION_DURATION);
|
||||
throw err; // Re-throw for potential error boundary handling
|
||||
}
|
||||
@@ -74,14 +74,14 @@ async function copyCodeToClipboard(button, codeWrapper) {
|
||||
* @param {HTMLElement} copyBtn - The copy button element
|
||||
*/
|
||||
function copiedNotification(copyBtn) {
|
||||
copyBtn.innerHTML = i18n['copied'];
|
||||
copyBtn.innerHTML = i18n["copied"];
|
||||
copyBtn.disabled = true;
|
||||
copyBtn.classList.add('copied');
|
||||
copyBtn.classList.add("copied");
|
||||
|
||||
setTimeout(() => {
|
||||
copyBtn.innerHTML = i18n['copy'];
|
||||
copyBtn.innerHTML = i18n["copy"];
|
||||
copyBtn.disabled = false;
|
||||
copyBtn.classList.remove('copied');
|
||||
copyBtn.classList.remove("copied");
|
||||
}, NOTIFICATION_DURATION);
|
||||
}
|
||||
|
||||
@@ -90,11 +90,14 @@ function copiedNotification(copyBtn) {
|
||||
* @returns {HTMLButtonElement} The created button
|
||||
*/
|
||||
function createCopyButton() {
|
||||
const copyBtn = document.createElement('button');
|
||||
copyBtn.classList.add('copy-button');
|
||||
copyBtn.innerHTML = i18n['copy'];
|
||||
copyBtn.setAttribute('aria-label', i18n['copyLabel'] || 'Copy code to clipboard');
|
||||
copyBtn.setAttribute('type', 'button'); // Explicit button type
|
||||
const copyBtn = document.createElement("button");
|
||||
copyBtn.classList.add("copy-button");
|
||||
copyBtn.innerHTML = i18n["copy"];
|
||||
copyBtn.setAttribute(
|
||||
"aria-label",
|
||||
i18n["copyLabel"] || "Copy code to clipboard",
|
||||
);
|
||||
copyBtn.setAttribute("type", "button"); // Explicit button type
|
||||
return copyBtn;
|
||||
}
|
||||
|
||||
@@ -106,25 +109,25 @@ function createCopyButton() {
|
||||
function getCodeWrapper(codeblock) {
|
||||
const container = codeblock.parentNode?.parentNode;
|
||||
if (!container) {
|
||||
throw new Error('Invalid code block structure');
|
||||
throw new Error("Invalid code block structure");
|
||||
}
|
||||
|
||||
if (container.classList.contains('highlight')) {
|
||||
if (container.classList.contains("highlight")) {
|
||||
return container;
|
||||
}
|
||||
|
||||
const tableWrapper = container.closest('table');
|
||||
const tableWrapper = container.closest("table");
|
||||
if (tableWrapper) {
|
||||
return tableWrapper;
|
||||
}
|
||||
|
||||
const preElement = codeblock.parentElement;
|
||||
if (preElement) {
|
||||
preElement.classList.add('highlight');
|
||||
preElement.classList.add("highlight");
|
||||
return preElement;
|
||||
}
|
||||
|
||||
throw new Error('Could not determine code wrapper');
|
||||
throw new Error("Could not determine code wrapper");
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -132,7 +135,7 @@ function getCodeWrapper(codeblock) {
|
||||
*/
|
||||
function initializeCodeCopyButtons() {
|
||||
try {
|
||||
const codeBlocks = document.querySelectorAll('pre > code');
|
||||
const codeBlocks = document.querySelectorAll("pre > code");
|
||||
isDebugMode && console.debug(`Found ${codeBlocks.length} code blocks`);
|
||||
|
||||
codeBlocks.forEach((codeblock, index) => {
|
||||
@@ -143,23 +146,26 @@ function initializeCodeCopyButtons() {
|
||||
// Use debounced version of copy function
|
||||
const debouncedCopy = debounce(
|
||||
() => copyCodeToClipboard(copyBtn, wrapper),
|
||||
DEBOUNCE_DELAY
|
||||
DEBOUNCE_DELAY,
|
||||
);
|
||||
|
||||
copyBtn.addEventListener('click', debouncedCopy);
|
||||
copyBtn.addEventListener("click", debouncedCopy);
|
||||
wrapper.appendChild(copyBtn);
|
||||
} catch (err) {
|
||||
console.error(`Failed to initialize copy button for code block ${index}:`, err);
|
||||
console.error(
|
||||
`Failed to initialize copy button for code block ${index}:`,
|
||||
err,
|
||||
);
|
||||
}
|
||||
});
|
||||
} catch (err) {
|
||||
console.error('Failed to initialize code copy buttons:', err);
|
||||
console.error("Failed to initialize code copy buttons:", err);
|
||||
}
|
||||
}
|
||||
|
||||
// Initialize when DOM is ready
|
||||
if (document.readyState === 'loading') {
|
||||
window.addEventListener('DOMContentLoaded', initializeCodeCopyButtons);
|
||||
if (document.readyState === "loading") {
|
||||
window.addEventListener("DOMContentLoaded", initializeCodeCopyButtons);
|
||||
} else {
|
||||
initializeCodeCopyButtons();
|
||||
}
|
||||
@@ -1,19 +1,19 @@
|
||||
import {initTheme, applyHugoStyleFixes} from './hb-init.js';
|
||||
import { applyHugoStyleFixes, initTheme } from "./hb-init.js";
|
||||
|
||||
// Initialize Hugo Blox Builder global object
|
||||
const root = document.documentElement;
|
||||
const defaultTheme = root.dataset.wcThemeDefault || 'system';
|
||||
const defaultTheme = root.dataset.wcThemeDefault || "system";
|
||||
|
||||
// Create global HBB object with theme functions
|
||||
window.hbb = {
|
||||
defaultTheme: defaultTheme,
|
||||
setDarkTheme: function () {
|
||||
root.classList.add('dark');
|
||||
root.style.colorScheme = 'dark';
|
||||
root.classList.add("dark");
|
||||
root.style.colorScheme = "dark";
|
||||
},
|
||||
setLightTheme: function () {
|
||||
root.classList.remove('dark');
|
||||
root.style.colorScheme = 'light';
|
||||
root.classList.remove("dark");
|
||||
root.style.colorScheme = "light";
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@@ -1,12 +1,15 @@
|
||||
window.addEventListener("DOMContentLoaded", () => {
|
||||
// Toggle language chooser sub-menu
|
||||
const languageChoosers = document.querySelectorAll('[data-hb-language-chooser]');
|
||||
const languageChoosers = document.querySelectorAll(
|
||||
"[data-hb-language-chooser]",
|
||||
);
|
||||
languageChoosers.forEach((languageChooser) => {
|
||||
languageChooser.addEventListener('click', (e) => {
|
||||
languageChooser.addEventListener("click", (e) => {
|
||||
e.preventDefault();
|
||||
languageChooser.dataset.state = languageChooser.dataset.state === 'open' ? 'closed' : 'open';
|
||||
languageChooser.dataset.state =
|
||||
languageChooser.dataset.state === "open" ? "closed" : "open";
|
||||
const languageOptions = languageChooser.nextElementSibling;
|
||||
languageOptions.classList.toggle('hidden');
|
||||
languageOptions.classList.toggle("hidden");
|
||||
const languageChooserRect = languageChooser.getBoundingClientRect();
|
||||
const translateY = languageChooserRect.bottom - window.innerHeight + 40;
|
||||
languageOptions.style.transform = `translate3d(${languageChooserRect.left}px, ${translateY}px, 0)`;
|
||||
@@ -15,12 +18,12 @@ window.addEventListener("DOMContentLoaded", () => {
|
||||
});
|
||||
|
||||
// Handle clicks outside chooser
|
||||
document.addEventListener('click', (e) => {
|
||||
if (e.target.closest('[data-hb-language-chooser]') === null) {
|
||||
document.addEventListener("click", (e) => {
|
||||
if (e.target.closest("[data-hb-language-chooser]") === null) {
|
||||
languageChoosers.forEach((languageChooser) => {
|
||||
languageChooser.dataset.state = 'closed';
|
||||
languageChooser.dataset.state = "closed";
|
||||
const languageOptions = languageChooser.nextElementSibling;
|
||||
languageOptions.classList.add('hidden');
|
||||
languageOptions.classList.add("hidden");
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
@@ -3,40 +3,47 @@ export function initTheme() {
|
||||
const root = document.documentElement;
|
||||
const defaultTheme = root.dataset.wcThemeDefault;
|
||||
const setDark = () => {
|
||||
root.classList.add('dark');
|
||||
root.style.colorScheme = 'dark';
|
||||
root.classList.add("dark");
|
||||
root.style.colorScheme = "dark";
|
||||
};
|
||||
const setLight = () => {
|
||||
root.classList.remove('dark');
|
||||
root.style.colorScheme = 'light';
|
||||
root.classList.remove("dark");
|
||||
root.style.colorScheme = "light";
|
||||
};
|
||||
|
||||
if ('wc-color-theme' in localStorage) {
|
||||
localStorage.getItem('wc-color-theme') === 'dark' ? setDark() : setLight();
|
||||
if ("wc-color-theme" in localStorage) {
|
||||
localStorage.getItem("wc-color-theme") === "dark" ? setDark() : setLight();
|
||||
} else {
|
||||
if (defaultTheme === 'dark') setDark();
|
||||
else if (defaultTheme === 'light') setLight();
|
||||
else if (defaultTheme === 'system') {
|
||||
window.matchMedia('(prefers-color-scheme: dark)').matches ? setDark() : setLight();
|
||||
if (defaultTheme === "dark") setDark();
|
||||
else if (defaultTheme === "light") setLight();
|
||||
else if (defaultTheme === "system") {
|
||||
window.matchMedia("(prefers-color-scheme: dark)").matches
|
||||
? setDark()
|
||||
: setLight();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export function applyHugoStyleFixes() {
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
const checkboxes = document.querySelectorAll("li input[type='checkbox'][disabled]");
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
const checkboxes = document.querySelectorAll(
|
||||
"li input[type='checkbox'][disabled]",
|
||||
);
|
||||
checkboxes.forEach((e) => {
|
||||
const parent = e.parentElement?.parentElement;
|
||||
if (parent) parent.classList.add('task-list');
|
||||
if (parent) parent.classList.add("task-list");
|
||||
});
|
||||
|
||||
const liNodes = document.querySelectorAll('.task-list li');
|
||||
const liNodes = document.querySelectorAll(".task-list li");
|
||||
liNodes.forEach((nodes) => {
|
||||
const textNodes = Array.from(nodes.childNodes).filter(
|
||||
(node) => node.nodeType === 3 && node.textContent && node.textContent.trim().length > 1,
|
||||
(node) =>
|
||||
node.nodeType === 3 &&
|
||||
node.textContent &&
|
||||
node.textContent.trim().length > 1,
|
||||
);
|
||||
if (textNodes.length > 0) {
|
||||
const span = document.createElement('label');
|
||||
const span = document.createElement("label");
|
||||
textNodes[0].after(span);
|
||||
const input = nodes.querySelector("input[type='checkbox']");
|
||||
if (input) span.appendChild(input);
|
||||
|
||||
@@ -1,20 +1,24 @@
|
||||
function getCssVar(name) {
|
||||
const value = getComputedStyle(document.documentElement).getPropertyValue(name).trim();
|
||||
return value ? 'rgb(' + value + ')' : null;
|
||||
const value = getComputedStyle(document.documentElement)
|
||||
.getPropertyValue(name)
|
||||
.trim();
|
||||
return value ? "rgb(" + value + ")" : null;
|
||||
}
|
||||
|
||||
window.mermaid.initialize({
|
||||
theme: 'base',
|
||||
theme: "base",
|
||||
themeVariables: {
|
||||
background: getCssVar('--color-neutral-50') || '#fafafa',
|
||||
primaryColor: getCssVar('--color-primary-200') || '#bfdbfe',
|
||||
secondaryColor: getCssVar('--color-secondary-200') || '#a5f3fc',
|
||||
tertiaryColor: getCssVar('--color-neutral-100') || '#f5f5f5',
|
||||
primaryBorderColor: getCssVar('--color-primary-400') || '#60a5fa',
|
||||
secondaryBorderColor: getCssVar('--color-secondary-400') || '#22d3ee',
|
||||
tertiaryBorderColor: getCssVar('--color-neutral-400') || '#a3a3a3',
|
||||
lineColor: getCssVar('--color-neutral-600') || '#525252',
|
||||
fontFamily: getComputedStyle(document.documentElement).getPropertyValue('font-family'),
|
||||
fontSize: '16px',
|
||||
background: getCssVar("--color-neutral-50") || "#fafafa",
|
||||
primaryColor: getCssVar("--color-primary-200") || "#bfdbfe",
|
||||
secondaryColor: getCssVar("--color-secondary-200") || "#a5f3fc",
|
||||
tertiaryColor: getCssVar("--color-neutral-100") || "#f5f5f5",
|
||||
primaryBorderColor: getCssVar("--color-primary-400") || "#60a5fa",
|
||||
secondaryBorderColor: getCssVar("--color-secondary-400") || "#22d3ee",
|
||||
tertiaryBorderColor: getCssVar("--color-neutral-400") || "#a3a3a3",
|
||||
lineColor: getCssVar("--color-neutral-600") || "#525252",
|
||||
fontFamily: getComputedStyle(document.documentElement).getPropertyValue(
|
||||
"font-family",
|
||||
),
|
||||
fontSize: "16px",
|
||||
},
|
||||
});
|
||||
@@ -1,11 +1,12 @@
|
||||
// Navigation
|
||||
|
||||
const applyScrollPadding = () => {
|
||||
const header = document.querySelector('.page-header');
|
||||
const header = document.querySelector(".page-header");
|
||||
let position = header.getBoundingClientRect();
|
||||
document.documentElement.style.scrollPaddingTop = position.height.toString() + 'px';
|
||||
const r = document.querySelector(':root');
|
||||
r.style.setProperty('--navbar-height', position.height.toString() + 'px');
|
||||
document.documentElement.style.scrollPaddingTop =
|
||||
position.height.toString() + "px";
|
||||
const r = document.querySelector(":root");
|
||||
r.style.setProperty("--navbar-height", position.height.toString() + "px");
|
||||
};
|
||||
|
||||
window.addEventListener("DOMContentLoaded", () => {
|
||||
@@ -40,5 +41,5 @@ window.addEventListener("DOMContentLoaded", () => {
|
||||
});
|
||||
});
|
||||
|
||||
applyScrollPadding()
|
||||
applyScrollPadding();
|
||||
});
|
||||
@@ -3,10 +3,10 @@
|
||||
* Provides reusable notification functionality
|
||||
*/
|
||||
|
||||
import { hugoEnvironment } from '@params';
|
||||
import { hugoEnvironment } from "@params";
|
||||
|
||||
// Debug mode based on environment
|
||||
const isDebugMode = hugoEnvironment === 'development';
|
||||
const isDebugMode = hugoEnvironment === "development";
|
||||
|
||||
/**
|
||||
* Show a notification message using Tailwind styles
|
||||
@@ -15,37 +15,40 @@ const isDebugMode = hugoEnvironment === 'development';
|
||||
* @param {number} duration - Duration in milliseconds (default 3000)
|
||||
* @returns {HTMLElement} - The notification element
|
||||
*/
|
||||
export function showNotification(message, type = 'success', duration = 3000) {
|
||||
export function showNotification(message, type = "success", duration = 3000) {
|
||||
// Get or create the notification container
|
||||
const container = getOrCreateContainer();
|
||||
|
||||
|
||||
// Remove any existing notifications with same message
|
||||
const existingNotification = container.querySelector('.hb-notification');
|
||||
if (existingNotification && existingNotification.textContent.includes(message)) {
|
||||
const existingNotification = container.querySelector(".hb-notification");
|
||||
if (
|
||||
existingNotification &&
|
||||
existingNotification.textContent.includes(message)
|
||||
) {
|
||||
existingNotification.remove();
|
||||
}
|
||||
|
||||
|
||||
// Create notification element
|
||||
const notification = createNotificationElement(message, type);
|
||||
|
||||
|
||||
// Add to container
|
||||
container.appendChild(notification);
|
||||
|
||||
|
||||
// Handle close button
|
||||
const closeBtn = notification.querySelector('.hb-notification-close');
|
||||
const closeBtn = notification.querySelector(".hb-notification-close");
|
||||
if (closeBtn) {
|
||||
closeBtn.addEventListener('click', () => {
|
||||
closeBtn.addEventListener("click", () => {
|
||||
removeNotification(notification);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
// Auto-remove after duration
|
||||
if (duration > 0) {
|
||||
setTimeout(() => {
|
||||
removeNotification(notification);
|
||||
}, duration);
|
||||
}
|
||||
|
||||
|
||||
return notification;
|
||||
}
|
||||
|
||||
@@ -54,20 +57,20 @@ export function showNotification(message, type = 'success', duration = 3000) {
|
||||
* @returns {HTMLElement} - The container element
|
||||
*/
|
||||
function getOrCreateContainer() {
|
||||
let container = document.getElementById('hb-notification-container');
|
||||
|
||||
let container = document.getElementById("hb-notification-container");
|
||||
|
||||
if (!container) {
|
||||
if (isDebugMode) {
|
||||
console.warn('Notification container not found, creating fallback');
|
||||
console.warn("Notification container not found, creating fallback");
|
||||
}
|
||||
container = document.createElement('div');
|
||||
container.id = 'hb-notification-container';
|
||||
container.className = 'fixed top-20 right-4 z-[9999] pointer-events-none';
|
||||
container.setAttribute('aria-live', 'polite');
|
||||
container.setAttribute('aria-atomic', 'true');
|
||||
container = document.createElement("div");
|
||||
container.id = "hb-notification-container";
|
||||
container.className = "fixed top-20 right-4 z-[9999] pointer-events-none";
|
||||
container.setAttribute("aria-live", "polite");
|
||||
container.setAttribute("aria-atomic", "true");
|
||||
document.body.appendChild(container);
|
||||
}
|
||||
|
||||
|
||||
return container;
|
||||
}
|
||||
|
||||
@@ -78,22 +81,22 @@ function getOrCreateContainer() {
|
||||
* @returns {HTMLElement} - The notification element
|
||||
*/
|
||||
function createNotificationElement(message, type) {
|
||||
const notification = document.createElement('div');
|
||||
notification.setAttribute('role', 'alert');
|
||||
|
||||
const notification = document.createElement("div");
|
||||
notification.setAttribute("role", "alert");
|
||||
|
||||
// Define colors for different types
|
||||
const colors = {
|
||||
success: { bg: '#10b981', bgClass: 'bg-green-500' },
|
||||
error: { bg: '#ef4444', bgClass: 'bg-red-500' },
|
||||
info: { bg: '#3b82f6', bgClass: 'bg-blue-500' },
|
||||
warning: { bg: '#f59e0b', bgClass: 'bg-amber-500' }
|
||||
success: { bg: "#10b981", bgClass: "bg-green-500" },
|
||||
error: { bg: "#ef4444", bgClass: "bg-red-500" },
|
||||
info: { bg: "#3b82f6", bgClass: "bg-blue-500" },
|
||||
warning: { bg: "#f59e0b", bgClass: "bg-amber-500" },
|
||||
};
|
||||
|
||||
|
||||
const color = colors[type] || colors.info;
|
||||
|
||||
|
||||
// Set classes
|
||||
notification.className = `hb-notification pointer-events-auto flex items-center gap-2 px-4 py-3 text-white rounded-lg shadow-lg ${color.bgClass} animate-slide-in`;
|
||||
|
||||
|
||||
// Add inline styles as fallback
|
||||
notification.style.cssText = `
|
||||
background-color: ${color.bg};
|
||||
@@ -107,17 +110,20 @@ function createNotificationElement(message, type) {
|
||||
margin-bottom: 0.5rem;
|
||||
pointer-events: auto;
|
||||
`;
|
||||
|
||||
|
||||
// Add icon based on type
|
||||
const icons = {
|
||||
success: '<svg class="w-5 h-5 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"></path></svg>',
|
||||
error: '<svg class="w-5 h-5 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z" clip-rule="evenodd"></path></svg>',
|
||||
success:
|
||||
'<svg class="w-5 h-5 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"></path></svg>',
|
||||
error:
|
||||
'<svg class="w-5 h-5 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z" clip-rule="evenodd"></path></svg>',
|
||||
info: '<svg class="w-5 h-5 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z" clip-rule="evenodd"></path></svg>',
|
||||
warning: '<svg class="w-5 h-5 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z" clip-rule="evenodd"></path></svg>'
|
||||
warning:
|
||||
'<svg class="w-5 h-5 flex-shrink-0" fill="currentColor" viewBox="0 0 20 20"><path fill-rule="evenodd" d="M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z" clip-rule="evenodd"></path></svg>',
|
||||
};
|
||||
|
||||
|
||||
const icon = icons[type] || icons.info;
|
||||
|
||||
|
||||
notification.innerHTML = `
|
||||
${icon}
|
||||
<span class="text-sm font-medium">${message}</span>
|
||||
@@ -127,10 +133,10 @@ function createNotificationElement(message, type) {
|
||||
</svg>
|
||||
</button>
|
||||
`;
|
||||
|
||||
|
||||
// Ensure animation styles exist
|
||||
ensureAnimationStyles();
|
||||
|
||||
|
||||
return notification;
|
||||
}
|
||||
|
||||
@@ -140,10 +146,10 @@ function createNotificationElement(message, type) {
|
||||
*/
|
||||
export function removeNotification(notification) {
|
||||
if (!notification || !notification.parentNode) return;
|
||||
|
||||
notification.classList.remove('animate-slide-in');
|
||||
notification.classList.add('animate-slide-out');
|
||||
|
||||
|
||||
notification.classList.remove("animate-slide-in");
|
||||
notification.classList.add("animate-slide-out");
|
||||
|
||||
setTimeout(() => {
|
||||
if (notification.parentNode) {
|
||||
notification.remove();
|
||||
@@ -155,9 +161,9 @@ export function removeNotification(notification) {
|
||||
* Ensure animation styles are in the document
|
||||
*/
|
||||
function ensureAnimationStyles() {
|
||||
if (!document.querySelector('#hb-notification-styles')) {
|
||||
const style = document.createElement('style');
|
||||
style.id = 'hb-notification-styles';
|
||||
if (!document.querySelector("#hb-notification-styles")) {
|
||||
const style = document.createElement("style");
|
||||
style.id = "hb-notification-styles";
|
||||
style.textContent = `
|
||||
@keyframes slide-in {
|
||||
from {
|
||||
|
||||
@@ -2,59 +2,64 @@
|
||||
// Initialize search wrapper element globally
|
||||
let searchWrapper = null;
|
||||
|
||||
window.addEventListener('DOMContentLoaded', () => {
|
||||
const configScript = document.getElementById('search-config');
|
||||
window.addEventListener("DOMContentLoaded", () => {
|
||||
const configScript = document.getElementById("search-config");
|
||||
if (!configScript) {
|
||||
// No search on this page.
|
||||
return;
|
||||
}
|
||||
|
||||
const searchConfig = JSON.parse(configScript.textContent);
|
||||
if (!searchConfig || typeof searchConfig.baseUrl === 'undefined') {
|
||||
console.error('Pagefind search config is missing or invalid.', searchConfig);
|
||||
if (!searchConfig || typeof searchConfig.baseUrl === "undefined") {
|
||||
console.error(
|
||||
"Pagefind search config is missing or invalid.",
|
||||
searchConfig,
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
new PagefindUI({
|
||||
element: '#search',
|
||||
element: "#search",
|
||||
showSubResults: true,
|
||||
baseUrl: searchConfig.baseUrl,
|
||||
bundlePath: searchConfig.baseUrl + 'pagefind/',
|
||||
bundlePath: searchConfig.baseUrl + "pagefind/",
|
||||
});
|
||||
} catch (e) {
|
||||
console.error('Failed to initialize PagefindUI:', e);
|
||||
console.error("Failed to initialize PagefindUI:", e);
|
||||
return;
|
||||
}
|
||||
|
||||
// Get search wrapper element
|
||||
searchWrapper = document.getElementById('search-wrapper');
|
||||
searchWrapper = document.getElementById("search-wrapper");
|
||||
|
||||
// Add click handlers to triggers
|
||||
let triggers = document.querySelectorAll('[data-search-toggle]');
|
||||
triggers.forEach((trigger) => trigger.addEventListener('click', handleSearchToggle));
|
||||
let triggers = document.querySelectorAll("[data-search-toggle]");
|
||||
triggers.forEach((trigger) =>
|
||||
trigger.addEventListener("click", handleSearchToggle),
|
||||
);
|
||||
});
|
||||
|
||||
function handleSearchToggle() {
|
||||
if (!searchWrapper) return;
|
||||
|
||||
const isHidden = searchWrapper.classList.contains('hidden');
|
||||
searchWrapper.classList.toggle('hidden');
|
||||
document.body.style.overflow = isHidden ? 'hidden' : '';
|
||||
const isHidden = searchWrapper.classList.contains("hidden");
|
||||
searchWrapper.classList.toggle("hidden");
|
||||
document.body.style.overflow = isHidden ? "hidden" : "";
|
||||
|
||||
const searchInput = searchWrapper.querySelector('input');
|
||||
const searchInput = searchWrapper.querySelector("input");
|
||||
if (searchInput) {
|
||||
searchInput.value = '';
|
||||
searchInput.value = "";
|
||||
searchInput.focus();
|
||||
}
|
||||
|
||||
if (!searchWrapper.classList.contains('hidden')) {
|
||||
let clearTrigger = document.querySelector('.pagefind-ui__search-clear');
|
||||
if (!searchWrapper.classList.contains("hidden")) {
|
||||
let clearTrigger = document.querySelector(".pagefind-ui__search-clear");
|
||||
|
||||
if (clearTrigger && !clearTrigger.hasAttribute('listenerOnClick')) {
|
||||
clearTrigger.setAttribute('listenerOnClick', 'true');
|
||||
if (clearTrigger && !clearTrigger.hasAttribute("listenerOnClick")) {
|
||||
clearTrigger.setAttribute("listenerOnClick", "true");
|
||||
|
||||
clearTrigger.addEventListener('click', () => {
|
||||
clearTrigger.addEventListener("click", () => {
|
||||
searchInput.focus();
|
||||
});
|
||||
}
|
||||
@@ -62,8 +67,12 @@ function handleSearchToggle() {
|
||||
}
|
||||
|
||||
// Add keyboard shortcut to close search modal with Escape key
|
||||
document.addEventListener('keydown', (event) => {
|
||||
if (event.key === 'Escape' && searchWrapper && !searchWrapper.classList.contains('hidden')) {
|
||||
searchWrapper.classList.add('hidden');
|
||||
document.addEventListener("keydown", (event) => {
|
||||
if (
|
||||
event.key === "Escape" &&
|
||||
searchWrapper &&
|
||||
!searchWrapper.classList.contains("hidden")
|
||||
) {
|
||||
searchWrapper.classList.add("hidden");
|
||||
}
|
||||
});
|
||||
@@ -5,25 +5,31 @@ document.addEventListener("DOMContentLoaded", function () {
|
||||
e.preventDefault();
|
||||
const parent = button.parentElement.parentElement;
|
||||
if (parent) {
|
||||
parent.classList.toggle("open")
|
||||
parent.classList.toggle("open");
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
// Hamburger menu for mobile navigation
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
const menu = document.querySelector('#nav-toggle');
|
||||
const overlay = document.querySelector('.hb-sidebar-mobile-menu');
|
||||
const sidebarContainer = document.querySelector('.hb-sidebar-container');
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
const menu = document.querySelector("#nav-toggle");
|
||||
const overlay = document.querySelector(".hb-sidebar-mobile-menu");
|
||||
const sidebarContainer = document.querySelector(".hb-sidebar-container");
|
||||
|
||||
if (!overlay){
|
||||
if (!overlay) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Initialize the overlay
|
||||
const overlayClasses = ['fixed', 'z-10', 'inset-0', 'bg-white', 'dark:bg-black/80'];
|
||||
overlay.classList.add('bg-transparent');
|
||||
const overlayClasses = [
|
||||
"fixed",
|
||||
"z-10",
|
||||
"inset-0",
|
||||
"bg-white",
|
||||
"dark:bg-black/80",
|
||||
];
|
||||
overlay.classList.add("bg-transparent");
|
||||
overlay.classList.remove("hidden", ...overlayClasses);
|
||||
|
||||
function toggleMenu() {
|
||||
@@ -31,36 +37,38 @@ document.addEventListener('DOMContentLoaded', function () {
|
||||
// See `hb-nav.js` - it handles the default behavior (irrespective of if sidebar is shown).
|
||||
|
||||
// When menu is open, show the navigation sidebar
|
||||
sidebarContainer.classList.toggle('max-lg:[transform:translate3d(0,-100%,0)]');
|
||||
sidebarContainer.classList.toggle('max-lg:[transform:translate3d(0,0,0)]');
|
||||
sidebarContainer.classList.toggle(
|
||||
"max-lg:[transform:translate3d(0,-100%,0)]",
|
||||
);
|
||||
sidebarContainer.classList.toggle("max-lg:[transform:translate3d(0,0,0)]");
|
||||
|
||||
// When menu is open, prevent body from scrolling
|
||||
document.body.classList.toggle('overflow-hidden');
|
||||
document.body.classList.toggle('lg:overflow-auto');
|
||||
document.body.classList.toggle("overflow-hidden");
|
||||
document.body.classList.toggle("lg:overflow-auto");
|
||||
}
|
||||
|
||||
menu.addEventListener('click', (e) => {
|
||||
console.debug("Hamburger clicked.");
|
||||
menu.addEventListener("click", (e) => {
|
||||
console.debug("Hamburger clicked.");
|
||||
e.preventDefault();
|
||||
toggleMenu();
|
||||
|
||||
if (overlay.classList.contains('bg-transparent')) {
|
||||
if (overlay.classList.contains("bg-transparent")) {
|
||||
// Show overlay
|
||||
overlay.classList.add(...overlayClasses);
|
||||
overlay.classList.remove('bg-transparent');
|
||||
overlay.classList.remove("bg-transparent");
|
||||
} else {
|
||||
// Hide overlay
|
||||
overlay.classList.remove(...overlayClasses);
|
||||
overlay.classList.add('bg-transparent');
|
||||
overlay.classList.add("bg-transparent");
|
||||
}
|
||||
});
|
||||
|
||||
overlay.addEventListener('click', (e) => {
|
||||
overlay.addEventListener("click", (e) => {
|
||||
e.preventDefault();
|
||||
toggleMenu();
|
||||
|
||||
// Hide overlay
|
||||
overlay.classList.remove(...overlayClasses);
|
||||
overlay.classList.add('bg-transparent');
|
||||
overlay.classList.add("bg-transparent");
|
||||
});
|
||||
});
|
||||
@@ -1,5 +1,5 @@
|
||||
// Hugo Blox Builder Light / Dark theme toggle
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
addThemeToggleListener();
|
||||
});
|
||||
|
||||
@@ -11,17 +11,23 @@ function addThemeToggleListener() {
|
||||
if (
|
||||
localStorage.getItem("wc-color-theme") === "dark" ||
|
||||
(!("wc-color-theme" in localStorage) &&
|
||||
((window.matchMedia("(prefers-color-scheme: dark)").matches && defaultTheme === "system") || defaultTheme === "dark"))
|
||||
((window.matchMedia("(prefers-color-scheme: dark)").matches &&
|
||||
defaultTheme === "system") ||
|
||||
defaultTheme === "dark"))
|
||||
) {
|
||||
themeToggleButtons.forEach((el) => el.dataset.theme = "dark");
|
||||
themeToggleButtons.forEach((el) => {
|
||||
el.dataset.theme = "dark";
|
||||
});
|
||||
} else {
|
||||
themeToggleButtons.forEach((el) => el.dataset.theme = "light");
|
||||
themeToggleButtons.forEach((el) => {
|
||||
el.dataset.theme = "light";
|
||||
});
|
||||
}
|
||||
|
||||
// Add click event handler to the light/dark buttons
|
||||
themeToggleButtons.forEach((el) => {
|
||||
el.addEventListener("click", function () {
|
||||
console.debug('Theme toggled');
|
||||
console.debug("Theme toggled");
|
||||
if (localStorage.getItem("wc-color-theme")) {
|
||||
if (localStorage.getItem("wc-color-theme") === "light") {
|
||||
window.hbb.setDarkTheme();
|
||||
@@ -39,21 +45,31 @@ function addThemeToggleListener() {
|
||||
localStorage.setItem("wc-color-theme", "dark");
|
||||
}
|
||||
}
|
||||
el.dataset.theme = document.documentElement.classList.contains("dark") ? "dark" : "light";
|
||||
el.dataset.theme = document.documentElement.classList.contains("dark")
|
||||
? "dark"
|
||||
: "light";
|
||||
|
||||
// Dispatch `hbThemeChange` event to support themeable user plugins.
|
||||
const themeChangeEvent = new CustomEvent('hbThemeChange', {detail: {isDarkTheme: () => document.documentElement.classList.contains("dark")}});
|
||||
const themeChangeEvent = new CustomEvent("hbThemeChange", {
|
||||
detail: {
|
||||
isDarkTheme: () =>
|
||||
document.documentElement.classList.contains("dark"),
|
||||
},
|
||||
});
|
||||
document.dispatchEvent(themeChangeEvent);
|
||||
});
|
||||
});
|
||||
|
||||
// Listen for dark mode toggling in OS
|
||||
window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", (event) => {
|
||||
if (defaultTheme === "system" && !("wc-color-theme" in localStorage)) {
|
||||
event.matches ? window.hbb.setDarkTheme() : window.hbb.setLightTheme();
|
||||
themeToggleButtons.forEach((el) =>
|
||||
el.dataset.theme = document.documentElement.classList.contains("dark") ? "dark" : "light"
|
||||
);
|
||||
}
|
||||
});
|
||||
window
|
||||
.matchMedia("(prefers-color-scheme: dark)")
|
||||
.addEventListener("change", (event) => {
|
||||
if (defaultTheme === "system" && !("wc-color-theme" in localStorage)) {
|
||||
event.matches ? window.hbb.setDarkTheme() : window.hbb.setLightTheme();
|
||||
themeToggleButtons.forEach((el) => {
|
||||
const isDark = document.documentElement.classList.contains("dark");
|
||||
el.dataset.theme = isDark ? "dark" : "light";
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -1,5 +1,2 @@
|
||||
// Dummy entry for Vite lib mode. We copy vendor libraries via vite-plugin-static-copy.
|
||||
export default {}
|
||||
|
||||
|
||||
|
||||
export default {};
|
||||
@@ -4,11 +4,25 @@
|
||||
"version": "1.0.0",
|
||||
"license": "MIT",
|
||||
"category": "content",
|
||||
"tags": ["collection", "blog", "publications", "filter", "sort", "content-display", "archive"],
|
||||
"tags": [
|
||||
"collection",
|
||||
"blog",
|
||||
"publications",
|
||||
"filter",
|
||||
"sort",
|
||||
"content-display",
|
||||
"archive"
|
||||
],
|
||||
"description": "Display filtered and sorted collections of pages with customizable views and pagination",
|
||||
"author": "Hugo Blox",
|
||||
"homepage": "https://hugoblox.com/blocks/",
|
||||
"repository": "https://github.com/HugoBlox/hugo-blox-builder",
|
||||
"keywords": ["hugo", "static-site", "content", "blog", "publications", "filtering"]
|
||||
"keywords": [
|
||||
"hugo",
|
||||
"static-site",
|
||||
"content",
|
||||
"blog",
|
||||
"publications",
|
||||
"filtering"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -115,4 +115,3 @@
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -4,11 +4,25 @@
|
||||
"version": "1.0.0",
|
||||
"license": "MIT",
|
||||
"category": "marketing",
|
||||
"tags": ["cta", "buttons", "links", "social", "marketing", "conversion", "list"],
|
||||
"tags": [
|
||||
"cta",
|
||||
"buttons",
|
||||
"links",
|
||||
"social",
|
||||
"marketing",
|
||||
"conversion",
|
||||
"list"
|
||||
],
|
||||
"description": "Create compelling vertical lists of call-to-action buttons with icons and hover effects",
|
||||
"author": "Hugo Blox",
|
||||
"homepage": "https://hugoblox.com/blocks/",
|
||||
"repository": "https://github.com/HugoBlox/hugo-blox-builder",
|
||||
"keywords": ["hugo", "cta", "buttons", "conversion", "marketing", "social-links"]
|
||||
"keywords": [
|
||||
"hugo",
|
||||
"cta",
|
||||
"buttons",
|
||||
"conversion",
|
||||
"marketing",
|
||||
"social-links"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -46,4 +46,3 @@
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -4,11 +4,18 @@
|
||||
"version": "1.0.0",
|
||||
"license": "MIT",
|
||||
"category": "marketing",
|
||||
"tags": ["cta", "card", "conversion", "marketing", "hero", "call-to-action", "banner"],
|
||||
"tags": [
|
||||
"cta",
|
||||
"card",
|
||||
"conversion",
|
||||
"marketing",
|
||||
"hero",
|
||||
"call-to-action",
|
||||
"banner"
|
||||
],
|
||||
"description": "Create high-impact call-to-action cards with bold typography and compelling buttons",
|
||||
"author": "Hugo Blox",
|
||||
"homepage": "https://hugoblox.com/blocks/",
|
||||
"repository": "https://github.com/HugoBlox/hugo-blox-builder",
|
||||
"keywords": ["hugo", "cta", "marketing", "conversion", "banner", "card"]
|
||||
}
|
||||
|
||||
@@ -4,11 +4,25 @@
|
||||
"version": "1.0.0",
|
||||
"license": "MIT",
|
||||
"category": "marketing",
|
||||
"tags": ["cta", "image", "features", "alternating", "marketing", "storytelling", "visual"],
|
||||
"tags": [
|
||||
"cta",
|
||||
"image",
|
||||
"features",
|
||||
"alternating",
|
||||
"marketing",
|
||||
"storytelling",
|
||||
"visual"
|
||||
],
|
||||
"description": "Engaging alternating image and text sections with feature lists and call-to-action buttons",
|
||||
"author": "Hugo Blox",
|
||||
"homepage": "https://hugoblox.com/blocks/",
|
||||
"repository": "https://github.com/HugoBlox/hugo-blox-builder",
|
||||
"keywords": ["hugo", "marketing", "images", "features", "storytelling", "conversion"]
|
||||
"keywords": [
|
||||
"hugo",
|
||||
"marketing",
|
||||
"images",
|
||||
"features",
|
||||
"storytelling",
|
||||
"conversion"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -73,4 +73,3 @@
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -4,11 +4,18 @@
|
||||
"version": "1.0.0",
|
||||
"license": "MIT",
|
||||
"category": "content",
|
||||
"tags": ["features", "grid", "icons", "benefits", "product", "services", "highlights"],
|
||||
"tags": [
|
||||
"features",
|
||||
"grid",
|
||||
"icons",
|
||||
"benefits",
|
||||
"product",
|
||||
"services",
|
||||
"highlights"
|
||||
],
|
||||
"description": "Showcase features, benefits, or services in an organized grid with icons and descriptions",
|
||||
"author": "Hugo Blox",
|
||||
"homepage": "https://hugoblox.com/blocks/",
|
||||
"repository": "https://github.com/HugoBlox/hugo-blox-builder",
|
||||
"keywords": ["hugo", "features", "grid", "services", "benefits", "product"]
|
||||
}
|
||||
|
||||
@@ -54,4 +54,3 @@
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -4,11 +4,18 @@
|
||||
"version": "1.0.0",
|
||||
"license": "MIT",
|
||||
"category": "marketing",
|
||||
"tags": ["hero", "landing", "cta", "announcement", "headline", "conversion", "primary"],
|
||||
"tags": [
|
||||
"hero",
|
||||
"landing",
|
||||
"cta",
|
||||
"announcement",
|
||||
"headline",
|
||||
"conversion",
|
||||
"primary"
|
||||
],
|
||||
"description": "Create compelling hero sections with headlines, announcements, and dual call-to-action buttons",
|
||||
"author": "Hugo Blox",
|
||||
"homepage": "https://hugoblox.com/blocks/",
|
||||
"repository": "https://github.com/HugoBlox/hugo-blox-builder",
|
||||
"keywords": ["hugo", "hero", "landing-page", "cta", "marketing", "headlines"]
|
||||
}
|
||||
|
||||
@@ -91,4 +91,3 @@
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -4,11 +4,18 @@
|
||||
"version": "1.0.0",
|
||||
"license": "MIT",
|
||||
"category": "content",
|
||||
"tags": ["markdown", "content", "text", "prose", "writing", "simple", "flexible"],
|
||||
"tags": [
|
||||
"markdown",
|
||||
"content",
|
||||
"text",
|
||||
"prose",
|
||||
"writing",
|
||||
"simple",
|
||||
"flexible"
|
||||
],
|
||||
"description": "Display rich markdown content with beautiful typography and optional section titles",
|
||||
"author": "Hugo Blox",
|
||||
"homepage": "https://hugoblox.com/blocks/",
|
||||
"repository": "https://github.com/HugoBlox/hugo-blox-builder",
|
||||
"keywords": ["hugo", "markdown", "content", "typography", "prose", "text"]
|
||||
}
|
||||
|
||||
@@ -32,4 +32,3 @@
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -4,11 +4,25 @@
|
||||
"version": "1.0.0",
|
||||
"license": "MIT",
|
||||
"category": "resume",
|
||||
"tags": ["resume", "awards", "certifications", "achievements", "credentials", "professional", "cv"],
|
||||
"tags": [
|
||||
"resume",
|
||||
"awards",
|
||||
"certifications",
|
||||
"achievements",
|
||||
"credentials",
|
||||
"professional",
|
||||
"cv"
|
||||
],
|
||||
"description": "Showcase professional awards and certifications with elegant card layouts and certificate links",
|
||||
"author": "Hugo Blox",
|
||||
"homepage": "https://hugoblox.com/blocks/",
|
||||
"repository": "https://github.com/HugoBlox/hugo-blox-builder",
|
||||
"keywords": ["hugo", "resume", "awards", "certifications", "cv", "professional"]
|
||||
"keywords": [
|
||||
"hugo",
|
||||
"resume",
|
||||
"awards",
|
||||
"certifications",
|
||||
"cv",
|
||||
"professional"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -53,4 +53,3 @@
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -4,11 +4,27 @@
|
||||
"version": "1.0.0",
|
||||
"license": "MIT",
|
||||
"category": "resume",
|
||||
"tags": ["resume", "biography", "profile", "horizontal", "education", "interests", "cv", "layout"],
|
||||
"tags": [
|
||||
"resume",
|
||||
"biography",
|
||||
"profile",
|
||||
"horizontal",
|
||||
"education",
|
||||
"interests",
|
||||
"cv",
|
||||
"layout"
|
||||
],
|
||||
"description": "Horizontal biography layout with integrated education and interests sections",
|
||||
"author": "Hugo Blox",
|
||||
"homepage": "https://hugoblox.com/blocks/",
|
||||
"repository": "https://github.com/HugoBlox/hugo-blox-builder",
|
||||
"keywords": ["hugo", "resume", "biography", "horizontal", "education", "interests", "cv"]
|
||||
"keywords": [
|
||||
"hugo",
|
||||
"resume",
|
||||
"biography",
|
||||
"horizontal",
|
||||
"education",
|
||||
"interests",
|
||||
"cv"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -4,11 +4,27 @@
|
||||
"version": "1.0.0",
|
||||
"license": "MIT",
|
||||
"category": "resume",
|
||||
"tags": ["resume", "biography", "profile", "avatar", "social", "about", "personal", "cv"],
|
||||
"tags": [
|
||||
"resume",
|
||||
"biography",
|
||||
"profile",
|
||||
"avatar",
|
||||
"social",
|
||||
"about",
|
||||
"personal",
|
||||
"cv"
|
||||
],
|
||||
"description": "Professional biography section with customizable avatar, social links, and personal information",
|
||||
"author": "Hugo Blox",
|
||||
"homepage": "https://hugoblox.com/blocks/",
|
||||
"repository": "https://github.com/HugoBlox/hugo-blox-builder",
|
||||
"keywords": ["hugo", "resume", "biography", "profile", "avatar", "social", "cv"]
|
||||
"keywords": [
|
||||
"hugo",
|
||||
"resume",
|
||||
"biography",
|
||||
"profile",
|
||||
"avatar",
|
||||
"social",
|
||||
"cv"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -97,4 +97,3 @@
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -4,11 +4,27 @@
|
||||
"version": "1.0.0",
|
||||
"license": "MIT",
|
||||
"category": "resume",
|
||||
"tags": ["resume", "experience", "timeline", "work", "education", "career", "professional", "cv"],
|
||||
"tags": [
|
||||
"resume",
|
||||
"experience",
|
||||
"timeline",
|
||||
"work",
|
||||
"education",
|
||||
"career",
|
||||
"professional",
|
||||
"cv"
|
||||
],
|
||||
"description": "Professional timeline displaying work experience and education history in chronological order",
|
||||
"author": "Hugo Blox",
|
||||
"homepage": "https://hugoblox.com/blocks/",
|
||||
"repository": "https://github.com/HugoBlox/hugo-blox-builder",
|
||||
"keywords": ["hugo", "resume", "experience", "timeline", "work", "education", "career"]
|
||||
"keywords": [
|
||||
"hugo",
|
||||
"resume",
|
||||
"experience",
|
||||
"timeline",
|
||||
"work",
|
||||
"education",
|
||||
"career"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -54,4 +54,3 @@
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -4,11 +4,27 @@
|
||||
"version": "1.0.0",
|
||||
"license": "MIT",
|
||||
"category": "resume",
|
||||
"tags": ["resume", "languages", "multilingual", "skills", "fluency", "international", "cv", "circular-progress"],
|
||||
"tags": [
|
||||
"resume",
|
||||
"languages",
|
||||
"multilingual",
|
||||
"skills",
|
||||
"fluency",
|
||||
"international",
|
||||
"cv",
|
||||
"circular-progress"
|
||||
],
|
||||
"description": "Showcase language proficiency with beautiful circular progress indicators and percentage displays",
|
||||
"author": "Hugo Blox",
|
||||
"homepage": "https://hugoblox.com/blocks/",
|
||||
"repository": "https://github.com/HugoBlox/hugo-blox-builder",
|
||||
"keywords": ["hugo", "resume", "languages", "multilingual", "fluency", "skills", "cv"]
|
||||
"keywords": [
|
||||
"hugo",
|
||||
"resume",
|
||||
"languages",
|
||||
"multilingual",
|
||||
"fluency",
|
||||
"skills",
|
||||
"cv"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -36,4 +36,3 @@
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -4,11 +4,27 @@
|
||||
"version": "1.0.0",
|
||||
"license": "MIT",
|
||||
"category": "resume",
|
||||
"tags": ["resume", "skills", "technical", "progress-bars", "expertise", "professional", "competencies", "cv"],
|
||||
"tags": [
|
||||
"resume",
|
||||
"skills",
|
||||
"technical",
|
||||
"progress-bars",
|
||||
"expertise",
|
||||
"professional",
|
||||
"competencies",
|
||||
"cv"
|
||||
],
|
||||
"description": "Display technical and professional skills with optional progress bars and organized categories",
|
||||
"author": "Hugo Blox",
|
||||
"homepage": "https://hugoblox.com/blocks/",
|
||||
"repository": "https://github.com/HugoBlox/hugo-blox-builder",
|
||||
"keywords": ["hugo", "resume", "skills", "technical", "progress", "expertise", "cv"]
|
||||
"keywords": [
|
||||
"hugo",
|
||||
"resume",
|
||||
"skills",
|
||||
"technical",
|
||||
"progress",
|
||||
"expertise",
|
||||
"cv"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -53,4 +53,3 @@
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -181,4 +181,3 @@
|
||||
"required": ["block"],
|
||||
"additionalProperties": true
|
||||
}
|
||||
|
||||
@@ -100,4 +100,3 @@
|
||||
"required": ["type", "sections"],
|
||||
"additionalProperties": true
|
||||
}
|
||||
|
||||
@@ -6,22 +6,21 @@
|
||||
"type": "array",
|
||||
"items": {
|
||||
"oneOf": [
|
||||
{"$ref": "../hero/schema.json"},
|
||||
{"$ref": "../features/schema.json"},
|
||||
{"$ref": "../collection/schema.json"},
|
||||
{"$ref": "../markdown/schema.json"},
|
||||
{"$ref": "../stats/schema.json"},
|
||||
{"$ref": "../testimonials/schema.json"},
|
||||
{"$ref": "../cta-button-list/schema.json"},
|
||||
{"$ref": "../cta-card/schema.json"},
|
||||
{"$ref": "../cta-image-paragraph/schema.json"},
|
||||
{"$ref": "../resume-experience/schema.json"},
|
||||
{"$ref": "../resume-biography/schema.json"},
|
||||
{"$ref": "../resume-biography-3/schema.json"},
|
||||
{"$ref": "../resume-skills/schema.json"},
|
||||
{"$ref": "../resume-awards/schema.json"},
|
||||
{"$ref": "../resume-languages/schema.json"}
|
||||
{ "$ref": "../hero/schema.json" },
|
||||
{ "$ref": "../features/schema.json" },
|
||||
{ "$ref": "../collection/schema.json" },
|
||||
{ "$ref": "../markdown/schema.json" },
|
||||
{ "$ref": "../stats/schema.json" },
|
||||
{ "$ref": "../testimonials/schema.json" },
|
||||
{ "$ref": "../cta-button-list/schema.json" },
|
||||
{ "$ref": "../cta-card/schema.json" },
|
||||
{ "$ref": "../cta-image-paragraph/schema.json" },
|
||||
{ "$ref": "../resume-experience/schema.json" },
|
||||
{ "$ref": "../resume-biography/schema.json" },
|
||||
{ "$ref": "../resume-biography-3/schema.json" },
|
||||
{ "$ref": "../resume-skills/schema.json" },
|
||||
{ "$ref": "../resume-awards/schema.json" },
|
||||
{ "$ref": "../resume-languages/schema.json" }
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,11 +4,25 @@
|
||||
"version": "1.0.0",
|
||||
"license": "MIT",
|
||||
"category": "content",
|
||||
"tags": ["statistics", "numbers", "metrics", "achievements", "data", "showcase", "grid"],
|
||||
"tags": [
|
||||
"statistics",
|
||||
"numbers",
|
||||
"metrics",
|
||||
"achievements",
|
||||
"data",
|
||||
"showcase",
|
||||
"grid"
|
||||
],
|
||||
"description": "Showcase impressive statistics and achievements in a clean, impactful grid layout",
|
||||
"author": "Hugo Blox",
|
||||
"homepage": "https://hugoblox.com/blocks/",
|
||||
"repository": "https://github.com/HugoBlox/hugo-blox-builder",
|
||||
"keywords": ["hugo", "statistics", "metrics", "achievements", "data", "numbers"]
|
||||
"keywords": [
|
||||
"hugo",
|
||||
"statistics",
|
||||
"metrics",
|
||||
"achievements",
|
||||
"data",
|
||||
"numbers"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -50,4 +50,3 @@
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -4,11 +4,25 @@
|
||||
"version": "1.0.0",
|
||||
"license": "MIT",
|
||||
"category": "marketing",
|
||||
"tags": ["testimonials", "reviews", "social-proof", "quotes", "customers", "trust", "credibility"],
|
||||
"tags": [
|
||||
"testimonials",
|
||||
"reviews",
|
||||
"social-proof",
|
||||
"quotes",
|
||||
"customers",
|
||||
"trust",
|
||||
"credibility"
|
||||
],
|
||||
"description": "Build trust with authentic customer testimonials featuring quotes, names, and profile photos",
|
||||
"author": "Hugo Blox",
|
||||
"homepage": "https://hugoblox.com/blocks/",
|
||||
"repository": "https://github.com/HugoBlox/hugo-blox-builder",
|
||||
"keywords": ["hugo", "testimonials", "social-proof", "reviews", "customers", "trust"]
|
||||
"keywords": [
|
||||
"hugo",
|
||||
"testimonials",
|
||||
"social-proof",
|
||||
"reviews",
|
||||
"customers",
|
||||
"trust"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -58,4 +58,3 @@
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -13,15 +13,8 @@
|
||||
"spdx": "MIT",
|
||||
"url": "https://github.com/tailwindlabs/heroicons/blob/master/LICENSE"
|
||||
},
|
||||
"samples": [
|
||||
"camera",
|
||||
"building-library",
|
||||
"receipt-refund"
|
||||
],
|
||||
"height": [
|
||||
24,
|
||||
20
|
||||
],
|
||||
"samples": ["camera", "building-library", "receipt-refund"],
|
||||
"height": [24, 20],
|
||||
"category": "General",
|
||||
"palette": false
|
||||
},
|
||||
|
||||
+5
-10
@@ -26,12 +26,8 @@
|
||||
"vite-plugin-static-copy": "^3.1.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"eslint": "~8.15.0",
|
||||
"eslint-config-prettier": "~8.5.0",
|
||||
"prettier": "~2.6.2",
|
||||
"prettier-plugin-go-template": "~0.0.12",
|
||||
"@biomejs/biome": "^1.9.4",
|
||||
"stylelint": "14.8.2",
|
||||
"stylelint-config-prettier": "~9.0.3",
|
||||
"stylelint-config-standard": "~25.0.0",
|
||||
"stylelint-scss": "~4.2.0"
|
||||
},
|
||||
@@ -39,13 +35,12 @@
|
||||
"prod": "scripts/view-starter-prod.sh",
|
||||
"dev": "scripts/view-starter-dev.sh",
|
||||
"test": "echo \"Error: no test specified\" && exit 1",
|
||||
"lint": "pnpm run lint:js && pnpm run lint:style",
|
||||
"lint:js": "eslint '*/**/*.{js,ts,tsx}'",
|
||||
"lint:js:fix": "eslint '*/**/*.{js,ts,tsx}' --fix",
|
||||
"lint": "pnpm run lint:code && pnpm run lint:style",
|
||||
"lint:code": "biome check --reporter=summary .",
|
||||
"lint:code:fix": "biome check --write .",
|
||||
"lint:style": "stylelint '**/*.css'",
|
||||
"lint:style:fix": "stylelint '**/*.css' --fix",
|
||||
"format": "prettier --write \"*.{css,js,json,md}\" \"./**/*.{css,js,json,md}\"",
|
||||
"stylelint-conflict-check": "stylelint-config-prettier-check",
|
||||
"format": "pnpm run lint:code:fix && pnpm run lint:style:fix",
|
||||
"update:starters": "poetry run python ./scripts/update.py",
|
||||
"vendor:libs": "vite build --config vite.config.js",
|
||||
"vendor:libs:watch": "vite build --config vite.config.js --watch"
|
||||
|
||||
Generated
+91
-416
@@ -39,24 +39,12 @@ importers:
|
||||
specifier: ^3.1.1
|
||||
version: 3.1.1(vite@7.1.2(@types/node@24.3.0)(terser@5.43.1)(yaml@2.8.1))
|
||||
devDependencies:
|
||||
eslint:
|
||||
specifier: ~8.15.0
|
||||
version: 8.15.0
|
||||
eslint-config-prettier:
|
||||
specifier: ~8.5.0
|
||||
version: 8.5.0(eslint@8.15.0)
|
||||
prettier:
|
||||
specifier: ~2.6.2
|
||||
version: 2.6.2
|
||||
prettier-plugin-go-template:
|
||||
specifier: ~0.0.12
|
||||
version: 0.0.15(prettier@2.6.2)
|
||||
'@biomejs/biome':
|
||||
specifier: ^1.9.4
|
||||
version: 1.9.4
|
||||
stylelint:
|
||||
specifier: 14.8.2
|
||||
version: 14.8.2
|
||||
stylelint-config-prettier:
|
||||
specifier: ~9.0.3
|
||||
version: 9.0.5(stylelint@14.8.2)
|
||||
stylelint-config-standard:
|
||||
specifier: ~25.0.0
|
||||
version: 25.0.0(stylelint@14.8.2)
|
||||
@@ -78,6 +66,59 @@ packages:
|
||||
resolution: {integrity: sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==}
|
||||
engines: {node: '>=6.9.0'}
|
||||
|
||||
'@biomejs/biome@1.9.4':
|
||||
resolution: {integrity: sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==}
|
||||
engines: {node: '>=14.21.3'}
|
||||
hasBin: true
|
||||
|
||||
'@biomejs/cli-darwin-arm64@1.9.4':
|
||||
resolution: {integrity: sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==}
|
||||
engines: {node: '>=14.21.3'}
|
||||
cpu: [arm64]
|
||||
os: [darwin]
|
||||
|
||||
'@biomejs/cli-darwin-x64@1.9.4':
|
||||
resolution: {integrity: sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==}
|
||||
engines: {node: '>=14.21.3'}
|
||||
cpu: [x64]
|
||||
os: [darwin]
|
||||
|
||||
'@biomejs/cli-linux-arm64-musl@1.9.4':
|
||||
resolution: {integrity: sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==}
|
||||
engines: {node: '>=14.21.3'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
|
||||
'@biomejs/cli-linux-arm64@1.9.4':
|
||||
resolution: {integrity: sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==}
|
||||
engines: {node: '>=14.21.3'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
|
||||
'@biomejs/cli-linux-x64-musl@1.9.4':
|
||||
resolution: {integrity: sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==}
|
||||
engines: {node: '>=14.21.3'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
|
||||
'@biomejs/cli-linux-x64@1.9.4':
|
||||
resolution: {integrity: sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==}
|
||||
engines: {node: '>=14.21.3'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
|
||||
'@biomejs/cli-win32-arm64@1.9.4':
|
||||
resolution: {integrity: sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==}
|
||||
engines: {node: '>=14.21.3'}
|
||||
cpu: [arm64]
|
||||
os: [win32]
|
||||
|
||||
'@biomejs/cli-win32-x64@1.9.4':
|
||||
resolution: {integrity: sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==}
|
||||
engines: {node: '>=14.21.3'}
|
||||
cpu: [x64]
|
||||
os: [win32]
|
||||
|
||||
'@braintree/sanitize-url@6.0.4':
|
||||
resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==}
|
||||
|
||||
@@ -253,22 +294,9 @@ packages:
|
||||
cpu: [x64]
|
||||
os: [win32]
|
||||
|
||||
'@eslint/eslintrc@1.4.1':
|
||||
resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==}
|
||||
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
||||
|
||||
'@gera2ld/jsx-dom@2.2.2':
|
||||
resolution: {integrity: sha512-EOqf31IATRE6zS1W1EoWmXZhGfLAoO9FIlwTtHduSrBdud4npYBxYAkv8dZ5hudDPwJeeSjn40kbCL4wAzr8dA==}
|
||||
|
||||
'@humanwhocodes/config-array@0.9.5':
|
||||
resolution: {integrity: sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==}
|
||||
engines: {node: '>=10.10.0'}
|
||||
deprecated: Use @eslint/config-array instead
|
||||
|
||||
'@humanwhocodes/object-schema@1.2.1':
|
||||
resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==}
|
||||
deprecated: Use @eslint/object-schema instead
|
||||
|
||||
'@jridgewell/gen-mapping@0.3.13':
|
||||
resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
|
||||
|
||||
@@ -602,11 +630,6 @@ packages:
|
||||
peerDependencies:
|
||||
acorn: ^8.14.0
|
||||
|
||||
acorn-jsx@5.3.2:
|
||||
resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
|
||||
peerDependencies:
|
||||
acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
|
||||
|
||||
acorn@7.4.1:
|
||||
resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==}
|
||||
engines: {node: '>=0.4.0'}
|
||||
@@ -634,9 +657,6 @@ packages:
|
||||
peerDependencies:
|
||||
ajv: ^8.8.2
|
||||
|
||||
ajv@6.12.6:
|
||||
resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
|
||||
|
||||
ajv@8.17.1:
|
||||
resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==}
|
||||
|
||||
@@ -658,9 +678,6 @@ packages:
|
||||
resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
|
||||
engines: {node: '>= 8'}
|
||||
|
||||
argparse@2.0.1:
|
||||
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
|
||||
|
||||
array-bounds@1.0.1:
|
||||
resolution: {integrity: sha512-8wdW3ZGk6UjMPJx/glyEt0sLzzwAE1bhToPsO1W2pbpR2gULyxe3BjSiuJFheP50T/GgODVPz2fuMUmIywt8cQ==}
|
||||
|
||||
@@ -748,10 +765,6 @@ packages:
|
||||
canvas-fit@1.5.0:
|
||||
resolution: {integrity: sha512-onIcjRpz69/Hx5bB5HGbYKUF2uC6QT6Gp+pfpGm3A7mPfcluSLV5v4Zu+oflDUwLdUw0rLIBhUbi0v8hM4FJQQ==}
|
||||
|
||||
chalk@4.1.2:
|
||||
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
character-entities@2.0.2:
|
||||
resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
|
||||
|
||||
@@ -836,10 +849,6 @@ packages:
|
||||
country-regex@1.1.0:
|
||||
resolution: {integrity: sha512-iSPlClZP8vX7MC3/u6s3lrDuoQyhQukh5LyABJ3hvfzbQ3Yyayd4fp04zjLnfi267B/B2FkumcWWgrbban7sSA==}
|
||||
|
||||
cross-spawn@7.0.6:
|
||||
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
|
||||
engines: {node: '>= 8'}
|
||||
|
||||
css-font-size-keywords@1.0.0:
|
||||
resolution: {integrity: sha512-Q+svMDbMlelgCfH/RVDKtTDaf5021O486ZThQPIpahnIjUkMUslC+WuOQSWTgGSrNCH08Y7tYNEmmy0hkfMI8Q==}
|
||||
|
||||
@@ -1116,9 +1125,6 @@ packages:
|
||||
decode-named-character-reference@1.2.0:
|
||||
resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==}
|
||||
|
||||
deep-is@0.1.4:
|
||||
resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
|
||||
|
||||
defined@1.0.1:
|
||||
resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==}
|
||||
|
||||
@@ -1144,10 +1150,6 @@ packages:
|
||||
resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
doctrine@3.0.0:
|
||||
resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
|
||||
engines: {node: '>=6.0.0'}
|
||||
|
||||
dompurify@3.1.6:
|
||||
resolution: {integrity: sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ==}
|
||||
|
||||
@@ -1346,66 +1348,24 @@ packages:
|
||||
resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
|
||||
engines: {node: '>=6'}
|
||||
|
||||
escape-string-regexp@4.0.0:
|
||||
resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
escodegen@2.1.0:
|
||||
resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==}
|
||||
engines: {node: '>=6.0'}
|
||||
hasBin: true
|
||||
|
||||
eslint-config-prettier@8.5.0:
|
||||
resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==}
|
||||
hasBin: true
|
||||
peerDependencies:
|
||||
eslint: '>=7.0.0'
|
||||
|
||||
eslint-scope@5.1.1:
|
||||
resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
|
||||
engines: {node: '>=8.0.0'}
|
||||
|
||||
eslint-scope@7.2.2:
|
||||
resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
|
||||
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
||||
|
||||
eslint-utils@3.0.0:
|
||||
resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==}
|
||||
engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0}
|
||||
peerDependencies:
|
||||
eslint: '>=5'
|
||||
|
||||
eslint-visitor-keys@2.1.0:
|
||||
resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
eslint-visitor-keys@3.4.3:
|
||||
resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
|
||||
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
||||
|
||||
eslint@8.15.0:
|
||||
resolution: {integrity: sha512-GG5USZ1jhCu8HJkzGgeK8/+RGnHaNYZGrGDzUtigK3BsGESW/rs2az23XqE0WVwDxy1VRvvjSSGu5nB0Bu+6SA==}
|
||||
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
||||
deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options.
|
||||
hasBin: true
|
||||
|
||||
esniff@2.0.1:
|
||||
resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==}
|
||||
engines: {node: '>=0.10'}
|
||||
|
||||
espree@9.6.1:
|
||||
resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
|
||||
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
||||
|
||||
esprima@4.0.1:
|
||||
resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
|
||||
engines: {node: '>=4'}
|
||||
hasBin: true
|
||||
|
||||
esquery@1.6.0:
|
||||
resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
|
||||
engines: {node: '>=0.10'}
|
||||
|
||||
esrecurse@4.3.0:
|
||||
resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
|
||||
engines: {node: '>=4.0'}
|
||||
@@ -1450,12 +1410,6 @@ packages:
|
||||
fast-isnumeric@1.1.4:
|
||||
resolution: {integrity: sha512-1mM8qOr2LYz8zGaUdmiqRDiuue00Dxjgcb1NQR7TnhLVh6sQyngP9xvLo7Sl7LZpP/sk5eb+bcyWXw530NTBZw==}
|
||||
|
||||
fast-json-stable-stringify@2.1.0:
|
||||
resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
|
||||
|
||||
fast-levenshtein@2.0.6:
|
||||
resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
|
||||
|
||||
fast-uri@3.0.6:
|
||||
resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==}
|
||||
|
||||
@@ -1521,9 +1475,6 @@ packages:
|
||||
function-bind@1.1.2:
|
||||
resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
|
||||
|
||||
functional-red-black-tree@1.0.1:
|
||||
resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==}
|
||||
|
||||
geojson-vt@3.2.1:
|
||||
resolution: {integrity: sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg==}
|
||||
|
||||
@@ -1557,10 +1508,6 @@ packages:
|
||||
resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
|
||||
engines: {node: '>= 6'}
|
||||
|
||||
glob-parent@6.0.2:
|
||||
resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
|
||||
engines: {node: '>=10.13.0'}
|
||||
|
||||
glob-to-regexp@0.4.1:
|
||||
resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==}
|
||||
|
||||
@@ -1580,10 +1527,6 @@ packages:
|
||||
resolution: {integrity: sha512-w0Uf9Y9/nyHinEk5vMJKRie+wa4kR5hmDbEhGGds/kG1PwGLLHKRoNMeJOyCQjjBkANlnScqgzcFwGHgmgLkVA==}
|
||||
engines: {node: '>=16'}
|
||||
|
||||
globals@13.24.0:
|
||||
resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
globby@11.1.0:
|
||||
resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
|
||||
engines: {node: '>=10'}
|
||||
@@ -1831,25 +1774,15 @@ packages:
|
||||
js-tokens@4.0.0:
|
||||
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
|
||||
|
||||
js-yaml@4.1.0:
|
||||
resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
|
||||
hasBin: true
|
||||
|
||||
json-buffer@3.0.1:
|
||||
resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
|
||||
|
||||
json-parse-even-better-errors@2.3.1:
|
||||
resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
|
||||
|
||||
json-schema-traverse@0.4.1:
|
||||
resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
|
||||
|
||||
json-schema-traverse@1.0.0:
|
||||
resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
|
||||
|
||||
json-stable-stringify-without-jsonify@1.0.1:
|
||||
resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
|
||||
|
||||
json-stringify-pretty-compact@4.0.0:
|
||||
resolution: {integrity: sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==}
|
||||
|
||||
@@ -1886,10 +1819,6 @@ packages:
|
||||
layout-base@1.0.2:
|
||||
resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==}
|
||||
|
||||
levn@0.4.1:
|
||||
resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
|
||||
engines: {node: '>= 0.8.0'}
|
||||
|
||||
lines-and-columns@1.2.4:
|
||||
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
|
||||
|
||||
@@ -2100,9 +2029,6 @@ packages:
|
||||
native-promise-only@0.8.1:
|
||||
resolution: {integrity: sha512-zkVhZUA3y8mbz652WrL5x0fB0ehrBkulWT3TomAQ9iDtyXZvzKeEA6GPxAItBYeNYl5yngKRX612qHOhvMkDeg==}
|
||||
|
||||
natural-compare@1.4.0:
|
||||
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
|
||||
|
||||
needle@2.9.1:
|
||||
resolution: {integrity: sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==}
|
||||
engines: {node: '>= 4.4.x'}
|
||||
@@ -2157,10 +2083,6 @@ packages:
|
||||
once@1.4.0:
|
||||
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
|
||||
|
||||
optionator@0.9.4:
|
||||
resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
|
||||
engines: {node: '>= 0.8.0'}
|
||||
|
||||
p-limit@2.3.0:
|
||||
resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
|
||||
engines: {node: '>=6'}
|
||||
@@ -2209,10 +2131,6 @@ packages:
|
||||
resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
|
||||
path-key@3.1.1:
|
||||
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
path-parse@1.0.7:
|
||||
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
|
||||
|
||||
@@ -2307,21 +2225,6 @@ packages:
|
||||
potpack@2.1.0:
|
||||
resolution: {integrity: sha512-pcaShQc1Shq0y+E7GqJqvZj8DTthWV1KeHGdi0Z6IAin2Oi3JnLCOfwnCo84qc+HAp52wT9nK9H7FAJp5a44GQ==}
|
||||
|
||||
prelude-ls@1.2.1:
|
||||
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
|
||||
engines: {node: '>= 0.8.0'}
|
||||
|
||||
prettier-plugin-go-template@0.0.15:
|
||||
resolution: {integrity: sha512-WqU92E1NokWYNZ9mLE6ijoRg6LtIGdLMePt2C7UBDjXeDH9okcRI3zRqtnWR4s5AloiqyvZ66jNBAa9tmRY5EQ==}
|
||||
engines: {node: '>=14.0.0'}
|
||||
peerDependencies:
|
||||
prettier: ^3.0.0
|
||||
|
||||
prettier@2.6.2:
|
||||
resolution: {integrity: sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==}
|
||||
engines: {node: '>=10.13.0'}
|
||||
hasBin: true
|
||||
|
||||
probe-image-size@7.2.3:
|
||||
resolution: {integrity: sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w==}
|
||||
|
||||
@@ -2331,10 +2234,6 @@ packages:
|
||||
protocol-buffers-schema@3.6.0:
|
||||
resolution: {integrity: sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==}
|
||||
|
||||
punycode@2.3.1:
|
||||
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
|
||||
engines: {node: '>=6'}
|
||||
|
||||
queue-microtask@1.2.3:
|
||||
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
|
||||
|
||||
@@ -2376,10 +2275,6 @@ packages:
|
||||
resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
regexpp@3.2.0:
|
||||
resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
regl-error2d@2.0.12:
|
||||
resolution: {integrity: sha512-r7BUprZoPO9AbyqM5qlJesrSRkl+hZnVKWKsVp7YhOl/3RIpi4UDGASGJY0puQ96u5fBYw/OlqV24IGcgJ0McA==}
|
||||
|
||||
@@ -2490,14 +2385,6 @@ packages:
|
||||
shallow-copy@0.0.1:
|
||||
resolution: {integrity: sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==}
|
||||
|
||||
shebang-command@2.0.0:
|
||||
resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
shebang-regex@3.0.0:
|
||||
resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
signal-exit@3.0.7:
|
||||
resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
|
||||
|
||||
@@ -2572,10 +2459,6 @@ packages:
|
||||
resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
strip-json-comments@3.1.1:
|
||||
resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
strongly-connected-components@1.0.1:
|
||||
resolution: {integrity: sha512-i0TFx4wPcO0FwX+4RkLJi1MxmcTv90jNZgxMu9XRnMXMeFUY1VJlIoXpZunPUvUUqbCT1pg5PEkFqqpcaElNaA==}
|
||||
|
||||
@@ -2588,13 +2471,6 @@ packages:
|
||||
style-search@0.1.0:
|
||||
resolution: {integrity: sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==}
|
||||
|
||||
stylelint-config-prettier@9.0.5:
|
||||
resolution: {integrity: sha512-U44lELgLZhbAD/xy/vncZ2Pq8sh2TnpiPvo38Ifg9+zeioR+LAkHu0i6YORIOxFafZoVg0xqQwex6e6F25S5XA==}
|
||||
engines: {node: '>= 12'}
|
||||
hasBin: true
|
||||
peerDependencies:
|
||||
stylelint: '>= 11.x < 15'
|
||||
|
||||
stylelint-config-recommended@7.0.0:
|
||||
resolution: {integrity: sha512-yGn84Bf/q41J4luis1AZ95gj0EQwRX8lWmGmBwkwBNSkpGSpl66XcPTulxGa/Z91aPoNGuIGBmFkcM1MejMo9Q==}
|
||||
peerDependencies:
|
||||
@@ -2684,9 +2560,6 @@ packages:
|
||||
engines: {node: '>=10'}
|
||||
hasBin: true
|
||||
|
||||
text-table@0.2.0:
|
||||
resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
|
||||
|
||||
through2@0.6.5:
|
||||
resolution: {integrity: sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==}
|
||||
|
||||
@@ -2734,18 +2607,10 @@ packages:
|
||||
tslib@2.8.1:
|
||||
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
|
||||
|
||||
type-check@0.4.0:
|
||||
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
|
||||
engines: {node: '>= 0.8.0'}
|
||||
|
||||
type-fest@0.18.1:
|
||||
resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
type-fest@0.20.2:
|
||||
resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
type-fest@0.6.0:
|
||||
resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==}
|
||||
engines: {node: '>=8'}
|
||||
@@ -2763,10 +2628,6 @@ packages:
|
||||
typedarray@0.0.6:
|
||||
resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==}
|
||||
|
||||
ulid@2.4.0:
|
||||
resolution: {integrity: sha512-fIRiVTJNcSRmXKPZtGzFQv9WRrZ3M9eoptl/teFJvjOzmpU+/K/JH6HZ8deBfb5vMEpicJcLn7JmvdknlMq7Zg==}
|
||||
hasBin: true
|
||||
|
||||
undici-types@7.10.0:
|
||||
resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==}
|
||||
|
||||
@@ -2789,9 +2650,6 @@ packages:
|
||||
update-diff@1.1.0:
|
||||
resolution: {integrity: sha512-rCiBPiHxZwT4+sBhEbChzpO5hYHjm91kScWgdHf4Qeafs6Ba7MBl+d9GlGv72bcTZQO0sLmtQS1pHSWoCLtN/A==}
|
||||
|
||||
uri-js@4.4.1:
|
||||
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
|
||||
|
||||
util-deprecate@1.0.2:
|
||||
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
|
||||
|
||||
@@ -2918,20 +2776,11 @@ packages:
|
||||
resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==}
|
||||
hasBin: true
|
||||
|
||||
which@2.0.2:
|
||||
resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
|
||||
engines: {node: '>= 8'}
|
||||
hasBin: true
|
||||
|
||||
which@4.0.0:
|
||||
resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==}
|
||||
engines: {node: ^16.13.0 || >=18.0.0}
|
||||
hasBin: true
|
||||
|
||||
word-wrap@1.2.5:
|
||||
resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
|
||||
world-calendars@1.0.4:
|
||||
resolution: {integrity: sha512-VGRnLJS+xJmGDPodgJRnGIDwGu0s+Cr9V2HB3EzlDZ5n0qb8h5SJtGUEkjrphZYAglEiXZ6kiXdmk0H/h/uu/w==}
|
||||
|
||||
@@ -2978,6 +2827,41 @@ snapshots:
|
||||
|
||||
'@babel/runtime@7.28.3': {}
|
||||
|
||||
'@biomejs/biome@1.9.4':
|
||||
optionalDependencies:
|
||||
'@biomejs/cli-darwin-arm64': 1.9.4
|
||||
'@biomejs/cli-darwin-x64': 1.9.4
|
||||
'@biomejs/cli-linux-arm64': 1.9.4
|
||||
'@biomejs/cli-linux-arm64-musl': 1.9.4
|
||||
'@biomejs/cli-linux-x64': 1.9.4
|
||||
'@biomejs/cli-linux-x64-musl': 1.9.4
|
||||
'@biomejs/cli-win32-arm64': 1.9.4
|
||||
'@biomejs/cli-win32-x64': 1.9.4
|
||||
|
||||
'@biomejs/cli-darwin-arm64@1.9.4':
|
||||
optional: true
|
||||
|
||||
'@biomejs/cli-darwin-x64@1.9.4':
|
||||
optional: true
|
||||
|
||||
'@biomejs/cli-linux-arm64-musl@1.9.4':
|
||||
optional: true
|
||||
|
||||
'@biomejs/cli-linux-arm64@1.9.4':
|
||||
optional: true
|
||||
|
||||
'@biomejs/cli-linux-x64-musl@1.9.4':
|
||||
optional: true
|
||||
|
||||
'@biomejs/cli-linux-x64@1.9.4':
|
||||
optional: true
|
||||
|
||||
'@biomejs/cli-win32-arm64@1.9.4':
|
||||
optional: true
|
||||
|
||||
'@biomejs/cli-win32-x64@1.9.4':
|
||||
optional: true
|
||||
|
||||
'@braintree/sanitize-url@6.0.4': {}
|
||||
|
||||
'@choojs/findup@0.2.1':
|
||||
@@ -3068,34 +2952,10 @@ snapshots:
|
||||
'@esbuild/win32-x64@0.25.9':
|
||||
optional: true
|
||||
|
||||
'@eslint/eslintrc@1.4.1':
|
||||
dependencies:
|
||||
ajv: 6.12.6
|
||||
debug: 4.4.1
|
||||
espree: 9.6.1
|
||||
globals: 13.24.0
|
||||
ignore: 5.3.2
|
||||
import-fresh: 3.3.1
|
||||
js-yaml: 4.1.0
|
||||
minimatch: 3.1.2
|
||||
strip-json-comments: 3.1.1
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
'@gera2ld/jsx-dom@2.2.2':
|
||||
dependencies:
|
||||
'@babel/runtime': 7.28.3
|
||||
|
||||
'@humanwhocodes/config-array@0.9.5':
|
||||
dependencies:
|
||||
'@humanwhocodes/object-schema': 1.2.1
|
||||
debug: 4.4.1
|
||||
minimatch: 3.1.2
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
'@humanwhocodes/object-schema@1.2.1': {}
|
||||
|
||||
'@jridgewell/gen-mapping@0.3.13':
|
||||
dependencies:
|
||||
'@jridgewell/sourcemap-codec': 1.5.5
|
||||
@@ -3470,10 +3330,6 @@ snapshots:
|
||||
dependencies:
|
||||
acorn: 8.15.0
|
||||
|
||||
acorn-jsx@5.3.2(acorn@8.15.0):
|
||||
dependencies:
|
||||
acorn: 8.15.0
|
||||
|
||||
acorn@7.4.1: {}
|
||||
|
||||
acorn@8.15.0: {}
|
||||
@@ -3492,13 +3348,6 @@ snapshots:
|
||||
ajv: 8.17.1
|
||||
fast-deep-equal: 3.1.3
|
||||
|
||||
ajv@6.12.6:
|
||||
dependencies:
|
||||
fast-deep-equal: 3.1.3
|
||||
fast-json-stable-stringify: 2.1.0
|
||||
json-schema-traverse: 0.4.1
|
||||
uri-js: 4.4.1
|
||||
|
||||
ajv@8.17.1:
|
||||
dependencies:
|
||||
fast-deep-equal: 3.1.3
|
||||
@@ -3523,8 +3372,6 @@ snapshots:
|
||||
normalize-path: 3.0.0
|
||||
picomatch: 2.3.1
|
||||
|
||||
argparse@2.0.1: {}
|
||||
|
||||
array-bounds@1.0.1: {}
|
||||
|
||||
array-find-index@1.0.2: {}
|
||||
@@ -3596,11 +3443,6 @@ snapshots:
|
||||
dependencies:
|
||||
element-size: 1.1.1
|
||||
|
||||
chalk@4.1.2:
|
||||
dependencies:
|
||||
ansi-styles: 4.3.0
|
||||
supports-color: 7.2.0
|
||||
|
||||
character-entities@2.0.2: {}
|
||||
|
||||
chokidar@3.6.0:
|
||||
@@ -3697,12 +3539,6 @@ snapshots:
|
||||
|
||||
country-regex@1.1.0: {}
|
||||
|
||||
cross-spawn@7.0.6:
|
||||
dependencies:
|
||||
path-key: 3.1.1
|
||||
shebang-command: 2.0.0
|
||||
which: 2.0.2
|
||||
|
||||
css-font-size-keywords@1.0.0: {}
|
||||
|
||||
css-font-stretch-keywords@1.0.1: {}
|
||||
@@ -3993,8 +3829,6 @@ snapshots:
|
||||
dependencies:
|
||||
character-entities: 2.0.2
|
||||
|
||||
deep-is@0.1.4: {}
|
||||
|
||||
defined@1.0.1: {}
|
||||
|
||||
del@6.1.1:
|
||||
@@ -4022,10 +3856,6 @@ snapshots:
|
||||
dependencies:
|
||||
path-type: 4.0.0
|
||||
|
||||
doctrine@3.0.0:
|
||||
dependencies:
|
||||
esutils: 2.0.3
|
||||
|
||||
dompurify@3.1.6: {}
|
||||
|
||||
draw-svg-path@1.0.0:
|
||||
@@ -4216,8 +4046,6 @@ snapshots:
|
||||
|
||||
escalade@3.2.0: {}
|
||||
|
||||
escape-string-regexp@4.0.0: {}
|
||||
|
||||
escodegen@2.1.0:
|
||||
dependencies:
|
||||
esprima: 4.0.1
|
||||
@@ -4226,69 +4054,11 @@ snapshots:
|
||||
optionalDependencies:
|
||||
source-map: 0.6.1
|
||||
|
||||
eslint-config-prettier@8.5.0(eslint@8.15.0):
|
||||
dependencies:
|
||||
eslint: 8.15.0
|
||||
|
||||
eslint-scope@5.1.1:
|
||||
dependencies:
|
||||
esrecurse: 4.3.0
|
||||
estraverse: 4.3.0
|
||||
|
||||
eslint-scope@7.2.2:
|
||||
dependencies:
|
||||
esrecurse: 4.3.0
|
||||
estraverse: 5.3.0
|
||||
|
||||
eslint-utils@3.0.0(eslint@8.15.0):
|
||||
dependencies:
|
||||
eslint: 8.15.0
|
||||
eslint-visitor-keys: 2.1.0
|
||||
|
||||
eslint-visitor-keys@2.1.0: {}
|
||||
|
||||
eslint-visitor-keys@3.4.3: {}
|
||||
|
||||
eslint@8.15.0:
|
||||
dependencies:
|
||||
'@eslint/eslintrc': 1.4.1
|
||||
'@humanwhocodes/config-array': 0.9.5
|
||||
ajv: 6.12.6
|
||||
chalk: 4.1.2
|
||||
cross-spawn: 7.0.6
|
||||
debug: 4.4.1
|
||||
doctrine: 3.0.0
|
||||
escape-string-regexp: 4.0.0
|
||||
eslint-scope: 7.2.2
|
||||
eslint-utils: 3.0.0(eslint@8.15.0)
|
||||
eslint-visitor-keys: 3.4.3
|
||||
espree: 9.6.1
|
||||
esquery: 1.6.0
|
||||
esutils: 2.0.3
|
||||
fast-deep-equal: 3.1.3
|
||||
file-entry-cache: 6.0.1
|
||||
functional-red-black-tree: 1.0.1
|
||||
glob-parent: 6.0.2
|
||||
globals: 13.24.0
|
||||
ignore: 5.3.2
|
||||
import-fresh: 3.3.1
|
||||
imurmurhash: 0.1.4
|
||||
is-glob: 4.0.3
|
||||
js-yaml: 4.1.0
|
||||
json-stable-stringify-without-jsonify: 1.0.1
|
||||
levn: 0.4.1
|
||||
lodash.merge: 4.6.2
|
||||
minimatch: 3.1.2
|
||||
natural-compare: 1.4.0
|
||||
optionator: 0.9.4
|
||||
regexpp: 3.2.0
|
||||
strip-ansi: 6.0.1
|
||||
strip-json-comments: 3.1.1
|
||||
text-table: 0.2.0
|
||||
v8-compile-cache: 2.4.0
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
esniff@2.0.1:
|
||||
dependencies:
|
||||
d: 1.0.2
|
||||
@@ -4296,18 +4066,8 @@ snapshots:
|
||||
event-emitter: 0.3.5
|
||||
type: 2.7.3
|
||||
|
||||
espree@9.6.1:
|
||||
dependencies:
|
||||
acorn: 8.15.0
|
||||
acorn-jsx: 5.3.2(acorn@8.15.0)
|
||||
eslint-visitor-keys: 3.4.3
|
||||
|
||||
esprima@4.0.1: {}
|
||||
|
||||
esquery@1.6.0:
|
||||
dependencies:
|
||||
estraverse: 5.3.0
|
||||
|
||||
esrecurse@4.3.0:
|
||||
dependencies:
|
||||
estraverse: 5.3.0
|
||||
@@ -4352,10 +4112,6 @@ snapshots:
|
||||
dependencies:
|
||||
is-string-blank: 1.0.1
|
||||
|
||||
fast-json-stable-stringify@2.1.0: {}
|
||||
|
||||
fast-levenshtein@2.0.6: {}
|
||||
|
||||
fast-uri@3.0.6: {}
|
||||
|
||||
fastest-levenshtein@1.0.16: {}
|
||||
@@ -4419,8 +4175,6 @@ snapshots:
|
||||
|
||||
function-bind@1.1.2: {}
|
||||
|
||||
functional-red-black-tree@1.0.1: {}
|
||||
|
||||
geojson-vt@3.2.1: {}
|
||||
|
||||
geojson-vt@4.0.2: {}
|
||||
@@ -4469,10 +4223,6 @@ snapshots:
|
||||
dependencies:
|
||||
is-glob: 4.0.3
|
||||
|
||||
glob-parent@6.0.2:
|
||||
dependencies:
|
||||
is-glob: 4.0.3
|
||||
|
||||
glob-to-regexp@0.4.1: {}
|
||||
|
||||
glob@7.2.3:
|
||||
@@ -4500,10 +4250,6 @@ snapshots:
|
||||
kind-of: 6.0.3
|
||||
which: 4.0.0
|
||||
|
||||
globals@13.24.0:
|
||||
dependencies:
|
||||
type-fest: 0.20.2
|
||||
|
||||
globby@11.1.0:
|
||||
dependencies:
|
||||
array-union: 2.1.0
|
||||
@@ -4733,20 +4479,12 @@ snapshots:
|
||||
|
||||
js-tokens@4.0.0: {}
|
||||
|
||||
js-yaml@4.1.0:
|
||||
dependencies:
|
||||
argparse: 2.0.1
|
||||
|
||||
json-buffer@3.0.1: {}
|
||||
|
||||
json-parse-even-better-errors@2.3.1: {}
|
||||
|
||||
json-schema-traverse@0.4.1: {}
|
||||
|
||||
json-schema-traverse@1.0.0: {}
|
||||
|
||||
json-stable-stringify-without-jsonify@1.0.1: {}
|
||||
|
||||
json-stringify-pretty-compact@4.0.0: {}
|
||||
|
||||
jsonfile@6.2.0:
|
||||
@@ -4777,11 +4515,6 @@ snapshots:
|
||||
|
||||
layout-base@1.0.2: {}
|
||||
|
||||
levn@0.4.1:
|
||||
dependencies:
|
||||
prelude-ls: 1.2.1
|
||||
type-check: 0.4.0
|
||||
|
||||
lines-and-columns@1.2.4: {}
|
||||
|
||||
loader-runner@4.3.0: {}
|
||||
@@ -5133,8 +4866,6 @@ snapshots:
|
||||
|
||||
native-promise-only@0.8.1: {}
|
||||
|
||||
natural-compare@1.4.0: {}
|
||||
|
||||
needle@2.9.1:
|
||||
dependencies:
|
||||
debug: 3.2.7
|
||||
@@ -5191,15 +4922,6 @@ snapshots:
|
||||
dependencies:
|
||||
wrappy: 1.0.2
|
||||
|
||||
optionator@0.9.4:
|
||||
dependencies:
|
||||
deep-is: 0.1.4
|
||||
fast-levenshtein: 2.0.6
|
||||
levn: 0.4.1
|
||||
prelude-ls: 1.2.1
|
||||
type-check: 0.4.0
|
||||
word-wrap: 1.2.5
|
||||
|
||||
p-limit@2.3.0:
|
||||
dependencies:
|
||||
p-try: 2.2.0
|
||||
@@ -5241,8 +4963,6 @@ snapshots:
|
||||
|
||||
path-is-absolute@1.0.1: {}
|
||||
|
||||
path-key@3.1.1: {}
|
||||
|
||||
path-parse@1.0.7: {}
|
||||
|
||||
path-type@4.0.0: {}
|
||||
@@ -5377,15 +5097,6 @@ snapshots:
|
||||
|
||||
potpack@2.1.0: {}
|
||||
|
||||
prelude-ls@1.2.1: {}
|
||||
|
||||
prettier-plugin-go-template@0.0.15(prettier@2.6.2):
|
||||
dependencies:
|
||||
prettier: 2.6.2
|
||||
ulid: 2.4.0
|
||||
|
||||
prettier@2.6.2: {}
|
||||
|
||||
probe-image-size@7.2.3:
|
||||
dependencies:
|
||||
lodash.merge: 4.6.2
|
||||
@@ -5398,8 +5109,6 @@ snapshots:
|
||||
|
||||
protocol-buffers-schema@3.6.0: {}
|
||||
|
||||
punycode@2.3.1: {}
|
||||
|
||||
queue-microtask@1.2.3: {}
|
||||
|
||||
quick-lru@4.0.1: {}
|
||||
@@ -5455,8 +5164,6 @@ snapshots:
|
||||
indent-string: 4.0.0
|
||||
strip-indent: 3.0.0
|
||||
|
||||
regexpp@3.2.0: {}
|
||||
|
||||
regl-error2d@2.0.12:
|
||||
dependencies:
|
||||
array-bounds: 1.0.1
|
||||
@@ -5610,12 +5317,6 @@ snapshots:
|
||||
|
||||
shallow-copy@0.0.1: {}
|
||||
|
||||
shebang-command@2.0.0:
|
||||
dependencies:
|
||||
shebang-regex: 3.0.0
|
||||
|
||||
shebang-regex@3.0.0: {}
|
||||
|
||||
signal-exit@3.0.7: {}
|
||||
|
||||
signum@1.0.0: {}
|
||||
@@ -5691,8 +5392,6 @@ snapshots:
|
||||
dependencies:
|
||||
min-indent: 1.0.1
|
||||
|
||||
strip-json-comments@3.1.1: {}
|
||||
|
||||
strongly-connected-components@1.0.1: {}
|
||||
|
||||
style-loader@4.0.0(webpack@5.101.2):
|
||||
@@ -5701,10 +5400,6 @@ snapshots:
|
||||
|
||||
style-search@0.1.0: {}
|
||||
|
||||
stylelint-config-prettier@9.0.5(stylelint@14.8.2):
|
||||
dependencies:
|
||||
stylelint: 14.8.2
|
||||
|
||||
stylelint-config-recommended@7.0.0(stylelint@14.8.2):
|
||||
dependencies:
|
||||
stylelint: 14.8.2
|
||||
@@ -5841,8 +5536,6 @@ snapshots:
|
||||
commander: 2.20.3
|
||||
source-map-support: 0.5.21
|
||||
|
||||
text-table@0.2.0: {}
|
||||
|
||||
through2@0.6.5:
|
||||
dependencies:
|
||||
readable-stream: 1.0.34
|
||||
@@ -5886,14 +5579,8 @@ snapshots:
|
||||
|
||||
tslib@2.8.1: {}
|
||||
|
||||
type-check@0.4.0:
|
||||
dependencies:
|
||||
prelude-ls: 1.2.1
|
||||
|
||||
type-fest@0.18.1: {}
|
||||
|
||||
type-fest@0.20.2: {}
|
||||
|
||||
type-fest@0.6.0: {}
|
||||
|
||||
type-fest@0.8.1: {}
|
||||
@@ -5907,8 +5594,6 @@ snapshots:
|
||||
|
||||
typedarray@0.0.6: {}
|
||||
|
||||
ulid@2.4.0: {}
|
||||
|
||||
undici-types@7.10.0: {}
|
||||
|
||||
unist-util-stringify-position@3.0.3:
|
||||
@@ -5927,10 +5612,6 @@ snapshots:
|
||||
|
||||
update-diff@1.1.0: {}
|
||||
|
||||
uri-js@4.4.1:
|
||||
dependencies:
|
||||
punycode: 2.3.1
|
||||
|
||||
util-deprecate@1.0.2: {}
|
||||
|
||||
uuid@9.0.1: {}
|
||||
@@ -6055,16 +5736,10 @@ snapshots:
|
||||
dependencies:
|
||||
isexe: 2.0.0
|
||||
|
||||
which@2.0.2:
|
||||
dependencies:
|
||||
isexe: 2.0.0
|
||||
|
||||
which@4.0.0:
|
||||
dependencies:
|
||||
isexe: 3.1.1
|
||||
|
||||
word-wrap@1.2.5: {}
|
||||
|
||||
world-calendars@1.0.4:
|
||||
dependencies:
|
||||
object-assign: 4.1.1
|
||||
|
||||
+46
-40
@@ -1,86 +1,92 @@
|
||||
/**
|
||||
* Vite Configuration for Vendoring JavaScript Libraries
|
||||
*
|
||||
*
|
||||
* This config is used by Hugo Blox maintainers to copy third-party
|
||||
* JavaScript libraries from node_modules into the Hugo module's assets.
|
||||
*
|
||||
*
|
||||
* Usage: pnpm run vendor:libs
|
||||
*/
|
||||
|
||||
import { defineConfig } from 'vite';
|
||||
import { viteStaticCopy } from 'vite-plugin-static-copy';
|
||||
import { resolve } from 'path';
|
||||
import del from 'rollup-plugin-delete';
|
||||
import { resolve } from "path";
|
||||
import del from "rollup-plugin-delete";
|
||||
import { defineConfig } from "vite";
|
||||
import { viteStaticCopy } from "vite-plugin-static-copy";
|
||||
|
||||
const MODULE_DIR = 'modules/blox-tailwind';
|
||||
const OUTPUT_DIR = resolve(MODULE_DIR, 'assets/dist/lib');
|
||||
const MODULE_DIR = "modules/blox-tailwind";
|
||||
const OUTPUT_DIR = resolve(MODULE_DIR, "assets/dist/lib");
|
||||
|
||||
export default defineConfig({
|
||||
build: {
|
||||
emptyOutDir: true,
|
||||
outDir: OUTPUT_DIR,
|
||||
lib: {
|
||||
entry: resolve(MODULE_DIR, 'assets/js/vendor-libs.js'),
|
||||
formats: ['es'],
|
||||
fileName: 'vendor-libs'
|
||||
entry: resolve(MODULE_DIR, "assets/js/vendor-libs.js"),
|
||||
formats: ["es"],
|
||||
fileName: "vendor-libs",
|
||||
},
|
||||
rollupOptions: {
|
||||
// Don't bundle these libraries, just copy them
|
||||
external: ['mermaid', 'plotly.js', 'katex', 'markmap-autoloader', 'alpinejs'],
|
||||
}
|
||||
external: [
|
||||
"mermaid",
|
||||
"plotly.js",
|
||||
"katex",
|
||||
"markmap-autoloader",
|
||||
"alpinejs",
|
||||
],
|
||||
},
|
||||
},
|
||||
|
||||
|
||||
plugins: [
|
||||
// Copy vendor libraries to module assets
|
||||
viteStaticCopy({
|
||||
targets: [
|
||||
// Mermaid - Diagram rendering
|
||||
{
|
||||
src: 'node_modules/mermaid/dist/mermaid.min.js',
|
||||
dest: 'mermaid/'
|
||||
src: "node_modules/mermaid/dist/mermaid.min.js",
|
||||
dest: "mermaid/",
|
||||
},
|
||||
|
||||
|
||||
// Plotly - Interactive charts
|
||||
{
|
||||
src: 'node_modules/plotly.js/dist/plotly.min.js',
|
||||
dest: 'plotly/'
|
||||
src: "node_modules/plotly.js/dist/plotly.min.js",
|
||||
dest: "plotly/",
|
||||
},
|
||||
|
||||
|
||||
// KaTeX - Math rendering
|
||||
{
|
||||
src: 'node_modules/katex/dist/katex.min.js',
|
||||
dest: 'katex/'
|
||||
src: "node_modules/katex/dist/katex.min.js",
|
||||
dest: "katex/",
|
||||
},
|
||||
{
|
||||
src: 'node_modules/katex/dist/katex.min.css',
|
||||
dest: 'katex/'
|
||||
src: "node_modules/katex/dist/katex.min.css",
|
||||
dest: "katex/",
|
||||
},
|
||||
{
|
||||
src: 'node_modules/katex/dist/contrib/auto-render.min.js',
|
||||
dest: 'katex/'
|
||||
src: "node_modules/katex/dist/contrib/auto-render.min.js",
|
||||
dest: "katex/",
|
||||
},
|
||||
{
|
||||
src: 'node_modules/katex/dist/fonts/',
|
||||
dest: 'katex/'
|
||||
src: "node_modules/katex/dist/fonts/",
|
||||
dest: "katex/",
|
||||
},
|
||||
|
||||
|
||||
// Markmap - Mind map rendering
|
||||
{
|
||||
src: 'node_modules/markmap-autoloader/dist/index.js',
|
||||
dest: 'markmap/'
|
||||
src: "node_modules/markmap-autoloader/dist/index.js",
|
||||
dest: "markmap/",
|
||||
},
|
||||
// Alpine.js
|
||||
{
|
||||
src: 'node_modules/alpinejs/dist/cdn.min.js',
|
||||
dest: 'alpinejs/'
|
||||
}
|
||||
]
|
||||
src: "node_modules/alpinejs/dist/cdn.min.js",
|
||||
dest: "alpinejs/",
|
||||
},
|
||||
],
|
||||
}),
|
||||
|
||||
|
||||
// Clean up any unwanted build artifacts
|
||||
del({
|
||||
targets: `${OUTPUT_DIR}/vendor-libs.js`, // Remove the dummy entry file
|
||||
hook: 'writeBundle'
|
||||
})
|
||||
]
|
||||
});
|
||||
hook: "writeBundle",
|
||||
}),
|
||||
],
|
||||
});
|
||||
Reference in new issue
Block a user