@comfyorg/design-system 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/LICENSE +674 -0
  2. package/package.json +43 -0
  3. package/src/css/_palette.css +55 -0
  4. package/src/css/base.css +8 -0
  5. package/src/css/comfyIconSet.js +30 -0
  6. package/src/css/fonts.css +17 -0
  7. package/src/css/iconifyDynamicPlugin.ts +49 -0
  8. package/src/css/lucideStrokePlugin.js +88 -0
  9. package/src/css/style.css +1909 -0
  10. package/src/icons/3d-decomp.svg +3 -0
  11. package/src/icons/README.md +363 -0
  12. package/src/icons/ai-model.svg +1 -0
  13. package/src/icons/anthropic.svg +1 -0
  14. package/src/icons/batch-images-node.svg +3 -0
  15. package/src/icons/bfl.svg +10 -0
  16. package/src/icons/bria.svg +18 -0
  17. package/src/icons/brightness-contrast.svg +3 -0
  18. package/src/icons/bytedance.svg +13 -0
  19. package/src/icons/canny-to-image.svg +3 -0
  20. package/src/icons/canny-to-video.svg +3 -0
  21. package/src/icons/canny.svg +3 -0
  22. package/src/icons/channels.svg +5 -0
  23. package/src/icons/chromatic-aberration.svg +3 -0
  24. package/src/icons/claude.svg +1 -0
  25. package/src/icons/comfy-c.svg +4 -0
  26. package/src/icons/comfy-logo.svg +3 -0
  27. package/src/icons/credits.svg +3 -0
  28. package/src/icons/depth-to-image.svg +3 -0
  29. package/src/icons/depth-to-video.svg +3 -0
  30. package/src/icons/dial.svg +3 -0
  31. package/src/icons/elevenlabs.svg +1 -0
  32. package/src/icons/extensions-blocks.svg +1 -0
  33. package/src/icons/file-output.svg +3 -0
  34. package/src/icons/frames-to-video.svg +3 -0
  35. package/src/icons/gemini.svg +25 -0
  36. package/src/icons/get-video-components.svg +3 -0
  37. package/src/icons/glow.svg +4 -0
  38. package/src/icons/grain.svg +4 -0
  39. package/src/icons/grok.svg +10 -0
  40. package/src/icons/hitpaw.svg +10 -0
  41. package/src/icons/ideogram.svg +3 -0
  42. package/src/icons/image-ai-edit.svg +5 -0
  43. package/src/icons/image-batch.svg +3 -0
  44. package/src/icons/image-blur.svg +3 -0
  45. package/src/icons/image-canny.svg +3 -0
  46. package/src/icons/image-captioning.svg +3 -0
  47. package/src/icons/image-collage.svg +3 -0
  48. package/src/icons/image-compare.svg +3 -0
  49. package/src/icons/image-depth.svg +3 -0
  50. package/src/icons/image-edit.svg +3 -0
  51. package/src/icons/image-inpaint.svg +3 -0
  52. package/src/icons/image-invert.svg +3 -0
  53. package/src/icons/image-outpaint.svg +3 -0
  54. package/src/icons/image-outpainting.svg +3 -0
  55. package/src/icons/image-remove-background.svg +3 -0
  56. package/src/icons/image-rotate.svg +3 -0
  57. package/src/icons/image-select-object-segmentation.svg +3 -0
  58. package/src/icons/image-shader.svg +3 -0
  59. package/src/icons/image-sharpen.svg +3 -0
  60. package/src/icons/image-to-3d.svg +3 -0
  61. package/src/icons/image-to-image.svg +3 -0
  62. package/src/icons/image-to-layers.svg +3 -0
  63. package/src/icons/image-to-video.svg +3 -0
  64. package/src/icons/image-upscale.svg +3 -0
  65. package/src/icons/image-vectorize.svg +3 -0
  66. package/src/icons/kling.svg +38 -0
  67. package/src/icons/load-3d.svg +3 -0
  68. package/src/icons/load-audio.svg +3 -0
  69. package/src/icons/load-video.svg +3 -0
  70. package/src/icons/lora-loader.svg +3 -0
  71. package/src/icons/ltxv.svg +10 -0
  72. package/src/icons/luma.svg +35 -0
  73. package/src/icons/magnific.svg +14 -0
  74. package/src/icons/mask.svg +14 -0
  75. package/src/icons/meshy.svg +33 -0
  76. package/src/icons/minimax.svg +14 -0
  77. package/src/icons/moonvalley-marey.svg +18 -0
  78. package/src/icons/node.svg +1 -0
  79. package/src/icons/open-ai-chat-node.svg +3 -0
  80. package/src/icons/openai.svg +10 -0
  81. package/src/icons/pin.svg +4 -0
  82. package/src/icons/pixverse.svg +15 -0
  83. package/src/icons/play.svg +1 -0
  84. package/src/icons/pose-to-image.svg +3 -0
  85. package/src/icons/pose-to-video.svg +3 -0
  86. package/src/icons/quiver.svg +3 -0
  87. package/src/icons/recraft.svg +11 -0
  88. package/src/icons/reve.svg +10 -0
  89. package/src/icons/rodin.svg +18 -0
  90. package/src/icons/runway.svg +10 -0
  91. package/src/icons/save-3d.svg +3 -0
  92. package/src/icons/save-audio.svg +3 -0
  93. package/src/icons/save-video.svg +3 -0
  94. package/src/icons/send.svg +3 -0
  95. package/src/icons/sora.svg +9 -0
  96. package/src/icons/stability-ai.svg +15 -0
  97. package/src/icons/template.svg +1 -0
  98. package/src/icons/tencent.svg +23 -0
  99. package/src/icons/text-prompt-enhance.svg +3 -0
  100. package/src/icons/text-to-3d.svg +3 -0
  101. package/src/icons/text-to-audio.svg +5 -0
  102. package/src/icons/text-to-image.svg +3 -0
  103. package/src/icons/text-to-video.svg +3 -0
  104. package/src/icons/topaz.svg +10 -0
  105. package/src/icons/tripo.svg +16 -0
  106. package/src/icons/veo.svg +13 -0
  107. package/src/icons/video-captioning.svg +3 -0
  108. package/src/icons/video-edit.svg +3 -0
  109. package/src/icons/video-enhance.svg +3 -0
  110. package/src/icons/video-extract-frame.svg +3 -0
  111. package/src/icons/video-inpaint.svg +3 -0
  112. package/src/icons/video-interpolation.svg +3 -0
  113. package/src/icons/video-select-object-segmentation.svg +3 -0
  114. package/src/icons/video-slice.svg +3 -0
  115. package/src/icons/video-split-screen.svg +3 -0
  116. package/src/icons/video-trim.svg +3 -0
  117. package/src/icons/video-upscale.svg +3 -0
  118. package/src/icons/vidu.svg +24 -0
  119. package/src/icons/voice-clone.svg +3 -0
  120. package/src/icons/wan.svg +13 -0
  121. package/src/icons/wavespeed.svg +12 -0
  122. package/src/icons/workflow.svg +1 -0
