@@ -2899,6 +2899,7 @@ function videoModelSearchFilterHandler(videoModelSearchNode) {
28992899 "runware:190@1 (Ovi)" ,
29002900 ] ,
29012901 "Runway" : [
2902+ "runway:aleph@2.0 (Runway Aleph 2.0)" ,
29022903 "runway:2@1 (Runway Aleph)" ,
29032904 "runway:1@1 (Runway Gen-4 Turbo)" ,
29042905 "runway:1@2 (Runway Gen-4.5)" ,
@@ -3022,6 +3023,7 @@ function videoModelSearchFilterHandler(videoModelSearchNode) {
30223023 "lightricks:ltx@2.3" : { "width" : 1920 , "height" : 1080 } ,
30233024 "lightricks:ltx@2.3-fast" : { "width" : 1920 , "height" : 1080 } ,
30243025 "runware:190@1" : { "width" : 0 , "height" : 0 } ,
3026+ "runway:aleph@2.0" : { "width" : 0 , "height" : 0 } ,
30253027 "runway:2@1" : { "width" : 1280 , "height" : 720 } ,
30263028 "runway:1@1" : { "width" : 1280 , "height" : 720 } ,
30273029 "runway:1@2" : { "width" : 1280 , "height" : 720 } ,
@@ -3122,6 +3124,7 @@ function videoModelSearchFilterHandler(videoModelSearchNode) {
31223124 "lightricks:ltx@2.3" : "1080p" ,
31233125 "lightricks:ltx@2.3-fast" : "1080p" ,
31243126 "runware:190@1" : null , // No resolution support
3127+ "runway:aleph@2.0" : null , // Output ratio matches input video
31253128 "runway:2@1" : "720p" ,
31263129 "runway:1@1" : "720p" ,
31273130 "runway:1@2" : "720p" ,
@@ -5028,6 +5031,89 @@ function audioInferenceSpeechVoicesToggleHandler(voicesNode) {
50285031 }
50295032}
50305033
5034+ function videoInputsFrameToggleHandler ( frameImagesNode ) {
5035+ if ( ! frameImagesNode ?. widgets ) return ;
5036+ if ( frameImagesNode . _videoInputsFrameToggleHandlerRegistered ) return ;
5037+ frameImagesNode . _videoInputsFrameToggleHandlerRegistered = true ;
5038+
5039+ function toggleWidgetState ( useWidget , paramWidget , paramName ) {
5040+ if ( ! useWidget || ! paramWidget ) return ;
5041+
5042+ function toggleEnabled ( ) {
5043+ const enabled = useWidget . value === true ;
5044+
5045+ // FLOAT timestamp widgets: avoid '' on disabled slots (ComfyUI validation error)
5046+ if ( ! enabled && paramName && paramName . startsWith ( "timestamp" ) ) {
5047+ if ( paramWidget . value === "" || paramWidget . value == null ) {
5048+ paramWidget . value = 0.0 ;
5049+ }
5050+ }
5051+
5052+ if ( paramWidget . inputEl ) {
5053+ paramWidget . inputEl . disabled = ! enabled ;
5054+ paramWidget . inputEl . style . opacity = enabled ? "1" : "0.5" ;
5055+ paramWidget . inputEl . style . cursor = enabled ? "text" : "not-allowed" ;
5056+ paramWidget . inputEl . readOnly = ! enabled ;
5057+ }
5058+
5059+ if ( paramWidget . options && paramWidget . options . element ) {
5060+ paramWidget . options . element . disabled = ! enabled ;
5061+ paramWidget . options . element . style . opacity = enabled ? "1" : "0.5" ;
5062+ paramWidget . options . element . style . pointerEvents = enabled ? "auto" : "none" ;
5063+ }
5064+
5065+ paramWidget . disabled = ! enabled ;
5066+
5067+ if ( ! paramWidget . inputEl && paramName ) {
5068+ const nodeElement = frameImagesNode . htmlElements ?. widgetsContainer || frameImagesNode . htmlElements ;
5069+ if ( nodeElement ) {
5070+ const input = nodeElement . querySelector ( `input[name="${ paramName } "], textarea[name="${ paramName } "], select[name="${ paramName } "]` ) ;
5071+ if ( input ) {
5072+ input . disabled = ! enabled ;
5073+ input . style . opacity = enabled ? "1" : "0.5" ;
5074+ input . style . cursor = enabled ? "text" : "not-allowed" ;
5075+ input . readOnly = ! enabled ;
5076+ if ( input . tagName === "SELECT" ) {
5077+ input . style . pointerEvents = enabled ? "auto" : "none" ;
5078+ }
5079+ }
5080+ }
5081+ }
5082+
5083+ frameImagesNode . setDirtyCanvas ( true ) ;
5084+ }
5085+
5086+ appendWidgetCB ( useWidget , ( ) => {
5087+ setTimeout ( toggleEnabled , 50 ) ;
5088+ } ) ;
5089+
5090+ setTimeout ( toggleEnabled , 100 ) ;
5091+ }
5092+
5093+ function initializeHandler ( ) {
5094+ if ( ! frameImagesNode . widgets || frameImagesNode . widgets . length === 0 ) {
5095+ setTimeout ( initializeHandler , 100 ) ;
5096+ return ;
5097+ }
5098+
5099+ for ( let i = 1 ; i <= 4 ; i ++ ) {
5100+ const useFrameWidget = frameImagesNode . widgets . find ( ( w ) => w && w . name === `useFrame${ i } ` ) ;
5101+ const frameWidget = frameImagesNode . widgets . find ( ( w ) => w && w . name === `frame${ i } position` ) ;
5102+ const useTimestampWidget = frameImagesNode . widgets . find ( ( w ) => w && w . name === `useTimestamp${ i } ` ) ;
5103+ const timestampWidget = frameImagesNode . widgets . find ( ( w ) => w && w . name === `timestamp${ i } ` ) ;
5104+
5105+ if ( useFrameWidget && frameWidget ) {
5106+ toggleWidgetState ( useFrameWidget , frameWidget , `frame${ i } position` ) ;
5107+ }
5108+ if ( useTimestampWidget && timestampWidget ) {
5109+ toggleWidgetState ( useTimestampWidget , timestampWidget , `timestamp${ i } ` ) ;
5110+ }
5111+ }
5112+ }
5113+
5114+ initializeHandler ( ) ;
5115+ }
5116+
50315117function referenceVideosToggleHandler ( referenceVideosNode ) {
50325118 if ( ! referenceVideosNode ?. widgets ) return ;
50335119
@@ -5168,6 +5254,7 @@ export {
51685254 audioInferenceInputsToggleHandler ,
51695255 audioInferenceReferenceVoiceToggleHandler ,
51705256 audioInferenceSpeechVoicesToggleHandler ,
5257+ videoInputsFrameToggleHandler ,
51715258 referenceVideosToggleHandler ,
51725259} ;
51735260
0 commit comments