Two changes that ship together because the visual rework was masking the
real bug:
1. `readSlots` (and the title/category/description reads in
`renderPreviewCard`) were looking at static `nodeClass.INPUT_TYPES` /
`RETURN_TYPES` properties, which **don't exist** on
ComfyUI-registered nodes — ComfyUI parks the original V1 def at
`nodeClass.nodeData` (set by `litegraphService.ts`'s
`registerNodeDef` right before `LiteGraph.registerNodeType`). Every
card was rendering as just header-and-badge because the slot arrays
came back empty for every ComfyUI node. Reading from `nodeData`
first (with the old property names as a legacy fallback for any
non-ComfyUI registered nodes) fixes the empty-card class.
2. Visual rework to look like a real node mock instead of a generic
info card. Mirrors upstream NodePreview.vue more faithfully: flat
header row (small colored dot + display name) over a red PREVIEW
badge; slot rows in a 5-column grid (`[dot] [input-name] [spacer]
[output-name] [dot]`) so inputs and outputs line up horizontally as
parallel sockets; widgets rendered as individual rounded pills with
`◀ name [spacer] value ▶` chrome to mimic LiteGraph widget UI.
Closes#78
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>