Detect if 1st, 2nd or 3rd level custom page?

You can call https://codex.wordpress.org/Function_Reference/get_ancestors within your template. It’ll return an array of ancestors to your current post and you can use the length of the array to see how deep you are in your hierarchy.

Use it at the top of your template file to set a variable $post_depth and use that to adjust your body_class for targeted CSS or to conditionally include template parts.

Something like this would work:

<?php

// single-nldf.php
// Template for displaying single NLDFs

$level = count( get_ancestors( get_queried_object_id(), 'nldf' ) );

add_filter('body_class','nldf_page_class_names');
function nldf_page_class_names($classes) {
    // add 'class-name' to the $classes array
    $classes[] = 'single-nldf-' . $level;
    // return the $classes array
    return $classes;
}

get_header( 'nldf-' . $level );
// loads header-nldf-0.php, header-nldf-1.php or header-nldf-2.php

get_template_part( 'loop', 'nldf-' . $level );
// loads loop-nldf-0.php, loop-nldf-1.php or loop-nldf-2.php

get_footer( 'nldf-' . $level );
// loads footer-nldf-0.php, footer-nldf-1.php or footer-nldf-2.php

For robustness you might like to check for posts nested in deeper levels and do something appropriate.