These workflow:
arcpy.InterpolateShape_3d(in_surface="dem", in_feature_class="STREAMS", out_feature_class="C:/SCRATCH/streams3d.shp", sample_distance="", z_factor="1", method="BILINEAR", vertices_only="DENSIFY", pyramid_level_resolution="0")
arcpy.SplitLine_management(in_features="streams3d", out_feature_class="C:/SCRATCH/bits3d.shp")
arcpy.Adjust3DZ_management(in_features="bits3d", reverse_sign="NO_REVERSE", adjust_value="2", from_units="", to_units="")
arcpy.AddZInformation_3d(in_feature_class="bits3d", out_property="Z_MEAN", noise_filtering="NO_FILTER")
arcpy.gp.EucAllocation_sa("bits3d", "C:/SCRATCH/EA", "", "", "1", "FID", "", "")
arcpy.AddField_management(in_table="EA", field_name="FLOOD_L", field_type="DOUBLE", field_precision="", field_scale="", field_length="", field_alias="", field_is_nullable="NULLABLE", field_is_required="NON_REQUIRED", field_domain="")
arcpy.AddJoin_management(in_layer_or_view="EA", in_field="VALUE", join_table="bits3d", join_field="FID", join_type="KEEP_ALL")
arcpy.CalculateField_management(in_table="EA", field="ea.vat:FLOOD_L", expression="[bits3d.Z_Mean]", expression_type="VB", code_block="")
arcpy.Lookup_3d(in_raster="EA", lookup_field="ea.vat:FLOOD_L", out_raster="C:/SCRATCH/LOOKUP")
arcpy.gp.RasterCalculator_sa('Con("LOOKUP" >= "dem","LOOKUP" - "dem")', "C:/SCRATCH/DEPTH")
is simplistic technique to compute flood extent for 2 m water level rise. Much better result can be achieved by replacing euclidean allocation with catchments of bits3d. Picture shows flood depths:
