{"_id":"@ambystech/axo","name":"@ambystech/axo","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"@ambystech/axo","version":"0.1.0","description":"Axo — a static deck framework. Slides in .mdx, components in .axo, ships plain HTML with no runtime.","homepage":"https://axo.ambystech.io","repository":{"type":"git","url":"git+https://github.com/ambystechcom/axo.git"},"bugs":{"url":"https://github.com/ambystechcom/axo/issues"},"keywords":["slides","deck","presentation","reveal.js","mdx","static-site","no-runtime"],"type":"module","bin":{"axo":"dist/cli.js"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./runtime":{"types":"./dist/runtime.d.ts","import":"./dist/runtime.js"},"./scan":{"types":"./dist/scan.d.ts","import":"./dist/scan.js"},"./theme/*":"./theme/*"},"engines":{"node":">=20"},"dependencies":{"@fontsource/inter":"^5.2.8","@fontsource/jetbrains-mono":"^5.2.8","@fontsource/space-grotesk":"^5.2.10","@mdx-js/mdx":"^3.1.1","chokidar":"^5.0.0","decktape":"^3.14.0","esbuild":"^0.28.1","http-server":"^14.1.1","live-server":"^1.2.2","mermaid":"^11.16.0","preact":"^10.29.7","preact-render-to-string":"^6.7.0","remark-frontmatter":"^5.0.0","remark-mdx-frontmatter":"^5.2.0","reveal.js":"^5.1.0"},"author":{"name":"Ambystech"},"license":"MIT","devDependencies":{"@types/node":"^26.1.1","typescript":"^7.0.2"},"types":"./dist/index.d.ts","scripts":{"build":"node scripts/build-pkg.mjs","typecheck":"tsc -p tsconfig.json --noEmit","prepare":"node scripts/build-pkg.mjs","prepublishOnly":"node scripts/build-pkg.mjs","test":"node scripts/build-pkg.mjs && node scripts/test.mjs","test:only":"node scripts/test.mjs"},"_id":"@ambystech/axo@0.1.0","gitHead":"e9fc5fffc48db5832b6a1058be7c76b514924015","_nodeVersion":"24.4.0","_npmVersion":"11.4.2","dist":{"integrity":"sha512-I5c0v2AyM6C4D6AoqUprUCTYSqxAzMa8s0kRawQ7+NDaJ64+j/aKC4Ixg1MECq6G/hQxMBcob7L/vJD2YytPpQ==","shasum":"58c3f4452d0ab133b9b70e2673957bab8b2a896f","tarball":"https://registry.npmjs.org/@ambystech/axo/-/axo-0.1.0.tgz","fileCount":129,"unpackedSize":486853,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCICT0S9dJBtQp8juNvzrVH6nyxRKznmx4uXQc9PX5Cd3xAiAG2Cj7hddpjdERFH/qbEsGA0RBL2K4ih5g5dV5L1U9CQ=="}]},"_npmUser":{"name":"tavobarrientos","email":"tavobarrientos@gmail.com"},"directories":{},"maintainers":[{"name":"tavobarrientos","email":"tavobarrientos@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/axo_0.1.0_1787720389332_0.7845425526833087"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-26T04:59:49.226Z","0.1.0":"2026-08-26T04:59:49.472Z","modified":"2026-08-26T04:59:49.665Z"},"maintainers":[{"name":"tavobarrientos","email":"tavobarrientos@gmail.com"}],"description":"Axo — a static deck framework. Slides in .mdx, components in .axo, ships plain HTML with no runtime.","homepage":"https://axo.ambystech.io","keywords":["slides","deck","presentation","reveal.js","mdx","static-site","no-runtime"],"repository":{"type":"git","url":"git+https://github.com/ambystechcom/axo.git"},"author":{"name":"Ambystech"},"bugs":{"url":"https://github.com/ambystechcom/axo/issues"},"license":"MIT","readme":"# Axo\r\n\r\nA static deck framework. Slides in `.mdx`, components in `.axo`, output is plain HTML with\r\n**no runtime** — no React, no hydration, no islands. A deck renders at a venue with no wifi,\r\nopens by double-click off a USB stick, and exports to PDF.\r\n\r\n```bash\r\nnpx @ambystech/axo new my-talk --starter lightning --title \"AmbyKit\"\r\ncd my-talk && npm install && npm run dev\r\n```\r\n\r\n## A deck is thin\r\n\r\n```\r\nmy-talk/\r\n  slides/          one .mdx per slide      ← what you edit\r\n  components/      your .axo components    ← optional\r\n  layouts/         your .axo layouts       ← optional\r\n  css/deck.css     this deck's CSS\r\n  assets/\r\n  axo.config.mjs   title, visibility, footer\r\n```\r\n\r\nThat's all. The compiler, the 39 components, the 6 layouts, the theme, Reveal, the fonts and\r\nMermaid all live in `@ambystech/axo`. **`npm update @ambystech/axo` upgrades every deck you\r\nown** — which is the difference between a framework and a folder you copied.\r\n\r\n## Commands\r\n\r\n```bash\r\naxo new <dir>     scaffold a deck    --starter --visibility --title --link --install --yes\r\naxo dev           compile + watch + live-reload        --port 8000  --open\r\naxo build         static site in dist/                 --force  (refuses if confidential)\r\naxo preview       serve dist/                          --port 8080\r\naxo pdf [out]     export to PDF (starts its own server, no flags)\r\naxo check         compile without writing a site\r\naxo ls            list every component and layout      --verbose\r\naxo doctor        check the deck and the toolchain\r\naxo clean         remove generated files\r\n```\r\n\r\n`axo new` with no flags **asks** — kind of deck, title, visibility — and can install for you.\r\nIt never blocks a script: with `--yes`, no TTY, or in CI it takes the defaults and says so.\r\n\r\nNot published yet? Point a deck at a local checkout:\r\n\r\n```bash\r\naxo new my-talk --link ../axo\r\n```\r\n\r\n## A slide\r\n\r\n```mdx\r\n---\r\nlayout: title\r\n---\r\n\r\n<Eyebrow>Ambystech · Lightning Talk</Eyebrow>\r\n\r\n# AmbyKit\r\n\r\n<Subtitle>Spec-Driven Development for AI coding assistants</Subtitle>\r\n\r\n<Meta>\r\n  <Field label=\"Speaker\">Gustavo Barrientos</Field>\r\n</Meta>\r\n\r\n<Notes>\r\n- Speaker notes. Not a script.\r\n</Notes>\r\n```\r\n\r\nComponents compose — you nest children, you don't pass data arrays:\r\n\r\n```mdx\r\n<Matrix columns={['Spec-Kit', 'OpenSpec', 'AmbyKit']}>\r\n  <Row label=\"Install\"           cells={['Python', 'npm', 'npm']} />\r\n  <Row label=\"Everyone has this\" cells={['✓', '✓', '✓']} tie />\r\n  <Row label=\"Only we do this\"   cells={['—', '—', '✓']} reveal />\r\n  <Row label=\"They do it better\" cells={['✓', '—', '— not yet']} concede reveal />\r\n</Matrix>\r\n```\r\n\r\nFull component API: [`docs/components.md`](docs/components.md).\r\n\r\nWriting `.axo` in VS Code, Cursor or another fork? The editor extension in [`extension/`](extension)\r\ngives you colour, completion and diagnostics — see [`docs/editor-support.md`](docs/editor-support.md).\r\n\r\n## A component\r\n\r\n`.axo` — a frontmatter script that runs at compile time, then a template. **The filename is\r\nthe component name.** Drop it in `components/`; there is no registration step.\r\n\r\n```axo\r\n---\r\nconst { name, price, featured } = Axo.props;\r\n---\r\n\r\n<div class:list={['step', featured && 'featured']}>\r\n  <span class=\"n\">{name}</span>\r\n  <h4>{price}</h4>\r\n  <p><slot /></p>\r\n</div>\r\n```\r\n\r\n`Axo.props` · `Axo.children` · `Axo.slots.name` · `<slot />` · `html:raw={}` · `class:list={[]}`.\r\n`expect` · `pick` · `cx` · `toChildArray` are **ambient** — no imports, ever.\r\n\r\n**A deck component named after a built-in overrides it.** Want a different `Matrix`? Put\r\n`Matrix.axo` in your deck. You never fork the framework, and everything else keeps upgrading.\r\n\r\n**No `client:*`, no islands, no runtime** — by design. A `client:load` is a compile error.\r\nThat's what keeps a deck working offline.\r\n\r\n## Visibility is a guard, not a label\r\n\r\nA footer that says CONFIDENTIAL doesn't stop anyone publishing a deck; it only documents the\r\nleak. `visibility` in `axo.config.mjs` is the thing that does:\r\n\r\n| `visibility` | `axo build` | workflow | delivery |\r\n|---|---|---|---|\r\n| `public` | builds | scaffolded, deploys to Pages | public URL |\r\n| `internal` | builds, warns | **none** | behind auth / handover |\r\n| `confidential` | **refuses** (`--force` to override) | **none** | **PDF only** |\r\n\r\nDefaults: `lightning` → public · `training` → internal · `commercial`/`proposal` →\r\n**confidential**. It fails closed: an unset visibility is treated as confidential.\r\n\r\nA non-public deck also gets `<meta name=\"robots\" content=\"noindex, nofollow, noarchive\">`,\r\nand no deploy workflow is written at all — there is nothing to trigger, and nothing to\r\naccidentally deploy.\r\n\r\n## TypeScript\r\n\r\nThe framework is written in TypeScript and **ships compiled JavaScript plus `.d.ts`** — you\r\nnever need TypeScript to use it, and `engines` stays at Node >= 20.\r\n\r\n```bash\r\nnpm run typecheck   # tsc --noEmit\r\nnpm run build       # esbuild -> dist/*.js  +  tsc -> dist/*.d.ts\r\n```\r\n\r\n`build` runs on `prepare`, so `npm install` / `npm link` produce a working `dist/` with no\r\nextra step.\r\n\r\nDeck authors get types too:\r\n\r\n```js\r\n// axo.config.mjs\r\nimport { defineConfig } from '@ambystech/axo';\r\n\r\nexport default defineConfig({\r\n  title: 'AmbyKit',\r\n  visibility: 'public',   // autocompleted; a typo is a type error\r\n});\r\n```\r\n\r\n## What it compiles to\r\n\r\nStatic HTML. MDX, Preact and esbuild are compile-time dependencies of the framework; the\r\nbrowser never sees them. `dist/` contains `index.html`, `css/`, `assets/` and `vendor/` —\r\n2.6 MB, no CDN link anywhere, and every slide's markdown inlined so it opens over `file://`.\r\n\r\n## License\r\n\r\nMIT — see [`LICENSE`](LICENSE).\r\n","readmeFilename":"README.md","_rev":"1-5d5577125c1a046fd4bc35ceaae4c534"}