diff --git a/src/renderer/extensions/vueNodes/components/NodeWidgets.vue b/src/renderer/extensions/vueNodes/components/NodeWidgets.vue index 102f679453..6c7b465982 100644 --- a/src/renderer/extensions/vueNodes/components/NodeWidgets.vue +++ b/src/renderer/extensions/vueNodes/components/NodeWidgets.vue @@ -152,7 +152,7 @@ const processedWidgets = computed((): ProcessedWidget[] => { if (!shouldRenderAsVue(widget)) continue const vueComponent = - getComponent(widget.type, widget.name) || + getComponent(widget.type, widget.name, widget.options?.display) || (widget.isDOMWidget ? WidgetDOM : WidgetLegacy) const { slotMetadata, options } = widget diff --git a/src/renderer/extensions/vueNodes/widgets/composables/useFloatWidget.ts b/src/renderer/extensions/vueNodes/widgets/composables/useFloatWidget.ts index 6595f3015e..d3ca7f44a6 100644 --- a/src/renderer/extensions/vueNodes/widgets/composables/useFloatWidget.ts +++ b/src/renderer/extensions/vueNodes/widgets/composables/useFloatWidget.ts @@ -72,7 +72,8 @@ export const useFloatWidget = () => { /** @deprecated Use step2 instead. The 10x value is a legacy implementation. */ step: step * 10.0, step2: step, - precision + precision, + display: inputSpec.display } ) diff --git a/src/renderer/extensions/vueNodes/widgets/composables/useIntWidget.ts b/src/renderer/extensions/vueNodes/widgets/composables/useIntWidget.ts index 0c257c15b1..a7a5a15913 100644 --- a/src/renderer/extensions/vueNodes/widgets/composables/useIntWidget.ts +++ b/src/renderer/extensions/vueNodes/widgets/composables/useIntWidget.ts @@ -63,7 +63,8 @@ export const useIntWidget = () => { /** @deprecated Use step2 instead. The 10x value is a legacy implementation. */ step: step * 10, step2: step, - precision: 0 + precision: 0, + display: inputSpec.display } ) diff --git a/src/schemas/nodeDefSchema.ts b/src/schemas/nodeDefSchema.ts index bb36da2284..2fe8fc4346 100644 --- a/src/schemas/nodeDefSchema.ts +++ b/src/schemas/nodeDefSchema.ts @@ -42,7 +42,12 @@ const zNumericInputOptions = zBaseInputOptions.extend({ step: z.number().optional(), /** Note: Many node authors are using INT/FLOAT to pass list of INT/FLOAT. */ default: z.union([z.number(), z.array(z.number())]).optional(), - display: z.enum(['slider', 'number', 'knob']).optional() + /** + * Display hint for widget rendering. + * Built-in values: 'slider', 'number', 'knob' + * Extensions can register custom values via getCustomVueWidgets hook. + */ + display: z.string().optional() }) export const zIntInputOptions = zNumericInputOptions.extend({ diff --git a/src/types/litegraph-augmentation.d.ts b/src/types/litegraph-augmentation.d.ts index 0b283b1586..04a6c3c3e8 100644 --- a/src/types/litegraph-augmentation.d.ts +++ b/src/types/litegraph-augmentation.d.ts @@ -40,6 +40,12 @@ declare module '@/lib/litegraph/src/types/widgets' { /** If the widget is hidden, this will be set to true. */ hidden?: boolean + + /** + * Display hint from Python node definition for custom widget rendering. + * Extensions can use this to render widgets with custom Vue components. + */ + display?: string } interface IBaseWidget {