your personal website on atproto - mirror blento.app

schema: typed node envelope — content.$type (data) + style.renderer (render) master

Locks in the designed schema (blento-schema-design.md): drop the top-level `type` string; the node carries `content` (data, $type = shape), `layout` ($type = contract), `style` ({renderer?, tokens?}), `source`. Two decoupled axes — content.$type is the data shape, style.renderer is the render type (defaults from content.$type). - node.ts: new Node/Content/Layout/Style/Source; def NSID constants. - migrate.ts: buildGraph emits content {$type:#card/#container, cardType/containerType, ...data}, layout {$type:#gridCell, ...}, style {tokens:{color}}; nodesToItems inverts. Migration uses the generic #card/#container fallbacks (typed #link/#image are additive). - serialize.ts: record shape follows (content required, type/data gone). - lexicons: app.blento.node (content/layout/style/source), new app.blento.defs (#card/#container/#gridCell). Still free to change — nothing reads app.blento.node in prod yet. Validated: schema tsc + 17 tests; real-data save→read lossless (saveReadFail 0); render gate pixel 0px (content-diff residue is localhost-vs-prod self-links + avatar CDN transform, both profile/env, untouched here). App svelte-check 0/0.


+160 -83
6 changed files