@@ -102,23 +102,40 @@ function PresetItemDisplay({ preset, previewUrl, isGeneratingPreviews }: PresetI
102102
103103 const supportsMasks = preset . includeMasks ?? ( preset . adjustments ?. masks && preset . adjustments . masks . length > 0 ) ;
104104 const supportsGeometry =
105- preset . includeCropTransform ?? geometryKeys . some ( ( key ) => preset . adjustments ?. [ key ] !== undefined ) ;
105+ preset . includeCropTransform ??
106+ geometryKeys . some ( ( key ) => geometryKeys . some ( ( key ) => preset . adjustments ?. [ key ] !== undefined ) ) ;
107+
108+ const tooltipContent = useMemo ( ( ) => {
109+ const features = [ ] ;
110+ if ( supportsMasks ) features . push ( 'Masks' ) ;
111+ if ( supportsGeometry ) features . push ( 'Crop & Transform' ) ;
112+
113+ if ( features . length === 0 ) return undefined ;
114+ return `Supports ${ features . join ( ' + ' ) } ` ;
115+ } , [ supportsMasks , supportsGeometry ] ) ;
106116
107117 return (
108118 < div className = "flex items-center gap-2 p-2 rounded-lg bg-surface cursor-grabbing" >
109- < div className = "w-20 h-14 bg-bg-tertiary rounded-md flex items-center justify-center shrink-0 relative overflow-hidden" >
119+ < div
120+ className = "w-20 h-14 bg-bg-tertiary rounded-md flex items-center justify-center shrink-0 relative overflow-hidden"
121+ data-tooltip = { tooltipContent }
122+ >
110123 { isGeneratingPreviews && ! previewUrl ? (
111124 < Loader2 size = { 20 } className = "animate-spin text-text-secondary" />
112125 ) : previewUrl ? (
113- < img src = { previewUrl } alt = { `${ preset . name } preview` } className = "w-full h-full object-cover rounded-md" />
126+ < img
127+ src = { previewUrl }
128+ alt = { `${ preset . name } preview` }
129+ className = "w-full h-full object-cover rounded-md pointer-events-none"
130+ />
114131 ) : (
115132 < Loader2 size = { 20 } className = "animate-spin text-text-secondary" />
116133 ) }
117134
118135 { ( supportsMasks || supportsGeometry ) && (
119- < div className = "absolute top-1 right-1 bg-primary rounded-full px-1.5 py-0.5 flex items-center gap-1.5 backdrop-blur-xs shadow-xs z-10" >
120- { supportsMasks && < Layers size = { 11 } className = "text-white" data-tooltip = "Supports Masks" /> }
121- { supportsGeometry && < Scaling size = { 11 } className = "text-white" data-tooltip = "Supports Crop & Transform" /> }
136+ < div className = "absolute top-1 right-1 bg-primary rounded-full px-1.5 py-0.5 flex items-center gap-1.5 backdrop-blur-xs shadow-xs z-10 pointer-events-none " >
137+ { supportsMasks && < Layers size = { 11 } className = "text-white" /> }
138+ { supportsGeometry && < Scaling size = { 11 } className = "text-white" /> }
122139 </ div >
123140 ) }
124141 </ div >
@@ -572,8 +589,9 @@ export default function PresetsPanel({
572589 name : string ,
573590 includeMasks : boolean ,
574591 includeCropTransform : boolean ,
592+ isAdditive : boolean ,
575593 ) => {
576- const newPreset = addPreset ( name , null , includeMasks , includeCropTransform ) ;
594+ const newPreset = addPreset ( name , null , includeMasks , includeCropTransform , isAdditive ) ;
577595 setIsAddModalOpen ( false ) ;
578596 if ( newPreset ) {
579597 await generateSinglePreview ( newPreset ) ;
@@ -777,14 +795,27 @@ export default function PresetsPanel({
777795 options = [
778796 {
779797 icon : RefreshCw ,
780- label : 'Overwrite Preset' ,
781-
782- onClick : async ( ) => {
783- const updated = updatePreset ( data ?. id ?? null ) ;
784- if ( updated ) {
785- await generateSinglePreview ( updated ) ;
786- }
787- } ,
798+ label : 'Update from Current' ,
799+ submenu : [
800+ {
801+ label : 'Merge' ,
802+ onClick : async ( ) => {
803+ const updated = updatePreset ( data ?. id ?? null , 'merge' ) ;
804+ if ( updated ) {
805+ await generateSinglePreview ( updated ) ;
806+ }
807+ } ,
808+ } ,
809+ {
810+ label : 'Replace' ,
811+ onClick : async ( ) => {
812+ const updated = updatePreset ( data ?. id ?? null , 'replace' ) ;
813+ if ( updated ) {
814+ await generateSinglePreview ( updated ) ;
815+ }
816+ } ,
817+ } ,
818+ ] ,
788819 } ,
789820 { type : OPTION_SEPARATOR } ,
790821 {
0 commit comments