{"_id":"@andares/pdeditor","_rev":"5-46b2f2b9c08da6de386f1a8c8aa5a90f","name":"@andares/pdeditor","dist-tags":{"latest":"0.4.1"},"versions":{"0.2.0":{"name":"@andares/pdeditor","version":"0.2.0","license":"MIT","_id":"@andares/pdeditor@0.2.0","maintainers":[{"name":"andares","email":"andares@outlook.com"}],"dist":{"shasum":"b2cc781f56e2a6b3230413c5ff95c03f4c9d1683","tarball":"https://registry.npmjs.org/@andares/pdeditor/-/pdeditor-0.2.0.tgz","fileCount":18,"integrity":"sha512-QiVHCMK28cPJi/BCTCfFOkmDnnGGRHo6obasbjbkplv1I1dRlWl4IncXj+DzKAXiz2rVrNHuox055gIvWst6rQ==","signatures":[{"sig":"MEUCIAQV32AKFs9L08zPhNd6IsYj9cBc2F/fLW+AOWxpWYDXAiEA8Xs98RYpViK9YgIcrpKOzUTgknooJySxCyPCKTf4z0A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":633461},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./pd":{"types":"./dist/pd.d.ts","import":"./dist/pd.js","require":"./dist/pd.cjs"},"./package.json":"./package.json"},"scripts":{"dev":"vite demo","test":"vitest run","build":"vite build && vite build --config vite.pd.config.ts && tsc --emitDeclarationOnly","typecheck":"tsc --noEmit","build:demo":"vite build --config vite.demo.config.ts","build:editor":"pnpm build && pnpm build:demo"},"_npmUser":{"name":"andares","email":"andares@outlook.com"},"description":"Headless prompt 输入框组件（基于 Yace）：pd/md/xml/json/yaml 语法高亮，语言切换为 API 行为，无 UI 假设","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","yace":"^1.0.0","jsdom":"^26.0.0","vitest":"^3.0.0","prismjs":"^1.29.0","es-toolkit":"^1.51.0","@types/prismjs":"^1.26.6"},"_npmOperationalInternal":{"tmp":"tmp/pdeditor_0.2.0_1787156258963_0.6364179229227234","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@andares/pdeditor","version":"0.2.1","license":"MIT","_id":"@andares/pdeditor@0.2.1","maintainers":[{"name":"andares","email":"andares@outlook.com"}],"dist":{"shasum":"fb14864d8bf9300b5286ba715138f53f8caba68d","tarball":"https://registry.npmjs.org/@andares/pdeditor/-/pdeditor-0.2.1.tgz","fileCount":18,"integrity":"sha512-jiqKLImLhMYVeoNSliSnwhOLVlDSEpDgVe7mQeZW2UX7Fq6AvFJAnXKIp4icQAMdnxhR8aaKz+BvAniVWvOs3g==","signatures":[{"sig":"MEUCIQD5nyNowgaQJJjbS4lp7Cd1WpEnFyx55vZXbAC5OZsUngIgBu2+K/hLMDor1hrsb6C8cwsKGlbHqZ3ZJUjEDXTfn5s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":633461},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./pd":{"types":"./dist/pd.d.ts","import":"./dist/pd.js","require":"./dist/pd.cjs"},"./package.json":"./package.json"},"scripts":{"dev":"vite demo","test":"vitest run","build":"vite build && vite build --config vite.pd.config.ts && tsc --emitDeclarationOnly","typecheck":"tsc --noEmit","build:demo":"vite build --config vite.demo.config.ts","build:editor":"pnpm build && pnpm build:demo"},"_npmUser":{"name":"andares","email":"andares@outlook.com"},"description":"Headless prompt 输入框组件（基于 Yace）：pd/md/xml/json/yaml 语法高亮，语言切换为 API 行为，无 UI 假设","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","yace":"^1.0.0","jsdom":"^26.0.0","vitest":"^3.0.0","prismjs":"^1.29.0","es-toolkit":"^1.51.0","@types/prismjs":"^1.26.6"},"_npmOperationalInternal":{"tmp":"tmp/pdeditor_0.2.1_1787203148146_0.5390809616711358","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@andares/pdeditor","version":"0.3.0","license":"MIT","_id":"@andares/pdeditor@0.3.0","maintainers":[{"name":"andares","email":"andares@outlook.com"}],"dist":{"shasum":"f1ca28ef4a559f2a7c5863a47e73a7ba7c9e9635","tarball":"https://registry.npmjs.org/@andares/pdeditor/-/pdeditor-0.3.0.tgz","fileCount":18,"integrity":"sha512-+vJUiYHvBaqrjfRtDrMQLOuWB19QAd3eN4Skw8m114Ch8Ono2mYDr3M+RZ0GlJpTO5hJ60xYa67eseOfgCFDFA==","signatures":[{"sig":"MEYCIQDNllrwdpYT36241FDF+FK99K+Sue6Y2xhQKV8GZRbD2QIhAJs4BUZGIT7VT6ajoJ/yLRvmnlJVero3LJ5rcBIepuol","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":636618},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./pd":{"types":"./dist/pd.d.ts","import":"./dist/pd.js","require":"./dist/pd.cjs"},"./package.json":"./package.json"},"scripts":{"dev":"vite demo","test":"vitest run","build":"vite build && vite build --config vite.pd.config.ts && tsc --emitDeclarationOnly","typecheck":"tsc --noEmit","build:demo":"vite build --config vite.demo.config.ts","build:editor":"pnpm build && pnpm build:demo"},"_npmUser":{"name":"andares","email":"andares@outlook.com"},"description":"Headless prompt 输入框组件（基于 Yace）：pd/md/xml/json/yaml 语法高亮，语言切换为 API 行为，无 UI 假设","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","yace":"^1.0.0","jsdom":"^26.0.0","vitest":"^3.0.0","prismjs":"^1.29.0","es-toolkit":"^1.51.0","@types/prismjs":"^1.26.6","@andares/pdfoundation":"^0.1.0"},"peerDependencies":{"@andares/pdfoundation":"^0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/pdeditor_0.3.0_1787231132811_0.10590632283884549","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@andares/pdeditor","version":"0.4.0","license":"MIT","_id":"@andares/pdeditor@0.4.0","maintainers":[{"name":"andares","email":"andares@outlook.com"}],"dist":{"shasum":"367bd631cdec30fb1ea096942148dd0599b332ec","tarball":"https://registry.npmjs.org/@andares/pdeditor/-/pdeditor-0.4.0.tgz","fileCount":18,"integrity":"sha512-IguK1FJ+gJkOSnlo6odGB2ZjrIYdNyl47cOEDB6vp/rx7inn1ZJ1FnvBoU7bGpD065TdhQsb2roWRJoTKDYamw==","signatures":[{"sig":"MEUCIBg2WAIJHMs2KiWVQSMSrWzwOL/iAuT0C4UpHCpmAjlzAiEA1JmtIz4xr7CI4sprkVYF908ArFKn8HRA0ItxRCSbfOM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":636618},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./pd":{"types":"./dist/pd.d.ts","import":"./dist/pd.js","require":"./dist/pd.cjs"},"./package.json":"./package.json"},"scripts":{"dev":"vite demo","test":"vitest run","build":"vite build && vite build --config vite.pd.config.ts && tsc --emitDeclarationOnly","typecheck":"tsc --noEmit","build:demo":"vite build --config vite.demo.config.ts","build:editor":"pnpm build && pnpm build:demo"},"_npmUser":{"name":"andares","email":"andares@outlook.com"},"description":"Headless prompt 输入框组件（基于 Yace）：pd/md/xml/json/yaml 语法高亮，语言切换为 API 行为，无 UI 假设","directories":{},"sideEffects":false,"_nodeVersion":"26.0.0","_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","yace":"^1.0.0","jsdom":"^26.0.0","vitest":"^3.0.0","prismjs":"^1.29.0","es-toolkit":"^1.51.0","@types/prismjs":"^1.26.6","@andares/pdfoundation":"^0.9.1"},"peerDependencies":{"@andares/pdfoundation":"^0.9.1"},"_npmOperationalInternal":{"tmp":"tmp/pdeditor_0.4.0_1787233228644_0.657187715634654","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@andares/pdeditor","version":"0.4.1","description":"Headless prompt 输入框组件（基于 Yace）：pd/md/xml/json/yaml 语法高亮，语言切换为 API 行为，无 UI 假设","type":"module","license":"MIT","main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","sideEffects":false,"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./pd":{"types":"./dist/pd.d.ts","import":"./dist/pd.js","require":"./dist/pd.cjs"},"./package.json":"./package.json"},"dependencies":{"@andares/pdfoundation":"^0.9.1"},"devDependencies":{"@types/prismjs":"^1.26.6","es-toolkit":"^1.51.0","jsdom":"^26.0.0","prismjs":"^1.29.0","vite":"^6.0.0","vitest":"^3.0.0","yace":"^1.0.0","@andares/pdfoundation":"^0.9.1"},"scripts":{"build":"vite build && vite build --config vite.pd.config.ts && tsc --emitDeclarationOnly","typecheck":"tsc --noEmit","test":"vitest run","dev":"vite demo","build:demo":"vite build --config vite.demo.config.ts","build:editor":"pnpm build && pnpm build:demo"},"_nodeVersion":"26.0.0","_id":"@andares/pdeditor@0.4.1","dist":{"integrity":"sha512-ZK3tNeGllWmB1e+67F/iRXoOYTRDud546O053Tt8hgL0tZhwfcfrqBmwbO/Erk0T0HFDReF9pJHSY2A+fImQ3Q==","shasum":"9453d3766746d935733b1b83124c2d64ee3e3465","tarball":"https://registry.npmjs.org/@andares/pdeditor/-/pdeditor-0.4.1.tgz","fileCount":18,"unpackedSize":636614,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCID2Pw0HJGSaXjFWRAO5BfIJUrVwVqPmqnVw6DO9fXDNIAiAJ28A1QAQj5N5EtB8Pmp+PKiAAB52RCh/W31M2wCG/aQ=="}]},"_npmUser":{"name":"andares","email":"andares@outlook.com"},"directories":{},"maintainers":[{"name":"andares","email":"andares@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pdeditor_0.4.1_1787234442522_0.6512480660711824"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-19T16:17:38.540Z","modified":"2026-08-20T14:00:42.864Z","0.2.0":"2026-08-19T16:17:39.124Z","0.2.1":"2026-08-20T05:19:08.317Z","0.3.0":"2026-08-20T13:05:32.973Z","0.4.0":"2026-08-20T13:40:28.974Z","0.4.1":"2026-08-20T14:00:42.678Z"},"license":"MIT","description":"Headless prompt 输入框组件（基于 Yace）：pd/md/xml/json/yaml 语法高亮，语言切换为 API 行为，无 UI 假设","maintainers":[{"name":"andares","email":"andares@outlook.com"}],"readme":"# @andares/pdeditor\n\n**Headless 提示词输入框组件**：在任意框架（React/Vue/Svelte/原生）中嵌入一个支持多格式语法高亮的输入框。基于 [Yace](https://github.com/petersolopov/yace)（~2KB、零依赖）。\n\n## 定位\n\n- **Headless**：只渲染输入框内容（高亮层 + 原生 textarea），无 UI chrome；核心维护覆盖层排版不变量，外部定义容器外观与 token 配色\n- **精确优先**：pd 是纯代码文本，高亮服务于精确（看清结构），不改变文本；编辑模型保留原始文本\n- **语言切换是 API 行为**（`setLanguage`），不做 UI 切换器\n- 支持格式：`pd`（自研 tokenizer，语义与主包 lexer 一致）/ `md` / `xml` / `json` / `yaml`（Prism）\n\n## 安装\n\n```bash\nnpm install @andares/pdeditor\n```\n\n## 入口选择与 tree-shaking\n\n同一个包两个入口，**选择入口即完成裁剪**——高亮/运行时依赖（yace、es-toolkit、Prism）均预打包进产物（`sideEffects: false`），消费方 bundler 无需做模块级摇树；仅**共享语义包 `@andares/pdfoundation` 保持 external**——两个入口都 re-export `format` / `jsonToPdText` / `pdToJsonText`（另含自研 `highlightPd`），运行时由消费方按 peerDependencies 提供，语义单一来源、零漂移：\n\n| 入口 | import | 内置高亮 | 产物体积（min 前 / gzip） | 适用 |\n| --- | --- | --- | --- | --- |\n| 全量（默认） | `@andares/pdeditor` | pd（自研）+ md/xml/json/yaml（Prism） | ~84 kB / ~23 kB | 需要多语言内置高亮 |\n| pd-only 精简 | `@andares/pdeditor/pd` | 仅 pd；其余语言纯文本渲染（功能完好） | ~17 kB / ~5.5 kB | 只用 pd（多数宿主场景） |\n\n```ts\n// pd-only：不把 Prism（~80 kB）打进你的 bundle\nimport { createPdEditor } from \"@andares/pdeditor/pd\";\n```\n\n- 两个入口的 API 完全一致（同一 `createPdEditor` 工厂，仅内置高亮管线不同）\n- pd-only 入口下 `setLanguage(\"md\")` 不报错：内容以纯文本渲染，无高亮\n- 任何时候都可用 `options.highlight` 自带高亮器（BYO）覆盖内置管线——精简入口 + BYO 即可按需补其它语言\n- 消费验证：vite 项目引 `/pd` 入口构建产物 ~13 kB（gzip ~4.7 kB）、无 Prism 痕迹；除 peer `@andares/pdfoundation` 外的依赖均已内联进 dist（仅开发期使用）\n\n## 用法\n\n```ts\nimport { createPdEditor } from \"@andares/pdeditor\";\n\nconst editor = createPdEditor(document.querySelector(\"#editor\")!, {\n value: \"//!pd 基础设定\\n角色: 资深工程师\\n\",\n language: \"pd\",\n styles: {\n  fontSize: \"14px\",\n  lineHeight: \"20px\",\n  padding: \"12px\",\n },\n onValueChange: (v) => console.log(v.length),\n});\n\neditor.setLanguage(\"json\"); // 语言切换 = API\neditor.setValue('{\"角色\": \"资深工程师\"}');\nconsole.log(editor.getValue());\neditor.destroy();\n```\n\n## API\n\n```ts\ncreatePdEditor(el, {\n  value?: string;                          // 初始值\n  language?: \"pd\" | \"md\" | \"xml\" | \"json\" | \"yaml\";\n  lineNumbers?: boolean;                   // 行号（默认 false）\n  styles?: Record<string, string>;         // 覆盖层共用的根节点排版样式\n  highlight?: (source, lang) => string;    // BYO 高亮函数（覆盖内置）\n  onValueChange?: (value: string) => void;\n}): {\n  setValue(v): void;\n  getValue(): string;\n  setLanguage(lang): void;                 // 语言切换\n  destroy(): void;\n  textarea: HTMLTextAreaElement;           // 原生元素（外部可监听）\n}\n```\n\n## 高亮样式\n\n高亮输出带 class 的 HTML，外部提供 token 配色。字体、行高、字距和 padding 等几何样式必须通过 `styles` 从 Yace 根节点统一传入，不要分别设置内部 `textarea` / `pre`。token 样式也不能使用会改变字形宽度或盒模型的 `font-size`、`padding`、`margin`、`border`；非严格等宽字体下不要使用粗体或斜体。\n\n```css\n.pd-key { color: #9cdcfe; }            /* 键名 */\n.pd-key-punct { color: #d4d4d4; }      /* 冒号 */\n.pd-item { color: #569cd6; }           /* - 序列标记 */\n.pd-section { color: #c586c0; }        /* //!pd 段标记 */\n.pd-sep { color: #569cd6; }            /* --- 分隔线 */\n.pd-ref { color: #ce9178; }            /* :refname 引用 */\n.pd-inline-code { color: #dcdcaa; }    /* `行内代码` */\n.pd-fence { color: #6a9955; }          /* ``` 围栏行 */\n/* Prism token 类（md/xml/json/yaml）：.token.* */\n```\n\n参考 [demo/index.html](./demo/index.html) 的完整配色示例。\n\n当前版本按内容自动增高；不要给编辑器设置会触发内部滚动的固定高度。固定高度滚动与高亮层同步留待后续版本实现。\n\n## 内置编辑行为\n\n- **回车续行**：序列项行（`-` 开头）回车 → 新行继承缩进并自动补 `-`；非序列项行回车保留缩进\n- **Tab / Shift+Tab**：序列项行（`-` 开头，允许缩进）按 Tab 整行右缩进一个单位、Shift+Tab 整行左缩出一个单位（多行选区整体操作，空行跳过）；非序列项行 Tab 插入缩进单位\n- **缩进单位**：默认两个空格，可用 `indentUnit` 选项配置\n- **中文输入法**：组合期（拼音/五笔选字前）输入字符实时渲染（覆盖层同步），选字确认后正常触发 `onValueChange`（组合期不触发，避免宿主收到中间态）\n- **撤销/重做**：Ctrl+Z 撤销 / Ctrl+Shift+Z 与 Ctrl+Y 重做，5 步记忆；快照含光标选区（恢复时光标一并回到当时位置，撤回到初始内容时光标回到首次变更点而非末尾）；保存节点有 1s 防抖（连续打字合并为一步，不逐字还原、不浪费记忆步数）；初始内容恒在栈底（可退回初始态，超限只挤掉最旧的非初始快照）；程序化 `setValue` 不入栈；新输入使重做失效\n- 原生 textarea 行为保留（IME、selection、移动端触屏、粘贴）\n\n## Demo\n\n两种方式：\n\n```bash\n# ① 预构建（推荐：直接打开，无需服务）\npnpm --filter @andares/pdeditor build:demo   # 产物 demo-dist/（index.html + assets/）\n# 直接双击 demo-dist/index.html（或 firefox.localhost 打开）即可\n\n# ② vite dev（开发迭代：热更新）\npnpm --filter @andares/pdeditor dev          # 访问终端输出的端口（默认 http://localhost:5173/）\n```\n\n⚠️ 端口被占用时 vite 自动换端口并提示；若浏览器报脚本 MIME 拦截/404，先确认访问的是 vite 输出的端口（其他项目的 dev server 可能占用了默认端口）。\n\n## 开发\n\n```bash\npnpm install          # workspace 安装\npnpm --filter @andares/pdeditor test     # vitest + jsdom\npnpm --filter @andares/pdeditor build    # vite lib（ESM + CJS + d.ts）\n```\n\n## 未来方向（不在本包当前范围）\n\n- 成品输入框（headless 核心 + UI 层）：格式切换器、Ctrl+G 放大模式、历史记录、工具栏\n- 主题系统（CSS 变量）\n- 移动端/触屏专项、协同（Yjs）\n","readmeFilename":""}