{"_id":"@arrisa/phrases","_rev":"7-ebabc5c645c9ffe2ff97e1698f67e828","name":"@arrisa/phrases","dist-tags":{"latest":"1.0.29"},"versions":{"0.1.1":{"name":"@arrisa/phrases","version":"0.1.1","license":"MIT","_id":"@arrisa/phrases@0.1.1","maintainers":[{"name":"inshinrei","email":"tokkiumai@icloud.com"}],"homepage":"https://github.com/inshinrei/arrisa#readme","bugs":{"url":"https://github.com/inshinrei/arrisa/issues"},"dist":{"shasum":"531b8dd091ff0ab2ebe478ecb37e36b8e759a28a","tarball":"https://registry.npmjs.org/@arrisa/phrases/-/phrases-0.1.1.tgz","fileCount":21,"integrity":"sha512-sH9k5nvlgAqEdKlYpOC9l1PXI2QE21NS5+KNR+omqOm2V6DeMPcjp62GTe5iLOXOfwd4izhCA18LrVDZ7rCAWQ==","signatures":[{"sig":"MEYCIQDtTQ5Qyn46ibIpVbtYDIGpYD50VqAgQbTd9Ia2KzdsEwIhAOqpiUQffroH38zC5pN5DMpZ8p+IzsdVdV9wot46Zbge","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":30447},"main":"./dist/index.js","type":"module","_from":"file:arrisa-phrases-0.1.1.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"inshinrei","email":"tokkiumai@icloud.com"},"_resolved":"/private/var/folders/dr/zy5hc7_n3p5ds1hk9tt_l84w0000gn/T/31024af99088aa295297d44998e18107/arrisa-phrases-0.1.1.tgz","_integrity":"sha512-sH9k5nvlgAqEdKlYpOC9l1PXI2QE21NS5+KNR+omqOm2V6DeMPcjp62GTe5iLOXOfwd4izhCA18LrVDZ7rCAWQ==","repository":{"url":"git+https://github.com/inshinrei/arrisa.git","type":"git","directory":"packages/phrases"},"_npmVersion":"10.9.8","description":"Arrisa — phrases","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"@arrisa/state":"0.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@arrisa/doc":"0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/phrases_0.1.1_1788634720988_0.3990746405354193","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@arrisa/phrases","version":"0.1.2","license":"MIT","_id":"@arrisa/phrases@0.1.2","maintainers":[{"name":"inshinrei","email":"tokkiumai@icloud.com"}],"homepage":"https://github.com/inshinrei/arrisa#readme","bugs":{"url":"https://github.com/inshinrei/arrisa/issues"},"dist":{"shasum":"6ace6b7c0a381377ba7e7cdb37c9d1ae7a64e8b6","tarball":"https://registry.npmjs.org/@arrisa/phrases/-/phrases-0.1.2.tgz","fileCount":21,"integrity":"sha512-0SYqD2WEBjDWaX9y1nBxKtaGdA59XwQDtiRf1IkxYOFRjJJKtQKWngedl7n076x+RdYHY1Km3gJ/gx5Fo1GMXw==","signatures":[{"sig":"MEQCIEgxCzPR0EZlTH275VcId5a7XozhikPOum5TxNDyFhSvAiAVPUfBug98XHBV2cOuubZIO5XipjHyl95SSuJOSF5H/w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCsdMjG3zTzlDMm4C6P3QuuvsKDWo9GEb+v0P+EiYewYQIgTMgaDFFzKu4hptZZzKcEgRo1VxhL8qpERXpz77SHhHY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":30447},"main":"./dist/index.js","type":"module","_from":"file:arrisa-phrases-0.1.2.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"inshinrei","email":"tokkiumai@icloud.com"},"_resolved":"/private/var/folders/dr/zy5hc7_n3p5ds1hk9tt_l84w0000gn/T/5feebe67674605f45d63e814e274ba11/arrisa-phrases-0.1.2.tgz","_integrity":"sha512-0SYqD2WEBjDWaX9y1nBxKtaGdA59XwQDtiRf1IkxYOFRjJJKtQKWngedl7n076x+RdYHY1Km3gJ/gx5Fo1GMXw==","repository":{"url":"git+https://github.com/inshinrei/arrisa.git","type":"git","directory":"packages/phrases"},"_npmVersion":"10.9.8","description":"Arrisa — phrases","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"@arrisa/state":"0.1.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@arrisa/doc":"0.1.2"},"_npmOperationalInternal":{"tmp":"tmp/phrases_0.1.2_1788718368851_0.7293349477534985","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@arrisa/phrases","version":"0.1.3","license":"MIT","_id":"@arrisa/phrases@0.1.3","maintainers":[{"name":"inshinrei","email":"tokkiumai@icloud.com"}],"homepage":"https://github.com/inshinrei/arrisa#readme","bugs":{"url":"https://github.com/inshinrei/arrisa/issues"},"dist":{"shasum":"8e2b00bbe36c6805ae2a63c8126c91f46762ba7b","tarball":"https://registry.npmjs.org/@arrisa/phrases/-/phrases-0.1.3.tgz","fileCount":21,"integrity":"sha512-DtMfHt0la+uJq+szsRQrbyHI+GclNJDuVXFOAoX3IprZ9f7NwMKFaHX+Cvp461w4EIgeNGvCeNsFVga355tnQA==","signatures":[{"sig":"MEUCIE9Uxe3MFReqia1YKsHs7LxIWyy158iIncRZY0xwCT6yAiEAul/3SukS8aq9C7Q5fjYegZr0xTFPaEoqxjFb+q3kNmI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDfNKDAzcMYUgoiJhU3WfEvvje8mB4qSd6536d+FdaqMgIhANFW5kDo2DjIf0XYuSDl8FMD0w1MwWDpMWgbCL7QCnTu","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":30447},"main":"./dist/index.js","type":"module","_from":"file:arrisa-phrases-0.1.3.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"inshinrei","email":"tokkiumai@icloud.com"},"_resolved":"/private/var/folders/dr/zy5hc7_n3p5ds1hk9tt_l84w0000gn/T/18be1643994e6b07cefb66b8d9e744b1/arrisa-phrases-0.1.3.tgz","_integrity":"sha512-DtMfHt0la+uJq+szsRQrbyHI+GclNJDuVXFOAoX3IprZ9f7NwMKFaHX+Cvp461w4EIgeNGvCeNsFVga355tnQA==","repository":{"url":"git+https://github.com/inshinrei/arrisa.git","type":"git","directory":"packages/phrases"},"_npmVersion":"10.9.8","description":"Arrisa — phrases","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"@arrisa/state":"0.1.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@arrisa/doc":"0.1.3"},"_npmOperationalInternal":{"tmp":"tmp/phrases_0.1.3_1788802254669_0.5619894077317087","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@arrisa/phrases","version":"0.1.5","license":"MIT","_id":"@arrisa/phrases@0.1.5","maintainers":[{"name":"inshinrei","email":"tokkiumai@icloud.com"}],"homepage":"https://github.com/inshinrei/arrisa#readme","bugs":{"url":"https://github.com/inshinrei/arrisa/issues"},"dist":{"shasum":"8f72dc6c860a54b24d3ee4a0c6c73259355b4b43","tarball":"https://registry.npmjs.org/@arrisa/phrases/-/phrases-0.1.5.tgz","fileCount":21,"integrity":"sha512-zW+Nr707J+gIEnXAkXN1pkkqRwDeAxQe8tnGgsu+vb7rC2G7biIpIrlS31mEUwQiWsOdk32y+qMmsKwCpsH9qA==","signatures":[{"sig":"MEYCIQCvLOMjOuqBvlCX9eK53WLSeJ7YQs4h+WrRiOmnYjR6sAIhALXOqxFN2gdxt5p46L2iIfBpTI7BEucU4ykyxgb/ft9u","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCICwfMs4JoUmG6VBwUvKgAQ2PnXQE3h0gRRGzru0bAEhpAiB/oDRHE2gZ6Nrjp0kv/6zSR1cyW+GQI23rYqWD7m0eVQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":30447},"main":"./dist/index.js","type":"module","_from":"file:arrisa-phrases-0.1.5.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"inshinrei","email":"tokkiumai@icloud.com"},"_resolved":"/private/var/folders/dr/zy5hc7_n3p5ds1hk9tt_l84w0000gn/T/232c811bc76a7cfa40705e96db35d64f/arrisa-phrases-0.1.5.tgz","_integrity":"sha512-zW+Nr707J+gIEnXAkXN1pkkqRwDeAxQe8tnGgsu+vb7rC2G7biIpIrlS31mEUwQiWsOdk32y+qMmsKwCpsH9qA==","repository":{"url":"git+https://github.com/inshinrei/arrisa.git","type":"git","directory":"packages/phrases"},"_npmVersion":"10.9.8","description":"Arrisa — phrases","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"@arrisa/state":"0.1.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@arrisa/doc":"0.1.5"},"_npmOperationalInternal":{"tmp":"tmp/phrases_0.1.5_1788984209596_0.13923082454451396","host":"s3://npm-registry-packages-npm-production"}},"0.1.12":{"name":"@arrisa/phrases","version":"0.1.12","license":"MIT","_id":"@arrisa/phrases@0.1.12","maintainers":[{"name":"inshinrei","email":"tokkiumai@icloud.com"}],"homepage":"https://github.com/inshinrei/arrisa#readme","bugs":{"url":"https://github.com/inshinrei/arrisa/issues"},"dist":{"shasum":"039e87bd3daf7750e7a28b66c33b86ec24123744","tarball":"https://registry.npmjs.org/@arrisa/phrases/-/phrases-0.1.12.tgz","fileCount":21,"integrity":"sha512-8enAJ2jvsovOVmZR0VCstFBhvkZA+4Z7ofBwTgy1atpNelRh6Cq1bM9RiakdOAsBqBAUSrTI8GMDqZAOCKmxbw==","signatures":[{"sig":"MEYCIQCbxSWd/T7WDL5Ho5kvoX3hxHrpknvSQH/37EAU8KOBeAIhAIxRbaBzdDrJfExXLtZib7k5sCCz7vBodZJPUaJqL0oS","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIBUV2q0LcQgbkb04BOJfO2hfHRQpiNaAGjbmRNZDTn1BAiA+T9KDh4215BuPAOjIpgkXTK+NooGsU9tYJorIPX3MpA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":30450},"main":"./dist/index.js","type":"module","_from":"file:arrisa-phrases-0.1.12.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"inshinrei","email":"tokkiumai@icloud.com"},"_resolved":"/private/var/folders/dr/zy5hc7_n3p5ds1hk9tt_l84w0000gn/T/a4fe3e6f615c5d2ab21ac9ac812d3dc1/arrisa-phrases-0.1.12.tgz","_integrity":"sha512-8enAJ2jvsovOVmZR0VCstFBhvkZA+4Z7ofBwTgy1atpNelRh6Cq1bM9RiakdOAsBqBAUSrTI8GMDqZAOCKmxbw==","repository":{"url":"git+https://github.com/inshinrei/arrisa.git","type":"git","directory":"packages/phrases"},"_npmVersion":"10.9.8","description":"Arrisa — phrases","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"@arrisa/state":"0.1.12"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@arrisa/doc":"0.1.12"},"_npmOperationalInternal":{"tmp":"tmp/phrases_0.1.12_1789806568924_0.07713788347318062","host":"s3://npm-registry-packages-npm-production"}},"1.0.14":{"name":"@arrisa/phrases","version":"1.0.14","license":"MIT","_id":"@arrisa/phrases@1.0.14","maintainers":[{"name":"inshinrei","email":"tokkiumai@icloud.com"}],"homepage":"https://github.com/inshinrei/arrisa#readme","bugs":{"url":"https://github.com/inshinrei/arrisa/issues"},"dist":{"shasum":"e8e5847b8fb5bf9d0875f0e3cd415808db80c87d","tarball":"https://registry.npmjs.org/@arrisa/phrases/-/phrases-1.0.14.tgz","fileCount":21,"integrity":"sha512-3BFOGPKWKYqtgFyHue/oAre47grQwrUh9ZJqLQij/oNWx3/Ykf9xvNUvOn6a4Z6WUtapx3ujDUgpS5M84Z9/OQ==","signatures":[{"sig":"MEQCID3loXlGzUGQ4mhdAJXxSg4bWNWMiqYwWu6/YUNe8mHoAiBDYICHc/yZp7RpcIsqtjVr94TvUKAbD+2/Bzl7tl9CMA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIESOw4juEI2nlbAGxU/Qxo1YvZGOftgvudJ9VeLh58CIAiEA+QVdtkafJGJFNgtVlAzhWrtncZX0GVt3OOyC/L42Su0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":30450},"main":"./dist/index.js","type":"module","_from":"file:arrisa-phrases-1.0.14.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"inshinrei","email":"tokkiumai@icloud.com"},"_resolved":"/private/var/folders/dr/zy5hc7_n3p5ds1hk9tt_l84w0000gn/T/ddd8a68c3bc0320327a220dff55b2859/arrisa-phrases-1.0.14.tgz","_integrity":"sha512-3BFOGPKWKYqtgFyHue/oAre47grQwrUh9ZJqLQij/oNWx3/Ykf9xvNUvOn6a4Z6WUtapx3ujDUgpS5M84Z9/OQ==","repository":{"url":"git+https://github.com/inshinrei/arrisa.git","type":"git","directory":"packages/phrases"},"_npmVersion":"10.9.8","description":"Arrisa — phrases","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"@arrisa/state":"1.0.14"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@arrisa/doc":"1.0.14"},"_npmOperationalInternal":{"tmp":"tmp/phrases_1.0.14_1790150997265_0.4729236599224893","host":"s3://npm-registry-packages-npm-production"}},"1.0.29":{"_id":"@arrisa/phrases@1.0.29","bugs":{"url":"https://github.com/inshinrei/arrisa/issues"},"dist":{"shasum":"d7f578045ae0e363854c309ad53912864f5f0ec9","tarball":"https://registry.npmjs.org/@arrisa/phrases/-/phrases-1.0.29.tgz","fileCount":21,"integrity":"sha512-QPjfbae4MAl1042SFMMJfxD2a8bPRZKMtmxkA3jyc/zvKlBgCx7WXYFItg4lKFWQheCKbsyxMWKWL+0Vmy27dg==","signatures":[{"sig":"MEYCIQD9A+CTQpAfOYfqgeCp2SCtEejJLtitX90T6og/jWIKPwIhAJKs5dcweiRDipNVoLrwWFut220yIZ1IQgBu7oZkLghd","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQC9Mhpya0z9AZMrzw3DqKIN4TYgIrLN4NSTJ0v31Sq95AIhAOx2BJsOiunHYad+n7jpyUSUV7MmE4sYirma8d9ErzjT"}],"unpackedSize":31207},"main":"./dist/index.js","name":"@arrisa/phrases","type":"module","_from":"file:arrisa-phrases-1.0.29.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"license":"MIT","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","typecheck":"tsc -p tsconfig.json --noEmit"},"version":"1.0.29","_npmUser":{"name":"inshinrei","email":"tokkiumai@icloud.com"},"homepage":"https://github.com/inshinrei/arrisa#readme","_resolved":"/private/var/folders/dr/zy5hc7_n3p5ds1hk9tt_l84w0000gn/T/da8df66a0c7dffcca1dbc6f795976e6c/arrisa-phrases-1.0.29.tgz","_integrity":"sha512-QPjfbae4MAl1042SFMMJfxD2a8bPRZKMtmxkA3jyc/zvKlBgCx7WXYFItg4lKFWQheCKbsyxMWKWL+0Vmy27dg==","repository":{"url":"git+https://github.com/inshinrei/arrisa.git","type":"git","directory":"packages/phrases"},"_npmVersion":"10.9.8","description":"Arrisa — phrases","directories":{},"maintainers":[{"name":"inshinrei","email":"tokkiumai@icloud.com"}],"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"@arrisa/state":"1.0.29"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@arrisa/doc":"1.0.29"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/phrases_1.0.29_1790429285507_0.12998535210851547"}}},"time":{"created":"2026-09-05T18:58:40.798Z","modified":"2026-09-26T13:28:06.077Z","0.1.1":"2026-09-05T18:58:41.130Z","0.1.2":"2026-09-06T18:12:48.922Z","0.1.3":"2026-09-07T17:30:54.767Z","0.1.5":"2026-09-09T20:03:29.678Z","0.1.12":"2026-09-19T08:29:29.021Z","1.0.14":"2026-09-23T08:09:57.360Z","1.0.29":"2026-09-26T13:28:05.608Z"},"bugs":{"url":"https://github.com/inshinrei/arrisa/issues"},"license":"MIT","homepage":"https://github.com/inshinrei/arrisa#readme","repository":{"url":"git+https://github.com/inshinrei/arrisa.git","type":"git","directory":"packages/phrases"},"description":"Arrisa — phrases","maintainers":[{"name":"inshinrei","email":"tokkiumai@icloud.com"}],"readme":"# @arrisa/phrases\n\n**Typed UI phrase catalogs and locale overrides for Arrisa `EditorState`.**\n\nDefine frozen English (or base) string maps, resolve them against editor state, and register translations via extensions. Higher packages (`@arrisa/command`, `@arrisa/editor`, `@arrisa/table`, …) use the built-in catalogs for menus, dialogs, and table UI.\n\n## Install\n\n```bash\npnpm add @arrisa/phrases\n```\n\nDepends on `@arrisa/state` (and transitively `@arrisa/doc`).\n\n## Quick start\n\n```ts\nimport {EditorState} from \"@arrisa/state\"\nimport {PhraseSet, phrases, tablePhrases} from \"@arrisa/phrases\"\n\n// Built-in catalogs\nphrases.get(state, \"undo\") // \"Undo\"\ntablePhrases.get(state, \"dimensions_live\", 3, 4) // \"3 by 4\"\n\n// Locale override extension\nlet de = phrases.translatePartial({\n    undo: \"Rückgängig\",\n    redo: \"Wiederholen\",\n})\n\nlet state = EditorState.create({\n    doc,\n    config: [\n        EditorState.schemaElement.of(schema.elements),\n        de, // put locale packs early or wrap with EditorState.prec.high\n    ],\n})\n\n// Custom set\nlet myPhrases = PhraseSet.define({\n    save: \"Save\",\n    status: \"Saved $1 items\",\n})\nmyPhrases.get(state, \"status\", 3) // \"Saved 3 items\"\n```\n\n## Features / concepts\n\n| Concept | Role |\n|---------|------|\n| **PhraseSet** | Frozen tag → default string map; typed tags. |\n| **get / ref** | Resolve with overrides + `$n` interpolation. |\n| **translate / translatePartial** | `EditorState.Extension` providers for full or partial overrides. |\n| **didChange** | Detect phrase-override reconfiguration between states. |\n| **Built-in catalogs** | Core UI, image dialogs, color names, table chrome. |\n\n### Interpolation\n\n- `$1`, `$2`, … — insert the n-th extra argument (1-based).\n- Bare `$` — treated as `$1`.\n- `$$` — literal `$`.\n- Markers without a matching argument are left unchanged.\n- With no insert args, the template is returned as-is (including `$1`).\n- `schedule_suggestion` is **not** `$1` interpolation. The schedule chip replaces the literal `{phrase}` substring with the hit label. Hosts override with `phrases.translatePartial({schedule_suggestion: \"Запланировать {phrase}\"})`.\n\n### Override merge order\n\nProviders are combined so **higher precedence / earlier-in-list keys win**. Put locale packs first in `config`, or use `EditorState.prec.high(...)`.\n\n## Main public API\n\n```ts\nimport {\n    PhraseSet,\n    phrases,\n    imagePhrases,\n    colorNames,\n    tablePhrases,\n} from \"@arrisa/phrases\"\n```\n\n### PhraseSet\n\n| API | Description |\n|-----|-------------|\n| `PhraseSet.define({ tag: \"string\", … })` | Create a set; freezes the map. |\n| `set.get(state, tag, …insert)` | Resolve with overrides + format. |\n| `set.ref(tag)` | `(state, …insert) => string` bound getter. |\n| `set.translate(allTags)` | Extension replacing every phrase. |\n| `set.translatePartial(someTags)` | Extension overriding a subset. |\n| `PhraseSet.didChange(a, b)` | `true` if override facet identity changed. |\n| `PhraseSet.Tag<Set>` | Type helper: union of tags. |\n| `PhraseSet.Ref` | Type of `ref` callbacks. |\n\n### Built-in catalogs\n\n| Export | Scope (examples) |\n|--------|------------------|\n| `phrases` | Undo/redo, block styles, mark toggles, link/color labels, alignment, direction, dialog close, schedule suggestion (`schedule_suggestion`: `\"Schedule {phrase}\"`). |\n| `imagePhrases` | Insert/update image dialog, figure styles, alt, upload states. |\n| `colorNames` | Palette labels (`red`, `darker`, `none`, …). |\n| `tablePhrases` | Dimension live/title (`$1`×`$2`), insert/modify table, row/col ops, merge/split. |\n\nTags are TypeScript-checked: `phrases.get(state, \"undo\")` is valid; unknown tags fail at compile time.\n\n## Layering / related packages\n\n```\n@arrisa/doc → @arrisa/state → @arrisa/phrases   ← you are here\n```\n\nConsumers: `@arrisa/command`, `@arrisa/editor`, `@arrisa/schema`, `@arrisa/table`, `@arrisa/message` (UI labels).\n\n| Package | Relation |\n|---------|----------|\n| [`@arrisa/state`](https://www.npmjs.com/package/@arrisa/state) | Facet storage for overrides; `EditorState` required for `get`. |\n| `@arrisa/editor` | Renders phrases in menus, dialogs, tooltips. |\n\n## Security\n\nPhrase catalogs are static UI strings. They do not sanitize HTML or URLs. Do not put untrusted user content into phrase **templates** without escaping at the display boundary.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}