Codify attribution before the sidebar gets more visibility. NOTICE is the
single human-readable source of truth — copyright statement, plain-English
attribution request with a copy-pasteable credit line, pointer to LICENSE
and forks/THIRD_PARTY.md so it shows the project respects others'
attribution too.
SPDX-FileCopyrightText / SPDX-License-Identifier headers added at the top
of every web/*.js (entry point + sidebar/ + ai_pipeline) so license
scanners (GitHub, FOSSA, reuse-tool) parse each file correctly and
stripped-attribution forks become an obviously deliberate act rather than
"I forgot to copy a file."
GPL-3.0-only matches the LICENSE file (no "or later" wording in it). Year
range 2025-2026 spans first commit (2025-09-28) to today.
Comment-only change — no runtime impact.
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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>
* feat(sidebar): category mode + flatten-on-search + hover preview (#73)
Three navigation/discoverability improvements to the Kforge Labs sidebar's
Nodes section, shipped together:
1. Category-first grouping mode. Segmented toggle in the Nodes action row
(📦 Repository / 🌐 Category) re-groups picks by their node-class
CATEGORY path instead of by repo, with canonical-key normalization
(`lower().replace(/[\s_-]+/g, "")`) so `Loaders`/`loaders` and
`Image/Upscaling`/`image/upscaling` collapse into one folder. Synthetic
`(unresolved)` and `(uncategorized)` buckets surface picks whose pack
isn't loaded or whose class has no CATEGORY. Pack-name badge on
category-mode leaves preserves the source signal. Mode persists in
localStorage with cross-tab sync.
2. Flatten-on-search. When the search field is non-empty the Nodes
section drops its tree structure and renders a flat list of matching
leaves with `Cat › Subcat › Display` breadcrumb prefixes. Workflows
and Tags sections retain their tree-under-filter behavior — the
change is scoped to Nodes only.
3. Hover preview card. Mirrors ComfyUI's official NodePreview.vue: plain
HTML/CSS card with a colored title bar (HSL hue from CATEGORY hash),
two columns of type-colored slot dots (reads
`app.canvas.default_connection_color_byType` first, falls back to
LiteGraph's static palette), widgets with truncated defaults,
optional description. 250ms hover debounce, viewport-flip, max-height
cap, pointer-events: none, leak-proof teardown wired into renderTree.
"Pack not loaded" stub for unresolved picks. New module
`web/sidebar/node_preview.js` holds the engine; one
`attachHoverPreview(row, type)` call inside `makeNodeLeafRow` covers
every leaf-emit site (repo tree, category tree, flat search).
Closes#73
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* fix(sidebar): preview review-fixes — log INPUT_TYPES errors, teardown on tab/blur, type-guard slot colors
Three small additive fixes from the multi-agent review on PR #74:
1. console.warn when INPUT_TYPES() throws so a broken pack is visible
during debugging instead of silently rendering an empty-looking node.
Matches the project-wide convention (picks_store.js, canvas_io.js,
installer.js).
2. visibilitychange + window.blur listeners that call teardownPreview.
Closes the leak path where the user navigates away mid-hover via
keyboard sidebar-tab switch, modal stealing focus, or page hiding —
none of which cross a row's mouseleave region, so the reactive
teardown never fired and the pointer-events:none card sat on screen
undismissable.
3. typeof === "string" guard on both fallback branches in slotColor so
a misbehaving custom-node pack injecting a non-string into
default_connection_color_byType produces a visible neutral-grey dot
instead of a silent transparent dot.
The category_grouping.js extraction (MEDIUM finding, file split) is
queued as a separate follow-up issue per the "one PR per topic" rule
in CLAUDE.md — pure no-behavior refactor, lands cleaner on its own.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>