Skip to content

Commit 3895a43

Browse files
authored
feat: v3 style of node body (#5169)
* feat: v3 style of node body * Update src/renderer/extensions/vueNodes/components/LGraphNode.vue * fix: review's issues * fix: review's issue
1 parent 907ba12 commit 3895a43

24 files changed

+289
-182
lines changed

CLAUDE.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,3 +59,6 @@ When referencing Comfy-Org repos:
5959
- NEVER use `--no-verify` flag when committing
6060
- NEVER delete or disable tests to make them pass
6161
- NEVER circumvent quality checks
62+
- NEVER use `dark:` prefix - always use `dark-theme:` for dark mode styles, for example: `dark-theme:text-white dark-theme:bg-black`
63+
- NEVER use `:class="[]"` to merge class names - always use `import { cn } from '@/utils/tailwindUtil'`, for example: `<div :class="cn('bg-red-500', { 'bg-blue-500': condition })" />`
64+

package-lock.json

Lines changed: 21 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@
9595
"algoliasearch": "^5.21.0",
9696
"axios": "^1.8.2",
9797
"chart.js": "^4.5.0",
98+
"clsx": "^2.1.1",
9899
"dompurify": "^3.2.5",
99100
"dotenv": "^16.4.5",
100101
"extendable-media-recorder": "^9.2.27",
@@ -109,6 +110,7 @@
109110
"primeicons": "^7.0.0",
110111
"primevue": "^4.2.5",
111112
"semver": "^7.7.2",
113+
"tailwind-merge": "^3.3.1",
112114
"three": "^0.170.0",
113115
"tiptap-markdown": "^0.8.10",
114116
"vue": "^3.5.13",

src/assets/css/style.css

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,61 @@
11
@layer primevue, tailwind-utilities;
22

33
@layer tailwind-utilities {
4+
/* Set default values to prevent some styles from not working properly. */
5+
*, ::before, ::after {
6+
--tw-border-spacing-x: 0;
7+
--tw-border-spacing-y: 0;
8+
--tw-translate-x: 0;
9+
--tw-translate-y: 0;
10+
--tw-rotate: 0;
11+
--tw-skew-x: 0;
12+
--tw-skew-y: 0;
13+
--tw-scale-x: 1;
14+
--tw-scale-y: 1;
15+
--tw-pan-x: ;
16+
--tw-pan-y: ;
17+
--tw-pinch-zoom: ;
18+
--tw-scroll-snap-strictness: proximity;
19+
--tw-gradient-from-position: ;
20+
--tw-gradient-via-position: ;
21+
--tw-gradient-to-position: ;
22+
--tw-ordinal: ;
23+
--tw-slashed-zero: ;
24+
--tw-numeric-figure: ;
25+
--tw-numeric-spacing: ;
26+
--tw-numeric-fraction: ;
27+
--tw-ring-inset: ;
28+
--tw-ring-offset-width: 0px;
29+
--tw-ring-offset-color: #fff;
30+
--tw-ring-color: rgb(66 153 225 / 0.5);
31+
--tw-ring-offset-shadow: 0 0 #0000;
32+
--tw-ring-shadow: 0 0 #0000;
33+
--tw-shadow: 0 0 #0000;
34+
--tw-shadow-colored: 0 0 #0000;
35+
--tw-blur: ;
36+
--tw-brightness: ;
37+
--tw-contrast: ;
38+
--tw-grayscale: ;
39+
--tw-hue-rotate: ;
40+
--tw-invert: ;
41+
--tw-saturate: ;
42+
--tw-sepia: ;
43+
--tw-drop-shadow: ;
44+
--tw-backdrop-blur: ;
45+
--tw-backdrop-brightness: ;
46+
--tw-backdrop-contrast: ;
47+
--tw-backdrop-grayscale: ;
48+
--tw-backdrop-hue-rotate: ;
49+
--tw-backdrop-invert: ;
50+
--tw-backdrop-opacity: ;
51+
--tw-backdrop-saturate: ;
52+
--tw-backdrop-sepia: ;
53+
--tw-contain-size: ;
54+
--tw-contain-layout: ;
55+
--tw-contain-paint: ;
56+
--tw-contain-style: ;
57+
}
58+
459
@tailwind components;
560
@tailwind utilities;
661
}
@@ -28,7 +83,7 @@
2883
--content-fg: #000;
2984
--content-hover-bg: #adadad;
3085
--content-hover-fg: #000;
31-
86+
3287
/* Code styling colors for help menu*/
3388
--code-text-color: rgba(0, 122, 255, 1);
3489
--code-bg-color: rgba(96, 165, 250, 0.2);

src/components/graph/vueWidgets/WidgetInputText.vue

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,22 @@
11
<template>
2-
<div class="flex items-center justify-between gap-4">
3-
<label v-if="widget.name" class="text-xs opacity-80 min-w-[4em] truncate">{{
4-
widget.name
5-
}}</label>
2+
<WidgetLayoutField :widget="widget">
63
<InputText
74
v-model="localValue"
85
v-bind="filteredProps"
96
:disabled="readonly"
10-
class="flex-grow min-w-[8em] max-w-[20em] text-xs"
7+
class="w-full text-xs"
118
size="small"
129
@update:model-value="onChange"
1310
/>
14-
</div>
11+
</WidgetLayoutField>
1512
</template>
1613

1714
<script setup lang="ts">
1815
import InputText from 'primevue/inputtext'
1916
import { computed } from 'vue'
2017
2118
import { useStringWidgetValue } from '@/composables/graph/useWidgetValue'
19+
import WidgetLayoutField from '@/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue'
2220
import type { SimplifiedWidget } from '@/types/simplifiedWidget'
2321
import {
2422
INPUT_EXCLUDED_PROPS,

src/components/graph/vueWidgets/WidgetMultiSelect.vue

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,25 @@
11
<template>
2-
<div class="flex items-center justify-between gap-4">
3-
<label v-if="widget.name" class="text-xs opacity-80 min-w-[4em] truncate">{{
4-
widget.name
5-
}}</label>
2+
<WidgetLayoutField :widget="widget">
63
<MultiSelect
74
v-model="localValue"
85
v-bind="filteredProps"
96
:disabled="readonly"
10-
class="flex-grow min-w-[8em] max-w-[20em] text-xs"
7+
class="w-full text-xs"
118
size="small"
129
:pt="{
1310
option: 'text-xs'
1411
}"
1512
@update:model-value="onChange"
1613
/>
17-
</div>
14+
</WidgetLayoutField>
1815
</template>
1916

2017
<script setup lang="ts">
2118
import MultiSelect from 'primevue/multiselect'
2219
import { computed } from 'vue'
2320
2421
import { useWidgetValue } from '@/composables/graph/useWidgetValue'
22+
import WidgetLayoutField from '@/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue'
2523
import type { SimplifiedWidget } from '@/types/simplifiedWidget'
2624
import {
2725
PANEL_EXCLUDED_PROPS,

src/components/graph/vueWidgets/WidgetSlider.vue

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
<template>
2-
<div class="flex items-center gap-4" :style="{ height: widgetHeight + 'px' }">
3-
<label v-if="widget.name" class="text-xs opacity-80 min-w-[4em] truncate">{{
4-
widget.name
5-
}}</label>
6-
<div class="flex items-center gap-2 flex-1 justify-end">
2+
<WidgetLayoutField :widget="widget">
3+
<div class="flex items-center gap-2 w-full">
74
<Slider
85
v-model="localValue"
96
v-bind="filteredProps"
107
:disabled="readonly"
11-
class="flex-grow min-w-[8em] max-w-[20em] text-xs"
8+
class="flex-grow text-xs"
129
@update:model-value="onChange"
1310
/>
1411
<InputText
@@ -24,7 +21,7 @@
2421
@keydown="handleInputKeydown"
2522
/>
2623
</div>
27-
</div>
24+
</WidgetLayoutField>
2825
</template>
2926

3027
<script setup lang="ts">
@@ -33,14 +30,13 @@ import Slider from 'primevue/slider'
3330
import { computed, ref, watch } from 'vue'
3431
3532
import { useNumberWidgetValue } from '@/composables/graph/useWidgetValue'
33+
import WidgetLayoutField from '@/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue'
3634
import type { SimplifiedWidget } from '@/types/simplifiedWidget'
3735
import {
3836
STANDARD_EXCLUDED_PROPS,
3937
filterWidgetProps
4038
} from '@/utils/widgetPropFilter'
4139
42-
import { COMFY_VUE_NODE_DIMENSIONS } from '../../../lib/litegraph/src/litegraph'
43-
4440
const props = defineProps<{
4541
widget: SimplifiedWidget<number>
4642
modelValue: number
@@ -58,9 +54,6 @@ const { localValue, onChange } = useNumberWidgetValue(
5854
emit
5955
)
6056
61-
// Get widget height from litegraph constants
62-
const widgetHeight = COMFY_VUE_NODE_DIMENSIONS.components.STANDARD_WIDGET_HEIGHT
63-
6457
const filteredProps = computed(() =>
6558
filterWidgetProps(props.widget.options, STANDARD_EXCLUDED_PROPS)
6659
)

src/components/graph/vueWidgets/WidgetToggleSwitch.vue

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,20 @@
11
<template>
2-
<div class="flex items-center justify-between gap-4">
3-
<label v-if="widget.name" class="text-xs opacity-80 min-w-[4em] truncate">{{
4-
widget.name
5-
}}</label>
2+
<WidgetLayoutField :widget="widget">
63
<ToggleSwitch
74
v-model="localValue"
85
v-bind="filteredProps"
96
:disabled="readonly"
107
@update:model-value="onChange"
118
/>
12-
</div>
9+
</WidgetLayoutField>
1310
</template>
1411

1512
<script setup lang="ts">
1613
import ToggleSwitch from 'primevue/toggleswitch'
1714
import { computed } from 'vue'
1815
1916
import { useBooleanWidgetValue } from '@/composables/graph/useWidgetValue'
17+
import WidgetLayoutField from '@/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue'
2018
import type { SimplifiedWidget } from '@/types/simplifiedWidget'
2119
import {
2220
STANDARD_EXCLUDED_PROPS,

src/components/graph/vueWidgets/WidgetTreeSelect.vue

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,22 @@
11
<template>
2-
<div class="flex items-center justify-between gap-4">
3-
<label v-if="widget.name" class="text-xs opacity-80 min-w-[4em] truncate">{{
4-
widget.name
5-
}}</label>
2+
<WidgetLayoutField :widget="widget">
63
<TreeSelect
74
v-model="localValue"
85
v-bind="filteredProps"
96
:disabled="readonly"
10-
class="flex-grow min-w-[8em] max-w-[20em] text-xs"
7+
class="w-full text-xs"
118
size="small"
129
@update:model-value="onChange"
1310
/>
14-
</div>
11+
</WidgetLayoutField>
1512
</template>
1613

1714
<script setup lang="ts">
1815
import TreeSelect from 'primevue/treeselect'
1916
import { computed } from 'vue'
2017
2118
import { useWidgetValue } from '@/composables/graph/useWidgetValue'
19+
import WidgetLayoutField from '@/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue'
2220
import type { SimplifiedWidget } from '@/types/simplifiedWidget'
2321
import {
2422
PANEL_EXCLUDED_PROPS,

src/renderer/extensions/vueNodes/components/InputSlot.vue

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,18 @@
1818
<!-- Connection Dot -->
1919
<div class="w-5 h-5 flex items-center justify-center group/slot">
2020
<div
21-
class="w-2 h-2 rounded-full bg-white transition-all duration-150 group-hover/slot:w-2.5 group-hover/slot:h-2.5 group-hover/slot:border-2 group-hover/slot:border-white"
21+
class="w-2.5 h-2.5 rounded-full bg-white transition-all duration-150 group-hover/slot:w-3 group-hover/slot:h-3 group-hover/slot:border-2 group-hover/slot:border-white"
2222
:style="{
2323
backgroundColor: slotColor
2424
}"
2525
/>
2626
</div>
2727

2828
<!-- Slot Name -->
29-
<span v-if="!dotOnly" class="text-xs text-surface-700 whitespace-nowrap">
29+
<span
30+
v-if="!dotOnly"
31+
class="whitespace-nowrap text-sm font-normal dark-theme:text-[#9FA2BD] text-[#888682]"
32+
>
3033
{{ slotData.name || `Input ${index}` }}
3134
</span>
3235
</div>

0 commit comments

Comments
 (0)