mirror of
https://github.com/comfyanonymous/ComfyUI.git
synced 2026-01-26 14:20:27 +08:00
Update ComfyUI and fix tests
This commit is contained in:
parent
2d1676c717
commit
d989e65fde
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,6 +1,7 @@
|
|||||||
main.exp
|
main.exp
|
||||||
main.lib
|
main.lib
|
||||||
main.obj
|
main.obj
|
||||||
|
tests/inference/output/
|
||||||
.DS_Store
|
.DS_Store
|
||||||
/[Oo]utput/
|
/[Oo]utput/
|
||||||
/[Ii]nput/
|
/[Ii]nput/
|
||||||
|
|||||||
@ -13,17 +13,19 @@ import sys
|
|||||||
import traceback
|
import traceback
|
||||||
import urllib
|
import urllib
|
||||||
import uuid
|
import uuid
|
||||||
from asyncio import AbstractEventLoop, Task
|
from asyncio import Future, AbstractEventLoop, Task
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
|
from posixpath import join as urljoin
|
||||||
from typing import List, Optional
|
from typing import List, Optional
|
||||||
from urllib.parse import quote
|
from urllib.parse import quote, urlencode
|
||||||
|
|
||||||
import aiofiles
|
import aiofiles
|
||||||
import aiohttp
|
import aiohttp
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
from PIL.PngImagePlugin import PngInfo
|
from PIL.PngImagePlugin import PngInfo
|
||||||
from aiohttp import web
|
from aiohttp import web
|
||||||
|
from can_ada import URL, parse as urlparse # pylint: disable=no-name-in-module
|
||||||
from typing_extensions import NamedTuple
|
from typing_extensions import NamedTuple
|
||||||
|
|
||||||
from .latent_preview_image_encoding import encode_preview_image
|
from .latent_preview_image_encoding import encode_preview_image
|
||||||
@ -35,12 +37,15 @@ from ..api_server.routes.internal.internal_routes import InternalRoutes
|
|||||||
from ..app.frontend_management import FrontendManager
|
from ..app.frontend_management import FrontendManager
|
||||||
from ..app.user_manager import UserManager
|
from ..app.user_manager import UserManager
|
||||||
from ..cli_args import args
|
from ..cli_args import args
|
||||||
|
from ..client.client_types import FileOutput
|
||||||
from ..cmd import execution
|
from ..cmd import execution
|
||||||
from ..cmd import folder_paths
|
from ..cmd import folder_paths
|
||||||
from ..component_model.abstract_prompt_queue import AbstractPromptQueue, AsyncAbstractPromptQueue
|
from ..component_model.abstract_prompt_queue import AbstractPromptQueue, AsyncAbstractPromptQueue
|
||||||
from ..component_model.executor_types import ExecutorToClientProgress, StatusMessage, QueueInfo, ExecInfo
|
from ..component_model.executor_types import ExecutorToClientProgress, StatusMessage, QueueInfo, ExecInfo
|
||||||
from ..component_model.file_output_path import file_output_path
|
from ..component_model.file_output_path import file_output_path
|
||||||
from ..component_model.queue_types import QueueItem, BinaryEventTypes
|
from ..component_model.queue_types import QueueItem, HistoryEntry, BinaryEventTypes, TaskInvocation, ExecutionError, \
|
||||||
|
ExecutionStatus
|
||||||
|
from ..digest import digest
|
||||||
from ..images import open_image
|
from ..images import open_image
|
||||||
from ..model_management import get_torch_device, get_torch_device_name, get_total_memory, get_free_memory, torch_version
|
from ..model_management import get_torch_device, get_torch_device_name, get_total_memory, get_free_memory, torch_version
|
||||||
from ..nodes.package_typing import ExportedNodes
|
from ..nodes.package_typing import ExportedNodes
|
||||||
@ -682,6 +687,248 @@ class PromptServer(ExecutorToClientProgress):
|
|||||||
|
|
||||||
return web.Response(status=200)
|
return web.Response(status=200)
|
||||||
|
|
||||||
|
# Internal route. Should not be depended upon and is subject to change at any time.
|
||||||
|
# TODO(robinhuang): Move to internal route table class once we refactor PromptServer to pass around Websocket.
|
||||||
|
# NOTE: This was an experiment and WILL BE REMOVED
|
||||||
|
@routes.post("/internal/models/download")
|
||||||
|
async def download_handler(request):
|
||||||
|
async def report_progress(filename: str, status: DownloadModelStatus):
|
||||||
|
payload = status.to_dict()
|
||||||
|
payload['download_path'] = filename
|
||||||
|
await self.send_json("download_progress", payload)
|
||||||
|
|
||||||
|
data = await request.json()
|
||||||
|
url = data.get('url')
|
||||||
|
model_directory = data.get('model_directory')
|
||||||
|
folder_path = data.get('folder_path')
|
||||||
|
model_filename = data.get('model_filename')
|
||||||
|
progress_interval = data.get('progress_interval', 1.0) # In seconds, how often to report download progress.
|
||||||
|
|
||||||
|
if not url or not model_directory or not model_filename or not folder_path:
|
||||||
|
return web.json_response({"status": "error", "message": "Missing URL or folder path or filename"}, status=400)
|
||||||
|
|
||||||
|
session = self.client_session
|
||||||
|
if session is None:
|
||||||
|
logger.error("Client session is not initialized")
|
||||||
|
return web.Response(status=500)
|
||||||
|
|
||||||
|
task = asyncio.create_task(download_model(lambda url: session.get(url), model_filename, url, model_directory, folder_path, report_progress, progress_interval))
|
||||||
|
await task
|
||||||
|
|
||||||
|
return web.json_response(task.result().to_dict())
|
||||||
|
|
||||||
|
@routes.get("/api/v1/prompts/{prompt_id}")
|
||||||
|
async def get_api_v1_prompts_prompt_id(request: web.Request) -> web.Response | web.FileResponse:
|
||||||
|
prompt_id: str = request.match_info.get("prompt_id", "")
|
||||||
|
if prompt_id == "":
|
||||||
|
return web.json_response(status=404)
|
||||||
|
|
||||||
|
history_items = self.prompt_queue.get_history(prompt_id)
|
||||||
|
if len(history_items) == 0 or prompt_id not in history_items:
|
||||||
|
# todo: this should really be moved to a stateful queue abstraction
|
||||||
|
if prompt_id in self.background_tasks:
|
||||||
|
return web.json_response(status=204)
|
||||||
|
else:
|
||||||
|
# todo: this should check a stateful queue abstraction
|
||||||
|
return web.json_response(status=404)
|
||||||
|
elif prompt_id in history_items:
|
||||||
|
history_entry = history_items[prompt_id]
|
||||||
|
return web.json_response(history_entry["outputs"])
|
||||||
|
else:
|
||||||
|
return web.json_response(status=500)
|
||||||
|
|
||||||
|
@routes.post("/api/v1/prompts")
|
||||||
|
async def post_api_prompt(request: web.Request) -> web.Response | web.FileResponse:
|
||||||
|
accept = request.headers.get("accept", "application/json")
|
||||||
|
if accept == '*/*':
|
||||||
|
accept = "application/json"
|
||||||
|
content_type = request.headers.get("content-type", "application/json")
|
||||||
|
preferences = request.headers.get("prefer", "") + request.query.get("prefer", "") + " " + content_type
|
||||||
|
if "+" in content_type:
|
||||||
|
content_type = content_type.split("+")[0]
|
||||||
|
|
||||||
|
wait = not "respond-async" in preferences
|
||||||
|
|
||||||
|
if accept not in ("application/json", "image/png"):
|
||||||
|
return web.json_response(status=400, reason=f"invalid accept content type, expected application/json or image/png, got {accept}")
|
||||||
|
|
||||||
|
# check if the queue is too long
|
||||||
|
queue_size = self.prompt_queue.size()
|
||||||
|
queue_too_busy_size = PromptServer.get_too_busy_queue_size()
|
||||||
|
if queue_size > queue_too_busy_size:
|
||||||
|
return web.json_response(status=429,
|
||||||
|
reason=f"the queue has {queue_size} elements and {queue_too_busy_size} is the limit for this worker")
|
||||||
|
# read the request
|
||||||
|
prompt_dict: dict = {}
|
||||||
|
if content_type == 'application/json':
|
||||||
|
prompt_dict = await request.json()
|
||||||
|
elif content_type == 'multipart/form-data':
|
||||||
|
try:
|
||||||
|
reader = await request.multipart()
|
||||||
|
async for part in reader:
|
||||||
|
if part is None:
|
||||||
|
break
|
||||||
|
if part.headers[aiohttp.hdrs.CONTENT_TYPE] == 'application/json':
|
||||||
|
prompt_dict = await part.json()
|
||||||
|
if 'prompt' in prompt_dict:
|
||||||
|
prompt_dict = prompt_dict['prompt']
|
||||||
|
elif part.filename:
|
||||||
|
file_data = await part.read(decode=True)
|
||||||
|
# overwrite existing files
|
||||||
|
upload_dir = PromptServer.get_upload_dir()
|
||||||
|
async with aiofiles.open(os.path.join(upload_dir, part.filename), mode='wb') as file:
|
||||||
|
await file.write(file_data)
|
||||||
|
except IOError as ioError:
|
||||||
|
return web.Response(status=507, reason=str(ioError))
|
||||||
|
except MemoryError as memoryError:
|
||||||
|
return web.Response(status=507, reason=str(memoryError))
|
||||||
|
except Exception as ex:
|
||||||
|
return web.Response(status=400, reason=str(ex))
|
||||||
|
|
||||||
|
if len(prompt_dict) == 0:
|
||||||
|
return web.Response(status=400, reason="no prompt was specified")
|
||||||
|
|
||||||
|
content_digest = digest(prompt_dict)
|
||||||
|
|
||||||
|
valid = execution.validate_prompt(prompt_dict)
|
||||||
|
if not valid[0]:
|
||||||
|
return web.Response(status=400, content_type="application/json", body=json.dumps(valid[1]))
|
||||||
|
|
||||||
|
# convert a valid prompt to the queue tuple this expects
|
||||||
|
number = self.number
|
||||||
|
self.number += 1
|
||||||
|
|
||||||
|
result: TaskInvocation
|
||||||
|
completed: Future[TaskInvocation | dict] = self.loop.create_future()
|
||||||
|
# todo: actually implement idempotency keys
|
||||||
|
# we would need some kind of more durable, distributed task queue
|
||||||
|
task_id = str(uuid.uuid4())
|
||||||
|
item = QueueItem(queue_tuple=(number, task_id, prompt_dict, {}, valid[2]), completed=completed)
|
||||||
|
|
||||||
|
try:
|
||||||
|
if hasattr(self.prompt_queue, "put_async") or isinstance(self.prompt_queue, AsyncAbstractPromptQueue):
|
||||||
|
# this enables span propagation seamlessly
|
||||||
|
fut = self.prompt_queue.put_async(item)
|
||||||
|
if wait:
|
||||||
|
result = await fut
|
||||||
|
if result is None:
|
||||||
|
return web.Response(body="the queue is shutting down", status=503)
|
||||||
|
else:
|
||||||
|
return await self._schedule_background_task_with_web_response(fut, task_id)
|
||||||
|
else:
|
||||||
|
self.prompt_queue.put(item)
|
||||||
|
if wait:
|
||||||
|
await completed
|
||||||
|
else:
|
||||||
|
return await self._schedule_background_task_with_web_response(completed, task_id)
|
||||||
|
task_invocation_or_dict: TaskInvocation | dict = completed.result()
|
||||||
|
if isinstance(task_invocation_or_dict, dict):
|
||||||
|
result = TaskInvocation(item_id=item.prompt_id, outputs=task_invocation_or_dict, status=ExecutionStatus("success", True, []))
|
||||||
|
else:
|
||||||
|
result = task_invocation_or_dict
|
||||||
|
except ExecutionError as exec_exc:
|
||||||
|
result = exec_exc.as_task_invocation()
|
||||||
|
except Exception as ex:
|
||||||
|
return web.Response(body=str(ex), status=500)
|
||||||
|
|
||||||
|
if result.status is not None and result.status.status_str == "error":
|
||||||
|
return web.Response(body=json.dumps(result.status._asdict()), status=500, content_type="application/json")
|
||||||
|
# find images and read them
|
||||||
|
output_images: List[FileOutput] = []
|
||||||
|
for node_id, node in result.outputs.items():
|
||||||
|
images: List[FileOutput] = []
|
||||||
|
if 'images' in node:
|
||||||
|
images = node['images']
|
||||||
|
# todo: does this ever occur?
|
||||||
|
elif (isinstance(node, dict)
|
||||||
|
and 'ui' in node and isinstance(node['ui'], dict)
|
||||||
|
and 'images' in node['ui']):
|
||||||
|
images = node['ui']['images']
|
||||||
|
for image_tuple in images:
|
||||||
|
output_images.append(image_tuple)
|
||||||
|
|
||||||
|
if len(output_images) > 0:
|
||||||
|
main_image = output_images[0]
|
||||||
|
filename = main_image["filename"]
|
||||||
|
digest_headers_ = {
|
||||||
|
"Digest": f"SHA-256={content_digest}",
|
||||||
|
}
|
||||||
|
urls_ = []
|
||||||
|
if len(output_images) == 1:
|
||||||
|
digest_headers_.update({
|
||||||
|
"Content-Disposition": f"filename=\"{filename}\""
|
||||||
|
})
|
||||||
|
|
||||||
|
for image_indv_ in output_images:
|
||||||
|
local_address = f"http://{self.address}:{self.port}"
|
||||||
|
external_address = self.external_address
|
||||||
|
|
||||||
|
for base in (local_address, external_address):
|
||||||
|
try:
|
||||||
|
url: URL = urlparse(urljoin(base, "view"))
|
||||||
|
except ValueError:
|
||||||
|
continue
|
||||||
|
url_search_dict: FileOutput = dict(image_indv_)
|
||||||
|
del url_search_dict["abs_path"]
|
||||||
|
if "name" in url_search_dict:
|
||||||
|
del url_search_dict["name"]
|
||||||
|
if url_search_dict["subfolder"] == "":
|
||||||
|
del url_search_dict["subfolder"]
|
||||||
|
url.search = f"?{urlencode(url_search_dict)}"
|
||||||
|
urls_.append(str(url))
|
||||||
|
|
||||||
|
if accept == "application/json":
|
||||||
|
return web.Response(status=200,
|
||||||
|
content_type="application/json",
|
||||||
|
headers=digest_headers_,
|
||||||
|
body=json.dumps({
|
||||||
|
'urls': urls_,
|
||||||
|
'outputs': result.outputs
|
||||||
|
}))
|
||||||
|
elif accept == "image/png" or accept == "image/jpeg":
|
||||||
|
return web.FileResponse(main_image["abs_path"],
|
||||||
|
headers=digest_headers_)
|
||||||
|
else:
|
||||||
|
return web.Response(status=500,
|
||||||
|
reason="unreachable")
|
||||||
|
else:
|
||||||
|
return web.Response(status=204)
|
||||||
|
|
||||||
|
@routes.get("/api/v1/prompts")
|
||||||
|
async def get_api_prompt(_: web.Request) -> web.Response:
|
||||||
|
history = self.prompt_queue.get_history()
|
||||||
|
history_items = list(history.values())
|
||||||
|
if len(history_items) == 0:
|
||||||
|
return web.Response(status=404)
|
||||||
|
|
||||||
|
last_history_item: HistoryEntry = history_items[-1]
|
||||||
|
prompt = last_history_item['prompt'][2]
|
||||||
|
return web.json_response(prompt, status=200)
|
||||||
|
|
||||||
|
async def _schedule_background_task_with_web_response(self, fut, task_id):
|
||||||
|
task = asyncio.create_task(fut, name=task_id)
|
||||||
|
self.background_tasks[task_id] = task
|
||||||
|
task.add_done_callback(lambda _: self.background_tasks.pop(task_id))
|
||||||
|
# todo: type this from the OpenAPI spec
|
||||||
|
return web.json_response({
|
||||||
|
"prompt_id": task_id
|
||||||
|
}, status=202, headers={
|
||||||
|
"Location": f"api/v1/prompts/{task_id}",
|
||||||
|
"Retry-After": "60"
|
||||||
|
})
|
||||||
|
|
||||||
|
@property
|
||||||
|
def external_address(self):
|
||||||
|
return self._external_address if self._external_address is not None else f"http://{'localhost' if self.address == '0.0.0.0' else self.address}:{self.port}"
|
||||||
|
|
||||||
|
@external_address.setter
|
||||||
|
def external_address(self, value):
|
||||||
|
self._external_address = value
|
||||||
|
|
||||||
|
@property
|
||||||
|
def receive_all_progress_notifications(self) -> bool:
|
||||||
|
return True
|
||||||
|
|
||||||
async def setup(self):
|
async def setup(self):
|
||||||
timeout = aiohttp.ClientTimeout(total=None) # no timeout
|
timeout = aiohttp.ClientTimeout(total=None) # no timeout
|
||||||
self.client_session = aiohttp.ClientSession(timeout=timeout)
|
self.client_session = aiohttp.ClientSession(timeout=timeout)
|
||||||
|
|||||||
124
comfy/hooks.py
124
comfy/hooks.py
@ -1,24 +1,32 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
from typing import TYPE_CHECKING, Callable
|
|
||||||
import enum
|
import enum
|
||||||
import math
|
|
||||||
import torch
|
|
||||||
import numpy as np
|
|
||||||
import itertools
|
import itertools
|
||||||
|
import logging
|
||||||
|
import math
|
||||||
|
from typing import Callable, Any, TYPE_CHECKING
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
import torch
|
||||||
|
|
||||||
|
from .lora import model_lora_keys_unet, model_lora_keys_clip, load_lora
|
||||||
|
from .lora_types import PatchDict
|
||||||
|
from .model_base import BaseModel
|
||||||
|
from .node_helpers import conditioning_set_values
|
||||||
|
from .patcher_extension import merge_nested_dicts
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from comfy.model_patcher import ModelPatcher, PatcherInjection
|
from .model_patcher import ModelPatcher, PatcherInjection
|
||||||
from comfy.model_base import BaseModel
|
from .sd import CLIP
|
||||||
from comfy.sd import CLIP
|
|
||||||
import comfy.lora
|
|
||||||
import comfy.model_management
|
|
||||||
import comfy.patcher_extension
|
|
||||||
from node_helpers import conditioning_set_values
|
|
||||||
|
|
||||||
class EnumHookMode(enum.Enum):
|
class EnumHookMode(enum.Enum):
|
||||||
MinVram = "minvram"
|
MinVram = "minvram"
|
||||||
MaxSpeed = "maxspeed"
|
MaxSpeed = "maxspeed"
|
||||||
|
|
||||||
|
|
||||||
class EnumHookType(enum.Enum):
|
class EnumHookType(enum.Enum):
|
||||||
Weight = "weight"
|
Weight = "weight"
|
||||||
Patch = "patch"
|
Patch = "patch"
|
||||||
@ -28,21 +36,24 @@ class EnumHookType(enum.Enum):
|
|||||||
Wrappers = "wrappers"
|
Wrappers = "wrappers"
|
||||||
SetInjections = "add_injections"
|
SetInjections = "add_injections"
|
||||||
|
|
||||||
|
|
||||||
class EnumWeightTarget(enum.Enum):
|
class EnumWeightTarget(enum.Enum):
|
||||||
Model = "model"
|
Model = "model"
|
||||||
Clip = "clip"
|
Clip = "clip"
|
||||||
|
|
||||||
|
|
||||||
class _HookRef:
|
class _HookRef:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
# NOTE: this is an example of how the should_register function should look
|
# NOTE: this is an example of how the should_register function should look
|
||||||
def default_should_register(hook: 'Hook', model: 'ModelPatcher', model_options: dict, target: EnumWeightTarget, registered: list[Hook]):
|
def default_should_register(hook: 'Hook', model: 'ModelPatcher', model_options: dict, target: EnumWeightTarget, registered: list[Hook]):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
class Hook:
|
class Hook:
|
||||||
def __init__(self, hook_type: EnumHookType=None, hook_ref: _HookRef=None, hook_id: str=None,
|
def __init__(self, hook_type: EnumHookType = None, hook_ref: _HookRef = None, hook_id: str = None,
|
||||||
hook_keyframe: 'HookKeyframeGroup'=None):
|
hook_keyframe: 'HookKeyframeGroup' = None):
|
||||||
self.hook_type = hook_type
|
self.hook_type = hook_type
|
||||||
self.hook_ref = hook_ref if hook_ref else _HookRef()
|
self.hook_ref = hook_ref if hook_ref else _HookRef()
|
||||||
self.hook_id = hook_id
|
self.hook_id = hook_id
|
||||||
@ -61,7 +72,7 @@ class Hook:
|
|||||||
def reset(self):
|
def reset(self):
|
||||||
self.hook_keyframe.reset()
|
self.hook_keyframe.reset()
|
||||||
|
|
||||||
def clone(self, subtype: Callable=None):
|
def clone(self, subtype: Callable = None):
|
||||||
if subtype is None:
|
if subtype is None:
|
||||||
subtype = type(self)
|
subtype = type(self)
|
||||||
c: Hook = subtype()
|
c: Hook = subtype()
|
||||||
@ -92,6 +103,7 @@ class Hook:
|
|||||||
def __hash__(self):
|
def __hash__(self):
|
||||||
return hash(self.hook_ref)
|
return hash(self.hook_ref)
|
||||||
|
|
||||||
|
|
||||||
class WeightHook(Hook):
|
class WeightHook(Hook):
|
||||||
def __init__(self, strength_model=1.0, strength_clip=1.0):
|
def __init__(self, strength_model=1.0, strength_clip=1.0):
|
||||||
super().__init__(hook_type=EnumHookType.Weight)
|
super().__init__(hook_type=EnumHookType.Weight)
|
||||||
@ -121,10 +133,10 @@ class WeightHook(Hook):
|
|||||||
if self.need_weight_init:
|
if self.need_weight_init:
|
||||||
key_map = {}
|
key_map = {}
|
||||||
if target == EnumWeightTarget.Model:
|
if target == EnumWeightTarget.Model:
|
||||||
key_map = comfy.lora.model_lora_keys_unet(model.model, key_map)
|
key_map = model_lora_keys_unet(model.model, key_map)
|
||||||
else:
|
else:
|
||||||
key_map = comfy.lora.model_lora_keys_clip(model.model, key_map)
|
key_map = model_lora_keys_clip(model.model, key_map)
|
||||||
weights = comfy.lora.load_lora(self.weights, key_map, log_missing=False)
|
weights = load_lora(self.weights, key_map, log_missing=False)
|
||||||
else:
|
else:
|
||||||
if target == EnumWeightTarget.Model:
|
if target == EnumWeightTarget.Model:
|
||||||
weights = self.weights
|
weights = self.weights
|
||||||
@ -135,7 +147,7 @@ class WeightHook(Hook):
|
|||||||
return True
|
return True
|
||||||
# TODO: add logs about any keys that were not applied
|
# TODO: add logs about any keys that were not applied
|
||||||
|
|
||||||
def clone(self, subtype: Callable=None):
|
def clone(self, subtype: Callable = None):
|
||||||
if subtype is None:
|
if subtype is None:
|
||||||
subtype = type(self)
|
subtype = type(self)
|
||||||
c: WeightHook = super().clone(subtype)
|
c: WeightHook = super().clone(subtype)
|
||||||
@ -146,12 +158,13 @@ class WeightHook(Hook):
|
|||||||
c._strength_clip = self._strength_clip
|
c._strength_clip = self._strength_clip
|
||||||
return c
|
return c
|
||||||
|
|
||||||
|
|
||||||
class PatchHook(Hook):
|
class PatchHook(Hook):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__(hook_type=EnumHookType.Patch)
|
super().__init__(hook_type=EnumHookType.Patch)
|
||||||
self.patches: dict = None
|
self.patches: dict = None
|
||||||
|
|
||||||
def clone(self, subtype: Callable=None):
|
def clone(self, subtype: Callable = None):
|
||||||
if subtype is None:
|
if subtype is None:
|
||||||
subtype = type(self)
|
subtype = type(self)
|
||||||
c: PatchHook = super().clone(subtype)
|
c: PatchHook = super().clone(subtype)
|
||||||
@ -159,12 +172,13 @@ class PatchHook(Hook):
|
|||||||
return c
|
return c
|
||||||
# TODO: add functionality
|
# TODO: add functionality
|
||||||
|
|
||||||
|
|
||||||
class ObjectPatchHook(Hook):
|
class ObjectPatchHook(Hook):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__(hook_type=EnumHookType.ObjectPatch)
|
super().__init__(hook_type=EnumHookType.ObjectPatch)
|
||||||
self.object_patches: dict = None
|
self.object_patches: dict = None
|
||||||
|
|
||||||
def clone(self, subtype: Callable=None):
|
def clone(self, subtype: Callable = None):
|
||||||
if subtype is None:
|
if subtype is None:
|
||||||
subtype = type(self)
|
subtype = type(self)
|
||||||
c: ObjectPatchHook = super().clone(subtype)
|
c: ObjectPatchHook = super().clone(subtype)
|
||||||
@ -172,14 +186,15 @@ class ObjectPatchHook(Hook):
|
|||||||
return c
|
return c
|
||||||
# TODO: add functionality
|
# TODO: add functionality
|
||||||
|
|
||||||
|
|
||||||
class AddModelsHook(Hook):
|
class AddModelsHook(Hook):
|
||||||
def __init__(self, key: str=None, models: list['ModelPatcher']=None):
|
def __init__(self, key: str = None, models: list['ModelPatcher'] = None):
|
||||||
super().__init__(hook_type=EnumHookType.AddModels)
|
super().__init__(hook_type=EnumHookType.AddModels)
|
||||||
self.key = key
|
self.key = key
|
||||||
self.models = models
|
self.models = models
|
||||||
self.append_when_same = True
|
self.append_when_same = True
|
||||||
|
|
||||||
def clone(self, subtype: Callable=None):
|
def clone(self, subtype: Callable = None):
|
||||||
if subtype is None:
|
if subtype is None:
|
||||||
subtype = type(self)
|
subtype = type(self)
|
||||||
c: AddModelsHook = super().clone(subtype)
|
c: AddModelsHook = super().clone(subtype)
|
||||||
@ -189,13 +204,14 @@ class AddModelsHook(Hook):
|
|||||||
return c
|
return c
|
||||||
# TODO: add functionality
|
# TODO: add functionality
|
||||||
|
|
||||||
|
|
||||||
class CallbackHook(Hook):
|
class CallbackHook(Hook):
|
||||||
def __init__(self, key: str=None, callback: Callable=None):
|
def __init__(self, key: str = None, callback: Callable = None):
|
||||||
super().__init__(hook_type=EnumHookType.Callbacks)
|
super().__init__(hook_type=EnumHookType.Callbacks)
|
||||||
self.key = key
|
self.key = key
|
||||||
self.callback = callback
|
self.callback = callback
|
||||||
|
|
||||||
def clone(self, subtype: Callable=None):
|
def clone(self, subtype: Callable = None):
|
||||||
if subtype is None:
|
if subtype is None:
|
||||||
subtype = type(self)
|
subtype = type(self)
|
||||||
c: CallbackHook = super().clone(subtype)
|
c: CallbackHook = super().clone(subtype)
|
||||||
@ -204,12 +220,13 @@ class CallbackHook(Hook):
|
|||||||
return c
|
return c
|
||||||
# TODO: add functionality
|
# TODO: add functionality
|
||||||
|
|
||||||
|
|
||||||
class WrapperHook(Hook):
|
class WrapperHook(Hook):
|
||||||
def __init__(self, wrappers_dict: dict[str, dict[str, dict[str, list[Callable]]]]=None):
|
def __init__(self, wrappers_dict: dict[str, dict[str, dict[str, list[Callable]]]] = None):
|
||||||
super().__init__(hook_type=EnumHookType.Wrappers)
|
super().__init__(hook_type=EnumHookType.Wrappers)
|
||||||
self.wrappers_dict = wrappers_dict
|
self.wrappers_dict = wrappers_dict
|
||||||
|
|
||||||
def clone(self, subtype: Callable=None):
|
def clone(self, subtype: Callable = None):
|
||||||
if subtype is None:
|
if subtype is None:
|
||||||
subtype = type(self)
|
subtype = type(self)
|
||||||
c: WrapperHook = super().clone(subtype)
|
c: WrapperHook = super().clone(subtype)
|
||||||
@ -220,17 +237,18 @@ class WrapperHook(Hook):
|
|||||||
if not self.should_register(model, model_options, target, registered):
|
if not self.should_register(model, model_options, target, registered):
|
||||||
return False
|
return False
|
||||||
add_model_options = {"transformer_options": self.wrappers_dict}
|
add_model_options = {"transformer_options": self.wrappers_dict}
|
||||||
comfy.patcher_extension.merge_nested_dicts(model_options, add_model_options, copy_dict1=False)
|
merge_nested_dicts(model_options, add_model_options, copy_dict1=False)
|
||||||
registered.append(self)
|
registered.append(self)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
class SetInjectionsHook(Hook):
|
class SetInjectionsHook(Hook):
|
||||||
def __init__(self, key: str=None, injections: list['PatcherInjection']=None):
|
def __init__(self, key: str = None, injections: list['PatcherInjection'] = None):
|
||||||
super().__init__(hook_type=EnumHookType.SetInjections)
|
super().__init__(hook_type=EnumHookType.SetInjections)
|
||||||
self.key = key
|
self.key = key
|
||||||
self.injections = injections
|
self.injections = injections
|
||||||
|
|
||||||
def clone(self, subtype: Callable=None):
|
def clone(self, subtype: Callable = None):
|
||||||
if subtype is None:
|
if subtype is None:
|
||||||
subtype = type(self)
|
subtype = type(self)
|
||||||
c: SetInjectionsHook = super().clone(subtype)
|
c: SetInjectionsHook = super().clone(subtype)
|
||||||
@ -242,6 +260,7 @@ class SetInjectionsHook(Hook):
|
|||||||
# TODO: add functionality
|
# TODO: add functionality
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class HookGroup:
|
class HookGroup:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.hooks: list[Hook] = []
|
self.hooks: list[Hook] = []
|
||||||
@ -282,7 +301,7 @@ class HookGroup:
|
|||||||
return d
|
return d
|
||||||
|
|
||||||
def get_hooks_for_clip_schedule(self):
|
def get_hooks_for_clip_schedule(self):
|
||||||
scheduled_hooks: dict[WeightHook, list[tuple[tuple[float,float], HookKeyframe]]] = {}
|
scheduled_hooks: dict[WeightHook, list[tuple[tuple[float, float], HookKeyframe]]] = {}
|
||||||
for hook in self.hooks:
|
for hook in self.hooks:
|
||||||
# only care about WeightHooks, for now
|
# only care about WeightHooks, for now
|
||||||
if hook.hook_type == EnumHookType.Weight:
|
if hook.hook_type == EnumHookType.Weight:
|
||||||
@ -315,7 +334,7 @@ class HookGroup:
|
|||||||
boundaries = sorted(boundaries_set)
|
boundaries = sorted(boundaries_set)
|
||||||
real_ranges = [(boundaries[i], boundaries[i + 1]) for i in range(len(boundaries) - 1)]
|
real_ranges = [(boundaries[i], boundaries[i + 1]) for i in range(len(boundaries) - 1)]
|
||||||
# with real ranges defined, give appropriate hooks w/ keyframes for each range
|
# with real ranges defined, give appropriate hooks w/ keyframes for each range
|
||||||
scheduled_keyframes: list[tuple[tuple[float,float], list[tuple[WeightHook, HookKeyframe]]]] = []
|
scheduled_keyframes: list[tuple[tuple[float, float], list[tuple[WeightHook, HookKeyframe]]]] = []
|
||||||
for t_range in real_ranges:
|
for t_range in real_ranges:
|
||||||
hooks_schedule = []
|
hooks_schedule = []
|
||||||
for hook, val in scheduled_hooks.items():
|
for hook, val in scheduled_hooks.items():
|
||||||
@ -367,10 +386,11 @@ class HookKeyframe:
|
|||||||
|
|
||||||
def clone(self):
|
def clone(self):
|
||||||
c = HookKeyframe(strength=self.strength,
|
c = HookKeyframe(strength=self.strength,
|
||||||
start_percent=self.start_percent, guarantee_steps=self.guarantee_steps)
|
start_percent=self.start_percent, guarantee_steps=self.guarantee_steps)
|
||||||
c.start_t = self.start_t
|
c.start_t = self.start_t
|
||||||
return c
|
return c
|
||||||
|
|
||||||
|
|
||||||
class HookKeyframeGroup:
|
class HookKeyframeGroup:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.keyframes: list[HookKeyframe] = []
|
self.keyframes: list[HookKeyframe] = []
|
||||||
@ -434,8 +454,8 @@ class HookKeyframeGroup:
|
|||||||
# if met guaranteed steps, look for next keyframe in case need to switch
|
# if met guaranteed steps, look for next keyframe in case need to switch
|
||||||
if self._current_used_steps >= self._current_keyframe.guarantee_steps:
|
if self._current_used_steps >= self._current_keyframe.guarantee_steps:
|
||||||
# if has next index, loop through and see if need to switch
|
# if has next index, loop through and see if need to switch
|
||||||
if self.has_index(self._current_index+1):
|
if self.has_index(self._current_index + 1):
|
||||||
for i in range(self._current_index+1, len(self.keyframes)):
|
for i in range(self._current_index + 1, len(self.keyframes)):
|
||||||
eval_c = self.keyframes[i]
|
eval_c = self.keyframes[i]
|
||||||
# check if start_t is greater or equal to curr_t
|
# check if start_t is greater or equal to curr_t
|
||||||
# NOTE: t is in terms of sigmas, not percent, so bigger number = earlier step in sampling
|
# NOTE: t is in terms of sigmas, not percent, so bigger number = earlier step in sampling
|
||||||
@ -448,7 +468,8 @@ class HookKeyframeGroup:
|
|||||||
if self._current_keyframe.guarantee_steps > 0:
|
if self._current_keyframe.guarantee_steps > 0:
|
||||||
break
|
break
|
||||||
# if eval_c is outside the percent range, stop looking further
|
# if eval_c is outside the percent range, stop looking further
|
||||||
else: break
|
else:
|
||||||
|
break
|
||||||
# update steps current context is used
|
# update steps current context is used
|
||||||
self._current_used_steps += 1
|
self._current_used_steps += 1
|
||||||
# update current timestep this was performed on
|
# update current timestep this was performed on
|
||||||
@ -485,6 +506,7 @@ class InterpolationMethod:
|
|||||||
weights = weights.flip(dims=(0,))
|
weights = weights.flip(dims=(0,))
|
||||||
return weights
|
return weights
|
||||||
|
|
||||||
|
|
||||||
def get_sorted_list_via_attr(objects: list, attr: str) -> list:
|
def get_sorted_list_via_attr(objects: list, attr: str) -> list:
|
||||||
if not objects:
|
if not objects:
|
||||||
return objects
|
return objects
|
||||||
@ -508,6 +530,7 @@ def get_sorted_list_via_attr(objects: list, attr: str) -> list:
|
|||||||
sorted_list.extend(object_list)
|
sorted_list.extend(object_list)
|
||||||
return sorted_list
|
return sorted_list
|
||||||
|
|
||||||
|
|
||||||
def create_hook_lora(lora: dict[str, torch.Tensor], strength_model: float, strength_clip: float):
|
def create_hook_lora(lora: dict[str, torch.Tensor], strength_model: float, strength_clip: float):
|
||||||
hook_group = HookGroup()
|
hook_group = HookGroup()
|
||||||
hook = WeightHook(strength_model=strength_model, strength_clip=strength_clip)
|
hook = WeightHook(strength_model=strength_model, strength_clip=strength_clip)
|
||||||
@ -515,6 +538,7 @@ def create_hook_lora(lora: dict[str, torch.Tensor], strength_model: float, stren
|
|||||||
hook.weights = lora
|
hook.weights = lora
|
||||||
return hook_group
|
return hook_group
|
||||||
|
|
||||||
|
|
||||||
def create_hook_model_as_lora(weights_model, weights_clip, strength_model: float, strength_clip: float):
|
def create_hook_model_as_lora(weights_model, weights_clip, strength_model: float, strength_clip: float):
|
||||||
hook_group = HookGroup()
|
hook_group = HookGroup()
|
||||||
hook = WeightHook(strength_model=strength_model, strength_clip=strength_clip)
|
hook = WeightHook(strength_model=strength_model, strength_clip=strength_clip)
|
||||||
@ -534,6 +558,7 @@ def create_hook_model_as_lora(weights_model, weights_clip, strength_model: float
|
|||||||
hook.need_weight_init = False
|
hook.need_weight_init = False
|
||||||
return hook_group
|
return hook_group
|
||||||
|
|
||||||
|
|
||||||
def get_patch_weights_from_model(model: 'ModelPatcher', discard_model_sampling=True):
|
def get_patch_weights_from_model(model: 'ModelPatcher', discard_model_sampling=True):
|
||||||
if model is None:
|
if model is None:
|
||||||
return None
|
return None
|
||||||
@ -545,19 +570,20 @@ def get_patch_weights_from_model(model: 'ModelPatcher', discard_model_sampling=T
|
|||||||
patches_model.pop(key, None)
|
patches_model.pop(key, None)
|
||||||
return patches_model
|
return patches_model
|
||||||
|
|
||||||
|
|
||||||
# NOTE: this function shows how to register weight hooks directly on the ModelPatchers
|
# NOTE: this function shows how to register weight hooks directly on the ModelPatchers
|
||||||
def load_hook_lora_for_models(model: 'ModelPatcher', clip: 'CLIP', lora: dict[str, torch.Tensor],
|
def load_hook_lora_for_models(model: 'ModelPatcher', clip: 'CLIP', lora: dict[str, torch.Tensor],
|
||||||
strength_model: float, strength_clip: float):
|
strength_model: float, strength_clip: float):
|
||||||
key_map = {}
|
key_map = {}
|
||||||
if model is not None:
|
if model is not None:
|
||||||
key_map = comfy.lora.model_lora_keys_unet(model.model, key_map)
|
key_map = model_lora_keys_unet(model.model, key_map)
|
||||||
if clip is not None:
|
if clip is not None:
|
||||||
key_map = comfy.lora.model_lora_keys_clip(clip.cond_stage_model, key_map)
|
key_map = model_lora_keys_clip(clip.cond_stage_model, key_map)
|
||||||
|
|
||||||
hook_group = HookGroup()
|
hook_group = HookGroup()
|
||||||
hook = WeightHook()
|
hook = WeightHook()
|
||||||
hook_group.add(hook)
|
hook_group.add(hook)
|
||||||
loaded: dict[str] = comfy.lora.load_lora(lora, key_map)
|
loaded: PatchDict = load_lora(lora, key_map)
|
||||||
if model is not None:
|
if model is not None:
|
||||||
new_modelpatcher = model.clone()
|
new_modelpatcher = model.clone()
|
||||||
k = new_modelpatcher.add_hook_patches(hook=hook, patches=loaded, strength_patch=strength_model)
|
k = new_modelpatcher.add_hook_patches(hook=hook, patches=loaded, strength_patch=strength_model)
|
||||||
@ -575,9 +601,10 @@ def load_hook_lora_for_models(model: 'ModelPatcher', clip: 'CLIP', lora: dict[st
|
|||||||
k1 = set(k1)
|
k1 = set(k1)
|
||||||
for x in loaded:
|
for x in loaded:
|
||||||
if (x not in k) and (x not in k1):
|
if (x not in k) and (x not in k1):
|
||||||
print(f"NOT LOADED {x}")
|
logger.warning(f"NOT LOADED {x}")
|
||||||
return (new_modelpatcher, new_clip, hook_group)
|
return (new_modelpatcher, new_clip, hook_group)
|
||||||
|
|
||||||
|
|
||||||
def _combine_hooks_from_values(c_dict: dict[str, HookGroup], values: dict[str, HookGroup], cache: dict[tuple[HookGroup, HookGroup], HookGroup]):
|
def _combine_hooks_from_values(c_dict: dict[str, HookGroup], values: dict[str, HookGroup], cache: dict[tuple[HookGroup, HookGroup], HookGroup]):
|
||||||
hooks_key = 'hooks'
|
hooks_key = 'hooks'
|
||||||
# if hooks only exist in one dict, do what's needed so that it ends up in c_dict
|
# if hooks only exist in one dict, do what's needed so that it ends up in c_dict
|
||||||
@ -598,6 +625,7 @@ def _combine_hooks_from_values(c_dict: dict[str, HookGroup], values: dict[str, H
|
|||||||
else:
|
else:
|
||||||
c_dict[hooks_key] = cache[hooks_tuple]
|
c_dict[hooks_key] = cache[hooks_tuple]
|
||||||
|
|
||||||
|
|
||||||
def conditioning_set_values_with_hooks(conditioning, values={}, append_hooks=True):
|
def conditioning_set_values_with_hooks(conditioning, values={}, append_hooks=True):
|
||||||
c = []
|
c = []
|
||||||
hooks_combine_cache: dict[tuple[HookGroup, HookGroup], HookGroup] = {}
|
hooks_combine_cache: dict[tuple[HookGroup, HookGroup], HookGroup] = {}
|
||||||
@ -612,17 +640,20 @@ def conditioning_set_values_with_hooks(conditioning, values={}, append_hooks=Tru
|
|||||||
|
|
||||||
return c
|
return c
|
||||||
|
|
||||||
|
|
||||||
def set_hooks_for_conditioning(cond, hooks: HookGroup, append_hooks=True):
|
def set_hooks_for_conditioning(cond, hooks: HookGroup, append_hooks=True):
|
||||||
if hooks is None:
|
if hooks is None:
|
||||||
return cond
|
return cond
|
||||||
return conditioning_set_values_with_hooks(cond, {'hooks': hooks}, append_hooks=append_hooks)
|
return conditioning_set_values_with_hooks(cond, {'hooks': hooks}, append_hooks=append_hooks)
|
||||||
|
|
||||||
def set_timesteps_for_conditioning(cond, timestep_range: tuple[float,float]):
|
|
||||||
|
def set_timesteps_for_conditioning(cond, timestep_range: tuple[float, float]):
|
||||||
if timestep_range is None:
|
if timestep_range is None:
|
||||||
return cond
|
return cond
|
||||||
return conditioning_set_values(cond, {"start_percent": timestep_range[0],
|
return conditioning_set_values(cond, {"start_percent": timestep_range[0],
|
||||||
"end_percent": timestep_range[1]})
|
"end_percent": timestep_range[1]})
|
||||||
|
|
||||||
|
|
||||||
def set_mask_for_conditioning(cond, mask: torch.Tensor, set_cond_area: str, strength: float):
|
def set_mask_for_conditioning(cond, mask: torch.Tensor, set_cond_area: str, strength: float):
|
||||||
if mask is None:
|
if mask is None:
|
||||||
return cond
|
return cond
|
||||||
@ -635,20 +666,23 @@ def set_mask_for_conditioning(cond, mask: torch.Tensor, set_cond_area: str, stre
|
|||||||
'set_area_to_bounds': set_area_to_bounds,
|
'set_area_to_bounds': set_area_to_bounds,
|
||||||
'mask_strength': strength})
|
'mask_strength': strength})
|
||||||
|
|
||||||
|
|
||||||
def combine_conditioning(conds: list):
|
def combine_conditioning(conds: list):
|
||||||
combined_conds = []
|
combined_conds = []
|
||||||
for cond in conds:
|
for cond in conds:
|
||||||
combined_conds.extend(cond)
|
combined_conds.extend(cond)
|
||||||
return combined_conds
|
return combined_conds
|
||||||
|
|
||||||
|
|
||||||
def combine_with_new_conds(conds: list, new_conds: list):
|
def combine_with_new_conds(conds: list, new_conds: list):
|
||||||
combined_conds = []
|
combined_conds = []
|
||||||
for c, new_c in zip(conds, new_conds):
|
for c, new_c in zip(conds, new_conds):
|
||||||
combined_conds.append(combine_conditioning([c, new_c]))
|
combined_conds.append(combine_conditioning([c, new_c]))
|
||||||
return combined_conds
|
return combined_conds
|
||||||
|
|
||||||
|
|
||||||
def set_conds_props(conds: list, strength: float, set_cond_area: str,
|
def set_conds_props(conds: list, strength: float, set_cond_area: str,
|
||||||
mask: torch.Tensor=None, hooks: HookGroup=None, timesteps_range: tuple[float,float]=None, append_hooks=True):
|
mask: torch.Tensor = None, hooks: HookGroup = None, timesteps_range: tuple[float, float] = None, append_hooks=True):
|
||||||
final_conds = []
|
final_conds = []
|
||||||
for c in conds:
|
for c in conds:
|
||||||
# first, apply lora_hook to conditioning, if provided
|
# first, apply lora_hook to conditioning, if provided
|
||||||
@ -661,8 +695,9 @@ def set_conds_props(conds: list, strength: float, set_cond_area: str,
|
|||||||
final_conds.append(c)
|
final_conds.append(c)
|
||||||
return final_conds
|
return final_conds
|
||||||
|
|
||||||
def set_conds_props_and_combine(conds: list, new_conds: list, strength: float=1.0, set_cond_area: str="default",
|
|
||||||
mask: torch.Tensor=None, hooks: HookGroup=None, timesteps_range: tuple[float,float]=None, append_hooks=True):
|
def set_conds_props_and_combine(conds: list, new_conds: list, strength: float = 1.0, set_cond_area: str = "default",
|
||||||
|
mask: torch.Tensor = None, hooks: HookGroup = None, timesteps_range: tuple[float, float] = None, append_hooks=True):
|
||||||
combined_conds = []
|
combined_conds = []
|
||||||
for c, masked_c in zip(conds, new_conds):
|
for c, masked_c in zip(conds, new_conds):
|
||||||
# first, apply lora_hook to new conditioning, if provided
|
# first, apply lora_hook to new conditioning, if provided
|
||||||
@ -675,8 +710,9 @@ def set_conds_props_and_combine(conds: list, new_conds: list, strength: float=1.
|
|||||||
combined_conds.append(combine_conditioning([c, masked_c]))
|
combined_conds.append(combine_conditioning([c, masked_c]))
|
||||||
return combined_conds
|
return combined_conds
|
||||||
|
|
||||||
|
|
||||||
def set_default_conds_and_combine(conds: list, new_conds: list,
|
def set_default_conds_and_combine(conds: list, new_conds: list,
|
||||||
hooks: HookGroup=None, timesteps_range: tuple[float,float]=None, append_hooks=True):
|
hooks: HookGroup = None, timesteps_range: tuple[float, float] = None, append_hooks=True):
|
||||||
combined_conds = []
|
combined_conds = []
|
||||||
for c, new_c in zip(conds, new_conds):
|
for c, new_c in zip(conds, new_conds):
|
||||||
# first, apply lora_hook to new conditioning, if provided
|
# first, apply lora_hook to new conditioning, if provided
|
||||||
|
|||||||
@ -286,7 +286,7 @@ def sample_dpm_2(model, x, sigmas, extra_args=None, callback=None, disable=None,
|
|||||||
|
|
||||||
@torch.no_grad()
|
@torch.no_grad()
|
||||||
def sample_dpm_2_ancestral(model, x, sigmas, extra_args=None, callback=None, disable=None, eta=1., s_noise=1., noise_sampler=None):
|
def sample_dpm_2_ancestral(model, x, sigmas, extra_args=None, callback=None, disable=None, eta=1., s_noise=1., noise_sampler=None):
|
||||||
if isinstance(model.inner_model.inner_model.model_sampling, comfy.model_sampling.CONST):
|
if isinstance(model.inner_model.inner_model.model_sampling, model_sampling.CONST):
|
||||||
return sample_dpm_2_ancestral_RF(model, x, sigmas, extra_args, callback, disable, eta, s_noise, noise_sampler)
|
return sample_dpm_2_ancestral_RF(model, x, sigmas, extra_args, callback, disable, eta, s_noise, noise_sampler)
|
||||||
|
|
||||||
"""Ancestral sampling with DPM-Solver second-order steps."""
|
"""Ancestral sampling with DPM-Solver second-order steps."""
|
||||||
|
|||||||
@ -7,7 +7,7 @@ import torch
|
|||||||
PatchOffset = tuple[int, int, int]
|
PatchOffset = tuple[int, int, int]
|
||||||
PatchFunction = Any
|
PatchFunction = Any
|
||||||
PatchDictKey = str | tuple[str, PatchOffset] | tuple[str, PatchOffset, PatchFunction]
|
PatchDictKey = str | tuple[str, PatchOffset] | tuple[str, PatchOffset, PatchFunction]
|
||||||
PatchType = Literal["lora", "loha", "lokr", "glora", "diff", ""]
|
PatchType = Literal["lora", "loha", "lokr", "glora", "diff", "set", ""]
|
||||||
PatchDictValue = tuple[PatchType, tuple]
|
PatchDictValue = tuple[PatchType, tuple]
|
||||||
PatchDict = dict[PatchDictKey, PatchDictValue]
|
PatchDict = dict[PatchDictKey, PatchDictValue]
|
||||||
|
|
||||||
|
|||||||
@ -291,6 +291,7 @@ KNOWN_LORAS: Final[KnownDownloadables] = KnownDownloadables([
|
|||||||
CivitFile(model_id=211577, model_version_id=238349, filename="openxl_handsfix.safetensors"),
|
CivitFile(model_id=211577, model_version_id=238349, filename="openxl_handsfix.safetensors"),
|
||||||
CivitFile(model_id=324815, model_version_id=364137, filename="blur_control_xl_v1.safetensors"),
|
CivitFile(model_id=324815, model_version_id=364137, filename="blur_control_xl_v1.safetensors"),
|
||||||
CivitFile(model_id=47085, model_version_id=55199, filename="GoodHands-beta2.safetensors"),
|
CivitFile(model_id=47085, model_version_id=55199, filename="GoodHands-beta2.safetensors"),
|
||||||
|
HuggingFile("artificialguybr/pixelartredmond-1-5v-pixel-art-loras-for-sd-1-5", "PixelArtRedmond15V-PixelArt-PIXARFK.safetensors"),
|
||||||
HuggingFile("ByteDance/Hyper-SD", "Hyper-SDXL-12steps-CFG-lora.safetensors"),
|
HuggingFile("ByteDance/Hyper-SD", "Hyper-SDXL-12steps-CFG-lora.safetensors"),
|
||||||
HuggingFile("ByteDance/Hyper-SD", "Hyper-SD15-12steps-CFG-lora.safetensors"),
|
HuggingFile("ByteDance/Hyper-SD", "Hyper-SD15-12steps-CFG-lora.safetensors"),
|
||||||
HuggingFile("black-forest-labs/FLUX.1-Canny-dev-lora", "flux1-canny-dev-lora.safetensors"),
|
HuggingFile("black-forest-labs/FLUX.1-Canny-dev-lora", "flux1-canny-dev-lora.safetensors"),
|
||||||
|
|||||||
@ -29,13 +29,13 @@ import torch
|
|||||||
import torch.nn
|
import torch.nn
|
||||||
from humanize import naturalsize
|
from humanize import naturalsize
|
||||||
|
|
||||||
from . import hooks
|
|
||||||
from . import model_management, lora
|
from . import model_management, lora
|
||||||
from . import patcher_extension
|
from . import patcher_extension
|
||||||
from . import utils
|
from . import utils
|
||||||
from .component_model.deprecation import _deprecate_method
|
from .component_model.deprecation import _deprecate_method
|
||||||
from .comfy_types import UnetWrapperFunction
|
from .comfy_types import UnetWrapperFunction
|
||||||
from .float import stochastic_rounding
|
from .float import stochastic_rounding
|
||||||
|
from .hooks import EnumHookMode, _HookRef, HookGroup, EnumHookType, Hook, WeightHook, EnumWeightTarget
|
||||||
from .lora_types import PatchDict, PatchDictKey, PatchTuple, PatchWeightTuple, ModelPatchesDictValue
|
from .lora_types import PatchDict, PatchDictKey, PatchTuple, PatchWeightTuple, ModelPatchesDictValue
|
||||||
from .model_base import BaseModel
|
from .model_base import BaseModel
|
||||||
from .model_management_types import ModelManageable, MemoryMeasurements, ModelOptions
|
from .model_management_types import ModelManageable, MemoryMeasurements, ModelOptions
|
||||||
@ -224,14 +224,14 @@ class ModelPatcher(ModelManageable):
|
|||||||
self.skip_injection = False
|
self.skip_injection = False
|
||||||
self.injections: dict[str, list[PatcherInjection]] = {}
|
self.injections: dict[str, list[PatcherInjection]] = {}
|
||||||
|
|
||||||
self.hook_patches: dict[hooks._HookRef] = {}
|
self.hook_patches: dict[_HookRef] = {}
|
||||||
self.hook_patches_backup: dict[hooks._HookRef] = {}
|
self.hook_patches_backup: dict[_HookRef] = {}
|
||||||
self.hook_backup: dict[str, tuple[torch.Tensor, torch.device]] = {}
|
self.hook_backup: dict[str, tuple[torch.Tensor, torch.device]] = {}
|
||||||
self.cached_hook_patches: dict[hooks.HookGroup, dict[str, torch.Tensor]] = {}
|
self.cached_hook_patches: dict[HookGroup, dict[str, torch.Tensor | tuple[torch.Tensor, torch.device]]] = {}
|
||||||
self.current_hooks: Optional[hooks.HookGroup] = None
|
self.current_hooks: Optional[HookGroup] = None
|
||||||
self.forced_hooks: Optional[hooks.HookGroup] = None # NOTE: only used for CLIP at this time
|
self.forced_hooks: Optional[HookGroup] = None # NOTE: only used for CLIP at this time
|
||||||
self.is_clip = False
|
self.is_clip = False
|
||||||
self.hook_mode = hooks.EnumHookMode.MaxSpeed
|
self.hook_mode = EnumHookMode.MaxSpeed
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def model_options(self) -> ModelOptions:
|
def model_options(self) -> ModelOptions:
|
||||||
@ -980,10 +980,10 @@ class ModelPatcher(ModelManageable):
|
|||||||
self.hook_patches = self.hook_patches_backup
|
self.hook_patches = self.hook_patches_backup
|
||||||
self.hook_patches_backup = {}
|
self.hook_patches_backup = {}
|
||||||
|
|
||||||
def set_hook_mode(self, hook_mode: hooks.EnumHookMode):
|
def set_hook_mode(self, hook_mode: EnumHookMode):
|
||||||
self.hook_mode = hook_mode
|
self.hook_mode = hook_mode
|
||||||
|
|
||||||
def prepare_hook_patches_current_keyframe(self, t: torch.Tensor, hook_group: hooks.HookGroup):
|
def prepare_hook_patches_current_keyframe(self, t: torch.Tensor, hook_group: HookGroup):
|
||||||
curr_t = t[0]
|
curr_t = t[0]
|
||||||
reset_current_hooks = False
|
reset_current_hooks = False
|
||||||
for hook in hook_group.hooks:
|
for hook in hook_group.hooks:
|
||||||
@ -1003,16 +1003,16 @@ class ModelPatcher(ModelManageable):
|
|||||||
if reset_current_hooks:
|
if reset_current_hooks:
|
||||||
self.patch_hooks(None)
|
self.patch_hooks(None)
|
||||||
|
|
||||||
def register_all_hook_patches(self, hooks_dict: dict[hooks.EnumHookType, dict[hooks.Hook, None]], target: hooks.EnumWeightTarget, model_options: dict = None):
|
def register_all_hook_patches(self, hooks_dict: dict[EnumHookType, dict[Hook, None]], target: EnumWeightTarget, model_options: dict = None):
|
||||||
self.restore_hook_patches()
|
self.restore_hook_patches()
|
||||||
registered_hooks: list[hooks.Hook] = []
|
registered_hooks: list[Hook] = []
|
||||||
# handle WrapperHooks, if model_options provided
|
# handle WrapperHooks, if model_options provided
|
||||||
if model_options is not None:
|
if model_options is not None:
|
||||||
for hook in hooks_dict.get(hooks.EnumHookType.Wrappers, {}):
|
for hook in hooks_dict.get(EnumHookType.Wrappers, {}):
|
||||||
hook.add_hook_patches(self, model_options, target, registered_hooks)
|
hook.add_hook_patches(self, model_options, target, registered_hooks)
|
||||||
# handle WeightHooks
|
# handle WeightHooks
|
||||||
weight_hooks_to_register: list[hooks.WeightHook] = []
|
weight_hooks_to_register: list[WeightHook] = []
|
||||||
for hook in hooks_dict.get(hooks.EnumHookType.Weight, {}):
|
for hook in hooks_dict.get(EnumHookType.Weight, {}):
|
||||||
if hook.hook_ref not in self.hook_patches:
|
if hook.hook_ref not in self.hook_patches:
|
||||||
weight_hooks_to_register.append(hook)
|
weight_hooks_to_register.append(hook)
|
||||||
if len(weight_hooks_to_register) > 0:
|
if len(weight_hooks_to_register) > 0:
|
||||||
@ -1023,7 +1023,7 @@ class ModelPatcher(ModelManageable):
|
|||||||
for callback in self.get_all_callbacks(CallbacksMP.ON_REGISTER_ALL_HOOK_PATCHES):
|
for callback in self.get_all_callbacks(CallbacksMP.ON_REGISTER_ALL_HOOK_PATCHES):
|
||||||
callback(self, hooks_dict, target)
|
callback(self, hooks_dict, target)
|
||||||
|
|
||||||
def add_hook_patches(self, hook: hooks.WeightHook, patches, strength_patch=1.0, strength_model=1.0):
|
def add_hook_patches(self, hook: WeightHook, patches, strength_patch=1.0, strength_model=1.0):
|
||||||
with self.use_ejected():
|
with self.use_ejected():
|
||||||
# NOTE: this mirrors behavior of add_patches func
|
# NOTE: this mirrors behavior of add_patches func
|
||||||
current_hook_patches: dict[str, list] = self.hook_patches.get(hook.hook_ref, {})
|
current_hook_patches: dict[str, list] = self.hook_patches.get(hook.hook_ref, {})
|
||||||
@ -1050,7 +1050,7 @@ class ModelPatcher(ModelManageable):
|
|||||||
self.patches_uuid = uuid.uuid4()
|
self.patches_uuid = uuid.uuid4()
|
||||||
return list(p)
|
return list(p)
|
||||||
|
|
||||||
def get_combined_hook_patches(self, hooks: hooks.HookGroup):
|
def get_combined_hook_patches(self, hooks: HookGroup):
|
||||||
# combined_patches will contain weights of all relevant hooks, per key
|
# combined_patches will contain weights of all relevant hooks, per key
|
||||||
combined_patches = {}
|
combined_patches = {}
|
||||||
if hooks is not None:
|
if hooks is not None:
|
||||||
@ -1069,7 +1069,7 @@ class ModelPatcher(ModelManageable):
|
|||||||
combined_patches[key] = current_patches
|
combined_patches[key] = current_patches
|
||||||
return combined_patches
|
return combined_patches
|
||||||
|
|
||||||
def apply_hooks(self, hooks: hooks.HookGroup, transformer_options: dict = None, force_apply=False):
|
def apply_hooks(self, hooks: HookGroup, transformer_options: dict = None, force_apply=False):
|
||||||
# TODO: return transformer_options dict with any additions from hooks
|
# TODO: return transformer_options dict with any additions from hooks
|
||||||
if self.current_hooks == hooks and (not force_apply or (not self.is_clip and hooks is None)):
|
if self.current_hooks == hooks and (not force_apply or (not self.is_clip and hooks is None)):
|
||||||
return {}
|
return {}
|
||||||
@ -1078,13 +1078,13 @@ class ModelPatcher(ModelManageable):
|
|||||||
callback(self, hooks)
|
callback(self, hooks)
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
def patch_hooks(self, hooks: hooks.HookGroup):
|
def patch_hooks(self, hooks: HookGroup | None):
|
||||||
with self.use_ejected():
|
with self.use_ejected():
|
||||||
self.unpatch_hooks()
|
self.unpatch_hooks()
|
||||||
if hooks is not None:
|
if hooks is not None:
|
||||||
model_sd_keys = list(self.model_state_dict().keys())
|
model_sd_keys = list(self.model_state_dict().keys())
|
||||||
memory_counter = None
|
memory_counter = None
|
||||||
if self.hook_mode == hooks.EnumHookMode.MaxSpeed:
|
if self.hook_mode == EnumHookMode.MaxSpeed:
|
||||||
# TODO: minimum_counter should have a minimum that conforms to loaded model requirements
|
# TODO: minimum_counter should have a minimum that conforms to loaded model requirements
|
||||||
memory_counter = MemoryCounter(initial=model_management.get_free_memory(self.load_device),
|
memory_counter = MemoryCounter(initial=model_management.get_free_memory(self.load_device),
|
||||||
minimum=model_management.minimum_inference_memory() * 2)
|
minimum=model_management.minimum_inference_memory() * 2)
|
||||||
@ -1113,7 +1113,7 @@ class ModelPatcher(ModelManageable):
|
|||||||
if key not in self.hook_backup:
|
if key not in self.hook_backup:
|
||||||
weight: torch.Tensor = utils.get_attr(self.model, key)
|
weight: torch.Tensor = utils.get_attr(self.model, key)
|
||||||
target_device = self.offload_device
|
target_device = self.offload_device
|
||||||
if self.hook_mode == hooks.EnumHookMode.MaxSpeed:
|
if self.hook_mode == EnumHookMode.MaxSpeed:
|
||||||
used = memory_counter.use(weight)
|
used = memory_counter.use(weight)
|
||||||
if used:
|
if used:
|
||||||
target_device = weight.device
|
target_device = weight.device
|
||||||
@ -1124,7 +1124,7 @@ class ModelPatcher(ModelManageable):
|
|||||||
self.cached_hook_patches.clear()
|
self.cached_hook_patches.clear()
|
||||||
self.patch_hooks(None)
|
self.patch_hooks(None)
|
||||||
|
|
||||||
def patch_hook_weight_to_device(self, hooks: hooks.HookGroup, combined_patches: dict, key: str, original_weights: dict, memory_counter: MemoryCounter):
|
def patch_hook_weight_to_device(self, hooks: HookGroup, combined_patches: dict, key: str, original_weights: dict, memory_counter: MemoryCounter):
|
||||||
if key not in combined_patches:
|
if key not in combined_patches:
|
||||||
return
|
return
|
||||||
|
|
||||||
@ -1132,7 +1132,7 @@ class ModelPatcher(ModelManageable):
|
|||||||
weight: torch.Tensor
|
weight: torch.Tensor
|
||||||
if key not in self.hook_backup:
|
if key not in self.hook_backup:
|
||||||
target_device = self.offload_device
|
target_device = self.offload_device
|
||||||
if self.hook_mode == hooks.EnumHookMode.MaxSpeed:
|
if self.hook_mode == EnumHookMode.MaxSpeed:
|
||||||
used = memory_counter.use(weight)
|
used = memory_counter.use(weight)
|
||||||
if used:
|
if used:
|
||||||
target_device = weight.device
|
target_device = weight.device
|
||||||
@ -1151,7 +1151,7 @@ class ModelPatcher(ModelManageable):
|
|||||||
utils.copy_to_param(self.model, key, out_weight)
|
utils.copy_to_param(self.model, key, out_weight)
|
||||||
else:
|
else:
|
||||||
set_func(out_weight, inplace_update=True, seed=string_to_seed(key))
|
set_func(out_weight, inplace_update=True, seed=string_to_seed(key))
|
||||||
if self.hook_mode == hooks.EnumHookMode.MaxSpeed:
|
if self.hook_mode == EnumHookMode.MaxSpeed:
|
||||||
# TODO: disable caching if not enough system RAM to do so
|
# TODO: disable caching if not enough system RAM to do so
|
||||||
target_device = self.offload_device
|
target_device = self.offload_device
|
||||||
used = memory_counter.use(weight)
|
used = memory_counter.use(weight)
|
||||||
|
|||||||
@ -1003,14 +1003,16 @@ class CLIPVisionEncode:
|
|||||||
def INPUT_TYPES(s):
|
def INPUT_TYPES(s):
|
||||||
return {"required": { "clip_vision": ("CLIP_VISION",),
|
return {"required": { "clip_vision": ("CLIP_VISION",),
|
||||||
"image": ("IMAGE",),
|
"image": ("IMAGE",),
|
||||||
"crop": (["center", "none"],)
|
},
|
||||||
}}
|
"optional": {
|
||||||
|
"crop": (["center", "none"], {"default": "center"})
|
||||||
|
}}
|
||||||
RETURN_TYPES = ("CLIP_VISION_OUTPUT",)
|
RETURN_TYPES = ("CLIP_VISION_OUTPUT",)
|
||||||
FUNCTION = "encode"
|
FUNCTION = "encode"
|
||||||
|
|
||||||
CATEGORY = "conditioning"
|
CATEGORY = "conditioning"
|
||||||
|
|
||||||
def encode(self, clip_vision, image, crop):
|
def encode(self, clip_vision, image, crop="center"):
|
||||||
crop_image = True
|
crop_image = True
|
||||||
if crop != "center":
|
if crop != "center":
|
||||||
crop_image = False
|
crop_image = False
|
||||||
@ -1040,14 +1042,16 @@ class StyleModelApply:
|
|||||||
"style_model": ("STYLE_MODEL", ),
|
"style_model": ("STYLE_MODEL", ),
|
||||||
"clip_vision_output": ("CLIP_VISION_OUTPUT", ),
|
"clip_vision_output": ("CLIP_VISION_OUTPUT", ),
|
||||||
"strength": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 10.0, "step": 0.001}),
|
"strength": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 10.0, "step": 0.001}),
|
||||||
"strength_type": (["multiply"], ),
|
},
|
||||||
|
"optional": {
|
||||||
|
"strength_type": (["multiply"], {"default": "multiply"}),
|
||||||
}}
|
}}
|
||||||
RETURN_TYPES = ("CONDITIONING",)
|
RETURN_TYPES = ("CONDITIONING",)
|
||||||
FUNCTION = "apply_stylemodel"
|
FUNCTION = "apply_stylemodel"
|
||||||
|
|
||||||
CATEGORY = "conditioning/style_model"
|
CATEGORY = "conditioning/style_model"
|
||||||
|
|
||||||
def apply_stylemodel(self, clip_vision_output, style_model, conditioning, strength, strength_type):
|
def apply_stylemodel(self, clip_vision_output, style_model, conditioning, strength=1.0, strength_type="multiply"):
|
||||||
cond = style_model.get_cond(clip_vision_output).flatten(start_dim=0, end_dim=1).unsqueeze(dim=0)
|
cond = style_model.get_cond(clip_vision_output).flatten(start_dim=0, end_dim=1).unsqueeze(dim=0)
|
||||||
if strength_type == "multiply":
|
if strength_type == "multiply":
|
||||||
cond *= strength
|
cond *= strength
|
||||||
|
|||||||
@ -1,11 +1,11 @@
|
|||||||
|
import numpy as np
|
||||||
import torch
|
import torch
|
||||||
|
|
||||||
from . import model_management
|
from . import model_management
|
||||||
from . import samplers
|
from . import samplers
|
||||||
from . import utils
|
from . import utils
|
||||||
from . import conds
|
from .component_model.deprecation import _deprecate_method
|
||||||
import math
|
|
||||||
import numpy as np
|
|
||||||
import logging
|
|
||||||
|
|
||||||
def prepare_noise(latent_image, seed, noise_inds=None):
|
def prepare_noise(latent_image, seed, noise_inds=None):
|
||||||
"""
|
"""
|
||||||
@ -32,12 +32,14 @@ def fix_empty_latent_channels(model, latent_image):
|
|||||||
latent_image = utils.repeat_to_batch_size(latent_image, latent_channels, dim=1)
|
latent_image = utils.repeat_to_batch_size(latent_image, latent_channels, dim=1)
|
||||||
return latent_image
|
return latent_image
|
||||||
|
|
||||||
|
@_deprecate_method(version="0.3.2", message="Warning: comfy.sample.prepare_sampling isn't used anymore and can be removed")
|
||||||
def prepare_sampling(model, noise_shape, positive, negative, noise_mask):
|
def prepare_sampling(model, noise_shape, positive, negative, noise_mask):
|
||||||
logging.warning("Warning: comfy.sample.prepare_sampling isn't used anymore and can be removed")
|
pass
|
||||||
return model, positive, negative, noise_mask, []
|
return model, positive, negative, noise_mask, []
|
||||||
|
|
||||||
|
@_deprecate_method(version="0.3.2", message="Warning: comfy.sample.cleanup_additional_models isn't used anymore and can be removed")
|
||||||
def cleanup_additional_models(models):
|
def cleanup_additional_models(models):
|
||||||
logging.warning("Warning: comfy.sample.cleanup_additional_models isn't used anymore and can be removed")
|
pass
|
||||||
|
|
||||||
def sample(model, noise, steps, cfg, sampler_name, scheduler, positive, negative, latent_image, denoise=1.0, disable_noise=False, start_step=None, last_step=None, force_full_denoise=False, noise_mask=None, sigmas=None, callback=None, disable_pbar=False, seed=None):
|
def sample(model, noise, steps, cfg, sampler_name, scheduler, positive, negative, latent_image, denoise=1.0, disable_noise=False, start_step=None, last_step=None, force_full_denoise=False, noise_mask=None, sigmas=None, callback=None, disable_pbar=False, seed=None):
|
||||||
sampler = samplers.KSampler(model, steps=steps, device=model.load_device, sampler=sampler_name, scheduler=scheduler, denoise=denoise, model_options=model.model_options)
|
sampler = samplers.KSampler(model, steps=steps, device=model.load_device, sampler=sampler_name, scheduler=scheduler, denoise=denoise, model_options=model.model_options)
|
||||||
|
|||||||
@ -2,10 +2,10 @@ import uuid
|
|||||||
|
|
||||||
from .controlnet import ControlBase
|
from .controlnet import ControlBase
|
||||||
from . import conds
|
from . import conds
|
||||||
from . import hooks
|
|
||||||
from . import model_management
|
from . import model_management
|
||||||
from . import patcher_extension
|
from . import patcher_extension
|
||||||
from . import utils
|
from . import utils
|
||||||
|
from .hooks import EnumHookType, EnumWeightTarget, HookGroup, Hook
|
||||||
from .model_base import BaseModel
|
from .model_base import BaseModel
|
||||||
from .model_patcher import ModelPatcher
|
from .model_patcher import ModelPatcher
|
||||||
|
|
||||||
@ -25,13 +25,13 @@ def get_models_from_cond(cond, model_type):
|
|||||||
return models
|
return models
|
||||||
|
|
||||||
|
|
||||||
def get_hooks_from_cond(cond, hooks_dict: dict[hooks.EnumHookType, dict[hooks.Hook, None]]):
|
def get_hooks_from_cond(cond, hooks_dict: dict[EnumHookType, dict[Hook, None]]):
|
||||||
# get hooks from conds, and collect cnets so they can be checked for extra_hooks
|
# get hooks from conds, and collect cnets so they can be checked for extra_hooks
|
||||||
cnets: list[ControlBase] = []
|
cnets: list[ControlBase] = []
|
||||||
for c in cond:
|
for c in cond:
|
||||||
if 'hooks' in c:
|
if 'hooks' in c:
|
||||||
for hook in c['hooks'].hooks:
|
for hook in c['hooks'].hooks:
|
||||||
hook: hooks.Hook
|
hook: Hook
|
||||||
with_type = hooks_dict.setdefault(hook.hook_type, {})
|
with_type = hooks_dict.setdefault(hook.hook_type, {})
|
||||||
with_type[hook] = None
|
with_type[hook] = None
|
||||||
if 'control' in c:
|
if 'control' in c:
|
||||||
@ -48,7 +48,7 @@ def get_hooks_from_cond(cond, hooks_dict: dict[hooks.EnumHookType, dict[hooks.Ho
|
|||||||
cnets = set(cnets)
|
cnets = set(cnets)
|
||||||
for base_cnet in cnets:
|
for base_cnet in cnets:
|
||||||
get_extra_hooks_from_cnet(base_cnet, hooks_list)
|
get_extra_hooks_from_cnet(base_cnet, hooks_list)
|
||||||
extra_hooks = hooks.HookGroup.combine_all_hooks(hooks_list)
|
extra_hooks = HookGroup.combine_all_hooks(hooks_list)
|
||||||
if extra_hooks is not None:
|
if extra_hooks is not None:
|
||||||
for hook in extra_hooks.hooks:
|
for hook in extra_hooks.hooks:
|
||||||
with_type = hooks_dict.setdefault(hook.hook_type, {})
|
with_type = hooks_dict.setdefault(hook.hook_type, {})
|
||||||
@ -76,7 +76,7 @@ def get_additional_models(conds, dtype):
|
|||||||
cnets: list[ControlBase] = []
|
cnets: list[ControlBase] = []
|
||||||
gligen = []
|
gligen = []
|
||||||
add_models = []
|
add_models = []
|
||||||
hooks: dict[hooks.EnumHookType, dict[hooks.Hook, None]] = {}
|
hooks: dict[EnumHookType, dict[Hook, None]] = {}
|
||||||
|
|
||||||
for k in conds:
|
for k in conds:
|
||||||
cnets += get_models_from_cond(conds[k], "control")
|
cnets += get_models_from_cond(conds[k], "control")
|
||||||
@ -93,7 +93,7 @@ def get_additional_models(conds, dtype):
|
|||||||
inference_memory += m.inference_memory_requirements(dtype)
|
inference_memory += m.inference_memory_requirements(dtype)
|
||||||
|
|
||||||
gligen = [x[1] for x in gligen]
|
gligen = [x[1] for x in gligen]
|
||||||
hook_models = [x.model for x in hooks.get(hooks.EnumHookType.AddModels, {}).keys()]
|
hook_models = [x.model for x in hooks.get(EnumHookType.AddModels, {}).keys()]
|
||||||
models = control_models + gligen + add_models + hook_models
|
models = control_models + gligen + add_models + hook_models
|
||||||
|
|
||||||
return models, inference_memory
|
return models, inference_memory
|
||||||
@ -138,4 +138,4 @@ def prepare_model_patcher(model: 'ModelPatcher', conds, model_options: dict):
|
|||||||
model_options["transformer_options"]["wrappers"] = patcher_extension.copy_nested_dicts(model.wrappers)
|
model_options["transformer_options"]["wrappers"] = patcher_extension.copy_nested_dicts(model.wrappers)
|
||||||
model_options["transformer_options"]["callbacks"] = patcher_extension.copy_nested_dicts(model.callbacks)
|
model_options["transformer_options"]["callbacks"] = patcher_extension.copy_nested_dicts(model.callbacks)
|
||||||
# register hooks on model/model_options
|
# register hooks on model/model_options
|
||||||
model.register_all_hook_patches(hooks, hooks.EnumWeightTarget.Model, model_options)
|
model.register_all_hook_patches(hooks, EnumWeightTarget.Model, model_options)
|
||||||
|
|||||||
@ -8,7 +8,6 @@ import numpy
|
|||||||
import scipy.stats
|
import scipy.stats
|
||||||
import torch
|
import torch
|
||||||
|
|
||||||
from . import hooks
|
|
||||||
from . import model_management
|
from . import model_management
|
||||||
from . import model_patcher
|
from . import model_patcher
|
||||||
from . import patcher_extension
|
from . import patcher_extension
|
||||||
@ -16,6 +15,7 @@ from . import sampler_helpers
|
|||||||
from .component_model.deprecation import _deprecate_method
|
from .component_model.deprecation import _deprecate_method
|
||||||
from .controlnet import ControlBase
|
from .controlnet import ControlBase
|
||||||
from .extra_samplers import uni_pc
|
from .extra_samplers import uni_pc
|
||||||
|
from .hooks import EnumHookMode, HookGroup
|
||||||
from .k_diffusion import sampling as k_diffusion_sampling
|
from .k_diffusion import sampling as k_diffusion_sampling
|
||||||
from .model_base import BaseModel
|
from .model_base import BaseModel
|
||||||
from .model_management_types import ModelOptions
|
from .model_management_types import ModelOptions
|
||||||
@ -157,7 +157,7 @@ def cond_cat(c_list):
|
|||||||
return out
|
return out
|
||||||
|
|
||||||
|
|
||||||
def finalize_default_conds(model: BaseModel, hooked_to_run: dict[hooks.HookGroup, list[tuple[tuple, int]]], default_conds: list[list[dict]], x_in, timestep):
|
def finalize_default_conds(model: BaseModel, hooked_to_run: dict[HookGroup, list[tuple[tuple, int]]], default_conds: list[list[dict]], x_in, timestep):
|
||||||
# need to figure out remaining unmasked area for conds
|
# need to figure out remaining unmasked area for conds
|
||||||
default_mults = []
|
default_mults = []
|
||||||
for _ in default_conds:
|
for _ in default_conds:
|
||||||
@ -213,7 +213,7 @@ def _calc_cond_batch(model: BaseModel, conds, x_in: torch.Tensor, timestep: torc
|
|||||||
out_conds = []
|
out_conds = []
|
||||||
out_counts = []
|
out_counts = []
|
||||||
# separate conds by matching hooks
|
# separate conds by matching hooks
|
||||||
hooked_to_run: dict[hooks.HookGroup, list[tuple[tuple, int]]] = {}
|
hooked_to_run: dict[HookGroup, list[tuple[tuple, int]]] = {}
|
||||||
default_conds = []
|
default_conds = []
|
||||||
has_default_conds = False
|
has_default_conds = False
|
||||||
|
|
||||||
@ -822,14 +822,14 @@ def process_conds(model, noise, conds, device, latent_image=None, denoise_mask=N
|
|||||||
|
|
||||||
def preprocess_conds_hooks(conds: dict[str, list[dict[str]]]):
|
def preprocess_conds_hooks(conds: dict[str, list[dict[str]]]):
|
||||||
# determine which ControlNets have extra_hooks that should be combined with normal hooks
|
# determine which ControlNets have extra_hooks that should be combined with normal hooks
|
||||||
hook_replacement: dict[tuple[ControlBase, hooks.HookGroup], list[dict]] = {}
|
hook_replacement: dict[tuple[ControlBase, HookGroup], list[dict]] = {}
|
||||||
for k in conds:
|
for k in conds:
|
||||||
for kk in conds[k]:
|
for kk in conds[k]:
|
||||||
if 'control' in kk:
|
if 'control' in kk:
|
||||||
control: 'ControlBase' = kk['control']
|
control: 'ControlBase' = kk['control']
|
||||||
extra_hooks = control.get_extra_hooks()
|
extra_hooks = control.get_extra_hooks()
|
||||||
if len(extra_hooks) > 0:
|
if len(extra_hooks) > 0:
|
||||||
hooks: hooks.HookGroup = kk.get('hooks', None)
|
hooks: HookGroup = kk.get('hooks', None)
|
||||||
to_replace = hook_replacement.setdefault((control, hooks), [])
|
to_replace = hook_replacement.setdefault((control, hooks), [])
|
||||||
to_replace.append(kk)
|
to_replace.append(kk)
|
||||||
# if nothing to replace, do nothing
|
# if nothing to replace, do nothing
|
||||||
@ -841,7 +841,7 @@ def preprocess_conds_hooks(conds: dict[str, list[dict[str]]]):
|
|||||||
for key, conds_to_modify in hook_replacement.items():
|
for key, conds_to_modify in hook_replacement.items():
|
||||||
control = key[0]
|
control = key[0]
|
||||||
hooks = key[1]
|
hooks = key[1]
|
||||||
hooks = hooks.HookGroup.combine_all_hooks(control.get_extra_hooks() + [hooks])
|
hooks = HookGroup.combine_all_hooks(control.get_extra_hooks() + [hooks])
|
||||||
# if combined hooks are not None, set as new hooks for all relevant conds
|
# if combined hooks are not None, set as new hooks for all relevant conds
|
||||||
if hooks is not None:
|
if hooks is not None:
|
||||||
for cond in conds_to_modify:
|
for cond in conds_to_modify:
|
||||||
@ -925,14 +925,14 @@ class CFGGuider:
|
|||||||
for k in self.original_conds:
|
for k in self.original_conds:
|
||||||
self.conds[k] = list(map(lambda a: a.copy(), self.original_conds[k]))
|
self.conds[k] = list(map(lambda a: a.copy(), self.original_conds[k]))
|
||||||
preprocess_conds_hooks(self.conds)
|
preprocess_conds_hooks(self.conds)
|
||||||
|
assert self.model_patcher is not None
|
||||||
|
orig_model_options = self.model_options
|
||||||
|
orig_hook_mode = self.model_patcher.hook_mode
|
||||||
try:
|
try:
|
||||||
orig_model_options = self.model_options
|
|
||||||
self.model_options = model_patcher.create_model_options_clone(self.model_options)
|
self.model_options = model_patcher.create_model_options_clone(self.model_options)
|
||||||
# if one hook type (or just None), then don't bother caching weights for hooks (will never change after first step)
|
# if one hook type (or just None), then don't bother caching weights for hooks (will never change after first step)
|
||||||
orig_hook_mode = self.model_patcher.hook_mode
|
|
||||||
if get_total_hook_groups_in_conds(self.conds) <= 1:
|
if get_total_hook_groups_in_conds(self.conds) <= 1:
|
||||||
self.model_patcher.hook_mode = hooks.EnumHookMode.MinVram
|
self.model_patcher.hook_mode = EnumHookMode.MinVram
|
||||||
sampler_helpers.prepare_model_patcher(self.model_patcher, self.conds, self.model_options)
|
sampler_helpers.prepare_model_patcher(self.model_patcher, self.conds, self.model_options)
|
||||||
executor = patcher_extension.WrapperExecutor.new_class_executor(
|
executor = patcher_extension.WrapperExecutor.new_class_executor(
|
||||||
self.outer_sample,
|
self.outer_sample,
|
||||||
|
|||||||
@ -20,7 +20,7 @@ from . import model_sampling
|
|||||||
from . import sd1_clip
|
from . import sd1_clip
|
||||||
from . import sdxl_clip
|
from . import sdxl_clip
|
||||||
from . import utils
|
from . import utils
|
||||||
from . import hooks
|
from .hooks import EnumHookMode
|
||||||
from .ldm.audio.autoencoder import AudioOobleckVAE
|
from .ldm.audio.autoencoder import AudioOobleckVAE
|
||||||
from .ldm.cascade.stage_a import StageA
|
from .ldm.cascade.stage_a import StageA
|
||||||
from .ldm.cascade.stage_c_coder import StageC_coder
|
from .ldm.cascade.stage_c_coder import StageC_coder
|
||||||
@ -41,6 +41,7 @@ from .text_encoders import lt
|
|||||||
from .text_encoders import sa_t5
|
from .text_encoders import sa_t5
|
||||||
from .text_encoders import sd2_clip
|
from .text_encoders import sd2_clip
|
||||||
from .text_encoders import sd3_clip
|
from .text_encoders import sd3_clip
|
||||||
|
from .utils import ProgressBar
|
||||||
|
|
||||||
|
|
||||||
def load_lora_for_models(model, clip, _lora, strength_model, strength_clip):
|
def load_lora_for_models(model, clip, _lora, strength_model, strength_clip):
|
||||||
@ -108,7 +109,7 @@ class CLIP:
|
|||||||
|
|
||||||
self.tokenizer: "sd1_clip.SD1Tokenizer" = tokenizer(embedding_directory=embedding_directory, tokenizer_data=tokenizer_data)
|
self.tokenizer: "sd1_clip.SD1Tokenizer" = tokenizer(embedding_directory=embedding_directory, tokenizer_data=tokenizer_data)
|
||||||
self.patcher = model_patcher.ModelPatcher(self.cond_stage_model, load_device=load_device, offload_device=offload_device)
|
self.patcher = model_patcher.ModelPatcher(self.cond_stage_model, load_device=load_device, offload_device=offload_device)
|
||||||
self.patcher.hook_mode = hooks.EnumHookMode.MinVram
|
self.patcher.hook_mode = EnumHookMode.MinVram
|
||||||
self.patcher.is_clip = True
|
self.patcher.is_clip = True
|
||||||
self.apply_hooks_to_conds = None
|
self.apply_hooks_to_conds = None
|
||||||
if params['device'] == load_device:
|
if params['device'] == load_device:
|
||||||
|
|||||||
58
comfy/web/assets/DownloadGitView-DZIv7F1e.js
generated
vendored
Normal file
58
comfy/web/assets/DownloadGitView-DZIv7F1e.js
generated
vendored
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
var __defProp = Object.defineProperty;
|
||||||
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
||||||
|
import { a as defineComponent, f as openBlock, g as createElementBlock, A as createBaseVNode, a6 as toDisplayString, h as createVNode, z as unref, D as script, bQ as useRouter } from "./index-BQYg0VNJ.js";
|
||||||
|
const _hoisted_1 = { class: "font-sans w-screen h-screen mx-0 grid place-items-center justify-center items-center text-neutral-900 bg-neutral-300 pointer-events-auto" };
|
||||||
|
const _hoisted_2 = { class: "col-start-1 h-screen row-start-1 place-content-center mx-auto overflow-y-auto" };
|
||||||
|
const _hoisted_3 = { class: "max-w-screen-sm flex flex-col gap-8 p-8 bg-[url('/assets/images/Git-Logo-White.svg')] bg-no-repeat bg-right-top bg-origin-padding" };
|
||||||
|
const _hoisted_4 = { class: "mt-24 text-4xl font-bold text-red-500" };
|
||||||
|
const _hoisted_5 = { class: "space-y-4" };
|
||||||
|
const _hoisted_6 = { class: "text-xl" };
|
||||||
|
const _hoisted_7 = { class: "text-xl" };
|
||||||
|
const _hoisted_8 = { class: "text-m" };
|
||||||
|
const _hoisted_9 = { class: "flex gap-4 flex-row-reverse" };
|
||||||
|
const _sfc_main = /* @__PURE__ */ defineComponent({
|
||||||
|
__name: "DownloadGitView",
|
||||||
|
setup(__props) {
|
||||||
|
const openGitDownloads = /* @__PURE__ */ __name(() => {
|
||||||
|
window.open("https://git-scm.com/downloads/", "_blank");
|
||||||
|
}, "openGitDownloads");
|
||||||
|
const skipGit = /* @__PURE__ */ __name(() => {
|
||||||
|
console.warn("pushing");
|
||||||
|
const router = useRouter();
|
||||||
|
router.push("install");
|
||||||
|
}, "skipGit");
|
||||||
|
return (_ctx, _cache) => {
|
||||||
|
return openBlock(), createElementBlock("div", _hoisted_1, [
|
||||||
|
createBaseVNode("div", _hoisted_2, [
|
||||||
|
createBaseVNode("div", _hoisted_3, [
|
||||||
|
createBaseVNode("h1", _hoisted_4, toDisplayString(_ctx.$t("downloadGit.title")), 1),
|
||||||
|
createBaseVNode("div", _hoisted_5, [
|
||||||
|
createBaseVNode("p", _hoisted_6, toDisplayString(_ctx.$t("downloadGit.message")), 1),
|
||||||
|
createBaseVNode("p", _hoisted_7, toDisplayString(_ctx.$t("downloadGit.instructions")), 1),
|
||||||
|
createBaseVNode("p", _hoisted_8, toDisplayString(_ctx.$t("downloadGit.warning")), 1)
|
||||||
|
]),
|
||||||
|
createBaseVNode("div", _hoisted_9, [
|
||||||
|
createVNode(unref(script), {
|
||||||
|
label: _ctx.$t("downloadGit.gitWebsite"),
|
||||||
|
icon: "pi pi-external-link",
|
||||||
|
"icon-pos": "right",
|
||||||
|
onClick: openGitDownloads,
|
||||||
|
severity: "primary"
|
||||||
|
}, null, 8, ["label"]),
|
||||||
|
createVNode(unref(script), {
|
||||||
|
label: _ctx.$t("downloadGit.skip"),
|
||||||
|
icon: "pi pi-exclamation-triangle",
|
||||||
|
onClick: skipGit,
|
||||||
|
severity: "secondary"
|
||||||
|
}, null, 8, ["label"])
|
||||||
|
])
|
||||||
|
])
|
||||||
|
])
|
||||||
|
]);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
export {
|
||||||
|
_sfc_main as default
|
||||||
|
};
|
||||||
|
//# sourceMappingURL=DownloadGitView-DZIv7F1e.js.map
|
||||||
1
comfy/web/assets/DownloadGitView-DZIv7F1e.js.map
generated
vendored
Normal file
1
comfy/web/assets/DownloadGitView-DZIv7F1e.js.map
generated
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"version":3,"file":"DownloadGitView-DZIv7F1e.js","sources":["../../src/views/DownloadGitView.vue"],"sourcesContent":["<template>\n <div\n class=\"font-sans w-screen h-screen mx-0 grid place-items-center justify-center items-center text-neutral-900 bg-neutral-300 pointer-events-auto\"\n >\n <div\n class=\"col-start-1 h-screen row-start-1 place-content-center mx-auto overflow-y-auto\"\n >\n <div\n class=\"max-w-screen-sm flex flex-col gap-8 p-8 bg-[url('/assets/images/Git-Logo-White.svg')] bg-no-repeat bg-right-top bg-origin-padding\"\n >\n <!-- Header -->\n <h1 class=\"mt-24 text-4xl font-bold text-red-500\">\n {{ $t('downloadGit.title') }}\n </h1>\n\n <!-- Message -->\n <div class=\"space-y-4\">\n <p class=\"text-xl\">\n {{ $t('downloadGit.message') }}\n </p>\n <p class=\"text-xl\">\n {{ $t('downloadGit.instructions') }}\n </p>\n <p class=\"text-m\">\n {{ $t('downloadGit.warning') }}\n </p>\n </div>\n\n <!-- Actions -->\n <div class=\"flex gap-4 flex-row-reverse\">\n <Button\n :label=\"$t('downloadGit.gitWebsite')\"\n icon=\"pi pi-external-link\"\n icon-pos=\"right\"\n @click=\"openGitDownloads\"\n severity=\"primary\"\n />\n <Button\n :label=\"$t('downloadGit.skip')\"\n icon=\"pi pi-exclamation-triangle\"\n @click=\"skipGit\"\n severity=\"secondary\"\n />\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport Button from 'primevue/button'\nimport { useRouter } from 'vue-router'\n\nconst openGitDownloads = () => {\n window.open('https://git-scm.com/downloads/', '_blank')\n}\n\nconst skipGit = () => {\n console.warn('pushing')\n const router = useRouter()\n router.push('install')\n}\n</script>\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AAqDA,UAAM,mBAAmB,6BAAM;AACtB,aAAA,KAAK,kCAAkC,QAAQ;AAAA,IACxD,GAFyB;AAIzB,UAAM,UAAU,6BAAM;AACpB,cAAQ,KAAK,SAAS;AACtB,YAAM,SAAS,UAAU;AACzB,aAAO,KAAK,SAAS;AAAA,IACvB,GAJgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
||||||
1
comfy/web/assets/ExtensionPanel-DsD42OtO.js.map
generated
vendored
1
comfy/web/assets/ExtensionPanel-DsD42OtO.js.map
generated
vendored
@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"ExtensionPanel-DsD42OtO.js","sources":["../../src/components/dialog/content/setting/ExtensionPanel.vue"],"sourcesContent":["<template>\n <PanelTemplate value=\"Extension\" class=\"extension-panel\">\n <template #header>\n <SearchBox\n v-model=\"filters['global'].value\"\n :placeholder=\"$t('searchExtensions') + '...'\"\n />\n <Message v-if=\"hasChanges\" severity=\"info\" pt:text=\"w-full\">\n <ul>\n <li v-for=\"ext in changedExtensions\" :key=\"ext.name\">\n <span>\n {{ extensionStore.isExtensionEnabled(ext.name) ? '[-]' : '[+]' }}\n </span>\n {{ ext.name }}\n </li>\n </ul>\n <div class=\"flex justify-end\">\n <Button\n :label=\"$t('reloadToApplyChanges')\"\n @click=\"applyChanges\"\n outlined\n severity=\"danger\"\n />\n </div>\n </Message>\n </template>\n <DataTable\n :value=\"extensionStore.extensions\"\n stripedRows\n size=\"small\"\n :filters=\"filters\"\n >\n <Column field=\"name\" :header=\"$t('extensionName')\" sortable></Column>\n <Column\n :pt=\"{\n bodyCell: 'flex items-center justify-end'\n }\"\n >\n <template #body=\"slotProps\">\n <ToggleSwitch\n v-model=\"editingEnabledExtensions[slotProps.data.name]\"\n @change=\"updateExtensionStatus\"\n />\n </template>\n </Column>\n </DataTable>\n </PanelTemplate>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, onMounted } from 'vue'\nimport { useExtensionStore } from '@/stores/extensionStore'\nimport { useSettingStore } from '@/stores/settingStore'\nimport DataTable from 'primevue/datatable'\nimport Column from 'primevue/column'\nimport ToggleSwitch from 'primevue/toggleswitch'\nimport Button from 'primevue/button'\nimport Message from 'primevue/message'\nimport { FilterMatchMode } from '@primevue/core/api'\nimport PanelTemplate from './PanelTemplate.vue'\nimport SearchBox from '@/components/common/SearchBox.vue'\n\nconst filters = ref({\n global: { value: '', matchMode: FilterMatchMode.CONTAINS }\n})\n\nconst extensionStore = useExtensionStore()\nconst settingStore = useSettingStore()\n\nconst editingEnabledExtensions = ref<Record<string, boolean>>({})\n\nonMounted(() => {\n extensionStore.extensions.forEach((ext) => {\n editingEnabledExtensions.value[ext.name] =\n extensionStore.isExtensionEnabled(ext.name)\n })\n})\n\nconst changedExtensions = computed(() => {\n return extensionStore.extensions.filter(\n (ext) =>\n editingEnabledExtensions.value[ext.name] !==\n extensionStore.isExtensionEnabled(ext.name)\n )\n})\n\nconst hasChanges = computed(() => {\n return changedExtensions.value.length > 0\n})\n\nconst updateExtensionStatus = () => {\n const editingDisabledExtensionNames = Object.entries(\n editingEnabledExtensions.value\n )\n .filter(([_, enabled]) => !enabled)\n .map(([name]) => name)\n\n settingStore.set('Comfy.Extension.Disabled', [\n ...extensionStore.inactiveDisabledExtensionNames,\n ...editingDisabledExtensionNames\n ])\n}\n\nconst applyChanges = () => {\n // Refresh the page to apply changes\n window.location.reload()\n}\n</script>\n"],"names":[],"mappings":";;;;;;;;;AA8DA,UAAM,UAAU,IAAI;AAAA,MAClB,QAAQ,EAAE,OAAO,IAAI,WAAW,gBAAgB,SAAS;AAAA,IAAA,CAC1D;AAED,UAAM,iBAAiB;AACvB,UAAM,eAAe;AAEf,UAAA,2BAA2B,IAA6B,CAAA,CAAE;AAEhE,cAAU,MAAM;AACC,qBAAA,WAAW,QAAQ,CAAC,QAAQ;AACzC,iCAAyB,MAAM,IAAI,IAAI,IACrC,eAAe,mBAAmB,IAAI,IAAI;AAAA,MAAA,CAC7C;AAAA,IAAA,CACF;AAEK,UAAA,oBAAoB,SAAS,MAAM;AACvC,aAAO,eAAe,WAAW;AAAA,QAC/B,CAAC,QACC,yBAAyB,MAAM,IAAI,IAAI,MACvC,eAAe,mBAAmB,IAAI,IAAI;AAAA,MAAA;AAAA,IAC9C,CACD;AAEK,UAAA,aAAa,SAAS,MAAM;AACzB,aAAA,kBAAkB,MAAM,SAAS;AAAA,IAAA,CACzC;AAED,UAAM,wBAAwB,6BAAM;AAClC,YAAM,gCAAgC,OAAO;AAAA,QAC3C,yBAAyB;AAAA,MAExB,EAAA,OAAO,CAAC,CAAC,GAAG,OAAO,MAAM,CAAC,OAAO,EACjC,IAAI,CAAC,CAAC,IAAI,MAAM,IAAI;AAEvB,mBAAa,IAAI,4BAA4B;AAAA,QAC3C,GAAG,eAAe;AAAA,QAClB,GAAG;AAAA,MAAA,CACJ;AAAA,IAAA,GAV2B;AAa9B,UAAM,eAAe,6BAAM;AAEzB,aAAO,SAAS;IAAO,GAFJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
||||||
@ -1,8 +1,8 @@
|
|||||||
var __defProp = Object.defineProperty;
|
var __defProp = Object.defineProperty;
|
||||||
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
||||||
import { d as defineComponent, r as ref, c6 as FilterMatchMode, ca as useExtensionStore, u as useSettingStore, o as onMounted, q as computed, g as openBlock, x as createBlock, y as withCtx, i as createVNode, c7 as SearchBox, z as unref, bT as script, A as createBaseVNode, h as createElementBlock, O as renderList, a6 as toDisplayString, aw as createTextVNode, N as Fragment, D as script$1, j as createCommentVNode, bV as script$3, c8 as _sfc_main$1 } from "./index-CoOvI8ZH.js";
|
import { a as defineComponent, r as ref, cg as FilterMatchMode, ck as useExtensionStore, u as useSettingStore, o as onMounted, q as computed, f as openBlock, x as createBlock, y as withCtx, h as createVNode, ch as SearchBox, z as unref, bS as script, A as createBaseVNode, g as createElementBlock, Q as renderList, a6 as toDisplayString, ax as createTextVNode, P as Fragment, D as script$1, i as createCommentVNode, c1 as script$3, ci as _sfc_main$1 } from "./index-BQYg0VNJ.js";
|
||||||
import { s as script$2, a as script$4 } from "./index-DK6Kev7f.js";
|
import { s as script$2, a as script$4 } from "./index-CMsGQEqY.js";
|
||||||
import "./index-D4DWQPPQ.js";
|
import "./index-DJqEjTnE.js";
|
||||||
const _hoisted_1 = { class: "flex justify-end" };
|
const _hoisted_1 = { class: "flex justify-end" };
|
||||||
const _sfc_main = /* @__PURE__ */ defineComponent({
|
const _sfc_main = /* @__PURE__ */ defineComponent({
|
||||||
__name: "ExtensionPanel",
|
__name: "ExtensionPanel",
|
||||||
@ -47,7 +47,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|||||||
createVNode(SearchBox, {
|
createVNode(SearchBox, {
|
||||||
modelValue: filters.value["global"].value,
|
modelValue: filters.value["global"].value,
|
||||||
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => filters.value["global"].value = $event),
|
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => filters.value["global"].value = $event),
|
||||||
placeholder: _ctx.$t("searchExtensions") + "..."
|
placeholder: _ctx.$t("g.searchExtensions") + "..."
|
||||||
}, null, 8, ["modelValue", "placeholder"]),
|
}, null, 8, ["modelValue", "placeholder"]),
|
||||||
hasChanges.value ? (openBlock(), createBlock(unref(script), {
|
hasChanges.value ? (openBlock(), createBlock(unref(script), {
|
||||||
key: 0,
|
key: 0,
|
||||||
@ -67,7 +67,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|||||||
]),
|
]),
|
||||||
createBaseVNode("div", _hoisted_1, [
|
createBaseVNode("div", _hoisted_1, [
|
||||||
createVNode(unref(script$1), {
|
createVNode(unref(script$1), {
|
||||||
label: _ctx.$t("reloadToApplyChanges"),
|
label: _ctx.$t("g.reloadToApplyChanges"),
|
||||||
onClick: applyChanges,
|
onClick: applyChanges,
|
||||||
outlined: "",
|
outlined: "",
|
||||||
severity: "danger"
|
severity: "danger"
|
||||||
@ -87,7 +87,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|||||||
default: withCtx(() => [
|
default: withCtx(() => [
|
||||||
createVNode(unref(script$2), {
|
createVNode(unref(script$2), {
|
||||||
field: "name",
|
field: "name",
|
||||||
header: _ctx.$t("extensionName"),
|
header: _ctx.$t("g.extensionName"),
|
||||||
sortable: ""
|
sortable: ""
|
||||||
}, null, 8, ["header"]),
|
}, null, 8, ["header"]),
|
||||||
createVNode(unref(script$2), { pt: {
|
createVNode(unref(script$2), { pt: {
|
||||||
@ -114,4 +114,4 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|||||||
export {
|
export {
|
||||||
_sfc_main as default
|
_sfc_main as default
|
||||||
};
|
};
|
||||||
//# sourceMappingURL=ExtensionPanel-DsD42OtO.js.map
|
//# sourceMappingURL=ExtensionPanel-vSDJrNxh.js.map
|
||||||
1
comfy/web/assets/ExtensionPanel-vSDJrNxh.js.map
generated
vendored
Normal file
1
comfy/web/assets/ExtensionPanel-vSDJrNxh.js.map
generated
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"version":3,"file":"ExtensionPanel-vSDJrNxh.js","sources":["../../src/components/dialog/content/setting/ExtensionPanel.vue"],"sourcesContent":["<template>\n <PanelTemplate value=\"Extension\" class=\"extension-panel\">\n <template #header>\n <SearchBox\n v-model=\"filters['global'].value\"\n :placeholder=\"$t('g.searchExtensions') + '...'\"\n />\n <Message v-if=\"hasChanges\" severity=\"info\" pt:text=\"w-full\">\n <ul>\n <li v-for=\"ext in changedExtensions\" :key=\"ext.name\">\n <span>\n {{ extensionStore.isExtensionEnabled(ext.name) ? '[-]' : '[+]' }}\n </span>\n {{ ext.name }}\n </li>\n </ul>\n <div class=\"flex justify-end\">\n <Button\n :label=\"$t('g.reloadToApplyChanges')\"\n @click=\"applyChanges\"\n outlined\n severity=\"danger\"\n />\n </div>\n </Message>\n </template>\n <DataTable\n :value=\"extensionStore.extensions\"\n stripedRows\n size=\"small\"\n :filters=\"filters\"\n >\n <Column field=\"name\" :header=\"$t('g.extensionName')\" sortable></Column>\n <Column\n :pt=\"{\n bodyCell: 'flex items-center justify-end'\n }\"\n >\n <template #body=\"slotProps\">\n <ToggleSwitch\n v-model=\"editingEnabledExtensions[slotProps.data.name]\"\n @change=\"updateExtensionStatus\"\n />\n </template>\n </Column>\n </DataTable>\n </PanelTemplate>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, onMounted } from 'vue'\nimport { useExtensionStore } from '@/stores/extensionStore'\nimport { useSettingStore } from '@/stores/settingStore'\nimport DataTable from 'primevue/datatable'\nimport Column from 'primevue/column'\nimport ToggleSwitch from 'primevue/toggleswitch'\nimport Button from 'primevue/button'\nimport Message from 'primevue/message'\nimport { FilterMatchMode } from '@primevue/core/api'\nimport PanelTemplate from './PanelTemplate.vue'\nimport SearchBox from '@/components/common/SearchBox.vue'\n\nconst filters = ref({\n global: { value: '', matchMode: FilterMatchMode.CONTAINS }\n})\n\nconst extensionStore = useExtensionStore()\nconst settingStore = useSettingStore()\n\nconst editingEnabledExtensions = ref<Record<string, boolean>>({})\n\nonMounted(() => {\n extensionStore.extensions.forEach((ext) => {\n editingEnabledExtensions.value[ext.name] =\n extensionStore.isExtensionEnabled(ext.name)\n })\n})\n\nconst changedExtensions = computed(() => {\n return extensionStore.extensions.filter(\n (ext) =>\n editingEnabledExtensions.value[ext.name] !==\n extensionStore.isExtensionEnabled(ext.name)\n )\n})\n\nconst hasChanges = computed(() => {\n return changedExtensions.value.length > 0\n})\n\nconst updateExtensionStatus = () => {\n const editingDisabledExtensionNames = Object.entries(\n editingEnabledExtensions.value\n )\n .filter(([_, enabled]) => !enabled)\n .map(([name]) => name)\n\n settingStore.set('Comfy.Extension.Disabled', [\n ...extensionStore.inactiveDisabledExtensionNames,\n ...editingDisabledExtensionNames\n ])\n}\n\nconst applyChanges = () => {\n // Refresh the page to apply changes\n window.location.reload()\n}\n</script>\n"],"names":[],"mappings":";;;;;;;;;AA8DA,UAAM,UAAU,IAAI;AAAA,MAClB,QAAQ,EAAE,OAAO,IAAI,WAAW,gBAAgB,SAAS;AAAA,IAAA,CAC1D;AAED,UAAM,iBAAiB,kBAAkB;AACzC,UAAM,eAAe,gBAAgB;AAE/B,UAAA,2BAA2B,IAA6B,EAAE;AAEhE,cAAU,MAAM;AACC,qBAAA,WAAW,QAAQ,CAAC,QAAQ;AACzC,iCAAyB,MAAM,IAAI,IAAI,IACrC,eAAe,mBAAmB,IAAI,IAAI;AAAA,MAAA,CAC7C;AAAA,IAAA,CACF;AAEK,UAAA,oBAAoB,SAAS,MAAM;AACvC,aAAO,eAAe,WAAW;AAAA,QAC/B,CAAC,QACC,yBAAyB,MAAM,IAAI,IAAI,MACvC,eAAe,mBAAmB,IAAI,IAAI;AAAA,MAC9C;AAAA,IAAA,CACD;AAEK,UAAA,aAAa,SAAS,MAAM;AACzB,aAAA,kBAAkB,MAAM,SAAS;AAAA,IAAA,CACzC;AAED,UAAM,wBAAwB,6BAAM;AAClC,YAAM,gCAAgC,OAAO;AAAA,QAC3C,yBAAyB;AAAA,MAExB,EAAA,OAAO,CAAC,CAAC,GAAG,OAAO,MAAM,CAAC,OAAO,EACjC,IAAI,CAAC,CAAC,IAAI,MAAM,IAAI;AAEvB,mBAAa,IAAI,4BAA4B;AAAA,QAC3C,GAAG,eAAe;AAAA,QAClB,GAAG;AAAA,MAAA,CACJ;AAAA,IACH,GAX8B;AAa9B,UAAM,eAAe,6BAAM;AAEzB,aAAO,SAAS,OAAO;AAAA,IACzB,GAHqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
||||||
924
comfy/web/assets/GraphView-BW5soyxY.js → comfy/web/assets/GraphView-BAZmiysO.js
generated
vendored
924
comfy/web/assets/GraphView-BW5soyxY.js → comfy/web/assets/GraphView-BAZmiysO.js
generated
vendored
File diff suppressed because one or more lines are too long
1
comfy/web/assets/GraphView-BAZmiysO.js.map
generated
vendored
Normal file
1
comfy/web/assets/GraphView-BAZmiysO.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
1
comfy/web/assets/GraphView-BW5soyxY.js.map
generated
vendored
1
comfy/web/assets/GraphView-BW5soyxY.js.map
generated
vendored
File diff suppressed because one or more lines are too long
1
comfy/web/assets/GraphView-DRxVGgSM.js.map
generated
vendored
1
comfy/web/assets/GraphView-DRxVGgSM.js.map
generated
vendored
File diff suppressed because one or more lines are too long
48
comfy/web/assets/GraphView-DtkYXy38.css → comfy/web/assets/GraphView-DzvxEUM8.css
generated
vendored
48
comfy/web/assets/GraphView-DtkYXy38.css → comfy/web/assets/GraphView-DzvxEUM8.css
generated
vendored
@ -45,7 +45,7 @@
|
|||||||
--sidebar-icon-size: 1rem;
|
--sidebar-icon-size: 1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.side-tool-bar-container[data-v-e0812a25] {
|
.side-tool-bar-container[data-v-7851c166] {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@ -55,10 +55,11 @@
|
|||||||
width: var(--sidebar-width);
|
width: var(--sidebar-width);
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
|
||||||
background-color: var(--comfy-menu-bg);
|
background-color: var(--comfy-menu-secondary-bg);
|
||||||
color: var(--fg-color);
|
color: var(--fg-color);
|
||||||
|
box-shadow: var(--bar-shadow);
|
||||||
}
|
}
|
||||||
.side-tool-bar-end[data-v-e0812a25] {
|
.side-tool-bar-end[data-v-7851c166] {
|
||||||
align-self: flex-end;
|
align-self: flex-end;
|
||||||
margin-top: auto;
|
margin-top: auto;
|
||||||
}
|
}
|
||||||
@ -97,7 +98,7 @@
|
|||||||
z-index: 999;
|
z-index: 999;
|
||||||
}
|
}
|
||||||
|
|
||||||
[data-v-37f672ab] .highlight {
|
[data-v-d7cc0bce] .highlight {
|
||||||
background-color: var(--p-primary-color);
|
background-color: var(--p-primary-color);
|
||||||
color: var(--p-primary-contrast-color);
|
color: var(--p-primary-contrast-color);
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
@ -124,7 +125,7 @@
|
|||||||
align-items: flex-start !important;
|
align-items: flex-start !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.node-tooltip[data-v-c2e0098f] {
|
.node-tooltip[data-v-259081e0] {
|
||||||
background: var(--comfy-input-bg);
|
background: var(--comfy-input-bg);
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
box-shadow: 0 0 5px rgba(0, 0, 0, 0.4);
|
box-shadow: 0 0 5px rgba(0, 0, 0, 0.4);
|
||||||
@ -158,25 +159,24 @@
|
|||||||
z-index: 9999;
|
z-index: 9999;
|
||||||
}
|
}
|
||||||
|
|
||||||
[data-v-783f8efe] .p-togglebutton::before {
|
[data-v-012040ee] .p-togglebutton::before {
|
||||||
display: none
|
display: none
|
||||||
}
|
}
|
||||||
[data-v-783f8efe] .p-togglebutton {
|
[data-v-012040ee] .p-togglebutton {
|
||||||
position: relative;
|
position: relative;
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
border-radius: 0px;
|
border-radius: 0px;
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
padding-left: 0.5rem;
|
padding: 0px
|
||||||
padding-right: 0.5rem
|
|
||||||
}
|
}
|
||||||
[data-v-783f8efe] .p-togglebutton.p-togglebutton-checked {
|
[data-v-012040ee] .p-togglebutton.p-togglebutton-checked {
|
||||||
border-bottom-width: 2px;
|
border-bottom-width: 2px;
|
||||||
border-bottom-color: var(--p-button-text-primary-color)
|
border-bottom-color: var(--p-button-text-primary-color)
|
||||||
}
|
}
|
||||||
[data-v-783f8efe] .p-togglebutton-checked .close-button,[data-v-783f8efe] .p-togglebutton:hover .close-button {
|
[data-v-012040ee] .p-togglebutton-checked .close-button,[data-v-012040ee] .p-togglebutton:hover .close-button {
|
||||||
visibility: visible
|
visibility: visible
|
||||||
}
|
}
|
||||||
.status-indicator[data-v-783f8efe] {
|
.status-indicator[data-v-012040ee] {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
font-size: 1.5rem;
|
font-size: 1.5rem;
|
||||||
@ -184,22 +184,22 @@
|
|||||||
left: 50%;
|
left: 50%;
|
||||||
transform: translate(-50%, -50%)
|
transform: translate(-50%, -50%)
|
||||||
}
|
}
|
||||||
[data-v-783f8efe] .p-togglebutton:hover .status-indicator {
|
[data-v-012040ee] .p-togglebutton:hover .status-indicator {
|
||||||
display: none
|
display: none
|
||||||
}
|
}
|
||||||
[data-v-783f8efe] .p-togglebutton .close-button {
|
[data-v-012040ee] .p-togglebutton .close-button {
|
||||||
visibility: hidden
|
visibility: hidden
|
||||||
}
|
}
|
||||||
|
|
||||||
.top-menubar[data-v-9646ca0a] .p-menubar-item-link svg {
|
.top-menubar[data-v-a2b12676] .p-menubar-item-link svg {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
[data-v-9646ca0a] .p-menubar-submenu.dropdown-direction-up {
|
[data-v-a2b12676] .p-menubar-submenu.dropdown-direction-up {
|
||||||
top: auto;
|
top: auto;
|
||||||
bottom: 100%;
|
bottom: 100%;
|
||||||
flex-direction: column-reverse;
|
flex-direction: column-reverse;
|
||||||
}
|
}
|
||||||
.keybinding-tag[data-v-9646ca0a] {
|
.keybinding-tag[data-v-a2b12676] {
|
||||||
background: var(--p-content-hover-background);
|
background: var(--p-content-hover-background);
|
||||||
border-color: var(--p-content-border-color);
|
border-color: var(--p-content-border-color);
|
||||||
border-style: solid;
|
border-style: solid;
|
||||||
@ -210,7 +210,7 @@
|
|||||||
border-bottom-left-radius: 0;
|
border-bottom-left-radius: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.comfyui-queue-button[data-v-95bc9be0] .p-splitbutton-dropdown {
|
.comfyui-queue-button[data-v-d3897845] .p-splitbutton-dropdown {
|
||||||
border-top-right-radius: 0;
|
border-top-right-radius: 0;
|
||||||
border-bottom-right-radius: 0;
|
border-bottom-right-radius: 0;
|
||||||
}
|
}
|
||||||
@ -238,10 +238,11 @@
|
|||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.comfyui-menu[data-v-d84a704d] {
|
.comfyui-menu[data-v-51020bc7] {
|
||||||
width: 100vw;
|
width: 100vw;
|
||||||
background: var(--comfy-menu-bg);
|
background: var(--comfy-menu-bg);
|
||||||
color: var(--fg-color);
|
color: var(--fg-color);
|
||||||
|
box-shadow: var(--bar-shadow);
|
||||||
font-family: Arial, Helvetica, sans-serif;
|
font-family: Arial, Helvetica, sans-serif;
|
||||||
font-size: 0.8em;
|
font-size: 0.8em;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
@ -250,13 +251,16 @@
|
|||||||
grid-column: 1/-1;
|
grid-column: 1/-1;
|
||||||
max-height: 90vh;
|
max-height: 90vh;
|
||||||
}
|
}
|
||||||
.comfyui-menu.dropzone[data-v-d84a704d] {
|
.comfyui-menu.dropzone[data-v-51020bc7] {
|
||||||
background: var(--p-highlight-background);
|
background: var(--p-highlight-background);
|
||||||
}
|
}
|
||||||
.comfyui-menu.dropzone-active[data-v-d84a704d] {
|
.comfyui-menu.dropzone-active[data-v-51020bc7] {
|
||||||
background: var(--p-highlight-background-focus);
|
background: var(--p-highlight-background-focus);
|
||||||
}
|
}
|
||||||
.comfyui-logo[data-v-d84a704d] {
|
[data-v-51020bc7] .p-menubar-item-label {
|
||||||
|
line-height: revert;
|
||||||
|
}
|
||||||
|
.comfyui-logo[data-v-51020bc7] {
|
||||||
font-size: 1.2em;
|
font-size: 1.2em;
|
||||||
-webkit-user-select: none;
|
-webkit-user-select: none;
|
||||||
-moz-user-select: none;
|
-moz-user-select: none;
|
||||||
60
comfy/web/assets/InstallView-C6UIhIu4.js → comfy/web/assets/InstallView-BDCw9SUg.js
generated
vendored
60
comfy/web/assets/InstallView-C6UIhIu4.js → comfy/web/assets/InstallView-BDCw9SUg.js
generated
vendored
File diff suppressed because one or more lines are too long
1
comfy/web/assets/InstallView-BDCw9SUg.js.map
generated
vendored
Normal file
1
comfy/web/assets/InstallView-BDCw9SUg.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
1
comfy/web/assets/InstallView-C6UIhIu4.js.map
generated
vendored
1
comfy/web/assets/InstallView-C6UIhIu4.js.map
generated
vendored
File diff suppressed because one or more lines are too long
1
comfy/web/assets/InstallView-CWxVNQLN.js.map
generated
vendored
1
comfy/web/assets/InstallView-CWxVNQLN.js.map
generated
vendored
File diff suppressed because one or more lines are too long
@ -1,4 +1,4 @@
|
|||||||
|
|
||||||
[data-v-53e62b05] .p-steppanel {
|
[data-v-7ef01cf2] .p-steppanel {
|
||||||
background-color: transparent
|
background-color: transparent
|
||||||
}
|
}
|
||||||
8
comfy/web/assets/KeybindingPanel-C-7KE-Kw.css
generated
vendored
8
comfy/web/assets/KeybindingPanel-C-7KE-Kw.css
generated
vendored
@ -1,8 +0,0 @@
|
|||||||
|
|
||||||
[data-v-9d7e362e] .p-datatable-tbody > tr > td {
|
|
||||||
padding: 0.25rem;
|
|
||||||
min-height: 2rem
|
|
||||||
}
|
|
||||||
[data-v-9d7e362e] .p-datatable-row-selected .actions,[data-v-9d7e362e] .p-datatable-selectable-row:hover .actions {
|
|
||||||
visibility: visible
|
|
||||||
}
|
|
||||||
8
comfy/web/assets/KeybindingPanel-ClaKRDVw.css
generated
vendored
Normal file
8
comfy/web/assets/KeybindingPanel-ClaKRDVw.css
generated
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
|
||||||
|
[data-v-8cf0326b] .p-datatable-tbody > tr > td {
|
||||||
|
padding: 0.25rem;
|
||||||
|
min-height: 2rem
|
||||||
|
}
|
||||||
|
[data-v-8cf0326b] .p-datatable-row-selected .actions,[data-v-8cf0326b] .p-datatable-selectable-row:hover .actions {
|
||||||
|
visibility: visible
|
||||||
|
}
|
||||||
@ -1,8 +1,8 @@
|
|||||||
var __defProp = Object.defineProperty;
|
var __defProp = Object.defineProperty;
|
||||||
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
||||||
import { d as defineComponent, q as computed, g as openBlock, h as createElementBlock, N as Fragment, O as renderList, i as createVNode, y as withCtx, aw as createTextVNode, a6 as toDisplayString, z as unref, aA as script, j as createCommentVNode, r as ref, c6 as FilterMatchMode, M as useKeybindingStore, F as useCommandStore, aJ as watchEffect, bg as useToast, t as resolveDirective, x as createBlock, c7 as SearchBox, A as createBaseVNode, D as script$2, ao as script$4, bk as withModifiers, bT as script$5, aH as script$6, v as withDirectives, c8 as _sfc_main$2, P as pushScopeId, Q as popScopeId, c1 as KeyComboImpl, c9 as KeybindingImpl, _ as _export_sfc } from "./index-CoOvI8ZH.js";
|
import { a as defineComponent, q as computed, f as openBlock, g as createElementBlock, P as Fragment, Q as renderList, h as createVNode, y as withCtx, ax as createTextVNode, a6 as toDisplayString, z as unref, aB as script, i as createCommentVNode, r as ref, cg as FilterMatchMode, O as useKeybindingStore, F as useCommandStore, aK as watchEffect, bi as useToast, t as resolveDirective, x as createBlock, ch as SearchBox, A as createBaseVNode, D as script$2, ap as script$4, bm as withModifiers, bS as script$5, aH as script$6, v as withDirectives, ci as _sfc_main$2, ca as KeyComboImpl, cj as KeybindingImpl, _ as _export_sfc } from "./index-BQYg0VNJ.js";
|
||||||
import { s as script$1, a as script$3 } from "./index-DK6Kev7f.js";
|
import { s as script$1, a as script$3 } from "./index-CMsGQEqY.js";
|
||||||
import "./index-D4DWQPPQ.js";
|
import "./index-DJqEjTnE.js";
|
||||||
const _hoisted_1$1 = {
|
const _hoisted_1$1 = {
|
||||||
key: 0,
|
key: 0,
|
||||||
class: "px-2"
|
class: "px-2"
|
||||||
@ -35,7 +35,6 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
const _withScopeId = /* @__PURE__ */ __name((n) => (pushScopeId("data-v-9d7e362e"), n = n(), popScopeId(), n), "_withScopeId");
|
|
||||||
const _hoisted_1 = { class: "actions invisible flex flex-row" };
|
const _hoisted_1 = { class: "actions invisible flex flex-row" };
|
||||||
const _hoisted_2 = ["title"];
|
const _hoisted_2 = ["title"];
|
||||||
const _hoisted_3 = { key: 1 };
|
const _hoisted_3 = { key: 1 };
|
||||||
@ -140,7 +139,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|||||||
createVNode(SearchBox, {
|
createVNode(SearchBox, {
|
||||||
modelValue: filters.value["global"].value,
|
modelValue: filters.value["global"].value,
|
||||||
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => filters.value["global"].value = $event),
|
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => filters.value["global"].value = $event),
|
||||||
placeholder: _ctx.$t("searchKeybindings") + "..."
|
placeholder: _ctx.$t("g.searchKeybindings") + "..."
|
||||||
}, null, 8, ["modelValue", "placeholder"])
|
}, null, 8, ["modelValue", "placeholder"])
|
||||||
]),
|
]),
|
||||||
default: withCtx(() => [
|
default: withCtx(() => [
|
||||||
@ -243,7 +242,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|||||||
severity: "error"
|
severity: "error"
|
||||||
}, {
|
}, {
|
||||||
default: withCtx(() => [
|
default: withCtx(() => [
|
||||||
createTextVNode(" Keybinding already exists on "),
|
_cache[3] || (_cache[3] = createTextVNode(" Keybinding already exists on ")),
|
||||||
createVNode(unref(script), {
|
createVNode(unref(script), {
|
||||||
severity: "secondary",
|
severity: "secondary",
|
||||||
value: existingKeybindingOnCombo.value.commandId
|
value: existingKeybindingOnCombo.value.commandId
|
||||||
@ -257,14 +256,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|||||||
}, 8, ["visible", "header"]),
|
}, 8, ["visible", "header"]),
|
||||||
withDirectives(createVNode(unref(script$2), {
|
withDirectives(createVNode(unref(script$2), {
|
||||||
class: "mt-4",
|
class: "mt-4",
|
||||||
label: _ctx.$t("reset"),
|
label: _ctx.$t("g.reset"),
|
||||||
icon: "pi pi-trash",
|
icon: "pi pi-trash",
|
||||||
severity: "danger",
|
severity: "danger",
|
||||||
fluid: "",
|
fluid: "",
|
||||||
text: "",
|
text: "",
|
||||||
onClick: resetKeybindings
|
onClick: resetKeybindings
|
||||||
}, null, 8, ["label"]), [
|
}, null, 8, ["label"]), [
|
||||||
[_directive_tooltip, _ctx.$t("resetKeybindingsTooltip")]
|
[_directive_tooltip, _ctx.$t("g.resetKeybindingsTooltip")]
|
||||||
])
|
])
|
||||||
]),
|
]),
|
||||||
_: 1
|
_: 1
|
||||||
@ -272,8 +271,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
const KeybindingPanel = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-9d7e362e"]]);
|
const KeybindingPanel = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-8cf0326b"]]);
|
||||||
export {
|
export {
|
||||||
KeybindingPanel as default
|
KeybindingPanel as default
|
||||||
};
|
};
|
||||||
//# sourceMappingURL=KeybindingPanel-lcJrxHwZ.js.map
|
//# sourceMappingURL=KeybindingPanel-DfPGcDsG.js.map
|
||||||
1
comfy/web/assets/KeybindingPanel-DfPGcDsG.js.map
generated
vendored
Normal file
1
comfy/web/assets/KeybindingPanel-DfPGcDsG.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
1
comfy/web/assets/KeybindingPanel-lcJrxHwZ.js.map
generated
vendored
1
comfy/web/assets/KeybindingPanel-lcJrxHwZ.js.map
generated
vendored
File diff suppressed because one or more lines are too long
81
comfy/web/assets/NotSupportedView-Ds7vEJAd.js
generated
vendored
Normal file
81
comfy/web/assets/NotSupportedView-Ds7vEJAd.js
generated
vendored
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
var __defProp = Object.defineProperty;
|
||||||
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
||||||
|
import { a as defineComponent, bQ as useRouter, t as resolveDirective, f as openBlock, g as createElementBlock, A as createBaseVNode, a6 as toDisplayString, h as createVNode, z as unref, D as script, v as withDirectives } from "./index-BQYg0VNJ.js";
|
||||||
|
const _imports_0 = "" + new URL("images/sad_girl.png", import.meta.url).href;
|
||||||
|
const _hoisted_1 = { class: "font-sans w-screen h-screen flex items-center m-0 text-neutral-900 bg-neutral-300 pointer-events-auto" };
|
||||||
|
const _hoisted_2 = { class: "flex-grow flex items-center justify-center" };
|
||||||
|
const _hoisted_3 = { class: "flex flex-col gap-8 p-8" };
|
||||||
|
const _hoisted_4 = { class: "text-4xl font-bold text-red-500" };
|
||||||
|
const _hoisted_5 = { class: "space-y-4" };
|
||||||
|
const _hoisted_6 = { class: "text-xl" };
|
||||||
|
const _hoisted_7 = { class: "list-disc list-inside space-y-1 text-neutral-800" };
|
||||||
|
const _hoisted_8 = { class: "flex gap-4" };
|
||||||
|
const _sfc_main = /* @__PURE__ */ defineComponent({
|
||||||
|
__name: "NotSupportedView",
|
||||||
|
setup(__props) {
|
||||||
|
const openDocs = /* @__PURE__ */ __name(() => {
|
||||||
|
window.open(
|
||||||
|
"https://github.com/Comfy-Org/desktop#currently-supported-platforms",
|
||||||
|
"_blank"
|
||||||
|
);
|
||||||
|
}, "openDocs");
|
||||||
|
const reportIssue = /* @__PURE__ */ __name(() => {
|
||||||
|
window.open("https://forum.comfy.org/c/v1-feedback/", "_blank");
|
||||||
|
}, "reportIssue");
|
||||||
|
const router = useRouter();
|
||||||
|
const continueToInstall = /* @__PURE__ */ __name(() => {
|
||||||
|
router.push("/install");
|
||||||
|
}, "continueToInstall");
|
||||||
|
return (_ctx, _cache) => {
|
||||||
|
const _directive_tooltip = resolveDirective("tooltip");
|
||||||
|
return openBlock(), createElementBlock("div", _hoisted_1, [
|
||||||
|
createBaseVNode("div", _hoisted_2, [
|
||||||
|
createBaseVNode("div", _hoisted_3, [
|
||||||
|
createBaseVNode("h1", _hoisted_4, toDisplayString(_ctx.$t("notSupported.title")), 1),
|
||||||
|
createBaseVNode("div", _hoisted_5, [
|
||||||
|
createBaseVNode("p", _hoisted_6, toDisplayString(_ctx.$t("notSupported.message")), 1),
|
||||||
|
createBaseVNode("ul", _hoisted_7, [
|
||||||
|
createBaseVNode("li", null, toDisplayString(_ctx.$t("notSupported.supportedDevices.macos")), 1),
|
||||||
|
createBaseVNode("li", null, toDisplayString(_ctx.$t("notSupported.supportedDevices.windows")), 1)
|
||||||
|
])
|
||||||
|
]),
|
||||||
|
createBaseVNode("div", _hoisted_8, [
|
||||||
|
createVNode(unref(script), {
|
||||||
|
label: _ctx.$t("notSupported.learnMore"),
|
||||||
|
icon: "pi pi-github",
|
||||||
|
onClick: openDocs,
|
||||||
|
severity: "secondary"
|
||||||
|
}, null, 8, ["label"]),
|
||||||
|
createVNode(unref(script), {
|
||||||
|
label: _ctx.$t("notSupported.reportIssue"),
|
||||||
|
icon: "pi pi-flag",
|
||||||
|
onClick: reportIssue,
|
||||||
|
severity: "secondary"
|
||||||
|
}, null, 8, ["label"]),
|
||||||
|
withDirectives(createVNode(unref(script), {
|
||||||
|
label: _ctx.$t("notSupported.continue"),
|
||||||
|
icon: "pi pi-arrow-right",
|
||||||
|
iconPos: "right",
|
||||||
|
onClick: continueToInstall,
|
||||||
|
severity: "danger"
|
||||||
|
}, null, 8, ["label"]), [
|
||||||
|
[_directive_tooltip, _ctx.$t("notSupported.continueTooltip")]
|
||||||
|
])
|
||||||
|
])
|
||||||
|
])
|
||||||
|
]),
|
||||||
|
_cache[0] || (_cache[0] = createBaseVNode("div", { class: "h-screen flex-grow-0" }, [
|
||||||
|
createBaseVNode("img", {
|
||||||
|
src: _imports_0,
|
||||||
|
alt: "Sad girl illustration",
|
||||||
|
class: "h-full object-cover"
|
||||||
|
})
|
||||||
|
], -1))
|
||||||
|
]);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
export {
|
||||||
|
_sfc_main as default
|
||||||
|
};
|
||||||
|
//# sourceMappingURL=NotSupportedView-Ds7vEJAd.js.map
|
||||||
1
comfy/web/assets/NotSupportedView-Ds7vEJAd.js.map
generated
vendored
Normal file
1
comfy/web/assets/NotSupportedView-Ds7vEJAd.js.map
generated
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"version":3,"file":"NotSupportedView-Ds7vEJAd.js","sources":["../../../../../../assets/images/sad_girl.png","../../src/views/NotSupportedView.vue"],"sourcesContent":["export default \"__VITE_PUBLIC_ASSET__b82952e7__\"","<template>\n <div\n class=\"font-sans w-screen h-screen flex items-center m-0 text-neutral-900 bg-neutral-300 pointer-events-auto\"\n >\n <div class=\"flex-grow flex items-center justify-center\">\n <div class=\"flex flex-col gap-8 p-8\">\n <!-- Header -->\n <h1 class=\"text-4xl font-bold text-red-500\">\n {{ $t('notSupported.title') }}\n </h1>\n\n <!-- Message -->\n <div class=\"space-y-4\">\n <p class=\"text-xl\">\n {{ $t('notSupported.message') }}\n </p>\n <ul class=\"list-disc list-inside space-y-1 text-neutral-800\">\n <li>{{ $t('notSupported.supportedDevices.macos') }}</li>\n <li>{{ $t('notSupported.supportedDevices.windows') }}</li>\n </ul>\n </div>\n\n <!-- Actions -->\n <div class=\"flex gap-4\">\n <Button\n :label=\"$t('notSupported.learnMore')\"\n icon=\"pi pi-github\"\n @click=\"openDocs\"\n severity=\"secondary\"\n />\n <Button\n :label=\"$t('notSupported.reportIssue')\"\n icon=\"pi pi-flag\"\n @click=\"reportIssue\"\n severity=\"secondary\"\n />\n <Button\n :label=\"$t('notSupported.continue')\"\n icon=\"pi pi-arrow-right\"\n iconPos=\"right\"\n @click=\"continueToInstall\"\n severity=\"danger\"\n v-tooltip=\"$t('notSupported.continueTooltip')\"\n />\n </div>\n </div>\n </div>\n\n <!-- Right side image -->\n <div class=\"h-screen flex-grow-0\">\n <img\n src=\"/assets/images/sad_girl.png\"\n alt=\"Sad girl illustration\"\n class=\"h-full object-cover\"\n />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport Button from 'primevue/button'\nimport { useRouter } from 'vue-router'\n\nconst openDocs = () => {\n window.open(\n 'https://github.com/Comfy-Org/desktop#currently-supported-platforms',\n '_blank'\n )\n}\n\nconst reportIssue = () => {\n window.open('https://forum.comfy.org/c/v1-feedback/', '_blank')\n}\n\nconst router = useRouter()\nconst continueToInstall = () => {\n router.push('/install')\n}\n</script>\n"],"names":[],"mappings":";;;AAAA,MAAe,aAAA,KAAA,IAAA,IAAA,uBAAA,YAAA,GAAA,EAAA;;;;;;;;;;;;AC+Df,UAAM,WAAW,6BAAM;AACd,aAAA;AAAA,QACL;AAAA,QACA;AAAA,MACF;AAAA,IACF,GALiB;AAOjB,UAAM,cAAc,6BAAM;AACjB,aAAA,KAAK,0CAA0C,QAAQ;AAAA,IAChE,GAFoB;AAIpB,UAAM,SAAS,UAAU;AACzB,UAAM,oBAAoB,6BAAM;AAC9B,aAAO,KAAK,UAAU;AAAA,IACxB,GAF0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
||||||
@ -1,25 +1,23 @@
|
|||||||
var __defProp = Object.defineProperty;
|
var __defProp = Object.defineProperty;
|
||||||
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
||||||
import { A as createBaseVNode, g as openBlock, h as createElementBlock, aU as markRaw, d as defineComponent, u as useSettingStore, bw as storeToRefs, w as watch, cy as useCopyToClipboard, x as createBlock, y as withCtx, z as unref, bT as script, a6 as toDisplayString, O as renderList, N as Fragment, i as createVNode, D as script$1, j as createCommentVNode, bI as script$2, cz as formatCamelCase, cA as FormItem, c8 as _sfc_main$1, bN as electronAPI } from "./index-CoOvI8ZH.js";
|
import { f as openBlock, g as createElementBlock, A as createBaseVNode, aW as markRaw, a as defineComponent, u as useSettingStore, aJ as storeToRefs, w as watch, cF as useCopyToClipboard, I as useI18n, x as createBlock, y as withCtx, z as unref, bS as script, a6 as toDisplayString, Q as renderList, P as Fragment, h as createVNode, D as script$1, i as createCommentVNode, bJ as script$2, cG as FormItem, ci as _sfc_main$1, bV as electronAPI } from "./index-BQYg0VNJ.js";
|
||||||
import { u as useServerConfigStore } from "./serverConfigStore-cctR8PGG.js";
|
import { u as useServerConfigStore } from "./serverConfigStore-DulDGgjD.js";
|
||||||
const _hoisted_1$1 = {
|
const _hoisted_1$1 = {
|
||||||
viewBox: "0 0 24 24",
|
viewBox: "0 0 24 24",
|
||||||
width: "1.2em",
|
width: "1.2em",
|
||||||
height: "1.2em"
|
height: "1.2em"
|
||||||
};
|
};
|
||||||
const _hoisted_2$1 = /* @__PURE__ */ createBaseVNode("path", {
|
|
||||||
fill: "none",
|
|
||||||
stroke: "currentColor",
|
|
||||||
"stroke-linecap": "round",
|
|
||||||
"stroke-linejoin": "round",
|
|
||||||
"stroke-width": "2",
|
|
||||||
d: "m4 17l6-6l-6-6m8 14h8"
|
|
||||||
}, null, -1);
|
|
||||||
const _hoisted_3$1 = [
|
|
||||||
_hoisted_2$1
|
|
||||||
];
|
|
||||||
function render(_ctx, _cache) {
|
function render(_ctx, _cache) {
|
||||||
return openBlock(), createElementBlock("svg", _hoisted_1$1, [..._hoisted_3$1]);
|
return openBlock(), createElementBlock("svg", _hoisted_1$1, _cache[0] || (_cache[0] = [
|
||||||
|
createBaseVNode("path", {
|
||||||
|
fill: "none",
|
||||||
|
stroke: "currentColor",
|
||||||
|
"stroke-linecap": "round",
|
||||||
|
"stroke-linejoin": "round",
|
||||||
|
"stroke-width": "2",
|
||||||
|
d: "m4 17l6-6l-6-6m8 14h8"
|
||||||
|
}, null, -1)
|
||||||
|
]));
|
||||||
}
|
}
|
||||||
__name(render, "render");
|
__name(render, "render");
|
||||||
const __unplugin_components_0 = markRaw({ name: "lucide-terminal", render });
|
const __unplugin_components_0 = markRaw({ name: "lucide-terminal", render });
|
||||||
@ -54,6 +52,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|||||||
const copyCommandLineArgs = /* @__PURE__ */ __name(async () => {
|
const copyCommandLineArgs = /* @__PURE__ */ __name(async () => {
|
||||||
await copyToClipboard(commandLineArgs.value);
|
await copyToClipboard(commandLineArgs.value);
|
||||||
}, "copyCommandLineArgs");
|
}, "copyCommandLineArgs");
|
||||||
|
const { t } = useI18n();
|
||||||
|
const translateItem = /* @__PURE__ */ __name((item) => {
|
||||||
|
return {
|
||||||
|
...item,
|
||||||
|
name: t(`serverConfigItems.${item.id}.name`, item.name),
|
||||||
|
tooltip: item.tooltip ? t(`serverConfigItems.${item.id}.tooltip`, item.tooltip) : void 0
|
||||||
|
};
|
||||||
|
}, "translateItem");
|
||||||
return (_ctx, _cache) => {
|
return (_ctx, _cache) => {
|
||||||
const _component_i_lucide58terminal = __unplugin_components_0;
|
const _component_i_lucide58terminal = __unplugin_components_0;
|
||||||
return openBlock(), createBlock(_sfc_main$1, {
|
return openBlock(), createBlock(_sfc_main$1, {
|
||||||
@ -119,14 +125,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|||||||
(openBlock(true), createElementBlock(Fragment, null, renderList(Object.entries(unref(serverConfigsByCategory)), ([label, items], i) => {
|
(openBlock(true), createElementBlock(Fragment, null, renderList(Object.entries(unref(serverConfigsByCategory)), ([label, items], i) => {
|
||||||
return openBlock(), createElementBlock("div", { key: label }, [
|
return openBlock(), createElementBlock("div", { key: label }, [
|
||||||
i > 0 ? (openBlock(), createBlock(unref(script$2), { key: 0 })) : createCommentVNode("", true),
|
i > 0 ? (openBlock(), createBlock(unref(script$2), { key: 0 })) : createCommentVNode("", true),
|
||||||
createBaseVNode("h3", null, toDisplayString(unref(formatCamelCase)(label)), 1),
|
createBaseVNode("h3", null, toDisplayString(_ctx.$t(`serverConfigCategories.${label}`, label)), 1),
|
||||||
(openBlock(true), createElementBlock(Fragment, null, renderList(items, (item) => {
|
(openBlock(true), createElementBlock(Fragment, null, renderList(items, (item) => {
|
||||||
return openBlock(), createElementBlock("div", {
|
return openBlock(), createElementBlock("div", {
|
||||||
key: item.name,
|
key: item.name,
|
||||||
class: "flex items-center mb-4"
|
class: "flex items-center mb-4"
|
||||||
}, [
|
}, [
|
||||||
createVNode(FormItem, {
|
createVNode(FormItem, {
|
||||||
item,
|
item: translateItem(item),
|
||||||
formValue: item.value,
|
formValue: item.value,
|
||||||
"onUpdate:formValue": /* @__PURE__ */ __name(($event) => item.value = $event, "onUpdate:formValue"),
|
"onUpdate:formValue": /* @__PURE__ */ __name(($event) => item.value = $event, "onUpdate:formValue"),
|
||||||
id: item.id,
|
id: item.id,
|
||||||
@ -147,4 +153,4 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|||||||
export {
|
export {
|
||||||
_sfc_main as default
|
_sfc_main as default
|
||||||
};
|
};
|
||||||
//# sourceMappingURL=ServerConfigPanel-x68ubY-c.js.map
|
//# sourceMappingURL=ServerConfigPanel-B7Ic27AR.js.map
|
||||||
1
comfy/web/assets/ServerConfigPanel-B7Ic27AR.js.map
generated
vendored
Normal file
1
comfy/web/assets/ServerConfigPanel-B7Ic27AR.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
1
comfy/web/assets/ServerConfigPanel-x68ubY-c.js.map
generated
vendored
1
comfy/web/assets/ServerConfigPanel-x68ubY-c.js.map
generated
vendored
@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"ServerConfigPanel-x68ubY-c.js","sources":["../../src/components/dialog/content/setting/ServerConfigPanel.vue"],"sourcesContent":["<template>\n <PanelTemplate value=\"Server-Config\" class=\"server-config-panel\">\n <template #header>\n <div class=\"flex flex-col gap-2\">\n <Message\n v-if=\"modifiedConfigs.length > 0\"\n severity=\"info\"\n pt:text=\"w-full\"\n >\n <p>\n {{ $t('serverConfig.modifiedConfigs') }}\n </p>\n <ul>\n <li v-for=\"config in modifiedConfigs\" :key=\"config.id\">\n {{ config.name }}: {{ config.initialValue }} → {{ config.value }}\n </li>\n </ul>\n <div class=\"flex justify-end gap-2\">\n <Button\n :label=\"$t('serverConfig.revertChanges')\"\n @click=\"revertChanges\"\n outlined\n />\n <Button\n :label=\"$t('serverConfig.restart')\"\n @click=\"restartApp\"\n outlined\n severity=\"danger\"\n />\n </div>\n </Message>\n <Message v-if=\"commandLineArgs\" severity=\"secondary\" pt:text=\"w-full\">\n <template #icon>\n <i-lucide:terminal class=\"text-xl font-bold\" />\n </template>\n <div class=\"flex items-center justify-between\">\n <p>{{ commandLineArgs }}</p>\n <Button\n icon=\"pi pi-clipboard\"\n @click=\"copyCommandLineArgs\"\n severity=\"secondary\"\n text\n />\n </div>\n </Message>\n </div>\n </template>\n <div\n v-for=\"([label, items], i) in Object.entries(serverConfigsByCategory)\"\n :key=\"label\"\n >\n <Divider v-if=\"i > 0\" />\n <h3>{{ formatCamelCase(label) }}</h3>\n <div\n v-for=\"item in items\"\n :key=\"item.name\"\n class=\"flex items-center mb-4\"\n >\n <FormItem\n :item=\"item\"\n v-model:formValue=\"item.value\"\n :id=\"item.id\"\n :labelClass=\"{\n 'text-highlight': item.initialValue !== item.value\n }\"\n />\n </div>\n </div>\n </PanelTemplate>\n</template>\n\n<script setup lang=\"ts\">\nimport Button from 'primevue/button'\nimport Message from 'primevue/message'\nimport Divider from 'primevue/divider'\nimport FormItem from '@/components/common/FormItem.vue'\nimport PanelTemplate from './PanelTemplate.vue'\nimport { formatCamelCase } from '@/utils/formatUtil'\nimport { useServerConfigStore } from '@/stores/serverConfigStore'\nimport { storeToRefs } from 'pinia'\nimport { electronAPI } from '@/utils/envUtil'\nimport { useSettingStore } from '@/stores/settingStore'\nimport { watch } from 'vue'\nimport { useCopyToClipboard } from '@/hooks/clipboardHooks'\n\nconst settingStore = useSettingStore()\nconst serverConfigStore = useServerConfigStore()\nconst {\n serverConfigsByCategory,\n serverConfigValues,\n launchArgs,\n commandLineArgs,\n modifiedConfigs\n} = storeToRefs(serverConfigStore)\n\nconst revertChanges = () => {\n serverConfigStore.revertChanges()\n}\n\nconst restartApp = () => {\n electronAPI().restartApp()\n}\n\nwatch(launchArgs, (newVal) => {\n settingStore.set('Comfy.Server.LaunchArgs', newVal)\n})\n\nwatch(serverConfigValues, (newVal) => {\n settingStore.set('Comfy.Server.ServerConfigValues', newVal)\n})\n\nconst { copyToClipboard } = useCopyToClipboard()\nconst copyCommandLineArgs = async () => {\n await copyToClipboard(commandLineArgs.value)\n}\n</script>\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqFA,UAAM,eAAe;AACrB,UAAM,oBAAoB;AACpB,UAAA;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,IACE,YAAY,iBAAiB;AAEjC,UAAM,gBAAgB,6BAAM;AAC1B,wBAAkB,cAAc;AAAA,IAAA,GADZ;AAItB,UAAM,aAAa,6BAAM;AACvB,kBAAA,EAAc;IAAW,GADR;AAIb,UAAA,YAAY,CAAC,WAAW;AACf,mBAAA,IAAI,2BAA2B,MAAM;AAAA,IAAA,CACnD;AAEK,UAAA,oBAAoB,CAAC,WAAW;AACvB,mBAAA,IAAI,mCAAmC,MAAM;AAAA,IAAA,CAC3D;AAEK,UAAA,EAAE,oBAAoB;AAC5B,UAAM,sBAAsB,mCAAY;AAChC,YAAA,gBAAgB,gBAAgB,KAAK;AAAA,IAAA,GADjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
||||||
1
comfy/web/assets/ServerStartView-CqRVtr1h.js.map
generated
vendored
1
comfy/web/assets/ServerStartView-CqRVtr1h.js.map
generated
vendored
@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"ServerStartView-CqRVtr1h.js","sources":["../../src/views/ServerStartView.vue"],"sourcesContent":["<template>\n <div\n class=\"font-sans flex flex-col justify-center items-center h-screen m-0 text-neutral-300 bg-neutral-900 dark-theme pointer-events-auto\"\n >\n <h2 class=\"text-2xl font-bold\">\n {{ t(`serverStart.process.${status}`) }}\n <span v-if=\"status === ProgressStatus.ERROR\">\n v{{ electronVersion }}\n </span>\n </h2>\n <div\n v-if=\"status === ProgressStatus.ERROR\"\n class=\"flex items-center my-4 gap-2\"\n >\n <Button\n icon=\"pi pi-flag\"\n severity=\"secondary\"\n :label=\"t('serverStart.reportIssue')\"\n @click=\"reportIssue\"\n />\n <Button\n icon=\"pi pi-file\"\n severity=\"secondary\"\n :label=\"t('serverStart.openLogs')\"\n @click=\"openLogs\"\n />\n <Button\n icon=\"pi pi-refresh\"\n :label=\"t('serverStart.reinstall')\"\n @click=\"reinstall\"\n />\n </div>\n <BaseTerminal @created=\"terminalCreated\" />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport Button from 'primevue/button'\nimport { ref, onMounted, Ref } from 'vue'\nimport BaseTerminal from '@/components/bottomPanel/tabs/terminal/BaseTerminal.vue'\nimport { ProgressStatus } from '@comfyorg/comfyui-electron-types'\nimport { electronAPI } from '@/utils/envUtil'\nimport type { useTerminal } from '@/hooks/bottomPanelTabs/useTerminal'\nimport { Terminal } from '@xterm/xterm'\nimport { useI18n } from 'vue-i18n'\n\nconst electron = electronAPI()\nconst { t } = useI18n()\n\nconst status = ref<ProgressStatus>(ProgressStatus.INITIAL_STATE)\nconst electronVersion = ref<string>('')\nlet xterm: Terminal | undefined\n\nconst updateProgress = ({ status: newStatus }: { status: ProgressStatus }) => {\n status.value = newStatus\n xterm?.clear()\n}\n\nconst terminalCreated = (\n { terminal, useAutoSize }: ReturnType<typeof useTerminal>,\n root: Ref<HTMLElement>\n) => {\n xterm = terminal\n\n useAutoSize(root, true, true)\n electron.onLogMessage((message: string) => {\n terminal.write(message)\n })\n\n terminal.options.cursorBlink = false\n terminal.options.disableStdin = true\n terminal.options.cursorInactiveStyle = 'block'\n}\n\nconst reinstall = () => electron.reinstall()\nconst reportIssue = () => {\n window.open('https://forum.comfy.org/c/v1-feedback/', '_blank')\n}\nconst openLogs = () => electron.openLogsFolder()\n\nonMounted(async () => {\n electron.sendReady()\n electron.onProgressUpdate(updateProgress)\n electronVersion.value = await electron.getElectronVersion()\n})\n</script>\n\n<style scoped>\n:deep(.xterm-helper-textarea) {\n /* Hide this as it moves all over when uv is running */\n display: none;\n}\n</style>\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AA8CA,UAAM,WAAW;AACX,UAAA,EAAE,MAAM;AAER,UAAA,SAAS,IAAoB,eAAe,aAAa;AACzD,UAAA,kBAAkB,IAAY,EAAE;AAClC,QAAA;AAEJ,UAAM,iBAAiB,wBAAC,EAAE,QAAQ,gBAA4C;AAC5E,aAAO,QAAQ;AACf,aAAO,MAAM;AAAA,IAAA,GAFQ;AAKvB,UAAM,kBAAkB,wBACtB,EAAE,UAAU,YAAA,GACZ,SACG;AACK,cAAA;AAEI,kBAAA,MAAM,MAAM,IAAI;AACnB,eAAA,aAAa,CAAC,YAAoB;AACzC,iBAAS,MAAM,OAAO;AAAA,MAAA,CACvB;AAED,eAAS,QAAQ,cAAc;AAC/B,eAAS,QAAQ,eAAe;AAChC,eAAS,QAAQ,sBAAsB;AAAA,IAAA,GAbjB;AAgBlB,UAAA,YAAY,6BAAM,SAAS,aAAf;AAClB,UAAM,cAAc,6BAAM;AACjB,aAAA,KAAK,0CAA0C,QAAQ;AAAA,IAAA,GAD5C;AAGd,UAAA,WAAW,6BAAM,SAAS,kBAAf;AAEjB,cAAU,YAAY;AACpB,eAAS,UAAU;AACnB,eAAS,iBAAiB,cAAc;AACxB,sBAAA,QAAQ,MAAM,SAAS,mBAAmB;AAAA,IAAA,CAC3D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
[data-v-f5429be7] .xterm-helper-textarea {
|
[data-v-95e9eb99] .xterm-helper-textarea {
|
||||||
/* Hide this as it moves all over when uv is running */
|
/* Hide this as it moves all over when uv is running */
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
@ -1,8 +1,6 @@
|
|||||||
var __defProp = Object.defineProperty;
|
var __defProp = Object.defineProperty;
|
||||||
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
||||||
import { d as defineComponent, aD as useI18n, r as ref, o as onMounted, g as openBlock, h as createElementBlock, A as createBaseVNode, aw as createTextVNode, a6 as toDisplayString, z as unref, j as createCommentVNode, i as createVNode, D as script, bM as BaseTerminal, P as pushScopeId, Q as popScopeId, bN as electronAPI, _ as _export_sfc } from "./index-CoOvI8ZH.js";
|
import { a as defineComponent, I as useI18n, r as ref, bT as ProgressStatus, o as onMounted, f as openBlock, g as createElementBlock, A as createBaseVNode, ax as createTextVNode, a6 as toDisplayString, z as unref, i as createCommentVNode, h as createVNode, D as script, bU as BaseTerminal, bV as electronAPI, _ as _export_sfc } from "./index-BQYg0VNJ.js";
|
||||||
import { P as ProgressStatus } from "./index-BppSBmxJ.js";
|
|
||||||
const _withScopeId = /* @__PURE__ */ __name((n) => (pushScopeId("data-v-f5429be7"), n = n(), popScopeId(), n), "_withScopeId");
|
|
||||||
const _hoisted_1 = { class: "font-sans flex flex-col justify-center items-center h-screen m-0 text-neutral-300 bg-neutral-900 dark-theme pointer-events-auto" };
|
const _hoisted_1 = { class: "font-sans flex flex-col justify-center items-center h-screen m-0 text-neutral-300 bg-neutral-900 dark-theme pointer-events-auto" };
|
||||||
const _hoisted_2 = { class: "text-2xl font-bold" };
|
const _hoisted_2 = { class: "text-2xl font-bold" };
|
||||||
const _hoisted_3 = { key: 0 };
|
const _hoisted_3 = { key: 0 };
|
||||||
@ -20,7 +18,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|||||||
let xterm;
|
let xterm;
|
||||||
const updateProgress = /* @__PURE__ */ __name(({ status: newStatus }) => {
|
const updateProgress = /* @__PURE__ */ __name(({ status: newStatus }) => {
|
||||||
status.value = newStatus;
|
status.value = newStatus;
|
||||||
xterm?.clear();
|
if (newStatus !== ProgressStatus.ERROR) xterm?.clear();
|
||||||
}, "updateProgress");
|
}, "updateProgress");
|
||||||
const terminalCreated = /* @__PURE__ */ __name(({ terminal, useAutoSize }, root) => {
|
const terminalCreated = /* @__PURE__ */ __name(({ terminal, useAutoSize }, root) => {
|
||||||
xterm = terminal;
|
xterm = terminal;
|
||||||
@ -72,8 +70,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
const ServerStartView = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-f5429be7"]]);
|
const ServerStartView = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-95e9eb99"]]);
|
||||||
export {
|
export {
|
||||||
ServerStartView as default
|
ServerStartView as default
|
||||||
};
|
};
|
||||||
//# sourceMappingURL=ServerStartView-CqRVtr1h.js.map
|
//# sourceMappingURL=ServerStartView-kWuF5BS_.js.map
|
||||||
1
comfy/web/assets/ServerStartView-kWuF5BS_.js.map
generated
vendored
Normal file
1
comfy/web/assets/ServerStartView-kWuF5BS_.js.map
generated
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"version":3,"file":"ServerStartView-kWuF5BS_.js","sources":["../../src/views/ServerStartView.vue"],"sourcesContent":["<template>\n <div\n class=\"font-sans flex flex-col justify-center items-center h-screen m-0 text-neutral-300 bg-neutral-900 dark-theme pointer-events-auto\"\n >\n <h2 class=\"text-2xl font-bold\">\n {{ t(`serverStart.process.${status}`) }}\n <span v-if=\"status === ProgressStatus.ERROR\">\n v{{ electronVersion }}\n </span>\n </h2>\n <div\n v-if=\"status === ProgressStatus.ERROR\"\n class=\"flex items-center my-4 gap-2\"\n >\n <Button\n icon=\"pi pi-flag\"\n severity=\"secondary\"\n :label=\"t('serverStart.reportIssue')\"\n @click=\"reportIssue\"\n />\n <Button\n icon=\"pi pi-file\"\n severity=\"secondary\"\n :label=\"t('serverStart.openLogs')\"\n @click=\"openLogs\"\n />\n <Button\n icon=\"pi pi-refresh\"\n :label=\"t('serverStart.reinstall')\"\n @click=\"reinstall\"\n />\n </div>\n <BaseTerminal @created=\"terminalCreated\" />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport Button from 'primevue/button'\nimport { ref, onMounted, Ref } from 'vue'\nimport BaseTerminal from '@/components/bottomPanel/tabs/terminal/BaseTerminal.vue'\nimport { ProgressStatus } from '@comfyorg/comfyui-electron-types'\nimport { electronAPI } from '@/utils/envUtil'\nimport type { useTerminal } from '@/hooks/bottomPanelTabs/useTerminal'\nimport { Terminal } from '@xterm/xterm'\nimport { useI18n } from 'vue-i18n'\n\nconst electron = electronAPI()\nconst { t } = useI18n()\n\nconst status = ref<ProgressStatus>(ProgressStatus.INITIAL_STATE)\nconst electronVersion = ref<string>('')\nlet xterm: Terminal | undefined\n\nconst updateProgress = ({ status: newStatus }: { status: ProgressStatus }) => {\n status.value = newStatus\n if (newStatus !== ProgressStatus.ERROR) xterm?.clear()\n}\n\nconst terminalCreated = (\n { terminal, useAutoSize }: ReturnType<typeof useTerminal>,\n root: Ref<HTMLElement>\n) => {\n xterm = terminal\n\n useAutoSize(root, true, true)\n electron.onLogMessage((message: string) => {\n terminal.write(message)\n })\n\n terminal.options.cursorBlink = false\n terminal.options.disableStdin = true\n terminal.options.cursorInactiveStyle = 'block'\n}\n\nconst reinstall = () => electron.reinstall()\nconst reportIssue = () => {\n window.open('https://forum.comfy.org/c/v1-feedback/', '_blank')\n}\nconst openLogs = () => electron.openLogsFolder()\n\nonMounted(async () => {\n electron.sendReady()\n electron.onProgressUpdate(updateProgress)\n electronVersion.value = await electron.getElectronVersion()\n})\n</script>\n\n<style scoped>\n:deep(.xterm-helper-textarea) {\n /* Hide this as it moves all over when uv is running */\n display: none;\n}\n</style>\n"],"names":[],"mappings":";;;;;;;;;;;;;AA8CA,UAAM,WAAW,YAAY;AACvB,UAAA,EAAE,EAAE,IAAI,QAAQ;AAEhB,UAAA,SAAS,IAAoB,eAAe,aAAa;AACzD,UAAA,kBAAkB,IAAY,EAAE;AAClC,QAAA;AAEJ,UAAM,iBAAiB,wBAAC,EAAE,QAAQ,gBAA4C;AAC5E,aAAO,QAAQ;AACf,UAAI,cAAc,eAAe,MAAO,QAAO,MAAM;AAAA,IACvD,GAHuB;AAKvB,UAAM,kBAAkB,wBACtB,EAAE,UAAU,YAAA,GACZ,SACG;AACK,cAAA;AAEI,kBAAA,MAAM,MAAM,IAAI;AACnB,eAAA,aAAa,CAAC,YAAoB;AACzC,iBAAS,MAAM,OAAO;AAAA,MAAA,CACvB;AAED,eAAS,QAAQ,cAAc;AAC/B,eAAS,QAAQ,eAAe;AAChC,eAAS,QAAQ,sBAAsB;AAAA,IACzC,GAdwB;AAgBlB,UAAA,YAAY,6BAAM,SAAS,UAAU,GAAzB;AAClB,UAAM,cAAc,6BAAM;AACjB,aAAA,KAAK,0CAA0C,QAAQ;AAAA,IAChE,GAFoB;AAGd,UAAA,WAAW,6BAAM,SAAS,eAAe,GAA9B;AAEjB,cAAU,YAAY;AACpB,eAAS,UAAU;AACnB,eAAS,iBAAiB,cAAc;AACxB,sBAAA,QAAQ,MAAM,SAAS,mBAAmB;AAAA,IAAA,CAC3D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
||||||
97
comfy/web/assets/UserSelectView-D1x2NjYS.js
generated
vendored
Normal file
97
comfy/web/assets/UserSelectView-D1x2NjYS.js
generated
vendored
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
var __defProp = Object.defineProperty;
|
||||||
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
||||||
|
import { a as defineComponent, J as useUserStore, bQ as useRouter, r as ref, q as computed, o as onMounted, f as openBlock, g as createElementBlock, A as createBaseVNode, a6 as toDisplayString, h as createVNode, z as unref, ap as script, bJ as script$1, bR as script$2, x as createBlock, y as withCtx, ax as createTextVNode, bS as script$3, i as createCommentVNode, D as script$4 } from "./index-BQYg0VNJ.js";
|
||||||
|
const _hoisted_1 = {
|
||||||
|
id: "comfy-user-selection",
|
||||||
|
class: "font-sans flex flex-col items-center h-screen m-0 text-neutral-300 bg-neutral-900 dark-theme pointer-events-auto"
|
||||||
|
};
|
||||||
|
const _hoisted_2 = { class: "mt-[5vh] 2xl:mt-[20vh] min-w-84 relative rounded-lg bg-[var(--comfy-menu-bg)] p-5 px-10 shadow-lg" };
|
||||||
|
const _hoisted_3 = { class: "flex w-full flex-col items-center" };
|
||||||
|
const _hoisted_4 = { class: "flex w-full flex-col gap-2" };
|
||||||
|
const _hoisted_5 = { for: "new-user-input" };
|
||||||
|
const _hoisted_6 = { class: "flex w-full flex-col gap-2" };
|
||||||
|
const _hoisted_7 = { for: "existing-user-select" };
|
||||||
|
const _hoisted_8 = { class: "mt-5" };
|
||||||
|
const _sfc_main = /* @__PURE__ */ defineComponent({
|
||||||
|
__name: "UserSelectView",
|
||||||
|
setup(__props) {
|
||||||
|
const userStore = useUserStore();
|
||||||
|
const router = useRouter();
|
||||||
|
const selectedUser = ref(null);
|
||||||
|
const newUsername = ref("");
|
||||||
|
const loginError = ref("");
|
||||||
|
const createNewUser = computed(() => newUsername.value.trim() !== "");
|
||||||
|
const newUserExistsError = computed(() => {
|
||||||
|
return userStore.users.find((user) => user.username === newUsername.value) ? `User "${newUsername.value}" already exists` : "";
|
||||||
|
});
|
||||||
|
const error = computed(() => newUserExistsError.value || loginError.value);
|
||||||
|
const login = /* @__PURE__ */ __name(async () => {
|
||||||
|
try {
|
||||||
|
const user = createNewUser.value ? await userStore.createUser(newUsername.value) : selectedUser.value;
|
||||||
|
if (!user) {
|
||||||
|
throw new Error("No user selected");
|
||||||
|
}
|
||||||
|
userStore.login(user);
|
||||||
|
router.push("/");
|
||||||
|
} catch (err) {
|
||||||
|
loginError.value = err.message ?? JSON.stringify(err);
|
||||||
|
}
|
||||||
|
}, "login");
|
||||||
|
onMounted(async () => {
|
||||||
|
if (!userStore.initialized) {
|
||||||
|
await userStore.initialize();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return (_ctx, _cache) => {
|
||||||
|
return openBlock(), createElementBlock("div", _hoisted_1, [
|
||||||
|
createBaseVNode("main", _hoisted_2, [
|
||||||
|
_cache[2] || (_cache[2] = createBaseVNode("h1", { class: "my-2.5 mb-7 font-normal" }, "ComfyUI", -1)),
|
||||||
|
createBaseVNode("form", _hoisted_3, [
|
||||||
|
createBaseVNode("div", _hoisted_4, [
|
||||||
|
createBaseVNode("label", _hoisted_5, toDisplayString(_ctx.$t("userSelect.newUser")) + ":", 1),
|
||||||
|
createVNode(unref(script), {
|
||||||
|
id: "new-user-input",
|
||||||
|
modelValue: newUsername.value,
|
||||||
|
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => newUsername.value = $event),
|
||||||
|
placeholder: _ctx.$t("userSelect.enterUsername")
|
||||||
|
}, null, 8, ["modelValue", "placeholder"])
|
||||||
|
]),
|
||||||
|
createVNode(unref(script$1)),
|
||||||
|
createBaseVNode("div", _hoisted_6, [
|
||||||
|
createBaseVNode("label", _hoisted_7, toDisplayString(_ctx.$t("userSelect.existingUser")) + ":", 1),
|
||||||
|
createVNode(unref(script$2), {
|
||||||
|
modelValue: selectedUser.value,
|
||||||
|
"onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => selectedUser.value = $event),
|
||||||
|
class: "w-full",
|
||||||
|
inputId: "existing-user-select",
|
||||||
|
options: unref(userStore).users,
|
||||||
|
"option-label": "username",
|
||||||
|
placeholder: _ctx.$t("userSelect.selectUser"),
|
||||||
|
disabled: createNewUser.value
|
||||||
|
}, null, 8, ["modelValue", "options", "placeholder", "disabled"]),
|
||||||
|
error.value ? (openBlock(), createBlock(unref(script$3), {
|
||||||
|
key: 0,
|
||||||
|
severity: "error"
|
||||||
|
}, {
|
||||||
|
default: withCtx(() => [
|
||||||
|
createTextVNode(toDisplayString(error.value), 1)
|
||||||
|
]),
|
||||||
|
_: 1
|
||||||
|
})) : createCommentVNode("", true)
|
||||||
|
]),
|
||||||
|
createBaseVNode("footer", _hoisted_8, [
|
||||||
|
createVNode(unref(script$4), {
|
||||||
|
label: _ctx.$t("userSelect.next"),
|
||||||
|
onClick: login
|
||||||
|
}, null, 8, ["label"])
|
||||||
|
])
|
||||||
|
])
|
||||||
|
])
|
||||||
|
]);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
export {
|
||||||
|
_sfc_main as default
|
||||||
|
};
|
||||||
|
//# sourceMappingURL=UserSelectView-D1x2NjYS.js.map
|
||||||
1
comfy/web/assets/UserSelectView-D1x2NjYS.js.map
generated
vendored
Normal file
1
comfy/web/assets/UserSelectView-D1x2NjYS.js.map
generated
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"version":3,"file":"UserSelectView-D1x2NjYS.js","sources":["../../src/views/UserSelectView.vue"],"sourcesContent":["<template>\n <div\n id=\"comfy-user-selection\"\n class=\"font-sans flex flex-col items-center h-screen m-0 text-neutral-300 bg-neutral-900 dark-theme pointer-events-auto\"\n >\n <main\n class=\"mt-[5vh] 2xl:mt-[20vh] min-w-84 relative rounded-lg bg-[var(--comfy-menu-bg)] p-5 px-10 shadow-lg\"\n >\n <h1 class=\"my-2.5 mb-7 font-normal\">ComfyUI</h1>\n <form class=\"flex w-full flex-col items-center\">\n <div class=\"flex w-full flex-col gap-2\">\n <label for=\"new-user-input\">{{ $t('userSelect.newUser') }}:</label>\n <InputText\n id=\"new-user-input\"\n v-model=\"newUsername\"\n :placeholder=\"$t('userSelect.enterUsername')\"\n />\n </div>\n <Divider />\n <div class=\"flex w-full flex-col gap-2\">\n <label for=\"existing-user-select\"\n >{{ $t('userSelect.existingUser') }}:</label\n >\n <Select\n v-model=\"selectedUser\"\n class=\"w-full\"\n inputId=\"existing-user-select\"\n :options=\"userStore.users\"\n option-label=\"username\"\n :placeholder=\"$t('userSelect.selectUser')\"\n :disabled=\"createNewUser\"\n />\n <Message v-if=\"error\" severity=\"error\">{{ error }}</Message>\n </div>\n <footer class=\"mt-5\">\n <Button :label=\"$t('userSelect.next')\" @click=\"login\" />\n </footer>\n </form>\n </main>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport Button from 'primevue/button'\nimport Divider from 'primevue/divider'\nimport InputText from 'primevue/inputtext'\nimport Select from 'primevue/select'\nimport Message from 'primevue/message'\nimport { User, useUserStore } from '@/stores/userStore'\nimport { useRouter } from 'vue-router'\nimport { computed, onMounted, ref } from 'vue'\n\nconst userStore = useUserStore()\nconst router = useRouter()\n\nconst selectedUser = ref<User | null>(null)\nconst newUsername = ref('')\nconst loginError = ref('')\n\nconst createNewUser = computed(() => newUsername.value.trim() !== '')\nconst newUserExistsError = computed(() => {\n return userStore.users.find((user) => user.username === newUsername.value)\n ? `User \"${newUsername.value}\" already exists`\n : ''\n})\nconst error = computed(() => newUserExistsError.value || loginError.value)\n\nconst login = async () => {\n try {\n const user = createNewUser.value\n ? await userStore.createUser(newUsername.value)\n : selectedUser.value\n\n if (!user) {\n throw new Error('No user selected')\n }\n\n userStore.login(user)\n router.push('/')\n } catch (err) {\n loginError.value = err.message ?? JSON.stringify(err)\n }\n}\n\nonMounted(async () => {\n if (!userStore.initialized) {\n await userStore.initialize()\n }\n})\n</script>\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAoDA,UAAM,YAAY,aAAa;AAC/B,UAAM,SAAS,UAAU;AAEnB,UAAA,eAAe,IAAiB,IAAI;AACpC,UAAA,cAAc,IAAI,EAAE;AACpB,UAAA,aAAa,IAAI,EAAE;AAEzB,UAAM,gBAAgB,SAAS,MAAM,YAAY,MAAM,WAAW,EAAE;AAC9D,UAAA,qBAAqB,SAAS,MAAM;AACxC,aAAO,UAAU,MAAM,KAAK,CAAC,SAAS,KAAK,aAAa,YAAY,KAAK,IACrE,SAAS,YAAY,KAAK,qBAC1B;AAAA,IAAA,CACL;AACD,UAAM,QAAQ,SAAS,MAAM,mBAAmB,SAAS,WAAW,KAAK;AAEzE,UAAM,QAAQ,mCAAY;AACpB,UAAA;AACI,cAAA,OAAO,cAAc,QACvB,MAAM,UAAU,WAAW,YAAY,KAAK,IAC5C,aAAa;AAEjB,YAAI,CAAC,MAAM;AACH,gBAAA,IAAI,MAAM,kBAAkB;AAAA,QAAA;AAGpC,kBAAU,MAAM,IAAI;AACpB,eAAO,KAAK,GAAG;AAAA,eACR,KAAK;AACZ,mBAAW,QAAQ,IAAI,WAAW,KAAK,UAAU,GAAG;AAAA,MAAA;AAAA,IAExD,GAfc;AAiBd,cAAU,YAAY;AAChB,UAAA,CAAC,UAAU,aAAa;AAC1B,cAAM,UAAU,WAAW;AAAA,MAAA;AAAA,IAC7B,CACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
||||||
1
comfy/web/assets/WelcomeView-C4D1cggT.js.map
generated
vendored
1
comfy/web/assets/WelcomeView-C4D1cggT.js.map
generated
vendored
@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"WelcomeView-C4D1cggT.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
||||||
21
comfy/web/assets/WelcomeView-C4D1cggT.js → comfy/web/assets/WelcomeView-C5iZ_tHc.js
generated
vendored
21
comfy/web/assets/WelcomeView-C4D1cggT.js → comfy/web/assets/WelcomeView-C5iZ_tHc.js
generated
vendored
@ -1,17 +1,16 @@
|
|||||||
<<<<<<<< HEAD:comfy/web/assets/WelcomeView-CsOBuA3U.js
|
|
||||||
import { d as defineComponent, g as openBlock, h as createElementBlock, A as createBaseVNode, a4 as toDisplayString, i as createVNode, z as unref, D as script, _ as _export_sfc } from "./index-bi78Y1IN.js";
|
|
||||||
========
|
|
||||||
var __defProp = Object.defineProperty;
|
var __defProp = Object.defineProperty;
|
||||||
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
||||||
import { d as defineComponent, g as openBlock, h as createElementBlock, A as createBaseVNode, a6 as toDisplayString, i as createVNode, z as unref, D as script, P as pushScopeId, Q as popScopeId, _ as _export_sfc } from "./index-CoOvI8ZH.js";
|
import { a as defineComponent, bQ as useRouter, f as openBlock, g as createElementBlock, A as createBaseVNode, a6 as toDisplayString, h as createVNode, z as unref, D as script, _ as _export_sfc } from "./index-BQYg0VNJ.js";
|
||||||
const _withScopeId = /* @__PURE__ */ __name((n) => (pushScopeId("data-v-12b8b11b"), n = n(), popScopeId(), n), "_withScopeId");
|
|
||||||
>>>>>>>> 0fd4e6c7787daa922cb0d9bd1241b276b39ce2c5:comfy/web/assets/WelcomeView-C4D1cggT.js
|
|
||||||
const _hoisted_1 = { class: "font-sans flex flex-col justify-center items-center h-screen m-0 text-neutral-300 bg-neutral-900 dark-theme pointer-events-auto" };
|
const _hoisted_1 = { class: "font-sans flex flex-col justify-center items-center h-screen m-0 text-neutral-300 bg-neutral-900 dark-theme pointer-events-auto" };
|
||||||
const _hoisted_2 = { class: "flex flex-col items-center justify-center gap-8 p-8" };
|
const _hoisted_2 = { class: "flex flex-col items-center justify-center gap-8 p-8" };
|
||||||
const _hoisted_3 = { class: "animated-gradient-text text-glow select-none" };
|
const _hoisted_3 = { class: "animated-gradient-text text-glow select-none" };
|
||||||
const _sfc_main = /* @__PURE__ */ defineComponent({
|
const _sfc_main = /* @__PURE__ */ defineComponent({
|
||||||
__name: "WelcomeView",
|
__name: "WelcomeView",
|
||||||
setup(__props) {
|
setup(__props) {
|
||||||
|
const router = useRouter();
|
||||||
|
const navigateTo = /* @__PURE__ */ __name((path) => {
|
||||||
|
router.push(path);
|
||||||
|
}, "navigateTo");
|
||||||
return (_ctx, _cache) => {
|
return (_ctx, _cache) => {
|
||||||
return openBlock(), createElementBlock("div", _hoisted_1, [
|
return openBlock(), createElementBlock("div", _hoisted_1, [
|
||||||
createBaseVNode("div", _hoisted_2, [
|
createBaseVNode("div", _hoisted_2, [
|
||||||
@ -22,7 +21,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|||||||
iconPos: "right",
|
iconPos: "right",
|
||||||
size: "large",
|
size: "large",
|
||||||
rounded: "",
|
rounded: "",
|
||||||
onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$router.push("/install")),
|
onClick: _cache[0] || (_cache[0] = ($event) => navigateTo("/install")),
|
||||||
class: "p-4 text-lg fade-in-up"
|
class: "p-4 text-lg fade-in-up"
|
||||||
}, null, 8, ["label"])
|
}, null, 8, ["label"])
|
||||||
])
|
])
|
||||||
@ -30,12 +29,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
const WelcomeView = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-12b8b11b"]]);
|
const WelcomeView = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-c4d014c5"]]);
|
||||||
export {
|
export {
|
||||||
WelcomeView as default
|
WelcomeView as default
|
||||||
};
|
};
|
||||||
<<<<<<<< HEAD:comfy/web/assets/WelcomeView-CsOBuA3U.js
|
//# sourceMappingURL=WelcomeView-C5iZ_tHc.js.map
|
||||||
//# sourceMappingURL=WelcomeView-CsOBuA3U.js.map
|
|
||||||
========
|
|
||||||
//# sourceMappingURL=WelcomeView-C4D1cggT.js.map
|
|
||||||
>>>>>>>> 0fd4e6c7787daa922cb0d9bd1241b276b39ce2c5:comfy/web/assets/WelcomeView-C4D1cggT.js
|
|
||||||
1
comfy/web/assets/WelcomeView-C5iZ_tHc.js.map
generated
vendored
Normal file
1
comfy/web/assets/WelcomeView-C5iZ_tHc.js.map
generated
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"version":3,"file":"WelcomeView-C5iZ_tHc.js","sources":["../../src/views/WelcomeView.vue"],"sourcesContent":["<template>\n <div\n class=\"font-sans flex flex-col justify-center items-center h-screen m-0 text-neutral-300 bg-neutral-900 dark-theme pointer-events-auto\"\n >\n <div class=\"flex flex-col items-center justify-center gap-8 p-8\">\n <!-- Header -->\n <h1 class=\"animated-gradient-text text-glow select-none\">\n {{ $t('welcome.title') }}\n </h1>\n\n <!-- Get Started Button -->\n <Button\n :label=\"$t('welcome.getStarted')\"\n icon=\"pi pi-arrow-right\"\n iconPos=\"right\"\n size=\"large\"\n rounded\n @click=\"navigateTo('/install')\"\n class=\"p-4 text-lg fade-in-up\"\n />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport Button from 'primevue/button'\nimport { useRouter } from 'vue-router'\n\nconst router = useRouter()\nconst navigateTo = (path: string) => {\n router.push(path)\n}\n</script>\n\n<style scoped>\n.animated-gradient-text {\n @apply font-bold;\n font-size: clamp(2rem, 8vw, 4rem);\n background: linear-gradient(to right, #12c2e9, #c471ed, #f64f59, #12c2e9);\n background-size: 300% auto;\n background-clip: text;\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n animation: gradient 8s linear infinite;\n}\n\n.text-glow {\n filter: drop-shadow(0 0 8px rgba(255, 255, 255, 0.3));\n}\n\n@keyframes gradient {\n 0% {\n background-position: 0% center;\n }\n\n 100% {\n background-position: 300% center;\n }\n}\n\n.fade-in-up {\n animation: fadeInUp 1.5s ease-out;\n animation-fill-mode: both;\n}\n\n@keyframes fadeInUp {\n 0% {\n opacity: 0;\n transform: translateY(20px);\n }\n\n 100% {\n opacity: 1;\n transform: translateY(0);\n }\n}\n</style>\n"],"names":[],"mappings":";;;;;;;;;AA4BA,UAAM,SAAS,UAAU;AACnB,UAAA,aAAa,wBAAC,SAAiB;AACnC,aAAO,KAAK,IAAI;AAAA,IAClB,GAFmB;;;;;;;;;;;;;;;;;;;;"}
|
||||||
1
comfy/web/assets/WelcomeView-CsOBuA3U.js.map
generated
vendored
1
comfy/web/assets/WelcomeView-CsOBuA3U.js.map
generated
vendored
@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"WelcomeView-CsOBuA3U.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
||||||
14
comfy/web/assets/WelcomeView-D5nfld2b.css → comfy/web/assets/WelcomeView-IDMwvMd_.css
generated
vendored
14
comfy/web/assets/WelcomeView-D5nfld2b.css → comfy/web/assets/WelcomeView-IDMwvMd_.css
generated
vendored
@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
.animated-gradient-text[data-v-12b8b11b] {
|
.animated-gradient-text[data-v-c4d014c5] {
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
font-size: clamp(2rem, 8vw, 4rem);
|
font-size: clamp(2rem, 8vw, 4rem);
|
||||||
background: linear-gradient(to right, #12c2e9, #c471ed, #f64f59, #12c2e9);
|
background: linear-gradient(to right, #12c2e9, #c471ed, #f64f59, #12c2e9);
|
||||||
@ -7,12 +7,12 @@
|
|||||||
background-clip: text;
|
background-clip: text;
|
||||||
-webkit-background-clip: text;
|
-webkit-background-clip: text;
|
||||||
-webkit-text-fill-color: transparent;
|
-webkit-text-fill-color: transparent;
|
||||||
animation: gradient-12b8b11b 8s linear infinite;
|
animation: gradient-c4d014c5 8s linear infinite;
|
||||||
}
|
}
|
||||||
.text-glow[data-v-12b8b11b] {
|
.text-glow[data-v-c4d014c5] {
|
||||||
filter: drop-shadow(0 0 8px rgba(255, 255, 255, 0.3));
|
filter: drop-shadow(0 0 8px rgba(255, 255, 255, 0.3));
|
||||||
}
|
}
|
||||||
@keyframes gradient-12b8b11b {
|
@keyframes gradient-c4d014c5 {
|
||||||
0% {
|
0% {
|
||||||
background-position: 0% center;
|
background-position: 0% center;
|
||||||
}
|
}
|
||||||
@ -20,11 +20,11 @@
|
|||||||
background-position: 300% center;
|
background-position: 300% center;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.fade-in-up[data-v-12b8b11b] {
|
.fade-in-up[data-v-c4d014c5] {
|
||||||
animation: fadeInUp-12b8b11b 1.5s ease-out;
|
animation: fadeInUp-c4d014c5 1.5s ease-out;
|
||||||
animation-fill-mode: both;
|
animation-fill-mode: both;
|
||||||
}
|
}
|
||||||
@keyframes fadeInUp-12b8b11b {
|
@keyframes fadeInUp-c4d014c5 {
|
||||||
0% {
|
0% {
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
transform: translateY(20px);
|
transform: translateY(20px);
|
||||||
1
comfy/web/assets/images/Git-Logo-White.svg
generated
vendored
Normal file
1
comfy/web/assets/images/Git-Logo-White.svg
generated
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="292" height="92pt" viewBox="0 0 219 92"><defs><clipPath id="a"><path d="M159 .79h25V69h-25Zm0 0"/></clipPath><clipPath id="b"><path d="M183 9h35.371v60H183Zm0 0"/></clipPath><clipPath id="c"><path d="M0 .79h92V92H0Zm0 0"/></clipPath></defs><path style="stroke:none;fill-rule:nonzero;fill:#fff;fill-opacity:1" d="M130.871 31.836c-4.785 0-8.351 2.352-8.351 8.008 0 4.261 2.347 7.222 8.093 7.222 4.871 0 8.18-2.867 8.18-7.398 0-5.133-2.961-7.832-7.922-7.832Zm-9.57 39.95c-1.133 1.39-2.262 2.87-2.262 4.612 0 3.48 4.434 4.524 10.527 4.524 5.051 0 11.926-.352 11.926-5.043 0-2.793-3.308-2.965-7.488-3.227Zm25.761-39.688c1.563 2.004 3.22 4.789 3.22 8.793 0 9.656-7.571 15.316-18.536 15.316-2.789 0-5.312-.348-6.879-.785l-2.87 4.613 8.526.52c15.059.96 23.934 1.398 23.934 12.968 0 10.008-8.789 15.665-23.934 15.665-15.75 0-21.757-4.004-21.757-10.88 0-3.917 1.742-6 4.789-8.878-2.875-1.211-3.828-3.387-3.828-5.739 0-1.914.953-3.656 2.523-5.312 1.566-1.652 3.305-3.305 5.395-5.219-4.262-2.09-7.485-6.617-7.485-13.058 0-10.008 6.613-16.88 19.93-16.88 3.742 0 6.004.344 8.008.872h16.972v7.394l-8.007.61"/><g clip-path="url(#a)"><path style="stroke:none;fill-rule:nonzero;fill:#fff;fill-opacity:1" d="M170.379 16.281c-4.961 0-7.832-2.87-7.832-7.836 0-4.957 2.871-7.656 7.832-7.656 5.05 0 7.922 2.7 7.922 7.656 0 4.965-2.871 7.836-7.922 7.836Zm-11.227 52.305V61.71l4.438-.606c1.219-.175 1.394-.437 1.394-1.746V33.773c0-.953-.261-1.566-1.132-1.824l-4.7-1.656.957-7.047h18.016V59.36c0 1.399.086 1.57 1.395 1.746l4.437.606v6.875h-24.805"/></g><g clip-path="url(#b)"><path style="stroke:none;fill-rule:nonzero;fill:#fff;fill-opacity:1" d="M218.371 65.21c-3.742 1.825-9.223 3.481-14.187 3.481-10.356 0-14.27-4.175-14.27-14.015V31.879c0-.524 0-.871-.7-.871h-6.093v-7.746c7.664-.871 10.707-4.703 11.664-14.188h8.27v12.36c0 .609 0 .87.695.87h12.27v8.704h-12.965v20.797c0 5.136 1.218 7.136 5.918 7.136 2.437 0 4.96-.609 7.047-1.39l2.351 7.66"/></g><g clip-path="url(#c)"><path style="stroke:none;fill-rule:nonzero;fill:#fff;fill-opacity:1" d="M89.422 42.371 49.629 2.582a5.868 5.868 0 0 0-8.3 0l-8.263 8.262 10.48 10.484a6.965 6.965 0 0 1 7.173 1.668 6.98 6.98 0 0 1 1.656 7.215l10.102 10.105a6.963 6.963 0 0 1 7.214 1.657 6.976 6.976 0 0 1 0 9.875 6.98 6.98 0 0 1-9.879 0 6.987 6.987 0 0 1-1.519-7.594l-9.422-9.422v24.793a6.979 6.979 0 0 1 1.848 1.32 6.988 6.988 0 0 1 0 9.88c-2.73 2.726-7.153 2.726-9.875 0a6.98 6.98 0 0 1 0-9.88 6.893 6.893 0 0 1 2.285-1.523V34.398a6.893 6.893 0 0 1-2.285-1.523 6.988 6.988 0 0 1-1.508-7.637L29.004 14.902 1.719 42.187a5.868 5.868 0 0 0 0 8.301l39.793 39.793a5.868 5.868 0 0 0 8.3 0l39.61-39.605a5.873 5.873 0 0 0 0-8.305"/></g></svg>
|
||||||
|
After Width: | Height: | Size: 2.6 KiB |
BIN
comfy/web/assets/images/sad_girl.png
generated
vendored
Normal file
BIN
comfy/web/assets/images/sad_girl.png
generated
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 174 KiB |
72662
comfy/web/assets/index-CoOvI8ZH.js → comfy/web/assets/index-BQYg0VNJ.js
generated
vendored
72662
comfy/web/assets/index-CoOvI8ZH.js → comfy/web/assets/index-BQYg0VNJ.js
generated
vendored
File diff suppressed because one or more lines are too long
1
comfy/web/assets/index-BQYg0VNJ.js.map
generated
vendored
Normal file
1
comfy/web/assets/index-BQYg0VNJ.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
268
comfy/web/assets/index-U_o182q3.css → comfy/web/assets/index-BY_-AxSO.css
generated
vendored
268
comfy/web/assets/index-U_o182q3.css → comfy/web/assets/index-BY_-AxSO.css
generated
vendored
@ -68,14 +68,14 @@
|
|||||||
background-color: rgb(234 179 8 / var(--tw-bg-opacity, 1))
|
background-color: rgb(234 179 8 / var(--tw-bg-opacity, 1))
|
||||||
}
|
}
|
||||||
|
|
||||||
.search-box-input[data-v-f28148d1] {
|
.search-box-input[data-v-e10998c1] {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
padding-left: 36px;
|
padding-left: 36px;
|
||||||
}
|
}
|
||||||
.search-box-input.with-filter[data-v-f28148d1] {
|
.search-box-input.with-filter[data-v-e10998c1] {
|
||||||
padding-right: 36px;
|
padding-right: 36px;
|
||||||
}
|
}
|
||||||
.p-button.p-inputicon[data-v-f28148d1] {
|
.p-button.p-inputicon[data-v-e10998c1] {
|
||||||
padding: 0;
|
padding: 0;
|
||||||
width: auto;
|
width: auto;
|
||||||
border: none !important;
|
border: none !important;
|
||||||
@ -317,17 +317,10 @@
|
|||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
<<<<<<<< HEAD:comfy/web/assets/index-BObQyxMu.css
|
|
||||||
[data-v-2d6a9f91] .p-terminal .xterm {
|
|
||||||
overflow-x: auto;
|
|
||||||
}
|
|
||||||
[data-v-2d6a9f91] .p-terminal .xterm-screen {
|
|
||||||
========
|
|
||||||
[data-v-4f7907e3] .p-terminal .xterm {
|
[data-v-4f7907e3] .p-terminal .xterm {
|
||||||
overflow-x: auto;
|
overflow-x: auto;
|
||||||
}
|
}
|
||||||
[data-v-4f7907e3] .p-terminal .xterm-screen {
|
[data-v-4f7907e3] .p-terminal .xterm-screen {
|
||||||
>>>>>>>> 0fd4e6c7787daa922cb0d9bd1241b276b39ce2c5:comfy/web/assets/index-U_o182q3.css
|
|
||||||
background-color: black;
|
background-color: black;
|
||||||
overflow-y: hidden;
|
overflow-y: hidden;
|
||||||
}
|
}
|
||||||
@ -340,10 +333,10 @@
|
|||||||
overflow-y: hidden;
|
overflow-y: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
[data-v-e8581ca7] .p-terminal .xterm {
|
[data-v-36dec989] .p-terminal .xterm {
|
||||||
overflow-x: auto;
|
overflow-x: auto;
|
||||||
}
|
}
|
||||||
[data-v-e8581ca7] .p-terminal .xterm-screen {
|
[data-v-36dec989] .p-terminal .xterm-screen {
|
||||||
background-color: black;
|
background-color: black;
|
||||||
overflow-y: hidden;
|
overflow-y: hidden;
|
||||||
}
|
}
|
||||||
@ -352,7 +345,7 @@
|
|||||||
padding-top: 0px !important;
|
padding-top: 0px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.settings-container[data-v-dbb35a0c] {
|
.settings-container[data-v-5a032e0c] {
|
||||||
display: flex;
|
display: flex;
|
||||||
height: 70vh;
|
height: 70vh;
|
||||||
width: 60vw;
|
width: 60vw;
|
||||||
@ -360,21 +353,21 @@
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
@media (max-width: 768px) {
|
@media (max-width: 768px) {
|
||||||
.settings-container[data-v-dbb35a0c] {
|
.settings-container[data-v-5a032e0c] {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
height: auto;
|
height: auto;
|
||||||
}
|
}
|
||||||
.settings-sidebar[data-v-dbb35a0c] {
|
.settings-sidebar[data-v-5a032e0c] {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Show a separator line above the Keybinding tab */
|
/* Show a separator line above the Keybinding tab */
|
||||||
/* This indicates the start of custom setting panels */
|
/* This indicates the start of custom setting panels */
|
||||||
.settings-sidebar[data-v-dbb35a0c] .p-listbox-option[aria-label='Keybinding'] {
|
.settings-sidebar[data-v-5a032e0c] .p-listbox-option[aria-label='Keybinding'] {
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
.settings-sidebar[data-v-dbb35a0c] .p-listbox-option[aria-label='Keybinding']::before {
|
.settings-sidebar[data-v-5a032e0c] .p-listbox-option[aria-label='Keybinding']::before {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0px;
|
top: 0px;
|
||||||
left: 0px;
|
left: 0px;
|
||||||
@ -384,25 +377,25 @@
|
|||||||
border-top: 1px solid var(--p-divider-border-color);
|
border-top: 1px solid var(--p-divider-border-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
.pi-cog[data-v-f3b37ea3] {
|
.pi-cog[data-v-43089afc] {
|
||||||
font-size: 1.25rem;
|
font-size: 1.25rem;
|
||||||
margin-right: 0.5rem;
|
margin-right: 0.5rem;
|
||||||
}
|
}
|
||||||
.version-tag[data-v-f3b37ea3] {
|
.version-tag[data-v-43089afc] {
|
||||||
margin-left: 0.5rem;
|
margin-left: 0.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.comfy-error-report[data-v-db438f98] {
|
.comfy-error-report[data-v-5c200f18] {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
gap: 1rem;
|
gap: 1rem;
|
||||||
}
|
}
|
||||||
.action-container[data-v-db438f98] {
|
.action-container[data-v-5c200f18] {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 1rem;
|
gap: 1rem;
|
||||||
justify-content: flex-end;
|
justify-content: flex-end;
|
||||||
}
|
}
|
||||||
.wrapper-pre[data-v-db438f98] {
|
.wrapper-pre[data-v-5c200f18] {
|
||||||
white-space: pre-wrap;
|
white-space: pre-wrap;
|
||||||
word-wrap: break-word;
|
word-wrap: break-word;
|
||||||
}
|
}
|
||||||
@ -414,6 +407,10 @@
|
|||||||
[data-v-98830966] .p-card-subtitle {
|
[data-v-98830966] .p-card-subtitle {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.prompt-dialog-content[data-v-abaaab2c] {
|
||||||
|
white-space: pre-wrap;
|
||||||
|
}
|
||||||
.mdi.rotate270::before {
|
.mdi.rotate270::before {
|
||||||
transform: rotate(270deg);
|
transform: rotate(270deg);
|
||||||
}
|
}
|
||||||
@ -743,7 +740,7 @@
|
|||||||
word-break: break-all;
|
word-break: break-all;
|
||||||
}
|
}
|
||||||
|
|
||||||
[data-v-b7c3d32e] .tree-explorer-node-label {
|
[data-v-82fb18cb] .tree-explorer-node-label {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@ -756,10 +753,10 @@
|
|||||||
* By setting the position to relative on the parent and using an absolutely positioned pseudo-element,
|
* By setting the position to relative on the parent and using an absolutely positioned pseudo-element,
|
||||||
* we can create a visual indicator for the drop target without affecting the layout of other elements.
|
* we can create a visual indicator for the drop target without affecting the layout of other elements.
|
||||||
*/
|
*/
|
||||||
[data-v-b7c3d32e] .p-tree-node-content:has(.tree-folder) {
|
[data-v-82fb18cb] .p-tree-node-content:has(.tree-folder) {
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
[data-v-b7c3d32e] .p-tree-node-content:has(.tree-folder.can-drop)::after {
|
[data-v-82fb18cb] .p-tree-node-content:has(.tree-folder.can-drop)::after {
|
||||||
content: '';
|
content: '';
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0;
|
top: 0;
|
||||||
@ -849,23 +846,23 @@
|
|||||||
vertical-align: top;
|
vertical-align: top;
|
||||||
}
|
}
|
||||||
|
|
||||||
[data-v-827f7782] .pi-fake-spacer {
|
[data-v-31a92a0f] .pi-fake-spacer {
|
||||||
height: 1px;
|
height: 1px;
|
||||||
width: 16px;
|
width: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.slot_row[data-v-4b126b34] {
|
.slot_row[data-v-e86c3783] {
|
||||||
padding: 2px;
|
padding: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Original N-Sidebar styles */
|
/* Original N-Sidebar styles */
|
||||||
._sb_dot[data-v-4b126b34] {
|
._sb_dot[data-v-e86c3783] {
|
||||||
width: 8px;
|
width: 8px;
|
||||||
height: 8px;
|
height: 8px;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
background-color: grey;
|
background-color: grey;
|
||||||
}
|
}
|
||||||
.node_header[data-v-4b126b34] {
|
.node_header[data-v-e86c3783] {
|
||||||
line-height: 1;
|
line-height: 1;
|
||||||
padding: 8px 13px 7px;
|
padding: 8px 13px 7px;
|
||||||
margin-bottom: 5px;
|
margin-bottom: 5px;
|
||||||
@ -875,37 +872,37 @@
|
|||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
.headdot[data-v-4b126b34] {
|
.headdot[data-v-e86c3783] {
|
||||||
width: 10px;
|
width: 10px;
|
||||||
height: 10px;
|
height: 10px;
|
||||||
float: inline-start;
|
float: inline-start;
|
||||||
margin-right: 8px;
|
margin-right: 8px;
|
||||||
}
|
}
|
||||||
.IMAGE[data-v-4b126b34] {
|
.IMAGE[data-v-e86c3783] {
|
||||||
background-color: #64b5f6;
|
background-color: #64b5f6;
|
||||||
}
|
}
|
||||||
.VAE[data-v-4b126b34] {
|
.VAE[data-v-e86c3783] {
|
||||||
background-color: #ff6e6e;
|
background-color: #ff6e6e;
|
||||||
}
|
}
|
||||||
.LATENT[data-v-4b126b34] {
|
.LATENT[data-v-e86c3783] {
|
||||||
background-color: #ff9cf9;
|
background-color: #ff9cf9;
|
||||||
}
|
}
|
||||||
.MASK[data-v-4b126b34] {
|
.MASK[data-v-e86c3783] {
|
||||||
background-color: #81c784;
|
background-color: #81c784;
|
||||||
}
|
}
|
||||||
.CONDITIONING[data-v-4b126b34] {
|
.CONDITIONING[data-v-e86c3783] {
|
||||||
background-color: #ffa931;
|
background-color: #ffa931;
|
||||||
}
|
}
|
||||||
.CLIP[data-v-4b126b34] {
|
.CLIP[data-v-e86c3783] {
|
||||||
background-color: #ffd500;
|
background-color: #ffd500;
|
||||||
}
|
}
|
||||||
.MODEL[data-v-4b126b34] {
|
.MODEL[data-v-e86c3783] {
|
||||||
background-color: #b39ddb;
|
background-color: #b39ddb;
|
||||||
}
|
}
|
||||||
.CONTROL_NET[data-v-4b126b34] {
|
.CONTROL_NET[data-v-e86c3783] {
|
||||||
background-color: #a5d6a7;
|
background-color: #a5d6a7;
|
||||||
}
|
}
|
||||||
._sb_node_preview[data-v-4b126b34] {
|
._sb_node_preview[data-v-e86c3783] {
|
||||||
background-color: var(--comfy-menu-bg);
|
background-color: var(--comfy-menu-bg);
|
||||||
font-family: 'Open Sans', sans-serif;
|
font-family: 'Open Sans', sans-serif;
|
||||||
font-size: small;
|
font-size: small;
|
||||||
@ -922,7 +919,7 @@
|
|||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
padding-bottom: 10px;
|
padding-bottom: 10px;
|
||||||
}
|
}
|
||||||
._sb_node_preview ._sb_description[data-v-4b126b34] {
|
._sb_node_preview ._sb_description[data-v-e86c3783] {
|
||||||
margin: 10px;
|
margin: 10px;
|
||||||
padding: 6px;
|
padding: 6px;
|
||||||
background: var(--border-color);
|
background: var(--border-color);
|
||||||
@ -932,7 +929,7 @@
|
|||||||
font-size: 0.9rem;
|
font-size: 0.9rem;
|
||||||
word-break: break-word;
|
word-break: break-word;
|
||||||
}
|
}
|
||||||
._sb_table[data-v-4b126b34] {
|
._sb_table[data-v-e86c3783] {
|
||||||
display: grid;
|
display: grid;
|
||||||
|
|
||||||
grid-column-gap: 10px;
|
grid-column-gap: 10px;
|
||||||
@ -940,7 +937,7 @@
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
/* Imposta la larghezza della tabella al 100% del contenitore */
|
/* Imposta la larghezza della tabella al 100% del contenitore */
|
||||||
}
|
}
|
||||||
._sb_row[data-v-4b126b34] {
|
._sb_row[data-v-e86c3783] {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: 10px 1fr 1fr 1fr 10px;
|
grid-template-columns: 10px 1fr 1fr 1fr 10px;
|
||||||
grid-column-gap: 10px;
|
grid-column-gap: 10px;
|
||||||
@ -948,10 +945,10 @@
|
|||||||
padding-left: 9px;
|
padding-left: 9px;
|
||||||
padding-right: 9px;
|
padding-right: 9px;
|
||||||
}
|
}
|
||||||
._sb_row_string[data-v-4b126b34] {
|
._sb_row_string[data-v-e86c3783] {
|
||||||
grid-template-columns: 10px 1fr 1fr 10fr 1fr;
|
grid-template-columns: 10px 1fr 1fr 10fr 1fr;
|
||||||
}
|
}
|
||||||
._sb_col[data-v-4b126b34] {
|
._sb_col[data-v-e86c3783] {
|
||||||
border: 0px solid #000;
|
border: 0px solid #000;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: flex-end;
|
align-items: flex-end;
|
||||||
@ -960,10 +957,10 @@
|
|||||||
align-content: flex-start;
|
align-content: flex-start;
|
||||||
justify-content: flex-end;
|
justify-content: flex-end;
|
||||||
}
|
}
|
||||||
._sb_inherit[data-v-4b126b34] {
|
._sb_inherit[data-v-e86c3783] {
|
||||||
display: inherit;
|
display: inherit;
|
||||||
}
|
}
|
||||||
._long_field[data-v-4b126b34] {
|
._long_field[data-v-e86c3783] {
|
||||||
background: var(--bg-color);
|
background: var(--bg-color);
|
||||||
border: 2px solid var(--border-color);
|
border: 2px solid var(--border-color);
|
||||||
margin: 5px 5px 0 5px;
|
margin: 5px 5px 0 5px;
|
||||||
@ -971,45 +968,45 @@
|
|||||||
line-height: 1.7;
|
line-height: 1.7;
|
||||||
text-wrap: nowrap;
|
text-wrap: nowrap;
|
||||||
}
|
}
|
||||||
._sb_arrow[data-v-4b126b34] {
|
._sb_arrow[data-v-e86c3783] {
|
||||||
color: var(--fg-color);
|
color: var(--fg-color);
|
||||||
}
|
}
|
||||||
._sb_preview_badge[data-v-4b126b34] {
|
._sb_preview_badge[data-v-e86c3783] {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
background: var(--comfy-input-bg);
|
background: var(--comfy-input-bg);
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: var(--error-text);
|
color: var(--error-text);
|
||||||
}
|
}
|
||||||
|
|
||||||
.node-lib-node-container[data-v-90dfee08] {
|
.node-lib-node-container[data-v-20bd95eb] {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
width: 100%
|
width: 100%
|
||||||
}
|
}
|
||||||
|
|
||||||
.p-selectbutton .p-button[data-v-91077f2a] {
|
.p-selectbutton .p-button[data-v-29268946] {
|
||||||
padding: 0.5rem;
|
padding: 0.5rem;
|
||||||
}
|
}
|
||||||
.p-selectbutton .p-button .pi[data-v-91077f2a] {
|
.p-selectbutton .p-button .pi[data-v-29268946] {
|
||||||
font-size: 1.5rem;
|
font-size: 1.5rem;
|
||||||
}
|
}
|
||||||
.field[data-v-91077f2a] {
|
.field[data-v-29268946] {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
gap: 0.5rem;
|
gap: 0.5rem;
|
||||||
}
|
}
|
||||||
.color-picker-container[data-v-91077f2a] {
|
.color-picker-container[data-v-29268946] {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 0.5rem;
|
gap: 0.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
._content[data-v-e7b35fd9] {
|
._content[data-v-2fc57c5b] {
|
||||||
|
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|
||||||
flex-direction: column
|
flex-direction: column
|
||||||
}
|
}
|
||||||
._content[data-v-e7b35fd9] > :not([hidden]) ~ :not([hidden]) {
|
._content[data-v-2fc57c5b] > :not([hidden]) ~ :not([hidden]) {
|
||||||
|
|
||||||
--tw-space-y-reverse: 0;
|
--tw-space-y-reverse: 0;
|
||||||
|
|
||||||
@ -1017,7 +1014,7 @@
|
|||||||
|
|
||||||
margin-bottom: calc(0.5rem * var(--tw-space-y-reverse))
|
margin-bottom: calc(0.5rem * var(--tw-space-y-reverse))
|
||||||
}
|
}
|
||||||
._footer[data-v-e7b35fd9] {
|
._footer[data-v-2fc57c5b] {
|
||||||
|
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|
||||||
@ -1028,10 +1025,10 @@
|
|||||||
padding-top: 1rem
|
padding-top: 1rem
|
||||||
}
|
}
|
||||||
|
|
||||||
.comfy-image-wrap[data-v-9bc23daf] {
|
.comfy-image-wrap[data-v-ffe66146] {
|
||||||
display: contents;
|
display: contents;
|
||||||
}
|
}
|
||||||
.comfy-image-blur[data-v-9bc23daf] {
|
.comfy-image-blur[data-v-ffe66146] {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0;
|
top: 0;
|
||||||
left: 0;
|
left: 0;
|
||||||
@ -1040,7 +1037,7 @@
|
|||||||
-o-object-fit: cover;
|
-o-object-fit: cover;
|
||||||
object-fit: cover;
|
object-fit: cover;
|
||||||
}
|
}
|
||||||
.comfy-image-main[data-v-9bc23daf] {
|
.comfy-image-main[data-v-ffe66146] {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
-o-object-fit: cover;
|
-o-object-fit: cover;
|
||||||
@ -1049,19 +1046,19 @@
|
|||||||
object-position: center;
|
object-position: center;
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
}
|
}
|
||||||
.contain .comfy-image-wrap[data-v-9bc23daf] {
|
.contain .comfy-image-wrap[data-v-ffe66146] {
|
||||||
position: relative;
|
position: relative;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
.contain .comfy-image-main[data-v-9bc23daf] {
|
.contain .comfy-image-main[data-v-ffe66146] {
|
||||||
-o-object-fit: contain;
|
-o-object-fit: contain;
|
||||||
object-fit: contain;
|
object-fit: contain;
|
||||||
-webkit-backdrop-filter: blur(10px);
|
-webkit-backdrop-filter: blur(10px);
|
||||||
backdrop-filter: blur(10px);
|
backdrop-filter: blur(10px);
|
||||||
position: absolute;
|
position: absolute;
|
||||||
}
|
}
|
||||||
.broken-image-placeholder[data-v-9bc23daf] {
|
.broken-image-placeholder[data-v-ffe66146] {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@ -1070,7 +1067,7 @@
|
|||||||
height: 100%;
|
height: 100%;
|
||||||
margin: 2rem;
|
margin: 2rem;
|
||||||
}
|
}
|
||||||
.broken-image-placeholder i[data-v-9bc23daf] {
|
.broken-image-placeholder i[data-v-ffe66146] {
|
||||||
font-size: 3rem;
|
font-size: 3rem;
|
||||||
margin-bottom: 0.5rem;
|
margin-bottom: 0.5rem;
|
||||||
}
|
}
|
||||||
@ -1171,17 +1168,17 @@ img.galleria-image {
|
|||||||
z-index: 1;
|
z-index: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
.scroll-container[data-v-93f5af09] {
|
.scroll-container[data-v-375f3c50] {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
}
|
}
|
||||||
.scroll-container[data-v-93f5af09]::-webkit-scrollbar {
|
.scroll-container[data-v-375f3c50]::-webkit-scrollbar {
|
||||||
width: 1px;
|
width: 1px;
|
||||||
}
|
}
|
||||||
.scroll-container[data-v-93f5af09]::-webkit-scrollbar-thumb {
|
.scroll-container[data-v-375f3c50]::-webkit-scrollbar-thumb {
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
}
|
}
|
||||||
.queue-grid[data-v-93f5af09] {
|
.queue-grid[data-v-375f3c50] {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
|
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
|
||||||
padding: 0.5rem;
|
padding: 0.5rem;
|
||||||
@ -2023,12 +2020,22 @@ img.galleria-image {
|
|||||||
.z-\[1000\]{
|
.z-\[1000\]{
|
||||||
z-index: 1000;
|
z-index: 1000;
|
||||||
}
|
}
|
||||||
|
.col-start-1{
|
||||||
|
grid-column-start: 1;
|
||||||
|
}
|
||||||
|
.row-start-1{
|
||||||
|
grid-row-start: 1;
|
||||||
|
}
|
||||||
.m-0{
|
.m-0{
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
}
|
}
|
||||||
.m-2{
|
.m-2{
|
||||||
margin: 0.5rem;
|
margin: 0.5rem;
|
||||||
}
|
}
|
||||||
|
.mx-0{
|
||||||
|
margin-left: 0px;
|
||||||
|
margin-right: 0px;
|
||||||
|
}
|
||||||
.mx-1{
|
.mx-1{
|
||||||
margin-left: 0.25rem;
|
margin-left: 0.25rem;
|
||||||
margin-right: 0.25rem;
|
margin-right: 0.25rem;
|
||||||
@ -2041,6 +2048,10 @@ img.galleria-image {
|
|||||||
margin-left: 1.5rem;
|
margin-left: 1.5rem;
|
||||||
margin-right: 1.5rem;
|
margin-right: 1.5rem;
|
||||||
}
|
}
|
||||||
|
.mx-auto{
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
.my-0{
|
.my-0{
|
||||||
margin-top: 0px;
|
margin-top: 0px;
|
||||||
margin-bottom: 0px;
|
margin-bottom: 0px;
|
||||||
@ -2049,6 +2060,10 @@ img.galleria-image {
|
|||||||
margin-top: 0.25rem;
|
margin-top: 0.25rem;
|
||||||
margin-bottom: 0.25rem;
|
margin-bottom: 0.25rem;
|
||||||
}
|
}
|
||||||
|
.my-2\.5{
|
||||||
|
margin-top: 0.625rem;
|
||||||
|
margin-bottom: 0.625rem;
|
||||||
|
}
|
||||||
.my-4{
|
.my-4{
|
||||||
margin-top: 1rem;
|
margin-top: 1rem;
|
||||||
margin-bottom: 1rem;
|
margin-bottom: 1rem;
|
||||||
@ -2065,6 +2080,9 @@ img.galleria-image {
|
|||||||
.mb-6{
|
.mb-6{
|
||||||
margin-bottom: 1.5rem;
|
margin-bottom: 1.5rem;
|
||||||
}
|
}
|
||||||
|
.mb-7{
|
||||||
|
margin-bottom: 1.75rem;
|
||||||
|
}
|
||||||
.ml-2{
|
.ml-2{
|
||||||
margin-left: 0.5rem;
|
margin-left: 0.5rem;
|
||||||
}
|
}
|
||||||
@ -2089,9 +2107,15 @@ img.galleria-image {
|
|||||||
.mt-2{
|
.mt-2{
|
||||||
margin-top: 0.5rem;
|
margin-top: 0.5rem;
|
||||||
}
|
}
|
||||||
|
.mt-24{
|
||||||
|
margin-top: 6rem;
|
||||||
|
}
|
||||||
.mt-4{
|
.mt-4{
|
||||||
margin-top: 1rem;
|
margin-top: 1rem;
|
||||||
}
|
}
|
||||||
|
.mt-5{
|
||||||
|
margin-top: 1.25rem;
|
||||||
|
}
|
||||||
.mt-\[5vh\]{
|
.mt-\[5vh\]{
|
||||||
margin-top: 5vh;
|
margin-top: 5vh;
|
||||||
}
|
}
|
||||||
@ -2180,6 +2204,12 @@ img.galleria-image {
|
|||||||
.w-full{
|
.w-full{
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
.w-screen{
|
||||||
|
width: 100vw;
|
||||||
|
}
|
||||||
|
.min-w-84{
|
||||||
|
min-width: 22rem;
|
||||||
|
}
|
||||||
.min-w-96{
|
.min-w-96{
|
||||||
min-width: 26rem;
|
min-width: 26rem;
|
||||||
}
|
}
|
||||||
@ -2192,6 +2222,9 @@ img.galleria-image {
|
|||||||
.max-w-full{
|
.max-w-full{
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
}
|
}
|
||||||
|
.max-w-screen-sm{
|
||||||
|
max-width: 640px;
|
||||||
|
}
|
||||||
.flex-1{
|
.flex-1{
|
||||||
flex: 1 1 0%;
|
flex: 1 1 0%;
|
||||||
}
|
}
|
||||||
@ -2204,6 +2237,9 @@ img.galleria-image {
|
|||||||
.flex-grow{
|
.flex-grow{
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
}
|
}
|
||||||
|
.flex-grow-0{
|
||||||
|
flex-grow: 0;
|
||||||
|
}
|
||||||
.grow{
|
.grow{
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
}
|
}
|
||||||
@ -2232,6 +2268,9 @@ img.galleria-image {
|
|||||||
.resize{
|
.resize{
|
||||||
resize: both;
|
resize: both;
|
||||||
}
|
}
|
||||||
|
.list-inside{
|
||||||
|
list-style-position: inside;
|
||||||
|
}
|
||||||
.list-disc{
|
.list-disc{
|
||||||
list-style-type: disc;
|
list-style-type: disc;
|
||||||
}
|
}
|
||||||
@ -2241,6 +2280,9 @@ img.galleria-image {
|
|||||||
.flex-row{
|
.flex-row{
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
}
|
}
|
||||||
|
.flex-row-reverse{
|
||||||
|
flex-direction: row-reverse;
|
||||||
|
}
|
||||||
.flex-col{
|
.flex-col{
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
@ -2250,6 +2292,12 @@ img.galleria-image {
|
|||||||
.flex-nowrap{
|
.flex-nowrap{
|
||||||
flex-wrap: nowrap;
|
flex-wrap: nowrap;
|
||||||
}
|
}
|
||||||
|
.place-content-center{
|
||||||
|
place-content: center;
|
||||||
|
}
|
||||||
|
.place-items-center{
|
||||||
|
place-items: center;
|
||||||
|
}
|
||||||
.content-around{
|
.content-around{
|
||||||
align-content: space-around;
|
align-content: space-around;
|
||||||
}
|
}
|
||||||
@ -2296,6 +2344,11 @@ img.galleria-image {
|
|||||||
margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse)));
|
margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse)));
|
||||||
margin-bottom: calc(0.5rem * var(--tw-space-y-reverse));
|
margin-bottom: calc(0.5rem * var(--tw-space-y-reverse));
|
||||||
}
|
}
|
||||||
|
.space-y-4 > :not([hidden]) ~ :not([hidden]){
|
||||||
|
--tw-space-y-reverse: 0;
|
||||||
|
margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse)));
|
||||||
|
margin-bottom: calc(1rem * var(--tw-space-y-reverse));
|
||||||
|
}
|
||||||
.justify-self-end{
|
.justify-self-end{
|
||||||
justify-self: end;
|
justify-self: end;
|
||||||
}
|
}
|
||||||
@ -2350,6 +2403,9 @@ img.galleria-image {
|
|||||||
.border-none{
|
.border-none{
|
||||||
border-style: none;
|
border-style: none;
|
||||||
}
|
}
|
||||||
|
.bg-\[var\(--comfy-menu-bg\)\]{
|
||||||
|
background-color: var(--comfy-menu-bg);
|
||||||
|
}
|
||||||
.bg-\[var\(--p-tree-background\)\]{
|
.bg-\[var\(--p-tree-background\)\]{
|
||||||
background-color: var(--p-tree-background);
|
background-color: var(--p-tree-background);
|
||||||
}
|
}
|
||||||
@ -2365,6 +2421,10 @@ img.galleria-image {
|
|||||||
--tw-bg-opacity: 1;
|
--tw-bg-opacity: 1;
|
||||||
background-color: rgb(150 206 76 / var(--tw-bg-opacity, 1));
|
background-color: rgb(150 206 76 / var(--tw-bg-opacity, 1));
|
||||||
}
|
}
|
||||||
|
.bg-neutral-300{
|
||||||
|
--tw-bg-opacity: 1;
|
||||||
|
background-color: rgb(212 212 212 / var(--tw-bg-opacity, 1));
|
||||||
|
}
|
||||||
.bg-neutral-800{
|
.bg-neutral-800{
|
||||||
--tw-bg-opacity: 1;
|
--tw-bg-opacity: 1;
|
||||||
background-color: rgb(38 38 38 / var(--tw-bg-opacity, 1));
|
background-color: rgb(38 38 38 / var(--tw-bg-opacity, 1));
|
||||||
@ -2387,6 +2447,18 @@ img.galleria-image {
|
|||||||
.bg-opacity-50{
|
.bg-opacity-50{
|
||||||
--tw-bg-opacity: 0.5;
|
--tw-bg-opacity: 0.5;
|
||||||
}
|
}
|
||||||
|
.bg-\[url\(\'\/assets\/images\/Git-Logo-White\.svg\'\)\]{
|
||||||
|
background-image: url('../assets/images/Git-Logo-White.svg');
|
||||||
|
}
|
||||||
|
.bg-right-top{
|
||||||
|
background-position: right top;
|
||||||
|
}
|
||||||
|
.bg-no-repeat{
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
}
|
||||||
|
.bg-origin-padding{
|
||||||
|
background-origin: padding-box;
|
||||||
|
}
|
||||||
.object-cover{
|
.object-cover{
|
||||||
-o-object-fit: cover;
|
-o-object-fit: cover;
|
||||||
object-fit: cover;
|
object-fit: cover;
|
||||||
@ -2406,6 +2478,9 @@ img.galleria-image {
|
|||||||
.p-4{
|
.p-4{
|
||||||
padding: 1rem;
|
padding: 1rem;
|
||||||
}
|
}
|
||||||
|
.p-5{
|
||||||
|
padding: 1.25rem;
|
||||||
|
}
|
||||||
.p-8{
|
.p-8{
|
||||||
padding: 2rem;
|
padding: 2rem;
|
||||||
}
|
}
|
||||||
@ -2413,6 +2488,10 @@ img.galleria-image {
|
|||||||
padding-left: 0px;
|
padding-left: 0px;
|
||||||
padding-right: 0px;
|
padding-right: 0px;
|
||||||
}
|
}
|
||||||
|
.px-10{
|
||||||
|
padding-left: 2.5rem;
|
||||||
|
padding-right: 2.5rem;
|
||||||
|
}
|
||||||
.px-2{
|
.px-2{
|
||||||
padding-left: 0.5rem;
|
padding-left: 0.5rem;
|
||||||
padding-right: 0.5rem;
|
padding-right: 0.5rem;
|
||||||
@ -2432,6 +2511,9 @@ img.galleria-image {
|
|||||||
.pb-0{
|
.pb-0{
|
||||||
padding-bottom: 0px;
|
padding-bottom: 0px;
|
||||||
}
|
}
|
||||||
|
.pl-4{
|
||||||
|
padding-left: 1rem;
|
||||||
|
}
|
||||||
.pl-6{
|
.pl-6{
|
||||||
padding-left: 1.5rem;
|
padding-left: 1.5rem;
|
||||||
}
|
}
|
||||||
@ -2462,6 +2544,9 @@ img.galleria-image {
|
|||||||
.text-2xl{
|
.text-2xl{
|
||||||
font-size: 1.5rem;
|
font-size: 1.5rem;
|
||||||
}
|
}
|
||||||
|
.text-4xl{
|
||||||
|
font-size: 2.25rem;
|
||||||
|
}
|
||||||
.text-lg{
|
.text-lg{
|
||||||
font-size: 1.125rem;
|
font-size: 1.125rem;
|
||||||
}
|
}
|
||||||
@ -2483,6 +2568,9 @@ img.galleria-image {
|
|||||||
.font-medium{
|
.font-medium{
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
}
|
}
|
||||||
|
.font-normal{
|
||||||
|
font-weight: 400;
|
||||||
|
}
|
||||||
.font-semibold{
|
.font-semibold{
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
}
|
}
|
||||||
@ -2500,6 +2588,10 @@ img.galleria-image {
|
|||||||
--tw-text-opacity: 1;
|
--tw-text-opacity: 1;
|
||||||
color: rgb(203 213 224 / var(--tw-text-opacity, 1));
|
color: rgb(203 213 224 / var(--tw-text-opacity, 1));
|
||||||
}
|
}
|
||||||
|
.text-green-500{
|
||||||
|
--tw-text-opacity: 1;
|
||||||
|
color: rgb(150 206 76 / var(--tw-text-opacity, 1));
|
||||||
|
}
|
||||||
.text-highlight{
|
.text-highlight{
|
||||||
color: var(--p-primary-color);
|
color: var(--p-primary-color);
|
||||||
}
|
}
|
||||||
@ -2522,12 +2614,29 @@ img.galleria-image {
|
|||||||
--tw-text-opacity: 1;
|
--tw-text-opacity: 1;
|
||||||
color: rgb(163 163 163 / var(--tw-text-opacity, 1));
|
color: rgb(163 163 163 / var(--tw-text-opacity, 1));
|
||||||
}
|
}
|
||||||
|
.text-neutral-800{
|
||||||
|
--tw-text-opacity: 1;
|
||||||
|
color: rgb(38 38 38 / var(--tw-text-opacity, 1));
|
||||||
|
}
|
||||||
|
.text-neutral-900{
|
||||||
|
--tw-text-opacity: 1;
|
||||||
|
color: rgb(23 23 23 / var(--tw-text-opacity, 1));
|
||||||
|
}
|
||||||
|
.text-red-500{
|
||||||
|
--tw-text-opacity: 1;
|
||||||
|
color: rgb(239 68 68 / var(--tw-text-opacity, 1));
|
||||||
|
}
|
||||||
.no-underline{
|
.no-underline{
|
||||||
text-decoration-line: none;
|
text-decoration-line: none;
|
||||||
}
|
}
|
||||||
.opacity-0{
|
.opacity-0{
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
}
|
}
|
||||||
|
.shadow-lg{
|
||||||
|
--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
|
||||||
|
--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);
|
||||||
|
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
|
||||||
|
}
|
||||||
.outline{
|
.outline{
|
||||||
outline-style: solid;
|
outline-style: solid;
|
||||||
}
|
}
|
||||||
@ -2587,6 +2696,7 @@ img.galleria-image {
|
|||||||
--fg-color: #000;
|
--fg-color: #000;
|
||||||
--bg-color: #fff;
|
--bg-color: #fff;
|
||||||
--comfy-menu-bg: #353535;
|
--comfy-menu-bg: #353535;
|
||||||
|
--comfy-menu-secondary-bg: #292929;
|
||||||
--comfy-input-bg: #222;
|
--comfy-input-bg: #222;
|
||||||
--input-text: #ddd;
|
--input-text: #ddd;
|
||||||
--descrip-text: #999;
|
--descrip-text: #999;
|
||||||
@ -2757,8 +2867,8 @@ body {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.comfy-modal select,
|
.comfy-modal select,
|
||||||
.comfy-modal input[type=button],
|
.comfy-modal input[type='button'],
|
||||||
.comfy-modal input[type=checkbox] {
|
.comfy-modal input[type='checkbox'] {
|
||||||
margin: 3px 3px 3px 4px;
|
margin: 3px 3px 3px 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2872,8 +2982,8 @@ span.drag-handle {
|
|||||||
padding: 3px 4px;
|
padding: 3px 4px;
|
||||||
cursor: move;
|
cursor: move;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
margin-top: -.4em;
|
margin-top: -0.4em;
|
||||||
margin-left: -.2em;
|
margin-left: -0.2em;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
font-family: sans-serif;
|
font-family: sans-serif;
|
||||||
letter-spacing: 2px;
|
letter-spacing: 2px;
|
||||||
@ -2940,11 +3050,11 @@ button.comfy-queue-btn {
|
|||||||
z-index: 99;
|
z-index: 99;
|
||||||
}
|
}
|
||||||
|
|
||||||
.comfy-modal.comfy-settings input[type="range"] {
|
.comfy-modal.comfy-settings input[type='range'] {
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
}
|
}
|
||||||
|
|
||||||
.comfy-modal.comfy-settings input[type="range"] + input[type="number"] {
|
.comfy-modal.comfy-settings input[type='range'] + input[type='number'] {
|
||||||
width: 3.5em;
|
width: 3.5em;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3009,7 +3119,9 @@ button.comfy-queue-btn {
|
|||||||
padding-right: 8px;
|
padding-right: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.graphdialog input, .graphdialog textarea, .graphdialog select {
|
.graphdialog input,
|
||||||
|
.graphdialog textarea,
|
||||||
|
.graphdialog select {
|
||||||
background-color: var(--comfy-input-bg);
|
background-color: var(--comfy-input-bg);
|
||||||
border: 2px solid;
|
border: 2px solid;
|
||||||
border-color: var(--border-color);
|
border-color: var(--border-color);
|
||||||
@ -3071,7 +3183,8 @@ dialog::backdrop {
|
|||||||
text-align: right;
|
text-align: right;
|
||||||
}
|
}
|
||||||
|
|
||||||
#comfy-settings-dialog tbody button, #comfy-settings-dialog table > button {
|
#comfy-settings-dialog tbody button,
|
||||||
|
#comfy-settings-dialog table > button {
|
||||||
background-color: var(--bg-color);
|
background-color: var(--bg-color);
|
||||||
border: 1px var(--border-color) solid;
|
border: 1px var(--border-color) solid;
|
||||||
border-radius: 0;
|
border-radius: 0;
|
||||||
@ -3152,7 +3265,7 @@ dialog::backdrop {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.litemenu-entry.has_submenu::after {
|
.litemenu-entry.has_submenu::after {
|
||||||
content: ">";
|
content: '>';
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0;
|
top: 0;
|
||||||
right: 2px;
|
right: 2px;
|
||||||
@ -3166,7 +3279,8 @@ dialog::backdrop {
|
|||||||
will-change: transform;
|
will-change: transform;
|
||||||
}
|
}
|
||||||
|
|
||||||
.litegraph.litecontextmenu .litemenu-entry:hover:not(.disabled):not(.separator) {
|
.litegraph.litecontextmenu
|
||||||
|
.litemenu-entry:hover:not(.disabled):not(.separator) {
|
||||||
background-color: var(--comfy-menu-bg) !important;
|
background-color: var(--comfy-menu-bg) !important;
|
||||||
filter: brightness(155%);
|
filter: brightness(155%);
|
||||||
will-change: transform;
|
will-change: transform;
|
||||||
1880
comfy/web/assets/index-Ba5g1c58.js
generated
vendored
1880
comfy/web/assets/index-Ba5g1c58.js
generated
vendored
File diff suppressed because it is too large
Load Diff
1
comfy/web/assets/index-Ba5g1c58.js.map
generated
vendored
1
comfy/web/assets/index-Ba5g1c58.js.map
generated
vendored
File diff suppressed because one or more lines are too long
1
comfy/web/assets/index-Ba7IybyO.js.map
generated
vendored
1
comfy/web/assets/index-Ba7IybyO.js.map
generated
vendored
File diff suppressed because one or more lines are too long
780
comfy/web/assets/index-Ba7IybyO.js → comfy/web/assets/index-BfiYPlqA.js
generated
vendored
780
comfy/web/assets/index-Ba7IybyO.js → comfy/web/assets/index-BfiYPlqA.js
generated
vendored
File diff suppressed because it is too large
Load Diff
1
comfy/web/assets/index-BfiYPlqA.js.map
generated
vendored
Normal file
1
comfy/web/assets/index-BfiYPlqA.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
106
comfy/web/assets/index-BppSBmxJ.js
generated
vendored
106
comfy/web/assets/index-BppSBmxJ.js
generated
vendored
@ -1,106 +0,0 @@
|
|||||||
const IPC_CHANNELS = {
|
|
||||||
LOADING_PROGRESS: "loading-progress",
|
|
||||||
IS_PACKAGED: "is-packaged",
|
|
||||||
RENDERER_READY: "renderer-ready",
|
|
||||||
RESTART_APP: "restart-app",
|
|
||||||
REINSTALL: "reinstall",
|
|
||||||
LOG_MESSAGE: "log-message",
|
|
||||||
OPEN_DIALOG: "open-dialog",
|
|
||||||
DOWNLOAD_PROGRESS: "download-progress",
|
|
||||||
START_DOWNLOAD: "start-download",
|
|
||||||
PAUSE_DOWNLOAD: "pause-download",
|
|
||||||
RESUME_DOWNLOAD: "resume-download",
|
|
||||||
CANCEL_DOWNLOAD: "cancel-download",
|
|
||||||
DELETE_MODEL: "delete-model",
|
|
||||||
GET_ALL_DOWNLOADS: "get-all-downloads",
|
|
||||||
GET_ELECTRON_VERSION: "get-electron-version",
|
|
||||||
SEND_ERROR_TO_SENTRY: "send-error-to-sentry",
|
|
||||||
GET_BASE_PATH: "get-base-path",
|
|
||||||
GET_MODEL_CONFIG_PATH: "get-model-config-path",
|
|
||||||
OPEN_PATH: "open-path",
|
|
||||||
OPEN_LOGS_PATH: "open-logs-path",
|
|
||||||
OPEN_DEV_TOOLS: "open-dev-tools",
|
|
||||||
TERMINAL_WRITE: "execute-terminal-command",
|
|
||||||
TERMINAL_RESIZE: "resize-terminal",
|
|
||||||
TERMINAL_RESTORE: "restore-terminal",
|
|
||||||
TERMINAL_ON_OUTPUT: "terminal-output",
|
|
||||||
IS_FIRST_TIME_SETUP: "is-first-time-setup",
|
|
||||||
GET_SYSTEM_PATHS: "get-system-paths",
|
|
||||||
VALIDATE_INSTALL_PATH: "validate-install-path",
|
|
||||||
VALIDATE_COMFYUI_SOURCE: "validate-comfyui-source",
|
|
||||||
SHOW_DIRECTORY_PICKER: "show-directory-picker",
|
|
||||||
INSTALL_COMFYUI: "install-comfyui"
|
|
||||||
};
|
|
||||||
var ProgressStatus = /* @__PURE__ */ ((ProgressStatus2) => {
|
|
||||||
ProgressStatus2["INITIAL_STATE"] = "initial-state";
|
|
||||||
ProgressStatus2["PYTHON_SETUP"] = "python-setup";
|
|
||||||
ProgressStatus2["STARTING_SERVER"] = "starting-server";
|
|
||||||
ProgressStatus2["READY"] = "ready";
|
|
||||||
ProgressStatus2["ERROR"] = "error";
|
|
||||||
return ProgressStatus2;
|
|
||||||
})(ProgressStatus || {});
|
|
||||||
const ProgressMessages = {
|
|
||||||
[
|
|
||||||
"initial-state"
|
|
||||||
/* INITIAL_STATE */
|
|
||||||
]: "Loading...",
|
|
||||||
[
|
|
||||||
"python-setup"
|
|
||||||
/* PYTHON_SETUP */
|
|
||||||
]: "Setting up Python Environment...",
|
|
||||||
[
|
|
||||||
"starting-server"
|
|
||||||
/* STARTING_SERVER */
|
|
||||||
]: "Starting ComfyUI server...",
|
|
||||||
[
|
|
||||||
"ready"
|
|
||||||
/* READY */
|
|
||||||
]: "Finishing...",
|
|
||||||
[
|
|
||||||
"error"
|
|
||||||
/* ERROR */
|
|
||||||
]: "Was not able to start ComfyUI. Please check the logs for more details. You can open it from the Help menu. Please report issues to: https://forum.comfy.org"
|
|
||||||
};
|
|
||||||
const ELECTRON_BRIDGE_API = "electronAPI";
|
|
||||||
const SENTRY_URL_ENDPOINT = "https://942cadba58d247c9cab96f45221aa813@o4507954455314432.ingest.us.sentry.io/4508007940685824";
|
|
||||||
const MigrationItems = [
|
|
||||||
{
|
|
||||||
id: "user_files",
|
|
||||||
label: "User Files",
|
|
||||||
description: "Settings and user-created workflows"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: "models",
|
|
||||||
label: "Models",
|
|
||||||
description: "Reference model files from existing ComfyUI installations. (No copy)"
|
|
||||||
}
|
|
||||||
// TODO: Decide whether we want to auto-migrate custom nodes, and install their dependencies.
|
|
||||||
// huchenlei: This is a very essential thing for migration experience.
|
|
||||||
// {
|
|
||||||
// id: 'custom_nodes',
|
|
||||||
// label: 'Custom Nodes',
|
|
||||||
// description: 'Reference custom node files from existing ComfyUI installations. (No copy)',
|
|
||||||
// },
|
|
||||||
];
|
|
||||||
const DEFAULT_SERVER_ARGS = {
|
|
||||||
/** The host to use for the ComfyUI server. */
|
|
||||||
host: "127.0.0.1",
|
|
||||||
/** The port to use for the ComfyUI server. */
|
|
||||||
port: 8e3,
|
|
||||||
// Extra arguments to pass to the ComfyUI server.
|
|
||||||
extraServerArgs: {}
|
|
||||||
};
|
|
||||||
var DownloadStatus = /* @__PURE__ */ ((DownloadStatus2) => {
|
|
||||||
DownloadStatus2["PENDING"] = "pending";
|
|
||||||
DownloadStatus2["IN_PROGRESS"] = "in_progress";
|
|
||||||
DownloadStatus2["COMPLETED"] = "completed";
|
|
||||||
DownloadStatus2["PAUSED"] = "paused";
|
|
||||||
DownloadStatus2["ERROR"] = "error";
|
|
||||||
DownloadStatus2["CANCELLED"] = "cancelled";
|
|
||||||
return DownloadStatus2;
|
|
||||||
})(DownloadStatus || {});
|
|
||||||
export {
|
|
||||||
MigrationItems as M,
|
|
||||||
ProgressStatus as P
|
|
||||||
};
|
|
||||||
//# sourceMappingURL=index-BppSBmxJ.js.map
|
|
||||||
1
comfy/web/assets/index-BppSBmxJ.js.map
generated
vendored
1
comfy/web/assets/index-BppSBmxJ.js.map
generated
vendored
File diff suppressed because one or more lines are too long
15
comfy/web/assets/index-DK6Kev7f.js → comfy/web/assets/index-CMsGQEqY.js
generated
vendored
15
comfy/web/assets/index-DK6Kev7f.js → comfy/web/assets/index-CMsGQEqY.js
generated
vendored
@ -1,12 +1,7 @@
|
|||||||
var __defProp = Object.defineProperty;
|
var __defProp = Object.defineProperty;
|
||||||
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
||||||
<<<<<<<< HEAD:comfy/web/assets/index-ftUEqmu1.js
|
import { ba as script$s, f as openBlock, g as createElementBlock, m as mergeProps, A as createBaseVNode, B as BaseStyle, R as script$t, a6 as toDisplayString, a1 as Ripple, t as resolveDirective, v as withDirectives, x as createBlock, M as resolveDynamicComponent, bR as script$u, l as resolveComponent, C as normalizeClass, aw as createSlots, y as withCtx, bz as script$v, bq as script$w, P as Fragment, Q as renderList, ax as createTextVNode, bg as setAttribute, be as normalizeProps, p as renderSlot, i as createCommentVNode, ad as script$x, a4 as equals, bb as script$y, c0 as script$z, cl as getFirstFocusableElement, ah as OverlayEventBus, a8 as getVNodeProp, ag as resolveFieldData, cm as invokeElementMethod, a2 as getAttribute, cn as getNextElementSibling, Y as getOuterWidth, co as getPreviousElementSibling, D as script$A, as as script$B, a0 as script$C, bd as script$E, ac as isNotEmpty, bm as withModifiers, W as getOuterHeight, ae as UniqueComponentId, cp as _default, af as ZIndex, a3 as focus, aj as addStyle, al as absolutePosition, am as ConnectedOverlayScrollHandler, an as isTouchDevice, cq as FilterOperator, ar as script$F, cr as FocusTrap, h as createVNode, av as Transition, cs as withKeys, ct as getIndex, k as script$H, cu as isClickable, cv as clearSelection, cw as localeComparator, cx as sort, cy as FilterService, cg as FilterMatchMode, V as findSingle, bW as findIndexInList, bX as find, cz as exportCSV, X as getOffset, cA as getHiddenElementOuterWidth, cB as getHiddenElementOuterHeight, cC as reorderArray, cD as removeClass, cE as addClass, ai as isEmpty, aq as script$I, at as script$J } from "./index-BQYg0VNJ.js";
|
||||||
import { b6 as script$s, g as openBlock, h as createElementBlock, m as mergeProps, A as createBaseVNode, B as BaseStyle, P as script$t, a4 as toDisplayString, $ as Ripple, t as resolveDirective, v as withDirectives, x as createBlock, J as resolveDynamicComponent, c9 as script$u, l as resolveComponent, C as normalizeClass, au as createSlots, y as withCtx, bw as script$v, bm as script$w, N as Fragment, O as renderList, av as createTextVNode, bc as setAttribute, ba as normalizeProps, p as renderSlot, j as createCommentVNode, ab as script$x, a2 as equals, b7 as script$y, bR as script$z, ca as getFirstFocusableElement, af as OverlayEventBus, a6 as getVNodeProp, ae as resolveFieldData, cb as invokeElementMethod, a0 as getAttribute, cc as getNextElementSibling, W as getOuterWidth, cd as getPreviousElementSibling, D as script$A, aq as script$B, Z as script$C, b9 as script$E, aa as isNotEmpty, bi as withModifiers, U as getOuterHeight, ac as UniqueComponentId, ce as _default, ad as ZIndex, a1 as focus, ah as addStyle, aj as absolutePosition, ak as ConnectedOverlayScrollHandler, al as isTouchDevice, cf as FilterOperator, ap as script$F, cg as FocusTrap, i as createVNode, at as Transition, ch as withKeys, ci as getIndex, s as script$H, cj as isClickable, ck as clearSelection, cl as localeComparator, cm as sort, cn as FilterService, c5 as FilterMatchMode, R as findSingle, bL as findIndexInList, bM as find, co as exportCSV, V as getOffset, cp as getHiddenElementOuterWidth, cq as getHiddenElementOuterHeight, cr as reorderArray, cs as removeClass, ct as addClass, ag as isEmpty, ao as script$I, ar as script$J } from "./index-bi78Y1IN.js";
|
import { s as script$D, a as script$G } from "./index-DJqEjTnE.js";
|
||||||
import { s as script$D, a as script$G } from "./index-bCeMLtLM.js";
|
|
||||||
========
|
|
||||||
import { cb as script$s, A as createBaseVNode, g as openBlock, h as createElementBlock, m as mergeProps, B as BaseStyle, R as script$t, a6 as toDisplayString, a1 as Ripple, t as resolveDirective, v as withDirectives, x as createBlock, J as resolveDynamicComponent, cc as script$u, l as resolveComponent, C as normalizeClass, av as createSlots, y as withCtx, by as script$v, bo as script$w, N as Fragment, O as renderList, aw as createTextVNode, be as setAttribute, ad as UniqueComponentId, bc as normalizeProps, p as renderSlot, j as createCommentVNode, a4 as equals, b8 as script$x, bU as script$y, cd as getFirstFocusableElement, ag as OverlayEventBus, a8 as getVNodeProp, af as resolveFieldData, ce as invokeElementMethod, a2 as getAttribute, cf as getNextElementSibling, Y as getOuterWidth, cg as getPreviousElementSibling, D as script$z, ar as script$A, a0 as script$B, bb as script$D, ac as isNotEmpty, bk as withModifiers, W as getOuterHeight, ch as _default, ae as ZIndex, a3 as focus, ai as addStyle, ak as absolutePosition, al as ConnectedOverlayScrollHandler, am as isTouchDevice, ci as FilterOperator, aq as script$E, cj as FocusTrap, i as createVNode, au as Transition, ck as withKeys, cl as getIndex, s as script$G, cm as isClickable, cn as clearSelection, co as localeComparator, cp as sort, cq as FilterService, c6 as FilterMatchMode, V as findSingle, bO as findIndexInList, bP as find, cr as exportCSV, X as getOffset, cs as getHiddenElementOuterWidth, ct as getHiddenElementOuterHeight, cu as reorderArray, cv as getWindowScrollTop, cw as removeClass, cx as addClass, ah as isEmpty, ap as script$H, as as script$I } from "./index-CoOvI8ZH.js";
|
|
||||||
import { s as script$C, a as script$F } from "./index-D4DWQPPQ.js";
|
|
||||||
>>>>>>>> 0fd4e6c7787daa922cb0d9bd1241b276b39ce2c5:comfy/web/assets/index-DK6Kev7f.js
|
|
||||||
var script$r = {
|
var script$r = {
|
||||||
name: "ArrowDownIcon",
|
name: "ArrowDownIcon",
|
||||||
"extends": script$s
|
"extends": script$s
|
||||||
@ -8834,8 +8829,4 @@ export {
|
|||||||
script$d as a,
|
script$d as a,
|
||||||
script as s
|
script as s
|
||||||
};
|
};
|
||||||
<<<<<<<< HEAD:comfy/web/assets/index-ftUEqmu1.js
|
//# sourceMappingURL=index-CMsGQEqY.js.map
|
||||||
//# sourceMappingURL=index-ftUEqmu1.js.map
|
|
||||||
========
|
|
||||||
//# sourceMappingURL=index-DK6Kev7f.js.map
|
|
||||||
>>>>>>>> 0fd4e6c7787daa922cb0d9bd1241b276b39ce2c5:comfy/web/assets/index-DK6Kev7f.js
|
|
||||||
2
comfy/web/assets/index-ftUEqmu1.js.map → comfy/web/assets/index-CMsGQEqY.js.map
generated
vendored
2
comfy/web/assets/index-ftUEqmu1.js.map → comfy/web/assets/index-CMsGQEqY.js.map
generated
vendored
File diff suppressed because one or more lines are too long
1
comfy/web/assets/index-CoOvI8ZH.js.map
generated
vendored
1
comfy/web/assets/index-CoOvI8ZH.js.map
generated
vendored
File diff suppressed because one or more lines are too long
50
comfy/web/assets/index-D4DWQPPQ.js
generated
vendored
50
comfy/web/assets/index-D4DWQPPQ.js
generated
vendored
@ -1,50 +0,0 @@
|
|||||||
var __defProp = Object.defineProperty;
|
|
||||||
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
||||||
import { cb as script$2, A as createBaseVNode, g as openBlock, h as createElementBlock, m as mergeProps } from "./index-CoOvI8ZH.js";
|
|
||||||
var script$1 = {
|
|
||||||
name: "BarsIcon",
|
|
||||||
"extends": script$2
|
|
||||||
};
|
|
||||||
var _hoisted_1$1 = /* @__PURE__ */ createBaseVNode("path", {
|
|
||||||
"fill-rule": "evenodd",
|
|
||||||
"clip-rule": "evenodd",
|
|
||||||
d: "M13.3226 3.6129H0.677419C0.497757 3.6129 0.325452 3.54152 0.198411 3.41448C0.0713707 3.28744 0 3.11514 0 2.93548C0 2.75581 0.0713707 2.58351 0.198411 2.45647C0.325452 2.32943 0.497757 2.25806 0.677419 2.25806H13.3226C13.5022 2.25806 13.6745 2.32943 13.8016 2.45647C13.9286 2.58351 14 2.75581 14 2.93548C14 3.11514 13.9286 3.28744 13.8016 3.41448C13.6745 3.54152 13.5022 3.6129 13.3226 3.6129ZM13.3226 7.67741H0.677419C0.497757 7.67741 0.325452 7.60604 0.198411 7.479C0.0713707 7.35196 0 7.17965 0 6.99999C0 6.82033 0.0713707 6.64802 0.198411 6.52098C0.325452 6.39394 0.497757 6.32257 0.677419 6.32257H13.3226C13.5022 6.32257 13.6745 6.39394 13.8016 6.52098C13.9286 6.64802 14 6.82033 14 6.99999C14 7.17965 13.9286 7.35196 13.8016 7.479C13.6745 7.60604 13.5022 7.67741 13.3226 7.67741ZM0.677419 11.7419H13.3226C13.5022 11.7419 13.6745 11.6706 13.8016 11.5435C13.9286 11.4165 14 11.2442 14 11.0645C14 10.8848 13.9286 10.7125 13.8016 10.5855C13.6745 10.4585 13.5022 10.3871 13.3226 10.3871H0.677419C0.497757 10.3871 0.325452 10.4585 0.198411 10.5855C0.0713707 10.7125 0 10.8848 0 11.0645C0 11.2442 0.0713707 11.4165 0.198411 11.5435C0.325452 11.6706 0.497757 11.7419 0.677419 11.7419Z",
|
|
||||||
fill: "currentColor"
|
|
||||||
}, null, -1);
|
|
||||||
var _hoisted_2$1 = [_hoisted_1$1];
|
|
||||||
function render$1(_ctx, _cache, $props, $setup, $data, $options) {
|
|
||||||
return openBlock(), createElementBlock("svg", mergeProps({
|
|
||||||
width: "14",
|
|
||||||
height: "14",
|
|
||||||
viewBox: "0 0 14 14",
|
|
||||||
fill: "none",
|
|
||||||
xmlns: "http://www.w3.org/2000/svg"
|
|
||||||
}, _ctx.pti()), _hoisted_2$1, 16);
|
|
||||||
}
|
|
||||||
__name(render$1, "render$1");
|
|
||||||
script$1.render = render$1;
|
|
||||||
var script = {
|
|
||||||
name: "PlusIcon",
|
|
||||||
"extends": script$2
|
|
||||||
};
|
|
||||||
var _hoisted_1 = /* @__PURE__ */ createBaseVNode("path", {
|
|
||||||
d: "M7.67742 6.32258V0.677419C7.67742 0.497757 7.60605 0.325452 7.47901 0.198411C7.35197 0.0713707 7.17966 0 7 0C6.82034 0 6.64803 0.0713707 6.52099 0.198411C6.39395 0.325452 6.32258 0.497757 6.32258 0.677419V6.32258H0.677419C0.497757 6.32258 0.325452 6.39395 0.198411 6.52099C0.0713707 6.64803 0 6.82034 0 7C0 7.17966 0.0713707 7.35197 0.198411 7.47901C0.325452 7.60605 0.497757 7.67742 0.677419 7.67742H6.32258V13.3226C6.32492 13.5015 6.39704 13.6725 6.52358 13.799C6.65012 13.9255 6.82106 13.9977 7 14C7.17966 14 7.35197 13.9286 7.47901 13.8016C7.60605 13.6745 7.67742 13.5022 7.67742 13.3226V7.67742H13.3226C13.5022 7.67742 13.6745 7.60605 13.8016 7.47901C13.9286 7.35197 14 7.17966 14 7C13.9977 6.82106 13.9255 6.65012 13.799 6.52358C13.6725 6.39704 13.5015 6.32492 13.3226 6.32258H7.67742Z",
|
|
||||||
fill: "currentColor"
|
|
||||||
}, null, -1);
|
|
||||||
var _hoisted_2 = [_hoisted_1];
|
|
||||||
function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
||||||
return openBlock(), createElementBlock("svg", mergeProps({
|
|
||||||
width: "14",
|
|
||||||
height: "14",
|
|
||||||
viewBox: "0 0 14 14",
|
|
||||||
fill: "none",
|
|
||||||
xmlns: "http://www.w3.org/2000/svg"
|
|
||||||
}, _ctx.pti()), _hoisted_2, 16);
|
|
||||||
}
|
|
||||||
__name(render, "render");
|
|
||||||
script.render = render;
|
|
||||||
export {
|
|
||||||
script as a,
|
|
||||||
script$1 as s
|
|
||||||
};
|
|
||||||
//# sourceMappingURL=index-D4DWQPPQ.js.map
|
|
||||||
1
comfy/web/assets/index-D4DWQPPQ.js.map
generated
vendored
1
comfy/web/assets/index-D4DWQPPQ.js.map
generated
vendored
@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"index-D4DWQPPQ.js","sources":["../../node_modules/@primevue/icons/bars/index.mjs","../../node_modules/@primevue/icons/plus/index.mjs"],"sourcesContent":["import BaseIcon from '@primevue/icons/baseicon';\nimport { openBlock, createElementBlock, mergeProps, createElementVNode } from 'vue';\n\nvar script = {\n name: 'BarsIcon',\n \"extends\": BaseIcon\n};\n\nvar _hoisted_1 = /*#__PURE__*/createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n \"clip-rule\": \"evenodd\",\n d: \"M13.3226 3.6129H0.677419C0.497757 3.6129 0.325452 3.54152 0.198411 3.41448C0.0713707 3.28744 0 3.11514 0 2.93548C0 2.75581 0.0713707 2.58351 0.198411 2.45647C0.325452 2.32943 0.497757 2.25806 0.677419 2.25806H13.3226C13.5022 2.25806 13.6745 2.32943 13.8016 2.45647C13.9286 2.58351 14 2.75581 14 2.93548C14 3.11514 13.9286 3.28744 13.8016 3.41448C13.6745 3.54152 13.5022 3.6129 13.3226 3.6129ZM13.3226 7.67741H0.677419C0.497757 7.67741 0.325452 7.60604 0.198411 7.479C0.0713707 7.35196 0 7.17965 0 6.99999C0 6.82033 0.0713707 6.64802 0.198411 6.52098C0.325452 6.39394 0.497757 6.32257 0.677419 6.32257H13.3226C13.5022 6.32257 13.6745 6.39394 13.8016 6.52098C13.9286 6.64802 14 6.82033 14 6.99999C14 7.17965 13.9286 7.35196 13.8016 7.479C13.6745 7.60604 13.5022 7.67741 13.3226 7.67741ZM0.677419 11.7419H13.3226C13.5022 11.7419 13.6745 11.6706 13.8016 11.5435C13.9286 11.4165 14 11.2442 14 11.0645C14 10.8848 13.9286 10.7125 13.8016 10.5855C13.6745 10.4585 13.5022 10.3871 13.3226 10.3871H0.677419C0.497757 10.3871 0.325452 10.4585 0.198411 10.5855C0.0713707 10.7125 0 10.8848 0 11.0645C0 11.2442 0.0713707 11.4165 0.198411 11.5435C0.325452 11.6706 0.497757 11.7419 0.677419 11.7419Z\",\n fill: \"currentColor\"\n}, null, -1);\nvar _hoisted_2 = [_hoisted_1];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", mergeProps({\n width: \"14\",\n height: \"14\",\n viewBox: \"0 0 14 14\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\"\n }, _ctx.pti()), _hoisted_2, 16);\n}\n\nscript.render = render;\n\nexport { script as default };\n//# sourceMappingURL=index.mjs.map\n","import BaseIcon from '@primevue/icons/baseicon';\nimport { openBlock, createElementBlock, mergeProps, createElementVNode } from 'vue';\n\nvar script = {\n name: 'PlusIcon',\n \"extends\": BaseIcon\n};\n\nvar _hoisted_1 = /*#__PURE__*/createElementVNode(\"path\", {\n d: \"M7.67742 6.32258V0.677419C7.67742 0.497757 7.60605 0.325452 7.47901 0.198411C7.35197 0.0713707 7.17966 0 7 0C6.82034 0 6.64803 0.0713707 6.52099 0.198411C6.39395 0.325452 6.32258 0.497757 6.32258 0.677419V6.32258H0.677419C0.497757 6.32258 0.325452 6.39395 0.198411 6.52099C0.0713707 6.64803 0 6.82034 0 7C0 7.17966 0.0713707 7.35197 0.198411 7.47901C0.325452 7.60605 0.497757 7.67742 0.677419 7.67742H6.32258V13.3226C6.32492 13.5015 6.39704 13.6725 6.52358 13.799C6.65012 13.9255 6.82106 13.9977 7 14C7.17966 14 7.35197 13.9286 7.47901 13.8016C7.60605 13.6745 7.67742 13.5022 7.67742 13.3226V7.67742H13.3226C13.5022 7.67742 13.6745 7.60605 13.8016 7.47901C13.9286 7.35197 14 7.17966 14 7C13.9977 6.82106 13.9255 6.65012 13.799 6.52358C13.6725 6.39704 13.5015 6.32492 13.3226 6.32258H7.67742Z\",\n fill: \"currentColor\"\n}, null, -1);\nvar _hoisted_2 = [_hoisted_1];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", mergeProps({\n width: \"14\",\n height: \"14\",\n viewBox: \"0 0 14 14\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\"\n }, _ctx.pti()), _hoisted_2, 16);\n}\n\nscript.render = render;\n\nexport { script as default };\n//# sourceMappingURL=index.mjs.map\n"],"names":["script","BaseIcon","_hoisted_1","createElementVNode","_hoisted_2","render"],"mappings":";;;AAGG,IAACA,WAAS;AAAA,EACX,MAAM;AAAA,EACN,WAAWC;AACb;AAEA,IAAIC,eAA0BC,gCAAmB,QAAQ;AAAA,EACvD,aAAa;AAAA,EACb,aAAa;AAAA,EACb,GAAG;AAAA,EACH,MAAM;AACR,GAAG,MAAM,EAAE;AACX,IAAIC,eAAa,CAACF,YAAU;AAC5B,SAASG,SAAO,MAAM,QAAQ,QAAQ,QAAQ,OAAO,UAAU;AAC7D,SAAO,UAAW,GAAE,mBAAmB,OAAO,WAAW;AAAA,IACvD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACR,GAAE,KAAK,IAAG,CAAE,GAAGD,cAAY,EAAE;AAChC;AARSC;AAUTL,SAAO,SAASK;ACtBb,IAAC,SAAS;AAAA,EACX,MAAM;AAAA,EACN,WAAWJ;AACb;AAEA,IAAI,aAA0BE,gCAAmB,QAAQ;AAAA,EACvD,GAAG;AAAA,EACH,MAAM;AACR,GAAG,MAAM,EAAE;AACX,IAAI,aAAa,CAAC,UAAU;AAC5B,SAAS,OAAO,MAAM,QAAQ,QAAQ,QAAQ,OAAO,UAAU;AAC7D,SAAO,UAAW,GAAE,mBAAmB,OAAO,WAAW;AAAA,IACvD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACR,GAAE,KAAK,IAAG,CAAE,GAAG,YAAY,EAAE;AAChC;AARS;AAUT,OAAO,SAAS;","x_google_ignoreList":[0,1]}
|
|
||||||
4
comfy/web/assets/index-bCeMLtLM.js → comfy/web/assets/index-DJqEjTnE.js
generated
vendored
4
comfy/web/assets/index-bCeMLtLM.js → comfy/web/assets/index-DJqEjTnE.js
generated
vendored
@ -1,6 +1,6 @@
|
|||||||
var __defProp = Object.defineProperty;
|
var __defProp = Object.defineProperty;
|
||||||
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
||||||
import { b6 as script$2, g as openBlock, h as createElementBlock, m as mergeProps, A as createBaseVNode } from "./index-bi78Y1IN.js";
|
import { ba as script$2, f as openBlock, g as createElementBlock, m as mergeProps, A as createBaseVNode } from "./index-BQYg0VNJ.js";
|
||||||
var script$1 = {
|
var script$1 = {
|
||||||
name: "BarsIcon",
|
name: "BarsIcon",
|
||||||
"extends": script$2
|
"extends": script$2
|
||||||
@ -43,4 +43,4 @@ export {
|
|||||||
script as a,
|
script as a,
|
||||||
script$1 as s
|
script$1 as s
|
||||||
};
|
};
|
||||||
//# sourceMappingURL=index-bCeMLtLM.js.map
|
//# sourceMappingURL=index-DJqEjTnE.js.map
|
||||||
2
comfy/web/assets/index-bCeMLtLM.js.map → comfy/web/assets/index-DJqEjTnE.js.map
generated
vendored
2
comfy/web/assets/index-bCeMLtLM.js.map → comfy/web/assets/index-DJqEjTnE.js.map
generated
vendored
@ -1 +1 @@
|
|||||||
{"version":3,"file":"index-bCeMLtLM.js","sources":["../../../../../node_modules/@primevue/icons/bars/index.mjs","../../../../../node_modules/@primevue/icons/plus/index.mjs"],"sourcesContent":["import BaseIcon from '@primevue/icons/baseicon';\nimport { openBlock, createElementBlock, mergeProps, createElementVNode } from 'vue';\n\nvar script = {\n name: 'BarsIcon',\n \"extends\": BaseIcon\n};\n\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", mergeProps({\n width: \"14\",\n height: \"14\",\n viewBox: \"0 0 14 14\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\"\n }, _ctx.pti()), _cache[0] || (_cache[0] = [createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n \"clip-rule\": \"evenodd\",\n d: \"M13.3226 3.6129H0.677419C0.497757 3.6129 0.325452 3.54152 0.198411 3.41448C0.0713707 3.28744 0 3.11514 0 2.93548C0 2.75581 0.0713707 2.58351 0.198411 2.45647C0.325452 2.32943 0.497757 2.25806 0.677419 2.25806H13.3226C13.5022 2.25806 13.6745 2.32943 13.8016 2.45647C13.9286 2.58351 14 2.75581 14 2.93548C14 3.11514 13.9286 3.28744 13.8016 3.41448C13.6745 3.54152 13.5022 3.6129 13.3226 3.6129ZM13.3226 7.67741H0.677419C0.497757 7.67741 0.325452 7.60604 0.198411 7.479C0.0713707 7.35196 0 7.17965 0 6.99999C0 6.82033 0.0713707 6.64802 0.198411 6.52098C0.325452 6.39394 0.497757 6.32257 0.677419 6.32257H13.3226C13.5022 6.32257 13.6745 6.39394 13.8016 6.52098C13.9286 6.64802 14 6.82033 14 6.99999C14 7.17965 13.9286 7.35196 13.8016 7.479C13.6745 7.60604 13.5022 7.67741 13.3226 7.67741ZM0.677419 11.7419H13.3226C13.5022 11.7419 13.6745 11.6706 13.8016 11.5435C13.9286 11.4165 14 11.2442 14 11.0645C14 10.8848 13.9286 10.7125 13.8016 10.5855C13.6745 10.4585 13.5022 10.3871 13.3226 10.3871H0.677419C0.497757 10.3871 0.325452 10.4585 0.198411 10.5855C0.0713707 10.7125 0 10.8848 0 11.0645C0 11.2442 0.0713707 11.4165 0.198411 11.5435C0.325452 11.6706 0.497757 11.7419 0.677419 11.7419Z\",\n fill: \"currentColor\"\n }, null, -1)]), 16);\n}\n\nscript.render = render;\n\nexport { script as default };\n//# sourceMappingURL=index.mjs.map\n","import BaseIcon from '@primevue/icons/baseicon';\nimport { openBlock, createElementBlock, mergeProps, createElementVNode } from 'vue';\n\nvar script = {\n name: 'PlusIcon',\n \"extends\": BaseIcon\n};\n\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", mergeProps({\n width: \"14\",\n height: \"14\",\n viewBox: \"0 0 14 14\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\"\n }, _ctx.pti()), _cache[0] || (_cache[0] = [createElementVNode(\"path\", {\n d: \"M7.67742 6.32258V0.677419C7.67742 0.497757 7.60605 0.325452 7.47901 0.198411C7.35197 0.0713707 7.17966 0 7 0C6.82034 0 6.64803 0.0713707 6.52099 0.198411C6.39395 0.325452 6.32258 0.497757 6.32258 0.677419V6.32258H0.677419C0.497757 6.32258 0.325452 6.39395 0.198411 6.52099C0.0713707 6.64803 0 6.82034 0 7C0 7.17966 0.0713707 7.35197 0.198411 7.47901C0.325452 7.60605 0.497757 7.67742 0.677419 7.67742H6.32258V13.3226C6.32492 13.5015 6.39704 13.6725 6.52358 13.799C6.65012 13.9255 6.82106 13.9977 7 14C7.17966 14 7.35197 13.9286 7.47901 13.8016C7.60605 13.6745 7.67742 13.5022 7.67742 13.3226V7.67742H13.3226C13.5022 7.67742 13.6745 7.60605 13.8016 7.47901C13.9286 7.35197 14 7.17966 14 7C13.9977 6.82106 13.9255 6.65012 13.799 6.52358C13.6725 6.39704 13.5015 6.32492 13.3226 6.32258H7.67742Z\",\n fill: \"currentColor\"\n }, null, -1)]), 16);\n}\n\nscript.render = render;\n\nexport { script as default };\n//# sourceMappingURL=index.mjs.map\n"],"names":["script","BaseIcon","render","createElementVNode"],"mappings":";;;AAGG,IAACA,WAAS;AAAA,EACX,MAAM;AAAA,EACN,WAAWC;AACb;AAEA,SAASC,SAAO,MAAM,QAAQ,QAAQ,QAAQ,OAAO,UAAU;AAC7D,SAAO,UAAW,GAAE,mBAAmB,OAAO,WAAW;AAAA,IACvD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACR,GAAE,KAAK,KAAK,GAAG,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAACC,gBAAmB,QAAQ;AAAA,IACpE,aAAa;AAAA,IACb,aAAa;AAAA,IACb,GAAG;AAAA,IACH,MAAM;AAAA,EACP,GAAE,MAAM,EAAE,CAAC,IAAI,EAAE;AACpB;AAbSD;AAeTF,SAAO,SAASE;ACpBb,IAAC,SAAS;AAAA,EACX,MAAM;AAAA,EACN,WAAWD;AACb;AAEA,SAAS,OAAO,MAAM,QAAQ,QAAQ,QAAQ,OAAO,UAAU;AAC7D,SAAO,UAAW,GAAE,mBAAmB,OAAO,WAAW;AAAA,IACvD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACR,GAAE,KAAK,KAAK,GAAG,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAACE,gBAAmB,QAAQ;AAAA,IACpE,GAAG;AAAA,IACH,MAAM;AAAA,EACP,GAAE,MAAM,EAAE,CAAC,IAAI,EAAE;AACpB;AAXS;AAaT,OAAO,SAAS;","x_google_ignoreList":[0,1]}
|
{"version":3,"file":"index-DJqEjTnE.js","sources":["../../../../../node_modules/@primevue/icons/bars/index.mjs","../../../../../node_modules/@primevue/icons/plus/index.mjs"],"sourcesContent":["import BaseIcon from '@primevue/icons/baseicon';\nimport { openBlock, createElementBlock, mergeProps, createElementVNode } from 'vue';\n\nvar script = {\n name: 'BarsIcon',\n \"extends\": BaseIcon\n};\n\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", mergeProps({\n width: \"14\",\n height: \"14\",\n viewBox: \"0 0 14 14\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\"\n }, _ctx.pti()), _cache[0] || (_cache[0] = [createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n \"clip-rule\": \"evenodd\",\n d: \"M13.3226 3.6129H0.677419C0.497757 3.6129 0.325452 3.54152 0.198411 3.41448C0.0713707 3.28744 0 3.11514 0 2.93548C0 2.75581 0.0713707 2.58351 0.198411 2.45647C0.325452 2.32943 0.497757 2.25806 0.677419 2.25806H13.3226C13.5022 2.25806 13.6745 2.32943 13.8016 2.45647C13.9286 2.58351 14 2.75581 14 2.93548C14 3.11514 13.9286 3.28744 13.8016 3.41448C13.6745 3.54152 13.5022 3.6129 13.3226 3.6129ZM13.3226 7.67741H0.677419C0.497757 7.67741 0.325452 7.60604 0.198411 7.479C0.0713707 7.35196 0 7.17965 0 6.99999C0 6.82033 0.0713707 6.64802 0.198411 6.52098C0.325452 6.39394 0.497757 6.32257 0.677419 6.32257H13.3226C13.5022 6.32257 13.6745 6.39394 13.8016 6.52098C13.9286 6.64802 14 6.82033 14 6.99999C14 7.17965 13.9286 7.35196 13.8016 7.479C13.6745 7.60604 13.5022 7.67741 13.3226 7.67741ZM0.677419 11.7419H13.3226C13.5022 11.7419 13.6745 11.6706 13.8016 11.5435C13.9286 11.4165 14 11.2442 14 11.0645C14 10.8848 13.9286 10.7125 13.8016 10.5855C13.6745 10.4585 13.5022 10.3871 13.3226 10.3871H0.677419C0.497757 10.3871 0.325452 10.4585 0.198411 10.5855C0.0713707 10.7125 0 10.8848 0 11.0645C0 11.2442 0.0713707 11.4165 0.198411 11.5435C0.325452 11.6706 0.497757 11.7419 0.677419 11.7419Z\",\n fill: \"currentColor\"\n }, null, -1)]), 16);\n}\n\nscript.render = render;\n\nexport { script as default };\n//# sourceMappingURL=index.mjs.map\n","import BaseIcon from '@primevue/icons/baseicon';\nimport { openBlock, createElementBlock, mergeProps, createElementVNode } from 'vue';\n\nvar script = {\n name: 'PlusIcon',\n \"extends\": BaseIcon\n};\n\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", mergeProps({\n width: \"14\",\n height: \"14\",\n viewBox: \"0 0 14 14\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\"\n }, _ctx.pti()), _cache[0] || (_cache[0] = [createElementVNode(\"path\", {\n d: \"M7.67742 6.32258V0.677419C7.67742 0.497757 7.60605 0.325452 7.47901 0.198411C7.35197 0.0713707 7.17966 0 7 0C6.82034 0 6.64803 0.0713707 6.52099 0.198411C6.39395 0.325452 6.32258 0.497757 6.32258 0.677419V6.32258H0.677419C0.497757 6.32258 0.325452 6.39395 0.198411 6.52099C0.0713707 6.64803 0 6.82034 0 7C0 7.17966 0.0713707 7.35197 0.198411 7.47901C0.325452 7.60605 0.497757 7.67742 0.677419 7.67742H6.32258V13.3226C6.32492 13.5015 6.39704 13.6725 6.52358 13.799C6.65012 13.9255 6.82106 13.9977 7 14C7.17966 14 7.35197 13.9286 7.47901 13.8016C7.60605 13.6745 7.67742 13.5022 7.67742 13.3226V7.67742H13.3226C13.5022 7.67742 13.6745 7.60605 13.8016 7.47901C13.9286 7.35197 14 7.17966 14 7C13.9977 6.82106 13.9255 6.65012 13.799 6.52358C13.6725 6.39704 13.5015 6.32492 13.3226 6.32258H7.67742Z\",\n fill: \"currentColor\"\n }, null, -1)]), 16);\n}\n\nscript.render = render;\n\nexport { script as default };\n//# sourceMappingURL=index.mjs.map\n"],"names":["script","BaseIcon","render","createElementVNode"],"mappings":";;;AAGG,IAACA,WAAS;AAAA,EACX,MAAM;AAAA,EACN,WAAWC;AACb;AAEA,SAASC,SAAO,MAAM,QAAQ,QAAQ,QAAQ,OAAO,UAAU;AAC7D,SAAO,UAAW,GAAE,mBAAmB,OAAO,WAAW;AAAA,IACvD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACR,GAAE,KAAK,KAAK,GAAG,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAACC,gBAAmB,QAAQ;AAAA,IACpE,aAAa;AAAA,IACb,aAAa;AAAA,IACb,GAAG;AAAA,IACH,MAAM;AAAA,EACP,GAAE,MAAM,EAAE,CAAC,IAAI,EAAE;AACpB;AAbSD;AAeTF,SAAO,SAASE;ACpBb,IAAC,SAAS;AAAA,EACX,MAAM;AAAA,EACN,WAAWD;AACb;AAEA,SAAS,OAAO,MAAM,QAAQ,QAAQ,QAAQ,OAAO,UAAU;AAC7D,SAAO,UAAW,GAAE,mBAAmB,OAAO,WAAW;AAAA,IACvD,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACR,GAAE,KAAK,KAAK,GAAG,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAACE,gBAAmB,QAAQ;AAAA,IACpE,GAAG;AAAA,IACH,MAAM;AAAA,EACP,GAAE,MAAM,EAAE,CAAC,IAAI,EAAE;AACpB;AAXS;AAaT,OAAO,SAAS;","x_google_ignoreList":[0,1]}
|
||||||
1
comfy/web/assets/index-DK6Kev7f.js.map
generated
vendored
1
comfy/web/assets/index-DK6Kev7f.js.map
generated
vendored
File diff suppressed because one or more lines are too long
51472
comfy/web/assets/index-DO-85kdf.js
generated
vendored
51472
comfy/web/assets/index-DO-85kdf.js
generated
vendored
File diff suppressed because one or more lines are too long
1
comfy/web/assets/index-DO-85kdf.js.map
generated
vendored
1
comfy/web/assets/index-DO-85kdf.js.map
generated
vendored
File diff suppressed because one or more lines are too long
1
comfy/web/assets/index-bi78Y1IN.js.map
generated
vendored
1
comfy/web/assets/index-bi78Y1IN.js.map
generated
vendored
File diff suppressed because one or more lines are too long
@ -1,6 +1,6 @@
|
|||||||
var __defProp = Object.defineProperty;
|
var __defProp = Object.defineProperty;
|
||||||
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
||||||
import { cB as defineStore, r as ref, q as computed } from "./index-CoOvI8ZH.js";
|
import { d as defineStore, r as ref, q as computed } from "./index-BQYg0VNJ.js";
|
||||||
const useServerConfigStore = defineStore("serverConfig", () => {
|
const useServerConfigStore = defineStore("serverConfig", () => {
|
||||||
const serverConfigById = ref({});
|
const serverConfigById = ref({});
|
||||||
const serverConfigs = computed(() => {
|
const serverConfigs = computed(() => {
|
||||||
@ -87,4 +87,4 @@ const useServerConfigStore = defineStore("serverConfig", () => {
|
|||||||
export {
|
export {
|
||||||
useServerConfigStore as u
|
useServerConfigStore as u
|
||||||
};
|
};
|
||||||
//# sourceMappingURL=serverConfigStore-cctR8PGG.js.map
|
//# sourceMappingURL=serverConfigStore-DulDGgjD.js.map
|
||||||
File diff suppressed because one or more lines are too long
137
comfy/web/assets/userSelection-C6c30qSU.js
generated
vendored
137
comfy/web/assets/userSelection-C6c30qSU.js
generated
vendored
@ -1,137 +0,0 @@
|
|||||||
var __defProp = Object.defineProperty;
|
|
||||||
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
||||||
<<<<<<<< HEAD:comfy/web/assets/userSelection-C-TGdC-2.js
|
|
||||||
import { aY as api, bX as $el } from "./index-bi78Y1IN.js";
|
|
||||||
========
|
|
||||||
import { aZ as api, bY as $el } from "./index-CoOvI8ZH.js";
|
|
||||||
>>>>>>>> 0fd4e6c7787daa922cb0d9bd1241b276b39ce2c5:comfy/web/assets/userSelection-C6c30qSU.js
|
|
||||||
function createSpinner() {
|
|
||||||
const div = document.createElement("div");
|
|
||||||
div.innerHTML = `<div class="lds-ring"><div></div><div></div><div></div><div></div></div>`;
|
|
||||||
return div.firstElementChild;
|
|
||||||
}
|
|
||||||
__name(createSpinner, "createSpinner");
|
|
||||||
window.comfyAPI = window.comfyAPI || {};
|
|
||||||
window.comfyAPI.spinner = window.comfyAPI.spinner || {};
|
|
||||||
window.comfyAPI.spinner.createSpinner = createSpinner;
|
|
||||||
class UserSelectionScreen {
|
|
||||||
static {
|
|
||||||
__name(this, "UserSelectionScreen");
|
|
||||||
}
|
|
||||||
async show(users, user) {
|
|
||||||
const userSelection = document.getElementById("comfy-user-selection");
|
|
||||||
userSelection.style.display = "";
|
|
||||||
return new Promise((resolve) => {
|
|
||||||
const input = userSelection.getElementsByTagName("input")[0];
|
|
||||||
const select = userSelection.getElementsByTagName("select")[0];
|
|
||||||
const inputSection = input.closest("section");
|
|
||||||
const selectSection = select.closest("section");
|
|
||||||
const form = userSelection.getElementsByTagName("form")[0];
|
|
||||||
const error = userSelection.getElementsByClassName("comfy-user-error")[0];
|
|
||||||
const button = userSelection.getElementsByClassName(
|
|
||||||
"comfy-user-button-next"
|
|
||||||
)[0];
|
|
||||||
let inputActive = null;
|
|
||||||
input.addEventListener("focus", () => {
|
|
||||||
inputSection.classList.add("selected");
|
|
||||||
selectSection.classList.remove("selected");
|
|
||||||
inputActive = true;
|
|
||||||
});
|
|
||||||
select.addEventListener("focus", () => {
|
|
||||||
inputSection.classList.remove("selected");
|
|
||||||
selectSection.classList.add("selected");
|
|
||||||
inputActive = false;
|
|
||||||
select.style.color = "";
|
|
||||||
});
|
|
||||||
select.addEventListener("blur", () => {
|
|
||||||
if (!select.value) {
|
|
||||||
select.style.color = "var(--descrip-text)";
|
|
||||||
}
|
|
||||||
});
|
|
||||||
form.addEventListener("submit", async (e) => {
|
|
||||||
e.preventDefault();
|
|
||||||
if (inputActive == null) {
|
|
||||||
error.textContent = "Please enter a username or select an existing user.";
|
|
||||||
} else if (inputActive) {
|
|
||||||
const username = input.value.trim();
|
|
||||||
if (!username) {
|
|
||||||
error.textContent = "Please enter a username.";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
input.disabled = select.disabled = // @ts-expect-error
|
|
||||||
input.readonly = // @ts-expect-error
|
|
||||||
select.readonly = true;
|
|
||||||
const spinner = createSpinner();
|
|
||||||
button.prepend(spinner);
|
|
||||||
try {
|
|
||||||
const resp = await api.createUser(username);
|
|
||||||
if (resp.status >= 300) {
|
|
||||||
let message = "Error creating user: " + resp.status + " " + resp.statusText;
|
|
||||||
try {
|
|
||||||
const res = await resp.json();
|
|
||||||
if (res.error) {
|
|
||||||
message = res.error;
|
|
||||||
}
|
|
||||||
} catch (error2) {
|
|
||||||
}
|
|
||||||
throw new Error(message);
|
|
||||||
}
|
|
||||||
resolve({ username, userId: await resp.json(), created: true });
|
|
||||||
} catch (err) {
|
|
||||||
spinner.remove();
|
|
||||||
error.textContent = err.message ?? err.statusText ?? err ?? "An unknown error occurred.";
|
|
||||||
input.disabled = select.disabled = // @ts-expect-error
|
|
||||||
input.readonly = // @ts-expect-error
|
|
||||||
select.readonly = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} else if (!select.value) {
|
|
||||||
error.textContent = "Please select an existing user.";
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
resolve({
|
|
||||||
username: users[select.value],
|
|
||||||
userId: select.value,
|
|
||||||
created: false
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
if (user) {
|
|
||||||
const name = localStorage["Comfy.userName"];
|
|
||||||
if (name) {
|
|
||||||
input.value = name;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (input.value) {
|
|
||||||
input.focus();
|
|
||||||
}
|
|
||||||
const userIds = Object.keys(users ?? {});
|
|
||||||
if (userIds.length) {
|
|
||||||
for (const u of userIds) {
|
|
||||||
$el("option", { textContent: users[u], value: u, parent: select });
|
|
||||||
}
|
|
||||||
select.style.color = "var(--descrip-text)";
|
|
||||||
if (select.value) {
|
|
||||||
select.focus();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
userSelection.classList.add("no-users");
|
|
||||||
input.focus();
|
|
||||||
}
|
|
||||||
}).then((r) => {
|
|
||||||
userSelection.remove();
|
|
||||||
return r;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
window.comfyAPI = window.comfyAPI || {};
|
|
||||||
window.comfyAPI.userSelection = window.comfyAPI.userSelection || {};
|
|
||||||
window.comfyAPI.userSelection.UserSelectionScreen = UserSelectionScreen;
|
|
||||||
export {
|
|
||||||
UserSelectionScreen
|
|
||||||
};
|
|
||||||
<<<<<<<< HEAD:comfy/web/assets/userSelection-C-TGdC-2.js
|
|
||||||
//# sourceMappingURL=userSelection-C-TGdC-2.js.map
|
|
||||||
========
|
|
||||||
//# sourceMappingURL=userSelection-C6c30qSU.js.map
|
|
||||||
>>>>>>>> 0fd4e6c7787daa922cb0d9bd1241b276b39ce2c5:comfy/web/assets/userSelection-C6c30qSU.js
|
|
||||||
5
comfy/web/assets/userSelection-C6c30qSU.js.map
generated
vendored
5
comfy/web/assets/userSelection-C6c30qSU.js.map
generated
vendored
File diff suppressed because one or more lines are too long
170
comfy/web/assets/userSelection-CwOXKtys.css
generated
vendored
170
comfy/web/assets/userSelection-CwOXKtys.css
generated
vendored
@ -1,170 +0,0 @@
|
|||||||
.lds-ring {
|
|
||||||
display: inline-block;
|
|
||||||
position: relative;
|
|
||||||
width: 1em;
|
|
||||||
height: 1em;
|
|
||||||
}
|
|
||||||
.lds-ring div {
|
|
||||||
box-sizing: border-box;
|
|
||||||
display: block;
|
|
||||||
position: absolute;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
border: 0.15em solid #fff;
|
|
||||||
border-radius: 50%;
|
|
||||||
animation: lds-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;
|
|
||||||
border-color: #fff transparent transparent transparent;
|
|
||||||
}
|
|
||||||
.lds-ring div:nth-child(1) {
|
|
||||||
animation-delay: -0.45s;
|
|
||||||
}
|
|
||||||
.lds-ring div:nth-child(2) {
|
|
||||||
animation-delay: -0.3s;
|
|
||||||
}
|
|
||||||
.lds-ring div:nth-child(3) {
|
|
||||||
animation-delay: -0.15s;
|
|
||||||
}
|
|
||||||
@keyframes lds-ring {
|
|
||||||
0% {
|
|
||||||
transform: rotate(0deg);
|
|
||||||
}
|
|
||||||
100% {
|
|
||||||
transform: rotate(360deg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.comfy-user-selection {
|
|
||||||
width: 100vw;
|
|
||||||
height: 100vh;
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
z-index: 999;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
font-family: sans-serif;
|
|
||||||
background: linear-gradient(var(--tr-even-bg-color), var(--tr-odd-bg-color));
|
|
||||||
}
|
|
||||||
|
|
||||||
.comfy-user-selection-inner {
|
|
||||||
background: var(--comfy-menu-bg);
|
|
||||||
margin-top: -30vh;
|
|
||||||
padding: 20px 40px;
|
|
||||||
border-radius: 10px;
|
|
||||||
min-width: 365px;
|
|
||||||
position: relative;
|
|
||||||
box-shadow: 0 0 20px rgba(0, 0, 0, 0.3);
|
|
||||||
}
|
|
||||||
|
|
||||||
.comfy-user-selection-inner form {
|
|
||||||
width: 100%;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.comfy-user-selection-inner h1 {
|
|
||||||
margin: 10px 0 30px 0;
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
.comfy-user-selection-inner label {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.comfy-user-selection input,
|
|
||||||
.comfy-user-selection select {
|
|
||||||
background-color: var(--comfy-input-bg);
|
|
||||||
color: var(--input-text);
|
|
||||||
border: 0;
|
|
||||||
border-radius: 5px;
|
|
||||||
padding: 5px;
|
|
||||||
margin-top: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.comfy-user-selection input::-moz-placeholder {
|
|
||||||
color: var(--descrip-text);
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.comfy-user-selection input::placeholder {
|
|
||||||
color: var(--descrip-text);
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.comfy-user-existing {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.no-users .comfy-user-existing {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.comfy-user-selection-inner .or-separator {
|
|
||||||
margin: 10px 0;
|
|
||||||
padding: 10px;
|
|
||||||
display: block;
|
|
||||||
width: 100%;
|
|
||||||
color: var(--descrip-text);
|
|
||||||
overflow: hidden;
|
|
||||||
text-align: center;
|
|
||||||
margin-left: -10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.comfy-user-selection-inner .or-separator::before,
|
|
||||||
.comfy-user-selection-inner .or-separator::after {
|
|
||||||
content: "";
|
|
||||||
background-color: var(--border-color);
|
|
||||||
position: relative;
|
|
||||||
height: 1px;
|
|
||||||
vertical-align: middle;
|
|
||||||
display: inline-block;
|
|
||||||
width: calc(50% - 20px);
|
|
||||||
top: -1px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.comfy-user-selection-inner .or-separator::before {
|
|
||||||
right: 10px;
|
|
||||||
margin-left: -50%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.comfy-user-selection-inner .or-separator::after {
|
|
||||||
left: 10px;
|
|
||||||
margin-right: -50%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.comfy-user-selection-inner section {
|
|
||||||
width: 100%;
|
|
||||||
padding: 10px;
|
|
||||||
margin: -10px;
|
|
||||||
transition: background-color 0.2s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.comfy-user-selection-inner section.selected {
|
|
||||||
background: var(--border-color);
|
|
||||||
border-radius: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.comfy-user-selection-inner footer {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
margin-top: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.comfy-user-selection-inner .comfy-user-error {
|
|
||||||
color: var(--error-text);
|
|
||||||
margin-bottom: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.comfy-user-button-next {
|
|
||||||
font-size: 16px;
|
|
||||||
padding: 6px 10px;
|
|
||||||
width: 100px;
|
|
||||||
display: flex;
|
|
||||||
gap: 5px;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
}
|
|
||||||
18
comfy/web/assets/widgetInputs-CRPRgKEi.js → comfy/web/assets/widgetInputs-BMOQhk10.js
generated
vendored
18
comfy/web/assets/widgetInputs-CRPRgKEi.js → comfy/web/assets/widgetInputs-BMOQhk10.js
generated
vendored
@ -1,10 +1,6 @@
|
|||||||
var __defProp = Object.defineProperty;
|
var __defProp = Object.defineProperty;
|
||||||
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
||||||
<<<<<<<< HEAD:comfy/web/assets/widgetInputs-DjCs8Yab.js
|
import { c as LGraphNode, b as app, cc as applyTextReplacements, cb as ComfyWidgets, cf as addValueControlWidgets, j as LiteGraph } from "./index-BQYg0VNJ.js";
|
||||||
import { e as LGraphNode, c as app, c2 as applyTextReplacements, c1 as ComfyWidgets, c4 as addValueControlWidgets, k as LiteGraph } from "./index-bi78Y1IN.js";
|
|
||||||
========
|
|
||||||
import { e as LGraphNode, c as app, c3 as applyTextReplacements, c2 as ComfyWidgets, c5 as addValueControlWidgets, k as LiteGraph } from "./index-CoOvI8ZH.js";
|
|
||||||
>>>>>>>> 0fd4e6c7787daa922cb0d9bd1241b276b39ce2c5:comfy/web/assets/widgetInputs-CRPRgKEi.js
|
|
||||||
const CONVERTED_TYPE = "converted-widget";
|
const CONVERTED_TYPE = "converted-widget";
|
||||||
const VALID_TYPES = [
|
const VALID_TYPES = [
|
||||||
"STRING",
|
"STRING",
|
||||||
@ -588,6 +584,7 @@ app.registerExtension({
|
|||||||
}
|
}
|
||||||
if (w.type === CONVERTED_TYPE) {
|
if (w.type === CONVERTED_TYPE) {
|
||||||
toWidget.push({
|
toWidget.push({
|
||||||
|
// @ts-expect-error never
|
||||||
content: `Convert ${w.name} to widget`,
|
content: `Convert ${w.name} to widget`,
|
||||||
callback: /* @__PURE__ */ __name(() => convertToWidget(this, w), "callback")
|
callback: /* @__PURE__ */ __name(() => convertToWidget(this, w), "callback")
|
||||||
});
|
});
|
||||||
@ -680,7 +677,10 @@ app.registerExtension({
|
|||||||
if (!app2.configuringGraph && this.inputs) {
|
if (!app2.configuringGraph && this.inputs) {
|
||||||
for (const input of this.inputs) {
|
for (const input of this.inputs) {
|
||||||
if (input.widget && !input.widget[GET_CONFIG]) {
|
if (input.widget && !input.widget[GET_CONFIG]) {
|
||||||
input.widget[GET_CONFIG] = () => getConfig.call(this, input.widget.name);
|
input.widget[GET_CONFIG] = () => (
|
||||||
|
// @ts-expect-error input.widget has unknown type
|
||||||
|
getConfig.call(this, input.widget.name)
|
||||||
|
);
|
||||||
const w = this.widgets.find((w2) => w2.name === input.widget.name);
|
const w = this.widgets.find((w2) => w2.name === input.widget.name);
|
||||||
if (w) {
|
if (w) {
|
||||||
hideWidget(this, w);
|
hideWidget(this, w);
|
||||||
@ -763,8 +763,4 @@ export {
|
|||||||
mergeIfValid,
|
mergeIfValid,
|
||||||
setWidgetConfig
|
setWidgetConfig
|
||||||
};
|
};
|
||||||
<<<<<<<< HEAD:comfy/web/assets/widgetInputs-DjCs8Yab.js
|
//# sourceMappingURL=widgetInputs-BMOQhk10.js.map
|
||||||
//# sourceMappingURL=widgetInputs-DjCs8Yab.js.map
|
|
||||||
========
|
|
||||||
//# sourceMappingURL=widgetInputs-CRPRgKEi.js.map
|
|
||||||
>>>>>>>> 0fd4e6c7787daa922cb0d9bd1241b276b39ce2c5:comfy/web/assets/widgetInputs-CRPRgKEi.js
|
|
||||||
1
comfy/web/assets/widgetInputs-BMOQhk10.js.map
generated
vendored
Normal file
1
comfy/web/assets/widgetInputs-BMOQhk10.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
5
comfy/web/assets/widgetInputs-CRPRgKEi.js.map
generated
vendored
5
comfy/web/assets/widgetInputs-CRPRgKEi.js.map
generated
vendored
File diff suppressed because one or more lines are too long
2
comfy/web/extensions/core/maskEditorOld.js
vendored
2
comfy/web/extensions/core/maskEditorOld.js
vendored
@ -1,2 +1,2 @@
|
|||||||
// Shim for extensions/core/maskEditorOld.ts
|
// Shim for extensions\core\maskEditorOld.ts
|
||||||
export const MaskEditorDialogOld = window.comfyAPI.maskEditorOld.MaskEditorDialogOld;
|
export const MaskEditorDialogOld = window.comfyAPI.maskEditorOld.MaskEditorDialogOld;
|
||||||
|
|||||||
@ -1,3 +1,3 @@
|
|||||||
// Shim for extensions/core/vintageClipboard.ts
|
// Shim for extensions\core\vintageClipboard.ts
|
||||||
export const serialise = window.comfyAPI.vintageClipboard.serialise;
|
export const serialise = window.comfyAPI.vintageClipboard.serialise;
|
||||||
export const deserialiseAndCreate = window.comfyAPI.vintageClipboard.deserialiseAndCreate;
|
export const deserialiseAndCreate = window.comfyAPI.vintageClipboard.deserialiseAndCreate;
|
||||||
|
|||||||
31
comfy/web/index.html
vendored
31
comfy/web/index.html
vendored
@ -6,37 +6,10 @@
|
|||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
|
||||||
<link rel="stylesheet" type="text/css" href="user.css" />
|
<link rel="stylesheet" type="text/css" href="user.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="materialdesignicons.min.css" />
|
<link rel="stylesheet" type="text/css" href="materialdesignicons.min.css" />
|
||||||
<script type="module" crossorigin src="./assets/index-CoOvI8ZH.js"></script>
|
<script type="module" crossorigin src="./assets/index-BQYg0VNJ.js"></script>
|
||||||
<link rel="stylesheet" crossorigin href="./assets/index-U_o182q3.css">
|
<link rel="stylesheet" crossorigin href="./assets/index-BY_-AxSO.css">
|
||||||
</head>
|
</head>
|
||||||
<body class="litegraph grid">
|
<body class="litegraph grid">
|
||||||
<div id="vue-app"></div>
|
<div id="vue-app"></div>
|
||||||
<div id="comfy-user-selection" class="comfy-user-selection" style="display: none;">
|
|
||||||
<main class="comfy-user-selection-inner">
|
|
||||||
<h1>ComfyUI</h1>
|
|
||||||
<form>
|
|
||||||
<section>
|
|
||||||
<label>New user:
|
|
||||||
<input placeholder="Enter a username" />
|
|
||||||
</label>
|
|
||||||
</section>
|
|
||||||
<div class="comfy-user-existing">
|
|
||||||
<span class="or-separator">OR</span>
|
|
||||||
<section>
|
|
||||||
<label>
|
|
||||||
Existing user:
|
|
||||||
<select>
|
|
||||||
<option hidden disabled selected value> Select a user </option>
|
|
||||||
</select>
|
|
||||||
</label>
|
|
||||||
</section>
|
|
||||||
</div>
|
|
||||||
<footer>
|
|
||||||
<span class="comfy-user-error"> </span>
|
|
||||||
<button class="comfy-btn comfy-user-button-next">Next</button>
|
|
||||||
</footer>
|
|
||||||
</form>
|
|
||||||
</main>
|
|
||||||
</div>
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
1
comfy/web/scripts/api.js
vendored
1
comfy/web/scripts/api.js
vendored
@ -1,2 +1,3 @@
|
|||||||
// Shim for scripts\api.ts
|
// Shim for scripts\api.ts
|
||||||
|
export const ComfyApi = window.comfyAPI.api.ComfyApi;
|
||||||
export const api = window.comfyAPI.api.api;
|
export const api = window.comfyAPI.api.api;
|
||||||
|
|||||||
2
comfy/web/scripts/logging.js
vendored
2
comfy/web/scripts/logging.js
vendored
@ -1,2 +0,0 @@
|
|||||||
// Shim for scripts\logging.ts
|
|
||||||
export const ComfyLogging = window.comfyAPI.logging.ComfyLogging;
|
|
||||||
2
comfy/web/scripts/ui/spinner.js
vendored
2
comfy/web/scripts/ui/spinner.js
vendored
@ -1,2 +0,0 @@
|
|||||||
// Shim for scripts\ui\spinner.ts
|
|
||||||
export const createSpinner = window.comfyAPI.spinner.createSpinner;
|
|
||||||
2
comfy/web/scripts/ui/userSelection.js
vendored
2
comfy/web/scripts/ui/userSelection.js
vendored
@ -1,2 +0,0 @@
|
|||||||
// Shim for scripts\ui\userSelection.ts
|
|
||||||
export const UserSelectionScreen = window.comfyAPI.userSelection.UserSelectionScreen;
|
|
||||||
138
comfy_extras/nodes/nodes_gradient.py
Normal file
138
comfy_extras/nodes/nodes_gradient.py
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
"""
|
||||||
|
Adapted from https://github.com/WASasquatch/was-node-suite-comfyui/blob/main/LICENSE
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2023 Jordan Thompson (WASasquatch)
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
"""
|
||||||
|
import json
|
||||||
|
|
||||||
|
from PIL import Image, ImageDraw, ImageFilter
|
||||||
|
|
||||||
|
from comfy.component_model.tensor_types import MaskBatch
|
||||||
|
from comfy.nodes.package_typing import CustomNode
|
||||||
|
from comfy.utils import pil2tensor
|
||||||
|
|
||||||
|
|
||||||
|
def gradient(size, mode='horizontal', colors=None, tolerance=0):
|
||||||
|
if isinstance(colors, str):
|
||||||
|
colors = json.loads(colors)
|
||||||
|
|
||||||
|
if colors is None:
|
||||||
|
colors = {0: [255, 0, 0], 50: [0, 255, 0], 100: [0, 0, 255]}
|
||||||
|
|
||||||
|
colors = {int(k): [int(c) for c in v] for k, v in colors.items()}
|
||||||
|
|
||||||
|
colors[0] = colors[min(colors.keys())]
|
||||||
|
colors[255] = colors[max(colors.keys())]
|
||||||
|
|
||||||
|
img = Image.new('RGB', size, color=(0, 0, 0))
|
||||||
|
|
||||||
|
color_stop_positions = sorted(colors.keys())
|
||||||
|
color_stop_count = len(color_stop_positions)
|
||||||
|
spectrum = []
|
||||||
|
for i in range(256):
|
||||||
|
start_pos = max(p for p in color_stop_positions if p <= i)
|
||||||
|
end_pos = min(p for p in color_stop_positions if p >= i)
|
||||||
|
start = colors[start_pos]
|
||||||
|
end = colors[end_pos]
|
||||||
|
|
||||||
|
if start_pos == end_pos:
|
||||||
|
factor = 0
|
||||||
|
else:
|
||||||
|
factor = (i - start_pos) / (end_pos - start_pos)
|
||||||
|
|
||||||
|
r = round(start[0] + (end[0] - start[0]) * factor)
|
||||||
|
g = round(start[1] + (end[1] - start[1]) * factor)
|
||||||
|
b = round(start[2] + (end[2] - start[2]) * factor)
|
||||||
|
spectrum.append((r, g, b))
|
||||||
|
|
||||||
|
draw = ImageDraw.Draw(img)
|
||||||
|
if mode == 'horizontal':
|
||||||
|
for x in range(size[0]):
|
||||||
|
pos = int(x * 100 / (size[0] - 1))
|
||||||
|
color = spectrum[pos]
|
||||||
|
if tolerance > 0:
|
||||||
|
color = tuple([round(c / tolerance) * tolerance for c in color])
|
||||||
|
draw.line((x, 0, x, size[1]), fill=color)
|
||||||
|
elif mode == 'vertical':
|
||||||
|
for y in range(size[1]):
|
||||||
|
pos = int(y * 100 / (size[1] - 1))
|
||||||
|
color = spectrum[pos]
|
||||||
|
if tolerance > 0:
|
||||||
|
color = tuple([round(c / tolerance) * tolerance for c in color])
|
||||||
|
draw.line((0, y, size[0], y), fill=color)
|
||||||
|
|
||||||
|
blur = 1.5
|
||||||
|
if size[0] > 512 or size[1] > 512:
|
||||||
|
multiplier = max(size[0], size[1]) / 512
|
||||||
|
if multiplier < 1.5:
|
||||||
|
multiplier = 1.5
|
||||||
|
blur = blur * multiplier
|
||||||
|
|
||||||
|
img = img.filter(ImageFilter.GaussianBlur(radius=blur))
|
||||||
|
|
||||||
|
return img
|
||||||
|
|
||||||
|
|
||||||
|
class ImageGenerateGradient(CustomNode):
|
||||||
|
@classmethod
|
||||||
|
def INPUT_TYPES(cls):
|
||||||
|
gradient_stops = '''0:255,0,0
|
||||||
|
25:255,255,255
|
||||||
|
50:0,255,0
|
||||||
|
75:0,0,255'''
|
||||||
|
return {
|
||||||
|
"required": {
|
||||||
|
"width": ("INT", {"default": 512, "max": 4096, "min": 64, "step": 1}),
|
||||||
|
"height": ("INT", {"default": 512, "max": 4096, "min": 64, "step": 1}),
|
||||||
|
"direction": (["horizontal", "vertical"],),
|
||||||
|
"tolerance": ("INT", {"default": 0, "max": 255, "min": 0, "step": 1}),
|
||||||
|
"gradient_stops": ("STRING", {"default": gradient_stops, "multiline": True}),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
RETURN_TYPES = ("IMAGE",)
|
||||||
|
FUNCTION = "image_gradient"
|
||||||
|
|
||||||
|
CATEGORY = "image/generate"
|
||||||
|
|
||||||
|
def image_gradient(self, gradient_stops, width=512, height=512, direction='horizontal', tolerance=0) -> tuple[MaskBatch]:
|
||||||
|
import io
|
||||||
|
|
||||||
|
colors_dict = {}
|
||||||
|
stops = io.StringIO(gradient_stops.strip().replace(' ', ''))
|
||||||
|
for stop in stops:
|
||||||
|
parts = stop.split(':')
|
||||||
|
colors = parts[1].replace('\n', '').split(',')
|
||||||
|
colors_dict[parts[0].replace('\n', '')] = colors
|
||||||
|
|
||||||
|
image = gradient((width, height), direction, colors_dict, tolerance)
|
||||||
|
|
||||||
|
return (pil2tensor(image),)
|
||||||
|
|
||||||
|
|
||||||
|
NODE_CLASS_MAPPINGS = {
|
||||||
|
"ImageGenerateGradient": ImageGenerateGradient,
|
||||||
|
}
|
||||||
|
|
||||||
|
NODE_DISPLAY_NAME_MAPPINGS = {
|
||||||
|
"ImageGenerateGradient": "Image Generate Gradient",
|
||||||
|
}
|
||||||
@ -1,4 +1,6 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import logging
|
||||||
from typing import TYPE_CHECKING, Union
|
from typing import TYPE_CHECKING, Union
|
||||||
import torch
|
import torch
|
||||||
from collections.abc import Iterable
|
from collections.abc import Iterable
|
||||||
@ -9,7 +11,10 @@ if TYPE_CHECKING:
|
|||||||
import comfy.hooks
|
import comfy.hooks
|
||||||
import comfy.sd
|
import comfy.sd
|
||||||
import comfy.utils
|
import comfy.utils
|
||||||
import folder_paths
|
from comfy.cmd import folder_paths
|
||||||
|
from comfy.model_downloader import get_or_download, get_filename_list_with_downloadable
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
###########################################
|
###########################################
|
||||||
# Mask, Combine, and Hook Conditioning
|
# Mask, Combine, and Hook Conditioning
|
||||||
@ -294,7 +299,7 @@ class CreateHookLora:
|
|||||||
def INPUT_TYPES(s):
|
def INPUT_TYPES(s):
|
||||||
return {
|
return {
|
||||||
"required": {
|
"required": {
|
||||||
"lora_name": (folder_paths.get_filename_list("loras"), ),
|
"lora_name": (get_filename_list_with_downloadable("loras"), ),
|
||||||
"strength_model": ("FLOAT", {"default": 1.0, "min": -20.0, "max": 20.0, "step": 0.01}),
|
"strength_model": ("FLOAT", {"default": 1.0, "min": -20.0, "max": 20.0, "step": 0.01}),
|
||||||
"strength_clip": ("FLOAT", {"default": 1.0, "min": -20.0, "max": 20.0, "step": 0.01}),
|
"strength_clip": ("FLOAT", {"default": 1.0, "min": -20.0, "max": 20.0, "step": 0.01}),
|
||||||
},
|
},
|
||||||
@ -316,7 +321,7 @@ class CreateHookLora:
|
|||||||
if strength_model == 0 and strength_clip == 0:
|
if strength_model == 0 and strength_clip == 0:
|
||||||
return (prev_hooks,)
|
return (prev_hooks,)
|
||||||
|
|
||||||
lora_path = folder_paths.get_full_path("loras", lora_name)
|
lora_path = get_or_download("loras", lora_name)
|
||||||
lora = None
|
lora = None
|
||||||
if self.loaded_lora is not None:
|
if self.loaded_lora is not None:
|
||||||
if self.loaded_lora[0] == lora_path:
|
if self.loaded_lora[0] == lora_path:
|
||||||
@ -340,7 +345,7 @@ class CreateHookLoraModelOnly(CreateHookLora):
|
|||||||
def INPUT_TYPES(s):
|
def INPUT_TYPES(s):
|
||||||
return {
|
return {
|
||||||
"required": {
|
"required": {
|
||||||
"lora_name": (folder_paths.get_filename_list("loras"), ),
|
"lora_name": (get_filename_list_with_downloadable("loras"), ),
|
||||||
"strength_model": ("FLOAT", {"default": 1.0, "min": -20.0, "max": 20.0, "step": 0.01}),
|
"strength_model": ("FLOAT", {"default": 1.0, "min": -20.0, "max": 20.0, "step": 0.01}),
|
||||||
},
|
},
|
||||||
"optional": {
|
"optional": {
|
||||||
@ -369,7 +374,7 @@ class CreateHookModelAsLora:
|
|||||||
def INPUT_TYPES(s):
|
def INPUT_TYPES(s):
|
||||||
return {
|
return {
|
||||||
"required": {
|
"required": {
|
||||||
"ckpt_name": (folder_paths.get_filename_list("checkpoints"), ),
|
"ckpt_name": (get_filename_list_with_downloadable("checkpoints"), ),
|
||||||
"strength_model": ("FLOAT", {"default": 1.0, "min": -20.0, "max": 20.0, "step": 0.01}),
|
"strength_model": ("FLOAT", {"default": 1.0, "min": -20.0, "max": 20.0, "step": 0.01}),
|
||||||
"strength_clip": ("FLOAT", {"default": 1.0, "min": -20.0, "max": 20.0, "step": 0.01}),
|
"strength_clip": ("FLOAT", {"default": 1.0, "min": -20.0, "max": 20.0, "step": 0.01}),
|
||||||
},
|
},
|
||||||
@ -389,7 +394,7 @@ class CreateHookModelAsLora:
|
|||||||
prev_hooks = comfy.hooks.HookGroup()
|
prev_hooks = comfy.hooks.HookGroup()
|
||||||
prev_hooks.clone()
|
prev_hooks.clone()
|
||||||
|
|
||||||
ckpt_path = folder_paths.get_full_path("checkpoints", ckpt_name)
|
ckpt_path = get_or_download("checkpoints", ckpt_name)
|
||||||
weights_model = None
|
weights_model = None
|
||||||
weights_clip = None
|
weights_clip = None
|
||||||
if self.loaded_weights is not None:
|
if self.loaded_weights is not None:
|
||||||
@ -418,7 +423,7 @@ class CreateHookModelAsLoraModelOnly(CreateHookModelAsLora):
|
|||||||
def INPUT_TYPES(s):
|
def INPUT_TYPES(s):
|
||||||
return {
|
return {
|
||||||
"required": {
|
"required": {
|
||||||
"ckpt_name": (folder_paths.get_filename_list("checkpoints"), ),
|
"ckpt_name": (get_filename_list_with_downloadable("checkpoints"), ),
|
||||||
"strength_model": ("FLOAT", {"default": 1.0, "min": -20.0, "max": 20.0, "step": 0.01}),
|
"strength_model": ("FLOAT", {"default": 1.0, "min": -20.0, "max": 20.0, "step": 0.01}),
|
||||||
},
|
},
|
||||||
"optional": {
|
"optional": {
|
||||||
@ -539,7 +544,7 @@ class CreateHookKeyframesInterpolated:
|
|||||||
is_first = False
|
is_first = False
|
||||||
prev_hook_kf.add(comfy.hooks.HookKeyframe(strength=strength, start_percent=percent, guarantee_steps=guarantee_steps))
|
prev_hook_kf.add(comfy.hooks.HookKeyframe(strength=strength, start_percent=percent, guarantee_steps=guarantee_steps))
|
||||||
if print_keyframes:
|
if print_keyframes:
|
||||||
print(f"Hook Keyframe - start_percent:{percent} = {strength}")
|
logger.debug(f"Hook Keyframe - start_percent:{percent} = {strength}")
|
||||||
return (prev_hook_kf,)
|
return (prev_hook_kf,)
|
||||||
|
|
||||||
class CreateHookKeyframesFromFloats:
|
class CreateHookKeyframesFromFloats:
|
||||||
@ -588,7 +593,7 @@ class CreateHookKeyframesFromFloats:
|
|||||||
is_first = False
|
is_first = False
|
||||||
prev_hook_kf.add(comfy.hooks.HookKeyframe(strength=strength, start_percent=percent, guarantee_steps=guarantee_steps))
|
prev_hook_kf.add(comfy.hooks.HookKeyframe(strength=strength, start_percent=percent, guarantee_steps=guarantee_steps))
|
||||||
if print_keyframes:
|
if print_keyframes:
|
||||||
print(f"Hook Keyframe - start_percent:{percent} = {strength}")
|
logger.debug(f"Hook Keyframe - start_percent:{percent} = {strength}")
|
||||||
return (prev_hook_kf,)
|
return (prev_hook_kf,)
|
||||||
#------------------------------------------
|
#------------------------------------------
|
||||||
###########################################
|
###########################################
|
||||||
@ -36,7 +36,8 @@ class LTXVImgToVideo:
|
|||||||
"width": ("INT", {"default": 768, "min": 64, "max": nodes.MAX_RESOLUTION, "step": 32}),
|
"width": ("INT", {"default": 768, "min": 64, "max": nodes.MAX_RESOLUTION, "step": 32}),
|
||||||
"height": ("INT", {"default": 512, "min": 64, "max": nodes.MAX_RESOLUTION, "step": 32}),
|
"height": ("INT", {"default": 512, "min": 64, "max": nodes.MAX_RESOLUTION, "step": 32}),
|
||||||
"length": ("INT", {"default": 97, "min": 9, "max": nodes.MAX_RESOLUTION, "step": 8}),
|
"length": ("INT", {"default": 97, "min": 9, "max": nodes.MAX_RESOLUTION, "step": 8}),
|
||||||
"batch_size": ("INT", {"default": 1, "min": 1, "max": 4096}),
|
"batch_size": ("INT", {"default": 1, "min": 1, "max": 4096}),},
|
||||||
|
"optional": {
|
||||||
"image_noise_scale": ("FLOAT", {"default": 0.15, "min": 0, "max": 1.0, "step": 0.01, "tooltip": "Amount of noise to apply on conditioning image latent."})
|
"image_noise_scale": ("FLOAT", {"default": 0.15, "min": 0, "max": 1.0, "step": 0.01, "tooltip": "Amount of noise to apply on conditioning image latent."})
|
||||||
}}
|
}}
|
||||||
|
|
||||||
@ -46,7 +47,7 @@ class LTXVImgToVideo:
|
|||||||
CATEGORY = "conditioning/video_models"
|
CATEGORY = "conditioning/video_models"
|
||||||
FUNCTION = "generate"
|
FUNCTION = "generate"
|
||||||
|
|
||||||
def generate(self, positive, negative, image, vae, width, height, length, batch_size, image_noise_scale):
|
def generate(self, positive, negative, image, vae, width, height, length, batch_size, image_noise_scale=0.15):
|
||||||
pixels = comfy.utils.common_upscale(image.movedim(-1, 1), width, height, "bilinear", "center").movedim(1, -1)
|
pixels = comfy.utils.common_upscale(image.movedim(-1, 1), width, height, "bilinear", "center").movedim(1, -1)
|
||||||
encode_pixels = pixels[:, :, :, :3]
|
encode_pixels = pixels[:, :, :, :3]
|
||||||
t = vae.encode(encode_pixels)
|
t = vae.encode(encode_pixels)
|
||||||
|
|||||||
@ -203,7 +203,6 @@ class TestExecution:
|
|||||||
|
|
||||||
@pytest.mark.parametrize("test_type, test_value", [
|
@pytest.mark.parametrize("test_type, test_value", [
|
||||||
("StubInt", 5),
|
("StubInt", 5),
|
||||||
("StubFloat", 5.0)
|
|
||||||
])
|
])
|
||||||
async def test_validation_error_edge1(self, test_type, test_value, client: ComfyClient, builder: GraphBuilder):
|
async def test_validation_error_edge1(self, test_type, test_value, client: ComfyClient, builder: GraphBuilder):
|
||||||
g = builder
|
g = builder
|
||||||
|
|||||||
303
tests/inference/workflows/lora-hooks-0.json
Normal file
303
tests/inference/workflows/lora-hooks-0.json
Normal file
@ -0,0 +1,303 @@
|
|||||||
|
{
|
||||||
|
"2": {
|
||||||
|
"inputs": {
|
||||||
|
"text": "worst quality, low quality",
|
||||||
|
"clip": [
|
||||||
|
"21",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "CLIPTextEncode",
|
||||||
|
"_meta": {
|
||||||
|
"title": "CLIP Text Encode (Prompt)"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"3": {
|
||||||
|
"inputs": {
|
||||||
|
"text": "worst quality, low quality",
|
||||||
|
"clip": [
|
||||||
|
"11",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "CLIPTextEncode",
|
||||||
|
"_meta": {
|
||||||
|
"title": "CLIP Text Encode (Prompt)"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"4": {
|
||||||
|
"inputs": {
|
||||||
|
"text": "rock in a river, outdoors, forest, sky, clouds, best quality",
|
||||||
|
"clip": [
|
||||||
|
"21",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "CLIPTextEncode",
|
||||||
|
"_meta": {
|
||||||
|
"title": "CLIP Text Encode (Prompt)"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"5": {
|
||||||
|
"inputs": {
|
||||||
|
"width": 768,
|
||||||
|
"height": 768,
|
||||||
|
"batch_size": 1
|
||||||
|
},
|
||||||
|
"class_type": "EmptyLatentImage",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Empty Latent Image"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"6": {
|
||||||
|
"inputs": {
|
||||||
|
"text": "rock in a river, outdoors, forest, sky, clouds, best quality",
|
||||||
|
"clip": [
|
||||||
|
"11",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "CLIPTextEncode",
|
||||||
|
"_meta": {
|
||||||
|
"title": "CLIP Text Encode (Prompt)"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"9": {
|
||||||
|
"inputs": {
|
||||||
|
"samples": [
|
||||||
|
"23",
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"vae": [
|
||||||
|
"10",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "VAEDecode",
|
||||||
|
"_meta": {
|
||||||
|
"title": "VAE Decode"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"10": {
|
||||||
|
"inputs": {
|
||||||
|
"vae_name": "vae-ft-mse-840000-ema-pruned.safetensors"
|
||||||
|
},
|
||||||
|
"class_type": "VAELoader",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Load VAE"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"11": {
|
||||||
|
"inputs": {
|
||||||
|
"apply_to_conds": true,
|
||||||
|
"schedule_clip": false,
|
||||||
|
"clip": [
|
||||||
|
"12",
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"hooks": [
|
||||||
|
"18",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "SetClipHooks",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Set CLIP Hooks"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"12": {
|
||||||
|
"inputs": {
|
||||||
|
"stop_at_clip_layer": -2,
|
||||||
|
"clip": [
|
||||||
|
"13",
|
||||||
|
1
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "CLIPSetLastLayer",
|
||||||
|
"_meta": {
|
||||||
|
"title": "CLIP Set Last Layer"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"13": {
|
||||||
|
"inputs": {
|
||||||
|
"ckpt_name": "cardosAnime_v20.safetensors"
|
||||||
|
},
|
||||||
|
"class_type": "CheckpointLoaderSimple",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Load Checkpoint"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"14": {
|
||||||
|
"inputs": {
|
||||||
|
"mask": [
|
||||||
|
"68",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "InvertMask",
|
||||||
|
"_meta": {
|
||||||
|
"title": "InvertMask"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"16": {
|
||||||
|
"inputs": {
|
||||||
|
"strength": 1,
|
||||||
|
"set_cond_area": "default",
|
||||||
|
"positive_NEW": [
|
||||||
|
"4",
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"negative_NEW": [
|
||||||
|
"2",
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"mask": [
|
||||||
|
"68",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "PairConditioningSetProperties",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Cond Pair Set Props"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"17": {
|
||||||
|
"inputs": {
|
||||||
|
"strength": 1,
|
||||||
|
"set_cond_area": "default",
|
||||||
|
"positive": [
|
||||||
|
"16",
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"negative": [
|
||||||
|
"16",
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"positive_NEW": [
|
||||||
|
"6",
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"negative_NEW": [
|
||||||
|
"3",
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"mask": [
|
||||||
|
"14",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "PairConditioningSetPropertiesAndCombine",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Cond Pair Set Props Combine"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"18": {
|
||||||
|
"inputs": {
|
||||||
|
"ckpt_name": "dreamshaper_8.safetensors",
|
||||||
|
"strength_model": 1,
|
||||||
|
"strength_clip": 1
|
||||||
|
},
|
||||||
|
"class_type": "CreateHookModelAsLora",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Create Hook Model as LoRA"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"20": {
|
||||||
|
"inputs": {
|
||||||
|
"lora_name": "PixelArtRedmond15V-PixelArt-PIXARFK.safetensors",
|
||||||
|
"strength_model": 1.1,
|
||||||
|
"strength_clip": 1
|
||||||
|
},
|
||||||
|
"class_type": "CreateHookLora",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Create Hook LoRA"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"21": {
|
||||||
|
"inputs": {
|
||||||
|
"apply_to_conds": true,
|
||||||
|
"schedule_clip": false,
|
||||||
|
"clip": [
|
||||||
|
"12",
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"hooks": [
|
||||||
|
"20",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "SetClipHooks",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Set CLIP Hooks"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"22": {
|
||||||
|
"inputs": {
|
||||||
|
"filename_prefix": "lorahooksmasking/img",
|
||||||
|
"images": [
|
||||||
|
"9",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "SaveImage",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Save Image"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"23": {
|
||||||
|
"inputs": {
|
||||||
|
"seed": 12345678,
|
||||||
|
"steps": 30,
|
||||||
|
"cfg": 8,
|
||||||
|
"sampler_name": "euler",
|
||||||
|
"scheduler": "normal",
|
||||||
|
"denoise": 1,
|
||||||
|
"model": [
|
||||||
|
"13",
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"positive": [
|
||||||
|
"17",
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"negative": [
|
||||||
|
"17",
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"latent_image": [
|
||||||
|
"5",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "KSampler",
|
||||||
|
"_meta": {
|
||||||
|
"title": "KSampler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"67": {
|
||||||
|
"inputs": {
|
||||||
|
"width": 768,
|
||||||
|
"height": 768,
|
||||||
|
"direction": "horizontal",
|
||||||
|
"tolerance": 0,
|
||||||
|
"gradient_stops": "0:255,255,255\n100:0,0,0"
|
||||||
|
},
|
||||||
|
"class_type": "ImageGenerateGradient",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Image Generate Gradient"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"68": {
|
||||||
|
"inputs": {
|
||||||
|
"channel": "red",
|
||||||
|
"image": [
|
||||||
|
"67",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "ImageToMask",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Convert Image to Mask"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
207
tests/inference/workflows/lora-hooks-1.json
Normal file
207
tests/inference/workflows/lora-hooks-1.json
Normal file
@ -0,0 +1,207 @@
|
|||||||
|
{
|
||||||
|
"2": {
|
||||||
|
"inputs": {
|
||||||
|
"text": "worst quality, low quality",
|
||||||
|
"clip": [
|
||||||
|
"21",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "CLIPTextEncode",
|
||||||
|
"_meta": {
|
||||||
|
"title": "CLIP Text Encode (Prompt)"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"4": {
|
||||||
|
"inputs": {
|
||||||
|
"text": "rock in a river, outdoors, forest, sky, clouds, best quality",
|
||||||
|
"clip": [
|
||||||
|
"21",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "CLIPTextEncode",
|
||||||
|
"_meta": {
|
||||||
|
"title": "CLIP Text Encode (Prompt)"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"5": {
|
||||||
|
"inputs": {
|
||||||
|
"width": 768,
|
||||||
|
"height": 768,
|
||||||
|
"batch_size": 1
|
||||||
|
},
|
||||||
|
"class_type": "EmptyLatentImage",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Empty Latent Image"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"9": {
|
||||||
|
"inputs": {
|
||||||
|
"samples": [
|
||||||
|
"23",
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"vae": [
|
||||||
|
"10",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "VAEDecode",
|
||||||
|
"_meta": {
|
||||||
|
"title": "VAE Decode"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"10": {
|
||||||
|
"inputs": {
|
||||||
|
"vae_name": "vae-ft-mse-840000-ema-pruned.safetensors"
|
||||||
|
},
|
||||||
|
"class_type": "VAELoader",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Load VAE"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"12": {
|
||||||
|
"inputs": {
|
||||||
|
"stop_at_clip_layer": -2,
|
||||||
|
"clip": [
|
||||||
|
"13",
|
||||||
|
1
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "CLIPSetLastLayer",
|
||||||
|
"_meta": {
|
||||||
|
"title": "CLIP Set Last Layer"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"13": {
|
||||||
|
"inputs": {
|
||||||
|
"ckpt_name": "cardosAnime_v20.safetensors"
|
||||||
|
},
|
||||||
|
"class_type": "CheckpointLoaderSimple",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Load Checkpoint"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"16": {
|
||||||
|
"inputs": {
|
||||||
|
"strength": 1,
|
||||||
|
"set_cond_area": "default",
|
||||||
|
"positive_NEW": [
|
||||||
|
"4",
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"negative_NEW": [
|
||||||
|
"2",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "PairConditioningSetProperties",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Cond Pair Set Props"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"20": {
|
||||||
|
"inputs": {
|
||||||
|
"lora_name": "PixelArtRedmond15V-PixelArt-PIXARFK.safetensors",
|
||||||
|
"strength_model": 1,
|
||||||
|
"strength_clip": 1
|
||||||
|
},
|
||||||
|
"class_type": "CreateHookLora",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Create Hook LoRA"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"21": {
|
||||||
|
"inputs": {
|
||||||
|
"apply_to_conds": true,
|
||||||
|
"schedule_clip": false,
|
||||||
|
"clip": [
|
||||||
|
"12",
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"hooks": [
|
||||||
|
"75",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "SetClipHooks",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Set CLIP Hooks"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"22": {
|
||||||
|
"inputs": {
|
||||||
|
"filename_prefix": "lorahooks/img",
|
||||||
|
"images": [
|
||||||
|
"9",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "SaveImage",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Save Image"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"23": {
|
||||||
|
"inputs": {
|
||||||
|
"seed": 12345678,
|
||||||
|
"steps": 30,
|
||||||
|
"cfg": 8,
|
||||||
|
"sampler_name": "euler",
|
||||||
|
"scheduler": "normal",
|
||||||
|
"denoise": 1,
|
||||||
|
"model": [
|
||||||
|
"13",
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"positive": [
|
||||||
|
"16",
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"negative": [
|
||||||
|
"16",
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"latent_image": [
|
||||||
|
"5",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "KSampler",
|
||||||
|
"_meta": {
|
||||||
|
"title": "KSampler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"75": {
|
||||||
|
"inputs": {
|
||||||
|
"hooks": [
|
||||||
|
"20",
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"hook_kf": [
|
||||||
|
"76",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "SetHookKeyframes",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Set Hook Keyframes"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"76": {
|
||||||
|
"inputs": {
|
||||||
|
"strength_start": 0,
|
||||||
|
"strength_end": 1,
|
||||||
|
"interpolation": "linear",
|
||||||
|
"start_percent": 0,
|
||||||
|
"end_percent": 0.5,
|
||||||
|
"keyframes_count": 5,
|
||||||
|
"print_keyframes": true
|
||||||
|
},
|
||||||
|
"class_type": "CreateHookKeyframesInterpolated",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Create Hook Keyframes Interp."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
374
tests/inference/workflows/lora-hooks-2.json
Normal file
374
tests/inference/workflows/lora-hooks-2.json
Normal file
@ -0,0 +1,374 @@
|
|||||||
|
{
|
||||||
|
"1": {
|
||||||
|
"inputs": {
|
||||||
|
"ckpt_name": "cardosAnime_v20.safetensors"
|
||||||
|
},
|
||||||
|
"class_type": "CheckpointLoaderSimple",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Load Checkpoint"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"2": {
|
||||||
|
"inputs": {
|
||||||
|
"stop_at_clip_layer": -2,
|
||||||
|
"clip": [
|
||||||
|
"1",
|
||||||
|
1
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "CLIPSetLastLayer",
|
||||||
|
"_meta": {
|
||||||
|
"title": "CLIP Set Last Layer"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"3": {
|
||||||
|
"inputs": {
|
||||||
|
"text": "rock in a river, outdoors, forest, sky, clouds, best quality",
|
||||||
|
"clip": [
|
||||||
|
"9",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "CLIPTextEncode",
|
||||||
|
"_meta": {
|
||||||
|
"title": "CLIP Text Encode (Prompt)"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"5": {
|
||||||
|
"inputs": {
|
||||||
|
"text": "worst quality, low quality",
|
||||||
|
"clip": [
|
||||||
|
"9",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "CLIPTextEncode",
|
||||||
|
"_meta": {
|
||||||
|
"title": "CLIP Text Encode (Prompt)"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"6": {
|
||||||
|
"inputs": {
|
||||||
|
"text": "rock in a river, outdoors, forest, sky, clouds, best quality",
|
||||||
|
"clip": [
|
||||||
|
"22",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "CLIPTextEncode",
|
||||||
|
"_meta": {
|
||||||
|
"title": "CLIP Text Encode (Prompt)"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"7": {
|
||||||
|
"inputs": {
|
||||||
|
"text": "worst quality, low quality",
|
||||||
|
"clip": [
|
||||||
|
"22",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "CLIPTextEncode",
|
||||||
|
"_meta": {
|
||||||
|
"title": "CLIP Text Encode (Prompt)"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"9": {
|
||||||
|
"inputs": {
|
||||||
|
"apply_to_conds": true,
|
||||||
|
"schedule_clip": false,
|
||||||
|
"clip": [
|
||||||
|
"2",
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"hooks": [
|
||||||
|
"39",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "SetClipHooks",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Set CLIP Hooks"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"10": {
|
||||||
|
"inputs": {
|
||||||
|
"seed": 12345678,
|
||||||
|
"steps": 30,
|
||||||
|
"cfg": 8,
|
||||||
|
"sampler_name": "euler",
|
||||||
|
"scheduler": "normal",
|
||||||
|
"denoise": 1,
|
||||||
|
"model": [
|
||||||
|
"1",
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"positive": [
|
||||||
|
"17",
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"negative": [
|
||||||
|
"17",
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"latent_image": [
|
||||||
|
"11",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "KSampler",
|
||||||
|
"_meta": {
|
||||||
|
"title": "KSampler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"11": {
|
||||||
|
"inputs": {
|
||||||
|
"width": 768,
|
||||||
|
"height": 768,
|
||||||
|
"batch_size": 1
|
||||||
|
},
|
||||||
|
"class_type": "EmptyLatentImage",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Empty Latent Image"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"12": {
|
||||||
|
"inputs": {
|
||||||
|
"samples": [
|
||||||
|
"10",
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"vae": [
|
||||||
|
"14",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "VAEDecode",
|
||||||
|
"_meta": {
|
||||||
|
"title": "VAE Decode"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"13": {
|
||||||
|
"inputs": {
|
||||||
|
"filename_prefix": "lorahooksboth/img",
|
||||||
|
"images": [
|
||||||
|
"12",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "SaveImage",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Save Image"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"14": {
|
||||||
|
"inputs": {
|
||||||
|
"vae_name": "vae-ft-mse-840000-ema-pruned.safetensors"
|
||||||
|
},
|
||||||
|
"class_type": "VAELoader",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Load VAE"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"17": {
|
||||||
|
"inputs": {
|
||||||
|
"strength": 1,
|
||||||
|
"set_cond_area": "default",
|
||||||
|
"positive": [
|
||||||
|
"18",
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"negative": [
|
||||||
|
"18",
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"positive_NEW": [
|
||||||
|
"6",
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"negative_NEW": [
|
||||||
|
"7",
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"mask": [
|
||||||
|
"20",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "PairConditioningSetPropertiesAndCombine",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Cond Pair Set Props Combine"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"18": {
|
||||||
|
"inputs": {
|
||||||
|
"strength": 1,
|
||||||
|
"set_cond_area": "default",
|
||||||
|
"positive_NEW": [
|
||||||
|
"3",
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"negative_NEW": [
|
||||||
|
"5",
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"mask": [
|
||||||
|
"42",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "PairConditioningSetProperties",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Cond Pair Set Props"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"20": {
|
||||||
|
"inputs": {
|
||||||
|
"mask": [
|
||||||
|
"42",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "InvertMask",
|
||||||
|
"_meta": {
|
||||||
|
"title": "InvertMask"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"22": {
|
||||||
|
"inputs": {
|
||||||
|
"apply_to_conds": true,
|
||||||
|
"schedule_clip": false,
|
||||||
|
"clip": [
|
||||||
|
"2",
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"hooks": [
|
||||||
|
"34",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "SetClipHooks",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Set CLIP Hooks"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"33": {
|
||||||
|
"inputs": {
|
||||||
|
"ckpt_name": "dreamshaper_8.safetensors",
|
||||||
|
"strength_model": 1,
|
||||||
|
"strength_clip": 1
|
||||||
|
},
|
||||||
|
"class_type": "CreateHookModelAsLora",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Create Hook Model as LoRA"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"34": {
|
||||||
|
"inputs": {
|
||||||
|
"hooks": [
|
||||||
|
"33",
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"hook_kf": [
|
||||||
|
"36",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "SetHookKeyframes",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Set Hook Keyframes"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"36": {
|
||||||
|
"inputs": {
|
||||||
|
"strength_start": 0,
|
||||||
|
"strength_end": 1,
|
||||||
|
"interpolation": "linear",
|
||||||
|
"start_percent": 0,
|
||||||
|
"end_percent": 0.5,
|
||||||
|
"keyframes_count": 5,
|
||||||
|
"print_keyframes": true
|
||||||
|
},
|
||||||
|
"class_type": "CreateHookKeyframesInterpolated",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Create Hook Keyframes Interp."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"37": {
|
||||||
|
"inputs": {
|
||||||
|
"lora_name": "PixelArtRedmond15V-PixelArt-PIXARFK.safetensors",
|
||||||
|
"strength_model": 1,
|
||||||
|
"strength_clip": 1
|
||||||
|
},
|
||||||
|
"class_type": "CreateHookLora",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Create Hook LoRA"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"38": {
|
||||||
|
"inputs": {
|
||||||
|
"hooks": [
|
||||||
|
"37",
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"hook_kf": [
|
||||||
|
"36",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "SetHookKeyframes",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Set Hook Keyframes"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"39": {
|
||||||
|
"inputs": {
|
||||||
|
"hooks_A": [
|
||||||
|
"38",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "CombineHooks2",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Combine Hooks [2]"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"41": {
|
||||||
|
"inputs": {
|
||||||
|
"width": 768,
|
||||||
|
"height": 768,
|
||||||
|
"direction": "horizontal",
|
||||||
|
"tolerance": 0,
|
||||||
|
"gradient_stops": "0:255,255,255\n100:0,0,0"
|
||||||
|
},
|
||||||
|
"class_type": "ImageGenerateGradient",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Image Generate Gradient"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"42": {
|
||||||
|
"inputs": {
|
||||||
|
"channel": "red",
|
||||||
|
"image": [
|
||||||
|
"41",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "ImageToMask",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Convert Image to Mask"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"43": {
|
||||||
|
"inputs": {
|
||||||
|
"images": [
|
||||||
|
"41",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "PreviewImage",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Preview Image"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,5 +1,5 @@
|
|||||||
import pytest
|
import pytest
|
||||||
from comfy_execution.validation import validate_node_input
|
from comfy.validation import validate_node_input
|
||||||
|
|
||||||
|
|
||||||
def test_exact_match():
|
def test_exact_match():
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 373 B |
Binary file not shown.
|
Before Width: | Height: | Size: 410 B |
Loading…
Reference in New Issue
Block a user