diff --git a/.github/workflows/deploy-pages.yml b/.github/workflows/deploy-pages.yml
index 2774a67..7682eeb 100644
--- a/.github/workflows/deploy-pages.yml
+++ b/.github/workflows/deploy-pages.yml
@@ -1,11 +1,21 @@
name: Deploy Pages site
on:
+ pull_request:
+ branches:
+ - main
+ paths:
+ - 'docs/**'
+ - 'web/**'
+ - 'README.md'
+ - '.github/workflows/deploy-pages.yml'
push:
branches:
- main
paths:
+ - 'docs/**'
- 'web/**'
+ - 'README.md'
- '.github/workflows/deploy-pages.yml'
workflow_dispatch:
@@ -18,13 +28,29 @@ jobs:
steps:
- uses: actions/checkout@v4
+ - name: Setup Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: '22'
+ cache: npm
+ cache-dependency-path: docs/package-lock.json
+
+ - name: Install documentation dependencies
+ run: npm ci --prefix docs
+
+ - name: Build and verify Sourcey reference
+ run: npm run check --prefix docs
+
- name: Assemble GitHub Pages site
run: |
mkdir -p _site
cp -r web/* _site/
+ mkdir -p _site/api
+ cp -r docs/dist/* _site/api/
touch _site/.nojekyll
- name: Deploy to gh-pages
+ if: github.event_name != 'pull_request'
uses: peaceiris/actions-gh-pages@v4
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.gitignore b/.gitignore
index d097a19..54ee404 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,6 +8,8 @@ dist/
wheelhouse/
VERSION
graphics_cmod.egg-info/
+docs/node_modules/
+docs/dist/
# Cursor IDE throwaways (do not ignore the whole .cursor/ tree)
.cursor/debug*
diff --git a/README.md b/README.md
index 8ab34a8..4297eed 100644
--- a/README.md
+++ b/README.md
@@ -41,6 +41,7 @@ Firmware / editable builds: see **Build from source** below.
## Links
+- [Source-linked API reference](https://pydevices.github.io/graphics/api/)
- [Source](https://github.com/PyDevices/graphics)
- [Issues](https://github.com/PyDevices/graphics/issues)
- Related: [pydisplay-graphics](https://test.pypi.org/project/pydisplay-graphics/), [pydisplay](https://github.com/PyDevices/pydisplay)
diff --git a/docs/README.md b/docs/README.md
new file mode 100644
index 0000000..9512b27
--- /dev/null
+++ b/docs/README.md
@@ -0,0 +1,20 @@
+# API reference site
+
+This directory contains the reproducible Sourcey reference for the native
+`graphics` module. The generator reads the CPython binding tables and public C
+headers at the checked-out commit, then emits source-linked Markdown for the
+Python and native integration surfaces.
+
+```bash
+cd docs
+npm ci
+npm run check
+```
+
+`npm run check` regenerates the reference, builds the static site into `dist/`,
+and verifies API coverage, immutable source links, project-scoped search URLs,
+canonical URLs, and integration with the existing Pages deployment. Generated
+HTML remains untracked build output.
+
+The existing Pages workflow preserves the project homepage and publishes the
+Sourcey build below `/graphics/api/` after a merge to `main`.
diff --git a/docs/favicon.svg b/docs/favicon.svg
new file mode 100644
index 0000000..ec939f6
--- /dev/null
+++ b/docs/favicon.svg
@@ -0,0 +1,4 @@
+
diff --git a/docs/generated/area-clipping.md b/docs/generated/area-clipping.md
new file mode 100644
index 0000000..101b2c9
--- /dev/null
+++ b/docs/generated/area-clipping.md
@@ -0,0 +1,270 @@
+---
+title: Area and clipping
+description: Rectangle geometry, scoped clip contexts, and clipped canvas operations.
+---
+
+Source snapshot: [`68194959ad5bc5540aceb6b40807a8c4228af60a`](https://github.com/PyDevices/graphics/tree/68194959ad5bc5540aceb6b40807a8c4228af60a).
+
+Rectangle geometry, scoped clip contexts, and clipped canvas operations.
+
+Every entry below is generated from a public binding table or header declaration and links to its immutable source line.
+
+## `graphics.Area`
+
+```python
+class Area(x=0, y=0, w=0, h=0)
+```
+
+Immutable rectangle geometry used for bounds, clipping, and draw results.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L395)
+
+## `graphics.Area.contains`
+
+```python
+Area.contains(point_or_x, y=None)
+```
+
+Test whether the area contains a point.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L377)
+
+## `graphics.Area.contains_area`
+
+```python
+Area.contains_area(other)
+```
+
+Test whether another Area is fully contained.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L378)
+
+## `graphics.Area.intersects`
+
+```python
+Area.intersects(other)
+```
+
+Test whether two areas overlap.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L379)
+
+## `graphics.Area.touches_or_intersects`
+
+```python
+Area.touches_or_intersects(other)
+```
+
+Test whether two areas overlap or share an edge.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L380)
+
+## `graphics.Area.shift`
+
+```python
+Area.shift(dx=0, dy=0)
+```
+
+Return a copy translated by the requested offset.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L381)
+
+## `graphics.Area.clip`
+
+```python
+Area.clip(other)
+```
+
+Return the intersection with another Area.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L382)
+
+## `graphics.Area.offset`
+
+```python
+Area.offset(left, top=None, right=None, bottom=None)
+```
+
+Return an Area expanded independently on each edge.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L383)
+
+## `graphics.Area.inset`
+
+```python
+Area.inset(left, top=None, right=None, bottom=None)
+```
+
+Return an Area reduced independently on each edge.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L384)
+
+## `graphics.Area.x`
+
+```python
+Area.x
+```
+
+Left coordinate.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L229)
+
+## `graphics.Area.y`
+
+```python
+Area.y
+```
+
+Top coordinate.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L230)
+
+## `graphics.Area.w`
+
+```python
+Area.w
+```
+
+Width in pixels.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L231)
+
+## `graphics.Area.h`
+
+```python
+Area.h
+```
+
+Height in pixels.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L232)
+
+## `graphics.ClipContext`
+
+```python
+class ClipContext(draw, area)
+```
+
+Context manager returned by Draw.clip() for scoped clipping.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2147)
+
+## `graphics.ClipContext.__enter__`
+
+```python
+ClipContext.__enter__()
+```
+
+Push the requested clipping area and return the effective clip.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2140)
+
+## `graphics.ClipContext.__exit__`
+
+```python
+ClipContext.__exit__(exc_type, exc_value, traceback)
+```
+
+Pop the clipping area when leaving the context.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2141)
+
+## `graphics.ClippedCanvas`
+
+```python
+class ClippedCanvas(canvas, clip)
+```
+
+Canvas proxy that intersects writes with a fixed Area.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2414)
+
+## `graphics.ClippedCanvas.pixel`
+
+```python
+ClippedCanvas.pixel(x, y, color=None)
+```
+
+Read or write one pixel, depending on whether a color is supplied.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2402)
+
+## `graphics.ClippedCanvas.fill`
+
+```python
+ClippedCanvas.fill(color)
+```
+
+Fill the target canvas with one color and return the affected Area.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2403)
+
+## `graphics.ClippedCanvas.fill_rect`
+
+```python
+ClippedCanvas.fill_rect(x, y, width, height, color)
+```
+
+Fill a rectangular region and return the clipped affected Area.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2404)
+
+## `graphics.ClippedCanvas.hline`
+
+```python
+ClippedCanvas.hline(x, y, width, color)
+```
+
+Draw a horizontal line.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2405)
+
+## `graphics.ClippedCanvas.vline`
+
+```python
+ClippedCanvas.vline(x, y, height, color)
+```
+
+Draw a vertical line.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2406)
+
+## `graphics.ClippedCanvas.blit_rect`
+
+```python
+ClippedCanvas.blit_rect(buffer, x, y, width, height)
+```
+
+Copy a packed RGB565 rectangle onto the target.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2407)
+
+## `graphics.ClippedCanvas.blit_transparent`
+
+```python
+ClippedCanvas.blit_transparent(buffer, x, y, width, height, key)
+```
+
+Copy a packed RGB565 rectangle while skipping the transparent key.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2408)
+
+## `graphics.ClippedCanvas.width`
+
+```python
+ClippedCanvas.width
+```
+
+Width in pixels.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2223)
+
+## `graphics.ClippedCanvas.height`
+
+```python
+ClippedCanvas.height
+```
+
+Height in pixels.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2224)
diff --git a/docs/generated/drawing.md b/docs/generated/drawing.md
new file mode 100644
index 0000000..cd62d10
--- /dev/null
+++ b/docs/generated/drawing.md
@@ -0,0 +1,470 @@
+---
+title: Drawing operations
+description: Object-oriented and module-level shape, text, polygon, and blit operations.
+---
+
+Source snapshot: [`68194959ad5bc5540aceb6b40807a8c4228af60a`](https://github.com/PyDevices/graphics/tree/68194959ad5bc5540aceb6b40807a8c4228af60a).
+
+Object-oriented and module-level shape, text, polygon, and blit operations.
+
+Every entry below is generated from a public binding table or header declaration and links to its immutable source line.
+
+## `graphics.Draw`
+
+```python
+class Draw(canvas)
+```
+
+Drawing facade that adds a bounded clip stack to any compatible canvas.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2085)
+
+## `graphics.Draw.fill`
+
+```python
+Draw.fill(color)
+```
+
+Fill the target canvas with one color and return the affected Area.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2057)
+
+## `graphics.Draw.fill_rect`
+
+```python
+Draw.fill_rect(x, y, width, height, color)
+```
+
+Fill a rectangular region and return the clipped affected Area.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2058)
+
+## `graphics.Draw.pixel`
+
+```python
+Draw.pixel(x, y, color=None)
+```
+
+Read or write one pixel, depending on whether a color is supplied.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2059)
+
+## `graphics.Draw.hline`
+
+```python
+Draw.hline(x, y, width, color)
+```
+
+Draw a horizontal line.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2060)
+
+## `graphics.Draw.vline`
+
+```python
+Draw.vline(x, y, height, color)
+```
+
+Draw a vertical line.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2061)
+
+## `graphics.Draw.line`
+
+```python
+Draw.line(x1, y1, x2, y2, color)
+```
+
+Draw a line between two points.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2062)
+
+## `graphics.Draw.rect`
+
+```python
+Draw.rect(x, y, width, height, color, fill=False)
+```
+
+Draw an outlined or filled rectangle.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2063)
+
+## `graphics.Draw.round_rect`
+
+```python
+Draw.round_rect(x, y, width, height, radius, color, fill=False)
+```
+
+Draw an outlined or filled rounded rectangle.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2064)
+
+## `graphics.Draw.circle`
+
+```python
+Draw.circle(x, y, radius, color, fill=False)
+```
+
+Draw an outlined or filled circle.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2065)
+
+## `graphics.Draw.ellipse`
+
+```python
+Draw.ellipse(x, y, x_radius, y_radius, color, fill=False, mask=0x0F)
+```
+
+Draw selected quadrants of an outlined or filled ellipse.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2066)
+
+## `graphics.Draw.arc`
+
+```python
+Draw.arc(x, y, radius, start_angle, end_angle, color)
+```
+
+Draw a circular arc between two angles.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2067)
+
+## `graphics.Draw.triangle`
+
+```python
+Draw.triangle(x0, y0, x1, y1, x2, y2, color, fill=False)
+```
+
+Draw an outlined or filled triangle.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2068)
+
+## `graphics.Draw.gradient_rect`
+
+```python
+Draw.gradient_rect(x, y, width, height, color1, color2=None, vertical=True)
+```
+
+Fill a rectangle with a horizontal or vertical color gradient.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2069)
+
+## `graphics.Draw.poly`
+
+```python
+Draw.poly(x, y, coordinates, color, fill=False)
+```
+
+Draw a polygon from a packed coordinate buffer.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2070)
+
+## `graphics.Draw.polygon`
+
+```python
+Draw.polygon(points, x, y, color, angle=0, center_x=0, center_y=0)
+```
+
+Draw a translated and optionally rotated sequence of points.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2071)
+
+## `graphics.Draw.blit`
+
+```python
+Draw.blit(source, x, y, key=-1, palette=None)
+```
+
+Copy another framebuffer onto the target with optional keying and palette lookup.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2072)
+
+## `graphics.Draw.blit_rect`
+
+```python
+Draw.blit_rect(buffer, x, y, width, height)
+```
+
+Copy a packed RGB565 rectangle onto the target.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2073)
+
+## `graphics.Draw.blit_transparent`
+
+```python
+Draw.blit_transparent(buffer, x, y, width, height, key)
+```
+
+Copy a packed RGB565 rectangle while skipping the transparent key.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2074)
+
+## `graphics.Draw.text`
+
+```python
+Draw.text(text, x, y, color=1, scale=1, inverted=False, font_data=None, height=8)
+```
+
+Render bitmap text with selectable height, scale, and inversion.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2075)
+
+## `graphics.Draw.text8`
+
+```python
+Draw.text8(text, x, y, color=1, scale=1, inverted=False, font_data=None)
+```
+
+Render text with the built-in 8-pixel-high font path.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2076)
+
+## `graphics.Draw.text14`
+
+```python
+Draw.text14(text, x, y, color=1, scale=1, inverted=False, font_data=None)
+```
+
+Render text with the built-in 14-pixel-high font path.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2077)
+
+## `graphics.Draw.text16`
+
+```python
+Draw.text16(text, x, y, color=1, scale=1, inverted=False, font_data=None)
+```
+
+Render text with the built-in 16-pixel-high font path.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2078)
+
+## `graphics.Draw.clip`
+
+```python
+Draw.clip(area_or_x, y=None, width=None, height=None)
+```
+
+Return the intersection with another Area.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2079)
+
+## `graphics.fill`
+
+```python
+graphics.fill(canvas, color)
+```
+
+Fill the target canvas with one color and return the affected Area.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2953)
+
+## `graphics.fill_rect`
+
+```python
+graphics.fill_rect(canvas, x, y, width, height, color)
+```
+
+Fill a rectangular region and return the clipped affected Area.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2954)
+
+## `graphics.pixel`
+
+```python
+graphics.pixel(canvas, x, y, color=None)
+```
+
+Read or write one pixel, depending on whether a color is supplied.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2955)
+
+## `graphics.hline`
+
+```python
+graphics.hline(canvas, x, y, width, color)
+```
+
+Draw a horizontal line.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2956)
+
+## `graphics.vline`
+
+```python
+graphics.vline(canvas, x, y, height, color)
+```
+
+Draw a vertical line.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2957)
+
+## `graphics.line`
+
+```python
+graphics.line(canvas, x1, y1, x2, y2, color)
+```
+
+Draw a line between two points.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2958)
+
+## `graphics.rect`
+
+```python
+graphics.rect(canvas, x, y, width, height, color, fill=False)
+```
+
+Draw an outlined or filled rectangle.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2959)
+
+## `graphics.round_rect`
+
+```python
+graphics.round_rect(canvas, x, y, width, height, radius, color, fill=False)
+```
+
+Draw an outlined or filled rounded rectangle.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2960)
+
+## `graphics.circle`
+
+```python
+graphics.circle(canvas, x, y, radius, color, fill=False)
+```
+
+Draw an outlined or filled circle.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2961)
+
+## `graphics.ellipse`
+
+```python
+graphics.ellipse(canvas, x, y, x_radius, y_radius, color, fill=False, mask=0x0F)
+```
+
+Draw selected quadrants of an outlined or filled ellipse.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2962)
+
+## `graphics.arc`
+
+```python
+graphics.arc(canvas, x, y, radius, start_angle, end_angle, color)
+```
+
+Draw a circular arc between two angles.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2963)
+
+## `graphics.triangle`
+
+```python
+graphics.triangle(canvas, x0, y0, x1, y1, x2, y2, color, fill=False)
+```
+
+Draw an outlined or filled triangle.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2964)
+
+## `graphics.gradient_rect`
+
+```python
+graphics.gradient_rect(canvas, x, y, width, height, color1, color2=None, vertical=True)
+```
+
+Fill a rectangle with a horizontal or vertical color gradient.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2965)
+
+## `graphics.poly`
+
+```python
+graphics.poly(canvas, x, y, coordinates, color, fill=False)
+```
+
+Draw a polygon from a packed coordinate buffer.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2966)
+
+## `graphics.blit`
+
+```python
+graphics.blit(canvas, source, x, y, key=-1, palette=None)
+```
+
+Copy another framebuffer onto the target with optional keying and palette lookup.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2967)
+
+## `graphics.blit_rect`
+
+```python
+graphics.blit_rect(canvas, buffer, x, y, width, height)
+```
+
+Copy a packed RGB565 rectangle onto the target.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2968)
+
+## `graphics.blit_transparent`
+
+```python
+graphics.blit_transparent(canvas, buffer, x, y, width, height, key)
+```
+
+Copy a packed RGB565 rectangle while skipping the transparent key.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2969)
+
+## `graphics.polygon`
+
+```python
+graphics.polygon(canvas, points, x, y, color, angle=0, center_x=0, center_y=0)
+```
+
+Draw a translated and optionally rotated sequence of points.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2970)
+
+## `graphics.text`
+
+```python
+graphics.text(canvas, text, x, y, color=1, scale=1, inverted=False, font_data=None, height=8)
+```
+
+Render bitmap text with selectable height, scale, and inversion.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2976)
+
+## `graphics.text8`
+
+```python
+graphics.text8(canvas, text, x, y, color=1, scale=1, inverted=False, font_data=None)
+```
+
+Render text with the built-in 8-pixel-high font path.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2977)
+
+## `graphics.text14`
+
+```python
+graphics.text14(canvas, text, x, y, color=1, scale=1, inverted=False, font_data=None)
+```
+
+Render text with the built-in 14-pixel-high font path.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2978)
+
+## `graphics.text16`
+
+```python
+graphics.text16(canvas, text, x, y, color=1, scale=1, inverted=False, font_data=None)
+```
+
+Render text with the built-in 16-pixel-high font path.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2979)
diff --git a/docs/generated/fonts-images.md b/docs/generated/fonts-images.md
new file mode 100644
index 0000000..89d4aa4
--- /dev/null
+++ b/docs/generated/fonts-images.md
@@ -0,0 +1,230 @@
+---
+title: Fonts and images
+description: Bitmap font rendering, RGB565 bitmap access, and image conversion helpers.
+---
+
+Source snapshot: [`68194959ad5bc5540aceb6b40807a8c4228af60a`](https://github.com/PyDevices/graphics/tree/68194959ad5bc5540aceb6b40807a8c4228af60a).
+
+Bitmap font rendering, RGB565 bitmap access, and image conversion helpers.
+
+Every entry below is generated from a public binding table or header declaration and links to its immutable source line.
+
+## `graphics.Font`
+
+```python
+class Font(font_data=None, height=0, cached=True)
+```
+
+Bitmap font loader and renderer for built-in, file, or buffer-backed glyph data.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2643)
+
+## `graphics.Font.text`
+
+```python
+Font.text(canvas, text, x, y, color, scale=1, inverted=False)
+```
+
+Render bitmap text with selectable height, scale, and inversion.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2633)
+
+## `graphics.Font.draw_char`
+
+```python
+Font.draw_char(char, x, y, canvas, color, scale=1, inverted=False)
+```
+
+Render one glyph through this Font onto a canvas.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2634)
+
+## `graphics.Font.text_width`
+
+```python
+Font.text_width(text, scale=1)
+```
+
+Measure rendered text width at the selected scale.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2635)
+
+## `graphics.Font.deinit`
+
+```python
+Font.deinit()
+```
+
+Release resources owned by the object.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2636)
+
+## `graphics.Font.export`
+
+```python
+Font.export(filename)
+```
+
+Write cached font bytes to a file.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2637)
+
+## `graphics.Font.width`
+
+```python
+Font.width
+```
+
+Width in pixels.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2626)
+
+## `graphics.Font.height`
+
+```python
+Font.height
+```
+
+Height in pixels.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2627)
+
+## `graphics.Font.font_name`
+
+```python
+Font.font_name
+```
+
+Font source name or the in-memory/default identifier.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2628)
+
+## `graphics.BMP565`
+
+```python
+class BMP565(filename=None, source=None, streamed=False, mirrored=False, width=None, height=None)
+```
+
+RGB565 bitmap reader supporting buffered and streamed access.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2934)
+
+## `graphics.BMP565.save`
+
+```python
+BMP565.save(filename=None)
+```
+
+Write the current image or bitmap to a versioned output path.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2923)
+
+## `graphics.BMP565.deinit`
+
+```python
+BMP565.deinit()
+```
+
+Release resources owned by the object.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2924)
+
+## `graphics.BMP565.width`
+
+```python
+BMP565.width
+```
+
+Width in pixels.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2914)
+
+## `graphics.BMP565.height`
+
+```python
+BMP565.height
+```
+
+Height in pixels.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2915)
+
+## `graphics.BMP565.buffer`
+
+```python
+BMP565.buffer
+```
+
+Backing pixel buffer when the object owns or exposes one.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2916)
+
+## `graphics.BMP565.bpp`
+
+```python
+BMP565.bpp
+```
+
+Bitmap color depth in bits per pixel.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2917)
+
+## `graphics.BMP565.BPP`
+
+```python
+BMP565.BPP
+```
+
+Bitmap storage width in bytes per pixel.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2918)
+
+## `graphics.load_image`
+
+```python
+graphics.load_image(path)
+```
+
+Load a supported image file as a FrameBuffer.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2971)
+
+## `graphics.save_image`
+
+```python
+graphics.save_image(framebuffer, path='screenshot')
+```
+
+Save a FrameBuffer to a versioned image path.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2972)
+
+## `graphics.bmp_to_framebuffer`
+
+```python
+graphics.bmp_to_framebuffer(path)
+```
+
+Decode a BMP file into a FrameBuffer.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2973)
+
+## `graphics.pbm_to_framebuffer`
+
+```python
+graphics.pbm_to_framebuffer(path)
+```
+
+Decode a PBM file into a FrameBuffer.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2974)
+
+## `graphics.pgm_to_framebuffer`
+
+```python
+graphics.pgm_to_framebuffer(path)
+```
+
+Decode a PGM file into a FrameBuffer.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2975)
diff --git a/docs/generated/framebuffer.md b/docs/generated/framebuffer.md
new file mode 100644
index 0000000..7fe5b31
--- /dev/null
+++ b/docs/generated/framebuffer.md
@@ -0,0 +1,320 @@
+---
+title: FrameBuffer
+description: Native framebuffer construction, drawing, text, blitting, scrolling, and file output.
+---
+
+Source snapshot: [`68194959ad5bc5540aceb6b40807a8c4228af60a`](https://github.com/PyDevices/graphics/tree/68194959ad5bc5540aceb6b40807a8c4228af60a).
+
+Native framebuffer construction, drawing, text, blitting, scrolling, and file output.
+
+Every entry below is generated from a public binding table or header declaration and links to its immutable source line.
+
+## `graphics.FrameBuffer`
+
+```python
+class FrameBuffer(buffer, width, height, format, stride=None)
+```
+
+A framebuf-compatible native drawing surface backed by a writable buffer.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1112)
+
+## `graphics.FrameBuffer.from_file`
+
+```python
+FrameBuffer.from_file(path)
+```
+
+Load a supported image file into a new FrameBuffer.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1082)
+
+## `graphics.FrameBuffer.fill`
+
+```python
+FrameBuffer.fill(color)
+```
+
+Fill the target canvas with one color and return the affected Area.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1083)
+
+## `graphics.FrameBuffer.fill_rect`
+
+```python
+FrameBuffer.fill_rect(x, y, width, height, color)
+```
+
+Fill a rectangular region and return the clipped affected Area.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1084)
+
+## `graphics.FrameBuffer.pixel`
+
+```python
+FrameBuffer.pixel(x, y, color=None)
+```
+
+Read or write one pixel, depending on whether a color is supplied.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1085)
+
+## `graphics.FrameBuffer.hline`
+
+```python
+FrameBuffer.hline(x, y, width, color)
+```
+
+Draw a horizontal line.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1086)
+
+## `graphics.FrameBuffer.vline`
+
+```python
+FrameBuffer.vline(x, y, height, color)
+```
+
+Draw a vertical line.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1087)
+
+## `graphics.FrameBuffer.rect`
+
+```python
+FrameBuffer.rect(x, y, width, height, color, fill=False)
+```
+
+Draw an outlined or filled rectangle.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1088)
+
+## `graphics.FrameBuffer.round_rect`
+
+```python
+FrameBuffer.round_rect(x, y, width, height, radius, color, fill=False)
+```
+
+Draw an outlined or filled rounded rectangle.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1089)
+
+## `graphics.FrameBuffer.circle`
+
+```python
+FrameBuffer.circle(x, y, radius, color, fill=False)
+```
+
+Draw an outlined or filled circle.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1090)
+
+## `graphics.FrameBuffer.line`
+
+```python
+FrameBuffer.line(x1, y1, x2, y2, color)
+```
+
+Draw a line between two points.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1091)
+
+## `graphics.FrameBuffer.ellipse`
+
+```python
+FrameBuffer.ellipse(x, y, x_radius, y_radius, color, fill=False, mask=0x0F)
+```
+
+Draw selected quadrants of an outlined or filled ellipse.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1092)
+
+## `graphics.FrameBuffer.poly`
+
+```python
+FrameBuffer.poly(x, y, coordinates, color, fill=False)
+```
+
+Draw a polygon from a packed coordinate buffer.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1093)
+
+## `graphics.FrameBuffer.arc`
+
+```python
+FrameBuffer.arc(x, y, radius, start_angle, end_angle, color)
+```
+
+Draw a circular arc between two angles.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1094)
+
+## `graphics.FrameBuffer.triangle`
+
+```python
+FrameBuffer.triangle(x0, y0, x1, y1, x2, y2, color, fill=False)
+```
+
+Draw an outlined or filled triangle.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1095)
+
+## `graphics.FrameBuffer.gradient_rect`
+
+```python
+FrameBuffer.gradient_rect(x, y, width, height, color1, color2=None, vertical=True)
+```
+
+Fill a rectangle with a horizontal or vertical color gradient.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1096)
+
+## `graphics.FrameBuffer.polygon`
+
+```python
+FrameBuffer.polygon(points, x, y, color, angle=0, center_x=0, center_y=0)
+```
+
+Draw a translated and optionally rotated sequence of points.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1097)
+
+## `graphics.FrameBuffer.blit`
+
+```python
+FrameBuffer.blit(source, x, y, key=-1, palette=None)
+```
+
+Copy another framebuffer onto the target with optional keying and palette lookup.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1098)
+
+## `graphics.FrameBuffer.blit_rect`
+
+```python
+FrameBuffer.blit_rect(buffer, x, y, width, height)
+```
+
+Copy a packed RGB565 rectangle onto the target.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1099)
+
+## `graphics.FrameBuffer.blit_transparent`
+
+```python
+FrameBuffer.blit_transparent(buffer, x, y, width, height, key)
+```
+
+Copy a packed RGB565 rectangle while skipping the transparent key.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1100)
+
+## `graphics.FrameBuffer.text`
+
+```python
+FrameBuffer.text(text, x, y, color=1, scale=1, inverted=False, font_data=None, height=8)
+```
+
+Render bitmap text with selectable height, scale, and inversion.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1101)
+
+## `graphics.FrameBuffer.text8`
+
+```python
+FrameBuffer.text8(text, x, y, color=1, scale=1, inverted=False, font_data=None)
+```
+
+Render text with the built-in 8-pixel-high font path.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1102)
+
+## `graphics.FrameBuffer.text14`
+
+```python
+FrameBuffer.text14(text, x, y, color=1, scale=1, inverted=False, font_data=None)
+```
+
+Render text with the built-in 14-pixel-high font path.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1103)
+
+## `graphics.FrameBuffer.text16`
+
+```python
+FrameBuffer.text16(text, x, y, color=1, scale=1, inverted=False, font_data=None)
+```
+
+Render text with the built-in 16-pixel-high font path.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1104)
+
+## `graphics.FrameBuffer.scroll`
+
+```python
+FrameBuffer.scroll(x_step, y_step)
+```
+
+Move framebuffer contents by the requested x and y offsets.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1105)
+
+## `graphics.FrameBuffer.save`
+
+```python
+FrameBuffer.save(path='screenshot')
+```
+
+Write the current image or bitmap to a versioned output path.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1106)
+
+## `graphics.FrameBuffer.width`
+
+```python
+FrameBuffer.width
+```
+
+Width in pixels.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1073)
+
+## `graphics.FrameBuffer.height`
+
+```python
+FrameBuffer.height
+```
+
+Height in pixels.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1074)
+
+## `graphics.FrameBuffer.buffer`
+
+```python
+FrameBuffer.buffer
+```
+
+Backing pixel buffer when the object owns or exposes one.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1075)
+
+## `graphics.FrameBuffer.format`
+
+```python
+FrameBuffer.format
+```
+
+Framebuffer pixel-format identifier.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1076)
+
+## `graphics.FrameBuffer.color_depth`
+
+```python
+FrameBuffer.color_depth
+```
+
+Bits per pixel for the framebuffer format.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1077)
diff --git a/docs/generated/introduction.md b/docs/generated/introduction.md
new file mode 100644
index 0000000..59b4bda
--- /dev/null
+++ b/docs/generated/introduction.md
@@ -0,0 +1,40 @@
+---
+title: graphics API reference
+description: Source-linked Python and native C reference for the PyDevices graphics module.
+---
+
+`graphics` is the all-C drawing module shared by CPython, MicroPython, and CircuitPython builds in the PyDevices stack.
+
+## Quick start
+
+```python
+from graphics import Area, FrameBuffer, RGB565
+
+buffer = bytearray(160 * 128 * 2)
+canvas = FrameBuffer(buffer, 160, 128, RGB565)
+changed = canvas.fill_rect(10, 10, 40, 24, 0xF800)
+assert changed == Area(10, 10, 40, 24)
+```
+
+## Reference snapshot
+
+- Release line: **v0.0.8**
+- Source commit: [`68194959ad5bc5540aceb6b40807a8c4228af60a`](https://github.com/PyDevices/graphics/tree/68194959ad5bc5540aceb6b40807a8c4228af60a)
+- License: **MIT**
+- Adapter: **CPython binding tables plus public C headers**
+- Python API entries indexed: **136**
+- Native C functions indexed: **59**
+- Source files represented: **7**
+- Tracked C and header files in the repository: **31**
+
+The generated pages expose the user-facing Python names and the lower-level C entry points used by firmware and extension integrations. Every entry links to the exact source snapshot above.
+
+## Browse the reference
+
+- [Area and clipping](https://pydevices.github.io/graphics/api/generated/area-clipping.html) — 26 entries
+- [FrameBuffer](https://pydevices.github.io/graphics/api/generated/framebuffer.html) — 31 entries
+- [Drawing operations](https://pydevices.github.io/graphics/api/generated/drawing.html) — 46 entries
+- [Fonts and images](https://pydevices.github.io/graphics/api/generated/fonts-images.html) — 22 entries
+- [Runtime and pixel formats](https://pydevices.github.io/graphics/api/generated/module-formats.html) — 11 entries
+- [Native drawing and framebuffer API](https://pydevices.github.io/graphics/api/generated/native-drawing.html) — 34 entries
+- [Native fonts, images, and runtime API](https://pydevices.github.io/graphics/api/generated/native-assets-runtime.html) — 25 entries
diff --git a/docs/generated/manifest.json b/docs/generated/manifest.json
new file mode 100644
index 0000000..bc52840
--- /dev/null
+++ b/docs/generated/manifest.json
@@ -0,0 +1,2166 @@
+{
+ "adapter": "cpython-binding-tables+public-c-headers",
+ "commit": "68194959ad5bc5540aceb6b40807a8c4228af60a",
+ "generated_with": "sourcey@3.6.5",
+ "license": "MIT",
+ "native_c_symbol_count": 59,
+ "pages": [
+ {
+ "slug": "area-clipping",
+ "source_files": [
+ "gfx_module_cpy.c"
+ ],
+ "symbol_count": 26,
+ "title": "Area and clipping"
+ },
+ {
+ "slug": "framebuffer",
+ "source_files": [
+ "gfx_module_cpy.c"
+ ],
+ "symbol_count": 31,
+ "title": "FrameBuffer"
+ },
+ {
+ "slug": "drawing",
+ "source_files": [
+ "gfx_module_cpy.c"
+ ],
+ "symbol_count": 46,
+ "title": "Drawing operations"
+ },
+ {
+ "slug": "fonts-images",
+ "source_files": [
+ "gfx_module_cpy.c"
+ ],
+ "symbol_count": 22,
+ "title": "Fonts and images"
+ },
+ {
+ "slug": "module-formats",
+ "source_files": [
+ "gfx_module_cpy.c"
+ ],
+ "symbol_count": 11,
+ "title": "Runtime and pixel formats"
+ },
+ {
+ "slug": "native-drawing",
+ "source_files": [
+ "gfx_draw.h",
+ "gfx_framebuffer.h",
+ "gfx_shapes.h"
+ ],
+ "symbol_count": 34,
+ "title": "Native drawing and framebuffer API"
+ },
+ {
+ "slug": "native-assets-runtime",
+ "source_files": [
+ "gfx_bmp565.h",
+ "gfx_files.h",
+ "gfx_font.h"
+ ],
+ "symbol_count": 25,
+ "title": "Native fonts, images, and runtime API"
+ }
+ ],
+ "python_symbol_count": 136,
+ "release": "v0.0.8",
+ "repository": "https://github.com/PyDevices/graphics",
+ "repository_native_source_file_count": 31,
+ "schema": "pydevices-graphics-sourcey-reference.v1",
+ "source_file_count": 7,
+ "source_files": [
+ "gfx_bmp565.h",
+ "gfx_draw.h",
+ "gfx_files.h",
+ "gfx_font.h",
+ "gfx_framebuffer.h",
+ "gfx_module_cpy.c",
+ "gfx_shapes.h"
+ ],
+ "symbol_count": 195,
+ "symbols": [
+ {
+ "kind": "class",
+ "line": 395,
+ "name": "Area",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Area",
+ "signature": "class Area(x=0, y=0, w=0, h=0)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L395",
+ "summary": "Immutable rectangle geometry used for bounds, clipping, and draw results."
+ },
+ {
+ "binding": "area_contains",
+ "kind": "method",
+ "line": 377,
+ "name": "contains",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Area.contains",
+ "signature": "Area.contains(point_or_x, y=None)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L377",
+ "summary": "Test whether the area contains a point."
+ },
+ {
+ "binding": "area_contains_area",
+ "kind": "method",
+ "line": 378,
+ "name": "contains_area",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Area.contains_area",
+ "signature": "Area.contains_area(other)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L378",
+ "summary": "Test whether another Area is fully contained."
+ },
+ {
+ "binding": "area_intersects",
+ "kind": "method",
+ "line": 379,
+ "name": "intersects",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Area.intersects",
+ "signature": "Area.intersects(other)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L379",
+ "summary": "Test whether two areas overlap."
+ },
+ {
+ "binding": "area_touches_or_intersects",
+ "kind": "method",
+ "line": 380,
+ "name": "touches_or_intersects",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Area.touches_or_intersects",
+ "signature": "Area.touches_or_intersects(other)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L380",
+ "summary": "Test whether two areas overlap or share an edge."
+ },
+ {
+ "binding": "area_shift",
+ "kind": "method",
+ "line": 381,
+ "name": "shift",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Area.shift",
+ "signature": "Area.shift(dx=0, dy=0)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L381",
+ "summary": "Return a copy translated by the requested offset."
+ },
+ {
+ "binding": "area_clip",
+ "kind": "method",
+ "line": 382,
+ "name": "clip",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Area.clip",
+ "signature": "Area.clip(other)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L382",
+ "summary": "Return the intersection with another Area."
+ },
+ {
+ "binding": "area_offset",
+ "kind": "method",
+ "line": 383,
+ "name": "offset",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Area.offset",
+ "signature": "Area.offset(left, top=None, right=None, bottom=None)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L383",
+ "summary": "Return an Area expanded independently on each edge."
+ },
+ {
+ "binding": "area_inset",
+ "kind": "method",
+ "line": 384,
+ "name": "inset",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Area.inset",
+ "signature": "Area.inset(left, top=None, right=None, bottom=None)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L384",
+ "summary": "Return an Area reduced independently on each edge."
+ },
+ {
+ "binding": "area_get_x",
+ "kind": "property",
+ "line": 229,
+ "name": "x",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Area.x",
+ "signature": "Area.x",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L229",
+ "summary": "Left coordinate."
+ },
+ {
+ "binding": "area_get_y",
+ "kind": "property",
+ "line": 230,
+ "name": "y",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Area.y",
+ "signature": "Area.y",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L230",
+ "summary": "Top coordinate."
+ },
+ {
+ "binding": "area_get_w",
+ "kind": "property",
+ "line": 231,
+ "name": "w",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Area.w",
+ "signature": "Area.w",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L231",
+ "summary": "Width in pixels."
+ },
+ {
+ "binding": "area_get_h",
+ "kind": "property",
+ "line": 232,
+ "name": "h",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Area.h",
+ "signature": "Area.h",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L232",
+ "summary": "Height in pixels."
+ },
+ {
+ "kind": "class",
+ "line": 2147,
+ "name": "ClipContext",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.ClipContext",
+ "signature": "class ClipContext(draw, area)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2147",
+ "summary": "Context manager returned by Draw.clip() for scoped clipping."
+ },
+ {
+ "binding": "clipctx_enter",
+ "kind": "method",
+ "line": 2140,
+ "name": "__enter__",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.ClipContext.__enter__",
+ "signature": "ClipContext.__enter__()",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2140",
+ "summary": "Push the requested clipping area and return the effective clip."
+ },
+ {
+ "binding": "clipctx_exit",
+ "kind": "method",
+ "line": 2141,
+ "name": "__exit__",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.ClipContext.__exit__",
+ "signature": "ClipContext.__exit__(exc_type, exc_value, traceback)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2141",
+ "summary": "Pop the clipping area when leaving the context."
+ },
+ {
+ "kind": "class",
+ "line": 2414,
+ "name": "ClippedCanvas",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.ClippedCanvas",
+ "signature": "class ClippedCanvas(canvas, clip)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2414",
+ "summary": "Canvas proxy that intersects writes with a fixed Area."
+ },
+ {
+ "binding": "clipped_pixel",
+ "kind": "method",
+ "line": 2402,
+ "name": "pixel",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.ClippedCanvas.pixel",
+ "signature": "ClippedCanvas.pixel(x, y, color=None)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2402",
+ "summary": "Read or write one pixel, depending on whether a color is supplied."
+ },
+ {
+ "binding": "clipped_fill",
+ "kind": "method",
+ "line": 2403,
+ "name": "fill",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.ClippedCanvas.fill",
+ "signature": "ClippedCanvas.fill(color)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2403",
+ "summary": "Fill the target canvas with one color and return the affected Area."
+ },
+ {
+ "binding": "clipped_fill_rect",
+ "kind": "method",
+ "line": 2404,
+ "name": "fill_rect",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.ClippedCanvas.fill_rect",
+ "signature": "ClippedCanvas.fill_rect(x, y, width, height, color)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2404",
+ "summary": "Fill a rectangular region and return the clipped affected Area."
+ },
+ {
+ "binding": "clipped_hline",
+ "kind": "method",
+ "line": 2405,
+ "name": "hline",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.ClippedCanvas.hline",
+ "signature": "ClippedCanvas.hline(x, y, width, color)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2405",
+ "summary": "Draw a horizontal line."
+ },
+ {
+ "binding": "clipped_vline",
+ "kind": "method",
+ "line": 2406,
+ "name": "vline",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.ClippedCanvas.vline",
+ "signature": "ClippedCanvas.vline(x, y, height, color)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2406",
+ "summary": "Draw a vertical line."
+ },
+ {
+ "binding": "clipped_blit_rect",
+ "kind": "method",
+ "line": 2407,
+ "name": "blit_rect",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.ClippedCanvas.blit_rect",
+ "signature": "ClippedCanvas.blit_rect(buffer, x, y, width, height)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2407",
+ "summary": "Copy a packed RGB565 rectangle onto the target."
+ },
+ {
+ "binding": "clipped_blit_transparent",
+ "kind": "method",
+ "line": 2408,
+ "name": "blit_transparent",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.ClippedCanvas.blit_transparent",
+ "signature": "ClippedCanvas.blit_transparent(buffer, x, y, width, height, key)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2408",
+ "summary": "Copy a packed RGB565 rectangle while skipping the transparent key."
+ },
+ {
+ "binding": "clipped_get_width",
+ "kind": "property",
+ "line": 2223,
+ "name": "width",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.ClippedCanvas.width",
+ "signature": "ClippedCanvas.width",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2223",
+ "summary": "Width in pixels."
+ },
+ {
+ "binding": "clipped_get_height",
+ "kind": "property",
+ "line": 2224,
+ "name": "height",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.ClippedCanvas.height",
+ "signature": "ClippedCanvas.height",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2224",
+ "summary": "Height in pixels."
+ },
+ {
+ "kind": "class",
+ "line": 1112,
+ "name": "FrameBuffer",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.FrameBuffer",
+ "signature": "class FrameBuffer(buffer, width, height, format, stride=None)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1112",
+ "summary": "A framebuf-compatible native drawing surface backed by a writable buffer."
+ },
+ {
+ "binding": "framebuffer_from_file",
+ "kind": "method",
+ "line": 1082,
+ "name": "from_file",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.FrameBuffer.from_file",
+ "signature": "FrameBuffer.from_file(path)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1082",
+ "summary": "Load a supported image file into a new FrameBuffer."
+ },
+ {
+ "binding": "framebuffer_fill",
+ "kind": "method",
+ "line": 1083,
+ "name": "fill",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.FrameBuffer.fill",
+ "signature": "FrameBuffer.fill(color)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1083",
+ "summary": "Fill the target canvas with one color and return the affected Area."
+ },
+ {
+ "binding": "framebuffer_fill_rect",
+ "kind": "method",
+ "line": 1084,
+ "name": "fill_rect",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.FrameBuffer.fill_rect",
+ "signature": "FrameBuffer.fill_rect(x, y, width, height, color)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1084",
+ "summary": "Fill a rectangular region and return the clipped affected Area."
+ },
+ {
+ "binding": "framebuffer_pixel",
+ "kind": "method",
+ "line": 1085,
+ "name": "pixel",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.FrameBuffer.pixel",
+ "signature": "FrameBuffer.pixel(x, y, color=None)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1085",
+ "summary": "Read or write one pixel, depending on whether a color is supplied."
+ },
+ {
+ "binding": "framebuffer_hline",
+ "kind": "method",
+ "line": 1086,
+ "name": "hline",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.FrameBuffer.hline",
+ "signature": "FrameBuffer.hline(x, y, width, color)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1086",
+ "summary": "Draw a horizontal line."
+ },
+ {
+ "binding": "framebuffer_vline",
+ "kind": "method",
+ "line": 1087,
+ "name": "vline",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.FrameBuffer.vline",
+ "signature": "FrameBuffer.vline(x, y, height, color)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1087",
+ "summary": "Draw a vertical line."
+ },
+ {
+ "binding": "framebuffer_rect",
+ "kind": "method",
+ "line": 1088,
+ "name": "rect",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.FrameBuffer.rect",
+ "signature": "FrameBuffer.rect(x, y, width, height, color, fill=False)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1088",
+ "summary": "Draw an outlined or filled rectangle."
+ },
+ {
+ "binding": "framebuffer_round_rect",
+ "kind": "method",
+ "line": 1089,
+ "name": "round_rect",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.FrameBuffer.round_rect",
+ "signature": "FrameBuffer.round_rect(x, y, width, height, radius, color, fill=False)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1089",
+ "summary": "Draw an outlined or filled rounded rectangle."
+ },
+ {
+ "binding": "framebuffer_circle",
+ "kind": "method",
+ "line": 1090,
+ "name": "circle",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.FrameBuffer.circle",
+ "signature": "FrameBuffer.circle(x, y, radius, color, fill=False)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1090",
+ "summary": "Draw an outlined or filled circle."
+ },
+ {
+ "binding": "framebuffer_line",
+ "kind": "method",
+ "line": 1091,
+ "name": "line",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.FrameBuffer.line",
+ "signature": "FrameBuffer.line(x1, y1, x2, y2, color)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1091",
+ "summary": "Draw a line between two points."
+ },
+ {
+ "binding": "framebuffer_ellipse",
+ "kind": "method",
+ "line": 1092,
+ "name": "ellipse",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.FrameBuffer.ellipse",
+ "signature": "FrameBuffer.ellipse(x, y, x_radius, y_radius, color, fill=False, mask=0x0F)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1092",
+ "summary": "Draw selected quadrants of an outlined or filled ellipse."
+ },
+ {
+ "binding": "framebuffer_poly",
+ "kind": "method",
+ "line": 1093,
+ "name": "poly",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.FrameBuffer.poly",
+ "signature": "FrameBuffer.poly(x, y, coordinates, color, fill=False)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1093",
+ "summary": "Draw a polygon from a packed coordinate buffer."
+ },
+ {
+ "binding": "framebuffer_arc",
+ "kind": "method",
+ "line": 1094,
+ "name": "arc",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.FrameBuffer.arc",
+ "signature": "FrameBuffer.arc(x, y, radius, start_angle, end_angle, color)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1094",
+ "summary": "Draw a circular arc between two angles."
+ },
+ {
+ "binding": "framebuffer_triangle",
+ "kind": "method",
+ "line": 1095,
+ "name": "triangle",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.FrameBuffer.triangle",
+ "signature": "FrameBuffer.triangle(x0, y0, x1, y1, x2, y2, color, fill=False)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1095",
+ "summary": "Draw an outlined or filled triangle."
+ },
+ {
+ "binding": "framebuffer_gradient_rect",
+ "kind": "method",
+ "line": 1096,
+ "name": "gradient_rect",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.FrameBuffer.gradient_rect",
+ "signature": "FrameBuffer.gradient_rect(x, y, width, height, color1, color2=None, vertical=True)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1096",
+ "summary": "Fill a rectangle with a horizontal or vertical color gradient."
+ },
+ {
+ "binding": "framebuffer_polygon",
+ "kind": "method",
+ "line": 1097,
+ "name": "polygon",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.FrameBuffer.polygon",
+ "signature": "FrameBuffer.polygon(points, x, y, color, angle=0, center_x=0, center_y=0)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1097",
+ "summary": "Draw a translated and optionally rotated sequence of points."
+ },
+ {
+ "binding": "framebuffer_blit",
+ "kind": "method",
+ "line": 1098,
+ "name": "blit",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.FrameBuffer.blit",
+ "signature": "FrameBuffer.blit(source, x, y, key=-1, palette=None)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1098",
+ "summary": "Copy another framebuffer onto the target with optional keying and palette lookup."
+ },
+ {
+ "binding": "framebuffer_blit_rect",
+ "kind": "method",
+ "line": 1099,
+ "name": "blit_rect",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.FrameBuffer.blit_rect",
+ "signature": "FrameBuffer.blit_rect(buffer, x, y, width, height)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1099",
+ "summary": "Copy a packed RGB565 rectangle onto the target."
+ },
+ {
+ "binding": "framebuffer_blit_transparent",
+ "kind": "method",
+ "line": 1100,
+ "name": "blit_transparent",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.FrameBuffer.blit_transparent",
+ "signature": "FrameBuffer.blit_transparent(buffer, x, y, width, height, key)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1100",
+ "summary": "Copy a packed RGB565 rectangle while skipping the transparent key."
+ },
+ {
+ "binding": "framebuffer_text",
+ "kind": "method",
+ "line": 1101,
+ "name": "text",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.FrameBuffer.text",
+ "signature": "FrameBuffer.text(text, x, y, color=1, scale=1, inverted=False, font_data=None, height=8)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1101",
+ "summary": "Render bitmap text with selectable height, scale, and inversion."
+ },
+ {
+ "binding": "framebuffer_text8",
+ "kind": "method",
+ "line": 1102,
+ "name": "text8",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.FrameBuffer.text8",
+ "signature": "FrameBuffer.text8(text, x, y, color=1, scale=1, inverted=False, font_data=None)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1102",
+ "summary": "Render text with the built-in 8-pixel-high font path."
+ },
+ {
+ "binding": "framebuffer_text14",
+ "kind": "method",
+ "line": 1103,
+ "name": "text14",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.FrameBuffer.text14",
+ "signature": "FrameBuffer.text14(text, x, y, color=1, scale=1, inverted=False, font_data=None)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1103",
+ "summary": "Render text with the built-in 14-pixel-high font path."
+ },
+ {
+ "binding": "framebuffer_text16",
+ "kind": "method",
+ "line": 1104,
+ "name": "text16",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.FrameBuffer.text16",
+ "signature": "FrameBuffer.text16(text, x, y, color=1, scale=1, inverted=False, font_data=None)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1104",
+ "summary": "Render text with the built-in 16-pixel-high font path."
+ },
+ {
+ "binding": "framebuffer_scroll",
+ "kind": "method",
+ "line": 1105,
+ "name": "scroll",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.FrameBuffer.scroll",
+ "signature": "FrameBuffer.scroll(x_step, y_step)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1105",
+ "summary": "Move framebuffer contents by the requested x and y offsets."
+ },
+ {
+ "binding": "framebuffer_save",
+ "kind": "method",
+ "line": 1106,
+ "name": "save",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.FrameBuffer.save",
+ "signature": "FrameBuffer.save(path='screenshot')",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1106",
+ "summary": "Write the current image or bitmap to a versioned output path."
+ },
+ {
+ "binding": "framebuffer_get_width",
+ "kind": "property",
+ "line": 1073,
+ "name": "width",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.FrameBuffer.width",
+ "signature": "FrameBuffer.width",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1073",
+ "summary": "Width in pixels."
+ },
+ {
+ "binding": "framebuffer_get_height",
+ "kind": "property",
+ "line": 1074,
+ "name": "height",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.FrameBuffer.height",
+ "signature": "FrameBuffer.height",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1074",
+ "summary": "Height in pixels."
+ },
+ {
+ "binding": "framebuffer_get_buffer",
+ "kind": "property",
+ "line": 1075,
+ "name": "buffer",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.FrameBuffer.buffer",
+ "signature": "FrameBuffer.buffer",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1075",
+ "summary": "Backing pixel buffer when the object owns or exposes one."
+ },
+ {
+ "binding": "framebuffer_get_format",
+ "kind": "property",
+ "line": 1076,
+ "name": "format",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.FrameBuffer.format",
+ "signature": "FrameBuffer.format",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1076",
+ "summary": "Framebuffer pixel-format identifier."
+ },
+ {
+ "binding": "framebuffer_get_color_depth",
+ "kind": "property",
+ "line": 1077,
+ "name": "color_depth",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.FrameBuffer.color_depth",
+ "signature": "FrameBuffer.color_depth",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L1077",
+ "summary": "Bits per pixel for the framebuffer format."
+ },
+ {
+ "kind": "class",
+ "line": 2085,
+ "name": "Draw",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Draw",
+ "signature": "class Draw(canvas)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2085",
+ "summary": "Drawing facade that adds a bounded clip stack to any compatible canvas."
+ },
+ {
+ "binding": "draw_fill",
+ "kind": "method",
+ "line": 2057,
+ "name": "fill",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Draw.fill",
+ "signature": "Draw.fill(color)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2057",
+ "summary": "Fill the target canvas with one color and return the affected Area."
+ },
+ {
+ "binding": "draw_fill_rect",
+ "kind": "method",
+ "line": 2058,
+ "name": "fill_rect",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Draw.fill_rect",
+ "signature": "Draw.fill_rect(x, y, width, height, color)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2058",
+ "summary": "Fill a rectangular region and return the clipped affected Area."
+ },
+ {
+ "binding": "draw_pixel",
+ "kind": "method",
+ "line": 2059,
+ "name": "pixel",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Draw.pixel",
+ "signature": "Draw.pixel(x, y, color=None)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2059",
+ "summary": "Read or write one pixel, depending on whether a color is supplied."
+ },
+ {
+ "binding": "draw_hline",
+ "kind": "method",
+ "line": 2060,
+ "name": "hline",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Draw.hline",
+ "signature": "Draw.hline(x, y, width, color)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2060",
+ "summary": "Draw a horizontal line."
+ },
+ {
+ "binding": "draw_vline",
+ "kind": "method",
+ "line": 2061,
+ "name": "vline",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Draw.vline",
+ "signature": "Draw.vline(x, y, height, color)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2061",
+ "summary": "Draw a vertical line."
+ },
+ {
+ "binding": "draw_line",
+ "kind": "method",
+ "line": 2062,
+ "name": "line",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Draw.line",
+ "signature": "Draw.line(x1, y1, x2, y2, color)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2062",
+ "summary": "Draw a line between two points."
+ },
+ {
+ "binding": "draw_rect",
+ "kind": "method",
+ "line": 2063,
+ "name": "rect",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Draw.rect",
+ "signature": "Draw.rect(x, y, width, height, color, fill=False)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2063",
+ "summary": "Draw an outlined or filled rectangle."
+ },
+ {
+ "binding": "draw_round_rect",
+ "kind": "method",
+ "line": 2064,
+ "name": "round_rect",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Draw.round_rect",
+ "signature": "Draw.round_rect(x, y, width, height, radius, color, fill=False)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2064",
+ "summary": "Draw an outlined or filled rounded rectangle."
+ },
+ {
+ "binding": "draw_circle",
+ "kind": "method",
+ "line": 2065,
+ "name": "circle",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Draw.circle",
+ "signature": "Draw.circle(x, y, radius, color, fill=False)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2065",
+ "summary": "Draw an outlined or filled circle."
+ },
+ {
+ "binding": "draw_ellipse",
+ "kind": "method",
+ "line": 2066,
+ "name": "ellipse",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Draw.ellipse",
+ "signature": "Draw.ellipse(x, y, x_radius, y_radius, color, fill=False, mask=0x0F)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2066",
+ "summary": "Draw selected quadrants of an outlined or filled ellipse."
+ },
+ {
+ "binding": "draw_arc",
+ "kind": "method",
+ "line": 2067,
+ "name": "arc",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Draw.arc",
+ "signature": "Draw.arc(x, y, radius, start_angle, end_angle, color)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2067",
+ "summary": "Draw a circular arc between two angles."
+ },
+ {
+ "binding": "draw_triangle",
+ "kind": "method",
+ "line": 2068,
+ "name": "triangle",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Draw.triangle",
+ "signature": "Draw.triangle(x0, y0, x1, y1, x2, y2, color, fill=False)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2068",
+ "summary": "Draw an outlined or filled triangle."
+ },
+ {
+ "binding": "draw_gradient_rect",
+ "kind": "method",
+ "line": 2069,
+ "name": "gradient_rect",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Draw.gradient_rect",
+ "signature": "Draw.gradient_rect(x, y, width, height, color1, color2=None, vertical=True)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2069",
+ "summary": "Fill a rectangle with a horizontal or vertical color gradient."
+ },
+ {
+ "binding": "draw_poly",
+ "kind": "method",
+ "line": 2070,
+ "name": "poly",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Draw.poly",
+ "signature": "Draw.poly(x, y, coordinates, color, fill=False)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2070",
+ "summary": "Draw a polygon from a packed coordinate buffer."
+ },
+ {
+ "binding": "draw_polygon",
+ "kind": "method",
+ "line": 2071,
+ "name": "polygon",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Draw.polygon",
+ "signature": "Draw.polygon(points, x, y, color, angle=0, center_x=0, center_y=0)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2071",
+ "summary": "Draw a translated and optionally rotated sequence of points."
+ },
+ {
+ "binding": "draw_blit",
+ "kind": "method",
+ "line": 2072,
+ "name": "blit",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Draw.blit",
+ "signature": "Draw.blit(source, x, y, key=-1, palette=None)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2072",
+ "summary": "Copy another framebuffer onto the target with optional keying and palette lookup."
+ },
+ {
+ "binding": "draw_blit_rect",
+ "kind": "method",
+ "line": 2073,
+ "name": "blit_rect",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Draw.blit_rect",
+ "signature": "Draw.blit_rect(buffer, x, y, width, height)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2073",
+ "summary": "Copy a packed RGB565 rectangle onto the target."
+ },
+ {
+ "binding": "draw_blit_transparent",
+ "kind": "method",
+ "line": 2074,
+ "name": "blit_transparent",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Draw.blit_transparent",
+ "signature": "Draw.blit_transparent(buffer, x, y, width, height, key)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2074",
+ "summary": "Copy a packed RGB565 rectangle while skipping the transparent key."
+ },
+ {
+ "binding": "draw_text",
+ "kind": "method",
+ "line": 2075,
+ "name": "text",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Draw.text",
+ "signature": "Draw.text(text, x, y, color=1, scale=1, inverted=False, font_data=None, height=8)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2075",
+ "summary": "Render bitmap text with selectable height, scale, and inversion."
+ },
+ {
+ "binding": "draw_text8",
+ "kind": "method",
+ "line": 2076,
+ "name": "text8",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Draw.text8",
+ "signature": "Draw.text8(text, x, y, color=1, scale=1, inverted=False, font_data=None)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2076",
+ "summary": "Render text with the built-in 8-pixel-high font path."
+ },
+ {
+ "binding": "draw_text14",
+ "kind": "method",
+ "line": 2077,
+ "name": "text14",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Draw.text14",
+ "signature": "Draw.text14(text, x, y, color=1, scale=1, inverted=False, font_data=None)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2077",
+ "summary": "Render text with the built-in 14-pixel-high font path."
+ },
+ {
+ "binding": "draw_text16",
+ "kind": "method",
+ "line": 2078,
+ "name": "text16",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Draw.text16",
+ "signature": "Draw.text16(text, x, y, color=1, scale=1, inverted=False, font_data=None)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2078",
+ "summary": "Render text with the built-in 16-pixel-high font path."
+ },
+ {
+ "binding": "draw_clip",
+ "kind": "method",
+ "line": 2079,
+ "name": "clip",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Draw.clip",
+ "signature": "Draw.clip(area_or_x, y=None, width=None, height=None)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2079",
+ "summary": "Return the intersection with another Area."
+ },
+ {
+ "binding": "mod_fill",
+ "kind": "function",
+ "line": 2953,
+ "name": "fill",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.fill",
+ "signature": "graphics.fill(canvas, color)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2953",
+ "summary": "Fill the target canvas with one color and return the affected Area."
+ },
+ {
+ "binding": "mod_fill_rect",
+ "kind": "function",
+ "line": 2954,
+ "name": "fill_rect",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.fill_rect",
+ "signature": "graphics.fill_rect(canvas, x, y, width, height, color)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2954",
+ "summary": "Fill a rectangular region and return the clipped affected Area."
+ },
+ {
+ "binding": "mod_pixel",
+ "kind": "function",
+ "line": 2955,
+ "name": "pixel",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.pixel",
+ "signature": "graphics.pixel(canvas, x, y, color=None)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2955",
+ "summary": "Read or write one pixel, depending on whether a color is supplied."
+ },
+ {
+ "binding": "mod_hline",
+ "kind": "function",
+ "line": 2956,
+ "name": "hline",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.hline",
+ "signature": "graphics.hline(canvas, x, y, width, color)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2956",
+ "summary": "Draw a horizontal line."
+ },
+ {
+ "binding": "mod_vline",
+ "kind": "function",
+ "line": 2957,
+ "name": "vline",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.vline",
+ "signature": "graphics.vline(canvas, x, y, height, color)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2957",
+ "summary": "Draw a vertical line."
+ },
+ {
+ "binding": "mod_line",
+ "kind": "function",
+ "line": 2958,
+ "name": "line",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.line",
+ "signature": "graphics.line(canvas, x1, y1, x2, y2, color)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2958",
+ "summary": "Draw a line between two points."
+ },
+ {
+ "binding": "mod_rect",
+ "kind": "function",
+ "line": 2959,
+ "name": "rect",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.rect",
+ "signature": "graphics.rect(canvas, x, y, width, height, color, fill=False)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2959",
+ "summary": "Draw an outlined or filled rectangle."
+ },
+ {
+ "binding": "mod_round_rect",
+ "kind": "function",
+ "line": 2960,
+ "name": "round_rect",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.round_rect",
+ "signature": "graphics.round_rect(canvas, x, y, width, height, radius, color, fill=False)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2960",
+ "summary": "Draw an outlined or filled rounded rectangle."
+ },
+ {
+ "binding": "mod_circle",
+ "kind": "function",
+ "line": 2961,
+ "name": "circle",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.circle",
+ "signature": "graphics.circle(canvas, x, y, radius, color, fill=False)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2961",
+ "summary": "Draw an outlined or filled circle."
+ },
+ {
+ "binding": "mod_ellipse",
+ "kind": "function",
+ "line": 2962,
+ "name": "ellipse",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.ellipse",
+ "signature": "graphics.ellipse(canvas, x, y, x_radius, y_radius, color, fill=False, mask=0x0F)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2962",
+ "summary": "Draw selected quadrants of an outlined or filled ellipse."
+ },
+ {
+ "binding": "mod_arc",
+ "kind": "function",
+ "line": 2963,
+ "name": "arc",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.arc",
+ "signature": "graphics.arc(canvas, x, y, radius, start_angle, end_angle, color)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2963",
+ "summary": "Draw a circular arc between two angles."
+ },
+ {
+ "binding": "mod_triangle",
+ "kind": "function",
+ "line": 2964,
+ "name": "triangle",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.triangle",
+ "signature": "graphics.triangle(canvas, x0, y0, x1, y1, x2, y2, color, fill=False)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2964",
+ "summary": "Draw an outlined or filled triangle."
+ },
+ {
+ "binding": "mod_gradient_rect",
+ "kind": "function",
+ "line": 2965,
+ "name": "gradient_rect",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.gradient_rect",
+ "signature": "graphics.gradient_rect(canvas, x, y, width, height, color1, color2=None, vertical=True)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2965",
+ "summary": "Fill a rectangle with a horizontal or vertical color gradient."
+ },
+ {
+ "binding": "mod_poly",
+ "kind": "function",
+ "line": 2966,
+ "name": "poly",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.poly",
+ "signature": "graphics.poly(canvas, x, y, coordinates, color, fill=False)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2966",
+ "summary": "Draw a polygon from a packed coordinate buffer."
+ },
+ {
+ "binding": "mod_blit",
+ "kind": "function",
+ "line": 2967,
+ "name": "blit",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.blit",
+ "signature": "graphics.blit(canvas, source, x, y, key=-1, palette=None)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2967",
+ "summary": "Copy another framebuffer onto the target with optional keying and palette lookup."
+ },
+ {
+ "binding": "mod_blit_rect",
+ "kind": "function",
+ "line": 2968,
+ "name": "blit_rect",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.blit_rect",
+ "signature": "graphics.blit_rect(canvas, buffer, x, y, width, height)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2968",
+ "summary": "Copy a packed RGB565 rectangle onto the target."
+ },
+ {
+ "binding": "mod_blit_transparent",
+ "kind": "function",
+ "line": 2969,
+ "name": "blit_transparent",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.blit_transparent",
+ "signature": "graphics.blit_transparent(canvas, buffer, x, y, width, height, key)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2969",
+ "summary": "Copy a packed RGB565 rectangle while skipping the transparent key."
+ },
+ {
+ "binding": "mod_polygon",
+ "kind": "function",
+ "line": 2970,
+ "name": "polygon",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.polygon",
+ "signature": "graphics.polygon(canvas, points, x, y, color, angle=0, center_x=0, center_y=0)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2970",
+ "summary": "Draw a translated and optionally rotated sequence of points."
+ },
+ {
+ "binding": "mod_text",
+ "kind": "function",
+ "line": 2976,
+ "name": "text",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.text",
+ "signature": "graphics.text(canvas, text, x, y, color=1, scale=1, inverted=False, font_data=None, height=8)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2976",
+ "summary": "Render bitmap text with selectable height, scale, and inversion."
+ },
+ {
+ "binding": "mod_text8",
+ "kind": "function",
+ "line": 2977,
+ "name": "text8",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.text8",
+ "signature": "graphics.text8(canvas, text, x, y, color=1, scale=1, inverted=False, font_data=None)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2977",
+ "summary": "Render text with the built-in 8-pixel-high font path."
+ },
+ {
+ "binding": "mod_text14",
+ "kind": "function",
+ "line": 2978,
+ "name": "text14",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.text14",
+ "signature": "graphics.text14(canvas, text, x, y, color=1, scale=1, inverted=False, font_data=None)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2978",
+ "summary": "Render text with the built-in 14-pixel-high font path."
+ },
+ {
+ "binding": "mod_text16",
+ "kind": "function",
+ "line": 2979,
+ "name": "text16",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.text16",
+ "signature": "graphics.text16(canvas, text, x, y, color=1, scale=1, inverted=False, font_data=None)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2979",
+ "summary": "Render text with the built-in 16-pixel-high font path."
+ },
+ {
+ "kind": "class",
+ "line": 2643,
+ "name": "Font",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Font",
+ "signature": "class Font(font_data=None, height=0, cached=True)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2643",
+ "summary": "Bitmap font loader and renderer for built-in, file, or buffer-backed glyph data."
+ },
+ {
+ "binding": "font_text",
+ "kind": "method",
+ "line": 2633,
+ "name": "text",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Font.text",
+ "signature": "Font.text(canvas, text, x, y, color, scale=1, inverted=False)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2633",
+ "summary": "Render bitmap text with selectable height, scale, and inversion."
+ },
+ {
+ "binding": "font_draw_char",
+ "kind": "method",
+ "line": 2634,
+ "name": "draw_char",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Font.draw_char",
+ "signature": "Font.draw_char(char, x, y, canvas, color, scale=1, inverted=False)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2634",
+ "summary": "Render one glyph through this Font onto a canvas."
+ },
+ {
+ "binding": "font_text_width",
+ "kind": "method",
+ "line": 2635,
+ "name": "text_width",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Font.text_width",
+ "signature": "Font.text_width(text, scale=1)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2635",
+ "summary": "Measure rendered text width at the selected scale."
+ },
+ {
+ "binding": "font_deinit",
+ "kind": "method",
+ "line": 2636,
+ "name": "deinit",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Font.deinit",
+ "signature": "Font.deinit()",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2636",
+ "summary": "Release resources owned by the object."
+ },
+ {
+ "binding": "font_export",
+ "kind": "method",
+ "line": 2637,
+ "name": "export",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Font.export",
+ "signature": "Font.export(filename)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2637",
+ "summary": "Write cached font bytes to a file."
+ },
+ {
+ "binding": "font_get_width",
+ "kind": "property",
+ "line": 2626,
+ "name": "width",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Font.width",
+ "signature": "Font.width",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2626",
+ "summary": "Width in pixels."
+ },
+ {
+ "binding": "font_get_height",
+ "kind": "property",
+ "line": 2627,
+ "name": "height",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Font.height",
+ "signature": "Font.height",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2627",
+ "summary": "Height in pixels."
+ },
+ {
+ "binding": "font_get_font_name",
+ "kind": "property",
+ "line": 2628,
+ "name": "font_name",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.Font.font_name",
+ "signature": "Font.font_name",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2628",
+ "summary": "Font source name or the in-memory/default identifier."
+ },
+ {
+ "kind": "class",
+ "line": 2934,
+ "name": "BMP565",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.BMP565",
+ "signature": "class BMP565(filename=None, source=None, streamed=False, mirrored=False, width=None, height=None)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2934",
+ "summary": "RGB565 bitmap reader supporting buffered and streamed access."
+ },
+ {
+ "binding": "bmp565_save",
+ "kind": "method",
+ "line": 2923,
+ "name": "save",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.BMP565.save",
+ "signature": "BMP565.save(filename=None)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2923",
+ "summary": "Write the current image or bitmap to a versioned output path."
+ },
+ {
+ "binding": "bmp565_deinit",
+ "kind": "method",
+ "line": 2924,
+ "name": "deinit",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.BMP565.deinit",
+ "signature": "BMP565.deinit()",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2924",
+ "summary": "Release resources owned by the object."
+ },
+ {
+ "binding": "bmp565_get_width",
+ "kind": "property",
+ "line": 2914,
+ "name": "width",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.BMP565.width",
+ "signature": "BMP565.width",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2914",
+ "summary": "Width in pixels."
+ },
+ {
+ "binding": "bmp565_get_height",
+ "kind": "property",
+ "line": 2915,
+ "name": "height",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.BMP565.height",
+ "signature": "BMP565.height",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2915",
+ "summary": "Height in pixels."
+ },
+ {
+ "binding": "bmp565_get_buffer",
+ "kind": "property",
+ "line": 2916,
+ "name": "buffer",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.BMP565.buffer",
+ "signature": "BMP565.buffer",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2916",
+ "summary": "Backing pixel buffer when the object owns or exposes one."
+ },
+ {
+ "binding": "bmp565_get_bpp",
+ "kind": "property",
+ "line": 2917,
+ "name": "bpp",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.BMP565.bpp",
+ "signature": "BMP565.bpp",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2917",
+ "summary": "Bitmap color depth in bits per pixel."
+ },
+ {
+ "binding": "bmp565_get_BPP",
+ "kind": "property",
+ "line": 2918,
+ "name": "BPP",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.BMP565.BPP",
+ "signature": "BMP565.BPP",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2918",
+ "summary": "Bitmap storage width in bytes per pixel."
+ },
+ {
+ "binding": "mod_load_image",
+ "kind": "function",
+ "line": 2971,
+ "name": "load_image",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.load_image",
+ "signature": "graphics.load_image(path)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2971",
+ "summary": "Load a supported image file as a FrameBuffer."
+ },
+ {
+ "binding": "mod_save_image",
+ "kind": "function",
+ "line": 2972,
+ "name": "save_image",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.save_image",
+ "signature": "graphics.save_image(framebuffer, path='screenshot')",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2972",
+ "summary": "Save a FrameBuffer to a versioned image path."
+ },
+ {
+ "binding": "mod_bmp_to_framebuffer",
+ "kind": "function",
+ "line": 2973,
+ "name": "bmp_to_framebuffer",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.bmp_to_framebuffer",
+ "signature": "graphics.bmp_to_framebuffer(path)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2973",
+ "summary": "Decode a BMP file into a FrameBuffer."
+ },
+ {
+ "binding": "mod_pbm_to_framebuffer",
+ "kind": "function",
+ "line": 2974,
+ "name": "pbm_to_framebuffer",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.pbm_to_framebuffer",
+ "signature": "graphics.pbm_to_framebuffer(path)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2974",
+ "summary": "Decode a PBM file into a FrameBuffer."
+ },
+ {
+ "binding": "mod_pgm_to_framebuffer",
+ "kind": "function",
+ "line": 2975,
+ "name": "pgm_to_framebuffer",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.pgm_to_framebuffer",
+ "signature": "graphics.pgm_to_framebuffer(path)",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2975",
+ "summary": "Decode a PGM file into a FrameBuffer."
+ },
+ {
+ "binding": "mod_framebuf_backend",
+ "kind": "function",
+ "line": 2950,
+ "name": "framebuf_backend",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.framebuf_backend",
+ "signature": "graphics.framebuf_backend()",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2950",
+ "summary": "Return the active framebuffer backend identifier."
+ },
+ {
+ "binding": "mod_implementation",
+ "kind": "function",
+ "line": 2951,
+ "name": "implementation",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.implementation",
+ "signature": "graphics.implementation()",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2951",
+ "summary": "Return the implementation identifier for this graphics module."
+ },
+ {
+ "binding": "mod_capabilities",
+ "kind": "function",
+ "line": 2952,
+ "name": "capabilities",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.capabilities",
+ "signature": "graphics.capabilities()",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2952",
+ "summary": "Return structured runtime feature and pixel-format capabilities."
+ },
+ {
+ "binding": "GFX_MVLSB",
+ "kind": "constant",
+ "line": 3027,
+ "name": "MONO_VLSB",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.MONO_VLSB",
+ "signature": "graphics.MONO_VLSB",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L3027",
+ "summary": "Monochrome vertical least-significant-bit layout."
+ },
+ {
+ "binding": "GFX_MHLSB",
+ "kind": "constant",
+ "line": 3028,
+ "name": "MONO_HLSB",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.MONO_HLSB",
+ "signature": "graphics.MONO_HLSB",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L3028",
+ "summary": "Monochrome horizontal least-significant-bit layout."
+ },
+ {
+ "binding": "GFX_MHMSB",
+ "kind": "constant",
+ "line": 3029,
+ "name": "MONO_HMSB",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.MONO_HMSB",
+ "signature": "graphics.MONO_HMSB",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L3029",
+ "summary": "Monochrome horizontal most-significant-bit layout."
+ },
+ {
+ "binding": "GFX_RGB565",
+ "kind": "constant",
+ "line": 3030,
+ "name": "RGB565",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.RGB565",
+ "signature": "graphics.RGB565",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L3030",
+ "summary": "16-bit RGB565 pixel layout."
+ },
+ {
+ "binding": "GFX_GS2_HMSB",
+ "kind": "constant",
+ "line": 3031,
+ "name": "GS2_HMSB",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.GS2_HMSB",
+ "signature": "graphics.GS2_HMSB",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L3031",
+ "summary": "2-bit grayscale horizontal most-significant-bit layout."
+ },
+ {
+ "binding": "GFX_GS4_HMSB",
+ "kind": "constant",
+ "line": 3032,
+ "name": "GS4_HMSB",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.GS4_HMSB",
+ "signature": "graphics.GS4_HMSB",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L3032",
+ "summary": "4-bit grayscale horizontal most-significant-bit layout."
+ },
+ {
+ "binding": "GFX_GS8",
+ "kind": "constant",
+ "line": 3033,
+ "name": "GS8",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.GS8",
+ "signature": "graphics.GS8",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L3033",
+ "summary": "8-bit grayscale layout."
+ },
+ {
+ "binding": "GFX_RGB888",
+ "kind": "constant",
+ "line": 3034,
+ "name": "RGB888",
+ "path": "gfx_module_cpy.c",
+ "qualified_name": "graphics.RGB888",
+ "signature": "graphics.RGB888",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L3034",
+ "summary": "24-bit RGB888 pixel layout."
+ },
+ {
+ "kind": "c_function",
+ "line": 21,
+ "name": "gfx_fb_validate_buffer",
+ "path": "gfx_framebuffer.h",
+ "qualified_name": "gfx_fb_validate_buffer",
+ "signature": "int gfx_fb_validate_buffer(size_t buf_len, int width, int height, int format, int stride);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_framebuffer.h#L21",
+ "summary": "Native fb entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 22,
+ "name": "gfx_fb_color_depth",
+ "path": "gfx_framebuffer.h",
+ "qualified_name": "gfx_fb_color_depth",
+ "signature": "int gfx_fb_color_depth(int format);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_framebuffer.h#L22",
+ "summary": "Native fb entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 24,
+ "name": "gfx_fb_setpixel",
+ "path": "gfx_framebuffer.h",
+ "qualified_name": "gfx_fb_setpixel",
+ "signature": "void gfx_fb_setpixel(const gfx_fb_t *fb, unsigned int x, unsigned int y, uint32_t col);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_framebuffer.h#L24",
+ "summary": "Native fb entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 25,
+ "name": "gfx_fb_getpixel",
+ "path": "gfx_framebuffer.h",
+ "qualified_name": "gfx_fb_getpixel",
+ "signature": "uint32_t gfx_fb_getpixel(const gfx_fb_t *fb, unsigned int x, unsigned int y);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_framebuffer.h#L25",
+ "summary": "Native fb entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 26,
+ "name": "gfx_fb_setpixel_checked",
+ "path": "gfx_framebuffer.h",
+ "qualified_name": "gfx_fb_setpixel_checked",
+ "signature": "void gfx_fb_setpixel_checked(const gfx_fb_t *fb, int x, int y, int col, int mask);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_framebuffer.h#L26",
+ "summary": "Native fb entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 27,
+ "name": "gfx_fb_fill_rect_raw",
+ "path": "gfx_framebuffer.h",
+ "qualified_name": "gfx_fb_fill_rect_raw",
+ "signature": "void gfx_fb_fill_rect_raw(const gfx_fb_t *fb, int x, int y, int w, int h, uint32_t col);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_framebuffer.h#L27",
+ "summary": "Native fb entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 28,
+ "name": "gfx_fb_fill_rect",
+ "path": "gfx_framebuffer.h",
+ "qualified_name": "gfx_fb_fill_rect",
+ "signature": "gfx_area_t gfx_fb_fill_rect(const gfx_fb_t *fb, int x, int y, int w, int h, uint32_t col);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_framebuffer.h#L28",
+ "summary": "Native fb entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 29,
+ "name": "gfx_fb_fill",
+ "path": "gfx_framebuffer.h",
+ "qualified_name": "gfx_fb_fill",
+ "signature": "gfx_area_t gfx_fb_fill(const gfx_fb_t *fb, uint32_t col);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_framebuffer.h#L29",
+ "summary": "Native fb entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 31,
+ "name": "gfx_fb_canvas_init",
+ "path": "gfx_framebuffer.h",
+ "qualified_name": "gfx_fb_canvas_init",
+ "signature": "void gfx_fb_canvas_init(gfx_canvas_t *canvas, const gfx_fb_t *fb);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_framebuffer.h#L31",
+ "summary": "Native fb entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 32,
+ "name": "gfx_fb_scroll",
+ "path": "gfx_framebuffer.h",
+ "qualified_name": "gfx_fb_scroll",
+ "signature": "void gfx_fb_scroll(gfx_fb_t *fb, int xstep, int ystep);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_framebuffer.h#L32",
+ "summary": "Native fb entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 20,
+ "name": "gfx_clipped_canvas_init",
+ "path": "gfx_shapes.h",
+ "qualified_name": "gfx_clipped_canvas_init",
+ "signature": "void gfx_clipped_canvas_init(gfx_clipped_canvas_t *cc, const gfx_canvas_t *parent, const gfx_area_t *clip);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L20",
+ "summary": "Native clipped entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 22,
+ "name": "gfx_shapes_pixel",
+ "path": "gfx_shapes.h",
+ "qualified_name": "gfx_shapes_pixel",
+ "signature": "gfx_area_t gfx_shapes_pixel(const gfx_canvas_t *canvas, int x, int y, int c);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L22",
+ "summary": "Native shapes entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 23,
+ "name": "gfx_shapes_hline",
+ "path": "gfx_shapes.h",
+ "qualified_name": "gfx_shapes_hline",
+ "signature": "gfx_area_t gfx_shapes_hline(const gfx_canvas_t *canvas, int x, int y, int w, int c);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L23",
+ "summary": "Native shapes entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 24,
+ "name": "gfx_shapes_vline",
+ "path": "gfx_shapes.h",
+ "qualified_name": "gfx_shapes_vline",
+ "signature": "gfx_area_t gfx_shapes_vline(const gfx_canvas_t *canvas, int x, int y, int h, int c);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L24",
+ "summary": "Native shapes entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 25,
+ "name": "gfx_shapes_fill_rect",
+ "path": "gfx_shapes.h",
+ "qualified_name": "gfx_shapes_fill_rect",
+ "signature": "gfx_area_t gfx_shapes_fill_rect(const gfx_canvas_t *canvas, int x, int y, int w, int h, int c);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L25",
+ "summary": "Native shapes entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 26,
+ "name": "gfx_shapes_rect",
+ "path": "gfx_shapes.h",
+ "qualified_name": "gfx_shapes_rect",
+ "signature": "gfx_area_t gfx_shapes_rect(const gfx_canvas_t *canvas, int x, int y, int w, int h, int c, int fill);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L26",
+ "summary": "Native shapes entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 27,
+ "name": "gfx_shapes_line",
+ "path": "gfx_shapes.h",
+ "qualified_name": "gfx_shapes_line",
+ "signature": "gfx_area_t gfx_shapes_line(const gfx_canvas_t *canvas, int x1, int y1, int x2, int y2, int c);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L27",
+ "summary": "Native shapes entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 28,
+ "name": "gfx_shapes_ellipse",
+ "path": "gfx_shapes.h",
+ "qualified_name": "gfx_shapes_ellipse",
+ "signature": "gfx_area_t gfx_shapes_ellipse(const gfx_canvas_t *canvas, int cx, int cy, int xradius, int yradius, int col, int fill, int mask_part);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L28",
+ "summary": "Native shapes entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 29,
+ "name": "gfx_shapes_fill",
+ "path": "gfx_shapes.h",
+ "qualified_name": "gfx_shapes_fill",
+ "signature": "gfx_area_t gfx_shapes_fill(const gfx_canvas_t *canvas, int c);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L29",
+ "summary": "Native shapes entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 31,
+ "name": "gfx_shapes_poly_int_from_buffer",
+ "path": "gfx_shapes.h",
+ "qualified_name": "gfx_shapes_poly_int_from_buffer",
+ "signature": "int gfx_shapes_poly_int_from_buffer(const void *buf, size_t len, size_t itemsize, const char *fmt, size_t index, int *out);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L31",
+ "summary": "Native shapes entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 32,
+ "name": "gfx_shapes_poly",
+ "path": "gfx_shapes.h",
+ "qualified_name": "gfx_shapes_poly",
+ "signature": "gfx_area_t gfx_shapes_poly(const gfx_canvas_t *canvas, int x, int y, const void *coords, size_t coords_len, size_t itemsize, const char *fmt, int col, int fill);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L32",
+ "summary": "Native shapes entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 33,
+ "name": "gfx_shapes_blit",
+ "path": "gfx_shapes.h",
+ "qualified_name": "gfx_shapes_blit",
+ "signature": "gfx_area_t gfx_shapes_blit(const gfx_canvas_t *canvas, const gfx_fb_t *source, int x, int y, int key, const gfx_fb_t *palette);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L33",
+ "summary": "Native shapes entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 34,
+ "name": "gfx_shapes_circle",
+ "path": "gfx_shapes.h",
+ "qualified_name": "gfx_shapes_circle",
+ "signature": "gfx_area_t gfx_shapes_circle(const gfx_canvas_t *canvas, int x0, int y0, int r, int c, int fill);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L34",
+ "summary": "Native shapes entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 35,
+ "name": "gfx_shapes_round_rect",
+ "path": "gfx_shapes.h",
+ "qualified_name": "gfx_shapes_round_rect",
+ "signature": "gfx_area_t gfx_shapes_round_rect(const gfx_canvas_t *canvas, int x0, int y0, int w, int h, int r, int c, int fill);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L35",
+ "summary": "Native shapes entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 36,
+ "name": "gfx_shapes_triangle",
+ "path": "gfx_shapes.h",
+ "qualified_name": "gfx_shapes_triangle",
+ "signature": "gfx_area_t gfx_shapes_triangle(const gfx_canvas_t *canvas, int x0, int y0, int x1, int y1, int x2, int y2, int c, int fill);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L36",
+ "summary": "Native shapes entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 37,
+ "name": "gfx_shapes_arc",
+ "path": "gfx_shapes.h",
+ "qualified_name": "gfx_shapes_arc",
+ "signature": "gfx_area_t gfx_shapes_arc(const gfx_canvas_t *canvas, int x, int y, int r, float a0, float a1, int c);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L37",
+ "summary": "Native shapes entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 38,
+ "name": "gfx_shapes_gradient_rect",
+ "path": "gfx_shapes.h",
+ "qualified_name": "gfx_shapes_gradient_rect",
+ "signature": "gfx_area_t gfx_shapes_gradient_rect(const gfx_canvas_t *canvas, int x, int y, int w, int h, int c1, int c2, int vertical);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L38",
+ "summary": "Native shapes entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 39,
+ "name": "gfx_shapes_blit_rect",
+ "path": "gfx_shapes.h",
+ "qualified_name": "gfx_shapes_blit_rect",
+ "signature": "gfx_area_t gfx_shapes_blit_rect(const gfx_canvas_t *canvas, const void *buf, int x, int y, int w, int h, int bpp);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L39",
+ "summary": "Native shapes entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 40,
+ "name": "gfx_shapes_blit_transparent",
+ "path": "gfx_shapes.h",
+ "qualified_name": "gfx_shapes_blit_transparent",
+ "signature": "gfx_area_t gfx_shapes_blit_transparent(const gfx_canvas_t *canvas, const void *buf, int x, int y, int w, int h, int key, int bpp);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L40",
+ "summary": "Native shapes entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 41,
+ "name": "gfx_shapes_polygon",
+ "path": "gfx_shapes.h",
+ "qualified_name": "gfx_shapes_polygon",
+ "signature": "gfx_area_t gfx_shapes_polygon(const gfx_canvas_t *canvas, const int *points, size_t n_points, int x, int y, int color, float angle, int center_x, int center_y);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L41",
+ "summary": "Native shapes entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 21,
+ "name": "gfx_draw_init",
+ "path": "gfx_draw.h",
+ "qualified_name": "gfx_draw_init",
+ "signature": "void gfx_draw_init(gfx_draw_t *draw, const gfx_canvas_t *canvas);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_draw.h#L21",
+ "summary": "Native draw entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 23,
+ "name": "gfx_draw_effective_clip",
+ "path": "gfx_draw.h",
+ "qualified_name": "gfx_draw_effective_clip",
+ "signature": "gfx_area_t gfx_draw_effective_clip(const gfx_draw_t *draw);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_draw.h#L23",
+ "summary": "Native draw entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 24,
+ "name": "gfx_draw_push_clip",
+ "path": "gfx_draw.h",
+ "qualified_name": "gfx_draw_push_clip",
+ "signature": "void gfx_draw_push_clip(gfx_draw_t *draw, const gfx_area_t *clip);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_draw.h#L24",
+ "summary": "Native draw entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 25,
+ "name": "gfx_draw_pop_clip",
+ "path": "gfx_draw.h",
+ "qualified_name": "gfx_draw_pop_clip",
+ "signature": "void gfx_draw_pop_clip(gfx_draw_t *draw);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_draw.h#L25",
+ "summary": "Native draw entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 22,
+ "name": "gfx_font_init_default",
+ "path": "gfx_font.h",
+ "qualified_name": "gfx_font_init_default",
+ "signature": "void gfx_font_init_default(gfx_font_t *font, int height);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_font.h#L22",
+ "summary": "Native font entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 23,
+ "name": "gfx_font_init_from_data",
+ "path": "gfx_font.h",
+ "qualified_name": "gfx_font_init_from_data",
+ "signature": "void gfx_font_init_from_data(gfx_font_t *font, const uint8_t *data, size_t len, int height);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_font.h#L23",
+ "summary": "Native font entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 24,
+ "name": "gfx_font_deinit",
+ "path": "gfx_font.h",
+ "qualified_name": "gfx_font_deinit",
+ "signature": "void gfx_font_deinit(gfx_font_t *font);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_font.h#L24",
+ "summary": "Native font entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 25,
+ "name": "gfx_font_export",
+ "path": "gfx_font.h",
+ "qualified_name": "gfx_font_export",
+ "signature": "int gfx_font_export(const gfx_font_t *font, const char *filename);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_font.h#L25",
+ "summary": "Native font entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 27,
+ "name": "gfx_font_text",
+ "path": "gfx_font.h",
+ "qualified_name": "gfx_font_text",
+ "signature": "gfx_area_t gfx_font_text(const gfx_canvas_t *canvas, const gfx_font_t *font, const char *str, int x0, int y0, int col, int scale, int inverted);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_font.h#L27",
+ "summary": "Native font entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 28,
+ "name": "gfx_font_draw_char",
+ "path": "gfx_font.h",
+ "qualified_name": "gfx_font_draw_char",
+ "signature": "gfx_area_t gfx_font_draw_char(const gfx_canvas_t *canvas, const gfx_font_t *font, unsigned char ch, int x, int y, int color, int scale, int inverted);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_font.h#L28",
+ "summary": "Native font entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 29,
+ "name": "gfx_font_text_width",
+ "path": "gfx_font.h",
+ "qualified_name": "gfx_font_text_width",
+ "signature": "int gfx_font_text_width(const gfx_font_t *font, const char *str, int scale);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_font.h#L29",
+ "summary": "Native font entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 30,
+ "name": "gfx_font_text8",
+ "path": "gfx_font.h",
+ "qualified_name": "gfx_font_text8",
+ "signature": "gfx_area_t gfx_font_text8(const gfx_canvas_t *canvas, const char *str, int x0, int y0, int col);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_font.h#L30",
+ "summary": "Native font entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 31,
+ "name": "gfx_font_text14",
+ "path": "gfx_font.h",
+ "qualified_name": "gfx_font_text14",
+ "signature": "gfx_area_t gfx_font_text14(const gfx_canvas_t *canvas, const char *str, int x0, int y0, int col);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_font.h#L31",
+ "summary": "Native font entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 32,
+ "name": "gfx_font_text16",
+ "path": "gfx_font.h",
+ "qualified_name": "gfx_font_text16",
+ "signature": "gfx_area_t gfx_font_text16(const gfx_canvas_t *canvas, const char *str, int x0, int y0, int col);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_font.h#L32",
+ "summary": "Native font entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 27,
+ "name": "gfx_bmp565_read_header_from_file",
+ "path": "gfx_bmp565.h",
+ "qualified_name": "gfx_bmp565_read_header_from_file",
+ "signature": "int gfx_bmp565_read_header_from_file(const char *path, int *width, int *height, unsigned int *data_offset);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_bmp565.h#L27",
+ "summary": "Native bmp565 entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 28,
+ "name": "gfx_bmp565_open_stream",
+ "path": "gfx_bmp565.h",
+ "qualified_name": "gfx_bmp565_open_stream",
+ "signature": "int gfx_bmp565_open_stream(const char *path, gfx_bmp565_t *out);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_bmp565.h#L28",
+ "summary": "Native bmp565 entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 29,
+ "name": "gfx_bmp565_load_from_file",
+ "path": "gfx_bmp565.h",
+ "qualified_name": "gfx_bmp565_load_from_file",
+ "signature": "int gfx_bmp565_load_from_file(const char *path, gfx_bmp565_t *out);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_bmp565.h#L29",
+ "summary": "Native bmp565 entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 30,
+ "name": "gfx_bmp565_init_from_buffer",
+ "path": "gfx_bmp565.h",
+ "qualified_name": "gfx_bmp565_init_from_buffer",
+ "signature": "int gfx_bmp565_init_from_buffer(gfx_bmp565_t *out, const uint8_t *buf, size_t len, int width, int height);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_bmp565.h#L30",
+ "summary": "Native bmp565 entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 31,
+ "name": "gfx_bmp565_deinit",
+ "path": "gfx_bmp565.h",
+ "qualified_name": "gfx_bmp565_deinit",
+ "signature": "void gfx_bmp565_deinit(gfx_bmp565_t *bmp);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_bmp565.h#L31",
+ "summary": "Native bmp565 entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 32,
+ "name": "gfx_bmp565_save",
+ "path": "gfx_bmp565.h",
+ "qualified_name": "gfx_bmp565_save",
+ "signature": "int gfx_bmp565_save(const gfx_bmp565_t *bmp, const char *path);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_bmp565.h#L32",
+ "summary": "Native bmp565 entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 33,
+ "name": "gfx_bmp565_save_versioned",
+ "path": "gfx_bmp565.h",
+ "qualified_name": "gfx_bmp565_save_versioned",
+ "signature": "int gfx_bmp565_save_versioned(const gfx_bmp565_t *bmp, const char *path, char *out_path, size_t out_path_len);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_bmp565.h#L33",
+ "summary": "Native bmp565 entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 34,
+ "name": "gfx_bmp565_read_bytes",
+ "path": "gfx_bmp565.h",
+ "qualified_name": "gfx_bmp565_read_bytes",
+ "signature": "int gfx_bmp565_read_bytes(const gfx_bmp565_t *bmp, int start, int stop, uint8_t *out, size_t out_cap, size_t *out_len);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_bmp565.h#L34",
+ "summary": "Native bmp565 entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 35,
+ "name": "gfx_bmp565_read_region",
+ "path": "gfx_bmp565.h",
+ "qualified_name": "gfx_bmp565_read_region",
+ "signature": "int gfx_bmp565_read_region(const gfx_bmp565_t *bmp, int x0, int x1, int y0, int y1, uint8_t *out, size_t out_cap, size_t *out_len);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_bmp565.h#L35",
+ "summary": "Native bmp565 entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 22,
+ "name": "gfx_image_fb_free",
+ "path": "gfx_files.h",
+ "qualified_name": "gfx_image_fb_free",
+ "signature": "void gfx_image_fb_free(gfx_image_fb_t *img);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_files.h#L22",
+ "summary": "Native image entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 23,
+ "name": "gfx_files_load_image",
+ "path": "gfx_files.h",
+ "qualified_name": "gfx_files_load_image",
+ "signature": "int gfx_files_load_image(const char *path, gfx_image_fb_t *out);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_files.h#L23",
+ "summary": "Native files entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 24,
+ "name": "gfx_files_save_image",
+ "path": "gfx_files.h",
+ "qualified_name": "gfx_files_save_image",
+ "signature": "int gfx_files_save_image(const gfx_fb_t *fb, const char *path, char *out_path, size_t out_path_len);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_files.h#L24",
+ "summary": "Native files entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 25,
+ "name": "gfx_files_pbm_to_framebuffer",
+ "path": "gfx_files.h",
+ "qualified_name": "gfx_files_pbm_to_framebuffer",
+ "signature": "int gfx_files_pbm_to_framebuffer(const char *path, gfx_image_fb_t *out);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_files.h#L25",
+ "summary": "Native files entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 26,
+ "name": "gfx_files_pgm_to_framebuffer",
+ "path": "gfx_files.h",
+ "qualified_name": "gfx_files_pgm_to_framebuffer",
+ "signature": "int gfx_files_pgm_to_framebuffer(const char *path, gfx_image_fb_t *out);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_files.h#L26",
+ "summary": "Native files entry point declared for firmware and extension integration."
+ },
+ {
+ "kind": "c_function",
+ "line": 27,
+ "name": "gfx_files_bmp_to_framebuffer",
+ "path": "gfx_files.h",
+ "qualified_name": "gfx_files_bmp_to_framebuffer",
+ "signature": "int gfx_files_bmp_to_framebuffer(const char *path, gfx_image_fb_t *out);",
+ "source_url": "https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_files.h#L27",
+ "summary": "Native files entry point declared for firmware and extension integration."
+ }
+ ]
+}
diff --git a/docs/generated/module-formats.md b/docs/generated/module-formats.md
new file mode 100644
index 0000000..0f7d6c1
--- /dev/null
+++ b/docs/generated/module-formats.md
@@ -0,0 +1,120 @@
+---
+title: Runtime and pixel formats
+description: Runtime capability probes and the exported framebuffer format constants.
+---
+
+Source snapshot: [`68194959ad5bc5540aceb6b40807a8c4228af60a`](https://github.com/PyDevices/graphics/tree/68194959ad5bc5540aceb6b40807a8c4228af60a).
+
+Runtime capability probes and the exported framebuffer format constants.
+
+Every entry below is generated from a public binding table or header declaration and links to its immutable source line.
+
+## `graphics.framebuf_backend`
+
+```python
+graphics.framebuf_backend()
+```
+
+Return the active framebuffer backend identifier.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2950)
+
+## `graphics.implementation`
+
+```python
+graphics.implementation()
+```
+
+Return the implementation identifier for this graphics module.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2951)
+
+## `graphics.capabilities`
+
+```python
+graphics.capabilities()
+```
+
+Return structured runtime feature and pixel-format capabilities.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L2952)
+
+## `graphics.MONO_VLSB`
+
+```python
+graphics.MONO_VLSB
+```
+
+Monochrome vertical least-significant-bit layout.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L3027)
+
+## `graphics.MONO_HLSB`
+
+```python
+graphics.MONO_HLSB
+```
+
+Monochrome horizontal least-significant-bit layout.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L3028)
+
+## `graphics.MONO_HMSB`
+
+```python
+graphics.MONO_HMSB
+```
+
+Monochrome horizontal most-significant-bit layout.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L3029)
+
+## `graphics.RGB565`
+
+```python
+graphics.RGB565
+```
+
+16-bit RGB565 pixel layout.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L3030)
+
+## `graphics.GS2_HMSB`
+
+```python
+graphics.GS2_HMSB
+```
+
+2-bit grayscale horizontal most-significant-bit layout.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L3031)
+
+## `graphics.GS4_HMSB`
+
+```python
+graphics.GS4_HMSB
+```
+
+4-bit grayscale horizontal most-significant-bit layout.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L3032)
+
+## `graphics.GS8`
+
+```python
+graphics.GS8
+```
+
+8-bit grayscale layout.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L3033)
+
+## `graphics.RGB888`
+
+```python
+graphics.RGB888
+```
+
+24-bit RGB888 pixel layout.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_module_cpy.c#L3034)
diff --git a/docs/generated/native-assets-runtime.md b/docs/generated/native-assets-runtime.md
new file mode 100644
index 0000000..6cb36fa
--- /dev/null
+++ b/docs/generated/native-assets-runtime.md
@@ -0,0 +1,260 @@
+---
+title: Native fonts, images, and runtime API
+description: Public C declarations for fonts, BMP565 data, image conversion, and capability reporting.
+---
+
+Source snapshot: [`68194959ad5bc5540aceb6b40807a8c4228af60a`](https://github.com/PyDevices/graphics/tree/68194959ad5bc5540aceb6b40807a8c4228af60a).
+
+Public C declarations for fonts, BMP565 data, image conversion, and capability reporting.
+
+Every entry below is generated from a public binding table or header declaration and links to its immutable source line.
+
+## `gfx_font_init_default`
+
+```c
+void gfx_font_init_default(gfx_font_t *font, int height);
+```
+
+Native font entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_font.h#L22)
+
+## `gfx_font_init_from_data`
+
+```c
+void gfx_font_init_from_data(gfx_font_t *font, const uint8_t *data, size_t len, int height);
+```
+
+Native font entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_font.h#L23)
+
+## `gfx_font_deinit`
+
+```c
+void gfx_font_deinit(gfx_font_t *font);
+```
+
+Native font entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_font.h#L24)
+
+## `gfx_font_export`
+
+```c
+int gfx_font_export(const gfx_font_t *font, const char *filename);
+```
+
+Native font entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_font.h#L25)
+
+## `gfx_font_text`
+
+```c
+gfx_area_t gfx_font_text(const gfx_canvas_t *canvas, const gfx_font_t *font, const char *str, int x0, int y0, int col, int scale, int inverted);
+```
+
+Native font entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_font.h#L27)
+
+## `gfx_font_draw_char`
+
+```c
+gfx_area_t gfx_font_draw_char(const gfx_canvas_t *canvas, const gfx_font_t *font, unsigned char ch, int x, int y, int color, int scale, int inverted);
+```
+
+Native font entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_font.h#L28)
+
+## `gfx_font_text_width`
+
+```c
+int gfx_font_text_width(const gfx_font_t *font, const char *str, int scale);
+```
+
+Native font entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_font.h#L29)
+
+## `gfx_font_text8`
+
+```c
+gfx_area_t gfx_font_text8(const gfx_canvas_t *canvas, const char *str, int x0, int y0, int col);
+```
+
+Native font entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_font.h#L30)
+
+## `gfx_font_text14`
+
+```c
+gfx_area_t gfx_font_text14(const gfx_canvas_t *canvas, const char *str, int x0, int y0, int col);
+```
+
+Native font entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_font.h#L31)
+
+## `gfx_font_text16`
+
+```c
+gfx_area_t gfx_font_text16(const gfx_canvas_t *canvas, const char *str, int x0, int y0, int col);
+```
+
+Native font entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_font.h#L32)
+
+## `gfx_bmp565_read_header_from_file`
+
+```c
+int gfx_bmp565_read_header_from_file(const char *path, int *width, int *height, unsigned int *data_offset);
+```
+
+Native bmp565 entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_bmp565.h#L27)
+
+## `gfx_bmp565_open_stream`
+
+```c
+int gfx_bmp565_open_stream(const char *path, gfx_bmp565_t *out);
+```
+
+Native bmp565 entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_bmp565.h#L28)
+
+## `gfx_bmp565_load_from_file`
+
+```c
+int gfx_bmp565_load_from_file(const char *path, gfx_bmp565_t *out);
+```
+
+Native bmp565 entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_bmp565.h#L29)
+
+## `gfx_bmp565_init_from_buffer`
+
+```c
+int gfx_bmp565_init_from_buffer(gfx_bmp565_t *out, const uint8_t *buf, size_t len, int width, int height);
+```
+
+Native bmp565 entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_bmp565.h#L30)
+
+## `gfx_bmp565_deinit`
+
+```c
+void gfx_bmp565_deinit(gfx_bmp565_t *bmp);
+```
+
+Native bmp565 entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_bmp565.h#L31)
+
+## `gfx_bmp565_save`
+
+```c
+int gfx_bmp565_save(const gfx_bmp565_t *bmp, const char *path);
+```
+
+Native bmp565 entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_bmp565.h#L32)
+
+## `gfx_bmp565_save_versioned`
+
+```c
+int gfx_bmp565_save_versioned(const gfx_bmp565_t *bmp, const char *path, char *out_path, size_t out_path_len);
+```
+
+Native bmp565 entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_bmp565.h#L33)
+
+## `gfx_bmp565_read_bytes`
+
+```c
+int gfx_bmp565_read_bytes(const gfx_bmp565_t *bmp, int start, int stop, uint8_t *out, size_t out_cap, size_t *out_len);
+```
+
+Native bmp565 entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_bmp565.h#L34)
+
+## `gfx_bmp565_read_region`
+
+```c
+int gfx_bmp565_read_region(const gfx_bmp565_t *bmp, int x0, int x1, int y0, int y1, uint8_t *out, size_t out_cap, size_t *out_len);
+```
+
+Native bmp565 entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_bmp565.h#L35)
+
+## `gfx_image_fb_free`
+
+```c
+void gfx_image_fb_free(gfx_image_fb_t *img);
+```
+
+Native image entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_files.h#L22)
+
+## `gfx_files_load_image`
+
+```c
+int gfx_files_load_image(const char *path, gfx_image_fb_t *out);
+```
+
+Native files entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_files.h#L23)
+
+## `gfx_files_save_image`
+
+```c
+int gfx_files_save_image(const gfx_fb_t *fb, const char *path, char *out_path, size_t out_path_len);
+```
+
+Native files entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_files.h#L24)
+
+## `gfx_files_pbm_to_framebuffer`
+
+```c
+int gfx_files_pbm_to_framebuffer(const char *path, gfx_image_fb_t *out);
+```
+
+Native files entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_files.h#L25)
+
+## `gfx_files_pgm_to_framebuffer`
+
+```c
+int gfx_files_pgm_to_framebuffer(const char *path, gfx_image_fb_t *out);
+```
+
+Native files entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_files.h#L26)
+
+## `gfx_files_bmp_to_framebuffer`
+
+```c
+int gfx_files_bmp_to_framebuffer(const char *path, gfx_image_fb_t *out);
+```
+
+Native files entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_files.h#L27)
diff --git a/docs/generated/native-drawing.md b/docs/generated/native-drawing.md
new file mode 100644
index 0000000..1519d3f
--- /dev/null
+++ b/docs/generated/native-drawing.md
@@ -0,0 +1,350 @@
+---
+title: Native drawing and framebuffer API
+description: Public C declarations for geometry, framebuffer operations, shapes, and clipping.
+---
+
+Source snapshot: [`68194959ad5bc5540aceb6b40807a8c4228af60a`](https://github.com/PyDevices/graphics/tree/68194959ad5bc5540aceb6b40807a8c4228af60a).
+
+Public C declarations for geometry, framebuffer operations, shapes, and clipping.
+
+Every entry below is generated from a public binding table or header declaration and links to its immutable source line.
+
+## `gfx_fb_validate_buffer`
+
+```c
+int gfx_fb_validate_buffer(size_t buf_len, int width, int height, int format, int stride);
+```
+
+Native fb entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_framebuffer.h#L21)
+
+## `gfx_fb_color_depth`
+
+```c
+int gfx_fb_color_depth(int format);
+```
+
+Native fb entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_framebuffer.h#L22)
+
+## `gfx_fb_setpixel`
+
+```c
+void gfx_fb_setpixel(const gfx_fb_t *fb, unsigned int x, unsigned int y, uint32_t col);
+```
+
+Native fb entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_framebuffer.h#L24)
+
+## `gfx_fb_getpixel`
+
+```c
+uint32_t gfx_fb_getpixel(const gfx_fb_t *fb, unsigned int x, unsigned int y);
+```
+
+Native fb entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_framebuffer.h#L25)
+
+## `gfx_fb_setpixel_checked`
+
+```c
+void gfx_fb_setpixel_checked(const gfx_fb_t *fb, int x, int y, int col, int mask);
+```
+
+Native fb entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_framebuffer.h#L26)
+
+## `gfx_fb_fill_rect_raw`
+
+```c
+void gfx_fb_fill_rect_raw(const gfx_fb_t *fb, int x, int y, int w, int h, uint32_t col);
+```
+
+Native fb entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_framebuffer.h#L27)
+
+## `gfx_fb_fill_rect`
+
+```c
+gfx_area_t gfx_fb_fill_rect(const gfx_fb_t *fb, int x, int y, int w, int h, uint32_t col);
+```
+
+Native fb entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_framebuffer.h#L28)
+
+## `gfx_fb_fill`
+
+```c
+gfx_area_t gfx_fb_fill(const gfx_fb_t *fb, uint32_t col);
+```
+
+Native fb entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_framebuffer.h#L29)
+
+## `gfx_fb_canvas_init`
+
+```c
+void gfx_fb_canvas_init(gfx_canvas_t *canvas, const gfx_fb_t *fb);
+```
+
+Native fb entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_framebuffer.h#L31)
+
+## `gfx_fb_scroll`
+
+```c
+void gfx_fb_scroll(gfx_fb_t *fb, int xstep, int ystep);
+```
+
+Native fb entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_framebuffer.h#L32)
+
+## `gfx_clipped_canvas_init`
+
+```c
+void gfx_clipped_canvas_init(gfx_clipped_canvas_t *cc, const gfx_canvas_t *parent, const gfx_area_t *clip);
+```
+
+Native clipped entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L20)
+
+## `gfx_shapes_pixel`
+
+```c
+gfx_area_t gfx_shapes_pixel(const gfx_canvas_t *canvas, int x, int y, int c);
+```
+
+Native shapes entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L22)
+
+## `gfx_shapes_hline`
+
+```c
+gfx_area_t gfx_shapes_hline(const gfx_canvas_t *canvas, int x, int y, int w, int c);
+```
+
+Native shapes entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L23)
+
+## `gfx_shapes_vline`
+
+```c
+gfx_area_t gfx_shapes_vline(const gfx_canvas_t *canvas, int x, int y, int h, int c);
+```
+
+Native shapes entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L24)
+
+## `gfx_shapes_fill_rect`
+
+```c
+gfx_area_t gfx_shapes_fill_rect(const gfx_canvas_t *canvas, int x, int y, int w, int h, int c);
+```
+
+Native shapes entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L25)
+
+## `gfx_shapes_rect`
+
+```c
+gfx_area_t gfx_shapes_rect(const gfx_canvas_t *canvas, int x, int y, int w, int h, int c, int fill);
+```
+
+Native shapes entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L26)
+
+## `gfx_shapes_line`
+
+```c
+gfx_area_t gfx_shapes_line(const gfx_canvas_t *canvas, int x1, int y1, int x2, int y2, int c);
+```
+
+Native shapes entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L27)
+
+## `gfx_shapes_ellipse`
+
+```c
+gfx_area_t gfx_shapes_ellipse(const gfx_canvas_t *canvas, int cx, int cy, int xradius, int yradius, int col, int fill, int mask_part);
+```
+
+Native shapes entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L28)
+
+## `gfx_shapes_fill`
+
+```c
+gfx_area_t gfx_shapes_fill(const gfx_canvas_t *canvas, int c);
+```
+
+Native shapes entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L29)
+
+## `gfx_shapes_poly_int_from_buffer`
+
+```c
+int gfx_shapes_poly_int_from_buffer(const void *buf, size_t len, size_t itemsize, const char *fmt, size_t index, int *out);
+```
+
+Native shapes entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L31)
+
+## `gfx_shapes_poly`
+
+```c
+gfx_area_t gfx_shapes_poly(const gfx_canvas_t *canvas, int x, int y, const void *coords, size_t coords_len, size_t itemsize, const char *fmt, int col, int fill);
+```
+
+Native shapes entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L32)
+
+## `gfx_shapes_blit`
+
+```c
+gfx_area_t gfx_shapes_blit(const gfx_canvas_t *canvas, const gfx_fb_t *source, int x, int y, int key, const gfx_fb_t *palette);
+```
+
+Native shapes entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L33)
+
+## `gfx_shapes_circle`
+
+```c
+gfx_area_t gfx_shapes_circle(const gfx_canvas_t *canvas, int x0, int y0, int r, int c, int fill);
+```
+
+Native shapes entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L34)
+
+## `gfx_shapes_round_rect`
+
+```c
+gfx_area_t gfx_shapes_round_rect(const gfx_canvas_t *canvas, int x0, int y0, int w, int h, int r, int c, int fill);
+```
+
+Native shapes entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L35)
+
+## `gfx_shapes_triangle`
+
+```c
+gfx_area_t gfx_shapes_triangle(const gfx_canvas_t *canvas, int x0, int y0, int x1, int y1, int x2, int y2, int c, int fill);
+```
+
+Native shapes entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L36)
+
+## `gfx_shapes_arc`
+
+```c
+gfx_area_t gfx_shapes_arc(const gfx_canvas_t *canvas, int x, int y, int r, float a0, float a1, int c);
+```
+
+Native shapes entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L37)
+
+## `gfx_shapes_gradient_rect`
+
+```c
+gfx_area_t gfx_shapes_gradient_rect(const gfx_canvas_t *canvas, int x, int y, int w, int h, int c1, int c2, int vertical);
+```
+
+Native shapes entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L38)
+
+## `gfx_shapes_blit_rect`
+
+```c
+gfx_area_t gfx_shapes_blit_rect(const gfx_canvas_t *canvas, const void *buf, int x, int y, int w, int h, int bpp);
+```
+
+Native shapes entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L39)
+
+## `gfx_shapes_blit_transparent`
+
+```c
+gfx_area_t gfx_shapes_blit_transparent(const gfx_canvas_t *canvas, const void *buf, int x, int y, int w, int h, int key, int bpp);
+```
+
+Native shapes entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L40)
+
+## `gfx_shapes_polygon`
+
+```c
+gfx_area_t gfx_shapes_polygon(const gfx_canvas_t *canvas, const int *points, size_t n_points, int x, int y, int color, float angle, int center_x, int center_y);
+```
+
+Native shapes entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_shapes.h#L41)
+
+## `gfx_draw_init`
+
+```c
+void gfx_draw_init(gfx_draw_t *draw, const gfx_canvas_t *canvas);
+```
+
+Native draw entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_draw.h#L21)
+
+## `gfx_draw_effective_clip`
+
+```c
+gfx_area_t gfx_draw_effective_clip(const gfx_draw_t *draw);
+```
+
+Native draw entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_draw.h#L23)
+
+## `gfx_draw_push_clip`
+
+```c
+void gfx_draw_push_clip(gfx_draw_t *draw, const gfx_area_t *clip);
+```
+
+Native draw entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_draw.h#L24)
+
+## `gfx_draw_pop_clip`
+
+```c
+void gfx_draw_pop_clip(gfx_draw_t *draw);
+```
+
+Native draw entry point declared for firmware and extension integration.
+
+[View the pinned source declaration](https://github.com/PyDevices/graphics/blob/68194959ad5bc5540aceb6b40807a8c4228af60a/gfx_draw.h#L25)
diff --git a/docs/package-lock.json b/docs/package-lock.json
new file mode 100644
index 0000000..8ec61e9
--- /dev/null
+++ b/docs/package-lock.json
@@ -0,0 +1,4250 @@
+{
+ "name": "graphics-cmod-sourcey-docs",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "graphics-cmod-sourcey-docs",
+ "devDependencies": {
+ "sourcey": "3.6.5"
+ }
+ },
+ "node_modules/@apidevtools/json-schema-ref-parser": {
+ "version": "13.0.5",
+ "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-13.0.5.tgz",
+ "integrity": "sha512-xfh4xVJD62gG6spIc7lwxoWT+l16nZu1ELyU8FkjaP/oD2yP09EvLAU6KhtudN9aML2Khhs9pY6Slr7KGTES3w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/json-schema": "^7.0.15",
+ "js-yaml": "^4.1.0"
+ },
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/philsturgeon"
+ }
+ },
+ "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.7",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz",
+ "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.29.7",
+ "@babel/types": "^7.29.7",
+ "@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-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-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-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-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==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "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.7",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz",
+ "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.29.7"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.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-transform-react-jsx": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.29.7.tgz",
+ "integrity": "sha512-WsZulLVBUHXVj2cUcPVx6UE21TpalB6bHbSFErKT0Ib++ax24jjXe73FqlWvdylFOjiuPHYi6VCcgRad1ItN+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.29.7",
+ "@babel/helper-module-imports": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/plugin-syntax-jsx": "^7.29.7",
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-development": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.29.7.tgz",
+ "integrity": "sha512-Xfy3UVMF04+ypnFbkhvfqtmvwfe92qwQdbGZVonhE+6v35GzlofmOnA1szaZqzb9xYWr0nl1e5EMmzi0DNON1g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/plugin-transform-react-jsx": "^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.7",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz",
+ "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.29.7",
+ "@babel/generator": "^7.29.7",
+ "@babel/helper-globals": "^7.29.7",
+ "@babel/parser": "^7.29.7",
+ "@babel/template": "^7.29.7",
+ "@babel/types": "^7.29.7",
+ "debug": "^4.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz",
+ "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@emnapi/core": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz",
+ "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/wasi-threads": "1.2.2",
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/runtime": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz",
+ "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@emnapi/wasi-threads": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz",
+ "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@exodus/schemasafe": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.3.0.tgz",
+ "integrity": "sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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==",
+ "dev": true,
+ "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/@napi-rs/wasm-runtime": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz",
+ "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@tybys/wasm-util": "^0.10.3"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Brooooooklyn"
+ },
+ "peerDependencies": {
+ "@emnapi/core": "^1.7.1",
+ "@emnapi/runtime": "^1.7.1"
+ }
+ },
+ "node_modules/@oxc-project/types": {
+ "version": "0.139.0",
+ "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz",
+ "integrity": "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/Boshen"
+ }
+ },
+ "node_modules/@preact/preset-vite": {
+ "version": "2.10.6",
+ "resolved": "https://registry.npmjs.org/@preact/preset-vite/-/preset-vite-2.10.6.tgz",
+ "integrity": "sha512-ZZ5RIT2ZVXg8UxRA8VZpoT8CdpDG7RFIqOT4bELqNBp85+HKvQBbgmh3gsoW1UOQXx26TLe+ZRNKI7q281Kckw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/plugin-transform-react-jsx": "^7.27.1",
+ "@babel/plugin-transform-react-jsx-development": "^7.27.1",
+ "@prefresh/vite": "^2.4.11",
+ "@rollup/pluginutils": "^5.0.0",
+ "babel-plugin-transform-hook-names": "^1.0.2",
+ "debug": "^4.4.3",
+ "magic-string": "^0.30.21",
+ "picocolors": "^1.1.1",
+ "vite-prerender-plugin": "^0.5.8",
+ "zimmerframe": "^1.1.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "7.x",
+ "vite": "2.x || 3.x || 4.x || 5.x || 6.x || 7.x || 8.x"
+ }
+ },
+ "node_modules/@prefresh/babel-plugin": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/@prefresh/babel-plugin/-/babel-plugin-0.5.3.tgz",
+ "integrity": "sha512-57LX2SHs4BX2s1IwCjNzTE2OJeEepRCNf1VTEpbNcUyHfMO68eeOWGDIt4ob9aYlW6PEWZ1SuwNikuoIXANDtQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@prefresh/core": {
+ "version": "1.5.10",
+ "resolved": "https://registry.npmjs.org/@prefresh/core/-/core-1.5.10.tgz",
+ "integrity": "sha512-7yPTFbG56sutaFu8krp3B4a200KOFUvrtlllKWRuLjsYXo9UUucHOZRcer+gtgMkFTpv6ob8TGcTwA32bSwa1w==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "preact": "^10.0.0 || ^11.0.0-0"
+ }
+ },
+ "node_modules/@prefresh/utils": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@prefresh/utils/-/utils-1.2.1.tgz",
+ "integrity": "sha512-vq/sIuN5nYfYzvyayXI4C2QkprfNaHUQ9ZX+3xLD8nL3rWyzpxOm1+K7RtMbhd+66QcaISViK7amjnheQ/4WZw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@prefresh/vite": {
+ "version": "2.4.12",
+ "resolved": "https://registry.npmjs.org/@prefresh/vite/-/vite-2.4.12.tgz",
+ "integrity": "sha512-FY1fzXpUjiuosznMV0YM7XAOPZjB5FIdWS0W24+XnlxYkt9hNAwwsiKYn+cuTEoMtD/ZVazS5QVssBr9YhpCQA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.22.1",
+ "@prefresh/babel-plugin": "^0.5.2",
+ "@prefresh/core": "^1.5.0",
+ "@prefresh/utils": "^1.2.0",
+ "@rollup/pluginutils": "^4.2.1"
+ },
+ "peerDependencies": {
+ "preact": "^10.4.0 || ^11.0.0-0",
+ "vite": ">=2.0.0"
+ }
+ },
+ "node_modules/@prefresh/vite/node_modules/@rollup/pluginutils": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz",
+ "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "estree-walker": "^2.0.1",
+ "picomatch": "^2.2.2"
+ },
+ "engines": {
+ "node": ">= 8.0.0"
+ }
+ },
+ "node_modules/@prefresh/vite/node_modules/picomatch": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/@resvg/resvg-js": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/@resvg/resvg-js/-/resvg-js-2.6.2.tgz",
+ "integrity": "sha512-xBaJish5OeGmniDj9cW5PRa/PtmuVU3ziqrbr5xJj901ZDN4TosrVaNZpEiLZAxdfnhAe7uQ7QFWfjPe9d9K2Q==",
+ "dev": true,
+ "license": "MPL-2.0",
+ "engines": {
+ "node": ">= 10"
+ },
+ "optionalDependencies": {
+ "@resvg/resvg-js-android-arm-eabi": "2.6.2",
+ "@resvg/resvg-js-android-arm64": "2.6.2",
+ "@resvg/resvg-js-darwin-arm64": "2.6.2",
+ "@resvg/resvg-js-darwin-x64": "2.6.2",
+ "@resvg/resvg-js-linux-arm-gnueabihf": "2.6.2",
+ "@resvg/resvg-js-linux-arm64-gnu": "2.6.2",
+ "@resvg/resvg-js-linux-arm64-musl": "2.6.2",
+ "@resvg/resvg-js-linux-x64-gnu": "2.6.2",
+ "@resvg/resvg-js-linux-x64-musl": "2.6.2",
+ "@resvg/resvg-js-win32-arm64-msvc": "2.6.2",
+ "@resvg/resvg-js-win32-ia32-msvc": "2.6.2",
+ "@resvg/resvg-js-win32-x64-msvc": "2.6.2"
+ }
+ },
+ "node_modules/@resvg/resvg-js-android-arm-eabi": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/@resvg/resvg-js-android-arm-eabi/-/resvg-js-android-arm-eabi-2.6.2.tgz",
+ "integrity": "sha512-FrJibrAk6v29eabIPgcTUMPXiEz8ssrAk7TXxsiZzww9UTQ1Z5KAbFJs+Z0Ez+VZTYgnE5IQJqBcoSiMebtPHA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@resvg/resvg-js-android-arm64": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/@resvg/resvg-js-android-arm64/-/resvg-js-android-arm64-2.6.2.tgz",
+ "integrity": "sha512-VcOKezEhm2VqzXpcIJoITuvUS/fcjIw5NA/w3tjzWyzmvoCdd+QXIqy3FBGulWdClvp4g+IfUemigrkLThSjAQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@resvg/resvg-js-darwin-arm64": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/@resvg/resvg-js-darwin-arm64/-/resvg-js-darwin-arm64-2.6.2.tgz",
+ "integrity": "sha512-nmok2LnAd6nLUKI16aEB9ydMC6Lidiiq2m1nEBDR1LaaP7FGs4AJ90qDraxX+CWlVuRlvNjyYJTNv8qFjtL9+A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@resvg/resvg-js-darwin-x64": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/@resvg/resvg-js-darwin-x64/-/resvg-js-darwin-x64-2.6.2.tgz",
+ "integrity": "sha512-GInyZLjgWDfsVT6+SHxQVRwNzV0AuA1uqGsOAW+0th56J7Nh6bHHKXHBWzUrihxMetcFDmQMAX1tZ1fZDYSRsw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@resvg/resvg-js-linux-arm-gnueabihf": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-arm-gnueabihf/-/resvg-js-linux-arm-gnueabihf-2.6.2.tgz",
+ "integrity": "sha512-YIV3u/R9zJbpqTTNwTZM5/ocWetDKGsro0SWp70eGEM9eV2MerWyBRZnQIgzU3YBnSBQ1RcxRZvY/UxwESfZIw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@resvg/resvg-js-linux-arm64-gnu": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-arm64-gnu/-/resvg-js-linux-arm64-gnu-2.6.2.tgz",
+ "integrity": "sha512-zc2BlJSim7YR4FZDQ8OUoJg5holYzdiYMeobb9pJuGDidGL9KZUv7SbiD4E8oZogtYY42UZEap7dqkkYuA91pg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@resvg/resvg-js-linux-arm64-musl": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-arm64-musl/-/resvg-js-linux-arm64-musl-2.6.2.tgz",
+ "integrity": "sha512-3h3dLPWNgSsD4lQBJPb4f+kvdOSJHa5PjTYVsWHxLUzH4IFTJUAnmuWpw4KqyQ3NA5QCyhw4TWgxk3jRkQxEKg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@resvg/resvg-js-linux-x64-gnu": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-x64-gnu/-/resvg-js-linux-x64-gnu-2.6.2.tgz",
+ "integrity": "sha512-IVUe+ckIerA7xMZ50duAZzwf1U7khQe2E0QpUxu5MBJNao5RqC0zwV/Zm965vw6D3gGFUl7j4m+oJjubBVoftw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@resvg/resvg-js-linux-x64-musl": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-x64-musl/-/resvg-js-linux-x64-musl-2.6.2.tgz",
+ "integrity": "sha512-UOf83vqTzoYQO9SZ0fPl2ZIFtNIz/Rr/y+7X8XRX1ZnBYsQ/tTb+cj9TE+KHOdmlTFBxhYzVkP2lRByCzqi4jQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@resvg/resvg-js-win32-arm64-msvc": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/@resvg/resvg-js-win32-arm64-msvc/-/resvg-js-win32-arm64-msvc-2.6.2.tgz",
+ "integrity": "sha512-7C/RSgCa+7vqZ7qAbItfiaAWhyRSoD4l4BQAbVDqRRsRgY+S+hgS3in0Rxr7IorKUpGE69X48q6/nOAuTJQxeQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@resvg/resvg-js-win32-ia32-msvc": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/@resvg/resvg-js-win32-ia32-msvc/-/resvg-js-win32-ia32-msvc-2.6.2.tgz",
+ "integrity": "sha512-har4aPAlvjnLcil40AC77YDIk6loMawuJwFINEM7n0pZviwMkMvjb2W5ZirsNOZY4aDbo5tLx0wNMREp5Brk+w==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@resvg/resvg-js-win32-x64-msvc": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/@resvg/resvg-js-win32-x64-msvc/-/resvg-js-win32-x64-msvc-2.6.2.tgz",
+ "integrity": "sha512-ZXtYhtUr5SSaBrUDq7DiyjOFJqBVL/dOBN7N/qmi/pO0IgiWW/f/ue3nbvu9joWE5aAKDoIzy/CxsY0suwGosQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@rolldown/binding-android-arm64": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.5.tgz",
+ "integrity": "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-darwin-arm64": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz",
+ "integrity": "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-darwin-x64": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz",
+ "integrity": "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-freebsd-x64": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.5.tgz",
+ "integrity": "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm-gnueabihf": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.5.tgz",
+ "integrity": "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm64-gnu": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz",
+ "integrity": "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm64-musl": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz",
+ "integrity": "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-ppc64-gnu": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.5.tgz",
+ "integrity": "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-s390x-gnu": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.5.tgz",
+ "integrity": "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-x64-gnu": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz",
+ "integrity": "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-x64-musl": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz",
+ "integrity": "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-openharmony-arm64": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.5.tgz",
+ "integrity": "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-wasm32-wasi": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.5.tgz",
+ "integrity": "sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==",
+ "cpu": [
+ "wasm32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "1.11.1",
+ "@emnapi/runtime": "1.11.1",
+ "@napi-rs/wasm-runtime": "^1.1.6"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-win32-arm64-msvc": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz",
+ "integrity": "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-win32-x64-msvc": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz",
+ "integrity": "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "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/pluginutils": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz",
+ "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "estree-walker": "^2.0.2",
+ "picomatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@shikijs/core": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.3.1.tgz",
+ "integrity": "sha512-ANMDxuaPsNMdDC1m4vfvhlDmJweMwkE5XitTwrq2rWHx5jM+dlm4MmHt2PP6t0uejfR77SuhrhJ0zEijIF/uhA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/primitive": "4.3.1",
+ "@shikijs/types": "4.3.1",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.4",
+ "hast-util-to-html": "^9.0.5"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@shikijs/engine-javascript": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.3.1.tgz",
+ "integrity": "sha512-JBItcnPuYq7jVJdZo/vMj94r+szT7XEjHFX+mvFDGSEIbVAXAGyHAHzhbWzpGOwYidCZrErJLLgn2PVeiokHnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "4.3.1",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "oniguruma-to-es": "^4.3.6"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@shikijs/engine-oniguruma": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.3.1.tgz",
+ "integrity": "sha512-OXyNMzg0pews+msMj4cHeqT4xiYKKvbnn6VbdAXxfoFl3SSx4fJTc8FadECuc5/H9p3BzhNAoAUXKwAu9rWYhg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "4.3.1",
+ "@shikijs/vscode-textmate": "^10.0.2"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@shikijs/langs": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.3.1.tgz",
+ "integrity": "sha512-m0l9nsDqgBHvbZbk7A0/kXz/impK3uB/c6rAn6Gpg/uPtdZRQ+alsN/17MU5thb68XTj/4DxkZAotrM0GGSpDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "4.3.1"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@shikijs/primitive": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.3.1.tgz",
+ "integrity": "sha512-CXQRQOYy1leqQ8ceTeJdmXv/bsUY++6QyLpXJ94LZAAYj5X2SKRdc5ipguv4NPyGVKItB2PPwUpRNe0Sjh5S1A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "4.3.1",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@shikijs/themes": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.3.1.tgz",
+ "integrity": "sha512-dgpoJ4WqNi2yTmizQHBJ5zcX6j2lE6icN/0yt4l1kkf16jrY/pwPLoTb1ETsWMz0OBLf9ZNvwmxft+cH+N9qSA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "4.3.1"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@shikijs/types": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.3.1.tgz",
+ "integrity": "sha512-CHFxE0jztBIZRHH6gxXE7DXUCFXjReEGxZ/j0rfSLGKZuwp2xBYycEP14875DSa9KLL/6700oxIq6oO6ef9K2g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@shikijs/vscode-textmate": {
+ "version": "10.0.2",
+ "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz",
+ "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@shuding/opentype.js": {
+ "version": "1.4.0-beta.0",
+ "resolved": "https://registry.npmjs.org/@shuding/opentype.js/-/opentype.js-1.4.0-beta.0.tgz",
+ "integrity": "sha512-3NgmNyH3l/Hv6EvsWJbsvpcpUba6R8IREQ83nH83cyakCw7uM1arZKNfHwv1Wz6jgqrF/j4x5ELvR6PnK9nTcA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fflate": "^0.7.3",
+ "string.prototype.codepointat": "^0.2.1"
+ },
+ "bin": {
+ "ot": "bin/ot"
+ },
+ "engines": {
+ "node": ">= 8.0.0"
+ }
+ },
+ "node_modules/@tailwindcss/node": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz",
+ "integrity": "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/remapping": "^2.3.5",
+ "enhanced-resolve": "^5.24.1",
+ "jiti": "^2.7.0",
+ "lightningcss": "1.32.0",
+ "magic-string": "^0.30.21",
+ "source-map-js": "^1.2.1",
+ "tailwindcss": "4.3.3"
+ }
+ },
+ "node_modules/@tailwindcss/oxide": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz",
+ "integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 20"
+ },
+ "optionalDependencies": {
+ "@tailwindcss/oxide-android-arm64": "4.3.3",
+ "@tailwindcss/oxide-darwin-arm64": "4.3.3",
+ "@tailwindcss/oxide-darwin-x64": "4.3.3",
+ "@tailwindcss/oxide-freebsd-x64": "4.3.3",
+ "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3",
+ "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3",
+ "@tailwindcss/oxide-linux-arm64-musl": "4.3.3",
+ "@tailwindcss/oxide-linux-x64-gnu": "4.3.3",
+ "@tailwindcss/oxide-linux-x64-musl": "4.3.3",
+ "@tailwindcss/oxide-wasm32-wasi": "4.3.3",
+ "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3",
+ "@tailwindcss/oxide-win32-x64-msvc": "4.3.3"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-android-arm64": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz",
+ "integrity": "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-darwin-arm64": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz",
+ "integrity": "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-darwin-x64": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz",
+ "integrity": "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-freebsd-x64": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz",
+ "integrity": "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz",
+ "integrity": "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz",
+ "integrity": "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm64-musl": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz",
+ "integrity": "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-x64-gnu": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz",
+ "integrity": "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-x64-musl": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz",
+ "integrity": "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-wasm32-wasi": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz",
+ "integrity": "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==",
+ "bundleDependencies": [
+ "@napi-rs/wasm-runtime",
+ "@emnapi/core",
+ "@emnapi/runtime",
+ "@tybys/wasm-util",
+ "@emnapi/wasi-threads",
+ "tslib"
+ ],
+ "cpu": [
+ "wasm32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "^1.11.1",
+ "@emnapi/runtime": "^1.11.1",
+ "@emnapi/wasi-threads": "^1.2.2",
+ "@napi-rs/wasm-runtime": "^1.1.4",
+ "@tybys/wasm-util": "^0.10.2",
+ "tslib": "^2.8.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz",
+ "integrity": "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-win32-x64-msvc": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz",
+ "integrity": "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/typography": {
+ "version": "0.5.20",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.20.tgz",
+ "integrity": "sha512-hwbzQuNUfcPvbegQFatVPl/MY/tcM9KLl963hQ5laJKPh81TEZ1+dNG9PirGvcaDBkp+BCshExAyKVPW91dozw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "postcss-selector-parser": "6.0.10"
+ },
+ "peerDependencies": {
+ "tailwindcss": ">=3.0.0 || >=4.0.0 || insiders"
+ }
+ },
+ "node_modules/@tailwindcss/vite": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.3.tgz",
+ "integrity": "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@tailwindcss/node": "4.3.3",
+ "@tailwindcss/oxide": "4.3.3",
+ "tailwindcss": "4.3.3"
+ },
+ "peerDependencies": {
+ "vite": "^5.2.0 || ^6 || ^7 || ^8"
+ }
+ },
+ "node_modules/@tybys/wasm-util": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz",
+ "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "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/@types/hast": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz",
+ "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.3.tgz",
+ "integrity": "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true,
+ "license": "Python-2.0"
+ },
+ "node_modules/babel-plugin-transform-hook-names": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-hook-names/-/babel-plugin-transform-hook-names-1.0.2.tgz",
+ "integrity": "sha512-5gafyjyyBTTdX/tQQ0hRgu4AhNHG/hqWi0ZZmg2xvs2FgRkJXzDNKBZCyoYqgFkovfDrgM8OoKg8karoUvWeCw==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@babel/core": "^7.12.10"
+ }
+ },
+ "node_modules/base64-js": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz",
+ "integrity": "sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.10.43",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.43.tgz",
+ "integrity": "sha512-AjYpR78kDWAY3Efj+cDTFH9t9SCoL7OoTp1BOb0mQV7S+6CiLwnWM3FyxhJtdPufDFKzmCSFoUncKjWgJEZTCQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.cjs"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/browserslist": {
+ "version": "4.28.6",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.6.tgz",
+ "integrity": "sha512-FQBYNK15VMslhLHpA7+n+n1GOlF1kId2xcCg7/j95f24AOF6VDYMNH4mFxF7KuaTdv627faazpOAjFzMrfJOUw==",
+ "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.10.42",
+ "caniuse-lite": "^1.0.30001803",
+ "electron-to-chromium": "^1.5.389",
+ "node-releases": "^2.0.51",
+ "update-browserslist-db": "^1.2.3"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/call-me-maybe": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz",
+ "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/camelize": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz",
+ "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001806",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz",
+ "integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==",
+ "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/ccount": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
+ "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-html4": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz",
+ "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-legacy": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz",
+ "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/citty": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz",
+ "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "consola": "^3.2.3"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/comma-separated-tokens": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
+ "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/commander": {
+ "version": "13.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz",
+ "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/consola": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz",
+ "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^14.18.0 || >=16.10.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/css-background-parser": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/css-background-parser/-/css-background-parser-0.1.0.tgz",
+ "integrity": "sha512-2EZLisiZQ+7m4wwur/qiYJRniHX4K5Tc9w93MT3AS0WS1u5kaZ4FKXlOTBhOjc+CgEgPiGY+fX1yWD8UwpEqUA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/css-box-shadow": {
+ "version": "1.0.0-3",
+ "resolved": "https://registry.npmjs.org/css-box-shadow/-/css-box-shadow-1.0.0-3.tgz",
+ "integrity": "sha512-9jaqR6e7Ohds+aWwmhe6wILJ99xYQbfmK9QQB9CcMjDbTxPZjwEmUQpU91OG05Xgm8BahT5fW+svbsQGjS/zPg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/css-color-keywords": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz",
+ "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/css-gradient-parser": {
+ "version": "0.0.17",
+ "resolved": "https://registry.npmjs.org/css-gradient-parser/-/css-gradient-parser-0.0.17.tgz",
+ "integrity": "sha512-w2Xy9UMMwlKtou0vlRnXvWglPAceXCTtcmVSo8ZBUvqCV5aXEFP/PC6d+I464810I9FT++UACwTD5511bmGPUg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/css-select": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz",
+ "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.1.0",
+ "domhandler": "^5.0.2",
+ "domutils": "^3.0.1",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/css-select/node_modules/dom-serializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.2",
+ "entities": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/css-select/node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/css-select/node_modules/domhandler": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "domelementtype": "^2.3.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/css-select/node_modules/domutils": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
+ "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dom-serializer": "^2.0.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/css-select/node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/css-to-react-native": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz",
+ "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "camelize": "^1.0.0",
+ "css-color-keywords": "^1.0.0",
+ "postcss-value-parser": "^4.0.2"
+ }
+ },
+ "node_modules/css-what": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz",
+ "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/dayjs": {
+ "version": "1.11.21",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.21.tgz",
+ "integrity": "sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==",
+ "dev": true,
+ "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/deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/detect-libc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/devlop": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
+ "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dequal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/dom-serializer": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-3.1.1.tgz",
+ "integrity": "sha512-4MEa38/QexBob6gFNwu+EGdWvhJ1OKuNwdYY3Y3NyeWDQfnGeDYQUDfIRzWu5B5gsv03so2Uxd28YC6zrsx3Lw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^3.0.0",
+ "domhandler": "^6.0.0",
+ "entities": "^8.0.0"
+ },
+ "engines": {
+ "node": ">=20.19.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-3.0.0.tgz",
+ "integrity": "sha512-umCQid3jKbDmVjx8jGaW7uUykm4DEUeyV21hPxNMo2nV955DhUThwqyOIDtreepP31hl84X7G5U9ZfsWvIB3Pg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=20.19.0"
+ }
+ },
+ "node_modules/domhandler": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-6.0.1.tgz",
+ "integrity": "sha512-gYzvtM72ZtxQO0T048kd6HWSbbGCNOUwcnfQ01cqIJ4X2IYKFFHZ5mKvrQETcFXxsRObZulDaKmy//R7TPtsBg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "domelementtype": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=20.19.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-4.0.2.tgz",
+ "integrity": "sha512-qI4JLRKnSzqFqr7hAlS5xQDusBCjKSEG4t4+7aNrIQMHBcsC2TGEhuyABJdYkgSewL57PNLYEiibY2iPKhKpaA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dom-serializer": "^3.0.0",
+ "domelementtype": "^3.0.0",
+ "domhandler": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=20.19.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.393",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.393.tgz",
+ "integrity": "sha512-kiDJdIUawuEIcp9XoICKp1iTYDEbgguIPq526N1Q7jIQDeQ3CqoMx71025PI/7E48Ddtw2HuWsVjY7afEgNxmg==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/emoji-regex-xs": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-2.0.1.tgz",
+ "integrity": "sha512-1QFuh8l7LqUcKe24LsPUNzjrzJQ7pgRwp1QMcZ5MX6mFplk2zQ08NVCM84++1cveaUUYtcCYHmeFEuNg16sU4g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/enhanced-resolve": {
+ "version": "5.24.2",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.2.tgz",
+ "integrity": "sha512-rpsZEGT1jFuve6QlpyRp9ckQ+kN61hvF9BzCPyMdaKTm8UJce96KBn3sorXOFXlzjPrs3Vc4T1NsSroZ3PxlFw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.3.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/entities": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz",
+ "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=20.19.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/es6-promise": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz",
+ "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-safe-stringify": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz",
+ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==",
+ "dev": true,
+ "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/fflate": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.7.4.tgz",
+ "integrity": "sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/handlebars": {
+ "version": "4.7.9",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz",
+ "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "minimist": "^1.2.5",
+ "neo-async": "^2.6.2",
+ "source-map": "^0.6.1",
+ "wordwrap": "^1.0.0"
+ },
+ "bin": {
+ "handlebars": "bin/handlebars"
+ },
+ "engines": {
+ "node": ">=0.4.7"
+ },
+ "optionalDependencies": {
+ "uglify-js": "^3.1.4"
+ }
+ },
+ "node_modules/hast-util-to-html": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz",
+ "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "ccount": "^2.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "hast-util-whitespace": "^3.0.0",
+ "html-void-elements": "^3.0.0",
+ "mdast-util-to-hast": "^13.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "stringify-entities": "^4.0.0",
+ "zwitch": "^2.0.4"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-whitespace": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz",
+ "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "he": "bin/he"
+ }
+ },
+ "node_modules/heroicons": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/heroicons/-/heroicons-2.2.0.tgz",
+ "integrity": "sha512-yOwvztmNiBWqR946t+JdgZmyzEmnRMC2nxvHFC90bF1SUttwB6yJKYeme1JeEcBfobdOs827nCyiWBS2z/brog==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/hex-rgb": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/hex-rgb/-/hex-rgb-4.3.0.tgz",
+ "integrity": "sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/html-void-elements": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz",
+ "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/htmlparser2": {
+ "version": "12.0.0",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-12.0.0.tgz",
+ "integrity": "sha512-Tz7u1i95/g2x2jz81+x0FBVhBhY5aRTvD3tXXdFaljuNdzDLJ8UGNRrTcj2cgQvAg3iW/h77Fz15nLW0L0CrZw==",
+ "dev": true,
+ "funding": [
+ "https://github.com/fb55/htmlparser2?sponsor=1",
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^3.0.0",
+ "domhandler": "^6.0.0",
+ "domutils": "^4.0.2",
+ "entities": "^8.0.0"
+ },
+ "engines": {
+ "node": ">=20.19.0"
+ }
+ },
+ "node_modules/http2-client": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/http2-client/-/http2-client-1.3.5.tgz",
+ "integrity": "sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/jiti": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz",
+ "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jiti": "lib/jiti-cli.mjs"
+ }
+ },
+ "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/js-yaml": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz",
+ "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/puzrin"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/nodeca"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "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/launder": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/launder/-/launder-1.7.1.tgz",
+ "integrity": "sha512-mU6WRz5EusL9ZZuiZ5SO4Y6C0P9PAUR9iwdb6bzj4KDihm28DiHFw+/yk9DBH4f+Pv1wuzQ4e2jV3oQ7mkIqvw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dayjs": "^1.11.7"
+ }
+ },
+ "node_modules/lightningcss": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz",
+ "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "detect-libc": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "lightningcss-android-arm64": "1.32.0",
+ "lightningcss-darwin-arm64": "1.32.0",
+ "lightningcss-darwin-x64": "1.32.0",
+ "lightningcss-freebsd-x64": "1.32.0",
+ "lightningcss-linux-arm-gnueabihf": "1.32.0",
+ "lightningcss-linux-arm64-gnu": "1.32.0",
+ "lightningcss-linux-arm64-musl": "1.32.0",
+ "lightningcss-linux-x64-gnu": "1.32.0",
+ "lightningcss-linux-x64-musl": "1.32.0",
+ "lightningcss-win32-arm64-msvc": "1.32.0",
+ "lightningcss-win32-x64-msvc": "1.32.0"
+ }
+ },
+ "node_modules/lightningcss-android-arm64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz",
+ "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-arm64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz",
+ "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-x64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz",
+ "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-freebsd-x64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz",
+ "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm-gnueabihf": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz",
+ "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-gnu": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz",
+ "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-musl": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz",
+ "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-gnu": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz",
+ "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-musl": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz",
+ "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-arm64-msvc": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz",
+ "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-x64-msvc": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz",
+ "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/linebreak": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/linebreak/-/linebreak-1.1.0.tgz",
+ "integrity": "sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "base64-js": "0.0.8",
+ "unicode-trie": "^2.0.0"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "node_modules/marked": {
+ "version": "15.0.12",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz",
+ "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "marked": "bin/marked.js"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/mcp-parser": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/mcp-parser/-/mcp-parser-0.4.0.tgz",
+ "integrity": "sha512-KBGcH7tB0nCPTVg+g8NkBTxsALH5qPAiIwSg1bnGvpfsPYdLC2Ubmlv/J+JrhRhd2nnusfqP//O0AXB0ltMUwA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mcp-schema": "^0.3.1"
+ },
+ "bin": {
+ "mcp-parser": "dist/cli.js"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/mcp-schema": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/mcp-schema/-/mcp-schema-0.3.1.tgz",
+ "integrity": "sha512-2W0uXdIBy4xRLkcZYQtxm1H8e3sGo/sM9+6ciOkPTQCKZnCm2qU+4/CpRSkt32MfoQzDamz6FqzknsFnafi2WA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/mdast-util-to-hast": {
+ "version": "13.2.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz",
+ "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "@ungap/structured-clone": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "trim-lines": "^3.0.0",
+ "unist-util-position": "^5.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-encode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz",
+ "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-sanitize-uri": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz",
+ "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-types": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz",
+ "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/moxygen": {
+ "version": "2.1.12",
+ "resolved": "https://registry.npmjs.org/moxygen/-/moxygen-2.1.12.tgz",
+ "integrity": "sha512-jPDT933A9JJNDPXyy4HayCUYhMr9+42oB4n5OwIwcI8b8EX1n184lTRzvyLiNQuv386fj5Qp0F54u1RMTKvkzA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "commander": "^13.1.0",
+ "handlebars": "^4.7.9",
+ "xml2js": "^0.6.2"
+ },
+ "bin": {
+ "moxygen": "dist/cli.js"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "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.16",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz",
+ "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==",
+ "dev": true,
+ "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/neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/node-fetch": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
+ "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/node-fetch-h2": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz",
+ "integrity": "sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "http2-client": "^1.2.5"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ }
+ },
+ "node_modules/node-html-parser": {
+ "version": "6.1.13",
+ "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.13.tgz",
+ "integrity": "sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "css-select": "^5.1.0",
+ "he": "1.2.0"
+ }
+ },
+ "node_modules/node-readfiles": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/node-readfiles/-/node-readfiles-0.2.0.tgz",
+ "integrity": "sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es6-promise": "^3.2.1"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.51",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz",
+ "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
+ }
+ },
+ "node_modules/oas-kit-common": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/oas-kit-common/-/oas-kit-common-1.0.8.tgz",
+ "integrity": "sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "fast-safe-stringify": "^2.0.7"
+ }
+ },
+ "node_modules/oas-linter": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/oas-linter/-/oas-linter-3.2.2.tgz",
+ "integrity": "sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@exodus/schemasafe": "^1.0.0-rc.2",
+ "should": "^13.2.1",
+ "yaml": "^1.10.0"
+ },
+ "funding": {
+ "url": "https://github.com/Mermade/oas-kit?sponsor=1"
+ }
+ },
+ "node_modules/oas-linter/node_modules/yaml": {
+ "version": "1.10.3",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz",
+ "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/oas-resolver": {
+ "version": "2.5.6",
+ "resolved": "https://registry.npmjs.org/oas-resolver/-/oas-resolver-2.5.6.tgz",
+ "integrity": "sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "node-fetch-h2": "^2.3.0",
+ "oas-kit-common": "^1.0.8",
+ "reftools": "^1.1.9",
+ "yaml": "^1.10.0",
+ "yargs": "^17.0.1"
+ },
+ "bin": {
+ "resolve": "resolve.js"
+ },
+ "funding": {
+ "url": "https://github.com/Mermade/oas-kit?sponsor=1"
+ }
+ },
+ "node_modules/oas-resolver/node_modules/yaml": {
+ "version": "1.10.3",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz",
+ "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/oas-schema-walker": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz",
+ "integrity": "sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "funding": {
+ "url": "https://github.com/Mermade/oas-kit?sponsor=1"
+ }
+ },
+ "node_modules/oas-validator": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/oas-validator/-/oas-validator-5.0.8.tgz",
+ "integrity": "sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "call-me-maybe": "^1.0.1",
+ "oas-kit-common": "^1.0.8",
+ "oas-linter": "^3.2.2",
+ "oas-resolver": "^2.5.6",
+ "oas-schema-walker": "^1.1.5",
+ "reftools": "^1.1.9",
+ "should": "^13.2.1",
+ "yaml": "^1.10.0"
+ },
+ "funding": {
+ "url": "https://github.com/Mermade/oas-kit?sponsor=1"
+ }
+ },
+ "node_modules/oas-validator/node_modules/yaml": {
+ "version": "1.10.3",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz",
+ "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/oniguruma-parser": {
+ "version": "0.12.2",
+ "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz",
+ "integrity": "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/oniguruma-to-es": {
+ "version": "4.3.6",
+ "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.6.tgz",
+ "integrity": "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "oniguruma-parser": "^0.12.2",
+ "regex": "^6.1.0",
+ "regex-recursion": "^6.0.2"
+ }
+ },
+ "node_modules/pako": {
+ "version": "0.2.9",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
+ "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/parse-css-color": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/parse-css-color/-/parse-css-color-0.2.1.tgz",
+ "integrity": "sha512-bwS/GGIFV3b6KS4uwpzCFj4w297Yl3uqnSgIPsoQkx7GMLROXfMnWvxfNkL0oh8HVhZA4hvJoEoEIqonfJ3BWg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "^1.1.4",
+ "hex-rgb": "^4.1.0"
+ }
+ },
+ "node_modules/parse-srcset": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz",
+ "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==",
+ "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==",
+ "dev": true,
+ "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.19",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.19.tgz",
+ "integrity": "sha512-Mz8SaolMd8nB+G13WkORcxQKHZ/NE4xXevtkJHVuG+guo9/wYKlIMTKAqGdEmYOXR2ijPjTYNHssizdaVSUNdQ==",
+ "dev": true,
+ "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.12",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.0.10",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
+ "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/preact": {
+ "version": "10.29.7",
+ "resolved": "https://registry.npmjs.org/preact/-/preact-10.29.7.tgz",
+ "integrity": "sha512-DCHYrK/B10yUD3ZjLfhZ3WIE/9Vf9VFUODcRE2dRomTYDpJk6z6L9wecSfhfE6M9ZTHUdyQkoC46arIDhEV84Q==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/preact"
+ },
+ "peerDependencies": {
+ "preact-render-to-string": ">=5"
+ },
+ "peerDependenciesMeta": {
+ "preact-render-to-string": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/preact-render-to-string": {
+ "version": "6.7.0",
+ "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-6.7.0.tgz",
+ "integrity": "sha512-Z4WR8fmLMRpdYqJ9i7vrlXSsSrxVJydwrkEXHapexfARbWfGb7vGcnvNQnIzN0cXciMVOlz/XLoiMCi9gUsy9Q==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "preact": ">=10 || >= 11.0.0-0"
+ }
+ },
+ "node_modules/property-information": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz",
+ "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/reftools": {
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/reftools/-/reftools-1.1.9.tgz",
+ "integrity": "sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "funding": {
+ "url": "https://github.com/Mermade/oas-kit?sponsor=1"
+ }
+ },
+ "node_modules/regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz",
+ "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "regex-utilities": "^2.3.0"
+ }
+ },
+ "node_modules/regex-recursion": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz",
+ "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "regex-utilities": "^2.3.0"
+ }
+ },
+ "node_modules/regex-utilities": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz",
+ "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rolldown": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz",
+ "integrity": "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@oxc-project/types": "=0.139.0",
+ "@rolldown/pluginutils": "^1.0.0"
+ },
+ "bin": {
+ "rolldown": "bin/cli.mjs"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "optionalDependencies": {
+ "@rolldown/binding-android-arm64": "1.1.5",
+ "@rolldown/binding-darwin-arm64": "1.1.5",
+ "@rolldown/binding-darwin-x64": "1.1.5",
+ "@rolldown/binding-freebsd-x64": "1.1.5",
+ "@rolldown/binding-linux-arm-gnueabihf": "1.1.5",
+ "@rolldown/binding-linux-arm64-gnu": "1.1.5",
+ "@rolldown/binding-linux-arm64-musl": "1.1.5",
+ "@rolldown/binding-linux-ppc64-gnu": "1.1.5",
+ "@rolldown/binding-linux-s390x-gnu": "1.1.5",
+ "@rolldown/binding-linux-x64-gnu": "1.1.5",
+ "@rolldown/binding-linux-x64-musl": "1.1.5",
+ "@rolldown/binding-openharmony-arm64": "1.1.5",
+ "@rolldown/binding-wasm32-wasi": "1.1.5",
+ "@rolldown/binding-win32-arm64-msvc": "1.1.5",
+ "@rolldown/binding-win32-x64-msvc": "1.1.5"
+ }
+ },
+ "node_modules/sanitize-html": {
+ "version": "2.17.6",
+ "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.17.6.tgz",
+ "integrity": "sha512-M4bo9tfv1yfhQZZKkc6dL07ALrGJtfvNOuhX3hU9AVPR/uPQ+nKOJBqTYc7LfMQblTW04mtSWDJWEyLvygJsLA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "deepmerge": "^4.2.2",
+ "escape-string-regexp": "^4.0.0",
+ "htmlparser2": "^12.0.0",
+ "is-plain-object": "^5.0.0",
+ "launder": "^1.7.1",
+ "parse-srcset": "^1.0.2",
+ "postcss": "^8.3.11"
+ },
+ "engines": {
+ "node": ">=22.12.0"
+ }
+ },
+ "node_modules/satori": {
+ "version": "0.26.0",
+ "resolved": "https://registry.npmjs.org/satori/-/satori-0.26.0.tgz",
+ "integrity": "sha512-tkMFrfIs3l2mQ2JEcyW0ADTy3zGggFRFzi6Ef8YozQSFsFKEqaSO1Y8F9wJg4//PJGQauMalHGTUEkPrFwhVPA==",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "@shuding/opentype.js": "1.4.0-beta.0",
+ "css-background-parser": "^0.1.0",
+ "css-box-shadow": "1.0.0-3",
+ "css-gradient-parser": "^0.0.17",
+ "css-to-react-native": "^3.0.0",
+ "emoji-regex-xs": "^2.0.1",
+ "escape-html": "^1.0.3",
+ "linebreak": "^1.1.0",
+ "parse-css-color": "^0.2.1",
+ "postcss-value-parser": "^4.2.0",
+ "yoga-layout": "^3.2.1"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/sax": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz",
+ "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=11.0.0"
+ }
+ },
+ "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/shiki": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.3.1.tgz",
+ "integrity": "sha512-oR+qDVi2OjX1tmDpyv+3KviX01KzO6Af+0NNnKnsp9491UEGz2YpxTuJboS/6VhYpTdqzmuJBuiTlrAWWJAssw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/core": "4.3.1",
+ "@shikijs/engine-javascript": "4.3.1",
+ "@shikijs/engine-oniguruma": "4.3.1",
+ "@shikijs/langs": "4.3.1",
+ "@shikijs/themes": "4.3.1",
+ "@shikijs/types": "4.3.1",
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/should": {
+ "version": "13.2.3",
+ "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz",
+ "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "should-equal": "^2.0.0",
+ "should-format": "^3.0.3",
+ "should-type": "^1.4.0",
+ "should-type-adaptors": "^1.0.1",
+ "should-util": "^1.0.0"
+ }
+ },
+ "node_modules/should-equal": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz",
+ "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "should-type": "^1.4.0"
+ }
+ },
+ "node_modules/should-format": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz",
+ "integrity": "sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "should-type": "^1.3.0",
+ "should-type-adaptors": "^1.0.1"
+ }
+ },
+ "node_modules/should-type": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz",
+ "integrity": "sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/should-type-adaptors": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz",
+ "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "should-type": "^1.3.0",
+ "should-util": "^1.0.0"
+ }
+ },
+ "node_modules/should-util": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz",
+ "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/simple-code-frame": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/simple-code-frame/-/simple-code-frame-1.3.0.tgz",
+ "integrity": "sha512-MB4pQmETUBlNs62BBeRjIFGeuy/x6gGKh7+eRUemn1rCFhqo7K+4slPqsyizCbcbYLnaYqaoZ2FWsZ/jN06D8w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "kolorist": "^1.6.0"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/sourcey": {
+ "version": "3.6.5",
+ "resolved": "https://registry.npmjs.org/sourcey/-/sourcey-3.6.5.tgz",
+ "integrity": "sha512-Pq0UMFsMha5lYrA57iPiUxXe3usvpzbuOs8kawQydxFGUlGvasP9bPFF2gQpN9yWBTWpnIVlaxZamHEzdtj+1A==",
+ "dev": true,
+ "license": "AGPL-3.0-only",
+ "dependencies": {
+ "@apidevtools/json-schema-ref-parser": "^13.0.5",
+ "@preact/preset-vite": "^2.10.4",
+ "@resvg/resvg-js": "^2.6.2",
+ "@tailwindcss/typography": "^0.5.19",
+ "@tailwindcss/vite": "^4.2.2",
+ "citty": "^0.1.6",
+ "heroicons": "^2.2.0",
+ "jiti": "^2.6.1",
+ "js-yaml": "^4.1.0",
+ "marked": "^15.0.0",
+ "mcp-parser": "^0.4.0",
+ "moxygen": "^2.1.12",
+ "preact": "^10.28.4",
+ "preact-render-to-string": "^6.6.6",
+ "sanitize-html": "^2.17.4",
+ "satori": "^0.26.0",
+ "shiki": "^4.0.2",
+ "swagger2openapi": "^7.0.8",
+ "tailwindcss": "^4.2.2",
+ "vite": "^8.0.9"
+ },
+ "bin": {
+ "sourcey": "dist/cli.js"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://sourcey.com"
+ }
+ },
+ "node_modules/space-separated-tokens": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
+ "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/stack-trace": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-1.0.0.tgz",
+ "integrity": "sha512-H6D7134xi6qONvh7ZHKgviXf+rd3vhGBSvebPZCaUkd8zvQ+7PtDw6CljPTe4cXWNf2IKZGNqw6VJXSb9IgBpA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string.prototype.codepointat": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.codepointat/-/string.prototype.codepointat-0.2.1.tgz",
+ "integrity": "sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/stringify-entities": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz",
+ "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "character-entities-html4": "^2.0.0",
+ "character-entities-legacy": "^3.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/swagger2openapi": {
+ "version": "7.0.8",
+ "resolved": "https://registry.npmjs.org/swagger2openapi/-/swagger2openapi-7.0.8.tgz",
+ "integrity": "sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "call-me-maybe": "^1.0.1",
+ "node-fetch": "^2.6.1",
+ "node-fetch-h2": "^2.3.0",
+ "node-readfiles": "^0.2.0",
+ "oas-kit-common": "^1.0.8",
+ "oas-resolver": "^2.5.6",
+ "oas-schema-walker": "^1.1.5",
+ "oas-validator": "^5.0.8",
+ "reftools": "^1.1.9",
+ "yaml": "^1.10.0",
+ "yargs": "^17.0.1"
+ },
+ "bin": {
+ "boast": "boast.js",
+ "oas-validate": "oas-validate.js",
+ "swagger2openapi": "swagger2openapi.js"
+ },
+ "funding": {
+ "url": "https://github.com/Mermade/oas-kit?sponsor=1"
+ }
+ },
+ "node_modules/swagger2openapi/node_modules/yaml": {
+ "version": "1.10.3",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz",
+ "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/tailwindcss": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz",
+ "integrity": "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tapable": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz",
+ "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/tiny-inflate": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz",
+ "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==",
+ "dev": true,
+ "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/tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/trim-lines": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz",
+ "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD",
+ "optional": true
+ },
+ "node_modules/uglify-js": {
+ "version": "3.19.3",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz",
+ "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "optional": true,
+ "bin": {
+ "uglifyjs": "bin/uglifyjs"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/unicode-trie": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz",
+ "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pako": "^0.2.5",
+ "tiny-inflate": "^1.0.0"
+ }
+ },
+ "node_modules/unist-util-is": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz",
+ "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-position": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz",
+ "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-stringify-position": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz",
+ "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0",
+ "unist-util-visit-parents": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit-parents": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz",
+ "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
+ "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
+ "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/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/vfile": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
+ "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vfile-message": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz",
+ "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vite": {
+ "version": "8.1.5",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.5.tgz",
+ "integrity": "sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "lightningcss": "^1.32.0",
+ "picomatch": "^4.0.5",
+ "postcss": "^8.5.17",
+ "rolldown": "~1.1.5",
+ "tinyglobby": "^0.2.17"
+ },
+ "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",
+ "@vitejs/devtools": "^0.3.0",
+ "esbuild": "^0.27.0 || ^0.28.0",
+ "jiti": ">=1.21.0",
+ "less": "^4.0.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
+ },
+ "@vitejs/devtools": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "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-prerender-plugin": {
+ "version": "0.5.13",
+ "resolved": "https://registry.npmjs.org/vite-prerender-plugin/-/vite-prerender-plugin-0.5.13.tgz",
+ "integrity": "sha512-IKSpYkzDBsKAxa05naRbj7GvNVMSdww/Z/E89oO3xndz+gWnOBOKOAbEXv7qDhktY/j3vHgJmoV1pPzqU2tx9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "kolorist": "^1.8.0",
+ "magic-string": "0.x >= 0.26.0",
+ "node-html-parser": "^6.1.12",
+ "simple-code-frame": "^1.3.0",
+ "source-map": "^0.7.4",
+ "stack-trace": "^1.0.0-pre2"
+ },
+ "peerDependencies": {
+ "vite": "5.x || 6.x || 7.x || 8.x"
+ }
+ },
+ "node_modules/vite-prerender-plugin/node_modules/source-map": {
+ "version": "0.7.6",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz",
+ "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
+ "dev": true,
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
+ "node_modules/wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/xml2js": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz",
+ "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "sax": ">=0.6.0",
+ "xmlbuilder": "~11.0.0"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/xmlbuilder": {
+ "version": "11.0.1",
+ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
+ "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "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"
+ },
+ "node_modules/yaml": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz",
+ "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==",
+ "dev": true,
+ "license": "ISC",
+ "optional": true,
+ "peer": true,
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/eemeli"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "17.7.3",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz",
+ "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yoga-layout": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/yoga-layout/-/yoga-layout-3.2.1.tgz",
+ "integrity": "sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/zimmerframe": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz",
+ "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/zwitch": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
+ "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ }
+ }
+}
diff --git a/docs/package.json b/docs/package.json
new file mode 100644
index 0000000..6982a14
--- /dev/null
+++ b/docs/package.json
@@ -0,0 +1,13 @@
+{
+ "name": "graphics-cmod-sourcey-docs",
+ "private": true,
+ "scripts": {
+ "generate": "python3 scripts/generate_reference.py",
+ "build": "npm run generate && sourcey build --output dist",
+ "verify": "node scripts/verify-site.mjs",
+ "check": "npm run build && npm run verify"
+ },
+ "devDependencies": {
+ "sourcey": "3.6.5"
+ }
+}
diff --git a/docs/scripts/generate_reference.py b/docs/scripts/generate_reference.py
new file mode 100644
index 0000000..c330ec5
--- /dev/null
+++ b/docs/scripts/generate_reference.py
@@ -0,0 +1,708 @@
+#!/usr/bin/env python3
+"""Generate a source-linked reference from graphics' public C bindings."""
+
+from __future__ import annotations
+
+import json
+import os
+import re
+import subprocess
+from pathlib import Path
+from typing import Dict, Iterable, List, Sequence, Tuple
+
+
+REPO_ROOT = Path(__file__).resolve().parents[2]
+DOCS_ROOT = REPO_ROOT / "docs"
+OUTPUT_ROOT = DOCS_ROOT / "generated"
+REPOSITORY_URL = "https://github.com/PyDevices/graphics"
+PROJECT_DOCS_URL = "https://pydevices.github.io/graphics/api"
+SOURCEY_VERSION = "3.6.5"
+CPYTHON_BINDING = "gfx_module_cpy.c"
+
+
+CLASS_SPECS: Dict[str, Dict[str, object]] = {
+ "Area": {
+ "methods": "area_methods",
+ "getset": "area_getset",
+ "summary": "Immutable rectangle geometry used for bounds, clipping, and draw results.",
+ "signature": "class Area(x=0, y=0, w=0, h=0)",
+ },
+ "FrameBuffer": {
+ "methods": "framebuffer_methods",
+ "getset": "framebuffer_getset",
+ "summary": "A framebuf-compatible native drawing surface backed by a writable buffer.",
+ "signature": "class FrameBuffer(buffer, width, height, format, stride=None)",
+ },
+ "Draw": {
+ "methods": "draw_methods",
+ "getset": None,
+ "summary": "Drawing facade that adds a bounded clip stack to any compatible canvas.",
+ "signature": "class Draw(canvas)",
+ },
+ "ClipContext": {
+ "methods": "clipctx_methods",
+ "getset": None,
+ "summary": "Context manager returned by Draw.clip() for scoped clipping.",
+ "signature": "class ClipContext(draw, area)",
+ },
+ "ClippedCanvas": {
+ "methods": "clipped_canvas_methods",
+ "getset": "clipped_canvas_getset",
+ "summary": "Canvas proxy that intersects writes with a fixed Area.",
+ "signature": "class ClippedCanvas(canvas, clip)",
+ },
+ "Font": {
+ "methods": "font_methods",
+ "getset": "font_getset",
+ "summary": "Bitmap font loader and renderer for built-in, file, or buffer-backed glyph data.",
+ "signature": "class Font(font_data=None, height=0, cached=True)",
+ },
+ "BMP565": {
+ "methods": "bmp565_methods",
+ "getset": "bmp565_getset",
+ "summary": "RGB565 bitmap reader supporting buffered and streamed access.",
+ "signature": "class BMP565(filename=None, source=None, streamed=False, mirrored=False, width=None, height=None)",
+ },
+}
+
+COMMON_DRAW_SIGNATURES = {
+ "fill": "color",
+ "fill_rect": "x, y, width, height, color",
+ "pixel": "x, y, color=None",
+ "hline": "x, y, width, color",
+ "vline": "x, y, height, color",
+ "line": "x1, y1, x2, y2, color",
+ "rect": "x, y, width, height, color, fill=False",
+ "round_rect": "x, y, width, height, radius, color, fill=False",
+ "circle": "x, y, radius, color, fill=False",
+ "ellipse": "x, y, x_radius, y_radius, color, fill=False, mask=0x0F",
+ "arc": "x, y, radius, start_angle, end_angle, color",
+ "triangle": "x0, y0, x1, y1, x2, y2, color, fill=False",
+ "gradient_rect": "x, y, width, height, color1, color2=None, vertical=True",
+ "poly": "x, y, coordinates, color, fill=False",
+ "polygon": "points, x, y, color, angle=0, center_x=0, center_y=0",
+ "blit": "source, x, y, key=-1, palette=None",
+ "blit_rect": "buffer, x, y, width, height",
+ "blit_transparent": "buffer, x, y, width, height, key",
+ "text": "text, x, y, color=1, scale=1, inverted=False, font_data=None, height=8",
+ "text8": "text, x, y, color=1, scale=1, inverted=False, font_data=None",
+ "text14": "text, x, y, color=1, scale=1, inverted=False, font_data=None",
+ "text16": "text, x, y, color=1, scale=1, inverted=False, font_data=None",
+}
+
+AREA_SIGNATURES = {
+ "contains": "point_or_x, y=None",
+ "contains_area": "other",
+ "intersects": "other",
+ "touches_or_intersects": "other",
+ "shift": "dx=0, dy=0",
+ "clip": "other",
+ "offset": "left, top=None, right=None, bottom=None",
+ "inset": "left, top=None, right=None, bottom=None",
+}
+
+SPECIAL_SIGNATURES = {
+ ("FrameBuffer", "from_file"): "path",
+ ("FrameBuffer", "scroll"): "x_step, y_step",
+ ("FrameBuffer", "save"): "path='screenshot'",
+ ("Draw", "clip"): "area_or_x, y=None, width=None, height=None",
+ ("ClipContext", "__enter__"): "",
+ ("ClipContext", "__exit__"): "exc_type, exc_value, traceback",
+ ("Font", "text"): "canvas, text, x, y, color, scale=1, inverted=False",
+ ("Font", "draw_char"): "char, x, y, canvas, color, scale=1, inverted=False",
+ ("Font", "text_width"): "text, scale=1",
+ ("Font", "deinit"): "",
+ ("Font", "export"): "filename",
+ ("BMP565", "save"): "filename=None",
+ ("BMP565", "deinit"): "",
+}
+
+MODULE_SPECIAL_SIGNATURES = {
+ "framebuf_backend": "",
+ "implementation": "",
+ "capabilities": "",
+ "load_image": "path",
+ "save_image": "framebuffer, path='screenshot'",
+ "bmp_to_framebuffer": "path",
+ "pbm_to_framebuffer": "path",
+ "pgm_to_framebuffer": "path",
+}
+
+DESCRIPTIONS = {
+ "fill": "Fill the target canvas with one color and return the affected Area.",
+ "fill_rect": "Fill a rectangular region and return the clipped affected Area.",
+ "pixel": "Read or write one pixel, depending on whether a color is supplied.",
+ "hline": "Draw a horizontal line.",
+ "vline": "Draw a vertical line.",
+ "line": "Draw a line between two points.",
+ "rect": "Draw an outlined or filled rectangle.",
+ "round_rect": "Draw an outlined or filled rounded rectangle.",
+ "circle": "Draw an outlined or filled circle.",
+ "ellipse": "Draw selected quadrants of an outlined or filled ellipse.",
+ "arc": "Draw a circular arc between two angles.",
+ "triangle": "Draw an outlined or filled triangle.",
+ "gradient_rect": "Fill a rectangle with a horizontal or vertical color gradient.",
+ "poly": "Draw a polygon from a packed coordinate buffer.",
+ "polygon": "Draw a translated and optionally rotated sequence of points.",
+ "blit": "Copy another framebuffer onto the target with optional keying and palette lookup.",
+ "blit_rect": "Copy a packed RGB565 rectangle onto the target.",
+ "blit_transparent": "Copy a packed RGB565 rectangle while skipping the transparent key.",
+ "text": "Render bitmap text with selectable height, scale, and inversion.",
+ "text8": "Render text with the built-in 8-pixel-high font path.",
+ "text14": "Render text with the built-in 14-pixel-high font path.",
+ "text16": "Render text with the built-in 16-pixel-high font path.",
+ "contains": "Test whether the area contains a point.",
+ "contains_area": "Test whether another Area is fully contained.",
+ "intersects": "Test whether two areas overlap.",
+ "touches_or_intersects": "Test whether two areas overlap or share an edge.",
+ "shift": "Return a copy translated by the requested offset.",
+ "clip": "Return the intersection with another Area.",
+ "offset": "Return an Area expanded independently on each edge.",
+ "inset": "Return an Area reduced independently on each edge.",
+ "from_file": "Load a supported image file into a new FrameBuffer.",
+ "scroll": "Move framebuffer contents by the requested x and y offsets.",
+ "save": "Write the current image or bitmap to a versioned output path.",
+ "framebuf_backend": "Return the active framebuffer backend identifier.",
+ "implementation": "Return the implementation identifier for this graphics module.",
+ "capabilities": "Return structured runtime feature and pixel-format capabilities.",
+ "load_image": "Load a supported image file as a FrameBuffer.",
+ "save_image": "Save a FrameBuffer to a versioned image path.",
+ "bmp_to_framebuffer": "Decode a BMP file into a FrameBuffer.",
+ "pbm_to_framebuffer": "Decode a PBM file into a FrameBuffer.",
+ "pgm_to_framebuffer": "Decode a PGM file into a FrameBuffer.",
+ "draw_char": "Render one glyph through this Font onto a canvas.",
+ "text_width": "Measure rendered text width at the selected scale.",
+ "deinit": "Release resources owned by the object.",
+ "export": "Write cached font bytes to a file.",
+ "__enter__": "Push the requested clipping area and return the effective clip.",
+ "__exit__": "Pop the clipping area when leaving the context.",
+}
+
+PROPERTY_DESCRIPTIONS = {
+ "x": "Left coordinate.",
+ "y": "Top coordinate.",
+ "w": "Width in pixels.",
+ "h": "Height in pixels.",
+ "width": "Width in pixels.",
+ "height": "Height in pixels.",
+ "buffer": "Backing pixel buffer when the object owns or exposes one.",
+ "format": "Framebuffer pixel-format identifier.",
+ "color_depth": "Bits per pixel for the framebuffer format.",
+ "font_name": "Font source name or the in-memory/default identifier.",
+ "bpp": "Bitmap color depth in bits per pixel.",
+ "BPP": "Bitmap storage width in bytes per pixel.",
+}
+
+CONSTANT_DESCRIPTIONS = {
+ "MONO_VLSB": "Monochrome vertical least-significant-bit layout.",
+ "MONO_HLSB": "Monochrome horizontal least-significant-bit layout.",
+ "MONO_HMSB": "Monochrome horizontal most-significant-bit layout.",
+ "RGB565": "16-bit RGB565 pixel layout.",
+ "GS2_HMSB": "2-bit grayscale horizontal most-significant-bit layout.",
+ "GS4_HMSB": "4-bit grayscale horizontal most-significant-bit layout.",
+ "GS8": "8-bit grayscale layout.",
+ "RGB888": "24-bit RGB888 pixel layout.",
+}
+
+DRAW_FUNCTIONS = set(COMMON_DRAW_SIGNATURES)
+IMAGE_FUNCTIONS = {
+ "load_image",
+ "save_image",
+ "bmp_to_framebuffer",
+ "pbm_to_framebuffer",
+ "pgm_to_framebuffer",
+}
+RUNTIME_FUNCTIONS = {"framebuf_backend", "implementation", "capabilities"}
+
+HEADER_GROUPS: Sequence[Tuple[str, str, str, Sequence[str]]] = (
+ (
+ "native-drawing",
+ "Native drawing and framebuffer API",
+ "Public C declarations for geometry, framebuffer operations, shapes, and clipping.",
+ ("gfx_core.h", "gfx_framebuffer.h", "gfx_shapes.h", "gfx_draw.h"),
+ ),
+ (
+ "native-assets-runtime",
+ "Native fonts, images, and runtime API",
+ "Public C declarations for fonts, BMP565 data, image conversion, and capability reporting.",
+ ("gfx_font.h", "gfx_bmp565.h", "gfx_files.h", "gfx_capabilities.h"),
+ ),
+)
+
+
+def git_commit() -> str:
+ override = os.environ.get("SOURCE_COMMIT", "").strip()
+ if override:
+ if not re.fullmatch(r"[0-9a-fA-F]{40}", override):
+ raise ValueError("SOURCE_COMMIT must be a full 40-character Git SHA")
+ return override.lower()
+ return subprocess.check_output(
+ ["git", "rev-parse", "HEAD"], cwd=REPO_ROOT, text=True
+ ).strip()
+
+
+def release_tag() -> str:
+ override = os.environ.get("SOURCE_RELEASE", "").strip()
+ if override:
+ return override
+ return subprocess.check_output(
+ ["git", "describe", "--tags", "--abbrev=0"],
+ cwd=REPO_ROOT,
+ text=True,
+ ).strip()
+
+
+def tracked_native_source_count() -> int:
+ output = subprocess.check_output(
+ ["git", "ls-files", "*.c", "*.h"], cwd=REPO_ROOT, text=True
+ )
+ return len([line for line in output.splitlines() if line.strip()])
+
+
+def source_url(commit: str, path: str, line: int) -> str:
+ return f"{REPOSITORY_URL}/blob/{commit}/{path}#L{line}"
+
+
+def find_table(lines: Sequence[str], declaration: str) -> Tuple[int, List[str]]:
+ start = next(
+ index for index, line in enumerate(lines) if declaration in line
+ )
+ block: List[str] = []
+ for index in range(start + 1, len(lines)):
+ if lines[index].strip() == "};":
+ break
+ block.append(lines[index])
+ return start + 1, block
+
+
+def method_entries(table: str, commit: str) -> List[Dict[str, object]]:
+ lines = (REPO_ROOT / CPYTHON_BINDING).read_text(encoding="utf-8").splitlines()
+ start, block = find_table(lines, f"static PyMethodDef {table}[]")
+ records: List[Dict[str, object]] = []
+ pattern = re.compile(
+ r'^\s*\{"([^"]+)",\s*(?:\(PyCFunction\))?([A-Za-z_][A-Za-z0-9_]*)'
+ )
+ for offset, line in enumerate(block, start=1):
+ match = pattern.search(line)
+ if not match:
+ continue
+ records.append(
+ {
+ "name": match.group(1),
+ "binding": match.group(2),
+ "path": CPYTHON_BINDING,
+ "line": start + offset,
+ "source_url": source_url(commit, CPYTHON_BINDING, start + offset),
+ }
+ )
+ return records
+
+
+def property_entries(table: str, commit: str) -> List[Dict[str, object]]:
+ lines = (REPO_ROOT / CPYTHON_BINDING).read_text(encoding="utf-8").splitlines()
+ start, block = find_table(lines, f"static PyGetSetDef {table}[]")
+ records: List[Dict[str, object]] = []
+ pattern = re.compile(r'^\s*\{"([^"]+)",\s*\(getter\)([A-Za-z_][A-Za-z0-9_]*)')
+ for offset, line in enumerate(block, start=1):
+ match = pattern.search(line)
+ if not match:
+ continue
+ records.append(
+ {
+ "name": match.group(1),
+ "binding": match.group(2),
+ "path": CPYTHON_BINDING,
+ "line": start + offset,
+ "source_url": source_url(commit, CPYTHON_BINDING, start + offset),
+ }
+ )
+ return records
+
+
+def type_line(name: str) -> int:
+ lines = (REPO_ROOT / CPYTHON_BINDING).read_text(encoding="utf-8").splitlines()
+ needle = f'.tp_name = "graphics.{name}"'
+ return next(index for index, line in enumerate(lines, start=1) if needle in line)
+
+
+def python_signature(owner: str, name: str) -> str:
+ if owner == "Area" and name in AREA_SIGNATURES:
+ args = AREA_SIGNATURES[name]
+ elif (owner, name) in SPECIAL_SIGNATURES:
+ args = SPECIAL_SIGNATURES[(owner, name)]
+ elif name in COMMON_DRAW_SIGNATURES:
+ args = COMMON_DRAW_SIGNATURES[name]
+ else:
+ args = "*args, **kwargs"
+ return f"{owner}.{name}({args})"
+
+
+def module_signature(name: str) -> str:
+ if name in MODULE_SPECIAL_SIGNATURES:
+ args = MODULE_SPECIAL_SIGNATURES[name]
+ elif name in COMMON_DRAW_SIGNATURES:
+ args = f"canvas, {COMMON_DRAW_SIGNATURES[name]}"
+ else:
+ args = "*args, **kwargs"
+ return f"graphics.{name}({args})"
+
+
+def class_records(name: str, commit: str) -> List[Dict[str, object]]:
+ spec = CLASS_SPECS[name]
+ line = type_line(name)
+ records: List[Dict[str, object]] = [
+ {
+ "name": name,
+ "qualified_name": f"graphics.{name}",
+ "kind": "class",
+ "signature": str(spec["signature"]),
+ "summary": str(spec["summary"]),
+ "path": CPYTHON_BINDING,
+ "line": line,
+ "source_url": source_url(commit, CPYTHON_BINDING, line),
+ }
+ ]
+ for item in method_entries(str(spec["methods"]), commit):
+ method_name = str(item["name"])
+ records.append(
+ {
+ **item,
+ "qualified_name": f"graphics.{name}.{method_name}",
+ "kind": "method",
+ "signature": python_signature(name, method_name),
+ "summary": DESCRIPTIONS.get(
+ method_name,
+ f"Public {name} operation implemented by the native binding.",
+ ),
+ }
+ )
+ getset = spec.get("getset")
+ if getset:
+ for item in property_entries(str(getset), commit):
+ property_name = str(item["name"])
+ records.append(
+ {
+ **item,
+ "qualified_name": f"graphics.{name}.{property_name}",
+ "kind": "property",
+ "signature": f"{name}.{property_name}",
+ "summary": PROPERTY_DESCRIPTIONS.get(
+ property_name, f"Read-only {name} property."
+ ),
+ }
+ )
+ return records
+
+
+def module_records(commit: str) -> List[Dict[str, object]]:
+ records: List[Dict[str, object]] = []
+ for item in method_entries("module_methods", commit):
+ name = str(item["name"])
+ records.append(
+ {
+ **item,
+ "qualified_name": f"graphics.{name}",
+ "kind": "function",
+ "signature": module_signature(name),
+ "summary": DESCRIPTIONS.get(
+ name, "Public module function implemented by the native binding."
+ ),
+ }
+ )
+ return records
+
+
+def constant_records(commit: str) -> List[Dict[str, object]]:
+ lines = (REPO_ROOT / CPYTHON_BINDING).read_text(encoding="utf-8").splitlines()
+ pattern = re.compile(r'^\s*ADD_INT\("([^"]+)",\s*([^\)]+)\);')
+ records: List[Dict[str, object]] = []
+ for line_number, line in enumerate(lines, start=1):
+ match = pattern.search(line)
+ if not match:
+ continue
+ name = match.group(1)
+ records.append(
+ {
+ "name": name,
+ "qualified_name": f"graphics.{name}",
+ "kind": "constant",
+ "signature": f"graphics.{name}",
+ "summary": CONSTANT_DESCRIPTIONS.get(
+ name, "Native graphics module constant."
+ ),
+ "binding": match.group(2).strip(),
+ "path": CPYTHON_BINDING,
+ "line": line_number,
+ "source_url": source_url(commit, CPYTHON_BINDING, line_number),
+ }
+ )
+ return records
+
+
+def normalize_c_declaration(lines: Iterable[str]) -> str:
+ return " ".join(" ".join(lines).split())
+
+
+def header_prototypes(path: str, commit: str) -> List[Dict[str, object]]:
+ lines = (REPO_ROOT / path).read_text(encoding="utf-8").splitlines()
+ records: List[Dict[str, object]] = []
+ buffer: List[str] = []
+ start_line = 0
+ for line_number, raw in enumerate(lines, start=1):
+ stripped = re.sub(r"/\*.*?\*/", "", raw).strip()
+ if not buffer:
+ if (
+ not stripped
+ or stripped.startswith(("#", "typedef", "//"))
+ or "gfx_" not in stripped
+ or "(" not in stripped
+ ):
+ continue
+ start_line = line_number
+ buffer.append(stripped)
+ if ";" not in stripped:
+ continue
+ declaration = normalize_c_declaration(buffer)
+ buffer = []
+ match = re.match(
+ r"^(?!static\b)(?:const\s+)?[A-Za-z_][A-Za-z0-9_\s\*]*\s+(gfx_[A-Za-z0-9_]+)\s*\((.*)\)\s*;$",
+ declaration,
+ )
+ if not match:
+ continue
+ name = match.group(1)
+ family = name.removeprefix("gfx_").split("_", maxsplit=1)[0]
+ records.append(
+ {
+ "name": name,
+ "qualified_name": name,
+ "kind": "c_function",
+ "signature": declaration,
+ "summary": (
+ f"Native {family} entry point declared for firmware and extension integration."
+ ),
+ "path": path,
+ "line": start_line,
+ "source_url": source_url(commit, path, start_line),
+ }
+ )
+ return records
+
+
+def frontmatter(title: str, description: str) -> str:
+ return (
+ "---\n"
+ f"title: {title}\n"
+ f"description: {description}\n"
+ "---\n"
+ )
+
+
+def render_record(record: Dict[str, object]) -> str:
+ language = "c" if record["kind"] == "c_function" else "python"
+ lines = [
+ f"## `{record['qualified_name']}`",
+ "",
+ f"```{language}",
+ str(record["signature"]),
+ "```",
+ "",
+ str(record["summary"]),
+ "",
+ f"[View the pinned source declaration]({record['source_url']})",
+ ]
+ return "\n".join(lines)
+
+
+def write_page(
+ slug: str,
+ title: str,
+ description: str,
+ records: Sequence[Dict[str, object]],
+ commit: str,
+) -> Dict[str, object]:
+ body = [
+ frontmatter(title, description),
+ f"Source snapshot: [`{commit}`]({REPOSITORY_URL}/tree/{commit}).",
+ "",
+ description,
+ "",
+ "Every entry below is generated from a public binding table or header declaration and links to its immutable source line.",
+ "",
+ "\n\n".join(render_record(record) for record in records),
+ "",
+ ]
+ (OUTPUT_ROOT / f"{slug}.md").write_text("\n".join(body), encoding="utf-8")
+ return {
+ "slug": slug,
+ "title": title,
+ "symbol_count": len(records),
+ "source_files": sorted({str(record["path"]) for record in records}),
+ }
+
+
+def write_reference(commit: str, release: str) -> Dict[str, object]:
+ OUTPUT_ROOT.mkdir(parents=True, exist_ok=True)
+ all_python: List[Dict[str, object]] = []
+ pages: List[Dict[str, object]] = []
+
+ area = class_records("Area", commit)
+ clip_context = class_records("ClipContext", commit)
+ clipped_canvas = class_records("ClippedCanvas", commit)
+ area_page = area + clip_context + clipped_canvas
+ all_python.extend(area_page)
+ pages.append(
+ write_page(
+ "area-clipping",
+ "Area and clipping",
+ "Rectangle geometry, scoped clip contexts, and clipped canvas operations.",
+ area_page,
+ commit,
+ )
+ )
+
+ framebuffer = class_records("FrameBuffer", commit)
+ all_python.extend(framebuffer)
+ pages.append(
+ write_page(
+ "framebuffer",
+ "FrameBuffer",
+ "Native framebuffer construction, drawing, text, blitting, scrolling, and file output.",
+ framebuffer,
+ commit,
+ )
+ )
+
+ module = module_records(commit)
+ draw = class_records("Draw", commit)
+ drawing = draw + [record for record in module if record["name"] in DRAW_FUNCTIONS]
+ all_python.extend(draw)
+ all_python.extend(record for record in module if record["name"] in DRAW_FUNCTIONS)
+ pages.append(
+ write_page(
+ "drawing",
+ "Drawing operations",
+ "Object-oriented and module-level shape, text, polygon, and blit operations.",
+ drawing,
+ commit,
+ )
+ )
+
+ fonts_images = (
+ class_records("Font", commit)
+ + class_records("BMP565", commit)
+ + [record for record in module if record["name"] in IMAGE_FUNCTIONS]
+ )
+ all_python.extend(fonts_images)
+ pages.append(
+ write_page(
+ "fonts-images",
+ "Fonts and images",
+ "Bitmap font rendering, RGB565 bitmap access, and image conversion helpers.",
+ fonts_images,
+ commit,
+ )
+ )
+
+ module_formats = [record for record in module if record["name"] in RUNTIME_FUNCTIONS]
+ module_formats += constant_records(commit)
+ all_python.extend(module_formats)
+ pages.append(
+ write_page(
+ "module-formats",
+ "Runtime and pixel formats",
+ "Runtime capability probes and the exported framebuffer format constants.",
+ module_formats,
+ commit,
+ )
+ )
+
+ native_records: List[Dict[str, object]] = []
+ for slug, title, description, paths in HEADER_GROUPS:
+ records = [
+ record
+ for path in paths
+ for record in header_prototypes(path, commit)
+ ]
+ native_records.extend(records)
+ pages.append(write_page(slug, title, description, records, commit))
+
+ all_records = all_python + native_records
+ source_files = sorted({str(record["path"]) for record in all_records})
+ introduction = [
+ frontmatter(
+ "graphics API reference",
+ "Source-linked Python and native C reference for the PyDevices graphics module.",
+ ),
+ "`graphics` is the all-C drawing module shared by CPython, MicroPython, and CircuitPython builds in the PyDevices stack.",
+ "",
+ "## Quick start",
+ "",
+ "```python",
+ "from graphics import Area, FrameBuffer, RGB565",
+ "",
+ "buffer = bytearray(160 * 128 * 2)",
+ "canvas = FrameBuffer(buffer, 160, 128, RGB565)",
+ "changed = canvas.fill_rect(10, 10, 40, 24, 0xF800)",
+ "assert changed == Area(10, 10, 40, 24)",
+ "```",
+ "",
+ "## Reference snapshot",
+ "",
+ f"- Release line: **{release}**",
+ f"- Source commit: [`{commit}`]({REPOSITORY_URL}/tree/{commit})",
+ "- License: **MIT**",
+ "- Adapter: **CPython binding tables plus public C headers**",
+ f"- Python API entries indexed: **{len(all_python)}**",
+ f"- Native C functions indexed: **{len(native_records)}**",
+ f"- Source files represented: **{len(source_files)}**",
+ f"- Tracked C and header files in the repository: **{tracked_native_source_count()}**",
+ "",
+ "The generated pages expose the user-facing Python names and the lower-level C entry points used by firmware and extension integrations. Every entry links to the exact source snapshot above.",
+ "",
+ "## Browse the reference",
+ "",
+ ]
+ introduction.extend(
+ f"- [{page['title']}]({PROJECT_DOCS_URL}/generated/{page['slug']}.html) — {page['symbol_count']} entries"
+ for page in pages
+ )
+ introduction.append("")
+ (OUTPUT_ROOT / "introduction.md").write_text(
+ "\n".join(introduction), encoding="utf-8"
+ )
+
+ manifest: Dict[str, object] = {
+ "schema": "pydevices-graphics-sourcey-reference.v1",
+ "repository": REPOSITORY_URL,
+ "commit": commit,
+ "release": release,
+ "license": "MIT",
+ "adapter": "cpython-binding-tables+public-c-headers",
+ "generated_with": f"sourcey@{SOURCEY_VERSION}",
+ "repository_native_source_file_count": tracked_native_source_count(),
+ "source_file_count": len(source_files),
+ "source_files": source_files,
+ "symbol_count": len(all_records),
+ "python_symbol_count": len(all_python),
+ "native_c_symbol_count": len(native_records),
+ "pages": pages,
+ "symbols": all_records,
+ }
+ (OUTPUT_ROOT / "manifest.json").write_text(
+ json.dumps(manifest, indent=2, sort_keys=True) + "\n", encoding="utf-8"
+ )
+ return manifest
+
+
+def main() -> None:
+ manifest = write_reference(git_commit(), release_tag())
+ print(
+ f"Indexed {manifest['symbol_count']} entries from "
+ f"{manifest['source_file_count']} source files at "
+ f"{str(manifest['commit'])[:12]}."
+ )
+
+
+if __name__ == "__main__":
+ main()
diff --git a/docs/scripts/verify-site.mjs b/docs/scripts/verify-site.mjs
new file mode 100644
index 0000000..95101fb
--- /dev/null
+++ b/docs/scripts/verify-site.mjs
@@ -0,0 +1,147 @@
+import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
+import { join, resolve } from "node:path";
+import { fileURLToPath } from "node:url";
+
+const docsDir = resolve(fileURLToPath(new URL("..", import.meta.url)));
+const repoDir = resolve(docsDir, "..");
+const generatedDir = join(docsDir, "generated");
+const distDir = join(docsDir, "dist");
+const manifest = JSON.parse(
+ readFileSync(join(generatedDir, "manifest.json"), "utf8"),
+);
+const expectedBaseUrl = "/graphics/api/";
+const expectedSiteUrl = "https://pydevices.github.io/graphics/api/";
+
+function walk(directory) {
+ return readdirSync(directory).flatMap((name) => {
+ const path = join(directory, name);
+ return statSync(path).isDirectory() ? walk(path) : [path];
+ });
+}
+
+const failures = [];
+if (manifest.python_symbol_count < 70) {
+ failures.push(
+ `expected at least 70 Python API entries, got ${manifest.python_symbol_count}`,
+ );
+}
+if (manifest.native_c_symbol_count < 20) {
+ failures.push(
+ `expected at least 20 native C functions, got ${manifest.native_c_symbol_count}`,
+ );
+}
+if (manifest.source_file_count < 5) {
+ failures.push(
+ `expected at least 5 represented source files, got ${manifest.source_file_count}`,
+ );
+}
+if (manifest.repository_native_source_file_count < 20) {
+ failures.push("repository native source inventory is unexpectedly small");
+}
+if (manifest.pages.length !== 7 || manifest.pages.some((page) => page.symbol_count === 0)) {
+ failures.push("expected seven non-empty generated reference pages");
+}
+
+for (const required of [
+ "index.html",
+ "search-index.json",
+ "llms.txt",
+ "llms-full.txt",
+ "sitemap.xml",
+]) {
+ if (!existsSync(join(distDir, required))) failures.push(`missing dist/${required}`);
+}
+
+const expectedSourcePrefix =
+ `https://github.com/PyDevices/graphics/blob/${manifest.commit}/`;
+if (
+ manifest.symbols.some(
+ (symbol) =>
+ !symbol.source_url.startsWith(expectedSourcePrefix) ||
+ !symbol.source_url.endsWith(`#L${symbol.line}`) ||
+ !existsSync(join(repoDir, symbol.path)),
+ )
+) {
+ failures.push("one or more entries lack an immutable, existing source declaration");
+}
+
+if (existsSync(join(distDir, "search-index.json"))) {
+ const searchIndex = JSON.parse(
+ readFileSync(join(distDir, "search-index.json"), "utf8"),
+ );
+ if (
+ searchIndex.some(
+ (entry) =>
+ typeof entry.url !== "string" || !entry.url.startsWith(expectedBaseUrl),
+ )
+ ) {
+ failures.push(`search results are not scoped to ${expectedBaseUrl}`);
+ }
+ const searchable = searchIndex
+ .map((entry) => `${entry.title ?? ""} ${entry.content ?? ""}`)
+ .join("\n");
+ for (const expected of [
+ "graphics.FrameBuffer",
+ "graphics.Area.contains",
+ "graphics.Draw.clip",
+ "graphics.Font.text_width",
+ "gfx_shapes_fill_rect",
+ ]) {
+ if (!searchable.includes(expected)) {
+ failures.push(`search index is missing ${expected}`);
+ }
+ }
+}
+
+if (existsSync(distDir)) {
+ const htmlFiles = walk(distDir).filter((path) => path.endsWith(".html"));
+ const html = htmlFiles.map((path) => readFileSync(path, "utf8")).join("\n");
+ if (!html.includes(manifest.commit)) {
+ failures.push("site does not expose the immutable source commit");
+ }
+ if (!html.includes("graphics.FrameBuffer") || !html.includes("gfx_shapes_fill_rect")) {
+ failures.push("site is missing representative Python or native C entries");
+ }
+ const canonicalUrls = [
+ ...html.matchAll(/ match[1]);
+ if (
+ canonicalUrls.length !== htmlFiles.length ||
+ canonicalUrls.some((url) => !url.startsWith(expectedSiteUrl))
+ ) {
+ failures.push("one or more pages lack a project-owned canonical URL");
+ }
+}
+
+const homepage = readFileSync(join(repoDir, "web", "index.html"), "utf8");
+if (!homepage.includes('href="api/"')) {
+ failures.push("project homepage does not link to the API reference");
+}
+const readme = readFileSync(join(repoDir, "README.md"), "utf8");
+if (!readme.includes("https://pydevices.github.io/graphics/api/")) {
+ failures.push("README does not link to the published API reference");
+}
+const workflow = readFileSync(
+ join(repoDir, ".github", "workflows", "deploy-pages.yml"),
+ "utf8",
+);
+for (const required of [
+ "npm ci --prefix docs",
+ "npm run check --prefix docs",
+ "cp -r docs/dist/* _site/api/",
+]) {
+ if (!workflow.includes(required)) {
+ failures.push(`Pages workflow is missing: ${required}`);
+ }
+}
+
+if (failures.length > 0) {
+ console.error(failures.map((failure) => `- ${failure}`).join("\n"));
+ process.exitCode = 1;
+} else {
+ console.log(
+ `Verified ${manifest.python_symbol_count} Python entries and ` +
+ `${manifest.native_c_symbol_count} native C functions from ` +
+ `${manifest.source_file_count} source files.`,
+ );
+}
diff --git a/docs/sourcey.config.ts b/docs/sourcey.config.ts
new file mode 100644
index 0000000..ffeb256
--- /dev/null
+++ b/docs/sourcey.config.ts
@@ -0,0 +1,65 @@
+import { defineConfig, markdown } from "sourcey";
+
+export default defineConfig({
+ name: "graphics",
+ repo: "https://github.com/PyDevices/graphics",
+ siteUrl: "https://pydevices.github.io",
+ baseUrl: "/graphics/api/",
+ favicon: "./favicon.svg",
+ editBranch: "main",
+ editBasePath: "docs",
+ theme: {
+ preset: "api-first",
+ colors: {
+ primary: "#d97706",
+ light: "#f59e0b",
+ dark: "#92400e",
+ },
+ },
+ navbar: {
+ links: [
+ {
+ type: "github",
+ href: "https://github.com/PyDevices/graphics",
+ },
+ ],
+ primary: {
+ type: "button",
+ label: "Project home",
+ href: "https://pydevices.github.io/graphics/",
+ },
+ },
+ navigation: {
+ tabs: [
+ {
+ tab: "API Reference",
+ slug: "",
+ source: markdown({
+ groups: [
+ {
+ group: "Overview",
+ pages: ["generated/introduction"],
+ },
+ {
+ group: "Python API",
+ pages: [
+ "generated/area-clipping",
+ "generated/framebuffer",
+ "generated/drawing",
+ "generated/fonts-images",
+ "generated/module-formats",
+ ],
+ },
+ {
+ group: "Native C API",
+ pages: [
+ "generated/native-drawing",
+ "generated/native-assets-runtime",
+ ],
+ },
+ ],
+ }),
+ },
+ ],
+ },
+});
diff --git a/web/index.html b/web/index.html
index 8f9102e..f6847d1 100644
--- a/web/index.html
+++ b/web/index.html
@@ -23,6 +23,7 @@