From b970eea39e5ee91a1ebd7738eac044a8e80bc33e Mon Sep 17 00:00:00 2001 From: Bob Wan Date: Sat, 18 Jul 2026 23:24:54 -0400 Subject: [PATCH] docs: add source-linked API reference --- .github/workflows/deploy-pages.yml | 26 + .gitignore | 2 + README.md | 1 + docs/README.md | 20 + docs/favicon.svg | 4 + docs/generated/area-clipping.md | 270 ++ docs/generated/drawing.md | 470 +++ docs/generated/fonts-images.md | 230 ++ docs/generated/framebuffer.md | 320 ++ docs/generated/introduction.md | 40 + docs/generated/manifest.json | 2166 ++++++++++++ docs/generated/module-formats.md | 120 + docs/generated/native-assets-runtime.md | 260 ++ docs/generated/native-drawing.md | 350 ++ docs/package-lock.json | 4250 +++++++++++++++++++++++ docs/package.json | 13 + docs/scripts/generate_reference.py | 708 ++++ docs/scripts/verify-site.mjs | 147 + docs/sourcey.config.ts | 65 + web/index.html | 2 + 20 files changed, 9464 insertions(+) create mode 100644 docs/README.md create mode 100644 docs/favicon.svg create mode 100644 docs/generated/area-clipping.md create mode 100644 docs/generated/drawing.md create mode 100644 docs/generated/fonts-images.md create mode 100644 docs/generated/framebuffer.md create mode 100644 docs/generated/introduction.md create mode 100644 docs/generated/manifest.json create mode 100644 docs/generated/module-formats.md create mode 100644 docs/generated/native-assets-runtime.md create mode 100644 docs/generated/native-drawing.md create mode 100644 docs/package-lock.json create mode 100644 docs/package.json create mode 100644 docs/scripts/generate_reference.py create mode 100644 docs/scripts/verify-site.mjs create mode 100644 docs/sourcey.config.ts 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 @@