@@ -0,0 +1,1909 @@
1
+ @layer theme, base, primevue, components, utilities;
2
+
3
+ @import './fonts.css';
4
+ @import './_palette.css';
5
+ @import 'tailwindcss/theme' layer(theme);
6
+ @import 'tailwindcss/utilities' layer(utilities);
7
+ @import 'tw-animate-css';
8
+
9
+ @plugin 'tailwindcss-primeui';
10
+
11
+ @plugin "./iconifyDynamicPlugin.ts";
12
+
13
+ @plugin "./lucideStrokePlugin.js";
14
+
15
+ /* Safelist dynamic comfy icons for node library folders */
16
+ @source inline("icon-[comfy--{ai-model,anthropic,bfl,bria,bytedance,claude,comfy-logo,credits,elevenlabs,extensions-blocks,file-output,gemini,grok,hitpaw,ideogram,image-ai-edit,kling,ltxv,luma,magnific,mask,meshy,minimax,moonvalley-marey,node,openai,pin,pixverse,play,recraft,reve,rodin,runway,sora,stability-ai,template,tencent,topaz,tripo,veo,vidu,wan,wavespeed,workflow,quiver}]");
17
+
18
+ /* Badge icon names are built at runtime, so the scanner cannot find them. */
19
+ @source inline("icon-mask-[comfy--{3d-decomp,ai-model,anthropic,batch-images-node,bfl,bria,brightness-contrast,bytedance,canny,canny-to-image,canny-to-video,channels,chromatic-aberration,claude,comfy-c,comfy-logo,credits,depth-to-image,depth-to-video,dial,elevenlabs,extensions-blocks,file-output,frames-to-video,gemini,get-video-components,glow,grain,grok,hitpaw,ideogram,image-ai-edit,image-batch,image-blur,image-canny,image-captioning,image-collage,image-compare,image-depth,image-edit,image-inpaint,image-invert,image-outpaint,image-outpainting,image-remove-background,image-rotate,image-select-object-segmentation,image-shader,image-sharpen,image-to-3d,image-to-image,image-to-layers,image-to-video,image-upscale,image-vectorize,kling,load-3d,load-audio,load-video,lora-loader,ltxv,luma,magnific,mask,meshy,minimax,moonvalley-marey,node,open-ai-chat-node,openai,pin,pixverse,play,pose-to-image,pose-to-video,quiver,recraft,reve,rodin,runway,save-3d,save-audio,save-video,send,sora,stability-ai,template,tencent,text-prompt-enhance,text-to-3d,text-to-audio,text-to-image,text-to-video,topaz,tripo,veo,video-captioning,video-edit,video-enhance,video-extract-frame,video-inpaint,video-interpolation,video-select-object-segmentation,video-slice,video-split-screen,video-trim,video-upscale,vidu,voice-clone,wan,wavespeed,workflow}]");
20
+
21
+ @custom-variant touch (@media (hover: none));
22
+
23
+ @theme {
24
+ --shadow-interface: var(--interface-panel-box-shadow);
25
+ --shadow-inset-highlight: inset 0 1px 0 0 rgb(from white r g b / 0.1);
26
+
27
+ --text-2xs: 0.625rem;
28
+ --text-2xs--line-height: calc(1 / 0.625);
29
+
30
+ --text-3xs: 0.5625rem;
31
+ --text-3xs--line-height: calc(1 / 0.5625);
32
+
33
+ --color-ivory-100: #fdfbfa;
34
+ --color-ivory-200: #faf9f5;
35
+ --color-ivory-300: #f0eee6;
36
+
37
+ --color-sand-100: #e1ded5;
38
+ --color-sand-200: #fff7d5;
39
+ --color-sand-300: #888682;
40
+ --color-sand-400: #eed7ac;
41
+
42
+ --color-azure-300: #78bae9;
43
+ --color-azure-400: #31b9f4;
44
+ --color-azure-600: #0b8ce9;
45
+
46
+ --color-cobalt-800: #185a8b;
47
+
48
+ --color-jade-400: #47e469;
49
+ --color-jade-600: #00cd72;
50
+
51
+ --color-gold-400: #fcbf64;
52
+ --color-gold-500: #fdab34;
53
+ --color-gold-600: #fd9903;
54
+
55
+ --color-credit: #ddbd31;
56
+
57
+ --color-coral-500: #f75951;
58
+ --color-coral-600: #e04e48;
59
+ --color-coral-700: #b33a3a;
60
+
61
+ --color-magenta-300: #ceaac9;
62
+ --color-magenta-700: #6a246a;
63
+
64
+ --color-ocean-300: #badde8;
65
+ --color-ocean-600: #2f687a;
66
+ --color-ocean-900: #253236;
67
+
68
+ --color-primary-comfy-ink: #211927;
69
+ --color-primary-comfy-canvas: #c2bfb9;
70
+
71
+ --color-danger-100: #c02323;
72
+ --color-danger-200: #d62952;
73
+
74
+ --color-bypass: #6a246a;
75
+ --color-error: #962a2a;
76
+
77
+ --color-interface-panel-job-progress-primary: var(--color-azure-300);
78
+ --color-interface-panel-job-progress-secondary: var(
79
+ --color-alpha-azure-600-30
80
+ );
81
+ --color-interface-panel-job-progress-border: var(--base-foreground);
82
+
83
+ --color-blue-selection: rgb(from var(--color-azure-600) r g b / 0.3);
84
+ --color-node-hover-100: rgb(from var(--color-charcoal-800) r g b / 0.15);
85
+ --color-node-hover-200: rgb(from var(--color-charcoal-800) r g b / 0.1);
86
+ --color-modal-tag: rgb(from var(--color-smoke-400) r g b / 0.4);
87
+ --color-alpha-charcoal-600-30: color-mix(
88
+ in srgb,
89
+ var(--color-charcoal-600) 30%,
90
+ transparent
91
+ );
92
+ --color-alpha-ash-500-20: color-mix(
93
+ in srgb,
94
+ var(--color-ash-500) 20%,
95
+ transparent
96
+ );
97
+ --color-alpha-smoke-500-50: color-mix(
98
+ in srgb,
99
+ var(--color-smoke-500) 50%,
100
+ transparent
101
+ );
102
+ --color-alpha-smoke-500-20: #c5c5c533;
103
+ --color-alpha-smoke-400-40: #d9d9d966;
104
+ --color-alpha-azure-600-30: #0b8ce94d;
105
+ --color-alpha-magenta-700-60: #6a246a99;
106
+ --color-alpha-magenta-300-60: #ceaac999;
107
+
108
+ /* Onboarding coachmark overlay (always renders over a dark scrim) */
109
+ --color-coach-scrim: rgb(0 0 0 / 0.6);
110
+ --color-coach-ring: #fff;
111
+
112
+ /* PrimeVue pulled colors */
113
+ --color-muted: var(--p-text-muted-color);
114
+ --color-highlight: var(--p-primary-color);
115
+
116
+ /* Special Colors (temporary) */
117
+ --color-dark-elevation-1-5: rgba(from white r g b / 0.015);
118
+ --color-dark-elevation-2: rgba(from white r g b / 0.03);
119
+ }
120
+
121
+ :root {
122
+ --fg-color: #000;
123
+ --bg-color: #fff;
124
+ --default-transition-duration: 0.1s;
125
+ --comfy-menu-bg: #353535;
126
+ --comfy-menu-secondary-bg: #292929;
127
+ --comfy-topbar-height: 2.5rem;
128
+ --workflow-tabs-height: 2.375rem;
129
+ --comfy-input-bg: #222;
130
+ --comfy-textarea-font-size: 10px;
131
+ --input-text: #ddd;
132
+ --descrip-text: #999;
133
+ --drag-text: #ccc;
134
+ --error-text: #ff4444;
135
+ --border-color: #4e4e4e;
136
+ --tr-even-bg-color: #222;
137
+ --tr-odd-bg-color: #353535;
138
+ --primary-bg: #236692;
139
+ --primary-fg: #ffffff;
140
+ --primary-hover-bg: #3485bb;
141
+ --primary-hover-fg: #ffffff;
142
+ --content-bg: #e0e0e0;
143
+ --content-fg: #000;
144
+ --content-hover-bg: #adadad;
145
+ --content-hover-fg: #000;
146
+
147
+ --button-surface: var(--color-white);
148
+ --button-surface-contrast: var(--color-black);
149
+
150
+ /* Code styling colors for help menu*/
151
+ --code-text-color: rgb(0 122 255 / 1);
152
+ --code-bg-color: rgb(96 165 250 / 0.2);
153
+ --code-block-bg-color: rgb(60 60 60 / 0.12);
154
+
155
+ /* --- */
156
+
157
+ --accent-primary: var(--color-charcoal-700);
158
+ --backdrop: var(--color-white);
159
+
160
+ --button-hover-surface: var(--color-smoke-200);
161
+ --button-active-surface: var(--color-smoke-400);
162
+ --button-icon: var(--color-smoke-600);
163
+
164
+ --dialog-surface: var(--color-neutral-200);
165
+
166
+ --interface-menu-component-surface-hovered: var(--color-smoke-200);
167
+ --interface-menu-component-surface-selected: var(--color-smoke-400);
168
+ --interface-menu-keybind-surface-default: var(--color-smoke-500);
169
+ --interface-menu-surface: var(--color-white);
170
+ --interface-menu-stroke: var(--color-smoke-600);
171
+ --interface-panel-surface: var(--color-white);
172
+ --interface-stroke: var(--color-smoke-300);
173
+
174
+ --interface-builder-mode-background: var(--color-ocean-300);
175
+ --interface-builder-mode-button-background: var(--color-ocean-600);
176
+ --interface-builder-mode-button-foreground: var(--color-white);
177
+ --interface-builder-mode-footer-background: var(--color-ocean-900);
178
+
179
+ --nav-background: var(--color-white);
180
+
181
+ --node-border: var(--color-smoke-300);
182
+ --node-component-border: var(--color-smoke-400);
183
+ --node-component-disabled: var(--color-alpha-ash-500-20);
184
+ --node-component-executing: var(--color-blue-500);
185
+ --node-component-header: var(--fg-color);
186
+ --node-component-header-icon: var(--color-ash-800);
187
+ --node-component-header-surface: var(--color-smoke-200);
188
+ --node-component-outline: var(--color-black);
189
+ --node-component-ring: rgb(from var(--color-smoke-500) r g b / 50%);
190
+ --node-component-slot-dot-outline-opacity-mult: 1;
191
+ --node-component-slot-dot-outline-opacity: 5%;
192
+ --node-component-slot-dot-outline: var(--color-black);
193
+ --node-component-slot-text: var(--color-ash-800);
194
+ --node-component-surface-highlight: var(--color-smoke-800);
195
+ --node-component-surface-hovered: var(--color-smoke-200);
196
+ --node-component-surface-selected: var(--color-charcoal-200);
197
+ --node-component-surface: var(--color-white);
198
+ --node-component-tooltip: var(--color-charcoal-700);
199
+ --node-component-tooltip-border: var(--color-sand-100);
200
+ --node-component-tooltip-surface: var(--color-white);
201
+ --node-component-widget-input: var(--fg-color);
202
+ --node-component-widget-input-surface: rgb(
203
+ from var(--color-zinc-500) r g b / 10%
204
+ );
205
+ --node-component-widget-skeleton-surface: var(--color-zinc-300);
206
+ --node-divider: var(--color-sand-100);
207
+ --node-icon-disabled: var(--color-alpha-smoke-500-50);
208
+ --node-stroke: var(--color-smoke-400);
209
+ --node-stroke-selected: var(--color-accent-primary);
210
+ --node-stroke-error: var(--color-error);
211
+ --node-stroke-executing: var(--color-azure-600);
212
+
213
+ --text-secondary: var(--color-smoke-800);
214
+ --text-primary: var(--color-charcoal-700);
215
+ --input-surface: rgb(0 0 0 / 0.15);
216
+
217
+ /* Semantic tokens - light mode */
218
+ --muted-foreground: var(--color-charcoal-200);
219
+ --base-foreground: var(--color-charcoal-800);
220
+ --brand-yellow: var(--color-electric-400);
221
+ --brand-blue: var(--color-sapphire-700);
222
+ --secondary-background: var(--color-smoke-200);
223
+ --secondary-background-hover: var(--color-smoke-400);
224
+ --secondary-background-selected: var(--color-smoke-600);
225
+ --tertiary-background: var(--color-smoke-400);
226
+ --tertiary-background-hover: var(--color-smoke-500);
227
+ --base-background: var(--color-white);
228
+ --primary-background: var(--color-azure-400);
229
+ --primary-background-hover: var(--color-cobalt-800);
230
+ --destructive-background: var(--color-coral-500);
231
+ --destructive-background-hover: var(--color-coral-600);
232
+ --inverted-background-hover: var(--color-charcoal-600);
233
+ --warning-background: var(--color-gold-400);
234
+ --warning-background-hover: var(--color-gold-500);
235
+ --success-background: var(--color-jade-600);
236
+ --border-default: var(--color-smoke-600);
237
+ --border-subtle: var(--color-smoke-400);
238
+ --muted-background: var(--color-smoke-700);
239
+ --accent-background: var(--color-smoke-800);
240
+
241
+ /* Component/Node tokens from design system light */
242
+ --component-node-background: var(--color-white);
243
+ --component-node-border: var(--color-border-default);
244
+ --component-node-foreground: var(--base-foreground);
245
+ --component-node-foreground-secondary: var(--color-muted-foreground);
246
+ --component-node-widget-background: var(--secondary-background);
247
+ --component-node-widget-background-hovered: var(--secondary-background-hover);
248
+ --component-node-widget-background-selected: var(
249
+ --secondary-background-selected
250
+ );
251
+ --component-node-widget-background-disabled: var(--color-alpha-ash-500-20);
252
+ --component-node-widget-background-highlighted: var(--color-smoke-800);
253
+ --component-node-widget-promoted: var(--color-purple-700);
254
+ --component-node-widget-advanced: var(--color-azure-400);
255
+
256
+ --video-trim-selection-background: var(--color-datatype-CLIP, #ffd500);
257
+ --video-trim-playhead-background: #f0513b;
258
+
259
+ /* Default UI element color palette variables */
260
+ --palette-contrast-mix-color: #fff;
261
+ --palette-interface-panel-surface: var(--comfy-menu-bg);
262
+ --palette-interface-stroke: color-mix(
263
+ in srgb,
264
+ var(--interface-panel-surface) 75.5%,
265
+ var(--contrast-mix-color)
266
+ );
267
+
268
+ --palette-interface-panel-box-shadow: 1px 1px 8px 0 rgb(0 0 0 / 0.4);
269
+ --palette-interface-panel-drop-shadow: 1px 1px 4px rgb(0 0 0 / 0.4);
270
+ --palette-interface-panel-hover-surface: color-mix(
271
+ in srgb,
272
+ var(--interface-panel-surface) 92.5%,
273
+ var(--contrast-mix-color)
274
+ );
275
+ --palette-interface-panel-selected-surface: color-mix(
276
+ in srgb,
277
+ var(--interface-panel-surface) 87.5%,
278
+ var(--contrast-mix-color)
279
+ );
280
+ --palette-interface-button-hover-surface: color-mix(
281
+ in srgb,
282
+ var(--interface-panel-surface) 82%,
283
+ var(--contrast-mix-color)
284
+ );
285
+
286
+ --modal-card-background: var(--secondary-background);
287
+ --modal-card-background-hovered: var(--secondary-background-hover);
288
+ --modal-card-border-highlighted: var(--secondary-background-selected);
289
+ --modal-card-button-surface: var(--color-smoke-300);
290
+ --modal-card-placeholder-background: var(--color-smoke-600);
291
+ --modal-card-tag-background: var(--color-smoke-200);
292
+ --modal-card-tag-foreground: var(--base-foreground);
293
+ --modal-panel-background: var(--color-white);
294
+ }
295
+
296
+ .dark-theme {
297
+ --fg-color: #fff;
298
+ --bg-color: #202020;
299
+ --content-bg: #4e4e4e;
300
+ --content-fg: #fff;
301
+ --content-hover-bg: #222;
302
+ --content-hover-fg: #fff;
303
+
304
+ --accent-primary: var(--color-white);
305
+ --backdrop: var(--color-neutral-900);
306
+
307
+ --button-surface: var(--color-charcoal-600);
308
+ --button-surface-contrast: var(--color-white);
309
+ --button-hover-surface: var(--color-charcoal-600);
310
+ --button-active-surface: var(--color-charcoal-600);
311
+ --button-icon: var(--color-smoke-800);
312
+
313
+ --dialog-surface: var(--color-neutral-700);
314
+
315
+ --interface-menu-component-surface-hovered: var(--color-charcoal-400);
316
+ --interface-menu-component-surface-selected: var(--color-charcoal-300);
317
+ --interface-menu-keybind-surface-default: var(--color-charcoal-200);
318
+ --interface-menu-surface: var(--color-charcoal-800);
319
+ --interface-menu-stroke: var(--color-ash-800);
320
+ --interface-panel-surface: var(--color-charcoal-800);
321
+ --interface-stroke: var(--color-charcoal-400);
322
+
323
+ --interface-builder-mode-background: var(--color-ocean-900);
324
+ --interface-builder-mode-button-background: var(--color-ocean-600);
325
+ --interface-builder-mode-button-foreground: var(--color-white);
326
+ --interface-builder-mode-footer-background: var(--color-ocean-900);
327
+
328
+ --nav-background: var(--color-charcoal-800);
329
+
330
+ --node-border: var(--color-charcoal-500);
331
+ --node-component-border: var(--color-ash-800);
332
+ --node-component-border-error: var(--color-danger-100);
333
+ --node-component-border-executing: var(--color-blue-500);
334
+ --node-component-border-selected: var(--color-charcoal-200);
335
+ --node-component-header-icon: var(--color-smoke-800);
336
+ --node-component-header-surface: var(--color-charcoal-700);
337
+ --node-component-outline: var(--color-white);
338
+ --node-component-ring: rgb(var(--color-smoke-500) / 20%);
339
+ --node-component-slot-dot-outline-opacity: 10%;
340
+ --node-component-slot-dot-outline: var(--color-white);
341
+ --node-component-slot-text: var(--color-smoke-700);
342
+ --node-component-surface-highlight: var(--color-smoke-800);
343
+ --node-component-surface-hovered: var(--color-charcoal-600);
344
+ --node-component-surface-selected: var(--color-charcoal-200);
345
+ --node-component-surface: var(--color-charcoal-600);
346
+ --node-component-tooltip: var(--color-white);
347
+ --node-component-tooltip-border: var(--color-charcoal-200);
348
+ --node-component-tooltip-surface: var(--color-charcoal-800);
349
+ --node-component-widget-skeleton-surface: var(--color-zinc-800);
350
+ --node-component-disabled: var(--color-alpha-charcoal-600-30);
351
+ --node-divider: var(--color-charcoal-500);
352
+ --node-icon-disabled: var(--color-alpha-ash-500-20);
353
+ --node-stroke: var(--color-ash-800);
354
+ --node-stroke-selected: var(--color-white);
355
+ --node-stroke-error: var(--color-error);
356
+ --node-stroke-executing: var(--color-azure-600);
357
+
358
+ /* Queue progress (dark theme) */
359
+ --color-interface-panel-job-progress-primary: var(--color-cobalt-800);
360
+ --color-interface-panel-job-progress-secondary: var(
361
+ --color-alpha-azure-600-30
362
+ );
363
+ --color-interface-panel-job-progress-border: var(--base-foreground);
364
+
365
+ --text-secondary: var(--color-smoke-700);
366
+ --text-primary: var(--color-white);
367
+
368
+ --input-surface: rgb(130 130 130 / 0.1);
369
+
370
+ /* Semantic tokens - dark mode */
371
+ --muted-foreground: var(--color-smoke-800);
372
+ --base-foreground: var(--color-white);
373
+ --brand-yellow: var(--color-electric-400);
374
+ --brand-blue: var(--color-sapphire-700);
375
+ --secondary-background: var(--color-charcoal-600);
376
+ --secondary-background-hover: var(--color-charcoal-400);
377
+ --secondary-background-selected: var(--color-charcoal-200);
378
+ --tertiary-background: var(--color-charcoal-400);
379
+ --tertiary-background-hover: var(--color-charcoal-300);
380
+ --base-background: var(--color-charcoal-800);
381
+ --primary-background: var(--color-azure-600);
382
+ --primary-background-hover: var(--color-azure-400);
383
+ --destructive-background: var(--color-coral-700);
384
+ --destructive-background-hover: var(--color-coral-600);
385
+ --inverted-background-hover: var(--color-smoke-200);
386
+ --warning-background: var(--color-gold-600);
387
+ --warning-background-hover: var(--color-gold-500);
388
+ --success-background: var(--color-jade-600);
389
+ --border-default: var(--color-charcoal-200);
390
+ --border-subtle: var(--color-charcoal-300);
391
+ --muted-background: var(--color-charcoal-100);
392
+ --accent-background: var(--color-charcoal-100);
393
+
394
+ /* Component/Node tokens from design dark system */
395
+ --component-node-background: var(--color-charcoal-600);
396
+ --component-node-border: var(--color-charcoal-100);
397
+ --component-node-foreground: var(--base-foreground);
398
+ --component-node-foreground-secondary: var(--color-muted-foreground);
399
+ --component-node-widget-background: var(--secondary-background-hover);
400
+ --component-node-widget-background-hovered: var(
401
+ --secondary-background-selected
402
+ );
403
+ --component-node-widget-background-selected: var(--color-charcoal-100);
404
+ --component-node-widget-background-disabled: var(--color-charcoal-800);
405
+ --component-node-widget-background-highlighted: var(--color-smoke-800);
406
+ --component-node-widget-promoted: var(--color-purple-700);
407
+ --component-node-widget-advanced: var(--color-azure-600);
408
+
409
+ --modal-card-background: var(--secondary-background);
410
+ --modal-card-background-hovered: var(--secondary-background-hover);
411
+ --modal-card-border-highlighted: var(--color-ash-400);
412
+ --modal-card-button-surface: var(--color-charcoal-300);
413
+ --modal-card-placeholder-background: var(--secondary-background);
414
+ --modal-card-tag-background: var(--color-ash-800);
415
+ --modal-card-tag-foreground: var(--base-foreground);
416
+ --modal-panel-background: var(--color-charcoal-600);
417
+ }
418
+
419
+ @theme inline {
420
+ --color-backdrop: var(--backdrop);
421
+ --color-button-active-surface: var(--button-active-surface);
422
+ --color-button-hover-surface: var(--button-hover-surface);
423
+ --color-button-icon: var(--button-icon);
424
+ --color-button-surface: var(--button-surface);
425
+ --color-button-surface-contrast: var(--button-surface-contrast);
426
+
427
+ --color-modal-card-background: var(--modal-card-background);
428
+ --color-modal-card-background-hovered: var(--modal-card-background-hovered);
429
+ --color-modal-card-border-highlighted: var(--modal-card-border-highlighted);
430
+ --color-modal-card-button-surface: var(--modal-card-button-surface);
431
+ --color-modal-card-placeholder-background: var(
432
+ --modal-card-placeholder-background
433
+ );
434
+ --color-modal-card-tag-background: var(--modal-card-tag-background);
435
+ --color-modal-card-tag-foreground: var(--modal-card-tag-foreground);
436
+ --color-modal-panel-background: var(--modal-panel-background);
437
+
438
+ --color-dialog-surface: var(--dialog-surface);
439
+ --color-interface-menu-component-surface-hovered: var(
440
+ --interface-menu-component-surface-hovered
441
+ );
442
+ --color-interface-menu-component-surface-selected: var(
443
+ --interface-menu-component-surface-selected
444
+ );
445
+ --color-interface-menu-keybind-surface-default: var(
446
+ --interface-menu-keybind-surface-default
447
+ );
448
+ --color-interface-menu-surface: var(--interface-menu-surface);
449
+ --color-interface-menu-stroke: var(--interface-menu-stroke);
450
+ --color-interface-panel-surface: var(--interface-panel-surface);
451
+ --color-interface-panel-hover-surface: var(--interface-panel-hover-surface);
452
+ --color-interface-panel-selected-surface: var(
453
+ --interface-panel-selected-surface
454
+ );
455
+ --color-interface-button-hover-surface: var(--interface-button-hover-surface);
456
+ --color-comfy-input: var(--comfy-input-bg);
457
+ --color-comfy-input-foreground: var(--input-text);
458
+ --color-comfy-menu-bg: var(--comfy-menu-bg);
459
+ --color-comfy-menu-secondary: var(--comfy-menu-secondary-bg);
460
+
461
+ --color-interface-builder-mode-background: var(
462
+ --interface-builder-mode-background
463
+ );
464
+ --color-interface-builder-mode-button-background: var(
465
+ --interface-builder-mode-button-background
466
+ );
467
+ --color-interface-builder-mode-button-foreground: var(
468
+ --interface-builder-mode-button-foreground
469
+ );
470
+ --color-interface-builder-mode-footer-background: var(
471
+ --interface-builder-mode-footer-background
472
+ );
473
+ --color-interface-stroke: var(--interface-stroke);
474
+ --color-nav-background: var(--nav-background);
475
+ --color-node-border: var(--node-border);
476
+ --color-node-component-border: var(--node-component-border);
477
+ --color-node-component-executing: var(--node-component-executing);
478
+ --color-node-component-header: var(--node-component-header);
479
+ --color-node-component-header-icon: var(--node-component-header-icon);
480
+ --color-node-component-header-surface: var(--node-component-header-surface);
481
+ --color-node-component-outline: var(--node-component-outline);
482
+ --color-node-component-ring: var(--node-component-ring);
483
+ --color-node-component-slot-dot-outline: rgb(
484
+ from var(--node-component-slot-dot-outline) r g b /
485
+ calc(
486
+ var(--node-component-slot-dot-outline-opacity) *
487
+ var(--node-component-slot-dot-outline-opacity-mult)
488
+ )
489
+ );
490
+ --color-node-component-slot-text: var(--node-component-slot-text);
491
+ --color-node-component-surface-highlight: var(
492
+ --node-component-surface-highlight
493
+ );
494
+ --color-node-component-surface-hovered: var(--node-component-surface-hovered);
495
+ --color-node-component-surface-selected: var(--component-surface-selected);
496
+ --color-node-component-surface: var(--node-component-surface);
497
+ --color-node-component-tooltip: var(--node-component-tooltip);
498
+ --color-node-component-tooltip-border: var(--node-component-tooltip-border);
499
+ --color-node-component-tooltip-surface: var(--node-component-tooltip-surface);
500
+ --color-node-component-widget-input: var(--node-component-widget-input);
501
+ --color-node-component-widget-input-surface: var(
502
+ --node-component-widget-input-surface
503
+ );
504
+ --color-node-component-widget-skeleton-surface: var(
505
+ --node-component-widget-skeleton-surface
506
+ );
507
+ --color-node-component-disabled: var(--node-component-disabled);
508
+ --color-node-divider: var(--node-divider);
509
+ --color-node-icon-disabled: var(--node-icon-disabled);
510
+ --color-node-stroke: var(--node-stroke);
511
+ --color-node-stroke-selected: var(--node-stroke-selected);
512
+ --color-node-stroke-error: var(--node-stroke-error);
513
+ --color-node-stroke-executing: var(--node-stroke-executing);
514
+ --color-text-secondary: var(--text-secondary);
515
+ --color-text-primary: var(--text-primary);
516
+ --color-input-surface: var(--input-surface);
517
+
518
+ /* Component/Node design tokens */
519
+ --color-component-node-background: var(--component-node-background);
520
+ --color-component-node-border: var(--component-node-border);
521
+ --color-component-node-foreground: var(--component-node-foreground);
522
+ --color-component-node-foreground-secondary: var(
523
+ --component-node-foreground-secondary
524
+ );
525
+ --color-component-node-widget-background: var(
526
+ --component-node-widget-background
527
+ );
528
+ --color-component-node-widget-background-hovered: var(
529
+ --component-node-widget-background-hovered
530
+ );
531
+ --color-component-node-widget-background-selected: var(
532
+ --component-node-widget-background-selected
533
+ );
534
+ --color-component-node-widget-background-disabled: var(
535
+ --component-node-widget-background-disabled
536
+ );
537
+ --color-component-node-widget-background-highlighted: var(
538
+ --component-node-widget-background-highlighted
539
+ );
540
+ --color-component-node-widget-promoted: var(--component-node-widget-promoted);
541
+ --color-component-node-widget-advanced: var(--component-node-widget-advanced);
542
+ --color-video-trim-selection-background: var(
543
+ --video-trim-selection-background
544
+ );
545
+ --color-video-trim-playhead-background: var(--video-trim-playhead-background);
546
+
547
+ /* Semantic tokens */
548
+ --color-base-foreground: var(--base-foreground);
549
+ --color-muted-foreground: var(--muted-foreground);
550
+ --color-base-background: var(--base-background);
551
+ --color-secondary-background: var(--secondary-background);
552
+ --color-secondary-background-hover: var(--secondary-background-hover);
553
+ --color-secondary-background-selected: var(--secondary-background-selected);
554
+ --color-tertiary-background: var(--tertiary-background);
555
+ --color-tertiary-background-hover: var(--tertiary-background-hover);
556
+ --color-primary-background: var(--primary-background);
557
+ --color-primary-background-hover: var(--primary-background-hover);
558
+ --color-destructive-background: var(--destructive-background);
559
+ --color-destructive-background-hover: var(--destructive-background-hover);
560
+ --color-inverted-background-hover: var(--inverted-background-hover);
561
+ --color-warning-background: var(--warning-background);
562
+ --color-warning-background-hover: var(--warning-background-hover);
563
+ --color-success-background: var(--success-background);
564
+ --color-border-default: var(--border-default);
565
+ --color-border-subtle: var(--border-subtle);
566
+ --color-muted-background: var(--muted-background);
567
+ --color-accent-background: var(--accent-background);
568
+ --color-brand-yellow: var(--brand-yellow);
569
+ --color-brand-blue: var(--brand-blue);
570
+ }
571
+
572
+ @custom-variant dark-theme {
573
+ .dark-theme & {
574
+ @slot;
575
+ }
576
+ }
577
+
578
+ @utility highlight {
579
+ background-color: color-mix(in srgb, currentColor 20%, transparent);
580
+ font-weight: 700;
581
+ border-radius: 0.25rem;
582
+ }
583
+
584
+ @utility scrollbar-hide {
585
+ scrollbar-width: none;
586
+ &::-webkit-scrollbar {
587
+ width: 1px;
588
+ }
589
+ &::-webkit-scrollbar-thumb {
590
+ background-color: transparent;
591
+ }
592
+ }
593
+
594
+ /* ===================== Scrollbar Utilities (Tailwind) =====================
595
+ Usage: Add `scrollbar-custom` class to scrollable containers.
596
+ The scrollbar styling adapts to light/dark theme automatically.
597
+ ============================================================================ */
598
+
599
+ @utility scrollbar-custom {
600
+ overflow-y: auto;
601
+ /* Firefox */
602
+ scrollbar-width: thin;
603
+ scrollbar-color: var(--dialog-surface) transparent;
604
+
605
+ /* WebKit */
606
+ &::-webkit-scrollbar {
607
+ width: 10px;
608
+ height: 10px;
609
+ background-color: transparent;
610
+ }
611
+ &::-webkit-scrollbar-track {
612
+ background: transparent;
613
+ }
614
+ &::-webkit-scrollbar-thumb {
615
+ background: var(--dialog-surface);
616
+ border-radius: 9999px;
617
+ border: 2px solid transparent;
618
+ }
619
+ &::-webkit-scrollbar-thumb:hover {
620
+ background: var(--dialog-surface);
621
+ }
622
+ &::-webkit-scrollbar-corner {
623
+ background: transparent;
624
+ }
625
+ }
626
+ /* =================== End Custom Scrollbar (cross-browser) =================== */
627
+
628
+ /* Everthing below here to be cleaned up over time. */
629
+
630
+ body {
631
+ width: 100vw;
632
+ height: 100vh;
633
+ margin: 0;
634
+ overflow: hidden;
635
+ min-height: -webkit-fill-available;
636
+ max-height: -webkit-fill-available;
637
+ min-width: -webkit-fill-available;
638
+ max-width: -webkit-fill-available;
639
+ font-family: Inter, Arial, sans-serif;
640
+ }
641
+
642
+ .comfy-multiline-input {
643
+ background-color: var(--comfy-input-bg);
644
+ color: var(--input-text);
645
+ overflow: hidden;
646
+ overflow-y: auto;
647
+ padding: 2px;
648
+ resize: none;
649
+ border: none;
650
+ box-sizing: border-box;
651
+ font-size: var(--comfy-textarea-font-size);
652
+ }
653
+
654
+ .comfy-markdown {
655
+ /* We assign the textarea and the Tiptap editor to the same CSS grid area to stack them on top of one another. */
656
+ display: grid;
657
+ & > textarea,
658
+ .tiptap {
659
+ grid-area: 1 / 1 / 2 / 2;
660
+ }
661
+
662
+ & > textarea {
663
+ opacity: 0;
664
+ pointer-events: none;
665
+ }
666
+
667
+ &.editing {
668
+ & > textarea {
669
+ opacity: 1;
670
+ pointer-events: all;
671
+ }
672
+
673
+ .tiptap {
674
+ opacity: 0;
675
+ pointer-events: none;
676
+ }
677
+ }
678
+
679
+ .tiptap {
680
+ overflow-y: auto;
681
+ font-size: var(--comfy-textarea-font-size);
682
+
683
+ :first-child {
684
+ margin-top: 0;
685
+ }
686
+
687
+ :last-child {
688
+ margin-bottom: 0;
689
+ }
690
+ }
691
+ }
692
+
693
+ .comfy-markdown .tiptap blockquote {
694
+ border-left: medium solid;
695
+ margin-left: 1em;
696
+ padding-left: 0.5em;
697
+ }
698
+
699
+ .comfy-markdown .tiptap pre {
700
+ border: thin dotted;
701
+ border-radius: 0.5em;
702
+ margin: 0.5em;
703
+ padding: 0.5em;
704
+ }
705
+
706
+ .comfy-markdown .tiptap table {
707
+ border-collapse: collapse;
708
+ }
709
+
710
+ .comfy-markdown .tiptap th {
711
+ text-align: left;
712
+ background: var(--comfy-menu-bg);
713
+ }
714
+
715
+ .comfy-markdown .tiptap th,
716
+ .comfy-markdown .tiptap td {
717
+ padding: 0.5em;
718
+ border: thin solid;
719
+ }
720
+
721
+ /* Shared markdown content styling for consistent rendering across components */
722
+ .comfy-markdown-content {
723
+ /* Typography */
724
+ font-size: var(--comfy-textarea-font-size);
725
+ line-height: 1.6;
726
+ word-wrap: break-word;
727
+ }
728
+
729
+ /* Headings */
730
+ .comfy-markdown-content h1 {
731
+ font-size: calc(22 / 14 * var(--comfy-textarea-font-size));
732
+ font-weight: 700; /* font-bold */
733
+ margin-top: 2rem; /* mt-8 */
734
+ margin-bottom: 1rem; /* mb-4 */
735
+ }
736
+
737
+ .comfy-markdown-content h1:first-child {
738
+ margin-top: 0; /* first:mt-0 */
739
+ }
740
+
741
+ .comfy-markdown-content h2 {
742
+ font-size: calc(18 / 14 * var(--comfy-textarea-font-size));
743
+ font-weight: 700; /* font-bold */
744
+ margin-top: 2rem; /* mt-8 */
745
+ margin-bottom: 1rem; /* mb-4 */
746
+ }
747
+
748
+ .comfy-markdown-content h2:first-child {
749
+ margin-top: 0; /* first:mt-0 */
750
+ }
751
+
752
+ .comfy-markdown-content h3 {
753
+ font-size: calc(16 / 14 * var(--comfy-textarea-font-size));
754
+ font-weight: 700; /* font-bold */
755
+ margin-top: 2rem; /* mt-8 */
756
+ margin-bottom: 1rem; /* mb-4 */
757
+ }
758
+
759
+ .comfy-markdown-content h3:first-child {
760
+ margin-top: 0; /* first:mt-0 */
761
+ }
762
+
763
+ .comfy-markdown-content h4,
764
+ .comfy-markdown-content h5,
765
+ .comfy-markdown-content h6 {
766
+ margin-top: 2rem; /* mt-8 */
767
+ margin-bottom: 1rem; /* mb-4 */
768
+ }
769
+
770
+ .comfy-markdown-content h4:first-child,
771
+ .comfy-markdown-content h5:first-child,
772
+ .comfy-markdown-content h6:first-child {
773
+ margin-top: 0; /* first:mt-0 */
774
+ }
775
+
776
+ /* Paragraphs */
777
+ .comfy-markdown-content p {
778
+ margin: 0 0 0.5em;
779
+ }
780
+
781
+ .comfy-markdown-content p:last-child {
782
+ margin-bottom: 0;
783
+ }
784
+
785
+ /* First child reset */
786
+ .comfy-markdown-content *:first-child {
787
+ margin-top: 0; /* mt-0 */
788
+ }
789
+
790
+ /* Lists */
791
+ .comfy-markdown-content ul,
792
+ .comfy-markdown-content ol {
793
+ padding-left: 2rem; /* pl-8 */
794
+ margin: 0.5rem 0; /* my-2 */
795
+ }
796
+
797
+ /* Nested lists */
798
+ .comfy-markdown-content ul ul,
799
+ .comfy-markdown-content ol ol,
800
+ .comfy-markdown-content ul ol,
801
+ .comfy-markdown-content ol ul {
802
+ padding-left: 1.5rem; /* pl-6 */
803
+ margin: 0.5rem 0; /* my-2 */
804
+ }
805
+
806
+ .comfy-markdown-content li {
807
+ margin: 0.5rem 0; /* my-2 */
808
+ }
809
+
810
+ /* Code */
811
+ .comfy-markdown-content code {
812
+ color: var(--code-text-color);
813
+ background-color: var(--code-bg-color);
814
+ border-radius: 0.25rem; /* rounded */
815
+ padding: 0.125rem 0.375rem; /* px-1.5 py-0.5 */
816
+ font-family: monospace;
817
+ }
818
+
819
+ .comfy-markdown-content pre {
820
+ background-color: var(--code-block-bg-color);
821
+ border-radius: 0.25rem; /* rounded */
822
+ padding: 1rem; /* p-4 */
823
+ margin: 1rem 0; /* my-4 */
824
+ overflow-x: auto; /* overflow-x-auto */
825
+ }
826
+
827
+ .comfy-markdown-content pre code {
828
+ background-color: transparent; /* bg-transparent */
829
+ padding: 0; /* p-0 */
830
+ color: var(--p-text-color);
831
+ }
832
+
833
+ /* Tables */
834
+ .comfy-markdown-content table {
835
+ width: 100%; /* w-full */
836
+ border-collapse: collapse; /* border-collapse */
837
+ }
838
+
839
+ .comfy-markdown-content th,
840
+ .comfy-markdown-content td {
841
+ padding: 0.5rem; /* px-2 py-2 */
842
+ }
843
+
844
+ .comfy-markdown-content th {
845
+ color: var(--fg-color);
846
+ }
847
+
848
+ .comfy-markdown-content td {
849
+ color: var(--drag-text);
850
+ }
851
+
852
+ .comfy-markdown-content tr {
853
+ border-bottom: 1px solid var(--content-bg);
854
+ }
855
+
856
+ .comfy-markdown-content tr:last-child {
857
+ border-bottom: none;
858
+ }
859
+
860
+ .comfy-markdown-content thead {
861
+ border-bottom: 1px solid var(--p-text-color);
862
+ }
863
+
864
+ /* Links */
865
+ .comfy-markdown-content a {
866
+ color: var(--drag-text);
867
+ text-decoration: underline;
868
+ }
869
+
870
+ /* Media */
871
+ .comfy-markdown-content img,
872
+ .comfy-markdown-content video {
873
+ max-width: 100%; /* max-w-full */
874
+ height: auto; /* h-auto */
875
+ display: block; /* block */
876
+ margin-bottom: 1rem; /* mb-4 */
877
+ }
878
+
879
+ /* Blockquotes */
880
+ .comfy-markdown-content blockquote {
881
+ border-left: 3px solid var(--p-primary-color, var(--primary-bg));
882
+ padding-left: 0.75em;
883
+ margin: 0.5em 0;
884
+ opacity: 0.8;
885
+ }
886
+
887
+ /* Horizontal rule */
888
+ .comfy-markdown-content hr {
889
+ border: none;
890
+ border-top: 1px solid var(--p-border-color, var(--border-color));
891
+ margin: 1em 0;
892
+ }
893
+
894
+ /* Strong and emphasis */
895
+ .comfy-markdown-content strong {
896
+ font-weight: 700;
897
+ }
898
+
899
+ .comfy-markdown-content em {
900
+ font-style: italic;
901
+ }
902
+
903
+ .comfy-modal {
904
+ display: none; /* Hidden by default */
905
+ position: fixed; /* Stay in place */
906
+ z-index: 100; /* Sit on top */
907
+ padding: 30px 30px 10px;
908
+ background-color: var(--comfy-menu-bg); /* Modal background */
909
+ color: var(--error-text);
910
+ box-shadow: 0 0 20px #888888;
911
+ border-radius: 10px;
912
+ top: 50%;
913
+ left: 50%;
914
+ max-width: 80vw;
915
+ max-height: 80vh;
916
+ transform: translate(-50%, -50%);
917
+ overflow: hidden;
918
+ justify-content: center;
919
+ font-family: monospace;
920
+ font-size: 15px;
921
+ }
922
+
923
+ .comfy-modal-content {
924
+ display: flex;
925
+ flex-direction: column;
926
+ }
927
+
928
+ .comfy-modal p {
929
+ overflow: auto;
930
+ white-space: pre-line; /* This will respect line breaks */
931
+ margin-bottom: 20px; /* Add some margin between the text and the close button*/
932
+ }
933
+
934
+ .comfy-modal select,
935
+ .comfy-modal input[type='button'],
936
+ .comfy-modal input[type='checkbox'] {
937
+ margin: 3px 3px 3px 4px;
938
+ }
939
+
940
+ .comfy-menu {
941
+ font-size: 15px;
942
+ position: absolute;
943
+ top: 50%;
944
+ right: 0;
945
+ text-align: center;
946
+ z-index: 999;
947
+ width: 190px;
948
+ display: flex;
949
+ flex-direction: column;
950
+ align-items: center;
951
+ color: var(--descrip-text);
952
+ background-color: var(--comfy-menu-bg);
953
+ padding: 10px;
954
+ border-radius: 0 8px 8px;
955
+ box-shadow: 3px 3px 8px rgb(0 0 0 / 0.4);
956
+ }
957
+
958
+ .comfy-menu-header {
959
+ display: flex;
960
+ }
961
+
962
+ .comfy-menu-actions {
963
+ display: flex;
964
+ gap: 3px;
965
+ align-items: center;
966
+ height: 20px;
967
+ position: relative;
968
+ top: -1px;
969
+ font-size: 22px;
970
+ }
971
+
972
+ .comfy-menu .comfy-menu-actions button {
973
+ background-color: rgb(0 0 0 / 0);
974
+ padding: 0;
975
+ border: none;
976
+ cursor: pointer;
977
+ font-size: inherit;
978
+ }
979
+
980
+ .comfy-menu .comfy-menu-actions .comfy-settings-btn {
981
+ font-size: 0.6em;
982
+ }
983
+
984
+ button.comfy-close-menu-btn {
985
+ font-size: 1em;
986
+ line-height: 12px;
987
+ color: #ccc;
988
+ position: relative;
989
+ top: -1px;
990
+ }
991
+
992
+ .comfy-menu-queue-size {
993
+ flex: auto;
994
+ }
995
+
996
+ .comfy-menu button,
997
+ .comfy-modal button {
998
+ font-size: 20px;
999
+ }
1000
+
1001
+ .comfy-menu-btns {
1002
+ margin-bottom: 10px;
1003
+ width: 100%;
1004
+ }
1005
+
1006
+ .comfy-menu-btns button {
1007
+ font-size: 10px;
1008
+ width: 50%;
1009
+ color: var(--descrip-text) !important;
1010
+ }
1011
+
1012
+ .comfy-menu > button {
1013
+ width: 100%;
1014
+ }
1015
+
1016
+ .comfy-btn,
1017
+ .comfy-menu > button,
1018
+ .comfy-menu-btns button,
1019
+ .comfy-menu .comfy-list button,
1020
+ .comfy-modal button {
1021
+ color: var(--input-text);
1022
+ background-color: var(--comfy-input-bg);
1023
+ border-width: initial;
1024
+ border-radius: 8px;
1025
+ border-color: var(--border-color);
1026
+ border-style: solid;
1027
+ margin-top: 2px;
1028
+ }
1029
+
1030
+ .comfy-btn:hover:not(:disabled),
1031
+ .comfy-menu > button:hover,
1032
+ .comfy-menu-btns button:hover,
1033
+ .comfy-menu .comfy-list button:hover,
1034
+ .comfy-modal button:hover,
1035
+ .comfy-menu-actions button:hover {
1036
+ filter: brightness(1.2);
1037
+ will-change: transform;
1038
+ cursor: pointer;
1039
+ }
1040
+
1041
+ span.drag-handle {
1042
+ display: inline-block;
1043
+ overflow: hidden;
1044
+ line-height: 5px;
1045
+ padding: 3px 4px;
1046
+ vertical-align: middle;
1047
+ margin-top: -0.4em;
1048
+ margin-left: -0.2em;
1049
+ font-size: 12px;
1050
+ letter-spacing: 2px;
1051
+ color: var(--drag-text);
1052
+ text-shadow: 1px 0 1px black;
1053
+ touch-action: none;
1054
+ }
1055
+
1056
+ span.drag-handle::after {
1057
+ content: '.. .. ..';
1058
+ }
1059
+
1060
+ .comfy-queue-btn {
1061
+ width: 100%;
1062
+ }
1063
+
1064
+ .comfy-list {
1065
+ color: var(--descrip-text);
1066
+ background-color: var(--comfy-menu-bg);
1067
+ margin-bottom: 10px;
1068
+ border-color: var(--border-color);
1069
+ border-style: solid;
1070
+ }
1071
+
1072
+ .comfy-list-items {
1073
+ overflow-y: scroll;
1074
+ max-height: 100px;
1075
+ min-height: 25px;
1076
+ background-color: var(--comfy-input-bg);
1077
+ padding: 5px;
1078
+ }
1079
+
1080
+ .comfy-list h4 {
1081
+ min-width: 160px;
1082
+ margin: 0;
1083
+ padding: 3px;
1084
+ font-weight: 400;
1085
+ }
1086
+
1087
+ .comfy-list-items button {
1088
+ font-size: 10px;
1089
+ }
1090
+
1091
+ .comfy-list-actions {
1092
+ margin: 5px;
1093
+ display: flex;
1094
+ gap: 5px;
1095
+ justify-content: center;
1096
+ }
1097
+
1098
+ .comfy-list-actions button {
1099
+ font-size: 12px;
1100
+ }
1101
+
1102
+ button.comfy-queue-btn {
1103
+ margin: 6px 0 !important;
1104
+ }
1105
+
1106
+ .comfy-modal.comfy-settings,
1107
+ .comfy-modal.comfy-manage-templates {
1108
+ text-align: center;
1109
+ color: var(--descrip-text);
1110
+ z-index: 99;
1111
+ }
1112
+
1113
+ .comfy-modal.comfy-settings input[type='range'] {
1114
+ vertical-align: middle;
1115
+ }
1116
+
1117
+ .comfy-modal.comfy-settings input[type='range'] + input[type='number'] {
1118
+ width: 3.5em;
1119
+ }
1120
+
1121
+ .comfy-modal input,
1122
+ .comfy-modal select {
1123
+ color: var(--input-text);
1124
+ background-color: var(--comfy-input-bg);
1125
+ border-radius: 8px;
1126
+ border-color: var(--border-color);
1127
+ border-style: solid;
1128
+ font-size: inherit;
1129
+ }
1130
+
1131
+ .comfy-tooltip-indicator {
1132
+ text-decoration: underline;
1133
+ text-decoration-style: dashed;
1134
+ }
1135
+
1136
+ @media only screen and (max-height: 850px) {
1137
+ .comfy-menu {
1138
+ top: 0 !important;
1139
+ bottom: 0 !important;
1140
+ left: auto !important;
1141
+ right: 0 !important;
1142
+ border-radius: 0;
1143
+ }
1144
+
1145
+ .comfy-menu span.drag-handle {
1146
+ display: none;
1147
+ }
1148
+
1149
+ .comfy-menu-queue-size {
1150
+ flex: unset;
1151
+ }
1152
+
1153
+ .comfy-menu-header {
1154
+ justify-content: space-between;
1155
+ }
1156
+ .comfy-menu-actions {
1157
+ gap: 10px;
1158
+ font-size: 28px;
1159
+ }
1160
+ }
1161
+
1162
+ /* Input popup */
1163
+
1164
+ .graphdialog {
1165
+ min-height: 1em;
1166
+ background-color: var(--comfy-menu-bg);
1167
+ z-index: 1500;
1168
+ }
1169
+
1170
+ .graphdialog .name {
1171
+ font-size: 14px;
1172
+ color: var(--descrip-text);
1173
+ }
1174
+
1175
+ .graphdialog button {
1176
+ margin-top: unset;
1177
+ vertical-align: unset;
1178
+ height: 1.6em;
1179
+ padding-right: 8px;
1180
+ }
1181
+
1182
+ .graphdialog input,
1183
+ .graphdialog textarea,
1184
+ .graphdialog select {
1185
+ background-color: var(--comfy-input-bg);
1186
+ border: 2px solid;
1187
+ border-color: var(--border-color);
1188
+ color: var(--input-text);
1189
+ border-radius: 12px 0 0 12px;
1190
+ }
1191
+
1192
+ /* Dialogs */
1193
+
1194
+ dialog {
1195
+ box-shadow: 0 0 20px #888888;
1196
+ }
1197
+
1198
+ dialog::backdrop {
1199
+ background: rgb(0 0 0 / 0.5);
1200
+ }
1201
+
1202
+ .comfy-dialog.comfyui-dialog.comfy-modal {
1203
+ top: 0;
1204
+ left: 0;
1205
+ right: 0;
1206
+ bottom: 0;
1207
+ transform: none;
1208
+ }
1209
+
1210
+ .comfy-dialog.comfy-modal {
1211
+ border-color: var(--bg-color);
1212
+ box-shadow: none;
1213
+ border: 2px solid var(--border-color);
1214
+ }
1215
+
1216
+ .comfy-dialog .comfy-modal-content {
1217
+ flex-direction: row;
1218
+ flex-wrap: wrap;
1219
+ gap: 10px;
1220
+ color: var(--fg-color);
1221
+ }
1222
+
1223
+ .comfy-dialog .comfy-modal-content h3 {
1224
+ margin-top: 0;
1225
+ }
1226
+
1227
+ .comfy-dialog .comfy-modal-content > p {
1228
+ width: 100%;
1229
+ }
1230
+
1231
+ .comfy-dialog .comfy-modal-content > .comfyui-button {
1232
+ flex: 1;
1233
+ justify-content: center;
1234
+ }
1235
+
1236
+ /* Context menu */
1237
+
1238
+ .litegraph .dialog {
1239
+ z-index: 1;
1240
+ }
1241
+
1242
+ .litegraph .litemenu-entry.has_submenu {
1243
+ position: relative;
1244
+ padding-right: 20px;
1245
+ }
1246
+
1247
+ .litemenu-entry.has_submenu::after {
1248
+ content: '>';
1249
+ position: absolute;
1250
+ top: 0;
1251
+ right: 2px;
1252
+ }
1253
+
1254
+ .litegraph.litecontextmenu,
1255
+ .litegraph.litecontextmenu.dark {
1256
+ z-index: 9999 !important;
1257
+ background-color: var(--comfy-menu-bg);
1258
+ }
1259
+
1260
+ .litegraph.litecontextmenu .litemenu-entry.submenu,
1261
+ .litegraph.litecontextmenu.dark .litemenu-entry.submenu {
1262
+ background-color: var(--comfy-menu-bg);
1263
+ color: var(--fg-color);
1264
+ }
1265
+
1266
+ .litegraph.litecontextmenu input {
1267
+ background-color: var(--comfy-input-bg);
1268
+ color: var(--input-text);
1269
+ }
1270
+
1271
+ .comfy-context-menu-filter {
1272
+ box-sizing: border-box;
1273
+ border: 1px solid #999;
1274
+ margin: 0 0 5px 5px;
1275
+ width: calc(100% - 10px);
1276
+ }
1277
+
1278
+ .comfy-img-preview {
1279
+ pointer-events: none;
1280
+ overflow: hidden;
1281
+ display: flex;
1282
+ flex-wrap: wrap;
1283
+ align-content: flex-start;
1284
+ justify-content: center;
1285
+ }
1286
+
1287
+ .comfy-img-preview img {
1288
+ object-fit: contain;
1289
+ width: var(--comfy-img-preview-width);
1290
+ height: var(--comfy-img-preview-height);
1291
+ }
1292
+
1293
+ .comfy-img-preview video {
1294
+ pointer-events: auto;
1295
+ object-fit: contain;
1296
+ height: 100%;
1297
+ width: 100%;
1298
+ }
1299
+
1300
+ .comfy-missing-nodes li button {
1301
+ font-size: 12px;
1302
+ margin-left: 5px;
1303
+ }
1304
+
1305
+ /* Search box */
1306
+
1307
+ .litegraph.litesearchbox {
1308
+ z-index: 9999 !important;
1309
+ background-color: var(--comfy-menu-bg);
1310
+ overflow: hidden;
1311
+ display: block;
1312
+ }
1313
+
1314
+ .litegraph.litesearchbox input,
1315
+ .litegraph.litesearchbox select {
1316
+ background-color: var(--comfy-input-bg);
1317
+ color: var(--input-text);
1318
+ }
1319
+
1320
+ .litegraph.lite-search-item {
1321
+ color: var(--input-text);
1322
+ background-color: var(--comfy-input-bg);
1323
+ filter: brightness(80%);
1324
+ will-change: transform;
1325
+ padding-left: 0.2em;
1326
+ }
1327
+
1328
+ .litegraph.lite-search-item.generic_type {
1329
+ color: var(--input-text);
1330
+ filter: brightness(50%);
1331
+ will-change: transform;
1332
+ }
1333
+
1334
+ audio.comfy-audio.empty-audio-widget {
1335
+ display: none;
1336
+ }
1337
+
1338
+ #vue-app {
1339
+ position: absolute;
1340
+ top: 0;
1341
+ left: 0;
1342
+ width: 100%;
1343
+ height: 100%;
1344
+ }
1345
+
1346
+ /* Set auto complete panel's width as it is not accessible within vue-root */
1347
+ .p-autocomplete-overlay {
1348
+ max-width: 25vw;
1349
+ }
1350
+
1351
+ .p-tree-node-content {
1352
+ padding: var(--comfy-tree-explorer-item-padding) !important;
1353
+ }
1354
+
1355
+ /* [Desktop] Electron window specific styles */
1356
+ .app-drag {
1357
+ app-region: drag;
1358
+ }
1359
+
1360
+ .no-drag {
1361
+ app-region: no-drag;
1362
+ }
1363
+
1364
+ .window-actions-spacer {
1365
+ width: calc(100vw - env(titlebar-area-width, 100vw));
1366
+ }
1367
+ /* End of [Desktop] Electron window specific styles */
1368
+
1369
+ .lg-node {
1370
+ /* Disable text selection on all nodes */
1371
+ user-select: none;
1372
+ }
1373
+
1374
+ .lg-node .lg-slot,
1375
+ .lg-node .lg-widget {
1376
+ transition:
1377
+ opacity 0.1s ease,
1378
+ font-size 0.1s ease;
1379
+ }
1380
+
1381
+ /* ===================== Mask Editor Styles ===================== */
1382
+ /* To be migrated to Tailwind later */
1383
+ #maskEditor_brush {
1384
+ position: absolute;
1385
+ backgroundcolor: transparent;
1386
+ z-index: 8889;
1387
+ pointer-events: none;
1388
+ border-radius: 50%;
1389
+ overflow: visible;
1390
+ outline: 1px dashed black;
1391
+ box-shadow: 0 0 0 1px white;
1392
+ }
1393
+ #maskEditor_brushPreviewGradient {
1394
+ position: absolute;
1395
+ width: 100%;
1396
+ height: 100%;
1397
+ border-radius: 50%;
1398
+ display: none;
1399
+ }
1400
+ .maskEditor_sidePanelTitle {
1401
+ text-align: center;
1402
+ font-size: 15px;
1403
+ color: var(--descrip-text);
1404
+ margin-top: 10px;
1405
+ }
1406
+ .maskEditor_sidePanelBrushShapeCircle {
1407
+ width: 35px;
1408
+ height: 35px;
1409
+ border-radius: 50%;
1410
+ border: 1px solid var(--border-color);
1411
+ pointer-events: auto;
1412
+ transition: background 0.1s;
1413
+ margin-left: 7.5px;
1414
+ }
1415
+ .maskEditor_sidePanelBrushRange {
1416
+ width: 180px;
1417
+ appearance: none;
1418
+ background: transparent;
1419
+ cursor: pointer;
1420
+ }
1421
+ .maskEditor_sidePanelBrushRange::-webkit-slider-thumb {
1422
+ height: 20px;
1423
+ width: 20px;
1424
+ border-radius: 50%;
1425
+ cursor: grab;
1426
+ margin-top: -8px;
1427
+ background: var(--p-surface-700);
1428
+ border: 1px solid var(--border-color);
1429
+ }
1430
+ .maskEditor_sidePanelBrushRange::-moz-range-thumb {
1431
+ height: 20px;
1432
+ width: 20px;
1433
+ border-radius: 50%;
1434
+ cursor: grab;
1435
+ background: var(--p-surface-800);
1436
+ border: 1px solid var(--border-color);
1437
+ }
1438
+ .maskEditor_sidePanelBrushRange::-webkit-slider-runnable-track {
1439
+ background: var(--p-surface-700);
1440
+ height: 3px;
1441
+ }
1442
+ .maskEditor_sidePanelBrushRange::-moz-range-track {
1443
+ background: var(--p-surface-700);
1444
+ height: 3px;
1445
+ }
1446
+
1447
+ .maskEditor_sidePanelBrushShapeSquare {
1448
+ width: 35px;
1449
+ height: 35px;
1450
+ margin: 5px;
1451
+ border: 1px solid var(--border-color);
1452
+ pointer-events: auto;
1453
+ transition: background 0.1s;
1454
+ }
1455
+
1456
+ .maskEditor_brushShape_dark {
1457
+ background: transparent;
1458
+ }
1459
+
1460
+ .maskEditor_brushShape_dark:hover {
1461
+ background: var(--p-surface-900);
1462
+ }
1463
+
1464
+ .maskEditor_brushShape_light {
1465
+ background: transparent;
1466
+ }
1467
+
1468
+ .maskEditor_brushShape_light:hover {
1469
+ background: var(--comfy-menu-bg);
1470
+ }
1471
+
1472
+ .maskEditor_sidePanelLayer {
1473
+ display: flex;
1474
+ width: 100%;
1475
+ height: 50px;
1476
+ }
1477
+ .maskEditor_sidePanelLayerVisibilityContainer {
1478
+ width: 50px;
1479
+ height: 50px;
1480
+ border-radius: 8px;
1481
+ display: flex;
1482
+ justify-content: center;
1483
+ align-items: center;
1484
+ }
1485
+ .maskEditor_sidePanelVisibilityToggle {
1486
+ width: 12px;
1487
+ height: 12px;
1488
+ border-radius: 50%;
1489
+ pointer-events: auto;
1490
+ }
1491
+ .maskEditor_sidePanelLayerIconContainer {
1492
+ width: 60px;
1493
+ height: 50px;
1494
+ border-radius: 8px;
1495
+ display: flex;
1496
+ justify-content: center;
1497
+ align-items: center;
1498
+ fill: var(--input-text);
1499
+ }
1500
+ .maskEditor_sidePanelLayerIconContainer svg {
1501
+ width: 30px;
1502
+ height: 30px;
1503
+ }
1504
+ .maskEditor_sidePanelBigButton {
1505
+ width: 85px;
1506
+ height: 30px;
1507
+ background: rgb(0 0 0 / 0.2);
1508
+ border: 1px solid var(--border-color);
1509
+ color: var(--input-text);
1510
+ font-size: 15px;
1511
+ pointer-events: auto;
1512
+ transition: background-color 0.1s;
1513
+ }
1514
+ .maskEditor_sidePanelBigButton:hover {
1515
+ background-color: var(--p-overlaybadge-outline-color);
1516
+ border: none;
1517
+ }
1518
+ .maskEditor_toolPanelContainer {
1519
+ width: 4rem;
1520
+ height: 4rem;
1521
+ display: flex;
1522
+ justify-content: center;
1523
+ align-items: center;
1524
+ position: relative;
1525
+ transition: background-color 0.2s;
1526
+ }
1527
+ .maskEditor_toolPanelContainerSelected svg {
1528
+ fill: var(--p-button-text-primary-color) !important;
1529
+ }
1530
+ .maskEditor_toolPanelContainerSelected .maskEditor_toolPanelIndicator {
1531
+ display: block;
1532
+ }
1533
+ .maskEditor_toolPanelContainer svg {
1534
+ width: 75%;
1535
+ aspect-ratio: 1/1;
1536
+ fill: var(--p-button-text-secondary-color);
1537
+ }
1538
+
1539
+ .maskEditor_toolPanelContainerDark:hover {
1540
+ background-color: var(--p-surface-800);
1541
+ }
1542
+
1543
+ .maskEditor_toolPanelContainerLight:hover {
1544
+ background-color: var(--p-surface-300);
1545
+ }
1546
+
1547
+ .maskEditor_toolPanelIndicator {
1548
+ display: none;
1549
+ height: 100%;
1550
+ width: 4px;
1551
+ position: absolute;
1552
+ left: 0;
1553
+ background: var(--p-button-text-primary-color);
1554
+ }
1555
+ .maskEditor_sidePanelSeparator {
1556
+ width: 100%;
1557
+ height: 2px;
1558
+ background: var(--border-color);
1559
+ margin-top: 1.5em;
1560
+ margin-bottom: 5px;
1561
+ }
1562
+ #maskEditorCanvasContainer {
1563
+ position: absolute;
1564
+ width: 1000px;
1565
+ height: 667px;
1566
+ left: 359px;
1567
+ top: 280px;
1568
+ }
1569
+
1570
+ .maskEditor_topPanelIconButton_dark {
1571
+ width: 50px;
1572
+ height: 30px;
1573
+ pointer-events: auto;
1574
+ display: flex;
1575
+ justify-content: center;
1576
+ align-items: center;
1577
+ transition: background-color 0.1s;
1578
+ background: var(--p-surface-800);
1579
+ border: 1px solid var(--p-form-field-border-color);
1580
+ border-radius: 10px;
1581
+ }
1582
+
1583
+ .maskEditor_topPanelIconButton_dark:hover {
1584
+ background-color: var(--p-surface-900);
1585
+ }
1586
+
1587
+ .maskEditor_topPanelIconButton_dark svg {
1588
+ width: 25px;
1589
+ height: 25px;
1590
+ pointer-events: none;
1591
+ fill: var(--input-text);
1592
+ }
1593
+
1594
+ .maskEditor_topPanelIconButton_light {
1595
+ width: 50px;
1596
+ height: 30px;
1597
+ pointer-events: auto;
1598
+ display: flex;
1599
+ justify-content: center;
1600
+ align-items: center;
1601
+ transition: background-color 0.1s;
1602
+ background: var(--comfy-menu-bg);
1603
+ border: 1px solid var(--p-form-field-border-color);
1604
+ border-radius: 10px;
1605
+ }
1606
+
1607
+ .maskEditor_topPanelIconButton_light:hover {
1608
+ background-color: var(--p-surface-300);
1609
+ }
1610
+
1611
+ .maskEditor_topPanelIconButton_light svg {
1612
+ width: 25px;
1613
+ height: 25px;
1614
+ pointer-events: none;
1615
+ fill: var(--input-text);
1616
+ }
1617
+
1618
+ .maskEditor_topPanelButton_dark {
1619
+ height: 30px;
1620
+ background: var(--p-surface-800);
1621
+ border: 1px solid var(--p-form-field-border-color);
1622
+ border-radius: 10px;
1623
+ color: var(--input-text);
1624
+ pointer-events: auto;
1625
+ transition: 0.1s;
1626
+ width: 60px;
1627
+ }
1628
+
1629
+ .maskEditor_topPanelButton_dark:hover {
1630
+ background-color: var(--p-surface-900);
1631
+ }
1632
+
1633
+ .maskEditor_topPanelButton_light {
1634
+ height: 30px;
1635
+ background: var(--comfy-menu-bg);
1636
+ border: 1px solid var(--p-form-field-border-color);
1637
+ border-radius: 10px;
1638
+ color: var(--input-text);
1639
+ pointer-events: auto;
1640
+ transition: 0.1s;
1641
+ width: 60px;
1642
+ }
1643
+
1644
+ .maskEditor_topPanelButton_light:hover {
1645
+ background-color: var(--p-surface-300);
1646
+ }
1647
+
1648
+ .maskEditor_sidePanel_paintBucket_Container {
1649
+ width: 180px;
1650
+ display: flex;
1651
+ flex-direction: column;
1652
+ position: relative;
1653
+ }
1654
+
1655
+ .maskEditor_sidePanel_colorSelect_Container {
1656
+ display: flex;
1657
+ width: 180px;
1658
+ align-items: center;
1659
+ gap: 5px;
1660
+ height: 30px;
1661
+ }
1662
+
1663
+ .maskEditor_sidePanel_colorSelect_tolerance_container {
1664
+ display: flex;
1665
+ flex-direction: column;
1666
+ gap: 10px;
1667
+ margin-bottom: 10px;
1668
+ }
1669
+
1670
+ .maskEditor_sidePanelContainerColumn {
1671
+ display: flex;
1672
+ flex-direction: column;
1673
+ gap: 12px;
1674
+ padding-bottom: 12px;
1675
+ }
1676
+
1677
+ .maskEditor_sidePanelContainerRow {
1678
+ display: flex;
1679
+ flex-direction: row;
1680
+ gap: 10px;
1681
+ align-items: center;
1682
+ min-height: 24px;
1683
+ position: relative;
1684
+ }
1685
+
1686
+ .maskEditor_accent_bg_dark {
1687
+ background: var(--p-surface-800);
1688
+ }
1689
+
1690
+ .maskEditor_accent_bg_very_dark {
1691
+ background: var(--p-surface-900);
1692
+ }
1693
+
1694
+ .maskEditor_accent_bg_light {
1695
+ background: var(--p-surface-300);
1696
+ }
1697
+
1698
+ .maskEditor_accent_bg_very_light {
1699
+ background: var(--comfy-menu-bg);
1700
+ }
1701
+
1702
+ .maskEditor_sidePanelToggleContainer {
1703
+ cursor: pointer;
1704
+ display: inline-block;
1705
+ position: absolute;
1706
+ right: 0;
1707
+ }
1708
+
1709
+ .maskEditor_sidePanelToggleSwitch {
1710
+ display: inline-block;
1711
+ border-radius: 16px;
1712
+ width: 40px;
1713
+ height: 24px;
1714
+ position: relative;
1715
+ vertical-align: middle;
1716
+ transition: background 0.25s;
1717
+ background: var(--p-surface-300);
1718
+ }
1719
+
1720
+ .dark-theme .maskEditor_sidePanelToggleSwitch {
1721
+ background: var(--p-surface-700);
1722
+ }
1723
+
1724
+ .maskEditor_sidePanelToggleSwitch::before,
1725
+ .maskEditor_sidePanelToggleSwitch::after {
1726
+ content: '';
1727
+ }
1728
+ .maskEditor_sidePanelToggleSwitch::before {
1729
+ display: block;
1730
+ background: linear-gradient(to bottom, #fff 0%, #eee 100%);
1731
+ border-radius: 50%;
1732
+ width: 16px;
1733
+ height: 16px;
1734
+ position: absolute;
1735
+ top: 4px;
1736
+ left: 4px;
1737
+ transition: ease 0.2s;
1738
+ }
1739
+ .maskEditor_sidePanelToggleContainer:hover
1740
+ .maskEditor_sidePanelToggleSwitch::before {
1741
+ background: linear-gradient(to bottom, #fff 0%, #fff 100%);
1742
+ }
1743
+ .maskEditor_sidePanelToggleCheckbox:checked
1744
+ + .maskEditor_sidePanelToggleSwitch {
1745
+ background: var(--p-button-text-primary-color);
1746
+ }
1747
+ .maskEditor_sidePanelToggleCheckbox:checked
1748
+ + .maskEditor_sidePanelToggleSwitch::before {
1749
+ background: var(--comfy-menu-bg);
1750
+ left: 20px;
1751
+ }
1752
+ .dark-theme
1753
+ .maskEditor_sidePanelToggleCheckbox:checked
1754
+ + .maskEditor_sidePanelToggleSwitch::before {
1755
+ background: var(--p-surface-900);
1756
+ }
1757
+
1758
+ .maskEditor_sidePanelToggleCheckbox {
1759
+ position: absolute;
1760
+ visibility: hidden;
1761
+ }
1762
+
1763
+ .maskEditor_sidePanelDropdown {
1764
+ border: 1px solid var(--p-form-field-border-color);
1765
+ background: var(--comfy-menu-bg);
1766
+ height: 24px;
1767
+ padding-left: 5px;
1768
+ padding-right: 5px;
1769
+ border-radius: 6px;
1770
+ transition: background 0.1s;
1771
+ }
1772
+
1773
+ .maskEditor_sidePanelDropdown option {
1774
+ background: var(--comfy-menu-bg);
1775
+ }
1776
+
1777
+ .maskEditor_sidePanelDropdown:focus {
1778
+ outline: 1px solid var(--p-surface-300);
1779
+ }
1780
+
1781
+ .maskEditor_sidePanelDropdown option:hover {
1782
+ background: white;
1783
+ }
1784
+ .maskEditor_sidePanelDropdown option:active {
1785
+ background: var(--p-surface-300);
1786
+ }
1787
+
1788
+ .dark-theme .maskEditor_sidePanelDropdown {
1789
+ background: var(--p-surface-900);
1790
+ }
1791
+
1792
+ .dark-theme .maskEditor_sidePanelDropdown option {
1793
+ background: var(--p-surface-900);
1794
+ }
1795
+
1796
+ .dark-theme .maskEditor_sidePanelDropdown:focus {
1797
+ outline: 1px solid var(--p-button-text-primary-color);
1798
+ }
1799
+
1800
+ .dark-theme .maskEditor_sidePanelDropdown option:active {
1801
+ background: var(--p-highlight-background);
1802
+ }
1803
+
1804
+ .maskEditor_layerRow {
1805
+ height: 50px;
1806
+ width: 100%;
1807
+ border-radius: 10px;
1808
+ }
1809
+
1810
+ .maskEditor_sidePanelLayerPreviewContainer {
1811
+ width: 40px;
1812
+ height: 30px;
1813
+ }
1814
+
1815
+ .maskEditor_sidePanelLayerPreviewContainer > svg {
1816
+ width: 100%;
1817
+ height: 100%;
1818
+ object-fit: contain;
1819
+ fill: var(--p-surface-100);
1820
+ }
1821
+
1822
+ .maskEditor_sidePanelImageLayerImage {
1823
+ width: 100%;
1824
+ height: 100%;
1825
+ object-fit: contain;
1826
+ }
1827
+
1828
+ .maskEditor_sidePanelSubTitle {
1829
+ text-align: left;
1830
+ font-size: 12px;
1831
+ color: var(--descrip-text);
1832
+ }
1833
+
1834
+ .maskEditor_containerDropdown {
1835
+ position: absolute;
1836
+ right: 0;
1837
+ }
1838
+
1839
+ .maskEditor_sidePanelLayerCheckbox {
1840
+ margin-left: 15px;
1841
+ }
1842
+ /* ===================== End of Mask Editor Styles ===================== */
1843
+
1844
+ /* ===================== Skeleton Shimmer ===================== */
1845
+ .skeleton-shimmer {
1846
+ background:
1847
+ linear-gradient(135deg, rgb(188 188 188 / 0.5) 0%, rgb(0 0 0 / 0.5) 100%) 0
1848
+ 0 / 200% 200%,
1849
+ #000;
1850
+ animation: skeleton-shimmer 2s ease-in-out infinite;
1851
+ }
1852
+
1853
+ @keyframes skeleton-shimmer {
1854
+ 0%,
1855
+ 100% {
1856
+ background-position: 100% 100%;
1857
+ }
1858
+ 50% {
1859
+ background-position: 0 0;
1860
+ }
1861
+ }
1862
+
1863
+ @utility scroll-shadows-* {
1864
+ overflow: auto;
1865
+
1866
+ background:
1867
+ /* Shadow Cover TOP */
1868
+ linear-gradient(--value(--color-*) 30%, transparent) center top,
1869
+ /* Shadow Cover BOTTOM */
1870
+ linear-gradient(transparent, --value(--color-*) 70%) center bottom,
1871
+ /* Shadow TOP */
1872
+ radial-gradient(
1873
+ farthest-side at 50% 0,
1874
+ color-mix(in oklab, --value(--color-*), #777777 35%),
1875
+ 60%,
1876
+ transparent
1877
+ )
1878
+ center top,
1879
+ /* Shadow BOTTOM */
1880
+ radial-gradient(
1881
+ farthest-side at 50% 100%,
1882
+ color-mix(in oklab, --value(--color-*), #777777 35%),
1883
+ 60%,
1884
+ transparent
1885
+ )
1886
+ center bottom;
1887
+
1888
+ background-repeat: no-repeat;
1889
+ background-size:
1890
+ 300% 40px,
1891
+ 300% 40px,
1892
+ 300% 14px,
1893
+ 300% 14px;
1894
+ background-attachment: local, local, scroll, scroll;
1895
+ }
1896
+
1897
+ /*
1898
+ PrimeVue overlays teleport to body. When a Reka modal dialog is open it sets
1899
+ body { pointer-events: none } via DismissableLayer, which propagates to the
1900
+ body-portaled overlays and makes them unclickable. PrimeVue's own Dialog
1901
+ sets pointer-events inline, but Select / ColorPicker / Popover / Autocomplete
1902
+ overlays do not, so they need to opt in here.
1903
+ */
1904
+ .p-select-overlay,
1905
+ .p-colorpicker-panel,
1906
+ .p-popover,
1907
+ .p-autocomplete-overlay {
1908
+ pointer-events: auto;
1909
+ }