# @mlightcad/cad-svg-plugin

[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![npm version](https://img.shields.io/npm/v/@mlightcad/cad-svg-plugin.svg)](https://www.npmjs.com/package/@mlightcad/cad-svg-plugin)

SVG **export** plugin and rendering engine for [`@mlightcad/cad-simple-viewer`](../cad-simple-viewer). Registers one system command:

| Command | Description |
|---------|-------------|
| `csvg` | Export the current drawing to SVG |

The plugin is designed for **lazy loading** so the SVG renderer bundle is only downloaded when a user runs `csvg`.

## Key features

- **Vector SVG export** — renders model-space entities to SVG via `AcSvgRenderer`
- **Plugin API** — implements `AcApPlugin`; register once with `registerLazySvgPlugin`
- **Reusable renderer** — `AcSvgRenderer` is also used by `@mlightcad/cad-pdf-plugin` for PDF export
- **Framework-agnostic** — no Vue/React dependency; works anywhere `cad-simple-viewer` runs

## Installation

```bash
pnpm add @mlightcad/cad-svg-plugin
```

Peer dependencies:

- `@mlightcad/cad-simple-viewer`
- `@mlightcad/data-model`
- `@mlightcad/mtext-parser`

## Build

Produces `dist/index.js` (main library) and `dist/register.js` (lazy-registration entry).

```bash
pnpm --filter @mlightcad/cad-svg-plugin build
```

## Usage

### Lazy registration (recommended)

Register the plugin with the document manager's plugin manager. Import from the `/register` subpath so only the registration stub enters your initial bundle; the main plugin chunk loads on first use of `csvg`:

```typescript
import { AcApDocManager } from '@mlightcad/cad-simple-viewer'
import { registerLazySvgPlugin } from '@mlightcad/cad-svg-plugin/register'

registerLazySvgPlugin(AcApDocManager.instance.pluginManager)
```

Do **not** import `registerLazySvgPlugin` from the package root in application code — that resolves to the full library build and defeats lazy loading.

Equivalent manual registration:

```typescript
import {
  createSvgPlugin,
  SVG_PLUGIN_NAME,
  SVG_PLUGIN_TRIGGERS
} from '@mlightcad/cad-svg-plugin'

AcApDocManager.instance.pluginManager.registerLazyPlugin({
  name: SVG_PLUGIN_NAME,
  triggers: [...SVG_PLUGIN_TRIGGERS],
  loader: createSvgPlugin
})
```

### Eager loading

```typescript
import { AcApSvgPlugin } from '@mlightcad/cad-svg-plugin'

await AcApDocManager.instance.pluginManager.loadPlugin(new AcApSvgPlugin())
```

### Using the renderer directly

```typescript
import { AcSvgRenderer } from '@mlightcad/cad-svg-plugin'

AcSvgRenderer.prepareExport()
const renderer = new AcSvgRenderer()
// ... configure and draw entities ...
const svg = await renderer.exportAsync()
```

## Public API

| Export | Description |
|--------|-------------|
| `createSvgPlugin` | Async factory used by lazy loader |
| `SVG_PLUGIN_NAME`, `SVG_PLUGIN_TRIGGERS` | Plugin metadata constants |
| `@mlightcad/cad-svg-plugin/register` | `registerLazySvgPlugin` and registration constants |
| `AcApSvgPlugin` | `AcApPlugin` implementation |
| `AcApConvertToSvgCmd` | `csvg` command class |
| `AcApSvgConvertor` | SVG export workflow |
| `AcSvgRenderer` | Core SVG rendering engine |

## Package layout

| Path | Role |
|------|------|
| `src/register.ts` | Lazy plugin registration (`/register` entry) and `createSvgPlugin` |
| `src/AcApSvgPlugin.ts` | Plugin lifecycle (`onLoad` / `onUnload`) |
| `src/AcApConvertToSvgCmd.ts` | `csvg` command |
| `src/AcApSvgConvertor.ts` | Export orchestration |
| `src/AcSvgRenderer.ts` | Main SVG renderer implementation |
| `src/AcSvg*.ts` | Entity-specific SVG renderers |

## Role in MLightCAD

This package extends `cad-simple-viewer` with optional SVG export. It keeps the SVG renderer out of the core viewer bundle through lazy loading, while still exposing `AcSvgRenderer` for other packages such as `cad-pdf-plugin`.
