From 36b250a15c9ef80cb84152349521561c7baed2a1 Mon Sep 17 00:00:00 2001 From: Leo Vasanko Date: Sun, 16 Aug 2026 05:49:38 +0000 Subject: [PATCH] Pagerite: single-user CMS/blog FastAPI backend rendering HTML with html5tagger, content persisted in a kanta database and rendered per request. Vue only for the editing tools (page editor over a WebSocket, site/structure editor); public pages are plain HTML with fetch navigation. No auth: single trusted author. --- .gitignore | 13 + AGENTS.md | 160 ++ README.md | 27 + docs/design-principles.md | 183 ++ frontend/.gitignore | 39 + frontend/.vscode/extensions.json | 3 + frontend/index.html | 12 + frontend/package-lock.json | 2845 ++++++++++++++++++++++++++ frontend/package.json | 28 + frontend/public/favicon.ico | Bin 0 -> 4286 bytes frontend/src/PageEditor.vue | 423 ++++ frontend/src/SiteEditor.vue | 767 +++++++ frontend/src/StructureTree.vue | 251 +++ frontend/src/cmtheme.js | 41 + frontend/src/main.js | 55 + frontend/vite-plugin-fastapi.js | 36 + frontend/vite.config.js | 23 + pagerite/__init__.py | 1 + pagerite/__main__.py | 33 + pagerite/app.py | 525 +++++ pagerite/data.py | 133 ++ pagerite/markdown.py | 125 ++ pagerite/seed.py | 449 ++++ pagerite/static/banner.svg | 34 + pagerite/static/fonts/firacode.woff2 | Bin 0 -> 36276 bytes pagerite/static/fonts/fonts.css | 3 + pagerite/static/fonts/fraunces.woff2 | Bin 0 -> 67304 bytes pagerite/static/fonts/literata.woff2 | Bin 0 -> 85672 bytes pagerite/static/pagerite.js | 258 +++ pagerite/static/pygments.css | 86 + pagerite/static/style.css | 695 +++++++ pagerite/views.py | 253 +++ pyproject.toml | 37 + scripts/devserver.py | 88 + scripts/fastapi-vue/buildhook.py | 19 + scripts/fastapi-vue/buildutil.py | 231 +++ scripts/fastapi-vue/devutil.py | 226 ++ uv.lock | 983 +++++++++ 38 files changed, 9085 insertions(+) create mode 100644 .gitignore create mode 100644 AGENTS.md create mode 100644 README.md create mode 100644 docs/design-principles.md create mode 100644 frontend/.gitignore create mode 100644 frontend/.vscode/extensions.json create mode 100644 frontend/index.html create mode 100644 frontend/package-lock.json create mode 100644 frontend/package.json create mode 100644 frontend/public/favicon.ico create mode 100644 frontend/src/PageEditor.vue create mode 100644 frontend/src/SiteEditor.vue create mode 100644 frontend/src/StructureTree.vue create mode 100644 frontend/src/cmtheme.js create mode 100644 frontend/src/main.js create mode 100644 frontend/vite-plugin-fastapi.js create mode 100644 frontend/vite.config.js create mode 100644 pagerite/__init__.py create mode 100644 pagerite/__main__.py create mode 100644 pagerite/app.py create mode 100644 pagerite/data.py create mode 100644 pagerite/markdown.py create mode 100644 pagerite/seed.py create mode 100644 pagerite/static/banner.svg create mode 100644 pagerite/static/fonts/firacode.woff2 create mode 100644 pagerite/static/fonts/fonts.css create mode 100644 pagerite/static/fonts/fraunces.woff2 create mode 100644 pagerite/static/fonts/literata.woff2 create mode 100644 pagerite/static/pagerite.js create mode 100644 pagerite/static/pygments.css create mode 100644 pagerite/static/style.css create mode 100644 pagerite/views.py create mode 100644 pyproject.toml create mode 100755 scripts/devserver.py create mode 100644 scripts/fastapi-vue/buildhook.py create mode 100644 scripts/fastapi-vue/buildutil.py create mode 100644 scripts/fastapi-vue/devutil.py create mode 100644 uv.lock diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..483cd46 --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +# Python-generated files +__pycache__/ +*.py[oc] +build/ +dist/ +wheels/ +*.egg-info + +# Virtual environments +.venv +.ruff_cache/ +/pagerite/frontend-build +pagerite.kanta diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..38fb8b6 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,160 @@ +# AGENTS.md + +- Do NOT test, run the server, write tests etc. +- ESPECIALLY DO NOT make repros, do NOT install Playwright etc. + +Please instead ask the user to see from dev tools what you need, e.g. to look up something in DOM or log. Use console.log for debugging where needed (and otherwise for permanently kept useful messages in the app). + +## What this is + +Pagerite: a single-user CMS/blog. FastAPI serves HTML rendered in Python +with html5tagger; content is persisted in a kanta database and rendered on +the fly per request. Vue is used only for interactive bits (editing tools), +not for the public pages. See `docs/design-principles.md` for the design. + +## Layout + +- `pagerite/` — the Python backend package (hatchling build target). + - Server run by CLI entry point `uv run pagerite` (no auto reloads, build needed) + - Dev mode `scripts/devserver.py` (which the user mostly uses for auto reloads, no build needed) + - Avoid running the server yourself, ask the user to test + - `app.py` — the FastAPI app. FastAPI's built-in API docs are disabled + (`docs_url`/`redoc_url`/`openapi_url=None`) because `/docs` belongs to + our content. Our own routes (content pages, `/_/api/...`, `/_/f/...`, + `/static/...`) are registered BEFORE `frontend.route(app, "/")` is + called: fastapi-vue inserts its file routes at the position where + `route()` was called (during `load()` in the lifespan), so anything + defined earlier wins. The one exception is the content catch-all + `/{path:path}`, registered AFTER `frontend.route()` so that built + frontend assets still take priority over content slugs. The `Frontend` + is constructed with `spa=False` explicitly: it only serves the built + asset files at root without a catch-all; an `index.html` in the build + would become a `/` route, so leave it out of the build to keep `/` ours. + - `data.py` — msgspec Structs for the kanta database. The site structure + is a tree: `Data.menu` maps top-level slugs to `Node`s, each with + `children` keyed by slug — the URL path is the slug chain. The front + page is whichever top-level node has slug "" (parallel to the other + main level pages, not their parent); it cannot have children, and + renaming its slug away leaves no front page ("/" redirects to the + first nav item). `Node.content` is + the Markdown page, or None for a pure category label whose URL + redirects to its first child; every label's title and slug are + editable. Siblings order by the fractional `Node.order` key: a moved + item gets a fresh key relative to its new siblings, all others keep + theirs. `resolve`/`find_slot` walk the tree by path; moves are slot + detach/attach carrying the whole subtree. Legacy flat `Data.pages` + (pre-tree databases) migrates into `menu` on startup. The app owns + the `Data` object; reads are plain attribute access, writes in + `kanta.transaction(...)`. + `Data.files` is a content-addressed store (blake3[:12] + extension) + mapping file names to bytes, served at `/_/f/{name}` with immutable + caching; pages reference files by absolute `/_/f/` URLs so hierarchy + moves never break them. `Node.banner` is a raw trusted HTML snippet + for the header banner (img, styled div, canvas+script...); empty + inherits from the node's ancestors (front page last), then the default + banner.svg artwork. `Data.version` is bumped on every write + and embedded in page ETags so nav-affecting changes invalidate caches. + `Data.brand` is the site name (header link + `` suffix), editable + in the site editor via `/_/api/settings`; empty = no header link and + no `<title>` suffix. + - `markdown.py` — markdown-it-py renderer (html passthrough + attrs, + footnote, deflist, tasklists plugins). Custom image rule: relative srcs + resolve against the page path, titled images become figures. + - `views.py` — the shared page layout as an html5tagger `Template` with + placeholders (`Title`, `Brand`, `Banner`, `Nav`, `Sidebar`, `Main`), nav + rendering straight from the `Data.menu` tree (siblings sorted by + `Node.order`; content-less labels redirect to their first child via + `first_leaf`), and page/404 rendering. If the markdown contains its own h1, the page title + is NOT rendered as an additional h1 (it still supplies <title> and nav + labels). The navbar holds + top-level items only; the current section's subitems go to a left + `#sidebar` (empty and hidden elsewhere). Dynamic regions have stable ids + (`#page-banner`, `#nav`, `#sidebar`, `#main`) for fetch-navigation swaps. + - `seed.py` — demo content written on startup for paths missing from the + database (never overwrites existing pages). + - `static/` — our own assets served at `/static/`: `style.css` (shared + with Vue later), `pagerite.js` (fetch-navigation with rotating-cube + `startViewTransition`, scroll-reveal), `banner.svg` + (full-width header art) and `fonts/` (self-hosted Fraunces/Literata/ + Fira Code variable woff2). The `::view-transition*` block at the end of + `style.css` (from termotohtori.fi) is fragile — do not tweak. + - The database file is `pagerite.kanta` in the cwd (`PAGERITE_DB` + overrides); gitignored. Do not delete it without asking. +- `scripts/fastapi-vue/` — helper scripts from the fastapi-vue template + (build hook etc.), do not edit. +- `frontend/` — the Vue editor as **two separate apps** mounted in their + own host divs created inside the static document: `PageEditor.vue` + (CodeMirror + server-rendered preview over WebSocket `/_/api/ws/editor`, + previewing into the visible article; editor scroll drives document + scroll) opened by the article pen — it edits content and title only, + never the path — and `SiteEditor.vue` (site brand + banner HTML edited in + a small CodeMirror window and previewed into `#page-banner` + vue-draggable structure tree with + always-editable title/slug inputs per row) opened by + the banner pen — everything saves immediately as you edit (brand/title + debounced, slug on commit since it renames the path), tree rows navigate + in place without transitions when focused, and the front page is a + root-only row whose empty slug is editable like any other (empty child + lists become drop zones while dragging). The two pens swap the docked + panel for the other editor; clicking the open editor's own pen closes it. Normally dynamic-imported onto the content page by + pagerite.js when a 🖊️ edit link is clicked (the link carries + `data-editor-src`/`data-editor-css`/`data-editor-mode`); the `/admin` + route (page selected by location hash) is the no-JS-import fallback shell + rendered by `views.render_editor` and keeps its own preview pane. + In dev, modules load from the Vite dev server (`PAGERITE_VITE_URL`), + in prod from the hashed build assets resolved via + `frontend-build/.vite/manifest.json`. `vite.config.js` builds with + `manifest: true` and a JS-only input (`src/main.js`) so no `index.html` + ends up in the build (it would shadow `/`). vite-plugin-fastapi.js has an + auto-upgrade marker — edit `vite.config.js`, not the plugin. +- `docs/` — design documentation. + +## Toolchain + +- Python >= 3.14, managed with **uv**. Dependencies: `fastapi[standard]`, + `fastapi-vue`, `html5tagger`, `kanta`, `markdown-it-py`, `mdit-py-plugins`, + `pygments`, `tracerite`; dev group has `httpx`. Run anything via + `uv run ...` (the venv is `.venv`). +- Key libraries: + - **html5tagger** — all HTML generation (`E`, `Document`, `Template`, + `HTML` for trusted/raw HTML). + - To create stand alone pages, begin with `doc = Document(...)` that gives a HTML5 page header + - Chain with `doc.p("text").br`: every attribute access creates element to doc (returning self), calls add content to current element. + - Closing tags are not used where optional, e.g. no `</p>` or `</li>` is ever included in output. Due to this proper "nesting" of content is NOT required and should be avoided. Where needed, () directly after tag define attributes and content INSIDE the element, then close the element. `with doc.ul:` and such may be used for larger chunks. + - Prefer building directly on one builder with `with` blocks (recursing + inside a with block for hierarchies) over preparing `E.` snippets into + variables and composing them. Note `with doc.li:` alone fails (`li` + has an optional end tag) — use `with doc.li.ul:` style chains, or + `doc.li.a(...)` followed by a nested `with doc.ul:` block. + - `Template(builder)` freezes a builder with **Capitalized** attribute + placeholders (e.g. `E.Title`, `doc.main(E.Main, id="main")`); calling + it fills the slots with escaping — pass `HTML(...)` for raw HTML. + Passing a list to a template slot expands it; passing a list to a + normal builder call does NOT (spread it: `E.ul(*items)`). + - To create plain HTML snippets use `E.div(E.p("content"))` etc using the `E` empty builder. + - **kanta** — asyncio-native embedded database: `Kanta(filename, data)` + root object, `transaction`, `flush`, snapshot/replay-log persistence. + - `async with Kanta(Data(),...) as kanta:` (or await kanta.open/close) + - `with kanta.transaction(...) as data:` - transactions only for writes + - `data` may be referenced directly to read anywhere and to modify in transactions (`as data` is just a shorthand access) + - Data structures should be msgspec.Structs, where JSON restrictions do not apply (we can use `bytes`, `UUID`, `datetime` etc. even as dict keys) + - We prefer objects rather than lists, as this works better in change diffs. E.g. `dict[str, True]` where the keys indicate presence and always have value `True`. + - Maintaining and owning the app's own `Data` object is preferable; Kanta never copies this, only edits in place + - Note: besides opening it every access is immediate direct variable access: no `await`, no locks, no delays + - **fastapi-vue** — template glue for serving/building the Vue frontend; + keep its integration points (`Frontend`, build hook) intact. + - **markdown-it-py** — Markdown rendering with `html=True` raw + passthrough; mdit-py-plugins for footnote/deflist/tasklists/attrs; + **Pygments** for server-side code highlighting (`nowrap` spans, styles + in `static/pygments.css` scoped to "pre code"). + +## Conventions + +- Keep dependencies minimal; add via `uv add` and mention it. +- The public URL space belongs to content (pretty slugs at root). Reserve + only few prefixes (`/_/` for files + API, `/static`, `/admin`) for the + machinery; top-level `_` is a reserved slug. +- No auth in core code; trusted single author. Never add output + sanitization "for safety" against the author — embedded HTML/scripts in + Markdown are passed through deliberately. +- Update this file and `docs/design-principles.md` when architecture, + tooling, or conventions change. diff --git a/README.md b/README.md new file mode 100644 index 0000000..50c72b2 --- /dev/null +++ b/README.md @@ -0,0 +1,27 @@ +# Pagerite + +A single-user CMS/blog. FastAPI serves HTML rendered in Python with +html5tagger, content is persisted in a kanta database and rendered on +the fly per request. Vue is used only for interactive bits (the editing +tools), not for the public pages. + +## Running + +```sh +uv run pagerite # serves the built frontend +uv run scripts/devserver.py # dev mode with auto reloads (no build needed) +``` + +The database lives in `pagerite.kanta` in the working directory +(`PAGERITE_DB` overrides). On startup, demo pages from `pagerite/seed.py` +are added only if missing. + +## Editing + +Click the 🖊️ pen on any page: the article pen opens the page editor +(Markdown with live server-rendered preview over a WebSocket), the banner +pen opens the site editor (site brand, banner HTML, and the page +structure tree). Everything saves immediately — no save buttons. + +See `docs/design-principles.md` for the design and `AGENTS.md` for the +development conventions. diff --git a/docs/design-principles.md b/docs/design-principles.md new file mode 100644 index 0000000..9a0e11e --- /dev/null +++ b/docs/design-principles.md @@ -0,0 +1,183 @@ +# Pagerite Design Principles + +Pagerite is a single-user CMS/blog. This document records the initial +high-level design decisions; it will be refined as the implementation +evolves. + +## Architecture + +- **Server-side rendered.** FastAPI serves complete HTML pages, generated in + Python with **html5tagger**. There is no client-side templating or SPA for + the public site. +- **Vue only where interactivity demands it.** Small interactive islands + (editing tools mainly) may be Vue components, either mounted into specific + elements of the server-rendered pages or served as standalone apps + (e.g. an admin panel). The public reading experience has no scripting + requirement. +- **Persistence via kanta.** Content is stored in an asyncio-friendly kanta + database. Rendering happens on the fly on each request — there are no + pre-built static artifacts. + +## Content model + +- Pages and blog articles are fundamentally the same kind of thing: named + pieces of content. The blog/website distinction is blurred; an article is + just a page (possibly with metadata such as a publication date and + listing in a feed). +- **Pretty URLs.** Content is addressed by its name (slug), not by technical + constructs — no `/cms/...` or `/blog/post1` prefixes. Slugs usually live + directly at the site root; structured content may nest + (`/docs/design-principles`-style). The URL space is the author's, so + reserved prefixes must be kept few and deliberate: everything internal + lives under `/_/` (the API at `/_/api/`, uploaded files at `/_/f/`), + plus `/static` and `/admin`. +- **Single user, trusted author.** No auth concerns in the core design. + Everything published is public; only editing tools will later sit behind + access control (external SSO when that time comes). The author is trusted + to create well-meaning slugs and content — no sanitization for safety, + only for correctness. +- **Commenting** is not planned now but the model should not preclude it + later. + +## Authoring format + +- Content is written in **Markdown** with powerful extensions (tables, + footnotes, code highlighting, etc.). +- **Embedded HTML is passed through unfiltered**, including inline scripts + and other dynamic content the author wants to post. This is safe by the + single-trusted-author assumption above. +- Renderer: **markdown-it-py** with mdit-py-plugins (footnotes, definition + lists, task lists, brace-attributes; tables and strikethrough from the + default preset), with `html=True` for raw passthrough. Fenced code blocks + are highlighted server-side with **Pygments** (github-dark palette in + `/static/pygments.css`); a JS copy button appears on hover. Should this + prove limiting, we implement our own renderer on top of html5tagger, + which we already use for all HTML generation. +- **Files are content-addressed.** Uploads (`PUT /_/api/files/{filename}`) + are stored by content hash — blake3, first 6 bytes hex + original + extension — and served immutable from `/_/f/{hash}.ext`. Absolute URLs + that survive page renames and dedupe identical content; pages no longer + own files. An image with a title becomes a `<figure>` with + `<figcaption>`. Positioning is by attribute classes: + `![alt](/_/f/….avif "Caption"){.right}` — `{.right}`, `{.left}` float, + `{.wide}` goes full bleed (viewport edge to edge, or up to the docked + editor; the sidebar stacks on top of it); plain attributes like `width=300` + work too. + +## Page structure and navigation + +- All pages share one static layout, defined once as an **html5tagger + Template** with capitalized placeholders (`Title`, `Banner`, `Nav`, + `Sidebar`, `Main`) filled per request. The dynamic regions carry stable + ids (`#page-banner`, `#nav`, `#sidebar`, `#main`). +- The page top is a **full-width banner header** with the site name and the + navigation bar overlaid on it — no separate chrome header. The banner is + **per-page configurable**: `Node.banner` holds an arbitrary trusted HTML + snippet (an image, a styled div, canvas + script — anything), resolved by + walking up the node's ancestors to the front page; when nothing in the + chain sets one, the default `/static/banner.svg` artwork shows. +- **Fetch-navigation.** Links are plain `<a href>`; a small script + (`pagerite/static/pagerite.js`) intercepts same-origin clicks, fetches the + page, and swaps the `#page-banner`, `#nav`, `#sidebar` and `#main` regions + and the document title, keeping `<head>` and the layout chrome. Without JS + everything works as normal page loads. Scripts inside fetched banner and + content regions are re-created so they execute. Swaps run inside `document.startViewTransition` for a rotating + cube page transition (CSS adapted from termotohtori.fi — the + `::view-transition*` block is fragile, do not tweak; skipped under + `prefers-reduced-motion`). Navigation within the same top-level section + crossfades instead of rotating; browser back navigation rotates in + reverse. +- **The site structure is a tree of labels.** `Data.menu` holds the + top-level items by slug, each with `children` keyed by slug — the URL + path is the slug chain. The front page is a top-level node with slug "" + (an item *parallel* to the other main level pages, not their parent) and + cannot have children. The header navbar holds only the top level; a + top-level item is highlighted when viewing any of its subpages. When the + current page is inside a main level section with children, those direct + children are listed in a **left sidebar** (`#sidebar`), one level deep; + the sidebar is empty (and hidden) elsewhere. Other sections' subitems + are never shown without navigating into them first. +- **Landing pages are optional.** Every label can either have content + (`Node.content`, a Markdown page) or none — a content-less label + redirects to its first child instead of 404ing, so categories need no + filler content. Title and slug of every label are editable; renaming a + slug moves the whole subtree. The sidebar never lists the section + itself, avoiding title duplication with the navbar. +- **Menu order is manual.** Each node has a fractional `order` key among + its siblings; reordering/moving writes only the moved node (it takes a + fresh value halfway between its new siblings; all other items keep + theirs). New pages append at the end of their menu. Structure edits + (reorder, move/rename with the whole subtree, retitle) go through + `POST /_/api/structure` and the editor's structure panel. +- Unpublished pages are hidden from both nav and URL access (404). + +## Reading experience + +- The article column is sized by the **viewport, never by content**: a + symmetric grid (`1fr minmax(0, 78rem) 1fr`) with flexible gutters keeps + the layout stable across navigation. The sidebar occupies the left + gutter, the right gutter balances it; wide screens get columns inside + long articles without changing the article's width. +- A gentle **scroll-reveal** of headings, figures and block-level elements + (IntersectionObserver). It is layout-level: articles need no support + for it, and `prefers-reduced-motion` disables all motion. + +## Styling + +- A single shared `style.css` covers the server-rendered pages and the Vue + components. Vue may add per-component styles on top where needed. +- Fonts are self-hosted under `/static/fonts/` (Fraunces for headings, + Literata for body, Fira Code for code — variable woff2 files with local + `@font-face`). No third-party requests. + +## Editing + +- Editing happens **in place**, in two modes opened by two pens: + - **Page mode** — the 🖊️ next to a page's heading (including 404s, which + is how new pages start) opens a CodeMirror Markdown editor docked to + the left of the article: the host sits inside `#content` (below the + banner, never over the footer), the content shifts right and the + sidebar hides while editing. Preview renders server-side per keystroke + (no debouncing) straight into the visible article's heading and body. + - **Site mode** — the 🖊️ on the banner opens a panel with the site + **brand** (applied to the header live), the page's **banner HTML** + field (previewed into the real banner region, so you see exactly + which banner you're editing) and the **structure tree**. Everything + saves immediately as you edit — no save button, no edit mode. +- Clicking a pen again closes the editor (without saving; a dirty preview + reloads the page). The pens are `<button>`s wired up by `pagerite.js` — + editing is an action, not a navigation. The editor's WebSocket + **reconnects automatically** with local text and pending saves preserved. + A standalone shell also exists at `/admin#/path` with its own preview + pane. (All users are trusted authors for now; access control later with + SSO.) +- **CodeMirror 6** for Markdown editing (no WYSIWYG), title/published + controls. + Images can be pasted straight into the editor or chosen via a file + input: they upload to the content store (`PUT /_/api/files/...`) and + insert `![alt](/_/f/hash.ext)` at the cursor. +- The **structure panel** (vue-draggable tree of the whole site, in site + mode) covers page management: reorder any menu level, drag across + sections (empty child lists appear as drop zones while dragging), add, + delete (two clicks: the button arms, then deletes — no dialogs). + Every node is a real label — content-less category rows offer a + ➕ to give them a landing page. + Deleting a category removes only its landing page (the label and its + subpages stay). The ➕ in the panel header starts a new page as a + local-only tree row that can be dragged into place before its title and + slug are filled in; it is persisted only on commit. Rows are always + editable: titles save while typing, slug edits commit on blur/Enter + since they rename the path (moving the whole subtree). The front page + is the root row with an empty slug — renaming it away leaves no front + page ("/" redirects to the first nav item), and giving another + top-level row the empty slug makes it the front page. +- Preview and saving go over a **WebSocket** (`/_/api/ws/editor`) with a + stateless JSON protocol (`open`/`render`/`save`; on save all fields are + optional and absent ones keep their old values, `move_from` renames), + avoiding REST polling and races. Rendering always stays server-side. +- A REST API also exists for scripting, all under `/_/api/`: + `GET pages` (the full tree), `PUT/DELETE pages/{path}`, + `GET/PUT settings` (site brand), `POST structure` (reorder/move/ + retitle), file upload/removal via `PUT/DELETE files/{name}`. +- On startup, seed pages from `pagerite/seed.py` are added **only if + missing** — existing user content is never overwritten. diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..cb5d437 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,39 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +.DS_Store +dist +dist-ssr +coverage +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +*.tsbuildinfo + +.eslintcache + +# Cypress +/cypress/videos/ +/cypress/screenshots/ + +# Vitest +__screenshots__/ + +# Playwright browser downloads (if ever installed locally) +.pw-browsers/ diff --git a/frontend/.vscode/extensions.json b/frontend/.vscode/extensions.json new file mode 100644 index 0000000..a7cea0b --- /dev/null +++ b/frontend/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["Vue.volar"] +} diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..212a54d --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,12 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Pagerite + + +
+ + + diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 0000000..6910824 --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,2845 @@ +{ + "name": "frontend", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "frontend", + "version": "0.0.0", + "dependencies": { + "@codemirror/lang-html": "^6.4.12", + "@codemirror/lang-markdown": "^6.5.2", + "@codemirror/language": "^6.12.4", + "@codemirror/view": "^6.43.8", + "@lezer/highlight": "^1.2.3", + "codemirror": "^6.0.2", + "vue": "^3.5.26", + "vuedraggable": "^4.1.0" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^6.0.3", + "vite": "^7.3.0", + "vite-plugin-vue-devtools": "^8.0.5" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz", + "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz", + "integrity": "sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/traverse": "^7.29.7", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz", + "integrity": "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz", + "integrity": "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz", + "integrity": "sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz", + "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.29.7.tgz", + "integrity": "sha512-EtU0Hi3GvrTqD56xKmZvV/uCXK2ZbwVNPNLAquVItcAZpUhkXwWlo3Fmj0c2LxgSf2I8IDULeAepwNP1OefLXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/plugin-syntax-decorators": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.29.7.tgz", + "integrity": "sha512-9MTTLbF39X6sqM92JPEsoI7++26hjZvzkxKZy64aMhWLH2mPkJ/Q3AV4QLmls3R14FpSpkOwQQfUh962JGQxxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.29.7.tgz", + "integrity": "sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", + "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz", + "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz", + "integrity": "sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/plugin-syntax-typescript": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@codemirror/autocomplete": { + "version": "6.20.3", + "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.3.tgz", + "integrity": "sha512-tlosUqb+3BbxCxZdu4tKeRghPFC+QM7q4X5YhKV2eCmPG+1r2F3f4AaSz5sCrFqUtX4Jh20VFTKecl16MgiV9g==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@codemirror/commands": { + "version": "6.10.4", + "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.10.4.tgz", + "integrity": "sha512-Ryk9y9T0FFVF0cUGhAknveAyUOl/A1qReTFi+qPKtOh2Z9F4AUBz3XOrYD4ZEgZirdugVzHvd/2/Wcwy5OliTg==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.7.0", + "@codemirror/view": "^6.27.0", + "@lezer/common": "^1.1.0" + } + }, + "node_modules/@codemirror/lang-css": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@codemirror/lang-css/-/lang-css-6.3.1.tgz", + "integrity": "sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@lezer/common": "^1.0.2", + "@lezer/css": "^1.1.7" + } + }, + "node_modules/@codemirror/lang-html": { + "version": "6.4.12", + "resolved": "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.4.12.tgz", + "integrity": "sha512-pw2ReWKUqSkbvh76RAT4NYxiogRu+PWkR2ukAwO9uOgrm8uipkzjtKKtNpyeAQwHOqxEeSvAXZ6vr3AfyB9y/w==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/lang-css": "^6.0.0", + "@codemirror/lang-javascript": "^6.0.0", + "@codemirror/language": "^6.4.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0", + "@lezer/css": "^1.1.0", + "@lezer/html": "^1.3.12" + } + }, + "node_modules/@codemirror/lang-javascript": { + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.2.5.tgz", + "integrity": "sha512-zD4e5mS+50htS7F+TYjBPsiIFGanfVqg4HyUz6WNFikgOPf2BgKlx+TQedI1w6n/IqRBVBbBWmGFdLB/7uxO4A==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.6.0", + "@codemirror/lint": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0", + "@lezer/javascript": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-markdown": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@codemirror/lang-markdown/-/lang-markdown-6.5.2.tgz", + "integrity": "sha512-AwBOdkWYuA//WcM0xO5PfHPUcmz/O2i5o0Nsg1U69SII/loCJlFI1Romd9xp2HYb1kYJRGZotyqRghuHH5n8Kw==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.7.1", + "@codemirror/lang-html": "^6.0.0", + "@codemirror/language": "^6.3.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/common": "^1.2.1", + "@lezer/markdown": "^1.0.0" + } + }, + "node_modules/@codemirror/language": { + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.12.4.tgz", + "integrity": "sha512-1q4PaT+o6PbgpkJt4Q8Fv5XJxTy4FUZ4MWETtyiDw3J0Pyr9E2vqcKL+k9wcvjNTIsauxvE7OfmWj3FRPHQ76A==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.23.0", + "@lezer/common": "^1.5.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0", + "style-mod": "^4.0.0" + } + }, + "node_modules/@codemirror/lint": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.9.7.tgz", + "integrity": "sha512-28/+iWLYxKxsvGYhSYL7zaCZqLz5+FFFDq9tVsvGv9kv8RY4fFAchJ5WX9M3YrrRlTIsECjsXPqeNgnSmNP2dg==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.42.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/search": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.7.1.tgz", + "integrity": "sha512-uMe5UO6PamJtSHrXhhHOzSX3ReWtiJrva6GnPMwSOrZtiExb5X5eExhr2OUZQVvdxPsKpY3Ro2mFbQadpPWmHA==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.37.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/state": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.7.1.tgz", + "integrity": "sha512-9QzNDgE4EYDnAHfrTlR2lwiPciiOymLtwKK+8yHQzCc7GXhAP9xdEbEJFy2IWB1j9UGUl9BsgMmTo/ImA02T7A==", + "license": "MIT", + "dependencies": { + "@marijn/find-cluster-break": "^1.0.0" + } + }, + "node_modules/@codemirror/view": { + "version": "6.43.8", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.8.tgz", + "integrity": "sha512-qtItTDssZ/5GFfi94hrILu9j/VUeFPDPkhovEfmWFj2ipTxnzPB8DdHgfbb8HYTzLTYhrndKmyQxXUz/PDLenw==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.7.0", + "crelt": "^1.0.6", + "style-mod": "^4.1.0", + "w3c-keyname": "^2.2.4" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", + "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", + "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", + "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", + "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", + "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", + "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", + "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", + "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", + "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", + "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", + "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", + "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", + "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", + "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", + "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", + "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", + "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", + "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", + "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", + "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", + "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", + "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", + "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", + "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", + "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", + "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@lezer/common": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.2.tgz", + "integrity": "sha512-sxQE460fPZyU3sdc8lafxiPwJHBzZRy/udNFynGQky1SePYBdhkBl1kOagA9uT3pxR8K09bOrmTUqA9wb/PjSQ==", + "license": "MIT" + }, + "node_modules/@lezer/css": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.3.6.tgz", + "integrity": "sha512-YJE78Wcg+zX8f10hiHWQ4Az48Qr/c13eId0VtRQYLBpxHDmDeSrXIlkbl+fJGW42rWC/uoUco9mhBZeVWP/A1g==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.3.0" + } + }, + "node_modules/@lezer/highlight": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.3.tgz", + "integrity": "sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.3.0" + } + }, + "node_modules/@lezer/html": { + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@lezer/html/-/html-1.3.13.tgz", + "integrity": "sha512-oI7n6NJml729m7pjm9lvLvmXbdoMoi2f+1pwSDJkl9d68zGr7a9Btz8NdHTGQZtW2DA25ybeuv/SyDb9D5tseg==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/javascript": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.5.4.tgz", + "integrity": "sha512-vvYx3MhWqeZtGPwDStM2dwgljd5smolYD2lR2UyFcHfxbBQebqx8yjmFmxtJ/E6nN6u1D9srOiVWm3Rb4tmcUA==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.1.3", + "@lezer/lr": "^1.3.0" + } + }, + "node_modules/@lezer/lr": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.10.tgz", + "integrity": "sha512-rnCpTIBafOx4mRp43xOxDJbFipJm/c0cia/V5TiGlhmMa+wsSdoGmUN3w5Bqrks/09Q/D4tNAmWaT8p6NRi77A==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@lezer/markdown": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@lezer/markdown/-/markdown-1.7.2.tgz", + "integrity": "sha512-iTkYvoVcKt3WkeL7qUDyXHONZEwLio4wj8KTNi2dnjQEXBZKMV63BpQrPqfsM+OkvuRbiSTAcycYAsQzLhRNoQ==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.5.0", + "@lezer/highlight": "^1.0.0" + } + }, + "node_modules/@marijn/find-cluster-break": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.3.tgz", + "integrity": "sha512-FY+MKLBoTsLNJF/eLWaOsXGdz6uh3Iu1axjPf6TUq92IYumcTcXWHoS747JARLkcdlJ/Waiaxc5wQfFO8jC6NA==", + "license": "MIT" + }, + "node_modules/@napi-rs/lzma-linux-x64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", + "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.4.tgz", + "integrity": "sha512-RrPokAb7dmbxFoeO3TloqHyOjgye8RkBhSqmp4aJMIex4c9r46ZstPnleDQOq1t46VOVjwIuwNogIqbodV1Vvg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.4.tgz", + "integrity": "sha512-JKuJc+pnpks2pjy7L/N3v/cAkZxYlnmuZoD840ldbMI5KDbC4iO9NKwPKYdjYFCMAIIlBzYSFHxIJVYzRo2/8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.4.tgz", + "integrity": "sha512-krw5uS2STmvJ02x0uTXHbqQNuz+9eZ1iw+qXk9dmW2gvV4jV7O2hEoOnuhFrpOPiel1mBFtqbxYZZtC46hXLOw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.4.tgz", + "integrity": "sha512-wsTxtgApb4PrOsNJIm0FZ1h3WvCC+k9uxLJ4ad75hgoS4NiRes2SoJFlDAyMwiUY8IssDqGcHbXuN0sx1tfF1A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.4.tgz", + "integrity": "sha512-GUOnQlyZe3yAXhWOtOMsn5Qkrv5E5mZXa0thbARWi5Ei2szlVXJFQhddZ4HbAzh8q92w5twp+CQvs/eFanz9YQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.4.tgz", + "integrity": "sha512-/Y7f3QuxjzPKsjA/rfEDa3+0vXqyjmJ50Ln8dPpCmWkKTrUoWHG1cWhTqaAMLob2m2nESWuC7yGrREz019Ztqg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.4.tgz", + "integrity": "sha512-81wiiX3v7aqy+T+bT61TJ78yJjRquqFFTTbAPt08imfQQzkPIW8t6aJbkTagtCCrXMNc9D66+geqlK7ydLPNqA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.4.tgz", + "integrity": "sha512-9kmDIvNZqdoHOBZgNtpTBeLWYO/LVipM3H/j62P8848/l/VPEQL6N3uxU9pvP1oZAsXyC2MEnFP3ovRjo7WYNQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.4.tgz", + "integrity": "sha512-CcnXHWnXg69g+DX5VWL3FHts3qMRN2uVEHX+BZvGLdd07/gXkn3ePjYtO1LDJvxkGKVHMclKBRa1QUTH+6toYQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.4.tgz", + "integrity": "sha512-iFOibiHnTRuhrWLlRsOQFdZJJIa7S8OwkneJr4ocALP16u5yk6lWLINFwhHaEqBFMsKDUZofLkGos7+CPzGB3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.4.tgz", + "integrity": "sha512-XnWYMI7euHlb5a871xPja+Gm7DRCFU+FGRrtS2sMq9N8FvqtpagUy6gD4YOemC5MRk9xbh8+jYMEJbigFQwsgA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.4.tgz", + "integrity": "sha512-qGDAlO0U8xedCcsdRm9oaoQY8DAx/QT7uIxJWhCdx0ceIWX783UC9QSYkdpzAe29wNiVfp24+bZdQmn49o45SQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.4.tgz", + "integrity": "sha512-ru4H6ezD7ysA5EiEK6qkkaEb4modH8CTej6kUy/gQi20u3kB3G7Zn8snXXkeJSCOFKG/rbPPtM/+9Wgas1961w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.4.tgz", + "integrity": "sha512-2W4MO5WQVJnbJaZdvDb9rhBDuFU1nKIepPFpJUBsTh2k1YY2g+ODViaWuyOAjQ5cOP7NvrvLzt3wvHOoiAvc7w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.4.tgz", + "integrity": "sha512-+fxjfuoAmVMCYV5QyjoIpu0cp5DOiOTeqYFk1AVaxGr+/ravWLX89XfQmptsoWcaVy/TGf2hexzbUOrCQIL1CQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.4.tgz", + "integrity": "sha512-jTn8JfHGL4djjFxPuM06LmNUJDsst2jeVlsd9OmIH6zc5sC9K6rIuO4YajXatLUpBmBKl6b35ro1QZocLi+tcA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.4.tgz", + "integrity": "sha512-oCJCJL4pXsoDcP2QZ+JVlPTIRc6266zsIaeJJsWImmF7HO0W8nb6HuSgZlMWxJwaPf8ehbSw8yo0EUw925hKsA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.4.tgz", + "integrity": "sha512-W69hukhZ3KKNRCaMIEzKvcFye42hh0FE1+YoYaf5+Ikacuftoco6yO/xouz0hc5d5W/s3yBro5jRiuEE/Q5vUw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.4.tgz", + "integrity": "sha512-qiXbGG2jkjXhzXpsFZSR2Xpb8DN/UaxYsbb/STbuR/6fpaDgRmmaq1B/LmtF2wQFOFOSsK2jdE0RZ3a0zHn4QA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.4.tgz", + "integrity": "sha512-nWeM//hxv8mIo6jD7Hu4o48DVmV9pbV6gsKaWU+4NFyqHoPKwrkRiZGLKUhOBk8qNmDmpwFtPKg80Bo/Tn4xiQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.4.tgz", + "integrity": "sha512-s62SQ/vgsRSvMwDkOEfTqfgASF0f26ZNaQuTA6Aok5lrikf89yI2W0gFHvZb2Jpgc6N8JnOKZgCK2iciO3CsxQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.4.tgz", + "integrity": "sha512-J6wGf8TVGbXJq+HH+ttTvrcfNKPbuZecV6KT1B8I18BC5IURUh5kl4Yl5OEP5eFIUoI5BWxCsyYMhFsDx8kekw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.4.tgz", + "integrity": "sha512-zmfrQd/0wu6oJs8Vq8KwY/YtsKSsLtKe/HwAP4Wqy8LhWjeT55fHRAkOhYQ12wI3ayS4Tt12d5CDRD7N96SAYQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.4.tgz", + "integrity": "sha512-qPzHqdj9rfUD+w79dtE07zi/kFwKyCJqplp5K5ygeLTp7jLpAoc16OAH39HSmRC9UpozaecsleI8uAdEj6v2yw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.4.tgz", + "integrity": "sha512-zD6NdeWEByGE9QF9vCrlJ5YQB4oq9q91kPZS37Jwj5hOkvR1lTBSpsKhKDw4IJtbQ35LsTS1HD9DZYGKIshU1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "6.0.8", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.8.tgz", + "integrity": "sha512-0ZjgOg7oO6farnNGup7yvoM/YXZV84OZxHAwtflItNa/6zzQyVb5LNxyea3FEKEX2XlagIKzrlH7wwxkKgtiew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.5.0.tgz", + "integrity": "sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.5.0.tgz", + "integrity": "sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.2", + "@vue/babel-helper-vue-transform-on": "1.5.0", + "@vue/babel-plugin-resolve-type": "1.5.0", + "@vue/shared": "^3.5.18" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + } + } + }, + "node_modules/@vue/babel-plugin-resolve-type": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.5.0.tgz", + "integrity": "sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/parser": "^7.28.0", + "@vue/compiler-sfc": "^3.5.18" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.41.tgz", + "integrity": "sha512-q0Xtv/F9w2YO/7htQhtiL+Ev2WCJbe5N2hc+XfgyKkEKqWpSxknmT8QOuGdEKNdjPq0c3F7rNpFkTo3Kfrm7pg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@vue/shared": "3.5.41", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.41.tgz", + "integrity": "sha512-oKacVfNglLvGjnS6BXOlGL7EyG2h8X03pqXCjzotRZUaXGjbrTJUnVAQjrCqUnS+lyu31nwQjZY/d817GmCnfw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.41", + "@vue/shared": "3.5.41" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.41.tgz", + "integrity": "sha512-XJhip7R2wy6vX3knCxdZN4KracFaZUef58s1KYewqluedHIJaPIVfXoYT7MF1F8nCvv6k8bWWxDC8opMkg1VTQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@vue/compiler-core": "3.5.41", + "@vue/compiler-dom": "3.5.41", + "@vue/compiler-ssr": "3.5.41", + "@vue/shared": "3.5.41", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.19", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.41.tgz", + "integrity": "sha512-U3v5OejKEGqOI0Wy0+Sz7hGuIFZHA4LSXzrNM3IMIeDyJEBBfTpX26n3SDgToRpP2bLc9FfI2j/kSgcJ8Emq5A==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.41", + "@vue/shared": "3.5.41" + } + }, + "node_modules/@vue/devtools-core": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-core/-/devtools-core-8.2.1.tgz", + "integrity": "sha512-s/VfAY9oDTb/kFEWmy461jaFde2MIV1RO/gi1vwM+PAZBZ/Pc2Ndu3BNBdZUze8QDUuyYvElbEEGA83syjJfzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^8.2.1", + "@vue/devtools-shared": "^8.2.1" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-8.2.1.tgz", + "integrity": "sha512-FIGIuq3AWReEpbAHY/cRGeHDfI0qOb8OCQ3YjbEAX04uaxIDbGc9rhkbVcG7rnfHPXE3RsU5KrWOu9V/okd8AQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^8.2.1", + "birpc": "^2.6.1", + "hookable": "^5.5.3", + "perfect-debounce": "^2.0.0" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-8.2.1.tgz", + "integrity": "sha512-Fkac7lUdGReh6pVOi3AYPRGe82LQqRmAfThW7RRligOAP0ZA/Z1z9XLHDM9dv34pV2HRc79DK8uKPeG2fLnA/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/reactivity": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.41.tgz", + "integrity": "sha512-rznsqKM0np0x18EjzF8x88MpEhdNsffbvFbckLL5+oUKz1BxAImEmO7J1ArRYSyo6aQaVoBDp7jEkT91OOxydA==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.41" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.41.tgz", + "integrity": "sha512-Vcry58hiAKwGen9Z1jUZE0feFsNArPCMOImYI8el48A9Idf6DuQYD0U05zZIF2Iad1hGhPSvcbBbAOhNr55fhg==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.41", + "@vue/shared": "3.5.41" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.41.tgz", + "integrity": "sha512-3vVBahVBS9+U6cmXBLyb8nE6/yYo4J/CGI9eVFs3KiMc0YHuudwKyShTD65jtJy/L9PUUxNAFu4cj4LiJ0UFbw==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.41", + "@vue/runtime-core": "3.5.41", + "@vue/shared": "3.5.41", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.41.tgz", + "integrity": "sha512-n6hx/pNFfbD6SuyeuMVkvqox8bwf/ET9JlA/kAz/imw8sw++wkqKe2mHX5KutjPpbKE4Z56yTHszoOjGMI9igQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.41", + "@vue/runtime-dom": "3.5.41", + "@vue/shared": "3.5.41" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.41.tgz", + "integrity": "sha512-IOnwSCma8j+9xJT6b8H0dEYidC80NsYmNMlZxRsukYcSoGaDBohog5hDxzeUXdFeGWFA++vWvxqOmrr96VlqMA==", + "license": "MIT" + }, + "node_modules/ansis": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.3.1.tgz", + "integrity": "sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.14", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.14.tgz", + "integrity": "sha512-JyJ954WzuIR8/FFzX0o5krdSTrBAkcCSRfWSleRsIHSWV+cZe2FI1PKggVkFke1hBldRs+LRxUczzE9iPmgZww==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/birpc": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", + "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/browserslist": { + "version": "4.28.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", + "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.11.12", + "caniuse-lite": "^1.0.30001809", + "electron-to-chromium": "^1.5.402", + "node-releases": "^2.0.53", + "update-browserslist-db": "^1.3.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001809", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001809.tgz", + "integrity": "sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/codemirror": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.2.tgz", + "integrity": "sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/commands": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/lint": "^6.0.0", + "@codemirror/search": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/crelt": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.7.tgz", + "integrity": "sha512-aK6BbWfhf4U/wCcLHKPJl/xa6VkVstRaPywWtMKGwuOLc/wZTyQYuoxgvZnNsBvv7Kg3YTBQYYBCggcviQczuA==", + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/default-browser": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.407", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.407.tgz", + "integrity": "sha512-4R8XgQOdfxexCd/u63lRm6wCHjECwI45MV9wxAs2ggtfWe2hwlo1ql97jKsju2IcJ+jFSTwBssyYoiWhh7mauQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-stack-parser-es": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz", + "integrity": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/esbuild": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", + "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.2", + "@esbuild/android-arm": "0.28.2", + "@esbuild/android-arm64": "0.28.2", + "@esbuild/android-x64": "0.28.2", + "@esbuild/darwin-arm64": "0.28.2", + "@esbuild/darwin-x64": "0.28.2", + "@esbuild/freebsd-arm64": "0.28.2", + "@esbuild/freebsd-x64": "0.28.2", + "@esbuild/linux-arm": "0.28.2", + "@esbuild/linux-arm64": "0.28.2", + "@esbuild/linux-ia32": "0.28.2", + "@esbuild/linux-loong64": "0.28.2", + "@esbuild/linux-mips64el": "0.28.2", + "@esbuild/linux-ppc64": "0.28.2", + "@esbuild/linux-riscv64": "0.28.2", + "@esbuild/linux-s390x": "0.28.2", + "@esbuild/linux-x64": "0.28.2", + "@esbuild/netbsd-arm64": "0.28.2", + "@esbuild/netbsd-x64": "0.28.2", + "@esbuild/openbsd-arm64": "0.28.2", + "@esbuild/openbsd-x64": "0.28.2", + "@esbuild/openharmony-arm64": "0.28.2", + "@esbuild/sunos-x64": "0.28.2", + "@esbuild/win32-arm64": "0.28.2", + "@esbuild/win32-ia32": "0.28.2", + "@esbuild/win32-x64": "0.28.2" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-in-ssh": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-in-ssh/-/is-in-ssh-1.0.0.tgz", + "integrity": "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", + "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/obug": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz", + "integrity": "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/ohash": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.12.tgz", + "integrity": "sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw==", + "dev": true, + "license": "MIT" + }, + "node_modules/open": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/open/-/open-11.0.1.tgz", + "integrity": "sha512-NzwMUB6C1D0+Kd+9iMS/H4k+Ck3cTX6Ckyfr/gAGlmvSE1LUQZnEZvWBi4PYmMwH/S5SMeTXnE+9uAz8uF+pWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.4.0", + "define-lazy-prop": "^3.0.0", + "is-in-ssh": "^1.0.0", + "is-inside-container": "^1.0.0", + "powershell-utils": "^0.2.0", + "wsl-utils": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/perfect-debounce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz", + "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/powershell-utils": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.2.0.tgz", + "integrity": "sha512-ZlsFlG7MtSFCoc5xreOvBAozCJ6Pf06opgJjh9ONEv418xpZSAzNjstD36C6+JwOnfSqOW/9uDkqKjezTdxZhw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rollup": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.4.tgz", + "integrity": "sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@napi-rs/lzma-linux-x64-gnu": "1.5.1", + "@rollup/rollup-android-arm-eabi": "4.62.4", + "@rollup/rollup-android-arm64": "4.62.4", + "@rollup/rollup-darwin-arm64": "4.62.4", + "@rollup/rollup-darwin-x64": "4.62.4", + "@rollup/rollup-freebsd-arm64": "4.62.4", + "@rollup/rollup-freebsd-x64": "4.62.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.4", + "@rollup/rollup-linux-arm-musleabihf": "4.62.4", + "@rollup/rollup-linux-arm64-gnu": "4.62.4", + "@rollup/rollup-linux-arm64-musl": "4.62.4", + "@rollup/rollup-linux-loong64-gnu": "4.62.4", + "@rollup/rollup-linux-loong64-musl": "4.62.4", + "@rollup/rollup-linux-ppc64-gnu": "4.62.4", + "@rollup/rollup-linux-ppc64-musl": "4.62.4", + "@rollup/rollup-linux-riscv64-gnu": "4.62.4", + "@rollup/rollup-linux-riscv64-musl": "4.62.4", + "@rollup/rollup-linux-s390x-gnu": "4.62.4", + "@rollup/rollup-linux-x64-gnu": "4.62.4", + "@rollup/rollup-linux-x64-musl": "4.62.4", + "@rollup/rollup-openbsd-x64": "4.62.4", + "@rollup/rollup-openharmony-arm64": "4.62.4", + "@rollup/rollup-win32-arm64-msvc": "4.62.4", + "@rollup/rollup-win32-ia32-msvc": "4.62.4", + "@rollup/rollup-win32-x64-gnu": "4.62.4", + "@rollup/rollup-win32-x64-msvc": "4.62.4", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/sortablejs": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.14.0.tgz", + "integrity": "sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==", + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/style-mod": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.3.tgz", + "integrity": "sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==", + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/unplugin-utils": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.3.2.tgz", + "integrity": "sha512-xVToRh2CTmLk2HnEG7ac4rl1MJTT3RFkpS8B++/SnB0kXvuaavD+n3m/vrzyWQOdJNSZQACnbz01pnppbwV5BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.1.tgz", + "integrity": "sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/vite": { + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.6.tgz", + "integrity": "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0 || ^0.28.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-dev-rpc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vite-dev-rpc/-/vite-dev-rpc-2.0.0.tgz", + "integrity": "sha512-yKwbTwdHKSD2k/aGqyWpPHepo45OQc8lH3/6IfT4ZqeKE26ooKvi4WIEKzqWav8v+9Is8u1k8q54hvOmqASazA==", + "dev": true, + "license": "MIT", + "dependencies": { + "birpc": "^4.0.0", + "vite-hot-client": "^2.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.1 || ^7.0.0-0 || ^8.0.0" + } + }, + "node_modules/vite-dev-rpc/node_modules/birpc": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-4.1.0.tgz", + "integrity": "sha512-O8L9vALWGqdEe0cG4HJckauw3WeJETlJnDRPUYpgwB7wrU43b/5NGMdVjdVcRo+4ROgd3ih2wha1glDe4HRVgw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/vite-hot-client": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vite-hot-client/-/vite-hot-client-2.2.0.tgz", + "integrity": "sha512-76Zs9zrHbH7M7wqeyooGQKdX+yg0pQ0xuQ1PbFp4z5a0Lzn2e5IPFoCswnmqZ4GiwqB4Jo3WcDAMO9jARTJl8w==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 || ^8.0.0" + } + }, + "node_modules/vite-plugin-inspect": { + "version": "11.4.1", + "resolved": "https://registry.npmjs.org/vite-plugin-inspect/-/vite-plugin-inspect-11.4.1.tgz", + "integrity": "sha512-ShOFe2PURXGvRS5OrgmOLZOCwDTD7dEBVt0tMpFPKb9AsvqXKCRGM8QgKrUbRbJYFXScHvDPpGRd28rYidC0tA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansis": "^4.3.0", + "error-stack-parser-es": "^1.0.5", + "obug": "^2.1.1", + "ohash": "^2.0.11", + "open": "^11.0.0", + "perfect-debounce": "^2.1.0", + "sirv": "^3.0.2", + "unplugin-utils": "^0.3.1", + "vite-dev-rpc": "^2.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^6.0.0 || ^7.0.0-0 || ^8.0.0-0" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/vite-plugin-vue-devtools": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/vite-plugin-vue-devtools/-/vite-plugin-vue-devtools-8.2.1.tgz", + "integrity": "sha512-5JLxXWWCo5lJMw16/xVeNvJ8k2zLwZPf1vITLzya/2IePrCBeGe/p/iAokgXHZpEi39fcYtPXmO8SaKeXmqCAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-core": "^8.2.1", + "@vue/devtools-kit": "^8.2.1", + "@vue/devtools-shared": "^8.2.1", + "sirv": "^3.0.2", + "vite-plugin-inspect": "^11.3.3", + "vite-plugin-vue-inspector": "^6.0.0" + }, + "engines": { + "node": ">=v14.21.3" + }, + "peerDependencies": { + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/vite-plugin-vue-inspector": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vite-plugin-vue-inspector/-/vite-plugin-vue-inspector-6.0.0.tgz", + "integrity": "sha512-OpyITJLgZNibxlrik1EmRtvXHDjLRxNPsWkGFTERZs2LgMEdG4W0WoFt5GIgp3a3jRou+eJR8U1zOBk/XQgEbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.0", + "@babel/plugin-proposal-decorators": "^7.23.0", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-transform-typescript": "^7.22.15", + "@vue/babel-plugin-jsx": "^1.1.5", + "@vue/compiler-dom": "^3.3.4", + "kolorist": "^1.8.0", + "magic-string": "^0.30.4" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/vue": { + "version": "3.5.41", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.41.tgz", + "integrity": "sha512-2laE0p+aK+/AOPG/XL/WepOs/GlK755LJ1XECi9kDUrz1FKNw8rb2Xzlw9JS1rqEV55nb0ttsKxVlTCcd+R5cg==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.41", + "@vue/compiler-sfc": "3.5.41", + "@vue/runtime-dom": "3.5.41", + "@vue/server-renderer": "3.5.41", + "@vue/shared": "3.5.41" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vuedraggable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-4.1.0.tgz", + "integrity": "sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==", + "license": "MIT", + "dependencies": { + "sortablejs": "1.14.0" + }, + "peerDependencies": { + "vue": "^3.0.1" + } + }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", + "license": "MIT" + }, + "node_modules/wsl-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-1.0.0.tgz", + "integrity": "sha512-Hl0ZOAs672vg+06kfujwRhoS6/jehvULrlFkuF2dRu6pHgA8U06h3xqNIqNNU1LTXPcedxByAR4GS6pwQK0mgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0", + "powershell-utils": "^0.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wsl-utils/node_modules/powershell-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz", + "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + } + } +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..9ba1f39 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,28 @@ +{ + "name": "frontend", + "version": "0.0.0", + "private": true, + "type": "module", + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "scripts": { + "dev": "vite", + "build": "vite build" + }, + "dependencies": { + "@codemirror/lang-html": "^6.4.12", + "@codemirror/lang-markdown": "^6.5.2", + "@codemirror/language": "^6.12.4", + "@codemirror/view": "^6.43.8", + "@lezer/highlight": "^1.2.3", + "codemirror": "^6.0.2", + "vue": "^3.5.26", + "vuedraggable": "^4.1.0" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^6.0.3", + "vite": "^7.3.0", + "vite-plugin-vue-devtools": "^8.0.5" + } +} diff --git a/frontend/public/favicon.ico b/frontend/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..df36fcfb72584e00488330b560ebcf34a41c64c2 GIT binary patch literal 4286 zcmZQzU}RuqP*4ET3Jfa*7#PGD7#K7d7#I{77#JKFAmR)lAOIqU2X5Zs$bgLL=_@3A zjhlBkf-u-E^l}5#e(vTSjvJvE#HNe&P`g3?jcVTE_#KKtY>*hu-2k;;s(FXw$>tr7 z|DhPf28q$seyH6be^xc`aQp|g8{`HM8zcsjqlp`k?AB}E;dmd(Zjk*T3=#v$(Zmf< z`&pZJIL^XiH^_bv2FZccP&Evoc7y!o(Y(X)10MT9av(JzwN!Hh)P8~H9gaKj*bVYO z2!qss)KbNMsNEp{q&4qw{6&QQAT=PhAUzbj0cyWO^A5*L7iKh$o<<{gf0*zB%ZV*ek6akv4b2c(xQH$d$Mg`s)#4##Kc_BU;D{GXL$3C18c zx;#`5NH53?lHCBcpR;*~<1!4hcRKzrpKSX--p3S-L2Mjh0MZLGgCzT*c7xm<)V#y- z3yS?a9sf71bNHW@Xz@SJ!xW4`Y>*fhH-Pkl%mA51v>TxIi#G3YJcMF5D4p$e{9n{+ z^FPkh6a|CCu-Feuiy$*VW)WpS)NYV_3!8U1{z0*Sr{n+HW%mD*!_C3|hP%PT6f6dk z!{P>z86dMjW)gG*)P9ZT9geq9><0OLyW{`dGAmTOVd3Cm3YKf$4zCkIeurU@Ss*j< z+7Gpxxp{}*uwyWnns+ArO_!|@D?-JmqL!|{JXy){Z+gZlMPypL%f2*-Jv z{(*|Y)q(V2GYe`5$S$z`P`g3ysYPp3f$NrjCM-5(c2Q8ptk?oiME5yuZM-3=hU zAT!X-h1vzO6J$So^A5*3=xSPaIsUJhX8S+E&kP=>F!STRO_wBvm~$isnlXSdhz$~h z$-`)nUXU3ev(U|l+6l5d9HUJID&yBX{7+ATmhrH(1){x7pC(=HT=LB0y}A7)UP8)AS^=9*`Lzvp{CT%!kq-J3)5yHScf)ByT?WW^if zV!|8eX^Mgqe9c%vaSpN<8H2>Ya%k#7X5$(!Tt{e|LXt$|6>oq zKji=a2jLI=|NlQ=hu{Ou|Nnz<1LOby3=ClWkAa~cg#R!w*n{v71_t>L3=I4r{D6Uh a9fS`sFffB~17iat17ib}cK|F4vKj!X^7qaF literal 0 HcmV?d00001 diff --git a/frontend/src/PageEditor.vue b/frontend/src/PageEditor.vue new file mode 100644 index 0000000..7c9a7e7 --- /dev/null +++ b/frontend/src/PageEditor.vue @@ -0,0 +1,423 @@ + + + + + diff --git a/frontend/src/SiteEditor.vue b/frontend/src/SiteEditor.vue new file mode 100644 index 0000000..64c4ba9 --- /dev/null +++ b/frontend/src/SiteEditor.vue @@ -0,0 +1,767 @@ + + + + + diff --git a/frontend/src/StructureTree.vue b/frontend/src/StructureTree.vue new file mode 100644 index 0000000..9e70c11 --- /dev/null +++ b/frontend/src/StructureTree.vue @@ -0,0 +1,251 @@ + + + + + diff --git a/frontend/src/cmtheme.js b/frontend/src/cmtheme.js new file mode 100644 index 0000000..30ce3d9 --- /dev/null +++ b/frontend/src/cmtheme.js @@ -0,0 +1,41 @@ +// Shared CodeMirror styling for both editors: a light theme matching the +// site's inputs, and a highlight style in the site palette — the default +// highlight style (from basicSetup) underlines headings/links and uses +// colors that clash with the page. +import { EditorView } from 'codemirror' +import { HighlightStyle, syntaxHighlighting } from '@codemirror/language' +import { tags } from '@lezer/highlight' + +// The base theme sets monospace on .cm-scroller, so the font must be set +// there, not on "&". +export const cmTheme = EditorView.theme({ + "&": { + backgroundColor: "var(--bg)", + color: "var(--text)", + }, + ".cm-scroller": { fontFamily: '"Fira Code", monospace' }, + ".cm-content": { caretColor: "var(--text)" }, + ".cm-cursor": { borderLeftColor: "var(--text)" }, + // basicSetup's active-line highlight assumes a dark theme. + ".cm-activeLine": { backgroundColor: "transparent" }, + "&.cm-focused .cm-selectionBackground, .cm-selectionBackground": + { backgroundColor: "var(--line)" }, + "&.cm-focused": { outline: "none" }, +}) + +export const cmHighlight = syntaxHighlighting(HighlightStyle.define([ + { tag: tags.heading, fontWeight: "600", color: "var(--accent)" }, + { tag: tags.strong, fontWeight: "700" }, + { tag: tags.emphasis, fontStyle: "italic" }, + { tag: tags.strikethrough, textDecoration: "line-through" }, + { tag: tags.link, color: "var(--accent2)" }, + { tag: tags.url, color: "var(--muted)" }, + { tag: tags.monospace, color: "var(--accent2)" }, + { tag: tags.quote, color: "var(--muted)", fontStyle: "italic" }, + // HTML (banner editor) and Markdown raw blocks + { tag: tags.tagName, color: "var(--accent)" }, + { tag: tags.attributeName, color: "var(--accent2)" }, + { tag: tags.attributeValue, color: "var(--text)" }, + { tag: tags.comment, color: "var(--muted)" }, + { tag: tags.processingInstruction, color: "var(--muted)" }, +])) diff --git a/frontend/src/main.js b/frontend/src/main.js new file mode 100644 index 0000000..4b94601 --- /dev/null +++ b/frontend/src/main.js @@ -0,0 +1,55 @@ +// Pagerite editor entries. Two separate apps, mounted in their own +// dynamically created host divs inside the static document: +// - PageEditor ("page" mode): pen next to an article heading — Markdown +// editing with the preview rendered into the visible article. +// - SiteEditor ("site" mode): pen on the banner — banner HTML editing +// (previewed into the real banner) and the site structure tree. +// The standalone /admin shell (#app in the DOM) mounts PageEditor with the +// page selected by location hash, as a no-dynamic-import fallback. +import { createApp } from 'vue' +import PageEditor from './PageEditor.vue' +import SiteEditor from './SiteEditor.vue' + +let host = null + +export function openEditor(path, { standalone = false, mode = 'page' } = {}) { + closeEditor() + host = document.createElement('div') + host.className = 'editor-host' + // Docked inside #content: below the banner, next to the article only. + const container = (!standalone && document.getElementById('content')) || document.body + container.prepend(host) + if (!standalone) { + document.body.classList.add('editing') + // Which kind of editor is open; pagerite.js uses this to decide + // whether a pen click closes the panel or swaps in the other editor. + document.body.dataset.editorMode = mode + } + createApp(mode === 'site' ? SiteEditor : PageEditor, { + pagePath: path, + standalone, + onClose: closeEditor, + }).mount(host) +} + +export function closeEditor() { + if (!host) return + document.body.classList.remove('editing') + delete document.body.dataset.editorMode + // Slide the panel out in sync with the page shifting back. + host.firstElementChild?.classList.add('closing') + const old = host + host = null + setTimeout(() => old.remove(), 250) +} + +const shell = document.getElementById('app') +if (shell) { + // Standalone /admin shell: mount into it and follow the location hash. + host = shell + createApp(PageEditor, { + pagePath: location.hash.replace(/^#\/?/, '').replace(/\/$/, ''), + standalone: true, + onClose: () => {}, + }).mount(shell) +} diff --git a/frontend/vite-plugin-fastapi.js b/frontend/vite-plugin-fastapi.js new file mode 100644 index 0000000..8dd344c --- /dev/null +++ b/frontend/vite-plugin-fastapi.js @@ -0,0 +1,36 @@ +/** + * FastAPI-Vue Vite Plugin + * auto-upgrade@fastapi-vue-setup -- remove this if you edit the plugin + * + * Configures Vite for FastAPI backend integration: + * - Proxies /api/* requests to the FastAPI backend + * - Builds to the Python module's frontend-build directory + * + * Options: + * paths - Array of paths to proxy (default: ["/api"]) + */ + +export default function fastapiVue({ paths = ["/api"] } = {}) { + const backendUrl = process.env.PAGERITE_BACKEND_URL || "http://localhost:3200" + + // Build proxy configuration for each path + const proxy = {} + for (const path of paths) { + proxy[path] = { + target: backendUrl, + changeOrigin: false, + ws: true, + } + } + + return { + name: "vite-plugin-fastapi-pagerite", + config: () => ({ + server: { proxy }, + build: { + outDir: "../pagerite/frontend-build", + emptyOutDir: true, + }, + }), + } +} diff --git a/frontend/vite.config.js b/frontend/vite.config.js new file mode 100644 index 0000000..6e30f2b --- /dev/null +++ b/frontend/vite.config.js @@ -0,0 +1,23 @@ +import { fileURLToPath, URL } from 'node:url' +import fastapiVue from './vite-plugin-fastapi.js' + +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import vueDevTools from 'vite-plugin-vue-devtools' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [ + fastapiVue(), + vue(), + vueDevTools(), + ], + build: { + // JS entry only: no index.html in the build (it would shadow our /), + // and a manifest so the backend can resolve hashed asset names. + manifest: true, + rollupOptions: { + input: fileURLToPath(new URL('./src/main.js', import.meta.url)), + }, + }, +}) diff --git a/pagerite/__init__.py b/pagerite/__init__.py new file mode 100644 index 0000000..288b2af --- /dev/null +++ b/pagerite/__init__.py @@ -0,0 +1 @@ +"""Backend package with FastAPI application and Vue frontend integration.""" diff --git a/pagerite/__main__.py b/pagerite/__main__.py new file mode 100644 index 0000000..225cb91 --- /dev/null +++ b/pagerite/__main__.py @@ -0,0 +1,33 @@ +# auto-upgrade@fastapi-vue-setup - remove this if you modify this file +"""Command-line entry point for running the backend server.""" + +import argparse +import os + +from fastapi_vue import server + +DEFAULT_PORT = 3100 +DEVMODE = os.getenv("PAGERITE_DEV") == "1" + + +def main() -> None: + """Run the backend server with optional arguments.""" + parser = argparse.ArgumentParser(description="Run the pagerite server.") + parser.add_argument( + "-l", + "--listen", + action="append", + help=(f"Endpoint (default: localhost:{DEFAULT_PORT})."), + ) + args = parser.parse_args() + dev = {"reload": True, "reload_dirs": ["pagerite"]} if DEVMODE else {} + server.run( + "pagerite.app:app", + listen=args.listen, + default_port=DEFAULT_PORT, + **dev, + ) + + +if __name__ == "__main__": + main() diff --git a/pagerite/app.py b/pagerite/app.py new file mode 100644 index 0000000..d513875 --- /dev/null +++ b/pagerite/app.py @@ -0,0 +1,525 @@ +"""FastAPI application: server-rendered content pages plus Vue assets. + +Route ordering matters: our routes are defined before +``frontend.route(app, "/")`` is called, so they take priority over the +asset routes that fastapi-vue inserts at that position during ``load()``. +The content catch-all (``/{path:path}``) is defined last, so built +frontend assets still win over content slugs; anything unmatched falls +through to content (and 404 if no page exists there). + +The site structure is a tree of Nodes (see data.py); URL paths resolve by +walking the tree (``resolve``), moves are slot detach/attach +(``find_slot``) with a fresh order key from the new siblings. +""" + +import mimetypes +import os +from collections.abc import AsyncIterator +from contextlib import asynccontextmanager +from datetime import UTC, datetime +from pathlib import Path + +import blake3 +from fastapi import FastAPI, HTTPException, Request, WebSocket, WebSocketDisconnect +from fastapi.responses import FileResponse, HTMLResponse, RedirectResponse, Response +from fastapi_vue import Frontend +from kanta import Kanta +from pydantic import BaseModel + +from pagerite import seed, views +from pagerite.__main__ import DEVMODE +from pagerite.data import ( + Data, + Node, + append_order, + find_slot, + prettify, + resolve, + sorted_nodes, +) +from pagerite.markdown import has_h1, render + +DB_PATH = os.getenv("PAGERITE_DB", "pagerite.kanta") +STATIC = Path(__file__).with_name("static") + +# Our own data root; kanta edits it in place, reads are plain attribute access. +data = Data() +kanta = Kanta(DB_PATH, data) + +# Vue build assets served at root, no SPA catch-all (assets only). +frontend = Frontend(Path(__file__).with_name("frontend-build"), spa=False) + + +def _hash_name(body: bytes, orig: str) -> str: + """Content-addressed file name: blake3 hash prefix + original extension.""" + ext = "".join(c for c in Path(orig).suffix.lower() if c.isalnum() or c == ".") + return blake3.blake3(body).hexdigest()[:12] + ext + + +def _store_seed_file(markdown: str, banner: str, orig: str, body: bytes) -> tuple[str, str]: + """Store a seed file content-addressed and point references at /_/f/.""" + name = _hash_name(body, orig) + data.files.setdefault(name, body) + markdown = markdown.replace(f"]({orig}", f"](/_/f/{name}") + banner = banner.replace(f'src="/{orig}"', f'src="/_/f/{name}"') + banner = banner.replace(f'src="{orig}"', f'src="/_/f/{name}"') + return markdown, banner + + +def _ensure(menu: dict[str, Node], path: str) -> Node: + """Return the node at ``path``, creating it and any missing ancestors + (content-less category labels) appended at the end of their level.""" + nodes = menu + node = None + for seg in path.split("/"): + node = nodes.get(seg) + if node is None: + node = Node(title=prettify(seg), order=append_order(nodes)) + nodes[seg] = node + nodes = node.children + return node + + +def _migrate_legacy() -> None: + """Rebuild the legacy flat page store as a tree (one-time migration).""" + if not data.pages: + return + with kanta.transaction("migrate pages to tree"): + for path, page in data.pages.items(): + node = _ensure(data.menu, path) + node.title = page.title + node.content = page.markdown + node.banner = page.banner + node.published = page.published + node.order = page.order + node.created = page.created + node.modified = page.modified + data.pages.clear() + data.version += 1 + + +@asynccontextmanager +async def lifespan(_app: FastAPI) -> AsyncIterator[None]: + """Open the database, migrate/seed content, load assets.""" + await kanta.open() + _migrate_legacy() + missing = [p for p in seed.PAGES if resolve(data.menu, p) is None] + if missing: + with kanta.transaction("seed missing pages"): + for path in missing: + title, markdown, files, banner, order = seed.PAGES[path] + for orig, body in files.items(): + markdown, banner = _store_seed_file(markdown, banner, orig, body) + node = _ensure(data.menu, path) + node.title = title + node.content = markdown + node.banner = banner + node.order = order + await frontend.load() + yield + await kanta.close() + + +# docs_url/openapi_url disabled: /docs belongs to our content, and the API +# is not meant to be browsable by the public anyway. +app = FastAPI( + title="Pagerite", + debug=DEVMODE, + lifespan=lifespan, + docs_url=None, + redoc_url=None, + openapi_url=None, +) + + +class PageIn(BaseModel): + """Payload for creating or replacing a page.""" + + title: str + markdown: str + published: bool = True + banner: str | None = None # None keeps the existing banner + + +@app.get("/_/api/health") +async def health_check() -> dict[str, str]: + """Return backend status for health monitoring.""" + return {"status": "ok"} + + +@app.get("/_/api/pages") +async def list_pages() -> list[dict]: + """The site tree for the structure editor (all nodes, drafts included). + + Nested by slug; each node carries its full path, menu order and flags. + """ + + def dump(nodes: dict[str, Node], prefix: str) -> list[dict]: + out = [] + for slug, node in sorted_nodes(nodes): + path = f"{prefix}/{slug}" if prefix else slug + out.append({ + "slug": slug, + "path": path, + "title": node.title, + "order": node.order, + "published": node.published, + "has_content": node.content is not None, + "children": dump(node.children, path), + }) + return out + + return dump(data.menu, "") + + +@app.put("/_/api/pages/{path:path}", status_code=204) +async def save_page(path: str, page: PageIn) -> None: + """Create or replace the page at a slug path ("" or "/" = front page). + + Missing ancestors are created as content-less category labels. Giving + a category markdown turns it into a landing page. + """ + path = path.strip("/") + _check_reserved(path) + with kanta.transaction("save page", extra=path): + node = _ensure(data.menu, path) + node.title = page.title + node.content = page.markdown + node.published = page.published + if page.banner is not None: + node.banner = page.banner + node.modified = datetime.now(UTC) + data.version += 1 + + +class StructureOp(BaseModel): + """Rearrange the site tree: reorder, move/rename or retitle a node. + + `order` is a fresh fractional key computed client-side from the node's + new siblings (a value halfway between them); all other items keep + theirs. `move_to` is the full target path — the parent must exist and + the new slug be free. Moves carry the whole subtree. The front page is + just the top-level node with slug "": renaming it away leaves no front + page ("/" then redirects to the first nav item), and any childless + top-level node can take the empty slug to become the front page. + """ + + path: str + order: float | None = None + move_to: str | None = None + title: str | None = None + + +@app.post("/_/api/structure", status_code=204) +async def update_structure(op: StructureOp) -> None: + """Apply one structure operation (see StructureOp).""" + path = op.path.strip("/") + chain = resolve(data.menu, path) + if chain is None: + raise HTTPException(404, "no such page") + node = chain[-1] + target = op.move_to.strip("/") if op.move_to is not None else None + if target is not None and target != path: + _check_reserved(target) + if path and target.startswith(f"{path}/"): + raise HTTPException(400, "cannot move a page under itself") + slot = find_slot(data.menu, target) + if slot is None: + raise HTTPException(404, "target parent does not exist") + tnodes, tslug = slot + if tslug in tnodes: + raise HTTPException(400, "target path exists") + if not tslug and node.children: + raise HTTPException(400, "the front page cannot have children") + with kanta.transaction("update structure", extra=path): + if op.title is not None: + node.title = op.title + if target is not None and target != path: + snodes, sslug = find_slot(data.menu, path) + del snodes[sslug] + # A pure rename (same parent) keeps its position; only a move + # to another level appends at the end (unless an order came + # with the drop). + same_level = path.rpartition("/")[0] == target.rpartition("/")[0] + node.order = ( + op.order + if op.order is not None + else node.order if same_level else append_order(tnodes) + ) + tnodes[tslug] = node + elif op.order is not None: + node.order = op.order + node.modified = datetime.now(UTC) + data.version += 1 + + +@app.get("/_/api/settings") +async def get_settings() -> dict[str, str]: + """Site-wide settings (the brand text).""" + return {"brand": data.brand} + + +class SettingsIn(BaseModel): + """Payload for updating site-wide settings.""" + + brand: str + + +@app.put("/_/api/settings", status_code=204) +async def put_settings(settings: SettingsIn) -> None: + """Update site-wide settings; bumps the version so ETags invalidate.""" + with kanta.transaction("update settings"): + data.brand = settings.brand + data.version += 1 + + +@app.put("/_/api/files/{name}") +async def upload_file(name: str, request: Request) -> dict[str, str]: + """Store an upload (image, video...) in the content-addressed store. + + The stored name is a blake3 hash prefix + the original extension, + served immutable at "/_/f/{name}"; returns {"path": "/_/f/..."}. + """ + if "/" in name or name in {".", ".."}: + raise HTTPException(400, "bad file name") + body = await request.body() + stored = _hash_name(body, name) + with kanta.transaction("upload file", extra=name): + data.files[stored] = body + data.version += 1 + return {"path": f"/_/f/{stored}"} + + +@app.delete("/_/api/files/{name}", status_code=204) +async def delete_file(name: str) -> None: + """Remove a file from the content-addressed store (no refcounting: + other pages referencing the same content will 404).""" + if name not in data.files: + raise HTTPException(404, "no such file") + with kanta.transaction("delete file", extra=name): + del data.files[name] + data.version += 1 + + +@app.get("/_/f/{name}") +async def stored_file(name: str, request: Request) -> Response: + """Serve a file from the content-addressed store (immutable: the name + is its own hash, so cache forever).""" + body = data.files.get(name) + if body is None: + raise HTTPException(404) + if request.headers.get("if-none-match") == name: + return Response(status_code=304) + mime = mimetypes.guess_type(name)[0] or "application/octet-stream" + return Response( + body, + media_type=mime, + headers={"etag": name, "cache-control": "public, max-age=31536000, immutable"}, + ) + + +@app.delete("/_/api/pages/{path:path}", status_code=204) +async def delete_page(path: str) -> None: + """Delete a node by slug path. + + A category (node with children) loses only its landing page and stays + as a content-less label; a childless node is removed entirely. + """ + path = path.strip("/") + _check_reserved(path) + slot = find_slot(data.menu, path) + node = slot[0].get(slot[1]) if slot else None + if node is None: + raise HTTPException(404, "no such page") + with kanta.transaction("delete page", extra=path): + if node.children: + node.content = None + node.modified = datetime.now(UTC) + else: + del slot[0][slot[1]] + data.version += 1 + + +def _check_reserved(path: str) -> None: + """Reject slugs that collide with machinery prefixes. + + The public URL space belongs to content; only "/_/" (files + API), + "/static" and "/admin" are reserved. + """ + if path.split("/", 1)[0] in {"_", "static", "admin"}: + raise HTTPException(400, "reserved path prefix") + + +@app.websocket("/_/api/ws/editor") +async def editor_ws(ws: WebSocket) -> None: + """Editor session: open pages, render previews, save — over one socket. + + Stateless protocol (each message carries the path): + <- {"type": "open", "path"} + -> {"type": "doc", "path", "exists", "title", "markdown", "published", + "banner"} + <- {"type": "render", "path", "markdown"} + -> {"type": "html", "path", "html"} + <- {"type": "save", "path", "title"?, "markdown"?, "published"?, + "banner"?, "move_from"?} (absent fields keep their old values; + move_from: rename/move a page, subtree included) + -> {"type": "saved", "path"} | {"type": "error", "detail"} + """ + await ws.accept() + try: + while True: + msg = await ws.receive_json() + path = msg.get("path", "").strip("/") + try: + _check_reserved(path) + except HTTPException: + await ws.send_json({"type": "error", "detail": "reserved path"}) + continue + match msg.get("type"): + case "open": + chain = resolve(data.menu, path) + node = chain[-1] if chain else None + await ws.send_json({ + "type": "doc", + "path": path, + "exists": node is not None, + "title": node.title if node else "", + "markdown": node.content if node and node.content is not None else "", + "published": node.published if node else True, + "banner": node.banner if node else "", + # Which node's banner applies here ("" = front page, + # null = default artwork); the site editor shows it + # as the banner field's placeholder. + "banner_from": views.banner_source(data.menu, path), + }) + case "render": + markdown = msg.get("markdown", "") + await ws.send_json({ + "type": "html", + "path": path, + "html": render(markdown, path), + "has_h1": has_h1(markdown), + }) + case "save": + move_from = (msg.get("move_from") or path).strip("/") + try: + _check_reserved(move_from) + except HTTPException: + await ws.send_json({"type": "error", "detail": "reserved path"}) + continue + old_chain = resolve(data.menu, move_from) + old = old_chain[-1] if old_chain else None + if old is None and move_from != path: + move_from = path # nothing to carry over; plain save + if move_from != path: + # Rename/move: detach the node (subtree included) + # and attach it at the new path. The target slug + # must be free and the front page childless. + if move_from and path.startswith(f"{move_from}/"): + await ws.send_json({ + "type": "error", + "detail": "cannot move a page under itself", + }) + continue + tslug = path.rpartition("/")[2] + if not tslug and old.children: + await ws.send_json({ + "type": "error", + "detail": "the front page cannot have children", + }) + continue + tchain = resolve(data.menu, path) + if tchain is not None: + await ws.send_json({ + "type": "error", + "detail": "target path exists", + }) + continue + with kanta.transaction("editor save", extra=path): + if move_from != path: + same_menu = ( + move_from.rpartition("/")[0] == path.rpartition("/")[0] + ) + snodes, sslug = find_slot(data.menu, move_from) + node = snodes.pop(sslug) + parent = path.rpartition("/")[0] + if parent: + _ensure(data.menu, parent) + tnodes, tslug = find_slot(data.menu, path) + node.order = ( + node.order if same_menu else append_order(tnodes) + ) + tnodes[tslug] = node + else: + node = old if old is not None else _ensure(data.menu, path) + if "title" in msg: + node.title = msg["title"] + if "markdown" in msg: + node.content = msg["markdown"] + if "published" in msg: + node.published = bool(msg["published"]) + if "banner" in msg: + node.banner = msg["banner"] + node.modified = datetime.now(UTC) + data.version += 1 + await ws.send_json({"type": "saved", "path": path}) + except WebSocketDisconnect: + pass + + +@app.get("/admin", response_class=HTMLResponse) +async def admin() -> HTMLResponse: + """Serve the editor app shell (Vue mounts into #app).""" + return HTMLResponse(views.render_editor()) + + +@app.get("/static/{path:path}") +async def static_file(path: str) -> FileResponse: + """Serve our own static assets (style.css, pagerite.js).""" + file = STATIC / path + if not file.is_file() or not file.resolve().is_relative_to(STATIC): + raise HTTPException(404) + return FileResponse(file) + + +@app.get("/") +async def front_page(request: Request) -> Response: + """Render the front page (slug path "").""" + return await show_page(request, "") + + +# Vue build asset routes are inserted at this position during load(). +frontend.route(app, "/") + + +@app.get("/{path:path}", response_model=None) +async def show_page(request: Request, path: str) -> HTMLResponse | Response: + """Render the content page at a slug path, or 404. + + A node without content is a category label: its URL redirects to the + first child page in menu order. + """ + path = path.strip("/") + chain = resolve(data.menu, path) + node = chain[-1] if chain else None + if node is not None and node.published and node.content is not None: + # ETag on content + render version; clients revalidate cheaply, + # which keeps prefetched pages warm and current. + etag = f'"{path}@{node.modified.timestamp()}v{data.version}"' + if request.headers.get("if-none-match") == etag: + return Response(status_code=304) + return HTMLResponse( + views.render_page(data.menu, path, data.brand), + headers={"etag": etag}, + ) + if node is not None and node.published and node.content is None: + # Category label without a landing page: open its first child. + if (leaf := views.first_leaf(data.menu, path)) is not None: + return RedirectResponse(f"/{leaf}") + if node is None and not path: + # No front page (no top-level node with slug ""): "/" opens the + # first item of the navigation instead. + for slug, item in sorted_nodes(data.menu): + if item.published: + return RedirectResponse(f"/{slug}") + return HTMLResponse(views.render_not_found(data.menu, path, data.brand), 404) diff --git a/pagerite/data.py b/pagerite/data.py new file mode 100644 index 0000000..52d0623 --- /dev/null +++ b/pagerite/data.py @@ -0,0 +1,133 @@ +"""Data model persisted in the kanta database. + +The site structure is a tree of Nodes. Every node is a menu label with a +configurable title and slug (its key in the parent's ``children``); the +URL path is the chain of slugs from the top level. ``content`` is the +node's Markdown page, or None for a pure category label, whose URL +redirects to the first child page. +""" + +from datetime import UTC, datetime + +import msgspec + + +class Node(msgspec.Struct, omit_defaults=True): + """One item of the site hierarchy. + + Siblings are ordered by the fractional ``order`` key (never list + positions): a moved item takes a fresh key relative to its new + siblings, all other items keep theirs. + + The front page is whichever top-level node has slug "" (URL "/") — an + item parallel to the other main-level pages, not their parent, so it + cannot have children. Renaming it away leaves no front page ("/" + redirects to the first nav item); any childless top-level node can + take the empty slug. + """ + + title: str = "" + order: float = 0 + #: Markdown source of the node's page; None = pure category label + #: (redirects to the first child page). + content: str | None = None + #: Raw HTML for the header banner (img, styled div, canvas+script...). + #: Empty inherits the nearest ancestor's banner, front page last. + banner: str = "" + published: bool = True + children: dict[str, "Node"] = {} + created: datetime = msgspec.field( + default_factory=lambda: datetime.now(UTC), + ) + modified: datetime = msgspec.field( + default_factory=lambda: datetime.now(UTC), + ) + + +class Page(msgspec.Struct, omit_defaults=True): + """Legacy flat page record, from before the tree model. + + Kept only so old databases still decode; app.py migrates any entries + into ``Data.menu`` on startup and clears this. + """ + + title: str + markdown: str + published: bool = True + order: float = 0 + banner: str = "" + created: datetime = msgspec.field( + default_factory=lambda: datetime.now(UTC), + ) + modified: datetime = msgspec.field( + default_factory=lambda: datetime.now(UTC), + ) + + +class Data(msgspec.Struct): + """Root object of the kanta database. Owned and edited in place by us.""" + + #: Top-level menu items by slug; "" is the front page. + menu: dict[str, Node] = {} + #: Content-addressed file store: name (blake3 hash prefix + extension) + #: -> bytes, served immutable at "/_/{name}". Absolute URLs that stay + #: valid when pages move. + files: dict[str, bytes] = {} + #: Bumped on every structure/content write, so page ETags (which embed + #: it) invalidate cached copies when navigation-affecting changes happen. + version: int = 0 + #: Site name shown in the header and suffix; editable in the + #: site editor. Empty = no brand link in the header, no title suffix. + brand: str = "Pagerite" + #: Legacy flat page store (pre-tree databases); migrated into `menu` + #: on startup, then cleared. Never written otherwise. + pages: dict[str, Page] = {} + + +def prettify(slug: str) -> str: + """Human-readable default title for a slug segment.""" + return slug.replace("-", " ").replace("_", " ").title() + + +def resolve(menu: dict[str, Node], path: str) -> list[Node] | None: + """Chain of nodes from the top level down to ``path`` ("" = front page). + + chain[0] is a top-level node, chain[-1] the node itself — the chain is + useful for banner inheritance. None when any segment is missing. + """ + chain = [] + nodes = menu + for seg in path.split("/"): + node = nodes.get(seg) + if node is None: + return None + chain.append(node) + nodes = node.children + return chain + + +def find_slot(menu: dict[str, Node], path: str) -> tuple[dict[str, Node], str] | None: + """The (children dict, slug) slot holding the node at ``path``. + + The returned dict is live: deleting or inserting the slug moves the + node (its whole subtree travels with it). None when the parent chain + does not resolve. + """ + segs = path.split("/") + nodes = menu + for seg in segs[:-1]: + node = nodes.get(seg) + if node is None: + return None + nodes = node.children + return nodes, segs[-1] + + +def sorted_nodes(nodes: dict[str, Node]) -> list[tuple[str, Node]]: + """(slug, node) pairs in menu order: fractional order key, then title.""" + return sorted(nodes.items(), key=lambda kv: (kv[1].order, kv[1].title.lower())) + + +def append_order(nodes: dict[str, Node]) -> float: + """Order value appending an item at the end of a sibling level.""" + return max((n.order for n in nodes.values()), default=0) + 1 diff --git a/pagerite/markdown.py b/pagerite/markdown.py new file mode 100644 index 0000000..eaa79bf --- /dev/null +++ b/pagerite/markdown.py @@ -0,0 +1,125 @@ +"""Markdown rendering. + +Raw HTML (including inline scripts) is passed through unfiltered: the +single author is trusted. Extensions: tables and strikethrough (from the +"default" preset), footnotes, definition lists, task lists and +brace-attributes (`{.class width=300}` on any element, images in +particular). + +Images get special treatment: a relative `src` is resolved against the +page's own path (so `![alt](photo.avif)` in `/docs/design` is served from +`/docs/design/photo.avif`), and an image with a title becomes a +`<figure>` with `<figcaption>`. Positioning is done with attribute +classes, e.g. `![alt](photo.avif "Caption"){.right}`. +""" + +from markdown_it import MarkdownIt +from markdown_it.common.utils import escapeHtml +from markdown_it.renderer import RendererHTML +from mdit_py_plugins.attrs import attrs_plugin +from mdit_py_plugins.deflist import deflist_plugin +from mdit_py_plugins.footnote import footnote_plugin +from mdit_py_plugins.tasklists import tasklists_plugin +from pygments import highlight +from pygments.formatters import HtmlFormatter +from pygments.lexers import get_lexer_by_name +from pygments.util import ClassNotFound + +# Styles in /static/pygments.css match this formatter (regenerate: +# HtmlFormatter(style="github-dark").get_style_defs("pre code")) +_formatter = HtmlFormatter(style="github-dark", nowrap=True) + + +def _highlight(text: str, lang: str, _attrs: str) -> str: + """Syntax-highlight a fenced code block with Pygments. + + Returns bare spans (nowrap): markdown-it adds the <pre><code> wrapper, + and the stylesheet is scoped to "pre code" to match. + """ + try: + lexer = get_lexer_by_name(lang) + except ClassNotFound: + return "" # fall back to default <pre><code> + return highlight(text, lexer, _formatter) + + +def _image_rule( + self: RendererHTML, + tokens, + idx: int, + options, + env: dict, +) -> str: + """Render images, resolving relative srcs against the page path.""" + token = tokens[idx] + src = token.attrs["src"] + if not src.startswith(("/", "http://", "https://", "data:")): + page = env.get("page_path", "") + token.attrs["src"] = f"/{page}/{src}" if page else f"/{src}" + token.attrs["alt"] = self.renderInlineAsText(token.children, options, env) + img = self.renderToken(tokens, idx, options, env) + if title := token.attrs.get("title"): + return f"<figure>{img}<figcaption>{escapeHtml(title)}</figcaption></figure>" + return img + + +def _unwrap_lone_figures(state) -> None: + """Drop the <p> wrapper around a lone titled image. + + markdown-it wraps inline content in a paragraph, but our image rule + turns titled images into <figure> — a block element that is invalid + inside <p>. Browsers hoist it out, leaving an empty paragraph whose + margins disturb the layout. + """ + tokens = state.tokens + for i, token in enumerate(tokens): + if token.type != "inline" or not token.children: + continue + [child] = token.children if len(token.children) == 1 else [None] + if child and child.type == "image" and child.attrs.get("title"): + if (tokens[i - 1].type == "paragraph_open" + and tokens[i + 1].type == "paragraph_close"): + tokens[i - 1].hidden = True + tokens[i + 1].hidden = True + + +md = ( + MarkdownIt("default", {"html": True, "highlight": _highlight}) + .use(attrs_plugin) + .use(footnote_plugin) + .use(deflist_plugin) + .use(tasklists_plugin) +) +def _checkbox_emojis(state) -> None: + """Render task-list checkboxes as emoji instead of disabled inputs. + + A disabled <input> renders grey and washed out; a colored emoji + shows the state without any styling. + """ + for token in state.tokens: + if token.type != "inline" or not token.children: + continue + for child in token.children: + if child.type == "html_inline" and 'type="checkbox"' in child.content: + child.type = "text" + child.content = "✅" if "checked" in child.content else "⬜" + + +md.add_render_rule("image", _image_rule) +md.core.ruler.push("unwrap_lone_figures", _unwrap_lone_figures) +md.core.ruler.push("checkbox_emojis", _checkbox_emojis) + + +def render(text: str, page_path: str = "") -> str: + """Render Markdown text to an HTML string.""" + return md.render(text, {"page_path": page_path}) + + +def has_h1(text: str) -> bool: + """True if the Markdown source itself contains an h1 heading. + + When it does, the article owns its heading and the page title is not + rendered as an additional h1 (the title is still used for the document + <title> and navigation labels). + """ + return any(t.type == "heading_open" and t.tag == "h1" for t in md.parse(text)) diff --git a/pagerite/seed.py b/pagerite/seed.py new file mode 100644 index 0000000..3d1440a --- /dev/null +++ b/pagerite/seed.py @@ -0,0 +1,449 @@ +"""Seed content written to the database on first run (when it is empty). + +Demonstrates the formatting options: images attached to pages and served +from the page path, figures with captions, attribute classes for +positioning, footnotes, definition lists, task lists, tables and raw HTML. +""" + +WELCOME = """\ +Welcome to your new **Pagerite** site. Pages are written in Markdown — +including raw HTML — and served from pretty URLs. + +Have a look around: + +- The [docs](/docs) section explains [how to write content](/docs/editing), + including images and positioning. +- [The Long Read](/blog/the-long-read) demonstrates a longer article with + scroll effects. +- The [about](/about) page shows off assorted formatting. + +![Abstract waves](waves.svg "Generated SVG artwork, attached to this page") +""" + +ABOUT = """\ +This site runs on **Pagerite**: FastAPI + html5tagger + kanta, with content +written in Markdown. + +Some formatting samples: + +- [x] Write content in Markdown +- [x] Attach images to pages +- [ ] Add editing UI + +Term +: A definition list entry, rendered by the deflist plugin. + +And a table: + +| Feature | Status | +|---------|--------| +| Pages | done | +| Images | done | +| Comments| later | + +Footnotes work too.[^1] + +[^1]: Rendered at the bottom of the page, with a back-reference. +""" + +EDITING = """\ +Pages are written in Markdown with extensions. Everything below is plain +Markdown source — no special support from the article is needed for the +site's layout or scroll effects. + +## Images + +Upload a file (`PUT /_/api/files/{filename}`) and it lands in the +content-addressed store, served immutable from `/_/f/{hash}.ext` — an +absolute URL that survives page moves: + +``` +![Abstract shapes](/_/f/....svg "A captioned figure"){.right width=280} +``` + +![Abstract shapes](shapes.svg "A captioned figure, floated right with an attribute class"){.right width=280} + +The title becomes a `<figcaption>`, and brace attributes (the attrs +plugin) control positioning: `{.right}`, `{.left}`, `{.wide}`, plus plain +attributes like `width=280`. Absolute and external URLs pass through +unchanged. + +## Text + +*Emphasis*, **strong**, ~~strikethrough~~, `inline code`, and +[links](/about) as usual. Blockquotes: + +> The URL space is the author's. Pretty slugs at the root, nesting only +> where the content is genuinely structured. + +## Code + +```python +def render(text: str, page_path: str) -> str: + return md.render(text, {"page_path": page_path}) +``` +""" + +LONG_READ = """\ +*An essay long enough to scroll, to demonstrate the gentle reveal of +headings, figures and code blocks as they enter the viewport.* + +![Layered dunes](dunes.svg "Full-width artwork between sections"){.wide} + +## Chapter one + +The distinction between a blog and a website is largely an accident of +history. Early content management systems filed everything under "posts", +stamped them with a date, and arranged them in reverse chronological order +under a `/blog/` prefix. Anything else was a "page", which lived somewhere +else entirely, often in a separate editing interface with separate rules. + +But readers do not think in these terms. A reader follows a link, reads +what is there, and follows another link. The URL is a promise about where +something lives, not about which database table it came from. Pagerite +therefore treats every piece of content as a page: named, addressable, and +rendered on the fly. + +## Chapter two + +Consider what happens to URLs when the tooling leads the design. You get +addresses like `/cms/frontpage` or `/blog/post1` — the name of the machine +leaking into the name of the thing. The slug should be chosen by the +author, the way a book's title is chosen, and it should sit at the root of +the site like the title sits on the cover. + +Nesting still has its place. Structured content — documentation, a series, +a portfolio — benefits from paths that mirror the structure. The +navigation on this very site is derived from the paths: open a section, +and you see what it contains. No menu editor, no duplication of structure +in two places. + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod +tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim +veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea +commodo consequat. Duis aute irure dolor in reprehenderit in voluptate +velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat +cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id +est laborum. + +Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium +doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo +inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. +Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut +fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem +sequi nesciunt. + +## Chapter three + +On the reading experience itself: motion on the web is usually either +absent or obnoxious. The interesting middle ground is motion that +acknowledges the reader's own movement — the scroll. Elements that fade +in as they enter the viewport give the page a sense of depth, as if the +content were arriving just in time. + +Crucially, none of this may depend on the article. The author writes +Markdown; the effects come from the layout. And when the reader prefers +reduced motion, everything must hold still. + +Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, +consectetur, adipisci velit, sed quia non numquam eius modi tempora +incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad +minima veniam, quis nostrum exercitationem ullam corporis suscipit +laboriosam, nisi ut aliquid ex ea commodi consequatur? + +```text +Quis autem vel eum iure reprehenderit +qui in ea voluptate velit esse quam nihil +molestiae consequatur, vel illum qui +dolorem eum fugiat quo voluptas nulla pariatur? +``` + +At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis +praesentium voluptatum deleniti atque corrupti quos dolores et quas +molestias excepturi sint occaecati cupiditate non provident, similique +sunt in culpa qui officia deserunt mollitia animi, id est laborum et +dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. + +## Chapter four + +Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil +impedit quo minus id quod maxime placeat facere possimus, omnis voluptas +assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut +officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates +repudiandae sint et molestiae non recusandae. + +Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis +voluptatibus maiores alias consequatur aut perferendis doloribus +asperiores repellat. And so we arrive back where we started: the blog and +the website were one thing all along. [Return to the front page](/). +""" + +NOTES_ON_URLS = """\ +A URL is part of the content. A few rules of thumb I keep coming back to: + +- Pick slugs like book titles, not like database keys. +- Nest only when the structure is real. +- Once published, a URL is a promise. Redirect if you must break it. + +> Cool URIs don't change; uncool ones at least apologise. + +That's all. Short posts are posts too. +""" + +CANVAS_NIGHTS = """\ +This post's banner is not an image at all — it's a `<canvas>` animated by +a few lines of JavaScript embedded in the page's banner HTML. + +Banners on this site are arbitrary markup: an image, a gradient div, or a +small animated scene like the one above. Subpages inherit the nearest +banner up their path, so a whole section can share one look. + +```js +// the essence of the banner above +stars.forEach(s => { s.x = (s.x + s.speed * dt) % 1 }) +``` + +No build step, no framework — the snippet is stored with the page and +dropped into the header as-is. +""" + +SMALL_RELEASES = """\ +Software wants to be shipped. The longer a change sits unmerged, the more +it rots: context fades, conflicts accumulate, and the diff grows teeth. + +1. Cut the scope until it fits in a day. +2. Ship it behind whatever door you like. +3. Let real use argue with your assumptions. + +A release is a conversation with reality. Small releases keep the +conversation lively. +""" + +CANVAS_BANNER = """\ +<canvas id="stars"></canvas> +<script> +(() => { + const c = document.getElementById("stars"); + const ctx = c.getContext("2d"); + const fit = () => { c.width = c.clientWidth; c.height = c.clientHeight; }; + fit(); + addEventListener("resize", fit); + const stars = Array.from({ length: 110 }, () => ({ + x: Math.random(), y: Math.random(), + r: Math.random() * 1.4 + 0.3, v: Math.random() * 0.05 + 0.01, + })); + let prev = performance.now(); + (function frame(now) { + if (!c.isConnected) return; + const dt = Math.min(now - prev, 100); prev = now; + ctx.fillStyle = "#0b0e1d"; + ctx.fillRect(0, 0, c.width, c.height); + ctx.fillStyle = "#cdd6ff"; + for (const s of stars) { + s.x = (s.x + s.v * dt / 1000) % 1; + ctx.beginPath(); + ctx.arc(s.x * c.width, s.y * c.height, s.r, 0, 7); + ctx.fill(); + } + requestAnimationFrame(frame); + })(prev); +})(); +</script> +""" + +EYES_BANNER = """\ +<canvas id="eyes"></canvas> +<script> +(() => { + const c = document.getElementById("eyes"); + const ctx = c.getContext("2d"); + const BG = "#f3e9d7"; + const fit = () => { c.width = c.clientWidth; c.height = c.clientHeight; }; + fit(); + addEventListener("resize", fit); + + // Mouse in canvas coordinates; pupils wander idly when it goes stale. + let mx = 0, my = 0, lastMove = 0; + addEventListener("mousemove", (e) => { + const r = c.getBoundingClientRect(); + mx = e.clientX - r.left; + my = e.clientY - r.top; + lastMove = performance.now(); + }); + + // The pair of eyes is one critter: it wanders around the banner, and + // every so often ducks below the bottom edge, then pops back up. + let gx = 0.5, gy = 0.5; // group position (fractions of the canvas) + let tx = 0.5, ty = 0.5; // wander target + let yoff = 0, vy = 0; // vertical hide/pop spring (px) + let hidePhase = 0; // 0 = up, 1 = ducking, 2 = down, waiting + let nextMove = 0, nextHide = 4000 + Math.random() * 5000, resurfaceAt = 0; + + // Per-eye pupil state: spring physics for goofy lag and overshoot. + const eyes = [{ x: 0, y: 0, vx: 0, vy: 0, pr: 0.3 }, { x: 0, y: 0, vx: 0, vy: 0, pr: 0.3 }]; + + let prev = performance.now(); + (function frame(now) { + if (!c.isConnected) return; + const dt = Math.min(now - prev, 100) / 16.7; prev = now; + ctx.fillStyle = BG; + ctx.fillRect(0, 0, c.width, c.height); + const R = Math.min(c.height * 0.32, 70); + + // Wander: ease toward a spot, pick a new one every few seconds. + if (now > nextMove && !hidePhase) { + tx = 0.15 + Math.random() * 0.7; + ty = 0.3 + Math.random() * 0.4; + nextMove = now + 2500 + Math.random() * 3500; + } + gx += (tx - gx) * 0.02 * dt; + gy += (ty - gy) * 0.02 * dt; + + // Duck down, wait hidden, then spring back (underdamped = pops past + // the resting point and wobbles). Resurfaces at a new spot. + if (hidePhase === 0 && now > nextHide) hidePhase = 1; + if (hidePhase === 1 && yoff > c.height * 0.9) { + hidePhase = 2; + resurfaceAt = now + 500 + Math.random() * 900; + } + if (hidePhase === 2 && now > resurfaceAt) { + hidePhase = 0; + nextHide = now + 5000 + Math.random() * 7000; + tx = 0.15 + Math.random() * 0.7; + gx = tx; + nextMove = now + 3000 + Math.random() * 3000; + } + const yTarget = hidePhase ? c.height : 0; + vy += (yTarget - yoff) * 0.06 * dt; + vy *= 0.85; + yoff += vy * dt; + + const cy0 = gy * c.height + yoff; + const cx0 = gx * c.width; + const watching = now - lastMove < 4000; + eyes.forEach((e, i) => { + const cx = cx0 + (i ? 1.3 : -1.3) * R; + // Pupil target: toward the cursor, or a slow idle drift. + let ptx, pty; + if (watching) { + const dx = mx - cx, dy = my - cy0; + const d = Math.hypot(dx, dy) || 1; + const reach = R * 0.45 * Math.min(1, d / 200); + ptx = (dx / d) * reach; pty = (dy / d) * reach; + } else { + ptx = Math.sin(now / 900 + i * 2) * R * 0.3; + pty = Math.cos(now / 1300 + i * 3) * R * 0.2; + } + // Spring toward the target (underdamped: overshoots, wobbles). + e.vx += (ptx - e.x) * 0.08 * dt; e.vy += (pty - e.y) * 0.08 * dt; + e.vx *= 0.82; e.vy *= 0.82; + e.x += e.vx * dt; e.y += e.vy * dt; + // Pupils dilate when the cursor comes close to the eye. + const near = Math.hypot(mx - cx, my - cy0) < R * 2.5; + e.pr += ((near ? 0.42 : 0.3) - e.pr) * 0.1 * dt; + // Sclera. + ctx.fillStyle = "#fff"; + ctx.beginPath(); + ctx.ellipse(cx, cy0, R, R * 1.15, 0, 0, 7); + ctx.fill(); + // Iris + pupil + glint, clipped to the sclera. + ctx.save(); + ctx.beginPath(); + ctx.ellipse(cx, cy0, R, R * 1.15, 0, 0, 7); + ctx.clip(); + ctx.fillStyle = "#7c5cff"; + ctx.beginPath(); + ctx.arc(cx + e.x, cy0 + e.y, R * 0.55, 0, 7); + ctx.fill(); + ctx.fillStyle = "#1d1730"; + ctx.beginPath(); + ctx.arc(cx + e.x, cy0 + e.y, R * e.pr, 0, 7); + ctx.fill(); + ctx.fillStyle = "#fff"; + ctx.beginPath(); + ctx.arc(cx + e.x - R * 0.15, cy0 + e.y - R * 0.18, R * 0.09, 0, 7); + ctx.fill(); + ctx.restore(); + ctx.strokeStyle = "#2b2440"; + ctx.lineWidth = 2; + ctx.beginPath(); + ctx.ellipse(cx, cy0, R, R * 1.15, 0, 0, 7); + ctx.stroke(); + }); + requestAnimationFrame(frame); + })(prev); +})(); +</script> +""" + +BLOG_BANNER = '<div style="background: linear-gradient(100deg, #14243d, #3d2b6b 45%, #7c5cff 75%, #ff5c8a)"></div>' + +FRONT_BANNER = '<img src="/waves.svg" alt="">' + +WAVES_SVG = """\ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 400"> + <defs> + <linearGradient id="g1" x1="0" y1="0" x2="1" y2="1"> + <stop offset="0" stop-color="#7c5cff"/> + <stop offset="1" stop-color="#00d4c8"/> + </linearGradient> + <linearGradient id="g2" x1="0" y1="1" x2="1" y2="0"> + <stop offset="0" stop-color="#ff5c8a"/> + <stop offset="1" stop-color="#7c5cff"/> + </linearGradient> + </defs> + <rect width="800" height="400" fill="#12101c"/> + <path d="M0 260 Q 200 180 400 260 T 800 260 V400 H0 Z" fill="url(#g1)" opacity="0.85"/> + <path d="M0 310 Q 200 240 400 310 T 800 310 V400 H0 Z" fill="url(#g2)" opacity="0.75"/> + <circle cx="600" cy="110" r="70" fill="#ffd75c" opacity="0.9"/> +</svg> +""" + +SHAPES_SVG = """\ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400"> + <rect width="400" height="400" fill="#0f1a1c"/> + <circle cx="140" cy="150" r="90" fill="#00d4c8" opacity="0.85"/> + <rect x="180" y="180" width="150" height="150" rx="24" fill="#ffb35c" opacity="0.9"/> + <path d="M140 60 L 220 200 L 60 200 Z" fill="#ff5c8a" opacity="0.8"/> +</svg> +""" + +DUNES_SVG = """\ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 300"> + <defs> + <linearGradient id="sky" x1="0" y1="0" x2="0" y2="1"> + <stop offset="0" stop-color="#2b1b4d"/> + <stop offset="1" stop-color="#ff8a5c"/> + </linearGradient> + </defs> + <rect width="1200" height="300" fill="url(#sky)"/> + <path d="M0 210 Q 300 150 600 210 T 1200 210 V300 H0 Z" fill="#3d2b6b"/> + <path d="M0 250 Q 300 200 600 250 T 1200 250 V300 H0 Z" fill="#241842"/> +</svg> +""" + +#: path -> (title, markdown, {filename: bytes}, banner HTML, menu order). +#: Note there are deliberately no "docs" or "blog" landing pages: those +#: labels are created without content, so entering them redirects to the +#: first child (see views.first_leaf). +PAGES: dict[str, tuple[str, str, dict[str, bytes], str, float]] = { + "": ("Welcome", WELCOME, {"waves.svg": WAVES_SVG.encode()}, FRONT_BANNER, 1), + "about": ("About", ABOUT, {}, "", 2), + "docs/editing": ( + "Writing Content", + EDITING, + {"shapes.svg": SHAPES_SVG.encode()}, + "", + 1, + ), + "blog/the-long-read": ( + "The Long Read", + LONG_READ, + {"dunes.svg": DUNES_SVG.encode()}, + BLOG_BANNER, + 1, + ), + "blog/notes-on-urls": ("Notes on URLs", NOTES_ON_URLS, {}, EYES_BANNER, 2), + "blog/canvas-nights": ("Canvas Nights", CANVAS_NIGHTS, {}, CANVAS_BANNER, 3), + "blog/small-releases": ("Small Releases", SMALL_RELEASES, {}, "", 4), +} diff --git a/pagerite/static/banner.svg b/pagerite/static/banner.svg new file mode 100644 index 0000000..f18f155 --- /dev/null +++ b/pagerite/static/banner.svg @@ -0,0 +1,34 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1600 360"> + <defs> + <linearGradient id="sky" x1="0" y1="0" x2="0" y2="1"> + <stop offset="0" stop-color="#0b0918"/> + <stop offset="0.6" stop-color="#241842"/> + <stop offset="1" stop-color="#3d2b6b"/> + </linearGradient> + <linearGradient id="aur1" x1="0" y1="0" x2="1" y2="0"> + <stop offset="0" stop-color="#00d4c8" stop-opacity="0"/> + <stop offset="0.5" stop-color="#00d4c8" stop-opacity="0.7"/> + <stop offset="1" stop-color="#7c5cff" stop-opacity="0"/> + </linearGradient> + <linearGradient id="aur2" x1="0" y1="0" x2="1" y2="0"> + <stop offset="0" stop-color="#7c5cff" stop-opacity="0"/> + <stop offset="0.5" stop-color="#ff5c8a" stop-opacity="0.55"/> + <stop offset="1" stop-color="#ffd75c" stop-opacity="0"/> + </linearGradient> + </defs> + <rect width="1600" height="360" fill="url(#sky)"/> + <g fill="#ffffff"> + <circle cx="120" cy="60" r="1.6" opacity="0.9"/> + <circle cx="300" cy="30" r="1.1" opacity="0.7"/> + <circle cx="470" cy="90" r="1.4" opacity="0.8"/> + <circle cx="640" cy="45" r="1" opacity="0.6"/> + <circle cx="820" cy="70" r="1.5" opacity="0.85"/> + <circle cx="990" cy="35" r="1.1" opacity="0.7"/> + <circle cx="1150" cy="85" r="1.6" opacity="0.9"/> + <circle cx="1320" cy="50" r="1" opacity="0.6"/> + <circle cx="1480" cy="95" r="1.3" opacity="0.8"/> + </g> + <path d="M0 190 Q 400 90 800 170 T 1600 150 V240 Q 1200 210 800 240 T 0 250 Z" fill="url(#aur1)"/> + <path d="M0 230 Q 400 140 800 210 T 1600 190 V280 Q 1200 250 800 280 T 0 290 Z" fill="url(#aur2)"/> + <path d="M0 300 Q 400 260 800 300 T 1600 290 V360 H0 Z" fill="#12101c"/> +</svg> diff --git a/pagerite/static/fonts/firacode.woff2 b/pagerite/static/fonts/firacode.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..ed70084f325626a627a13f8c37af71e798dd6efe GIT binary patch literal 36276 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 CfcoSB literal 0 HcmV?d00001 diff --git a/pagerite/static/fonts/fonts.css b/pagerite/static/fonts/fonts.css new file mode 100644 index 0000000..16ce2f0 --- /dev/null +++ b/pagerite/static/fonts/fonts.css @@ -0,0 +1,3 @@ +@font-face { font-family: 'Fraunces'; font-weight: 100 1000; font-style: normal; font-display: swap; src: url('/static/fonts/fraunces.woff2') format('woff2'); } +@font-face { font-family: 'Literata'; font-weight: 100 900; font-style: normal; font-display: swap; src: url('/static/fonts/literata.woff2') format('woff2'); } +@font-face { font-family: 'Fira Code'; font-weight: 300 700; font-style: normal; font-display: swap; src: url('/static/fonts/firacode.woff2') format('woff2'); } diff --git a/pagerite/static/fonts/fraunces.woff2 b/pagerite/static/fonts/fraunces.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..cb295bf0e09bde54e1846be5553ddcf0e089e680 GIT binary patch literal 67304 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 literal 0 HcmV?d00001 diff --git a/pagerite/static/fonts/literata.woff2 b/pagerite/static/fonts/literata.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..cae706250875d23c36e4833e35bd51a5c2316e0d GIT binary patch literal 85672 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 literal 0 HcmV?d00001 diff --git a/pagerite/static/pagerite.js b/pagerite/static/pagerite.js new file mode 100644 index 0000000..e344b0a --- /dev/null +++ b/pagerite/static/pagerite.js @@ -0,0 +1,258 @@ +// Fetch-navigation: swap dynamic regions (#nav, #main) instead of full +// page loads. Real <a href> links are used throughout, so this is pure +// progressive enhancement - without JS every link does a normal load. +// +// Also: scroll-reveal effects and code copy buttons. These need no +// support from the article itself and are re-applied after each swap. +(() => { + const REGIONS = ["page-banner", "nav", "sidebar", "main"]; + const reduceMotion = matchMedia("(prefers-reduced-motion: reduce)"); + let editorModule = null; + + function runScripts(root) { + // Scripts inserted via DOM swapping do not execute; re-create them. + for (const old of root.querySelectorAll("script")) { + const s = document.createElement("script"); + for (const a of old.attributes) s.setAttribute(a.name, a.value); + s.textContent = old.textContent; + old.replaceWith(s); + } + } + + // --- Scroll reveal + code block copy buttons ------------------------- + const observer = new IntersectionObserver((entries) => { + for (const e of entries) { + if (e.isIntersecting) { + e.target.classList.add("in"); + observer.unobserve(e.target); + } + } + }, { rootMargin: "0px 0px -8% 0px" }); + + function addCopyButtons(main) { + for (const pre of main.querySelectorAll("pre")) { + if (pre.querySelector(".copy")) continue; + const btn = document.createElement("button"); + btn.className = "copy"; + btn.type = "button"; + btn.textContent = "copy"; + btn.addEventListener("click", async () => { + const code = pre.querySelector("code"); + await navigator.clipboard.writeText( + (code || pre).textContent.replace(/\n$/, ""), + ); + btn.textContent = "copied"; + btn.classList.add("copied"); + setTimeout(() => { + btn.textContent = "copy"; + btn.classList.remove("copied"); + }, 1500); + }); + pre.append(btn); + } + } + + // Tuck the article edit pen at the end of the first h1 (which may come + // from the markdown itself). Re-runs when the editor replaces the + // previewed body, since that wipes elements inside it. + function placeEditPen() { + const article = document.querySelector("#main article"); + const btn = article?.querySelector("button.edit-link"); + // First visible h1: the title h1 may be display:none when the + // markdown owns its heading (editor preview state). + const h1 = [...(article?.querySelectorAll("h1") || [])] + .find((h) => h.offsetParent !== null); + if (btn && h1 && btn.parentElement !== h1) h1.append(btn); + } + + addEventListener("pagerite:preview", placeEditPen); + + function applyEffects() { + (window.requestIdleCallback || setTimeout)(preload); + const main = document.getElementById("main"); + addCopyButtons(main); + placeEditPen(); + // Multi-column layout only when there is enough text to justify it. + // Split the body into columned segments: h2s and wide figures are + // full-width separators and never go inside columns. + const article = main.querySelector("article"); + if (article) { + const body = article.querySelector(".body"); + article.classList.toggle( + "multicol", + !!body && body.textContent.trim().length > 1800, + ); + if (body && article.classList.contains("multicol") + && !body.querySelector(".colseg")) { + // h2s and anything holding a wide image are full-width separators + const isSeparator = (el) => + el.tagName === "H2" || el.querySelector("img.wide") !== null; + let seg = null; + for (const el of [...body.children]) { + if (isSeparator(el)) { + seg = null; + body.append(el); + } else { + if (!seg) { + seg = document.createElement("div"); + seg.className = "colseg"; + body.append(seg); + } + seg.append(el); + } + } + // Columns are per section: only segments with enough text get them, + // so a short ingress or a brief section stays single-column. + for (const s of body.querySelectorAll(".colseg")) { + s.classList.toggle("cols", s.textContent.trim().length > 600); + } + } + } + if (reduceMotion.matches) return; + for (const el of main.querySelectorAll( + "h2, h3, figure, img, pre, blockquote, table, dl, .task-list-item", + )) { + if (!el.classList.contains("reveal")) { + el.classList.add("reveal"); + observer.observe(el); + } + } + } + + // --- Preloading ------------------------------------------------------ + // Warm the HTTP cache with all linked pages and their resources, so + // navigation (and the cube transition) is instant. Pages carry ETags, + // so re-running this after each navigation revalidates cheaply (304) + // and picks up changed content and images. + function preload() { + const urls = new Set(); + for (const a of document.querySelectorAll('#nav a[href^="/"], #main a[href^="/"]')) { + if (!a.pathname.startsWith("/admin")) urls.add(a.pathname); + } + for (const url of urls) { + if (url === location.pathname) continue; + fetch(url) + .then((r) => (r.ok ? r.text() : "")) + .then((html) => { + if (!html) return; + // Off-screen parse: load the page's images and other resources + const doc = new DOMParser().parseFromString(html, "text/html"); + for (const img of doc.querySelectorAll("img")) { + const i = new Image(); + i.src = img.src; + } + }) + .catch(() => {}); + } + } + + // The path we are currently showing. location.pathname is unusable for + // this on popstate (it has already changed to the target); the editors + // signal their replaceState navigation with pagerite:preview. + let currentPath = location.pathname; + addEventListener("pagerite:preview", () => { + currentPath = location.pathname; + }); + + // --- Fetch navigation ------------------------------------------------ + async function load(url, push = true, back = false) { + // Navigating with the editor open closes it; unsaved edits are lost + // (the region swap discards the previewed changes anyway). + if (document.body.classList.contains("editing")) { + editorModule?.then((m) => m.closeEditor()); + } + let doc; + let finalUrl = url; + try { + const res = await fetch(url); + const type = res.headers.get("content-type") || ""; + if (!res.ok || !type.includes("text/html")) throw new Error("not a page"); + // Section URLs redirect to their first child; reflect that. + if (res.redirected) finalUrl = res.url; + doc = new DOMParser().parseFromString(await res.text(), "text/html"); + } catch { + location.href = url; // fall back to a normal navigation + return; + } + if (REGIONS.some((id) => !doc.getElementById(id))) { + location.href = url; + return; + } + const doit = () => { + for (const id of REGIONS) { + const el = document.getElementById(id); + el.replaceWith(document.importNode(doc.getElementById(id), true)); + } + document.title = doc.title; + // Banners may contain scripts (canvas etc.), content pages may too. + runScripts(document.getElementById("page-banner")); + runScripts(document.getElementById("main")); + applyEffects(); + }; + // Rotating cube page transition (see the FRAGILE block in style.css); + // mirrored when navigating back through history. Navigation within the + // same top-level section crossfades instead, in either direction. + if (document.startViewTransition && !reduceMotion.matches) { + const seg = (u) => new URL(u, location.href).pathname.split("/")[1]; + const fade = seg(finalUrl) === seg(currentPath); + const root = document.documentElement.classList; + root.toggle("nav-fade", fade); + root.toggle("nav-back", back && !fade); + document.startViewTransition(doit).finished.finally(() => { + root.remove("nav-fade", "nav-back"); + }); + } else { + doit(); + } + currentPath = new URL(finalUrl, location.href).pathname; + if (push) history.pushState(null, "", finalUrl); + scrollTo(0, 0); + } + + addEventListener("click", (ev) => { + if (ev.defaultPrevented || ev.button !== 0 + || ev.metaKey || ev.ctrlKey || ev.shiftKey || ev.altKey) return; + // Edit buttons toggle the editor panel docked on this page: load the + // Vue app on demand (with any extra styles) and mount it in place. + // Clicking the pen of the already-open editor closes it; clicking the + // other pen swaps the panel for the other editor type. + const editBtn = ev.target.closest("button.edit-link"); + if (editBtn && editBtn.dataset.editorSrc) { + ev.preventDefault(); + const mode = editBtn.dataset.editorMode || "page"; + if (document.body.classList.contains("editing") + && document.body.dataset.editorMode === mode) { + editorModule?.then((m) => m.closeEditor()); + return; + } + for (const css of (editBtn.dataset.editorCss || "").split(",")) { + if (css && !document.querySelector(`link[href="${css}"]`)) { + const link = document.createElement("link"); + link.rel = "stylesheet"; + link.href = css; + document.head.append(link); + } + } + const path = location.pathname.replace(/^\/+|\/+$/g, ""); + editorModule = import(/* @vite-ignore */ editBtn.dataset.editorSrc); + editorModule + .then((m) => m.openEditor(path, { mode })) + .catch(() => {}); + return; + } + const a = ev.target.closest("a[href]"); + if (!a || a.target || a.hasAttribute("download")) return; + const url = new URL(a.href, location.href); + if (url.origin !== location.origin) return; + // Same-page anchor links (footnotes etc.): let the browser handle them + if (url.pathname === location.pathname && url.hash) return; + if (url.pathname.startsWith("/_/") || url.pathname.startsWith("/static/") + || url.pathname === "/admin") return; + ev.preventDefault(); + load(url); + }); + + addEventListener("popstate", () => load(location.href, false, true)); + + applyEffects(); +})(); diff --git a/pagerite/static/pygments.css b/pagerite/static/pygments.css new file mode 100644 index 0000000..c654eea --- /dev/null +++ b/pagerite/static/pygments.css @@ -0,0 +1,86 @@ +pre { line-height: 125%; } +td.linenos .normal { color: #6e7681; background-color: #0d1117; padding-left: 5px; padding-right: 5px; } +span.linenos { color: #6e7681; background-color: #0d1117; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #e6edf3; background-color: #6e7681; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #e6edf3; background-color: #6e7681; padding-left: 5px; padding-right: 5px; } +pre code .hll { background-color: #6e7681 } +pre code { color: #E6EDF3 } +pre code .c { color: #8B949E; font-style: italic } /* Comment */ +pre code .err { color: #F85149 } /* Error */ +pre code .esc { color: #E6EDF3 } /* Escape */ +pre code .g { color: #E6EDF3 } /* Generic */ +pre code .k { color: #FF7B72 } /* Keyword */ +pre code .l { color: #A5D6FF } /* Literal */ +pre code .n { color: #E6EDF3 } /* Name */ +pre code .o { color: #FF7B72; font-weight: bold } /* Operator */ +pre code .x { color: #E6EDF3 } /* Other */ +pre code .p { color: #E6EDF3 } /* Punctuation */ +pre code .ch { color: #8B949E; font-style: italic } /* Comment.Hashbang */ +pre code .cm { color: #8B949E; font-style: italic } /* Comment.Multiline */ +pre code .cp { color: #8B949E; font-weight: bold; font-style: italic } /* Comment.Preproc */ +pre code .cpf { color: #8B949E; font-style: italic } /* Comment.PreprocFile */ +pre code .c1 { color: #8B949E; font-style: italic } /* Comment.Single */ +pre code .cs { color: #8B949E; font-weight: bold; font-style: italic } /* Comment.Special */ +pre code .gd { color: #FFA198; background-color: #490202 } /* Generic.Deleted */ +pre code .ge { color: #E6EDF3; font-style: italic } /* Generic.Emph */ +pre code .ges { color: #E6EDF3; font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +pre code .gr { color: #FFA198 } /* Generic.Error */ +pre code .gh { color: #79C0FF; font-weight: bold } /* Generic.Heading */ +pre code .gi { color: #56D364; background-color: #0F5323 } /* Generic.Inserted */ +pre code .go { color: #8B949E } /* Generic.Output */ +pre code .gp { color: #8B949E } /* Generic.Prompt */ +pre code .gs { color: #E6EDF3; font-weight: bold } /* Generic.Strong */ +pre code .gu { color: #79C0FF } /* Generic.Subheading */ +pre code .gt { color: #FF7B72 } /* Generic.Traceback */ +pre code .g-Underline { color: #E6EDF3; text-decoration: underline } /* Generic.Underline */ +pre code .kc { color: #79C0FF } /* Keyword.Constant */ +pre code .kd { color: #FF7B72 } /* Keyword.Declaration */ +pre code .kn { color: #FF7B72 } /* Keyword.Namespace */ +pre code .kp { color: #79C0FF } /* Keyword.Pseudo */ +pre code .kr { color: #FF7B72 } /* Keyword.Reserved */ +pre code .kt { color: #FF7B72 } /* Keyword.Type */ +pre code .ld { color: #79C0FF } /* Literal.Date */ +pre code .m { color: #A5D6FF } /* Literal.Number */ +pre code .s { color: #A5D6FF } /* Literal.String */ +pre code .na { color: #E6EDF3 } /* Name.Attribute */ +pre code .nb { color: #E6EDF3 } /* Name.Builtin */ +pre code .nc { color: #F0883E; font-weight: bold } /* Name.Class */ +pre code .no { color: #79C0FF; font-weight: bold } /* Name.Constant */ +pre code .nd { color: #D2A8FF; font-weight: bold } /* Name.Decorator */ +pre code .ni { color: #FFA657 } /* Name.Entity */ +pre code .ne { color: #F0883E; font-weight: bold } /* Name.Exception */ +pre code .nf { color: #D2A8FF; font-weight: bold } /* Name.Function */ +pre code .nl { color: #79C0FF; font-weight: bold } /* Name.Label */ +pre code .nn { color: #FF7B72 } /* Name.Namespace */ +pre code .nx { color: #E6EDF3 } /* Name.Other */ +pre code .py { color: #79C0FF } /* Name.Property */ +pre code .nt { color: #7EE787 } /* Name.Tag */ +pre code .nv { color: #79C0FF } /* Name.Variable */ +pre code .ow { color: #FF7B72; font-weight: bold } /* Operator.Word */ +pre code .pm { color: #E6EDF3 } /* Punctuation.Marker */ +pre code .w { color: #6E7681 } /* Text.Whitespace */ +pre code .mb { color: #A5D6FF } /* Literal.Number.Bin */ +pre code .mf { color: #A5D6FF } /* Literal.Number.Float */ +pre code .mh { color: #A5D6FF } /* Literal.Number.Hex */ +pre code .mi { color: #A5D6FF } /* Literal.Number.Integer */ +pre code .mo { color: #A5D6FF } /* Literal.Number.Oct */ +pre code .sa { color: #79C0FF } /* Literal.String.Affix */ +pre code .sb { color: #A5D6FF } /* Literal.String.Backtick */ +pre code .sc { color: #A5D6FF } /* Literal.String.Char */ +pre code .dl { color: #79C0FF } /* Literal.String.Delimiter */ +pre code .sd { color: #A5D6FF } /* Literal.String.Doc */ +pre code .s2 { color: #A5D6FF } /* Literal.String.Double */ +pre code .se { color: #79C0FF } /* Literal.String.Escape */ +pre code .sh { color: #79C0FF } /* Literal.String.Heredoc */ +pre code .si { color: #A5D6FF } /* Literal.String.Interpol */ +pre code .sx { color: #A5D6FF } /* Literal.String.Other */ +pre code .sr { color: #79C0FF } /* Literal.String.Regex */ +pre code .s1 { color: #A5D6FF } /* Literal.String.Single */ +pre code .ss { color: #A5D6FF } /* Literal.String.Symbol */ +pre code .bp { color: #E6EDF3 } /* Name.Builtin.Pseudo */ +pre code .fm { color: #D2A8FF; font-weight: bold } /* Name.Function.Magic */ +pre code .vc { color: #79C0FF } /* Name.Variable.Class */ +pre code .vg { color: #79C0FF } /* Name.Variable.Global */ +pre code .vi { color: #79C0FF } /* Name.Variable.Instance */ +pre code .vm { color: #79C0FF } /* Name.Variable.Magic */ +pre code .il { color: #A5D6FF } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/pagerite/static/style.css b/pagerite/static/style.css new file mode 100644 index 0000000..96ca89f --- /dev/null +++ b/pagerite/static/style.css @@ -0,0 +1,695 @@ +/* Shared styles for server-rendered pages and Vue components. */ +@import url("/static/fonts/fonts.css"); +@import url("/static/pygments.css"); + +:root { + color-scheme: dark; + --bg: #12101c; + --surface: #1b1830; + --text: #e8e6f2; + --muted: #9a94b8; + --accent: #00d4c8; + --accent2: #7c5cff; + --line: #ffffff1a; + /* Width of the docked editor panel (used both here for shifting the page + and in the Vue editor's own styles). */ + --editor-w: min(46rem, 50vw); +} + +* { + box-sizing: border-box; +} + +html { + scroll-behavior: smooth; +} + +body { + font-family: "Literata", Georgia, serif; + font-size: 1.05rem; + line-height: 1.65; + margin: 0; + background: var(--bg); + color: var(--text); + /* Full-bleed elements (.wide) size to 100vw, which counts the vertical + scrollbar; clip the few stray pixels instead of scrolling. */ + overflow-x: clip; + /* Full height even on short pages: the footer sits at the bottom and the + docked editor (sized by #content) never collapses. */ + min-height: 100vh; + display: flex; + flex-direction: column; +} + +#content { + flex: 1; +} + +::selection { + background: var(--accent2); +} + +/* Full-width banner: image header with the brand and nav overlaid. */ +#banner { + position: relative; + display: flex; + flex-direction: column; + justify-content: flex-end; + min-height: 11rem; + background: url("/static/banner.svg") center 40% / cover; + border-bottom: 1px solid var(--line); +} + +/* Per-page banner content (img, styled div, canvas...) overlays the + default artwork; swapped along with #nav/#main on fetch-navigation. */ +#page-banner { + position: absolute; + inset: 0; + overflow: hidden; +} + +#page-banner>* { + display: block; + width: 100%; + height: 100%; + object-fit: cover; +} + +#brand, +#nav { + position: relative; +} + +#brand { + font-family: "Fraunces", serif; + font-weight: 700; + font-size: 2.4rem; + text-decoration: none; + margin: auto 1.25rem 0; + padding-top: 1.5rem; + background: linear-gradient(90deg, var(--accent), var(--accent2)); + -webkit-background-clip: text; + background-clip: text; + color: transparent; + text-shadow: none; + filter: drop-shadow(0 0 0.1rem #000); +} + +/* Nav overlaid at the bottom of the banner */ +#nav { + font-size: 1.3em; + text-shadow: 0 0 0.1em black; + padding: 0.35rem 1.25rem; +} + +#nav ul { + list-style: none; + margin: 0; + padding: 0; + display: flex; + gap: 0.25rem 1.5rem; + flex-wrap: wrap; + align-items: baseline; +} + +#nav a { + text-decoration: none; + color: var(--text); +} + +#nav ul ul a { + color: var(--muted); +} + +#nav a:hover { + color: var(--accent); +} + +#nav span { + color: var(--muted); + font-size: 0.95rem; +} + +#nav .current { + color: var(--accent); + font-weight: 500; +} + +/* Sidebar + main row. A symmetric grid: the article column is sized by the + viewport alone (never by content), with equally sized flexible gutters + on both sides. The sidebar sits in the left gutter, so it appearing or + disappearing never shifts the article; the right gutter balances it. */ +#content { + position: relative; + display: grid; + grid-template-columns: 1fr minmax(0, 78rem) 1fr; + /* The docked editor pushes the content (not the header) right. */ + transition: margin-left 0.25s ease; +} + +body.editing #content { + margin-left: var(--editor-w); + padding-left: 1rem; + /* gap between the docked editor and the content */ + /* No overflow clipping here: .editor-host lives outside this box + (negative left), and .wide shrink-wraps to the remaining space. */ +} + +/* The sidebar's gutter space is needed by the editor instead. */ +body.editing #sidebar { + display: none; +} + +/* The editor host lives inside #content: it starts below the banner and + ends above the footer. The panel itself sticks to the viewport while + scrolling (but never taller than the content area). */ +.editor-host { + position: absolute; + top: 0; + bottom: 0; + left: calc(0px - var(--editor-w)); + width: var(--editor-w); +} + +.editor-root.overlay { + position: sticky; + top: 0; + height: 100vh; + max-height: 100%; + background: var(--bg); + animation: editor-slide-in 0.25s ease; +} + +.editor-root.overlay.closing { + transform: translateX(-100%); + transition: transform 0.25s ease; +} + +@keyframes editor-slide-in { + from { + transform: translateX(-100%); + } +} + +/* Site structure tree: while dragging, empty child lists appear as drop + zones so a page can be moved under a childless page. */ +body.tree-dragging .treelist:empty { + min-height: 1.2rem; + outline: 1px dashed var(--line); + border-radius: 4px; +} + +/* The banner's own pen: opens the site editor (banner + structure). + Qualified with `button` to beat the later .edit-link rule's left offset + (both classes apply to the same element). */ +button.banner-edit-link { + position: absolute; + top: 0.6rem; + right: 1.25rem; + left: auto; + z-index: 10; + font: inherit; + border: none; + cursor: pointer; + opacity: 0.55; + background: none; + padding: 0; +} + +.banner-edit-link:hover { + opacity: 1; +} + +#sidebar { + grid-column: 1; + /* Pinned to the page's left edge (not the article's) and kept in view + while scrolling. Translucent + blurred rather than an opaque box, so + full-bleed .wide images can pass underneath without a hard edge. */ + justify-self: start; + align-self: start; + position: sticky; + top: 0; + z-index: 1; + width: 12rem; + max-height: 100vh; + overflow-y: auto; + padding: 1rem 1rem 1rem 1.25rem; + border-radius: 0 0 0.5rem 0; + background: color-mix(in srgb, var(--bg) 75%, transparent); + backdrop-filter: blur(0.5rem); +} + +#sidebar:empty { + display: none; +} + +#sidebar ul { + list-style: none; + margin: 0; + padding: 0; + display: flex; + flex-direction: column; + gap: 0.8em; + line-height: 1.0; +} + +#sidebar a { + text-decoration: none; + color: var(--muted); +} + +#sidebar a:hover { + color: var(--accent); +} + +#sidebar .current { + color: var(--accent); + font-weight: 500; +} + +main { + grid-column: 2; + /* No top padding: a leading wide image sits flush under the banner, and + text-first pages get their spacing from the h1's top margin instead. */ + padding: 0 1.25rem 3rem; +} + +article h1, +article h2, +article h3 { + font-family: "Fraunces", serif; + font-weight: 600; + line-height: 1.25; +} + +article h1 { + font-size: 2.2rem; + margin: 2rem 0 1.2rem; + color: var(--accent); +} + +/* Margin strategy: bottom-only inside articles. Top margins misalign + column tops and collapse unpredictably; spacing comes from below. */ +article p, +article ul, +article ol, +article dl, +article blockquote, +article pre, +article figure { + margin-top: 0; + margin-bottom: 1rem; +} + +article h3 { + margin: 1.4rem 0 0.4rem; + color: color-mix(in oklab, var(--accent2) 60%, var(--muted)); +} + +/* Lists: small diamond emoji markers — blue 🔹 on odd nesting levels, + orange 🔸 on even. The marker occupies a 1em outdented box so wrapped + lines align. */ +article ul { + list-style: none; + padding-inline-start: 1em; +} + +article ul li::before { + content: "🔹"; + display: inline-block; + margin-left: -1.3em; + width: 1.3em; +} + +article ul ul li::before { + content: "🔸"; +} + +article ul ul ul li::before { + content: "🔹"; +} + +/* Task lists render emoji checkmarks (see markdown.py), no diamond. */ +article .task-list-item::before { + content: none; +} + +article { + position: relative; +} + +.edit-link { + position: absolute; + top: 0.2rem; + /* In the left gutter, on the same side as the docked editor panel. */ + left: -2.2rem; + z-index: 2; + /* stay above full-bleed .wide images */ + font: inherit; + background: none; + border: none; + padding: 0; + cursor: pointer; + opacity: 0.7; + text-shadow: 0 0 0.1em black; +} + +/* pagerite.js tucks the pen at the end of the article's first h1. */ +article h1 .edit-link { + position: static; + font-size: 1.1rem; + vertical-align: 0.3em; + margin-left: 0.4rem; +} + +.edit-link:hover { + opacity: 1; +} + +article p, +article li, +article dd { + text-align: justify; + hyphens: auto; +} + +/* Multi-column reading on wide displays, but only for long articles + (pagerite.js adds .multicol based on content length and splits the body + into .colseg segments separated by full-width h2s and wide figures; + only segments with enough text get .cols and thus columns). Columns only + reflow text inside the article; the article's width never changes. */ +@media (min-width: 100rem) { + .multicol .colseg.cols { + columns: 2; + column-gap: 3.5rem; + column-rule: 1px solid var(--line); + } +} + +.multicol .colseg { + margin-bottom: 1rem; + + p, + li { + break-inside: avoid-column; + } + + figure, + pre, + blockquote, + table, + dl { + break-inside: avoid; + } +} + +article h2 { + font-size: 1.5rem; + margin: 2.2rem 0 0.6rem; + color: var(--accent2); +} + +article a { + color: var(--accent); + text-decoration: none; +} + +article a:hover { + text-decoration: underline; +} + +/* Blockquotes: inner paragraphs carry no margins (spacing comes from the + blockquote itself, bottom-only like everything else in articles). The + negative left margin pushes the bar out past the text edge, so quoted + text aligns with the surrounding paragraphs — same trick as code blocks. */ +blockquote { + margin: 0 0 1rem -0.5rem; + padding: 0 0 0 0.25rem; + border-left: 0.25rem solid var(--accent2); + color: var(--muted); +} + +blockquote p { + margin: 0; +} + +pre { + overflow-x: auto; + padding: 0.5rem 0.8rem; + /* Code text aligns with the surrounding paragraphs: the box extends + past them by its own padding. */ + margin-left: -0.8rem; + margin-right: -0.8rem; + background: #ffffff09; + border-radius: 4px; + position: relative; +} + +/* Inline code integrates with the text, no box of its own */ +p code, +li code { + font-size: 0.85em; +} + +/* Click-to-copy button (added by pagerite.js) */ +.copy { + position: absolute; + top: 0.35rem; + right: 0.35rem; + font: inherit; + font-size: 0.75rem; + padding: 0.15rem 0.6rem; + color: var(--muted); + background: var(--bg); + border: 1px solid var(--line); + border-radius: 4px; + cursor: pointer; + opacity: 0; + transition: opacity 0.2s; +} + +pre:hover .copy, +.copy:focus-visible { + opacity: 1; +} + +.copy.copied { + color: var(--accent); +} + +code { + font-family: "Fira Code", ui-monospace, monospace; + font-size: 0.88em; +} + +table { + border-collapse: collapse; +} + +th, +td { + border: 1px solid var(--line); + padding: 0.35rem 0.8rem; +} + +/* Images and figures */ +img { + max-width: 100%; + height: auto; + border-radius: 6px; +} + +figure { + margin: 0 0 1.5rem; +} + +figcaption { + color: var(--muted); + font-size: 0.85rem; + margin-top: 0.4rem; +} + +/* Captions of full-bleed images: centered and kept to a readable width. */ +figure:has(.wide) figcaption { + max-width: 65ch; + margin-inline: auto; + text-align: center; +} + +/* Positioning via brace-attribute classes: {.right}, {.left}, {.wide} */ +figure:has(.right), +img.right { + float: right; + margin: 0.3rem 0 1rem 1.5rem; + max-width: 45%; +} + +figure:has(.left), +img.left { + float: left; + margin: 0.3rem 1.5rem 1rem 0; + max-width: 45%; +} + +/* .wide is full bleed: edge to edge of the viewport (or of the space left + of the docked editor). Centered on the article column — which is itself + centered in the available space — via margin-left: 50% + translateX(-50%). + The sidebar stacks above it (z-index + opaque background). */ +figure:has(.wide), +img.wide { + display: block; + /* no inline strut/descender gaps around the image */ + width: 100vw; + max-width: none; + margin-left: 50%; + margin-right: 0; + /* kill the UA figure margin, it overflowed the body */ + transform: translateX(-50%); +} + +/* A paragraph wrapping only a wide image must not add its line height. */ +p:has(> img.wide:only-child) { + line-height: 0; +} + +body.editing figure:has(.wide), +body.editing img.wide { + width: calc(100vw - var(--editor-w) - 1rem); +} + +/* Scroll reveal (pagerite.js adds .reveal/.in; JS off = fully visible) */ +.reveal { + opacity: 0; + translate: 0 14px; + transition: + opacity 0.6s ease, + translate 0.6s ease; +} + +.reveal.in { + opacity: 1; + translate: 0 0; +} + +@media (prefers-reduced-motion: reduce) { + html { + scroll-behavior: auto; + } + + .reveal { + opacity: 1; + translate: none; + transition: none; + } +} + +.task-list-item { + list-style: none; +} + +.footnote { + font-size: 0.85rem; + color: var(--muted); +} + +/* The footer element is kept (the editor host ends above it) but currently + empty and zero-height. */ +footer { + padding: 0; +} + +/* Rotating-cube page transition, adapted from termotohtori.fi. + FRAGILE: do not tweak; the view-transition pseudo-tree is picky. */ +::view-transition { + perspective: 1000px; + background: #000; + inset: 0; +} + +::view-transition-group(root), +::view-transition-image-pair(root) { + transform-style: preserve-3d; + isolation: auto; +} + +::view-transition-old(root), +::view-transition-new(root) { + mix-blend-mode: normal; + backface-visibility: hidden; + animation: none; +} + +@keyframes group-rotate { + to { + transform: rotateY(-90deg); + } +} + +@keyframes fade-out-a-bit { + to { + opacity: 0.5; + } +} + +@keyframes fade-in-a-bit { + from { + opacity: 0.5; + } +} + +::view-transition-group(root) { + transform-origin: 50% 50% -50vw; + animation: 300ms ease-in-out forwards group-rotate; +} + +::view-transition-old(root) { + animation: 300ms ease-in-out forwards fade-out-a-bit; +} + +::view-transition-new(root) { + transform-origin: 0 0; + transform: rotateY(90deg); + inset: 0 auto 0 100%; + animation: 300ms ease-in-out forwards fade-in-a-bit; +} + +/* Reverse direction for browser back navigation (same geometry, mirrored). */ +@keyframes group-rotate-back { + to { + transform: rotateY(90deg); + } +} + +html.nav-back::view-transition-group(root) { + animation-name: group-rotate-back; +} + +html.nav-back::view-transition-new(root) { + transform-origin: 100% 0; + transform: rotateY(-90deg); + inset: 0 100% 0 auto; +} + +/* Same-section navigation: a plain crossfade instead of the cube. These + rules only override animation/geometry, leaving the FRAGILE block's + perspective and layering untouched. The old snapshot stays fully opaque + underneath while the new one fades in on top — never a dip to black. */ +@keyframes nav-fade-in { + from { + opacity: 0; + } +} + +html.nav-fade::view-transition-group(root) { + animation: none; +} + +html.nav-fade::view-transition-old(root) { + animation: none; +} + +html.nav-fade::view-transition-new(root) { + transform: none; + inset: 0; + animation: 200ms ease-in-out nav-fade-in; +} diff --git a/pagerite/views.py b/pagerite/views.py new file mode 100644 index 0000000..4e5b15f --- /dev/null +++ b/pagerite/views.py @@ -0,0 +1,253 @@ +"""HTML rendering: page layout template, navigation, content pages. + +All pages share one static layout, defined once as an html5tagger Template +with placeholders (capitalized attributes) filled per request. The dynamic +regions carry stable ids (#nav, #main) so that the fetch-navigation script +can swap them without reloading the page chrome. + +Navigation walks the Node tree directly (see data.py): nav_html lists the +top level — the front page (slug "") is an ordinary top-level item, not +the parent of the others — and sidebar_html the children of the current +top-level section. Nodes without content are category labels; their URLs +redirect to the first child page (first_leaf). +""" + +from pathlib import Path +import json +import os + +from html5tagger import HTML, Document, E, Template + +from pagerite.data import Node, prettify, resolve, sorted_nodes +from pagerite.markdown import has_h1, render + +SITE_NAME = "Pagerite" +BUILD = Path(__file__).with_name("frontend-build") + +Layout = Template( + Document( + E.Title, + lang="en", + _urls=["/static/style.css", "/static/pagerite.js"], + ) + .header( + E.div(E.Banner, id="page-banner"), + E.BannerEdit, + E.Brand, + E.nav(E.Nav, id="nav"), + id="banner", + ) + .div( + E.aside(E.Sidebar, id="sidebar"), + E.main(E.Main, id="main"), + id="content", + ) + .footer(None), # kept empty for now; zero-height (see style.css) +) + + +def _brand_link(brand: str) -> HTML: + """Header brand link; omitted entirely when no brand is configured.""" + return HTML(str(E.a(brand, href="/", id="brand"))) if brand else HTML("") + + +def _title(slug: str, node: Node) -> str: + """Menu label: the configured title, prettified slug, "Home" fallback.""" + return node.title or prettify(slug) or "Home" + + +def _nav_link(doc, node: Node, path: str, current: str) -> None: + """Render one <li> linking the node (category labels redirect to their + first child server-side, so linking them is always fine).""" + # A top-level item is current also when viewing any of its subpages. + is_current = current == path or (path and current.startswith(f"{path}/")) + doc.li.a( + _title(path.rpartition("/")[2], node), + href=f"/{path}", + **{"class": "current"} if is_current else {}, + ) + + +def nav_html(menu: dict[str, Node], current: str) -> HTML: + """Render the contents of the #nav element for the current path. + + Top-level items in menu order; the front page (slug "", href "/") + competes by its order key like any sibling. Subitems of the current + section go to the sidebar (sidebar_html). + """ + nav = E.ul + with nav: + for slug, node in sorted_nodes(menu): + if node.published: + _nav_link(nav, node, slug, current) + return HTML(str(nav)) + + +def sidebar_html(menu: dict[str, Node], current: str) -> HTML: + """Render the contents of the #sidebar element for the current path. + + Lists the direct children of the current main level section; empty when + the path is not inside a section or the section has no children. + """ + if not current: + return HTML("") + section = current.split("/", 1)[0] + node = menu.get(section) + if node is None: + return HTML("") + nav = E.ul + with nav: + for slug, child in sorted_nodes(node.children): + if child.published: + _nav_link(nav, child, f"{section}/{slug}", current) + return HTML(str(nav)) + + +def first_leaf(menu: dict[str, Node], path: str) -> str | None: + """First published descendant page (content set) in menu order. + + This is the redirect target for content-less category labels. + """ + chain = resolve(menu, path) + if chain is None: + return None + return _first_leaf(chain[-1], path) + + +def _first_leaf(node: Node, path: str) -> str | None: + for slug, child in sorted_nodes(node.children): + cpath = f"{path}/{slug}" if path else slug + if child.published and child.content is not None: + return cpath + if (leaf := _first_leaf(child, cpath)) is not None: + return leaf + return None + + +def banner_html(menu: dict[str, Node], path: str) -> HTML: + """Resolve the banner for a path: the nearest node on the ancestor + chain (the node itself first), then the front page, then the default + CSS artwork. The front page is a top-level *sibling* of the other + main-level nodes, not their parent, so it never appears in the chain + and is consulted explicitly, last. The snippet is raw trusted HTML, + so a banner can be anything — an img, a styled div, canvas + script. + """ + source = banner_source(menu, path) + if source is None: + return HTML("") + return HTML(resolve(menu, source)[-1].banner) + + +def banner_source(menu: dict[str, Node], path: str) -> str | None: + """Which node's banner applies at ``path``: the nearest ancestor with + one set (the front page, a top-level sibling of the chain, last). + None = the default artwork.""" + chain = resolve(menu, path) or [] + segs = path.split("/") + for i in range(len(chain) - 1, -1, -1): + if chain[i].banner: + return "/".join(segs[: i + 1]) + front = menu.get("") + if front and front.banner: + return "" + return None + + +def _edit_attrs(path: str, mode: str = "page") -> dict: + """Attributes for a 🖊️ edit button. + + pagerite.js wires these buttons to dynamic-import the editor app + (data-editor-src, plus any extra styles it needs) and open the docked + editor without leaving the page. mode="page" edits content; mode="site" + (the pen on the banner) edits the banner and site structure. They are + buttons, not links: editing is an action, not a navigation. + """ + scripts, styles = _editor_assets() + return { + "type": "button", + "class": "edit-link" if mode == "page" else "edit-link banner-edit-link", + "title": "edit", + "data-editor-src": scripts[-1], + "data-editor-css": ",".join(s for s in styles if s != "/static/style.css"), + "data-editor-mode": mode, + } + + +def page_content(menu: dict[str, Node], path: str) -> HTML: + """Render the contents of the #main element for a page.""" + node = resolve(menu, path)[-1] + doc = E.article + with doc: + # An h1 in the markdown owns the article heading; the title is + # only rendered as h1 when the markdown has none of its own. + if not has_h1(node.content or ""): + doc.h1(node.title) + # All users are trusted authors for now, so the edit button is public. + doc.button("🖊️", **_edit_attrs(path)) + doc.div(HTML(render(node.content or "", path)), class_="body") + return HTML(str(doc)) + + +def render_page(menu: dict[str, Node], path: str, brand: str = SITE_NAME) -> str: + """Render a full HTML page for the slug path.""" + node = resolve(menu, path)[-1] + title = _title(path.rpartition("/")[2], node) + return str( + Layout( + Title=f"{title} – {brand}" if brand else title, + Brand=_brand_link(brand), + Nav=nav_html(menu, path), + Sidebar=sidebar_html(menu, path), + Banner=banner_html(menu, path), + BannerEdit=HTML(str(E.button("🖊️", **_edit_attrs(path, "site")))), + Main=page_content(menu, path), + ), + ) + + +def render_not_found(menu: dict[str, Node], path: str, brand: str = SITE_NAME) -> str: + """Render a 404 page within the normal layout.""" + doc = E.article + with doc: + doc.h1("Not Found") + # Editing works here too: this is how brand new pages get created. + doc.button("🖊️", **_edit_attrs(path)) + doc.p(f"No page at /{path}.") + return str( + Layout( + Title=f"Not Found – {brand}" if brand else "Not Found", + Brand=_brand_link(brand), + Nav=nav_html(menu, path), + Sidebar=sidebar_html(menu, path), + Banner=banner_html(menu, path), + BannerEdit=HTML(str(E.button("🖊️", **_edit_attrs(path, "site")))), + Main=HTML(str(doc)), + ), + ) + + +def _editor_assets() -> tuple[list[str], list[str]]: + """Script and CSS URLs for the admin editor (Vue app). + + Dev mode loads the modules from the Vite dev server; production uses + the Vite build manifest to resolve the hashed asset names. + """ + if vite_url := os.environ.get("PAGERITE_VITE_URL"): + return ( + [f"{vite_url}/@vite/client", f"{vite_url}/src/main.js"], + ["/static/style.css"], + ) + manifest = json.loads((BUILD / ".vite/manifest.json").read_text()) + entry = manifest["src/main.js"] + styles = [f"/{css}" for css in entry.get("css", [])] + return [f"/{entry['file']}"], ["/static/style.css", *styles] + + +def render_editor() -> str: + """Render the admin editor shell: a mount point for the Vue app.""" + scripts, styles = _editor_assets() + doc = Document(f"Admin – {SITE_NAME}", lang="en", _urls=styles) + for src in scripts: + doc.script("", src=src, type="module") + doc.div(None, id="app") + return str(doc) diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..82078e9 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,37 @@ +[project] +name = "pagerite" +version = "0.1.0" +description = "A single-user CMS/blog: FastAPI + kanta, Vue only for editing tools" +readme = "README.md" +requires-python = ">=3.14" +dependencies = [ + "blake3>=1.0.9", + "fastapi-vue>=1.3.1", + "fastapi[standard]>=0.141.1", + "html5tagger>=2.0.0", + "kanta>=0.8.1", + "markdown-it-py>=4.2.0", + "mdit-py-plugins>=0.6.1", + "pygments>=2.20.0", + "tracerite>=2.6.4", +] + +[project.scripts] +pagerite = "pagerite.__main__:main" + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.build] +packages = ["pagerite"] +artifacts = ["pagerite/frontend-build"] +only-packages = true + +[tool.hatch.build.targets.sdist.hooks.custom] +path = "scripts/fastapi-vue/buildhook.py" + +[dependency-groups] +dev = [ + "httpx>=0.28.1", +] diff --git a/scripts/devserver.py b/scripts/devserver.py new file mode 100755 index 0000000..453a694 --- /dev/null +++ b/scripts/devserver.py @@ -0,0 +1,88 @@ +#!/usr/bin/env -S uv run +# auto-upgrade@fastapi-vue-setup - remove this if you modify this file +"""Run Vite development server for Vue app and FastAPI backend with auto-reload.""" + +import argparse +import asyncio +import os +import sys +from contextlib import suppress +from pathlib import Path + +# Import util.py from scripts/fastapi-vue (not a package, so we adjust sys.path) +sys.path.insert(0, str(Path(__file__).with_name("fastapi-vue"))) +from devutil import ( + ProcessGroup, + check_ports_free, + logger, + ready, + setup_cli, + setup_vite, +) + +DEFAULT_VITE_PORT = 3100 +DEFAULT_DEV_PORT = 3200 +HEALTH = "/_/api/health?from=devserver.py" + + +async def run_devserver( + listen: str, + backend: str, + extra_args: list[str] | None = None, +) -> None: + """Start Vite and FastAPI dev servers with hot reload.""" + reporoot = Path(__file__).parent.parent + front = reporoot / "frontend" + if not (front / "package.json").exists(): + logger.warning("Frontend source not found at %s", front) + raise SystemExit(1) + + viteurl, npm_install, vite = setup_vite(listen, DEFAULT_VITE_PORT) + backurl, pagerite = setup_cli("pagerite", backend, DEFAULT_DEV_PORT) + + # Tell the everyone by environment (vite proxy and backend devmode use these) + os.environ["PAGERITE_VITE_URL"] = viteurl + os.environ["PAGERITE_BACKEND_URL"] = backurl + os.environ["PAGERITE_DEV"] = "1" + + async with ProcessGroup() as pg: + npm_i = await pg.spawn(*npm_install, cwd=front) + await check_ports_free(viteurl, backurl) + await pg.spawn(*pagerite, *(extra_args or [])) + await pg.wait(npm_i, ready(backurl, path=HEALTH)) + await pg.spawn(*vite, cwd=front) + + +def main() -> None: + """Parse CLI arguments and run the devserver.""" + parser = argparse.ArgumentParser( + description="Run Vite and FastAPI development servers", + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=HELP_EPILOG, + ) + parser.add_argument( + "-l", + "--listen", + metavar="addr", + help=f"Vite (default: localhost:{DEFAULT_VITE_PORT})", + ) + parser.add_argument( + "--backend", + metavar="addr", + help=f"FastAPI (default: localhost:{DEFAULT_DEV_PORT})", + ) + args, extra_args = parser.parse_known_args() + with suppress(KeyboardInterrupt): + asyncio.run(run_devserver(args.listen, args.backend, extra_args)) + + +HELP_EPILOG = """ + Other options are forwarded to pagerite [args] + + JS_RUNTIME environment variable can be used to select the JS runtime: + npm, deno, bun, or full path to the runtime executable (node maps to npm). +""" + + +if __name__ == "__main__": + main() diff --git a/scripts/fastapi-vue/buildhook.py b/scripts/fastapi-vue/buildhook.py new file mode 100644 index 0000000..407e4bf --- /dev/null +++ b/scripts/fastapi-vue/buildhook.py @@ -0,0 +1,19 @@ +# ruff: noqa: INP001 +"""Hatch build hook for building Vue frontend during package build.""" + +import sys +from pathlib import Path + +from hatchling.builders.hooks.plugin.interface import BuildHookInterface + +sys.path.insert(0, str(Path(__file__).parent)) +from buildutil import build + + +class CustomBuildHook(BuildHookInterface): # type: ignore[misc] + """Hatch build hook that builds Vue frontend during package build.""" + + def initialize(self, version: str, build_data: dict) -> None: # type: ignore[override] + """Build frontend before package is built.""" + super().initialize(version, build_data) + build("frontend") diff --git a/scripts/fastapi-vue/buildutil.py b/scripts/fastapi-vue/buildutil.py new file mode 100644 index 0000000..3150423 --- /dev/null +++ b/scripts/fastapi-vue/buildutil.py @@ -0,0 +1,231 @@ +# ruff: noqa: INP001 +"""Utilities used at build time and in devserver script. No dependencies.""" + +import logging +import os +import re +import shutil +import subprocess +from pathlib import Path + +MIN_NODE_VERSION = 20 + + +class _PrefixFormatter(logging.Formatter): + """Formatter that adds prefix based on log level.""" + + def format(self, record: logging.LogRecord) -> str: + if record.levelno >= logging.WARNING: + return f"⚠️ {record.getMessage()}" + return record.getMessage() + + +_handler = logging.StreamHandler() +_handler.setFormatter(_PrefixFormatter()) +logger = logging.getLogger("fastapi-vue") +logger.addHandler(_handler) +logger.setLevel(logging.INFO) + + +def _check_node_version(node_path: str) -> None: + """Check if Node.js version is >= 20. + + Raises RuntimeError if version is too old or cannot be determined. + """ + try: + result = subprocess.run( # noqa: S603 + [node_path, "--version"], + capture_output=True, + text=True, + check=True, + ) + version_str = result.stdout.strip() + # Parse version like "v20.10.0" or "v18.17.1" + match = re.match(r"v(\d+)", version_str) + if match: + major_version = int(match.group(1)) + if major_version >= MIN_NODE_VERSION: + return + msg = f"Node.js {version_str} found, but v{MIN_NODE_VERSION}+ required" + raise RuntimeError(msg) + except subprocess.CalledProcessError, FileNotFoundError, ValueError: + pass + msg = "Could not determine Node.js version" + raise RuntimeError(msg) + + +def _validate_npm_runtime(tool: str) -> bool: + """Validate npm runtime by checking Node.js version. Returns True if valid.""" + node_path = shutil.which("node", path=str(Path(tool).parent)) + if node_path is None: + return False + try: + _check_node_version(node_path) + except RuntimeError: + return False + return True + + +def _find_runtime_from_env(options: list[str]) -> tuple[str, str] | None: + """Find runtime specified by JS_RUNTIME environment variable.""" + js_runtime_env = os.environ.get("JS_RUNTIME") + if not js_runtime_env: + return None + + js_runtime = js_runtime_env + js_path = Path(js_runtime) + runtime_name = js_path.name + + # Map node to npm + if runtime_name == "node": + runtime_name = "npm" + js_runtime = str(js_path.parent / "npm") if js_path.parent.name else "npm" + + for option in options: + if option != runtime_name and not runtime_name.startswith(option): + continue + + tool = shutil.which(js_runtime) + if tool is None: + msg = f"JS_RUNTIME={js_runtime_env}: {option} not found" + raise RuntimeError(msg) + + if option == "npm": + node_path = shutil.which("node", path=str(Path(tool).parent)) + if node_path is None: + msg = f"JS_RUNTIME={js_runtime_env}: node not found" + raise RuntimeError(msg) + _check_node_version(node_path) + + return tool, option + + msg = f"JS_RUNTIME={js_runtime_env} not recognized" + raise RuntimeError(msg) + + +def _auto_detect_runtime(options: list[str]) -> tuple[str, str]: + """Auto-detect JavaScript runtime from available options.""" + node_version_error: RuntimeError | None = None + + for option in options: + tool = shutil.which(option) + if not tool: + continue + + if option == "npm" and not _validate_npm_runtime(tool): + try: + node_path = shutil.which("node", path=str(Path(tool).parent)) + if node_path: + _check_node_version(node_path) + except RuntimeError as e: + node_version_error = e + continue + + return tool, option + + if node_version_error: + raise node_version_error + msg = "Node.js (v20+), Deno or Bun is required but none was found" + raise RuntimeError(msg) + + +def find_js_runtime() -> tuple[str, str]: + """Find a JavaScript runtime from JS_RUNTIME env or auto-detect. + + Returns (tool_path, tool_name) where tool_name is "deno", "npm", or "bun". + Raises RuntimeError if no suitable runtime is found. + """ + options = ["npm", "deno", "bun"] + + # Check for JS_RUNTIME environment variable + if result := _find_runtime_from_env(options): + return result + + # Auto-detect + return _auto_detect_runtime(options) + + +def find_build_tool() -> tuple[list[str], list[str]]: + """Find JavaScript runtime and construct install/build commands. + + Returns (install_cmd, build_cmd) tuples of command lists. + Raises RuntimeError if no runtime is found. + """ + install = { + "deno": ("install", "--allow-scripts=npm:vue-demi"), + "npm": ("install",), + "bun": ("--bun", "install"), + } + # Run vite directly for deno to avoid npm-run-all2/run-p issues + build = { + "deno": ("run", "-A", "npm:vite", "build"), + "npm": ("run", "build"), + "bun": ("--bun", "run", "build"), + } + + tool, name = find_js_runtime() + return [tool, *install[name]], [tool, *build[name]] + + +def find_dev_tool() -> list[str]: + """Find JavaScript runtime and construct dev command. + + Returns dev_cmd (without vite-specific args). + Raises RuntimeError if no runtime is found. + """ + dev_args = { + "deno": ("run", "-A", "npm:vite"), + "npm": ("--silent", "run", "dev", "--"), + "bun": ("run", "dev", "--"), + } + + tool, name = find_js_runtime() + + if name == "bun": + logger.warning( + "Bun has a WS proxy bug (github.com/oven-sh/bun/issues/9882). Consider npm.", + ) + + return [tool, *dev_args[name]] + + +def find_install_tool() -> list[str]: + """Find JavaScript runtime and construct install command. + + Returns install_cmd. + Raises RuntimeError if no runtime is found. + """ + install_args = { + "deno": ("install", "--quiet", "--allow-scripts=npm:vue-demi"), + "npm": ("install", "--silent"), + "bun": ("install", "--silent"), + } + + tool, name = find_js_runtime() + return [tool, *install_args[name]] + + +def build(folder: str = "frontend") -> None: + """Build the frontend in the specified folder. + + Raises SystemExit(1) on failure. + """ + logger.info(">>> Building %s", folder) + + try: + install_cmd, build_cmd = find_build_tool() + except RuntimeError as e: + logger.warning(e) + raise SystemExit(1) from None + + def run(cmd: list[str]) -> None: + display_cmd = [Path(cmd[0]).stem, *cmd[1:]] + logger.info("### %s", " ".join(display_cmd)) + subprocess.run(cmd, check=True, cwd=folder) # noqa: S603 + + try: + run(install_cmd) + logger.info("") + run(build_cmd) + except subprocess.CalledProcessError: + raise SystemExit(1) from None diff --git a/scripts/fastapi-vue/devutil.py b/scripts/fastapi-vue/devutil.py new file mode 100644 index 0000000..c4f08ec --- /dev/null +++ b/scripts/fastapi-vue/devutil.py @@ -0,0 +1,226 @@ +# ruff: noqa: INP001 +"""Utilities meant for devserver script, used only in source repository with dev deps.""" + +import asyncio +import subprocess +import sys +from contextlib import suppress +from pathlib import Path +from typing import TYPE_CHECKING, Any, Self + +import httpx +from buildutil import find_dev_tool, find_install_tool, logger +from fastapi_vue.hostutil import parse_endpoint + +if TYPE_CHECKING: + from collections.abc import Coroutine + + +class ProcessGroup: + """Manage async subprocesses with automatic cleanup, like TaskGroup for processes.""" + + def __init__(self) -> None: + """Initialize empty process tracking.""" + self._procs: list[asyncio.subprocess.Process] = [] + self._cmds: dict[int, str] = {} # pid -> command name + + async def spawn( + self, + *cmd: str, + cwd: str | None = None, + ) -> asyncio.subprocess.Process: + """Spawn a subprocess and track it.""" + cmd_name = Path(cmd[0]).stem + logger.info(">>> %s", " ".join([cmd_name, *cmd[1:]])) + proc = await asyncio.create_subprocess_exec(*cmd, cwd=cwd) + self._procs.append(proc) + self._cmds[proc.pid] = cmd_name + return proc + + async def wait( + self, + *waitables: "asyncio.subprocess.Process | Coroutine[Any, Any, Any]", + ) -> None: + """Wait for processes/coroutines to complete, raise SystemExit on failure.""" + + async def wait_proc(proc: asyncio.subprocess.Process) -> None: + returncode = await proc.wait() + if returncode != 0: + cmd_name = self._cmds.get(proc.pid, "unknown") + raise subprocess.CalledProcessError(returncode, cmd_name) + + tasks = [ + wait_proc(w) if isinstance(w, asyncio.subprocess.Process) else w + for w in waitables + ] + try: + await asyncio.gather(*tasks) + except subprocess.CalledProcessError as e: + logger.warning("%s failed with exit status %d", e.cmd, e.returncode) + raise SystemExit(1) from None + + async def __aenter__(self) -> Self: + """Enter the async context manager.""" + return self + + async def __aexit__(self, exc_type: type[BaseException] | None, *_: object) -> None: + """Wait for one process to exit, terminate others, then wait for all.""" + await self._cleanup(immediate=exc_type is not None) + + async def _cleanup(self, *, immediate: bool = False) -> None: + running = [p for p in self._procs if p.returncode is None] + if not running: + return + + if not immediate: + # Wait for any one process to exit + with suppress(asyncio.CancelledError): + await asyncio.wait( + [asyncio.create_task(p.wait()) for p in running], + return_when=asyncio.FIRST_COMPLETED, + ) + + # Terminate remaining processes + for p in self._procs: + if p.returncode is None: + with suppress(ProcessLookupError): + p.terminate() + + # Wait for all to finish (with overall timeout), shielded from cancellation + still_running = [p for p in self._procs if p.returncode is None] + if still_running: + with suppress(asyncio.CancelledError): + try: + await asyncio.shield( + asyncio.wait_for( + asyncio.gather(*[p.wait() for p in still_running]), + timeout=10, + ), + ) + except TimeoutError: + for p in self._procs: + if p.returncode is None: + with suppress(ProcessLookupError): + p.kill() + await p.wait() + + +async def check_ports_free(*urls: str) -> None: + """Verify URLs are not responding (ports are free). Raise SystemExit if any respond.""" + + async def check(client: httpx.AsyncClient, url: str) -> None: + with suppress(httpx.RequestError): + res = await client.get(url, timeout=0.1) + server = res.headers.get("server", "server") + logger.warning("Conflicting %s already running at %s", server, url) + raise SystemExit(1) + + async with httpx.AsyncClient() as client: + await asyncio.gather(*[check(client, url) for url in urls]) + + +async def ready(url: str, path: str = "", max_attempts: int = 50) -> None: + """Wait for the server to be ready by polling an endpoint. + + Use empty path to disable the check and make this return immediately. + Raises SystemExit(1) if server doesn't start in time. + """ + if not path: + return + + async with httpx.AsyncClient() as client: + for attempt in range(max_attempts): + try: + await client.get(f"{url}{path}", timeout=1.0) + except httpx.RequestError: + if attempt == max_attempts - 1: + logger.warning("Backend didn't start in time") + raise SystemExit(1) from None + await asyncio.sleep(0.1) + else: + logger.info("✓ Backend ready!") + return + + +def setup_vite( + endpoint: str, + default_port: int = 5173, +) -> tuple[str, list[str], list[str]]: + """Parse frontend endpoint and build commands. + + Returns (url, install_cmd, dev_cmd). + Raises SystemExit(1) on invalid config. + """ + endpoints = parse_endpoint(endpoint, default_port) + + if "uds" in endpoints[0]: + logger.warning("Unix sockets not supported with vite devserver") + raise SystemExit(1) + + port = endpoints[0]["port"] + host = endpoints[0]["host"] + + install_cmd = find_install_tool() + dev_cmd = find_dev_tool() + if host != "localhost": + dev_cmd.append("--host" if len(endpoints) > 1 else f"--host={host}") + dev_cmd.append(f"--port={port}") + + return f"http://{host}:{port}", install_cmd, dev_cmd + + +def setup_fastapi( + endpoint: str, + module: str, + default_port: int = 8000, +) -> tuple[str, list[str]]: + """Parse backend endpoint and build uvicorn command. + + Returns (url, uvicorn_cmd). + Raises SystemExit(1) on invalid config. + """ + endpoints = parse_endpoint(endpoint, default_port) + + if "uds" in endpoints[0]: + logger.warning("Unix sockets not supported with vite devserver") + raise SystemExit(1) + + host = endpoints[0]["host"] + port = endpoints[0]["port"] + reload_dir = module.split(".", maxsplit=1)[0] # Don't reload on frontend changes + + cmd = [ + sys.executable, + "-m", + "uvicorn", + module, + f"--host={host}", + f"--port={port}", + "--reload", + f"--reload-dir={reload_dir}", + "--forwarded-allow-ips=*", + ] + return f"http://{host}:{port}", cmd + + +def setup_cli( + cli: str, + endpoint: str, + default_port: int = 8000, +) -> tuple[str, list[str]]: + """Parse backend endpoint and build CLI command. + + Returns (url, cli_cmd). + Raises SystemExit(1) on invalid config. + """ + endpoints = parse_endpoint(endpoint, default_port) + + if "uds" in endpoints[0]: + logger.warning("Unix sockets not supported with vite devserver") + raise SystemExit(1) + + host = endpoints[0]["host"] + port = endpoints[0]["port"] + + cmd = [cli, f"--listen={host}:{port}"] + return f"http://{host}:{port}", cmd diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..d1e6a11 --- /dev/null +++ b/uv.lock @@ -0,0 +1,983 @@ +version = 1 +revision = 3 +requires-python = ">=3.14" + +[[package]] +name = "annotated-doc" +version = "0.0.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/8e/38aa427ed5402449e226975b649c5dc73ccadfefeb95e6aecb8f8ea4b6b6/annotated_doc-0.0.5.tar.gz", hash = "sha256:c7e58ce09192557605d8bbd92836d7e1d520ac9580096042c0bfd197efacf1bb", size = 10758, upload-time = "2026-07-28T13:50:58.129Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3e/30/e900b21425a860e195f32e37657aa1f7c7f2b1bfb26f03ca209b90933c06/annotated_doc-0.0.5-py3-none-any.whl", hash = "sha256:117bac03a25ede5df5440e855b32d556049ca169ead221505badf432fed4b101", size = 5302, upload-time = "2026-07-28T13:50:57.239Z" }, +] + +[[package]] +name = "annotated-types" +version = "0.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5f/56/a8120250d128bed162cd73c76d45f6ef9991f3e068f62a8ee060afa3104a/annotated_types-0.8.0.tar.gz", hash = "sha256:13b2beaad985e05e2d6407ee4c4f35590b11f8d693a258a561055cac8f64cab7", size = 15893, upload-time = "2026-07-23T20:16:13.995Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/91/8acff4f5e50511b911bbccb72b8628a49c68ce14148cd9f6431094859a90/annotated_types-0.8.0-py3-none-any.whl", hash = "sha256:f072f4d804ea359e4eaf198b1af7a8b0943881a87f31bb764f8bf219bb9419e0", size = 13427, upload-time = "2026-07-23T20:16:12.938Z" }, +] + +[[package]] +name = "anyio" +version = "4.14.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/61/cc/a381afa6efea9f496eff839d4a6a1aed3bfafc7b3ab4b0d1b243a12573dd/anyio-4.14.2.tar.gz", hash = "sha256:cfa139f3ed1a23ee8f88a145ddb5ac7605b8bbfd8592baacd7ce3d8bb4313c7f", size = 260176, upload-time = "2026-07-12T20:29:07.082Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/35/f2287558c17e29fafc8ef3daf819bb9834061cfa43bff8014f7df7f63bdc/anyio-4.14.2-py3-none-any.whl", hash = "sha256:9f505dda5ac9f0c8309b5e8bd445a8c2bf7246f3ce950121e45ea15bc41d1494", size = 125813, upload-time = "2026-07-12T20:29:05.763Z" }, +] + +[[package]] +name = "blake3" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/6a/4cc5a9dd40fd8a6d283fd3761e5f59c490109571ef8e3c73245417e5a305/blake3-1.0.9.tar.gz", hash = "sha256:5fa374fa5070ca084368776c19b420157eb0f2d3f091343d6bc59189929d62e2", size = 116872, upload-time = "2026-06-22T18:02:25.366Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/4b/b2dd7c25378a3b5de30ed908d38e6427bc4c644c0c12e8359361abd3a9ca/blake3-1.0.9-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:ab0c030cf6644c30e786b0e785bde4e4596013ae9ea6ce9877e39d52383e25d7", size = 345406, upload-time = "2026-06-22T18:01:10.311Z" }, + { url = "https://files.pythonhosted.org/packages/c6/dc/c0dab2963ddf04a4a938363f61716f9b75de6d3a9bc4a89e78f0854d4d31/blake3-1.0.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:83b4a2336105af3800f7e17ac4b943f293a3927a2d66a6308d50dba944a6953e", size = 330077, upload-time = "2026-06-22T18:01:11.926Z" }, + { url = "https://files.pythonhosted.org/packages/20/f1/d03950a86d105a6332a8c422cb87658a7d247e214f1ea8f29ed09ff04e00/blake3-1.0.9-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95fc3545f80901b0dcd0508d16bc40f15ae39556709fa6cf86675f742d4f3c9c", size = 375147, upload-time = "2026-06-22T18:01:13.198Z" }, + { url = "https://files.pythonhosted.org/packages/10/75/711b1842e0a90aaad6a1c9a9022e90aa16206ac1f224516118bc24482532/blake3-1.0.9-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1bd981dc318c05375c3160a99df493b7cc4c83fffa1a34d14b18a071b47b262b", size = 373711, upload-time = "2026-06-22T18:01:14.606Z" }, + { url = "https://files.pythonhosted.org/packages/9e/a0/f512799d1d0c0b4718fa6f0e99ccbe108e98bac7bf82c200803a62b57876/blake3-1.0.9-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:689a7e4069de681d9c5d9445b8b6473ee880ad04d7960a6789c60bd788980250", size = 446993, upload-time = "2026-06-22T18:01:15.924Z" }, + { url = "https://files.pythonhosted.org/packages/60/fb/6636ae8a46fc3352694188f5a5a325567782bc88fd1823b0b67be2c92184/blake3-1.0.9-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8adb0b0032e53919ee95b3d4f911448d3268316c28cd7df232ff2a1e7c9a4ba4", size = 488478, upload-time = "2026-06-22T18:01:17.271Z" }, + { url = "https://files.pythonhosted.org/packages/1e/c5/a2b3c086f7e37c9db6017dc2890a76ad2a729e4a554896e855e511811e6b/blake3-1.0.9-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32bd4521ec2d477627ad93eb70f9ac4d01e12d1489024159bcaeff79466332f6", size = 384900, upload-time = "2026-06-22T18:01:18.802Z" }, + { url = "https://files.pythonhosted.org/packages/e1/b8/1298806dd6c464a6f807df24c9640ad3bf27ee54ff4de82b2b5a823a8aba/blake3-1.0.9-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f65d77eb05331495485048f6804f53885b192b998acb7e6fe1487d941bf08435", size = 384333, upload-time = "2026-06-22T18:01:20.35Z" }, + { url = "https://files.pythonhosted.org/packages/3c/cc/0c29d9404155adfd6db716e9765d36ea6cbed287060759f5d764f0d9d99e/blake3-1.0.9-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:ca7dfe8fb197ff8a3f5c915424183ccd52a99e8afb12680f51b2e1f4c9c6c97f", size = 381142, upload-time = "2026-06-22T18:01:21.744Z" }, + { url = "https://files.pythonhosted.org/packages/d6/91/9af20d563f0ced71e08a60fc0ee534146da4e265710ed6792d5d799f4c0f/blake3-1.0.9-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:f5c9d57f0dcb92243b6ae575c3065793edc9df9008d0ebd98d8245cdeb7c3f84", size = 550587, upload-time = "2026-06-22T18:01:23.381Z" }, + { url = "https://files.pythonhosted.org/packages/d0/fa/06f46fc0aa486b799d776f9a80ed0b3605e2be1570cf48007860948aa5d9/blake3-1.0.9-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:172d44245a19dfec08ab771c1b7a506b97783163cdc65f559fe020007e403c99", size = 591888, upload-time = "2026-06-22T18:01:24.805Z" }, + { url = "https://files.pythonhosted.org/packages/50/68/d6198f4069a7c4a184ed854df45b82cc3e2d4b0be476b2a3ee65ad2344cf/blake3-1.0.9-cp314-cp314-win32.whl", hash = "sha256:249e5964fa9e768924bc7cc3d4efe75a425bb5dd3fb7671c3eda8eeddfa50591", size = 229410, upload-time = "2026-06-22T18:01:26.24Z" }, + { url = "https://files.pythonhosted.org/packages/63/ab/f29af72a8312b3827b50e55491f1bf9ae2347591de5c47365c5cbd2525a9/blake3-1.0.9-cp314-cp314-win_amd64.whl", hash = "sha256:0aba416bb2e3ef0c65e74d5eba21062483c714cd78e7e303c9d03c547fc7d015", size = 218526, upload-time = "2026-06-22T18:01:27.779Z" }, + { url = "https://files.pythonhosted.org/packages/47/7e/d932fe437ccf656cfba77abc466fb3d1a0ce3c31df92e760d9e4c34932b4/blake3-1.0.9-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:5b35abe24a66a7b3db423eb4f8668ed7be1a362aa9c0024ab6483ec0b2c16058", size = 345049, upload-time = "2026-06-22T18:01:29.228Z" }, + { url = "https://files.pythonhosted.org/packages/55/1e/d92fb284fcacf86f5d1083e29d0a8c834b60432786928915238d9760f514/blake3-1.0.9-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1bbdff61e049297ef3180867ce1f079cea7e5b372fd76953c3183da5b8124206", size = 329367, upload-time = "2026-06-22T18:01:30.566Z" }, + { url = "https://files.pythonhosted.org/packages/9d/da/e25fa75d5bfea4527fc21024dde86a9376db798e469a084741968299f215/blake3-1.0.9-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09a69fcedf06785bb81d4d3d39f95ee65dbaf2cb246e174cfc9ff64d027f7551", size = 374203, upload-time = "2026-06-22T18:01:31.998Z" }, + { url = "https://files.pythonhosted.org/packages/4f/4d/0224916202b773dfdf08dcbe4ed1ad1018d4ddcd4df7a7e2978d28f89b74/blake3-1.0.9-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b5d5bf0f68cd77108a942c95db98e960d9c3d5643b95172f783822ce22667759", size = 373713, upload-time = "2026-06-22T18:01:33.387Z" }, + { url = "https://files.pythonhosted.org/packages/b8/e5/4ba968831b7afaec431c588c826cef76a96d6d6976188ed07d932072e673/blake3-1.0.9-cp314-cp314t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9767f16199b99aa022b61ff825ac4dbd39864bf637ae712605a2ce1f8b6a55e0", size = 446574, upload-time = "2026-06-22T18:01:34.687Z" }, + { url = "https://files.pythonhosted.org/packages/ac/f5/08a9099c7177f282d2563abe4f7cc626c636642f7979cf58f2ab7ded2096/blake3-1.0.9-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4865a8cfb2b3d7c0baf5267f2fa6816a3384e836cd1bd0caf359f406cb1e8fba", size = 487232, upload-time = "2026-06-22T18:01:36.131Z" }, + { url = "https://files.pythonhosted.org/packages/76/16/9392bf1ebc81b5b09ce58b94613fa2d37308e825ff2dc7b54d00ee622c77/blake3-1.0.9-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:42609e4adc4b2d7423137f2cb35135bca598b925c5af09d2bc0a2c368b25aeb1", size = 384751, upload-time = "2026-06-22T18:01:37.512Z" }, + { url = "https://files.pythonhosted.org/packages/84/fc/b6e9aef02ca14ef62fa47783b9eeeb5b2d3f73fdf698d8bb94c36f5dd69f/blake3-1.0.9-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7f648fa425138452d1e585ac625c7aefddb946d9765906c4c12d564a1523cd8", size = 384546, upload-time = "2026-06-22T18:01:38.868Z" }, + { url = "https://files.pythonhosted.org/packages/ff/cb/452e92dba9402b36a953aa8b9b06253445ccce43dcd0bcf521c5e3c3e15d/blake3-1.0.9-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:9cef6d4d07a7de0c44f5ba17f6383d55276d9efc8d601f75113538fcaa35008b", size = 380596, upload-time = "2026-06-22T18:01:40.412Z" }, + { url = "https://files.pythonhosted.org/packages/b2/01/7a84a7e10c5d14e6ed8a4403bd7f64c1e01f8ebabea0d6fe5f093b894cbd/blake3-1.0.9-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:28404301de485e9546365d01b30f65eaa835520c4211d6ef61242975b6722b60", size = 550032, upload-time = "2026-06-22T18:01:41.955Z" }, + { url = "https://files.pythonhosted.org/packages/58/7d/7aea0222f59cf84044ec52e2bfdaa0e3c355d221292b0ea1b722cf1edd6c/blake3-1.0.9-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:8a99f896e7718050ed033a888245098aab3d6a5338f91cc9450c563b53f90ad5", size = 592244, upload-time = "2026-06-22T18:01:43.426Z" }, + { url = "https://files.pythonhosted.org/packages/c0/e5/b44c230108745ff9c70c7bbafe22563772bc0c22322a8d15c10455f6ca02/blake3-1.0.9-cp314-cp314t-win32.whl", hash = "sha256:021309d760b390706fecf13498f9a25aa8f689bbb65a0896029b8fa223aae18b", size = 229481, upload-time = "2026-06-22T18:01:45.307Z" }, + { url = "https://files.pythonhosted.org/packages/ec/a6/ac03f37dc9aeebf398d42089720648b3bc8438e733d3e522196c5d12ab39/blake3-1.0.9-cp314-cp314t-win_amd64.whl", hash = "sha256:5ea0c60dd9c1e3d05610606579e4bf80f562854c46ed55f9ee8545e18987a480", size = 217979, upload-time = "2026-06-22T18:01:46.629Z" }, +] + +[[package]] +name = "certifi" +version = "2026.7.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/c2/24167ea9858356b47a87a50d39908bfdb72ceeefe0041586e704e5376b3a/certifi-2026.7.22.tar.gz", hash = "sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55", size = 138112, upload-time = "2026-07-22T03:35:12.644Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl", hash = "sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775", size = 136983, upload-time = "2026-07-22T03:35:11.276Z" }, +] + +[[package]] +name = "click" +version = "8.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/76/d4/81420972a676e8ffea40450d8c8c92943e7218a78fe9b64359836cc9876b/click-8.4.2.tar.gz", hash = "sha256:9a6cea6e60b17ebe0a44c5cc636d94f09bd66142c1cd7d8b4cd731c4917a15f6", size = 338000, upload-time = "2026-06-24T17:45:15.148Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/e2/79c688af8b210d232694e31e59da9f6ec747bae31c3f5946e4e9b98860d5/click-8.4.2-py3-none-any.whl", hash = "sha256:e6f9f66136c816745b9d65817da91d61d957fb16e02e4dcd0552553c5a197b76", size = 119243, upload-time = "2026-06-24T17:45:13.73Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "detect-installer" +version = "0.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5f/ce/6897d812825e9d4c53e3c7112726e800cc5231b013b2223bf64f653ff362/detect_installer-0.1.0.tar.gz", hash = "sha256:00ad7ba0a36e3cf7d08a40d3643011746dbc112597c7d475cc91c416710ca4e7", size = 3049, upload-time = "2026-02-23T10:40:22.567Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/34/8cc73273414405086c58852916e4031812a6a30fe04c057e37ad99397b7f/detect_installer-0.1.0-py3-none-any.whl", hash = "sha256:034fb20fd665c36e6ba52b8821525ea07fb4f7f938cac459df889fb33801528a", size = 4539, upload-time = "2026-02-23T10:40:23.807Z" }, +] + +[[package]] +name = "dnspython" +version = "2.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/8b/57666417c0f90f08bcafa776861060426765fdb422eb10212086fb811d26/dnspython-2.8.0.tar.gz", hash = "sha256:181d3c6996452cb1189c4046c61599b84a5a86e099562ffde77d26984ff26d0f", size = 368251, upload-time = "2025-09-07T18:58:00.022Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl", hash = "sha256:01d9bbc4a2d76bf0db7c1f729812ded6d912bd318d3b1cf81d30c0f845dbf3af", size = 331094, upload-time = "2025-09-07T18:57:58.071Z" }, +] + +[[package]] +name = "email-validator" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dnspython" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f5/22/900cb125c76b7aaa450ce02fd727f452243f2e91a61af068b40adba60ea9/email_validator-2.3.0.tar.gz", hash = "sha256:9fc05c37f2f6cf439ff414f8fc46d917929974a82244c20eb10231ba60c54426", size = 51238, upload-time = "2025-08-26T13:09:06.831Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl", hash = "sha256:80f13f623413e6b197ae73bb10bf4eb0908faf509ad8362c5edeb0be7fd450b4", size = 35604, upload-time = "2025-08-26T13:09:05.858Z" }, +] + +[[package]] +name = "fastapi" +version = "0.141.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-doc" }, + { name = "pydantic" }, + { name = "starlette" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8a/02/91e3416a8fdd715abb903a952a6bec7cdd8d14eed55d415fc8595524c319/fastapi-0.141.1.tar.gz", hash = "sha256:e8822fc40db1e1858054d7a949a888695bc9bdce70139178e33bd2871a453ca1", size = 425799, upload-time = "2026-07-29T17:18:05.568Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/03/10388a42375ee7e4ac9b94eb2c5c569c8b5795e377e701c9ac3ad63de890/fastapi-0.141.1-py3-none-any.whl", hash = "sha256:bfb91aa2d334c61cb35ba9a116fc123b3d3df31640b801cf57a7a78ec3f603b3", size = 131954, upload-time = "2026-07-29T17:18:04.364Z" }, +] + +[package.optional-dependencies] +standard = [ + { name = "email-validator" }, + { name = "fastapi-cli", extra = ["standard"] }, + { name = "fastar" }, + { name = "httpx" }, + { name = "jinja2" }, + { name = "pydantic-extra-types" }, + { name = "pydantic-settings" }, + { name = "python-multipart" }, + { name = "uvicorn", extra = ["standard"] }, +] + +[[package]] +name = "fastapi-cli" +version = "0.0.32" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "rich-toolkit" }, + { name = "typer" }, + { name = "uvicorn", extra = ["standard"] }, +] +sdist = { url = "https://files.pythonhosted.org/packages/33/eb/3b534c6f8e157f9ddbf2a153512307c886cad0b258739c200dd8ff8c4452/fastapi_cli-0.0.32.tar.gz", hash = "sha256:38024d2345275e1b37ce8848727a580d84901b570e96b3256d9d36a9a5039424", size = 26636, upload-time = "2026-07-16T12:16:58.678Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d5/53/56ae5ae17bb0a5d89d1d31e5320eb1865553ebbfbde91cdc4c221245f2a8/fastapi_cli-0.0.32-py3-none-any.whl", hash = "sha256:8dcc286fa32f01bbd3f65dd09cfd5a2540ed5f2230b77db7fd30978d6165f3c4", size = 14670, upload-time = "2026-07-16T12:16:57.297Z" }, +] + +[package.optional-dependencies] +standard = [ + { name = "fastapi-cloud-cli" }, + { name = "uvicorn", extra = ["standard"] }, +] + +[[package]] +name = "fastapi-cloud-cli" +version = "0.23.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "detect-installer" }, + { name = "fastar" }, + { name = "httpx" }, + { name = "pydantic", extra = ["email"] }, + { name = "rich-toolkit" }, + { name = "rignore" }, + { name = "sentry-sdk" }, + { name = "typer" }, + { name = "uvicorn", extra = ["standard"] }, +] +sdist = { url = "https://files.pythonhosted.org/packages/00/dc/63aaf9913f455e39a7027c27140edd887a87d47d65ac43532d77a51718e5/fastapi_cloud_cli-0.23.0.tar.gz", hash = "sha256:840895bb8d14309aeffc905e0dcd1334d18c6f5da54b735413a8f1cb385e581e", size = 95295, upload-time = "2026-07-28T14:03:33.463Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/96/7e9aba6fabce3cb05f320abeef5b81efd5134823ae85d1a517872cb83cbc/fastapi_cloud_cli-0.23.0-py3-none-any.whl", hash = "sha256:1cd2ffa56e92e92c1fc63acc426c214dd928cbeed2a4c7c6a9a5fc85ea73de16", size = 78058, upload-time = "2026-07-28T14:03:34.386Z" }, +] + +[[package]] +name = "fastapi-vue" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "blake3" }, + { name = "fastapi" }, + { name = "zstandard" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/16/7d/2ce1a890f5f9317a50f7468fa38f8f92801342c3a0c74a4656f9053f3cc2/fastapi_vue-1.3.1.tar.gz", hash = "sha256:17b6388f005db7f13a569eb886c2ae4aeb694138111aa7740e024d6a141168ad", size = 7752, upload-time = "2026-03-08T17:31:04.69Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/f4/9246d90c475fb9255129d89983d0638f16bc3be12b95160fdd31cbe51947/fastapi_vue-1.3.1-py3-none-any.whl", hash = "sha256:981a86658267526889291bc307a561134aada162e86abc8faf31159e1385a68b", size = 9314, upload-time = "2026-03-08T17:31:03.784Z" }, +] + +[[package]] +name = "fastar" +version = "0.11.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/03/0f/0aeb3fc50046617702acc0078b277b58367fd62eb727b9ec733ae0e8bbcc/fastar-0.11.0.tar.gz", hash = "sha256:aa7f100f7313c03fdb20f1385927ba95671071ba308ad0c1763fef295e1895ce", size = 70238, upload-time = "2026-04-13T17:11:17.143Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/cd/3644c48ecac456f928c12d47ec3bed36c36555b17c3859856f1ff860265d/fastar-0.11.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:71375bd6f03c2a43eb47bd949ea38ff45434917f9cdac79675c5b9f60de4fa73", size = 707860, upload-time = "2026-04-13T17:10:00.371Z" }, + { url = "https://files.pythonhosted.org/packages/69/ca/dee04476ae3626b2b040a60ad84628f77e1ffd8444232f2426b0ca1e0d7e/fastar-0.11.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:eddfd9cab16e19ae247fe44bf992cb403ccfe27d3931d6de29a4695d95ad386c", size = 628216, upload-time = "2026-04-13T17:09:45.355Z" }, + { url = "https://files.pythonhosted.org/packages/dc/5e/9395c7353d079cb4f5be0f7982ce0dc9f2e7dec5fd175eef466729d6023a/fastar-0.11.0-cp314-cp314-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7c371f1d4386c699018bb64eb2fa785feacf32785559049d2bb72fe4af023f53", size = 864378, upload-time = "2026-04-13T17:09:14.611Z" }, + { url = "https://files.pythonhosted.org/packages/fa/ba/1e4f67148223ff219612b6281a6000357abbcc2417964fa5c83f11d68fce/fastar-0.11.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cad7fa41e3e66554387481c1a09365e4638becd322904932674159d5f4046728", size = 760921, upload-time = "2026-04-13T17:07:59.138Z" }, + { url = "https://files.pythonhosted.org/packages/0f/82/09d11fb6d12f17993ffaf32ffd30c3c121a11e2966e84f19fb6f66430118/fastar-0.11.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cf36652fa71b83761717c9899b98732498f8a2cb6327ff16bbf07f6be85c3437", size = 757012, upload-time = "2026-04-13T17:08:14.186Z" }, + { url = "https://files.pythonhosted.org/packages/52/1f/5aeeacc4cb65615e2c9292cd9c5b0cd6fb6d2e6ee472ca6adc6c1b1b22ef/fastar-0.11.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f68ff8c17833053da4841720e95edde80ce45bb994b6b7d51418dddaac70ee47", size = 924510, upload-time = "2026-04-13T17:08:28.741Z" }, + { url = "https://files.pythonhosted.org/packages/bb/1a/1e5bdabbeaf2e856928956292609f2ff6a650f94480fb8afaca30229e483/fastar-0.11.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4563ed37a12ea1cdc398af8571258d24b988bf342b7b3bf5451bd5891243280c", size = 816602, upload-time = "2026-04-13T17:08:59.461Z" }, + { url = "https://files.pythonhosted.org/packages/87/24/f960147910da3bed41a3adfcb026e17d5f50f4cf467a3324237a7088f61a/fastar-0.11.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cee63c9875cba3b70dc44338c560facc5d6e763047dcc4a30501f9a68cf5f890", size = 819452, upload-time = "2026-04-13T17:09:29.926Z" }, + { url = "https://files.pythonhosted.org/packages/cc/f4/3e77d7901d5707fd7f8a352e153c8ae09ea974e6fabad0b7c4eb9944b8d4/fastar-0.11.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:bd76bfffae6d0a91f4ac4a612f721e7aec108db97dccdd120ae063cd66959f27", size = 885254, upload-time = "2026-04-13T17:08:44.285Z" }, + { url = "https://files.pythonhosted.org/packages/47/01/1585edd5ec47782ae93cd94edf05828e0ab02ef00aec00aea4194a600464/fastar-0.11.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8f5b707501ec01c1bc0518f741f01d322e50c9adc19a451aa24f67a2316e9397", size = 971496, upload-time = "2026-04-13T17:10:17.024Z" }, + { url = "https://files.pythonhosted.org/packages/f1/e9/6874c9d1236ded565a0bed54b320ac9f165f287b1d89490fb70f9f323c81/fastar-0.11.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:37c0b5a88a657839aad98b0a6c9e4ac4c2c15d6b49c44ee3935c6b08e9d3e479", size = 1034685, upload-time = "2026-04-13T17:10:34.063Z" }, + { url = "https://files.pythonhosted.org/packages/14/d8/4ab20613ce2983427aee958e39be878dba874aa227c530a845e32429c4f6/fastar-0.11.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:6c55f536c62a6efb180c1af0d5182948bff576bbfe6276e8e1359c9c7d2215d8", size = 1072675, upload-time = "2026-04-13T17:10:50.53Z" }, + { url = "https://files.pythonhosted.org/packages/1f/ae/5ac3b7c20ce4b08f011dd2b979f96caabe64f9b10b157f211ea91bdfadca/fastar-0.11.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3082eeca59e189b9039335862f4c2780c0c8871d656bfdf559db4414a105b251", size = 1029330, upload-time = "2026-04-13T17:11:08.138Z" }, + { url = "https://files.pythonhosted.org/packages/8a/e7/37cd6a1d4e288292170b64e19d79ecce2a7de8bb76790323399a2abc4619/fastar-0.11.0-cp314-cp314-win32.whl", hash = "sha256:b201a0a4e29f9fec2a177e13154b8725ec65ab9f83bd6415483efaa2aa18344b", size = 453940, upload-time = "2026-04-13T17:11:48.713Z" }, + { url = "https://files.pythonhosted.org/packages/ff/1c/795c878b1ee29d79021cf8ed81f18f2b25ccde58453b0d34b9bdc7e025ea/fastar-0.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:868fddb26072a43e870a8819134b9f80ee602931be5a76e6fb873e04da343637", size = 486334, upload-time = "2026-04-13T17:11:34.882Z" }, + { url = "https://files.pythonhosted.org/packages/ff/a4/113f104301df8bddcc0b3775b611a30cb7610baa3add933c7ccac9386467/fastar-0.11.0-cp314-cp314-win_arm64.whl", hash = "sha256:3db39c9cc42abb0c780a26b299f24dfbc8be455985e969e15336d70d7b2f833b", size = 461534, upload-time = "2026-04-13T17:11:24.329Z" }, + { url = "https://files.pythonhosted.org/packages/5a/a6/5c5f2c2c8e0c63e56a5636ebc7721589c889e94c0092cec7eb28ae7207e6/fastar-0.11.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:49c3299dec5e125e7ebaa27545714da9c7391777366015427e0ae62d548b442b", size = 707156, upload-time = "2026-04-13T17:10:02.176Z" }, + { url = "https://files.pythonhosted.org/packages/df/f7/982c01b61f0fc135ad2b16d01e6d0ee53cf8791e68827f5f7c5a65b2e5b1/fastar-0.11.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3328ed1ed56d31f5198350b17dd60449b8d6b9d47abb4688bab6aef4450a165b", size = 627032, upload-time = "2026-04-13T17:09:46.978Z" }, + { url = "https://files.pythonhosted.org/packages/2b/c3/38f1dac77ae0c71c37b176277c96d830796b8ce2fe69705f917829b53829/fastar-0.11.0-cp314-cp314t-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:bd3eca3bbfec84a614bcb4143b4ad4f784d0895babc26cfc88436af88ca23c7a", size = 864403, upload-time = "2026-04-13T17:09:16.58Z" }, + { url = "https://files.pythonhosted.org/packages/6e/f0/e69c363bdb3e5a5848e937b662b5469581ee6682c51bc1c0556494773929/fastar-0.11.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff86a967acb0d621dd24063dda090daa67bf4993b9570e97fe156de88a9006ca", size = 759480, upload-time = "2026-04-13T17:08:00.599Z" }, + { url = "https://files.pythonhosted.org/packages/3b/29/4d8737590c2a6357d614d7cc7288e8f68e7e449680b8922997cc4349e65e/fastar-0.11.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:86eaf7c0e985d93a7734168be2fb232b2a8cca53e41431c2782d7c12b12c03b1", size = 756219, upload-time = "2026-04-13T17:08:15.699Z" }, + { url = "https://files.pythonhosted.org/packages/bb/ec/400de7b3b7d48801908f19cf5462177104395799472671b3e8152b2b04ca/fastar-0.11.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91f07b0b8eb67e2f177733a1f884edad7dfb9f8977ffef15927b20cb9604027d", size = 923669, upload-time = "2026-04-13T17:08:30.574Z" }, + { url = "https://files.pythonhosted.org/packages/5d/01/8926c53da923fed7ab4b96e7fbf7f73b663beb4f02095b654d6fab46f9ad/fastar-0.11.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f85c896885eb4abf1a635d54dea22cac6ae48d04fc2ea26ae652fcf1febe1220", size = 815729, upload-time = "2026-04-13T17:09:01.204Z" }, + { url = "https://files.pythonhosted.org/packages/89/f0/5fef4c7946e352651b504b1a4235dac3505e7cfd24020788ab50552e84bf/fastar-0.11.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:075c07095c8de4b774ba8f28b9c0a02b1a2cd254da50cbe464dd3bb2432e9158", size = 819812, upload-time = "2026-04-13T17:09:31.907Z" }, + { url = "https://files.pythonhosted.org/packages/b3/c8/0ebc3298b4a45e7bddc50b169ae6a6f5b80c939394d4befe6e60de535ee7/fastar-0.11.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:07f028933820c65750baf3383b807ecce1cd9385cf00ce192b79d263ad6b856c", size = 884074, upload-time = "2026-04-13T17:08:45.802Z" }, + { url = "https://files.pythonhosted.org/packages/ae/9f/7baa4cdff8d6fbca41fa5c764b48a941fed8a9ec6c4cc92de65895a28299/fastar-0.11.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:039f875efa0f01fa43c20bf4e2fc7305489c61d0ac76eda991acfba7820a0e63", size = 969450, upload-time = "2026-04-13T17:10:18.667Z" }, + { url = "https://files.pythonhosted.org/packages/d4/dc/1ebbfb58a47056ba866494f19efbcdd2ba2897096b94f36e796594b4d05b/fastar-0.11.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:fff12452a9a5c6814a012445f26365541cc3d99dcca61f09762e6a389f7a32ea", size = 1033775, upload-time = "2026-04-13T17:10:36.165Z" }, + { url = "https://files.pythonhosted.org/packages/c2/5f/ce4e3914066f08c99eb8c32952cc07c1a013e81b1db1b0f598130bf6b974/fastar-0.11.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:2bf733e09f942b6fa876efe30a90508d1f4caef5630c00fb2a84fba355873712", size = 1072158, upload-time = "2026-04-13T17:10:52.497Z" }, + { url = "https://files.pythonhosted.org/packages/03/2a/6bca72992c84151c387cc6558f3867f5ebe5fb3684ee6fa9b76280ba4b8e/fastar-0.11.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d1531fa848fdd3677d2dce0a4b436ea64d9ae38fb8babe2ddbc180dd153cb7a3", size = 1028577, upload-time = "2026-04-13T17:11:09.934Z" }, + { url = "https://files.pythonhosted.org/packages/83/18/7a7c15657a3da5569b26fc51cde6a80f8d84cb54b3b1aea6d74a103db4ad/fastar-0.11.0-cp314-cp314t-win32.whl", hash = "sha256:5744551bc67c6fc6581cbd0e34a0fd6e2cd0bd30b43e94b1c3119cf35064b162", size = 453601, upload-time = "2026-04-13T17:11:53.726Z" }, + { url = "https://files.pythonhosted.org/packages/6d/d8/331b59a6de279f3ad75c10c02c40a12f21d64a437d9c3d6f1af2dcbd7a76/fastar-0.11.0-cp314-cp314t-win_amd64.whl", hash = "sha256:f4ce44e3b56c47cf38244b98d29f269b259740a580c47a2552efa5b96a5458fb", size = 486436, upload-time = "2026-04-13T17:11:40.089Z" }, + { url = "https://files.pythonhosted.org/packages/6b/fd/5390ec4f49100f3ecb9968a392f9e6d039f1e3fe0ecd28443716ff01e589/fastar-0.11.0-cp314-cp314t-win_arm64.whl", hash = "sha256:76c1359314355eafbc6989f20fb1ad565a3d10200117923b9da765a17e2f6f11", size = 461049, upload-time = "2026-04-13T17:11:25.918Z" }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, +] + +[[package]] +name = "html5tagger" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7c/f2/1f61d4a121c5b37018bbd1d4cd010dce42f5b519c7552acd5fac1289635e/html5tagger-2.0.0.tar.gz", hash = "sha256:0dee3c9054443930e9a3225edcc810b6df76c0aeabfee463e9437a90a1ac1624", size = 15383, upload-time = "2026-07-10T01:52:04.747Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/d7/410f7b8109958405f6fb3d104f094e2a96f9d5b2670de73a68fb1fbc391f/html5tagger-2.0.0-py3-none-any.whl", hash = "sha256:c7a46fa74c81fdbd33b7e4a9630f4d592ec818181fc58702585e9bad0b76f891", size = 17783, upload-time = "2026-07-10T01:52:03.532Z" }, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, +] + +[[package]] +name = "httptools" +version = "0.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/e5/d471fcb0e14523fe1c3f4ba58ca52480e7bd70ad7109a3846bc75892f7fb/httptools-0.8.0.tar.gz", hash = "sha256:6b2a32f18d97e16e90827d7a819ffa8dbd8cc245fc4e1fa9d1095b54ef4bd999", size = 271342, upload-time = "2026-05-25T22:17:48.841Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1a/12/fa3fbf5f9517b273edea2dc982aa82a8c634091e67c590792b729017bc6f/httptools-0.8.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:de242a49b5d18e0a8776e654e9f6bf6d89f3875a5c35b425a0e7ce940feb3fd6", size = 206183, upload-time = "2026-05-25T22:17:24.004Z" }, + { url = "https://files.pythonhosted.org/packages/30/fc/5e7c4cb443370f2090a3aba0453a07384d29ff66b7435bb90e77e1037599/httptools-0.8.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:159e9ab5f701ccd42e555a12f1ad8ff69702910fc1c996cf2bb66e5fcb7a231b", size = 112079, upload-time = "2026-05-25T22:17:25.216Z" }, + { url = "https://files.pythonhosted.org/packages/ba/53/771bd891eb0f236f32145d6a1775777ec85745f3cc983a1f23d1a3b8ddfe/httptools-0.8.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c4a9f1707e4823d54dfec6c33fa3697d302aed536ed352a7ebb5a061ddb869d0", size = 481596, upload-time = "2026-05-25T22:17:26.186Z" }, + { url = "https://files.pythonhosted.org/packages/62/42/94e15bc68ce3d423243c45d7f1b0c7561f13844f97dc52ae23182fb65628/httptools-0.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d76ad7b951387e3632c8716a9bb03ac5b45c5f16119aa409db0459520887944e", size = 480865, upload-time = "2026-05-25T22:17:27.542Z" }, + { url = "https://files.pythonhosted.org/packages/1c/7c/fe2980fc03723272e30f135b62360b075f513dfe7cc73aef36c7f04012bd/httptools-0.8.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a3b7387147361c3fd47a0bde763c5c91b5b4cd4dc9989b8ece84ff436c99843b", size = 463189, upload-time = "2026-05-25T22:17:28.546Z" }, + { url = "https://files.pythonhosted.org/packages/15/1b/47fc5fff68acd1bfa20b4734059c9a06cadb88119dcd5258b5b0d21d91c8/httptools-0.8.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f256d6ce930c52ca1cb2a960b7da03548c454e7d28b06059ad41bfe789036ce0", size = 466610, upload-time = "2026-05-25T22:17:29.816Z" }, + { url = "https://files.pythonhosted.org/packages/60/bd/07b13c93ffd9bec9546e0d43f8e19378dd696dbd278511406bc07371ef1f/httptools-0.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:19d1ee275bb59ba2643ba9a3a1e51cc0c788caf2b8df506368e03f56fdd08527", size = 92705, upload-time = "2026-05-25T22:17:31.133Z" }, + { url = "https://files.pythonhosted.org/packages/fd/c4/121648f68ce066d7bd762d6b6d97e620847642d38d54f3d90ff11d947629/httptools-0.8.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:de1ed58a974e75d56560acc7e7fed01a454994429456f65209789992e41f2568", size = 215023, upload-time = "2026-05-25T22:17:32.401Z" }, + { url = "https://files.pythonhosted.org/packages/b9/b0/312a062ae741ae3e8baa8c8bf20be81b2e67337b259ab4349bebc7b6142e/httptools-0.8.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e93c227b595c6926c1acee96891dd9da4be338cfbe82e5cd3bb9d8dd7dc4ac0b", size = 117405, upload-time = "2026-05-25T22:17:33.742Z" }, + { url = "https://files.pythonhosted.org/packages/fc/37/fccd705f795386bb05bf413012fecff2a33e5aa8c2f069096de3e9fd8702/httptools-0.8.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2a021c3a8e65cc125390d72f59b968afca3bdcaff25bd67965e0a055a14946ca", size = 558497, upload-time = "2026-05-25T22:17:34.732Z" }, + { url = "https://files.pythonhosted.org/packages/bd/39/f172e8003576de35f5ba77ff417cf0e34429d35dc014deef15afa337a72c/httptools-0.8.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:48774d39cbb70e2b1f71f88852a3087ae1d3a1eb80482bb48c13067ab080c14f", size = 571585, upload-time = "2026-05-25T22:17:35.813Z" }, + { url = "https://files.pythonhosted.org/packages/3e/b9/f5564760af99f3dbbf3f9104dc00e5da27e96cf433c6bdcf77617f70bf3f/httptools-0.8.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:88eead8ec8680a9f146c655bc88445a325bd7921cfd8194c7337e9467282427d", size = 543297, upload-time = "2026-05-25T22:17:37.08Z" }, + { url = "https://files.pythonhosted.org/packages/99/67/8d9f2c313618e161b82f3873188e7196126da1d6e29688df40eb3997c77a/httptools-0.8.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:2c032fa028f46871ec7e1fc59fc15e8023eab3e6bbe6ece786a1611719a5d081", size = 539535, upload-time = "2026-05-25T22:17:38.032Z" }, + { url = "https://files.pythonhosted.org/packages/48/63/b906c01e53f50d432c0defe43ce52764a111dc1bdd028bafbeb54dcfd008/httptools-0.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:384c17174464c8e873398b7af24f0b1f44d992c820328413951a625323155d77", size = 108209, upload-time = "2026-05-25T22:17:39.473Z" }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, +] + +[[package]] +name = "idna" +version = "3.18" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/63/9496c57188a2ee585e0f1db071d75089a11e98aa86eb99d9d7618fc1edce/idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848", size = 196711, upload-time = "2026-06-02T14:34:07.794Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2", size = 65455, upload-time = "2026-06-02T14:34:06.319Z" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "jsondiff" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/35/48/841137f1843fa215ea284834d1514b8e9e20962bda63a636c7417e02f8fb/jsondiff-2.2.1.tar.gz", hash = "sha256:658d162c8a86ba86de26303cd86a7b37e1b2c1ec98b569a60e2ca6180545f7fe", size = 26649, upload-time = "2024-08-29T04:09:06.201Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/94/a8066f84d62ab666d61ef97deba1a33126e3e5c0c0da2c458ada17053ed6/jsondiff-2.2.1-py3-none-any.whl", hash = "sha256:b1f0f7e2421881848b1d556d541ac01a91680cfcc14f51a9b62cdf4da0e56722", size = 13440, upload-time = "2024-08-29T04:09:04.955Z" }, +] + +[[package]] +name = "kanta" +version = "0.8.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "blake3" }, + { name = "jsondiff" }, + { name = "msgspec" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/52/35/7373e80e6af2145f9753a2417f33aed75901a97882562b7724048f0e371b/kanta-0.8.1.tar.gz", hash = "sha256:c47c1dc5c44cd47afb8ab3baee5e69a5e4e5be12573d269c376769c15a8ecb9d", size = 63611, upload-time = "2026-08-13T21:59:52.214Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/fa/3e48ae9c88660b1b0e6dbb1457590923838a47c4adf819d3479acb58c815/kanta-0.8.1-py3-none-any.whl", hash = "sha256:907d1fc991c7681f4d07d2090b7c07ca68e84a6ba11506b4c03ed9b430b3356f", size = 52681, upload-time = "2026-08-13T21:59:50.938Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, + { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, + { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, + { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, + { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, + { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, + { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, + { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, + { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, + { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, + { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, + { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, + { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, +] + +[[package]] +name = "mdit-py-plugins" +version = "0.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/59/fc/f8d0863f8862f25602c0404d75568e89fb6b4109804645e5cdfb1be5cf56/mdit_py_plugins-0.6.1.tar.gz", hash = "sha256:a2bca0f039f39dbd35fb74ae1b5f998608c437463371f0ff7f49a19a17a114d0", size = 56114, upload-time = "2026-05-13T09:03:38.91Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/69/6da5581c6a7fede7dc261bf4e67d6adca4196f176b43288b55b3db395b6e/mdit_py_plugins-0.6.1-py3-none-any.whl", hash = "sha256:214c82fb2ac524472ab6a5bcab1de80f73b50443e187f401bfd77efbc7c6481d", size = 66663, upload-time = "2026-05-13T09:03:37.76Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "msgspec" +version = "0.21.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/60/f79b9b013a16fa3a58350c9295ddc6789f2e335f36ea61ed10a21b215364/msgspec-0.21.1.tar.gz", hash = "sha256:2313508e394b0d208f8f56892ca9b2799e2561329de9763b19619595a6c0f72c", size = 319193, upload-time = "2026-04-12T21:44:50.394Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/ad/86954e987d1d6a5c579e2c2e7832b65e0fff194179fdac4f581536086024/msgspec-0.21.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fab48eb45fdbfbdb2c0edfec00ffc53b6b6085beefc6b50b61e01659f9f8757f", size = 196261, upload-time = "2026-04-12T21:44:27.807Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a1/c5e46c3e42b866199365e35d11dddfd1fbd8bba4fdb3c52f965b1607ce94/msgspec-0.21.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:3cb779ea0c35bc807ff941d415875c1f69ca0be91a2e907ab99a171811d86a9a", size = 188729, upload-time = "2026-04-12T21:44:28.99Z" }, + { url = "https://files.pythonhosted.org/packages/85/7d/1e29a319d678d6cb962ae5bdf32a6858ebdf38f73bc654c0e9c742a0c2c8/msgspec-0.21.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:68604db36b3b4dd9bf160e436e12798a4738848144cea1aca1cb984011eb160f", size = 219866, upload-time = "2026-04-12T21:44:31.104Z" }, + { url = "https://files.pythonhosted.org/packages/25/1f/cca084ca2572810fff12ea9dbdcbe39eac048f40daf4a9077b49fcbe8cee/msgspec-0.21.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3d6b9dc50948eaf65df54d2fd0ff66e6d8c32f116037209ee861810eb9b676cb", size = 224993, upload-time = "2026-04-12T21:44:32.649Z" }, + { url = "https://files.pythonhosted.org/packages/71/94/d2120fc9d419a89a3a7c13e5b7078798c4b392a96a02a6e2b3ce43a8766c/msgspec-0.21.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:52c5e21930942302394429c5a582ce7e6b62c7f983b3760834c2ce107e0dd6df", size = 223535, upload-time = "2026-04-12T21:44:33.839Z" }, + { url = "https://files.pythonhosted.org/packages/75/17/42418b66a3ad972a89bab73dd78b79cc6282bb488a25e73c853cee7443b9/msgspec-0.21.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:abbb39d65681fa24ed394e01af3d59d869068324f900c61d06062b7fb9980f2f", size = 227222, upload-time = "2026-04-12T21:44:35.093Z" }, + { url = "https://files.pythonhosted.org/packages/c4/33/265c894268cca88ff67b144ca2b4c522fc8b9a6f1966a3640c70516e78e1/msgspec-0.21.1-cp314-cp314-win_amd64.whl", hash = "sha256:5666b1b560b97b6ec2eb3fca8a502298ebac56e13bbca1f88523538ce83d01ea", size = 193810, upload-time = "2026-04-12T21:44:36.612Z" }, + { url = "https://files.pythonhosted.org/packages/3b/8f/a6d35f25bf1fc63c492fdd88fdce01ba0875ead48c2b91f90f33653b4131/msgspec-0.21.1-cp314-cp314-win_arm64.whl", hash = "sha256:d8b8578e4c83b14ceea4cef0d0b747e31d9330fe4b03b2b2ad4063866a178f93", size = 179125, upload-time = "2026-04-12T21:44:38.198Z" }, + { url = "https://files.pythonhosted.org/packages/c6/39/74839641e64b99d87da55af0fc472854d42b46e2183b9e2a67fe1bb2a512/msgspec-0.21.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:15f523d51c00ebad412213bfe9f06f0a50ec2b93e0c19e824a2d267cabb48ea2", size = 200171, upload-time = "2026-04-12T21:44:39.414Z" }, + { url = "https://files.pythonhosted.org/packages/70/9b/ce0cca6d2d87fcd4b6ff97600790494e64f26a2c55d61507cd2755c16193/msgspec-0.21.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:4e47390360583ba3d5c6cb44cf0a9f61b0a06a899d3c2c00627cedebb2e2884b", size = 192879, upload-time = "2026-04-12T21:44:40.882Z" }, + { url = "https://files.pythonhosted.org/packages/a7/08/673a7bb05e5702dc787ddd3011195b509f9867927970da59052211929987/msgspec-0.21.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f60800e6299b798142dc40b0644da77ceac5ea0568be58228417eae14135c847", size = 226281, upload-time = "2026-04-12T21:44:42.181Z" }, + { url = "https://files.pythonhosted.org/packages/7d/45/86508cf57283e9070b3c447e3ab25b792a7a0855a3ea4e0c6d111ac34c97/msgspec-0.21.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5f8e9dfcd98419cf7568808470c4317a3fb30bef0e3715b568730a2b272a20d7", size = 229863, upload-time = "2026-04-12T21:44:43.442Z" }, + { url = "https://files.pythonhosted.org/packages/2c/62/e7c9367cd08d590559faacd711edbae36840342843e669440363f33c7d36/msgspec-0.21.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:92d89dfad13bd1ea640dc3e37e724ed380da1030b272bdf5ecafb983c3ad7c75", size = 230445, upload-time = "2026-04-12T21:44:44.806Z" }, + { url = "https://files.pythonhosted.org/packages/42/b4/c0f54632103846b658a10930025f4de41c8724b5e4805a5f3b395586cb7e/msgspec-0.21.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0d03867786e5d7ba25d666df4b11320c27170f4aeafcb8e3a8b0a50a4fb742ca", size = 231822, upload-time = "2026-04-12T21:44:46.343Z" }, + { url = "https://files.pythonhosted.org/packages/ea/1d/0d85cc79d0ccf5508e9c846cc66552a6a16bf92abd1dbd8362617f7b35cd/msgspec-0.21.1-cp314-cp314t-win_amd64.whl", hash = "sha256:740fbf1c9d59992ca3537d6fbe9ebbf9eaf726a65fbf31448e0ecbc710697a63", size = 206650, upload-time = "2026-04-12T21:44:47.601Z" }, + { url = "https://files.pythonhosted.org/packages/90/91/56c5d560f20e6c20e9e4f55bd0e458f7f162aa689ee350346c04c48eac0b/msgspec-0.21.1-cp314-cp314t-win_arm64.whl", hash = "sha256:0d2cc73df6058d811a126ac3a8ad63a4dfa210c82f9cf5a004802eaf4712de90", size = 183149, upload-time = "2026-04-12T21:44:48.833Z" }, +] + +[[package]] +name = "pagerite" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "blake3" }, + { name = "fastapi", extra = ["standard"] }, + { name = "fastapi-vue" }, + { name = "html5tagger" }, + { name = "kanta" }, + { name = "markdown-it-py" }, + { name = "mdit-py-plugins" }, + { name = "pygments" }, + { name = "tracerite" }, +] + +[package.dev-dependencies] +dev = [ + { name = "httpx" }, +] + +[package.metadata] +requires-dist = [ + { name = "blake3", specifier = ">=1.0.9" }, + { name = "fastapi", extras = ["standard"], specifier = ">=0.141.1" }, + { name = "fastapi-vue", specifier = ">=1.3.1" }, + { name = "html5tagger", specifier = ">=2.0.0" }, + { name = "kanta", specifier = ">=0.8.1" }, + { name = "markdown-it-py", specifier = ">=4.2.0" }, + { name = "mdit-py-plugins", specifier = ">=0.6.1" }, + { name = "pygments", specifier = ">=2.20.0" }, + { name = "tracerite", specifier = ">=2.6.4" }, +] + +[package.metadata.requires-dev] +dev = [{ name = "httpx", specifier = ">=0.28.1" }] + +[[package]] +name = "pydantic" +version = "2.13.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/18/a5/b60d21ac674192f8ab0ba4e9fd860690f9b4a6e51ca5df118733b487d8d6/pydantic-2.13.4.tar.gz", hash = "sha256:c40756b57adaa8b1efeeced5c196f3f3b7c435f90e84ea7f443901bec8099ef6", size = 844775, upload-time = "2026-05-06T13:43:05.343Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl", hash = "sha256:45a282cde31d808236fd7ea9d919b128653c8b38b393d1c4ab335c62924d9aba", size = 472262, upload-time = "2026-05-06T13:43:02.641Z" }, +] + +[package.optional-dependencies] +email = [ + { name = "email-validator" }, +] + +[[package]] +name = "pydantic-core" +version = "2.46.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9d/56/921726b776ace8d8f5db44c4ef961006580d91dc52b803c489fafd1aa249/pydantic_core-2.46.4.tar.gz", hash = "sha256:62f875393d7f270851f20523dd2e29f082bcc82292d66db2b64ea71f64b6e1c1", size = 471464, upload-time = "2026-05-06T13:37:06.98Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8d/74/228a26ddad29c6672b805d9fd78e8d251cd04004fa7eed0e622096cd0250/pydantic_core-2.46.4-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:428e04521a40150c85216fc8b85e8d39fece235a9cf5e383761238c7fa9b96fb", size = 2102079, upload-time = "2026-05-06T13:38:41.019Z" }, + { url = "https://files.pythonhosted.org/packages/ad/1f/8970b150a4b4365623ae00fc88603491f763c627311ae8031e3111356d6e/pydantic_core-2.46.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:23ace664830ee0bfe014a0c7bc248b1f7f25ed7ad103852c317624a1083af462", size = 1952179, upload-time = "2026-05-06T13:36:59.812Z" }, + { url = "https://files.pythonhosted.org/packages/95/30/5211a831ae054928054b2f79731661087a2bc5c01e825c672b3a4a8f1b3e/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce5c1d2a8b27468f433ca974829c44060b8097eedc39933e3c206a90ee49c4a9", size = 1978926, upload-time = "2026-05-06T13:37:39.933Z" }, + { url = "https://files.pythonhosted.org/packages/57/e9/689668733b1eb67adeef047db3c2e8788fcf65a7fd9c9e2b46b7744fe245/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7283d57845ecf5a163403eb0702dfc220cc4fbdd18919cb5ccea4f95ee1cdab4", size = 2046785, upload-time = "2026-05-06T13:38:01.995Z" }, + { url = "https://files.pythonhosted.org/packages/60/d9/6715260422ff50a2109878fd24d948a6c3446bb2664f34ee78cd972b3acd/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8daafc69c93ee8a0204506a3b6b30f586ef54028f52aeeeb5c4cfc5184fd5914", size = 2228733, upload-time = "2026-05-06T13:40:50.371Z" }, + { url = "https://files.pythonhosted.org/packages/18/ae/fdb2f64316afca925640f8e70bb1a564b0ec2721c1389e25b8eb4bf9a299/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2213145bcc2ba85884d0ac63d222fece9209678f77b9b4d76f054c561adb28", size = 2307534, upload-time = "2026-05-06T13:37:21.531Z" }, + { url = "https://files.pythonhosted.org/packages/89/1d/8eff589b45bb8190a9d12c49cfad0f176a5cbd1534908a6b5125e2886239/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a5f930472650a82629163023e630d160863fce524c616f4e5186e5de9d9a49b", size = 2099732, upload-time = "2026-05-06T13:39:31.942Z" }, + { url = "https://files.pythonhosted.org/packages/06/d5/ee5a3366637fee41dee51a1fc91562dcf12ddbc68fda34e6b253da2324bb/pydantic_core-2.46.4-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:c1b3f518abeca3aa13c712fd202306e145abf59a18b094a6bafb2d2bbf59192c", size = 2129627, upload-time = "2026-05-06T13:37:25.033Z" }, + { url = "https://files.pythonhosted.org/packages/94/33/2414be571d2c6a6c4d08be21f9292b6d3fdb08949a97b6dfe985017821db/pydantic_core-2.46.4-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a7dd0b3ee80d90150e3495a3a13ac34dbcbfd4f012996a6a1d8900e91b5c0fb", size = 2179141, upload-time = "2026-05-06T13:37:14.046Z" }, + { url = "https://files.pythonhosted.org/packages/7b/79/7daa95be995be0eecc4cf75064cb33f9bbbfe3fe0158caf2f0d4a996a5c7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:3fb702cd90b0446a3a1c5e470bfa0dd23c0233b676a9099ddcc964fa6ca13898", size = 2184325, upload-time = "2026-05-06T13:36:53.615Z" }, + { url = "https://files.pythonhosted.org/packages/9f/cb/d0a382f5c0de8a222dc61c65348e0ce831b1f68e0a018450d31c2cace3a5/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:b8458003118a712e66286df6a707db01c52c0f52f7db8e4a38f0da1d3b94fc4e", size = 2323990, upload-time = "2026-05-06T13:40:29.971Z" }, + { url = "https://files.pythonhosted.org/packages/05/db/d9ba624cc4a5aced1598e88c04fdbd8310c8a69b9d38b9a3d39ce3a61ed7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:372429a130e469c9cd698925ce5fc50940b7a1336b0d82038e63d5bbc4edc519", size = 2369978, upload-time = "2026-05-06T13:37:23.027Z" }, + { url = "https://files.pythonhosted.org/packages/f2/20/d15df15ba918c423461905802bfd2981c3af0bfa0e40d05e13edbfa48bc3/pydantic_core-2.46.4-cp314-cp314-win32.whl", hash = "sha256:85bb3611ff1802f3ee7fdd7dbff26b56f343fb432d57a4728fdd49b6ef35e2f4", size = 1966354, upload-time = "2026-05-06T13:38:03.499Z" }, + { url = "https://files.pythonhosted.org/packages/fc/b6/6b8de4c0a7d7ab3004c439c80c5c1e0a3e8d78bbae19379b01960383d9e5/pydantic_core-2.46.4-cp314-cp314-win_amd64.whl", hash = "sha256:811ff8e9c313ab425368bcbb36e5c4ebd7108c2bbf4e4089cfbb0b01eff63fac", size = 2072238, upload-time = "2026-05-06T13:39:40.807Z" }, + { url = "https://files.pythonhosted.org/packages/32/36/51eb763beec1f4cf59b1db243a7dcc39cbb41230f050a09b9d69faaf0a48/pydantic_core-2.46.4-cp314-cp314-win_arm64.whl", hash = "sha256:bfec22eab3c8cc2ceec0248aec886624116dc079afa027ecc8ad4a7e62010f8a", size = 2018251, upload-time = "2026-05-06T13:37:26.72Z" }, + { url = "https://files.pythonhosted.org/packages/e8/91/855af51d625b23aa987116a19e231d2aaef9c4a415273ddc189b79a45fee/pydantic_core-2.46.4-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:af8244b2bef6aaad6d92cda81372de7f8c8d36c9f0c3ea36e827c60e7d9467a0", size = 2099593, upload-time = "2026-05-06T13:39:47.682Z" }, + { url = "https://files.pythonhosted.org/packages/fb/1b/8784a54c65edb5f49f0a14d6977cf1b209bba85a4c77445b255c2de58ab3/pydantic_core-2.46.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5a4330cdbc57162e4b3aa303f588ba752257694c9c9be3e7ebb11b4aca659b5d", size = 1935226, upload-time = "2026-05-06T13:40:40.428Z" }, + { url = "https://files.pythonhosted.org/packages/e8/e7/1955d28d1afc56dd4b3ad7cc0cf39df1b9852964cf16e5d13912756d6d6b/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29c61fc04a3d840155ff08e475a04809278972fe6aef51e2720554e96367e34b", size = 1974605, upload-time = "2026-05-06T13:37:32.029Z" }, + { url = "https://files.pythonhosted.org/packages/93/e2/3fedbf0ba7a22850e6e9fd78117f1c0f10f950182344d8a6c535d468fdd8/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c50f2528cf200c5eed56faf3f4e22fcd5f38c157a8b78576e6ba3168ec35f000", size = 2030777, upload-time = "2026-05-06T13:38:55.239Z" }, + { url = "https://files.pythonhosted.org/packages/f8/61/46be275fcaaba0b4f5b9669dd852267ce1ff616592dccf7a7845588df091/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cbe8b01f948de4286c74cdd6c667aceb38f5c1e26f0693b3983d9d74887c65e", size = 2236641, upload-time = "2026-05-06T13:37:08.096Z" }, + { url = "https://files.pythonhosted.org/packages/60/db/12e93e46a8bac9988be3c016860f83293daea8c716c029c9ace279036f2f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:617d7e2ca7dcb8c5cf6bcb8c59b8832c94b36196bbf1cbd1bfb56ed341905edd", size = 2286404, upload-time = "2026-05-06T13:40:20.221Z" }, + { url = "https://files.pythonhosted.org/packages/e2/4a/4d8b19008f38d31c53b8219cfedc2e3d5de5fe99d90076b7e767de29274f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7027560ee92211647d0d34e3f7cd6f50da56399d26a9c8ad0da286d3869a53f3", size = 2109219, upload-time = "2026-05-06T13:38:12.153Z" }, + { url = "https://files.pythonhosted.org/packages/88/70/3cbc40978fefb7bb09c6708d40d4ad1a5d70fd7213c3d17f971de868ec1f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:f99626688942fb746e545232e7726926f3be91b5975f8b55327665fafda991c7", size = 2110594, upload-time = "2026-05-06T13:40:02.971Z" }, + { url = "https://files.pythonhosted.org/packages/9d/20/b8d36736216e29491125531685b2f9e61aa5b4b2599893f8268551da3338/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fc3e9034a63de20e15e8ade85358bc6efc614008cab72898b4b4952bea0509ff", size = 2159542, upload-time = "2026-05-06T13:39:27.506Z" }, + { url = "https://files.pythonhosted.org/packages/1d/a2/367df868eb584dacf6bf82a389272406d7178e301c4ac82545ab98bc2dd9/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:97e7cf2be5c77b7d1a9713a05605d49460d02c6078d38d8bef3cbe323c548424", size = 2168146, upload-time = "2026-05-06T13:38:31.93Z" }, + { url = "https://files.pythonhosted.org/packages/c1/b8/4460f77f7e201893f649a29ab355dddd3beee8a97bcb1a320db414f9a06e/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:3bf92c5d0e00fefaab325a4d27828fe6b6e2a21848686b5b60d2d9eeb09d76c6", size = 2306309, upload-time = "2026-05-06T13:37:44.717Z" }, + { url = "https://files.pythonhosted.org/packages/64/c4/be2639293acd87dc8ddbcec41a73cee9b2ebf996fe6d892a1a74e88ad3f7/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:3ecbc122d18468d06ca279dc26a8c2e2d5acb10943bb35e36ae92096dc3b5565", size = 2369736, upload-time = "2026-05-06T13:37:05.645Z" }, + { url = "https://files.pythonhosted.org/packages/30/a6/9f9f380dbb301f67023bf8f707aaa75daadf84f7152d95c410fd7e81d994/pydantic_core-2.46.4-cp314-cp314t-win32.whl", hash = "sha256:e846ae7835bf0703ae43f534ab79a867146dadd59dc9ca5c8b53d5c8f7c9ef02", size = 1955575, upload-time = "2026-05-06T13:38:51.116Z" }, + { url = "https://files.pythonhosted.org/packages/40/1f/f1eb9eb350e795d1af8586289746f5c5677d16043040d63710e22abc43c9/pydantic_core-2.46.4-cp314-cp314t-win_amd64.whl", hash = "sha256:2108ba5c1c1eca18030634489dc544844144ee36357f2f9f780b93e7ddbb44b5", size = 2051624, upload-time = "2026-05-06T13:38:21.672Z" }, + { url = "https://files.pythonhosted.org/packages/f6/d2/42dd53d0a85c27606f316d3aa5d2869c4e8470a5ed6dec30e4a1abe19192/pydantic_core-2.46.4-cp314-cp314t-win_arm64.whl", hash = "sha256:4fcbe087dbc2068af7eda3aa87634eba216dbda64d1ae73c8684b621d33f6596", size = 2017325, upload-time = "2026-05-06T13:40:52.723Z" }, +] + +[[package]] +name = "pydantic-extra-types" +version = "2.11.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/71/dba38ee2651f84f7842206adbd2233d8bbdb59fb85e9fa14232486a8c471/pydantic_extra_types-2.11.1.tar.gz", hash = "sha256:46792d2307383859e923d8fcefa82108b1a141f8a9c0198982b3832ab5ef1049", size = 172002, upload-time = "2026-03-16T08:08:03.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/17/c1/3226e6d7f5a4f736f38ac11a6fbb262d701889802595cdb0f53a885ac2e0/pydantic_extra_types-2.11.1-py3-none-any.whl", hash = "sha256:1722ea2bddae5628ace25f2aa685b69978ef533123e5638cfbddb999e0100ec1", size = 79526, upload-time = "2026-03-16T08:08:02.533Z" }, +] + +[[package]] +name = "pydantic-settings" +version = "2.15.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "python-dotenv" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/68/ca/31c57507b13119d7d3cfa1576dad2911a4861e3be07b579395f4e9d393f9/pydantic_settings-2.15.0.tar.gz", hash = "sha256:694b793e84f766ba76a90ebdefc01d0a9a045dab0382bee70393da93712ad117", size = 261253, upload-time = "2026-08-07T09:24:57.419Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/30/a4/2bffa9f8e804325a09867f0e9d30795c80ea9f8d62560bd1b6ad6220eb2f/pydantic_settings-2.15.0-py3-none-any.whl", hash = "sha256:0ba092c291c94baceb5eff768aa0d56400a457585bc0175925a5a5510303da42", size = 69413, upload-time = "2026-08-07T09:24:55.839Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "python-dotenv" +version = "1.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/82/ed/0301aeeac3e5353ef3d94b6ec08bbcabd04a72018415dcb29e588514bba8/python_dotenv-1.2.2.tar.gz", hash = "sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3", size = 50135, upload-time = "2026-03-01T16:00:26.196Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a", size = 22101, upload-time = "2026-03-01T16:00:25.09Z" }, +] + +[[package]] +name = "python-multipart" +version = "0.0.32" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5b/42/55c32bb9b12693c092ad250a0e82edb5b31ddeda6eb772de5f308b3804ad/python_multipart-0.0.32.tar.gz", hash = "sha256:be54b7f3fa167bb83e4fcd936b887b708f4e57fe75911c02aebf53efaf8d938e", size = 46881, upload-time = "2026-06-04T16:18:58.647Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/04/e8135ebd1ad02c56ec633277529b2602ff99ff634be76cdba5744cf554fd/python_multipart-0.0.32-py3-none-any.whl", hash = "sha256:ff6d3f776f16878c894e52e107296ffc890e913c611b1a4ec6c44e2821fe2e23", size = 30042, upload-time = "2026-06-04T16:18:57.319Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, +] + +[[package]] +name = "rich" +version = "15.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, +] + +[[package]] +name = "rich-toolkit" +version = "0.20.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "rich" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/3a/a258c2fbc6c6bdf428611388f5698ba5d57ffdf0755e1cab474d9cc47813/rich_toolkit-0.20.3.tar.gz", hash = "sha256:223dd2cfba325ed55e94933b9e53f3aca13e9fdf76622bd564c18109a2273c1b", size = 205355, upload-time = "2026-07-13T14:38:06.837Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e2/ce/639d0d0ce3d25c5edbd1afecd308bb35dc04883a45ac9f0855c8aee4e919/rich_toolkit-0.20.3-py3-none-any.whl", hash = "sha256:419aa87516d5f3849cca553c6dcf707c02a36d508fcf996946606725d34a3002", size = 36195, upload-time = "2026-07-13T14:38:05.687Z" }, +] + +[[package]] +name = "rignore" +version = "0.8.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ff/7e/aa0640d74f6b4bb68466f5899bd5ed1680480732344c31a408504e215801/rignore-0.8.1.tar.gz", hash = "sha256:2b6cf58501e9ff1b6a71c3fd66c8a105311e1f23237626fd4c9c00606bb3d30f", size = 55535, upload-time = "2026-08-04T22:27:08.237Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/13/7ceb0fe7a5a5a67e7f1cee65d8a9b09c52df53a4ff406d14940130a420b7/rignore-0.8.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:3054fab93e2d2ad483cb89417f7b883cee025cb22286eb824af0073f2ffd5f7e", size = 849303, upload-time = "2026-08-04T22:24:17.126Z" }, + { url = "https://files.pythonhosted.org/packages/ba/87/fe151f1a3d93483b36e22e8a0e84382cff3b7fe9d7347cfb586727054c56/rignore-0.8.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:60f1ae9eaa51b50d5afe99bd25ffb2cfc10729701ca08c179489555d2614f3ae", size = 817293, upload-time = "2026-08-04T22:24:18.584Z" }, + { url = "https://files.pythonhosted.org/packages/d4/08/cb82a725f040cc5d106a1fe33dec4031fb9d8863a4874a8dfb60c4db79f9/rignore-0.8.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6012766ea3a5a635d9b79f3e8c3797d5e47ce5e5dd81993c9f92a3ea4ff68b4c", size = 885260, upload-time = "2026-08-04T22:24:20.236Z" }, + { url = "https://files.pythonhosted.org/packages/06/77/6ba8d24fd151513347d9420fb383ec732b54886c6a5500e13f0bd7ec4072/rignore-0.8.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:90e60f0073caae0f1d59c993adedafa3a57bc6fac551669677cb25aa7fa9d9b8", size = 857548, upload-time = "2026-08-04T22:24:21.769Z" }, + { url = "https://files.pythonhosted.org/packages/47/66/c54f448b077e89de99e85746677425fbb3a62d3721aeb9afa556dc3ca10f/rignore-0.8.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:121ab7ac93e39fd1d70098461c1ed9a6fb89d54e7bf8c60ae351b23b05cbb8c1", size = 1135817, upload-time = "2026-08-04T22:24:23.179Z" }, + { url = "https://files.pythonhosted.org/packages/c3/92/4b47da84a36687f10c09b43de7600d7dde8f56f2981e68b8822cfadd26aa/rignore-0.8.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:befb772556c8463c640b290f632b57440182edd39996708a33c50bcf437796f9", size = 913513, upload-time = "2026-08-04T22:24:24.719Z" }, + { url = "https://files.pythonhosted.org/packages/2b/a4/8428734c0217b5c0adbe752afc9603ca34434c6033584f63d6ca7ba50331/rignore-0.8.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a184fa45db8cdc7a8604d2df020a107be3fc0adc2e522b4e4eb5cd5b57d5f84", size = 929324, upload-time = "2026-08-04T22:24:26.059Z" }, + { url = "https://files.pythonhosted.org/packages/da/f6/ab3738e42d9d351033b8e8fb46ac4b8eb193545aaf3ed2f52f58fb8d5212/rignore-0.8.1-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:e68a572efc126aa45195f1581a5ea97c4e36eeba6874a6635ae44daa4fbec7a4", size = 891130, upload-time = "2026-08-04T22:24:27.374Z" }, + { url = "https://files.pythonhosted.org/packages/1a/ba/9f374cf332eeea0e26cca6b6550678d0c69208e7ba4aea8ece0dc6b205eb/rignore-0.8.1-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c75ac1952ca8892422de328a925f4804120b149543042313bb3af7cbfdd65d64", size = 964769, upload-time = "2026-08-04T22:24:28.688Z" }, + { url = "https://files.pythonhosted.org/packages/37/46/7ee48265e34cb90ef4bcf85c63874da6d6a31af1c63fb7bca84fd5dbc188/rignore-0.8.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:3538084cef4a66ba3fee7c453d17db7cfb32a6653456381b62afd8d53090d6fa", size = 1061779, upload-time = "2026-08-04T22:24:30Z" }, + { url = "https://files.pythonhosted.org/packages/01/23/51c725ba23f06b2809a0a676127ca3613e852bcab0532e58cab9f09b6fbb/rignore-0.8.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:28a3baab3d1b7ea42c38e492d4a100de3e5c67217432364c62b5719e0f04e96a", size = 1132595, upload-time = "2026-08-04T22:24:31.472Z" }, + { url = "https://files.pythonhosted.org/packages/0e/a0/671192e2cc8711694cf564f77e9e59d5e8c41f100bce67fbb384f2befec5/rignore-0.8.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:74996d8ed1a494ff8e61d9194a0dd3637e6b19a582cbed6fe0e1a4cc60e7b266", size = 1141117, upload-time = "2026-08-04T22:24:33.148Z" }, + { url = "https://files.pythonhosted.org/packages/01/df/b3a9a821b37361debc29fd009d21dc4af7f8313b76371c1640aff2765a59/rignore-0.8.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a2e5df9ba53e502f676b054c4d12371273204e2b9c6ec29afad3a155b9ad3399", size = 1140515, upload-time = "2026-08-04T22:24:34.708Z" }, + { url = "https://files.pythonhosted.org/packages/0c/69/bcf0f38713c86d462002c47b0ad14d655f8766a3b9235d8f6813e8245695/rignore-0.8.1-cp314-cp314-win32.whl", hash = "sha256:69db47c2fa51d88e93b4e4de4f44220ce7a9337e4b7526a16f5660b19974a8ca", size = 637894, upload-time = "2026-08-04T22:24:36.081Z" }, + { url = "https://files.pythonhosted.org/packages/44/f8/0c0e0bb59aea492e288d5c058ad873599d43dd5674495033fe9e8444b80d/rignore-0.8.1-cp314-cp314-win_amd64.whl", hash = "sha256:1c668a541ecd8af3d7bd06c48c62e1c3e0a755028d57c07cee697a25d9b0678d", size = 728394, upload-time = "2026-08-04T22:24:37.496Z" }, + { url = "https://files.pythonhosted.org/packages/29/7c/c23926385e01d9b99fdf7bb7b86aaa60c2c1eb4de2a6303549f08497a0fa/rignore-0.8.1-cp314-cp314-win_arm64.whl", hash = "sha256:d63559131efa9cbba82494ec8698e38bea403f214969066c661b3eb4da4ad4f9", size = 667896, upload-time = "2026-08-04T22:24:38.826Z" }, + { url = "https://files.pythonhosted.org/packages/38/9d/a70a895b47fa30446ffadd0a7add23494e18335ddc85c27cbc5a740374c7/rignore-0.8.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:b60f3751f681a12798927d51d1d6a46b81fe7f9923a513dd8fcc7947d785e12f", size = 847278, upload-time = "2026-08-04T22:24:40.329Z" }, + { url = "https://files.pythonhosted.org/packages/d9/cc/24fe37a08fd2083882422509c31bb58c14d85f2c7ab3b4ef3cc6f430d807/rignore-0.8.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d7d56bf138418e31991ce17b738c491fa1ac098bfcc8c3ba67fc0faeecfed357", size = 815968, upload-time = "2026-08-04T22:24:41.975Z" }, + { url = "https://files.pythonhosted.org/packages/a9/3d/1a260407a17e062859995d9f557b4ccbb36e6a0ef44a0d99409c836e5942/rignore-0.8.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f020b018577d0081a2b23da199d22c58f4cbd63935c8e991adffbb1a755b467", size = 884941, upload-time = "2026-08-04T22:24:43.414Z" }, + { url = "https://files.pythonhosted.org/packages/b3/80/70291634f2f2257fcabe1156926d7a10a87b0da1a8ba9ab2cafac37a4ded/rignore-0.8.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4d4a70c9b857657c3a542fd367e16ae106fb6e3e4448cddb30e4edc604d5a025", size = 856667, upload-time = "2026-08-04T22:24:44.769Z" }, + { url = "https://files.pythonhosted.org/packages/1d/84/3811795d0b6fb3e8865d6a4f4eb3d3184e68a8557d7ee5b6d5a463196f54/rignore-0.8.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ab668664e6388afc08fec50186ec21daf17c738ee71bb039d12cf5f14e964dde", size = 1134272, upload-time = "2026-08-04T22:24:46.213Z" }, + { url = "https://files.pythonhosted.org/packages/59/51/6a60ea8291346459e3f788bac4ecc9711b13271804c6eef47dc2ec59e6e7/rignore-0.8.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a3454cdd8bc145fd055dd45f650ccf1509e7b4edfc720152eb2be594b230f03", size = 914263, upload-time = "2026-08-04T22:24:47.604Z" }, + { url = "https://files.pythonhosted.org/packages/50/72/620d4baa44e44ee53ae516efcb714183fd592ba923dc7990bf57947ff610/rignore-0.8.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:425b962f3d68b86ebb785409153708a38b0658542c918ee706ea433e2547c805", size = 928135, upload-time = "2026-08-04T22:24:48.987Z" }, + { url = "https://files.pythonhosted.org/packages/50/60/06495efc96c2edcda647dbf7db770ab9307459d3b2f8598d9ae1f1ce9ea5/rignore-0.8.1-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:5094965794d163e1c4a71dccf3d1c3b3df86802e3afbfa461b300aa923cd7ea5", size = 890677, upload-time = "2026-08-04T22:24:50.318Z" }, + { url = "https://files.pythonhosted.org/packages/ee/92/396f751e69d543bfb7e9faa5b0ae3ee988fcd76d9c743857fdb26db0651b/rignore-0.8.1-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1467756e8454d3f816131bbad8b0efc52b7f6924e9b151f2962cec9e2f4af706", size = 964291, upload-time = "2026-08-04T22:24:51.836Z" }, + { url = "https://files.pythonhosted.org/packages/4e/0b/642483058dfbcbfc319d9cf48a05d8dbf9f7f6939b410eebdbc73dd9414c/rignore-0.8.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:b5acf12993258f0eac4db81c30bed5469ebadd1b5bb2863c985fe0d802d94e0f", size = 1060972, upload-time = "2026-08-04T22:24:53.921Z" }, + { url = "https://files.pythonhosted.org/packages/64/2d/69b54a53d94baf2fb16ea1246f96bf093aae6a0e5d5c5cf5099c1fee4fb8/rignore-0.8.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:329ae0bea9598541cb818bbecb1e1f56fc1faae77828ebb3846ef2b24a050d05", size = 1130938, upload-time = "2026-08-04T22:24:55.395Z" }, + { url = "https://files.pythonhosted.org/packages/bf/36/c213d838c3c2237da8c51163a6c55acaeedc59759d4884d81ab6d7250721/rignore-0.8.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:4069fcdff01999cd2d5a426eccda45a8b31a3e0eeee8b5a9da5a452714cbb2c7", size = 1140646, upload-time = "2026-08-04T22:24:56.741Z" }, + { url = "https://files.pythonhosted.org/packages/96/70/28125520727d72e2878c1a6a3dbd333e57f27730b463d629d170e2da3b62/rignore-0.8.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cf28097a83e1237f87e11e33fb12def022e103cab2a20340a19753e8e222aebf", size = 1139989, upload-time = "2026-08-04T22:24:58.127Z" }, + { url = "https://files.pythonhosted.org/packages/7d/e6/8c0d1f2fa6d9b2f15e6a4bd20e7bfc8f4af436b8328ced782deda0a46057/rignore-0.8.1-cp314-cp314t-win32.whl", hash = "sha256:c978f26c25e66c118da1e6218f34cc5ce2bf9c5cc3969011cde47bacbfe4a072", size = 640012, upload-time = "2026-08-04T22:24:59.597Z" }, + { url = "https://files.pythonhosted.org/packages/9e/c4/ef25f5b8d65ddb0e5266b13892c0c996dc221faac5b76a7b6fff4295ce44/rignore-0.8.1-cp314-cp314t-win_amd64.whl", hash = "sha256:790e14dba9e1f8a532071d64e1c2fa7529c71db75996e95519d06d3378cbbcd5", size = 728195, upload-time = "2026-08-04T22:25:01.358Z" }, + { url = "https://files.pythonhosted.org/packages/e8/6a/603b522d76a3acd66952e20e2ad7fa84c09d89436d707d6bb9ecb5ae55d3/rignore-0.8.1-cp314-cp314t-win_arm64.whl", hash = "sha256:484c0a4803a1eb9097d875df3200e60e58cbf316d4d40357f92e8e757ce529dd", size = 666282, upload-time = "2026-08-04T22:25:02.75Z" }, + { url = "https://files.pythonhosted.org/packages/ac/fb/b8de8a872bdb9150aa55783273f73e9aa253951d8f82856fe916fce3cae8/rignore-0.8.1-cp315-cp315-macosx_10_12_x86_64.whl", hash = "sha256:1c2a29e7f54e879fa54982887de480b2cfa6e3cb51f01d70dd4e4035f5b79670", size = 849669, upload-time = "2026-08-04T22:25:04.116Z" }, + { url = "https://files.pythonhosted.org/packages/b2/24/4ca7ce428378e7ef938cb36573f22e842dcdb2655e266b32711eea08d16f/rignore-0.8.1-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:58449c827c36dba68133a5ee4137b67d7d6e050234a95c3a8f5e3cefbd6970ec", size = 817738, upload-time = "2026-08-04T22:25:05.489Z" }, + { url = "https://files.pythonhosted.org/packages/38/5a/78311079595c96e01a2404eff725468e25fad16d2836408046ffbdb33a69/rignore-0.8.1-cp315-cp315-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e250726b08957aabcf4e28aef4ea18bcccbd95f240cebb75a74b424f067dce4b", size = 885906, upload-time = "2026-08-04T22:25:06.956Z" }, + { url = "https://files.pythonhosted.org/packages/fe/57/7d456d2dcc881e6bf08275222ae36fff58343ee0fc47e1b26722f97b38ea/rignore-0.8.1-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:62470f4d70d83f124381975614ed7c7db6f5c5fb4d777ee88f7bdb9a7d14b65c", size = 858240, upload-time = "2026-08-04T22:25:08.371Z" }, + { url = "https://files.pythonhosted.org/packages/64/3c/0f9bd7b9b3af37b216096e1dc81f9368d64c13625ddd34b4d595b316b47c/rignore-0.8.1-cp315-cp315-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d886d6bbdd0a1a3ef73bd38d6768cabc9b30bfd1be7b157b27a4ac7ec6c5244b", size = 1135145, upload-time = "2026-08-04T22:25:09.81Z" }, + { url = "https://files.pythonhosted.org/packages/83/06/f0087a520e3bf3d9532aa823ea141e5a076432b9d036bb506a99ddb534c2/rignore-0.8.1-cp315-cp315-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7ed31657a20df59b0bd63283d278e8678749aa0154ba98fae0838a9845599695", size = 914331, upload-time = "2026-08-04T22:25:11.369Z" }, + { url = "https://files.pythonhosted.org/packages/f0/65/8ac37040f162cb965520286ef48472a87f47cb137df4068a0d32634166dc/rignore-0.8.1-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e425a42f6601bfed266f76f3294bca48efcfdb10c3c0c279fb2f977b1e2cc2bc", size = 929202, upload-time = "2026-08-04T22:25:13.057Z" }, + { url = "https://files.pythonhosted.org/packages/e0/93/19b752fda8a56424ee156ef6a9799c582eb6d2ffb233c7b91e103b79d54e/rignore-0.8.1-cp315-cp315-manylinux_2_31_riscv64.whl", hash = "sha256:ff09db59f672d929bca88ee7089d3697256967df76a2bab8b187208f2b517bc0", size = 891752, upload-time = "2026-08-04T22:25:14.773Z" }, + { url = "https://files.pythonhosted.org/packages/a9/94/a5db364ddb136360c7c4ba75cb56ba2f7cd8321b296602f6ea7438fc1a83/rignore-0.8.1-cp315-cp315-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8dbc5898945c027dc0ae451de0c983e20bd8fa8297f40ee38d0ce1a3ed924d4c", size = 964714, upload-time = "2026-08-04T22:25:16.416Z" }, + { url = "https://files.pythonhosted.org/packages/f6/11/63316cd5a87402a42c75b6ada0331745975f0274cabb6a8aa85c043468ab/rignore-0.8.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:1160abcd855964a9dd69f3d603ef57be14b1ea51ebaf50b07f737a3f3a8b89a6", size = 1062141, upload-time = "2026-08-04T22:25:18.094Z" }, + { url = "https://files.pythonhosted.org/packages/91/6e/19b4bdde3f53bb0c9427d65544f92f864a892d695559423ce01fd14c1a31/rignore-0.8.1-cp315-cp315-musllinux_1_2_armv7l.whl", hash = "sha256:be994859b2cbbc69338351bc9908dd7d049de232e6eab5e998ec1feac3faf785", size = 1133487, upload-time = "2026-08-04T22:25:19.855Z" }, + { url = "https://files.pythonhosted.org/packages/1d/d3/fc41ea3164001fe84a2ec8b84d7bb48e7a73ebdcac6d68961c80f874dd4e/rignore-0.8.1-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:f52098f3245c7557229d8253ea3a53a03de03704685aba8a1ccd24a5f004db70", size = 1141434, upload-time = "2026-08-04T22:25:21.316Z" }, + { url = "https://files.pythonhosted.org/packages/34/35/b9d415a7e90c37b28b2d5fd6a074a4a3d572d5a0e0b596df0b4b85af8a78/rignore-0.8.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:c676080bb70cbd5429052bb5a3827b35543876a42c792c6d713d9e162bdaa00d", size = 1140492, upload-time = "2026-08-04T22:25:22.763Z" }, + { url = "https://files.pythonhosted.org/packages/81/9b/49ac5f66862c796a04f0b7aad47ace4dea0a3ef52d313d2fb154821dd88a/rignore-0.8.1-cp315-cp315-win32.whl", hash = "sha256:ec800546b960d5044d2468d22dd0689210e846350c42cc9f02519c2a2528b3ef", size = 638365, upload-time = "2026-08-04T22:25:24.34Z" }, + { url = "https://files.pythonhosted.org/packages/38/76/90568f3af555074c5e1936b80573539658cda1dce4e89dd87f3174d88aa8/rignore-0.8.1-cp315-cp315-win_amd64.whl", hash = "sha256:4225f2d2f0b3e3c39a815f15dbe551f39f0d7f82e2a92d16bdbdb07ff4b6718e", size = 728711, upload-time = "2026-08-04T22:25:25.815Z" }, + { url = "https://files.pythonhosted.org/packages/0f/e0/3afb8bb7c6c538615d58c97f6e3b9ff7071f19442cd9cfb6f3ae6bbe0bee/rignore-0.8.1-cp315-cp315-win_arm64.whl", hash = "sha256:42480707cdd5f92d6b1252faada600e03ab22fbfd53b124c6f7b33c21e06b6cf", size = 668102, upload-time = "2026-08-04T22:25:27.251Z" }, + { url = "https://files.pythonhosted.org/packages/26/08/ce533f5c0b677dd7e82a3461e86afdf0cd99db9a73f3f561d1fabcd03fc8/rignore-0.8.1-cp315-cp315t-macosx_10_12_x86_64.whl", hash = "sha256:51e608acd3c1aa834f2b7d956ff5380a0a6b6b595df80e665f2a2889982f1855", size = 846662, upload-time = "2026-08-04T22:25:28.718Z" }, + { url = "https://files.pythonhosted.org/packages/9b/43/4bb308ac5751881d7ba600e93d7f2e4a2c884af5028ac0ced4f1274c09c3/rignore-0.8.1-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:6602011b6e6ecd157f3b0a0a25b1777b40c541ca21de6ebe2137af713d0efa15", size = 816657, upload-time = "2026-08-04T22:25:30.177Z" }, + { url = "https://files.pythonhosted.org/packages/b3/f1/10a11bf9ebf03f7a8d9876ff023634cd4ce61845be9929f816ece4dfff11/rignore-0.8.1-cp315-cp315t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8db2be0d49175d5db4cd503f8dc62cbe687b9ebc71af4cede1c8b40bab8f4f4a", size = 884975, upload-time = "2026-08-04T22:25:31.906Z" }, + { url = "https://files.pythonhosted.org/packages/1b/97/c8dddb2dab738bd1b3a0b1639bc42d696bdd2765515a302620a35795c475/rignore-0.8.1-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:601ff49d8458a21d745908e35f792c02b45ecae4a37fa3cd1fc03fa065962bc0", size = 856951, upload-time = "2026-08-04T22:25:33.354Z" }, + { url = "https://files.pythonhosted.org/packages/a5/1d/ddcc1cddfb0a79c82eedbcd25ba0b014d346251cc08c1938b90951660cf8/rignore-0.8.1-cp315-cp315t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb58e93997d546fad4cfcd730a54d7c12cd7a61fe7a9b31bfc75402403dc559f", size = 1134401, upload-time = "2026-08-04T22:25:34.845Z" }, + { url = "https://files.pythonhosted.org/packages/13/0a/519d2e081e0b89c705bb4b282ed7540c185accc748c97c40dd80a333eb3a/rignore-0.8.1-cp315-cp315t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0378cf77b8d64560e0cb433deada18438b36ef7933dd284dd65347d03c56c429", size = 914389, upload-time = "2026-08-04T22:25:36.658Z" }, + { url = "https://files.pythonhosted.org/packages/ed/aa/c1e857c4b8f9dd388c38c8ca430917f24f1de44d9279d4f5d9edbcc94a0c/rignore-0.8.1-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0097a8c35106997d2b52851f0888777efe10e34772140a9fdb018b2f99238159", size = 928845, upload-time = "2026-08-04T22:25:38.421Z" }, + { url = "https://files.pythonhosted.org/packages/5f/9c/a9651d49fbf2a336074df0a09d01ee2d968dae902e88e51e32d822f5e9fc/rignore-0.8.1-cp315-cp315t-manylinux_2_31_riscv64.whl", hash = "sha256:2a809a250f1532b93dcc52e173ee71adcafdb536a125532687666047c4537ac0", size = 891090, upload-time = "2026-08-04T22:25:39.966Z" }, + { url = "https://files.pythonhosted.org/packages/53/98/d3242c45edfdc059fb80b73be9e27dac34639da40002ebbcd5c9b9acb821/rignore-0.8.1-cp315-cp315t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:580e019787032b430b857335a66db53d7ae0a200586b3a6b5d3ef227648300d6", size = 965283, upload-time = "2026-08-04T22:25:41.796Z" }, + { url = "https://files.pythonhosted.org/packages/56/37/e19e70395c2e5a06ba67e0a51e86ede1b4269b8d3ba091963c4f0a950f63/rignore-0.8.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:f922dcf01e6a7ad26adfcb7f42635ae63066b883d409876129db62297061327e", size = 1061223, upload-time = "2026-08-04T22:25:43.782Z" }, + { url = "https://files.pythonhosted.org/packages/bc/bd/24b737f97c542e4883cfcc557b08565adc7c698e30836b8bc9855676d749/rignore-0.8.1-cp315-cp315t-musllinux_1_2_armv7l.whl", hash = "sha256:4900bd1ba8938e5a5e601306504c7b8169783a2d44a8396c8fda4a9b659eed51", size = 1131772, upload-time = "2026-08-04T22:25:45.391Z" }, + { url = "https://files.pythonhosted.org/packages/aa/8d/bedc51ca98696998797af67163c039e0adc7835035fb929f10d33fb3d997/rignore-0.8.1-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:3d581bf107490abae4d40a9aa823a79e18c88a21658514ccaf95e42e85d278f7", size = 1141631, upload-time = "2026-08-04T22:25:46.875Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9c/946e55a7e5bc7b165faed3475451683580ddf8b45d63e67c39a0cdee5ce2/rignore-0.8.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:78490b93aec14a87fa4c23e634b1d1dcb2bf5dcb90923f3b03a3428892a13d9f", size = 1140328, upload-time = "2026-08-04T22:25:48.447Z" }, + { url = "https://files.pythonhosted.org/packages/b9/02/211daf0a7f957386d2223ef7a1601d36b42a6c1a6b93aae32db712868390/rignore-0.8.1-cp315-cp315t-win32.whl", hash = "sha256:e8315151a83b982fe972420372e80c550616095181d1549faaa1ec31f363f5ae", size = 640253, upload-time = "2026-08-04T22:25:50.025Z" }, + { url = "https://files.pythonhosted.org/packages/ca/0e/ccb682455ca380cc640c2a9536390fd907cc5ac0396118643f9d386e4af5/rignore-0.8.1-cp315-cp315t-win_amd64.whl", hash = "sha256:69be37202a052d9e13affed6b774f86d8bf3b417b15d54ad737033e56da07ec0", size = 728332, upload-time = "2026-08-04T22:25:51.937Z" }, + { url = "https://files.pythonhosted.org/packages/eb/ec/a2b634938c39600205dcd37015343e779dc8f112c234d905666dec2a66fd/rignore-0.8.1-cp315-cp315t-win_arm64.whl", hash = "sha256:4268e83bcb88f240ed4f43d73e7de9e4bcd8026bdfcfa836567d6c29863e5361", size = 666611, upload-time = "2026-08-04T22:25:53.857Z" }, +] + +[[package]] +name = "sentry-sdk" +version = "2.68.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5b/94/23b7dd072acb9628907bd3f4fbf61794a7b12a9db8f33c1276f70ae5ac92/sentry_sdk-2.68.0.tar.gz", hash = "sha256:648c58e9887311a03470a41539e24bdbbf64a30ca4f5336f7e3dcc87276400b3", size = 1008854, upload-time = "2026-08-13T09:06:21.268Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7d/9b/e2421d08956d0bc4691d995393d835e563886bff499d8fb10fdefae85a8d/sentry_sdk-2.68.0-py3-none-any.whl", hash = "sha256:538e56c2d03679d42f7c0cb5f1af73a7a510b00abc7e296c13ac49b107b713a4", size = 518670, upload-time = "2026-08-13T09:06:19.735Z" }, +] + +[[package]] +name = "shellingham" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, +] + +[[package]] +name = "starlette" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b5/b4/205b0d5241d934e8add0c38aa924c4f9fb7330834ff11e5444db964ec3f9/starlette-1.6.0.tar.gz", hash = "sha256:d4e3ac5e546444960c710297a3c9fc3f7ebae1b7e963f3d36173b49da535be9b", size = 2716969, upload-time = "2026-08-08T18:27:57.512Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/cb/6a6a47d5b464bd08695d254f3da6e7986cc70c9fa5d778eda57538edfe56/starlette-1.6.0-py3-none-any.whl", hash = "sha256:a86dd39d14bb45f85a3d18525215a9ef0cfd1f192ac793220e72598c90335f0c", size = 75969, upload-time = "2026-08-08T18:27:56.196Z" }, +] + +[[package]] +name = "tracerite" +version = "2.6.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "html5tagger" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c7/27/b71f8949d62dacdc88dce63814a41a9235a089ca96aafe5eb2ac17a5ec6f/tracerite-2.6.4.tar.gz", hash = "sha256:c661f9067f1e5d3fd30f995174e6db61be15bed621b827e1e31f2d402a45fcbc", size = 105964, upload-time = "2026-08-14T22:17:40.522Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/20/45a2df0c0ed93c8d669684f0c5386c674ad53906317499ccfc608003face/tracerite-2.6.4-py3-none-any.whl", hash = "sha256:c850621a5b77c42db141966c53dc637802dfe23332e12389437386d9f001d3b3", size = 112431, upload-time = "2026-08-14T22:17:39.301Z" }, +] + +[[package]] +name = "typer" +version = "0.27.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-doc" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "rich" }, + { name = "shellingham" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/40/4a3db7990d1f62a53182aa96eaef57aeb2886a27f90a195bc66713565d31/typer-0.27.1.tar.gz", hash = "sha256:a79bef8469a79c45498e7b814ecf8d603cc7644e9acbd9e19cac0334240b18df", size = 203994, upload-time = "2026-08-03T14:41:03.438Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/89/9518bc0c3929bee36b3a4a8e3daddd6e03f92f9961c66d4983b837160543/typer-0.27.1-py3-none-any.whl", hash = "sha256:53150287edd11baeb4e4722c8e394fcdf8181c0ae89485cba8d25c778d5edd56", size = 122874, upload-time = "2026-08-03T14:41:04.391Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/26/b09b8010994eccc3c09092e6b34058f36a460eea2d4c3e8b910c695975a0/typing_inspection-0.4.4.tar.gz", hash = "sha256:547274fa6b0a561ccf549cc9524b999a578e737d015d8709d021f9d0d13bea47", size = 76928, upload-time = "2026-08-12T12:37:25.997Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/81/4add07e5172b7ac40d8ed5ff580409a7801a4fe26d529bdd915401dabfbe/typing_inspection-0.4.4-py3-none-any.whl", hash = "sha256:65b8397ba37ccbce054456aaccddfc91e6e3083c92824df348d96ca832f3f147", size = 14750, upload-time = "2026-08-12T12:37:24.648Z" }, +] + +[[package]] +name = "urllib3" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, +] + +[[package]] +name = "uvicorn" +version = "0.52.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2e/28/64ca011edf31c715b4fad359c587ea52391aaffa125065695590241ff617/uvicorn-0.52.3.tar.gz", hash = "sha256:18857b9e6579300be55c91c0a1cfd37d9a2cf0cabea33b88275f199eb73b8b58", size = 100621, upload-time = "2026-08-13T16:50:02.899Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/2b/ebd108734a8204c6b4b93c681c9a38c5273b3ccd5d129fee4ffc1d97772c/uvicorn-0.52.3-py3-none-any.whl", hash = "sha256:116af2710dbf47c80f463cd20ee4884b6662f4c9f227d797ddc7279d2fcc2c7c", size = 79859, upload-time = "2026-08-13T16:50:01.323Z" }, +] + +[package.optional-dependencies] +standard = [ + { name = "httptools" }, + { name = "python-dotenv" }, + { name = "pyyaml" }, + { name = "uvloop", marker = "platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32'" }, + { name = "watchfiles" }, + { name = "websockets" }, +] + +[[package]] +name = "uvloop" +version = "0.22.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/06/f0/18d39dbd1971d6d62c4629cc7fa67f74821b0dc1f5a77af43719de7936a7/uvloop-0.22.1.tar.gz", hash = "sha256:6c84bae345b9147082b17371e3dd5d42775bddce91f885499017f4607fdaf39f", size = 2443250, upload-time = "2025-10-16T22:17:19.342Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/cd/b62bdeaa429758aee8de8b00ac0dd26593a9de93d302bff3d21439e9791d/uvloop-0.22.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3879b88423ec7e97cd4eba2a443aa26ed4e59b45e6b76aabf13fe2f27023a142", size = 1362067, upload-time = "2025-10-16T22:16:44.503Z" }, + { url = "https://files.pythonhosted.org/packages/0d/f8/a132124dfda0777e489ca86732e85e69afcd1ff7686647000050ba670689/uvloop-0.22.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4baa86acedf1d62115c1dc6ad1e17134476688f08c6efd8a2ab076e815665c74", size = 752423, upload-time = "2025-10-16T22:16:45.968Z" }, + { url = "https://files.pythonhosted.org/packages/a3/94/94af78c156f88da4b3a733773ad5ba0b164393e357cc4bd0ab2e2677a7d6/uvloop-0.22.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:297c27d8003520596236bdb2335e6b3f649480bd09e00d1e3a99144b691d2a35", size = 4272437, upload-time = "2025-10-16T22:16:47.451Z" }, + { url = "https://files.pythonhosted.org/packages/b5/35/60249e9fd07b32c665192cec7af29e06c7cd96fa1d08b84f012a56a0b38e/uvloop-0.22.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c1955d5a1dd43198244d47664a5858082a3239766a839b2102a269aaff7a4e25", size = 4292101, upload-time = "2025-10-16T22:16:49.318Z" }, + { url = "https://files.pythonhosted.org/packages/02/62/67d382dfcb25d0a98ce73c11ed1a6fba5037a1a1d533dcbb7cab033a2636/uvloop-0.22.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b31dc2fccbd42adc73bc4e7cdbae4fc5086cf378979e53ca5d0301838c5682c6", size = 4114158, upload-time = "2025-10-16T22:16:50.517Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/f1171b4a882a5d13c8b7576f348acfe6074d72eaf52cccef752f748d4a9f/uvloop-0.22.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:93f617675b2d03af4e72a5333ef89450dfaa5321303ede6e67ba9c9d26878079", size = 4177360, upload-time = "2025-10-16T22:16:52.646Z" }, + { url = "https://files.pythonhosted.org/packages/79/7b/b01414f31546caf0919da80ad57cbfe24c56b151d12af68cee1b04922ca8/uvloop-0.22.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:37554f70528f60cad66945b885eb01f1bb514f132d92b6eeed1c90fd54ed6289", size = 1454790, upload-time = "2025-10-16T22:16:54.355Z" }, + { url = "https://files.pythonhosted.org/packages/d4/31/0bb232318dd838cad3fa8fb0c68c8b40e1145b32025581975e18b11fab40/uvloop-0.22.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b76324e2dc033a0b2f435f33eb88ff9913c156ef78e153fb210e03c13da746b3", size = 796783, upload-time = "2025-10-16T22:16:55.906Z" }, + { url = "https://files.pythonhosted.org/packages/42/38/c9b09f3271a7a723a5de69f8e237ab8e7803183131bc57c890db0b6bb872/uvloop-0.22.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:badb4d8e58ee08dad957002027830d5c3b06aea446a6a3744483c2b3b745345c", size = 4647548, upload-time = "2025-10-16T22:16:57.008Z" }, + { url = "https://files.pythonhosted.org/packages/c1/37/945b4ca0ac27e3dc4952642d4c900edd030b3da6c9634875af6e13ae80e5/uvloop-0.22.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b91328c72635f6f9e0282e4a57da7470c7350ab1c9f48546c0f2866205349d21", size = 4467065, upload-time = "2025-10-16T22:16:58.206Z" }, + { url = "https://files.pythonhosted.org/packages/97/cc/48d232f33d60e2e2e0b42f4e73455b146b76ebe216487e862700457fbf3c/uvloop-0.22.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:daf620c2995d193449393d6c62131b3fbd40a63bf7b307a1527856ace637fe88", size = 4328384, upload-time = "2025-10-16T22:16:59.36Z" }, + { url = "https://files.pythonhosted.org/packages/e4/16/c1fd27e9549f3c4baf1dc9c20c456cd2f822dbf8de9f463824b0c0357e06/uvloop-0.22.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6cde23eeda1a25c75b2e07d39970f3374105d5eafbaab2a4482be82f272d5a5e", size = 4296730, upload-time = "2025-10-16T22:17:00.744Z" }, +] + +[[package]] +name = "watchfiles" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cd/41/5e1a4bb12aac5f1493fa1bdc11154eca3b258ca4eba65d39c473fe19d8e9/watchfiles-1.2.0.tar.gz", hash = "sha256:c995fba777f1ea992f090f9236e9284cf7a5d1a0130dd5a3d82c598cacd76838", size = 108252, upload-time = "2026-05-18T04:32:04.251Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/54/a9c7ea9a82a4ac65e7004c0a03920b5cdd2f9c3b678757d9cd425aa51d53/watchfiles-1.2.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:b8c8358484d5fa12ef34f05b7f4168eaf1932f408725ff6d023c33ec17bd79d4", size = 400205, upload-time = "2026-05-18T04:32:05.153Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5d/c9ab3534374a4a67450696905d6ef16a04405448b8dc52bd752ae50423d4/watchfiles-1.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9f04b092229ad2c50126dd3c922c8822e51e605993764a33058d4a791ab42281", size = 392508, upload-time = "2026-05-18T04:30:54.849Z" }, + { url = "https://files.pythonhosted.org/packages/26/ca/1ad30103535cf0cecd7b993e8d50edc5351b1820e38f2d22e3df58962feb/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a7ce236284f002a156f70add88efe5c70879cccbb658be0822c54b1306fc09d", size = 452448, upload-time = "2026-05-18T04:30:53.727Z" }, + { url = "https://files.pythonhosted.org/packages/37/a1/ceee2cdf2afbd715fa07758d39c9859513eae411b23196f7fd039e5feedd/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b9909cc2b48468b575eefa944919e1fe8a36c5849d5c7c168f80a8c1db69398e", size = 459605, upload-time = "2026-05-18T04:30:23.312Z" }, + { url = "https://files.pythonhosted.org/packages/e8/f6/421e30fd1cb3907a84ed92ab3f1983e37ba2dca015e9a894a048418417a2/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a37faaed405c67e28e6be45a1fa4f206ef5a2860f27c237db9fa30704c38242", size = 490757, upload-time = "2026-05-18T04:30:47.358Z" }, + { url = "https://files.pythonhosted.org/packages/41/b0/55ed1b97ed08be7bba6f9a541cac15f2a858e1d74d2b07b6da70a82aab00/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9649193aa27bd9ff2e80ff29bfaa93085496c7a3a377592823cc58b77ee88add", size = 568672, upload-time = "2026-05-18T04:30:38.915Z" }, + { url = "https://files.pythonhosted.org/packages/d1/cf/d8ae8a80dd7bafab395ea7681c10237311bbf34d37704a8c744e7cf31fc7/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e4ff8e37f99cf1da89e255e07c9c4b37c214038c4283707bdec308cb1b0ea1f", size = 464197, upload-time = "2026-05-18T04:30:09.914Z" }, + { url = "https://files.pythonhosted.org/packages/7c/8a/3076c496ca8dafe0e8cd03fcebdfc47be4b1174b4e5b24ff6e396e6b3af2/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:054dc20fd2e3132b4c3883b4a00d72fd6e1f56fdaf89fccd12e8057d74cd74d7", size = 453181, upload-time = "2026-05-18T04:30:14.829Z" }, + { url = "https://files.pythonhosted.org/packages/e5/10/9745e17c98e7b8a86454df0a3c7b5686bd650383f1e9f26e4ebcbd6cc0c0/watchfiles-1.2.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:e140ed30ebde76796b686e67c182cff10ea2fbab186fafd1560f74bb5a473a6e", size = 465109, upload-time = "2026-05-18T04:30:28.123Z" }, + { url = "https://files.pythonhosted.org/packages/8f/95/8ef4a95481d3e0cb52d62a06fa6e972e81424be2d9698b91a2fecca9904c/watchfiles-1.2.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:bb7e52ecf68ba46d22df23467b87cffeb2146908aa523ebfe803019618cfda06", size = 630653, upload-time = "2026-05-18T04:31:49.304Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e4/3b3bf36b0f829b50c6ebcb8d031583863c59f923d6a6af3d485e470d0fac/watchfiles-1.2.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:23282a321c8baf9b3a3c4afff673f9fe65eb7fdc2338d765ccad9d3d1916a5ba", size = 657838, upload-time = "2026-05-18T04:31:06.497Z" }, + { url = "https://files.pythonhosted.org/packages/21/b1/6cbbb50c1f3002ab568777d44aa21206dfb8807a840990c4037523b51812/watchfiles-1.2.0-cp314-cp314-win32.whl", hash = "sha256:c0db965c5f79aa49fe672d297cf1febc5ad149b658594944f49a54a2b96270a7", size = 275108, upload-time = "2026-05-18T04:30:06.891Z" }, + { url = "https://files.pythonhosted.org/packages/92/45/190ce6db8dcb4536682cf75d3889ff1a27182a58cb519d343cb6d9ea63d8/watchfiles-1.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:71283b39fd17e5408eb123bd37aeecfd9d54c81fc184421943208aadb879d103", size = 288441, upload-time = "2026-05-18T04:32:12.901Z" }, + { url = "https://files.pythonhosted.org/packages/74/0d/3eae1c2313ab08378431d907c3f8095ecca00f3eda33111cf4f0f2591799/watchfiles-1.2.0-cp314-cp314-win_arm64.whl", hash = "sha256:c5c19526f4e54a00f2666a6c0e9e40d582c09e865055ea7378bf0009aab857b3", size = 280684, upload-time = "2026-05-18T04:31:26.902Z" }, + { url = "https://files.pythonhosted.org/packages/b1/75/fb64e6c25d6b5ca636d03df34ffb1c6e9873303e76d27967e045f8df088f/watchfiles-1.2.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:d73a585accffa5ae39c17264c36ec3166d2fad7000c780f5ef83b2722afb9dd2", size = 398857, upload-time = "2026-05-18T04:32:17.108Z" }, + { url = "https://files.pythonhosted.org/packages/73/4e/9f7adf01754cbf81843722ccfec169d8f26c69778281a302855cecd2ee08/watchfiles-1.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ae99b14c5f21e026e0e9d96f40e07d8570ebee6cafd9d8fc318354606daa7a28", size = 392413, upload-time = "2026-05-18T04:31:07.911Z" }, + { url = "https://files.pythonhosted.org/packages/47/c8/bec626bcc2d69f44b9acb24ce7d60ed7b16b73628eea747fcbd169d8edda/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4429f3b105524a10b72c3a819b091c495d2811d419c1e1e8df773a5a5974f831", size = 452409, upload-time = "2026-05-18T04:31:20.142Z" }, + { url = "https://files.pythonhosted.org/packages/00/b7/b6362068e81e7c556d155a34c35d40ac3ef42d747b06d7f6e5bf58e359c2/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:43d818978d06062d9b22c4fab2ebe44cf5213d42dc8e62bda8c2760cfa2eeb33", size = 458827, upload-time = "2026-05-18T04:32:06.219Z" }, + { url = "https://files.pythonhosted.org/packages/67/f8/9a813fa42afb1e0b4625e75f0479826644d3ee8dc287e093799bc01f390c/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9f732dc58b2dbe69e464ccf8fff7a03b0dd0be439da4c0720d3558527d3d6b4", size = 490104, upload-time = "2026-05-18T04:31:56.034Z" }, + { url = "https://files.pythonhosted.org/packages/2f/bf/27dfb6094ca4c9aad21298b5525b6c53cb36121ee454331d05161e58d130/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f200104103feb097de4cab8fe4f5dd18a2026934c7dea98c55a2f5fd6d5a33b", size = 571360, upload-time = "2026-05-18T04:31:57.133Z" }, + { url = "https://files.pythonhosted.org/packages/fb/39/44a096d67270ea93df91d33877dbe91fbda3aa4f8ec2edf799d93eda8736/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:63ac26eefbf4af1741247d6fb68b11c49a25b2f7413fbd318a83a12aaa9cf666", size = 464644, upload-time = "2026-05-18T04:30:57.33Z" }, + { url = "https://files.pythonhosted.org/packages/0e/80/c7472203bad6268e3ef1ad260739704847898938ad7ea8b63a5131f46b50/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c4997d4e4a55f0d02b6cde327322daf3a0400e5df6c6b15948994bf72497925", size = 454771, upload-time = "2026-05-18T04:30:48.736Z" }, + { url = "https://files.pythonhosted.org/packages/51/cf/3b10b268b4b7f0fc26e9debb5eef1998b515887840f444cd3ec80c688755/watchfiles-1.2.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:4c887eba18b7945ac73067a8b4a66f21cd46c2539b2bc68588f7be6c7eb6d26b", size = 463494, upload-time = "2026-05-18T04:31:33.826Z" }, + { url = "https://files.pythonhosted.org/packages/3d/3e/a4302545cd589262a0dc7d140e86f7688eba3f9c72776c27f7e23b8864c4/watchfiles-1.2.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:3416ff151bb6b5a8d8d11664974fbef4d9305b9b2957839ab5a270468fd8df30", size = 629383, upload-time = "2026-05-18T04:31:15.596Z" }, + { url = "https://files.pythonhosted.org/packages/db/99/d5649df0a9a410d45b7c882304d0b790903ac9b6e8f2cfd12114e0c6b9f2/watchfiles-1.2.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:0e831a271c035d89789cffc386b6aa1375f39f1cd25eb7ca0997e4970d152fc5", size = 656093, upload-time = "2026-05-18T04:31:58.707Z" }, + { url = "https://files.pythonhosted.org/packages/92/b9/362702539275019a54dd2e94511b31a9b89c5f9e6a21966de7eb692549fc/watchfiles-1.2.0-cp315-cp315-macosx_10_12_x86_64.whl", hash = "sha256:37a6721cdf3f65dbb13aa9503510ccb4451603ac837e44d265d7992a597e1374", size = 400109, upload-time = "2026-05-18T04:31:16.879Z" }, + { url = "https://files.pythonhosted.org/packages/8f/75/71d5ba62db781e5587bded1d944c675374bc4aa37ff33d5018d98e8b6538/watchfiles-1.2.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:2b37d10b5a63bd4d87e18472d80fa525bd670586fae62e5dd580452764879b65", size = 392167, upload-time = "2026-05-18T04:31:28.058Z" }, + { url = "https://files.pythonhosted.org/packages/3c/01/c66dd95d0423fe30d31820e2d1d5bda773764131bbb6ac0cb1cf303ac328/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a105bc2283f67e8fbec74253ec2d94925de92ed72c0393f1206bf326b7b7b69", size = 452372, upload-time = "2026-05-18T04:31:00.836Z" }, + { url = "https://files.pythonhosted.org/packages/91/15/2fe99557e72f85627c6a8eed50d889e8d101623e060a22ad75b875cb932d/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5327989a465505f05cfe06f04fa9d0c2fd5432bb243e10e6f012b1bdca3c8579", size = 459596, upload-time = "2026-05-18T04:31:34.96Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/d4acfa0023367428ed48351b3b9b267893037b6cadae55620c61c24bcfd4/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ecb47f183a8025b2aa18b546725c3657e542112ae9c0613a2af79b4fa8d04ad7", size = 490869, upload-time = "2026-05-18T04:31:59.923Z" }, + { url = "https://files.pythonhosted.org/packages/a4/5f/3164cbdce06c9fb95c4f7b9e2f9760b5e2797af43a9ecc317ef42a23a278/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8520a4ab0e37f770afc34459c4f8f7019e153f9124dc101c15538365875d1ab2", size = 571641, upload-time = "2026-05-18T04:32:00.948Z" }, + { url = "https://files.pythonhosted.org/packages/41/e6/85d3731c55e65cd7690f3f803d24c139588aaf863e4bf2148fe7a7fa1a19/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:71cd71740ed2c15211ebb237ced4e39a1cdf6f80566e5fe95428da1626f4fde6", size = 464444, upload-time = "2026-05-18T04:30:34.298Z" }, + { url = "https://files.pythonhosted.org/packages/f4/7d/562641012b8b09872742c3b8adf9629ec479fd78f8d68ae4a0c13da8add6/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f88af53d6ddaf72179ef613ddc905e6f4785f712b49b80b3bef9f3525e6194b4", size = 453593, upload-time = "2026-05-18T04:31:23.464Z" }, + { url = "https://files.pythonhosted.org/packages/56/fe/cb8ef3d6f929d14158fdaaad9925985b7310abc9384dcd4d82dd0016fb59/watchfiles-1.2.0-cp315-cp315-manylinux_2_31_riscv64.whl", hash = "sha256:cee9d5efd929efdac5f7e58f72b3376f676b64050a91c5b99a7094c5b2317488", size = 465096, upload-time = "2026-05-18T04:31:30.384Z" }, + { url = "https://files.pythonhosted.org/packages/25/91/80908e835e100527a9267147b08c0eee1fa6ab0ffec15edc04d1d44885f7/watchfiles-1.2.0-cp315-cp315-musllinux_1_1_aarch64.whl", hash = "sha256:b718bf356bbc15e559bd8ef41782b573b8ae0e3f177ab244b440568d7ea02cfb", size = 630638, upload-time = "2026-05-18T04:30:49.89Z" }, + { url = "https://files.pythonhosted.org/packages/46/4b/95ab2f256bb4af3cb2eb23b9317bda984ee6e0f11733a5c004a6c95b06e3/watchfiles-1.2.0-cp315-cp315-musllinux_1_1_x86_64.whl", hash = "sha256:922c0e019fe68b3ae392965a766b02a71ba1168c932cebc3733cd52c5fe5b377", size = 657684, upload-time = "2026-05-18T04:31:32.027Z" }, +] + +[[package]] +name = "websockets" +version = "17.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f7/96/e01084f83a64bcb3a27994bd0cb0db68ff29d9c6707fae37ec19b18ba990/websockets-17.0.1.tar.gz", hash = "sha256:5baa9bc0dfbae8c507e51c8cf1b6d4628086f7a87bbd3a9952bd5f035451f1cc", size = 183298, upload-time = "2026-07-31T11:31:27.665Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/dc/cadab608924ac605647031472fb1f8792d7d4ea07565ba1899ec42028e0d/websockets-17.0.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:53b90c00bc6201ab6695c7ff51a04d0e425514c37515e9eeecd2c1b978ac6c0e", size = 212640, upload-time = "2026-07-31T11:30:22.436Z" }, + { url = "https://files.pythonhosted.org/packages/16/7a/b034d13ca181211bbd58bb50835cb196a7784cd505b5a2079d4d03374f9f/websockets-17.0.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:5f33a649bfcb8312524173cc4bbafa7dbb236e18eee9aa31a1d324ca0ddda28c", size = 210332, upload-time = "2026-07-31T11:30:23.608Z" }, + { url = "https://files.pythonhosted.org/packages/2f/4d/943ede39b53744768edf1ed84a3f9401527388228a3d6c1249c02c3d6bd7/websockets-17.0.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cddc675ec31bca65473321f9a9794e488b43b3b8de5d02c8ef4810c5d5792163", size = 210546, upload-time = "2026-07-31T11:30:24.932Z" }, + { url = "https://files.pythonhosted.org/packages/cf/e3/88dc159d2ae66743c669443246243f28d873b0c5e58271b8cc1ca0440334/websockets-17.0.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b3ff0ad440ad52dda64138f16895f66403f40192365e39b1010e889f289746b0", size = 219928, upload-time = "2026-07-31T11:30:26.221Z" }, + { url = "https://files.pythonhosted.org/packages/fe/f2/ff27eaefa15851a5cf7f004ab827a022bf2d6632cb520f89cb100db7e84b/websockets-17.0.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:72d7f2a5aeb4e82daa4ee18f125b4277f427033359be5c745ad709608446cc2c", size = 220279, upload-time = "2026-07-31T11:30:27.49Z" }, + { url = "https://files.pythonhosted.org/packages/19/2e/a5166149f363d2449c1cb2dde6486a245521979509d53b87a09f3e79662b/websockets-17.0.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6fd88365da261c53d3e943fb37e0d0721b9cde119f6b2e3fc84369b6ab234d63", size = 221525, upload-time = "2026-07-31T11:30:28.872Z" }, + { url = "https://files.pythonhosted.org/packages/9b/b5/f46931269b3ff3bde65d27c65ddb22f9bb8ce92ac2c6c4df0910128f6219/websockets-17.0.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:ab9f962a5b64a5c3c845d556b7dc4e6fb683f7b67179f8205e814bb2e0213ffe", size = 222897, upload-time = "2026-07-31T11:30:30.164Z" }, + { url = "https://files.pythonhosted.org/packages/42/f4/deccf3439f35df953ec35e13fe07986821c5f1ab5785d69614283bdb9034/websockets-17.0.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8c07f145d0b9e90cbd96035f31fb79199aef4da1872854e36ebeb258e3d57594", size = 222129, upload-time = "2026-07-31T11:30:31.489Z" }, + { url = "https://files.pythonhosted.org/packages/35/a5/e1b57a59da92ade37fd021567a17b518ea8267b28e5530075844cdb525fe/websockets-17.0.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:9f7747d3daa41a11f25f7cca5dc988fc51da97b311bed4c9d843860f79779283", size = 220875, upload-time = "2026-07-31T11:30:32.805Z" }, + { url = "https://files.pythonhosted.org/packages/f0/30/e7d0889c790a854156de424575fd67af79ddbaed9ff3157ae863dfd1c1dc/websockets-17.0.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:2abb1ba0a5133b7d2ef3c1c9f4b0c1e8a101012dce0b594ab2b2888d9a64820e", size = 218160, upload-time = "2026-07-31T11:30:34.512Z" }, + { url = "https://files.pythonhosted.org/packages/09/2e/43db785d6ed9ae7594fae7b62bbc9cb4dfee2b015e06a1005f1e5ce283b6/websockets-17.0.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f3fd9a1f87f8f0f3f8e9f9bd0195f7516562d13f5b178db8c5784d1f60b60bed", size = 220951, upload-time = "2026-07-31T11:30:35.806Z" }, + { url = "https://files.pythonhosted.org/packages/eb/f5/4ac3cab3d5e8a830657a822f64a8910e3803229c6783e59c3fd9a3487427/websockets-17.0.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:2bc14b481e05e331811108daa1aeb41a5e237a5564ef2f02ec5a356a0f102f78", size = 219460, upload-time = "2026-07-31T11:30:37.273Z" }, + { url = "https://files.pythonhosted.org/packages/03/0e/c3a4020673ffc17c82cf1a467835038a196a555d3b4f2a50f0f063cf8ccc/websockets-17.0.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:57d2ee9b24b404ce75f3814f92073c0ed88106c950148d2427fe8d25ca254d1f", size = 220248, upload-time = "2026-07-31T11:30:38.527Z" }, + { url = "https://files.pythonhosted.org/packages/7d/87/e47a6a278cc1dfade38444c893ce18322943c25d4b780a74450d9d164be1/websockets-17.0.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:1b363bfd72a52c0658a3154a4cff219f15a474b35a235057d38853bf151acce7", size = 221421, upload-time = "2026-07-31T11:30:39.879Z" }, + { url = "https://files.pythonhosted.org/packages/da/8f/473d5fc4e3836e375b0233c6ef26777e6e5e3f7bfc84ccd524eae4090ed5/websockets-17.0.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:10b1587c599fa0f2c89154587c80e0fda98ade6c9fa8c0260a2823fb1800b685", size = 218975, upload-time = "2026-07-31T11:30:41.192Z" }, + { url = "https://files.pythonhosted.org/packages/d4/b9/819ec2dcdf69031d7e9cab11247f3a6ff9bbc8c7c53ada1dbcb9055b227b/websockets-17.0.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d7d72843691f50b91127c50688df10cb72ec6f4c4b1d7e2c11ab33b16acf8e51", size = 219925, upload-time = "2026-07-31T11:30:42.524Z" }, + { url = "https://files.pythonhosted.org/packages/85/b9/6c0da301f6118502e079cf92f4e864adf28e56b3f8c0f6085076ced7b876/websockets-17.0.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:90973a3a00f23afdfd1c9b06fb84289bf0220f247ef8a62501a1967c7af54f7b", size = 220218, upload-time = "2026-07-31T11:30:44.04Z" }, + { url = "https://files.pythonhosted.org/packages/55/f9/cba32dc9dd856565263d6272f594255bd0e2781deb8cd982c026a54760ad/websockets-17.0.1-cp314-cp314-win32.whl", hash = "sha256:599b03beb77633bffc095334338fad79cafc2b01fbd58953838130a9ae967d7b", size = 212626, upload-time = "2026-07-31T11:30:45.579Z" }, + { url = "https://files.pythonhosted.org/packages/fa/95/91cdd8c192287d7ea741f37cf7d64fdc1a14410f06f73805e428a1a590af/websockets-17.0.1-cp314-cp314-win_amd64.whl", hash = "sha256:81ce19c6046ace11da7001781be7317bb1dc389f399af4b2ed962190f76f9add", size = 212969, upload-time = "2026-07-31T11:30:46.983Z" }, + { url = "https://files.pythonhosted.org/packages/8e/fd/8c98a1e431960661c5769ab1a4dd66494e87ab02d791cc79e51e0d9a289f/websockets-17.0.1-cp314-cp314-win_arm64.whl", hash = "sha256:efe0ae052a8d023b87198921e8a7ce1dc7768816bcd2fbc20df171ac73a04891", size = 212850, upload-time = "2026-07-31T11:30:48.304Z" }, + { url = "https://files.pythonhosted.org/packages/13/c1/142f5186ee7dc3beee0426b998a79e223e067b7689afcaa95890d64aa800/websockets-17.0.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ab56439c9f74c52770690c7b2f616b3bf775cb3920453ee355ac765c032d8bbf", size = 212967, upload-time = "2026-07-31T11:30:49.688Z" }, + { url = "https://files.pythonhosted.org/packages/02/de/4b03ed316c9dee180365286c298219809ff247be39beeaaf9958b21167ab/websockets-17.0.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:20a92f78ac8250984ed459faa9ca48c285adbfc0038ddc3fdac6046990a9c9ed", size = 210504, upload-time = "2026-07-31T11:30:50.987Z" }, + { url = "https://files.pythonhosted.org/packages/cd/d8/ad2b3e8f867e1e8cac3077e2f33ffb60b71bd763d6cfc71bd916f113c3bf/websockets-17.0.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6a434e59962a4fb9016bea327e1d14d6cd67670ecfb8942b4f4a0c24036634ce", size = 210702, upload-time = "2026-07-31T11:30:52.261Z" }, + { url = "https://files.pythonhosted.org/packages/48/18/7a77a82ce9d6f831c07b176da3942f7e71acd0f115f3ecdb1d00a040eb01/websockets-17.0.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:2503c7e2a5049a12d5dac917a46d5d52591283a766165b8176bb167560421b38", size = 220290, upload-time = "2026-07-31T11:30:53.582Z" }, + { url = "https://files.pythonhosted.org/packages/f5/af/43c3e3c3ea7ba4693c2181743f3221957df28bededadcbd9fc8a0661bde0/websockets-17.0.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:28012a54510fe8301bb893ef143cec30a2780a2d3bc20b7bbdf4379d7a63945d", size = 220573, upload-time = "2026-07-31T11:30:54.966Z" }, + { url = "https://files.pythonhosted.org/packages/1f/bd/ed48eca15725743ee7e2dc172e15c61de29e85ec98dace7b14257f366836/websockets-17.0.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22bd00f8bae2bccdb5dbe41e20f58ba44ca9fff0b4b561aaf39099c35da762ed", size = 221747, upload-time = "2026-07-31T11:30:56.762Z" }, + { url = "https://files.pythonhosted.org/packages/99/50/838deb7937a8225c4925dd4a977eafea473fabf444178a99de0bc7e92bb0/websockets-17.0.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e98ec9ec61cce5bc4b8b218322ad090b0994eb060bb04da704c62ef0a3d864e6", size = 223891, upload-time = "2026-07-31T11:30:58.127Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e9/657fb70c6eb6bcd01adfa5d2b06496e9911e1c1a8813d353b8c00f7591cd/websockets-17.0.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8e387adb0c692c6b5571bdeafc8ac9d1901ea30f10309134780b16ecd35e6605", size = 222317, upload-time = "2026-07-31T11:30:59.416Z" }, + { url = "https://files.pythonhosted.org/packages/07/4c/82cb722afa5428fed981331210c4c07600570db01bb1620579f655b5adaf/websockets-17.0.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bd1470d2c53fe53269bf5619da7725d30dd9b9693f1689f7a85eab8dea734442", size = 221047, upload-time = "2026-07-31T11:31:00.757Z" }, + { url = "https://files.pythonhosted.org/packages/90/84/bd6d67d6bc65f0de0cb50de55dab42f256a9876a351c4736522eb168fda0/websockets-17.0.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:884af729b8ab50486acd94d9768c2b60914bf39b579ebba0a5cb73bfdfd61fd2", size = 218626, upload-time = "2026-07-31T11:31:02.48Z" }, + { url = "https://files.pythonhosted.org/packages/96/cb/6a372c8553976f0d8f97f5115826ed47e34b3be6b8bf0d0249af249a7416/websockets-17.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:a60fa1a25cca1bcc2bf87b8d6be37a741f0a3239fb5e9cfb7a37173b68ffcf87", size = 221299, upload-time = "2026-07-31T11:31:03.795Z" }, + { url = "https://files.pythonhosted.org/packages/bc/31/f966e8472337974f74d788b3ef6c6f3b8b9a5f201efd16a843c91d269fa5/websockets-17.0.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:e8208f2729cba030ff872a92064c97584eeb9502f53d32a05a0f05d5a17ca6c6", size = 219789, upload-time = "2026-07-31T11:31:05.08Z" }, + { url = "https://files.pythonhosted.org/packages/57/34/404e83a6cc7b0efcac810b7041bffd72ff76900e6fd0aa45a26c92fb2ffe/websockets-17.0.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:54cdcaa56f5d3eafd57058f0fa4a3de93a310b43a3c4699f06efc4c0bd054a5a", size = 220678, upload-time = "2026-07-31T11:31:06.635Z" }, + { url = "https://files.pythonhosted.org/packages/e5/70/8946188c2a68d67251859b589a3634918cf7867bf0b891347a5ecaa43d30/websockets-17.0.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:4d41c0a1d47a478bc432b3b9068097bee1ce0c5b19327ea6f75c2ab34ab1f2fb", size = 221697, upload-time = "2026-07-31T11:31:08.023Z" }, + { url = "https://files.pythonhosted.org/packages/04/16/ee73fc2083a2938ac6209f4ec804960496835b20a0068dbcfe8424957c04/websockets-17.0.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f991247276797d0c61ab7770bc9791eadc16f683b4d83517f624932adc1a8bab", size = 219390, upload-time = "2026-07-31T11:31:09.378Z" }, + { url = "https://files.pythonhosted.org/packages/94/6a/d5f88033c69932af6cdaa72da62516ade47c257e3bf69f4c0ba5f40e12a2/websockets-17.0.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:733e3cc7171fa1b899edbe725ef9382d0e960657dc1fd933f3281ae910c01dab", size = 220161, upload-time = "2026-07-31T11:31:10.915Z" }, + { url = "https://files.pythonhosted.org/packages/e1/2e/6183dd2c0370287ecf4afe0bb33aca364208e5e7b0e1a286adcaecc0c78b/websockets-17.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:810cb3fb5fa6e447216f4e82d9a85cb8aed0929ae3538153ddfe8a6e3121a58d", size = 220591, upload-time = "2026-07-31T11:31:12.289Z" }, + { url = "https://files.pythonhosted.org/packages/26/93/70f6516d85b9744f7eac224c4b1b9ef4e84133f80b53be02080cb1c3e663/websockets-17.0.1-cp314-cp314t-win32.whl", hash = "sha256:17ac37716c0244e82c9e384c41653c090b1864c6610224ca3857e7f7b58fce10", size = 212755, upload-time = "2026-07-31T11:31:13.883Z" }, + { url = "https://files.pythonhosted.org/packages/f1/2c/9d9c1da5a7ea9af307b386d25f64d1dead4729644198d2b92e36db5dfd41/websockets-17.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:bb31f42ea095ea826463c770829aa188a86c9a5c976b1467cbbf583c811de833", size = 213094, upload-time = "2026-07-31T11:31:15.367Z" }, + { url = "https://files.pythonhosted.org/packages/5b/24/a585e7573e128070605d003b5544729bcd58d9756c7e99d550818ca4b916/websockets-17.0.1-cp314-cp314t-win_arm64.whl", hash = "sha256:dbfae8e75b342e31fc6fd1a8bbb393b7cbb91d6cfd581650300a94381e7b7e2b", size = 213009, upload-time = "2026-07-31T11:31:16.776Z" }, + { url = "https://files.pythonhosted.org/packages/09/ce/3929538b2b9918f5eee623fbf3346893973191f6df93f19bbda097bd7bb7/websockets-17.0.1-py3-none-any.whl", hash = "sha256:c6be9cba65c65cc76dfa3d4619e359ff02a4476c74e179b215236c11a0b32345", size = 206718, upload-time = "2026-07-31T11:31:26.037Z" }, +] + +[[package]] +name = "zstandard" +version = "0.25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/aa/3e0508d5a5dd96529cdc5a97011299056e14c6505b678fd58938792794b1/zstandard-0.25.0.tar.gz", hash = "sha256:7713e1179d162cf5c7906da876ec2ccb9c3a9dcbdffef0cc7f70c3667a205f0b", size = 711513, upload-time = "2025-09-14T22:15:54.002Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3d/5c/f8923b595b55fe49e30612987ad8bf053aef555c14f05bb659dd5dbe3e8a/zstandard-0.25.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e29f0cf06974c899b2c188ef7f783607dbef36da4c242eb6c82dcd8b512855e3", size = 795887, upload-time = "2025-09-14T22:17:54.198Z" }, + { url = "https://files.pythonhosted.org/packages/8d/09/d0a2a14fc3439c5f874042dca72a79c70a532090b7ba0003be73fee37ae2/zstandard-0.25.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:05df5136bc5a011f33cd25bc9f506e7426c0c9b3f9954f056831ce68f3b6689f", size = 640658, upload-time = "2025-09-14T22:17:55.423Z" }, + { url = "https://files.pythonhosted.org/packages/5d/7c/8b6b71b1ddd517f68ffb55e10834388d4f793c49c6b83effaaa05785b0b4/zstandard-0.25.0-cp314-cp314-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:f604efd28f239cc21b3adb53eb061e2a205dc164be408e553b41ba2ffe0ca15c", size = 5379849, upload-time = "2025-09-14T22:17:57.372Z" }, + { url = "https://files.pythonhosted.org/packages/a4/86/a48e56320d0a17189ab7a42645387334fba2200e904ee47fc5a26c1fd8ca/zstandard-0.25.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:223415140608d0f0da010499eaa8ccdb9af210a543fac54bce15babbcfc78439", size = 5058095, upload-time = "2025-09-14T22:17:59.498Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ad/eb659984ee2c0a779f9d06dbfe45e2dc39d99ff40a319895df2d3d9a48e5/zstandard-0.25.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2e54296a283f3ab5a26fc9b8b5d4978ea0532f37b231644f367aa588930aa043", size = 5551751, upload-time = "2025-09-14T22:18:01.618Z" }, + { url = "https://files.pythonhosted.org/packages/61/b3/b637faea43677eb7bd42ab204dfb7053bd5c4582bfe6b1baefa80ac0c47b/zstandard-0.25.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ca54090275939dc8ec5dea2d2afb400e0f83444b2fc24e07df7fdef677110859", size = 6364818, upload-time = "2025-09-14T22:18:03.769Z" }, + { url = "https://files.pythonhosted.org/packages/31/dc/cc50210e11e465c975462439a492516a73300ab8caa8f5e0902544fd748b/zstandard-0.25.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e09bb6252b6476d8d56100e8147b803befa9a12cea144bbe629dd508800d1ad0", size = 5560402, upload-time = "2025-09-14T22:18:05.954Z" }, + { url = "https://files.pythonhosted.org/packages/c9/ae/56523ae9c142f0c08efd5e868a6da613ae76614eca1305259c3bf6a0ed43/zstandard-0.25.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a9ec8c642d1ec73287ae3e726792dd86c96f5681eb8df274a757bf62b750eae7", size = 4955108, upload-time = "2025-09-14T22:18:07.68Z" }, + { url = "https://files.pythonhosted.org/packages/98/cf/c899f2d6df0840d5e384cf4c4121458c72802e8bda19691f3b16619f51e9/zstandard-0.25.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a4089a10e598eae6393756b036e0f419e8c1d60f44a831520f9af41c14216cf2", size = 5269248, upload-time = "2025-09-14T22:18:09.753Z" }, + { url = "https://files.pythonhosted.org/packages/1b/c0/59e912a531d91e1c192d3085fc0f6fb2852753c301a812d856d857ea03c6/zstandard-0.25.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:f67e8f1a324a900e75b5e28ffb152bcac9fbed1cc7b43f99cd90f395c4375344", size = 5430330, upload-time = "2025-09-14T22:18:11.966Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1d/7e31db1240de2df22a58e2ea9a93fc6e38cc29353e660c0272b6735d6669/zstandard-0.25.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:9654dbc012d8b06fc3d19cc825af3f7bf8ae242226df5f83936cb39f5fdc846c", size = 5811123, upload-time = "2025-09-14T22:18:13.907Z" }, + { url = "https://files.pythonhosted.org/packages/f6/49/fac46df5ad353d50535e118d6983069df68ca5908d4d65b8c466150a4ff1/zstandard-0.25.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4203ce3b31aec23012d3a4cf4a2ed64d12fea5269c49aed5e4c3611b938e4088", size = 5359591, upload-time = "2025-09-14T22:18:16.465Z" }, + { url = "https://files.pythonhosted.org/packages/c2/38/f249a2050ad1eea0bb364046153942e34abba95dd5520af199aed86fbb49/zstandard-0.25.0-cp314-cp314-win32.whl", hash = "sha256:da469dc041701583e34de852d8634703550348d5822e66a0c827d39b05365b12", size = 444513, upload-time = "2025-09-14T22:18:20.61Z" }, + { url = "https://files.pythonhosted.org/packages/3a/43/241f9615bcf8ba8903b3f0432da069e857fc4fd1783bd26183db53c4804b/zstandard-0.25.0-cp314-cp314-win_amd64.whl", hash = "sha256:c19bcdd826e95671065f8692b5a4aa95c52dc7a02a4c5a0cac46deb879a017a2", size = 516118, upload-time = "2025-09-14T22:18:17.849Z" }, + { url = "https://files.pythonhosted.org/packages/f0/ef/da163ce2450ed4febf6467d77ccb4cd52c4c30ab45624bad26ca0a27260c/zstandard-0.25.0-cp314-cp314-win_arm64.whl", hash = "sha256:d7541afd73985c630bafcd6338d2518ae96060075f9463d7dc14cfb33514383d", size = 476940, upload-time = "2025-09-14T22:18:19.088Z" }, +]