The local cn() joined classes with filter(Boolean).join(' '), which doesn't
dedupe conflicting Tailwind utilities — consumer className overrides could
silently lose to the component's base classes. Switch to the standard
twMerge(clsx(...)) (clsx + tailwind-merge are already app deps). Behaviour is
unchanged except conflicting overrides now win correctly. Build-verified
(skyai-finance clean; vibespace transforms all modules). Frontend audit rank 4.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Libs shipped as bare source with no manifest — consumable only via per-app
vite/tsconfig alias surgery, no version contract, no tree-shaking signal.
Add a minimal package.json matching the @crema/content-ui template: entry +
exports map, declared peerDependencies, sideEffects:false. Mechanical, no
code change. Frontend audit 2026-06-20, rank 2.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Drops the tracking-wide uppercase micro-label treatment for a 13px
sentence-case header — softer fit for consumer surfaces.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
RecordCard / RecordGroupSection / TierBadge / RecordKindIcon, FieldTable
+ spec-driven FieldInputs + KeyValueEditor, the marquee RecordsEmpty,
renderRecordMd (mirror of the personal cloud's server renderer), and
parseMrzTd3 — a fully-local TD3 passport MRZ parser with check-digit
verification (validated against the ICAO Doc 9303 specimen).
Token-themed; lucide-react is the only dep (Crema shared-dep aliasing).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>