{"_id":"@econ-v1/node-design-seam","_rev":"8-8238338c392f20e606a7b0ed4fb1cd61","name":"@econ-v1/node-design-seam","dist-tags":{"latest":"0.1.8"},"versions":{"0.1.1":{"name":"@econ-v1/node-design-seam","version":"0.1.1","license":"MIT OR Apache-2.0","_id":"@econ-v1/node-design-seam@0.1.1","maintainers":[{"name":"lamtuanvu","email":"lamtuanvuqs@gmail.com"}],"homepage":"https://github.com/econ-v1/node-design-seam#readme","bugs":{"url":"https://github.com/econ-v1/node-design-seam/issues"},"bin":{"node-design-seam":"cli/main.mjs"},"dist":{"shasum":"9353aa6956077c1d4f364562a8c5482915a7e142","tarball":"https://registry.npmjs.org/@econ-v1/node-design-seam/-/node-design-seam-0.1.1.tgz","fileCount":18,"integrity":"sha512-DQrYUwgGtqZ8OOvk9CxKkUszY7Vtz6aSWnrRg6t+UU0HMUAG0r2Td8q2zvk1TON0kWie/caAwLbiWKQLf0NzHQ==","signatures":[{"sig":"MEUCIQCXQGmnUlI4YypJ0y7R0PUwkrLhvbf5JubWabP2PA+/xwIgTd+fzt/cSIX395FSmHN8l/RqOR8FeB1u48R5FSsL8f8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":60924},"main":"./src/index.js","type":"module","engines":{"node":">=18"},"exports":{".":"./src/index.js","./src/*.js":"./src/*.js"},"gitHead":"882ff647e9259718c0d2c2c379e2f1221c79d4f2","scripts":{"test":"vitest run","check":"tsc -p jsconfig.json --pretty false","verify:pack":"node scripts/check-pack.mjs","verify:self":"node cli/main.mjs verify --config fixtures/demo-app/node-design-seam.config.json"},"_npmUser":{"name":"lamtuanvu","email":"lamtuanvuqs@gmail.com"},"deprecated":"installed CLI bin is a silent no-op (exit 0) — upgrade to >=0.1.3","repository":{"url":"git+https://github.com/econ-v1/node-design-seam.git","type":"git"},"_npmVersion":"10.9.8","description":"Vendored design drops + data-slot wiring: the closed-vocabulary seam runtime and the pin/bindings/verify CLI","directories":{},"sideEffects":false,"_nodeVersion":"22.23.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^24.1.0","vitest":"^3.0.0","typescript":"^5.5.0","@types/node":"^22.20.1","@types/jsdom":"^30.0.0"},"_npmOperationalInternal":{"tmp":"tmp/node-design-seam_0.1.1_1786426809049_0.10252495737273493","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@econ-v1/node-design-seam","version":"0.1.3","license":"MIT OR Apache-2.0","_id":"@econ-v1/node-design-seam@0.1.3","maintainers":[{"name":"lamtuanvu","email":"lamtuanvuqs@gmail.com"}],"homepage":"https://github.com/econ-v1/node-design-seam#readme","bugs":{"url":"https://github.com/econ-v1/node-design-seam/issues"},"bin":{"node-design-seam":"cli/main.mjs"},"dist":{"shasum":"3a33fb3d170bb68a710b2e6ada9cfa78d9d7696c","tarball":"https://registry.npmjs.org/@econ-v1/node-design-seam/-/node-design-seam-0.1.3.tgz","fileCount":18,"integrity":"sha512-2EU8toVQiYaK7sc0iM7hOXMlCO4QUUmOfKSUZ2WxgQ6vh/FuUYtI9dooBW5WcVrRHMzyP+s18erZGdmYTu0+tg==","signatures":[{"sig":"MEUCIFpo1zwE3SJUFLielRh0vKbgWJvNRTbmHgzdfHxaFaImAiEA+vGBkr7gA/w5H7nl6Wk2Wh0rRlrYijaMZHMIWsROdg4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":61500},"main":"./src/index.js","type":"module","engines":{"node":">=18"},"exports":{".":"./src/index.js","./src/*.js":"./src/*.js"},"gitHead":"aa0db232ee2e32e03d51cafe79f236ec0e7d6c61","scripts":{"test":"vitest run","check":"tsc -p jsconfig.json --pretty false","verify:pack":"node scripts/check-pack.mjs","verify:self":"node cli/main.mjs verify --config fixtures/demo-app/node-design-seam.config.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:3a388d8a-ae03-447a-8916-ba9b28a6fa9a"}},"repository":{"url":"git+https://github.com/econ-v1/node-design-seam.git","type":"git"},"_npmVersion":"11.19.0","description":"Vendored design drops + data-slot wiring: the closed-vocabulary seam runtime and the pin/bindings/verify CLI","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^24.1.0","vitest":"^3.0.0","typescript":"^5.5.0","@types/node":"^22.20.1","@types/jsdom":"^30.0.0"},"_npmOperationalInternal":{"tmp":"tmp/node-design-seam_0.1.3_1786428476176_0.2570379048199294","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@econ-v1/node-design-seam","version":"0.1.4","license":"MIT OR Apache-2.0","_id":"@econ-v1/node-design-seam@0.1.4","maintainers":[{"name":"lamtuanvu","email":"lamtuanvuqs@gmail.com"}],"homepage":"https://github.com/econ-v1/node-design-seam#readme","bugs":{"url":"https://github.com/econ-v1/node-design-seam/issues"},"bin":{"node-design-seam":"cli/main.mjs"},"dist":{"shasum":"497ab65bfcfe8f95b38bb771c3ab28f7a349e667","tarball":"https://registry.npmjs.org/@econ-v1/node-design-seam/-/node-design-seam-0.1.4.tgz","fileCount":18,"integrity":"sha512-HsSPC7MwC0NW6ieRcWOda7cSxVlBazYSCq1+BjIL8vF/J6CD3dPZwc/cD5U2w0HeYT7xBElFHaweBMFu7GHbIw==","signatures":[{"sig":"MEUCIQCDuvDWvuhv1uvqczGYnBdM4qbfiUzl3cwdzjkMwgTIpwIgMCXVL3RZ/ByxAukOdGnZrkp1Sj8RaKfC4e5XVzolE2I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":65531},"main":"./src/index.js","type":"module","engines":{"node":">=18"},"exports":{".":"./src/index.js","./src/*.js":"./src/*.js"},"gitHead":"476cb4f4e325725412b815880d1ff426676f5ce6","scripts":{"test":"vitest run","check":"tsc -p jsconfig.json --pretty false","verify:pack":"node scripts/check-pack.mjs","verify:self":"node cli/main.mjs verify --config fixtures/demo-app/node-design-seam.config.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:3a388d8a-ae03-447a-8916-ba9b28a6fa9a"}},"repository":{"url":"git+https://github.com/econ-v1/node-design-seam.git","type":"git"},"_npmVersion":"11.19.0","description":"Vendored design drops + data-slot wiring: the closed-vocabulary seam runtime and the pin/bindings/verify CLI","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^24.1.0","vitest":"^3.0.0","typescript":"^5.5.0","@types/node":"^22.20.1","@types/jsdom":"^30.0.0"},"_npmOperationalInternal":{"tmp":"tmp/node-design-seam_0.1.4_1786504373733_0.20322593140730083","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@econ-v1/node-design-seam","version":"0.1.5","license":"MIT OR Apache-2.0","_id":"@econ-v1/node-design-seam@0.1.5","maintainers":[{"name":"lamtuanvu","email":"lamtuanvuqs@gmail.com"}],"homepage":"https://github.com/econ-v1/node-design-seam#readme","bugs":{"url":"https://github.com/econ-v1/node-design-seam/issues"},"bin":{"node-design-seam":"cli/main.mjs"},"dist":{"shasum":"75d05f8fbc16e4dc8aee6d6ffeed91d2838d68c5","tarball":"https://registry.npmjs.org/@econ-v1/node-design-seam/-/node-design-seam-0.1.5.tgz","fileCount":18,"integrity":"sha512-ZQ3Iew82LJRZhPSaJLF1NRt4D0+NqG2jXDR4ZMDf32tHrqpbo7cz4mEvCn2wc1PrBpXMwcGhepQuEAFfPzdlIQ==","signatures":[{"sig":"MEUCIQDcCZaC4s/mhME1bPBS7O4WjPy89k55CNFI7V7ZkvnhbgIgeU5KRCIwrolCWWiPELs9FUNInHd/kpCr9z0KWcjXS+A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":66571},"main":"./src/index.js","type":"module","engines":{"node":">=18"},"exports":{".":"./src/index.js","./src/*.js":"./src/*.js"},"gitHead":"f7f9e0c7c57b39b19d289d8b62bcecf72883ae40","scripts":{"test":"vitest run","check":"tsc -p jsconfig.json --pretty false","verify:pack":"node scripts/check-pack.mjs","verify:self":"node cli/main.mjs verify --config fixtures/demo-app/node-design-seam.config.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:3a388d8a-ae03-447a-8916-ba9b28a6fa9a"}},"repository":{"url":"git+https://github.com/econ-v1/node-design-seam.git","type":"git"},"_npmVersion":"11.19.0","description":"Vendored design drops + data-slot wiring: the closed-vocabulary seam runtime and the pin/bindings/verify CLI","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^24.1.0","vitest":"^3.0.0","typescript":"^5.5.0","@types/node":"^22.20.1","@types/jsdom":"^30.0.0"},"_npmOperationalInternal":{"tmp":"tmp/node-design-seam_0.1.5_1786506345851_0.30831163825185026","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@econ-v1/node-design-seam","version":"0.1.6","license":"MIT OR Apache-2.0","_id":"@econ-v1/node-design-seam@0.1.6","maintainers":[{"name":"lamtuanvu","email":"lamtuanvuqs@gmail.com"}],"homepage":"https://github.com/econ-v1/node-design-seam#readme","bugs":{"url":"https://github.com/econ-v1/node-design-seam/issues"},"bin":{"node-design-seam":"cli/main.mjs"},"dist":{"shasum":"c4c5b911137d58c0664ec54185f99e5501156010","tarball":"https://registry.npmjs.org/@econ-v1/node-design-seam/-/node-design-seam-0.1.6.tgz","fileCount":18,"integrity":"sha512-Te06GkEo2QsPI8EgVlRHCOK1nmSuZgF8deNK123JnkFurY/i2fJohZk58EA4DWQUnk9RqXKtkQPs1vx43LdfoQ==","signatures":[{"sig":"MEYCIQCt9yMoSq+BetBdDl6SdZX+acbtKhOMjGqVZRB4yVCxJQIhAPu0U6Ce1Xo04m5wHjgwr6prxVIgMKDU47sHxNx5GMuf","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":67619},"main":"./src/index.js","type":"module","engines":{"node":">=18"},"exports":{".":"./src/index.js","./src/*.js":"./src/*.js"},"gitHead":"270b9a0ff34b7076d817e585563e0285dee573aa","scripts":{"test":"vitest run","check":"tsc -p jsconfig.json --pretty false","verify:pack":"node scripts/check-pack.mjs","verify:self":"node cli/main.mjs verify --config fixtures/demo-app/node-design-seam.config.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:3a388d8a-ae03-447a-8916-ba9b28a6fa9a"}},"repository":{"url":"git+https://github.com/econ-v1/node-design-seam.git","type":"git"},"_npmVersion":"11.19.0","description":"Vendored design drops + data-slot wiring: the closed-vocabulary seam runtime and the pin/bindings/verify CLI","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^24.1.0","vitest":"^3.0.0","typescript":"^5.5.0","@types/node":"^22.20.1","@types/jsdom":"^30.0.0"},"_npmOperationalInternal":{"tmp":"tmp/node-design-seam_0.1.6_1786507926094_0.19379291355520367","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@econ-v1/node-design-seam","version":"0.1.7","license":"MIT OR Apache-2.0","_id":"@econ-v1/node-design-seam@0.1.7","maintainers":[{"name":"lamtuanvu","email":"lamtuanvuqs@gmail.com"}],"homepage":"https://github.com/econ-v1/node-design-seam#readme","bugs":{"url":"https://github.com/econ-v1/node-design-seam/issues"},"bin":{"node-design-seam":"cli/main.mjs"},"dist":{"shasum":"8ca5c2235df923fa7bd068069b8c0bd627b163b5","tarball":"https://registry.npmjs.org/@econ-v1/node-design-seam/-/node-design-seam-0.1.7.tgz","fileCount":19,"integrity":"sha512-AW2FtZTZU+DGtAzNC/Ysr7TxiNNvczH52Qt+lfvqJEV35hZHkn6goyqgtU9paIypn5TSz93nCbELtddxZIaWkw==","signatures":[{"sig":"MEYCIQCfsDHagVfDXXa/78VwNFSU4FhtiwADw3bM8/cQ41cbiAIhAKpgLYnpoTK2m9kTper63jTfiSQySYCXcEfO1V9+FPa/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":77477},"main":"./src/index.js","type":"module","engines":{"node":">=18"},"exports":{".":"./src/index.js","./src/*.js":"./src/*.js"},"gitHead":"fe24fdfff662dcb16ed7dfb10b4c49d4e5d971f0","scripts":{"test":"vitest run","check":"tsc -p jsconfig.json --pretty false","verify:pack":"node scripts/check-pack.mjs","verify:self":"node cli/main.mjs verify --config fixtures/demo-app/node-design-seam.config.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:3a388d8a-ae03-447a-8916-ba9b28a6fa9a"}},"repository":{"url":"git+https://github.com/econ-v1/node-design-seam.git","type":"git"},"_npmVersion":"11.19.0","description":"Vendored design drops + data-slot wiring: the closed-vocabulary seam runtime and the pin/bindings/verify CLI","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^24.1.0","vitest":"^3.0.0","typescript":"^5.5.0","@types/node":"^22.20.1","@types/jsdom":"^30.0.0"},"_npmOperationalInternal":{"tmp":"tmp/node-design-seam_0.1.7_1786507995708_0.7473242864016827","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"@econ-v1/node-design-seam","version":"0.1.8","description":"Vendored design drops + data-slot wiring: the closed-vocabulary seam runtime and the pin/bindings/verify CLI","license":"AGPL-3.0-only","repository":{"type":"git","url":"git+https://github.com/econ-v1/node-design-seam.git"},"type":"module","main":"./src/index.js","types":"./types/index.d.ts","exports":{".":{"types":"./types/index.d.ts","default":"./src/index.js"},"./src/*.js":{"types":"./types/*.d.ts","default":"./src/*.js"}},"bin":{"node-design-seam":"cli/main.mjs"},"scripts":{"build":"tsc -p tsconfig.build.json","prepack":"npm run build","test":"vitest run","check":"tsc -p jsconfig.json --pretty false","verify:self":"node cli/main.mjs verify --config fixtures/demo-app/node-design-seam.config.json","verify:pack":"node scripts/check-pack.mjs"},"engines":{"node":">=18"},"sideEffects":false,"publishConfig":{"access":"public"},"devDependencies":{"@types/jsdom":"^30.0.0","@types/node":"^22.20.1","jsdom":"^24.1.0","typescript":"^5.5.0","vitest":"^3.0.0"},"gitHead":"93aa0d8aff1dfb38264305818143d11fef79009e","_id":"@econ-v1/node-design-seam@0.1.8","bugs":{"url":"https://github.com/econ-v1/node-design-seam/issues"},"homepage":"https://github.com/econ-v1/node-design-seam#readme","_nodeVersion":"24.18.0","_npmVersion":"11.19.0","dist":{"integrity":"sha512-z6jzZCsNJvDY0spRxA4Q0jOD756k3vNxE7MNg/2IarET9GbUsSfWZ2dQqTjVqFi8C7b223kVNHN22l5PlFePIw==","shasum":"ababa0637b11404c7ccc6f263076f68d71086cbe","tarball":"https://registry.npmjs.org/@econ-v1/node-design-seam/-/node-design-seam-0.1.8.tgz","fileCount":38,"unpackedSize":229287,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDIzECMzU2Nop+w95yUcHLazPRxiDNmCGkQ536f3wlvWwIgYIabeOoQxF86TWx1DCc+ZXb3oY6Eg8GhgCRzh1KHh58="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:3a388d8a-ae03-447a-8916-ba9b28a6fa9a"}},"directories":{},"maintainers":[{"name":"lamtuanvu","email":"lamtuanvuqs@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/node-design-seam_0.1.8_1786541683005_0.9755644476128627"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-11T05:40:08.938Z","modified":"2026-08-12T13:34:43.436Z","0.1.1":"2026-08-11T05:40:09.201Z","0.1.3":"2026-08-11T06:07:56.385Z","0.1.4":"2026-08-12T03:12:53.898Z","0.1.5":"2026-08-12T03:45:45.986Z","0.1.6":"2026-08-12T04:12:06.272Z","0.1.7":"2026-08-12T04:13:15.880Z","0.1.8":"2026-08-12T13:34:43.156Z"},"bugs":{"url":"https://github.com/econ-v1/node-design-seam/issues"},"license":"AGPL-3.0-only","homepage":"https://github.com/econ-v1/node-design-seam#readme","repository":{"type":"git","url":"git+https://github.com/econ-v1/node-design-seam.git"},"description":"Vendored design drops + data-slot wiring: the closed-vocabulary seam runtime and the pin/bindings/verify CLI","maintainers":[{"name":"lamtuanvu","email":"lamtuanvuqs@gmail.com"}],"readme":"# @econ-v1/node-design-seam\n\n[![npm](https://img.shields.io/npm/v/@econ-v1/node-design-seam.svg)](https://www.npmjs.com/package/@econ-v1/node-design-seam)\n\nVendored design drops + data-slot wiring. A designer ships a folder of hash-pinned\nfiles — markup, CSS, view modules — that the product renders byte-for-byte.\nIntegration binds live kernel data into it through a write vocabulary too narrow to\ncarry a restyle: set text, set one allowlisted attribute, toggle a state attribute\nthe design itself declared. Nothing in that vocabulary can write a class, a style,\nor an element. The CLI (`pin` / `bindings` / `verify` / `adopt`) is the CI gate that\nkeeps the tree honest about it, and `preview` lets the designer render the drop\nthrough that same runtime before anyone integrates it.\n\nThis package ships three things:\n\n- a small runtime (`createSeam`, `mountDropFragment`, `wireStage`, `applyBindings`)\n  that a stage's own entry module calls to mount a drop and feed it data;\n- a CLI (`node-design-seam`) that hashes, scans, and verifies a drop against a\n  per-app config file;\n- a teaching layer — the docs below, a skill for each side of the seam\n  (`drop-authoring` for the designing agent, `node-design-seam` for the integrating\n  one), and an `AGENTS.md` template that travels inside the drop.\n\n## Documentation\n\nFull docs live in [`docs/`](docs/README.md) and ship inside the published tarball.\n\n| | |\n| --- | --- |\n| [Getting started](docs/getting-started.md) | install → adopt → wire → verify, end to end |\n| [Working in parallel](docs/workflow.md) | designer previews with no stack, developer wires with no data |\n| [Concepts](docs/concepts.md) | drops, slots, the seam, and the two hash layers |\n| [Write vocabulary](docs/write-vocabulary.md) | the three forms, the seven attributes, and what they can't reach |\n| [Configuration](docs/configuration.md) | every config key, its default, and what rejects it |\n| [CLI](docs/cli.md) | the four commands: flags, output, exit codes |\n| [Runtime API](docs/api.md) | full signatures and types |\n| [Troubleshooting](docs/troubleshooting.md) | a decoder for every `verify` failure |\n| [CHANGELOG](CHANGELOG.md) | **read before upgrading** — three past releases failed silently |\n\nTwo agent skills and one template ship alongside, each written for one side of the seam:\n\n| | |\n| --- | --- |\n| `skills/drop-authoring/SKILL.md` | **designer** — is this a drop change at all, the authoring sequence, the five fixture states, verification before hand-off |\n| `skill/SKILL.md` | **integrator** — the adopt/wire/verify runbook, the hard rules, a decoder for every gate failure |\n| `templates/AGENTS.stage-drop.md` | the drop contract itself: copied into a new drop's root as `AGENTS.md`, carrying the `contract:` line the CLI version-gates against |\n\n## Install\n\n```sh\nnpm i -D @econ-v1/node-design-seam\n```\n\nNode 18+. The CLI is invoked via the `node-design-seam` bin it installs; the runtime\nis imported at the top of a stage's entry module:\n\n```js\nimport { createSeam, mountDropFragment, wireStage } from \"@econ-v1/node-design-seam\";\n```\n\nTypeScript declarations ship with the package (generated from the same JSDoc\n`checkJs` type-checks — see [Runtime API](docs/api.md#types)), so this resolves\nwith no `@ts-expect-error`, `Binding` included.\n\n## Quick start\n\nA stage entry mounts the drop's own bytes, creates a seam over the mounted root, and\nwires kernel live queries into it — lifecycle-paired to `mount(ctx)` / `unmount()`:\n\n```js\n// ui/src/main.js — the stage entry (developer-owned)\nimport { createSeam, mountDropFragment, wireStage } from \"@econ-v1/node-design-seam\";\nimport BINDINGS from \"./design/bindings.gen.js\";\nimport cards from \"../../design/wallet-stage-v1/views/cards.view.js\";\nimport DROP_HTML from \"../../design/wallet-stage-v1/stage.html?raw\";\nimport DROP_CSS from \"../../design/wallet-stage-v1/stage.css?raw\";\n\nlet seam, unwire;\n\nexport async function mount(ctx) {\n  const { root } = mountDropFragment({ host: ctx.host.root, html: DROP_HTML, css: [DROP_CSS] });\n  seam = createSeam({ root, bindings: BINDINGS, views: [cards] });\n  unwire = wireStage(seam, ctx, {\n    snapshot: { query: \"wallet.summary.v1\", params: {}, project: toSummarySnapshot },\n    views: { \"wallet.cards\": { query: \"wallet.cards.v1\", params: {}, project: toCardsModel } },\n  });\n}\n\nexport async function unmount() {\n  unwire?.();\n  seam?.dispose();\n}\n```\n\n`mountDropFragment` hosts the drop's `html`/`css` verbatim, by default inside a shadow\nroot. `createSeam` returns an instance scoped to that root — `update(snapshot)` drives\nthe scalar bindings, `feedView(id, data)` re-renders a view module into the element\ncarrying its `data-view-slot=\"<id>\"`. `wireStage` is optional sugar returning a\ndisposer for `unmount()`.\n\nThe `project` functions are the kernel→slot mapping. They conform kernel view-models\nto the *design's* slot names, and must return plain data, never markup.\n\nWalked through step by step in [Getting started](docs/getting-started.md); full\nsignatures in the [Runtime API](docs/api.md).\n\n## The write vocabulary\n\nThe design declares its slots in its own markup. The applier can do nothing that\nisn't one of these three forms:\n\n| In the drop's markup | What integration may do |\n| --- | --- |\n| `data-bind=\"slot.path\"` | replace the element's `textContent` — never its markup |\n| `data-bind-attr=\"attrName:slot.path\"` | set an allowlisted attribute (several comma-separated pairs allowed) |\n| `data-bind-when=\"slot.path\"` | toggle `hidden` when the value is falsy |\n\nThe allowlist is exactly seven names — `aria-label`, `aria-valuenow`, `data-count`,\n`data-state`, `hidden`, `href`, `title`. `class`, `style` and `id` are excluded and\nthe applier has no branch that writes them. That absence is the mechanism: \"integration\ncannot restyle the design\" is a property of the code, not a rule to remember.\n\nContinuous geometry (chart paths, bar widths), values carrying structure inside a\nstring, and theme cannot be expressed this way — and the answer is never a new verb.\nSee [Write vocabulary](docs/write-vocabulary.md).\n\n## Configuration\n\nOne `node-design-seam.config.json` per app repo. Three keys are required:\n\n```json\n{\n  \"dropRoot\": \"design/wallet-stage-v1\",\n  \"manifestOut\": \"ui/src/design/drop-manifest.js\",\n  \"bindingsOut\": \"ui/src/design/bindings.gen.js\"\n}\n```\n\n`notDropContent`, `legacyAnchors` and `unwired` default sensibly. All paths resolve\nrelative to the config file. Pass a different path with `--config <path>`.\nFull reference: [Configuration](docs/configuration.md).\n\n## Commands\n\n| | |\n| --- | --- |\n| `node-design-seam pin` | hashes every drop file into `manifestOut`. Adoption only — regenerating it to silence a failing `verify` is the one canonical misuse |\n| `node-design-seam bindings` | scans the drop's `data-bind*` attributes into `bindingsOut`; refuses to write on any scan error |\n| `node-design-seam verify` | the CI gate: integrity, anchors, contract coverage, freshness, plus the contract-version gate |\n| `node-design-seam adopt <path>` | the runbook as one command — place, re-point, pin, regenerate, and print the contract diff |\n| `node-design-seam preview` | serves the drop through the real runtime for authoring and goldens; `--drop <path>` needs no config |\n\n```json\n\"scripts\": {\n  \"build\": \"vite build && node-design-seam verify\",\n  \"verify:design\": \"node-design-seam verify\"\n}\n```\n\nFull reference: [CLI](docs/cli.md).\n\n## Two hash layers, two lifecycles\n\nThe seam manifest (`manifestOut`, from `pin`) records *what design shipped*: it\nchanges only at adoption and gates the source tree. An app manifest's `ui.integrity`\nrecords *what this build ships*: restamped every build, gating delivery and the\nshell's cache verification on load. `verify` runs **before** stamping, so a tampered\ndrop can never launder itself into a validly-stamped package — the build fails at the\nseam gate first. Detail in [Concepts](docs/concepts.md#two-hash-layers-two-lifecycles).\n\n## Contributing\n\nGates, the rules a contributor must not break, and the release process are in\n[CONTRIBUTING.md](CONTRIBUTING.md).\n\n## License\n\n[GNU Affero General Public License v3.0 only](LICENSE) (`AGPL-3.0-only`).\n\nVersions 0.1.1 through 0.1.7 were published under `MIT OR Apache-2.0`; that grant\nstill stands for those releases.\n\n## Further reading\n\n- Framework design (locked): `docs/superpowers/specs/2026-08-10-design-seam-framework-design.md` in the `econ-v1/node` repo.\n- The contract this package implements: `docs/design/DATA_SLOT_CONTRACT.md` in the `econ-v1/node` repo.\n","readmeFilename":"README.md"}