diff --git a/README.md b/README.md index cfc983bd..306339da 100644 --- a/README.md +++ b/README.md @@ -86,6 +86,7 @@ This repository provides Colab notebooks that allow you to install and use Comfy * Support for automatically installing dependencies of custom nodes upon restarting Colab notebooks. ## Changes +* **2.38** `Install Custom Nodes` menu is changed to `Custom Nodes Manager`. * **2.21** [cm-cli](docs/en/cm-cli.md) tool is added. * **2.4** Copy the connections of the nearest node by double-clicking. * **2.2.3** Support Components System @@ -278,11 +279,11 @@ NODE_CLASS_MAPPINGS.update({ ## Support of missing nodes installation -![missing-menu](misc/missing-menu.png) +![missing-menu](misc/missing-menu.jpg) * When you click on the ```Install Missing Custom Nodes``` button in the menu, it displays a list of extension nodes that contain nodes not currently present in the workflow. -![missing-list](misc/missing-list.png) +![missing-list](misc/missing-list.jpg) ## Additional Feature diff --git a/custom-node-list.json b/custom-node-list.json index 8edf826a..181e2f5c 100644 --- a/custom-node-list.json +++ b/custom-node-list.json @@ -4014,6 +4014,17 @@ "install_type": "git-clone", "description": "Animated optical illusions in ComfyUI" }, + { + "author": "ZHO-ZHO-ZHO", + "title": "ComfyUI-Qwen-2", + "id": "qwen-2", + "reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen-2", + "files": [ + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen-2" + ], + "install_type": "git-clone", + "description": "Using Qwen-2 in ComfyUI" + }, { "author": "kenjiqq", "title": "qq-nodes-comfyui", @@ -7445,7 +7456,7 @@ }, { "author": "MarkoCa1", - "title": "ComfyUI_Text", + "title": "ComfyUI-Text", "reference": "https://github.com/MarkoCa1/ComfyUI-Text", "files": [ "https://github.com/MarkoCa1/ComfyUI-Text" @@ -7516,7 +7527,7 @@ "https://github.com/daxcay/ComfyUI-DRMN" ], "install_type": "git-clone", - "description": "Data Research And Manipulators Nodes for Model Trainers, Artists, Designers and Animators. Captions, Visualizer, Text Manipulator" + "description": "Data Research And Manipulators Nodes for Model Trainers, Artists, Designers and Animators. Captions, Visualizer, Text Manipulator\nNOTE: This repo is renamed to ComfyUI-DataSet." }, { "author": "daxcay", @@ -8315,6 +8326,17 @@ "install_type": "git-clone", "description": "This node allows you to use customnet." }, + { + "author": "smthemex", + "title": "ComfyUI_Pops", + "id": "pops", + "reference": "https://github.com/smthemex/ComfyUI_Pops", + "files": [ + "https://github.com/smthemex/ComfyUI_Pops" + ], + "install_type": "git-clone", + "description": "You can use [a/Popspaper](https://popspaper.github.io/pOps/) method in comfyUI" + }, { "author": "choey", "title": "Comfy-Topaz", @@ -10079,17 +10101,6 @@ "install_type": "git-clone", "description": "ComfyUI implementation of [a/FlashFace: Human Image Personalization with High-fidelity Identity Preservation](https://github.com/ali-vilab/FlashFace)\nNOTE: You need to downalod models manually." }, - { - "author": "LZpenguin", - "title": "ComfyUI-Text", - "id": "comfy-text", - "reference": "https://github.com/LZpenguin/ComfyUI-Text", - "files": [ - "https://github.com/LZpenguin/ComfyUI-Text" - ], - "install_type": "git-clone", - "description": "Nodes:Add_text_by_mask" - }, { "author": "denfrost", "title": "Den_ComfyUI_Workflows", @@ -10166,6 +10177,17 @@ "install_type": "git-clone", "description": "A set of tools for generating and altering sigmas in ComfyUI." }, + { + "author": "shobhitic", + "title": "PlusMinusTextClip", + "id": "plusminustextclip", + "reference": "https://github.com/shobhitic/ComfyUI-PlusMinusTextClip", + "files": [ + "https://github.com/shobhitic/ComfyUI-PlusMinusTextClip" + ], + "install_type": "git-clone", + "description": "This adds a node that has both the positive and negative prompts as input in one node. You can just add one node and be done with both Positive and Negative prompts, in place of adding two different nodes for them." + }, diff --git a/extension-node-map.json b/extension-node-map.json index dac8d1f5..e09cc75c 100644 --- a/extension-node-map.json +++ b/extension-node-map.json @@ -2506,17 +2506,6 @@ "title_aux": "ImagesGrid" } ], - "https://github.com/LZpenguin/ComfyUI-Text": [ - [ - "CombinationText", - "PlaceholderText", - "ReplaceText", - "ShowText" - ], - { - "title_aux": "ComfyUI-Text" - } - ], "https://github.com/LarryJane491/Image-Captioning-in-ComfyUI": [ [ "LoRA Caption Load", @@ -2796,6 +2785,17 @@ "title_aux": "ComfyUI-BadmanNodes" } ], + "https://github.com/MarkoCa1/ComfyUI-Text": [ + [ + "CombinationText", + "PlaceholderText", + "ReplaceText", + "ShowText" + ], + { + "title_aux": "ComfyUI-Text" + } + ], "https://github.com/MarkoCa1/ComfyUI_Segment_Mask": [ [ "AutomaticMask(segment anything)" @@ -5160,6 +5160,16 @@ "title_aux": "ComfyUI-Q-Align" } ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen-2": [ + [ + "Qwen2_Chat_Zho", + "Qwen2_ModelLoader_Zho", + "Qwen2_Zho" + ], + { + "title_aux": "ComfyUI-Qwen-2" + } + ], "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen-VL-API": [ [ "QWenVL_API_S_Multi_Zho", @@ -5766,6 +5776,7 @@ "Bedrock - Claude Multimodal", "Bedrock - SDXL", "Bedrock - Titan Inpainting", + "Bedrock - Titan Outpainting", "Bedrock - Titan Text to Image", "Image From S3", "Image From URL", @@ -5860,6 +5871,8 @@ "Mikey Sampler Base Only Advanced", "Mikey Sampler Tiled", "Mikey Sampler Tiled Base Only", + "MikeyLatentTileSampler", + "MikeyLatentTileSamplerCustom", "MikeySamplerTiledAdvanced", "MikeySamplerTiledAdvancedBaseOnly", "MosaicExpandImage", @@ -6875,9 +6888,11 @@ "LayerColor: Levels", "LayerColor: RGB", "LayerColor: YUV", + "LayerFilter: AddGrain", "LayerFilter: ChannelShake", "LayerFilter: ColorMap", "LayerFilter: Film", + "LayerFilter: FilmV2", "LayerFilter: GaussianBlur", "LayerFilter: HDREffects", "LayerFilter: LightLeak", @@ -6897,6 +6912,7 @@ "LayerMask: MaskEdgeUltraDetail", "LayerMask: MaskEdgeUltraDetail V2", "LayerMask: MaskGradient", + "LayerMask: MaskGrain", "LayerMask: MaskGrow", "LayerMask: MaskInvert", "LayerMask: MaskMotionBlur", @@ -6947,6 +6963,7 @@ "LayerUtility: GetImageSize", "LayerUtility: GradientImage", "LayerUtility: GradientImage V2", + "LayerUtility: HLFrequencyDetailRestore", "LayerUtility: ImageAutoCrop", "LayerUtility: ImageAutoCrop V2", "LayerUtility: ImageBlend", @@ -9324,6 +9341,8 @@ "load_url", "load_wikipedia", "new_interpreter_tool", + "openai_tts", + "play_audio", "show_text_party", "start_dialog", "start_workflow", @@ -10715,8 +10734,10 @@ "https://github.com/ljleb/comfy-mecha": [ [ "Blocks Mecha Hyper", - "Custom Code Mecha Recipe", + "Float Mecha Hyper", + "Mecha Custom Code Recipe", "Mecha Merger", + "Mecha Recipe List", "Model Mecha Recipe" ], { @@ -11001,6 +11022,7 @@ "ImpactControlNetApplySEGS", "ImpactControlNetClearSEGS", "ImpactConvertDataType", + "ImpactCount_Elts_in_SEGS", "ImpactDecomposeSEGS", "ImpactDilateMask", "ImpactDilateMaskInSEGS", @@ -11302,6 +11324,8 @@ ], "https://github.com/marduk191/comfyui-marnodes": [ [ + "marduk191_5_text_string", + "marduk191_5way_text_switch", "marduk191_workflow_settings" ], { @@ -12602,6 +12626,7 @@ "ChatGPTOpenAI", "CkptNames_", "Color", + "CombineAudioVideo", "ComparingTwoFrames_", "CompositeImages_", "DynamicDelayProcessor", @@ -12614,6 +12639,7 @@ "Font", "GLIGENTextBoxApply_Advanced", "GamePal", + "GenerateFramesByCount", "GetImageSize_", "GradientImage", "GridDisplayAndSave", @@ -12622,12 +12648,14 @@ "ImageColorTransfer", "ImageCropByAlpha", "ImageListReplace_", + "ImageListToBatch_", "ImagesPrompt_", "IncrementingListNode_", "IntNumber", "JoinWithDelimiter", "LimitNumber", "ListSplit_", + "LoadAndCombinedAudio_", "LoadImagesFromPath", "LoadImagesFromURL", "LoadImagesToBatch", @@ -12653,6 +12681,7 @@ "SaveImageAndMetadata_", "SaveImageToLocal", "SaveTripoSRMesh", + "ScenesNode_", "ScreenShare", "Seed_", "ShowLayer", @@ -12762,6 +12791,14 @@ "title_aux": "ComfyUI-send-Eagle(slim)" } ], + "https://github.com/shobhitic/ComfyUI-PlusMinusTextClip": [ + [ + "PlusMinusTextClip" + ], + { + "title_aux": "PlusMinusTextClip" + } + ], "https://github.com/shockz0rz/ComfyUI_InterpolateEverything": [ [ "OpenposePreprocessorInterpolate" @@ -12980,6 +13017,20 @@ "title_aux": "ComfyUI_Pipeline_Tool" } ], + "https://github.com/smthemex/ComfyUI_Pops": [ + [ + "Imgae_To_Path", + "Pops_Controlnet_Sampler", + "Pops_Ipadapter_Sampler", + "Pops_Mean_Sampler", + "Pops_Prior_Embedding", + "Pops_Repo_Choice", + "Pops_Unet_Sampler" + ], + { + "title_aux": "ComfyUI_Pops" + } + ], "https://github.com/smthemex/ComfyUI_StableAudio_Open": [ [ "StableAudio_Open", @@ -13733,14 +13784,15 @@ ], "https://github.com/vanche1212/ComfyUI-ZMG-Nodes": [ [ + "VC_Load_Video_Path_Unified_Output", + "VC_Load_Video_Upload_Unified_Output", + "VC_Video_Combine_Unified_Output", "Waveform2Audio", "\ud83d\ude0bAPI Request Node", "\ud83d\ude0bJSON Parser Node", - "\ud83d\ude0bLoad Video Path Unified Output", "\ud83d\ude0bOld Photo Colorization Node", "\ud83d\ude0bOllama Request Node", - "\ud83d\ude0bSave Image Unified Output", - "\ud83d\ude0bVideo Combine Unified Output" + "\ud83d\ude0bSave Image Unified Output" ], { "title_aux": "ZMG PLUGIN" diff --git a/github-stats.json b/github-stats.json index 6a91454a..08a6ee5d 100644 --- a/github-stats.json +++ b/github-stats.json @@ -2,4656 +2,4671 @@ "https://github.com/0xbitches/ComfyUI-LCM": { "stars": 245, "last_update": "2023-11-11 21:24:33", - "author_account_age_days": 518 + "author_account_age_days": 519 }, "https://github.com/1038lab/ComfyUI-GPT2P": { "stars": 3, "last_update": "2024-06-10 16:56:29", - "author_account_age_days": 438 + "author_account_age_days": 440 }, "https://github.com/11cafe/comfyui-workspace-manager": { - "stars": 759, + "stars": 760, "last_update": "2024-06-05 11:38:13", - "author_account_age_days": 191 + "author_account_age_days": 192 }, "https://github.com/11dogzi/Comfyui-ergouzi-Nodes": { "stars": 15, "last_update": "2024-05-23 00:08:39", - "author_account_age_days": 111 + "author_account_age_days": 113 }, "https://github.com/11dogzi/Comfyui-ergouzi-samplers": { "stars": 13, "last_update": "2024-06-05 13:53:28", - "author_account_age_days": 111 + "author_account_age_days": 113 }, "https://github.com/1mckw/Comfyui-Gelbooru": { "stars": 2, "last_update": "2024-05-27 07:45:00", - "author_account_age_days": 676 + "author_account_age_days": 678 }, "https://github.com/42lux/ComfyUI-safety-checker": { "stars": 17, "last_update": "2024-05-22 22:11:59", - "author_account_age_days": 3685 + "author_account_age_days": 3686 }, "https://github.com/438443467/ComfyUI-GPT4V-Image-Captioner": { "stars": 17, "last_update": "2024-06-10 16:56:40", - "author_account_age_days": 400 + "author_account_age_days": 402 }, "https://github.com/54rt1n/ComfyUI-DareMerge": { "stars": 35, "last_update": "2024-05-22 22:20:39", - "author_account_age_days": 4037 + "author_account_age_days": 4038 }, "https://github.com/80sVectorz/ComfyUI-Static-Primitives": { "stars": 10, "last_update": "2024-05-23 11:20:57", - "author_account_age_days": 1457 + "author_account_age_days": 1458 }, "https://github.com/A4P7J1N7M05OT/ComfyUI-AutoColorGimp": { "stars": 0, "last_update": "2024-05-23 00:26:10", - "author_account_age_days": 459 + "author_account_age_days": 460 }, "https://github.com/A4P7J1N7M05OT/ComfyUI-PixelOE": { "stars": 6, "last_update": "2024-06-02 14:57:59", - "author_account_age_days": 459 + "author_account_age_days": 460 }, "https://github.com/AARG-FAN/Image-Raster-for-ComfyUI": { - "stars": 52, + "stars": 59, "last_update": "2024-06-02 08:31:12", - "author_account_age_days": 485 + "author_account_age_days": 487 }, "https://github.com/AI2lab/comfyUI-DeepSeek-2lab": { "stars": 2, "last_update": "2024-06-06 23:11:12", - "author_account_age_days": 178 + "author_account_age_days": 180 }, "https://github.com/AIFSH/ComfyUI-FishSpeech": { "stars": 6, "last_update": "2024-05-23 01:18:49", - "author_account_age_days": 217 + "author_account_age_days": 219 }, "https://github.com/AIFSH/ComfyUI-GPT_SoVITS": { "stars": 146, "last_update": "2024-05-15 01:13:11", - "author_account_age_days": 217 + "author_account_age_days": 219 }, "https://github.com/AIFSH/ComfyUI-IP_LAP": { "stars": 22, "last_update": "2024-04-30 01:42:53", - "author_account_age_days": 217 + "author_account_age_days": 219 }, "https://github.com/AIFSH/ComfyUI-Live2DViewer": { "stars": 2, "last_update": "2024-05-23 11:55:50", - "author_account_age_days": 217 + "author_account_age_days": 219 }, "https://github.com/AIFSH/ComfyUI-MuseTalk_FSH": { "stars": 5, "last_update": "2024-05-22 01:13:47", - "author_account_age_days": 217 + "author_account_age_days": 219 }, "https://github.com/AIFSH/ComfyUI-RVC": { "stars": 7, "last_update": "2024-04-30 09:22:22", - "author_account_age_days": 217 + "author_account_age_days": 219 }, "https://github.com/AIFSH/ComfyUI-UVR5": { "stars": 53, "last_update": "2024-05-09 13:19:51", - "author_account_age_days": 217 + "author_account_age_days": 219 }, "https://github.com/AIFSH/ComfyUI-WhisperX": { - "stars": 16, + "stars": 17, "last_update": "2024-05-06 06:25:52", - "author_account_age_days": 217 + "author_account_age_days": 219 }, "https://github.com/AIFSH/ComfyUI-XTTS": { "stars": 17, "last_update": "2024-05-11 03:30:10", - "author_account_age_days": 217 + "author_account_age_days": 219 }, "https://github.com/AIFSH/ComfyUI_V-Express": { - "stars": 68, + "stars": 72, "last_update": "2024-06-07 07:35:21", - "author_account_age_days": 217 + "author_account_age_days": 219 }, "https://github.com/AIGCTeam/ComfyUI_kkTranslator_nodes": { "stars": 5, "last_update": "2024-05-23 00:13:50", - "author_account_age_days": 196 + "author_account_age_days": 198 }, "https://github.com/AIGODLIKE/AIGODLIKE-COMFYUI-TRANSLATION": { - "stars": 821, - "last_update": "2024-06-02 17:30:21", - "author_account_age_days": 487 + "stars": 826, + "last_update": "2024-06-12 06:26:04", + "author_account_age_days": 489 }, "https://github.com/AIGODLIKE/AIGODLIKE-ComfyUI-Studio": { - "stars": 199, + "stars": 201, "last_update": "2024-06-05 00:52:46", - "author_account_age_days": 487 + "author_account_age_days": 489 }, "https://github.com/AIGODLIKE/ComfyUI-CUP": { "stars": 4, "last_update": "2024-05-19 02:31:04", - "author_account_age_days": 487 + "author_account_age_days": 489 }, "https://github.com/AIGODLIKE/ComfyUI-ToonCrafter": { - "stars": 198, + "stars": 207, "last_update": "2024-06-03 11:42:25", - "author_account_age_days": 487 + "author_account_age_days": 489 }, "https://github.com/AInseven/ComfyUI-fastblend": { "stars": 99, "last_update": "2024-04-03 11:50:44", - "author_account_age_days": 1669 + "author_account_age_days": 1670 }, "https://github.com/AIrjen/OneButtonPrompt": { "stars": 722, "last_update": "2024-06-10 18:34:16", - "author_account_age_days": 429 + "author_account_age_days": 430 }, "https://github.com/ALatentPlace/ComfyUI_yanc": { - "stars": 13, - "last_update": "2024-06-10 16:56:53", - "author_account_age_days": 1446 + "stars": 14, + "last_update": "2024-06-11 07:13:42", + "author_account_age_days": 1447 }, "https://github.com/AbdullahAlfaraj/Comfy-Photoshop-SD": { - "stars": 172, + "stars": 173, "last_update": "2023-12-12 12:23:04", - "author_account_age_days": 3654 + "author_account_age_days": 3655 }, "https://github.com/AbyssYuan0/ComfyUI_BadgerTools": { "stars": 6, "last_update": "2024-05-22 21:27:48", - "author_account_age_days": 475 + "author_account_age_days": 477 }, "https://github.com/Acly/comfyui-inpaint-nodes": { - "stars": 397, + "stars": 401, "last_update": "2024-06-02 19:49:56", - "author_account_age_days": 3791 + "author_account_age_days": 3792 }, "https://github.com/Acly/comfyui-tooling-nodes": { - "stars": 201, - "last_update": "2024-06-08 07:31:39", - "author_account_age_days": 3791 + "stars": 202, + "last_update": "2024-06-11 10:14:35", + "author_account_age_days": 3792 }, "https://github.com/AiMiDi/ComfyUI-Aimidi-nodes": { "stars": 0, "last_update": "2024-05-23 00:15:03", - "author_account_age_days": 1262 + "author_account_age_days": 1263 }, "https://github.com/AlekPet/ComfyUI_Custom_Nodes_AlekPet": { - "stars": 631, - "last_update": "2024-06-02 17:05:16", - "author_account_age_days": 2686 + "stars": 635, + "last_update": "2024-06-12 07:56:21", + "author_account_age_days": 2687 }, "https://github.com/Alysondao/Comfyui-Yolov8-JSON": { "stars": 12, "last_update": "2024-05-31 10:14:21", - "author_account_age_days": 1016 + "author_account_age_days": 1018 }, "https://github.com/Amorano/Jovimetrix": { "stars": 159, "last_update": "2024-06-04 15:28:54", - "author_account_age_days": 5198 + "author_account_age_days": 5200 }, "https://github.com/AonekoSS/ComfyUI-LoRA-Tuner": { - "stars": 2, + "stars": 3, "last_update": "2024-05-29 10:34:05", - "author_account_age_days": 4078 + "author_account_age_days": 4079 }, "https://github.com/AonekoSS/ComfyUI-SimpleCounter": { "stars": 1, "last_update": "2024-05-23 01:11:36", - "author_account_age_days": 4078 + "author_account_age_days": 4079 }, "https://github.com/ArcherFMY/Diffusion360_ComfyUI": { "stars": 15, "last_update": "2024-05-28 03:14:17", - "author_account_age_days": 3375 + "author_account_age_days": 3377 }, "https://github.com/ArdeniusAI/CPlus_Ardenius": { "stars": 0, "last_update": "2024-03-28 02:21:05", - "author_account_age_days": 113 + "author_account_age_days": 114 }, "https://github.com/ArtBot2023/CharacterFaceSwap": { "stars": 54, "last_update": "2024-05-22 20:53:09", - "author_account_age_days": 279 + "author_account_age_days": 281 }, "https://github.com/ArtVentureX/comfyui-animatediff": { - "stars": 625, + "stars": 626, "last_update": "2024-05-22 18:16:43", - "author_account_age_days": 391 + "author_account_age_days": 393 }, "https://github.com/AshMartian/ComfyUI-DirGir": { - "stars": 8, + "stars": 9, "last_update": "2024-05-29 22:28:55", - "author_account_age_days": 4572 + "author_account_age_days": 4574 }, "https://github.com/AuroBit/ComfyUI-AnimateAnyone-reproduction": { "stars": 34, "last_update": "2024-02-29 10:19:36", - "author_account_age_days": 376 + "author_account_age_days": 377 }, "https://github.com/AuroBit/ComfyUI-OOTDiffusion": { - "stars": 326, + "stars": 327, "last_update": "2024-06-03 06:04:30", - "author_account_age_days": 376 + "author_account_age_days": 377 }, "https://github.com/AustinMroz/ComfyUI-DynamicOversampling": { "stars": 0, "last_update": "2024-05-31 19:47:42", - "author_account_age_days": 4061 + "author_account_age_days": 4062 }, "https://github.com/AustinMroz/ComfyUI-SpliceTools": { "stars": 7, "last_update": "2024-04-21 07:59:14", - "author_account_age_days": 4061 + "author_account_age_days": 4062 }, "https://github.com/Auttasak-L/ComfyUI-ImageCropper": { "stars": 1, "last_update": "2024-05-23 05:04:53", - "author_account_age_days": 2635 + "author_account_age_days": 2637 }, "https://github.com/BAIS1C/ComfyUI_RSS_Feed_Reader": { "stars": 2, "last_update": "2024-05-25 07:56:01", - "author_account_age_days": 476 + "author_account_age_days": 477 }, "https://github.com/BXYMartin/ComfyUI-InstantIDUtils": { "stars": 3, "last_update": "2024-05-23 00:08:50", - "author_account_age_days": 2429 + "author_account_age_days": 2431 }, "https://github.com/BadCafeCode/masquerade-nodes-comfyui": { - "stars": 298, + "stars": 299, "last_update": "2024-05-22 17:55:57", - "author_account_age_days": 416 + "author_account_age_days": 418 }, "https://github.com/Beinsezii/bsz-cui-extras": { "stars": 20, "last_update": "2024-05-22 20:46:45", - "author_account_age_days": 2212 + "author_account_age_days": 2214 }, "https://github.com/BenNarum/SigmaWaveFormNode": { - "stars": 3, - "last_update": "2024-06-10 16:55:23", - "author_account_age_days": 3059 + "stars": 5, + "last_update": "2024-06-11 22:55:52", + "author_account_age_days": 3060 }, "https://github.com/BennyKok/comfyui-deploy": { - "stars": 658, - "last_update": "2024-06-07 20:20:32", - "author_account_age_days": 2982 + "stars": 660, + "last_update": "2024-06-12 00:43:13", + "author_account_age_days": 2984 }, "https://github.com/Big-Idea-Technology/ComfyUI-Book-Tools": { "stars": 16, "last_update": "2024-04-26 07:53:44", - "author_account_age_days": 858 + "author_account_age_days": 859 }, "https://github.com/Big-Idea-Technology/ComfyUI_LLM_Node": { "stars": 49, "last_update": "2024-04-30 12:39:17", - "author_account_age_days": 858 + "author_account_age_days": 859 }, "https://github.com/Billius-AI/ComfyUI-Path-Helper": { "stars": 13, "last_update": "2024-05-22 23:25:08", - "author_account_age_days": 121 + "author_account_age_days": 122 }, "https://github.com/BlakeOne/ComfyUI-CustomScheduler": { "stars": 11, "last_update": "2024-05-23 00:23:56", - "author_account_age_days": 2519 + "author_account_age_days": 2520 }, "https://github.com/BlakeOne/ComfyUI-NodePresets": { "stars": 11, "last_update": "2024-05-23 00:24:07", - "author_account_age_days": 2519 + "author_account_age_days": 2520 }, "https://github.com/BlakeOne/ComfyUI-NodeReset": { "stars": 1, "last_update": "2024-05-23 00:24:18", - "author_account_age_days": 2519 + "author_account_age_days": 2520 }, "https://github.com/BlakeOne/ComfyUI-SchedulerMixer": { "stars": 10, "last_update": "2024-05-23 00:23:44", - "author_account_age_days": 2519 + "author_account_age_days": 2520 }, "https://github.com/BlenderNeko/ComfyUI_ADV_CLIP_emb": { "stars": 261, "last_update": "2024-05-22 14:56:13", - "author_account_age_days": 464 + "author_account_age_days": 465 }, "https://github.com/BlenderNeko/ComfyUI_Cutoff": { "stars": 328, "last_update": "2024-05-22 15:01:45", - "author_account_age_days": 464 + "author_account_age_days": 465 }, "https://github.com/BlenderNeko/ComfyUI_Noise": { - "stars": 198, + "stars": 199, "last_update": "2024-06-10 16:38:48", - "author_account_age_days": 464 + "author_account_age_days": 465 }, "https://github.com/BlenderNeko/ComfyUI_SeeCoder": { "stars": 35, "last_update": "2024-05-22 14:57:04", - "author_account_age_days": 464 + "author_account_age_days": 465 }, "https://github.com/BlenderNeko/ComfyUI_TiledKSampler": { - "stars": 282, + "stars": 284, "last_update": "2024-05-22 14:56:49", - "author_account_age_days": 464 + "author_account_age_days": 465 }, "https://github.com/CC-BryanOttho/ComfyUI_API_Manager": { "stars": 9, "last_update": "2024-02-27 23:31:45", - "author_account_age_days": 471 + "author_account_age_days": 472 }, "https://github.com/CYBERLOOM-INC/ComfyUI-nodes-hnmr": { "stars": 3, "last_update": "2024-05-22 17:55:41", - "author_account_age_days": 236 + "author_account_age_days": 237 }, "https://github.com/CavinHuang/comfyui-nodes-docs": { - "stars": 42, - "last_update": "2024-06-10 16:11:45", - "author_account_age_days": 2712 + "stars": 45, + "last_update": "2024-06-12 00:47:47", + "author_account_age_days": 2714 }, "https://github.com/Chan-0312/ComfyUI-EasyDeforum": { "stars": 7, "last_update": "2024-05-22 23:22:14", - "author_account_age_days": 1852 + "author_account_age_days": 1854 }, "https://github.com/Chan-0312/ComfyUI-IPAnimate": { "stars": 65, "last_update": "2024-05-22 23:22:03", - "author_account_age_days": 1852 + "author_account_age_days": 1854 }, "https://github.com/Chan-0312/ComfyUI-Prompt-Preview": { "stars": 15, "last_update": "2024-02-27 11:30:38", - "author_account_age_days": 1852 + "author_account_age_days": 1854 }, "https://github.com/Chaoses-Ib/ComfyUI_Ib_CustomNodes": { "stars": 12, "last_update": "2024-04-05 11:14:24", - "author_account_age_days": 1865 + "author_account_age_days": 1866 }, "https://github.com/Clybius/ComfyUI-Extra-Samplers": { - "stars": 48, + "stars": 50, "last_update": "2024-04-18 04:28:09", - "author_account_age_days": 1720 + "author_account_age_days": 1721 }, "https://github.com/Clybius/ComfyUI-Latent-Modifiers": { "stars": 42, "last_update": "2024-01-02 21:57:58", - "author_account_age_days": 1720 + "author_account_age_days": 1721 }, "https://github.com/CosmicLaca/ComfyUI_Primere_Nodes": { - "stars": 76, + "stars": 77, "last_update": "2024-06-07 13:29:06", - "author_account_age_days": 3641 + "author_account_age_days": 3643 }, "https://github.com/Danand/ComfyUI-ComfyCouple": { - "stars": 19, + "stars": 20, "last_update": "2024-05-07 23:06:53", - "author_account_age_days": 4275 + "author_account_age_days": 4276 }, "https://github.com/DarKDinDoN/comfyui-checkpoint-automatic-config": { "stars": 3, "last_update": "2024-05-26 08:00:23", - "author_account_age_days": 4426 + "author_account_age_days": 4427 }, "https://github.com/DataCTE/prompt_injection": { - "stars": 42, + "stars": 46, "last_update": "2024-06-04 12:52:41", - "author_account_age_days": 764 + "author_account_age_days": 765 }, "https://github.com/Derfuu/Derfuu_ComfyUI_ModdedNodes": { - "stars": 283, + "stars": 284, "last_update": "2024-05-22 17:38:48", - "author_account_age_days": 1761 + "author_account_age_days": 1762 }, "https://github.com/DigitalIO/ComfyUI-stable-wildcards": { "stars": 18, "last_update": "2024-05-24 21:15:08", - "author_account_age_days": 4025 + "author_account_age_days": 4026 }, "https://github.com/DimaChaichan/LAizypainter-Exporter-ComfyUI": { "stars": 7, "last_update": "2024-05-22 23:14:06", - "author_account_age_days": 3059 + "author_account_age_days": 3060 }, "https://github.com/DonBaronFactory/ComfyUI-Cre8it-Nodes": { "stars": 0, "last_update": "2024-05-22 23:24:30", - "author_account_age_days": 3474 + "author_account_age_days": 3475 }, "https://github.com/DrJKL/ComfyUI-Anchors": { "stars": 4, "last_update": "2024-03-20 22:40:29", - "author_account_age_days": 4981 + "author_account_age_days": 4982 }, "https://github.com/DrMWeigand/ComfyUI_ColorImageDetection": { "stars": 1, "last_update": "2024-05-23 00:25:14", - "author_account_age_days": 1018 + "author_account_age_days": 1019 }, "https://github.com/Electrofried/ComfyUI-OpenAINode": { "stars": 18, "last_update": "2023-12-05 21:34:23", - "author_account_age_days": 2606 + "author_account_age_days": 2608 }, "https://github.com/EllangoK/ComfyUI-post-processing-nodes": { "stars": 144, "last_update": "2024-05-22 17:54:09", - "author_account_age_days": 2764 + "author_account_age_days": 2766 }, "https://github.com/ExponentialML/ComfyUI_ModelScopeT2V": { "stars": 25, "last_update": "2024-05-23 00:12:17", - "author_account_age_days": 1610 + "author_account_age_days": 1611 }, "https://github.com/ExponentialML/ComfyUI_Native_DynamiCrafter": { - "stars": 95, + "stars": 96, "last_update": "2024-06-08 02:33:02", - "author_account_age_days": 1610 + "author_account_age_days": 1611 }, "https://github.com/ExponentialML/ComfyUI_VisualStylePrompting": { - "stars": 250, + "stars": 251, "last_update": "2024-05-23 00:12:41", - "author_account_age_days": 1610 + "author_account_age_days": 1611 }, "https://github.com/Extraltodeus/ComfyUI-AutomaticCFG": { - "stars": 255, + "stars": 259, "last_update": "2024-06-09 18:40:19", - "author_account_age_days": 3136 + "author_account_age_days": 3137 }, "https://github.com/Extraltodeus/LoadLoraWithTags": { "stars": 36, "last_update": "2024-06-03 03:04:45", - "author_account_age_days": 3136 + "author_account_age_days": 3137 }, "https://github.com/Extraltodeus/Stable-Diffusion-temperature-settings": { - "stars": 18, + "stars": 19, "last_update": "2024-06-10 16:09:31", - "author_account_age_days": 3136 + "author_account_age_days": 3137 }, "https://github.com/Extraltodeus/Vector_Sculptor_ComfyUI": { - "stars": 76, + "stars": 77, "last_update": "2024-06-03 03:04:03", - "author_account_age_days": 3136 + "author_account_age_days": 3137 }, "https://github.com/Extraltodeus/noise_latent_perlinpinpin": { "stars": 22, "last_update": "2024-06-03 03:04:40", - "author_account_age_days": 3136 + "author_account_age_days": 3137 }, "https://github.com/Extraltodeus/sigmas_tools_and_the_golden_scheduler": { "stars": 42, - "last_update": "2024-06-03 03:04:50", - "author_account_age_days": 3136 + "last_update": "2024-06-11 19:48:04", + "author_account_age_days": 3137 }, "https://github.com/Fannovel16/ComfyUI-Frame-Interpolation": { - "stars": 326, + "stars": 329, "last_update": "2024-05-21 00:52:49", - "author_account_age_days": 3118 + "author_account_age_days": 3119 }, "https://github.com/Fannovel16/ComfyUI-Loopchain": { - "stars": 26, + "stars": 27, "last_update": "2023-12-15 14:25:35", - "author_account_age_days": 3118 + "author_account_age_days": 3119 }, "https://github.com/Fannovel16/ComfyUI-MagickWand": { "stars": 69, "last_update": "2024-05-20 14:13:55", - "author_account_age_days": 3118 + "author_account_age_days": 3119 }, "https://github.com/Fannovel16/ComfyUI-MotionDiff": { "stars": 143, "last_update": "2024-05-21 00:51:03", - "author_account_age_days": 3118 + "author_account_age_days": 3119 }, "https://github.com/Fannovel16/ComfyUI-Video-Matting": { "stars": 139, "last_update": "2024-05-21 00:51:54", - "author_account_age_days": 3118 + "author_account_age_days": 3119 }, "https://github.com/Fannovel16/comfyui_controlnet_aux": { - "stars": 1505, + "stars": 1515, "last_update": "2024-05-24 11:05:47", - "author_account_age_days": 3118 + "author_account_age_days": 3119 }, "https://github.com/Fantaxico/ComfyUI-GCP-Storage": { "stars": 0, "last_update": "2024-05-24 16:17:41", - "author_account_age_days": 522 + "author_account_age_days": 523 }, "https://github.com/Feidorian/feidorian-ComfyNodes": { "stars": 5, "last_update": "2024-05-22 21:30:52", - "author_account_age_days": 2741 + "author_account_age_days": 2743 }, "https://github.com/Fictiverse/ComfyUI_Fictiverse": { "stars": 8, "last_update": "2024-06-05 19:03:21", - "author_account_age_days": 658 + "author_account_age_days": 659 }, "https://github.com/Fihade/IC-Light-ComfyUI-Node": { "stars": 5, "last_update": "2024-05-23 01:20:21", - "author_account_age_days": 2733 + "author_account_age_days": 2735 }, "https://github.com/FizzleDorf/ComfyUI-AIT": { "stars": 43, "last_update": "2024-05-16 23:55:47", - "author_account_age_days": 1966 + "author_account_age_days": 1967 }, "https://github.com/FizzleDorf/ComfyUI_FizzNodes": { - "stars": 305, + "stars": 306, "last_update": "2024-06-03 00:52:40", - "author_account_age_days": 1966 + "author_account_age_days": 1967 }, "https://github.com/FlyingFireCo/tiled_ksampler": { "stars": 56, "last_update": "2024-05-22 23:15:17", - "author_account_age_days": 619 + "author_account_age_days": 620 }, "https://github.com/ForeignGods/ComfyUI-Mana-Nodes": { "stars": 175, "last_update": "2024-05-29 18:29:05", - "author_account_age_days": 1230 + "author_account_age_days": 1231 }, "https://github.com/Franck-Demongin/NX_PromptStyler": { "stars": 4, "last_update": "2024-05-22 23:25:21", - "author_account_age_days": 1757 + "author_account_age_days": 1759 }, "https://github.com/FredBill1/comfyui-fb-utils": { "stars": 0, "last_update": "2024-05-23 01:41:02", - "author_account_age_days": 2303 + "author_account_age_days": 2305 }, "https://github.com/GMapeSplat/ComfyUI_ezXY": { - "stars": 19, + "stars": 20, "last_update": "2024-05-29 17:43:08", - "author_account_age_days": 1284 + "author_account_age_days": 1285 }, "https://github.com/GTSuya-Studio/ComfyUI-Gtsuya-Nodes": { "stars": 7, "last_update": "2024-05-22 21:31:52", - "author_account_age_days": 2543 + "author_account_age_days": 2544 }, "https://github.com/GavChap/ComfyUI-SD3LatentSelectRes": { "stars": 0, - "last_update": "2024-06-10 19:25:38", - "author_account_age_days": 4554 + "last_update": "2024-06-12 09:59:27", + "author_account_age_days": 4555 }, "https://github.com/GentlemanHu/ComfyUI-SunoAI": { "stars": 10, "last_update": "2024-05-23 01:17:07", - "author_account_age_days": 2369 + "author_account_age_days": 2371 }, "https://github.com/Goktug/comfyui-saveimage-plus": { "stars": 1, "last_update": "2024-05-30 18:16:57", - "author_account_age_days": 4918 + "author_account_age_days": 4919 }, "https://github.com/Gourieff/comfyui-reactor-node": { - "stars": 1008, - "last_update": "2024-06-10 11:45:10", - "author_account_age_days": 1106 + "stars": 1012, + "last_update": "2024-06-11 21:26:47", + "author_account_age_days": 1107 }, "https://github.com/GraftingRayman/ComfyUI_GraftingRayman": { "stars": 9, "last_update": "2024-06-07 06:57:28", - "author_account_age_days": 149 + "author_account_age_days": 150 }, "https://github.com/Guillaume-Fgt/ComfyUI_StableCascadeLatentRatio": { "stars": 3, "last_update": "2024-02-26 09:37:16", - "author_account_age_days": 1466 + "author_account_age_days": 1468 }, "https://github.com/HAL41/ComfyUI-aichemy-nodes": { "stars": 4, "last_update": "2024-05-22 23:10:19", - "author_account_age_days": 2832 + "author_account_age_days": 2833 }, "https://github.com/Hangover3832/ComfyUI-Hangover-Moondream": { "stars": 35, "last_update": "2024-06-05 16:06:39", - "author_account_age_days": 596 + "author_account_age_days": 598 }, "https://github.com/Hangover3832/ComfyUI-Hangover-Nodes": { "stars": 33, "last_update": "2024-06-02 10:28:19", - "author_account_age_days": 596 + "author_account_age_days": 598 }, "https://github.com/Hangover3832/ComfyUI-Hangover-Recognize_Anything": { "stars": 14, "last_update": "2024-04-04 11:58:20", - "author_account_age_days": 596 + "author_account_age_days": 598 }, "https://github.com/Haoming02/comfyui-clear-screen": { "stars": 1, "last_update": "2023-12-12 08:16:28", - "author_account_age_days": 1317 + "author_account_age_days": 1319 }, "https://github.com/Haoming02/comfyui-diffusion-cg": { - "stars": 48, + "stars": 49, "last_update": "2024-05-08 04:00:04", - "author_account_age_days": 1317 + "author_account_age_days": 1319 }, "https://github.com/Haoming02/comfyui-floodgate": { "stars": 25, "last_update": "2024-01-31 09:08:14", - "author_account_age_days": 1317 + "author_account_age_days": 1319 }, "https://github.com/Haoming02/comfyui-menu-anchor": { "stars": 3, "last_update": "2024-01-26 03:54:55", - "author_account_age_days": 1317 + "author_account_age_days": 1319 }, "https://github.com/Haoming02/comfyui-prompt-format": { "stars": 28, "last_update": "2023-12-11 13:44:03", - "author_account_age_days": 1317 + "author_account_age_days": 1319 }, "https://github.com/Haoming02/comfyui-tab-handler": { "stars": 4, "last_update": "2023-12-14 08:24:49", - "author_account_age_days": 1317 + "author_account_age_days": 1319 }, "https://github.com/HaydenReeve/ComfyUI-Better-Strings": { "stars": 0, "last_update": "2024-05-22 23:20:05", - "author_account_age_days": 2228 + "author_account_age_days": 2229 }, "https://github.com/HebelHuber/comfyui-enhanced-save-node": { "stars": 1, "last_update": "2024-01-12 14:34:55", - "author_account_age_days": 2310 + "author_account_age_days": 2311 }, "https://github.com/Hiero207/ComfyUI-Hiero-Nodes": { "stars": 5, "last_update": "2024-05-22 23:16:16", - "author_account_age_days": 1685 + "author_account_age_days": 1686 }, "https://github.com/Hopping-Mad-Games/ComfyUI_LiteLLM": { "stars": 2, "last_update": "2024-05-23 01:11:24", - "author_account_age_days": 175 + "author_account_age_days": 176 }, "https://github.com/IDGallagher/ComfyUI-IG-Nodes": { "stars": 0, "last_update": "2024-06-04 00:24:47", - "author_account_age_days": 5467 + "author_account_age_days": 5468 }, "https://github.com/ITurchenko/ComfyUI-SizeFromArray": { "stars": 0, "last_update": "2024-05-24 14:09:58", - "author_account_age_days": 3695 + "author_account_age_days": 3696 }, "https://github.com/Intersection98/ComfyUI_MX_post_processing-nodes": { "stars": 8, "last_update": "2024-05-23 01:12:46", - "author_account_age_days": 2616 + "author_account_age_days": 2618 }, "https://github.com/Inzaniak/comfyui-ranbooru": { "stars": 7, "last_update": "2024-05-22 23:12:23", - "author_account_age_days": 3896 + "author_account_age_days": 3897 }, "https://github.com/IsItDanOrAi/ComfyUI-Stereopsis": { "stars": 2, "last_update": "2024-05-23 00:22:46", - "author_account_age_days": 98 + "author_account_age_days": 99 }, "https://github.com/JPS-GER/ComfyUI_JPS-Nodes": { - "stars": 31, + "stars": 32, "last_update": "2024-05-22 20:39:14", - "author_account_age_days": 302 + "author_account_age_days": 303 }, "https://github.com/Jannchie/ComfyUI-J": { "stars": 60, "last_update": "2024-05-23 00:16:12", - "author_account_age_days": 2539 + "author_account_age_days": 2541 }, "https://github.com/JaredTherriault/ComfyUI-JNodes": { - "stars": 10, - "last_update": "2024-06-10 23:56:37", - "author_account_age_days": 3558 + "stars": 11, + "last_update": "2024-06-11 03:54:30", + "author_account_age_days": 3559 }, "https://github.com/JayLyu/ComfyUI_BaiKong_Node": { "stars": 0, "last_update": "2024-06-04 16:30:54", - "author_account_age_days": 3254 + "author_account_age_days": 3256 }, "https://github.com/JcandZero/ComfyUI_GLM4Node": { "stars": 24, "last_update": "2024-05-22 23:12:46", - "author_account_age_days": 676 + "author_account_age_days": 678 }, "https://github.com/Jcd1230/rembg-comfyui-node": { "stars": 119, "last_update": "2024-05-22 17:58:34", - "author_account_age_days": 4872 + "author_account_age_days": 4874 }, "https://github.com/JerryOrbachJr/ComfyUI-RandomSize": { "stars": 3, "last_update": "2024-05-22 23:18:51", - "author_account_age_days": 142 + "author_account_age_days": 143 }, "https://github.com/JettHu/ComfyUI-TCD": { "stars": 75, "last_update": "2024-06-03 11:40:18", - "author_account_age_days": 2344 + "author_account_age_days": 2345 }, "https://github.com/JettHu/ComfyUI_TGate": { "stars": 45, "last_update": "2024-05-26 08:29:23", - "author_account_age_days": 2344 + "author_account_age_days": 2345 }, "https://github.com/Jordach/comfy-plasma": { "stars": 48, "last_update": "2024-05-22 18:08:28", - "author_account_age_days": 4499 + "author_account_age_days": 4500 }, "https://github.com/Kaharos94/ComfyUI-Saveaswebp": { "stars": 30, "last_update": "2024-05-22 18:06:48", - "author_account_age_days": 1181 + "author_account_age_days": 1182 }, "https://github.com/Kangkang625/ComfyUI-paint-by-example": { "stars": 13, "last_update": "2024-05-22 22:20:27", - "author_account_age_days": 900 + "author_account_age_days": 901 }, "https://github.com/KewkLW/ComfyUI-kewky_tools": { "stars": 2, "last_update": "2024-05-23 01:20:32", - "author_account_age_days": 1673 + "author_account_age_days": 1675 }, "https://github.com/Koishi-Star/Euler-Smea-Dyn-Sampler": { - "stars": 130, + "stars": 131, "last_update": "2024-05-12 15:49:06", - "author_account_age_days": 1472 + "author_account_age_days": 1473 }, "https://github.com/KoreTeknology/ComfyUI-Universal-Styler": { "stars": 5, "last_update": "2024-05-08 21:25:51", - "author_account_age_days": 3176 + "author_account_age_days": 3178 }, "https://github.com/Kosinkadink/ComfyUI-Advanced-ControlNet": { - "stars": 397, + "stars": 399, "last_update": "2024-06-03 09:40:01", - "author_account_age_days": 3703 + "author_account_age_days": 3704 }, "https://github.com/Kosinkadink/ComfyUI-AnimateDiff-Evolved": { - "stars": 2209, - "last_update": "2024-06-09 03:33:07", - "author_account_age_days": 3703 + "stars": 2214, + "last_update": "2024-06-11 04:21:54", + "author_account_age_days": 3704 }, "https://github.com/Kosinkadink/ComfyUI-VideoHelperSuite": { - "stars": 379, - "last_update": "2024-06-07 18:34:38", - "author_account_age_days": 3703 + "stars": 382, + "last_update": "2024-06-11 17:46:53", + "author_account_age_days": 3704 }, "https://github.com/KytraScript/ComfyUI_KytraWebhookHTTP": { "stars": 3, "last_update": "2024-05-23 00:21:43", - "author_account_age_days": 1766 + "author_account_age_days": 1767 }, "https://github.com/LEv145/images-grid-comfy-plugin": { - "stars": 125, + "stars": 126, "last_update": "2024-05-30 17:54:32", - "author_account_age_days": 2194 + "author_account_age_days": 2195 }, "https://github.com/LZpenguin/ComfyUI-Text": { "stars": 2, - "last_update": "2024-06-07 16:59:17", - "author_account_age_days": 1965 + "last_update": "2024-06-11 14:28:56", + "author_account_age_days": 1967 }, "https://github.com/LarryJane491/Image-Captioning-in-ComfyUI": { "stars": 26, "last_update": "2024-06-06 20:45:43", - "author_account_age_days": 150 + "author_account_age_days": 151 }, "https://github.com/LarryJane491/Lora-Training-in-Comfy": { - "stars": 236, + "stars": 238, "last_update": "2024-06-09 05:24:00", - "author_account_age_days": 150 + "author_account_age_days": 151 }, "https://github.com/Layer-norm/comfyui-lama-remover": { - "stars": 50, + "stars": 51, "last_update": "2024-05-25 00:12:04", - "author_account_age_days": 318 + "author_account_age_days": 320 }, "https://github.com/Lerc/canvas_tab": { "stars": 124, "last_update": "2024-05-22 20:48:45", - "author_account_age_days": 5354 + "author_account_age_days": 5355 }, "https://github.com/Limitex/ComfyUI-Calculation": { "stars": 0, "last_update": "2024-05-22 22:18:40", - "author_account_age_days": 1261 + "author_account_age_days": 1262 }, "https://github.com/Limitex/ComfyUI-Diffusers": { "stars": 103, "last_update": "2024-05-22 22:18:57", - "author_account_age_days": 1261 + "author_account_age_days": 1262 }, "https://github.com/Loewen-Hob/rembg-comfyui-node-better": { "stars": 32, "last_update": "2024-05-23 00:32:53", - "author_account_age_days": 457 + "author_account_age_days": 458 }, "https://github.com/LonicaMewinsky/ComfyUI-MakeFrame": { "stars": 23, "last_update": "2024-05-22 21:29:02", - "author_account_age_days": 962 + "author_account_age_days": 963 }, "https://github.com/LonicaMewinsky/ComfyUI-RawSaver": { "stars": 1, "last_update": "2024-05-22 21:31:28", - "author_account_age_days": 962 + "author_account_age_days": 963 }, "https://github.com/Ludobico/ComfyUI-ScenarioPrompt": { "stars": 12, "last_update": "2024-03-26 01:28:07", - "author_account_age_days": 1019 + "author_account_age_days": 1020 }, "https://github.com/LyazS/comfyui-anime-seg": { "stars": 4, "last_update": "2024-05-22 23:21:49", - "author_account_age_days": 2843 + "author_account_age_days": 2845 }, "https://github.com/M1kep/ComfyLiterals": { "stars": 11, "last_update": "2024-05-22 20:31:38", - "author_account_age_days": 4244 + "author_account_age_days": 4246 }, "https://github.com/M1kep/ComfyUI-KepOpenAI": { "stars": 26, "last_update": "2024-05-22 20:33:54", - "author_account_age_days": 4244 + "author_account_age_days": 4246 }, "https://github.com/M1kep/ComfyUI-OtherVAEs": { "stars": 2, "last_update": "2024-05-22 20:33:41", - "author_account_age_days": 4244 + "author_account_age_days": 4246 }, "https://github.com/M1kep/Comfy_KepKitchenSink": { "stars": 0, "last_update": "2024-05-22 20:33:29", - "author_account_age_days": 4244 + "author_account_age_days": 4246 }, "https://github.com/M1kep/Comfy_KepListStuff": { "stars": 26, "last_update": "2024-05-22 20:31:26", - "author_account_age_days": 4244 + "author_account_age_days": 4246 }, "https://github.com/M1kep/Comfy_KepMatteAnything": { "stars": 10, "last_update": "2024-05-22 20:33:16", - "author_account_age_days": 4244 + "author_account_age_days": 4246 }, "https://github.com/M1kep/KepPromptLang": { "stars": 4, "last_update": "2024-05-22 20:32:56", - "author_account_age_days": 4244 + "author_account_age_days": 4246 }, "https://github.com/MNeMoNiCuZ/ComfyUI-mnemic-nodes": { "stars": 25, "last_update": "2024-06-04 23:56:25", - "author_account_age_days": 1591 + "author_account_age_days": 1592 }, "https://github.com/Makeezi/ComfyUI-promptLAB": { "stars": 0, "last_update": "2024-05-23 01:24:51", - "author_account_age_days": 1768 + "author_account_age_days": 1769 }, "https://github.com/Mamaaaamooooo/batchImg-rembg-ComfyUI-nodes": { "stars": 12, "last_update": "2024-04-02 12:00:48", - "author_account_age_days": 368 + "author_account_age_days": 370 }, "https://github.com/ManglerFTW/ComfyI2I": { "stars": 136, "last_update": "2023-11-03 11:09:53", - "author_account_age_days": 642 + "author_account_age_days": 643 }, "https://github.com/MaraScott/ComfyUI_MaraScott_Nodes": { "stars": 50, - "last_update": "2024-06-10 15:45:24", - "author_account_age_days": 4956 + "last_update": "2024-06-11 22:07:45", + "author_account_age_days": 4957 }, "https://github.com/MarcusNyne/m9-prompts-comfyui": { "stars": 1, - "last_update": "2024-06-10 18:02:53", - "author_account_age_days": 1409 + "last_update": "2024-06-11 21:19:23", + "author_account_age_days": 1410 }, "https://github.com/MariusKM/ComfyUI-BadmanNodes": { "stars": 0, "last_update": "2024-05-31 10:15:35", - "author_account_age_days": 2217 + "author_account_age_days": 2218 }, "https://github.com/MarkoCa1/ComfyUI-Text": { "stars": 2, "last_update": "2024-05-23 00:15:39", - "author_account_age_days": 1619 + "author_account_age_days": 1621 }, "https://github.com/MarkoCa1/ComfyUI_Segment_Mask": { - "stars": 14, + "stars": 15, "last_update": "2024-05-23 00:15:51", - "author_account_age_days": 1619 + "author_account_age_days": 1621 }, "https://github.com/Mason-McGough/ComfyUI-Mosaica": { "stars": 3, "last_update": "2024-05-29 12:57:49", - "author_account_age_days": 3192 + "author_account_age_days": 3193 }, "https://github.com/Millyarde/Pomfy": { "stars": 7, "last_update": "2024-05-22 22:22:48", - "author_account_age_days": 893 + "author_account_age_days": 895 }, "https://github.com/MinusZoneAI/ComfyUI-Prompt-MZ": { - "stars": 60, - "last_update": "2024-06-09 13:06:06", - "author_account_age_days": 52 + "stars": 61, + "last_update": "2024-06-11 14:45:37", + "author_account_age_days": 53 }, "https://github.com/MinusZoneAI/ComfyUI-StylizePhoto-MZ": { - "stars": 15, + "stars": 16, "last_update": "2024-05-23 01:13:32", - "author_account_age_days": 52 + "author_account_age_days": 53 }, "https://github.com/Miosp/ComfyUI-FBCNN": { "stars": 4, "last_update": "2024-05-24 12:13:08", - "author_account_age_days": 2502 + "author_account_age_days": 2503 }, "https://github.com/MitoshiroPJ/comfyui_slothful_attention": { "stars": 5, "last_update": "2024-05-22 22:09:15", - "author_account_age_days": 3954 + "author_account_age_days": 3955 }, "https://github.com/MokkaBoss1/ComfyUI_Mokkaboss1": { "stars": 15, - "last_update": "2024-06-10 16:07:10", - "author_account_age_days": 366 + "last_update": "2024-06-12 07:02:22", + "author_account_age_days": 367 }, "https://github.com/MrForExample/ComfyUI-3D-Pack": { - "stars": 1606, + "stars": 1609, "last_update": "2024-06-04 20:35:47", - "author_account_age_days": 1547 + "author_account_age_days": 1549 }, "https://github.com/MrForExample/ComfyUI-AnimateAnyone-Evolved": { "stars": 428, "last_update": "2024-02-02 14:19:37", - "author_account_age_days": 1547 + "author_account_age_days": 1549 }, "https://github.com/Munkyfoot/ComfyUI-TextOverlay": { "stars": 2, "last_update": "2024-02-27 22:56:42", - "author_account_age_days": 3031 + "author_account_age_days": 3033 }, "https://github.com/Nestorchik/NStor-ComfyUI-Translation": { "stars": 1, "last_update": "2024-05-01 12:24:22", - "author_account_age_days": 1311 + "author_account_age_days": 1312 }, "https://github.com/NeuralSamurAI/Comfyui-Superprompt-Unofficial": { "stars": 54, "last_update": "2024-05-23 00:22:08", - "author_account_age_days": 80 + "author_account_age_days": 81 }, "https://github.com/Nevysha/ComfyUI-nevysha-top-menu": { "stars": 4, "last_update": "2024-05-23 00:17:31", - "author_account_age_days": 513 + "author_account_age_days": 514 }, "https://github.com/NicholasMcCarthy/ComfyUI_TravelSuite": { "stars": 13, "last_update": "2024-05-22 20:34:46", - "author_account_age_days": 5136 + "author_account_age_days": 5137 }, "https://github.com/NimaNzrii/comfyui-photoshop": { - "stars": 158, - "last_update": "2024-06-10 22:30:48", - "author_account_age_days": 231 + "stars": 164, + "last_update": "2024-06-11 21:43:23", + "author_account_age_days": 232 }, "https://github.com/NimaNzrii/comfyui-popup_preview": { "stars": 34, "last_update": "2024-05-22 22:12:04", - "author_account_age_days": 231 + "author_account_age_days": 232 }, "https://github.com/Niutonian/ComfyUi-NoodleWebcam": { "stars": 27, "last_update": "2024-05-22 21:30:40", - "author_account_age_days": 1028 + "author_account_age_days": 1030 }, "https://github.com/Nlar/ComfyUI_CartoonSegmentation": { "stars": 8, "last_update": "2024-05-22 23:15:37", - "author_account_age_days": 3817 + "author_account_age_days": 3819 }, "https://github.com/NotHarroweD/Harronode": { "stars": 5, "last_update": "2024-05-22 22:18:29", - "author_account_age_days": 1970 + "author_account_age_days": 1971 }, "https://github.com/Nourepide/ComfyUI-Allor": { "stars": 170, "last_update": "2024-05-22 18:11:17", - "author_account_age_days": 2832 + "author_account_age_days": 2833 }, "https://github.com/Nuked88/ComfyUI-N-Nodes": { "stars": 169, "last_update": "2024-05-21 19:52:44", - "author_account_age_days": 4466 + "author_account_age_days": 4467 }, "https://github.com/Nuked88/ComfyUI-N-Sidebar": { - "stars": 355, + "stars": 358, "last_update": "2024-06-06 20:02:49", - "author_account_age_days": 4466 + "author_account_age_days": 4467 }, "https://github.com/Off-Live/ComfyUI-off-suite": { "stars": 0, "last_update": "2024-04-19 07:13:08", - "author_account_age_days": 1158 + "author_account_age_days": 1160 }, "https://github.com/OpenArt-AI/ComfyUI-Assistant": { "stars": 14, "last_update": "2024-05-22 22:16:57", - "author_account_age_days": 761 + "author_account_age_days": 763 }, "https://github.com/PCMonsterx/ComfyUI-CSV-Loader": { "stars": 11, "last_update": "2024-05-22 21:27:10", - "author_account_age_days": 1651 + "author_account_age_days": 1653 }, "https://github.com/ParisNeo/lollms_nodes_suite": { "stars": 9, "last_update": "2024-05-23 00:22:34", - "author_account_age_days": 4756 + "author_account_age_days": 4757 }, "https://github.com/ParmanBabra/ComfyUI-Malefish-Custom-Scripts": { "stars": 0, "last_update": "2024-05-22 21:26:35", - "author_account_age_days": 3629 + "author_account_age_days": 3631 }, "https://github.com/Pfaeff/pfaeff-comfyui": { "stars": 19, "last_update": "2024-05-22 18:21:10", - "author_account_age_days": 3194 + "author_account_age_days": 3195 }, "https://github.com/PnthrLeo/comfyUI-image-search": { "stars": 0, "last_update": "2024-06-01 09:50:50", - "author_account_age_days": 2538 + "author_account_age_days": 2539 }, "https://github.com/Pos13/comfyui-cyclist": { - "stars": 15, + "stars": 16, "last_update": "2024-06-10 15:20:59", - "author_account_age_days": 1504 + "author_account_age_days": 1505 }, "https://github.com/QaisMalkawi/ComfyUI-QaisHelper": { "stars": 2, "last_update": "2024-05-23 20:29:30", - "author_account_age_days": 1237 + "author_account_age_days": 1238 }, "https://github.com/RenderRift/ComfyUI-RenderRiftNodes": { "stars": 6, "last_update": "2024-05-22 22:16:41", - "author_account_age_days": 173 + "author_account_age_days": 174 }, "https://github.com/RomanKuschanow/ComfyUI-Advanced-Latent-Control": { "stars": 15, "last_update": "2024-05-05 09:22:26", - "author_account_age_days": 1368 + "author_account_age_days": 1369 }, "https://github.com/Ron-Digital/ComfyUI-SceneGenerator": { "stars": 2, - "last_update": "2024-05-28 18:02:38", - "author_account_age_days": 915 + "last_update": "2024-06-11 07:01:17", + "author_account_age_days": 917 }, "https://github.com/Ryuukeisyou/comfyui_face_parsing": { - "stars": 37, + "stars": 42, "last_update": "2024-05-22 22:21:46", - "author_account_age_days": 2399 + "author_account_age_days": 2400 }, "https://github.com/Ryuukeisyou/comfyui_io_helpers": { "stars": 1, "last_update": "2024-05-22 22:22:59", - "author_account_age_days": 2399 + "author_account_age_days": 2400 }, "https://github.com/SLAPaper/ComfyUI-Image-Selector": { - "stars": 55, + "stars": 56, "last_update": "2024-05-24 17:03:46", - "author_account_age_days": 3684 + "author_account_age_days": 3685 }, "https://github.com/SLAPaper/ComfyUI-dpmpp_2m_alt-Sampler": { "stars": 7, "last_update": "2024-06-09 18:30:03", - "author_account_age_days": 3684 + "author_account_age_days": 3685 }, "https://github.com/SOELexicon/ComfyUI-LexMSDBNodes": { "stars": 4, "last_update": "2024-05-22 18:15:52", - "author_account_age_days": 4070 + "author_account_age_days": 4071 }, "https://github.com/SOELexicon/ComfyUI-LexTools": { "stars": 23, "last_update": "2024-05-23 09:39:07", - "author_account_age_days": 4070 + "author_account_age_days": 4071 }, "https://github.com/SayanoAI/Comfy-RVC": { "stars": 2, - "last_update": "2024-06-08 23:31:22", - "author_account_age_days": 2590 + "last_update": "2024-06-12 02:54:21", + "author_account_age_days": 2591 }, "https://github.com/Scholar01/ComfyUI-Keyframe": { "stars": 10, "last_update": "2024-02-01 16:57:40", - "author_account_age_days": 3182 + "author_account_age_days": 3184 }, "https://github.com/Scorpinaus/ComfyUI-DiffusersLoader": { "stars": 3, "last_update": "2024-06-08 14:40:32", - "author_account_age_days": 1096 + "author_account_age_days": 1098 }, "https://github.com/SeaArtLab/ComfyUI-Long-CLIP": { "stars": 49, "last_update": "2024-04-29 02:27:15", - "author_account_age_days": 63 + "author_account_age_days": 64 }, "https://github.com/SeargeDP/SeargeSDXL": { "stars": 731, "last_update": "2024-05-22 00:28:26", - "author_account_age_days": 4158 + "author_account_age_days": 4159 }, "https://github.com/Seedsa/Fooocus_Nodes": { "stars": 34, "last_update": "2024-06-03 17:13:53", - "author_account_age_days": 2594 + "author_account_age_days": 2596 }, "https://github.com/Shadetail/ComfyUI_Eagleshadow": { "stars": 1, "last_update": "2024-05-21 16:37:38", - "author_account_age_days": 3384 + "author_account_age_days": 3385 }, "https://github.com/ShmuelRonen/ComfyUI-SVDResizer": { "stars": 1, "last_update": "2024-03-08 15:16:10", - "author_account_age_days": 1191 + "author_account_age_days": 1193 }, "https://github.com/ShmuelRonen/ComfyUI_wav2lip": { - "stars": 40, + "stars": 39, "last_update": "2024-06-05 08:21:09", - "author_account_age_days": 1191 + "author_account_age_days": 1193 }, "https://github.com/Shraknard/ComfyUI-Remover": { "stars": 4, "last_update": "2024-05-22 23:15:06", - "author_account_age_days": 2303 + "author_account_age_days": 2304 }, "https://github.com/Siberpone/lazy-pony-prompter": { - "stars": 21, + "stars": 22, "last_update": "2024-05-22 23:12:00", - "author_account_age_days": 439 + "author_account_age_days": 440 }, "https://github.com/Smirnov75/ComfyUI-mxToolkit": { - "stars": 36, - "last_update": "2024-06-10 21:32:39", - "author_account_age_days": 1498 + "stars": 37, + "last_update": "2024-06-11 12:34:09", + "author_account_age_days": 1499 }, "https://github.com/SoftMeng/ComfyUI_ImageToText": { "stars": 4, "last_update": "2024-04-07 07:27:14", - "author_account_age_days": 3510 + "author_account_age_days": 3511 }, "https://github.com/SoftMeng/ComfyUI_Mexx_Poster": { "stars": 15, "last_update": "2023-12-05 09:44:42", - "author_account_age_days": 3510 + "author_account_age_days": 3511 }, "https://github.com/SoftMeng/ComfyUI_Mexx_Styler": { "stars": 16, "last_update": "2024-04-06 06:49:01", - "author_account_age_days": 3510 + "author_account_age_days": 3511 }, "https://github.com/Sorcerio/MBM-Music-Visualizer": { "stars": 14, "last_update": "2024-05-23 01:09:18", - "author_account_age_days": 4233 + "author_account_age_days": 4235 }, "https://github.com/SozeInc/ComfyUI-Mobile": { "stars": 0, "last_update": "2024-05-31 01:31:51", - "author_account_age_days": 66 + "author_account_age_days": 67 }, "https://github.com/SpaceKendo/ComfyUI-svd_txt2vid": { "stars": 6, "last_update": "2024-05-22 22:11:52", - "author_account_age_days": 194 + "author_account_age_days": 196 }, "https://github.com/Stability-AI/ComfyUI-SAI_API": { "stars": 37, "last_update": "2024-06-06 14:18:15", - "author_account_age_days": 829 + "author_account_age_days": 830 }, "https://github.com/Stability-AI/stability-ComfyUI-nodes": { "stars": 178, "last_update": "2024-05-22 15:30:47", - "author_account_age_days": 829 + "author_account_age_days": 830 }, "https://github.com/StartHua/ComfyUI_OOTDiffusion_CXH": { "stars": 89, "last_update": "2024-03-04 09:33:57", - "author_account_age_days": 2821 + "author_account_age_days": 2823 }, "https://github.com/StartHua/ComfyUI_PCDMs": { "stars": 2, "last_update": "2024-05-22 23:21:14", - "author_account_age_days": 2821 + "author_account_age_days": 2823 }, "https://github.com/StartHua/ComfyUI_Seg_VITON": { - "stars": 160, + "stars": 161, "last_update": "2024-05-22 23:20:17", - "author_account_age_days": 2821 + "author_account_age_days": 2823 }, "https://github.com/StartHua/Comfyui_joytag": { "stars": 17, "last_update": "2024-05-22 23:20:28", - "author_account_age_days": 2821 + "author_account_age_days": 2823 }, "https://github.com/StartHua/Comfyui_segformer_b2_clothes": { "stars": 35, "last_update": "2024-05-22 23:20:39", - "author_account_age_days": 2821 + "author_account_age_days": 2823 }, "https://github.com/SuperBeastsAI/ComfyUI-SuperBeasts": { - "stars": 94, + "stars": 95, "last_update": "2024-06-01 20:27:53", - "author_account_age_days": 75 + "author_account_age_days": 77 }, "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes": { - "stars": 455, + "stars": 458, "last_update": "2024-06-05 01:09:25", - "author_account_age_days": 2136 + "author_account_age_days": 2137 }, "https://github.com/Sxela/ComfyWarp": { "stars": 21, "last_update": "2024-05-22 20:47:11", - "author_account_age_days": 3358 + "author_account_age_days": 3360 }, "https://github.com/TGu-97/ComfyUI-TGu-utils": { "stars": 1, "last_update": "2024-05-22 21:07:45", - "author_account_age_days": 516 + "author_account_age_days": 517 }, "https://github.com/THtianhao/ComfyUI-FaceChain": { "stars": 81, "last_update": "2024-05-24 08:41:14", - "author_account_age_days": 3677 + "author_account_age_days": 3679 }, "https://github.com/THtianhao/ComfyUI-Portrait-Maker": { "stars": 166, "last_update": "2024-05-22 21:18:05", - "author_account_age_days": 3677 + "author_account_age_days": 3679 }, "https://github.com/TJ16th/comfyUI_TJ_NormalLighting": { - "stars": 127, + "stars": 128, "last_update": "2024-05-23 00:25:37", - "author_account_age_days": 2521 + "author_account_age_days": 2523 }, "https://github.com/TMElyralab/Comfyui-MusePose": { - "stars": 233, - "last_update": "2024-06-08 03:32:21", - "author_account_age_days": 83 + "stars": 239, + "last_update": "2024-06-12 08:43:17", + "author_account_age_days": 85 }, "https://github.com/TRI3D-LC/tri3d-comfyui-nodes": { "stars": 16, "last_update": "2024-06-05 06:58:44", - "author_account_age_days": 425 + "author_account_age_days": 426 }, "https://github.com/TW-CUI/TW-CUI-Util": { "stars": 0, "last_update": "2024-05-31 13:49:50", - "author_account_age_days": 17 + "author_account_age_days": 19 }, "https://github.com/TaiTair/comfyui-simswap": { "stars": 6, "last_update": "2024-05-28 21:58:53", - "author_account_age_days": 3553 + "author_account_age_days": 3554 }, "https://github.com/Taremin/comfyui-prompt-extranetworks": { "stars": 2, "last_update": "2024-05-22 23:08:34", - "author_account_age_days": 2201 + "author_account_age_days": 2203 }, "https://github.com/Taremin/comfyui-string-tools": { "stars": 1, "last_update": "2024-05-22 23:08:45", - "author_account_age_days": 2201 + "author_account_age_days": 2203 }, "https://github.com/Taremin/webui-monaco-prompt": { "stars": 24, "last_update": "2024-05-23 13:58:57", - "author_account_age_days": 2201 + "author_account_age_days": 2203 }, "https://github.com/TeaCrab/ComfyUI-TeaNodes": { "stars": 4, "last_update": "2024-05-22 20:44:05", - "author_account_age_days": 3204 + "author_account_age_days": 3205 }, "https://github.com/TemryL/ComfyS3": { "stars": 15, "last_update": "2024-05-30 12:14:59", - "author_account_age_days": 855 + "author_account_age_days": 856 }, "https://github.com/TemryL/ComfyUI-IDM-VTON": { - "stars": 170, + "stars": 179, "last_update": "2024-05-30 12:21:57", - "author_account_age_days": 855 + "author_account_age_days": 856 }, "https://github.com/TencentQQGYLab/ComfyUI-ELLA": { "stars": 271, "last_update": "2024-05-07 03:07:38", - "author_account_age_days": 84 + "author_account_age_days": 86 }, "https://github.com/TheBarret/ZSuite": { "stars": 6, "last_update": "2024-05-22 21:29:14", - "author_account_age_days": 2699 + "author_account_age_days": 2700 }, "https://github.com/TheBill2001/comfyui-upscale-by-model": { "stars": 0, "last_update": "2024-02-24 00:49:19", - "author_account_age_days": 1428 + "author_account_age_days": 1429 }, "https://github.com/TheMistoAI/ComfyUI-Anyline": { - "stars": 249, + "stars": 251, "last_update": "2024-05-23 05:12:45", - "author_account_age_days": 151 + "author_account_age_days": 153 }, "https://github.com/ThereforeGames/ComfyUI-Unprompted": { "stars": 2, "last_update": "2024-06-08 04:39:40", - "author_account_age_days": 921 + "author_account_age_days": 923 }, "https://github.com/TinyTerra/ComfyUI_tinyterraNodes": { "stars": 310, "last_update": "2024-06-07 08:13:31", - "author_account_age_days": 607 + "author_account_age_days": 609 }, "https://github.com/TripleHeadedMonkey/ComfyUI_MileHighStyler": { "stars": 18, "last_update": "2024-05-22 22:13:06", - "author_account_age_days": 847 + "author_account_age_days": 848 }, "https://github.com/Tropfchen/ComfyUI-Embedding_Picker": { "stars": 25, "last_update": "2024-05-24 20:02:20", - "author_account_age_days": 3840 + "author_account_age_days": 3841 }, "https://github.com/Tropfchen/ComfyUI-yaResolutionSelector": { "stars": 6, "last_update": "2024-05-24 19:48:43", - "author_account_age_days": 3840 + "author_account_age_days": 3841 }, "https://github.com/Trung0246/ComfyUI-0246": { "stars": 90, "last_update": "2024-05-24 03:45:59", - "author_account_age_days": 3366 + "author_account_age_days": 3368 }, "https://github.com/Ttl/ComfyUi_NNLatentUpscale": { - "stars": 160, + "stars": 161, "last_update": "2024-05-22 20:50:03", - "author_account_age_days": 4908 + "author_account_age_days": 4909 }, "https://github.com/Umikaze-job/select_folder_path_easy": { "stars": 4, "last_update": "2024-05-22 21:30:13", - "author_account_age_days": 205 + "author_account_age_days": 206 }, "https://github.com/VAST-AI-Research/ComfyUI-Tripo": { "stars": 61, "last_update": "2024-05-23 01:11:56", - "author_account_age_days": 228 + "author_account_age_days": 230 }, "https://github.com/WASasquatch/ASTERR": { "stars": 12, "last_update": "2023-09-30 01:11:46", - "author_account_age_days": 4612 + "author_account_age_days": 4613 }, "https://github.com/WASasquatch/ComfyUI_Preset_Merger": { "stars": 21, "last_update": "2023-08-23 04:57:58", - "author_account_age_days": 4612 + "author_account_age_days": 4613 }, "https://github.com/WASasquatch/FreeU_Advanced": { "stars": 94, "last_update": "2024-03-05 15:36:38", - "author_account_age_days": 4612 + "author_account_age_days": 4613 }, "https://github.com/WASasquatch/PPF_Noise_ComfyUI": { "stars": 20, "last_update": "2023-10-01 03:36:57", - "author_account_age_days": 4612 + "author_account_age_days": 4613 }, "https://github.com/WASasquatch/PowerNoiseSuite": { "stars": 52, "last_update": "2023-09-19 17:04:01", - "author_account_age_days": 4612 + "author_account_age_days": 4613 }, "https://github.com/WASasquatch/WAS_Extras": { "stars": 23, "last_update": "2023-11-20 17:14:58", - "author_account_age_days": 4612 + "author_account_age_days": 4613 }, "https://github.com/WASasquatch/was-node-suite-comfyui": { - "stars": 904, + "stars": 909, "last_update": "2024-06-09 17:58:46", - "author_account_age_days": 4612 + "author_account_age_days": 4613 }, "https://github.com/WebDev9000/WebDev9000-Nodes": { "stars": 1, "last_update": "2023-12-01 02:23:18", - "author_account_age_days": 3738 + "author_account_age_days": 3740 }, "https://github.com/Wicloz/ComfyUI-Simply-Nodes": { "stars": 1, "last_update": "2024-04-11 01:32:57", - "author_account_age_days": 3630 + "author_account_age_days": 3631 }, "https://github.com/XmYx/deforum-comfy-nodes": { - "stars": 101, + "stars": 104, "last_update": "2024-05-21 01:46:57", - "author_account_age_days": 2592 + "author_account_age_days": 2593 }, "https://github.com/Xyem/Xycuno-Oobabooga": { "stars": 3, "last_update": "2024-05-23 00:14:14", - "author_account_age_days": 4311 + "author_account_age_days": 4312 }, "https://github.com/YMC-GitHub/ymc-node-suite-comfyui": { "stars": 16, "last_update": "2024-05-22 21:15:51", - "author_account_age_days": 2681 + "author_account_age_days": 2683 }, "https://github.com/YOUR-WORST-TACO/ComfyUI-TacoNodes": { - "stars": 13, + "stars": 14, "last_update": "2024-05-22 20:48:23", - "author_account_age_days": 3742 + "author_account_age_days": 3743 }, "https://github.com/YinBailiang/MergeBlockWeighted_fo_ComfyUI": { "stars": 14, "last_update": "2024-05-22 18:04:22", - "author_account_age_days": 772 + "author_account_age_days": 774 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-APISR": { "stars": 309, "last_update": "2024-05-22 14:14:46", - "author_account_age_days": 326 + "author_account_age_days": 327 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Animated-optical-illusions": { "stars": 17, "last_update": "2024-06-02 17:00:07", - "author_account_age_days": 326 + "author_account_age_days": 327 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-ArtGallery": { - "stars": 322, - "last_update": "2024-05-22 08:53:46", - "author_account_age_days": 326 + "stars": 335, + "last_update": "2024-06-12 04:40:50", + "author_account_age_days": 327 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-BRIA_AI-RMBG": { - "stars": 544, + "stars": 545, "last_update": "2024-05-22 14:14:18", - "author_account_age_days": 326 + "author_account_age_days": 327 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-BiRefNet-ZHO": { "stars": 135, "last_update": "2024-05-22 14:14:31", - "author_account_age_days": 326 + "author_account_age_days": 327 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-DepthFM": { "stars": 67, "last_update": "2024-05-22 14:14:03", - "author_account_age_days": 326 + "author_account_age_days": 327 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Gemini": { "stars": 577, "last_update": "2024-05-22 14:15:11", - "author_account_age_days": 326 + "author_account_age_days": 327 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-InstantID": { - "stars": 1177, + "stars": 1179, "last_update": "2024-05-22 13:57:55", - "author_account_age_days": 326 + "author_account_age_days": 327 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Phi-3-mini": { "stars": 168, "last_update": "2024-05-22 13:40:05", - "author_account_age_days": 326 + "author_account_age_days": 327 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-PhotoMaker-ZHO": { "stars": 741, "last_update": "2024-05-22 14:13:49", - "author_account_age_days": 326 + "author_account_age_days": 327 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-PixArt-alpha-Diffusers": { "stars": 40, "last_update": "2024-05-22 13:40:58", - "author_account_age_days": 326 + "author_account_age_days": 327 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Q-Align": { "stars": 3, "last_update": "2024-05-22 14:15:52", - "author_account_age_days": 326 + "author_account_age_days": 327 + }, + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen-2": { + "stars": 19, + "last_update": "2024-06-11 16:37:54", + "author_account_age_days": 327 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen-VL-API": { "stars": 179, "last_update": "2024-05-22 14:14:57", - "author_account_age_days": 326 + "author_account_age_days": 327 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-SVD-ZHO": { "stars": 90, "last_update": "2024-05-22 13:40:44", - "author_account_age_days": 326 + "author_account_age_days": 327 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-SegMoE": { "stars": 73, "last_update": "2024-05-22 13:41:14", - "author_account_age_days": 326 + "author_account_age_days": 327 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Text_Image-Composite": { "stars": 71, "last_update": "2024-05-31 12:03:55", - "author_account_age_days": 326 + "author_account_age_days": 327 }, "https://github.com/ZHO-ZHO-ZHO/ComfyUI-YoloWorld-EfficientSAM": { - "stars": 440, + "stars": 444, "last_update": "2024-05-22 13:01:07", - "author_account_age_days": 326 + "author_account_age_days": 327 }, "https://github.com/ZHO-ZHO-ZHO/comfyui-portrait-master-zh-cn": { - "stars": 1428, + "stars": 1430, "last_update": "2024-04-17 19:57:18", - "author_account_age_days": 326 + "author_account_age_days": 327 }, "https://github.com/ZaneA/ComfyUI-ImageReward": { "stars": 22, "last_update": "2024-02-04 23:38:10", - "author_account_age_days": 5526 + "author_account_age_days": 5528 }, "https://github.com/ZeDarkAdam/ComfyUI-Embeddings-Tools": { "stars": 1, "last_update": "2024-05-23 01:19:25", - "author_account_age_days": 1180 + "author_account_age_days": 1181 }, "https://github.com/Zuellni/ComfyUI-Custom-Nodes": { - "stars": 43, + "stars": 44, "last_update": "2023-09-19 12:11:26", - "author_account_age_days": 509 + "author_account_age_days": 510 }, "https://github.com/Zuellni/ComfyUI-ExLlama": { - "stars": 94, + "stars": 96, "last_update": "2024-06-05 07:53:12", - "author_account_age_days": 509 + "author_account_age_days": 510 }, "https://github.com/Zuellni/ComfyUI-ExLlama-Nodes": { - "stars": 94, + "stars": 96, "last_update": "2024-06-05 07:53:12", - "author_account_age_days": 509 + "author_account_age_days": 510 }, "https://github.com/Zuellni/ComfyUI-PickScore-Nodes": { "stars": 21, "last_update": "2024-05-22 18:07:53", - "author_account_age_days": 509 + "author_account_age_days": 510 }, "https://github.com/a1lazydog/ComfyUI-AudioScheduler": { "stars": 89, "last_update": "2024-05-06 16:53:15", - "author_account_age_days": 4788 + "author_account_age_days": 4790 }, "https://github.com/aburahamu/ComfyUI-IsNiceParts": { "stars": 2, "last_update": "2024-05-18 16:11:58", - "author_account_age_days": 59 + "author_account_age_days": 60 }, "https://github.com/aburahamu/ComfyUI-RequestsPoster": { "stars": 2, "last_update": "2024-05-18 16:11:21", - "author_account_age_days": 59 + "author_account_age_days": 60 }, "https://github.com/abyz22/image_control": { "stars": 14, "last_update": "2024-05-22 23:10:07", - "author_account_age_days": 149 + "author_account_age_days": 150 }, "https://github.com/adbrasi/ComfyUI-TrashNodes-DownloadHuggingface": { "stars": 4, "last_update": "2024-05-22 23:24:45", - "author_account_age_days": 690 + "author_account_age_days": 691 }, "https://github.com/adieyal/comfyui-dynamicprompts": { - "stars": 173, + "stars": 174, "last_update": "2024-02-05 06:55:50", - "author_account_age_days": 5003 + "author_account_age_days": 5004 }, "https://github.com/adriflex/ComfyUI_Blender_Texdiff": { "stars": 1, "last_update": "2024-05-22 23:14:18", - "author_account_age_days": 2208 + "author_account_age_days": 2210 }, "https://github.com/aegis72/aegisflow_utility_nodes": { "stars": 22, "last_update": "2024-05-22 22:10:29", - "author_account_age_days": 570 + "author_account_age_days": 571 }, "https://github.com/aegis72/comfyui-styles-all": { "stars": 28, "last_update": "2024-05-22 22:10:41", - "author_account_age_days": 570 + "author_account_age_days": 571 }, "https://github.com/ai-liam/comfyui-liam": { "stars": 2, - "last_update": "2024-06-09 04:14:23", - "author_account_age_days": 1507 + "last_update": "2024-06-11 03:14:52", + "author_account_age_days": 1509 }, "https://github.com/ai-liam/comfyui_liam_util": { "stars": 2, "last_update": "2024-05-22 22:21:23", - "author_account_age_days": 1507 + "author_account_age_days": 1509 }, "https://github.com/aianimation55/ComfyUI-FatLabels": { "stars": 4, "last_update": "2024-05-22 21:26:01", - "author_account_age_days": 260 + "author_account_age_days": 261 }, "https://github.com/al-swaiti/ComfyUI-CascadeResolutions": { "stars": 1, "last_update": "2024-04-06 16:48:55", - "author_account_age_days": 916 + "author_account_age_days": 917 }, "https://github.com/alessandrozonta/ComfyUI-CenterNode": { "stars": 2, "last_update": "2024-05-23 01:17:52", - "author_account_age_days": 1183 + "author_account_age_days": 1184 }, "https://github.com/alessandrozonta/ComfyUI-Layers": { "stars": 6, - "last_update": "2024-05-28 09:52:49", - "author_account_age_days": 1183 + "last_update": "2024-06-11 09:45:15", + "author_account_age_days": 1184 }, "https://github.com/alessandrozonta/ComfyUI-OpenPose": { "stars": 1, "last_update": "2024-06-10 14:55:52", - "author_account_age_days": 1183 + "author_account_age_days": 1185 }, "https://github.com/alexopus/ComfyUI-Image-Saver": { "stars": 30, "last_update": "2024-05-27 18:10:58", - "author_account_age_days": 2666 + "author_account_age_days": 2667 }, "https://github.com/ali1234/comfyui-job-iterator": { - "stars": 57, + "stars": 58, "last_update": "2024-05-22 20:54:21", - "author_account_age_days": 4846 + "author_account_age_days": 4848 }, "https://github.com/alisson-anjos/ComfyUI-Ollama-Describer": { - "stars": 21, + "stars": 22, "last_update": "2024-05-23 00:17:43", - "author_account_age_days": 587 + "author_account_age_days": 588 }, "https://github.com/alpertunga-bile/prompt-generator-comfyui": { - "stars": 60, + "stars": 61, "last_update": "2024-06-09 18:31:22", - "author_account_age_days": 1259 + "author_account_age_days": 1260 }, "https://github.com/alsritter/asymmetric-tiling-comfyui": { "stars": 14, "last_update": "2024-05-22 20:43:07", - "author_account_age_days": 1980 + "author_account_age_days": 1982 }, "https://github.com/alt-key-project/comfyui-dream-project": { "stars": 67, "last_update": "2024-05-22 20:51:52", - "author_account_age_days": 646 + "author_account_age_days": 648 }, "https://github.com/alt-key-project/comfyui-dream-video-batches": { "stars": 50, "last_update": "2024-05-22 20:52:05", - "author_account_age_days": 646 + "author_account_age_days": 648 }, "https://github.com/an90ray/ComfyUI_RErouter_CustomNodes": { "stars": 0, "last_update": "2024-05-22 22:21:00", - "author_account_age_days": 175 + "author_account_age_days": 176 }, "https://github.com/andersxa/comfyui-PromptAttention": { "stars": 19, "last_update": "2024-05-22 18:16:30", - "author_account_age_days": 2939 + "author_account_age_days": 2941 }, "https://github.com/angeloshredder/StableCascadeResizer": { "stars": 1, "last_update": "2024-05-23 00:12:55", - "author_account_age_days": 1815 + "author_account_age_days": 1816 }, "https://github.com/ansonkao/comfyui-geometry": { "stars": 7, "last_update": "2023-11-30 02:45:49", - "author_account_age_days": 332 + "author_account_age_days": 333 }, "https://github.com/antrobot1234/antrobots-comfyUI-nodepack": { "stars": 9, "last_update": "2024-05-28 14:44:16", - "author_account_age_days": 2849 + "author_account_age_days": 2850 }, "https://github.com/aria1th/ComfyUI-LogicUtils": { "stars": 19, "last_update": "2024-05-23 01:27:16", - "author_account_age_days": 2331 + "author_account_age_days": 2333 }, "https://github.com/asagi4/ComfyUI-CADS": { "stars": 29, "last_update": "2024-05-23 18:14:56", - "author_account_age_days": 427 + "author_account_age_days": 428 }, "https://github.com/asagi4/comfyui-prompt-control": { - "stars": 150, + "stars": 152, "last_update": "2024-06-05 17:20:01", - "author_account_age_days": 427 + "author_account_age_days": 428 }, "https://github.com/asagi4/comfyui-utility-nodes": { "stars": 7, "last_update": "2024-05-25 11:40:49", - "author_account_age_days": 427 + "author_account_age_days": 428 }, "https://github.com/aszc-dev/ComfyUI-CoreMLSuite": { "stars": 83, "last_update": "2024-05-22 21:23:52", - "author_account_age_days": 2713 + "author_account_age_days": 2715 }, "https://github.com/atmaranto/ComfyUI-SaveAsScript": { "stars": 37, "last_update": "2024-05-23 22:59:27", - "author_account_age_days": 2335 + "author_account_age_days": 2336 }, "https://github.com/audioscavenger/ComfyUI-Thumbnails": { "stars": 4, "last_update": "2024-06-07 07:19:30", - "author_account_age_days": 4107 + "author_account_age_days": 4108 }, "https://github.com/audioscavenger/save-image-extended-comfyui": { "stars": 12, "last_update": "2024-06-06 18:41:09", - "author_account_age_days": 4107 + "author_account_age_days": 4108 }, "https://github.com/avatechai/avatar-graph-comfyui": { "stars": 210, "last_update": "2024-05-22 21:14:14", - "author_account_age_days": 840 + "author_account_age_days": 842 }, "https://github.com/aws-samples/comfyui-llm-node-for-amazon-bedrock": { "stars": 4, - "last_update": "2024-06-07 03:47:10", - "author_account_age_days": 3545 + "last_update": "2024-06-11 02:19:17", + "author_account_age_days": 3546 }, "https://github.com/azure-dragon-ai/ComfyUI-ClipScore-Nodes": { "stars": 2, "last_update": "2024-05-22 23:16:28", - "author_account_age_days": 287 + "author_account_age_days": 289 }, "https://github.com/badayvedat/ComfyUI-fal-Connector": { "stars": 11, - "last_update": "2024-06-04 20:28:38", - "author_account_age_days": 1757 + "last_update": "2024-06-11 22:40:17", + "author_account_age_days": 1758 }, "https://github.com/badjeff/comfyui_lora_tag_loader": { "stars": 40, "last_update": "2024-05-22 20:40:03", - "author_account_age_days": 5349 + "author_account_age_days": 5350 }, "https://github.com/banodoco/steerable-motion": { - "stars": 731, + "stars": 736, "last_update": "2024-05-30 13:45:03", - "author_account_age_days": 388 + "author_account_age_days": 389 }, "https://github.com/bash-j/mikey_nodes": { "stars": 79, - "last_update": "2024-05-26 05:17:08", - "author_account_age_days": 4174 + "last_update": "2024-06-12 08:55:16", + "author_account_age_days": 4175 }, "https://github.com/bedovyy/ComfyUI_NAIDGenerator": { "stars": 17, "last_update": "2024-03-13 09:36:48", - "author_account_age_days": 349 + "author_account_age_days": 350 }, "https://github.com/bilal-arikan/ComfyUI_TextAssets": { "stars": 2, "last_update": "2024-05-22 23:23:50", - "author_account_age_days": 3494 + "author_account_age_days": 3495 }, "https://github.com/bitaffinity/ComfyUI_HF_Inference": { "stars": 0, "last_update": "2024-06-10 22:46:12", - "author_account_age_days": 43 + "author_account_age_days": 44 }, "https://github.com/blepping/ComfyUI-bleh": { "stars": 30, "last_update": "2024-05-22 23:17:49", - "author_account_age_days": 140 + "author_account_age_days": 142 }, "https://github.com/blepping/ComfyUI-sonar": { "stars": 31, "last_update": "2024-05-22 23:18:26", - "author_account_age_days": 140 + "author_account_age_days": 142 }, "https://github.com/blepping/comfyui_jankhidiffusion": { "stars": 87, "last_update": "2024-05-22 23:18:40", - "author_account_age_days": 140 + "author_account_age_days": 142 }, "https://github.com/blueraincoatli/comfyUI_SillyNodes": { "stars": 2, "last_update": "2024-06-09 13:30:57", - "author_account_age_days": 299 + "author_account_age_days": 300 }, "https://github.com/bmad4ever/ComfyUI-Bmad-DirtyUndoRedo": { "stars": 50, "last_update": "2024-05-22 18:11:51", - "author_account_age_days": 3523 + "author_account_age_days": 3524 }, "https://github.com/bmad4ever/comfyui_ab_samplercustom": { "stars": 5, "last_update": "2024-05-22 18:12:18", - "author_account_age_days": 3523 + "author_account_age_days": 3524 }, "https://github.com/bmad4ever/comfyui_bmad_nodes": { "stars": 43, - "last_update": "2024-06-04 23:15:36", - "author_account_age_days": 3523 + "last_update": "2024-06-11 20:09:18", + "author_account_age_days": 3524 }, "https://github.com/bmad4ever/comfyui_lists_cartesian_product": { "stars": 2, "last_update": "2024-05-22 20:18:07", - "author_account_age_days": 3523 + "author_account_age_days": 3524 }, "https://github.com/bmad4ever/comfyui_quilting": { "stars": 3, "last_update": "2024-05-24 23:10:54", - "author_account_age_days": 3523 + "author_account_age_days": 3524 }, "https://github.com/bmad4ever/comfyui_wfc_like": { "stars": 5, "last_update": "2024-06-02 23:06:37", - "author_account_age_days": 3523 + "author_account_age_days": 3524 }, "https://github.com/bobmagicii/comfykit-custom-nodes": { "stars": 1, "last_update": "2024-06-04 20:04:00", - "author_account_age_days": 4731 + "author_account_age_days": 4732 }, "https://github.com/bradsec/ComfyUI_ResolutionSelector": { "stars": 7, "last_update": "2024-05-22 20:44:31", - "author_account_age_days": 3642 + "author_account_age_days": 3644 }, "https://github.com/braintacles/braintacles-comfyui-nodes": { "stars": 1, "last_update": "2024-05-23 06:06:16", - "author_account_age_days": 417 + "author_account_age_days": 419 }, "https://github.com/brianfitzgerald/style_aligned_comfy": { "stars": 245, "last_update": "2024-05-30 14:23:40", - "author_account_age_days": 4226 + "author_account_age_days": 4227 }, "https://github.com/bronkula/comfyui-fitsize": { "stars": 31, "last_update": "2024-05-22 21:32:34", - "author_account_age_days": 5141 + "author_account_age_days": 5143 }, "https://github.com/bruefire/ComfyUI-SeqImageLoader": { "stars": 28, "last_update": "2024-06-08 15:48:49", - "author_account_age_days": 2352 + "author_account_age_days": 2353 }, "https://github.com/budihartono/comfyui_otonx_nodes": { "stars": 1, "last_update": "2024-05-25 04:10:08", - "author_account_age_days": 4672 + "author_account_age_days": 4674 }, "https://github.com/bvhari/ComfyUI_ImageProcessing": { "stars": 16, "last_update": "2024-05-22 18:08:40", - "author_account_age_days": 1161 + "author_account_age_days": 1162 }, "https://github.com/bvhari/ComfyUI_LatentToRGB": { "stars": 11, "last_update": "2024-05-22 18:08:53", - "author_account_age_days": 1161 + "author_account_age_days": 1162 }, "https://github.com/bvhari/ComfyUI_PerpWeight": { "stars": 10, "last_update": "2024-05-22 18:09:06", - "author_account_age_days": 1161 + "author_account_age_days": 1162 }, "https://github.com/bvhari/ComfyUI_SUNoise": { "stars": 3, "last_update": "2024-05-22 18:09:19", - "author_account_age_days": 1161 + "author_account_age_days": 1162 }, "https://github.com/cdb-boop/ComfyUI-Bringing-Old-Photos-Back-to-Life": { - "stars": 16, + "stars": 17, "last_update": "2024-05-23 00:09:32", - "author_account_age_days": 1191 + "author_account_age_days": 1192 }, "https://github.com/cdb-boop/comfyui-image-round": { "stars": 0, "last_update": "2024-05-23 00:09:02", - "author_account_age_days": 1191 + "author_account_age_days": 1192 }, "https://github.com/cerspense/ComfyUI_cspnodes": { "stars": 24, "last_update": "2024-05-15 05:27:11", - "author_account_age_days": 2668 + "author_account_age_days": 2669 }, "https://github.com/ceruleandeep/ComfyUI-LLaVA-Captioner": { "stars": 74, "last_update": "2024-05-22 22:17:55", - "author_account_age_days": 1140 + "author_account_age_days": 1141 }, "https://github.com/chakib-belgaid/ComfyUI-autosize": { "stars": 0, "last_update": "2024-06-06 10:53:34", - "author_account_age_days": 3822 + "author_account_age_days": 3824 }, "https://github.com/chakib-belgaid/Comfyui_Prompt_styler": { "stars": 0, "last_update": "2024-06-04 13:38:55", - "author_account_age_days": 3822 + "author_account_age_days": 3824 }, "https://github.com/chandlergis/ComfyUI-IMG_Query": { "stars": 1, "last_update": "2024-05-23 01:25:57", - "author_account_age_days": 342 + "author_account_age_days": 344 }, "https://github.com/chandlergis/ComfyUI_EmojiOverlay": { "stars": 0, "last_update": "2024-06-05 10:03:17", - "author_account_age_days": 342 + "author_account_age_days": 344 }, "https://github.com/chaojie/ComfyUI-AniPortrait": { - "stars": 225, + "stars": 226, "last_update": "2024-05-22 22:26:03", - "author_account_age_days": 4820 + "author_account_age_days": 4821 }, "https://github.com/chaojie/ComfyUI-CameraCtrl-Wrapper": { "stars": 15, "last_update": "2024-04-19 03:46:18", - "author_account_age_days": 4820 + "author_account_age_days": 4821 }, "https://github.com/chaojie/ComfyUI-Champ": { "stars": 19, "last_update": "2024-05-22 22:26:47", - "author_account_age_days": 4820 + "author_account_age_days": 4821 }, "https://github.com/chaojie/ComfyUI-DragAnything": { "stars": 66, "last_update": "2024-05-16 07:13:53", - "author_account_age_days": 4820 + "author_account_age_days": 4821 }, "https://github.com/chaojie/ComfyUI-DragNUWA": { - "stars": 355, + "stars": 356, "last_update": "2024-03-14 06:56:41", - "author_account_age_days": 4820 + "author_account_age_days": 4821 }, "https://github.com/chaojie/ComfyUI-DynamiCrafter": { "stars": 108, "last_update": "2024-03-16 19:08:28", - "author_account_age_days": 4820 + "author_account_age_days": 4821 }, "https://github.com/chaojie/ComfyUI-EasyAnimate": { - "stars": 37, + "stars": 38, "last_update": "2024-05-22 22:24:00", - "author_account_age_days": 4820 + "author_account_age_days": 4821 }, "https://github.com/chaojie/ComfyUI-Gemma": { "stars": 5, "last_update": "2024-05-22 22:27:47", - "author_account_age_days": 4820 + "author_account_age_days": 4821 }, "https://github.com/chaojie/ComfyUI-I2VGEN-XL": { "stars": 27, "last_update": "2024-01-19 09:02:08", - "author_account_age_days": 4820 + "author_account_age_days": 4821 }, "https://github.com/chaojie/ComfyUI-Img2Img-Turbo": { "stars": 36, "last_update": "2024-05-22 22:26:30", - "author_account_age_days": 4820 + "author_account_age_days": 4821 }, "https://github.com/chaojie/ComfyUI-LaVIT": { "stars": 8, "last_update": "2024-04-24 13:41:02", - "author_account_age_days": 4820 + "author_account_age_days": 4821 }, "https://github.com/chaojie/ComfyUI-LightGlue": { "stars": 48, "last_update": "2024-01-20 16:53:51", - "author_account_age_days": 4820 + "author_account_age_days": 4821 }, "https://github.com/chaojie/ComfyUI-Moore-AnimateAnyone": { "stars": 199, "last_update": "2024-06-10 20:16:06", - "author_account_age_days": 4820 + "author_account_age_days": 4821 }, "https://github.com/chaojie/ComfyUI-Motion-Vector-Extractor": { "stars": 0, "last_update": "2024-01-20 16:51:06", - "author_account_age_days": 4820 + "author_account_age_days": 4821 }, "https://github.com/chaojie/ComfyUI-MotionCtrl": { - "stars": 121, + "stars": 123, "last_update": "2024-01-08 14:18:40", - "author_account_age_days": 4820 + "author_account_age_days": 4821 }, "https://github.com/chaojie/ComfyUI-MotionCtrl-SVD": { - "stars": 77, + "stars": 78, "last_update": "2024-01-16 09:41:07", - "author_account_age_days": 4820 + "author_account_age_days": 4821 }, "https://github.com/chaojie/ComfyUI-MuseTalk": { - "stars": 131, + "stars": 135, "last_update": "2024-05-22 22:25:07", - "author_account_age_days": 4820 + "author_account_age_days": 4821 }, "https://github.com/chaojie/ComfyUI-MuseV": { "stars": 119, "last_update": "2024-05-22 22:25:31", - "author_account_age_days": 4820 + "author_account_age_days": 4821 }, "https://github.com/chaojie/ComfyUI-Open-Sora": { - "stars": 85, + "stars": 86, "last_update": "2024-05-22 22:26:59", - "author_account_age_days": 4820 + "author_account_age_days": 4821 }, "https://github.com/chaojie/ComfyUI-Open-Sora-Plan": { "stars": 47, "last_update": "2024-05-29 16:15:10", - "author_account_age_days": 4820 + "author_account_age_days": 4821 }, "https://github.com/chaojie/ComfyUI-Panda3d": { "stars": 13, "last_update": "2024-03-05 06:37:32", - "author_account_age_days": 4820 + "author_account_age_days": 4821 }, "https://github.com/chaojie/ComfyUI-Pymunk": { "stars": 16, "last_update": "2024-01-31 15:36:36", - "author_account_age_days": 4820 + "author_account_age_days": 4821 }, "https://github.com/chaojie/ComfyUI-RAFT": { "stars": 25, "last_update": "2024-01-29 08:08:13", - "author_account_age_days": 4820 + "author_account_age_days": 4821 }, "https://github.com/chaojie/ComfyUI-SimDA": { "stars": 13, "last_update": "2024-04-25 03:38:51", - "author_account_age_days": 4820 + "author_account_age_days": 4821 }, "https://github.com/chaojie/ComfyUI-Trajectory": { "stars": 5, "last_update": "2024-05-22 22:27:12", - "author_account_age_days": 4820 + "author_account_age_days": 4821 }, "https://github.com/chaojie/ComfyUI-Video-Editing-X-Attention": { "stars": 17, "last_update": "2024-05-08 00:59:14", - "author_account_age_days": 4820 + "author_account_age_days": 4821 }, "https://github.com/chaojie/ComfyUI-dust3r": { "stars": 14, "last_update": "2024-05-22 22:27:33", - "author_account_age_days": 4820 + "author_account_age_days": 4821 }, "https://github.com/chaojie/ComfyUI_StreamingT2V": { "stars": 22, "last_update": "2024-05-10 09:14:57", - "author_account_age_days": 4820 + "author_account_age_days": 4821 }, "https://github.com/chaosaiart/Chaosaiart-Nodes": { "stars": 46, "last_update": "2024-05-27 10:55:18", - "author_account_age_days": 320 + "author_account_age_days": 321 }, "https://github.com/chenpx976/ComfyUI-RunRunRun": { "stars": 0, "last_update": "2024-05-23 01:19:37", - "author_account_age_days": 3401 + "author_account_age_days": 3403 }, "https://github.com/chesnokovivan/ComfyUI-Novakid": { "stars": 0, "last_update": "2024-06-10 20:15:56", - "author_account_age_days": 1516 + "author_account_age_days": 1517 }, "https://github.com/chflame163/ComfyUI_FaceSimilarity": { "stars": 6, "last_update": "2024-05-23 12:48:18", - "author_account_age_days": 430 + "author_account_age_days": 432 }, "https://github.com/chflame163/ComfyUI_LayerStyle": { - "stars": 581, + "stars": 589, "last_update": "2024-06-10 15:20:14", - "author_account_age_days": 430 + "author_account_age_days": 432 }, "https://github.com/chflame163/ComfyUI_MSSpeech_TTS": { "stars": 21, "last_update": "2024-05-25 02:39:56", - "author_account_age_days": 430 + "author_account_age_days": 432 }, "https://github.com/chflame163/ComfyUI_WordCloud": { "stars": 59, "last_update": "2024-05-25 02:41:06", - "author_account_age_days": 430 + "author_account_age_days": 432 }, "https://github.com/chibiace/ComfyUI-Chibi-Nodes": { "stars": 26, "last_update": "2024-05-22 21:16:12", - "author_account_age_days": 2835 + "author_account_age_days": 2837 }, "https://github.com/choey/Comfy-Topaz": { "stars": 19, "last_update": "2024-04-10 09:05:18", - "author_account_age_days": 5509 + "author_account_age_days": 5511 }, "https://github.com/chrisfreilich/virtuoso-nodes": { "stars": 42, "last_update": "2024-05-23 01:15:43", - "author_account_age_days": 718 + "author_account_age_days": 720 }, "https://github.com/chrisgoringe/cg-image-picker": { "stars": 166, "last_update": "2024-06-01 23:07:44", - "author_account_age_days": 4051 + "author_account_age_days": 4053 }, "https://github.com/chrisgoringe/cg-noise": { "stars": 23, "last_update": "2024-06-09 11:46:04", - "author_account_age_days": 4051 + "author_account_age_days": 4053 }, "https://github.com/chrisgoringe/cg-prompt-info": { "stars": 24, "last_update": "2024-05-22 21:07:33", - "author_account_age_days": 4051 + "author_account_age_days": 4053 }, "https://github.com/chrisgoringe/cg-use-everywhere": { - "stars": 319, + "stars": 322, "last_update": "2024-06-06 05:23:41", - "author_account_age_days": 4051 + "author_account_age_days": 4053 }, "https://github.com/chrish-slingshot/CrasHUtils": { "stars": 11, "last_update": "2024-05-22 21:15:25", - "author_account_age_days": 587 + "author_account_age_days": 588 }, "https://github.com/christian-byrne/img2colors-comfyui-node": { "stars": 1, "last_update": "2024-05-25 03:14:52", - "author_account_age_days": 1335 + "author_account_age_days": 1336 }, "https://github.com/christian-byrne/img2txt-comfyui-nodes": { "stars": 22, "last_update": "2024-05-28 14:02:16", - "author_account_age_days": 1335 + "author_account_age_days": 1336 }, "https://github.com/christian-byrne/size-match-compositing-nodes": { "stars": 2, "last_update": "2024-06-01 05:49:27", - "author_account_age_days": 1335 + "author_account_age_days": 1336 }, "https://github.com/city96/ComfyUI_ColorMod": { "stars": 38, "last_update": "2024-05-22 18:06:19", - "author_account_age_days": 484 + "author_account_age_days": 485 }, "https://github.com/city96/ComfyUI_DiT": { "stars": 2, "last_update": "2024-05-22 18:06:05", - "author_account_age_days": 484 + "author_account_age_days": 485 }, "https://github.com/city96/ComfyUI_ExtraModels": { - "stars": 244, - "last_update": "2024-05-31 19:56:58", - "author_account_age_days": 484 + "stars": 246, + "last_update": "2024-06-11 23:04:32", + "author_account_age_days": 485 }, "https://github.com/city96/ComfyUI_NetDist": { - "stars": 213, + "stars": 214, "last_update": "2024-05-22 18:05:10", - "author_account_age_days": 484 + "author_account_age_days": 485 }, "https://github.com/city96/SD-Advanced-Noise": { "stars": 18, "last_update": "2024-05-22 18:05:35", - "author_account_age_days": 484 + "author_account_age_days": 485 }, "https://github.com/city96/SD-Latent-Interposer": { - "stars": 161, + "stars": 162, "last_update": "2024-05-22 18:05:22", - "author_account_age_days": 484 + "author_account_age_days": 485 }, "https://github.com/city96/SD-Latent-Upscaler": { "stars": 111, "last_update": "2024-05-22 18:05:50", - "author_account_age_days": 484 + "author_account_age_days": 485 }, "https://github.com/civitai/comfy-nodes": { "stars": 85, "last_update": "2024-06-09 17:54:31", - "author_account_age_days": 585 + "author_account_age_days": 586 }, "https://github.com/claussteinmassl/ComfyUI-CS-CustomNodes": { "stars": 1, "last_update": "2024-05-31 12:03:35", - "author_account_age_days": 2687 + "author_account_age_days": 2688 }, "https://github.com/comfyanonymous/ComfyUI": { - "stars": 37246, - "last_update": "2024-06-10 23:37:23", - "author_account_age_days": 535 + "stars": 37426, + "last_update": "2024-06-12 06:25:01", + "author_account_age_days": 537 }, "https://github.com/comfyanonymous/ComfyUI_TensorRT": { - "stars": 215, - "last_update": "2024-06-05 09:38:24", - "author_account_age_days": 535 + "stars": 226, + "last_update": "2024-06-12 07:18:10", + "author_account_age_days": 537 }, "https://github.com/comfyanonymous/ComfyUI_experiments": { "stars": 132, "last_update": "2024-05-22 15:29:49", - "author_account_age_days": 535 + "author_account_age_days": 537 }, "https://github.com/concarne000/ConCarneNode": { "stars": 4, "last_update": "2024-05-22 22:10:18", - "author_account_age_days": 1887 + "author_account_age_days": 1889 }, "https://github.com/conquestace/ComfyUI-ImageUploader": { "stars": 0, "last_update": "2024-05-23 01:25:49", - "author_account_age_days": 4595 + "author_account_age_days": 4597 }, "https://github.com/coolzilj/ComfyUI-LJNodes": { - "stars": 30, - "last_update": "2024-06-09 09:26:46", - "author_account_age_days": 4649 + "stars": 37, + "last_update": "2024-06-11 10:52:32", + "author_account_age_days": 4651 }, "https://github.com/coolzilj/ComfyUI-Photopea": { - "stars": 47, + "stars": 50, "last_update": "2024-06-03 04:57:52", - "author_account_age_days": 4649 + "author_account_age_days": 4651 }, "https://github.com/coreyryanhanson/ComfyQR": { "stars": 50, "last_update": "2024-03-20 20:10:27", - "author_account_age_days": 3042 + "author_account_age_days": 3044 }, "https://github.com/coreyryanhanson/ComfyQR-scanning-nodes": { "stars": 8, "last_update": "2023-10-15 03:19:16", - "author_account_age_days": 3042 + "author_account_age_days": 3044 }, "https://github.com/cozymantis/cozy-utils-comfyui-nodes": { "stars": 3, "last_update": "2024-05-23 00:10:45", - "author_account_age_days": 95 + "author_account_age_days": 96 }, "https://github.com/cozymantis/human-parser-comfyui-node": { - "stars": 43, + "stars": 45, "last_update": "2024-05-23 00:10:21", - "author_account_age_days": 95 + "author_account_age_days": 96 }, "https://github.com/cozymantis/pose-generator-comfyui-node": { - "stars": 25, + "stars": 26, "last_update": "2024-05-23 00:10:33", - "author_account_age_days": 95 + "author_account_age_days": 96 }, "https://github.com/crystian/ComfyUI-Crystools": { - "stars": 445, + "stars": 449, "last_update": "2024-06-07 04:43:29", - "author_account_age_days": 4104 + "author_account_age_days": 4105 }, "https://github.com/crystian/ComfyUI-Crystools-save": { "stars": 28, "last_update": "2024-05-22 22:20:15", - "author_account_age_days": 4104 + "author_account_age_days": 4105 }, "https://github.com/cubiq/ComfyUI_FaceAnalysis": { "stars": 203, "last_update": "2024-05-29 20:20:36", - "author_account_age_days": 4997 + "author_account_age_days": 4999 }, "https://github.com/cubiq/ComfyUI_IPAdapter_plus": { - "stars": 2898, + "stars": 2922, "last_update": "2024-06-09 10:11:42", - "author_account_age_days": 4997 + "author_account_age_days": 4999 }, "https://github.com/cubiq/ComfyUI_InstantID": { - "stars": 869, + "stars": 873, "last_update": "2024-05-08 14:56:00", - "author_account_age_days": 4997 + "author_account_age_days": 4999 }, "https://github.com/cubiq/ComfyUI_SimpleMath": { "stars": 12, "last_update": "2023-09-26 06:31:44", - "author_account_age_days": 4997 + "author_account_age_days": 4999 }, "https://github.com/cubiq/ComfyUI_essentials": { - "stars": 302, + "stars": 306, "last_update": "2024-06-10 13:26:34", - "author_account_age_days": 4997 + "author_account_age_days": 4999 }, "https://github.com/cubiq/PuLID_ComfyUI": { - "stars": 383, + "stars": 386, "last_update": "2024-05-26 17:23:56", - "author_account_age_days": 4997 + "author_account_age_days": 4999 }, "https://github.com/cuongloveit/comfy_http_request": { "stars": 0, "last_update": "2024-05-28 08:58:59", - "author_account_age_days": 3238 + "author_account_age_days": 3240 }, "https://github.com/curiousjp/ComfyUI-MaskBatchPermutations": { "stars": 3, "last_update": "2024-05-28 13:09:32", - "author_account_age_days": 1916 + "author_account_age_days": 1917 }, "https://github.com/czcz1024/Comfyui-FaceCompare": { "stars": 0, "last_update": "2024-02-23 09:08:32", - "author_account_age_days": 4220 + "author_account_age_days": 4222 }, "https://github.com/da2el-ai/ComfyUI-d2-size-selector": { "stars": 1, "last_update": "2024-05-23 01:16:17", - "author_account_age_days": 376 + "author_account_age_days": 377 }, "https://github.com/da2el-ai/ComfyUI-d2-steps": { "stars": 4, "last_update": "2024-05-23 01:16:06", - "author_account_age_days": 376 + "author_account_age_days": 377 }, "https://github.com/dagthomas/comfyui_dagthomas": { - "stars": 63, + "stars": 64, "last_update": "2024-05-23 08:41:09", - "author_account_age_days": 4058 + "author_account_age_days": 4059 }, "https://github.com/daniabib/ComfyUI_ProPainter_Nodes": { - "stars": 132, + "stars": 138, "last_update": "2024-05-25 15:14:53", - "author_account_age_days": 2391 + "author_account_age_days": 2392 }, "https://github.com/daniel-lewis-ab/ComfyUI-Llama": { "stars": 25, "last_update": "2024-04-02 06:33:08", - "author_account_age_days": 3338 + "author_account_age_days": 3339 }, "https://github.com/daniel-lewis-ab/ComfyUI-TTS": { "stars": 11, "last_update": "2024-04-02 06:32:21", - "author_account_age_days": 3338 + "author_account_age_days": 3339 }, "https://github.com/darkpixel/darkprompts": { "stars": 6, "last_update": "2024-05-23 19:48:02", - "author_account_age_days": 5310 + "author_account_age_days": 5312 }, "https://github.com/dave-palt/comfyui_DSP_imagehelpers": { "stars": 0, "last_update": "2024-05-22 23:12:11", - "author_account_age_days": 144 + "author_account_age_days": 146 }, "https://github.com/daxcay/ComfyUI-DRMN": { "stars": 7, - "last_update": "2024-06-06 16:54:07", - "author_account_age_days": 81 + "last_update": "2024-06-12 08:27:53", + "author_account_age_days": 83 }, "https://github.com/daxcay/ComfyUI-JDCN": { - "stars": 50, + "stars": 51, "last_update": "2024-06-09 14:25:27", - "author_account_age_days": 81 + "author_account_age_days": 83 }, "https://github.com/daxcay/ComfyUI-NODEJS": { "stars": 4, "last_update": "2024-06-06 04:30:30", - "author_account_age_days": 81 + "author_account_age_days": 83 }, "https://github.com/daxthin/DZ-FaceDetailer": { "stars": 99, "last_update": "2023-12-16 17:31:44", - "author_account_age_days": 1217 + "author_account_age_days": 1219 }, "https://github.com/dchatel/comfyui_facetools": { "stars": 41, "last_update": "2024-05-31 10:40:32", - "author_account_age_days": 4522 + "author_account_age_days": 4523 }, "https://github.com/denfrost/Den_ComfyUI_Workflow": { "stars": 1, "last_update": "2024-06-10 07:46:16", - "author_account_age_days": 3483 + "author_account_age_days": 3484 }, "https://github.com/deroberon/StableZero123-comfyui": { "stars": 132, "last_update": "2024-05-22 22:09:53", - "author_account_age_days": 5282 + "author_account_age_days": 5284 }, "https://github.com/deroberon/demofusion-comfyui": { "stars": 83, "last_update": "2024-05-22 22:09:42", - "author_account_age_days": 5282 + "author_account_age_days": 5284 }, "https://github.com/dfl/comfyui-clip-with-break": { "stars": 9, "last_update": "2024-05-22 23:23:15", - "author_account_age_days": 5961 + "author_account_age_days": 5962 }, "https://github.com/dfl/comfyui-tcd-scheduler": { "stars": 75, "last_update": "2024-05-22 23:23:28", - "author_account_age_days": 5961 + "author_account_age_days": 5962 }, "https://github.com/diStyApps/ComfyUI_FrameMaker": { "stars": 10, "last_update": "2024-05-23 00:11:33", - "author_account_age_days": 4191 + "author_account_age_days": 4192 }, "https://github.com/digitaljohn/comfyui-propost": { - "stars": 100, + "stars": 101, "last_update": "2024-05-22 23:24:19", - "author_account_age_days": 4504 + "author_account_age_days": 4506 }, "https://github.com/dimtoneff/ComfyUI-PixelArt-Detector": { "stars": 159, "last_update": "2024-01-07 03:29:57", - "author_account_age_days": 3401 + "author_account_age_days": 3402 }, "https://github.com/diontimmer/ComfyUI-Vextra-Nodes": { "stars": 60, "last_update": "2024-05-22 17:55:21", - "author_account_age_days": 4757 + "author_account_age_days": 4758 }, "https://github.com/discopixel-studio/comfyui-discopixel": { "stars": 7, "last_update": "2023-11-30 02:45:49", - "author_account_age_days": 332 + "author_account_age_days": 333 }, "https://github.com/discus0434/comfyui-aesthetic-predictor-v2-5": { "stars": 3, "last_update": "2024-05-28 14:04:29", - "author_account_age_days": 1456 + "author_account_age_days": 1458 }, "https://github.com/discus0434/comfyui-caching-embeddings": { "stars": 1, "last_update": "2024-04-09 03:52:05", - "author_account_age_days": 1456 + "author_account_age_days": 1458 }, "https://github.com/djbielejeski/a-person-mask-generator": { - "stars": 224, + "stars": 225, "last_update": "2024-05-27 13:54:56", - "author_account_age_days": 4270 + "author_account_age_days": 4271 }, "https://github.com/dmMaze/sketch2manga": { "stars": 23, "last_update": "2024-05-23 00:14:41", - "author_account_age_days": 1836 + "author_account_age_days": 1837 }, "https://github.com/dmarx/ComfyUI-AudioReactive": { "stars": 10, "last_update": "2024-05-22 22:12:53", - "author_account_age_days": 4491 + "author_account_age_days": 4492 }, "https://github.com/dmarx/ComfyUI-Keyframed": { "stars": 81, "last_update": "2024-05-22 22:12:50", - "author_account_age_days": 4491 + "author_account_age_days": 4492 }, "https://github.com/drago87/ComfyUI_Dragos_Nodes": { "stars": 3, "last_update": "2024-05-22 21:32:15", - "author_account_age_days": 3756 + "author_account_age_days": 3757 }, "https://github.com/drustan-hawk/primitive-types": { "stars": 5, "last_update": "2024-05-22 21:23:12", - "author_account_age_days": 275 + "author_account_age_days": 277 }, "https://github.com/e7mac/ComfyUI-ShadertoyGL": { "stars": 2, "last_update": "2024-05-23 01:09:41", - "author_account_age_days": 4790 + "author_account_age_days": 4791 }, "https://github.com/ealkanat/comfyui_easy_padding": { "stars": 12, "last_update": "2024-05-22 21:58:52", - "author_account_age_days": 2449 + "author_account_age_days": 2451 }, "https://github.com/edenartlab/eden_comfy_pipelines": { "stars": 39, "last_update": "2024-06-06 21:49:00", - "author_account_age_days": 259 + "author_account_age_days": 260 }, "https://github.com/evanspearman/ComfyMath": { "stars": 50, "last_update": "2023-08-27 03:29:04", - "author_account_age_days": 4225 + "author_account_age_days": 4226 }, "https://github.com/exdysa/comfyui-selector": { "stars": 1, "last_update": "2024-06-10 05:05:28", - "author_account_age_days": 982 + "author_account_age_days": 983 }, "https://github.com/failfa-st/failfast-comfyui-extensions": { "stars": 126, "last_update": "2024-05-09 19:24:22", - "author_account_age_days": 260 + "author_account_age_days": 261 }, "https://github.com/fexli/fexli-util-node-comfyui": { "stars": 3, "last_update": "2024-05-22 21:27:36", - "author_account_age_days": 1545 + "author_account_age_days": 1547 }, "https://github.com/fexploit/ComfyUI-AutoLabel": { - "stars": 3, + "stars": 4, "last_update": "2024-05-25 19:54:58", - "author_account_age_days": 5030 + "author_account_age_days": 5032 }, "https://github.com/fexploit/ComfyUI-AutoTrimBG": { "stars": 2, "last_update": "2024-05-24 20:38:15", - "author_account_age_days": 5030 + "author_account_age_days": 5032 }, "https://github.com/fexploit/ComfyUI-Classifier": { "stars": 0, "last_update": "2024-06-02 20:27:12", - "author_account_age_days": 5030 + "author_account_age_days": 5032 }, "https://github.com/filipemeneses/comfy_pixelization": { "stars": 27, "last_update": "2024-05-22 20:59:16", - "author_account_age_days": 3463 + "author_account_age_days": 3464 }, "https://github.com/filliptm/ComfyUI_Fill-Nodes": { - "stars": 87, + "stars": 90, "last_update": "2024-06-09 08:42:25", - "author_account_age_days": 1723 + "author_account_age_days": 1724 }, "https://github.com/florestefano1975/ComfyUI-HiDiffusion": { "stars": 128, "last_update": "2024-05-22 00:33:06", - "author_account_age_days": 180 + "author_account_age_days": 181 }, "https://github.com/florestefano1975/ComfyUI-StabilityAI-Suite": { "stars": 2, "last_update": "2024-04-21 07:34:21", - "author_account_age_days": 180 + "author_account_age_days": 181 }, "https://github.com/florestefano1975/comfyui-portrait-master": { - "stars": 733, + "stars": 736, "last_update": "2024-05-22 00:30:41", - "author_account_age_days": 180 + "author_account_age_days": 181 }, "https://github.com/florestefano1975/comfyui-prompt-composer": { - "stars": 206, + "stars": 207, "last_update": "2024-05-22 00:34:06", - "author_account_age_days": 180 + "author_account_age_days": 181 }, "https://github.com/flowtyone/ComfyUI-Flowty-CRM": { "stars": 122, "last_update": "2024-04-03 23:47:03", - "author_account_age_days": 260 + "author_account_age_days": 261 }, "https://github.com/flowtyone/ComfyUI-Flowty-LDSR": { - "stars": 158, + "stars": 160, "last_update": "2024-03-24 19:03:45", - "author_account_age_days": 260 + "author_account_age_days": 261 }, "https://github.com/flowtyone/ComfyUI-Flowty-TripoSR": { "stars": 348, "last_update": "2024-06-06 06:01:32", - "author_account_age_days": 260 + "author_account_age_days": 261 }, "https://github.com/flyingshutter/As_ComfyUI_CustomNodes": { "stars": 7, "last_update": "2024-05-22 18:07:19", - "author_account_age_days": 3481 + "author_account_age_days": 3483 }, "https://github.com/fmatray/ComfyUI_BattlemapGrid": { "stars": 0, "last_update": "2024-06-05 22:35:06", - "author_account_age_days": 3608 + "author_account_age_days": 3609 }, "https://github.com/fofr/ComfyUI-HyperSDXL1StepUnetScheduler": { "stars": 10, "last_update": "2024-05-23 01:15:32", - "author_account_age_days": 5094 + "author_account_age_days": 5095 }, "https://github.com/forever22777/comfyui-self-guidance": { "stars": 6, "last_update": "2024-04-22 06:40:09", - "author_account_age_days": 311 + "author_account_age_days": 312 }, "https://github.com/foxtrot-roger/comfyui-rf-nodes": { "stars": 1, "last_update": "2024-05-22 23:09:13", - "author_account_age_days": 2307 + "author_account_age_days": 2308 }, "https://github.com/frankchieng/ComfyUI_Aniportrait": { "stars": 41, "last_update": "2024-05-23 00:23:20", - "author_account_age_days": 427 + "author_account_age_days": 428 }, "https://github.com/frankchieng/ComfyUI_MagicClothing": { "stars": 398, "last_update": "2024-05-23 00:23:32", - "author_account_age_days": 427 + "author_account_age_days": 428 }, "https://github.com/frankchieng/ComfyUI_llm_easyanimiate": { "stars": 7, "last_update": "2024-06-06 08:18:29", - "author_account_age_days": 427 + "author_account_age_days": 428 }, "https://github.com/fsdymy1024/ComfyUI_fsdymy": { "stars": 2, "last_update": "2024-05-23 01:21:16", - "author_account_age_days": 2192 + "author_account_age_days": 2193 }, "https://github.com/gemell1/ComfyUI_GMIC": { "stars": 5, "last_update": "2024-05-22 21:28:51", - "author_account_age_days": 1943 + "author_account_age_days": 1944 }, "https://github.com/get-salt-AI/SaltAI": { - "stars": 47, + "stars": 48, "last_update": "2024-05-23 00:54:46", - "author_account_age_days": 102 + "author_account_age_days": 104 }, "https://github.com/get-salt-AI/SaltAI_Language_Toolkit": { "stars": 15, "last_update": "2024-05-23 00:54:34", - "author_account_age_days": 102 + "author_account_age_days": 104 }, "https://github.com/get-salt-AI/SaltAI_LlamaIndex": { "stars": 15, "last_update": "2024-05-23 00:54:34", - "author_account_age_days": 102 + "author_account_age_days": 104 }, "https://github.com/ginlov/segment_to_mask_comfyui": { "stars": 1, "last_update": "2024-01-07 14:03:21", - "author_account_age_days": 1998 + "author_account_age_days": 1999 }, "https://github.com/giriss/comfy-image-saver": { "stars": 139, "last_update": "2024-05-22 20:40:55", - "author_account_age_days": 4224 + "author_account_age_days": 4226 }, "https://github.com/githubYiheng/ComfyUI_Change_IMAGE_BOREDER": { "stars": 0, "last_update": "2024-05-23 01:20:09", - "author_account_age_days": 3889 + "author_account_age_days": 3891 }, "https://github.com/githubYiheng/ComfyUI_GetFileNameFromURL": { "stars": 0, "last_update": "2024-05-23 01:19:47", - "author_account_age_days": 3889 + "author_account_age_days": 3891 }, "https://github.com/githubYiheng/comfyui_kmeans_filter": { "stars": 0, "last_update": "2024-05-24 10:55:10", - "author_account_age_days": 3889 + "author_account_age_days": 3891 }, "https://github.com/githubYiheng/comfyui_meanshift_filter": { "stars": 0, "last_update": "2024-05-28 03:12:18", - "author_account_age_days": 3889 + "author_account_age_days": 3891 }, "https://github.com/githubYiheng/comfyui_private_postprocessor": { "stars": 0, "last_update": "2024-06-03 16:41:26", - "author_account_age_days": 3889 + "author_account_age_days": 3891 }, "https://github.com/glibsonoran/Plush-for-ComfyUI": { "stars": 103, "last_update": "2024-05-24 16:32:17", - "author_account_age_days": 2484 + "author_account_age_days": 2485 }, "https://github.com/glifxyz/ComfyUI-GlifNodes": { "stars": 6, "last_update": "2024-05-23 16:29:07", - "author_account_age_days": 560 + "author_account_age_days": 561 }, "https://github.com/glowcone/comfyui-base64-to-image": { "stars": 8, "last_update": "2024-01-09 08:33:02", - "author_account_age_days": 3732 + "author_account_age_days": 3733 }, "https://github.com/godspede/ComfyUI_Substring": { "stars": 0, "last_update": "2024-05-22 23:15:48", - "author_account_age_days": 3099 + "author_account_age_days": 3101 }, "https://github.com/gokayfem/ComfyUI-Depth-Visualization": { "stars": 47, "last_update": "2024-05-21 00:37:05", - "author_account_age_days": 1044 + "author_account_age_days": 1045 }, "https://github.com/gokayfem/ComfyUI-Dream-Interpreter": { "stars": 66, "last_update": "2024-05-21 00:36:50", - "author_account_age_days": 1044 + "author_account_age_days": 1045 }, "https://github.com/gokayfem/ComfyUI-Texture-Simple": { "stars": 29, "last_update": "2024-05-21 00:19:53", - "author_account_age_days": 1044 + "author_account_age_days": 1045 }, "https://github.com/gokayfem/ComfyUI_VLM_nodes": { - "stars": 258, + "stars": 259, "last_update": "2024-06-02 10:23:55", - "author_account_age_days": 1044 + "author_account_age_days": 1045 }, "https://github.com/gonzalu/ComfyUI_YFG_Comical": { "stars": 12, "last_update": "2024-06-10 00:31:59", - "author_account_age_days": 2447 + "author_account_age_days": 2449 }, "https://github.com/griptape-ai/ComfyUI-Griptape": { - "stars": 4, - "last_update": "2024-06-10 20:11:22", - "author_account_age_days": 507 + "stars": 11, + "last_update": "2024-06-12 02:46:06", + "author_account_age_days": 508 }, "https://github.com/guill/abracadabra-comfyui": { "stars": 1, "last_update": "2024-02-26 04:25:21", - "author_account_age_days": 4179 + "author_account_age_days": 4181 }, "https://github.com/guoyk93/yk-node-suite-comfyui": { "stars": 10, "last_update": "2023-03-28 16:19:46", - "author_account_age_days": 1475 + "author_account_age_days": 1477 }, "https://github.com/hackkhai/ComfyUI-Image-Matting": { "stars": 11, "last_update": "2024-05-23 00:11:45", - "author_account_age_days": 1837 + "author_account_age_days": 1839 }, "https://github.com/haohaocreates/ComfyUI-HH-Image-Selector": { "stars": 0, "last_update": "2024-06-09 04:03:11", - "author_account_age_days": 92 + "author_account_age_days": 93 }, "https://github.com/hay86/ComfyUI_AceNodes": { "stars": 8, "last_update": "2024-06-05 07:54:59", - "author_account_age_days": 4653 + "author_account_age_days": 4655 }, "https://github.com/hay86/ComfyUI_DDColor": { "stars": 1, "last_update": "2024-04-17 14:38:22", - "author_account_age_days": 4653 + "author_account_age_days": 4655 }, "https://github.com/hay86/ComfyUI_Dreamtalk": { "stars": 7, "last_update": "2024-04-12 09:13:05", - "author_account_age_days": 4653 + "author_account_age_days": 4655 }, "https://github.com/hay86/ComfyUI_MiniCPM-V": { "stars": 5, "last_update": "2024-05-29 07:27:09", - "author_account_age_days": 4653 + "author_account_age_days": 4655 }, "https://github.com/hay86/ComfyUI_OpenVoice": { "stars": 3, "last_update": "2024-05-23 00:18:52", - "author_account_age_days": 4653 + "author_account_age_days": 4655 }, "https://github.com/hayden-fr/ComfyUI-Image-Browsing": { "stars": 2, "last_update": "2024-05-22 20:54:07", - "author_account_age_days": 1923 + "author_account_age_days": 1925 }, "https://github.com/hayden-fr/ComfyUI-Model-Manager": { "stars": 23, "last_update": "2024-05-22 20:53:55", - "author_account_age_days": 1923 + "author_account_age_days": 1925 }, "https://github.com/hben35096/ComfyUI-ToolBox": { "stars": 0, "last_update": "2024-06-02 19:29:39", - "author_account_age_days": 334 + "author_account_age_days": 335 }, "https://github.com/heshengtao/comfyui_LLM_party": { - "stars": 95, - "last_update": "2024-06-10 11:42:18", - "author_account_age_days": 2881 + "stars": 96, + "last_update": "2024-06-12 05:06:37", + "author_account_age_days": 2883 }, "https://github.com/hhhzzyang/Comfyui_Lama": { "stars": 36, "last_update": "2024-05-22 21:13:19", - "author_account_age_days": 493 + "author_account_age_days": 495 }, "https://github.com/hiforce/comfyui-hiforce-plugin": { "stars": 2, "last_update": "2024-02-29 09:35:31", - "author_account_age_days": 1788 + "author_account_age_days": 1790 }, "https://github.com/hinablue/ComfyUI_3dPoseEditor": { "stars": 109, "last_update": "2024-05-22 22:23:35", - "author_account_age_days": 5098 + "author_account_age_days": 5099 }, "https://github.com/holchan/ComfyUI-ModelDownloader": { "stars": 2, "last_update": "2024-03-02 05:43:41", - "author_account_age_days": 1578 + "author_account_age_days": 1579 }, "https://github.com/huagetai/ComfyUI-Gaffer": { "stars": 32, "last_update": "2024-05-23 01:22:40", - "author_account_age_days": 4618 + "author_account_age_days": 4620 }, "https://github.com/huagetai/ComfyUI_LightGradient": { "stars": 7, "last_update": "2024-05-23 01:21:27", - "author_account_age_days": 4618 + "author_account_age_days": 4620 }, "https://github.com/huchenlei/ComfyUI-IC-Light-Native": { - "stars": 363, + "stars": 367, "last_update": "2024-06-06 16:29:55", - "author_account_age_days": 2862 + "author_account_age_days": 2863 }, "https://github.com/huchenlei/ComfyUI-layerdiffuse": { - "stars": 1239, + "stars": 1242, "last_update": "2024-05-16 22:30:32", - "author_account_age_days": 2862 + "author_account_age_days": 2863 }, "https://github.com/huchenlei/ComfyUI-openpose-editor": { "stars": 11, "last_update": "2024-04-25 22:45:00", - "author_account_age_days": 2862 + "author_account_age_days": 2863 }, "https://github.com/huchenlei/ComfyUI_DanTagGen": { "stars": 48, "last_update": "2024-04-28 15:36:22", - "author_account_age_days": 2862 + "author_account_age_days": 2863 }, "https://github.com/huchenlei/ComfyUI_densediffusion": { - "stars": 36, - "last_update": "2024-06-10 20:31:23", - "author_account_age_days": 2862 + "stars": 41, + "last_update": "2024-06-11 00:39:28", + "author_account_age_days": 2863 }, "https://github.com/huchenlei/ComfyUI_omost": { - "stars": 254, - "last_update": "2024-06-11 06:34:46", - "author_account_age_days": 2862 + "stars": 265, + "last_update": "2024-06-11 20:06:43", + "author_account_age_days": 2864 }, "https://github.com/hughescr/ComfyUI-OpenPose-Keypoint-Extractor": { "stars": 6, "last_update": "2024-02-24 21:41:24", - "author_account_age_days": 5627 + "author_account_age_days": 5628 }, "https://github.com/humgate/simplecomfy": { "stars": 0, "last_update": "2024-06-05 17:08:39", - "author_account_age_days": 1353 + "author_account_age_days": 1354 }, "https://github.com/hustille/ComfyUI_Fooocus_KSampler": { "stars": 57, "last_update": "2024-05-22 20:39:48", - "author_account_age_days": 426 + "author_account_age_days": 427 }, "https://github.com/hustille/ComfyUI_hus_utils": { "stars": 6, "last_update": "2024-05-22 20:39:34", - "author_account_age_days": 426 + "author_account_age_days": 427 }, "https://github.com/hylarucoder/ComfyUI-Eagle-PNGInfo": { "stars": 7, "last_update": "2023-12-10 13:57:48", - "author_account_age_days": 3899 + "author_account_age_days": 3901 }, "https://github.com/iFREEGROUP/comfyui-undistort": { "stars": 1, "last_update": "2024-05-23 07:01:39", - "author_account_age_days": 1543 + "author_account_age_days": 1544 }, "https://github.com/icesun963/ComfyUI_HFDownLoad": { "stars": 0, "last_update": "2024-05-17 13:09:02", - "author_account_age_days": 4092 + "author_account_age_days": 4093 }, "https://github.com/idrirap/ComfyUI-Lora-Auto-Trigger-Words": { "stars": 90, "last_update": "2024-05-22 21:25:49", - "author_account_age_days": 3036 + "author_account_age_days": 3037 }, "https://github.com/iemesowum/ComfyUI_IsaacNodes": { "stars": 0, "last_update": "2024-05-20 13:52:39", - "author_account_age_days": 5278 + "author_account_age_days": 5279 }, "https://github.com/if-ai/ComfyUI-IF_AI_HFDownloaderNode": { "stars": 2, "last_update": "2024-05-22 22:31:30", - "author_account_age_days": 2849 + "author_account_age_days": 2850 }, "https://github.com/if-ai/ComfyUI-IF_AI_WishperSpeechNode": { "stars": 25, "last_update": "2024-05-22 22:02:55", - "author_account_age_days": 2849 + "author_account_age_days": 2850 }, "https://github.com/if-ai/ComfyUI-IF_AI_tools": { "stars": 325, "last_update": "2024-06-10 22:40:42", - "author_account_age_days": 2849 + "author_account_age_days": 2850 }, "https://github.com/imb101/ComfyUI-FaceSwap": { "stars": 28, "last_update": "2024-05-22 18:22:29", - "author_account_age_days": 875 + "author_account_age_days": 876 }, "https://github.com/jags111/ComfyUI_Jags_Audiotools": { "stars": 32, "last_update": "2024-05-19 18:54:12", - "author_account_age_days": 3857 + "author_account_age_days": 3858 }, "https://github.com/jags111/ComfyUI_Jags_VectorMagic": { "stars": 48, "last_update": "2024-05-19 18:49:42", - "author_account_age_days": 3857 + "author_account_age_days": 3858 }, "https://github.com/jags111/efficiency-nodes-comfyui": { - "stars": 650, + "stars": 654, "last_update": "2024-06-05 06:46:30", - "author_account_age_days": 3857 + "author_account_age_days": 3858 }, "https://github.com/jamal-alkharrat/ComfyUI_rotate_image": { "stars": 0, "last_update": "2024-05-22 23:19:02", - "author_account_age_days": 963 + "author_account_age_days": 964 }, "https://github.com/jamesWalker55/comfyui-p2ldgan": { "stars": 12, "last_update": "2024-05-22 18:19:04", - "author_account_age_days": 2513 + "author_account_age_days": 2515 }, "https://github.com/jamesWalker55/comfyui-various": { "stars": 27, "last_update": "2024-05-22 18:19:17", - "author_account_age_days": 2513 + "author_account_age_days": 2515 }, "https://github.com/jax-explorer/fast_video_comfyui": { "stars": 0, "last_update": "2024-05-23 01:17:35", - "author_account_age_days": 563 + "author_account_age_days": 564 }, "https://github.com/jeffy5/comfyui-faceless-node": { "stars": 11, "last_update": "2024-06-05 10:25:42", - "author_account_age_days": 2917 + "author_account_age_days": 2918 }, "https://github.com/jesenzhang/ComfyUI_StreamDiffusion": { "stars": 104, "last_update": "2024-05-23 02:40:36", - "author_account_age_days": 3638 + "author_account_age_days": 3639 }, "https://github.com/jiaxiangc/ComfyUI-ResAdapter": { "stars": 267, "last_update": "2024-05-23 00:22:23", - "author_account_age_days": 1272 + "author_account_age_days": 1274 }, "https://github.com/jitcoder/lora-info": { "stars": 42, "last_update": "2024-05-22 22:17:44", - "author_account_age_days": 4027 + "author_account_age_days": 4028 }, "https://github.com/jjkramhoeft/ComfyUI-Jjk-Nodes": { "stars": 4, "last_update": "2024-05-22 20:44:56", - "author_account_age_days": 3635 + "author_account_age_days": 3637 }, "https://github.com/jkrauss82/ultools-comfyui": { "stars": 5, "last_update": "2024-03-31 08:27:34", - "author_account_age_days": 4198 + "author_account_age_days": 4199 }, "https://github.com/jmkl/ComfyUI-ricing": { "stars": 9, "last_update": "2024-05-22 20:54:35", - "author_account_age_days": 4583 + "author_account_age_days": 4585 }, "https://github.com/jojkaart/ComfyUI-sampler-lcm-alternative": { "stars": 98, "last_update": "2024-05-22 21:31:41", - "author_account_age_days": 4784 + "author_account_age_days": 4786 }, "https://github.com/jordoh/ComfyUI-Deepface": { "stars": 10, "last_update": "2024-03-23 14:37:34", - "author_account_age_days": 4980 + "author_account_age_days": 4981 }, "https://github.com/jtrue/ComfyUI-JaRue": { "stars": 6, "last_update": "2023-12-25 17:55:50", - "author_account_age_days": 3916 + "author_account_age_days": 3917 }, "https://github.com/jtydhr88/ComfyUI-LayerDivider": { "stars": 40, "last_update": "2024-06-08 13:38:28", - "author_account_age_days": 4739 + "author_account_age_days": 4741 }, "https://github.com/jtydhr88/ComfyUI-Workflow-Encrypt": { "stars": 10, "last_update": "2024-04-07 02:47:17", - "author_account_age_days": 4739 + "author_account_age_days": 4741 }, "https://github.com/ka-puna/comfyui-yanc": { "stars": 6, "last_update": "2024-05-22 21:29:37", - "author_account_age_days": 2193 + "author_account_age_days": 2195 }, "https://github.com/kaanyalova/ComfyUI_ExtendedImageFormats": { "stars": 2, "last_update": "2024-06-03 13:20:01", - "author_account_age_days": 1253 + "author_account_age_days": 1254 }, "https://github.com/kadirnar/ComfyUI-Transformers": { "stars": 16, "last_update": "2024-05-23 12:34:26", - "author_account_age_days": 2316 + "author_account_age_days": 2317 }, "https://github.com/kale4eat/ComfyUI-path-util": { "stars": 0, "last_update": "2024-05-25 05:44:11", - "author_account_age_days": 1598 + "author_account_age_days": 1600 }, "https://github.com/kale4eat/ComfyUI-speech-dataset-toolkit": { "stars": 5, "last_update": "2024-05-23 00:25:02", - "author_account_age_days": 1598 + "author_account_age_days": 1600 }, "https://github.com/kale4eat/ComfyUI-string-util": { "stars": 1, "last_update": "2024-05-23 00:24:40", - "author_account_age_days": 1598 + "author_account_age_days": 1600 }, "https://github.com/kale4eat/ComfyUI-text-file-util": { "stars": 0, "last_update": "2024-05-23 00:24:51", - "author_account_age_days": 1598 + "author_account_age_days": 1600 }, "https://github.com/katalist-ai/comfyUI-nsfw-detection": { "stars": 1, "last_update": "2024-05-23 01:23:32", - "author_account_age_days": 740 + "author_account_age_days": 741 }, "https://github.com/kealiu/ComfyUI-S3-Tools": { "stars": 1, "last_update": "2024-05-23 01:10:44", - "author_account_age_days": 4114 + "author_account_age_days": 4116 }, "https://github.com/kealiu/ComfyUI-Zero123-Porting": { - "stars": 9, + "stars": 11, "last_update": "2024-05-23 01:11:13", - "author_account_age_days": 4114 + "author_account_age_days": 4116 }, "https://github.com/kealiu/ComfyUI-ZeroShot-MTrans": { - "stars": 124, + "stars": 127, "last_update": "2024-05-23 01:11:01", - "author_account_age_days": 4114 + "author_account_age_days": 4116 }, "https://github.com/kenjiqq/qq-nodes-comfyui": { "stars": 22, "last_update": "2024-05-22 21:34:53", - "author_account_age_days": 4876 + "author_account_age_days": 4877 }, "https://github.com/kft334/Knodes": { "stars": 3, "last_update": "2024-01-14 04:23:09", - "author_account_age_days": 945 + "author_account_age_days": 947 }, "https://github.com/kijai/ComfyUI-ADMotionDirector": { - "stars": 121, + "stars": 123, "last_update": "2024-06-01 17:55:31", - "author_account_age_days": 2169 + "author_account_age_days": 2171 }, "https://github.com/kijai/ComfyUI-APISR-KJ": { "stars": 55, "last_update": "2024-05-21 16:30:21", - "author_account_age_days": 2169 + "author_account_age_days": 2171 }, "https://github.com/kijai/ComfyUI-BrushNet-Wrapper": { "stars": 103, "last_update": "2024-05-21 16:49:05", - "author_account_age_days": 2169 + "author_account_age_days": 2171 }, "https://github.com/kijai/ComfyUI-CCSR": { - "stars": 141, + "stars": 143, "last_update": "2024-05-22 21:09:35", - "author_account_age_days": 2169 + "author_account_age_days": 2171 }, "https://github.com/kijai/ComfyUI-DDColor": { - "stars": 77, + "stars": 78, "last_update": "2024-05-21 16:04:26", - "author_account_age_days": 2169 + "author_account_age_days": 2171 }, "https://github.com/kijai/ComfyUI-DiffusionLight": { "stars": 48, "last_update": "2024-05-21 16:16:52", - "author_account_age_days": 2169 + "author_account_age_days": 2171 }, "https://github.com/kijai/ComfyUI-DynamiCrafterWrapper": { - "stars": 434, + "stars": 445, "last_update": "2024-06-09 11:19:05", - "author_account_age_days": 2169 + "author_account_age_days": 2171 }, "https://github.com/kijai/ComfyUI-ELLA-wrapper": { "stars": 102, "last_update": "2024-05-21 16:47:28", - "author_account_age_days": 2169 + "author_account_age_days": 2171 }, "https://github.com/kijai/ComfyUI-Geowizard": { "stars": 80, "last_update": "2024-05-28 14:08:34", - "author_account_age_days": 2169 + "author_account_age_days": 2171 }, "https://github.com/kijai/ComfyUI-IC-Light": { - "stars": 364, + "stars": 368, "last_update": "2024-05-25 07:37:51", - "author_account_age_days": 2169 + "author_account_age_days": 2171 }, "https://github.com/kijai/ComfyUI-KJNodes": { - "stars": 309, + "stars": 311, "last_update": "2024-06-10 14:46:27", - "author_account_age_days": 2169 + "author_account_age_days": 2171 }, "https://github.com/kijai/ComfyUI-LaVi-Bridge-Wrapper": { "stars": 19, "last_update": "2024-05-21 16:41:18", - "author_account_age_days": 2169 + "author_account_age_days": 2171 }, "https://github.com/kijai/ComfyUI-Marigold": { - "stars": 369, - "last_update": "2024-06-04 16:24:13", - "author_account_age_days": 2169 + "stars": 370, + "last_update": "2024-06-11 10:40:36", + "author_account_age_days": 2171 }, "https://github.com/kijai/ComfyUI-SUPIR": { - "stars": 1126, + "stars": 1133, "last_update": "2024-05-21 14:56:36", - "author_account_age_days": 2169 + "author_account_age_days": 2171 }, "https://github.com/kijai/ComfyUI-SVD": { "stars": 152, "last_update": "2024-05-22 21:09:54", - "author_account_age_days": 2169 + "author_account_age_days": 2171 }, "https://github.com/kijai/ComfyUI-depth-fm": { "stars": 53, "last_update": "2024-05-22 21:10:15", - "author_account_age_days": 2169 + "author_account_age_days": 2171 }, "https://github.com/kijai/ComfyUI-moondream": { - "stars": 73, + "stars": 74, "last_update": "2024-05-22 21:10:33", - "author_account_age_days": 2169 + "author_account_age_days": 2171 }, "https://github.com/kinfolk0117/ComfyUI_GradientDeepShrink": { "stars": 23, "last_update": "2024-05-22 21:25:13", - "author_account_age_days": 455 + "author_account_age_days": 456 }, "https://github.com/kinfolk0117/ComfyUI_Pilgram": { - "stars": 6, + "stars": 7, "last_update": "2024-05-22 21:25:24", - "author_account_age_days": 455 + "author_account_age_days": 456 }, "https://github.com/kinfolk0117/ComfyUI_SimpleTiles": { "stars": 24, "last_update": "2024-05-22 21:25:01", - "author_account_age_days": 455 + "author_account_age_days": 456 }, "https://github.com/klinter007/klinter_nodes": { "stars": 4, "last_update": "2024-05-02 14:41:48", - "author_account_age_days": 412 + "author_account_age_days": 413 }, "https://github.com/knuknX/ComfyUI-Image-Tools": { "stars": 3, "last_update": "2024-01-01 03:30:49", - "author_account_age_days": 186 + "author_account_age_days": 188 }, "https://github.com/kohya-ss/ControlNet-LLLite-ComfyUI": { "stars": 145, "last_update": "2024-05-22 20:44:44", - "author_account_age_days": 1795 + "author_account_age_days": 1797 }, "https://github.com/komojini/ComfyUI_SDXL_DreamBooth_LoRA_CustomNodes": { "stars": 3, "last_update": "2024-05-22 21:34:27", - "author_account_age_days": 569 + "author_account_age_days": 571 }, "https://github.com/komojini/komojini-comfyui-nodes": { - "stars": 61, + "stars": 62, "last_update": "2024-05-22 21:34:39", - "author_account_age_days": 569 + "author_account_age_days": 571 }, "https://github.com/kunieone/ComfyUI_alkaid": { "stars": 0, "last_update": "2024-05-23 01:10:21", - "author_account_age_days": 2506 + "author_account_age_days": 2507 }, "https://github.com/kwaroran/abg-comfyui": { "stars": 22, "last_update": "2024-05-22 18:19:51", - "author_account_age_days": 594 + "author_account_age_days": 595 }, "https://github.com/l20richo/ComfyUI-Azure-Blob-Storage": { "stars": 1, "last_update": "2024-06-06 06:27:02", - "author_account_age_days": 1153 + "author_account_age_days": 1155 }, "https://github.com/laksjdjf/Batch-Condition-ComfyUI": { "stars": 1, "last_update": "2024-05-22 20:42:42", - "author_account_age_days": 2817 + "author_account_age_days": 2819 }, "https://github.com/laksjdjf/LCMSampler-ComfyUI": { "stars": 14, "last_update": "2024-05-22 20:42:17", - "author_account_age_days": 2817 + "author_account_age_days": 2819 }, "https://github.com/laksjdjf/LoRTnoC-ComfyUI": { - "stars": 10, + "stars": 11, "last_update": "2024-05-22 20:42:29", - "author_account_age_days": 2817 + "author_account_age_days": 2819 }, "https://github.com/laksjdjf/cd-tuner_negpip-ComfyUI": { - "stars": 18, + "stars": 19, "last_update": "2024-05-22 20:42:04", - "author_account_age_days": 2817 + "author_account_age_days": 2819 }, "https://github.com/laksjdjf/cgem156-ComfyUI": { - "stars": 28, + "stars": 29, "last_update": "2024-06-08 01:09:03", - "author_account_age_days": 2817 + "author_account_age_days": 2819 }, "https://github.com/laksjdjf/pfg-ComfyUI": { "stars": 10, "last_update": "2024-05-22 20:41:41", - "author_account_age_days": 2817 + "author_account_age_days": 2819 }, "https://github.com/larsupb/LoRA-Merger-ComfyUI": { "stars": 9, "last_update": "2024-06-05 16:41:02", - "author_account_age_days": 3062 + "author_account_age_days": 3063 }, "https://github.com/leoleelxh/ComfyUI-LLMs": { "stars": 6, "last_update": "2024-03-07 07:34:10", - "author_account_age_days": 4061 + "author_account_age_days": 4063 }, "https://github.com/lilly1987/ComfyUI_node_Lilly": { "stars": 49, "last_update": "2024-05-22 17:53:19", - "author_account_age_days": 2896 + "author_account_age_days": 2897 }, "https://github.com/linshier/comfyui-remote-tools": { "stars": 1, "last_update": "2024-05-28 07:44:23", - "author_account_age_days": 3778 + "author_account_age_days": 3780 }, "https://github.com/liusida/ComfyUI-AutoCropFaces": { "stars": 14, "last_update": "2024-05-20 06:51:57", - "author_account_age_days": 3194 + "author_account_age_days": 3195 }, "https://github.com/liusida/ComfyUI-Debug": { "stars": 6, "last_update": "2024-04-07 11:33:02", - "author_account_age_days": 3194 + "author_account_age_days": 3195 }, "https://github.com/liusida/ComfyUI-Login": { "stars": 34, "last_update": "2024-06-07 08:03:47", - "author_account_age_days": 3194 + "author_account_age_days": 3195 }, "https://github.com/ljleb/comfy-mecha": { - "stars": 8, - "last_update": "2024-05-26 14:57:05", - "author_account_age_days": 2450 + "stars": 9, + "last_update": "2024-06-12 02:11:58", + "author_account_age_days": 2451 }, "https://github.com/lks-ai/ComfyUI-StableAudioSampler": { - "stars": 138, - "last_update": "2024-06-10 15:07:28", - "author_account_age_days": 86 + "stars": 153, + "last_update": "2024-06-11 20:37:12", + "author_account_age_days": 87 }, "https://github.com/lks-ai/anynode": { - "stars": 367, - "last_update": "2024-06-08 10:18:17", - "author_account_age_days": 86 + "stars": 376, + "last_update": "2024-06-11 16:24:50", + "author_account_age_days": 87 }, "https://github.com/lldacing/comfyui-easyapi-nodes": { "stars": 25, "last_update": "2024-05-24 02:51:26", - "author_account_age_days": 2079 + "author_account_age_days": 2081 }, "https://github.com/logtd/ComfyUI-FLATTEN": { "stars": 59, "last_update": "2024-06-10 03:33:47", - "author_account_age_days": 108 + "author_account_age_days": 110 }, "https://github.com/logtd/ComfyUI-InstanceDiffusion": { - "stars": 137, + "stars": 138, "last_update": "2024-05-22 00:02:08", - "author_account_age_days": 108 + "author_account_age_days": 110 }, "https://github.com/logtd/ComfyUI-InversedNoise": { "stars": 5, "last_update": "2024-05-22 00:10:18", - "author_account_age_days": 108 + "author_account_age_days": 110 }, "https://github.com/logtd/ComfyUI-RAVE_ATTN": { "stars": 9, "last_update": "2024-05-22 00:20:03", - "author_account_age_days": 108 + "author_account_age_days": 110 }, "https://github.com/logtd/ComfyUI-RefSampling": { "stars": 4, "last_update": "2024-05-22 00:04:40", - "author_account_age_days": 108 + "author_account_age_days": 110 }, "https://github.com/logtd/ComfyUI-TrackingNodes": { "stars": 15, "last_update": "2024-05-22 00:03:27", - "author_account_age_days": 108 + "author_account_age_days": 110 }, "https://github.com/longgui0318/comfyui-llm-assistant": { "stars": 5, "last_update": "2024-05-22 23:13:46", - "author_account_age_days": 4151 + "author_account_age_days": 4152 }, "https://github.com/longgui0318/comfyui-magic-clothing": { - "stars": 19, - "last_update": "2024-06-10 15:35:06", - "author_account_age_days": 4151 + "stars": 20, + "last_update": "2024-06-11 21:10:33", + "author_account_age_days": 4152 }, "https://github.com/longgui0318/comfyui-mask-util": { "stars": 4, "last_update": "2024-06-09 13:39:50", - "author_account_age_days": 4151 + "author_account_age_days": 4152 }, "https://github.com/longgui0318/comfyui-oms-diffusion": { - "stars": 19, - "last_update": "2024-06-10 15:35:06", - "author_account_age_days": 4151 + "stars": 20, + "last_update": "2024-06-11 21:10:33", + "author_account_age_days": 4152 }, "https://github.com/lquesada/ComfyUI-Inpaint-CropAndStitch": { - "stars": 128, - "last_update": "2024-06-10 19:59:30", - "author_account_age_days": 4037 + "stars": 135, + "last_update": "2024-06-11 03:36:02", + "author_account_age_days": 4038 }, "https://github.com/lquesada/ComfyUI-Prompt-Combinator": { "stars": 17, "last_update": "2024-05-25 18:04:20", - "author_account_age_days": 4037 + "author_account_age_days": 4038 }, "https://github.com/ltdrdata/ComfyUI-Impact-Pack": { - "stars": 1337, - "last_update": "2024-06-10 10:03:33", - "author_account_age_days": 448 + "stars": 1343, + "last_update": "2024-06-11 14:22:00", + "author_account_age_days": 450 }, "https://github.com/ltdrdata/ComfyUI-Inspire-Pack": { - "stars": 277, + "stars": 278, "last_update": "2024-06-08 07:33:19", - "author_account_age_days": 448 + "author_account_age_days": 450 }, "https://github.com/ltdrdata/ComfyUI-Manager": { - "stars": 4156, - "last_update": "2024-06-11 00:06:56", - "author_account_age_days": 448 + "stars": 4175, + "last_update": "2024-06-12 06:40:45", + "author_account_age_days": 450 }, "https://github.com/luandev/ComfyUI-CrewAI": { - "stars": 3, + "stars": 4, "last_update": "2024-06-05 20:06:37", - "author_account_age_days": 3794 + "author_account_age_days": 3795 }, "https://github.com/m-sokes/ComfyUI-Sokes-Nodes": { "stars": 1, "last_update": "2024-05-22 20:36:07", - "author_account_age_days": 302 + "author_account_age_days": 303 }, "https://github.com/madtunebk/ComfyUI-ControlnetAux": { "stars": 8, "last_update": "2024-06-04 12:14:51", - "author_account_age_days": 447 + "author_account_age_days": 449 }, "https://github.com/mape/ComfyUI-mape-Helpers": { "stars": 115, "last_update": "2024-05-22 23:19:13", - "author_account_age_days": 5741 + "author_account_age_days": 5742 }, "https://github.com/maracman/ComfyUI-SubjectStyle-CSV": { "stars": 3, "last_update": "2024-02-29 19:40:01", - "author_account_age_days": 1153 + "author_account_age_days": 1154 }, "https://github.com/marduk191/comfyui-marnodes": { "stars": 0, - "last_update": "2024-06-09 06:39:04", - "author_account_age_days": 4401 + "last_update": "2024-06-12 06:15:43", + "author_account_age_days": 4402 }, "https://github.com/marhensa/sdxl-recommended-res-calc": { - "stars": 50, + "stars": 51, "last_update": "2024-05-22 20:46:17", - "author_account_age_days": 4761 + "author_account_age_days": 4763 }, "https://github.com/martijnat/comfyui-previewlatent": { - "stars": 28, + "stars": 29, "last_update": "2024-05-22 21:28:39", - "author_account_age_days": 2818 + "author_account_age_days": 2819 }, "https://github.com/massao000/ComfyUI_aspect_ratios": { "stars": 5, "last_update": "2024-05-22 22:23:10", - "author_account_age_days": 1393 + "author_account_age_days": 1395 }, "https://github.com/matan1905/ComfyUI-Serving-Toolkit": { "stars": 37, "last_update": "2024-06-04 19:15:36", - "author_account_age_days": 2726 + "author_account_age_days": 2727 }, "https://github.com/mav-rik/facerestore_cf": { - "stars": 149, + "stars": 150, "last_update": "2024-05-22 20:53:23", - "author_account_age_days": 2907 + "author_account_age_days": 2908 }, "https://github.com/mbrostami/ComfyUI-HF": { "stars": 15, "last_update": "2024-05-27 21:45:33", - "author_account_age_days": 4308 + "author_account_age_days": 4309 }, "https://github.com/mbrostami/ComfyUI-TITrain": { "stars": 7, "last_update": "2024-05-27 21:50:06", - "author_account_age_days": 4308 + "author_account_age_days": 4309 }, "https://github.com/mcmonkeyprojects/sd-dynamic-thresholding": { - "stars": 1046, + "stars": 1048, "last_update": "2024-05-24 16:09:17", - "author_account_age_days": 2088 + "author_account_age_days": 2089 }, "https://github.com/meap158/ComfyUI-Background-Replacement": { "stars": 34, "last_update": "2024-05-22 20:43:52", - "author_account_age_days": 3189 + "author_account_age_days": 3191 }, "https://github.com/meap158/ComfyUI-GPU-temperature-protection": { "stars": 3, "last_update": "2024-05-22 20:43:21", - "author_account_age_days": 3189 + "author_account_age_days": 3191 }, "https://github.com/meap158/ComfyUI-Prompt-Expansion": { "stars": 60, "last_update": "2024-05-22 20:43:37", - "author_account_age_days": 3189 + "author_account_age_days": 3191 }, "https://github.com/melMass/comfy_mtb": { "stars": 327, "last_update": "2024-06-09 17:20:03", - "author_account_age_days": 3732 + "author_account_age_days": 3733 }, "https://github.com/mephisto83/petty-paint-comfyui-node": { "stars": 1, "last_update": "2024-05-23 01:21:05", - "author_account_age_days": 3659 + "author_account_age_days": 3660 }, "https://github.com/meshmesh-io/ComfyUI-MeshMesh": { "stars": 0, "last_update": "2024-05-23 00:10:09", - "author_account_age_days": 215 + "author_account_age_days": 216 }, "https://github.com/meshmesh-io/mm-comfyui-loopback": { "stars": 1, "last_update": "2024-05-23 00:09:57", - "author_account_age_days": 215 + "author_account_age_days": 216 }, "https://github.com/meshmesh-io/mm-comfyui-megamask": { "stars": 0, "last_update": "2024-05-23 00:09:47", - "author_account_age_days": 215 + "author_account_age_days": 216 }, "https://github.com/mihaiiancu/ComfyUI_Inpaint": { "stars": 9, "last_update": "2024-05-22 18:19:38", - "author_account_age_days": 2648 + "author_account_age_days": 2649 }, "https://github.com/mikkel/ComfyUI-text-overlay": { - "stars": 27, + "stars": 28, "last_update": "2024-05-22 21:13:59", - "author_account_age_days": 5903 + "author_account_age_days": 5904 }, "https://github.com/mikkel/comfyui-mask-boundingbox": { "stars": 24, "last_update": "2024-05-22 21:26:23", - "author_account_age_days": 5903 + "author_account_age_days": 5904 }, "https://github.com/mirabarukaso/ComfyUI_Mira": { - "stars": 18, + "stars": 19, "last_update": "2024-06-07 16:16:49", - "author_account_age_days": 1207 + "author_account_age_days": 1208 }, "https://github.com/modusCell/ComfyUI-dimension-node-modusCell": { "stars": 0, "last_update": "2024-05-22 22:08:50", - "author_account_age_days": 4590 + "author_account_age_days": 4591 }, "https://github.com/moyi7712/ComfyUI_Seamless_Patten": { "stars": 7, "last_update": "2024-05-28 16:13:06", - "author_account_age_days": 2287 + "author_account_age_days": 2289 }, "https://github.com/mozman/ComfyUI_mozman_nodes": { "stars": 0, "last_update": "2024-05-22 22:13:32", - "author_account_age_days": 4066 + "author_account_age_days": 4068 }, "https://github.com/mpiquero7164/ComfyUI-SaveImgPrompt": { "stars": 15, "last_update": "2023-08-14 11:27:09", - "author_account_age_days": 2595 + "author_account_age_days": 2596 }, "https://github.com/muzi12888/ComfyUI-PoseKeypoint-Mask": { "stars": 4, "last_update": "2024-05-28 14:09:23", - "author_account_age_days": 2932 + "author_account_age_days": 2933 }, "https://github.com/nagolinc/ComfyUI_FastVAEDecorder_SDXL": { "stars": 2, "last_update": "2024-05-22 20:44:17", - "author_account_age_days": 3660 + "author_account_age_days": 3662 }, "https://github.com/nat-chan/ComfyUI-graphToPrompt": { "stars": 0, "last_update": "2024-05-23 01:16:40", - "author_account_age_days": 2979 + "author_account_age_days": 2981 }, "https://github.com/nat-chan/comfyui-paint": { "stars": 2, "last_update": "2024-05-20 01:58:39", - "author_account_age_days": 2979 + "author_account_age_days": 2981 }, "https://github.com/nat-chan/comfyui-transceiver": { "stars": 3, "last_update": "2024-05-23 01:16:28", - "author_account_age_days": 2979 + "author_account_age_days": 2981 }, "https://github.com/nathannlu/ComfyUI-Cloud": { - "stars": 129, - "last_update": "2024-06-11 00:01:50", - "author_account_age_days": 2712 + "stars": 131, + "last_update": "2024-06-12 06:23:29", + "author_account_age_days": 2713 }, "https://github.com/nathannlu/ComfyUI-Pets": { "stars": 36, "last_update": "2024-03-31 23:55:42", - "author_account_age_days": 2712 + "author_account_age_days": 2713 }, "https://github.com/natto-maki/ComfyUI-NegiTools": { "stars": 26, "last_update": "2024-05-22 21:31:17", - "author_account_age_days": 264 + "author_account_age_days": 265 }, "https://github.com/nickve28/ComfyUI-Nich-Utils": { "stars": 8, "last_update": "2024-05-23 00:22:57", - "author_account_age_days": 4015 + "author_account_age_days": 4016 }, "https://github.com/ningxiaoxiao/comfyui-NDI": { "stars": 35, "last_update": "2024-03-07 02:08:05", - "author_account_age_days": 2974 + "author_account_age_days": 2975 }, "https://github.com/nirbhay-faaya/ImgProcessing_ComfyUI": { "stars": 0, "last_update": "2024-05-27 15:42:25", - "author_account_age_days": 322 + "author_account_age_days": 323 }, "https://github.com/nirex0/ComfyUI_pytorch_openpose": { "stars": 2, "last_update": "2024-05-29 10:51:41", - "author_account_age_days": 3489 + "author_account_age_days": 3490 }, "https://github.com/nkchocoai/ComfyUI-Dart": { - "stars": 16, + "stars": 17, "last_update": "2024-05-22 23:11:22", - "author_account_age_days": 146 + "author_account_age_days": 147 }, "https://github.com/nkchocoai/ComfyUI-PromptUtilities": { "stars": 6, "last_update": "2024-05-22 23:10:42", - "author_account_age_days": 146 + "author_account_age_days": 147 }, "https://github.com/nkchocoai/ComfyUI-SaveImageWithMetaData": { "stars": 8, "last_update": "2024-05-27 13:41:13", - "author_account_age_days": 146 + "author_account_age_days": 147 }, "https://github.com/nkchocoai/ComfyUI-SizeFromPresets": { "stars": 4, "last_update": "2024-05-22 23:10:30", - "author_account_age_days": 146 + "author_account_age_days": 147 }, "https://github.com/nkchocoai/ComfyUI-TextOnSegs": { "stars": 5, "last_update": "2024-05-22 23:10:55", - "author_account_age_days": 146 + "author_account_age_days": 147 }, "https://github.com/noembryo/ComfyUI-noEmbryo": { "stars": 11, "last_update": "2024-06-04 11:27:45", - "author_account_age_days": 2729 + "author_account_age_days": 2730 }, "https://github.com/nosiu/comfyui-instantId-faceswap": { "stars": 160, "last_update": "2024-05-22 23:21:38", - "author_account_age_days": 3891 + "author_account_age_days": 3892 }, "https://github.com/noxinias/ComfyUI_NoxinNodes": { "stars": 7, "last_update": "2024-05-22 21:24:24", - "author_account_age_days": 2547 + "author_account_age_days": 2548 }, "https://github.com/ntc-ai/ComfyUI-DARE-LoRA-Merge": { "stars": 21, "last_update": "2024-05-22 22:22:14", - "author_account_age_days": 1704 + "author_account_age_days": 1705 }, "https://github.com/nuanarchy/ComfyUI-NuA-FlashFace": { - "stars": 5, + "stars": 6, "last_update": "2024-06-09 09:03:55", - "author_account_age_days": 1078 + "author_account_age_days": 1080 }, "https://github.com/nullquant/ComfyUI-BrushNet": { - "stars": 320, + "stars": 328, "last_update": "2024-06-03 08:17:17", - "author_account_age_days": 1163 + "author_account_age_days": 1164 }, "https://github.com/olduvai-jp/ComfyUI-HfLoader": { "stars": 3, "last_update": "2024-05-23 00:14:52", - "author_account_age_days": 862 + "author_account_age_days": 864 }, "https://github.com/omar92/ComfyUI-QualityOfLifeSuit_Omar92": { "stars": 106, "last_update": "2024-06-03 11:02:37", - "author_account_age_days": 4493 + "author_account_age_days": 4494 }, "https://github.com/osi1880vr/prompt_quill_comfyui": { - "stars": 8, + "stars": 9, "last_update": "2024-05-23 01:18:37", - "author_account_age_days": 1063 + "author_account_age_days": 1064 }, "https://github.com/ostris/ostris_nodes_comfyui": { "stars": 19, "last_update": "2024-05-22 21:23:24", - "author_account_age_days": 2389 + "author_account_age_days": 2390 }, "https://github.com/ownimage/ComfyUI-ownimage": { "stars": 0, "last_update": "2024-05-22 22:22:37", - "author_account_age_days": 2769 + "author_account_age_days": 2771 }, "https://github.com/oyvindg/ComfyUI-TrollSuite": { "stars": 0, "last_update": "2024-05-22 21:32:03", - "author_account_age_days": 2316 + "author_account_age_days": 2317 }, "https://github.com/oztrkoguz/ComfyUI_StoryCreator": { - "stars": 15, + "stars": 16, "last_update": "2024-05-23 12:18:45", - "author_account_age_days": 828 + "author_account_age_days": 829 }, "https://github.com/palant/extended-saveimage-comfyui": { "stars": 10, "last_update": "2024-03-27 14:08:21", - "author_account_age_days": 5039 + "author_account_age_days": 5041 }, "https://github.com/palant/image-resize-comfyui": { - "stars": 59, + "stars": 60, "last_update": "2024-01-18 20:59:55", - "author_account_age_days": 5039 + "author_account_age_days": 5041 }, "https://github.com/palant/integrated-nodes-comfyui": { "stars": 31, "last_update": "2023-12-27 22:52:00", - "author_account_age_days": 5039 + "author_account_age_days": 5041 }, "https://github.com/pamparamm/sd-perturbed-attention": { "stars": 169, "last_update": "2024-05-25 17:44:47", - "author_account_age_days": 2117 + "author_account_age_days": 2119 }, "https://github.com/pants007/comfy-pants": { "stars": 2, "last_update": "2024-05-22 18:16:04", - "author_account_age_days": 2303 + "author_account_age_days": 2305 }, "https://github.com/paulo-coronado/comfy_clip_blip_node": { "stars": 25, "last_update": "2024-05-22 17:39:09", - "author_account_age_days": 2673 + "author_account_age_days": 2674 }, "https://github.com/philz1337x/ComfyUI-ClarityAI": { - "stars": 37, + "stars": 39, "last_update": "2024-05-23 01:19:05", - "author_account_age_days": 650 + "author_account_age_days": 651 }, "https://github.com/phineas-pta/comfyui-auto-nodes-layout": { "stars": 17, "last_update": "2024-05-22 20:56:33", - "author_account_age_days": 2275 + "author_account_age_days": 2276 }, "https://github.com/picturesonpictures/comfy_PoP": { "stars": 12, "last_update": "2024-05-22 20:51:32", - "author_account_age_days": 573 + "author_account_age_days": 575 }, "https://github.com/pkpkTech/ComfyUI-SaveAVIF": { "stars": 0, "last_update": "2024-05-22 22:19:21", - "author_account_age_days": 1489 + "author_account_age_days": 1491 }, "https://github.com/pkpkTech/ComfyUI-SaveQueues": { "stars": 1, "last_update": "2024-05-22 22:19:54", - "author_account_age_days": 1489 + "author_account_age_days": 1491 }, "https://github.com/pkpkTech/ComfyUI-TemporaryLoader": { "stars": 1, "last_update": "2024-05-22 22:19:44", - "author_account_age_days": 1489 + "author_account_age_days": 1491 }, "https://github.com/pkpkTech/ComfyUI-ngrok": { "stars": 3, "last_update": "2024-05-22 22:19:32", - "author_account_age_days": 1489 + "author_account_age_days": 1491 }, "https://github.com/portu-sim/comfyui_bmab": { "stars": 21, "last_update": "2024-06-09 14:22:04", - "author_account_age_days": 308 + "author_account_age_days": 310 }, "https://github.com/prodogape/ComfyUI-EasyOCR": { "stars": 5, "last_update": "2024-06-01 11:11:25", - "author_account_age_days": 1016 + "author_account_age_days": 1018 }, "https://github.com/prodogape/ComfyUI-Minio": { "stars": 2, "last_update": "2024-05-23 00:13:38", - "author_account_age_days": 1016 + "author_account_age_days": 1018 }, "https://github.com/prodogape/ComfyUI-OmDet": { "stars": 2, "last_update": "2024-06-05 06:47:45", - "author_account_age_days": 1016 + "author_account_age_days": 1018 }, "https://github.com/prozacgod/comfyui-pzc-multiworkspace": { "stars": 7, "last_update": "2024-05-22 23:11:46", - "author_account_age_days": 5554 + "author_account_age_days": 5556 }, "https://github.com/pythongosssss/ComfyUI-Custom-Scripts": { - "stars": 1274, + "stars": 1282, "last_update": "2024-06-10 11:49:03", - "author_account_age_days": 484 + "author_account_age_days": 485 }, "https://github.com/pythongosssss/ComfyUI-WD14-Tagger": { - "stars": 399, + "stars": 400, "last_update": "2024-05-25 18:12:08", - "author_account_age_days": 484 + "author_account_age_days": 485 }, "https://github.com/qwixiwp/queuetools": { "stars": 0, "last_update": "2024-02-26 19:21:00", - "author_account_age_days": 597 + "author_account_age_days": 599 }, "https://github.com/ramyma/A8R8_ComfyUI_nodes": { "stars": 4, "last_update": "2024-05-22 20:55:02", - "author_account_age_days": 3203 + "author_account_age_days": 3205 }, "https://github.com/randjtw/advance-aesthetic-score": { "stars": 0, "last_update": "2024-05-23 01:14:47", - "author_account_age_days": 747 + "author_account_age_days": 748 }, "https://github.com/ratulrafsan/Comfyui-SAL-VTON": { - "stars": 51, + "stars": 53, "last_update": "2024-05-23 00:17:20", - "author_account_age_days": 4480 + "author_account_age_days": 4482 }, "https://github.com/rcfcu2000/zhihuige-nodes-comfyui": { "stars": 0, "last_update": "2024-05-22 22:13:55", - "author_account_age_days": 3411 + "author_account_age_days": 3412 }, "https://github.com/rcsaquino/comfyui-custom-nodes": { "stars": 1, "last_update": "2024-05-22 22:13:43", - "author_account_age_days": 1497 + "author_account_age_days": 1499 }, "https://github.com/receyuki/comfyui-prompt-reader-node": { "stars": 199, "last_update": "2024-06-06 23:39:40", - "author_account_age_days": 2579 + "author_account_age_days": 2580 }, "https://github.com/redhottensors/ComfyUI-Prediction": { "stars": 9, "last_update": "2024-05-13 19:58:16", - "author_account_age_days": 125 + "author_account_age_days": 127 }, "https://github.com/rgthree/rgthree-comfy": { - "stars": 661, - "last_update": "2024-06-09 19:29:29", - "author_account_age_days": 4961 + "stars": 667, + "last_update": "2024-06-12 02:33:32", + "author_account_age_days": 4962 }, "https://github.com/richinsley/Comfy-LFO": { "stars": 5, "last_update": "2024-05-22 20:46:30", - "author_account_age_days": 2667 + "author_account_age_days": 2668 }, "https://github.com/ricklove/comfyui-ricklove": { "stars": 0, "last_update": "2024-05-22 23:21:25", - "author_account_age_days": 4819 + "author_account_age_days": 4820 }, "https://github.com/risunobushi/comfyUI_FrequencySeparation_RGB-HSV": { - "stars": 4, + "stars": 6, "last_update": "2024-06-07 16:16:59", - "author_account_age_days": 633 + "author_account_age_days": 635 }, "https://github.com/rklaffehn/rk-comfy-nodes": { "stars": 2, "last_update": "2024-01-23 17:12:45", - "author_account_age_days": 279 + "author_account_age_days": 280 }, "https://github.com/romeobuilderotti/ComfyUI-PNG-Metadata": { "stars": 4, "last_update": "2024-05-22 21:29:25", - "author_account_age_days": 277 + "author_account_age_days": 278 }, "https://github.com/ronniebasak/ComfyUI-Tara-LLM-Integration": { - "stars": 65, + "stars": 66, "last_update": "2024-05-09 06:26:16", - "author_account_age_days": 4141 + "author_account_age_days": 4142 }, "https://github.com/royceschultz/ComfyUI-Notifications": { "stars": 4, "last_update": "2024-05-23 01:23:16", - "author_account_age_days": 2516 + "author_account_age_days": 2517 }, "https://github.com/royceschultz/ComfyUI-TranscriptionTools": { "stars": 12, "last_update": "2024-05-23 01:10:10", - "author_account_age_days": 2516 + "author_account_age_days": 2517 }, "https://github.com/rui40000/RUI-Nodes": { "stars": 14, "last_update": "2024-05-22 22:12:26", - "author_account_age_days": 460 + "author_account_age_days": 462 }, "https://github.com/ruiqutech/ComfyUI-RuiquNodes": { "stars": 0, "last_update": "2024-05-23 01:21:50", - "author_account_age_days": 56 + "author_account_age_days": 57 }, "https://github.com/runtime44/comfyui_r44_nodes": { "stars": 24, - "last_update": "2024-06-10 10:34:49", - "author_account_age_days": 154 + "last_update": "2024-06-11 10:49:02", + "author_account_age_days": 155 }, "https://github.com/saftle/suplex_comfy_nodes": { "stars": 0, "last_update": "2024-05-29 13:09:25", - "author_account_age_days": 4744 + "author_account_age_days": 4745 }, "https://github.com/sdfxai/SDFXBridgeForComfyUI": { "stars": 3, "last_update": "2024-04-12 14:09:45", - "author_account_age_days": 221 + "author_account_age_days": 222 }, "https://github.com/seanlynch/comfyui-optical-flow": { "stars": 24, "last_update": "2024-05-22 20:52:17", - "author_account_age_days": 5291 + "author_account_age_days": 5293 }, "https://github.com/seanlynch/srl-nodes": { "stars": 3, "last_update": "2024-05-22 21:08:00", - "author_account_age_days": 5291 + "author_account_age_days": 5293 }, "https://github.com/sergekatzmann/ComfyUI_Nimbus-Pack": { "stars": 2, "last_update": "2024-05-22 21:34:15", - "author_account_age_days": 3319 + "author_account_age_days": 3320 }, "https://github.com/shadowcz007/comfyui-Image-reward": { "stars": 20, "last_update": "2024-03-25 05:41:04", - "author_account_age_days": 3301 + "author_account_age_days": 3302 }, "https://github.com/shadowcz007/comfyui-consistency-decoder": { "stars": 1, "last_update": "2024-02-02 01:46:54", - "author_account_age_days": 3301 + "author_account_age_days": 3302 }, "https://github.com/shadowcz007/comfyui-mixlab-nodes": { - "stars": 848, + "stars": 850, "last_update": "2024-06-08 09:41:49", - "author_account_age_days": 3301 + "author_account_age_days": 3302 }, "https://github.com/shadowcz007/comfyui-sound-lab": { - "stars": 9, - "last_update": "2024-06-09 10:21:38", - "author_account_age_days": 3301 + "stars": 17, + "last_update": "2024-06-12 04:15:46", + "author_account_age_days": 3302 }, "https://github.com/shadowcz007/comfyui-ultralytics-yolo": { - "stars": 15, + "stars": 16, "last_update": "2024-06-05 10:29:22", - "author_account_age_days": 3301 + "author_account_age_days": 3302 }, "https://github.com/shi3z/ComfyUI_Memeplex_DALLE": { "stars": 2, "last_update": "2024-05-23 00:14:25", - "author_account_age_days": 5079 + "author_account_age_days": 5081 }, "https://github.com/shiimizu/ComfyUI-PhotoMaker-Plus": { "stars": 141, "last_update": "2024-04-17 09:02:51", - "author_account_age_days": 1751 + "author_account_age_days": 1753 }, "https://github.com/shiimizu/ComfyUI-TiledDiffusion": { - "stars": 198, + "stars": 200, "last_update": "2024-05-14 22:01:41", - "author_account_age_days": 1751 + "author_account_age_days": 1753 }, "https://github.com/shiimizu/ComfyUI_smZNodes": { - "stars": 140, + "stars": 141, "last_update": "2024-05-22 18:13:30", - "author_account_age_days": 1751 + "author_account_age_days": 1753 }, "https://github.com/shingo1228/ComfyUI-SDXL-EmptyLatentImage": { "stars": 25, "last_update": "2024-05-22 20:41:29", - "author_account_age_days": 2209 + "author_account_age_days": 2211 }, "https://github.com/shingo1228/ComfyUI-send-eagle-slim": { "stars": 19, "last_update": "2024-05-22 20:41:15", - "author_account_age_days": 2209 + "author_account_age_days": 2211 }, "https://github.com/shinich39/comfyui-load-image-in-seq": { "stars": 3, "last_update": "2024-05-23 00:20:53", - "author_account_age_days": 299 + "author_account_age_days": 300 }, "https://github.com/shinich39/comfyui-local-db": { "stars": 1, "last_update": "2024-05-23 00:21:08", - "author_account_age_days": 299 + "author_account_age_days": 300 }, "https://github.com/shinich39/comfyui-ramdom-node": { "stars": 2, "last_update": "2024-05-29 06:05:30", - "author_account_age_days": 299 + "author_account_age_days": 300 + }, + "https://github.com/shobhitic/ComfyUI-PlusMinusTextClip": { + "stars": 0, + "last_update": "2024-06-11 20:16:29", + "author_account_age_days": 4295 }, "https://github.com/shockz0rz/ComfyUI_InterpolateEverything": { "stars": 22, "last_update": "2024-05-22 18:13:49", - "author_account_age_days": 1612 + "author_account_age_days": 1614 }, "https://github.com/shockz0rz/comfy-easy-grids": { "stars": 11, "last_update": "2024-05-22 18:14:05", - "author_account_age_days": 1612 + "author_account_age_days": 1614 }, "https://github.com/siliconflow/onediff_comfy_nodes": { "stars": 11, "last_update": "2024-05-22 22:23:22", - "author_account_age_days": 292 + "author_account_age_days": 293 }, "https://github.com/sipherxyz/comfyui-art-venture": { - "stars": 79, + "stars": 80, "last_update": "2024-05-22 18:15:39", - "author_account_age_days": 1093 + "author_account_age_days": 1095 }, "https://github.com/skfoo/ComfyUI-Coziness": { "stars": 21, "last_update": "2024-05-27 18:24:29", - "author_account_age_days": 2069 + "author_account_age_days": 2070 }, "https://github.com/smagnetize/kb-comfyui-nodes": { "stars": 0, "last_update": "2024-01-06 17:04:40", - "author_account_age_days": 2701 + "author_account_age_days": 2702 }, "https://github.com/smthemex/ComfyUI_ChatGLM_API": { "stars": 16, "last_update": "2024-06-07 07:20:38", - "author_account_age_days": 340 + "author_account_age_days": 342 }, "https://github.com/smthemex/ComfyUI_CustomNet": { "stars": 4, "last_update": "2024-05-24 13:18:51", - "author_account_age_days": 340 + "author_account_age_days": 342 }, "https://github.com/smthemex/ComfyUI_HiDiffusion_Pro": { "stars": 18, "last_update": "2024-06-01 07:39:21", - "author_account_age_days": 340 + "author_account_age_days": 342 }, "https://github.com/smthemex/ComfyUI_ID_Animator": { "stars": 11, "last_update": "2024-06-05 09:35:00", - "author_account_age_days": 340 + "author_account_age_days": 342 }, "https://github.com/smthemex/ComfyUI_Llama3_8B": { "stars": 14, "last_update": "2024-05-23 09:00:02", - "author_account_age_days": 340 + "author_account_age_days": 342 }, "https://github.com/smthemex/ComfyUI_ParlerTTS": { "stars": 18, "last_update": "2024-05-15 13:48:05", - "author_account_age_days": 340 + "author_account_age_days": 342 }, "https://github.com/smthemex/ComfyUI_Pic2Story": { "stars": 3, "last_update": "2024-04-21 11:18:29", - "author_account_age_days": 340 + "author_account_age_days": 342 }, "https://github.com/smthemex/ComfyUI_Pipeline_Tool": { "stars": 6, "last_update": "2024-06-05 01:57:01", - "author_account_age_days": 340 + "author_account_age_days": 342 + }, + "https://github.com/smthemex/ComfyUI_Pops": { + "stars": 0, + "last_update": "2024-06-12 12:09:22", + "author_account_age_days": 342 }, "https://github.com/smthemex/ComfyUI_StableAudio_Open": { "stars": 3, "last_update": "2024-06-07 01:57:01", - "author_account_age_days": 340 + "author_account_age_days": 342 }, "https://github.com/smthemex/ComfyUI_StoryDiffusion": { - "stars": 29, + "stars": 28, "last_update": "2024-06-10 20:16:44", - "author_account_age_days": 340 + "author_account_age_days": 342 }, "https://github.com/space-nuko/ComfyUI-Disco-Diffusion": { "stars": 42, "last_update": "2024-05-22 18:10:36", - "author_account_age_days": 2711 + "author_account_age_days": 2712 }, "https://github.com/space-nuko/ComfyUI-OpenPose-Editor": { - "stars": 150, + "stars": 151, "last_update": "2024-05-22 18:10:49", - "author_account_age_days": 2711 + "author_account_age_days": 2712 }, "https://github.com/space-nuko/nui-suite": { "stars": 10, "last_update": "2024-05-22 18:11:04", - "author_account_age_days": 2711 + "author_account_age_days": 2712 }, "https://github.com/spacepxl/ComfyUI-HQ-Image-Save": { "stars": 28, "last_update": "2024-05-22 20:55:44", - "author_account_age_days": 281 + "author_account_age_days": 282 }, "https://github.com/spacepxl/ComfyUI-Image-Filters": { "stars": 76, "last_update": "2024-06-03 04:23:53", - "author_account_age_days": 281 + "author_account_age_days": 282 }, "https://github.com/spacepxl/ComfyUI-RAVE": { "stars": 79, "last_update": "2024-05-22 20:56:19", - "author_account_age_days": 281 + "author_account_age_days": 282 }, "https://github.com/spacepxl/ComfyUI-StyleGan": { "stars": 3, "last_update": "2024-06-10 20:16:34", - "author_account_age_days": 281 + "author_account_age_days": 282 }, "https://github.com/spinagon/ComfyUI-seam-carving": { "stars": 14, "last_update": "2024-05-23 05:07:00", - "author_account_age_days": 4727 + "author_account_age_days": 4728 }, "https://github.com/spinagon/ComfyUI-seamless-tiling": { "stars": 73, "last_update": "2024-05-23 05:03:42", - "author_account_age_days": 4727 + "author_account_age_days": 4728 }, "https://github.com/spro/comfyui-mirror": { "stars": 4, "last_update": "2024-05-22 20:50:25", - "author_account_age_days": 5218 + "author_account_age_days": 5219 }, "https://github.com/ssitu/ComfyUI_UltimateSDUpscale": { "stars": 600, "last_update": "2024-05-22 18:09:32", - "author_account_age_days": 1675 + "author_account_age_days": 1677 }, "https://github.com/ssitu/ComfyUI_fabric": { "stars": 80, "last_update": "2024-05-22 18:10:19", - "author_account_age_days": 1675 + "author_account_age_days": 1677 }, "https://github.com/ssitu/ComfyUI_restart_sampling": { "stars": 75, "last_update": "2024-05-22 18:09:49", - "author_account_age_days": 1675 + "author_account_age_days": 1677 }, "https://github.com/ssitu/ComfyUI_roop": { "stars": 59, "last_update": "2024-05-22 18:10:03", - "author_account_age_days": 1675 + "author_account_age_days": 1677 }, "https://github.com/stavsap/comfyui-ollama": { - "stars": 178, + "stars": 180, "last_update": "2024-05-27 20:12:59", - "author_account_age_days": 4070 + "author_account_age_days": 4071 }, "https://github.com/storyicon/comfyui_musev_evolved": { "stars": 13, "last_update": "2024-05-23 09:09:50", - "author_account_age_days": 2538 + "author_account_age_days": 2540 }, "https://github.com/storyicon/comfyui_segment_anything": { - "stars": 494, + "stars": 496, "last_update": "2024-05-31 07:36:30", - "author_account_age_days": 2538 + "author_account_age_days": 2540 }, "https://github.com/strimmlarn/ComfyUI_Strimmlarns_aesthetic_score": { - "stars": 24, + "stars": 25, "last_update": "2024-06-04 22:50:25", - "author_account_age_days": 2613 + "author_account_age_days": 2614 }, "https://github.com/styler00dollar/ComfyUI-deepcache": { "stars": 8, "last_update": "2024-05-22 22:18:18", - "author_account_age_days": 1832 + "author_account_age_days": 1833 }, "https://github.com/styler00dollar/ComfyUI-sudo-latent-upscale": { "stars": 27, "last_update": "2024-05-22 22:18:07", - "author_account_age_days": 1832 + "author_account_age_days": 1833 }, "https://github.com/subtleGradient/TinkerBot-tech-for-ComfyUI-Touchpad": { "stars": 14, "last_update": "2024-01-14 20:01:01", - "author_account_age_days": 5917 + "author_account_age_days": 5918 }, "https://github.com/sugarkwork/comfyui_cohere": { "stars": 0, "last_update": "2024-05-16 00:13:17", - "author_account_age_days": 862 + "author_account_age_days": 863 }, "https://github.com/sugarkwork/comfyui_tag_fillter": { "stars": 15, "last_update": "2024-05-27 13:38:24", - "author_account_age_days": 862 + "author_account_age_days": 863 }, "https://github.com/syllebra/bilbox-comfyui": { "stars": 79, "last_update": "2024-05-22 20:40:43", - "author_account_age_days": 3122 + "author_account_age_days": 3124 }, "https://github.com/sylym/comfy_vid2vid": { "stars": 57, "last_update": "2024-05-22 17:53:40", - "author_account_age_days": 1884 + "author_account_age_days": 1886 }, "https://github.com/szhublox/ambw_comfyui": { "stars": 12, "last_update": "2024-05-22 18:04:57", - "author_account_age_days": 993 + "author_account_age_days": 995 }, "https://github.com/taabata/LCM_Inpaint-Outpaint_Comfy": { - "stars": 221, + "stars": 222, "last_update": "2024-04-07 21:32:38", - "author_account_age_days": 1669 + "author_account_age_days": 1670 }, "https://github.com/talesofai/comfyui-browser": { - "stars": 402, + "stars": 403, "last_update": "2024-05-21 20:51:18", - "author_account_age_days": 542 + "author_account_age_days": 543 }, "https://github.com/teward/ComfyUI-Helper-Nodes": { "stars": 4, "last_update": "2024-05-23 01:22:01", - "author_account_age_days": 5084 + "author_account_age_days": 5086 }, "https://github.com/theUpsider/ComfyUI-Logic": { - "stars": 91, + "stars": 93, "last_update": "2024-05-22 20:35:47", - "author_account_age_days": 2709 + "author_account_age_days": 2710 }, "https://github.com/theUpsider/ComfyUI-Styles_CSV_Loader": { - "stars": 27, + "stars": 28, "last_update": "2024-05-22 20:31:14", - "author_account_age_days": 2709 + "author_account_age_days": 2710 }, "https://github.com/thecooltechguy/ComfyUI-ComfyRun": { "stars": 77, "last_update": "2024-05-22 21:33:11", - "author_account_age_days": 2409 + "author_account_age_days": 2410 }, "https://github.com/thecooltechguy/ComfyUI-ComfyWorkflows": { "stars": 32, "last_update": "2024-05-22 21:33:47", - "author_account_age_days": 2409 + "author_account_age_days": 2410 }, "https://github.com/thecooltechguy/ComfyUI-MagicAnimate": { "stars": 196, "last_update": "2024-05-22 21:33:35", - "author_account_age_days": 2409 + "author_account_age_days": 2410 }, "https://github.com/thecooltechguy/ComfyUI-Stable-Video-Diffusion": { - "stars": 280, + "stars": 281, "last_update": "2024-05-24 22:14:42", - "author_account_age_days": 2409 + "author_account_age_days": 2410 }, "https://github.com/tiankuan93/ComfyUI-V-Express": { - "stars": 63, - "last_update": "2024-06-07 02:14:37", - "author_account_age_days": 2936 + "stars": 65, + "last_update": "2024-06-12 06:31:31", + "author_account_age_days": 2938 }, "https://github.com/tianlang0704/ComfyUI-StableProjectorzBridge": { "stars": 2, "last_update": "2024-06-09 21:29:11", - "author_account_age_days": 3311 + "author_account_age_days": 3313 }, "https://github.com/tmagara/ComfyUI-Prediction-Boost": { "stars": 0, "last_update": "2024-05-29 23:30:04", - "author_account_age_days": 4361 + "author_account_age_days": 4363 }, "https://github.com/tocubed/ComfyUI-AudioReactor": { "stars": 8, "last_update": "2024-05-22 22:21:57", - "author_account_age_days": 3846 + "author_account_age_days": 3847 }, "https://github.com/tooldigital/ComfyUI-Yolo-Cropper": { "stars": 4, "last_update": "2024-06-04 17:46:40", - "author_account_age_days": 4304 + "author_account_age_days": 4305 }, "https://github.com/toyxyz/ComfyUI_toyxyz_test_nodes": { "stars": 429, "last_update": "2024-05-21 09:02:58", - "author_account_age_days": 3636 + "author_account_age_days": 3637 }, "https://github.com/traugdor/ComfyUI-quadMoons-nodes": { "stars": 8, "last_update": "2024-06-11 00:02:55", - "author_account_age_days": 3807 + "author_account_age_days": 3808 }, "https://github.com/trojblue/trNodes": { "stars": 8, "last_update": "2024-05-22 18:04:36", - "author_account_age_days": 2244 + "author_account_age_days": 2245 }, "https://github.com/trumanwong/ComfyUI-NSFW-Detection": { - "stars": 15, + "stars": 16, "last_update": "2024-05-23 01:27:29", - "author_account_age_days": 2946 + "author_account_age_days": 2948 }, "https://github.com/tsogzark/ComfyUI-load-image-from-url": { "stars": 5, "last_update": "2024-04-16 09:07:22", - "author_account_age_days": 1515 + "author_account_age_days": 1516 }, "https://github.com/ttulttul/ComfyUI-Iterative-Mixer": { "stars": 96, "last_update": "2024-05-22 22:17:20", - "author_account_age_days": 4744 + "author_account_age_days": 4745 }, "https://github.com/ttulttul/ComfyUI-Tensor-Operations": { "stars": 5, "last_update": "2024-05-30 20:30:02", - "author_account_age_days": 4744 + "author_account_age_days": 4745 }, "https://github.com/turkyden/ComfyUI-Comic": { "stars": 1, - "last_update": "2024-06-07 10:24:48", - "author_account_age_days": 2735 + "last_update": "2024-06-11 03:51:14", + "author_account_age_days": 2737 }, "https://github.com/turkyden/ComfyUI-Sticker": { "stars": 0, - "last_update": "2024-05-23 01:09:52", - "author_account_age_days": 2735 + "last_update": "2024-06-11 03:51:33", + "author_account_age_days": 2737 }, "https://github.com/tusharbhutt/Endless-Nodes": { - "stars": 21, + "stars": 22, "last_update": "2024-06-04 22:32:08", - "author_account_age_days": 2651 + "author_account_age_days": 2653 }, "https://github.com/twri/sdxl_prompt_styler": { - "stars": 593, + "stars": 594, "last_update": "2024-05-22 18:16:58", - "author_account_age_days": 4054 + "author_account_age_days": 4056 }, "https://github.com/txt2any/ComfyUI-PromptOrganizer": { "stars": 0, "last_update": "2024-05-23 01:10:33", - "author_account_age_days": 71 + "author_account_age_days": 72 }, "https://github.com/ty0x2333/ComfyUI-Dev-Utils": { "stars": 33, "last_update": "2024-06-03 15:06:13", - "author_account_age_days": 3689 + "author_account_age_days": 3690 }, "https://github.com/tzwm/comfyui-profiler": { "stars": 39, "last_update": "2024-01-12 07:38:40", - "author_account_age_days": 4755 + "author_account_age_days": 4757 }, "https://github.com/uarefans/ComfyUI-Fans": { "stars": 12, "last_update": "2024-05-22 20:34:07", - "author_account_age_days": 1258 + "author_account_age_days": 1260 }, "https://github.com/uetuluk/comfyui-webcam-node": { "stars": 2, "last_update": "2024-05-12 05:52:44", - "author_account_age_days": 2300 + "author_account_age_days": 2302 }, "https://github.com/unwdef/unwdef-nodes-comfyui": { "stars": 1, "last_update": "2024-04-15 19:32:36", - "author_account_age_days": 60 + "author_account_age_days": 61 }, "https://github.com/vanche1212/ComfyUI-ZMG-Nodes": { "stars": 3, - "last_update": "2024-06-06 02:20:19", - "author_account_age_days": 2944 + "last_update": "2024-06-12 02:09:34", + "author_account_age_days": 2946 }, "https://github.com/vanillacode314/SimpleWildcardsComfyUI": { "stars": 3, "last_update": "2024-04-09 01:57:14", - "author_account_age_days": 843 + "author_account_age_days": 845 }, "https://github.com/victorchall/comfyui_webcamcapture": { "stars": 5, "last_update": "2024-05-31 18:01:11", - "author_account_age_days": 3132 + "author_account_age_days": 3133 }, "https://github.com/vienteck/ComfyUI-Chat-GPT-Integration": { "stars": 26, "last_update": "2024-05-22 22:11:14", - "author_account_age_days": 3413 + "author_account_age_days": 3415 }, "https://github.com/violet-chen/comfyui-psd2png": { - "stars": 13, + "stars": 14, "last_update": "2024-06-02 05:07:19", - "author_account_age_days": 1384 + "author_account_age_days": 1386 }, "https://github.com/viperyl/ComfyUI-BiRefNet": { - "stars": 151, + "stars": 152, "last_update": "2024-05-23 00:18:06", - "author_account_age_days": 2019 + "author_account_age_days": 2020 }, "https://github.com/viperyl/ComfyUI-RGT": { "stars": 3, "last_update": "2024-06-01 04:59:55", - "author_account_age_days": 2019 + "author_account_age_days": 2020 }, "https://github.com/vivax3794/ComfyUI-Vivax-Nodes": { "stars": 3, "last_update": "2024-05-23 00:10:56", - "author_account_age_days": 1825 + "author_account_age_days": 1826 }, "https://github.com/vsevolod-oparin/comfyui-kandinsky22": { "stars": 6, "last_update": "2024-05-23 00:14:03", - "author_account_age_days": 4970 + "author_account_age_days": 4972 }, "https://github.com/wallish77/wlsh_nodes": { "stars": 78, "last_update": "2024-05-22 18:21:28", - "author_account_age_days": 2206 + "author_account_age_days": 2208 }, "https://github.com/wandbrandon/comfyui-pixel": { "stars": 4, "last_update": "2024-05-10 14:45:42", - "author_account_age_days": 3370 + "author_account_age_days": 3371 }, "https://github.com/web3nomad/ComfyUI_Invisible_Watermark": { "stars": 1, "last_update": "2024-05-23 01:16:54", - "author_account_age_days": 954 + "author_account_age_days": 955 }, "https://github.com/wei30172/comfygen": { "stars": 4, "last_update": "2024-05-23 00:21:19", - "author_account_age_days": 1599 + "author_account_age_days": 1600 }, "https://github.com/whatbirdisthat/cyberdolphin": { "stars": 14, "last_update": "2024-05-23 03:43:08", - "author_account_age_days": 5473 + "author_account_age_days": 5475 }, "https://github.com/whmc76/ComfyUI-Openpose-Editor-Plus": { "stars": 18, "last_update": "2024-05-22 21:28:27", - "author_account_age_days": 438 + "author_account_age_days": 439 }, "https://github.com/wmatson/easy-comfy-nodes": { "stars": 13, "last_update": "2024-05-15 23:10:21", - "author_account_age_days": 4104 + "author_account_age_days": 4105 }, "https://github.com/wolfden/ComfyUi_PromptStylers": { "stars": 64, "last_update": "2024-05-22 18:17:46", - "author_account_age_days": 5707 + "author_account_age_days": 5709 }, "https://github.com/wolfden/ComfyUi_String_Function_Tree": { "stars": 7, "last_update": "2024-05-22 18:29:16", - "author_account_age_days": 5707 + "author_account_age_days": 5709 }, "https://github.com/wujm424606/ComfyUi-Ollama-YN": { - "stars": 8, + "stars": 9, "last_update": "2024-05-15 03:38:37", - "author_account_age_days": 2249 + "author_account_age_days": 2250 }, "https://github.com/wutipong/ComfyUI-TextUtils": { "stars": 1, "last_update": "2024-05-22 21:31:04", - "author_account_age_days": 4171 + "author_account_age_days": 4173 }, "https://github.com/wwwins/ComfyUI-Simple-Aspect-Ratio": { "stars": 1, "last_update": "2024-05-22 22:22:25", - "author_account_age_days": 5036 + "author_account_age_days": 5038 }, "https://github.com/xXAdonesXx/NodeGPT": { "stars": 322, "last_update": "2024-02-01 23:20:08", - "author_account_age_days": 1465 + "author_account_age_days": 1466 }, "https://github.com/xiaoxiaodesha/hd_node": { "stars": 7, - "last_update": "2024-05-22 23:25:32", - "author_account_age_days": 2861 + "last_update": "2024-06-11 02:36:48", + "author_account_age_days": 2862 }, "https://github.com/xliry/ComfyUI_SendDiscord": { "stars": 0, "last_update": "2024-05-23 02:21:38", - "author_account_age_days": 1260 + "author_account_age_days": 1261 }, "https://github.com/xuhongming251/ComfyUI-GPEN": { "stars": 2, "last_update": "2024-05-25 03:32:25", - "author_account_age_days": 4092 + "author_account_age_days": 4094 }, "https://github.com/xuhongming251/ComfyUI-MuseTalkUtils": { - "stars": 5, + "stars": 6, "last_update": "2024-05-25 03:30:05", - "author_account_age_days": 4092 + "author_account_age_days": 4094 }, "https://github.com/yffyhk/comfyui_auto_danbooru": { "stars": 0, "last_update": "2024-05-22 23:23:03", - "author_account_age_days": 3708 + "author_account_age_days": 3709 }, "https://github.com/yolain/ComfyUI-Easy-Use": { - "stars": 459, + "stars": 467, "last_update": "2024-06-10 15:53:35", - "author_account_age_days": 1327 + "author_account_age_days": 1328 }, "https://github.com/yolanother/DTAIComfyImageSubmit": { "stars": 1, "last_update": "2024-05-22 18:14:56", - "author_account_age_days": 4850 + "author_account_age_days": 4851 }, "https://github.com/yolanother/DTAIComfyLoaders": { "stars": 1, "last_update": "2024-05-22 18:14:44", - "author_account_age_days": 4850 + "author_account_age_days": 4851 }, "https://github.com/yolanother/DTAIComfyPromptAgent": { "stars": 5, "last_update": "2024-05-22 18:14:18", - "author_account_age_days": 4850 + "author_account_age_days": 4851 }, "https://github.com/yolanother/DTAIComfyQRCodes": { "stars": 2, "last_update": "2024-05-22 18:15:09", - "author_account_age_days": 4850 + "author_account_age_days": 4851 }, "https://github.com/yolanother/DTAIComfyVariables": { "stars": 7, "last_update": "2024-05-22 18:15:21", - "author_account_age_days": 4850 + "author_account_age_days": 4851 }, "https://github.com/yolanother/DTAIImageToTextNode": { "stars": 15, "last_update": "2024-05-22 18:14:31", - "author_account_age_days": 4850 + "author_account_age_days": 4851 }, "https://github.com/youyegit/tdxh_node_comfyui": { "stars": 2, "last_update": "2024-05-23 17:55:42", - "author_account_age_days": 415 + "author_account_age_days": 416 }, "https://github.com/yuvraj108c/ComfyUI-Depth-Anything-Tensorrt": { "stars": 58, "last_update": "2024-05-31 05:52:17", - "author_account_age_days": 2139 + "author_account_age_days": 2140 }, "https://github.com/yuvraj108c/ComfyUI-PiperTTS": { "stars": 24, "last_update": "2024-05-22 23:17:27", - "author_account_age_days": 2139 + "author_account_age_days": 2140 }, "https://github.com/yuvraj108c/ComfyUI-Pronodes": { "stars": 1, "last_update": "2024-05-22 23:16:51", - "author_account_age_days": 2139 + "author_account_age_days": 2140 }, "https://github.com/yuvraj108c/ComfyUI-Upscaler-Tensorrt": { - "stars": 35, + "stars": 36, "last_update": "2024-05-31 05:50:59", - "author_account_age_days": 2139 + "author_account_age_days": 2140 }, "https://github.com/yuvraj108c/ComfyUI-Vsgan": { "stars": 2, "last_update": "2024-05-22 23:17:02", - "author_account_age_days": 2139 + "author_account_age_days": 2140 }, "https://github.com/yuvraj108c/ComfyUI-Whisper": { - "stars": 47, + "stars": 48, "last_update": "2024-05-31 05:59:22", - "author_account_age_days": 2139 + "author_account_age_days": 2140 }, "https://github.com/zcfrank1st/Comfyui-Toolbox": { "stars": 4, "last_update": "2024-05-22 22:08:07", - "author_account_age_days": 4401 + "author_account_age_days": 4403 }, "https://github.com/zcfrank1st/Comfyui-Yolov8": { "stars": 17, "last_update": "2024-02-25 06:28:49", - "author_account_age_days": 4401 + "author_account_age_days": 4403 }, "https://github.com/zcfrank1st/comfyui_visual_anagrams": { "stars": 5, "last_update": "2023-12-05 12:31:26", - "author_account_age_days": 4401 + "author_account_age_days": 4403 }, "https://github.com/zer0TF/cute-comfy": { "stars": 27, "last_update": "2024-05-22 21:18:53", - "author_account_age_days": 2656 + "author_account_age_days": 2658 }, "https://github.com/zfkun/ComfyUI_zfkun": { "stars": 12, "last_update": "2024-05-27 11:21:51", - "author_account_age_days": 4849 + "author_account_age_days": 4851 }, "https://github.com/zhangp365/ComfyUI-utils-nodes": { "stars": 6, "last_update": "2024-06-10 01:49:46", - "author_account_age_days": 277 + "author_account_age_days": 279 }, "https://github.com/zhongpei/ComfyUI-InstructIR": { "stars": 58, "last_update": "2024-05-22 23:19:43", - "author_account_age_days": 3445 + "author_account_age_days": 3447 }, "https://github.com/zhongpei/Comfyui_image2prompt": { "stars": 220, "last_update": "2024-05-22 23:19:30", - "author_account_age_days": 3445 + "author_account_age_days": 3447 }, "https://github.com/zhuanqianfish/ComfyUI-EasyNode": { "stars": 57, "last_update": "2024-04-04 00:20:08", - "author_account_age_days": 4221 + "author_account_age_days": 4223 }, "https://github.com/zohac/ComfyUI_ZC_DrawShape": { "stars": 1, "last_update": "2024-06-05 14:54:17", - "author_account_age_days": 2648 + "author_account_age_days": 2649 }, "https://github.com/zombieyang/sd-ppp": { "stars": 7, - "last_update": "2024-06-10 05:44:45", - "author_account_age_days": 3904 + "last_update": "2024-06-11 16:36:28", + "author_account_age_days": 3905 } } \ No newline at end of file diff --git a/glob/manager_core.py b/glob/manager_core.py index bba07a76..d665d17e 100644 --- a/glob/manager_core.py +++ b/glob/manager_core.py @@ -23,7 +23,7 @@ sys.path.append(glob_path) import cm_global from manager_util import * -version = [2, 37, 3] +version = [2, 38] version_str = f"V{version[0]}.{version[1]}" + (f'.{version[2]}' if len(version) > 2 else '') comfyui_manager_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) diff --git a/glob/manager_server.py b/glob/manager_server.py index b2704f7f..8fc1d1c5 100644 --- a/glob/manager_server.py +++ b/glob/manager_server.py @@ -507,6 +507,16 @@ async def fetch_customnode_list(request): return web.json_response(json_obj, content_type='application/json') +@PromptServer.instance.routes.get("/customnode/alternatives") +async def fetch_customnode_alternatives(request): + alter_json = await core.get_data_by_mode(request.rel_url.query["mode"], 'alter-list.json') + + for item in alter_json['items']: + populate_markdown(item) + + return web.json_response(alter_json, content_type='application/json') + + @PromptServer.instance.routes.get("/alternatives/getlist") async def fetch_alternatives_list(request): if "skip_update" in request.rel_url.query and request.rel_url.query["skip_update"] == "true": diff --git a/js/a1111-alter-downloader.js b/js/a1111-alter-downloader.js deleted file mode 100644 index c78d9b2d..00000000 --- a/js/a1111-alter-downloader.js +++ /dev/null @@ -1,566 +0,0 @@ -import { app } from "../../scripts/app.js"; -import { api } from "../../scripts/api.js" -import { ComfyDialog, $el } from "../../scripts/ui.js"; -import { install_checked_custom_node, manager_instance, rebootAPI } from "./common.js"; - -async function getAlterList() { - var mode = manager_instance.datasrc_combo.value; - - var skip_update = ""; - if(manager_instance.update_check_checkbox.checked) - skip_update = "&skip_update=true"; - - const response = await api.fetchApi(`/alternatives/getlist?mode=${mode}${skip_update}`); - - const data = await response.json(); - return data; -} - -export class AlternativesInstaller extends ComfyDialog { - static instance = null; - - install_buttons = []; - message_box = null; - data = null; - - clear() { - this.install_buttons = []; - this.message_box = null; - this.data = null; - } - - constructor(app, manager_dialog) { - super(); - this.manager_dialog = manager_dialog; - this.search_keyword = ''; - this.element = $el("div.comfy-modal", { parent: document.body }, []); - } - - startInstall(target) { - const self = AlternativesInstaller.instance; - - self.updateMessage(`
Installing '${target.title}'`); - } - - disableButtons() { - for(let i in this.install_buttons) { - this.install_buttons[i].disabled = true; - this.install_buttons[i].style.backgroundColor = 'gray'; - } - } - - apply_searchbox(data) { - let keyword = this.search_box.value.toLowerCase(); - for(let i in this.grid_rows) { - let data1 = this.grid_rows[i].data; - let data2 = data1.custom_node; - - if(!data2) - continue; - - let content = data1.tags.toLowerCase() + data1.description.toLowerCase() + data2.author.toLowerCase() + data2.description.toLowerCase() + data2.title.toLowerCase(); - - if(this.filter && this.filter != '*') { - if(this.filter != data2.installed) { - this.grid_rows[i].control.style.display = 'none'; - continue; - } - } - - if(keyword == "") - this.grid_rows[i].control.style.display = null; - else if(content.includes(keyword)) { - this.grid_rows[i].control.style.display = null; - } - else { - this.grid_rows[i].control.style.display = 'none'; - } - } - } - - async invalidateControl() { - this.clear(); - - // splash - while (this.element.children.length) { - this.element.removeChild(this.element.children[0]); - } - - const msg = $el('div', {id:'custom-message'}, - [$el('br'), - 'The custom node DB is currently being updated, and updates to custom nodes are being checked for.', - $el('br'), - 'NOTE: Update only checks for extensions that have been fetched.', - $el('br')]); - msg.style.height = '100px'; - msg.style.verticalAlign = 'middle'; - this.element.appendChild(msg); - - // invalidate - this.data = (await getAlterList()).items; - - this.element.removeChild(msg); - - while (this.element.children.length) { - this.element.removeChild(this.element.children[0]); - } - - this.createHeaderControls(); - await this.createGrid(); - this.apply_searchbox(this.data); - this.createBottomControls(); - } - - updateMessage(msg, btn_id) { - this.message_box.innerHTML = msg; - if(btn_id) { - const rebootButton = document.getElementById(btn_id); - const self = this; - rebootButton.addEventListener("click", - function() { - if(rebootAPI()) { - self.close(); - self.manager_dialog.close(); - } - }); - } - } - - invalidate_checks(is_checked, install_state) { - if(is_checked) { - for(let i in this.grid_rows) { - let data = this.grid_rows[i].data; - let checkbox = this.grid_rows[i].checkbox; - let buttons = this.grid_rows[i].buttons; - - checkbox.disabled = data.custom_node.installed != install_state; - - if(checkbox.disabled) { - for(let j in buttons) { - buttons[j].style.display = 'none'; - } - } - else { - for(let j in buttons) { - buttons[j].style.display = null; - } - } - } - - this.checkbox_all.disabled = false; - } - else { - for(let i in this.grid_rows) { - let checkbox = this.grid_rows[i].checkbox; - if(checkbox.check) - return; // do nothing - } - - // every checkbox is unchecked -> enable all checkbox - for(let i in this.grid_rows) { - let checkbox = this.grid_rows[i].checkbox; - let buttons = this.grid_rows[i].buttons; - checkbox.disabled = false; - - for(let j in buttons) { - buttons[j].style.display = null; - } - } - - this.checkbox_all.checked = false; - this.checkbox_all.disabled = true; - } - } - - check_all(is_checked) { - if(is_checked) { - // lookup first checked item's state - let check_state = null; - for(let i in this.grid_rows) { - let checkbox = this.grid_rows[i].checkbox; - if(checkbox.checked) { - check_state = this.grid_rows[i].data.custom_node.installed; - } - } - - if(check_state == null) - return; - - // check only same state items - for(let i in this.grid_rows) { - let checkbox = this.grid_rows[i].checkbox; - if(this.grid_rows[i].data.custom_node.installed == check_state) - checkbox.checked = true; - } - } - else { - // uncheck all - for(let i in this.grid_rows) { - let checkbox = this.grid_rows[i].checkbox; - let buttons = this.grid_rows[i].buttons; - checkbox.checked = false; - checkbox.disabled = false; - - for(let j in buttons) { - buttons[j].style.display = null; - } - } - - this.checkbox_all.disabled = true; - } - } - - async createGrid() { - var grid = document.createElement('table'); - grid.setAttribute('id', 'alternatives-grid'); - - this.grid_rows = {}; - - let self = this; - - var thead = document.createElement('thead'); - var tbody = document.createElement('tbody'); - - var headerRow = document.createElement('tr'); - thead.style.position = "sticky"; - thead.style.top = "0px"; - thead.style.borderCollapse = "collapse"; - thead.style.tableLayout = "fixed"; - - var header0 = document.createElement('th'); - header0.style.width = "20px"; - this.checkbox_all = $el("input",{type:'checkbox', id:'check_all'},[]); - header0.appendChild(this.checkbox_all); - this.checkbox_all.checked = false; - this.checkbox_all.disabled = true; - this.checkbox_all.addEventListener('change', function() { self.check_all.call(self, self.checkbox_all.checked); }); - - var header1 = document.createElement('th'); - header1.innerHTML = '  ID  '; - header1.style.width = "20px"; - var header2 = document.createElement('th'); - header2.innerHTML = 'Tags'; - header2.style.width = "10%"; - var header3 = document.createElement('th'); - header3.innerHTML = 'Author'; - header3.style.width = "150px"; - var header4 = document.createElement('th'); - header4.innerHTML = 'Title'; - header4.style.width = "20%"; - var header5 = document.createElement('th'); - header5.innerHTML = 'Description'; - header5.style.width = "50%"; - var header6 = document.createElement('th'); - header6.innerHTML = 'Install'; - header6.style.width = "130px"; - - header1.style.position = "sticky"; - header1.style.top = "0px"; - header2.style.position = "sticky"; - header2.style.top = "0px"; - header3.style.position = "sticky"; - header3.style.top = "0px"; - header4.style.position = "sticky"; - header4.style.top = "0px"; - header5.style.position = "sticky"; - header5.style.top = "0px"; - - thead.appendChild(headerRow); - headerRow.appendChild(header0); - headerRow.appendChild(header1); - headerRow.appendChild(header2); - headerRow.appendChild(header3); - headerRow.appendChild(header4); - headerRow.appendChild(header5); - headerRow.appendChild(header6); - - headerRow.style.backgroundColor = "Black"; - headerRow.style.color = "White"; - headerRow.style.textAlign = "center"; - headerRow.style.width = "100%"; - headerRow.style.padding = "0"; - - grid.appendChild(thead); - grid.appendChild(tbody); - - if(this.data) - for (var i = 0; i < this.data.length; i++) { - const data = this.data[i]; - var dataRow = document.createElement('tr'); - - let data0 = document.createElement('td'); - let checkbox = $el("input",{type:'checkbox', id:`check_${i}`},[]); - data0.appendChild(checkbox); - checkbox.checked = false; - checkbox.addEventListener('change', function() { self.invalidate_checks.call(self, checkbox.checked, data.custom_node?.installed); }); - - var data1 = document.createElement('td'); - data1.style.textAlign = "center"; - data1.innerHTML = i+1; - var data2 = document.createElement('td'); - data2.innerHTML = ` ${data.tags}`; - var data3 = document.createElement('td'); - var data4 = document.createElement('td'); - if(data.custom_node) { - data3.innerHTML = ` ${data.custom_node.author}`; - data4.innerHTML = ` ${data.custom_node.title}`; - } - else { - data3.innerHTML = ` Unknown`; - data4.innerHTML = ` Unknown`; - } - var data5 = document.createElement('td'); - data5.innerHTML = data.description; - var data6 = document.createElement('td'); - data6.style.textAlign = "center"; - - var installBtn = document.createElement('button'); - var installBtn2 = null; - var installBtn3 = null; - - if(data.custom_node) { - this.install_buttons.push(installBtn); - - switch(data.custom_node.installed) { - case 'Disabled': - installBtn3 = document.createElement('button'); - installBtn3.innerHTML = 'Enable'; - installBtn3.style.backgroundColor = 'blue'; - installBtn3.style.color = 'white'; - this.install_buttons.push(installBtn3); - - installBtn.innerHTML = 'Uninstall'; - installBtn.style.backgroundColor = 'red'; - installBtn.style.color = 'white'; - break; - case 'Update': - installBtn2 = document.createElement('button'); - installBtn2.innerHTML = 'Update'; - installBtn2.style.backgroundColor = 'blue'; - installBtn2.style.color = 'white'; - this.install_buttons.push(installBtn2); - - installBtn3 = document.createElement('button'); - installBtn3.innerHTML = 'Disable'; - installBtn3.style.backgroundColor = 'MediumSlateBlue'; - installBtn3.style.color = 'white'; - this.install_buttons.push(installBtn3); - - installBtn.innerHTML = 'Uninstall'; - installBtn.style.backgroundColor = 'red'; - installBtn.style.color = 'white'; - break; - case 'True': - installBtn3 = document.createElement('button'); - installBtn3.innerHTML = 'Disable'; - installBtn3.style.backgroundColor = 'MediumSlateBlue'; - installBtn3.style.color = 'white'; - this.install_buttons.push(installBtn3); - - installBtn.innerHTML = 'Uninstall'; - installBtn.style.backgroundColor = 'red'; - installBtn.style.color = 'white'; - break; - case 'False': - installBtn.innerHTML = 'Install'; - installBtn.style.backgroundColor = 'black'; - installBtn.style.color = 'white'; - break; - default: - installBtn.innerHTML = 'Try Install'; - installBtn.style.backgroundColor = 'Gray'; - installBtn.style.color = 'white'; - } - - let j = i; - if(installBtn2 != null) { - installBtn2.style.width = "120px"; - installBtn2.addEventListener('click', function() { - install_checked_custom_node(self.grid_rows, j, AlternativesInstaller.instance, 'update'); - }); - - data6.appendChild(installBtn2); - } - - if(installBtn3 != null) { - installBtn3.style.width = "120px"; - installBtn3.addEventListener('click', function() { - install_checked_custom_node(self.grid_rows, j, AlternativesInstaller.instance, 'toggle_active'); - }); - - data6.appendChild(installBtn3); - } - - - installBtn.style.width = "120px"; - installBtn.addEventListener('click', function() { - if(this.innerHTML == 'Uninstall') { - if (confirm(`Are you sure uninstall ${data.title}?`)) { - install_checked_custom_node(self.grid_rows, j, AlternativesInstaller.instance, 'uninstall'); - } - } - else { - install_checked_custom_node(self.grid_rows, j, AlternativesInstaller.instance, 'install'); - } - }); - - data6.appendChild(installBtn); - } - - dataRow.style.backgroundColor = "var(--bg-color)"; - dataRow.style.color = "var(--fg-color)"; - dataRow.style.textAlign = "left"; - - dataRow.appendChild(data0); - dataRow.appendChild(data1); - dataRow.appendChild(data2); - dataRow.appendChild(data3); - dataRow.appendChild(data4); - dataRow.appendChild(data5); - dataRow.appendChild(data6); - tbody.appendChild(dataRow); - - let buttons = []; - if(installBtn) { - buttons.push(installBtn); - } - if(installBtn2) { - buttons.push(installBtn2); - } - if(installBtn3) { - buttons.push(installBtn3); - } - - this.grid_rows[i] = {data:data, buttons:buttons, checkbox:checkbox, control:dataRow}; - } - - const panel = document.createElement('div'); - panel.style.width = "100%"; - panel.appendChild(grid); - - function handleResize() { - const parentHeight = self.element.clientHeight; - const gridHeight = parentHeight - 200; - - grid.style.height = gridHeight + "px"; - } - window.addEventListener("resize", handleResize); - - grid.style.position = "relative"; - grid.style.display = "inline-block"; - grid.style.width = "100%"; - grid.style.height = "100%"; - grid.style.overflowY = "scroll"; - this.element.style.height = "85%"; - this.element.style.width = "80%"; - this.element.appendChild(panel); - - handleResize(); - } - - createFilterCombo() { - let combo = document.createElement("select"); - - combo.style.cssFloat = "left"; - combo.style.fontSize = "14px"; - combo.style.padding = "4px"; - combo.style.background = "black"; - combo.style.marginLeft = "2px"; - combo.style.width = "199px"; - combo.id = `combo-manger-filter`; - combo.style.borderRadius = "15px"; - - let items = - [ - { value:'*', text:'Filter: all' }, - { value:'Disabled', text:'Filter: disabled' }, - { value:'Update', text:'Filter: update' }, - { value:'True', text:'Filter: installed' }, - { value:'False', text:'Filter: not-installed' }, - ]; - - items.forEach(item => { - const option = document.createElement("option"); - option.value = item.value; - option.text = item.text; - combo.appendChild(option); - }); - - let self = this; - combo.addEventListener('change', function(event) { - self.filter = event.target.value; - self.apply_searchbox(); - }); - - if(self.filter) { - combo.value = self.filter; - } - - return combo; - } - - createHeaderControls() { - let self = this; - this.search_box = $el('input.cm-search-filter', {type:'text', id:'manager-alternode-search-box', placeholder:'input search keyword', value:this.search_keyword}, []); - this.search_box.style.height = "25px"; - this.search_box.onkeydown = (event) => { - if (event.key === 'Enter') { - self.search_keyword = self.search_box.value; - self.apply_searchbox(); - } - if (event.key === 'Escape') { - self.search_keyword = self.search_box.value; - self.apply_searchbox(); - } - }; - - let search_button = document.createElement("button"); - search_button.className = "cm-small-button"; - search_button.innerHTML = "Search"; - search_button.onclick = () => { - self.search_keyword = self.search_box.value; - self.apply_searchbox(); - }; - search_button.style.display = "inline-block"; - - let filter_control = this.createFilterCombo(); - filter_control.style.display = "inline-block"; - - let cell = $el('td', {width:'100%'}, [filter_control, this.search_box, ' ', search_button]); - let search_control = $el('table', {width:'100%'}, - [ - $el('tr', {}, [cell]) - ] - ); - - cell.style.textAlign = "right"; - this.element.appendChild(search_control); - } - - async createBottomControls() { - var close_button = document.createElement("button"); - close_button.className = "cm-small-button"; - close_button.innerHTML = "Close"; - close_button.onclick = () => { this.close(); } - close_button.style.display = "inline-block"; - - this.message_box = $el('div', {id:'alternatives-installer-message'}, [$el('br'), '']); - this.message_box.style.height = '60px'; - this.message_box.style.verticalAlign = 'middle'; - - this.element.appendChild(this.message_box); - this.element.appendChild(close_button); - } - - async show() { - try { - this.invalidateControl(); - this.element.style.display = "block"; - this.element.style.zIndex = 10001; - } - catch(exception) { - app.ui.dialog.show(`Failed to get alternatives list. / ${exception}`); - console.error(exception); - } - } -} diff --git a/js/comfyui-manager.js b/js/comfyui-manager.js index ab23bddf..1f07f4a5 100644 --- a/js/comfyui-manager.js +++ b/js/comfyui-manager.js @@ -11,8 +11,7 @@ import { showYouMLShareDialog } from "./comfyui-share-common.js"; import { OpenArtShareDialog } from "./comfyui-share-openart.js"; -import { CustomNodesInstaller } from "./custom-nodes-downloader.js"; -import { AlternativesInstaller } from "./a1111-alter-downloader.js"; +import { CustomNodesManager } from "./custom-nodes-manager.js"; import { SnapshotManager } from "./snapshot.js"; import { ModelInstaller } from "./model-downloader.js"; import { manager_instance, setManagerInstance, install_via_git_url, install_pip, rebootAPI, free_models, show_message } from "./common.js"; @@ -568,10 +567,10 @@ async function fetchUpdates(update_check_checkbox) { async function() { app.ui.dialog.close(); - if(!CustomNodesInstaller.instance) - CustomNodesInstaller.instance = new CustomNodesInstaller(app, self); - - await CustomNodesInstaller.instance.show(CustomNodesInstaller.ShowMode.UPDATE); + if(!CustomNodesManager.instance) { + CustomNodesManager.instance = new CustomNodesManager(app, self); + } + await CustomNodesManager.instance.show(CustomNodesManager.ShowMode.UPDATE); } ); @@ -714,12 +713,13 @@ class ManagerMenuDialog extends ComfyDialog { [ $el("button.cm-button", { type: "button", - textContent: "Install Custom Nodes", + textContent: "Custom Nodes Manager", onclick: () => { - if(!CustomNodesInstaller.instance) - CustomNodesInstaller.instance = new CustomNodesInstaller(app, self); - CustomNodesInstaller.instance.show(CustomNodesInstaller.ShowMode.NORMAL); + if(!CustomNodesManager.instance) { + CustomNodesManager.instance = new CustomNodesManager(app, self); + } + CustomNodesManager.instance.show(CustomNodesManager.ShowMode.NORMAL); } }), @@ -728,9 +728,10 @@ class ManagerMenuDialog extends ComfyDialog { textContent: "Install Missing Custom Nodes", onclick: () => { - if(!CustomNodesInstaller.instance) - CustomNodesInstaller.instance = new CustomNodesInstaller(app, self); - CustomNodesInstaller.instance.show(CustomNodesInstaller.ShowMode.MISSING_NODES); + if(!CustomNodesManager.instance) { + CustomNodesManager.instance = new CustomNodesManager(app, self); + } + CustomNodesManager.instance.show(CustomNodesManager.ShowMode.MISSING); } }), @@ -768,9 +769,10 @@ class ManagerMenuDialog extends ComfyDialog { textContent: "Alternatives of A1111", onclick: () => { - if(!AlternativesInstaller.instance) - AlternativesInstaller.instance = new AlternativesInstaller(app, self); - AlternativesInstaller.instance.show(); + if(!CustomNodesManager.instance) { + CustomNodesManager.instance = new CustomNodesManager(app, self); + } + CustomNodesManager.instance.show(CustomNodesManager.ShowMode.ALTERNATIVES); } }), diff --git a/js/common.js b/js/common.js index 9fb7a182..7090855f 100644 --- a/js/common.js +++ b/js/common.js @@ -24,72 +24,6 @@ export function rebootAPI() { return false; } -export async function install_checked_custom_node(grid_rows, target_i, caller, mode) { - if(caller) { - let failed = ''; - - caller.disableButtons(); - - for(let i in grid_rows) { - if(!grid_rows[i].checkbox.checked && i != target_i) - continue; - - var target; - - if(grid_rows[i].data.custom_node) { - target = grid_rows[i].data.custom_node; - } - else { - target = grid_rows[i].data; - } - - caller.startInstall(target); - - try { - const response = await api.fetchApi(`/customnode/${mode}`, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(target) - }); - - if(response.status == 403) { - show_message('This action is not allowed with this security level configuration.'); - caller.updateMessage(''); - await caller.invalidateControl(); - return; - } - - if(response.status == 404) { - show_message('With the current security level configuration, only custom nodes from the "default channel" can be installed.'); - caller.updateMessage(''); - await caller.invalidateControl(); - return; - } - - if(response.status == 400) { - show_message(`${mode} failed: ${target.title}`); - continue; - } - - const status = await response.json(); - app.ui.dialog.close(); - target.installed = 'True'; - continue; - } - catch(exception) { - failed += `
${target.title}`; - } - } - - if(failed != '') { - show_message(`${mode} failed: ${failed}`); - } - - await caller.invalidateControl(); - caller.updateMessage("
To apply the installed/updated/disabled/enabled custom node, please ComfyUI. And refresh browser.", 'cm-reboot-button1'); - } -}; - export var manager_instance = null; export function setManagerInstance(obj) { diff --git a/js/custom-nodes-downloader.js b/js/custom-nodes-downloader.js deleted file mode 100644 index 26f8966b..00000000 --- a/js/custom-nodes-downloader.js +++ /dev/null @@ -1,951 +0,0 @@ -import { app } from "../../scripts/app.js"; -import { api } from "../../scripts/api.js" -import { ComfyDialog, $el } from "../../scripts/ui.js"; -import { install_checked_custom_node, manager_instance, rebootAPI } from "./common.js"; - - -async function getCustomNodes() { - var mode = manager_instance.datasrc_combo.value; - - var skip_update = ""; - if(manager_instance.update_check_checkbox.checked) - skip_update = "&skip_update=true"; - - const response = await api.fetchApi(`/customnode/getlist?mode=${mode}${skip_update}`); - - const data = await response.json(); - return data; -} - -async function getCustomnodeMappings() { - var mode = manager_instance.datasrc_combo.value; - - const response = await api.fetchApi(`/customnode/getmappings?mode=${mode}`); - - const data = await response.json(); - return data; -} - -async function getConflictMappings() { - var mode = manager_instance.datasrc_combo.value; - - const response = await api.fetchApi(`/customnode/getmappings?mode=${mode}`); - - const data = await response.json(); - - let node_to_extensions_map = {}; - - for(let k in data) { - for(let i in data[k][0]) { - let node = data[k][0][i]; - let l = node_to_extensions_map[node]; - if(!l) { - l = []; - node_to_extensions_map[node] = l; - } - l.push(k); - } - } - - let conflict_map = {}; - for(let node in node_to_extensions_map) { - if(node_to_extensions_map[node].length > 1) { - for(let i in node_to_extensions_map[node]) { - let extension = node_to_extensions_map[node][i]; - let l = conflict_map[extension]; - - if(!l) { - l = []; - conflict_map[extension] = l; - } - - for(let j in node_to_extensions_map[node]) { - let extension2 = node_to_extensions_map[node][j]; - if(extension != extension2) - l.push([node, extension2]); - } - } - } - } - - return conflict_map; -} - -async function getUnresolvedNodesInComponent() { - try { - var mode = manager_instance.datasrc_combo.value; - - const response = await api.fetchApi(`/component/get_unresolved`); - - const data = await response.json(); - return data.nodes; - } - catch { - return []; - } -} - -export class CustomNodesInstaller extends ComfyDialog { - static instance = null; - - install_buttons = []; - message_box = null; - data = null; - - static ShowMode = { - NORMAL: 0, - MISSING_NODES: 1, - UPDATE: 2, - }; - - clear() { - this.install_buttons = []; - this.message_box = null; - this.data = null; - } - - constructor(app, manager_dialog) { - super(); - this.manager_dialog = manager_dialog; - this.search_keyword = ''; - this.element = $el("div.comfy-modal", { parent: document.body }, []); - - this.currentSortProperty = ''; // The property currently being sorted - this.currentSortAscending = true; // The direction of the current sort - } - - startInstall(target) { - const self = CustomNodesInstaller.instance; - - self.updateMessage(`
Installing '${target.title}'`); - } - - disableButtons() { - for(let i in this.install_buttons) { - this.install_buttons[i].disabled = true; - this.install_buttons[i].style.backgroundColor = 'gray'; - } - } - - apply_searchbox(data) { - let keyword = this.search_box.value.toLowerCase(); - for(let i in this.grid_rows) { - let data = this.grid_rows[i].data; - let content = data.author.toLowerCase() + data.description.toLowerCase() + data.title.toLowerCase() + data.reference.toLowerCase(); - - if(this.filter && this.filter != '*') { - if(this.filter == 'True' && (data.installed == 'Update' || data.installed == 'Fail')) { - this.grid_rows[i].control.style.display = null; - } - else if(this.filter != data.installed) { - this.grid_rows[i].control.style.display = 'none'; - continue; - } - } - - if(keyword == "") - this.grid_rows[i].control.style.display = null; - else if(content.includes(keyword)) { - this.grid_rows[i].control.style.display = null; - } - else { - this.grid_rows[i].control.style.display = 'none'; - } - } - } - - async filter_missing_node(data) { - const mappings = await getCustomnodeMappings(); - - // build regex->url map - const regex_to_url = []; - for (let i in data) { - if(data[i]['nodename_pattern']) { - let item = {regex: new RegExp(data[i].nodename_pattern), url: data[i].files[0]}; - regex_to_url.push(item); - } - } - - // build name->url map - const name_to_urls = {}; - for (const url in mappings) { - const names = mappings[url]; - - for(const name in names[0]) { - let v = name_to_urls[names[0][name]]; - if(v == undefined) { - v = []; - name_to_urls[names[0][name]] = v; - } - v.push(url); - } - } - - const registered_nodes = new Set(); - for (let i in LiteGraph.registered_node_types) { - registered_nodes.add(LiteGraph.registered_node_types[i].type); - } - - const missing_nodes = new Set(); - const workflow = app.graph.serialize(); - const group_nodes = workflow.extra && workflow.extra.groupNodes ? workflow.extra.groupNodes : []; - let nodes = workflow.nodes; - - for (let i in group_nodes) { - let group_node = group_nodes[i]; - nodes = nodes.concat(group_node.nodes); - } - - for (let i in nodes) { - const node_type = nodes[i].type; - if(node_type.startsWith('workflow/')) - continue; - - if (!registered_nodes.has(node_type)) { - const urls = name_to_urls[node_type.trim()]; - if(urls) - urls.forEach(url => { - missing_nodes.add(url); - }); - else { - for(let j in regex_to_url) { - if(regex_to_url[j].regex.test(node_type)) { - missing_nodes.add(regex_to_url[j].url); - } - } - } - } - } - - let unresolved_nodes = await getUnresolvedNodesInComponent(); - for (let i in unresolved_nodes) { - let node_type = unresolved_nodes[i]; - const url = name_to_urls[node_type]; - if(url) - missing_nodes.add(url); - } - - return data.filter(node => node.files.some(file => missing_nodes.has(file))); - } - - async invalidateControl() { - this.clear(); - - // splash - while (this.element.children.length) { - this.element.removeChild(this.element.children[0]); - } - - const msg = $el('div', {id:'custom-message'}, - [$el('br'), - 'The custom node DB is currently being updated, and updates to custom nodes are being checked for.', - $el('br'), - 'NOTE: Update only checks for extensions that have been fetched.', - $el('br')]); - msg.style.height = '100px'; - msg.style.verticalAlign = 'middle'; - msg.style.color = "var(--fg-color)"; - - this.element.appendChild(msg); - - // invalidate - let data = await getCustomNodes(); - this.data = data.custom_nodes; - this.channel = data.channel; - - this.conflict_mappings = await getConflictMappings(); - - if(this.show_mode == CustomNodesInstaller.ShowMode.MISSING_NODES) - this.data = await this.filter_missing_node(this.data); - - this.element.removeChild(msg); - - while (this.element.children.length) { - this.element.removeChild(this.element.children[0]); - } - - this.createHeaderControls(); - await this.createGrid(); - this.apply_searchbox(this.data); - this.createBottomControls(); - } - - updateMessage(msg, btn_id) { - this.message_box.innerHTML = msg; - if(btn_id) { - const rebootButton = document.getElementById(btn_id); - const self = this; - rebootButton.addEventListener("click", - function() { - if(rebootAPI()) { - self.close(); - self.manager_dialog.close(); - } - }); - console.log(rebootButton); - } - } - - invalidate_checks(is_checked, install_state) { - if(is_checked) { - for(let i in this.grid_rows) { - let data = this.grid_rows[i].data; - let checkbox = this.grid_rows[i].checkbox; - let buttons = this.grid_rows[i].buttons; - - checkbox.disabled = data.installed != install_state; - - if(checkbox.disabled) { - for(let j in buttons) { - buttons[j].style.display = 'none'; - } - } - else { - for(let j in buttons) { - buttons[j].style.display = null; - } - } - } - - this.checkbox_all.disabled = false; - } - else { - for(let i in this.grid_rows) { - let checkbox = this.grid_rows[i].checkbox; - if(checkbox.check) - return; // do nothing - } - - // every checkbox is unchecked -> enable all checkbox - for(let i in this.grid_rows) { - let checkbox = this.grid_rows[i].checkbox; - let buttons = this.grid_rows[i].buttons; - checkbox.disabled = false; - - for(let j in buttons) { - buttons[j].style.display = null; - } - } - - this.checkbox_all.checked = false; - this.checkbox_all.disabled = true; - } - } - - check_all(is_checked) { - if(is_checked) { - // lookup first checked item's state - let check_state = null; - for(let i in this.grid_rows) { - let checkbox = this.grid_rows[i].checkbox; - if(checkbox.checked) { - check_state = this.grid_rows[i].data.installed; - } - } - - if(check_state == null) - return; - - // check only same state items - for(let i in this.grid_rows) { - let checkbox = this.grid_rows[i].checkbox; - if(this.grid_rows[i].data.installed == check_state) - checkbox.checked = true; - } - } - else { - // uncheck all - for(let i in this.grid_rows) { - let checkbox = this.grid_rows[i].checkbox; - let buttons = this.grid_rows[i].buttons; - checkbox.checked = false; - checkbox.disabled = false; - - for(let j in buttons) { - buttons[j].style.display = null; - } - } - - this.checkbox_all.disabled = true; - } - } - - sortData(property, ascending = true) { - this.data.sort((a, b) => { - // Check if either value is -1 and handle accordingly - if (a[property] === -1) return 1; // Always put a at the end if its value is -1 - if (b[property] === -1) return -1; // Always put b at the end if its value is -1 - // And be careful here, (-1<'2024-01-01') and (-1>'2024-01-01') are both false! So I handle -1 seperately. - if (a[property] < b[property]) return ascending ? -1 : 1; - if (a[property] > b[property]) return ascending ? 1 : -1; - return 0; - }); - } - - resetHeaderStyles() { - const headers = ['th_author', 'th_title', 'th_stars', 'th_last_update']; // Add the IDs of all your sortable headers here - headers.forEach(headerId => { - const header = this.element.querySelector(`#${headerId}`); - if (header) { - header.style.backgroundColor = ''; // Reset to default background color - // Add other style resets if necessary - } - }); - } - - toggleSort(property) { - // If currently sorted by this property, toggle the direction; else, sort ascending - if (this.currentSortProperty === property) { - this.currentSortAscending = !this.currentSortAscending; - } else { - this.currentSortAscending = false; - } - this.currentSortProperty = property; - - this.resetHeaderStyles(); // Reset styles of all sortable headers - - // Determine the ID of the header based on the property - let headerId = ''; - if (property === 'stars') { - headerId = 'th_stars'; - } else if (property === 'last_update') { - headerId = 'th_last_update'; - } else if (property === 'author') { - headerId = 'th_author'; - } else if (property === 'title') { - headerId = 'th_title'; - } - - // If we have a valid headerId, change its style to indicate it's the active sort column - if (headerId) { - const activeHeader = this.element.querySelector(`#${headerId}`); - if (activeHeader) { - activeHeader.style.backgroundColor = '#222'; - // Slightly brighter. Add other style changes if necessary. - } - } - - // Call sortData with the current property and direction - this.sortData(property, this.currentSortAscending); - - // Refresh the grid to display sorted data - this.createGrid(); - this.apply_searchbox(this.data); - } - - async createGrid() { - // Remove existing table if present - var grid = this.element.querySelector('#custom-nodes-grid'); - var panel; - let self = this; - if (grid) { - grid.querySelector('tbody').remove(); - panel = grid.parentNode; - } else { - grid = document.createElement('table'); - grid.setAttribute('id', 'custom-nodes-grid'); - - this.grid_rows = {}; - - var thead = document.createElement('thead'); - - var headerRow = document.createElement('tr'); - thead.style.position = "sticky"; - thead.style.top = "0px"; - thead.style.borderCollapse = "collapse"; - thead.style.tableLayout = "fixed"; - - var header0 = document.createElement('th'); - header0.style.width = "20px"; - this.checkbox_all = $el("input",{type:'checkbox', id:'check_all'},[]); - header0.appendChild(this.checkbox_all); - this.checkbox_all.checked = false; - this.checkbox_all.disabled = true; - this.checkbox_all.addEventListener('change', function() { self.check_all.call(self, self.checkbox_all.checked); }); - - var header1 = document.createElement('th'); - header1.innerHTML = '  ID  '; - header1.style.width = "20px"; - - var header2 = document.createElement('th'); - header2.innerHTML = 'Author'; - header2.style.width = "150px"; - header2.style.cursor = 'pointer'; - header2.setAttribute('id', 'th_author'); - header2.onclick = () => this.toggleSort('author'); - - var header3 = document.createElement('th'); - header3.innerHTML = 'Name'; - header3.style.width = "20%"; - header3.style.cursor = 'pointer'; - header3.setAttribute('id', 'th_title'); - header3.onclick = () => this.toggleSort('title'); - - var header4 = document.createElement('th'); - header4.innerHTML = 'Description'; - header4.style.width = "60%"; - // header4.classList.add('expandable-column'); - - var header5 = document.createElement('th'); - header5.innerHTML = '   ★   '; - header5.style.width = "130px"; - header5.setAttribute('id', 'th_stars'); - header5.style.cursor = 'pointer'; - header5.onclick = () => this.toggleSort('stars'); - - var header6 = document.createElement('th'); - header6.innerHTML = 'Last Update'; - header6.style.width = "130px"; - header6.setAttribute('id', 'th_last_update'); - header6.style.cursor = 'pointer'; - header6.onclick = () => this.toggleSort('last_update'); - - var header7 = document.createElement('th'); - header7.innerHTML = 'Install'; - header7.style.width = "130px"; - - header0.style.position = "sticky"; - header0.style.top = "0px"; - header1.style.position = "sticky"; - header1.style.top = "0px"; - header2.style.position = "sticky"; - header2.style.top = "0px"; - header3.style.position = "sticky"; - header3.style.top = "0px"; - header4.style.position = "sticky"; - header4.style.top = "0px"; - header5.style.position = "sticky"; - header5.style.top = "0px"; - header6.style.position = "sticky"; - header6.style.top = "0px"; - header7.style.position = "sticky"; - header7.style.top = "0px"; - - thead.appendChild(headerRow); - headerRow.appendChild(header0); - headerRow.appendChild(header1); - headerRow.appendChild(header2); - headerRow.appendChild(header3); - headerRow.appendChild(header4); - headerRow.appendChild(header5); - headerRow.appendChild(header6); - headerRow.appendChild(header7); - - headerRow.style.backgroundColor = "Black"; - headerRow.style.color = "White"; - headerRow.style.textAlign = "center"; - headerRow.style.width = "100%"; - headerRow.style.padding = "0"; - - grid.appendChild(thead); - - panel = document.createElement('div'); - panel.style.width = "100%"; - panel.appendChild(grid); - this.element.appendChild(panel); - } - var tbody = document.createElement('tbody'); - grid.appendChild(tbody); - - if(this.data) - for (var i = 0; i < this.data.length; i++) { - const data = this.data[i]; - let dataRow = document.createElement('tr'); - - let data0 = document.createElement('td'); - let checkbox = $el("input",{type:'checkbox', id:`check_${i}`},[]); - data0.appendChild(checkbox); - checkbox.checked = false; - checkbox.addEventListener('change', function() { self.invalidate_checks.call(self, checkbox.checked, data.installed); }); - - var data1 = document.createElement('td'); - data1.style.textAlign = "center"; - data1.innerHTML = i+1; - - var data2 = document.createElement('td'); - data2.style.maxWidth = "120px"; - data2.className = "cm-node-author" - data2.textContent = ` ${data.author}`; - - if(data.trust) { - data2.innerHTML = `✅${data.author}`; - } - else { - data2.textContent = ` ${data.author}`; - } - - data2.style.whiteSpace = "nowrap"; - data2.style.overflow = "hidden"; - data2.style.textOverflow = "ellipsis"; - - var data3 = document.createElement('td'); - data3.style.maxWidth = "200px"; - data3.style.wordWrap = "break-word"; - data3.className = "cm-node-name" - data3.innerHTML = ` ${data.title}`; - if(data.installed == 'Fail') - data3.innerHTML = ' (IMPORT FAILED)' + data3.innerHTML; - - var data4 = document.createElement('td'); - data4.innerHTML = data.description; - data4.className = "cm-node-desc" - - let conflicts = this.conflict_mappings[data.files[0]]; - if(conflicts) { - let buf = '

Conflicted Nodes:
'; - for(let k in conflicts) { - let node_name = conflicts[k][0]; - - let extension_name = conflicts[k][1].split('/').pop(); - if(extension_name.endsWith('/')) { - extension_name = extension_name.slice(0, -1); - } - if(node_name.endsWith('.git')) { - extension_name = extension_name.slice(0, -4); - } - - buf += `${node_name} [${extension_name}], `; - } - - if(buf.endsWith(', ')) { - buf = buf.slice(0, -2); - } - buf += "

"; - data4.innerHTML += buf; - } - - var data5 = document.createElement('td'); - data5.style.maxWidth = "100px"; - data5.className = "cm-node-stars" - if(data.stars < 0) { - data5.textContent = 'N/A'; - } - else { - data5.textContent = `${data.stars}`; - } - data5.style.whiteSpace = "nowrap"; - data5.style.overflow = "hidden"; - data5.style.textOverflow = "ellipsis"; - data5.style.textAlign = "center"; - - var lastUpdateDate = new Date(); - var data6 = document.createElement('td'); - data6.style.maxWidth = "100px"; - data6.className = "cm-node-last-update"; - if(data.last_update < 0) { - data6.textContent = 'N/A'; - } - else { - data6.textContent = `${data.last_update}`.split(' ')[0]; - } - data6.style.whiteSpace = "nowrap"; - data6.style.overflow = "hidden"; - data6.style.textOverflow = "ellipsis"; - data6.style.textAlign = "center"; - - var data7 = document.createElement('td'); - data7.style.textAlign = "center"; - - var installBtn = document.createElement('button'); - installBtn.className = "cm-btn-install"; - var installBtn2 = null; - var installBtn3 = null; - var installBtn4 = null; - - this.install_buttons.push(installBtn); - - switch(data.installed) { - case 'Disabled': - installBtn3 = document.createElement('button'); - installBtn3.innerHTML = 'Enable'; - installBtn3.className = "cm-btn-enable"; - installBtn3.style.backgroundColor = 'blue'; - installBtn3.style.color = 'white'; - this.install_buttons.push(installBtn3); - - installBtn.innerHTML = 'Uninstall'; - installBtn.style.backgroundColor = 'red'; - break; - - case 'Update': - installBtn2 = document.createElement('button'); - installBtn2.innerHTML = 'Update'; - installBtn2.className = "cm-btn-update"; - installBtn2.style.backgroundColor = 'blue'; - installBtn2.style.color = 'white'; - this.install_buttons.push(installBtn2); - - installBtn3 = document.createElement('button'); - installBtn3.innerHTML = 'Disable'; - installBtn3.className = "cm-btn-disable"; - installBtn3.style.backgroundColor = 'MediumSlateBlue'; - installBtn3.style.color = 'white'; - this.install_buttons.push(installBtn3); - - installBtn.innerHTML = 'Uninstall'; - installBtn.style.backgroundColor = 'red'; - break; - - case 'Fail': - installBtn4 = document.createElement('button'); - installBtn4.innerHTML = 'Try fix'; - installBtn4.className = "cm-btn-disable"; - installBtn4.style.backgroundColor = '#6495ED'; - installBtn4.style.color = 'white'; - this.install_buttons.push(installBtn4); - - case 'True': - if(manager_instance.update_check_checkbox.checked) { - installBtn2 = document.createElement('button'); - installBtn2.innerHTML = 'Try update'; - installBtn2.className = "cm-btn-update"; - installBtn2.style.backgroundColor = 'Gray'; - installBtn2.style.color = 'white'; - this.install_buttons.push(installBtn2); - } - - installBtn3 = document.createElement('button'); - installBtn3.innerHTML = 'Disable'; - installBtn3.className = "cm-btn-disable"; - installBtn3.style.backgroundColor = 'MediumSlateBlue'; - installBtn3.style.color = 'white'; - this.install_buttons.push(installBtn3); - - installBtn.innerHTML = 'Uninstall'; - installBtn.style.backgroundColor = 'red'; - break; - case 'False': - installBtn.innerHTML = 'Install'; - installBtn.style.backgroundColor = 'black'; - installBtn.style.color = 'white'; - break; - - default: - installBtn.innerHTML = `Try Install`; - installBtn.style.backgroundColor = 'Gray'; - installBtn.style.color = 'white'; - } - - let j = i; - if(installBtn2 != null) { - installBtn2.style.width = "120px"; - installBtn2.addEventListener('click', function() { - install_checked_custom_node(self.grid_rows, j, CustomNodesInstaller.instance, 'update'); - }); - - data7.appendChild(installBtn2); - } - - if(installBtn3 != null) { - installBtn3.style.width = "120px"; - installBtn3.addEventListener('click', function() { - install_checked_custom_node(self.grid_rows, j, CustomNodesInstaller.instance, 'toggle_active'); - }); - - data7.appendChild(installBtn3); - } - - if(installBtn4 != null) { - installBtn4.style.width = "120px"; - installBtn4.addEventListener('click', function() { - install_checked_custom_node(self.grid_rows, j, CustomNodesInstaller.instance, 'fix'); - }); - - data7.appendChild(installBtn4); - } - - installBtn.style.width = "120px"; - installBtn.addEventListener('click', function() { - if(this.innerHTML == 'Uninstall') { - if (confirm(`Are you sure uninstall ${data.title}?`)) { - install_checked_custom_node(self.grid_rows, j, CustomNodesInstaller.instance, 'uninstall'); - } - } - else { - install_checked_custom_node(self.grid_rows, j, CustomNodesInstaller.instance, 'install'); - } - }); - - if(!data.author.startsWith('#NOTICE')){ - data7.appendChild(installBtn); - } - - if(data.installed == 'Fail' || data.author.startsWith('#NOTICE')) - dataRow.style.backgroundColor = "#880000"; - else - dataRow.style.backgroundColor = "var(--bg-color)"; - dataRow.style.color = "var(--fg-color)"; - dataRow.style.textAlign = "left"; - - dataRow.appendChild(data0); - dataRow.appendChild(data1); - dataRow.appendChild(data2); - dataRow.appendChild(data3); - dataRow.appendChild(data4); - dataRow.appendChild(data5); - dataRow.appendChild(data6); - dataRow.appendChild(data7); - tbody.appendChild(dataRow); - - let buttons = []; - if(installBtn) { - buttons.push(installBtn); - } - if(installBtn2) { - buttons.push(installBtn2); - } - if(installBtn3) { - buttons.push(installBtn3); - } - - this.grid_rows[i] = {data:data, buttons:buttons, checkbox:checkbox, control:dataRow}; - } - - function handleResize() { - const parentHeight = self.element.clientHeight; - const gridHeight = parentHeight - 200; - - grid.style.height = gridHeight + "px"; - } - window.addEventListener("resize", handleResize); - - grid.style.position = "relative"; - grid.style.display = "inline-block"; - grid.style.width = "100%"; - grid.style.height = "100%"; - grid.style.overflowY = "scroll"; - this.element.style.height = "85%"; - this.element.style.width = "80%"; - - handleResize(); - } - - createFilterCombo() { - let combo = document.createElement("select"); - - combo.style.cssFloat = "left"; - combo.style.fontSize = "14px"; - combo.style.padding = "4px"; - combo.style.background = "black"; - combo.style.marginLeft = "2px"; - combo.style.width = "199px"; - combo.id = `combo-manger-filter`; - combo.style.borderRadius = "15px"; - - let items = - [ - { value:'*', text:'Filter: all' }, - { value:'Disabled', text:'Filter: disabled' }, - { value:'Update', text:'Filter: update' }, - { value:'True', text:'Filter: installed' }, - { value:'False', text:'Filter: not-installed' }, - { value:'Fail', text:'Filter: import failed' }, - ]; - - items.forEach(item => { - const option = document.createElement("option"); - option.value = item.value; - option.text = item.text; - combo.appendChild(option); - }); - - if(this.show_mode == CustomNodesInstaller.ShowMode.UPDATE) { - this.filter = 'Update'; - } - else if(this.show_mode == CustomNodesInstaller.ShowMode.MISSING_NODES) { - this.filter = '*'; - } - - let self = this; - combo.addEventListener('change', function(event) { - self.filter = event.target.value; - self.apply_searchbox(); - }); - - if(self.filter) { - combo.value = self.filter; - } - - return combo; - } - - createHeaderControls() { - let self = this; - this.search_box = $el('input.cm-search-filter', {type:'text', id:'manager-customnode-search-box', placeholder:'input search keyword', value:this.search_keyword}, []); - this.search_box.style.height = "25px"; - this.search_box.onkeydown = (event) => { - if (event.key === 'Enter') { - self.search_keyword = self.search_box.value; - self.apply_searchbox(); - } - if (event.key === 'Escape') { - self.search_keyword = self.search_box.value; - self.apply_searchbox(); - } - }; - - - let search_button = document.createElement("button"); - search_button.className = "cm-small-button"; - search_button.innerHTML = "Search"; - search_button.onclick = () => { - self.search_keyword = self.search_box.value; - self.apply_searchbox(); - }; - search_button.style.display = "inline-block"; - - let filter_control = this.createFilterCombo(); - filter_control.style.display = "inline-block"; - - let channel_badge = ''; - if(this.channel != 'default') { - channel_badge = $el('span', {id:'cm-channel-badge'}, [`Channel: ${this.channel} (Incomplete list)`]); - } - else { - - } - let cell = $el('td', {width:'100%'}, [filter_control, channel_badge, this.search_box, ' ', search_button]); - let search_control = $el('table', {width:'100%'}, - [ - $el('tr', {}, [cell]) - ] - ); - - cell.style.textAlign = "right"; - - this.element.appendChild(search_control); - } - - async createBottomControls() { - var close_button = document.createElement("button"); - close_button.className = "cm-small-button"; - close_button.innerHTML = "Close"; - close_button.onclick = () => { this.close(); } - close_button.style.display = "inline-block"; - - this.message_box = $el('div', {id:'custom-installer-message'}, [$el('br'), '']); - this.message_box.style.height = '60px'; - this.message_box.style.verticalAlign = 'middle'; - - this.element.appendChild(this.message_box); - this.element.appendChild(close_button); - } - - async show(show_mode) { - this.show_mode = show_mode; - - if(this.show_mode != CustomNodesInstaller.ShowMode.NORMAL) { - this.search_keyword = ''; - } - - try { - this.invalidateControl(); - - this.element.style.display = "block"; - this.element.style.zIndex = 10001; - } - catch(exception) { - app.ui.dialog.show(`Failed to get custom node list. / ${exception}`); - } - } -} \ No newline at end of file diff --git a/js/custom-nodes-manager.js b/js/custom-nodes-manager.js new file mode 100644 index 00000000..a89e1b39 --- /dev/null +++ b/js/custom-nodes-manager.js @@ -0,0 +1,1524 @@ +import { app } from "../../scripts/app.js"; +import { api } from "../../scripts/api.js" +import { $el } from "../../scripts/ui.js"; +import { manager_instance, rebootAPI, install_via_git_url } from "./common.js"; + +// https://cenfun.github.io/turbogrid/api.html +import TG from "./turbogrid.esm.js"; + +const icons = { + search: '', + extensions: '', + conflicts: '' +} + +const pageCss = ` +.cn-manager { + --grid-font: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; + z-index: 10001; + width: 80%; + height: 80%; + display: flex; + flex-direction: column; + gap: 10px; + color: var(--fg-color); + font-family: arial, sans-serif; +} + +.cn-manager .cn-flex-auto { + flex: auto; +} + +.cn-manager button { + font-size: 16px; + color: var(--input-text); + background-color: var(--comfy-input-bg); + border-radius: 8px; + border-color: var(--border-color); + border-style: solid; + margin: 0; + padding: 4px 8px; + min-width: 100px; +} + +.cn-manager button:disabled, +.cn-manager input:disabled, +.cn-manager select:disabled { + color: gray; +} + +.cn-manager button:disabled { + background-color: var(--comfy-input-bg); +} + +.cn-manager .cn-manager-restart { + display: none; + background-color: #500000; + color: white; +} + +.cn-manager-header { + display: flex; + flex-wrap: wrap; + gap: 5px; + align-items: center; + padding: 0 5px; +} + +.cn-manager-header label { + display: flex; + gap: 5px; + align-items: center; +} + +.cn-manager-filter { + height: 28px; + line-height: 28px; +} + +.cn-manager-keywords { + height: 28px; + line-height: 28px; + padding: 0 5px 0 26px; + background-size: 16px; + background-position: 5px center; + background-repeat: no-repeat; + background-image: url("data:image/svg+xml;charset=utf8,${encodeURIComponent(icons.search.replace("currentColor", "#888"))}"); +} + +.cn-manager-status { + padding-left: 10px; +} + +.cn-manager-grid { + flex: auto; + border: 1px solid var(--border-color); + overflow: hidden; +} + +.cn-manager-selection { + display: flex; + flex-wrap: wrap; + gap: 10px; + align-items: center; +} + +.cn-manager-message { + +} + +.cn-manager-footer { + display: flex; + flex-wrap: wrap; + gap: 10px; + align-items: center; +} + +.cn-manager-grid .tg-turbogrid { + font-family: var(--grid-font); + font-size: 15px; + background: var(--bg-color); +} + +.cn-manager-grid .cn-node-name a { + color: skyblue; + text-decoration: none; +} + +.cn-manager-grid .cn-node-desc a { + color: #5555FF; + font-weight: bold; + text-decoration: none; +} + +.cn-manager-grid .tg-cell a:hover { + text-decoration: underline; +} + +.cn-manager-grid .cn-extensions-button, +.cn-manager-grid .cn-conflicts-button { + display: inline-block; + width: 20px; + height: 20px; + color: green; + border: none; + padding: 0; + margin: 0; + background: none; + min-width: 20px; +} + +.cn-manager-grid .cn-conflicts-button { + color: orange; +} + +.cn-manager-grid .cn-extensions-list, +.cn-manager-grid .cn-conflicts-list { + line-height: normal; + text-align: left; + max-height: 80%; + min-height: 200px; + min-width: 300px; + overflow-y: auto; + font-size: 12px; + border-radius: 5px; + padding: 10px; + filter: drop-shadow(2px 5px 5px rgb(0 0 0 / 30%)); +} + +.cn-manager-grid .cn-extensions-list { + border-color: var(--bg-color); +} + +.cn-manager-grid .cn-conflicts-list { + background-color: #CCCC55; + color: #AA3333; +} + +.cn-manager-grid .cn-extensions-list h3, +.cn-manager-grid .cn-conflicts-list h3 { + margin: 0; + padding: 5px 0; + color: #000; +} + +.cn-tag-list { + display: flex; + flex-wrap: wrap; + gap: 5px; + align-items: center; + margin-bottom: 5px; +} + +.cn-tag-list > div { + background-color: var(--border-color); + border-radius: 5px; + padding: 0 5px; +} + +.cn-install-buttons { + display: flex; + flex-direction: column; + gap: 3px; + padding: 3px; + align-items: center; + justify-content: center; + height: 100%; +} + +.cn-selected-buttons { + display: flex; + gap: 5px; + align-items: center; + padding-right: 20px; +} + +.cn-manager .cn-btn-enable { + background-color: blue; + color: white; +} + +.cn-manager .cn-btn-disable { + background-color: MediumSlateBlue; + color: white; +} + +.cn-manager .cn-btn-update { + background-color: blue; + color: white; +} + +.cn-manager .cn-btn-try-update { + background-color: Gray; + color: white; +} + +.cn-manager .cn-btn-try-fix { + background-color: #6495ED; + color: white; +} + +.cn-manager .cn-btn-install { + background-color: black; + color: white; +} + +.cn-manager .cn-btn-try-install { + background-color: Gray; + color: white; +} + +.cn-manager .cn-btn-uninstall { + background-color: red; + color: white; +} + +@keyframes cn-btn-loading-bg { + 0% { + left: 0; + } + 100% { + left: -100px; + } +} + +.cn-manager button.cn-btn-loading { + position: relative; + overflow: hidden; + border-color: rgb(0 119 207 / 80%); + background-color: var(--comfy-input-bg); +} + +.cn-manager button.cn-btn-loading::after { + position: absolute; + top: 0; + left: 0; + content: ""; + width: 500px; + height: 100%; + background-image: repeating-linear-gradient( + -45deg, + rgb(0 119 207 / 30%), + rgb(0 119 207 / 30%) 10px, + transparent 10px, + transparent 15px + ); + animation: cn-btn-loading-bg 3s linear infinite; +} + +.cn-manager-light .cn-node-name a { + color: blue; +} + +.cn-manager-light .cm-warn-note { + background-color: #ccc !important; +} + +.cn-manager-light .cn-btn-install { + background-color: #333; +} + +`; + +const pageHtml = ` +
+ + +
+
+
+
+
+
+
+ +`; + +const ShowMode = { + NORMAL: "Normal", + UPDATE: "Update", + MISSING: "Missing", + ALTERNATIVES: "Alternatives" +}; + +export class CustomNodesManager { + static instance = null; + static ShowMode = ShowMode; + + constructor(app, manager_dialog) { + this.app = app; + this.manager_dialog = manager_dialog; + this.id = "cn-manager"; + + app.registerExtension({ + name: "Comfy.CustomNodesManager", + afterConfigureGraph: (missingNodeTypes) => { + const item = this.getFilterItem(ShowMode.MISSING); + if (item) { + item.hasData = false; + item.hashMap = null; + } + } + }); + + this.filter = ''; + this.keywords = ''; + this.restartMap = {}; + + this.init(); + } + + init() { + + if (!document.querySelector(`style[context="${this.id}"]`)) { + const $style = document.createElement("style"); + $style.setAttribute("context", this.id); + $style.innerHTML = pageCss; + document.head.appendChild($style); + } + + this.element = $el("div", { + parent: document.body, + className: "comfy-modal cn-manager" + }); + this.element.innerHTML = pageHtml; + this.initFilter(); + this.bindEvents(); + this.initGrid(); + } + + initFilter() { + const $filter = this.element.querySelector(".cn-manager-filter"); + const filterList = [{ + label: "All", + value: "", + hasData: true + }, { + label: "Installed", + value: "True", + hasData: true + }, { + label: "Disabled", + value: "Disabled", + hasData: true + }, { + label: "Import Failed", + value: "Fail", + hasData: true + }, { + label: "Not Installed", + value: "False", + hasData: true + }, { + label: "Unknown", + value: "None", + hasData: true + }, { + label: "Update", + value: ShowMode.UPDATE, + hasData: false + }, { + label: "Missing", + value: ShowMode.MISSING, + hasData: false + }, { + label: "Alternatives of A1111", + value: ShowMode.ALTERNATIVES, + hasData: false + }]; + this.filterList = filterList; + $filter.innerHTML = filterList.map(item => { + return `` + }).join(""); + } + + getFilterItem(filter) { + return this.filterList.find(it => it.value === filter) + } + + getInstallButtons(installed, title) { + + const buttons = { + "enable": { + label: "Enable", + mode: "toggle_active" + }, + "disable": { + label: "Disable", + mode: "toggle_active" + }, + + "update": { + label: "Update", + mode: "update" + }, + "try-update": { + label: "Try update", + mode: "update" + }, + + "try-fix": { + label: "Try fix", + mode: "fix" + }, + + "install": { + label: "Install", + mode: "install" + }, + "try-install": { + label: "Try install", + mode: "install" + }, + "uninstall": { + label: "Uninstall", + mode: "uninstall" + } + } + + const installGroups = { + "Disabled": ["enable", "uninstall"], + "Update": ["update", "disable", "uninstall"], + "Fail": ["try-fix", "uninstall"], + "True": ["try-update", "disable", "uninstall"], + "False": ["install"], + 'None': ["try-install"] + } + + if (!manager_instance.update_check_checkbox.checked) { + installGroups.True = installGroups.True.filter(it => it !== "try-update"); + } + + if (title === "ComfyUI-Manager") { + installGroups.True = installGroups.True.filter(it => it !== "disable"); + } + + const list = installGroups[installed]; + if (!list) { + return ""; + } + + return list.map(id => { + const bt = buttons[id]; + return ``; + }).join(""); + } + + getButton(target) { + if(!target) { + return; + } + const mode = target.getAttribute("mode"); + if (!mode) { + return; + } + const group = target.getAttribute("group"); + if (!group) { + return; + } + return { + group, + mode, + target, + label: target.innerText + } + } + + bindEvents() { + const eventsMap = { + ".cn-manager-filter": { + change: (e) => { + + if (this.grid) { + this.grid.selectAll(false); + } + + const value = e.target.value + this.filter = value; + const item = this.getFilterItem(value); + if (item && !item.hasData) { + this.loadData(value); + return; + } + this.updateGrid(); + } + }, + + ".cn-manager-keywords": { + input: (e) => { + const keywords = `${e.target.value}`.trim(); + if (keywords !== this.keywords) { + this.keywords = keywords; + this.updateGrid(); + } + }, + focus: (e) => e.target.select() + }, + + ".cn-manager-selection": { + click: (e) => { + const btn = this.getButton(e.target); + if (btn) { + const nodes = this.selectedMap[btn.group]; + if (nodes) { + this.installNodes(nodes, btn); + } + } + } + }, + + ".cn-manager-close": { + click: (e) => this.close() + }, + + ".cn-manager-restart": { + click: () => { + if(rebootAPI()) { + this.close(); + this.manager_dialog.close(); + } + } + }, + + ".cn-manager-check-update": { + click: (e) => { + e.target.classList.add("cn-btn-loading"); + this.setFilter(ShowMode.UPDATE); + this.loadData(ShowMode.UPDATE); + } + }, + + ".cn-manager-check-missing": { + click: (e) => { + e.target.classList.add("cn-btn-loading"); + this.setFilter(ShowMode.MISSING); + this.loadData(ShowMode.MISSING); + } + }, + + ".cn-manager-install-url": { + click: (e) => { + const url = prompt("Please enter the URL of the Git repository to install", ""); + if (url !== null) { + install_via_git_url(url, this.manager_dialog); + } + } + } + }; + Object.keys(eventsMap).forEach(selector => { + const target = this.element.querySelector(selector); + if (target) { + const events = eventsMap[selector]; + if (events) { + Object.keys(events).forEach(type => { + target.addEventListener(type, events[type]); + }); + } + } + }); + } + + // =========================================================================================== + + initGrid() { + const container = this.element.querySelector(".cn-manager-grid"); + const grid = new TG.Grid(container); + this.grid = grid; + + const autoHeightColumns = ['description', "alternatives"]; + + let prevViewRowsLength = 0; + grid.bind('onUpdated', (e, d) => { + + const viewRows = grid.viewRows; + if (viewRows.length !== prevViewRowsLength) { + prevViewRowsLength = viewRows.length; + this.showStatus(`${prevViewRowsLength} custom nodes`); + } + + const visibleRowList = grid.viewport.rows; + const rows = []; + const heights = []; + + visibleRowList.forEach(function(viewIndex) { + // display index after filter is no equal global index + const rowItem = grid.getViewRowItem(viewIndex); + if (rowItem.rowHeightFixed) { + return; + } + + const list = autoHeightColumns.map(k => { + const cellNode = grid.getCellNode(rowItem, k); + if (cellNode) { + const div = cellNode.querySelector('.tg-multiline-fixing'); + // 10px is padding top and bottom + const realHeight = Math.max(TG.$(div).height() + 10, grid.options.rowHeight); + return realHeight; + } + }).filter(n => n); + + if (list.length) { + rowItem.rowHeightFixed = true; + rows.push(rowItem); + heights.push(Math.max.apply(null, list)); + } + + }); + if (!rows.length) { + return; + } + grid.setRowHeight(rows, heights); + }); + + grid.bind('onColumnWidthChanged', (e, d) => { + if (autoHeightColumns.includes(d.id)) { + // reset when column width changed + grid.forEachRow(function(row) { + row.rowHeightFixed = false; + }); + } + }); + + grid.bind('onSelectChanged', (e, changes) => { + this.renderSelected(); + }); + + grid.bind('onClick', (e, d) => { + const btn = this.getButton(d.e.target); + if (btn) { + this.installNodes([d.rowItem.hash], btn, d.rowItem.title); + } + }); + + grid.setOption({ + theme: 'dark', + selectVisible: true, + selectMultiple: true, + selectAllVisible: true, + + textSelectable: true, + scrollbarRound: true, + + frozenColumn: 1, + rowNotFound: "No Results", + + rowHeight: 30 * 3 + 3 * 4, + bindWindowResize: true, + bindContainerResize: true, + + // updateGrid handler for filter and keywords + rowFilter: (rowItem) => { + + const searchableColumns = ["title", "author", "description"]; + if (this.hasAlternatives()) { + searchableColumns.push("alternatives"); + } + + let shouldShown = grid.highlightKeywordsFilter(rowItem, searchableColumns, this.keywords); + + if (shouldShown) { + if(this.filter && rowItem.filterTypes) { + shouldShown = rowItem.filterTypes.includes(this.filter); + } + } + + return shouldShown; + } + }); + + } + + hasAlternatives() { + return this.filter === ShowMode.ALTERNATIVES + } + + renderGrid() { + + // update theme + const colorPalette = this.app.ui.settings.settingsValues['Comfy.ColorPalette']; + Array.from(this.element.classList).forEach(cn => { + if (cn.startsWith("cn-manager-")) { + this.element.classList.remove(cn); + } + }); + this.element.classList.add(`cn-manager-${colorPalette}`); + + const options = { + theme: colorPalette === "light" ? "" : "dark" + }; + + const rows = this.custom_nodes || []; + rows.forEach((item, i) => { + item.id = i + 1; + const nodeKey = item.files[0]; + const extensionInfo = this.extension_mappings[nodeKey]; + if(extensionInfo) { + const { extensions, conflicts } = extensionInfo; + if (extensions.length) { + item.extensions = extensions.length; + item.extensionsList = extensions; + } + if (conflicts) { + item.conflicts = conflicts.length; + item.conflictsList = conflicts; + } + } + }); + + const columns = [{ + id: 'id', + name: 'ID', + width: 50, + align: 'center' + }, { + id: 'title', + name: 'Title', + width: 200, + minWidth: 100, + maxWidth: 500, + classMap: 'tg-multiline cn-node-name', + formatter: (title, rowItem, columnItem) => { + return `
+ ${rowItem.installed === 'Fail' ? '(IMPORT FAILED)' : ''} + ${title} +
`; + } + }, { + id: 'installed', + name: 'Install', + width: 130, + minWidth: 110, + maxWidth: 200, + sortable: false, + align: 'center', + formatter: (installed, rowItem, columnItem) => { + if (rowItem.restart) { + return `Restart Required`; + } + const buttons = this.getInstallButtons(installed, rowItem.title); + return `
${buttons}
`; + } + }, { + id: "alternatives", + name: "Alternatives", + width: 400, + maxWidth: 5000, + invisible: !this.hasAlternatives(), + classMap: 'tg-multiline cn-node-desc', + formatter: (alternatives, rowItem, columnItem) => { + return `
${alternatives}
`; + } + }, { + id: 'description', + name: 'Description', + width: 400, + maxWidth: 5000, + classMap: 'tg-multiline cn-node-desc', + formatter: (description, rowItem, columnItem) => { + return `
${description}
`; + } + }, { + id: "extensions", + name: "Extensions", + width: 80, + align: 'center', + formatter: (extensions, rowItem, columnItem) => { + const extensionsList = rowItem.extensionsList; + if (!extensionsList) { + return; + } + const list = []; + const eId = `popover_extensions_${columnItem.id}_${rowItem.tg_index}`; + list.push(``) + list.push(`
`) + list.push(`

【${rowItem.title}】Extension Nodes (${extensionsList.length})

`); + extensionsList.forEach(en => { + list.push(`
  • ${en}
  • `); + }) + list.push("
    "); + return list.join(""); + } + }, { + id: "conflicts", + name: "Conflicts", + width: 80, + align: 'center', + formatter: (conflicts, rowItem, columnItem) => { + const conflictsList = rowItem.conflictsList; + if (!conflictsList) { + return; + } + const list = []; + const cId = `popover_conflicts_${columnItem.id}_${rowItem.tg_index}`; + list.push(``) + list.push(`
    `) + list.push(`

    【${rowItem.title}】Conflicted Nodes (${conflictsList.length})

    `); + conflictsList.forEach(en => { + let [node_name, extension_name] = en; + extension_name = extension_name.split('/').filter(it => it).pop(); + if(extension_name.endsWith('.git')) { + extension_name = extension_name.slice(0, -4); + } + list.push(`
  • ${node_name} [${extension_name}]
  • `); + }) + list.push("
    "); + return list.join(""); + } + }, { + id: 'author', + name: 'Author', + width: 100, + classMap: "cn-node-author", + formatter: (author, rowItem, columnItem) => { + if (rowItem.trust) { + return `✅ ${author}`; + } + return author; + } + }, { + id: 'stars', + name: '★', + align: 'center', + classMap: "cn-node-stars", + formatter: (stars) => { + if (stars < 0) { + return 'N/A'; + } + if (typeof stars === 'number') { + return stars.toLocaleString(); + } + return stars; + } + }, { + id: 'last_update', + name: 'Last Update', + align: 'center', + type: 'date', + width: 100, + classMap: "cn-node-last-update", + formatter: (last_update) => { + if (last_update < 0) { + return 'N/A'; + } + return `${last_update}`.split(' ')[0]; + } + }]; + + this.grid.setData({ + options, + rows, + columns + }); + + this.grid.render(); + + } + + updateGrid() { + if (this.grid) { + this.grid.update(); + if (this.hasAlternatives()) { + this.grid.forEachRow(function(row) { + row.rowHeightFixed = false; + }); + this.grid.showColumn("alternatives"); + } else { + this.grid.hideColumn("alternatives"); + } + } + } + + // =========================================================================================== + + renderSelected() { + const selectedList = this.grid.getSelectedRows(); + if (!selectedList.length) { + this.showSelection(""); + return; + } + + const selectedMap = {}; + selectedList.forEach(item => { + let type = item.installed; + if (item.restart) { + type = "Restart Required"; + } + if (selectedMap[type]) { + selectedMap[type].push(item.hash); + } else { + selectedMap[type] = [item.hash]; + } + }); + + this.selectedMap = selectedMap; + + const list = []; + Object.keys(selectedMap).forEach(v => { + const filterItem = this.getFilterItem(v); + list.push(`
    + Selected ${selectedMap[v].length} ${filterItem ? filterItem.label : v} + ${this.grid.hasMask ? "" : this.getInstallButtons(v)} +
    `); + }); + + this.showSelection(list.join("")); + } + + focusInstall(item, mode) { + const cellNode = this.grid.getCellNode(item, "installed"); + if (cellNode) { + const cellBtn = cellNode.querySelector(`button[mode="${mode}"]`); + if (cellBtn) { + cellBtn.classList.add("cn-btn-loading"); + return true + } + } + } + + async installNodes(list, btn, title) { + + const { target, label, mode} = btn; + + if(mode === "uninstall") { + title = title || `${list.length} custom nodes`; + if (!confirm(`Are you sure uninstall ${title}?`)) { + return; + } + } + + target.classList.add("cn-btn-loading"); + this.showLoading(); + this.showError(""); + + let needRestart = false; + let errorMsg = ""; + for (const hash of list) { + + const item = this.grid.getRowItemBy("hash", hash); + if (!item) { + errorMsg = `Not found custom node: ${hash}`; + break; + } + + this.grid.scrollRowIntoView(item); + + if (!this.focusInstall(item, mode)) { + this.grid.onNextUpdated(() => { + this.focusInstall(item, mode); + }); + } + + this.showStatus(`${label} ${item.title} ...`); + + const data = item.originalData; + const res = await this.fetchData(`/customnode/${mode}`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(data) + }); + + if (res.error) { + + errorMsg = `${item.title} ${mode} failed: `; + if(res.status == 403) { + errorMsg += `This action is not allowed with this security level configuration.`; + } else if(res.status == 404) { + errorMsg += `With the current security level configuration, only custom nodes from the "default channel" can be installed.`; + } else { + errorMsg += res.error.message; + } + + break; + } + + needRestart = true; + + this.grid.setRowSelected(item, false); + item.restart = true; + this.restartMap[item.hash] = true; + this.grid.updateCell(item, "installed"); + + //console.log(res.data); + + } + + this.hideLoading(); + target.classList.remove("cn-btn-loading"); + + if (errorMsg) { + this.showError(errorMsg); + } else { + this.showStatus(`${label} ${list.length} custom node(s) successfully`); + } + + if (needRestart) { + this.showRestart(); + this.showMessage(`To apply the installed/updated/disabled/enabled custom node, please restart ComfyUI. And refresh browser.`, "red") + } + + } + + // =========================================================================================== + + async fetchData(route, options) { + let err; + const res = await api.fetchApi(route, options).catch(e => { + err = e; + }); + + if (!res) { + return { + status: 400, + error: new Error("Unknown Error") + } + } + + const { status, statusText } = res; + if (err) { + return { + status, + error: err + } + } + + if (status !== 200) { + return { + status, + error: new Error(statusText || "Unknown Error") + } + } + + const data = await res.json(); + if (!data) { + return { + status, + error: new Error(`Failed to load data: ${route}`) + } + } + return { + status, + data + } + } + + // =========================================================================================== + + async getExtensionMappings() { + const mode = manager_instance.datasrc_combo.value; + this.showStatus(`Loading extension mappings (${mode}) ...`); + const res = await this.fetchData(`/customnode/getmappings?mode=${mode}`); + if (res.error) { + console.log(res.error); + return {} + } + + const data = res.data; + + const extension_mappings = {}; + const conflicts_map = {}; + Object.keys(data).forEach(k => { + const [extensions, metadata] = data[k]; + extension_mappings[k] = { + extensions, + metadata + } + extensions.forEach(node => { + let l = conflicts_map[node]; + if(!l) { + l = []; + conflicts_map[node] = l; + } + l.push(k); + }) + }) + + Object.keys(conflicts_map).forEach(node => { + const list = conflicts_map[node]; + if(list.length > 1) { + list.forEach(k => { + const item = extension_mappings[k]; + if(!item) { + console.log(`not found ${k}`) + return; + } + + if (!item.conflicts) { + item.conflicts = []; + } + list.forEach(key => { + if(k !== key) { + item.conflicts.push([node, key]) + } + }) + }) + } + }) + + return extension_mappings; + } + + async getMissingNodes() { + const mode = manager_instance.datasrc_combo.value; + this.showStatus(`Loading missing nodes (${mode}) ...`); + const res = await this.fetchData(`/customnode/getmappings?mode=${mode}`); + if (res.error) { + this.showError(`Failed to get custom node mappings: ${res.error}`); + return; + } + + const mappings = res.data; + + // build regex->url map + const regex_to_url = []; + this.custom_nodes.forEach(node => { + if(node.nodename_pattern) { + regex_to_url.push({ + regex: new RegExp(node.nodename_pattern), + url: node.files[0] + }); + } + }); + + // build name->url map + const name_to_urls = {}; + for (const url in mappings) { + const names = mappings[url]; + + for(const name in names[0]) { + let v = name_to_urls[names[0][name]]; + if(v == undefined) { + v = []; + name_to_urls[names[0][name]] = v; + } + v.push(url); + } + } + + const registered_nodes = new Set(); + for (let i in LiteGraph.registered_node_types) { + registered_nodes.add(LiteGraph.registered_node_types[i].type); + } + + const missing_nodes = new Set(); + const workflow = app.graph.serialize(); + const group_nodes = workflow.extra && workflow.extra.groupNodes ? workflow.extra.groupNodes : []; + let nodes = workflow.nodes; + + for (let i in group_nodes) { + let group_node = group_nodes[i]; + nodes = nodes.concat(group_node.nodes); + } + + for (let i in nodes) { + const node_type = nodes[i].type; + if(node_type.startsWith('workflow/')) + continue; + + if (!registered_nodes.has(node_type)) { + const urls = name_to_urls[node_type.trim()]; + if(urls) + urls.forEach(url => { + missing_nodes.add(url); + }); + else { + for(let j in regex_to_url) { + if(regex_to_url[j].regex.test(node_type)) { + missing_nodes.add(regex_to_url[j].url); + } + } + } + } + } + + const resUnresolved = await this.fetchData(`/component/get_unresolved`); + const unresolved = resUnresolved.data; + if (unresolved && unresolved.nodes) { + unresolved.nodes.forEach(node_type => { + const url = name_to_urls[node_type]; + if(url) { + missing_nodes.add(url); + } + }); + } + + const hashMap = {}; + this.custom_nodes.forEach(item => { + if (item.files.some(file => missing_nodes.has(file))) { + hashMap[item.hash] = true; + } + }); + return hashMap; + } + + async getAlternatives() { + + const mode = manager_instance.datasrc_combo.value; + this.showStatus(`Loading alternatives (${mode}) ...`); + const res = await this.fetchData(`/customnode/alternatives?mode=${mode}`); + if (res.error) { + this.showError(`Failed to get alternatives: ${res.error}`); + return []; + } + + const hashMap = {}; + const { items } = res.data; + + items.forEach(item => { + + const custom_node = this.custom_nodes.find(node => node.files.find(file => file === item.id)); + if (!custom_node) { + console.log(`Not found custom node: ${item.id}`); + return; + } + + const tags = `${item.tags}`.split(",").map(tag => { + return `
    ${tag.trim()}
    `; + }).join("") + + hashMap[custom_node.hash] = { + alternatives: `
    ${tags}
    ${item.description}` + } + + }); + + return hashMap + } + + async loadData(show_mode = ShowMode.NORMAL) { + this.show_mode = show_mode; + console.log("Show mode:", show_mode); + + this.showLoading(); + + this.extension_mappings = await this.getExtensionMappings(); + + const mode = manager_instance.datasrc_combo.value; + this.showStatus(`Loading custom nodes (${mode}) ...`); + + const skip_update = this.show_mode === ShowMode.UPDATE ? "" : "&skip_update=true"; + const res = await this.fetchData(`/customnode/getlist?mode=${mode}${skip_update}`); + if (res.error) { + this.showError("Failed to get custom node list."); + this.hideLoading(); + return + } + + const { channel, custom_nodes} = res.data; + this.channel = channel; + this.custom_nodes = custom_nodes; + + if(this.channel !== 'default') { + this.element.querySelector(".cn-manager-channel").innerHTML = `Channel: ${this.channel} (Incomplete list)`; + } + + for (const item of custom_nodes) { + item.originalData = JSON.parse(JSON.stringify(item)); + item.hash = await calculateHash(item); + } + + const filterItem = this.getFilterItem(this.show_mode); + if(filterItem) { + let hashMap; + if(this.show_mode == ShowMode.UPDATE) { + hashMap = {}; + custom_nodes.forEach(it => { + if (it.installed === "Update") { + hashMap[it.hash] = true; + } + }); + } else if(this.show_mode == ShowMode.MISSING) { + hashMap = await this.getMissingNodes(); + } else if(this.show_mode == ShowMode.ALTERNATIVES) { + hashMap = await this.getAlternatives(); + } + filterItem.hashMap = hashMap; + filterItem.hasData = true; + } + + custom_nodes.forEach(nodeItem => { + if (this.restartMap[nodeItem.hash]) { + nodeItem.restart = true; + } + const filterTypes = new Set(); + this.filterList.forEach(filterItem => { + const { value, hashMap } = filterItem; + if (hashMap) { + const hashData = hashMap[nodeItem.hash] + if (hashData) { + filterTypes.add(value); + if (value === ShowMode.UPDATE) { + nodeItem.installed = "Update"; + } + if (typeof hashData === "object") { + Object.assign(nodeItem, hashData); + } + } + } else { + if (nodeItem.installed === value) { + filterTypes.add(value); + } + const map = { + "Update": "True", + "Disabled": "True", + "Fail": "True", + "None": "False" + } + if (map[nodeItem.installed]) { + filterTypes.add(map[nodeItem.installed]); + } + } + }); + nodeItem.filterTypes = Array.from(filterTypes); + }); + + this.renderGrid(); + + this.hideLoading(); + + } + + // =========================================================================================== + + showSelection(msg) { + this.element.querySelector(".cn-manager-selection").innerHTML = msg; + } + + showError(err) { + this.showMessage(err, "red"); + } + + showMessage(msg, color) { + if (color) { + msg = `${msg}`; + } + this.element.querySelector(".cn-manager-message").innerHTML = msg; + } + + showStatus(msg, color) { + if (color) { + msg = `${msg}`; + } + this.element.querySelector(".cn-manager-status").innerHTML = msg; + } + + showLoading() { + this.setDisabled(true); + if (this.grid) { + this.grid.showLoading(); + this.grid.showMask({ + opacity: 0.05 + }); + } + } + + hideLoading() { + this.setDisabled(false); + if (this.grid) { + this.grid.hideLoading(); + this.grid.hideMask(); + } + } + + setDisabled(disabled) { + + const $close = this.element.querySelector(".cn-manager-close"); + const $restart = this.element.querySelector(".cn-manager-restart"); + + const list = [ + ".cn-manager-header input", + ".cn-manager-header select", + ".cn-manager-footer button", + ".cn-manager-selection button" + ].map(s => { + return Array.from(this.element.querySelectorAll(s)); + }) + .flat() + .filter(it => { + return it !== $close && it !== $restart; + }); + + list.forEach($elem => { + if (disabled) { + $elem.setAttribute("disabled", "disabled"); + } else { + $elem.removeAttribute("disabled"); + } + }); + + Array.from(this.element.querySelectorAll(".cn-btn-loading")).forEach($elem => { + $elem.classList.remove("cn-btn-loading"); + }); + + } + + showRestart() { + this.element.querySelector(".cn-manager-restart").style.display = "block"; + } + + setFilter(filterValue) { + let filter = ""; + const filterItem = this.getFilterItem(filterValue); + if(filterItem) { + filter = filterItem.value; + } + this.filter = filter; + this.element.querySelector(".cn-manager-filter").value = filter; + } + + setKeywords(keywords = "") { + this.keywords = keywords; + this.element.querySelector(".cn-manager-keywords").value = keywords; + } + + show(show_mode) { + this.element.style.display = "flex"; + this.setFilter(show_mode); + this.setKeywords(""); + this.showSelection(""); + this.showMessage(""); + this.loadData(show_mode); + } + + close() { + this.element.style.display = "none"; + } +} + +// =========================================================================================== + +async function calculateHash(item) { + const message = item.title + item.files[0]; + return md5(message); +} + +function md5(inputString) { + const hc = '0123456789abcdef'; + const rh = n => {let j,s='';for(j=0;j<=3;j++) s+=hc.charAt((n>>(j*8+4))&0x0F)+hc.charAt((n>>(j*8))&0x0F);return s;} + const ad = (x,y) => {let l=(x&0xFFFF)+(y&0xFFFF);let m=(x>>16)+(y>>16)+(l>>16);return (m<<16)|(l&0xFFFF);} + const rl = (n,c) => (n<>>(32-c)); + const cm = (q,a,b,x,s,t) => ad(rl(ad(ad(a,q),ad(x,t)),s),b); + const ff = (a,b,c,d,x,s,t) => cm((b&c)|((~b)&d),a,b,x,s,t); + const gg = (a,b,c,d,x,s,t) => cm((b&d)|(c&(~d)),a,b,x,s,t); + const hh = (a,b,c,d,x,s,t) => cm(b^c^d,a,b,x,s,t); + const ii = (a,b,c,d,x,s,t) => cm(c^(b|(~d)),a,b,x,s,t); + const sb = x => { + let i;const nblk=((x.length+8)>>6)+1;const blks=[];for(i=0;i>2]|=x.charCodeAt(i)<<((i%4)*8);} + blks[i>>2]|=0x80<<((i%4)*8);blks[nblk*16-2]=x.length*8;return blks; + } + let i,x=sb(inputString),a=1732584193,b=-271733879,c=-1732584194,d=271733878,olda,oldb,oldc,oldd; + for(i=0;i{i.d(e,{A:()=>l});var o=i(256),n=i.n(o),s=i(505),r=i.n(s)()(n());r.push([t.id,'.tg-turbogrid{position:relative;z-index:0;width:100%;height:100%;margin:0;padding:0;box-sizing:border-box;font-size:14px;font-family:arial,sans-serif;outline:0;cursor:default;overflow:hidden}.tg-turbogrid *,.tg-turbogrid *::before,.tg-turbogrid *::after{box-sizing:border-box}.tg-text-unselectable.tg-turbogrid{user-select:none}.tg-turbogrid svg{display:block;pointer-events:none}.tg-turbogrid .tg-symbols{font-family:webdings,sans-serif}.tg-turbogrid .tg-nowrap{white-space:nowrap}.tg-turbogrid .tg-align-left{text-align:left}.tg-turbogrid .tg-align-center{text-align:center}.tg-turbogrid .tg-align-right{text-align:right}@keyframes tg-fade-in{from{opacity:0}to{opacity:1}}@keyframes tg-fade-out{from{opacity:1}to{opacity:0}}.tg-turbogrid .tg-fade-in{animation-name:tg-fade-in;animation-duration:.2s;animation-fill-mode:both}.tg-turbogrid .tg-fade-in .tg-scrollbar-track{display:none}.tg-turbogrid .tg-fade-out{animation-name:tg-fade-out;animation-duration:.2s;animation-fill-mode:both}.tg-turbogrid .tg-fade-out .tg-scrollbar-track{display:none}.tg-turbogrid .tg-mask{position:absolute;top:0;left:0;z-index:200;display:none;width:100%;height:100%;background-color:#000;opacity:.1}@keyframes tg-loading-animation{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.tg-turbogrid .tg-loading{position:absolute;top:50%;left:50%;z-index:300;display:none;transform:translate(-50%, -50%);pointer-events:none}.tg-turbogrid .tg-loading-default{width:35px;height:35px;color:#0077cf;animation:1s tg-loading-animation linear infinite}.tg-turbogrid .tg-loading-fast{animation:.382s tg-loading-animation linear infinite}.tg-turbogrid .tg-checkbox{width:100%;height:100%;cursor:pointer;overflow:hidden}.tg-turbogrid .tg-checkbox:hover .tg-checkbox-item{fill:#005ba1}.tg-turbogrid .tg-checkbox.tg-select-icon-all{height:18px}.tg-turbogrid .tg-checkbox .tg-icon-checkbox{position:absolute;top:50%;left:50%;display:block;width:16px;height:16px;transform:translate(-50%, -50%)}.tg-turbogrid .tg-checkbox .tg-checkbox-item{display:none;fill:gray}.tg-turbogrid .tg-checkbox .tg-checkbox-none{display:block}.tg-turbogrid .tg-checkbox.tg-selected .tg-checkbox-selected{display:block;fill:#0077cf}.tg-turbogrid .tg-checkbox.tg-mixed .tg-checkbox-mixed{display:block;fill:#0077cf}.tg-turbogrid .tg-radio{cursor:pointer;overflow:hidden}.tg-turbogrid .tg-radio:hover .tg-icon-radio::before{border-color:#005ba1}.tg-turbogrid .tg-radio .tg-icon-radio{position:absolute;top:50%;left:50%;width:16px;height:16px;transform:translate(-50%, -50%)}.tg-turbogrid .tg-radio .tg-icon-radio::before{position:absolute;top:50%;left:50%;content:"";display:block;width:16px;height:16px;border:thin solid gray;border-radius:50%;background:#fff;transform:translate(-50%, -50%)}.tg-turbogrid .tg-radio .tg-icon-radio::after{position:absolute;top:50%;left:50%;content:"";display:none;width:10px;height:10px;border-radius:50%;background:#0077cf;transform:translate(-50%, -50%)}.tg-turbogrid .tg-radio.tg-selected .tg-icon-radio::after{display:block;border-color:#0077cf}.tg-turbogrid .tg-scrollbar{position:absolute;z-index:100;overflow:hidden;user-select:none}.tg-turbogrid .tg-scrollbar-v{top:0;right:0}.tg-turbogrid .tg-scrollbar-h{left:0;bottom:0}.tg-turbogrid .tg-scrollbar-track{position:relative;width:100%;height:100%;background:#f9f9f9;overflow:hidden;user-select:none}.tg-turbogrid .tg-scrollbar-thumb{position:absolute;top:0;left:0;border-radius:1px;background:#999;overflow:hidden;user-select:none}.tg-turbogrid .tg-scrollbar-thumb:hover{background:#888}.tg-turbogrid .tg-scrollbar-thumb-hold{background:#666}.tg-turbogrid .tg-scrollbar-thumb-hold:hover{background:#666}.tg-turbogrid .tg-scrollbar-round .tg-scrollbar-track{border-radius:10px}.tg-turbogrid .tg-scrollbar-round .tg-scrollbar-thumb{border-radius:10px}.tg-turbogrid .tg-scroll-pane{position:relative;margin:0;padding:0;border:none;outline:none;overflow:hidden}.tg-turbogrid .tg-scroll-view{position:relative;width:100%;height:100%;margin:0;padding:0;border:none;overflow:hidden}.tg-turbogrid .tg-scroll-body{position:absolute}.tg-turbogrid .tg-header{position:relative;width:10000px;border-left:0;overflow:hidden}.tg-turbogrid .tg-header-table{position:relative;color:#5e5e5e;font-weight:bold;font-size:14px;line-height:16px;border-bottom:thin solid #e5e5e5;overflow:hidden}.tg-turbogrid .tg-header-item{position:absolute;bottom:0}.tg-turbogrid .tg-header-group-item{overflow:hidden}.tg-turbogrid .tg-header-group-item::after{position:absolute;left:5px;bottom:0;content:"";display:block;width:calc(100% - 10px);height:1px;border-bottom:thin solid #ccc}.tg-turbogrid .tg-column-header{position:absolute;bottom:0;overflow:hidden}.tg-turbogrid .tg-column-header .tg-column-name{padding:10px 5px;text-overflow:ellipsis;overflow:hidden}.tg-turbogrid .tg-column-header .tg-column-name.tg-header-group-name{margin:0 5px;padding:5px 0}.tg-turbogrid .tg-column-resizing{position:absolute;top:0;right:-5px;z-index:100;width:10px;height:100%;background:#ccc;cursor:ew-resize;opacity:0}.tg-turbogrid .tg-header-column-last .tg-column-resizing{right:0}.tg-turbogrid .tg-column-sortable .tg-column-name{cursor:pointer}.tg-turbogrid .tg-column-sortable .tg-sort-indicator{cursor:pointer}.tg-turbogrid .tg-column-sorted{color:#000}.tg-turbogrid .tg-header-sort-h .tg-column-name{padding:12px 5px 15px}.tg-turbogrid .tg-header-sort-h .tg-column-sort{width:100%;height:15px;margin-top:-15px;padding:0 5px;overflow:hidden}.tg-turbogrid .tg-header-sort-h .tg-sort-indicator{position:relative;display:none;width:100%;height:100%}.tg-turbogrid .tg-header-sort-h .tg-column-sorted .tg-column-sort .tg-sort-indicator{display:block}.tg-turbogrid .tg-header-sort-h .tg-sort-indicator-line{position:absolute;top:1px;width:100%;height:0;border-top:thin solid #1e1e1e;overflow:hidden}.tg-turbogrid .tg-header-sort-h .tg-sort-indicator-icon{position:absolute;top:5px;left:0;right:inherit}.tg-turbogrid .tg-header-sort-h .tg-align-right .tg-sort-indicator-icon{left:inherit;right:0}.tg-turbogrid .tg-header-sort-h .tg-align-center .tg-sort-indicator-icon{left:50%;transform:translateX(-50%)}.tg-turbogrid .tg-header-sort-h .tg-sort-indicator-icon .tg-icon-sort-h{display:block;width:19px;height:6px}.tg-turbogrid .tg-header-sort-h .tg-sort-indicator-icon .tg-icon-item{display:none;fill:#1e1e1e}.tg-turbogrid .tg-header-sort-h .tg-sort-indicator-icon .tg-icon-item-light{fill:#ababab}.tg-turbogrid .tg-column-sort-v{display:flex;flex-direction:row;align-items:center}.tg-turbogrid .tg-column-sort-v .tg-column-name{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.tg-turbogrid .tg-column-sort-v.tg-align-right{justify-content:right}.tg-turbogrid .tg-column-sort-v .tg-sort-indicator{position:relative;width:16px;height:16px}.tg-turbogrid .tg-column-sort-v .tg-sort-indicator-icon{position:absolute}.tg-turbogrid .tg-column-sort-v .tg-sort-indicator-icon .tg-icon-sort-v{display:block;width:10px;height:16px}.tg-turbogrid .tg-column-sort-v .tg-sort-indicator-icon .tg-icon-item{fill:#ababab}.tg-turbogrid .tg-column-sort-v .tg-sort-indicator-icon .tg-icon-item-light{fill:#ababab}.tg-turbogrid .tg-column-sort-v.tg-column-sorted .tg-sort-indicator-icon .tg-icon-item{fill:#1e1e1e}.tg-turbogrid .tg-column-sort-v.tg-column-sorted .tg-sort-indicator-icon .tg-icon-item-light{fill:#ababab}.tg-turbogrid .tg-sort-desc .tg-sort-indicator .tg-sort-indicator-icon .tg-desc{display:block}.tg-turbogrid .tg-sort-desc .tg-sort-indicator .tg-sort-indicator-icon .tg-asc{display:none}.tg-turbogrid .tg-sort-asc .tg-sort-indicator .tg-sort-indicator-icon .tg-desc{display:none}.tg-turbogrid .tg-sort-asc .tg-sort-indicator .tg-sort-indicator-icon .tg-asc{display:block}.tg-turbogrid .tg-column-line{position:absolute;top:0;left:0;z-index:100;display:none;height:100%;pointer-events:none}.tg-turbogrid .tg-column-line-item{position:absolute;top:0;bottom:0;display:block;width:0;height:100%;border-left:thin solid #ccc}.tg-turbogrid .tg-column-line-item.tg-active{border-left:thin solid #0077cf}.tg-turbogrid .tg-column-dragging{cursor:ew-resize}.tg-turbogrid .tg-column-dragging .tg-column-name{cursor:ew-resize}.tg-turbogrid .tg-column-dragging .tg-column-resizing:not(.tg-resizing-active){display:none}.tg-turbogrid .tg-tree{position:relative;display:flex;flex-direction:row;place-items:center left;width:100%;height:100%;overflow:hidden}.tg-turbogrid .tg-tree-icon{position:relative;width:15px;height:100%;min-height:9px;text-align:left;cursor:pointer;overflow:hidden}.tg-turbogrid .tg-tree-icon .tg-icon-tree{position:absolute;top:50%;left:0;display:block;width:9px;height:9px;transform:translate(0, -50%);overflow:hidden}.tg-turbogrid .tg-tree-icon .tg-tree-item{display:none}.tg-turbogrid .tg-tree-icon-collapsed .tg-tree-collapsed{display:block}.tg-turbogrid .tg-tree-icon-empty .tg-tree-collapsed{opacity:.5}.tg-turbogrid .tg-tree-icon-expanded .tg-tree-expanded{display:block}.tg-turbogrid .tg-tree-name{flex:1;text-overflow:ellipsis;overflow:hidden}.tg-turbogrid .tg-tree-header .tg-tree .tg-tree-icon{display:none}.tg-turbogrid .tg-tree-icon-all{position:relative;height:17px}.tg-turbogrid .tg-tree-header-indent .tg-tree{padding-left:5px}.tg-turbogrid .tg-tree-header-indent .tg-tree .tg-tree-icon{display:block}.tg-turbogrid .tg-tree-header-indent.tg-column-sort-h .tg-column-sort{width:calc(100% - 20px);margin-left:20px}.tg-turbogrid .tg-pane{position:absolute;width:100%;outline:0;overflow:hidden}.tg-turbogrid .tg-header-frame{position:relative;display:block;outline:0;overflow:hidden}.tg-turbogrid .tg-header-frame .tg-pane{height:100%}.tg-turbogrid .tg-body-frame{position:relative;width:100%;outline:0}.tg-turbogrid .tg-body-message{position:absolute;display:none;width:100%;height:100%;padding:10px;overflow:hidden}.tg-turbogrid .tg-body-message img,.tg-turbogrid .tg-body-message div{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.tg-turbogrid .tg-body{position:absolute;outline:0}.tg-turbogrid .tg-cell-hover-icon{display:none}.tg-touch-device.tg-turbogrid .tg-cell-hover-icon{display:inherit}.tg-turbogrid .tg-cell-row-number{font-weight:normal}.tg-turbogrid .tg-cell-row-drag .tg-row-drag-icon{position:absolute;top:50%;left:50%;width:24px;height:24px;cursor:move;opacity:.8;transform:translate(-50%, -50%)}.tg-turbogrid .tg-cell-row-drag .tg-row-drag-icon:hover{opacity:1}.tg-turbogrid .tg-cell{position:absolute;z-index:1;height:100%;margin:0;padding:0 5px;color:#1e1e1e;white-space:nowrap;text-overflow:ellipsis;vertical-align:middle;overflow:hidden}.tg-turbogrid .tg-cell:focus{outline:none}.tg-turbogrid .tg-cell.tg-flashing{border:1px solid red !important}.tg-turbogrid .tg-cell.tg-selected{background-color:beige}.tg-turbogrid .tg-cell.tg-multiline{display:flex;flex-direction:column;justify-content:center;padding:5px;line-height:normal;white-space:normal;text-overflow:ellipsis}.tg-turbogrid .tg-cell.tg-multiline .tg-multiline-wrapper{overflow:hidden}.tg-turbogrid .tg-cell.tg-align-left.tg-cell-negative{padding-left:1px}.tg-turbogrid .tg-cell.tg-align-right.tg-cell-negative{padding-right:1px}.tg-turbogrid .tg-row{position:absolute;width:100%;border:0;border-bottom:thin solid #e5e5e5}.tg-turbogrid .tg-row.tg-group-line{border-bottom:thin solid #999}.tg-turbogrid .tg-row.tg-none-line{border-bottom:none}.tg-turbogrid .tg-row.tg-top-line{border-top:thin solid #e5e5e5}.tg-turbogrid .tg-row.tg-group{font-weight:bold;overflow:hidden}.tg-turbogrid .tg-row.tg-group .tg-cell.tg-align-left.tg-cell-negative{padding-left:0}.tg-turbogrid .tg-row.tg-group .tg-cell.tg-align-right.tg-cell-negative{padding-right:0}.tg-turbogrid .tg-row.tg-hover .tg-cell .tg-cell-hover-icon{display:inherit}.tg-turbogrid .tg-row.tg-dragging{opacity:.3}.tg-turbogrid .tg-row.tg-clone{z-index:1000;border:1px dashed #ccc;border-right:none;border-left:none;background:#fff;cursor:move;opacity:.5}.tg-turbogrid .tg-row.tg-clone *{cursor:move}.tg-turbogrid .tg-row-placeholder{position:absolute;z-index:9999;width:100%;border-top:2px solid #00a8e1;pointer-events:none}.tg-turbogrid .tg-row::before,.tg-turbogrid .tg-row::after{position:absolute;top:0;left:0;content:"";z-index:100;display:none;width:100%;height:100%;pointer-events:none}.tg-turbogrid .tg-hover.tg-row::before{display:block;background:rgba(0,0,0,.08)}.tg-turbogrid .tg-selected.tg-row::after{display:block;background:rgba(0,0,0,.13)}.tg-lightblue .tg-header-item{border-top:thin solid #e8eaf0;border-right:thin solid #e8eaf0}.tg-lightblue .tg-column-name{padding:5px;color:#304265}.tg-lightblue .tg-header-group-item::after{display:none}.tg-lightblue .tg-checkbox .tg-icon-item{fill:#d4d7e0}.tg-lightblue .tg-checkbox:hover .tg-icon-item{fill:#107fff}.tg-lightblue .tg-checkbox.tg-selected .tg-select-checkbox{fill:#107fff}.tg-lightblue .tg-checkbox.tg-mixed .tg-select-mixed{fill:#107fff}.tg-lightblue .tg-cell{color:#304265;border-right:thin solid #e8eaf0}.tg-lightblue .tg-row{border-bottom:thin solid #e8eaf0}.tg-lightblue .tg-row.tg-group-line{border-bottom:thin solid #c9ccd8}.tg-lightblue .tg-row.tg-selected{background:rgba(58,116,213,.05)}.tg-lightblue .tg-row.tg-hover{background:rgba(58,116,213,.05)}.tg-lightblue .tg-row.tg-even{background:#fbfcfe}.tg-lightblue .tg-row.tg-odd{background:#fff}.tg-lightblue .tg-hover.tg-row::before{background:rgba(58,116,213,.05)}.tg-lightblue .tg-selected.tg-row::after{background:rgba(58,116,213,.1)}.tg-lightblue .tg-header-frame{border-bottom:thin solid #e8eaf0}.tg-lightblue .tg-row-not-found .tg-frozen-line-v{border-right:none}.tg-lightblue .tg-scrollbar-track{background:#fff}.tg-lightblue .tg-scrollbar-thumb{background:rgba(48,66,101,.35)}.tg-lightblue .tg-scrollbar-thumb:hover{background-color:#a8a8a8}.tg-lightblue .tg-scrollbar-thumb:active{background-color:#787878}.tg-dark{background:#1e1e1e}.tg-dark .tg-checkbox .tg-icon-item{fill:#ababab}.tg-dark .tg-header-table{color:#ccc;border-bottom:thin solid #333}.tg-dark .tg-header-group-item::after{border-bottom:1px solid #999}.tg-dark .tg-column-sorted{color:#fff}.tg-dark .tg-column-sorted .tg-tree-icon-all .tg-icon-item{fill:#fff}.tg-dark .tg-header-sort-h .tg-sort-indicator-line{border-top:thin solid #eee}.tg-dark .tg-header-sort-h .tg-sort-indicator-icon .tg-icon-item{fill:#eee}.tg-dark .tg-header-sort-h .tg-sort-indicator-icon .tg-icon-item-light{fill:#666}.tg-dark .tg-column-sort-v .tg-sort-indicator-icon .tg-icon-item{fill:#666}.tg-dark .tg-column-sort-v .tg-sort-indicator-icon .tg-icon-item-light{fill:#666}.tg-dark .tg-column-sort-v.tg-column-sorted .tg-sort-indicator-icon .tg-icon-item{fill:#fff}.tg-dark .tg-column-sort-v.tg-column-sorted .tg-sort-indicator-icon .tg-icon-item-light{fill:#666}.tg-dark .tg-tree-icon .tg-icon-item{fill:#fff}.tg-dark .tg-tree-icon-all .tg-icon-item{fill:#999}.tg-dark .tg-header-item .tg-tree-icon .tg-icon-item{fill:#999}.tg-dark .tg-header-item .tg-column-sorted .tg-tree-icon .tg-icon-item{fill:#fff}.tg-dark .tg-row{border-bottom:thin solid #333}.tg-dark .tg-row.tg-group-line{border-bottom:thin solid #666}.tg-dark .tg-row.tg-clone{border:1px dashed #1e1e1e;opacity:.1}.tg-dark .tg-cell{color:#eee}.tg-dark .tg-body-message{color:#eee}.tg-dark .tg-hover.tg-row::before{background:rgba(255,255,255,.1)}.tg-dark .tg-selected.tg-row::after{background:rgba(255,255,255,.2)}.tg-dark .tg-mask{background-color:#fff}.tg-dark .tg-scrollbar-track{background:#333}.tg-dark .tg-scrollbar-thumb{background:#bbb}.tg-dark .tg-scrollbar-thumb:hover{background:#ddd}.tg-dark .tg-scrollbar-thumb-hold{background:#eee}.tg-dark .tg-scrollbar-thumb-hold:hover{background:#eee}.tg-pointer-events-none{pointer-events:none}',""]);const l=r},505:t=>{t.exports=function(t){var e=[];return e.toString=function(){return this.map((function(e){var i="",o=void 0!==e[5];return e[4]&&(i+="@supports (".concat(e[4],") {")),e[2]&&(i+="@media ".concat(e[2]," {")),o&&(i+="@layer".concat(e[5].length>0?" ".concat(e[5]):""," {")),i+=t(e),o&&(i+="}"),e[2]&&(i+="}"),e[4]&&(i+="}"),i})).join("")},e.i=function(t,i,o,n,s){"string"==typeof t&&(t=[[null,t,void 0]]);var r={};if(o)for(var l=0;l0?" ".concat(c[5]):""," {").concat(c[1],"}")),c[5]=s),i&&(c[2]?(c[1]="@media ".concat(c[2]," {").concat(c[1],"}"),c[2]=i):c[2]=i),n&&(c[4]?(c[1]="@supports (".concat(c[4],") {").concat(c[1],"}"),c[4]=n):c[4]="".concat(n)),e.push(c))}},e}},256:t=>{t.exports=function(t){return t[1]}}},e={};function i(o){var n=e[o];if(void 0!==n)return n.exports;var s=e[o]={id:o,exports:{}};return t[o](s,s.exports,i),s.exports}i.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return i.d(e,{a:e}),e},i.d=(t,e)=>{for(var o in e)i.o(e,o)&&!i.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:e[o]})},i.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);var o={};(()=>{i.d(o,{$:()=>w,MP:()=>e,_d:()=>k,xA:()=>Xt,In:()=>X,T8:()=>D,Gr:()=>kt,ht:()=>qt,J0:()=>d,xv:()=>Yt,Ay:()=>Kt});const t="turbogrid",e={ID:t,NS:`tg-${t}`,VERSION:"3.1.0",TIMESTAMP:"2024-06-04T10:15:28.564Z",UP:"up",DOWN:"down",LEFT:"left",RIGHT:"right",TREE_INDENT:15},n=function(t){if(!t||"object"!=typeof t)return!1;const e=Object.prototype.toString.call(t);return!!["[object Object]","[object Array]"].includes(e)&&(!t.constructor||!![Object,Array].includes(t.constructor))},s=function(t,e){let i;return t.forEach((t=>{n(t)&&(i||(i=t instanceof Array?[]:{}),t instanceof Array?function(t,e,i){const o=e.length;for(let s=0;s{this.execute()})):Promise.resolve().then((()=>{this.execute()}))}execute(){if(!this.started)return;this.started=!1;const t=this.callback;this.callback=null,"function"==typeof t&&t.call(this)}cancel(){this.started=!1,this.callback=null}}const a=new WeakMap,c={isObject:n,merge:l,hasOwn:function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},uid:function(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:8;const e="0123456789abcdefghijklmnopqrstuvwxyz";let i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";for(;t--;)i+=e[36*Math.random()|0];return i},isNum:function(t){if("number"!=typeof t||isNaN(t))return!1;return(e=t)!==Number.MAX_VALUE&&e!==Number.MIN_VALUE&&e!==Number.NEGATIVE_INFINITY&&e!==Number.POSITIVE_INFINITY;var e},toNum:function(t,e){return"number"!=typeof t&&(t=parseFloat(t)),isNaN(t)&&(t=0),e&&!Number.isInteger(t)&&(t=Math.round(t)),t},convertNum:function(t){if("string"==typeof t){if(/^[-+]?\d+(\.\d+)?$/gi.test(t))return parseFloat(t)}return t},clamp:function(t,e,i){return Math.max(Math.min(t,i),e)},per:function(t){return t=c.toNum(t),t=c.clamp(t,0,1)},replace:function(t,e){return t=`${t}`,e?t=t.replace(/\{([^}]+)\}/g,(function(t,i){return c.hasOwn(e,i)?e[i]:t})):t},isArray:function(t){return!!(t&&t instanceof Array)},toList:function(t){return t instanceof Array?t:void 0===t?[]:"string"==typeof t?[t]:t&&c.hasOwn(t,"length")?Array.from(t):[t]},isList:function(t){return!!(c.isArray(t)&&t.length>0)},inList:function(t,e){if(!c.isList(e))return!1;for(let i=0,o=e.length;i{if(!c.isList(t))return;let n=0;const s=t.length;for(;nt.startsWith(e))).forEach((e=>{t[e]=null}))},hasShiftKey:function(t){let e=!1;return t&&(e=t.shiftKey),e},isTouchDevice:function(){return"ontouchstart"in window||navigator.maxTouchPoints>0||navigator.msMaxTouchPoints>0},contains:function(t,e){if(!t||!e)return!1;if(t===e)return!0;if("function"==typeof t.contains)return t.contains(e);let i=e.parentNode;for(;i;){if(i===t)return!0;i=i.parentNode}return!1},isNarrowCharacter:function(t){const e=t.codePointAt(0);return e>=32&&e<=126||162===e||163===e||165===e||166===e||172===e||175===e||8361===e||e>=10214&&e<=10221||10629===e||10630===e||e>=65377&&e<=65470||e>=65474&&e<=65479||e>=65482&&e<=65487||e>=65490&&e<=65495||e>=65498&&e<=65500||e>=65512&&e<=65518},getCharLen:function(t){let e=0;if(!t)return e;for(const i of String(t))e+=c.isNarrowCharacter(i)?1:2;return e},pascalToKebabCase:function(t){return`${t}`.trim().replace(/([a-z])([A-Z])/g,"$1-$2").replace(/\W/g,(t=>/[À-ž]/.test(t)?t:"-")).replace(/^-+|-+$/g,"").replace(/-{2,}/g,"-").toLowerCase()},classMap:function(t){if("string"==typeof t)return t.trim();if(Array.isArray(t)){let e=t.filter((t=>t));return e=e.map((t=>t&&"object"==typeof t?c.classMap(t):String(t).trim())),e=e.filter((t=>t)),e=Array.from(new Set(e)),e.join(" ")}if(t&&"object"==typeof t){const e=[];return Object.keys(t).forEach((i=>{t[i]&&e.push(i)})),e.join(" ")}return""},styleMap:function(t){if("string"==typeof t)return t.trim();if(Array.isArray(t)){let e=t.filter((t=>t));return e=e.map((t=>{const e=String(t).trim();return e?-1===e.indexOf(":")?"":e.endsWith(";")?e:`${e};`:""})),e=e.filter((t=>t)),e=Array.from(new Set(e)),e.join(" ")}if(t&&"object"==typeof t){const e=[];return Object.keys(t).forEach((i=>{const o=t[i];if(o||0===o){const t=String(o).trim();t&&e.push(`${c.pascalToKebabCase(i)}: ${t};`)}})),e.join(" ")}return""},getInstance:function(t){if(t){const e=document.getElementById(t);if(e)return a.get(e)}},setInstance:function(t,e){t&&a.set(t,e)},bindEvents:function(t,e){t&&(c.unbindEvents(t),Object.keys(t).forEach((i=>{const o=t[i];o.target=o.target||e,o.target.addEventListener(i,o.handler,o.options)})))},unbindEvents:function(t){t&&Object.keys(t).forEach((e=>{const i=t[e];i.target&&i.target.removeEventListener(e,i.handler,i.options)}))},preventDefault:function(t){t&&"function"==typeof t.preventDefault&&t.cancelable&&t.preventDefault()},debounce:function(t){let e,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:100;const o=function(){clearTimeout(e),e=setTimeout((()=>{t.apply(this,arguments)}),i)};return o.cancel=()=>{clearTimeout(e)},o},throttle:function(t){let e,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:100,o=0;const n=function(){const n=Date.now();if(n>o+i)return clearTimeout(e),o=n,void t.apply(this,arguments);clearTimeout(e),e=setTimeout((()=>{o=n,t.apply(this,arguments)}),i)};return n.cancel=()=>{clearTimeout(e),o=0},n},microtask:function(t){const e=new h,i=function(){e.start((()=>{t.apply(this,arguments)}))};return i.cancel=()=>{e.cancel()},i},nextTick:function(t){"function"==typeof window.queueMicrotask?window.queueMicrotask((()=>{t()})):Promise.resolve().then((()=>{t()}))},cancelAsync:function(t){t&&(Object.keys(t).filter((e=>e.startsWith("async")&&"function"==typeof t[e])).forEach((e=>{const i=t[e];"function"==typeof i.cancel&&(i.cancel(),t[e]=null)})),Object.keys(t).filter((t=>t.startsWith("timeout"))).forEach((e=>{clearTimeout(t[e])})))}},d=c,u={animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},g=function(t){return null!==t&&1===t.nodeType},f=function(t){let e=t.ownerDocument.defaultView;return e&&e.opener||(e=window),e.getComputedStyle(t)},p={},m=function(t,e){return null!=(i=t)&&i===i.window?t[`inner${e}`]:(function(t){return null!==t&&9===t.nodeType}(t)&&(t=t.body),t[`client${e}`]);var i},b=function(t){return this.list=[],t?this.create(t):this};function w(t){return new b(t)}b.prototype={constructor:b,Query:"Query",list:[],create:function(t){return t instanceof b?t:"string"==typeof t?this.createFromString(t):((t.nodeType||t===window)&&(this.list=[t]),this)},createFromString:function(t){if("<"===(t=t.trim())[0]&&">"===t[t.length-1]&&t.length>=3)this.parseHTML(t);else{const e=document.querySelectorAll(t);for(let t=0,i=e.length;t{this.css(e,t[e])}))}var i;return this.each((function(i){let o=e;"number"!=typeof o||u[t]||(o+="px"),i.style[t]=o})),this},attr:function(t,e){if(!t)return this;if(1===arguments.length){if("object"==typeof t)return Object.keys(t).forEach((e=>{this.attr(e,t[e])})),this;const e=this.get(0);return e?e.getAttribute(t):void 0}return this.each((function(i){i.setAttribute(t,e)})),this},removeAttr:function(t){return t?(this.each((function(e){e.hasAttribute(t)&&e.removeAttribute(t)})),this):this},removeClass:function(t){if(!arguments.length)return this.each((function(t){t.className=""})),this;if(!t||"string"!=typeof t)return this;const e=t.split(" ");return this.each((function(t){e.forEach((function(e){e&&t.classList.remove(e)}))})),this},addClass:function(t){if(!t||"string"!=typeof t)return this;const e=t.split(" ");return this.each((function(t){e.forEach((function(e){e&&t.classList.add(e)}))})),this},hasClass:function(t){if(!t||"string"!=typeof t)return!1;let e=!1;return this.each((function(i){if(i.classList.contains(t))return e=!0,!1})),e},show:function(){return this.each((function(t){if(!g(t))return;const e=function(t){if(!p[t]){const e=document.createElement(t);document.body.appendChild(e);const i=f(e).display;e.parentNode.removeChild(e),p[t]=i}return p[t]}(t.nodeName);t.style.display=e})),this},hide:function(){return this.each((function(t){if(!g(t))return;"none"!==t.style.display&&(t.style.display="none")})),this},click:function(){const t=this.get(0);return t&&"function"==typeof t.click&&t.click(),this},offset:function(){const t={left:0,top:0},e=this.get(0);if(e){const i=e.getBoundingClientRect();t.left=i.left+window.scrollX,t.top=i.top+window.scrollY}return t},clone:function(){const t=new b;return this.each((function(e){if(e&&e.cloneNode){const i=e.cloneNode(!0);t.add(i)}})),t},children:function(){const t=new b;return this.each((function(e){let i=e.firstChild;for(;i;)t.add(i),i=i.nextSibling})),t},parent:function(){const t=this.get(0);return t?new b(t.parentNode):new b},is:function(t){if(!t)return!1;const e=t.split(",");let i=!0;return this.each((function(t){if(!t.nodeName)return i=!1,!1;const o=t.nodeName.toLowerCase();return d.inList(o,e)?void 0:(i=!1,!1)})),i}},Object.defineProperty(b.prototype,"length",{get:function(){return this.list.length}});const v={createCache:function(){this.headerCache=new Map,this.bodyCache=new Map,this.dataCache=new WeakMap},setHeaderCache:function(t,e){this.headerCache.set(t,e)},getHeaderCache:function(t){return this.headerCache.get(t)},clearHeaderCache:function(){this.headerCache.clear()},setRowCache:function(t,e){this.bodyCache.set(t,{rowNodes:e,cellNodes:new Map})},getRowCache:function(t){return this.bodyCache.get(t)},deleteRowCache:function(t){const e=this.getRowNodesByIndex(t);e&&e.each((t=>{this.removeNode(t)})),this.bodyCache.delete(t)},deleteCellCache:function(t,e){t&&(this.removeNode(t.get(e)),t.delete(e))},getRowNodesByIndex:function(t){const e=this.getRowCache(t);if(e)return e.rowNodes},getCellNodeByIndex:function(t,e){const i=this.getRowCache(t);if(i)return i.cellNodes.get(e)},forEachBodyCache:function(t){this.bodyCache.forEach(((e,i)=>{t.call(this,i,e.rowNodes,e.cellNodes)}))},updateRowCacheTopOffset:function(){const t=this.frozenInfo.row;this.forEachBodyCache(((e,i,o)=>{if(!(e<=t)&&i){const t=this.getViewRowItem(e),o=this.getViewRowTop(t);i.css("top",o)}}))},setNodeDataCache:function(t,e){if(t)return this.dataCache.set(t,e)},getNodeDataCache:function(t){if(t)return this.dataCache.get(t)},removeCache:function(){this.headerCache=null,this.bodyCache=null,this.dataCache=null}},H=["onUpdated","onFirstUpdated","onHeaderUpdated","onSort","onColumnAdded","onColumnRemoved","onColumnWidthChanged","onRowAdded","onRowRemoved","onRowExpanded","onRowCollapsed","onRowSubsRequest","onRowDragged","onRowDropped","onRowMoved","onRowMouseEnter","onRowMouseLeave","onSelectChanged","onCellUpdated","onCellMouseEnter","onCellMouseLeave","onClick","onDblClick","onContextMenu","onMouseOver","onMouseOut","onTouchStart","onTouchMove","onTouchEnd","onScroll","onScrollStateChanged","onMouseWheel","onResize","onLayout","onKeyDown","onDestroy"],y={};H.forEach((t=>{y[t]=t}));const C=y,R={renderCells:function(t,e){t.forEach((t=>{this.drawRowCells(t,e)}))},getCellValue:function(t,e){return t[e.id]},renderCell:function(t,e,i){const o=this.getCellValue(t,e);let n=o;this.nullFormatter&&(n=this.nullFormatter.call(this,n,t,e,i));const s=t.tg_formatter||e.tg_formatter;"function"==typeof s&&(n=s.call(this,n,t,e,i)),this.renderNodeContent(i,n);const{highlightKey:r}=this.options.highlightKeywords;t[r+e.id]&&this.renderSettings.highlightCells.push(i),this.trigger(C.onCellUpdated,{value:o,rowItem:t,columnItem:e,node:i})},getPreRenderColumnList:function(t,e){const i=[];if(!e.length)return i;for(let o=0,n=e.length;o{this.createCellNode(t,e)}))},getCellClass:function(t,e){const i=e.tg_view_index,o=["tg-cell"];return o.push(`tg-c-${i}`),e.align&&o.push(`tg-align-${e.align}`),0===e.tg_list_index&&o.push("tg-list-first"),e.tg_list_last&&o.push("tg-list-last"),o.push(d.classMap(e.classMap)),o.push(d.classMap(t[`${e.id}ClassMap`])),d.classMap(o)},createCellNode:function(t,e){const i=this.getRowCache(t);if(!i)return;const o=this.getViewRowItem(t),n=this.getViewColumnItem(e);if(!o||!n)return;const s=document.createElement("div");s.setAttribute("column",e);const r=this.getCellClass(o,n);s.className=r;const l=d.styleMap(n.styleMap)+d.styleMap(o[`${n.id}StyleMap`]);l&&(s.style.cssText=l);const h=i.rowNodes,a=n.tg_frozen,c=this.getCellRowNode(h,a);this.appendNode(c,s),this.renderCell(o,n,s),i.cellNodes.set(e,s),this.setNodeDataCache(s,{row:t,rowItem:o,rowNode:c,column:e,columnItem:n,cellNode:s})},getCellRowNode:function(t,e){const i=t.get(0);if(this.frozenInfo.columns){const o=t.get(1);return this.frozenInfo.right?e?o:i:e?i:o}return i}},S={addColumn:function(t,e,i){let o=!(arguments.length>3&&void 0!==arguments[3])||arguments[3];const n=this.getToBeAddedItemList(t);if(!n.length)return!1;let s;if(null!=e&&(s=this.getColumnItem(e),!s))return!1;const r=this.getToBeAddedParentSubs(s,this.columns),l=[this.getToBeAddedPositionIndex(i,r),0].concat(n);r.splice.apply(r,l),this.onNextUpdated((function(){this.trigger(C.onColumnAdded,n)}));const h={type:"columns"};return o&&(h.scrollColumn=n[n.length-1]),this.render(h),!0},deleteColumn:function(t){const e=this.toColumnItemList(t,(t=>!t.private));return!!e.length&&(this.removeColumnsHandler(e),this.onNextUpdated((function(){this.trigger(C.onColumnRemoved,e)})),this.render("columns"),!0)},removeColumnsHandler:function(t){const e=[].concat(t);e.sort((function(t,e){return e.tg_index-t.tg_index})),e.forEach((t=>{let e;if(t===this.sortColumn&&this.removeSortColumn(),t.tg_parent)e=t.tg_parent.subs,e.splice(t.tg_sub_index,1);else{e=this.columns;const i=e.findIndex((e=>e===t));-1!==i&&e.splice(i,1)}!e.length&&t.tg_parent&&(t.tg_parent.subs=null)}))}},T={setColumnWidth:function(t,e){return this.updateColumnWidth(t,e)?(this.resize(),this):this},updateColumnWidth:function(t,e){const i=this.getColumnItem(t);return!!i&&(!!d.isNum(e)&&(e=Math.round(e),e=Math.max(0,e),i.tg_width!==e&&(i.width=e,i.minWidth=Math.min(i.minWidth,e),i.maxWidth=Math.max(i.maxWidth,e),this.updateViewColumnWidth(i),!0)))},showColumn:function(t){return this.updateColumnsInvisible(this.toColumnItemList(t),!1)},hideColumn:function(t){return this.updateColumnsInvisible(this.toColumnItemList(t),!0)},updateColumnsInvisible:function(t,e){if(!t.length)return!1;const i=[];return t.forEach((t=>{t.invisible!==e&&(t.invisible=e,t.tg_invisible=e,i.push(t))})),!!i.length&&(this.render("columns"),!0)}},L={showColumnLine:function(t){t&&(this.$columnLineContainer.show(),this.renderColumnLine(t))},hideColumnLine:function(){this.previousColumnLineActive||this.$columnLineContainer.hide()},setColumnLineActive:function(t){t!==this.previousColumnLineActive&&(this.previousColumnLineActive=t,t?this.$columnLineItem.addClass("tg-active"):this.$columnLineItem.removeClass("tg-active"))},getColumnLineLeft:function(t){let e=t.tg_left;return t.tg_frozen||(e-=this.scrollLeft),this.frozenInfo.right&&(t.tg_frozen?e=t.tg_left+this.paneWidthL:e-=this.columnsWidthR),e},renderColumnLine:function(t){const e=this.getHeaderItemNode(t).offsetTop,i=t.tg_width,o=this.getColumnLineLeft(t);this.$columnLineItemL.css({top:e,left:o}),this.$columnLineItemR.css({top:e,left:o+i-1}),this.frozenInfo.right||(this.frozenInfo.columns&&!t.tg_frozen&&o{this.renderColumnLine(e.columnItem)})),this.resize()},columnWidthTouchStartHandler:function(t,e){d.preventDefault(e.e);const i=e.columnItem;this.showColumnLine(i),this.setColumnLineActive(!0),e.index=i.tg_index;const o=this.getColumnHeaderNode(i);e.width=o.clientWidth},columnWidthTouchMoveHandler:function(t,e){d.preventDefault(e.e);const i=e.columnItem;let o=e.width+e.offsetX;o=d.clamp(o,i.minWidth,i.maxWidth),i.tg_width!==o&&(i.width=o,this.updateViewColumnWidth(i),this.renderColumnLine(i))},columnWidthTouchEndHandler:function(t,e){d.preventDefault(e.e),this.setColumnLineActive(!1),this.hideColumnLine(),this.resize()}},I={getColumnItem:function(t){return d.isNum(t)?(t<0&&(t=this.columnsInfo.length+t),this.columnsInfo.indexCache[t]):t?d.isNum(t.tg_index)?t:this.getColumnItemById(t.id||t):void 0},getColumnItemById:function(t){return this.getColumnItemBy("id",t)},getColumnItemBy:function(t,e){if(void 0!==e)return this.columnsInfo.indexCache.find((i=>i[t]===e))},getColumnsLength:function(t){return t?this.columnsInfo.length:this.viewColumns.length},getViewColumnItem:function(t){return this.viewAllColumns[t]},isColumnSortable:function(t){return!!t&&(!t.tg_group&&(!(!t.name||!t.id)&&this.isSortable(t)))},isColumnResizable:function(t){return!!t&&(!t.tg_group&&(!d.hasOwn(t,"resizable")||Boolean(t.resizable)))},updateViewColumnWidth:function(t){return t.tg_width=t.width,this.updateColumnHeaderSize(t),this.updateTotalColumnsWidth(),this.updateHeaderLayerHeight(),this.cssRulesInvalid=!0,this.resizeBodyHandler(),this.trigger(C.onColumnWidthChanged,t),!0},updateTotalColumnsWidth:function(){this.blankColumn.tg_width=0;const t=this.viewColumns;let e=0,i=0;const o=this.frozenInfo.columns,n=t.length;let s=0;for(let r=0;r0&&(s+=l,o&&r>=o?i+=l:e+=l)}if(this.frozenInfo.right){const t=e;e=i,i=t}this.columnsWidthL=e,this.columnsWidthR=i,this.columnsWidth=e+i},updateColumnHeaderSize:function(t){this.updateColumnHeaderWidth(t),this.updateColumnHeaderHeight(t,!0),this.updateColumnGroupWidth(t)},updateColumnHeaderWidth:function(t){const e=this.getColumnHeaderNode(t);if(!e)return;const i=t.tg_width;this.isInvisible(t)||i<=0?e.style.display="none":(e.style.display="",e.style.width=`${i}px`)},updateColumnHeaderHeight:function(t,e){if(t.tg_height=0,t.tg_width<=0)return;if(this.isInvisible(t))return;e&&(t.tg_element_height=0);const i=t.tg_element_height;if(i)return void(t.tg_height=i);const o=this.getColumnHeaderHeight(t);t.tg_height=o,t.tg_element_height=o},getColumnHeaderHeight:function(t){const e=this.getColumnHeaderNode(t);return e?e.clientHeight:0},updateColumnGroupWidth:function(t){const e=t.tg_parent;if(!e)return;const i=this.getColumnGroupWidth(e);e.tg_width!==i&&(e.tg_width=i,this.updateColumnHeaderSize(e))},getColumnGroupWidth:function(t){if(this.isInvisible(t))return 0;let e=0;return t.subs&&t.subs.forEach((t=>{this.isInvisible(t)||d.isNum(t.tg_width)&&(e+=t.tg_width)})),e}},E={initTreeInfo:function(t,e){const i=[];let o=!1,n=0,s=0;const r=function(t,r,l){(t=>{t.invisible?t.tg_invisible=!0:t.tg_invisible&&(t.tg_invisible=!1)})(t),((t,i)=>{if(e>=0&&!t.tg_invisible)return t.tg_frozen=!0,void(e-=1);t.tg_frozen&&(t.tg_frozen=!1)})(t),(t=>{if(d.hasOwn(t,"subs")){if(Array.isArray(t.subs))return o=!0,t.tg_group=!0,void(t.tg_subs_length=t.subs.length);t.subs=null}t.tg_group&&(t.tg_group=!1)})(t),((t,e)=>{t.tg_parent=e;let i=0;e&&(i=e.tg_level+1,i>n&&(n=i)),t.tg_level=i})(t,l),t.tg_index=s,t.tg_sub_index=r,i.push(t),s+=1},l=function(t,e){let i=0;const o=t.length;for(;i{if(!this.isInvisible(e))return this.isRowSelectable(e)?t(e,i,o):void 0})),this},toRowItemList:function(t,e){let i=d.toList(t).map((t=>this.getRowItem(t))).filter((t=>t));return"function"==typeof e&&(i=i.filter(e)),i},toColumnItemList:function(t,e){let i=d.toList(t).map((t=>this.getColumnItem(t))).filter((t=>t));return"function"==typeof e&&(i=i.filter(e)),i},isRowLeaf:function(t){return!!t&&("blank"!==t.formatter&&(!t.tg_frozen&&!t.tg_group))},isRowSelectable:function(t){return!!t&&(d.hasOwn(t,"selectable")?Boolean(t.selectable):this.isRowLeaf(t))},isEmptyGroup:function(t){return!(!t||!t.tg_group||0!==t.tg_subs_length)},isInvisible:function(t){return!!t&&(!(!t.tg_filtered&&!t.tg_invisible)||!!this.isInvisible(t.tg_parent))},isSortable:function(t){return!!t&&(!d.hasOwn(t,"sortable")||Boolean(t.sortable))},isCollapsedChanged:function(t,e){return Boolean(t.collapsed)!==e},isSelectedChanged:function(t,e){return Boolean(t.selected)!==e}},x={updateCssRules:function(){this.cssRulesInvalid&&(this.cssRulesInvalid=!1,this.initCssRules(),this.updateColumnsCssRules(),this.updateHeadersCssRules(),this.updateStyleElement())},initCssRules:function(){this.removeCssRules(),this.cssList={},this.cssDisplayCache={};const t=this.getRowHeight(),e=this.createCssRule(".tg-row");e.height=`${t}px`,e["line-height"]=`${t}px`},resetCssDisplay:function(t){if(this.cssDisplayCache){t=t||"";for(const e in this.cssDisplayCache)if(d.hasOwn(this.cssDisplayCache,e)){this.cssDisplayCache[e].style.display=t}}},updateColumnsCssRules:function(){const t=this.viewColumns,e=this.frozenInfo.column,i={};let o=0;for(let n=0,s=t.length;n=0;i--){const e=this.headerLayerHeight[i],o=this.createCssRule(`.tg-h-${i}`);o.bottom=`${t}px`,o.height=`${e}px`,t+=e}this.getLayerCombinations(e).forEach((t=>{const e=this.createCssRule(`.tg-h-${t}`);let i=0;t.split("").forEach((t=>{i+=this.headerLayerHeight[t]||0})),e.height=`${i}px`}))},getLayerCombinations:function(t){let e="";for(;t>=0;)e+=t,t--;if(e.length<2)return[];const i=[],o=function(t,e){const n=t.length;let s=e+2;for(;s<=n;){const o=t.substring(e,s);i.push(o),s++}e=i){let t="Possible Event memory leak detected. ";return t+=`More than ${i} (max limit) listeners added. `,t+="Use setMaxListeners(n) to increase limit.",void console.warn(t,e)}t.events.push(e)},addEvents:function(t,e,i){e.forEach((function(e){const o=e.type;t[o]||(t[o]={events:[]});if("function"!=typeof e.handler)return;const n=t[o];_.addEvent(n,e,i)}))},removeEventByNamespace:function(t,e){Object.keys(t).forEach((function(i){const o=t[i],n=[];o.events.forEach((function(t){t&&t.namespace!==e&&n.push(t)})),o.events=n}))},removeEventByHandler:function(t,e,i){const o=t[e];if(!o)return;const n=[];o.events.forEach((function(t){t&&t.handler!==i&&n.push(t)})),o.events=n},removeEventByType:function(t,e){const i=t[e];i&&(i.events=[])},removeEvent:function(t,e){const i=e.type,o=e.namespace;if(!i&&o)return void _.removeEventByNamespace(t,o);const n=e.handler;"function"!=typeof n?_.removeEventByType(t,i):_.removeEventByHandler(t,i,n)},removeEvents:function(t,e){e.forEach((function(e){_.removeEvent(t,e)}))},removeAllEvents:function(t){Object.keys(t).forEach((function(e){_.removeEventByType(t,e)}))},sendEventList:function(t,e,i,o){const n=e.events;for(let e=0;e!t.onceCalled))},sendEvent:function(t,e,i,o){const n=e[i];if(!n)return;const s=new P({type:i,target:t,currentTarget:t,data:o});_.sendEventList(t,n,s,o)}},N=_;class k{maxListeners=10;setMaxListeners(t){this.maxListeners=Number(t)||10}getMaxListeners(){return this.maxListeners}getEventListeners(){return this.eventListeners||(this.eventListeners={}),this.eventListeners}delEventListeners(){this.eventListeners=null}bind(t,e,i){const o=N.getEventList(this,t,e,i);if(!o.length)return this;const n=this.getEventListeners();return N.addEvents(n,o,this.maxListeners),this}once(t,e){return this.bind(t,e,{once:!0})}unbind(t,e,i){const o=this.getEventListeners();if(!arguments.length)return N.removeAllEvents(o),this;const n=N.getEventList(this,t,e,i);return n.length?(N.removeEvents(o,n),this):this}trigger(t,e){const i=this.getEventListeners();return N.sendEvent(this,i,t,e),this}}const V={DRAG_START:"drag_start",DRAG_MOVE:"drag_move",DRAG_END:"drag_end"};class O extends k{static EVENT=V;generateOptions(t){return d.merge({type:"mouse",startX:0,startY:0,previousX:0,previousY:0,currentX:0,currentY:0,moveX:0,moveY:0,offsetX:0,offsetY:0,changed:!1},t)}start(t,e){t&&(this.unbindEvents(),this.bindEvents(),this.options=this.generateOptions(e),this.startHandler(t))}bindEvents(){this.windowEvents={mousemove:{handler:t=>{this.iframeHandler(t),this.mouseMoveHandler(t)},options:!0},mouseup:{handler:t=>{this.mouseUpHandler(t)},options:{once:!0}}},d.bindEvents(this.windowEvents,window)}unbindEvents(){d.unbindEvents(this.windowEvents),this.windowEvents=null,this.previousIframe&&(this.previousIframe.classList.remove("tg-pointer-events-none"),this.previousIframe=null)}iframeHandler(t){const e=t.target;"IFRAME"===e.nodeName&&e!==this.previousIframe&&(this.previousIframe&&this.previousIframe.classList.remove("tg-pointer-events-none"),e.classList.add("tg-pointer-events-none"),this.previousIframe=e)}startHandler(t){const e=this.options;e.e=t,e.startX=t.pageX,e.startY=t.pageY,e.currentX=e.startX,e.currentY=e.startY,this.hasMoved=!1}mouseMoveHandler(t){d.preventDefault(t);const e=this.options;e.e=t,e.previousX=e.currentX,e.previousY=e.currentY,e.currentX=t.pageX,e.currentY=t.pageY,e.moveX=e.currentX-e.previousX,e.moveY=e.currentY-e.previousY,e.offsetX=e.currentX-e.startX,e.offsetY=e.currentY-e.startY,e.changed=!(0===e.offsetX&&0===e.offsetY),this.hasMoved?this.trigger(V.DRAG_MOVE,e):(this.hasMoved=!0,this.trigger(V.DRAG_START,e))}mouseUpHandler(t){this.unbindEvents();const e=this.options;this.hasMoved&&(e.e=t,d.preventDefault(t),this.trigger(V.DRAG_END,e))}destroy(){this.unbindEvents(),this.unbind()}}const $={Linear:{None:function(t){return t}}},B={MOTION_START:"motion_start",MOTION_MOVE:"motion_move",MOTION_END:"motion_end",MOTION_STOP:"motion_stop"};class D extends k{static EVENT=B;constructor(t){super(),this.constructorOptions=t,this.stopped=!0}generateOptions(t){return d.merge({easing:null,duration:100,from:0,till:1,data:0},this.constructorOptions,t)}stop(){return this.stopped||(this.stopped=!0,this.cancelAnimationFrame(),this.trigger(B.MOTION_STOP,this.data)),this}start(t){return this.stop(),this.stopped=!1,this.options=this.generateOptions(t),this.initCalculation(),this.data=this.calculateHandler(0),this.trigger(B.MOTION_START,this.data),this.stopped||(this.time=Date.now(),this.requestAnimationFrame(this.moveHandler)),this}requestAnimationFrame(t){this.requestId=window.requestAnimationFrame((()=>{t.apply(this)}))}cancelAnimationFrame(){window.cancelAnimationFrame(this.requestId)}getEasing(t){return"function"!=typeof t&&(t=d.getValue($,t,$.Linear.None)),t}moveHandler(){const t=Date.now()-this.time,e=this.duration;if(t{o[n]=this.calculateNumber(t,e[n],i[n])})),o):(this.calculateKeys=[],Object.keys(e).forEach((n=>{const s=e[n],r=i[n];d.isNum(s)&&d.isNum(r)&&(o[n]=this.calculateNumber(t,s,r),this.calculateKeys.push(n))})),o)}calculateNumber(t,e,i){return(i-e)*t+e}calculateNone(t,e,i){return e}destroy(){this.stop(),this.unbind()}}const W={TOUCH_START:"touch_start",TOUCH_MOVE:"touch_move",TOUCH_END:"touch_end",TOUCH_INERTIA:"touch_inertia"};class A extends k{static EVENT=W;generateOptions(t){return d.merge({type:"touch",startX:0,startY:0,previousX:0,previousY:0,currentX:0,currentY:0,moveX:0,moveY:0,offsetX:0,offsetY:0,changed:!1,touchLength:0,direction:"",inertia:!1,inertiaTime:200},t)}start(t,e){t&&(this.unbindEvents(),this.bindEvents(),this.options=this.generateOptions(e),this.startHandler(t))}bindEvents(){this.touchEvents={touchmove:{handler:t=>{this.touchMoveHandler(t)},options:{passive:!1}},touchend:{handler:t=>{this.touchEndHandler(t)},options:{passive:!1,once:!0}},touchcancel:{handler:t=>{this.touchCancelHandler(t)},options:{passive:!1,once:!0}}},d.bindEvents(this.touchEvents,document.body)}unbindEvents(){this.motionStop(),d.unbindEvents(this.touchEvents),this.touchEvents=null}startHandler(t){this.trackingPoints=[];const e=t.touches,i=e[0];if(!i)return;const o=this.options;o.e=t,o.startX=i.clientX,o.startY=i.clientY,o.currentX=o.startX,o.currentY=o.startY,o.touchLength=e.length,this.addTrackingPoint(o),this.trigger(W.TOUCH_START,o)}touchMoveHandler(t){const e=t.touches,i=e[0];if(!i)return;const o=this.options;o.e=t,o.previousX=o.currentX,o.previousY=o.currentY,o.currentX=i.clientX,o.currentY=i.clientY,o.moveX=o.currentX-o.previousX,o.moveY=o.currentY-o.previousY,o.offsetX=o.currentX-o.startX,o.offsetY=o.currentY-o.startY,o.changed=!(0===o.offsetX&&0===o.offsetY),o.touchLength=e.length,o.direction=this.getDirection(o),this.addTrackingPoint(o),this.trigger(W.TOUCH_MOVE,o)}touchEndHandler(t){this.unbindEvents();const e=this.options;e.e=t,this.trigger(W.TOUCH_END,e);const i=t.changedTouches[0];if(!i)return;const o=t.touches;e.touchLength=o.length,e.touchLength>0||(e.currentX=i.clientX,e.currentY=i.clientY,this.addTrackingPoint(e),this.motionStart())}touchCancelHandler(t){this.unbindEvents(),this.trigger(W.TOUCH_END,this.options)}getMotionInfo(){const t=this.trackingPoints;if(t.length<2)return;if(this.filterTrackingPoints(t),t.length<2)return;const e=t[0],i=t[t.length-1],o=i.t-e.t;if(o<=0)return;let n=i.x-e.x,s=i.y-e.y;const r=Math.abs(n),l=Math.abs(s);r>l?s=0:n=0;return{offsetDistance:Math.max(r,l),offsetTime:o,offsetX:n,offsetY:s}}motionStart(){const t=this.options;if(!t.inertia)return;const e=this.getMotionInfo();if(!e)return;const i=500*e.offsetDistance/50,o=d.clamp(i,20,2e3),n={x:20*(e.offsetX/e.offsetTime),y:20*(e.offsetY/e.offsetTime)};this.motion=new D,this.motion.bind(D.EVENT.MOTION_MOVE,((e,i)=>{t.touchInertiaX=i.x,t.touchInertiaY=i.y,this.trigger(W.TOUCH_INERTIA,t)})),this.motion.start({duration:o,from:n,till:{x:0,y:0}})}motionStop(){this.motion&&(this.motion.destroy(),this.motion=null)}getDirection(t){const i=t.offsetX,o=t.offsetY,n=Math.abs(i),s=Math.abs(o);if(n0)return e.UP;if(o<0)return e.DOWN}if(n>s){if(i>0)return e.LEFT;if(i<0)return e.RIGHT}return""}filterTrackingPoints(t){t.reverse();const e=t.length,i=Date.now(),o=this.options.inertiaTime;for(let n=0;no){t.length=n;break}t.reverse()}addTrackingPoint(t){if(!t.inertia)return;const e=t.currentX,i=t.currentY,o=Date.now(),n=this.trackingPoints;n.push({x:e,y:i,t:o}),n.length>100&&this.filterTrackingPoints(n)}destroy(){this.unbindEvents(),this.unbind()}}const F={getAllEvents:function(){return[].concat(H)},bindEvents:function(){this.unbindEvents(),this.containerEvents={mousedown:{handler:t=>{this.containerMouseDownHandler(t)},options:!0},mousemove:{handler:t=>{this.containerMouseMoveHandler(t)},options:!0},mouseover:{handler:t=>{this.containerMouseOverOutHandler(t,!0)},options:!0},mouseout:{handler:t=>{this.containerMouseOverOutHandler(t,!1)},options:!0},mouseenter:{handler:t=>{this.containerMouseEnterLeaveHandler(t,!0)},options:!0},mouseleave:{handler:t=>{this.containerMouseEnterLeaveHandler(t,!1)},options:!0},touchstart:{handler:t=>{this.containerTouchStartHandler(t)},options:{passive:!1}},touchmove:{handler:t=>{this.containerTouchMoveHandler(t)},options:{passive:!1}},touchend:{handler:t=>{this.containerTouchEndHandler(t)},options:{passive:!1}},touchcancel:{handler:t=>{this.containerTouchCancelHandler(t)},options:{passive:!1}},wheel:{handler:t=>{this.containerWheelHandler(t)},options:{passive:!1}},click:{handler:t=>{this.containerClickHandler(t)},options:!0},dblclick:{handler:t=>{this.containerDblClickHandler(t)},options:!0},contextmenu:{handler:t=>{this.containerContextMenuHandler(t)},options:!0},selectstart:{handler:t=>{this.containerSelectStartHandler(t)},options:!0},keydown:{handler:t=>{this.containerKeyDownHandler(t)},options:!0}},d.bindEvents(this.containerEvents,this.container),this.columnWidthDrag=new O,this.columnWidthDrag.bind(O.EVENT.DRAG_START,((t,e)=>{this.columnWidthDragStartHandler(t,e)})).bind(O.EVENT.DRAG_MOVE,((t,e)=>{this.columnWidthDragMoveHandler(t,e)})).bind(O.EVENT.DRAG_END,((t,e)=>{this.columnWidthDragEndHandler(t,e)})),this.columnWidthTouch=new A,this.columnWidthTouch.bind(A.EVENT.TOUCH_START,((t,e)=>{this.columnWidthTouchStartHandler(t,e)})).bind(A.EVENT.TOUCH_MOVE,((t,e)=>{this.columnWidthTouchMoveHandler(t,e)})).bind(A.EVENT.TOUCH_END,((t,e)=>{this.columnWidthTouchEndHandler(t,e)})),this.rowDrag=new O,this.rowDrag.bind(O.EVENT.DRAG_START,((t,e)=>{this.rowDragStartHandler(t,e)})).bind(O.EVENT.DRAG_MOVE,((t,e)=>{this.rowDragMoveHandler(t,e)})).bind(O.EVENT.DRAG_END,((t,e)=>{this.rowDragEndHandler(t,e)})),this.rowTouch=new A,this.rowTouch.bind(A.EVENT.TOUCH_START,((t,e)=>{this.rowDragStartHandler(t,e)})).bind(A.EVENT.TOUCH_MOVE,((t,e)=>{this.rowDragMoveHandler(t,e)})).bind(A.EVENT.TOUCH_END,((t,e)=>{this.rowDragEndHandler(t,e)})),this.scrollTouch=new A,this.scrollTouch.bind(A.EVENT.TOUCH_START,((t,e)=>{this.scrollTouchStartHandler(t,e)})).bind(A.EVENT.TOUCH_MOVE,((t,e)=>{this.scrollTouchMoveHandler(t,e)})).bind(A.EVENT.TOUCH_END,((t,e)=>{this.scrollTouchEndHandler(t,e)})).bind(A.EVENT.TOUCH_INERTIA,((t,e)=>{this.scrollTouchInertiaHandler(t,e)}))},isDefaultPrevented:function(t){return!!t&&t.defaultPrevented},getEventClosestNode:function(t,e){if(t&&t!==this.container)return t.classList.contains(e)?t:this.getEventClosestNode(t.parentNode,e)},getEventClosestData:function(t){if(!t||t===this.container)return;const e=this.getNodeDataCache(t);return e||this.getEventClosestData(t.parentNode)},getEventData:function(t){const e=this.getEventClosestData(t.target);if(e)return e.e=t,e},getWheelDelta:function(t,e,i){let o=t.deltaX,n=t.deltaY;return d.isNum(o)||(o=d.toNum(t.wheelDeltaX)),d.isNum(n)||(n=d.toNum(t.wheelDeltaY||t.wheelDelta)),1===t.deltaMode?(n*=e,o*=e):2===t.deltaMode&&(n*=i,o*=i),{deltaX:o,deltaY:n}},columnResizingMouseDownHandler:function(t){const e=this.getEventData(t);e&&this.columnWidthDrag.start(t,{columnItem:e.columnItem})},columnResizingTouchStartHandler:function(t){const e=this.getEventData(t);e&&this.columnWidthTouch.start(t,{columnItem:e.columnItem})},columnResizingMouseEnterLeaveHandler:function(t,e){const i=this.getEventData(t);i&&(e?this.showColumnLine(i.columnItem):this.hideColumnLine())},rowDragMouseDownHandler:function(t){const e=this.getEventData(t);e&&this.rowDrag.start(t,{rowItem:e.rowItem})},rowDragTouchStartHandler:function(t){const e=this.getEventData(t);e&&(this.protectedItem=e,this.rowTouch.start(t,{rowItem:e.rowItem}))},scrollPaneTouchStartHandler:function(t){if(!this.hasHScroll&&!this.hasVScroll)return;const e=this.getEventData(t);this.protectedItem=e,this.scrollTouch.start(t,{inertia:!0})},sortHandler:function(t,e){const i=e.columnItem;if(!this.isColumnSortable(i))return;const o=this.getEventClosestNode(t.target,"tg-column-name"),n=this.getEventClosestNode(t.target,"tg-column-sort");(o||n)&&(this.trigger(C.onSort,e),this.isDefaultPrevented(t)||this.setSortColumn(i))},selectIconAllClickHandler:function(t){const e=w(t);let i=!1;(e.hasClass("tg-selected")||e.hasClass("tg-mixed"))&&(i=!0),i=!i,this.selectAll(i)},cellEnterLeaveHandler:function(t,e){const i=this.getEventData(t);i&&(e?this.trigger(C.onCellMouseEnter,i):this.trigger(C.onCellMouseLeave,i))},rowEnterLeaveHandler:function(t,e){const i=this.getEventData(t);if(i&&(e?this.trigger(C.onRowMouseEnter,i):this.trigger(C.onRowMouseLeave,i),!this.isDefaultPrevented(t)))return this.renderRowHover(i.rowItem,e),this},containerMouseDownHandler:function(t){if(this.getEventClosestNode(t.target,"tg-column-resizing"))this.columnResizingMouseDownHandler(t);else if(this.options.rowDragVisible){this.getEventClosestNode(t.target,"tg-row-drag-icon")&&this.rowDragMouseDownHandler(t)}},containerMouseMoveHandler:function(t){this.scrollbarFadeInOutHandler(t,!0)},containerMouseOverOutHandler:function(t,e){const i=this.getEventClosestNode(t.target,"tg-cell"),o=this.getEventClosestNode(t.target,"tg-header-item");if(i||o){const i=this.getEventData(t);if(!i)return;e?this.trigger(C.onMouseOver,i):this.trigger(C.onMouseOut,i)}},containerMouseEnterLeaveHandler:function(t,e){this.scrollbarFadeInOutHandler(t,e);if(w(t.target).hasClass("tg-column-resizing"))return void this.columnResizingMouseEnterLeaveHandler(t,e);if(w(t.target).hasClass("tg-cell"))return void this.cellEnterLeaveHandler(t,e);w(t.target).hasClass("tg-row")&&this.rowEnterLeaveHandler(t,e)},containerTouchStartHandler:function(t){this.scrollTouch.motionStop();if(this.getEventClosestNode(t.target,"tg-column-resizing"))return void this.columnResizingTouchStartHandler(t);if(this.options.rowDragVisible){if(this.getEventClosestNode(t.target,"tg-row-drag-icon"))return void this.rowDragTouchStartHandler(t)}const e=this.getEventData(t);e&&(this.trigger(C.onTouchStart,e),this.isDefaultPrevented(t))||this.scrollPaneTouchStartHandler(t)},containerTouchMoveHandler:function(t){const e=this.getEventData(t);e&&this.trigger(C.onTouchMove,e)},containerTouchEndHandler:function(t){const e=this.getEventData(t);e&&this.trigger(C.onTouchEnd,e)},containerTouchCancelHandler:function(t){this.trigger(C.onTouchEnd,{e:t})},containerWheelHandler:function(t){if(this.hasMask)return;const e=this.getRowHeight(),i=this.bodyHeight,o=this.getWheelDelta(t,e,i);if(this.trigger(C.onMouseWheel,{e:t,deltaX:o.deltaX,deltaY:o.deltaY,delta:o}),this.isDefaultPrevented(t))return;let n=!1;this.scrollPaneHidden&&(n=this.scrollPaneFrozen.setOffsetH(o.deltaX),o.deltaX=0);(this.scrollPane.mouseWheelHandler(o)||n)&&d.preventDefault(t)},containerClickHandler:function(t){if(this.getEventClosestNode(t.target,"tg-tree-icon-all"))return void this.toggleAllRows();const e=this.getEventClosestNode(t.target,"tg-select-icon-all");if(e)return void this.selectIconAllClickHandler(e);const i=this.getEventData(t);if(!i)return;if(this.getEventClosestNode(t.target,"tg-header-item")){if(this.trigger(C.onClick,i),this.isDefaultPrevented(t))return;return void this.sortHandler(t,i)}if(this.getEventClosestNode(t.target,"tg-tree-icon"))return void this.toggleRow(i.rowItem);this.getEventClosestNode(t.target,"tg-select-icon")?this.setRowSelected(i.rowItem,t):this.trigger(C.onClick,i)},containerDblClickHandler:function(t){const e=this.getEventData(t)||{e:t};this.trigger(C.onDblClick,e)},containerContextMenuHandler:function(t){const e=this.getEventData(t)||{e:t};this.trigger(C.onContextMenu,e)},containerSelectStartHandler:function(t){if(this.options.textSelectable)return;w(t.target).is("input,textarea,code")||d.preventDefault(t)},containerKeyDownHandler:function(t){if(this.hasMask)return;if(this.trigger(C.onKeyDown,{e:t}),this.isDefaultPrevented(t))return;const e=t.keyCode,i={9:this.keyTabHandler,13:this.keyEnterHandler,27:this.keyEscHandler,33:this.keyPageUpHandler,34:this.keyPageDownHandler,35:this.keyEndHandler,36:this.keyHomeHandler,37:this.keyLeftHandler,38:this.keyUpHandler,39:this.keyRightHandler,40:this.keyDownHandler}[e];if(!i)return;i.call(this,t)&&d.preventDefault(t)},unbindEvents:function(){d.unbindEvents(this.containerEvents),this.containerEvents=null,this.columnWidthDrag&&(this.columnWidthDrag.destroy(),this.columnWidthDrag=null),this.columnWidthTouch&&(this.columnWidthTouch.destroy(),this.columnWidthTouch=null),this.rowDrag&&(this.rowDrag.destroy(),this.rowDrag=null),this.rowTouch&&(this.rowTouch.destroy(),this.rowTouch=null),this.scrollTouch&&(this.scrollTouch.destroy(),this.scrollTouch=null),this.protectedItem=null}},G={exportData:function(t){const e=this.getData();return{columns:this.getTreeSnapshot(e.columns,t),rows:this.getTreeSnapshot(e.rows,t)}},isItemExportable:function(t){return!!t&&(!d.hasOwn(t,"exportable")||Boolean(t.exportable))},getTreeSnapshot:function(t,e){const i=(t,o)=>{d.isList(o)&&o.forEach((o=>{if(!this.isItemExportable(o))return;const n=this.getItemSnapshot(o,e),s=o.subs;Array.isArray(s)&&(n.subs=[],i(n.subs,s)),t.push(n)}))},o=[];return i(o,t),o},getItemSnapshot:function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const i={};return Object.keys(t).forEach((o=>{!0!==e[o]?!1!==e[o]&&"subs"!==o&&0!==o.indexOf("tg_")&&(i[o]=t[o]):i[o]=t[o]})),i}},j={flushRow:function(t){d.toList(t).forEach((t=>{this.deleteRowCache(t)}))},flushRowFrom:function(t){d.isNum(t)&&(0!==t?this.forEachBodyCache(((e,i,o)=>{e>=t&&this.deleteRowCache(e)})):this.flushBody())},flushBody:function(){this.forEachBodyCache(((t,e,i)=>{this.deleteRowCache(t)}))},flushSort:function(){this.frozenInfo.rows?this.flushRowFrom(this.frozenInfo.rows):this.flushBody()},flushColumn:function(t){const e=d.toList(t);this.forEachBodyCache(((t,i,o)=>{e.forEach((t=>{this.deleteCellCache(o,t)}))}))},flushColumnFrom:function(t){d.isNum(t)&&this.forEachBodyCache(((e,i,o)=>{o.forEach(((e,i)=>{i>=t&&this.deleteCellCache(o,i)}))}))},flushCell:function(t,e){const i=d.toList(t),o=d.toList(e);i.forEach((t=>{const e=this.getRowCache(t);if(!e)return;const i=e.cellNodes;o.forEach((t=>{this.deleteCellCache(i,t)}))}))},flushWithViewport:function(){const{rows:t,columns:e}=this.viewport;this.forEachBodyCache(((i,o,n)=>{t.includes(i)?n.forEach(((t,i)=>{e.includes(i)||this.deleteCellCache(n,i)})):this.deleteRowCache(i)}))}},U={"sort-h":'\n\n \n \n \n \n\n',"sort-v":'\n\n \n \n \n \n\n',checkbox:'\n\n \n \n \n\n',radio:'
    ',drag:'\n\n \n\n',tree:'\n\n \n \n\n'},X={icons:U,getIcon:function(t){let e=U[t];return e=String(e).trim(),e}},Y={header:function(t,e,i,o){return t},null:function(t,e,i,o){return e&&e.tg_group?t:null==t?"—":t},blank:function(t,e,i,o){return""},string:function(t,e,i,o){return t},number:function(t,e,i,o){return t},icon:function(t,e,i,o){return`${t}`},select:function(t,e,i,o){return this.isRowSelectable(e)?this.getSelectFormatterContent(e):""},rowDrag:function(t,e,i,o){return this.getRowDragFormatterContent(e)},rowNumber:function(t,e,i,o){return e.tg_row_number||""},tree:function(t,e,i,o){return this.getTreeFormatterContent(t,e)}},q={setFormatter:function(t,e){this.renderType="all";let i=t;if("string"==typeof t){if(this.formatters)return this.formatters[t]=e,this;i={},i[t]=e}return this.customFormatters=i,this},getFormatter:function(t){if(!t)return;const e=this.formatters[t];return"function"==typeof e?e.bind(this):void 0},getDefaultFormatter:function(t){return(Y[t]||Y.string).bind(this)},getSelectFormatterContent:function(t){let e="radio";this.options.selectMultiple&&(e="checkbox");const i=X.getIcon(e);return`
    ${i}
    `},getRowDragFormatterContent:function(t){if(t.tg_frozen)return"";return`
    ${X.getIcon("drag")}
    `},getTreeIndentWidth:function(t,i,o){if(!t)return 0;let n=5;return i||(n+=e.TREE_INDENT),n+=o*e.TREE_INDENT,n},getTreeFormatterContent:function(t,e){const i=this.rowsInfo.isTree,o=e.tg_group,n=this.isEmptyGroup(e);n&&(e.collapsed=!0);const s=e.collapsed,r=d.toNum(e.tg_level),l=this.getTreeIndentWidth(i,o,r),h=[];if(h.push(`
    `),o){const t={"tg-tree-icon":!0,"tg-tree-icon-collapsed":s,"tg-tree-icon-expanded":!s,"tg-tree-icon-empty":n},e=X.getIcon("tree"),i=`
    ${e}
    `;h.push(i)}return h.push(`
    ${t}
    `),h.push("
    "),h.join("")}},K={renderHeaderTables:function(){this.clearHeaderCache();const t=this.viewColumns,e=this.frozenInfo.columns;this.hasTreeColumn=!1,this.hasSortColumn=!1;let i=[],o=[];for(let n=0,s=t.length;n=e?o.push(s):i.push(s)}if(this.frozenInfo.right){const t=i;i=o,o=t}this.renderHeaderTable(i,this.$headerL),this.renderHeaderTable(o,this.$headerR)},renderHeaderTable:function(t,e){const i=document.createElement("div"),o=["tg-header-table"];this.hasSortColumn&&(o.push("tg-header-sortable"),o.push(`tg-header-sort-${this.options.sortIndicator}`)),i.className=d.classMap(o);const n=t.length;if(n){let e=t[n-1];e&&"tg-column-blank"===e.id&&(e=t[n-2]),t.forEach((t=>{this.renderHeaderItem(t,i,e)}))}e.append(i)},renderHeaderItem:function(t,e,i){const o=t.tg_view_index;if(this.getHeaderCache(o))return;const n=this.getHeaderItemClass(t,i),s=d.styleMap(t.headerStyleMap),r={column:o,class:n,data:t.id};s&&(r.style=s);const l=[this.createColumnHeader(t)];if(this.isColumnResizable(t)){const e=this.createColumnResizing(t);l.push(e)}const h=this.createElement("div",r,l);e.appendChild(h),this.setHeaderCache(o,h),this.setNodeDataCache(h,{rowItem:this.headerRowItem,column:o,columnItem:t,headerNode:h}),t.tg_parent&&this.renderHeaderItem(t.tg_parent,e)},createColumnHeader:function(t){const e={class:this.getHeaderClass(t),style:this.getHeaderStyle(t)},i=[this.createColumnName(t)];if(this.hasSortColumn&&!t.tg_group){const e=this.createColumnSort(t);i.push(e)}return this.createElement("div",e,i)},createColumnName:function(t){const e=["tg-column-name"];t.tg_group&&e.push("tg-header-group-name");const i={class:e.join(" ")};let o=t.name;const n=t.tg_headerFormatter;return"function"==typeof n&&(o=n.call(this,o,this.headerRowItem,t)),"tree"===t.formatter?o=this.createHeaderTreeName(o):t===this.selectColumn&&this.isSelectAllVisible()&&(o=this.createHeaderSelectName()),this.createElement("div",i,o)},createHeaderTreeName:function(t){this.hasTreeColumn=!0;const e=[];if(this.options.collapseAllVisible){const t=X.getIcon("tree"),i=this.createElement("div",{class:"tg-tree-icon tg-tree-icon-all"},t);e.push(i)}else{const t=this.createElement("div",{class:"tg-tree-icon"});e.push(t)}const i=this.createElement("div",{class:"tg-tree-name"},t);e.push(i);return this.createElement("div",{class:"tg-tree"},e)},createHeaderSelectName:function(){const t=X.getIcon("checkbox");return this.createElement("div",{class:"tg-select-icon-all tg-checkbox"},t)},createColumnSort:function(t){let e;return this.isColumnSortable(t)&&(e="h"===this.options.sortIndicator?this.createSortIndicatorH(t):this.createSortIndicatorV(t)),this.createElement("div",{class:"tg-column-sort"},e)},createSortIndicatorH:function(t){const e=X.getIcon("sort-h"),i=[this.createElement("div",{class:"tg-sort-indicator-line"}),this.createElement("div",{class:"tg-sort-indicator-icon"},e)];return this.createElement("div",{class:"tg-sort-indicator"},i)},createSortIndicatorV:function(t){const e=X.getIcon("sort-v"),i=[this.createElement("div",{class:"tg-sort-indicator-icon"},e)];return this.createElement("div",{class:"tg-sort-indicator"},i)},createColumnResizing:function(){return this.createElement("div",{class:"tg-column-resizing"})},getHeaderItemClass:function(t,e){const i=["tg-header-item"];return t.tg_group&&i.push("tg-header-group-item"),t===e&&i.push("tg-header-column-last"),i.push(`tg-c-${t.tg_view_index}`),i.push(`tg-h-${t.tg_layer}`),t.tg_combination&&i.push(`tg-h-${t.tg_combination}`),i.push(d.classMap(t.headerClassMap)),d.classMap(i)},getHeaderClass:function(t){const e=["tg-column-header"];return"tree"===t.formatter&&(e.push("tg-tree-header"),this.rowsInfo.isTree&&e.push("tg-tree-header-indent")),this.isColumnSortable(t)&&e.push(`tg-column-sortable tg-column-sort-${this.options.sortIndicator}`),t.align&&e.push(`tg-align-${t.align}`),e.join(" ")},getHeaderStyle:function(t){const e=[d.styleMap(t.headerStyleMap)],i=t.tg_width;return this.isInvisible(t)||i<=0?e.push("display:none;"):e.push(`width:${i}px;`),e.join("")}},J={renderHeader:function(){this.cssRulesInvalid=!0,this.$headerL.empty(),this.$headerR.empty(),this.resetCssDisplay(),this.renderHeaderTables(),this.renderHeaderSort(),this.headerCreated=!0,this.trigger(C.onHeaderUpdated,{node:this.$headerFrame.get(0)})},initHeaderLayerHeight:function(){this.updateScrollPaneHiddenState(),this.resetCssDisplay(),this.viewAllColumns.forEach((t=>{this.updateColumnHeaderHeight(t)})),this.resetCssDisplay("none"),this.updateHeaderLayerHeight()},updateHeaderLayerHeight:function(){const t={},e=this.columnsInfo.maxLevel;for(let i=0;i<=e;i++)t[i]=0;const i=[];this.viewAllColumns.forEach((function(e){if(e.tg_combination)i.push(e);else{const i=e.tg_height,o=e.tg_layer;t[o]=Math.max(t[o],i)}})),i.forEach((function(e){let i=e.tg_height;const o=e.tg_combination.split(""),n=o.pop();o.forEach((function(e){i-=t[e]||0})),t[n]=Math.max(t[n],i)}));const o=JSON.stringify(t);this.previousHeaderLayerHeight!==o&&(this.previousHeaderLayerHeight=o,this.headerLayerHeight=t,this.cssRulesInvalid=!0)}};var Q=i(915);const Z={create:function(t){this.id=d.uid(4,"tg-"),d.isObject(t)||(t={container:t}),this.constructorOptions=t,this.createCache(),this.createView(t.container)},createView:function(t){this.createHolder(t),this.$holder?(this.createGlobalStyle(),this.createContainer()):console.error("Grid requires a container")},createHolder:function(t){const e=w(t);if(!e.length)return;this.$holder=e,this.$holder.empty(),this.holder=this.$holder.get(0);const i=this.holder.getRootNode();this.shadowRoot=null,i&&i.host&&(this.shadowRoot=i)},createGlobalStyle:function(){const t=this.shadowRoot||document.head;if(t.querySelector(`style[context="${e.ID}"]`))return;const i=document.createElement("style");i.setAttribute("context",e.ID),i.innerHTML=Q.A.toString(),t.appendChild(i)},createContainer:function(){return this.$container=w('
    \r\n\r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n\r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n\r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n\r\n
    \r\n
    \r\n \r\n \r\n \r\n
    \r\n
    \r\n\r\n
    \r\n').appendTo(this.$holder),this.$container.attr("id",this.id),this.$container.addClass(`${e.NS} ${this.id}`),this.container=this.$container.get(0),d.setInstance(this.container,this),this.$headerFrame=this.$container.find(".tg-header-frame"),this.$paneHL=this.$headerFrame.find(".tg-pane-header-left"),this.$paneHR=this.$headerFrame.find(".tg-pane-header-right"),this.$headerL=this.$paneHL.find(".tg-header-left"),this.$headerR=this.$paneHR.find(".tg-header-right"),this.$header=w().add(this.$headerL).add(this.$headerR),this.$bodyFrame=this.$container.find(".tg-body-frame"),this.$paneTL=this.$bodyFrame.find(".tg-pane-top-left"),this.$paneTR=this.$bodyFrame.find(".tg-pane-top-right"),this.$paneBL=this.$bodyFrame.find(".tg-pane-bottom-left"),this.$paneBR=this.$bodyFrame.find(".tg-pane-bottom-right"),this.$bodyTL=this.$paneTL.find(".tg-body-top-left"),this.$bodyTR=this.$paneTR.find(".tg-body-top-right"),this.$bodyBL=this.$paneBL.find(".tg-body-bottom-left"),this.$bodyBR=this.$paneBR.find(".tg-body-bottom-right"),this.$body=w().add(this.$bodyTL).add(this.$bodyTR).add(this.$bodyBL).add(this.$bodyBR),this.$columnLineContainer=this.$container.find(".tg-column-line"),this.$columnLineItem=this.$columnLineContainer.find(".tg-column-line-item"),this.$columnLineItemL=this.$columnLineContainer.find(".tg-column-line-l"),this.$columnLineItemR=this.$columnLineContainer.find(".tg-column-line-r"),this}},tt={initColumnsHandler:function(){this.columns=this.data.columns,this.columns.forEach(((t,e)=>{t&&"object"==typeof t||(this.columns[e]={})}));const t=this.getPrivateColumns();this.columnsInfo=this.initTreeInfo(t,this.frozenInfo.column);const e=[],i=[],o=(t,n)=>{if(!d.isList(t))return;let s,r=0;t.forEach((t=>{if(!this.isInvisible(t))if(t.tg_group){if(this.isEmptyGroup(t))return;i.push(t),o(t.subs,t)}else t.tg_list_index=r,r+=1,t.tg_list_last=!1,s=t,e.push(t)})),s&&(s.tg_list_last=!0)};o(t),e.forEach((t=>{this.initColumnItemHandler(t)})),i.forEach((t=>{this.initColumnGroupHandler(t)}));const n=[].concat(e).concat(i);this.initViewList(n,((t,e)=>{})),this.viewColumns=e,this.viewGroupColumns=i,this.viewAllColumns=n,this.initHeaderHandler(t),this.initSortColumn()},getPrivateColumns:function(){const t=this.options;this.selectColumn=t.selectColumn,this.rowDragColumn=t.rowDragColumn,this.rowNumberColumn=t.rowNumberColumn,this.blankColumn=t.blankColumn;let e=[];const i=()=>{t.selectVisible&&e.push(this.selectColumn),t.rowDragVisible&&e.push(this.rowDragColumn),t.rowNumberVisible&&(this.rowNumberColumn.width=t.rowNumberWidth,e.push(this.rowNumberColumn))};if(this.frozenInfo.right){const t=this.frozenInfo.column;this.columns.forEach(((o,n)=>{e.push(o),n===t&&i()}))}else i(),e=e.concat(this.columns);return e.push(this.blankColumn),e},setColumns:function(t){this.data.columns=d.toList(t),this.rerender()},getColumns:function(){return this.columns},getViewColumns:function(t){return t?this.viewAllColumns:this.viewColumns},initColumnItemHandler:function(t){this.initColumnProps(t),this.initColumnFormatter(t),this.initColumnWidth(t)},initColumnGroupHandler:function(t){this.initColumnFormatterByName(t,"headerFormatter","header")},initColumnProps:function(t){const e=this.options.columnTypes;if(!d.hasOwn(t,"type")){const i=e[t.id];"string"==typeof i&&(t.type=i)}let i=this.options.columnProps;const o=e[t.type];o&&"object"==typeof o&&(i=d.merge(i,o));for(const e in i)d.hasOwn(t,e)||(t[e]=i[e])},initColumnFormatter:function(t){this.initColumnFormatterByName(t,"headerFormatter","header");let e=t.type;const i=t.formatter;"string"==typeof i&&(e=i),this.initColumnFormatterByName(t,"formatter",e)},initColumnFormatterByName:function(t,e,i){let o=t[e];"function"!=typeof o?(o=this.getFormatter(i),t[`tg_${e}`]=o||this.getFormatter("string")):t[`tg_${e}`]=o.bind(this)},initColumnWidth:function(t){if(t!==this.blankColumn)return d.isNum(t.width)&&t.width>=0?(t.tg_width=t.width,t.minWidth=Math.min(t.minWidth,t.tg_width),void(t.maxWidth=Math.max(t.maxWidth,t.tg_width))):void this.initColumnWidthByName(t);t.tg_width=0},initColumnWidthByName:function(t){const e=this.getComputedColumnWidth(t);d.isNum(e)&&(t.tg_width=e)},getComputedColumnWidth:function(t){const e=t.name||"",i=d.getCharLen(e);let o=Math.round(10*i);return o>103&&(o=Math.max(103,Math.round(10*i/2)),o>133&&(o=Math.max(133,Math.round(10*i/3)),o>163&&(o=Math.max(163,Math.round(10*i/4))))),d.clamp(o,t.minWidth,t.maxWidth)},initSortColumn:function(){this.sortColumn=null;const t=this.options,e=t.sortField;if(!e)return;const i=this.getColumnItemById(e);return i&&this.isColumnSortable(i)?(d.hasOwn(i,"sortAsc")||(i.sortAsc=t.sortAsc),this.sortColumn=i,this):void 0}},et={initHeaderHandler:function(t){this.initHeaderRowItem(),this.viewGroupColumns.reverse(),this.initGroupColumnsWidth(),this.initGroupColumnsLayer(t)},initHeaderRowItem:function(){this.headerRowItem={tg_index:-1,tg_view_index:-1},this.viewAllColumns.forEach((t=>{d.hasOwn(t,"id")&&(this.headerRowItem[t.id]=t.name)}))},initGroupColumnsWidth:function(){this.viewGroupColumns.forEach((t=>{let e=0;t.subs.forEach((t=>{this.isInvisible(t)||(e+=t.tg_width)})),t.tg_width=e}))},initGroupColumnsLayer:function(t){const e=this.columnsInfo.maxLevel;this.viewColumns.forEach((function(t){t.tg_layer=e,t.tg_parent&&(t.tg_parent.tg_layer=e-1)})),this.viewGroupColumns.forEach((function(t){const e=t.tg_layer,i=t.tg_parent;if(i){let t=e-1;d.isNum(i.tg_layer)&&(t=Math.min(t,i.tg_layer)),i.tg_layer=t}})),this.initColumnRowspanHandler(t,0)},initColumnRowspanHandler:function(t,e){t.forEach((t=>{const i=this.initColumnCombinationHandler(t,e);t.tg_group&&this.initColumnRowspanHandler(t.subs,e+i)}))},initColumnCombinationHandler:function(t,e){const i=[],o=t.tg_layer;for(;e<=o;)i.push(e),e+=1;i.reverse();const n=i.length;let s="";return n>1&&(s=i.join("")),t.tg_combination=s,n}},it={},ot={name:"",minWidth:81,maxWidth:300},nt=function(t){return null==t},st=function(t,e){const i=nt(t),o=nt(e);return i&&o?0:i?1:o?-1:void 0},rt=function(t,e){return t.tg_index>e.tg_index?1:-1},lt=function(t,e){return rt(t,e)},ht=function(t,e){if("string"==typeof t&&"string"==typeof e){const i=t.toUpperCase(),o=e.toUpperCase();if(i!==o)return i>o?-1:1}return t>e?-1:1},at=function(t,e,i,o){return t?-1:e?1:ht(i,o)},ct=function(t,e){const i="number"==typeof t,o="number"==typeof e;return i&&o?t>e?-1:1:at(i,o,t,e)},dt=function(t,e){const i=new Date(t),o=new Date(e),n=d.isDate(i),s=d.isDate(o);if(n&&s){const t=i.getTime(),e=o.getTime();if(t===e)return;return t>e?-1:1}return at(n,s,t,e)},ut=function(t,e){const i="boolean"==typeof t,o="boolean"==typeof e;return i&&o?t>e?-1:1:at(i,o,t,e)},gt=function(t,e,i,o){const n=t[i.sortField],s=e[i.sortField],r=st(n,s);if("number"==typeof r)return 0===r?lt(t,e):i.sortBlankFactor*r;if(n!==s&&"function"==typeof o){const t=o(n,s);if(d.isNum(t))return i.sortFactor*t}return lt(t,e)},ft={blankValue:st,equal:lt,index:rt,value:gt,diffType:at,string:function(t,e,i){return gt(t,e,i,ht)},stringValue:ht,number:function(t,e,i){return gt(t,e,i,ct)},numberValue:ct,date:function(t,e,i){return gt(t,e,i,dt)},dateValue:dt,boolean:function(t,e,i){return gt(t,e,i,ut)},booleanValue:ut};const pt={initOptionsHandler:function(){return this.options=this.generateOptions(),this.initOptionsFormatters(),this.initOptionsSort(),this.initOptionsFrozen(),this.initOptionsScrollbar(),this.initOptionsContainer(),this.initBindWindowResize(),this.initBindContainerResize(),this},generateOptions(){const t={className:e.NS,theme:e.ID,headerVisible:!0,rowHeight:32,rowFilter:null,rowFilteredSort:null,rowNotFound:"",rowMoveCrossLevel:!0,rowCacheLength:0,rowProps:it,columnTypes:{tree:{type:"tree",formatter:"tree",width:230,minWidth:120,maxWidth:810},number:{type:"number",align:"right"},date:{type:"date",align:"right"},name:"tree"},columnCacheLength:0,columnProps:ot,collapseAllOnInit:null,collapseAllVisible:!0,selectAllOnInit:null,selectVisible:!1,selectAllVisible:!0,selectMultiple:!0,selectColumn:{private:!0,id:"tg-column-select",name:"",formatter:"select",headerClassMap:"tg-header-select",classMap:"tg-cell-select",width:36,align:"center",resizable:!1,sortable:!1,exportable:!1},rowDragCrossLevel:!0,rowDragVisible:!1,rowDragColumn:{private:!0,id:"tg-column-row-drag",name:"",formatter:"rowDrag",headerClassMap:"tg-header-row-drag",classMap:"tg-cell-row-drag",align:"center",width:36,resizable:!1,sortable:!1,exportable:!1},rowNumberWidth:36,rowNumberFilter:null,rowNumberVisible:!1,rowNumberColumn:{private:!0,id:"tg-column-row-number",name:"",formatter:"rowNumber",headerClassMap:"tg-header-row-number",classMap:"tg-cell-row-number",align:"center",maxWidth:100,sortable:!1,exportable:!1},blankColumn:{private:!0,id:"tg-column-blank",name:"",formatter:"blank",headerClassMap:"tg-header-blank",classMap:"tg-cell-blank",width:0,minWidth:0,maxWidth:4096,resizable:!1,sortable:!1,exportable:!1},sortField:"",sortAsc:!0,sortBlankValueBottom:!0,sortComparers:ft,sortOnInit:!1,sortIndicator:"h",highlightKeywords:{textKey:"tg_text_",textGenerator:null,highlightKey:"tg_highlight_",highlightPre:"",highlightPost:""},frozenRow:-1,frozenRowMax:10,frozenRowHoverable:!1,frozenBottom:!1,frozenColumn:-1,frozenColumnMax:10,frozenRight:!1,scrollbarSize:12,scrollbarSizeH:null,scrollbarSizeV:null,scrollbarRound:!1,scrollbarFade:!1,scrollbarFadeTimeout:1e3,scrollbarType:"auto",scrollPaneMinWidth:30,scrollPaneGradient:30,autoHeight:!1,textSelectable:!1,bindWindowResize:!1,bindContainerResize:!1},i=this.generateThemeOptions();return d.merge(t,i,this.constructorOptions,this.customOptions,this.dataOptions)},generateThemeOptions(){const t=this.pickOptions("theme").pop();if(t)return this.getThemeOptions(t)},pickOptions(t){return[this.constructorOptions,this.customOptions,this.dataOptions].map((e=>e&&e[t])).filter((t=>t))},initOptionsFormatters(){let t;const e=this.pickOptions("formatters");e.length&&(t=d.merge.apply(null,e)),this.formatters=d.merge(Y,t,this.customFormatters),this.nullFormatter=this.getFormatter("null")},initOptionsSort(){"v"!==this.options.sortIndicator&&(this.options.sortIndicator="h")},initOptionsFrozen:function(){const t=this.options;this.frozenInfo={column:-1,row:-1,columns:0,rows:0,bottom:Boolean(t.frozenBottom),right:Boolean(t.frozenRight)};let e=d.toNum(t.frozenColumn,!0);e=d.clamp(e,-1,t.frozenColumnMax),e>-1&&!this.frozenInfo.right&&(t.selectVisible&&(e+=1),t.rowDragVisible&&(e+=1),t.rowNumberVisible&&(e+=1)),this.frozenInfo.column=e,e>-1?this.frozenInfo.columns=e+1:(this.frozenInfo.columns=0,this.frozenInfo.right=!1);let i=d.toNum(t.frozenRow,!0);i=d.clamp(i,-1,t.frozenRowMax),this.frozenInfo.row=i,i>-1?this.frozenInfo.rows=i+1:(this.frozenInfo.rows=0,this.frozenInfo.bottom=!1)},initOptionsScrollbar:function(){const t=this.options;("auto"===t.scrollbarType&&d.isTouchDevice()||["touch","mobile"].includes(t.scrollbarType))&&(t.scrollbarFade=!0,t.scrollbarSize=6,t.scrollbarRound=!0);const e=d.toNum(t.scrollbarSize);this.scrollbarSizeH=e,d.isNum(t.scrollbarSizeH)&&(this.scrollbarSizeH=t.scrollbarSizeH),this.scrollbarSizeV=e,d.isNum(t.scrollbarSizeV)&&(this.scrollbarSizeV=t.scrollbarSizeV)},initOptionsContainer:function(){this.$container.attr("id",this.id);const t=this.options;this.$container.removeClass();const i=[e.NS,this.id,`tg-${t.theme}`,t.className];t.textSelectable||i.push("tg-text-unselectable"),d.isTouchDevice()&&i.push("tg-touch-device"),this.$container.addClass(d.classMap(i))}},mt={initBindWindowResize:function(){this.unbindWindowResize(),this.options.bindWindowResize&&(this.windowResizeEvents={resize:{handler:t=>{this.resize()}}},d.bindEvents(this.windowResizeEvents,window))},unbindWindowResize:function(){d.unbindEvents(this.windowResizeEvents)},initBindContainerResize:function(){if(this.unbindContainerResize(),!this.options.bindContainerResize||!this.holder)return;if("undefined"==typeof ResizeObserver)return;this.resizeObserver=new ResizeObserver((t=>{var e;(e=this.holder,Boolean(e.offsetWidth||e.offsetHeight||e.getClientRects().length))&&this.resize()})),this.resizeObserver.observe(this.holder)},unbindContainerResize:function(){this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null)}},bt={initRowsHandler:function(){this.rows=this.data.rows,this.rowsInfo=this.initTreeInfo(this.rows,this.frozenInfo.row)},getRows:function(){return this.rows},getViewRows:function(){return this.viewRows},createViewRows:function(){this.initRowFilterHandler();const t=[],e=this.getRowNumberFilter();let i=1;const o=(t,o)=>{if(e.call(this,t,o))return t.tg_row_number=i,void(i+=1);t.tg_row_number=""},n=(e,i,s)=>{if(!d.isList(e))return;let r,l=0;e.forEach((e=>{if(this.isInvisible(e))return;e.tg_list_index=l,l+=1,e.tg_list_last=!1,r=e,this.gridRowItemHandler(e),o(e,l),s||t.push(e);const i=s||e.tg_group&&e.collapsed;n(e.subs,e,i)})),r&&(r.tg_list_last=!0)};n(this.rows);let s,r=0;return this.initViewList(t,((t,e)=>{t.tg_top=r,this.initRowHeight(t),r+=this.getRowHeight(t),t.tg_group_line=!1,t.collapsed&&(t.tg_group_line=!0),s&&(t.tg_group||t.tg_level{const i=this.getRowItem(t);if(!i)return;const s=o[e]||n;i.height=s,delete i.tg_height,this.initRowHeight(i),this.flushRowFrom(i.tg_view_index)})),this.render("rows"),this},initRowFilterHandler:function(){const t=this.options.rowFilter;if("function"!=typeof t)return;if(this.forEachRow(((e,i,o)=>{if(e.tg_invisible)return;const n=!t.call(this,e,i,o);if(e.tg_filtered=n,!n){let t=e;for(;t.tg_parent;)t.tg_parent.tg_filtered=!1,t=t.tg_parent}})),this.sortColumn)return;let e=this.options.rowFilteredSort;if("function"==typeof e&&(e=e.call(this)),!e)return;"string"==typeof e&&(e={sortField:e,sortAsc:this.options.sortAsc});const i=e.sortField||e.id;i&&this.sortRows(i,e)},highlightKeywordsFilter:function(t,e,i){const{textKey:o,textGenerator:n,highlightKey:s}=this.options.highlightKeywords;if(e.forEach((e=>{t[`${s}${e}`]=null})),!i)return!0;const r=`${i}`.trim().toLowerCase().split(/\s+/g).filter((t=>t));if(!r.length)return!0;let l=!1;const h=(e,i)=>(/<\/?[a-z][\s\S]*>/i.test(e)&&(e=((e,i)=>{const n=`${o}${i}`,s=t[n];if(s)return s;const r=document.createElement("div");r.innerHTML=e;const l=r.innerText;return t[n]=l,l})(e,i)),(t=>{const e=t.toLowerCase();let i=0;for(const t of r){const o=e.indexOf(t,i);if(-1===o)return;i=o+t.length}return!0})(e));let a=function(t,e){return t[e]};return"function"==typeof n&&(a=n),e.forEach((e=>{const i=a(t,e);if(null==i)return;const o=`${i}`.trim();if(!o)return;const n=h(o,e);n&&(t[`${s}${e}`]=n,l=!0,this.highlightKeywords=r)})),l},highlightKeywordsHandler:function(){const{highlightCells:t}=this.renderSettings;if(!t.length)return;const e=this.highlightKeywords;e&&d.nextTick((()=>{t.forEach((t=>{const i=document.createTreeWalker(t,NodeFilter.SHOW_TEXT),o=[];let n=i.nextNode();for(;n;)o.push(n),n=i.nextNode();o.length&&this.highlightTextNodes(o,e)}))}))},highlightTextNodes:function(t,e){const{highlightPre:i,highlightPost:o}=this.options.highlightKeywords;let n=0;const s=()=>(n>=e.length&&(n=0),e[n++]);let r=s();t.forEach((t=>{const e=t.textContent,n=e.toLowerCase(),l=[];let h=0;const a=e.length;let c=!1;for(;h{if(e.selected){if(t)return void(e.selected=!1);t=e}}))}const t=this.options.selectAllOnInit;!0!==t?!1===t&&this.updateAllRowsSelected(!1):this.updateAllRowsSelected(!0)},updateAllRowsSelected:function(t){this.forEachSelectableRow((e=>{e.selected=t}))},initCollapseAllOnInitHandler:function(){const t=this.options.collapseAllOnInit;!0!==t?!1===t&&this.updateAllRowsCollapsed(!1):this.updateAllRowsCollapsed(!0)},getToBeAddedItemList:function(t){const e=[];return d.toList(t).forEach((t=>{t&&"object"==typeof t?e.push(t):void 0!==t&&e.push({name:t})})),e},getToBeAddedParentSubs:function(t,e){return t?(t.subs||(t.subs=[]),t.subs):e},getToBeAddedPositionIndex:function(t,e){const i=e.length;return d.isNum(t)&&t>=0&&t<=i?Math.round(t):i},generateDataSnapshot:function(t){if(!t||"object"!=typeof t)return t;const e=this.cleanTreeList(t.rows),i=this.cleanTreeList(t.columns);return this.convertNumberType(e,i),t.rows=e,t.columns=i,t},cleanTreeList:function(t){if(!d.isList(t))return[];const e=(t,i)=>{i.forEach((i=>{if(!i||"object"!=typeof i)return void t.push({});const o=this.getItemSnapshot(i),n=i.subs;Array.isArray(n)&&(o.subs=[],e(o.subs,n)),t.push(o)}))},i=[];return e(i,t),i},convertNumberType:function(t,e){const i=[];d.forEachTree(e,(function(t){"number"===t.type&&t.id&&i.push(t.id)})),i.length&&d.forEachTree(t,(function(t){i.forEach((function(e){t[e]=d.convertNum(t[e])}))}))}},vt={setDefaultLoading:function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!t)return;const i=t.style;e.size&&(i.width=e.size,i.height=e.size),e.color&&(i.color=e.color),e.size||e.color||t.removeAttribute("style"),e.fast?t.classList.add("tg-loading-fast"):t.classList.remove("tg-loading-fast")},getDefaultLoading:function(t){return this.setDefaultLoading(this.$defaultLoading,t),this.$defaultLoading},getLoadingHolder:function(){return this.$container?this.$container.find(".tg-loading"):w()},setLoading:function(t){if(!this.$container)return this;this.$defaultLoading||(this.$defaultLoading=this.$container.find(".tg-loading-default").get(0));const e=this.getLoadingHolder().get(0);return"function"==typeof t&&(t=t.call(this,e)),d.isObject(t)&&(t=this.getDefaultLoading(t)),t||(t=this.getDefaultLoading()),this.renderNodeContent(e,t),this},showLoading:function(){return this.getLoadingHolder().show(),this},hideLoading:function(){return this.getLoadingHolder().hide(),this}},Ht={showMask:function(t){if(!this.hasMask||t){const e=this.$container.find(".tg-mask"),i=e.get(0);if(t&&i){const e=d.styleMap(t);e&&(i.style.cssText=e)}e.show(),this.hasMask=!0}return this},hideMask:function(){return this.hasMask&&(this.$container.find(".tg-mask").hide(),this.hasMask=!1),this}},yt={renderNodeContent:function(t,e){if(t){if(e&&e.nodeType)return this.emptyNode(t),void t.appendChild(e);if(Array.isArray(e))return this.emptyNode(t),void e.forEach((e=>{e&&e.nodeType&&t.appendChild(e)}));void 0===e&&(e=""),t.innerHTML=e}},emptyNode:function(t){if(t)for(;t.firstChild;)t.removeChild(t.firstChild)},removeNode:function(t){t&&t.parentNode&&t.parentNode.removeChild(t)},appendNode:function(t,e){t&&e&&t.appendChild(e)},createElement:function(t,e,i){const o=document.createElement(t);e&&Object.keys(e).forEach((function(t){const i=e[t];void 0!==i&&o.setAttribute(t,i)})),d.isArray(i)||(i=[i]);let n="";return i.forEach((function(t){t&&t.nodeType?o.appendChild(t):void 0!==t&&(n+=t)})),n&&(o.innerHTML=n),o},find:function(t,e){return w(e||this.$container).find(t)},getRowNodes:function(t){const e=this.getRowItem(t);if(e)return this.getRowNodesByIndex(e.tg_view_index)},getCellNode:function(t,e){const i=this.getRowItem(t);if(!i)return;const o=this.getColumnItem(e);return o?this.getCellNodeByIndex(i.tg_view_index,o.tg_view_index):void 0},getHeaderItemNode:function(t){const e=this.getColumnItem(t);if(e)return this.getHeaderCache(e.tg_view_index)},getColumnHeaderNode:function(t){const e=this.getHeaderItemNode(t);if(e)return e.querySelector(".tg-column-header")}},Ct={render:function(){this.asyncRender||(this.asyncRender=d.microtask(this.renderSync)),this.asyncRender.apply(this,arguments)},renderSync:function(){this.renderStartedTimestamp=Date.now();const t=this.generateRenderSettings.apply(this,arguments);return this.renderSettings=t,"all"===t.type?(this.flushBody(),this.initHandler(),this.renderHeader(),this.updateViewRowsAndSize(),this.renderBody(),this):"columns"===t.type?(this.flushBody(),this.initColumnsHandler(),this.renderHeader(),this.updateViewRowsAndSize(),this.renderBody(),this):"rows"===t.type?(this.updateViewRowsAndSize(),this.renderBody(),this):"resize"===t.type?(this.resizeHandler(),this.renderBody(),this):(this.renderBody(),this)},generateRenderSettings:function(t){const e={type:this.renderType,scrollLeft:null,scrollTop:null,scrollColumn:null,scrollRow:null,highlightCells:[]};return"string"==typeof t?e.type=t:t&&Object.assign(e,t),this.headerCreated||(e.type="all"),e},renderBody:function(){this.scrollOnInit(),this.scrollTopOffset=this.scrollPane.getScrollTopOffset();const t=this.getViewport();return this.viewport=t,this.flushWithViewport(),this.previousScrollTopOffset!==this.scrollTopOffset&&(this.previousScrollTopOffset=this.scrollTopOffset,this.updateRowCacheTopOffset()),this.renderRows(t.rows),this.renderCells(t.rows,t.columns),this.renderUpdatedTimestamp=Date.now(),this.renderDuration=this.renderUpdatedTimestamp-this.renderStartedTimestamp,this.trigger(C.onUpdated,t),this.firstUpdated||(this.firstUpdated=!0,this.trigger(C.onFirstUpdated,t)),this.layoutEventHandler(),this.resizeEventHandler(),this.highlightKeywordsHandler(),this.renderSettings=null,this.renderType=null,this},rerender:function(){return this.render("all"),this}},Rt={resize:function(){return this.asyncResize||(this.asyncResize=d.throttle(this.resizeSync,100)),this.asyncResize.apply(this,arguments),this},resizeSync:function(){return this.headerCreated?(this.resizeHolderHandler.apply(this,arguments),this.firstUpdated&&this.isHolderInvisible()||this.render("resize"),this):this},resizeHolderHandler(t,e){if(0!==arguments.length)return 1===arguments.length?t&&"object"==typeof t?void this.$holder.css(t):void this.$holder.css({width:t}):void this.$holder.css({width:t,height:e})},isHolderInvisible(){const t=this.$holder.width(),e=this.$holder.height();return!t||!e},resizeHandler:function(){this.containerWidth=this.$container.width(),this.containerHeight=this.$container.height(),this.headerWidth=this.containerWidth,this.bodyWidth=this.containerWidth,this.updateTotalColumnsWidth(),this.resizeHeaderHandler(),this.resizeBodyHandler()},layoutEventHandler:function(){const t=this.previousLayout||{},e={headerWidth:this.headerWidth,headerHeight:this.headerHeight,bodyWidth:this.bodyWidth,bodyHeight:this.bodyHeight};Object.values(e).join("")!==Object.values(t).join("")&&(this.previousLayout=e,this.trigger(C.onLayout,d.merge({previous:t},e)))},resizeEventHandler:function(){const t=this.previousSize||{},e={width:this.containerWidth,height:this.containerHeight};Object.values(e).join("")!==Object.values(t).join("")&&(this.previousSize=e,this.trigger(C.onResize,d.merge({previous:t},e)))},resizeHeaderHandler:function(){this.initHeaderLayerHeight();const t=this.options;t.autoHeight&&this.viewRows.length>5e3&&(t.autoHeight=!1),this.headerHeight=0,t.headerVisible&&(this.containerHeight>0||t.autoHeight)&&this.updateHeaderTableHeight(),this.$headerFrame.css({width:this.headerWidth,height:this.headerHeight})},updateHeaderTableHeight:function(){let t=0;Object.keys(this.headerLayerHeight).forEach((e=>{t+=this.headerLayerHeight[e]}));const e=this.$headerL.find(".tg-header-table"),i=this.$headerR.find(".tg-header-table");e.css({height:t}),i.css({height:t}),this.headerHeight=t},resizeBodyHandler:function(){this.updateScrollState(),this.bodyHeight=this.containerHeight-this.headerHeight,this.$bodyFrame.css({width:this.bodyWidth,height:this.bodyHeight}),this.updatePaneWidth(),this.updatePaneHeight(),this.updateCanvasWidth(),this.updateCanvasHeight(),this.updateScrollPane(),this.updateCssRules()},updatePaneWidth:function(){let t=this.bodyWidth,e=0;if(this.frozenInfo.columns){const i=this.getScrollbarWidth();this.frozenInfo.right?(e=this.columnsWidthR+i,t=this.bodyWidth-e):(t=this.columnsWidthL,e=this.bodyWidth-t),this.scrollPaneHidden&&(this.frozenInfo.right?(t<=0&&(t=0),e=Math.max(0,this.bodyWidth-t)):(e3&&void 0!==arguments[3])||arguments[3];const n=this.getToBeAddedItemList(t);if(!n.length)return!1;let s;if(null!=e&&(s=this.getRowItem(e),!s))return!1;const r=this.getToBeAddedParentSubs(s,this.rows),l=this.getToBeAddedPositionIndex(i,r),h=[l,0].concat(n);r.splice.apply(r,h),this.initRowsHandler(),s?(s.collapsed=!1,this.flushRowFrom(s.tg_view_index+l)):this.flushRowFrom(l),this.onNextUpdated((function(){this.trigger(C.onRowAdded,n)}));const a={type:"rows"};return o&&(a.scrollRow=n[n.length-1]),this.render(a),!0},deleteRow:function(t){const e=d.toList(t),i=[];if(e.forEach((t=>{const e=this.getRowItem(t);e&&i.push(e)})),!i.length)return!1;const o=this.removeRowsHandler(i);this.initRowsHandler();const n=this.getRemovedMinIndex(o);return this.flushRowFrom(n),this.onNextUpdated((function(){this.trigger(C.onRowRemoved,i)})),this.render("rows"),!0},getRemovedMinIndex:function(t){let e=0;const i=t[t.length-1];if(this.isInvisible(i))return e;e=i.tg_view_index,e>0&&(e-=1);let o=i.tg_parent;for(;o;)o.collapsed&&(e=o.tg_view_index),o=o.tg_parent;return e},removeRowsHandler:function(t){const e=[].concat(t);e.sort((function(t,e){return e.tg_index-t.tg_index}));const i=[];return e.forEach((t=>{this.getRowParentSubs(t).splice(t.tg_sub_index,1),i.push(t)})),i}},Tt={renderCollapseAllState:function(){this.hasTreeColumn&&(this.asyncRenderCollapseAllState||(this.asyncRenderCollapseAllState=d.microtask(this.renderCollapseAllStateSync)),this.asyncRenderCollapseAllState.apply(this,arguments))},renderCollapseAllStateSync:function(){const t=this.$header.find(".tg-tree-header");this.rowsInfo.isTree?t.addClass("tg-tree-header-indent"):t.removeClass("tg-tree-header-indent"),this.renderCollapseAllIcon()},checkCollapseAllState:function(t){if(t!==this.allRowsCollapsed){if(t){let t=0;const e=this.rows.length;for(;t{if(e.tg_group&&e.tg_subs_length&&e.collapsed)return t=!0,!1})),t)return}this.allRowsCollapsed=t,this.renderCollapseAllIcon()}},expandAllRows:function(){return this.renderAllRowsCollapsed(!1)},collapseAllRows:function(){return this.renderAllRowsCollapsed(!0)},toggleAllRows:function(){return this.allRowsCollapsed?this.expandAllRows():this.collapseAllRows()},renderAllRowsCollapsed:function(t){const e=this.updateAllRowsCollapsed(t);return e.length?(this.flushBody(),this.onNextUpdated((()=>{this.renderCollapseAllIcon(),t?this.trigger(C.onRowCollapsed,e):this.trigger(C.onRowExpanded,e)})),this.render("rows"),this):this},updateAllRowsCollapsed:function(t){this.allRowsCollapsed=t;const e=[];return this.forEachRow((i=>{i.subs&&i.tg_subs_length&&this.isCollapsedChanged(i,t)&&(i.collapsed=t,e.push(i))})),e},expandRow:function(t){const e=this.getRowItem(t);return e?this.isEmptyGroup(e)?(this.trigger(C.onRowSubsRequest,e),this):this.isCollapsedChanged(e,!1)?(e.collapsed=!1,this.flushRowFrom(e.tg_view_index),this.renderCollapseIcon(e),this.onNextUpdated((()=>{this.checkCollapseAllState(!1),this.trigger(C.onRowExpanded,e)})),this.render("rows"),this):this:this},collapseRow:function(t){const e=this.getRowItem(t);return e&&e.subs&&e.tg_subs_length&&this.isCollapsedChanged(e,!0)?(e.collapsed=!0,this.flushRowFrom(e.tg_view_index),this.renderCollapseIcon(e),this.onNextUpdated((()=>{this.checkCollapseAllState(!0),this.trigger(C.onRowCollapsed,e)})),this.render("rows"),this):this},toggleRow:function(t){const e=this.getRowItem(t);return e?(e.collapsed?this.expandRow(e):this.collapseRow(e),this):this},expandRowLevel:function(t){t=d.toNum(t,!0);const e=[],i=[];return this.forEachRow((o=>{o.subs&&o.tg_subs_length&&(o.tg_level<=t?this.isCollapsedChanged(o,!1)&&(o.collapsed=!1,i.push(o)):this.isCollapsedChanged(o,!0)&&(o.collapsed=!0,e.push(o)))})),e.length||i.length?(this.flushBody(),this.onNextUpdated((()=>{e.length&&this.trigger(C.onRowCollapsed,e),i.length&&this.trigger(C.onRowExpanded,i)})),this.render("rows"),this):this},renderCollapseAllIcon:function(){if(!this.options.collapseAllVisible||!this.hasTreeColumn)return;const t=this.$header.find(".tg-tree-icon-all");this.renderTreeIcon(t,this.allRowsCollapsed)},renderCollapseIcon:function(t){if(!this.headerCreated)return;const e=this.getRowNodesByIndex(t.tg_view_index);if(!e)return;const i=e.find(".tg-tree-icon");this.renderTreeIcon(i,t.collapsed)},renderTreeIcon:function(t,e){t&&(e?t.removeClass("tg-tree-icon-expanded").addClass("tg-tree-icon-collapsed"):t.removeClass("tg-tree-icon-collapsed").addClass("tg-tree-icon-expanded"))}},Lt={rowDragStartHandler:function(t,e){this.removeSortColumn();const i=e.rowItem;if(!i)return;const o=this.getRowNodesByIndex(i.tg_view_index);o&&(e.dragCloneNodes=this.getRowDragCloneNodes(o),e.dropPlaceholder=this.getRowDropPlaceholder(o),e.dragStartTop=this.getRowTop(i),e.dragRowHeight=this.getRowHeight(i),e.dragStartScrollTop=this.scrollTop,e.dragMaxScrollTop=this.scrollPane.getMaxScrollTop(),this.trigger(C.onRowDragged,{e:t,rowItem:i}),this.isDefaultPrevented(t)||("touch"===e.type&&d.preventDefault(e.e),this.setRowState(i,"dragging"),this.rowDropListHandler(e),this.updateDragCloneRowPosition(e)))},rowDragMoveHandler:function(t,e){"touch"===e.type&&d.preventDefault(e.e),this.updateDragCloneRowPosition(e),this.updateDragPlaceholderPosition(e),this.rowDragAutoScrollHandler(e)},rowDragEndHandler:function(t,e){"touch"===e.type&&(this.protectedItem=null,d.preventDefault(e.e)),this.autoScrollStop(),this.setRowState(e.rowItem,"dragging",!1),e.dragCloneNodes&&(e.dragCloneNodes.remove(),e.dragCloneNodes=null),e.dropPlaceholder&&(e.dropPlaceholder.remove(),e.dropPlaceholder=null),e.changed&&this.rowDropHandler(e)},updateDragCloneRowPosition:function(t){const e=this.scrollTop-t.dragStartScrollTop,i=t.dragStartTop+t.offsetY+e,o=i-this.scrollTopOffset;t.dragCloneNodes&&t.dragCloneNodes.css("top",o).show(),t.dragCurrentPosition=i+.5*t.dragRowHeight},getRowDragCloneNodes:function(t){const e=w();return t.each((function(t){const i=w(t),o=i.clone();o.appendTo(i.parent()),e.add(o)})),e.addClass("tg-clone").hide(),e},getRowDropPlaceholder:function(t){const e=w();return t.each((function(t){const i=w(t),o=w("
    ").addClass("tg-row-placeholder").hide(),n=i.parent();n.find(".tg-row-placeholder").remove(),o.appendTo(n),e.add(o)})),e},updateDragPlaceholderPosition:function(t){this.rowDropItemHandler(t);const e=t.dropItem;if(!e)return;let i=t.dropPosition-1;t.dropBottom?e.tg_view_last&&(i=t.dropPosition-2):e.tg_view_index-this.frozenInfo.rows==0&&(i=t.dropPosition);const o=i-this.scrollTopOffset;t.dropPlaceholder&&t.dropPlaceholder.css("top",o).show()},rowDragAutoScrollHandler:function(t){const e=t.dragCurrentPosition,i=this.scrollTop,o=this.bodyHeight-this.frozenRowsHeight,n=i+o,s=this.options.rowHeight,r=Math.min(3*s,.5*o);if(!(rn-r){const i=e-(n-r),o=this.getAutoScrollOffset(i,r);this.autoScrollStart(o,t)}else this.autoScrollStop()},getAutoScrollOffset:function(t,e){return Math.floor(t/e*20)},autoScrollStop:function(){this.autoScrollMotion&&(this.autoScrollMotion.destroy(),this.autoScrollMotion=null)},autoScrollStart:function(t,e){this.autoScrollStop();const i=e.dragMaxScrollTop;this.autoScrollMotion=new D,this.autoScrollMotion.bind(D.EVENT.MOTION_MOVE,(()=>{const o=d.clamp(this.scrollTop+t,0,i);o!==this.scrollTop?(this.setScrollTop(o),this.updateDragCloneRowPosition(e),this.updateDragPlaceholderPosition(e)):this.autoScrollStop()})),this.autoScrollMotion.once(D.EVENT.MOTION_END,(()=>{this.autoScrollStart(t,e)})),this.autoScrollMotion.start({duration:200})},rowDropListHandler:function(t){const e=this.getRowDropList(t);if(!d.isList(e))return;const i=t.rowItem,o=e.filter((t=>{if(t===i)return!1;if(t.tg_frozen)return!1;let e=t.tg_parent;for(;e;){if(e===i)return!1;e=e.tg_parent}return!0}));if(!d.isList(o))return;const n=[];o.forEach((t=>{const e=this.getRowTop(t),i=this.getRowHeight(t);n.push({rowItem:t,position:e}),n.push({rowItem:t,position:e+i-1,dropBottom:!0})})),t.dropList=n},getRowDropList:function(t){const e=this.options.rowDragCrossLevel;return e?"function"==typeof e?e.call(this,t):this.viewRows:this.getRowParentSubs(t.rowItem)},rowDropItemHandler:function(t){const e=t.dropList;if(!e)return;const i=t.dragCurrentPosition;let o=Number.MAX_VALUE;for(let n=0,s=e.length;no)break;o=r,t.dropItem=s.rowItem,t.dropBottom=s.dropBottom,t.dropPosition=s.position}},rowDragDropPositionHandler:function(t,e,i){const o=this.getRowParentSubs(t),n=t.tg_sub_index;let s,r;return this.isDropIntoGroupFirstChild(e,i)?(s=e.subs,r=0):(s=this.getRowParentSubs(e),r=e.tg_sub_index,o===s&&n{this.trigger(C.onRowDropped,n)})),this.render({type:"rows",scrollRow:i})}},It={getMoveFocusRow:function(t,e){let i=t[0];return e>0&&(i=t[t.length-1]),i},getMoveLengthInList:function(t,e){let i=0;return t.forEach((t=>{this.getRowParentSubs(t)===e&&(i+=1)})),i},getMoveInfo:function(t,e,i){const o=this.getRowParentSubs(i);let n=i.tg_sub_index+e;const s=i.tg_parent;if(s&&this.options.rowMoveCrossLevel){const e=0,i=s.tg_subs_length-1;if(ni){const e=n-i;return this.getMoveInfo(t,e,s)}}if(e>0){n-=this.getMoveLengthInList(t,o)-1}return n=d.clamp(n,0,o.length),{list:o,index:n}},moveRowsHandler:function(t,e){(t=this.removeRowsHandler(t)).reverse();const i=this.getMoveFocusRow(t,e),o=this.getMoveInfo(t,e,i),n=[o.index,0].concat(t);return o.list.splice.apply(o.list,n),this.initRowsHandler(),this.onNextUpdated((function(){this.scrollRowIntoView(i),this.trigger(C.onRowMoved,t)})),this.removeSortColumn(),this.update(),!0},moveRows:function(t,e){t=d.toList(t);const i=[];return t.forEach((t=>{const e=this.getRowItem(t);e&&i.push(e)})),!!i.length&&(!(i.length>=this.getRowsLength())&&(0!==(e=d.toNum(e,!0))&&this.moveRowsHandler(i,e)))},moveRowsUp:function(t){return this.moveRows(t,-1)},moveRowsDown:function(t){return this.moveRows(t,1)},moveRowsToTop:function(t){return this.moveRows(t,-this.getRowsLength(!0))},moveRowsToBottom:function(t){return this.moveRows(t,this.getRowsLength(!0))},moveSelectedRowsUp:function(){return this.moveRows(this.getSelectedRows(),-1)},moveSelectedRowsDown:function(){return this.moveRows(this.getSelectedRows(),1)},moveSelectedRowsToTop:function(){return this.moveRows(this.getSelectedRows(),-this.getRowsLength(!0))},moveSelectedRowsToBottom:function(){return this.moveRows(this.getSelectedRows(),this.getRowsLength(!0))}},Et={getSelectedRow:function(){let t=null;return this.forEachSelectableRow((function(e){if(e.selected)return t=e,!1})),t},getSelectedRows:function(){const t=[];return this.forEachSelectableRow((function(e){e.selected&&t.push(e)})),t.length>1&&t.sort((function(t,e){const i=t.tg_selected_index,o=e.tg_selected_index;return i>o?1:i0&&void 0!==arguments[0])||arguments[0];if(t=Boolean(t),this.globalSelectedIndex=0,t&&!this.options.selectMultiple)return this;const e=this.getAllSelectedChangedList(t);return e.length?(this.updateRowsSelectedState(e),this):this},setRowSelected:function(){return(this.options.selectMultiple?this.setRowMultipleSelected:this.setRowSingleSelected).apply(this,arguments)},setRowSingleSelected:function(t){const e=this.getRowItem(t);if(!e)return this;if(!this.isRowSelectable(e))return this;if(e.selected)return this;const i=[],o=this.getSelectedRow();return o&&o.selected&&i.push(o),e.selected||i.push(e),i.length?(this.updateRowsSelectedState(i),this):this},setRowMultipleSelected:function(t,e){if(0===arguments.length)return this;if(1===arguments.length&&!1===arguments[0])return this.selectAll(!1);const i=this.toRowItemList(t,(t=>this.isRowSelectable(t)));return i.length?!1===e?(this.setRowListUnselected(i),this):d.hasShiftKey(e)&&1===i.length?(this.setRowBetweenListSelected(i[0]),this):(this.updateRowsSelectedState(i),this):this},setRowListUnselected:function(t){const e=this.getSelectedChangedList(t,!1);e.length&&this.updateRowsSelectedState(e)},setRowBetweenListSelected:function(t){const e=this.previousSelectedRow;if(e&&e!==t){const i=this.getBetweenSelectedChangedList(e,t);if(!i.length)return;this.updateRowsSelectedState(i,!0)}else this.updateRowsSelectedState([t])},getAllSelectedChangedList:function(t){const e=[];return this.forEachSelectableRow((i=>{this.isSelectedChanged(i,t)&&e.push(i)})),e},getSelectedChangedList:function(t,e){const i=[];return t.forEach((t=>{this.isSelectedChanged(t,e)&&i.push(t)})),i},getBetweenSelectedChangedList:function(t,e){const i=t.tg_index,o=e.tg_index,n=[];if(i=o;)n.push(t),t--}return this.toRowItemList(n,(t=>this.isRowSelectable(t)&&!t.selected))},updateRowsSelectedState:function(t,e){let i;t.forEach((t=>{const e=!t.selected;t.selected=e,e&&(t.tg_selected_index=this.globalSelectedIndex++,i=t),this.renderRowSelectedState(t)})),e||(this.previousSelectedRow=i),this.renderSelectAllState(),this.onNextUpdated((()=>{this.trigger(C.onSelectChanged,t)})),this.render()},renderRowSelectedState:function(t){const e=t.tg_view_index;this.viewport.rows.includes(e)&&(this.renderRowState(t,"selected"),this.flushCell(e,this.selectColumn.tg_view_index))},renderSelectAllState:function(){this.isSelectAllVisible()&&(this.asyncRenderSelectAllState||(this.asyncRenderSelectAllState=d.microtask(this.renderSelectAllStateSync)),this.asyncRenderSelectAllState.apply(this,arguments))},renderSelectAllStateSync:function(){const t=this.getSelectAllState();if(t===this.previousSelectAllState)return;this.previousSelectAllState=t;const e=this.selectColumn,i=w(this.getColumnHeaderNode(e)).find(".tg-select-icon-all");i.length&&(i.removeClass("tg-selected tg-mixed"),t&&i.addClass(`tg-${t}`))},getSelectAllState:function(){let t=0;this.forEachSelectableRow((e=>{t+=1}));const e=this.getSelectedRows().length;let i="mixed";return 0===e?(i="",this.previousSelectedRow=null):e===t&&(i="selected"),i},isSelectAllVisible:function(){const t=this.options;return!!(t.selectVisible&&t.selectAllVisible&&t.selectMultiple)}},xt={setRowHover:function(t,e){const i=this.getRowItem(t);return i?(this.renderRowHover(i,e),this):this},renderRowHover:function(t,e){if(this.previousHover&&(this.previousHover.removeClass("tg-hover"),this.previousHover=null),!e)return this;if(t.tg_frozen&&!this.options.frozenRowHoverable)return this;const i=t.tg_view_index;return this.previousHover=this.$body.find(`.tg-row[row='${i}']`).addClass("tg-hover"),this},setRowState:function(t,e){let i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];const o=this.getRowItem(t);return o?(o.tg_state_names||(o.tg_state_names=new Set),o.tg_state_names.add(e),o[e]=i,this.renderRowState(o,e),this):this},renderRowState:function(t,e){const i=this.getRowNodesByIndex(t.tg_view_index);if(i){const o=`tg-${e}`;t[e]?i.addClass(o):i.removeClass(o)}}},zt={getRowItem:function(t){return d.isNum(t)?(t<0&&(t=this.rowsInfo.length+t),this.rowsInfo.indexCache[t]):t?d.isNum(t.tg_index)?t:this.getRowItemById(t.id||t):void 0},getRowItemById:function(t){return this.getRowItemBy("id",t)},getRowItemBy:function(t,e){if(void 0!==e)return this.rowsInfo.indexCache.find((i=>i[t]===e))},getRowsLength:function(t){return t?this.rowsInfo.length:this.viewRows.length},getViewRowItem:function(t){return this.viewRows[t]},getPreRenderRowInfo:function(t){const e={rows:[],rowNotFound:!1,benchmark:0};if(!t.length)return 0===this.getRowsLength()&&(e.rowNotFound=!0),e;const i=[],o=this.frozenInfo.row;return t.forEach((t=>{this.getRowCache(t)?t>o&&i.push(t):e.rows.push(t)})),i.length&&(e.benchmark=Math.min.apply(Math,i)),e.rows.sort((function(t,i){return t{this.renderRowNodes(t,e.benchmark)}))},createRowNode:function(t,e,i,o,n,s){const r=document.createElement("div");return r.setAttribute("row",t),r.className=i,o&&(r.style.cssText=o),r.style.top=`${n}px`,s!==this.options.rowHeight&&(r.style.height=`${s}px`,r.style.lineHeight=`${s}px`),this.setNodeDataCache(r,{row:t,rowItem:e,rowNode:r}),r},appendRowNode:function(t,e,i,o){ithis.frozenInfo.row))return e;e-=this.frozenRowsHeight}return e-=this.scrollTopOffset,e},getRowTop:function(t){let e=t.tg_top;return t.tg_frozen||(e-=this.frozenRowsHeight),e},getRowVPos:function(t){const e=this.frozenInfo.bottom,i=this.frozenInfo.row;let o="top";return this.frozenInfo.rows&&(t<=i?e&&(o="bottom"):e||(o="bottom")),o},getRowCanvas:function(t,e){return"top"===t?"left"===e?this.$bodyTL:this.$bodyTR:"left"===e?this.$bodyBL:this.$bodyBR}},Mt={CHANGE:"change"},Pt={h:{type:"h",className:"tg-scrollbar-h",offset:"left",size:"width",page:"pageX",axis:"x",offsetName:"offsetX"},v:{type:"v",className:"tg-scrollbar-v",offset:"top",size:"height",page:"pageY",axis:"y",offsetName:"offsetY"}};class _t extends k{static EVENT=Mt;static H="h";static V="v";type="h";settings={};size=0;viewSize=0;bodySize=0;trackSize=0;position=0;scale=0;thumbPosition=0;thumbScale=0;constructor(t,e){super(),this.settings=Pt[t]||Pt.h,this.type=this.settings.type,this.id=d.uid(4,`tg-scrollbar-${this.type}-`),this.$holder=w(e),this.$holder.find(`.${this.settings.className}`).remove(),this.options=this.generateOptions()}generateOptions(t){return d.merge({size:15,round:!1,blank:!1,motionDuration:200},t)}updateOptions(t){this.options=this.generateOptions(t);let e=this.options.size;d.isNum(e)||(e=d.toNum(e)),e=Math.round(e),e=Math.max(e,0),e=Math.min(e,30),this.size=e}create(){this.$container=w('
    ').appendTo(this.$holder),this.$container.attr("id",this.id),this.$container.addClass(d.classMap(["tg-scrollbar",this.settings.className,{"tg-scrollbar-round":this.options.round}])),this.$track=this.$container.find(".tg-scrollbar-track"),this.$thumb=this.$container.find(".tg-scrollbar-thumb"),this.thumbDrag=new O,this.thumbDrag.bind(O.EVENT.DRAG_START,((t,e)=>{this.thumbDragStart(e)})).bind(O.EVENT.DRAG_MOVE,((t,e)=>{this.thumbDragMove(e)})).bind(O.EVENT.DRAG_END,((t,e)=>{this.thumbDragEnd(e)}));const t=this.$container.get(0);return this.scrollEvents={mousedown:{handler:e=>{e.target.classList.contains("tg-scrollbar-thumb")?this.thumbMouseDownHandler(e):(this.trackEvents={mouseup:{handler:t=>{this.trackMouseupHandler(t)},options:{once:!0}}},d.bindEvents(this.trackEvents,t),this.trackMousedownHandler(e))},options:!0},selectstart:{handler:t=>{d.preventDefault(t)},options:!0}},d.bindEvents(this.scrollEvents,t),this}getBlank(){return this.options.blank}getSize(){return this.size}getViewSize(){return this.viewSize}getBodySize(){return this.bodySize}getTrackMouseDirection(){let t=1;return this.trackMousePosition0){const i=this.getMaxThumbPosition();t=Math.round(i*this.position/e),t=d.clamp(t,0,i)}return this.setThumbPosition(t),this}trackMousedownHandler(t){return this.motionStop(),this.trackMousePosition=this.getTrackMousePos(t),this.motionStart(),this}trackMouseupHandler(t){return d.unbindEvents(this.trackEvents),this.motionStop(),this.motionStarted||(this.trackMousePosition=this.getTrackMousePos(t),this.trackScrollHandler(),this.triggerEvent()),this}trackScrollHandler(){const t=Math.max(0,this.viewSize-20)*this.getTrackMouseDirection();return this.setOffset(t),this}motionStop(){return this.motion&&(this.motion.destroy(),this.motion=null),this}motionStart(){const t=this.position,e=Math.round(this.trackMousePosition/this.viewSize*this.getMaxPosition());return this.motionStarted=!1,this.motion=new D,this.motion.bind(D.EVENT.MOTION_START,((t,e)=>{this.motionStarted=!0})),this.motion.bind(D.EVENT.MOTION_MOVE,((t,e)=>{this.motionUpdateHandler(t,e)})),this.motion.start({duration:this.options.motionDuration,from:t,till:e}),this}motionUpdateHandler(t,e){e!==this.position&&(this.setPosition(e),this.triggerEvent())}thumbMouseDownHandler(t){this.$thumb.addClass("tg-scrollbar-thumb-hold"),this.thumbDrag.start(t,{target:this.$thumb})}thumbDragStart(t){this.motionStop(),t.thumbPositionStart=this.thumbPosition}thumbDragMove(t){let e=t.thumbPositionStart+t[this.settings.offsetName];const i=this.getMaxThumbPosition();e=d.clamp(e,0,i),this.setThumbPosition(e);let o=0;i>0&&(o=d.per(e/i)*this.getMaxPosition(),o=Math.round(o)),this.position=o,this.triggerEvent()}thumbDragEnd(t){this.$thumb&&this.$thumb.removeClass("tg-scrollbar-thumb-hold")}triggerEvent(){this.trigger(Mt.CHANGE,this.position)}getPosition(){return this.position}setPosition(t){t=d.toNum(t,!0);const e=this.getMaxPosition();t=d.clamp(t,0,e),this.position=t,this.updateThumbPosition()}getMaxPosition(){return this.bodySize-this.viewSize}updatePosition(){const t=this.getMaxPosition(),e=d.clamp(this.position,0,t);this.position=e}setOffset(t){t=d.toNum(t);const e=this.position+t;return this.setPosition(e),this}getScale(){return this.scale}setScale(t){return t=d.per(t),this.scale=t,this.scaleChangeHandler(),this}scaleChangeHandler(){let t=Math.round(this.viewSize*this.scale);if(t=Math.max(t,Math.round(1.5*this.options.size)),t=Math.min(t,this.viewSize-1),this.thumbSize=t,this.$thumb){const t={};"h"===this.type?(t.height=this.size,t.width=this.thumbSize):(t.width=this.size,t.height=this.thumbSize),this.$thumb.css(t)}}updateTrackSize(){const t={};return"h"===this.type?(t.width=this.trackSize,t.height=this.size):(t.height=this.trackSize,t.width=this.size),this.$container.css(t),this}updateThumbSize(){let t=0;return this.bodySize&&(t=this.trackSize/this.bodySize),this.setScale(t),this}parseSize(t){return t=d.toNum(t),t=Math.round(t),t=Math.max(t,0)}updateSize(t,e,i){t=this.parseSize(t),this.viewSize=t,e=this.parseSize(e),this.bodySize=e,i=d.isNum(i)?this.parseSize(i):t,this.trackSize=i,this.previousFadeIn=null}fade(t){return!(!this.$container||!this.size)&&(this.previousFadeIn!==t&&(this.previousFadeIn=t,t?this.$container.hasClass("tg-fade-out")&&this.$container.removeClass("tg-fade-out").addClass("tg-fade-in"):this.$container.removeClass("tg-fade-in").addClass("tg-fade-out"),!0))}show(){if(this.updatePosition(),!this.getBlank())return!this.$container&&this.size>0&&this.create(),this.$container?(this.updateTrackSize(),this.updateThumbSize(),this):this;this.remove()}hide(){return this.updatePosition(),this.remove(),this}remove(){if(this.motionStop(),d.unbindEvents(this.scrollEvents),d.unbindEvents(this.trackEvents),this.thumbDrag&&(this.thumbDrag.destroy(),this.thumbDrag=null),!this.$container)return this;this.$thumb=null,this.$track=null,this.$container.remove(),this.$container=null}destroy(){return this.remove(),this}}const Nt={CHANGE:"change"};class kt extends k{static EVENT=Nt;visible=!0;constructor(t,e){super(),this.id=d.uid(4,`tg-scroll-pane-${e}-`),this.gradientInfo=[],this.$container=w(t).attr("id",this.id),this.$container.addClass("tg-scroll-pane"),this.$scrollView=this.$container.find(".tg-scroll-view"),this.$scrollBody=this.$scrollView.find(".tg-scroll-body"),this.scrollbarH=new _t(_t.H,this.$container),this.scrollbarH.bind(_t.EVENT.CHANGE,((t,e)=>{this.scrollHChangeHandler()})),this.scrollbarV=new _t(_t.V,this.$container),this.scrollbarV.bind(_t.EVENT.CHANGE,((t,e)=>{this.scrollVChangeHandler()})),this.options=this.generateOptions()}generateOptions(t){return d.merge({scrollbarH:{},scrollbarV:{},scrollbarFade:!1,scrollSizeOnKeyPress:20,gradient:30},t)}show(){return this.$container.show(),this.visible=!0,this}hide(){return this.$container.hide(),this.visible=!1,this}width(){return this.scrollPaneW}height(){return this.scrollPaneH}render(t){return this.visible?(this.options=this.generateOptions(t),this.update(),this):this}update(){this.scrollPaneW=this.options.scrollPaneW,this.scrollPaneH=this.options.scrollPaneH,this.scrollBodyW=this.options.scrollBodyW,this.scrollBodyH=this.options.scrollBodyH,this.updateScrollbar()}setGroupH(t){this.groupH=d.toList(t)}setGroupV(t){this.groupV=d.toList(t)}updateGroupH(){if(!d.isList(this.groupH))return this;const t=this.scrollbarH.getPosition();return this.groupH.forEach((function(e){e&&e.updateScrollHFromGroup(t)})),this}updateGroupV(){if(!d.isList(this.groupV))return this;const t=this.scrollbarV.getPosition();return this.groupV.forEach((function(e){e&&e.updateScrollVFromGroup(t)})),this}updateGroupList(){this.updateGroupH(),this.updateGroupV()}updateScrollHFromGroup(t){this.scrollbarH.getPosition()!==t&&(this.scrollbarH.setPosition(t),this.updateScrollLeft(),this.triggerEvent())}updateScrollVFromGroup(t){this.scrollbarV.getPosition()!==t&&(this.scrollbarV.setPosition(t),this.updateScrollTop(),this.triggerEvent())}setPosition(t,e){return this.scrollbarH.setPosition(t),this.scrollbarV.setPosition(e),this.updateScrollLeft(),this.updateScrollTop(),this.updateGroupList(),this}updateScrollbar(){this.scrollbarH.updateOptions(this.options.scrollbarH),this.scrollbarV.updateOptions(this.options.scrollbarV),this.updateScrollState(),this.updateScrollView(),this.updateScrollTrack(),this.scrollbarH.updateSize(this.scrollViewW,this.scrollBodyW,this.scrollTrackW),this.scrollbarV.updateSize(this.scrollViewH,this.scrollBodyH,this.scrollTrackH),this.hasScrollH?(this.scrollbarH.show(),this.scrollbarH.setPosition(this.scrollbarH.getPosition())):this.scrollbarH.hide(),this.hasScrollV?(this.scrollbarV.show(),this.scrollbarV.setPosition(this.scrollbarV.getPosition())):this.scrollbarV.hide(),this.updateScrollLeft(),this.updateScrollTop(),this.updateGroupList()}updateScrollState(){const t=this.scrollbarH.getSize(),e=this.scrollbarV.getSize(),i=this.scrollbarH.getBlank(),o=this.scrollbarV.getBlank(),n=this.options.scrollbarFade;let s=!1,r=0;(function(){(this.scrollPaneWe&&t.push("left"),ie&&t.push("top"),o{const i=`tg-gradient-${e}`;t.includes(e)?this.$container.addClass(i):this.$container.removeClass(i)})))}getScrollLeft(){return this.scrollbarH.getPosition()}getScrollTop(){return this.scrollbarV.getPosition()}getMaxScrollLeft(){return this.scrollbarH.getMaxPosition()}getMaxScrollTop(){return this.scrollbarV.getMaxPosition()}getScrollTopOffset(){const t=this.getScrollTop();return t-t%1e4}triggerEvent(){this.trigger(Nt.CHANGE,{scrollLeft:this.getScrollLeft(),scrollTop:this.getScrollTop()})}scrollHChangeHandler(){this.updateScrollLeft(),this.updateGroupList(),this.triggerEvent()}scrollVChangeHandler(){this.updateScrollTop(),this.updateGroupList(),this.triggerEvent()}setOffsetH(t){const e=this.getScrollLeft();this.scrollbarH.setOffset(t);return this.getScrollLeft()!==e&&(this.updateScrollLeft(),this.updateGroupList(),this.triggerEvent(),!0)}setOffsetV(t){const e=this.getScrollTop();this.scrollbarV.setOffset(t);return this.getScrollTop()!==e&&(this.updateScrollTop(),this.updateGroupList(),this.triggerEvent(),!0)}mouseWheelHandler(t){const e=t.deltaX,i=t.deltaY,o=Math.abs(e);if(o>Math.abs(i)){if(this.hasScrollH)return this.setOffsetH(e)}else{if(this.hasScrollV)return this.setOffsetV(i);if(this.hasScrollH&&!o)return this.setOffsetH(i)}return!1}keyPageUpHandler(t){return this.setOffsetV(-this.scrollViewH)}keyPageDownHandler(t){return this.setOffsetV(this.scrollViewH)}keyEndHandler(t){return this.setOffsetV(this.scrollBodyH)}keyHomeHandler(t){return this.setOffsetV(-this.scrollBodyH)}keyLeftHandler(t){return this.setOffsetH(-this.options.scrollSizeOnKeyPress)}keyUpHandler(t){return this.setOffsetV(-this.options.scrollSizeOnKeyPress)}keyRightHandler(t){return this.setOffsetH(this.options.scrollSizeOnKeyPress)}keyDownHandler(t){return this.setOffsetV(this.options.scrollSizeOnKeyPress)}destroy(){return this.visible=!1,this.groupH=null,this.groupV=null,this.scrollbarV&&(this.scrollbarV.destroy(),this.scrollbarV=null),this.scrollbarH&&(this.scrollbarH.destroy(),this.scrollbarH=null),this.$container=null,this.$scrollView=null,this.$scrollBody=null,this}}const Vt={initScrollPane:function(){this.initFrozenStyle(),this.createScrollPane()},initFrozenStyle:function(){const t={HL:{container:this.$paneHL,cls:[]},HR:{container:this.$paneHR,cls:[]},TL:{container:this.$paneTL,cls:[]},TR:{container:this.$paneTR,cls:[]},BL:{container:this.$paneBL,cls:[]},BR:{container:this.$paneBR,cls:[]}},e="tg-frozen-h";this.frozenInfo.rows&&(this.frozenInfo.bottom?(t.BL.cls.push(e),t.BR.cls.push(e)):(t.TL.cls.push(e),t.TR.cls.push(e)));const i="tg-frozen-v",o="tg-frozen-line-v";this.frozenInfo.columns&&(this.frozenInfo.right?(t.HR.cls.push(i),t.TR.cls.push(i),t.BR.cls.push(i)):(t.HL.cls.push(i),t.TL.cls.push(i),t.BL.cls.push(i)),t.HL.cls.push(o),t.TL.cls.push(o),t.BL.cls.push(o));const n="tg-frozen",s=[n,e,i,o].join(" ");Object.keys(t).forEach((function(e){const i=t[e],o=i.container;o.removeClass(s);const r=i.cls;if(!r.length)return;const l=[n].concat(r).join(" ");o.addClass(l)}))},createScrollPane:function(){this.removeScrollPane(),this.scrollPaneMap={HL:new kt(this.$paneHL,"header-left"),HR:new kt(this.$paneHR,"header-right"),TL:new kt(this.$paneTL,"top-left"),TR:new kt(this.$paneTR,"top-right"),BL:new kt(this.$paneBL,"bottom-left"),BR:new kt(this.$paneBR,"bottom-right")},this.scrollPaneMap.BR.setGroupH([this.scrollPaneMap.HR,this.scrollPaneMap.TR]),this.scrollPaneMap.TR.setGroupH([this.scrollPaneMap.HR,this.scrollPaneMap.BR]),this.scrollPaneMap.BL.setGroupH([this.scrollPaneMap.HL,this.scrollPaneMap.TL]),this.scrollPaneMap.TL.setGroupH([this.scrollPaneMap.HL,this.scrollPaneMap.BL]),this.scrollPaneMap.BR.setGroupV(this.scrollPaneMap.BL),this.scrollPaneMap.BL.setGroupV(this.scrollPaneMap.BR),this.scrollPaneMap.TR.setGroupV(this.scrollPaneMap.TL),this.scrollPaneMap.TL.setGroupV(this.scrollPaneMap.TR),this.initActiveScrollPane(),this.initPaneVisibility()},initActiveScrollPane:function(){const t=this.getScrollPaneVP(),e=this.getScrollPaneHP(),i=`${t}${e}`;this.scrollPane=this.scrollPaneMap[i],this.scrollPane.bind(kt.EVENT.CHANGE,((t,e)=>{this.scrollPaneChangeHandler(t,e)}));let o={L:"L",R:"L"};this.frozenInfo.columns&&this.frozenInfo.right&&(o={L:"R",R:"L"});const n=`${t}${o[e]}`;this.scrollPaneFrozen=this.scrollPaneMap[n]},getScrollPaneVP:function(){return this.frozenInfo.rows&&!this.frozenInfo.bottom?"B":"T"},getScrollPaneHP:function(){return this.frozenInfo.columns&&!this.frozenInfo.right?"R":"L"},initPaneVisibility:function(){this.scrollPaneMap.HL.show(),this.scrollPaneMap.TL.show(),this.frozenInfo.columns?(this.scrollPaneMap.HR.show(),this.scrollPaneMap.TR.show(),this.frozenInfo.rows?(this.scrollPaneMap.BL.show(),this.scrollPaneMap.BR.show()):(this.scrollPaneMap.BL.hide(),this.scrollPaneMap.BR.hide())):(this.scrollPaneMap.HR.hide(),this.scrollPaneMap.TR.hide(),this.scrollPaneMap.BR.hide(),this.frozenInfo.rows?this.scrollPaneMap.BL.show():this.scrollPaneMap.BL.hide())},scrollPaneChangeHandler:function(t,e){this.hideColumnLine(),this.scrollLeft=e.scrollLeft,this.scrollTop=e.scrollTop,this.scrollRenderHandler()},scrollbarFadeInOutHandler:function(t,e){this.options.scrollbarFade&&(e?this.updateScrollPaneFade(!0):this.options.scrollbarFadeTimeout||this.updateScrollPaneFade(!1))},updateScrollPaneFade:function(t){if(!this.options.scrollbarFade)return;this.updateScrollPaneFadeSync(t);const e=this.options.scrollbarFadeTimeout;e&&(clearTimeout(this.timeout_fade),this.timeout_fade=setTimeout((()=>{this.updateScrollPaneFadeSync(!1)}),e))},updateScrollPaneFadeSync:function(t){if(this.previousScrollbarFadeIn===t)return;this.previousScrollbarFadeIn=t;const e=[];Object.keys(this.scrollPaneMap).forEach((t=>{const i=this.scrollPaneMap[t];i.hasScrollbar()&&e.push(i)})),e.length&&e.forEach((function(e){e.fade(t)}))},updateScrollPane:function(){const t=this.getScrollbarOptions();this.scrollPaneMap.HL.render(this.getScrollPaneOptions({scrollPaneW:this.paneWidthL,scrollPaneH:this.headerHeight,scrollBodyW:this.bodyWidthL,scrollBodyH:this.headerHeight,scrollbarV:t.HLV,scrollbarH:t.HLH})),this.scrollPaneMap.HR.render(this.getScrollPaneOptions({scrollPaneW:this.paneWidthR,scrollPaneH:this.headerHeight,scrollBodyW:this.bodyWidthR,scrollBodyH:this.headerHeight,scrollbarV:t.HRV,scrollbarH:t.HRH})),this.scrollPaneMap.TL.render(this.getScrollPaneOptions({scrollPaneW:this.paneWidthL,scrollPaneH:this.paneHeightT,scrollBodyW:this.bodyWidthL,scrollBodyH:this.bodyHeightT,scrollbarV:t.TLV,scrollbarH:t.TLH})),this.scrollPaneMap.TR.render(this.getScrollPaneOptions({scrollPaneW:this.paneWidthR,scrollPaneH:this.paneHeightT,scrollBodyW:this.bodyWidthR,scrollBodyH:this.bodyHeightT,scrollbarV:t.TRV,scrollbarH:t.TRH})),this.scrollPaneMap.BL.render(this.getScrollPaneOptions({scrollPaneW:this.paneWidthL,scrollPaneH:this.paneHeightB,scrollBodyW:this.bodyWidthL,scrollBodyH:this.bodyHeightB,scrollbarV:t.BLV,scrollbarH:t.BLH})),this.scrollPaneMap.BR.render(this.getScrollPaneOptions({scrollPaneW:this.paneWidthR,scrollPaneH:this.paneHeightB,scrollBodyW:this.bodyWidthR,scrollBodyH:this.bodyHeightB,scrollbarV:t.BRV,scrollbarH:t.BRH})),this.scrollLeft=this.getScrollLeft(),this.scrollTop=this.getScrollTop(),this.updateScrollPaneFade(Boolean(this.options.scrollbarFadeTimeout))},getScrollPaneOptions:function(t){const e=this.options;return t.scrollbarFade=e.scrollbarFade,t.gradient=d.clamp(d.toNum(e.scrollPaneGradient,!0),0,100),t},getScrollbarOptions:function(){const t=this.options.scrollbarRound,e={};return["HLH","HLV","HRH","HRV","TLH","TLV","TRH","TRV","BLH","BLV","BRH","BRV"].forEach((function(i){e[i]={size:0,round:t,blank:!1}})),this.scrollbarOptionsHandler(e),this.scrollbarFadeHandler(e),e},scrollbarOptionsHandler:function(t){const e=this.scrollbarSizeH,i=this.scrollbarSizeV;this.scrollbarHeaderHandler(t,e,i),this.frozenInfo.columns?this.frozenInfo.rows?this.scrollbarC1R1Handler(t,e,i):this.scrollbarC1R0Handler(t,e,i):this.frozenInfo.rows?this.scrollbarC0R1Handler(t,e,i):this.scrollbarC0R0Handler(t,e,i)},scrollbarFadeHandler:function(t){if(this.options.scrollbarFade)for(const e in t)if(d.hasOwn(t,e)){const i=t[e];i.size>0&&i.blank&&(i.blank=!1,i.size=0)}},scrollbarHeaderHandler:function(t,e,i){this.hasVScroll&&(this.frozenInfo.columns?(t.HRV.size=i,t.HRV.blank=1):(t.HLV.size=i,t.HLV.blank=1))},scrollbarC0R0Handler:function(t,e,i){t.TLH.size=e,t.TLV.size=i},scrollbarC0R1Handler:function(t,e,i){this.frozenInfo.bottom?this.scrollbarC0R1B1Handler(t,e,i):this.scrollbarC0R1B0Handler(t,e,i)},scrollbarC0R1B1Handler:function(t,e,i){t.BLH.size=e,t.TLV.size=i,this.hasVScroll&&(t.BLV.size=i,t.BLV.blank=1)},scrollbarC0R1B0Handler:function(t,e,i){t.BLH.size=e,t.BLV.size=i,this.hasVScroll&&(t.TLV.size=i,t.TLV.blank=1)},scrollbarC1R0Handler:function(t,e,i){this.frozenInfo.right?this.scrollbarC1R0R1Handler(t,e,i):this.scrollbarC1R0R0Handler(t,e,i)},scrollbarC1R0R1Handler:function(t,e,i){this.hasHScroll&&(t.TLH.size=e,this.scrollPaneHidden?(t.TRH.size=e,t.TLH.blank=!0):(t.TRH.size=e,t.TRH.blank=!0)),t.TRV.size=i},scrollbarC1R0R0Handler:function(t,e,i){this.hasHScroll&&(t.TRH.size=e,this.scrollPaneHidden?(t.TLH.size=e,t.TRH.blank=!0):(t.TLH.size=e,t.TLH.blank=!0)),t.TRV.size=i},scrollbarC1R1Handler:function(t,e,i){this.frozenInfo.right?this.frozenInfo.bottom?this.scrollbarC1R1R1B1Handler(t,e,i):this.scrollbarC1R1R1B0Handler(t,e,i):this.frozenInfo.bottom?this.scrollbarC1R1R0B1Handler(t,e,i):this.scrollbarC1R1R0B0Handler(t,e,i)},scrollbarC1R1R1B1Handler:function(t,e,i){this.hasHScroll&&(t.BLH.size=e,this.scrollPaneHidden&&(t.BRH.size=e,t.BLH.blank=!0)),t.TRV.size=i,this.hasVScroll&&(t.BRV.size=i,t.BRV.blank=1)},scrollbarC1R1R1B0Handler:function(t,e,i){this.hasHScroll&&(t.BLH.size=e,this.scrollPaneHidden?(t.BRH.size=e,t.BLH.blank=!0):(t.BRH.size=e,t.BRH.blank=!0)),t.BRV.size=i,this.hasVScroll&&(t.TRV.size=i,t.TRV.blank=1)},scrollbarC1R1R0B1Handler:function(t,e,i){this.hasHScroll&&(t.BRH.size=e,this.scrollPaneHidden&&(t.BLH.size=e,t.BRH.blank=!0)),t.TRV.size=i,this.hasVScroll&&(t.BRV.size=i,t.BRV.blank=1)},scrollbarC1R1R0B0Handler:function(t,e,i){this.hasHScroll&&(t.BRH.size=e,this.scrollPaneHidden?(t.BLH.size=e,t.BRH.blank=!0):(t.BLH.size=e,t.BLH.blank=!0)),t.BRV.size=i,this.hasVScroll&&(t.TRV.size=i,t.TRV.blank=1)},removeScrollPane:function(){clearTimeout(this.timeout_fade),this.previousScrollbarFadeIn=null,this.scrollPaneMap&&(Object.keys(this.scrollPaneMap).forEach((t=>{const e=this.scrollPaneMap[t];e&&e.destroy()})),this.scrollPaneMap=null,this.scrollPane=null,this.scrollPaneFrozen=null)}},Ot={updateScrollState:function(){this.updateGlobalScrollInfo(),this.updateHScrollState(),this.updateVScrollState(),this.updateBlankColumnWidth(),this.scrollStateChanged=!1,this.previousHasHScroll===this.hasHScroll&&this.previousHasVScroll===this.hasVScroll||(this.scrollStateChanged=!0,this.previousHasHScroll=this.hasHScroll,this.previousHasVScroll=this.hasVScroll,this.trigger(C.onScrollStateChanged,{hasHScroll:this.hasHScroll,hasVScroll:this.hasVScroll}))},updateGlobalScrollInfo:function(){this.totalRowsLength=this.getRowsLength(),this.totalRowsHeight=this.getRowsHeight(),this.frozenRowsHeight=this.getFrozenRowsHeight(),this.scrollRowsHeight=this.totalRowsHeight-this.frozenRowsHeight,this.totalRowsHeight=Math.max(this.totalRowsHeight,1),this.scrollRowsHeight=Math.max(this.scrollRowsHeight,1),this.flushRowFrom(this.totalRowsLength)},updateHScrollState:function(){if(this.hasHScroll=!0,this.updateScrollPaneHiddenState(),this.updateHScrollByScrollPaneHidden(),this.scrollPaneHidden)return;this.containerWidth-this.columnsWidth>=0&&(this.hasHScroll=!1)},getScrollPaneCurrentWidth:function(){return this.frozenInfo.right?this.bodyWidth-this.columnsWidthR:this.bodyWidth-this.columnsWidthL},updateHScrollByScrollPaneHidden:function(){if(this.scrollPaneHidden){this.hasHScroll=!1;this.getScrollPaneCurrentWidth()=this.totalRowsHeight&&(this.hasVScroll=!1)}},updateBlankColumnWidth:function(){let t=this.containerWidth-this.columnsWidth;!this.hasVScroll||this.hasHScroll||this.options.scrollbarFade||(t-=this.scrollbarSizeV),this.scrollPaneHidden&&(t=0),this.hasHScroll||(t>=0?(this.frozenInfo.columns?this.columnsWidthR+=t:this.columnsWidthL+=t,this.blankColumn.tg_width=t):this.hasHScroll=!0)}},$t={scrollToRow:function(t){const e=this.getRowItem(t);return this.scrollToItem(e,null),this},scrollToColumn:function(t){const e=this.getColumnItem(t);return this.scrollToItem(null,e),this},scrollToCell:function(t,e){const i=this.getRowItem(t),o=this.getColumnItem(e);return this.scrollToItem(i,o),this},scrollToFirstRow:function(){return this.setScrollTop(0),this},scrollToLastRow:function(){const t=this.getViewRows(),e=t[t.length-1],i=this.getScrollRowPosition(e);if(d.isNum(i))return this.setScrollTop(i),this},scrollToFirstColumn:function(){return this.setScrollLeft(0),this},scrollToLastColumn:function(t){const e=this.getViewColumns();let i=e[e.length-2];t&&(i=e[e.length-1]);const o=this.getScrollColumnPosition(i);if(d.isNum(o))return this.setScrollLeft(o),this},scrollRowIntoView:function(t){const e=this.getRowItem(t);return this.scrollItemIntoView(e,null),this},scrollColumnIntoView:function(t){const e=this.getColumnItem(t);return this.scrollItemIntoView(null,e),this},scrollCellIntoView:function(t,e){const i=this.getRowItem(t),o=this.getColumnItem(e);return this.scrollItemIntoView(i,o),this},setScroll:function(t,e){return t===this.scrollLeft&&e===this.scrollTop||(this.scrollLeft=t,this.scrollTop=e,this.scrollHandler()),this},setScrollLeft:function(t){return t===this.scrollLeft||(this.scrollLeft=t,this.scrollHandler()),this},setScrollTop:function(t){return t===this.scrollTop||(this.scrollTop=t,this.scrollHandler()),this},getScrollRowPosition:function(t){if(!t)return;let e=t.tg_view_index;return e-=this.frozenInfo.rows,e>=0?this.getRowTop(t):void 0},getScrollColumnPosition:function(t){if(!t)return;let e=t.tg_left;return this.frozenInfo.columns&&(e-=this.bodyWidthL),e>=0?e:void 0},scrollToItem:function(t,e){return this.scrollToChanged=!1,this.scrollToRowHandler(t),this.scrollToColumnHandler(e),this.scrollToChanged?(this.scrollHandler(),this):this},scrollToRowHandler:function(t){if(!t)return;const e=this.getScrollRowPosition(t);d.isNum(e)&&e!==this.scrollTop&&(this.scrollTop=e,this.scrollToChanged=!0)},scrollToColumnHandler:function(t){if(!t)return;const e=this.getScrollColumnPosition(t);d.isNum(e)&&e!==this.scrollLeft&&(this.scrollLeft=e,this.scrollToChanged=!0)},scrollItemIntoView:function(t,e){return this.scrollIntoViewChanged=!1,this.scrollRowIntoViewHandler(t),this.scrollColumnIntoViewHandler(e),this.scrollIntoViewChanged?(this.scrollHandler(),this):this},scrollRowIntoViewHandler:function(t){if(!t)return;const e=this.getScrollRowPosition(t);if(!d.isNum(e))return;if(ethis.scrollTop+o){const t=e-(o-i);this.scrollTop=t,this.scrollIntoViewChanged=!0}},scrollColumnIntoViewHandler:function(t){if(!t)return;const e=this.getScrollColumnPosition(t);if(!d.isNum(e))return;if(ethis.scrollLeft+o){const t=e-(o-i);this.scrollLeft=t,this.scrollIntoViewChanged=!0}},scrollOnInit:function(){const{scrollLeft:t,scrollTop:e,scrollColumn:i,scrollRow:o}=this.renderSettings;this.scrollIntoViewChanged=!1,Number.isInteger(t)&&t!==this.scrollLeft&&(this.scrollLeft=t,this.scrollIntoViewChanged=!0),Number.isInteger(e)&&e!==this.scrollTop&&(this.scrollTop=e,this.scrollIntoViewChanged=!0),i&&this.scrollColumnIntoViewHandler(i),o&&this.scrollRowIntoViewHandler(o),this.scrollIntoViewChanged&&this.scrollPane.setPosition(this.scrollLeft,this.scrollTop)},scrollHandler:function(){this.scrollPane.setPosition(this.scrollLeft,this.scrollTop),this.scrollRenderHandler()},scrollRenderHandler:function(){this.previousScrollLeft===this.scrollLeft&&this.previousScrollTop===this.scrollTop||(this.previousScrollLeft=this.scrollLeft,this.previousScrollTop=this.scrollTop,this.onNextUpdated((()=>{this.updateScrollPaneFade(!0),this.trigger(C.onScroll,{scrollLeft:this.scrollLeft,scrollTop:this.scrollTop})})),this.render())},scrollTouchStartHandler:function(t,e){this.hideColumnLine(),this.scrollTouchLeft=this.getScrollLeft(),this.scrollTouchTop=this.getScrollTop(),this.scrollMaxTouchLeft=this.getMaxScrollLeft(),this.scrollMaxTouchTop=this.getMaxScrollTop()},getTouchOrientation:function(t){return t.orientation?t.orientation:[e.LEFT,e.RIGHT].includes(t.direction)?(t.orientation||(t.orientation="Y"),t.orientation):[e.UP,e.DOWN].includes(t.direction)?(t.orientation||(t.orientation="X"),t.orientation):void 0},scrollTouchMoveHandler:function(t,e){if(e.touchLength>1)return;let i=e.offsetX,o=e.offsetY;const n=this.getTouchOrientation(e);"X"===n?i=0:"Y"===n&&(o=0);let s=this.scrollTouchLeft-i,r=this.scrollTouchTop-o;s=d.clamp(s,0,this.scrollMaxTouchLeft),r=d.clamp(r,0,this.scrollMaxTouchTop);let l=!1;this.scrollPaneHidden&&(l=this.scrollPaneFrozen.setOffsetH(-e.moveX),s=0);const h=this.getScrollLeft(),a=this.getScrollTop();(s!==h||r!==a||l)&&(d.preventDefault(e.e),this.setScroll(s,r))},scrollTouchEndHandler:function(){this.protectedItem=null},scrollTouchInertiaHandler:function(t,e){const i=this.getScrollLeft(),o=this.getScrollTop(),n=i-e.touchInertiaX,s=o-e.touchInertiaY;this.setScroll(n,s)},getScrollViewWidth:function(){let t=this.getScrollPaneWidth();return this.frozenInfo.right||(t-=this.getScrollbarWidth()),t},getScrollViewHeight:function(){let t=this.getScrollPaneHeight();return this.frozenInfo.bottom||(t-=this.getScrollbarHeight()),t},getScrollPaneWidth:function(){return this.scrollPane.width()},getScrollPaneHeight:function(){return this.scrollPane.height()},getScrollbarWidth:function(){return this.hasVScroll&&!this.options.scrollbarFade?this.scrollbarSizeV:0},getScrollbarHeight:function(){return this.hasHScroll&&!this.options.scrollbarFade?this.scrollbarSizeH:0},getScrollLeft:function(){return this.scrollPane.getScrollLeft()},getScrollTop:function(){return this.scrollPane.getScrollTop()},getMaxScrollLeft:function(){return this.scrollPane.getMaxScrollLeft()},getMaxScrollTop:function(){return this.scrollPane.getMaxScrollTop()}};class Bt{constructor(t){this.options=this.generateOptions(t)}generateOptions(t){return d.merge({ignore:null,sortField:"",sortFactor:1,sortBlankFactor:1,sortComparer:null},t)}sortList(t){if(!d.isList(t)||1===t.length)return!1;this.ignoreExcludeHandler(t);const e=this.comparerHandler(t);return this.ignoreIncludeHandler(t),e}getDefaultComparer(t){return(ft[t]||ft.string).bind(this)}comparerHandler(t){const e=this.options,i=e.sortField,o=e.sortFactor,n=e.sortBlankFactor,s=e.sortComparer;return"function"==typeof s&&(t.sort(((t,e)=>s.call(this,t,e,{sortField:i,sortFactor:o,sortBlankFactor:n}))),!0)}ignoreExcludeHandler(t){const e=this.options.ignore;this.ignoreListTop=[],this.ignoreListBottom=[];const i=[];for(let o=0,n=t.length;o{t.unshift(e.item)})),this.ignoreListBottom.forEach((e=>{t.push(e.item)}))}}const Dt={removeSortColumn:function(){return this.sortColumn=null,this.$header&&this.$header.find(".tg-column-sorted").removeClass("tg-column-sorted"),this},setSortColumn:function(t){if(!(t=this.getColumnItem(t)))return;if(!this.isColumnSortable(t))return;t===this.sortColumn?t.sortAsc=!t.sortAsc:d.hasOwn(t,"sortAsc")||(t.sortAsc=this.options.sortAsc),this.sortColumn=t;if(this.getRowsLength()-this.frozenInfo.rows<2)return;if(!this.headerCreated)return;this.updateRowsSort()&&(this.renderHeaderSort(),this.flushSort(),this.render("rows"))},renderHeaderSort:function(){const t=this.sortColumn;if(!t)return this;if(!this.isColumnSortable(t))return this;this.$header.find(".tg-column-sorted").removeClass("tg-column-sorted");const e=t.tg_view_index,i=this.$header.find(`.tg-header-item[column='${e}']`).find(".tg-column-header").addClass("tg-column-sorted");return t.sortAsc?i.removeClass("tg-sort-desc").addClass("tg-sort-asc"):i.removeClass("tg-sort-asc").addClass("tg-sort-desc"),this},getSortComparer:function(t){const e=t.comparer;if("function"==typeof e)return e;const i=this.options.sortComparers,o=i[e||t.type];return"function"==typeof o?o:i.string},updateRowsSort:function(){const t=this.sortColumn;if(!t)return!1;const e=t.id;return!!e&&this.sortRows(e,t)},sortRows:function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const i=e.sortAsc?-1:1,o=this.options.sortBlankValueBottom?1:i,n=this.getSortComparer(e);let s=!1;const r=new Bt({ignore:function(t){return t.tg_frozen?{item:t,top:!0}:t.sortFixed?{item:t,top:"top"===t.sortFixed}:void 0},sortField:t,sortFactor:i,sortBlankFactor:o,sortComparer:n}),l=function(t){r.sortList(t)&&(s=!0),t.forEach((function(t,e){t.tg_sub_index=e,t.subs&&l(t.subs)}))};return l(this.rows),s&&this.initRowsHandler(),s}},Wt={default:{},lightblue:{rowHeight:35,scrollbarSize:10,scrollbarRound:!0},dark:{}},At={getAllThemes:function(){return Object.keys(Wt)},getThemeOptions:function(t){return Wt[t]}},Ft={update:function(){return this.flushBody(),this.render("rows"),this},updateRow:function(t,e){const i=this.getRowItem(t);if(!i)return this;if(e&&"object"==typeof e){const t=this.getItemSnapshot(e);Object.keys(t).forEach((function(e){i[e]=t[e]}))}return this.flushRow(i.tg_view_index),this.render("rows"),this},updateCell:function(t,e,i){const o=this.getRowItem(t);if(!o)return this;const n=this.getColumnItem(e);return n?(arguments.length>2&&(o[n.id]=i),this.flushCell(o.tg_view_index,n.tg_view_index),this.render("rows"),this):this},onNextUpdated:function(t){return"function"!=typeof t||this.once(C.onUpdated,t),this}},Gt={getViewport:function(){this.scrollLeft=this.getScrollLeft(),this.scrollTop=this.getScrollTop();return{rows:this.getViewportRows(),columns:this.getViewportColumns()}},getViewportRows:function(){const t=[],e=this.viewRows,i=e.length;if(!i)return t;let o=this.options.rowCacheLength;o=d.clamp(d.toNum(o,!0),0,i);const n=this.frozenInfo.rows;if(n){let e=0;for(;e1;){const n=Math.floor(.5*(e+i)),s=t[n],r=this.getRowTop(s),l=this.getRowHeight(s);if(or+l))return n;e=n}}const n=t[i];return o=e)return[];const i=[],o=this.frozenInfo.columns,n=this.viewColumns;for(let s=o,r=n.length;s0;){const n=t[0]-1;n>o&&t.unshift(n);const s=t[t.length-1]+1;si)&&!(n0&&(e.rows.length=o),i=t.options}return this.data=e,this.dataOptions=i,this}setDataSnapshot(t){return this.setData(this.generateDataSnapshot(t)),this}getData(){return this.data}toString(){return"[object Grid]"}}var Ut;Ut=jt.prototype,[v,R,S,T,L,I,E,x,z,F,G,j,q,K,J,Z,tt,et,pt,mt,bt,wt,vt,Ht,{keyTabHandler:function(t){},keyEnterHandler:function(t){},keyEscHandler:function(t){},keyPageUpHandler:function(t){return this.scrollPane.keyPageUpHandler(t)},keyPageDownHandler:function(t){return this.scrollPane.keyPageDownHandler(t)},keyEndHandler:function(t){return this.scrollPane.keyEndHandler(t)},keyHomeHandler:function(t){return this.scrollPane.keyHomeHandler(t)},keyLeftHandler:function(t){return this.scrollPaneHidden?this.scrollPaneFrozen.keyLeftHandler(t):this.scrollPane.keyLeftHandler(t)},keyUpHandler:function(t){return this.scrollPane.keyUpHandler(t)},keyRightHandler:function(t){return this.scrollPaneHidden?this.scrollPaneFrozen.keyRightHandler(t):this.scrollPane.keyRightHandler(t)},keyDownHandler:function(t){return this.scrollPane.keyDownHandler(t)}},yt,Ct,Rt,St,Tt,{showRow:function(t){return this.updateRowsInvisible(this.toRowItemList(t),!1)},hideRow:function(t){return this.updateRowsInvisible(this.toRowItemList(t),!0)},updateRowsInvisible:function(t,e){if(!t.length)return!1;const i=[];return t.forEach((t=>{t.invisible!==e&&(t.invisible=e,t.tg_invisible=e,i.push(t))})),!!i.length&&(this.update(),!0)}},Lt,It,Et,xt,zt,Vt,Ot,$t,Dt,At,Ft,Gt].forEach((t=>{for(const e in t){if(d.hasOwn(Ut,e))throw new Error(`ERROR: extends with an existing key: "${e}"`);Ut[e]=t[e]}}));const Xt=jt,Yt=e.VERSION,qt=e.TIMESTAMP,Kt={VERSION:Yt,TIMESTAMP:qt,Grid:Xt,$:w,CONST:e,EventBase:k,Icon:X,Motion:D,ScrollPane:kt,Util:d}})();var n=o.$,s=o.MP,r=o._d,l=o.xA,h=o.In,a=o.T8,c=o.Gr,d=o.ht,u=o.J0,g=o.xv,f=o.Ay;export{n as $,s as CONST,r as EventBase,l as Grid,h as Icon,a as Motion,c as ScrollPane,d as TIMESTAMP,u as Util,g as VERSION,f as default}; \ No newline at end of file diff --git a/misc/custom-nodes.jpg b/misc/custom-nodes.jpg index 10482f1b..74c2a8bf 100644 Binary files a/misc/custom-nodes.jpg and b/misc/custom-nodes.jpg differ diff --git a/misc/main.png b/misc/main.png deleted file mode 100644 index 910da417..00000000 Binary files a/misc/main.png and /dev/null differ diff --git a/misc/menu.jpg b/misc/menu.jpg index bf98d421..c83540a9 100644 Binary files a/misc/menu.jpg and b/misc/menu.jpg differ diff --git a/misc/missing-list.jpg b/misc/missing-list.jpg new file mode 100644 index 00000000..ead97637 Binary files /dev/null and b/misc/missing-list.jpg differ diff --git a/misc/missing-list.png b/misc/missing-list.png deleted file mode 100644 index f1cc4fd2..00000000 Binary files a/misc/missing-list.png and /dev/null differ diff --git a/misc/missing-menu.jpg b/misc/missing-menu.jpg new file mode 100644 index 00000000..455ea6fc Binary files /dev/null and b/misc/missing-menu.jpg differ diff --git a/misc/missing-menu.png b/misc/missing-menu.png deleted file mode 100644 index 5e74744b..00000000 Binary files a/misc/missing-menu.png and /dev/null differ diff --git a/misc/share-setting.jpg b/misc/share-setting.jpg index 0ceacf2c..631794a3 100644 Binary files a/misc/share-setting.jpg and b/misc/share-setting.jpg differ diff --git a/node_db/dev/custom-node-list.json b/node_db/dev/custom-node-list.json index 121130a3..a5a4c212 100644 --- a/node_db/dev/custom-node-list.json +++ b/node_db/dev/custom-node-list.json @@ -11,6 +11,60 @@ + { + "author": "jtydhr88", + "title": "ComfyUI-Unique3D", + "id": "unique3d", + "reference": "https://github.com/jtydhr88/ComfyUI-Unique3D", + "files": [ + "https://github.com/jtydhr88/ComfyUI-Unique3D" + ], + "install_type": "git-clone", + "description": "ComfyUI Unique3D is custom nodes that running [a/AiuniAI/Unique3D](https://github.com/AiuniAI/Unique3D) into ComfyUI." + }, + { + "author": "kycg", + "title": "comfyui-Kwtoolset", + "id": "kwtoolset", + "reference": "https://github.com/kycg/comfyui-Kwtoolset", + "files": [ + "https://github.com/kycg/comfyui-Kwtoolset" + ], + "install_type": "git-clone", + "description": "Nodes:KwtoolsetLoraLoaderwithpreview, KwtoolsetCheckpointLoaderwithpreview, KwtoolsetLoadCheckpointsBatch, KwtoolsetGrowMaskPlus, KwtoolsetGetHipMask, KwtoolsetGetHipMasktest, KwtoolsetGetImageSize, KWPositiveString, KWNagetiveString, KWanywhereString, KwtoolsetChangeOpenpose, ..." + }, + { + "author": "mashb1t", + "title": "ComfyUI mashb1t nodes", + "id": "mashb1t", + "reference": "https://github.com/mashb1t/comfyui-nodes-mashb1t", + "files": [ + "https://github.com/mashb1t/comfyui-nodes-mashb1t" + ], + "install_type": "git-clone", + "description": "This Python script is an optional add-on to the Comfy UI stable diffusion client." + }, + { + "author": "immersiveexperience", + "title": "ie-comfyui-color-nodes", + "reference": "https://github.com/immersiveexperience/ie-comfyui-color-nodes", + "files": [ + "https://github.com/immersiveexperience/ie-comfyui-color-nodes" + ], + "install_type": "git-clone", + "description": "Custom ComfyUI nodes for simple color correction." + }, + { + "author": "LZpenguin", + "title": "ComfyUI-Text", + "id": "comfy-text", + "reference": "https://github.com/LZpenguin/ComfyUI-Text", + "files": [ + "https://github.com/LZpenguin/ComfyUI-Text" + ], + "install_type": "git-clone", + "description": "Nodes:Add_text_by_mask.[w/This custom node cannot be installed simultaneously as it has the same repository name as MarkoCa1/ComfyUI-Text.]" + }, { "author": "yushan777", "title": "Y7 Nodes for ComfyUI", diff --git a/node_db/new/custom-node-list.json b/node_db/new/custom-node-list.json index 158ccfe0..8e546338 100644 --- a/node_db/new/custom-node-list.json +++ b/node_db/new/custom-node-list.json @@ -14,7 +14,28 @@ - + { + "author": "smthemex", + "title": "ComfyUI_Pops", + "id": "pops", + "reference": "https://github.com/smthemex/ComfyUI_Pops", + "files": [ + "https://github.com/smthemex/ComfyUI_Pops" + ], + "install_type": "git-clone", + "description": "You can use [a/Popspaper](https://popspaper.github.io/pOps/) method in comfyUI" + }, + { + "author": "shobhitic", + "title": "PlusMinusTextClip", + "id": "plusminustextclip", + "reference": "https://github.com/shobhitic/ComfyUI-PlusMinusTextClip", + "files": [ + "https://github.com/shobhitic/ComfyUI-PlusMinusTextClip" + ], + "install_type": "git-clone", + "description": "This adds a node that has both the positive and negative prompts as input in one node. You can just add one node and be done with both Positive and Negative prompts, in place of adding two different nodes for them." + }, { "author": "huchenlei", "title": "ComfyUI_omost", @@ -38,6 +59,17 @@ "description": "[a/DenseDiffusion](https://github.com/naver-ai/DenseDiffusion) custom node for ComfyUI." }, + { + "author": "ZHO-ZHO-ZHO", + "title": "ComfyUI-Qwen-2", + "id": "qwen-2", + "reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen-2", + "files": [ + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen-2" + ], + "install_type": "git-clone", + "description": "Using Qwen-2 in ComfyUI" + }, { "author": "BenNarum", "title": "SigmaWaveFormNodes", @@ -104,17 +136,6 @@ "install_type": "git-clone", "description": "Custom nodes make easy Advanced Workflows. Focus on Image/Video and ControlNet efficiency and performances. Manipulation of Latent Space, Automatic pipeline with a bit efforts." }, - { - "author": "LZpenguin", - "title": "ComfyUI-Text", - "id": "comfy-text", - "reference": "https://github.com/LZpenguin/ComfyUI-Text", - "files": [ - "https://github.com/LZpenguin/ComfyUI-Text" - ], - "install_type": "git-clone", - "description": "Nodes:Add_text_by_mask" - }, { "author": "seghier", "title": "ComfyUI_LibreTranslate", diff --git a/node_db/new/extension-node-map.json b/node_db/new/extension-node-map.json index dac8d1f5..e09cc75c 100644 --- a/node_db/new/extension-node-map.json +++ b/node_db/new/extension-node-map.json @@ -2506,17 +2506,6 @@ "title_aux": "ImagesGrid" } ], - "https://github.com/LZpenguin/ComfyUI-Text": [ - [ - "CombinationText", - "PlaceholderText", - "ReplaceText", - "ShowText" - ], - { - "title_aux": "ComfyUI-Text" - } - ], "https://github.com/LarryJane491/Image-Captioning-in-ComfyUI": [ [ "LoRA Caption Load", @@ -2796,6 +2785,17 @@ "title_aux": "ComfyUI-BadmanNodes" } ], + "https://github.com/MarkoCa1/ComfyUI-Text": [ + [ + "CombinationText", + "PlaceholderText", + "ReplaceText", + "ShowText" + ], + { + "title_aux": "ComfyUI-Text" + } + ], "https://github.com/MarkoCa1/ComfyUI_Segment_Mask": [ [ "AutomaticMask(segment anything)" @@ -5160,6 +5160,16 @@ "title_aux": "ComfyUI-Q-Align" } ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen-2": [ + [ + "Qwen2_Chat_Zho", + "Qwen2_ModelLoader_Zho", + "Qwen2_Zho" + ], + { + "title_aux": "ComfyUI-Qwen-2" + } + ], "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen-VL-API": [ [ "QWenVL_API_S_Multi_Zho", @@ -5766,6 +5776,7 @@ "Bedrock - Claude Multimodal", "Bedrock - SDXL", "Bedrock - Titan Inpainting", + "Bedrock - Titan Outpainting", "Bedrock - Titan Text to Image", "Image From S3", "Image From URL", @@ -5860,6 +5871,8 @@ "Mikey Sampler Base Only Advanced", "Mikey Sampler Tiled", "Mikey Sampler Tiled Base Only", + "MikeyLatentTileSampler", + "MikeyLatentTileSamplerCustom", "MikeySamplerTiledAdvanced", "MikeySamplerTiledAdvancedBaseOnly", "MosaicExpandImage", @@ -6875,9 +6888,11 @@ "LayerColor: Levels", "LayerColor: RGB", "LayerColor: YUV", + "LayerFilter: AddGrain", "LayerFilter: ChannelShake", "LayerFilter: ColorMap", "LayerFilter: Film", + "LayerFilter: FilmV2", "LayerFilter: GaussianBlur", "LayerFilter: HDREffects", "LayerFilter: LightLeak", @@ -6897,6 +6912,7 @@ "LayerMask: MaskEdgeUltraDetail", "LayerMask: MaskEdgeUltraDetail V2", "LayerMask: MaskGradient", + "LayerMask: MaskGrain", "LayerMask: MaskGrow", "LayerMask: MaskInvert", "LayerMask: MaskMotionBlur", @@ -6947,6 +6963,7 @@ "LayerUtility: GetImageSize", "LayerUtility: GradientImage", "LayerUtility: GradientImage V2", + "LayerUtility: HLFrequencyDetailRestore", "LayerUtility: ImageAutoCrop", "LayerUtility: ImageAutoCrop V2", "LayerUtility: ImageBlend", @@ -9324,6 +9341,8 @@ "load_url", "load_wikipedia", "new_interpreter_tool", + "openai_tts", + "play_audio", "show_text_party", "start_dialog", "start_workflow", @@ -10715,8 +10734,10 @@ "https://github.com/ljleb/comfy-mecha": [ [ "Blocks Mecha Hyper", - "Custom Code Mecha Recipe", + "Float Mecha Hyper", + "Mecha Custom Code Recipe", "Mecha Merger", + "Mecha Recipe List", "Model Mecha Recipe" ], { @@ -11001,6 +11022,7 @@ "ImpactControlNetApplySEGS", "ImpactControlNetClearSEGS", "ImpactConvertDataType", + "ImpactCount_Elts_in_SEGS", "ImpactDecomposeSEGS", "ImpactDilateMask", "ImpactDilateMaskInSEGS", @@ -11302,6 +11324,8 @@ ], "https://github.com/marduk191/comfyui-marnodes": [ [ + "marduk191_5_text_string", + "marduk191_5way_text_switch", "marduk191_workflow_settings" ], { @@ -12602,6 +12626,7 @@ "ChatGPTOpenAI", "CkptNames_", "Color", + "CombineAudioVideo", "ComparingTwoFrames_", "CompositeImages_", "DynamicDelayProcessor", @@ -12614,6 +12639,7 @@ "Font", "GLIGENTextBoxApply_Advanced", "GamePal", + "GenerateFramesByCount", "GetImageSize_", "GradientImage", "GridDisplayAndSave", @@ -12622,12 +12648,14 @@ "ImageColorTransfer", "ImageCropByAlpha", "ImageListReplace_", + "ImageListToBatch_", "ImagesPrompt_", "IncrementingListNode_", "IntNumber", "JoinWithDelimiter", "LimitNumber", "ListSplit_", + "LoadAndCombinedAudio_", "LoadImagesFromPath", "LoadImagesFromURL", "LoadImagesToBatch", @@ -12653,6 +12681,7 @@ "SaveImageAndMetadata_", "SaveImageToLocal", "SaveTripoSRMesh", + "ScenesNode_", "ScreenShare", "Seed_", "ShowLayer", @@ -12762,6 +12791,14 @@ "title_aux": "ComfyUI-send-Eagle(slim)" } ], + "https://github.com/shobhitic/ComfyUI-PlusMinusTextClip": [ + [ + "PlusMinusTextClip" + ], + { + "title_aux": "PlusMinusTextClip" + } + ], "https://github.com/shockz0rz/ComfyUI_InterpolateEverything": [ [ "OpenposePreprocessorInterpolate" @@ -12980,6 +13017,20 @@ "title_aux": "ComfyUI_Pipeline_Tool" } ], + "https://github.com/smthemex/ComfyUI_Pops": [ + [ + "Imgae_To_Path", + "Pops_Controlnet_Sampler", + "Pops_Ipadapter_Sampler", + "Pops_Mean_Sampler", + "Pops_Prior_Embedding", + "Pops_Repo_Choice", + "Pops_Unet_Sampler" + ], + { + "title_aux": "ComfyUI_Pops" + } + ], "https://github.com/smthemex/ComfyUI_StableAudio_Open": [ [ "StableAudio_Open", @@ -13733,14 +13784,15 @@ ], "https://github.com/vanche1212/ComfyUI-ZMG-Nodes": [ [ + "VC_Load_Video_Path_Unified_Output", + "VC_Load_Video_Upload_Unified_Output", + "VC_Video_Combine_Unified_Output", "Waveform2Audio", "\ud83d\ude0bAPI Request Node", "\ud83d\ude0bJSON Parser Node", - "\ud83d\ude0bLoad Video Path Unified Output", "\ud83d\ude0bOld Photo Colorization Node", "\ud83d\ude0bOllama Request Node", - "\ud83d\ude0bSave Image Unified Output", - "\ud83d\ude0bVideo Combine Unified Output" + "\ud83d\ude0bSave Image Unified Output" ], { "title_aux": "ZMG PLUGIN" diff --git a/pyproject.toml b/pyproject.toml index 8fbcfa78..4bd3661a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "comfyui-manager" description = "ComfyUI-Manager provides features to install and manage custom nodes for ComfyUI, as well as various functionalities to assist with ComfyUI." -version = "2.37.3" +version = "2.38" license = "LICENSE" dependencies = ["GitPython", "PyGithub", "matrix-client==0.4.0", "transformers", "huggingface-hub>0.20", "typer", "rich", "typing-extensions"] diff --git a/scanner.py b/scanner.py index 30282274..9ff7fb58 100644 --- a/scanner.py +++ b/scanner.py @@ -457,7 +457,13 @@ def gen_json(node_info): git_url, title, preemptions, node_pattern = node_info[extension] with open(node_list_json_path, 'r', encoding='utf-8') as f: - node_list_json = json.load(f) + try: + node_list_json = json.load(f) + except Exception as e: + print(f"\nERROR: Invalid json format '{node_list_json_path}'") + print("------------------------------------------------------") + print(e) + print("------------------------------------------------------") metadata_in_url = {} if git_url not in data: