**Patch release.** Bug fixes across the schema-export tooling, the editor, the diagnostic commands (`doctor` / `doctor:a11y`), and the theme-preset system, all backward-compatible.

### Fixed

- **`php artisan wirekit:export-json` (and the `.wirekit-schema.json` it writes to your project root) now reports props correctly for components whose `@props` block carries a comment with an odd number of quote characters.** A comment such as `// each item's group` or `// without a leading "` contains an unpaired `'` or `"`; the prop extractor mistook it for the start of a string literal, lost track of where the `@props([…])` array ended, and gave up — reporting the component's props as `(none)` and listing the prop *names* under `slots` instead. IDE autocomplete and AI tooling fed from the manifest saw the wrong shape for [`<x-wirekit::skip-link>`](https://docs.wirekit.app/components/skip-link), [`<x-wirekit::sticky-panel>`](https://docs.wirekit.app/components/sticky-panel), and [`<x-wirekit::notification-center>`](https://docs.wirekit.app/components/notification-center). The extractor now skips comment spans before tracking string and bracket state, so every component's props and slots export accurately. Re-run `php artisan wirekit:install` (or `wirekit:export-json`) to refresh a committed `.wirekit-schema.json`.
- **[`<x-wirekit::editor>`](https://docs.wirekit.app/components/editor) now logs its "Tiptap not loaded" console hint once per page instead of once per editor.** When Tiptap (the editor's peer dependency) isn't loaded, the editor degrades to a plain textarea and logs a one-time hint pointing you at the install steps — but the hint fired on every editor mount, so a page with several editors filled the console with duplicates. It's now deduplicated behind a page-global flag, matching the chart and map components' missing-dependency hints. The textarea fallback itself is unchanged (each editor still degrades independently).
- **`php artisan wirekit:doctor` now reminds you about the editor and map front-end peer dependencies.** Its optional-dependency report covered Chart.js and the QR-code package but stayed silent on Tiptap (for [`<x-wirekit::editor>`](https://docs.wirekit.app/components/editor)) and a map engine — MapLibre GL or Leaflet — (for [`<x-wirekit::map>`](https://docs.wirekit.app/components/map)). Those are browser globals a PHP command can't probe, so they appear as informational reminders ("only if you use those components"), not pass/fail checks. The integration guide also gained an at-a-glance peer-dependency table.
- **`php artisan wirekit:theme <preset>` now applies the light palette correctly on the `@wirekitStyles` (`<link>`) path.** The generated light block was wrapped in a Tailwind `@theme {}` block, which compiles into the `theme` cascade layer; because the prebuilt `dist/wirekit.css` ships its default tokens unlayered, the layered light palette lost the cascade and silently did nothing in light mode (the accent stayed near-black, inline `code` stayed gray, the chrome stayed on the default font) while dark mode worked. The light palette is now emitted as a plain `:root {}` block — mirroring the `.dark {}` block it already emitted — so it wins the cascade and the preset applies in both modes. If you previously worked around this by hand-converting the generated block to `:root {}`, that edit is now redundant (but harmless).
- **The `aurora` preset's generated CSS no longer breaks the build.** A nested block comment in its `--theme-hue` override example closed early (CSS block comments don't nest), so the trailing prose leaked into the stylesheet as invalid tokens and the build failed. The annotation is now plain text.
- **`php artisan wirekit:doctor:a11y --theme-contrast` now audits hue-driven theme tokens instead of skipping them.** A preset that expresses its palette through a single source hue — `oklch(L C var(--theme-hue))` — previously had its entire accent family reported as "unsupported color format" and skipped, because the audit didn't substitute the `var()` reference before parsing the color. It now resolves embedded custom-property references (recursively, with a cycle guard) from the same token table, so those pairings are actually contrast-checked.

### Documentation

- **The [integration guide](https://docs.wirekit.app/getting-started/integration) now collects every optional peer dependency in one at-a-glance table.** Previously Tiptap (for [`<x-wirekit::editor>`](https://docs.wirekit.app/components/editor)) and a map engine (for [`<x-wirekit::map>`](https://docs.wirekit.app/components/map)) were documented only on their component pages, while [`<x-wirekit::chart>`](https://docs.wirekit.app/components/chart) and [`<x-wirekit::qr-code>`](https://docs.wirekit.app/components/qr-code) had their own scattered notes. The guide now lists all four side by side — each cross-linked to its component page — with concise Editor and Map setup sections.
- **The [map documentation](https://docs.wirekit.app/components/map) now shows how to keep the map engine out of your global bundle.** A new bundle-size section on the [MapLibre GL guide](https://docs.wirekit.app/components/map/maplibre) demonstrates loading the engine only on the routes that actually render a map — the engine is your own dependency (WireKit never bundles it), so a global import would otherwise add its weight to every page.