", descEnd);
- if (descStart !== -1) {
- const json = svg.substring(descStart + 6, descEnd);
- template = JSON.parse(unescapeXml(json));
- }
- }
+ let templateJSON = extractTemplateJSONFromSVG(svg);
+ if (templateJSON)
+ template = JSON.parse(templateJSON);
if (!isSerializedComfyBoxTemplate(template)) {
reject("Invalid template format!")
diff --git a/src/lib/components/ComfyTemplates.svelte b/src/lib/components/ComfyTemplates.svelte
index aae70a4..8609ead 100644
--- a/src/lib/components/ComfyTemplates.svelte
+++ b/src/lib/components/ComfyTemplates.svelte
@@ -143,7 +143,8 @@
{
name: "Delete",
variant: "secondary",
- onClick: deleteTemplate
+ onClick: deleteTemplate,
+ disabled: layout.template.isBuiltIn
},
{
name: "Close",
diff --git a/src/lib/components/GlobalModal.svelte b/src/lib/components/GlobalModal.svelte
index 047c31d..4a0262e 100644
--- a/src/lib/components/GlobalModal.svelte
+++ b/src/lib/components/GlobalModal.svelte
@@ -13,6 +13,9 @@
}
function onButtonClicked(modal: ModalData, button: ModalButton, closeDialog: Function) {
+ if (button.disabled)
+ return;
+
if (button.onClick(modal) === false)
return
@@ -39,7 +42,7 @@
@@ -120,10 +180,34 @@
:global(> .block) {
background: var(--panel-background-fill);
}
+
+ .json {
+ @include json-view;
+ }
}
.template-graph-wrapper {
overflow: auto;
margin: auto;
}
+
+
+ .json-button {
+ display: flex;
+ position: absolute;
+ top: var(--block-label-margin);
+ right: var(--block-label-margin);
+ align-items: center;
+ box-shadow: var(--shadow-drop);
+ border: 1px solid var(--border-color-primary);
+ border-radius: var(--block-label-right-radius);
+ background: var(--block-label-background-fill);
+ padding: 5px;
+ width: 30px;
+ height: 30px;
+ overflow: hidden;
+ color: var(--block-label-text-color);
+ font: var(--font);
+ font-size: var(--button-small-text-size);
+ }
diff --git a/src/lib/stores/modalState.ts b/src/lib/stores/modalState.ts
index 6cb89d8..116a3ce 100644
--- a/src/lib/stores/modalState.ts
+++ b/src/lib/stores/modalState.ts
@@ -8,6 +8,7 @@ export type ModalButton = {
name: string,
variant: "primary" | "secondary",
onClick: (state: ModalData) => boolean | void,
+ disabled?: boolean,
closeOnClick?: boolean
}
export interface ModalData {
diff --git a/src/scss/global.scss b/src/scss/global.scss
index 2f7c40d..f3545c4 100644
--- a/src/scss/global.scss
+++ b/src/scss/global.scss
@@ -146,6 +146,23 @@ body {
}
}
+@mixin json-view {
+ --jsonPaddingLeft: 1rem;
+ --jsonBorderLeft: 1px dotted var(--neutral-600);
+ --jsonBracketColor: currentcolor;
+ --jsonBracketHoverBackground: var(--primary-200);
+ --jsonSeparatorColor: currentcolor;
+ --jsonKeyColor: var(--body-text-color);
+ --jsonValColor: var(--body-text-color-subdued);
+ --jsonValStringColor: var(--color-green-500);
+ --jsonValNumberColor: var(--color-blue-500);
+ --jsonValBooleanColor: var(--color-red-500);
+ --jsonCollapsedColor: var(--neutral-100);
+ --jsonCollapsedBackground: var(--primary-400);
+
+ font-family: monospace;
+}
+
hr {
color: var(--panel-border-color);
}