9 soma component READMEs imported from the removed $lib/util/dias and
$lib/util/colors aliases → $libs/days / $libs/color (matches what the code
actually imports). morfo/README.md said "All 66 morfos" (real count ~116) →
reworded to "Every morfo in the codebase" to drop the brittle number.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@ -380,7 +380,7 @@ The `as const satisfies Morfo` pattern is **mandatory**, not cosmetic. It does t
- **`as const`** preserves the literal types (`kebab: 'dialog'`, not `string`). This is what lets `createAttrs(dialogMorfo)` return `{ provider: 'data-dialog'; trigger: 'data-dialog-trigger'; ... }` with autocomplete and typo detection in every provider that consumes the morfo.
- **`satisfies Morfo`** validates that the object conforms to the `Morfo` interface without widening it. If a field is missing or mistyped, TypeScript reports it at the declaration — same safety as `: Morfo =` annotation, without the type widening.
A morfo annotated `: Morfo =` still works at runtime but yields `createAttrs(...): Record<string, string>` — no autocomplete, `attrs.trigerr` compiles. All 66 morfos in the codebase use `as const satisfies Morfo`; new morfos must do the same.
A morfo annotated `: Morfo =` still works at runtime but yields `createAttrs(...): Record<string, string>` — no autocomplete, `attrs.trigerr` compiles. Every morfo in the codebase use `as const satisfies Morfo`; new morfos must do the same.
---
@ -857,7 +857,7 @@ attrs.trigerr; // compile error — no such part
attrs.trigger; // typed as 'data-dialog-trigger'
```
All 66 morfos in the codebase use the `as const satisfies Morfo` form. This is mandatory, not stylistic.
Every morfo in the codebase use the `as const satisfies Morfo` form. This is mandatory, not stylistic.
**Duplicate kebab in the tree.** `item` in one part and `item` in another = error. Rename one.