aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Scholten2025-10-19 21:29:03 +1000
committerSam Scholten2025-10-19 21:29:03 +1000
commit8a2440993ce6e65b8f4b5b71a0feb3b63a9c968e (patch)
tree5e0eab5c9644a99e8d2e3398c41e20a560473ed2
downloadacarp-marp-theme-8a2440993ce6e65b8f4b5b71a0feb3b63a9c968e.tar.gz
acarp-marp-theme-8a2440993ce6e65b8f4b5b71a0feb3b63a9c968e.zip
init
-rw-r--r--.gitignore23
-rw-r--r--.marprc.json4
-rw-r--r--README213
-rw-r--r--acarp-beamer.css45
-rw-r--r--acarp.css560
-rw-r--r--acarp.pngbin0 -> 493462 bytes
-rw-r--r--demo-beamer.md195
-rw-r--r--demo-standard.md213
-rw-r--r--figs/example.pngbin0 -> 110168 bytes
-rw-r--r--justfile95
-rw-r--r--package-lock.json1905
-rw-r--r--package.json31
-rw-r--r--template.md70
13 files changed, 3354 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..ef4f44d
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,23 @@
+# Dependencies
+node_modules/
+
+# Build outputs
+*.html
+*.pdf
+*.pptx
+
+# Marp cache
+.marp/
+
+# OS files
+.DS_Store
+Thumbs.db
+
+# Editor files
+.vscode/
+.idea/
+*.swp
+*~
+
+# Environment
+.env
diff --git a/.marprc.json b/.marprc.json
new file mode 100644
index 0000000..f8b8a09
--- /dev/null
+++ b/.marprc.json
@@ -0,0 +1,4 @@
+{
+ "themeSet": ["./acarp.css", "./acarp-beamer.css"],
+ "allowLocalFiles": true
+} \ No newline at end of file
diff --git a/README b/README
new file mode 100644
index 0000000..d6dab69
--- /dev/null
+++ b/README
@@ -0,0 +1,213 @@
+# Academic Marp (acarp) Theme
+
+![Academic Marp Theme](acarp.png)
+
+A minimal, grid-based theme for Marp presentations designed for academic content.
+
+## Features
+
+- **Grid-only layouts** - CSS Grid for all presentation layouts
+- **Two aspect ratios** - 16:9 (standard) and 4:3 (beamer)
+- **Academic focus** - Optimized for equations, code, and technical content
+- **Explicit contracts** - Clear, maintainable CSS structure
+- **No utility classes** - Focus on content, not class names
+
+## Quick Start
+
+### Install
+```bash
+npm install
+```
+
+### Build Examples
+```bash
+# Using just (recommended)
+just demo # Build both demo presentations
+
+# Using npx directly
+npx marp --config .marprc.json --html demo-standard.md
+npx marp --config .marprc.json --html demo-beamer.md
+
+# Export to PDF
+npx marp --config .marprc.json --pdf demo-standard.md
+```
+
+## Available Layouts
+
+### `title` - Cover Slide
+```markdown
+---
+<!-- _class: title -->
+# Presentation Title
+## Subtitle or Author
+```
+
+### `layout-2col` - Two Columns
+```markdown
+---
+<!-- _class: layout-2col -->
+### Slide Title
+
+<div class="left-column">
+Text content
+</div>
+
+<div class="right-column">
+![](figs/image.png)
+</div>
+```
+
+### Default - Single Column
+```markdown
+---
+### Slide Title
+
+Your content here
+```
+
+## Common Patterns
+
+### Code + Output
+```markdown
+---
+<!-- _class: layout-2col -->
+### Python Example
+
+<div class="left-column">
+```python
+def hello(name):
+ return f"Hello {name}"
+```
+</div>
+
+<div class="right-column">
+```
+>>> hello("World")
+'Hello World'
+```
+</div>
+```
+
+## Themes
+
+### Standard (16:9)
+- Dimensions: 1280x720px
+- Use default theme
+- For modern widescreen presentations
+
+### Beamer (4:3)
+- Dimensions: 1280x960px
+- Use filename with "beamer": `talk-beamer.md`
+- For classic LaTeX Beamer-style presentations
+
+## Customization
+
+### Theme Variables
+Edit `acarp.css` to modify colors, fonts, spacing:
+
+```css
+:root {
+ --slide-width: 1280px;
+ --slide-height: 720px;
+ --padding: 70px;
+ --color-background: #fdfcff;
+ --color-foreground: #202228;
+ --color-highlight: #009dd5;
+}
+```
+
+For beamer-specific overrides, edit `acarp-beamer.css`.
+
+### Font Size Customization
+You can override font sizes in your markdown frontmatter:
+
+```yaml
+---
+marp: true
+theme: acarp
+style: |
+ section {
+ font-size: 32px !important; /* Larger base font */
+ }
+ h1 { font-size: 2.5em !important; } /* Larger headings */
+---
+```
+
+Common font sizes:
+- Standard theme: 28px (default)
+- Beamer theme: 37px (default)
+- Large print: 32-36px
+- Compact: 24-26px
+
+### Logo Placement
+Add a logo to the top-right corner using CSS variables in your frontmatter:
+
+```yaml
+---
+marp: true
+theme: acarp
+style: |
+ :root {
+ --logo-image: url('logo.png');
+ --logo-width: 120px;
+ --logo-height: 50px;
+ --logo-top: 20px;
+ --logo-right: 20px;
+ --logo-opacity: 0.8;
+ }
+---
+```
+
+**Logo Variables:**
+- `--logo-image`: Path to your logo file
+- `--logo-width`: Logo width (default: 100px)
+- `--logo-height`: Logo height (default: 40px)
+- `--logo-top`: Distance from top (default: 20px)
+- `--logo-right`: Distance from right (default: 20px)
+- `--logo-opacity`: Transparency (0-1, default: 0.7)
+
+The logo appears on all slides except the title slide.
+
+## All Commands
+
+```bash
+just build <file> # Build HTML
+just watch <file> # Watch and auto-rebuild
+just pdf <file> # Export to PDF
+just new <name> # Create new presentation
+just clean # Remove output files
+just demo # Build demo presentations
+just help # Show all commands
+```
+
+## Design Philosophy
+
+The theme is built on a simple principle: use CSS Grid exclusively for layout. This means:
+
+- **Grid only** - No flexbox for layouts (flexbox is for UI components)
+- **Explicit contracts** - Grid areas and templates are clearly defined
+- **Minimal abstraction** - No utility classes, no hidden behaviors
+- **Maintainable** - One base theme, one beamer override
+
+## Directory Structure
+
+```
+acarp-marp-theme/
+├── figs/ # Images directory
+├── acarp.css # Base theme (all layouts)
+├── acarp-beamer.css # Beamer overrides (4:3 only)
+├── .marprc.json # Marp configuration
+├── template.md # Example presentation
+├── demo-standard.md # Standard 16:9 example
+├── demo-beamer.md # Beamer 4:3 example
+├── package.json # Dependencies
+├── justfile # Build commands
+└── README.md # This file
+```
+
+## Notes
+
+- Images: `![](figs/imagename.png)`
+- Math: `$$...$$` for display, `$...$` for inline
+- Code blocks: Use ` ``` ` (automatic syntax highlighting)
+- PDF/PPTX export requires Chrome or Chromium \ No newline at end of file
diff --git a/acarp-beamer.css b/acarp-beamer.css
new file mode 100644
index 0000000..376929a
--- /dev/null
+++ b/acarp-beamer.css
@@ -0,0 +1,45 @@
+/*
+ * Academic Marp (acarp) Theme - Beamer Variant
+ * Version: 1.0.0
+ * License: MIT
+ * Repository: https://git.samsci.com/cgit.cgi/acarp-marp-theme/
+ *
+ * Beamer-style 4:3 aspect ratio variant of the Academic Marp theme.
+ * Import base theme and override dimensions for classic LaTeX Beamer-style presentations.
+ */
+
+/* @theme acarp-beamer */
+
+/* Academic Marp (acarp) - Beamer Theme (4:3 aspect ratio)
+ Overrides acarp.css with 4:3 dimensions for classic LaTeX Beamer-style presentations.
+*/
+
+/* Import the base theme and override specific values */
+@import 'acarp.css';
+
+/* Override slide dimensions for 4:3 aspect ratio */
+:root {
+ --slide-width: 1280px !important;
+ --slide-height: 960px !important;
+}
+
+/* Force 4:3 dimensions on all sections */
+section {
+ width: 1280px !important;
+ height: 960px !important;
+}
+
+/* Increase font size proportionally for taller slides */
+section {
+ font-size: 37px !important;
+}
+
+/* Larger pagination for beamer theme */
+section::after {
+ font-size: 24px !important;
+}
+
+/* Ensure 2col layouts also use larger pagination */
+section.layout-2col::after {
+ font-size: 24px !important;
+}
diff --git a/acarp.css b/acarp.css
new file mode 100644
index 0000000..6395e52
--- /dev/null
+++ b/acarp.css
@@ -0,0 +1,560 @@
+/*
+ * Academic Marp (acarp) Theme
+ * Version: 1.0.0
+ * License: MIT
+ * Repository: https://git.samsci.com/cgit.cgi/acarp-marp-theme/
+ *
+ * A minimal, grid-based theme for Marp presentations designed for academic content.
+ * Grid-only layouts - no flexbox, no utility classes, explicit contracts.
+ */
+
+/* @theme acarp */
+@import url('https://fonts.googleapis.com/css2?family=EB+Garamond:wght@400;700&display=swap');
+
+/* Import syntax highlighting theme */
+@import url('https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.9.0/build/styles/github.min.css');
+
+/* Academic Marp (acarp) Theme Base
+ Grid-only layout system. No flexbox. No utility classes.
+ Explicit grid contracts for all layouts.
+*/
+
+:root {
+ --slide-width: 1280px;
+ --slide-height: 720px;
+ --padding: 70px;
+ --title-top: 40px;
+ --color-background: #fdfcff;
+ --color-background-code: #f2f1f4;
+ --color-foreground: #202228;
+ --color-highlight: #009dd5;
+ --color-highlight-hover: #087eaa;
+ --color-highlight-heading: #33b1dd;
+}
+
+/* Base section styling */
+section {
+ /* Visual appearance */
+ background: var(--color-background);
+ color: var(--color-foreground);
+
+ /* Layout and positioning */
+ display: block;
+ position: relative;
+ width: var(--slide-width);
+ height: var(--slide-height);
+ padding: 30px var(--padding);
+ z-index: 0;
+
+ /* Typography */
+ font-family: 'EB Garamond', 'Times New Roman', serif;
+ font-size: 28px;
+ letter-spacing: 2px;
+ line-height: 1.4;
+
+ /* Text behavior */
+ text-align: left;
+ word-wrap: break-word;
+}
+
+/* Just change the color and styling of Marp's default pagination */
+section::after {
+ color: #888888 !important;
+ font-size: 18px !important;
+ font-family: 'EB Garamond', 'Times New Roman', serif !important;
+}
+
+/* Hide pagination on title slides */
+section.title::after {
+ display: none !important;
+}
+
+/* Logo support - top right corner */
+section:not(.title)::before {
+ content: '';
+ position: absolute;
+ top: var(--logo-top, 20px);
+ right: var(--logo-right, 20px);
+ width: var(--logo-width, 100px);
+ height: var(--logo-height, 40px);
+ background-image: var(--logo-image, none);
+ background-repeat: no-repeat;
+ background-position: right center;
+ background-size: contain;
+ opacity: var(--logo-opacity, 0.7);
+ z-index: 1;
+}
+
+
+
+section:not([data-marpit-pagination])::after {
+ display: none;
+}
+
+/* Typography */
+/* Remove top margin from first element and last element */
+section > *:first-child,
+section[data-header] > :nth-child(2) {
+ margin-top: 0;
+}
+
+section > *:last-child,
+section[data-footer] > :nth-last-child(2) {
+ margin-bottom: 0;
+}
+
+/* Paragraph and blockquote spacing */
+section p, section blockquote {
+ margin: 0 0 15px;
+}
+
+/* Heading spacing and sizing */
+section h1, section h2, section h3, section h4, section h5, section h6 {
+ margin: 15px 0 30px;
+}
+
+/* Highlight styling for bold text in headings */
+section h1 strong, section h2 strong, section h3 strong,
+section h4 strong, section h5 strong, section h6 strong {
+ color: var(--color-highlight-heading);
+ font-weight: inherit;
+}
+
+/* Auto-scaling constraint for headings */
+section h1::part(auto-scaling),
+section h2::part(auto-scaling),
+section h3::part(auto-scaling),
+section h4::part(auto-scaling),
+section h5::part(auto-scaling),
+section h6::part(auto-scaling) {
+ max-height: 660px;
+}
+
+/* Heading font sizes */
+section h1 { font-size: 2.2em; }
+section h2 { font-size: 1.8em; }
+section h3 { font-size: 1.5em; letter-spacing: 2px; }
+section h4 { font-size: 1.3em; letter-spacing: 2px; }
+section h5 { font-size: 1.1em; letter-spacing: 1px; }
+section h6 { font-size: 0.9em; letter-spacing: 1px; }
+
+/* Code and preformatted text */
+/* Inline code styling */
+code {
+ font-family: Monaco, monospace;
+ letter-spacing: 0;
+}
+
+/* Background for inline code */
+section > code,
+section *:not(pre) > code {
+ background: var(--color-background-code);
+ color: var(--color-foreground);
+ margin: -0.2em 0.2em 0.2em;
+ padding: 0.15em 0.3em;
+ border-radius: 2px;
+ font-size: 0.85em;
+ border: 1px solid rgba(0, 0, 0, 0.08);
+ font-family: Monaco, monospace;
+ letter-spacing: -0.02em;
+}
+
+/* Code block styling */
+pre {
+ filter: drop-shadow(0 4px 4px rgba(0, 0, 0, 0.2));
+ font-size: 70%;
+ line-height: 1.15;
+ margin: 15px 0 30px;
+ text-align: left;
+ padding: 0;
+ overflow-x: auto;
+ border-radius: 6px;
+ position: relative;
+}
+
+/* Add subtle background pattern for code blocks */
+pre::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ height: 3px;
+ background: linear-gradient(90deg, var(--color-highlight), var(--color-highlight-hover));
+ border-radius: 6px 6px 0 0;
+}
+
+/* Code block content styling */
+pre > code {
+ background: var(--color-background-code);
+ box-sizing: content-box;
+ color: var(--color-foreground);
+ display: block;
+ margin: 0 auto;
+ min-width: 456px;
+ padding: 0.8em 1em;
+ font-size: 0.9em;
+ border-radius: 4px;
+ border: 1px solid rgba(0, 0, 0, 0.1);
+}
+
+/* Enhanced syntax highlighting for academic theme - override github theme */
+pre code .hljs-keyword,
+.hljs-keyword {
+ color: #d73a49 !important;
+ font-weight: 600 !important;
+}
+
+pre code .hljs-string,
+.hljs-string {
+ color: #032f62 !important;
+}
+
+pre code .hljs-comment,
+.hljs-comment {
+ color: #6a737d !important;
+ font-style: italic;
+}
+
+pre code .hljs-number,
+.hljs-number {
+ color: #005cc5 !important;
+}
+
+pre code .hljs-function,
+.hljs-function {
+ color: #6f42c1 !important;
+}
+
+pre code .hljs-variable,
+.hljs-variable {
+ color: #24292e !important;
+}
+
+pre code .hljs-class,
+.hljs-class {
+ color: #6f42c1 !important;
+ font-weight: 600 !important;
+}
+
+pre code .hljs-tag,
+.hljs-tag {
+ color: #22863a !important;
+}
+
+/* Language-specific highlights */
+pre code .hljs-built_in,
+.hljs-built_in {
+ color: #e36209 !important;
+}
+
+pre code .hljs-operator,
+.hljs-operator {
+ color: #d73a49 !important;
+}
+
+pre code .hljs-punctuation,
+.hljs-punctuation {
+ color: #586069 !important;
+}
+
+/* Additional syntax elements */
+pre code .hljs-title,
+.hljs-title {
+ color: #6f42c1 !important;
+ font-weight: 600 !important;
+}
+
+pre code .hljs-params,
+.hljs-params {
+ color: #24292e !important;
+}
+
+pre code .hljs-attr,
+.hljs-attr {
+ color: #6f42c1 !important;
+}
+
+pre code .hljs-name,
+.hljs-name {
+ color: #22863a !important;
+}
+
+/* Math formulas */
+math {
+ font-size: 1.1em;
+}
+
+/* ============================================================================
+ UTILITY CLASSES
+ ============================================================================ */
+
+/* Vertical spacing utilities */
+.vspace-small { margin-top: 1em !important; }
+.vspace-medium { margin-top: 2em !important; }
+.vspace-large { margin-top: 3em !important; }
+.vspace-xlarge { margin-top: 4em !important; }
+
+/* Spacing that works on any element */
+.push-down { margin-bottom: 1.5em !important; }
+.push-up { margin-top: 1.5em !important; }
+
+/* Center figures and their content */
+.centered-figure {
+ text-align: center;
+}
+
+/* Auto-center images that are alone in a paragraph */
+section p > img:only-child {
+ display: block;
+ margin: 0 auto;
+}
+
+/* ============================================================================
+ LAYOUT: title
+
+ Centered title slide for cover pages.
+ ============================================================================ */
+
+section.title {
+ text-align: center;
+ padding: 0;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ min-height: 100vh;
+ box-sizing: border-box;
+}
+
+section.title > h1 {
+ font-size: 64px;
+ margin: 0;
+ padding: 0;
+}
+
+section.title > h2 {
+ font-size: 24px;
+ color: #666;
+ margin: 0.5em 0 0 0;
+ padding: 0;
+ font-weight: normal;
+ letter-spacing: 1px;
+}
+
+/* Images in title slides behave normally */
+section.title > img {
+ margin: 2em 0;
+ max-width: 80%;
+ height: auto;
+}
+
+/* ============================================================================
+ LAYOUT: layout-2col
+
+ Two-column layout: left and right columns with title at top.
+
+ Grid contract:
+ ┌─────────────────────────────┐
+ │ title │
+ ├──────────────┬──────────────┤
+ │ │ │
+ │ left-col │ right-col │
+ │ │ │
+ ├──────────────┴──────────────┤
+ │ pagination │
+ └─────────────────────────────┘
+
+ Grid areas: title, left, right, footer
+ Default gap: 2em
+ Columns: 1fr 1fr (equal)
+ ============================================================================ */
+
+section.layout-2col {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ grid-template-rows: auto 1fr auto;
+ grid-template-areas:
+ "title title"
+ "left right"
+ "footer footer";
+ gap: 2em;
+ padding: 0;
+ height: 100%;
+ width: 100%;
+ overflow: hidden;
+}
+
+section.layout-2col > h1:first-child,
+section.layout-2col > h2:first-child,
+section.layout-2col > h3:first-child {
+ grid-area: title;
+ padding: 30px var(--padding) 0;
+ margin: 0 0 10px 0;
+ position: static;
+}
+
+section.layout-2col .left-column {
+ grid-area: left;
+ padding: 0 var(--padding) 0 var(--padding);
+ min-height: 0;
+}
+
+section.layout-2col .right-column {
+ grid-area: right;
+ padding: 0 var(--padding) 0 0;
+ min-height: 0;
+}
+
+section.layout-2col::after {
+ position: absolute;
+ bottom: 0;
+ right: 0;
+ color: #888888 !important;
+ font-size: 18px !important;
+ font-family: 'EB Garamond', 'Times New Roman', serif !important;
+ grid-area: unset;
+ padding: 30px var(--padding);
+ margin: 0;
+}
+
+section.layout-2col img {
+ max-width: 90%;
+ max-height: 90%;
+ height: auto;
+ width: auto;
+ object-fit: contain;
+ display: block;
+}
+
+/* ============================================================================
+ SYNTAX HIGHLIGHTING OVERRIDE
+
+ Force override of highlight.js theme colors for consistent academic styling.
+ ============================================================================ */
+
+/* Base code block colors */
+pre {
+ --hljs-bg: var(--color-background-code) !important;
+ --hljs-fg: var(--color-foreground) !important;
+ background: var(--hljs-bg) !important;
+}
+
+pre code {
+ background: var(--hljs-bg) !important;
+ color: var(--hljs-fg) !important;
+}
+
+/* Syntax-specific colors with maximum specificity */
+section pre code .token.keyword,
+section pre code .hljs-keyword,
+.token.keyword,
+.hljs-keyword {
+ color: #d73a49 !important;
+ font-weight: 600 !important;
+}
+
+section pre code .token.string,
+section pre code .hljs-string,
+.token.string,
+.hljs-string {
+ color: #032f62 !important;
+}
+
+section pre code .token.comment,
+section pre code .hljs-comment,
+.token.comment,
+.hljs-comment {
+ color: #6a737d !important;
+ font-style: italic !important;
+}
+
+section pre code .token.number,
+section pre code .hljs-number,
+.token.number,
+.hljs-number {
+ color: #005cc5 !important;
+}
+
+section pre code .token.function,
+section pre code .hljs-function,
+.token.function,
+.hljs-function {
+ color: #6f42c1 !important;
+}
+
+section pre code .token.class-name,
+section pre code .hljs-class,
+.token.class-name,
+.hljs-class {
+ color: #6f42c1 !important;
+ font-weight: 600 !important;
+}
+
+section pre code .token.tag,
+section pre code .hljs-tag,
+.token.tag,
+.hljs-tag {
+ color: #22863a !important;
+}
+
+section pre code .token.builtin,
+section pre code .hljs-built_in,
+.token.builtin,
+.hljs-built_in {
+ color: #e36209 !important;
+}
+
+section pre code .token.operator,
+section pre code .hljs-operator,
+.token.operator,
+.hljs-operator {
+ color: #d73a49 !important;
+}
+
+section pre code .token.punctuation,
+section pre code .hljs-punctuation,
+.token.punctuation,
+.hljs-punctuation {
+ color: #586069 !important;
+}
+
+/* Additional syntax elements */
+section pre code .token.title,
+section pre code .hljs-title,
+.token.title,
+.hljs-title {
+ color: #6f42c1 !important;
+ font-weight: 600 !important;
+}
+
+section pre code .token.parameter,
+section pre code .hljs-params,
+.token.parameter,
+.hljs-params {
+ color: #24292e !important;
+}
+
+section pre code .token.attr-name,
+section pre code .hljs-attr,
+.token.attr-name,
+.hljs-attr {
+ color: #6f42c1 !important;
+}
+
+section pre code .token.attr-value,
+section pre code .hljs-string,
+.token.attr-value {
+ color: #032f62 !important;
+}
+
+
+/* ============================================================================
+ LAYOUT: default (no class)
+
+ Simple single-column layout - just use normal document flow.
+ ============================================================================ */
+
+section:not(.title):not(.layout-2col) {
+ padding: 30px var(--padding);
+}
diff --git a/acarp.png b/acarp.png
new file mode 100644
index 0000000..759208d
--- /dev/null
+++ b/acarp.png
Binary files differ
diff --git a/demo-beamer.md b/demo-beamer.md
new file mode 100644
index 0000000..9a5fec9
--- /dev/null
+++ b/demo-beamer.md
@@ -0,0 +1,195 @@
+---
+marp: true
+theme: acarp-beamer
+style: |
+ :root {
+ --logo-image: url('acarp.png');
+ --logo-width: 120px;
+ --logo-height: 120px;
+ }
+---
+
+<!--
+ Classic LaTeX Beamer Style (4:3 aspect ratio)
+
+ This presentation uses the classic 4:3 aspect ratio (1280x960)
+ optimized for academic presentations with equations and detailed content.
+-->
+
+<!-- _class: title -->
+# Academic Marp Theme
+
+Beamer Style (4:3)
+
+## Classic academic format
+
+<div class="vspace-large"></div>
+
+![width:120px](acarp.png)
+
+---
+
+<!-- paginate: true -->
+
+## Overview
+
+A minimal, grid-based setup for Marp presentations:
+
+- **Classic 4:3 aspect ratio** - Traditional academic format
+- **Grid-only layouts** - No flexbox, no utility classes
+- **Equation-friendly** - More vertical space for math
+- **Academic focus** - Optimized for technical content
+
+---
+
+### Key Features
+
+**Beamer-Style Design**
+- 4:3 aspect ratio (1280x960)
+- More vertical space
+- Traditional academic format
+- Perfect for equations
+
+**Grid-Based Layouts**
+- CSS Grid for all layouts
+- Explicit grid contracts
+- No hidden behaviors
+- Maintainable structure
+
+---
+
+## Mathematical Content
+
+The TF-IDF model for term weighting:
+
+$$\text{tf-idf}(t, d, D) = \text{tf}(t, d) \times \text{idf}(t, D)$$
+
+Where term frequency is:
+$$\text{tf}(t, d) = \frac{f_{t,d}}{\sum_{t'\in d} f_{t',d}}$$
+
+And inverse document frequency:
+$$\text{idf}(t, D) = \log \frac{|D|}{|\{d \in D : t \in d\}|}$$
+
+The 4:3 format provides better vertical space for multi-line equations.
+
+
+---
+### Code Examples
+
+Python implementation:
+
+```python
+def tfidf(term, doc, corpus):
+ tf = term_frequency(term, doc)
+ idf = inverse_df(term, corpus)
+ return tf * idf
+
+# Example usage
+score = tfidf("grid", doc1, docs)
+print(f"TF-IDF: {score:.3f}")
+```
+
+![width:400px](figs/example.png)
+
+*Top-right logo: university/conference branding*
+
+---
+
+## Layout Patterns
+
+**Default Layout** - Single column, ideal for equations
+
+**Title Layout** - Classic academic opening
+
+**Vertical Flow** - Natural reading order for academic content
+
+The beamer style emphasizes vertical flow over side-by-side comparisons.
+
+---
+
+### Performance Analysis
+
+Traditional approaches to presentation layouts:
+
+- Complex positioning systems
+- Flexbox with numerous overrides
+- Utility classes with cascade issues
+
+Our grid-only approach provides:
+
+- Clear, predictable structure
+- No positioning hacks
+- Easy maintenance and debugging
+
+<!-- ironically, non grid image (for demo, could be 2col layout) -->
+<style>
+img[alt~="bottom-right"] {
+ position: absolute;
+ bottom: 75px;
+ right: 75px;
+ z-index: 10;
+}
+</style>
+
+![bottom-right width:400px](figs/example.png)
+
+---
+
+## Getting Started with Beamer
+
+1. Install dependencies: `npm install`
+2. Create your markdown file
+3. Add `theme: acarp-beamer` in frontmatter
+4. Write your academic content
+5. Build with: `marp --theme acarp-beamer file.md`
+
+The beamer theme automatically applies the 4:3 aspect ratio.
+
+---
+
+## Vertical Spacing
+
+Use spacing utilities for better content flow in the beamer format:
+
+<div class="vspace-small"></div>
+
+Small vertical space (1em)
+
+<div class="vspace-medium"></div>
+
+Medium vertical space (2em) - good for section breaks
+
+<div class="vspace-large"></div>
+
+Large vertical space (3em) - for major separations
+
+---
+
+## Spacing Examples
+
+```python
+def calculate():
+ result = 42
+ return result
+```
+
+<div class="vspace-medium"></div>
+
+The function returns a simple value.
+
+<div class="vspace-small"></div>
+
+![width:400px](figs/example.png)
+
+Images can have custom spacing too.
+
+---
+## Thank You
+
+This theme provides a clean, academic-focused foundation in the traditional beamer format.
+
+Perfect for:
+- Conference presentations
+- Academic lectures
+- Technical seminars
+- Research presentations
diff --git a/demo-standard.md b/demo-standard.md
new file mode 100644
index 0000000..20d887f
--- /dev/null
+++ b/demo-standard.md
@@ -0,0 +1,213 @@
+---
+marp: true
+theme: acarp
+style: |
+ :root {
+ --logo-image: url('acarp.png');
+ --logo-width: 120px;
+ --logo-height: 120px;
+ --logo-opacity: 0.8;
+ }
+---
+
+<!-- _class: title -->
+# Academic Marp Theme
+
+Modern presentations with CSS Grid
+
+## Grid-based layouts for academic content
+
+<div class="vspace-large"></div>
+
+![width:120px](acarp.png)
+
+---
+
+<!-- paginate: true -->
+
+## Overview
+
+A minimal, grid-based setup for Marp presentations:
+
+- **Grid-only layouts** - No flexbox, no utility classes
+- **Explicit contracts** - Clear layout structure in CSS
+- **Two aspect ratios** - 16:9 (standard) and 4:3 (beamer)
+- **Academic focus** - Optimized for technical content
+
+![width:400px](figs/example.png)
+
+---
+
+<!-- _class: layout-2col -->
+### Key Features
+
+<div class="left-column">
+
+**Grid-based Design**
+- CSS Grid for all layouts
+- No hidden behaviors
+- Maintainable structure
+
+**Academic Ready**
+- Math support: $\Delta x$
+- Code highlighting
+- Clean typography
+
+</div>
+
+<div class="right-column">
+
+**Simple Usage**
+- Markdown-only workflow
+- No complex classes
+- Focus on content
+
+![width:350px](figs/example.png)
+
+</div>
+
+---
+
+## Mathematical Content
+
+The TF-IDF model for term weighting:
+
+$$\text{tf-idf}(t, d, D) = \text{tf}(t, d) \times \text{idf}(t, D)$$
+
+Where term frequency is:
+$$\text{tf}(t, d) = \frac{f_{t,d}}{\sum_{t'\in d} f_{t',d}}$$
+
+And inverse document frequency:
+$$\text{idf}(t, D) = \log \frac{|D|}{|\{d \in D : t \in d\}|}$$
+
+---
+
+<!-- _class: layout-2col -->
+### Code Examples
+
+<div class="left-column">
+
+```python
+def tfidf(term, doc, corpus):
+ tf = term_frequency(term, doc)
+ idf = inverse_df(term, corpus)
+ return tf * idf
+
+# Example usage
+score = tfidf("grid", doc1, docs)
+print(f"TF-IDF: {score:.3f}")
+```
+
+</div>
+
+<div class="right-column">
+
+```bash
+# Build presentation
+marp --theme acarp demo.md
+
+# Watch for changes
+marp --theme acarp --watch demo.md
+
+# Export to PDF
+marp --theme acarp --pdf demo.md
+```
+
+</div>
+
+---
+
+## Layout Patterns
+
+**Default Layout** - Single column, clean presentation
+
+**Two-Column Layout** - Perfect for code + output or text + image
+
+**Title Layout** - Impactful opening slides
+
+All layouts use CSS Grid with explicit contracts - no positioning hacks needed.
+
+---
+
+<!-- _class: layout-2col -->
+### Performance Comparison
+
+<div class="left-column">
+
+**Traditional Approach**
+- Complex positioning
+- Flexbox overrides
+- Utility classes
+- Hidden behaviors
+
+**Grid-Only Approach**
+- Explicit layouts
+- Clear structure
+- Predictable behavior
+- Easy maintenance
+
+</div>
+
+<div class="right-column">
+
+![width:100%](figs/example.png)
+
+</div>
+
+---
+
+## Getting Started
+
+1. Install dependencies: `npm install`
+2. Create your markdown file
+3. Add `theme: acarp` in frontmatter
+4. Use layout classes as needed
+5. Build with: `marp --theme acarp file.md`
+
+---
+
+## Vertical Spacing
+
+Use spacing utilities for better content flow:
+
+<div class="vspace-small"></div>
+
+Small vertical space (1em)
+
+<div class="vspace-medium"></div>
+
+Medium vertical space (2em) - good for section breaks
+
+<div class="vspace-large"></div>
+
+Large vertical space (3em) - for major separations
+
+---
+
+## Spacing Examples
+
+```python
+def calculate():
+ result = 42
+ return result
+```
+
+<div class="vspace-medium"></div>
+
+The function returns a simple value.
+
+<div class="vspace-small"></div>
+
+![width:300px](figs/example.png)
+
+<div class="push-up"></div>
+
+Images can have custom spacing too.
+
+---
+
+## Thank You
+
+This theme provides a clean, academic-focused foundation for your presentations.
+
+Visit the repository for more examples and documentation.
diff --git a/figs/example.png b/figs/example.png
new file mode 100644
index 0000000..b56187c
--- /dev/null
+++ b/figs/example.png
Binary files differ
diff --git a/justfile b/justfile
new file mode 100644
index 0000000..dfe3fe3
--- /dev/null
+++ b/justfile
@@ -0,0 +1,95 @@
+# Justfile for Marp presentations
+
+# Default command
+default:
+ just help
+
+# Show help
+help:
+ @echo "Commands:"
+ @echo " build <file> - Build HTML"
+ @echo " watch <file> - Watch and rebuild"
+ @echo " pdf <file> - Export to PDF"
+ @echo " new <name> - Create presentation"
+ @echo " clean - Remove output files"
+ @echo " demo - Build demo presentations"
+ @echo ""
+ @echo "Themes: acarp (16:9), acarp-beamer (4:3)"
+ @echo "Layouts: title, layout-2col"
+
+# Install dependencies
+install:
+ npm install
+
+# Check if dependencies are installed, install if needed
+deps:
+ @if [ ! -d "node_modules" ] || [ ! -f "package-lock.json" ]; then \
+ echo "Installing dependencies..."; \
+ npm install; \
+ fi
+
+# Build HTML from markdown
+build file: deps
+ npx marp --config .marprc.json --html {{file}}
+
+# Watch markdown file and rebuild on changes
+watch file: deps
+ npx marp --config .marprc.json --watch {{file}}
+
+# Convert to PDF
+pdf file: deps
+ npx marp --config .marprc.json --pdf --browser chrome {{file}}
+
+# Build and open HTML file
+build-open file: (build file)
+ #!/usr/bin/env sh
+ html_file="$(echo "{{file}}" | sed 's/\.md$/.html/')"
+ echo "Opening $html_file..."
+ if command -v xdg-open > /dev/null; then
+ xdg-open "$html_file"
+ elif command -v open > /dev/null; then
+ open "$html_file"
+ elif command -v start > /dev/null; then
+ start "$html_file"
+ else
+ echo "Could not find a command to open files"
+ fi
+
+# Create new presentation from template
+new name:
+ @cp template.md "{{name}}.md"
+ @echo "Created {{name}}.md"
+
+# Clean output files
+clean:
+ @rm -f *.html *.pdf *.pptx
+
+# Build demo presentations
+demo:
+ @echo "Building demo-standard.md..."
+ npx marp --config .marprc.json --html demo-standard.md
+ @echo "Building demo-beamer.md..."
+ npx marp --config .marprc.json --html demo-beamer.md
+ @echo "Demo files built successfully!"
+
+build-open-all:
+ #!/usr/bin/env sh
+ # Build all files first
+ for file in *.md; do
+ if [ -f "$file" ]; then
+ echo "Building $file..."
+ theme=$(if echo "$file" | grep -q "beamer"; then echo "acarp-beamer"; else echo "acarp"; fi)
+ npx marp --theme "$theme" --theme-set acarp.css --theme-set acarp-beamer.css --allow-local-files --html "$file"
+ fi
+ done
+ # Then open all HTML files
+ echo "Opening all HTML files..."
+ for file in *.html; do
+ if [ -f "$file" ]; then
+ if command -v xdg-open > /dev/null; then
+ xdg-open "$file" &
+ elif command -v open > /dev/null; then
+ open "$file"
+ fi
+ fi
+ done
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..4a50a12
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,1905 @@
+{
+ "name": "ourmarp",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "ourmarp",
+ "version": "1.0.0",
+ "license": "ISC",
+ "devDependencies": {
+ "@marp-team/marp-cli": "4.2.3"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
+ "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.27.1",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
+ "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@csstools/postcss-is-pseudo-class": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.3.tgz",
+ "integrity": "sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/selector-specificity": "^5.0.0",
+ "postcss-selector-parser": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/@csstools/selector-resolve-nested": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz",
+ "integrity": "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ }
+ },
+ "node_modules/@csstools/selector-specificity": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz",
+ "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ }
+ },
+ "node_modules/@marp-team/marp-cli": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/@marp-team/marp-cli/-/marp-cli-4.2.3.tgz",
+ "integrity": "sha512-yfEIkF7mlumg8CVV5m/UkLEDkW/ayM/SD6Bo8fbAvdscBQ/l9D44/aNFJsiqgNtjfktzpvRqjcBXNhWD0YTq5Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@marp-team/marp-core": "^4.1.0",
+ "@marp-team/marpit": "^3.1.3",
+ "chokidar": "^4.0.3",
+ "cosmiconfig": "^9.0.0",
+ "puppeteer-core": "^24.16.0",
+ "serve-index": "^1.9.1",
+ "tmp": "^0.2.5",
+ "ws": "^8.18.3",
+ "yargs": "^17.7.2"
+ },
+ "bin": {
+ "marp": "marp-cli.js"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@marp-team/marp-core": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/@marp-team/marp-core/-/marp-core-4.1.0.tgz",
+ "integrity": "sha512-QJ79tGpr3itR4TVQ4Cbe9J0kLHg9sR5cNX19OWSHeVK9EjDzMA9iCwS+OCRMKBAvRHo0LGUJC3lm9wUBg3Ud6A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@marp-team/marpit": "^3.1.3",
+ "@marp-team/marpit-svg-polyfill": "^2.1.0",
+ "highlight.js": "^11.11.1",
+ "katex": "^0.16.22",
+ "mathjax-full": "^3.2.2",
+ "postcss": "^8.5.3",
+ "postcss-selector-parser": "^7.1.0",
+ "xss": "^1.0.15"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@marp-team/marpit": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/@marp-team/marpit/-/marpit-3.2.0.tgz",
+ "integrity": "sha512-DNCbwkAKugzCtiHJg/7DciIRwnKwAI2QH3VWWC1cVxoBBQTPnH5D9HcWqpDdduUqnCuW2PY78afVo+QlaInDdQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@csstools/postcss-is-pseudo-class": "^5.0.3",
+ "cssesc": "^3.0.0",
+ "js-yaml": "^4.1.0",
+ "lodash.kebabcase": "^4.1.1",
+ "markdown-it": "^14.1.0",
+ "markdown-it-front-matter": "^0.2.4",
+ "postcss": "^8.5.6",
+ "postcss-nesting": "^13.0.2"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@marp-team/marpit-svg-polyfill": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@marp-team/marpit-svg-polyfill/-/marpit-svg-polyfill-2.1.0.tgz",
+ "integrity": "sha512-VqCoAKwv1HJdzZp36dDPxznz2JZgRjkVSSPHpCzk72G2N753F0HPKXjevdjxmzN6gir9bUGBgMD1SguWJIi11A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@marp-team/marpit": ">=0.5.0"
+ },
+ "peerDependenciesMeta": {
+ "@marp-team/marpit": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@puppeteer/browsers": {
+ "version": "2.10.12",
+ "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.12.tgz",
+ "integrity": "sha512-mP9iLFZwH+FapKJLeA7/fLqOlSUwYpMwjR1P5J23qd4e7qGJwecJccJqHYrjw33jmIZYV4dtiTHPD/J+1e7cEw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "debug": "^4.4.3",
+ "extract-zip": "^2.0.1",
+ "progress": "^2.0.3",
+ "proxy-agent": "^6.5.0",
+ "semver": "^7.7.3",
+ "tar-fs": "^3.1.1",
+ "yargs": "^17.7.2"
+ },
+ "bin": {
+ "browsers": "lib/cjs/main-cli.js"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@tootallnate/quickjs-emscripten": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz",
+ "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "24.8.1",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.8.1.tgz",
+ "integrity": "sha512-alv65KGRadQVfVcG69MuB4IzdYVpRwMG/mq8KWOaoOdyY617P5ivaDiMCGOFDWD2sAn5Q0mR3mRtUOgm99hL9Q==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "undici-types": "~7.14.0"
+ }
+ },
+ "node_modules/@types/yauzl": {
+ "version": "2.10.3",
+ "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz",
+ "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@xmldom/xmldom": {
+ "version": "0.9.8",
+ "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.9.8.tgz",
+ "integrity": "sha512-p96FSY54r+WJ50FIOsCOjyj/wavs8921hG5+kVMmZgKcvIKxMXHTrjNJvRgWa/zuX3B6t2lijLNFaOyuxUH+2A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.6"
+ }
+ },
+ "node_modules/accepts": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/agent-base": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
+ "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "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/ast-types": {
+ "version": "0.13.4",
+ "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz",
+ "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/b4a": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz",
+ "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "peerDependencies": {
+ "react-native-b4a": "*"
+ },
+ "peerDependenciesMeta": {
+ "react-native-b4a": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/bare-events": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.0.tgz",
+ "integrity": "sha512-AOhh6Bg5QmFIXdViHbMc2tLDsBIRxdkIaIddPslJF9Z5De3APBScuqGP2uThXnIpqFrgoxMNC6km7uXNIMLHXA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "peerDependencies": {
+ "bare-abort-controller": "*"
+ },
+ "peerDependenciesMeta": {
+ "bare-abort-controller": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/bare-fs": {
+ "version": "4.4.11",
+ "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.4.11.tgz",
+ "integrity": "sha512-Bejmm9zRMvMTRoHS+2adgmXw1ANZnCNx+B5dgZpGwlP1E3x6Yuxea8RToddHUbWtVV0iUMWqsgZr8+jcgUI2SA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "bare-events": "^2.5.4",
+ "bare-path": "^3.0.0",
+ "bare-stream": "^2.6.4",
+ "bare-url": "^2.2.2",
+ "fast-fifo": "^1.3.2"
+ },
+ "engines": {
+ "bare": ">=1.16.0"
+ },
+ "peerDependencies": {
+ "bare-buffer": "*"
+ },
+ "peerDependenciesMeta": {
+ "bare-buffer": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/bare-os": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz",
+ "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "engines": {
+ "bare": ">=1.14.0"
+ }
+ },
+ "node_modules/bare-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz",
+ "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "bare-os": "^3.0.1"
+ }
+ },
+ "node_modules/bare-stream": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.7.0.tgz",
+ "integrity": "sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "streamx": "^2.21.0"
+ },
+ "peerDependencies": {
+ "bare-buffer": "*",
+ "bare-events": "*"
+ },
+ "peerDependenciesMeta": {
+ "bare-buffer": {
+ "optional": true
+ },
+ "bare-events": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/bare-url": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.3.0.tgz",
+ "integrity": "sha512-c+RCqMSZbkz97Mw1LWR0gcOqwK82oyYKfLoHJ8k13ybi1+I80ffdDzUy0TdAburdrR/kI0/VuN8YgEnJqX+Nyw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "bare-path": "^3.0.0"
+ }
+ },
+ "node_modules/basic-ftp": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz",
+ "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/batch": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
+ "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/buffer-crc32": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
+ "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "readdirp": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 14.16.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/chromium-bidi": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-9.1.0.tgz",
+ "integrity": "sha512-rlUzQ4WzIAWdIbY/viPShhZU2n21CxDUgazXVbw4Hu1MwaeUSEksSeM6DqPgpRjCLXRk702AVRxJxoOz0dw4OA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "mitt": "^3.0.1",
+ "zod": "^3.24.1"
+ },
+ "peerDependencies": {
+ "devtools-protocol": "*"
+ }
+ },
+ "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/commander": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
+ "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/cosmiconfig": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz",
+ "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "env-paths": "^2.2.1",
+ "import-fresh": "^3.3.0",
+ "js-yaml": "^4.1.0",
+ "parse-json": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/d-fischer"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.9.5"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "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/cssfilter": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz",
+ "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/data-uri-to-buffer": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz",
+ "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "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/degenerator": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz",
+ "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ast-types": "^0.13.4",
+ "escodegen": "^2.1.0",
+ "esprima": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/devtools-protocol": {
+ "version": "0.0.1508733",
+ "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1508733.tgz",
+ "integrity": "sha512-QJ1R5gtck6nDcdM+nlsaJXcelPEI7ZxSMw1ujHpO1c4+9l+Nue5qlebi9xO1Z2MGr92bFOQTW7/rrheh5hHxDg==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "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/end-of-stream": {
+ "version": "1.4.5",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
+ "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "once": "^1.4.0"
+ }
+ },
+ "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/env-paths": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
+ "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "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/escodegen": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
+ "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esprima": "^4.0.1",
+ "estraverse": "^5.2.0",
+ "esutils": "^2.0.2"
+ },
+ "bin": {
+ "escodegen": "bin/escodegen.js",
+ "esgenerate": "bin/esgenerate.js"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "optionalDependencies": {
+ "source-map": "~0.6.1"
+ }
+ },
+ "node_modules/esm": {
+ "version": "3.2.25",
+ "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz",
+ "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/events-universal": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz",
+ "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "bare-events": "^2.7.0"
+ }
+ },
+ "node_modules/extract-zip": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
+ "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "debug": "^4.1.1",
+ "get-stream": "^5.1.0",
+ "yauzl": "^2.10.0"
+ },
+ "bin": {
+ "extract-zip": "cli.js"
+ },
+ "engines": {
+ "node": ">= 10.17.0"
+ },
+ "optionalDependencies": {
+ "@types/yauzl": "^2.9.1"
+ }
+ },
+ "node_modules/fast-fifo": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz",
+ "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fd-slicer": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
+ "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pend": "~1.2.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/get-stream": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pump": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/get-uri": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz",
+ "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "basic-ftp": "^5.0.2",
+ "data-uri-to-buffer": "^6.0.2",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/highlight.js": {
+ "version": "11.11.1",
+ "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz",
+ "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/http-errors": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+ "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.0",
+ "statuses": ">= 1.4.0 < 2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/http-proxy-agent": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
+ "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/ip-address": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz",
+ "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "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/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.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/katex": {
+ "version": "0.16.25",
+ "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.25.tgz",
+ "integrity": "sha512-woHRUZ/iF23GBP1dkDQMh1QBad9dmr8/PAwNA54VrSOVYgI12MAcE14TqnDdQOdzyEonGzMepYnqBMYdsoAr8Q==",
+ "dev": true,
+ "funding": [
+ "https://opencollective.com/katex",
+ "https://github.com/sponsors/katex"
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "commander": "^8.3.0"
+ },
+ "bin": {
+ "katex": "cli.js"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/linkify-it": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz",
+ "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "uc.micro": "^2.0.0"
+ }
+ },
+ "node_modules/lodash.kebabcase": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz",
+ "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lru-cache": {
+ "version": "7.18.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
+ "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/markdown-it": {
+ "version": "14.1.0",
+ "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz",
+ "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1",
+ "entities": "^4.4.0",
+ "linkify-it": "^5.0.0",
+ "mdurl": "^2.0.0",
+ "punycode.js": "^2.3.1",
+ "uc.micro": "^2.1.0"
+ },
+ "bin": {
+ "markdown-it": "bin/markdown-it.mjs"
+ }
+ },
+ "node_modules/markdown-it-front-matter": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/markdown-it-front-matter/-/markdown-it-front-matter-0.2.4.tgz",
+ "integrity": "sha512-25GUs0yjS2hLl8zAemVndeEzThB1p42yxuDEKbd4JlL3jiz+jsm6e56Ya8B0VREOkNxLYB4TTwaoPJ3ElMmW+w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/mathjax-full": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/mathjax-full/-/mathjax-full-3.2.2.tgz",
+ "integrity": "sha512-+LfG9Fik+OuI8SLwsiR02IVdjcnRCy5MufYLi0C3TdMT56L/pjB0alMVGgoWJF8pN9Rc7FESycZB9BMNWIid5w==",
+ "deprecated": "Version 4 replaces this package with the scoped package @mathjax/src",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "esm": "^3.2.25",
+ "mhchemparser": "^4.1.0",
+ "mj-context-menu": "^0.6.1",
+ "speech-rule-engine": "^4.0.6"
+ }
+ },
+ "node_modules/mdurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz",
+ "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/mhchemparser": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/mhchemparser/-/mhchemparser-4.2.1.tgz",
+ "integrity": "sha512-kYmyrCirqJf3zZ9t/0wGgRZ4/ZJw//VwaRVGA75C4nhE60vtnIzhl9J9ndkX/h6hxSN7pjg/cE0VxbnNM+bnDQ==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mitt": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
+ "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/mj-context-menu": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/mj-context-menu/-/mj-context-menu-0.6.1.tgz",
+ "integrity": "sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "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.11",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+ "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/negotiator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/netmask": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz",
+ "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/pac-proxy-agent": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz",
+ "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@tootallnate/quickjs-emscripten": "^0.23.0",
+ "agent-base": "^7.1.2",
+ "debug": "^4.3.4",
+ "get-uri": "^6.0.1",
+ "http-proxy-agent": "^7.0.0",
+ "https-proxy-agent": "^7.0.6",
+ "pac-resolver": "^7.0.1",
+ "socks-proxy-agent": "^8.0.5"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/pac-resolver": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz",
+ "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "degenerator": "^5.0.0",
+ "netmask": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/pend": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
+ "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/postcss": {
+ "version": "8.5.6",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
+ "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
+ "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.11",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-nesting": {
+ "version": "13.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.2.tgz",
+ "integrity": "sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "license": "MIT-0",
+ "dependencies": {
+ "@csstools/selector-resolve-nested": "^3.1.0",
+ "@csstools/selector-specificity": "^5.0.0",
+ "postcss-selector-parser": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
+ "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/progress": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/proxy-agent": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz",
+ "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "^4.3.4",
+ "http-proxy-agent": "^7.0.1",
+ "https-proxy-agent": "^7.0.6",
+ "lru-cache": "^7.14.1",
+ "pac-proxy-agent": "^7.1.0",
+ "proxy-from-env": "^1.1.0",
+ "socks-proxy-agent": "^8.0.5"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/pump": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz",
+ "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "node_modules/punycode.js": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz",
+ "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/puppeteer-core": {
+ "version": "24.25.0",
+ "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.25.0.tgz",
+ "integrity": "sha512-8Xs6q3Ut+C8y7sAaqjIhzv1QykGWG4gc2mEZ2mYE7siZFuRp4xQVehOf8uQKSQAkeL7jXUs3mknEeiqnRqUKvQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@puppeteer/browsers": "2.10.12",
+ "chromium-bidi": "9.1.0",
+ "debug": "^4.4.3",
+ "devtools-protocol": "0.0.1508733",
+ "typed-query-selector": "^2.12.0",
+ "webdriver-bidi-protocol": "0.3.7",
+ "ws": "^8.18.3"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
+ "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.18.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "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/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/semver": {
+ "version": "7.7.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
+ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/serve-index": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
+ "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "~1.3.4",
+ "batch": "0.6.1",
+ "debug": "2.6.9",
+ "escape-html": "~1.0.3",
+ "http-errors": "~1.6.2",
+ "mime-types": "~2.1.17",
+ "parseurl": "~1.3.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/serve-index/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/serve-index/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+ "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/smart-buffer": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
+ "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6.0.0",
+ "npm": ">= 3.0.0"
+ }
+ },
+ "node_modules/socks": {
+ "version": "2.8.7",
+ "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz",
+ "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ip-address": "^10.0.1",
+ "smart-buffer": "^4.2.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0",
+ "npm": ">= 3.0.0"
+ }
+ },
+ "node_modules/socks-proxy-agent": {
+ "version": "8.0.5",
+ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz",
+ "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "^4.3.4",
+ "socks": "^2.8.3"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "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",
+ "optional": true,
+ "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/speech-rule-engine": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/speech-rule-engine/-/speech-rule-engine-4.1.2.tgz",
+ "integrity": "sha512-S6ji+flMEga+1QU79NDbwZ8Ivf0S/MpupQQiIC0rTpU/ZTKgcajijJJb1OcByBQDjrXCN1/DJtGz4ZJeBMPGJw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@xmldom/xmldom": "0.9.8",
+ "commander": "13.1.0",
+ "wicked-good-xpath": "1.3.0"
+ },
+ "bin": {
+ "sre": "bin/sre"
+ }
+ },
+ "node_modules/speech-rule-engine/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/statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/streamx": {
+ "version": "2.23.0",
+ "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz",
+ "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "events-universal": "^1.0.0",
+ "fast-fifo": "^1.3.2",
+ "text-decoder": "^1.1.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/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/tar-fs": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz",
+ "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pump": "^3.0.0",
+ "tar-stream": "^3.1.5"
+ },
+ "optionalDependencies": {
+ "bare-fs": "^4.0.1",
+ "bare-path": "^3.0.0"
+ }
+ },
+ "node_modules/tar-stream": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz",
+ "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "b4a": "^1.6.4",
+ "fast-fifo": "^1.2.0",
+ "streamx": "^2.15.0"
+ }
+ },
+ "node_modules/text-decoder": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz",
+ "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "b4a": "^1.6.4"
+ }
+ },
+ "node_modules/tmp": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz",
+ "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
+ "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"
+ },
+ "node_modules/typed-query-selector": {
+ "version": "2.12.0",
+ "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz",
+ "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/uc.micro": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz",
+ "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/undici-types": {
+ "version": "7.14.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.14.0.tgz",
+ "integrity": "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "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/webdriver-bidi-protocol": {
+ "version": "0.3.7",
+ "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.3.7.tgz",
+ "integrity": "sha512-wIx5Gu/LLTeexxilpk8WxU2cpGAKlfbWRO5h+my6EMD1k5PYqM1qQO1MHUFf4f3KRnhBvpbZU7VkizAgeSEf7g==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/wicked-good-xpath": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/wicked-good-xpath/-/wicked-good-xpath-1.3.0.tgz",
+ "integrity": "sha512-Gd9+TUn5nXdwj/hFsPVx5cuHHiF5Bwuc30jZ4+ronF1qHK5O7HD0sgmXWSEgwKquT3ClLoKPVbO6qGwVwLzvAw==",
+ "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/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/ws": {
+ "version": "8.18.3",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz",
+ "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/xss": {
+ "version": "1.0.15",
+ "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.15.tgz",
+ "integrity": "sha512-FVdlVVC67WOIPvfOwhoMETV72f6GbW7aOabBC3WxN/oUdoEMDyLz4OgRv5/gck2ZeNqEQu+Tb0kloovXOfpYVg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "commander": "^2.20.3",
+ "cssfilter": "0.0.10"
+ },
+ "bin": {
+ "xss": "bin/xss"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/xss/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "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/yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "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/yauzl": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
+ "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "buffer-crc32": "~0.2.3",
+ "fd-slicer": "~1.1.0"
+ }
+ },
+ "node_modules/zod": {
+ "version": "3.25.76",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
+ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..fa7df3b
--- /dev/null
+++ b/package.json
@@ -0,0 +1,31 @@
+{
+ "name": "acarp-marp-theme",
+ "version": "1.0.0",
+ "description": "Academic Marp (acarp) theme - Minimal, grid-based theme for Marp presentations designed for academic content",
+ "main": "acarp.css",
+ "repository": {
+ "type": "git",
+ "url": "https://git.samsci.com/cgit.cgi/acarp-marp-theme/"
+ },
+ "license": "MIT",
+ "scripts": {
+ "install": "npm install",
+ "build": "just build",
+ "demo": "just demo",
+ "clean": "just clean"
+ },
+ "keywords": [
+ "marp",
+ "theme",
+ "academic",
+ "presentation",
+ "css-grid",
+ "latex",
+ "beamer",
+ "minimal"
+ ],
+ "author": "samsci <samsci@posteo.com>",
+ "devDependencies": {
+ "@marp-team/marp-cli": "^4.0.0"
+ }
+}
diff --git a/template.md b/template.md
new file mode 100644
index 0000000..fab9238
--- /dev/null
+++ b/template.md
@@ -0,0 +1,70 @@
+---
+marp: true
+theme: acarp
+---
+
+<!--
+ Academic Marp (acarp) Theme Template
+
+ Available layouts:
+ - title: Cover slide with centered title
+ - layout-2col: Two-column layout for comparisons
+ - default: Single column for regular content
+
+ Available themes:
+ - acarp: Standard 16:9 aspect ratio
+ - acarp-beamer: Classic 4:3 aspect ratio for academic presentations
+-->
+
+<!-- _class: title -->
+# Title Slide
+
+Your presentation title here
+
+## Subtitle or author name
+
+---
+
+<!-- paginate: true -->
+<!-- ^ start page numbers after title slide -->
+
+### Regular Slide
+
+Regular content goes here.
+
+---
+
+### Simple Slide with List
+
+Content is left-aligned by default.
+
+- Bullet point 1
+- Bullet point 2
+- Bullet point 3
+
+---
+
+### With Images
+
+![width:400px](figs/example.png)
+
+---
+
+<!-- _class: layout-2col -->
+### Two-Column Layout
+
+<div class="left-column">
+
+Some text content on the left side.
+
+- Point 1
+- Point 2
+- Point 3
+
+</div>
+
+<div class="right-column">
+
+![width:100%](figs/example.png)
+
+</div>