Selecting a preset now updates slider values in real-time via a frontend JS extension, and users can tweak values after selecting. Sliders are always visible (removed optional=True). Preset values live only in JS (single source of truth); Python keeps just the name list for the combo widget. Sync only fires on explicit user dropdown interaction, preserving saved slider tweaks on workflow load.
46 lines
1.2 KiB
Python
46 lines
1.2 KiB
Python
"""ComfyUI-LCS: The Latent Color Subspace — training-free color control for FLUX.
|
|
|
|
Paper: "The Latent Color Subspace" (arXiv:2603.12261v1, ICML 2026)
|
|
"""
|
|
|
|
# V3 ComfyExtension entry point
|
|
from comfy_api.latest import ComfyExtension, io
|
|
from .nodes.calibrate import LCSCalibrate, LCSLoadData
|
|
from .nodes.intervene import LCSColorIntervene, LCSColorBatch, LCSToneAdjust
|
|
from .nodes.observe import LCSPreviewColors, LCSStepObserver
|
|
|
|
|
|
class LCSExtension(ComfyExtension):
|
|
"""V3 ComfyExtension providing all LCS nodes to ComfyUI."""
|
|
|
|
async def get_node_list(self) -> list[type[io.ComfyNode]]:
|
|
"""Return all LCS node classes."""
|
|
return [
|
|
LCSCalibrate,
|
|
LCSLoadData,
|
|
LCSColorIntervene,
|
|
LCSColorBatch,
|
|
LCSToneAdjust,
|
|
LCSPreviewColors,
|
|
LCSStepObserver,
|
|
]
|
|
|
|
|
|
async def comfy_entrypoint() -> LCSExtension:
|
|
"""V3 async entry point called by ComfyUI on startup."""
|
|
return LCSExtension()
|
|
|
|
|
|
# V2 backward compatibility
|
|
from .nodes import NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS
|
|
|
|
WEB_DIRECTORY = "./web"
|
|
|
|
__all__ = [
|
|
"NODE_CLASS_MAPPINGS",
|
|
"NODE_DISPLAY_NAME_MAPPINGS",
|
|
"WEB_DIRECTORY",
|
|
"LCSExtension",
|
|
"comfy_entrypoint",
|
|
]
|